kopia lustrzana https://github.com/Hamlib/Hamlib
TS-480: Add Digital Noise Limiter. Start implementation for filter width command. Fix bugs.
rodzic
de5c5a27a1
commit
e4657a5d16
|
@ -2410,6 +2410,7 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k
|
|||
int cache_ms_mode;
|
||||
pbwidth_t width;
|
||||
int cache_ms_width;
|
||||
int data_mode_filter_active;
|
||||
|
||||
if (filter == NULL)
|
||||
{
|
||||
|
@ -2422,10 +2423,16 @@ static int kenwood_find_slope_filter_for_frequency(RIG *rig, vfo_t vfo, struct k
|
|||
return -RIG_EINVAL;
|
||||
}
|
||||
|
||||
retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active);
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
// Ignore errors, e.g. if the command is not supported
|
||||
data_mode_filter_active = 0;
|
||||
}
|
||||
|
||||
for (i = 0; filter[i].value >= 0; i++)
|
||||
{
|
||||
// TODO: check data mode status
|
||||
if (filter[i].modes & mode)
|
||||
if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active)
|
||||
{
|
||||
if (filter[i].frequency_hz >= frequency_hz)
|
||||
{
|
||||
|
@ -2455,6 +2462,7 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo
|
|||
int cache_ms_mode;
|
||||
pbwidth_t width;
|
||||
int cache_ms_width;
|
||||
int data_mode_filter_active;
|
||||
|
||||
if (filter == NULL)
|
||||
{
|
||||
|
@ -2467,10 +2475,16 @@ static int kenwood_find_slope_filter_for_value(RIG *rig, vfo_t vfo, struct kenwo
|
|||
return -RIG_EINVAL;
|
||||
}
|
||||
|
||||
retval = rig_get_ext_func(rig, vfo, TOK_FUNC_FILTER_WIDTH_DATA, &data_mode_filter_active);
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
// Ignore errors, e.g. if the command is not supported
|
||||
data_mode_filter_active = 0;
|
||||
}
|
||||
|
||||
for (i = 0; filter[i].value >= 0; i++)
|
||||
{
|
||||
// TODO: check data mode status
|
||||
if (filter[i].modes & mode)
|
||||
if (filter[i].modes & mode && filter[i].data_mode_filter == data_mode_filter_active)
|
||||
{
|
||||
if (filter[i].value == value)
|
||||
{
|
||||
|
@ -3095,8 +3109,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_low, value, &val->i);
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
// Fall back to using raw values
|
||||
val->i = value;
|
||||
if (retval == -RIG_ENAVAIL)
|
||||
{
|
||||
// Fall back to using raw values
|
||||
val->i = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
RETURNFUNC(retval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -3113,8 +3134,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
retval = kenwood_find_slope_filter_for_value(rig, vfo, caps->slope_filter_high, value, &val->i);
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
// Fall back to using raw values
|
||||
val->i = value;
|
||||
if (retval == -RIG_ENAVAIL)
|
||||
{
|
||||
// Fall back to using raw values
|
||||
val->i = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
RETURNFUNC(retval);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -47,6 +47,8 @@
|
|||
#define TOK_RIT TOKEN_BACKEND(4)
|
||||
#define TOK_NO_ID TOKEN_BACKEND(5)
|
||||
|
||||
#define TOK_FUNC_FILTER_WIDTH_DATA TOKEN_BACKEND(6) // Data communications mode that affects SL/SH/FW commands
|
||||
|
||||
/* Token structure assigned to .cfgparams in rig_caps */
|
||||
extern const struct confparams kenwood_cfg_params[];
|
||||
|
||||
|
@ -106,7 +108,12 @@ extern const struct confparams kenwood_cfg_params[];
|
|||
#define RIG_IS_POWERSDR (rig->caps->rig_model == RIG_MODEL_POWERSDR)
|
||||
#define RIG_IS_MALACHITE (rig->caps->rig_model == RIG_MODEL_MALACHITE)
|
||||
|
||||
#define KENWOOD_SLOPE_FILTER_COUNT_MAX 64
|
||||
struct kenwood_filter_width
|
||||
{
|
||||
rmode_t modes;
|
||||
int value;
|
||||
int width_hz;
|
||||
};
|
||||
|
||||
struct kenwood_slope_filter
|
||||
{
|
||||
|
@ -121,8 +128,9 @@ struct kenwood_priv_caps
|
|||
char cmdtrm; /* Command termination chars (ken=';' or th='\r') */
|
||||
int if_len; /* length of IF; answer excluding ';' terminator */
|
||||
rmode_t *mode_table;
|
||||
struct kenwood_slope_filter *slope_filter_high; /* Last entry should have value == -1 and frequency_hz == -1*/
|
||||
struct kenwood_slope_filter *slope_filter_low; /* Last entry should have value == -1 and frequency_hz == -1*/
|
||||
struct kenwood_filter_width *filter_width; /* Last entry should have value == -1 and width_hz == -1 */
|
||||
struct kenwood_slope_filter *slope_filter_high; /* Last entry should have value == -1 and frequency_hz == -1 */
|
||||
struct kenwood_slope_filter *slope_filter_low; /* Last entry should have value == -1 and frequency_hz == -1 */
|
||||
};
|
||||
|
||||
struct kenwood_priv_data
|
||||
|
|
|
@ -73,7 +73,6 @@
|
|||
{ 20, 10.0f } \
|
||||
} }
|
||||
|
||||
#define TOK_FUNC_FILTER_WIDTH_DATA TOKEN_BACKEND(101)
|
||||
#define TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT TOKEN_BACKEND(102)
|
||||
#define TOK_LEVEL_DSP_RX_EQUALIZER TOKEN_BACKEND(103)
|
||||
#define TOK_LEVEL_DSP_TX_EQUALIZER TOKEN_BACKEND(104)
|
||||
|
@ -82,12 +81,14 @@
|
|||
#define TOK_LEVEL_TX_SIDETONE_VOLUME TOKEN_BACKEND(107)
|
||||
#define TOK_LEVEL_AF_INPUT_LEVEL TOKEN_BACKEND(108)
|
||||
#define TOK_LEVEL_AF_OUTPUT_LEVEL TOKEN_BACKEND(109)
|
||||
#define TOK_LEVEL_DIGITAL_NOISE_LIMITER TOKEN_BACKEND(110)
|
||||
|
||||
int ts480_ext_tokens[] = {
|
||||
TOK_FUNC_FILTER_WIDTH_DATA, TOK_FUNC_TX_AUDIO_FROM_DATA_INPUT,
|
||||
TOK_LEVEL_DSP_RX_EQUALIZER, TOK_LEVEL_DSP_TX_EQUALIZER, TOK_LEVEL_DSP_TX_BANDWIDTH,
|
||||
TOK_LEVEL_BEEP_VOLUME, TOK_LEVEL_TX_SIDETONE_VOLUME,
|
||||
TOK_LEVEL_AF_INPUT_LEVEL, TOK_LEVEL_AF_OUTPUT_LEVEL,
|
||||
TOK_LEVEL_DIGITAL_NOISE_LIMITER,
|
||||
TOK_BACKEND_NONE,
|
||||
};
|
||||
|
||||
|
@ -106,6 +107,10 @@ const struct confparams ts480_ext_funcs[] =
|
|||
|
||||
const struct confparams ts480_ext_levels[] =
|
||||
{
|
||||
{
|
||||
TOK_LEVEL_DIGITAL_NOISE_LIMITER, "DIGITAL_NOISE_LIMITER", "Digital Noise Limiter", "Digital Noise Limiter",
|
||||
NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "DNL Level 1", "DNL Level 2", "DNL Level 3", NULL } } }
|
||||
},
|
||||
{
|
||||
TOK_LEVEL_DSP_RX_EQUALIZER, "DSP_RX_EQUALIZER", "DSP RX equalizer", "DSP RX equalizer type",
|
||||
NULL, RIG_CONF_COMBO, { .c = { .combostr = { "OFF", "Hb1", "Hb2", "FP", "bb1", "bb2", "c", "U", NULL } } }
|
||||
|
@ -839,11 +844,20 @@ static int ts480_get_ext_func(RIG *rig, vfo_t vfo, token_t token, int *status)
|
|||
static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
|
||||
{
|
||||
int retval;
|
||||
char cmdbuf[20];
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
switch (token)
|
||||
{
|
||||
case TOK_LEVEL_DIGITAL_NOISE_LIMITER:
|
||||
if (val.i < 0 || val.i > 3)
|
||||
{
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
}
|
||||
sprintf(cmdbuf, "DL%d%02d", val.i != 0 ? 1 : 0, val.i > 0 ? val.i - 1 : 0);
|
||||
retval = kenwood_transaction(rig, cmdbuf, NULL, 0);
|
||||
break;
|
||||
case TOK_LEVEL_DSP_RX_EQUALIZER:
|
||||
if (val.i < 0 || val.i > 7)
|
||||
{
|
||||
|
@ -866,32 +880,32 @@ static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
|
|||
retval = ts480_set_ex_menu(rig, 20, 1, val.i);
|
||||
break;
|
||||
case TOK_LEVEL_BEEP_VOLUME:
|
||||
if (val.i < 0 || val.i > 9)
|
||||
if (val.f < 0 || val.f > 9)
|
||||
{
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
}
|
||||
retval = ts480_set_ex_menu(rig, 12, 1, val.i);
|
||||
retval = ts480_set_ex_menu(rig, 12, 1, (int) val.f);
|
||||
break;
|
||||
case TOK_LEVEL_TX_SIDETONE_VOLUME:
|
||||
if (val.i < 0 || val.i > 9)
|
||||
if (val.f < 0 || val.f > 9)
|
||||
{
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
}
|
||||
retval = ts480_set_ex_menu(rig, 13, 1, val.i);
|
||||
retval = ts480_set_ex_menu(rig, 13, 1, (int) val.f);
|
||||
break;
|
||||
case TOK_LEVEL_AF_INPUT_LEVEL:
|
||||
if (val.i < 0 || val.i > 9)
|
||||
if (val.f < 0 || val.f > 9)
|
||||
{
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
}
|
||||
retval = ts480_set_ex_menu(rig, 46, 1, val.i);
|
||||
retval = ts480_set_ex_menu(rig, 46, 1, (int) val.f);
|
||||
break;
|
||||
case TOK_LEVEL_AF_OUTPUT_LEVEL:
|
||||
if (val.i < 0 || val.i > 9)
|
||||
if (val.f < 0 || val.f > 9)
|
||||
{
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
}
|
||||
retval = ts480_set_ex_menu(rig, 47, 1, val.i);
|
||||
retval = ts480_set_ex_menu(rig, 47, 1, (int) val.f);
|
||||
break;
|
||||
default:
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
|
@ -902,32 +916,56 @@ static int ts480_set_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t val)
|
|||
|
||||
static int ts480_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val)
|
||||
{
|
||||
char ackbuf[20];
|
||||
int retval;
|
||||
int value;
|
||||
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
switch (token)
|
||||
{
|
||||
case TOK_LEVEL_DIGITAL_NOISE_LIMITER: {
|
||||
int enabled;
|
||||
int level;
|
||||
|
||||
retval = kenwood_safe_transaction(rig, "DL", ackbuf, sizeof(ackbuf), 5);
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
RETURNFUNC(retval);
|
||||
}
|
||||
|
||||
sscanf(ackbuf, "DL%1d%2d", &enabled, &level);
|
||||
|
||||
val->i = enabled ? level + 1 : 0;
|
||||
break;
|
||||
}
|
||||
case TOK_LEVEL_DSP_RX_EQUALIZER:
|
||||
retval = ts480_get_ex_menu(rig, 18, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 18, 1, &value);
|
||||
val->i = value;
|
||||
break;
|
||||
case TOK_LEVEL_DSP_TX_EQUALIZER:
|
||||
retval = ts480_get_ex_menu(rig, 19, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 19, 1, &value);
|
||||
val->i = value;
|
||||
break;
|
||||
case TOK_LEVEL_DSP_TX_BANDWIDTH:
|
||||
retval = ts480_get_ex_menu(rig, 20, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 20, 1, &value);
|
||||
val->i = value;
|
||||
break;
|
||||
case TOK_LEVEL_BEEP_VOLUME:
|
||||
retval = ts480_get_ex_menu(rig, 12, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 12, 1, &value);
|
||||
val->f = value;
|
||||
break;
|
||||
case TOK_LEVEL_TX_SIDETONE_VOLUME:
|
||||
retval = ts480_get_ex_menu(rig, 13, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 13, 1, &value);
|
||||
val->f = value;
|
||||
break;
|
||||
case TOK_LEVEL_AF_INPUT_LEVEL:
|
||||
retval = ts480_get_ex_menu(rig, 46, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 46, 1, &value);
|
||||
val->f = value;
|
||||
break;
|
||||
case TOK_LEVEL_AF_OUTPUT_LEVEL:
|
||||
retval = ts480_get_ex_menu(rig, 47, 1, &val->i);
|
||||
retval = ts480_get_ex_menu(rig, 47, 1, &value);
|
||||
val->f = value;
|
||||
break;
|
||||
default:
|
||||
RETURNFUNC(-RIG_EINVAL);
|
||||
|
@ -936,6 +974,34 @@ static int ts480_get_ext_level(RIG *rig, vfo_t vfo, token_t token, value_t *val)
|
|||
RETURNFUNC(retval);
|
||||
}
|
||||
|
||||
static struct kenwood_filter_width ts480_filter_width[] = {
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 0, 50 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 80, 80 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 100, 100 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 150, 150 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 200, 200 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 300, 300 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 400, 400 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 500, 500 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 600, 600 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 1000, 1000 },
|
||||
{ RIG_MODE_CW | RIG_MODE_CWR, 2000, 2000 },
|
||||
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 250, 250 },
|
||||
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 500, 500 },
|
||||
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 1000, 1000 },
|
||||
{ RIG_MODE_RTTY | RIG_MODE_RTTYR, 1500, 1500 },
|
||||
{ RIG_MODE_SSB, 0, 2400 },
|
||||
{ RIG_MODE_SSB, 1, 2400 }, // NAR1?
|
||||
{ RIG_MODE_SSB, 2, 2400 }, // NAR2?
|
||||
{ RIG_MODE_FM, 0, 2400 },
|
||||
{ RIG_MODE_FM, 1, 2400 }, // NAR1?
|
||||
{ RIG_MODE_FM, 2, 2400 }, // NAR2?
|
||||
{ RIG_MODE_AM, 0, 2400 },
|
||||
{ RIG_MODE_AM, 1, 2400 }, // NAR1?
|
||||
{ RIG_MODE_AM, 2, 2400 }, // NAR2?
|
||||
{ RIG_MODE_NONE, -1, -1 },
|
||||
};
|
||||
|
||||
static struct kenwood_slope_filter ts480_slope_filter_high[] = {
|
||||
{ RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 0, 1000 },
|
||||
{ RIG_MODE_SSB | RIG_MODE_FM | RIG_MODE_RTTY | RIG_MODE_RTTYR, 0, 1, 1200 },
|
||||
|
@ -958,7 +1024,7 @@ static struct kenwood_slope_filter ts480_slope_filter_high[] = {
|
|||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 0, 1000 },
|
||||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 1, 1500 },
|
||||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 2, 2210 },
|
||||
{ RIG_MODE_NONE, -1, -1 },
|
||||
{ RIG_MODE_NONE, 0, -1, -1 },
|
||||
};
|
||||
|
||||
static struct kenwood_slope_filter ts480_slope_filter_low[] = {
|
||||
|
@ -985,7 +1051,7 @@ static struct kenwood_slope_filter ts480_slope_filter_low[] = {
|
|||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 4, 1000 },
|
||||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 5, 1500 },
|
||||
{ RIG_MODE_SSB | RIG_MODE_RTTY | RIG_MODE_RTTYR | RIG_MODE_FM | RIG_MODE_AM, 1, 6, 2400 },
|
||||
{ RIG_MODE_NONE, -1, -1 },
|
||||
{ RIG_MODE_NONE, 0, -1, -1 },
|
||||
};
|
||||
|
||||
static struct kenwood_priv_caps ts480_priv_caps =
|
||||
|
@ -1140,6 +1206,8 @@ const struct rig_caps ts480_caps =
|
|||
[LVL_KEYSPD] = {.min = {.i = 10}, .max = {.i = 60}, .step = {.i = 1}},
|
||||
[LVL_CWPITCH] = {.min = {.i = 400}, .max = {.i = 1000}, .step = {.i = 50}},
|
||||
[LVL_BKIN_DLYMS] = {.min = {.i = 0}, .max = {.i = 1000}, .step = {.i = 50}},
|
||||
[LVL_SLOPE_LOW] = {.min = {.i = 0}, .max = {.i = 2400}, .step = {.i = 10}},
|
||||
[LVL_SLOPE_HIGH] = {.min = {.i = 0}, .max = {.i = 5000}, .step = {.i = 10}},
|
||||
},
|
||||
.str_cal = TS480_STR_CAL,
|
||||
.swr_cal = TS480_SWR_CAL,
|
||||
|
|
Ładowanie…
Reference in New Issue