rigctld can now see RIG_LEVEL values correctly

https://github.com/Hamlib/Hamlib/issues/1305
pull/1330/head
Mike Black W9MDB 2023-06-03 16:50:30 -05:00
rodzic 412221d346
commit a6de41e206
9 zmienionych plików z 1219 dodań i 15 usunięć

Wyświetl plik

@ -2630,6 +2630,55 @@ struct rig_state {
freq_t offset_vfoa; /*!< Offset to apply to VFOA/Main set_freq */
freq_t offset_vfob; /*!< Offset to apply to VFOB/Sub set_freq */
struct multicast_s *multicast; /*!< Pointer to multicast server data */
// Adding a number of items so netrigctl can see the real rig information
// Eventually may want to add these so that rigctld can see more of the backend
// But that will come later if requested -- for now they just fill out dumpstate.c
rig_model_t rig_model; /*!< Rig model. */
const char *model_name; /*!< Model name. */
const char *mfg_name; /*!< Manufacturer. */
const char *version; /*!< Driver version. */
const char *copyright; /*!< Copyright info. */
enum rig_status_e status; /*!< Driver status. */
int rig_type; /*!< Rig type. */
ptt_type_t ptt_type; /*!< Type of the PTT port. */
dcd_type_t dcd_type; /*!< Type of the DCD port. */
rig_port_t port_type; /*!< Type of communication port. */
int serial_rate_min; /*!< Minimum serial speed. */
int serial_rate_max; /*!< Maximum serial speed. */
int serial_data_bits; /*!< Number of data bits. */
int serial_stop_bits; /*!< Number of stop bits. */
enum serial_parity_e serial_parity; /*!< Parity. */
enum serial_handshake_e serial_handshake; /*!< Handshake. */
int write_delay; /*!< Delay between each byte sent out, in mS */
int post_write_delay; /*!< Delay between each commands send out, in mS */
int timeout; /*!< Timeout, in mS */
int retry; /*!< Maximum number of retries if command fails, 0 to disable */
int targetable_vfo; /*!< Bit field list of direct VFO access commands */
int async_data_supported; /*!< Indicates that rig is capable of outputting asynchronous data updates, such as transceive state updates or spectrum data. 1 if true, 0 otherwise. */
int agc_level_count; /*!< Number of supported AGC levels. Zero indicates all modes should be available (for backwards-compatibility). */
enum agc_level_e agc_levels[HAMLIB_MAX_AGC_LEVELS]; /*!< Supported AGC levels */
tone_t *ctcss_list; /*!< CTCSS tones list, zero ended */
tone_t *dcs_list; /*!< DCS code list, zero ended */
vfo_op_t vfo_ops; /*!< VFO op bit field list */
scan_t scan_ops; /*!< Scan bit field list */
int transceive; /*!< \deprecated Use async_data_supported instead */
int bank_qty; /*!< Number of banks */
int chan_desc_sz; /*!< Max length of memory channel name */
freq_range_t rx_range_list1[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #1 */
freq_range_t tx_range_list1[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #1 */
freq_range_t rx_range_list2[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #2 */
freq_range_t tx_range_list2[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #2 */
freq_range_t rx_range_list3[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #3 */
freq_range_t tx_range_list3[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #3 */
freq_range_t rx_range_list4[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #4 */
freq_range_t tx_range_list4[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #4 */
freq_range_t rx_range_list5[HAMLIB_FRQRANGESIZ]; /*!< Receive frequency range list #5 */
freq_range_t tx_range_list5[HAMLIB_FRQRANGESIZ]; /*!< Transmit frequency range list #5 */
struct rig_spectrum_scope spectrum_scopes[HAMLIB_MAX_SPECTRUM_SCOPES]; /*!< Supported spectrum scopes. The array index must match the scope ID. Last entry must have NULL name. */
enum rig_spectrum_mode_e spectrum_modes[HAMLIB_MAX_SPECTRUM_MODES]; /*!< Supported spectrum scope modes. Last entry must be RIG_SPECTRUM_MODE_NONE. */
freq_t spectrum_spans[HAMLIB_MAX_SPECTRUM_SPANS]; /*!< Supported spectrum scope frequency spans in Hz in center mode. Last entry must be 0. */
struct rig_spectrum_avg_mode spectrum_avg_modes[HAMLIB_MAX_SPECTRUM_AVG_MODES]; /*!< Supported spectrum scope averaging modes. Last entry must have NULL name. */
int spectrum_attenuator[HAMLIB_MAXDBLSTSIZ]; /*!< Spectrum attenuator list in dB, 0 terminated */
};
//! @cond Doxygen_Suppress

Wyświetl plik

@ -263,7 +263,7 @@ static int netrigctl_open(RIG *rig)
SNPRINTF(cmd, sizeof(cmd), "\\chk_vfo\n");
ret = netrigctl_transaction(rig, cmd, strlen(cmd), buf);
if (sscanf(buf, "CHKVFO %d", &priv->rigctld_vfo_mode) == 1)
if (sscanf(buf, "%d", &priv->rigctld_vfo_mode) == 1)
{
rig->state.vfo_opt = priv->rigctld_vfo_mode;
rig_debug(RIG_DEBUG_TRACE, "%s: chkvfo=%d\n", __func__, priv->rigctld_vfo_mode);
@ -619,11 +619,6 @@ static int netrigctl_open(RIG *rig)
rig->caps->has_set_parm = rs->has_set_parm = strtoll(buf, NULL, 0);
#if 0
gran_t level_gran[RIG_SETTING_MAX]; /*!< level granularity */
gran_t parm_gran[RIG_SETTING_MAX]; /*!< parm granularity */
#endif
for (i = 0; i < HAMLIB_FRQRANGESIZ
&& !RIG_IS_FRNG_END(rs->rx_range_list[i]); i++)
{
@ -835,6 +830,64 @@ static int netrigctl_open(RIG *rig)
p = strtok(NULL, " ");
}
}
else if (strcmp(setting, "level_gran") == 0)
{
char *p = strtok(value, ";");
for (i = 0; p != NULL && i < RIG_SETTING_MAX; ++i)
{
int level;
sscanf(p, "%d", &level);
if (RIG_LEVEL_IS_FLOAT(level))
{
double min, max, step;
sscanf(p, "%*d=%lf,%lf,%lf", &min, &max, &step);
rs->level_gran[i].min.f = min;
rs->level_gran[i].max.f = max;
rs->level_gran[i].step.f = step;
}
else
{
int min, max, step;
sscanf(p, "%*d=%d,%d,%d", &min, &max, &step);
rs->level_gran[i].min.i = min;
rs->level_gran[i].max.i = max;
rs->level_gran[i].step.i = step;
}
p = strtok(NULL, ";");
}
}
else if (strcmp(setting, "parm_gran") == 0)
{
char *p = strtok(value, ";");
for (i = 0; p != NULL && i < RIG_SETTING_MAX; ++i)
{
int level;
sscanf(p, "%d", &level);
if (RIG_LEVEL_IS_FLOAT(level))
{
double min, max, step;
sscanf(p, "%*d=%lf,%lf,%lf", &min, &max, &step);
rs->parm_gran[i].min.f = min;
rs->parm_gran[i].max.f = max;
rs->parm_gran[i].step.f = step;
}
else
{
int min, max, step;
sscanf(p, "%*d=%d,%d,%d", &min, &max, &step);
rs->parm_gran[i].min.i = min;
rs->parm_gran[i].max.i = max;
rs->parm_gran[i].step.i = step;
}
p = strtok(NULL, ";");
}
}
else
{
// not an error -- just a warning for backward compatibility
@ -2746,7 +2799,7 @@ struct rig_caps netrigctl_caps =
RIG_MODEL(RIG_MODEL_NETRIGCTL),
.model_name = "NET rigctl",
.mfg_name = "Hamlib",
.version = "20230503.0",
.version = "20230602.0",
.copyright = "LGPL",
.status = RIG_STATUS_STABLE,
.rig_type = RIG_TYPE_OTHER,

Wyświetl plik

@ -24,7 +24,7 @@
[LVL_SWR] = { .min = { .f = 0 }, .max = { .f = 5.0 }, .step = { .f = 1.0f/255.0f } },
[LVL_BAND_SELECT] = { .min = { .i = 0 }, .max = { .i = 16 }, .step = { .i = 1 } },
// most recent rigs seem to have 15 as the maximum -- other values can be set in the backend
[LVL_NR] = { .min = { .i = 1 }, .max = { .i = 15 }, .step = { .i = 1 } },
[LVL_NR] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/15.0f } },
/* levels with 0-1 values -- increment based on rig's range */
[LVL_AF] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } },
[LVL_RF] = { .min = { .f = 0 }, .max = { .f = 1 }, .step = { .f = 1.0f/255.0f } },

Wyświetl plik

@ -669,6 +669,11 @@ RIG *HAMLIB_API rig_init(rig_model_t rig_model)
//return(NULL); // this is not fatal
}
if (rs->level_gran)
{
memcpy(rs->level_gran, rig->caps->level_gran, sizeof(rs->level_gran));
}
#if 0 // this is no longer applicable -- replace it with something?
// we need to be able to figure out what model radio we have

Wyświetl plik

@ -19,7 +19,7 @@ bin_PROGRAMS = rigctl rigctld rigmem rigsmtr rigswr rotctl rotctld rigctlcom rig
#check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid testsecurity
check_PROGRAMS = dumpmem testrig testrigopen testrigcaps testtrn testbcd testfreq listrigs testloc rig_bench testcache cachetest cachetest2 testcookie testgrid hamlibmodels
RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c uthash.h
RIGCOMMONSRC = rigctl_parse.c rigctl_parse.h dumpcaps.c dumpstate.c uthash.h
ROTCOMMONSRC = rotctl_parse.c rotctl_parse.h dumpcaps_rot.c uthash.h
AMPCOMMONSRC = ampctl_parse.c ampctl_parse.h dumpcaps_amp.c uthash.h

1051
tests/dumpstate.c 100644

Plik diff jest za duży Load Diff

Wyświetl plik

@ -553,6 +553,9 @@ int main(int argc, char *argv[])
}
rig_close(my_rig);
dumpstate(my_rig, stdout);
rig_close(my_rig);
exit(0);
}
dumpcaps(my_rig, stdout);

Wyświetl plik

@ -4354,7 +4354,18 @@ declare_proto_rig(dump_caps)
{
ENTERFUNC2;
dumpcaps(rig, fout);
#if 1
if (rig->caps->rig_model == RIG_MODEL_NETRIGCTL)
{
char cmd[32];
SNPRINTF(cmd, sizeof(cmd), "\\dump_caps\n");
dumpstate(rig, fout);
}
else
#endif
{
dumpcaps(rig, fout);
}
RETURNFUNC2(RIG_OK);
}
@ -4467,6 +4478,7 @@ declare_proto_rig(dump_state)
// protocol 1 allows fields can be listed/processed in any order
// protocol 1 fields can be multi-line -- just write the thing to allow for it
// backward compatible as new values will just generate warnings
rig_debug(RIG_DEBUG_ERR, "%s: chk_vfo_executed=%d\n", __func__, chk_vfo_executed);
if (chk_vfo_executed) // for 3.3 compatiblility
{
fprintf(fout, "vfo_ops=0x%x\n", rig->caps->vfo_ops);
@ -4523,14 +4535,43 @@ declare_proto_rig(dump_state)
fprintf(fout, "\n");
}
fprintf(fout, "level_gran=");
for (i = 0; i < RIG_SETTING_MAX; ++i)
{
if (RIG_LEVEL_IS_FLOAT(i))
{
fprintf(fout, "%d=%g,%g,%g;", i, rig->state.level_gran[i].min.f,
rig->state.level_gran[i].max.f, rig->state.level_gran[i].step.f);
}
else
{
fprintf(fout, "%d=%d,%d,%d;", i, rig->state.level_gran[i].min.i,
rig->state.level_gran[i].max.i, rig->state.level_gran[i].step.i);
}
}
fprintf(fout, "\nparm_gran=");
for (i = 0; i < RIG_SETTING_MAX; ++i)
{
if (RIG_LEVEL_IS_FLOAT(i))
{
fprintf(fout, "%d=%g,%g,%g;", i, rig->state.parm_gran[i].min.f,
rig->state.parm_gran[i].max.f, rig->state.parm_gran[i].step.f);
}
else
{
fprintf(fout, "%d=%d,%d,%d;", i, rig->state.level_gran[i].min.i,
rig->state.level_gran[i].max.i, rig->state.level_gran[i].step.i);
}
}
fprintf(fout, "\n");
fprintf(fout, "done\n");
}
#if 0 // why isn't this implemented? Does anybody care?
gran_t level_gran[RIG_SETTING_MAX]; /*!< level granularity */
gran_t parm_gran[RIG_SETTING_MAX]; /*!< parm granularity */
#endif
RETURNFUNC2(RIG_OK);
}
@ -5054,6 +5095,7 @@ declare_proto_rig(chk_vfo)
{
ENTERFUNC2;
rig_debug(RIG_DEBUG_ERR, "%s: **********************************\n", __func__);
if ((interactive && prompt) || (interactive && !prompt && ext_resp))
{
fprintf(fout, "%s: ", cmd->arg1); /* i.e. "Frequency" */

Wyświetl plik

@ -36,6 +36,7 @@
*/
int dumpcaps(RIG *, FILE *);
int dumpstate(RIG *, FILE *);
int dumpconf(RIG *, FILE *);
/*