kopia lustrzana https://github.com/Hamlib/Hamlib
Properly implement getting ALC, RFPOWER and SWR for 817/818.
Previous implementation used improper command, and incorrect calibration, and did not enable it in the caps. Add SWR since that was easy enough.pull/788/head
rodzic
53035454f2
commit
83b887ca8c
|
@ -122,7 +122,14 @@ struct ft817_priv_data
|
||||||
|
|
||||||
/* tx status */
|
/* tx status */
|
||||||
struct timeval tx_status_tv;
|
struct timeval tx_status_tv;
|
||||||
unsigned char tx_status;
|
unsigned char tx_status; /* Raw data from rig. Highest bit 0 = PTT */
|
||||||
|
|
||||||
|
/* tx levels */
|
||||||
|
struct timeval tx_level_tv;
|
||||||
|
unsigned char swr_level;
|
||||||
|
unsigned char alc_level;
|
||||||
|
unsigned char mod_level;
|
||||||
|
unsigned char pwr_level; /* TX power level */
|
||||||
|
|
||||||
/* freq & mode status */
|
/* freq & mode status */
|
||||||
struct timeval fm_status_tv;
|
struct timeval fm_status_tv;
|
||||||
|
@ -231,7 +238,7 @@ enum ft817_digi
|
||||||
#define FT817_AM_TX_MODES (RIG_MODE_AM)
|
#define FT817_AM_TX_MODES (RIG_MODE_AM)
|
||||||
|
|
||||||
#define FT817_VFO_ALL (RIG_VFO_A|RIG_VFO_B)
|
#define FT817_VFO_ALL (RIG_VFO_A|RIG_VFO_B)
|
||||||
#define FT817_ANTS 0
|
#define FT817_ANTS (RIG_ANT_1|RIG_ANT_2) /* ant-1 on the back, ant-2 BNC at the front */
|
||||||
|
|
||||||
#define FT817_STR_CAL { 16, \
|
#define FT817_STR_CAL { 16, \
|
||||||
{ \
|
{ \
|
||||||
|
@ -308,7 +315,9 @@ const struct rig_caps ft817_caps =
|
||||||
.retry = 5,
|
.retry = 5,
|
||||||
.has_get_func = RIG_FUNC_NONE,
|
.has_get_func = RIG_FUNC_NONE,
|
||||||
.has_set_func = RIG_FUNC_LOCK | RIG_FUNC_TONE | RIG_FUNC_TSQL,
|
.has_set_func = RIG_FUNC_LOCK | RIG_FUNC_TONE | RIG_FUNC_TSQL,
|
||||||
.has_get_level = RIG_LEVEL_STRENGTH | RIG_LEVEL_RAWSTR | RIG_LEVEL_RFPOWER,
|
.has_get_level =
|
||||||
|
RIG_LEVEL_STRENGTH | RIG_LEVEL_RAWSTR | RIG_LEVEL_RFPOWER |
|
||||||
|
RIG_LEVEL_ALC | RIG_LEVEL_SWR,
|
||||||
.has_set_level = RIG_LEVEL_NONE,
|
.has_set_level = RIG_LEVEL_NONE,
|
||||||
.has_get_parm = RIG_PARM_NONE,
|
.has_get_parm = RIG_PARM_NONE,
|
||||||
.has_set_parm = RIG_PARM_NONE,
|
.has_set_parm = RIG_PARM_NONE,
|
||||||
|
@ -451,7 +460,9 @@ const struct rig_caps ft818_caps =
|
||||||
.retry = 5,
|
.retry = 5,
|
||||||
.has_get_func = RIG_FUNC_NONE,
|
.has_get_func = RIG_FUNC_NONE,
|
||||||
.has_set_func = RIG_FUNC_LOCK | RIG_FUNC_TONE | RIG_FUNC_TSQL,
|
.has_set_func = RIG_FUNC_LOCK | RIG_FUNC_TONE | RIG_FUNC_TSQL,
|
||||||
.has_get_level = RIG_LEVEL_STRENGTH | RIG_LEVEL_RAWSTR | RIG_LEVEL_RFPOWER,
|
.has_get_level =
|
||||||
|
RIG_LEVEL_STRENGTH | RIG_LEVEL_RAWSTR | RIG_LEVEL_RFPOWER |
|
||||||
|
RIG_LEVEL_ALC | RIG_LEVEL_SWR,
|
||||||
.has_set_level = RIG_LEVEL_NONE,
|
.has_set_level = RIG_LEVEL_NONE,
|
||||||
.has_get_parm = RIG_PARM_NONE,
|
.has_get_parm = RIG_PARM_NONE,
|
||||||
.has_set_parm = RIG_PARM_NONE,
|
.has_set_parm = RIG_PARM_NONE,
|
||||||
|
@ -535,7 +546,10 @@ const struct rig_caps ft818_caps =
|
||||||
RIG_FLT_END,
|
RIG_FLT_END,
|
||||||
},
|
},
|
||||||
|
|
||||||
.str_cal = FT817_STR_CAL,
|
.str_cal = FT817_STR_CAL,
|
||||||
|
.swr_cal = FT817_SWR_CAL,
|
||||||
|
.alc_cal = FT817_ALC_CAL,
|
||||||
|
.rfpower_meter_cal = FT817_PWR_CAL,
|
||||||
|
|
||||||
.rig_init = ft817_init,
|
.rig_init = ft817_init,
|
||||||
.rig_cleanup = ft817_cleanup,
|
.rig_cleanup = ft817_cleanup,
|
||||||
|
@ -681,6 +695,7 @@ static int ft817_get_status(RIG *rig, int status)
|
||||||
int len;
|
int len;
|
||||||
int n;
|
int n;
|
||||||
int retries = rig->state.rigport.retry;
|
int retries = rig->state.rigport.retry;
|
||||||
|
unsigned char result[2];
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
|
||||||
|
|
||||||
|
@ -688,7 +703,8 @@ static int ft817_get_status(RIG *rig, int status)
|
||||||
{
|
{
|
||||||
case FT817_NATIVE_CAT_GET_FREQ_MODE_STATUS:
|
case FT817_NATIVE_CAT_GET_FREQ_MODE_STATUS:
|
||||||
data = p->fm_status;
|
data = p->fm_status;
|
||||||
len = 5; /* Answer is 5 long; 4 bytes BCD freq, 1 byte status */
|
/* Answer is 5 long; 4 bytes BCD freq, 1 byte status */
|
||||||
|
len = 5;
|
||||||
tv = &p->fm_status_tv;
|
tv = &p->fm_status_tv;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -698,12 +714,19 @@ static int ft817_get_status(RIG *rig, int status)
|
||||||
tv = &p->rx_status_tv;
|
tv = &p->rx_status_tv;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case FT817_NATIVE_CAT_GET_TX_METERING:
|
||||||
|
data = result;
|
||||||
|
len = sizeof(result)/sizeof(result[0]); /* We expect two bytes */
|
||||||
|
tv = &p->tx_level_tv;
|
||||||
|
break;
|
||||||
|
|
||||||
case FT817_NATIVE_CAT_GET_TX_STATUS:
|
case FT817_NATIVE_CAT_GET_TX_STATUS:
|
||||||
data = &p->tx_status;
|
data = &p->tx_status;
|
||||||
len = 1;
|
len = 1;
|
||||||
tv = &p->tx_status_tv;
|
tv = &p->tx_status_tv;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
rig_debug(RIG_DEBUG_ERR, "%s: Internal error!\n", __func__);
|
rig_debug(RIG_DEBUG_ERR, "%s: Internal error!\n", __func__);
|
||||||
return -RIG_EINTERNAL;
|
return -RIG_EINTERNAL;
|
||||||
|
@ -725,19 +748,41 @@ static int ft817_get_status(RIG *rig, int status)
|
||||||
|
|
||||||
if (n != len)
|
if (n != len)
|
||||||
{
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: Length mismatch exp %d got %d!\n",
|
||||||
|
__func__, len, n);
|
||||||
return -RIG_EIO;
|
return -RIG_EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status == FT817_NATIVE_CAT_GET_FREQ_MODE_STATUS)
|
switch(status)
|
||||||
{
|
{
|
||||||
unsigned char dig_mode;
|
case FT817_NATIVE_CAT_GET_FREQ_MODE_STATUS:
|
||||||
if ((n = ft817_read_eeprom(rig, 0x0065, &dig_mode)) < 0)
|
|
||||||
{
|
{
|
||||||
return n;
|
unsigned char dig_mode;
|
||||||
}
|
if ((n = ft817_read_eeprom(rig, 0x0065, &dig_mode)) < 0)
|
||||||
|
{
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
/* Top 3 bit define the digi mode */
|
/* Top 3 bit define the digi mode */
|
||||||
p->dig_mode = dig_mode >> 5;
|
p->dig_mode = dig_mode >> 5;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FT817_NATIVE_CAT_GET_TX_METERING:
|
||||||
|
/* FT-817 returns 2 bytes with 4 nibbles.
|
||||||
|
* Extract raw values here;
|
||||||
|
* convert to float when they are requested. */
|
||||||
|
p->swr_level = result[0] & 0xF;
|
||||||
|
p->pwr_level = result[0] >> 4;
|
||||||
|
p->alc_level = result[1] & 0xF;
|
||||||
|
p->mod_level = result[1] >> 4;
|
||||||
|
rig_debug(RIG_DEBUG_TRACE, "%s: swr: %d, pwr %d, alc %d, mod %d\n",
|
||||||
|
__func__,
|
||||||
|
p->swr_level,
|
||||||
|
p->pwr_level,
|
||||||
|
p->alc_level,
|
||||||
|
p->mod_level);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
gettimeofday(tv, NULL);
|
gettimeofday(tv, NULL);
|
||||||
|
@ -930,64 +975,45 @@ static int ft817_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt)
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ft817_get_alc_level(RIG *rig, value_t *val)
|
static int ft817_get_tx_level(RIG *rig, value_t *val, unsigned char *tx_level, const cal_table_float_t *cal)
|
||||||
{
|
{
|
||||||
struct ft817_priv_data *p = (struct ft817_priv_data *) rig->state.priv;
|
struct ft817_priv_data *p = (struct ft817_priv_data *) rig->state.priv;
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
|
||||||
|
|
||||||
if (check_cache_timeout(&p->tx_status_tv))
|
if (check_cache_timeout(&p->tx_level_tv))
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
ptt_t ptt;
|
||||||
|
|
||||||
if ((n = ft817_get_status(rig, FT817_NATIVE_CAT_GET_TX_STATUS)) < 0)
|
/* Default to not keyed */
|
||||||
|
*tx_level = 0;
|
||||||
|
|
||||||
|
/* TX metering is special; it sends 1 byte if not keyed and 2 if keyed.
|
||||||
|
* To handle this properly we first verify the rig is keyed.
|
||||||
|
* Otherwise we experience at least a full timeout and
|
||||||
|
* perhaps pointless retries + timeouts.
|
||||||
|
*/
|
||||||
|
n = ft817_get_ptt(rig, 0, &ptt);
|
||||||
|
if (n != RIG_OK)
|
||||||
|
{
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ptt == RIG_PTT_OFF)
|
||||||
|
{
|
||||||
|
rig_debug(RIG_DEBUG_VERBOSE, "%s: rig not keyed\n", __func__);
|
||||||
|
return -RIG_ERJCTED; //Or return OK?
|
||||||
|
}
|
||||||
|
|
||||||
|
n = ft817_get_status(rig, FT817_NATIVE_CAT_GET_TX_METERING);
|
||||||
|
if (n != RIG_OK)
|
||||||
{
|
{
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Valid only if PTT is on.
|
val->f = rig_raw2val_float(*tx_level, cal);
|
||||||
FT-817 returns the number of bars in the lowest 4 bits
|
|
||||||
*/
|
|
||||||
if ((p->tx_status & 0x80) == 0)
|
|
||||||
{
|
|
||||||
val->f = rig_raw2val_float(p->tx_status >> 4, &rig->caps->alc_cal);
|
|
||||||
}
|
|
||||||
else // not transmitting so zero
|
|
||||||
{
|
|
||||||
val->f = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RIG_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int ft817_get_pometer_level(RIG *rig, value_t *val)
|
|
||||||
{
|
|
||||||
struct ft817_priv_data *p = (struct ft817_priv_data *) rig->state.priv;
|
|
||||||
|
|
||||||
rig_debug(RIG_DEBUG_VERBOSE, "%s: called\n", __func__);
|
|
||||||
|
|
||||||
if (check_cache_timeout(&p->tx_status_tv))
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
|
|
||||||
if ((n = ft817_get_status(rig, FT817_NATIVE_CAT_GET_TX_STATUS)) < 0)
|
|
||||||
{
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Valid only if PTT is on.
|
|
||||||
FT-817 returns the number of bars in the lowest 4 bits
|
|
||||||
*/
|
|
||||||
if ((p->tx_status & 0x80) == 0)
|
|
||||||
{
|
|
||||||
val->f = rig_raw2val_float(p->tx_status >> 4, &rig->caps->rfpower_meter_cal);
|
|
||||||
}
|
|
||||||
else // not transmitting so zero
|
|
||||||
{
|
|
||||||
val->f = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return RIG_OK;
|
return RIG_OK;
|
||||||
}
|
}
|
||||||
|
@ -1058,25 +1084,25 @@ static int ft817_get_raw_smeter_level(RIG *rig, value_t *val)
|
||||||
|
|
||||||
static int ft817_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
static int ft817_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
||||||
{
|
{
|
||||||
|
struct ft817_priv_data *p = (struct ft817_priv_data *) rig->state.priv;
|
||||||
switch (level)
|
switch (level)
|
||||||
{
|
{
|
||||||
|
|
||||||
case RIG_LEVEL_STRENGTH:
|
case RIG_LEVEL_STRENGTH:
|
||||||
/* The front-end will always call for RAWSTR and use the cal_table */
|
/* The front-end will always call for RAWSTR and use the cal_table */
|
||||||
return ft817_get_smeter_level(rig, val);
|
return ft817_get_smeter_level(rig, val);
|
||||||
break;
|
|
||||||
|
|
||||||
case RIG_LEVEL_RAWSTR:
|
case RIG_LEVEL_RAWSTR:
|
||||||
return ft817_get_raw_smeter_level(rig, val);
|
return ft817_get_raw_smeter_level(rig, val);
|
||||||
break;
|
|
||||||
|
|
||||||
case RIG_LEVEL_RFPOWER:
|
case RIG_LEVEL_RFPOWER:
|
||||||
return ft817_get_pometer_level(rig, val);
|
return ft817_get_tx_level(rig, val, &p->pwr_level, &rig->caps->rfpower_meter_cal);
|
||||||
break;
|
|
||||||
|
|
||||||
case RIG_LEVEL_ALC:
|
case RIG_LEVEL_ALC:
|
||||||
return ft817_get_alc_level(rig, val);
|
return ft817_get_tx_level(rig, val, &p->alc_level, &rig->caps->alc_cal);
|
||||||
break;
|
|
||||||
|
case RIG_LEVEL_SWR:
|
||||||
|
return ft817_get_tx_level(rig, val, &p->swr_level, &rig->caps->swr_cal);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -RIG_EINVAL;
|
return -RIG_EINVAL;
|
||||||
|
|
Ładowanie…
Reference in New Issue