kopia lustrzana https://github.com/Hamlib/Hamlib
Added new AGC control for PiHPSDR
rodzic
ddd13fd028
commit
22cdd4f5bd
|
@ -62,6 +62,7 @@
|
|||
/* prototypes */
|
||||
static int pihpsdr_open(RIG *rig);
|
||||
static int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
|
||||
static int pihpsdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val);
|
||||
static int pihspdr_get_channel(RIG *rig, channel_t *chan);
|
||||
static int pihspdr_set_channel(RIG *rig, const channel_t *chan);
|
||||
|
||||
|
@ -268,7 +269,7 @@ const struct rig_caps pihpsdr_caps = {
|
|||
.get_dcd = kenwood_get_dcd,
|
||||
.set_func = kenwood_set_func,
|
||||
.get_func = kenwood_get_func,
|
||||
.set_level = kenwood_set_level,
|
||||
.set_level = pihpsdr_set_level,
|
||||
.get_level = pihpsdr_get_level,
|
||||
.set_ant = kenwood_set_ant,
|
||||
.get_ant = kenwood_get_ant,
|
||||
|
@ -638,6 +639,115 @@ int pihspdr_set_channel(RIG *rig, const channel_t *chan)
|
|||
return err;
|
||||
}
|
||||
|
||||
int pihpsdr_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
|
||||
{
|
||||
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
|
||||
|
||||
if (!rig)
|
||||
return -RIG_EINVAL;
|
||||
|
||||
char levelbuf[16];
|
||||
int i, kenwood_val;
|
||||
|
||||
if (RIG_LEVEL_IS_FLOAT(level))
|
||||
kenwood_val = val.f * 255;
|
||||
else
|
||||
kenwood_val = val.i;
|
||||
|
||||
switch (level) {
|
||||
case RIG_LEVEL_RFPOWER:
|
||||
/* XXX check level range */
|
||||
sprintf(levelbuf, "PC%03d", kenwood_val);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_AF:
|
||||
sprintf(levelbuf, "AG%03d", kenwood_val);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_RF:
|
||||
/* XXX check level range */
|
||||
sprintf(levelbuf, "RG%03d", kenwood_val);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_SQL:
|
||||
sprintf(levelbuf, "SQ%03d", kenwood_val);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_AGC:
|
||||
if (kenwood_val == RIG_AGC_OFF) kenwood_val = 0;
|
||||
else if (kenwood_val == RIG_AGC_SUPERFAST) kenwood_val = 5;
|
||||
else if (kenwood_val == RIG_AGC_FAST) kenwood_val = 10;
|
||||
else if (kenwood_val == RIG_AGC_MEDIUM) kenwood_val = 15;
|
||||
else if (kenwood_val == RIG_AGC_SLOW) kenwood_val =20;
|
||||
sprintf(levelbuf, "GT%03d", kenwood_val);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_ATT:
|
||||
/* set the attenuator if a correct value is entered */
|
||||
if (val.i == 0)
|
||||
sprintf(levelbuf, "RA00");
|
||||
else {
|
||||
for (i=0; i<MAXDBLSTSIZ && rig->state.attenuator[i]; i++) {
|
||||
if (val.i == rig->state.attenuator[i])
|
||||
{
|
||||
sprintf(levelbuf, "RA%02d", i+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (val.i != rig->state.attenuator[i])
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_PREAMP:
|
||||
/* set the preamp if a correct value is entered */
|
||||
if (val.i == 0)
|
||||
sprintf(levelbuf, "PA0");
|
||||
else {
|
||||
for (i=0; i<MAXDBLSTSIZ && rig->state.preamp[i]; i++) {
|
||||
if (val.i == rig->state.preamp[i])
|
||||
{
|
||||
sprintf(levelbuf, "PA%01d", i+1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (val.i != rig->state.preamp[i])
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_SLOPE_HIGH:
|
||||
if(val.i>20 || val.i < 0)
|
||||
return -RIG_EINVAL;
|
||||
sprintf(levelbuf, "SH%02d",(val.i));
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_SLOPE_LOW:
|
||||
if(val.i>20 || val.i < 0)
|
||||
return -RIG_EINVAL;
|
||||
sprintf(levelbuf, "SL%02d",(val.i));
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_CWPITCH:
|
||||
if(val.i > 1000 || val.i < 400)
|
||||
return -RIG_EINVAL;
|
||||
sprintf(levelbuf, "PT%02d", (val.i / 50) - 8);
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_KEYSPD:
|
||||
if(val.i > 50 || val.i < 5)
|
||||
return -RIG_EINVAL;
|
||||
sprintf(levelbuf, "KS%03d", val.i);
|
||||
break;
|
||||
|
||||
default:
|
||||
rig_debug(RIG_DEBUG_ERR, "Unsupported set_level %d", level);
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
|
||||
return kenwood_transaction(rig, levelbuf, NULL, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* pihpsdr_get_level
|
||||
* Assumes rig!=NULL, val!=NULL
|
||||
|
@ -647,7 +757,7 @@ int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
{
|
||||
char lvlbuf[50];
|
||||
size_t lvl_len;
|
||||
int lvl, retval, ret, agclevel;
|
||||
int lvl, retval;
|
||||
|
||||
lvl_len = 50;
|
||||
switch (level) {
|
||||
|
@ -820,15 +930,22 @@ int pihpsdr_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
val->f = lvl / 100.0;
|
||||
break;
|
||||
|
||||
|
||||
case RIG_LEVEL_AGC: /* FIX ME: ts2000 returns 0 -20 for AGC */
|
||||
ret = get_kenwood_level(rig, "GT", &val->f);
|
||||
agclevel = 255.0 * val->f;
|
||||
if (agclevel == 0) val->i = 0;
|
||||
else if (agclevel < 85) val->i = 1;
|
||||
else if (agclevel < 170) val->i = 2;
|
||||
else if (agclevel <= 255) val->i = 3;
|
||||
return ret;
|
||||
case RIG_LEVEL_AGC: /* pihpsdr defines the range 0 -20 for AGC (based on TS-2000) */
|
||||
retval = kenwood_transaction (rig, "GT", lvlbuf, sizeof (lvlbuf));
|
||||
if (retval != RIG_OK)
|
||||
return retval;
|
||||
lvl_len = strlen (lvlbuf);
|
||||
if (lvl_len != 5) {
|
||||
rig_debug(RIG_DEBUG_ERR,"pihpsdr_get_level: "
|
||||
"unexpected answer len=%d\n", lvl_len);
|
||||
return -RIG_ERJCTED;
|
||||
}
|
||||
sscanf(lvlbuf+2, "%d", &lvl);
|
||||
if (lvl == 0) val->i = RIG_AGC_OFF; /*pihspdr: OFF */
|
||||
else if (lvl < 6) val->i = RIG_AGC_SUPERFAST; /*pihspdr: 001-005 = FAST */
|
||||
else if (lvl < 11) val->i = RIG_AGC_FAST; /*pihspdr: 006-010 = MEDIUM */
|
||||
else if (lvl < 16) val->i = RIG_AGC_MEDIUM; /*pihspdr: 011-015 = SLOW */
|
||||
else if (lvl <= 20) val->i = RIG_AGC_SLOW; /*pihspdr: 016-020 = LONG */
|
||||
break;
|
||||
|
||||
case RIG_LEVEL_BKINDL:
|
||||
|
|
Ładowanie…
Reference in New Issue