Read values for all meters at once for TS-480

pull/680/head
Mikael Nousiainen 2021-04-21 13:42:53 +03:00
rodzic 45a1bf5b45
commit 1f57311fee
1 zmienionych plików z 76 dodań i 71 usunięć

Wyświetl plik

@ -30,6 +30,7 @@
#include <hamlib/rig.h>
#include "cal.h"
#include "idx_builtin.h"
#include "iofunc.h"
#include "kenwood.h"
#define TS480_ALL_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY|RIG_MODE_RTTYR)
@ -319,6 +320,53 @@ int kenwood_ts480_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
return kenwood_transaction(rig, levelbuf, NULL, 0);
}
static int ts480_read_meters(RIG *rig, int *swr, int *comp, int *alc)
{
int retval;
char *cmd = "RM;";
struct rig_state *rs = &rig->state;
char ackbuf[32];
int expected_len = 24;
rig_debug(RIG_DEBUG_TRACE, "%s: called\n", __func__);
retval = write_block(&rs->rigport, cmd, strlen(cmd));
rig_debug(RIG_DEBUG_TRACE, "%s: write_block retval=%d\n", __func__, retval);
if (retval != RIG_OK)
{
RETURNFUNC(retval);
}
// TS-480 returns values for all meters at the same time, for example: RM10000;RM20000;RM30000;
retval = read_string(&rs->rigport, ackbuf, expected_len, NULL, 0);
rig_debug(RIG_DEBUG_TRACE, "%s: read_string retval=%d\n", __func__, retval);
if (retval < 0)
{
rig_debug(RIG_DEBUG_ERR, "%s: failed to read rig response\n", __func__);
RETURNFUNC(retval);
}
if (retval != expected_len)
{
rig_debug(RIG_DEBUG_ERR, "%s: expected %d bytes, got %d in '%s'\n", __func__, expected_len, retval, ackbuf);
RETURNFUNC(-RIG_EPROTO);
}
retval = sscanf(ackbuf, "RM1%d;RM2%d;RM3%d;", swr, comp, alc);
if (retval != 3)
{
rig_debug(RIG_DEBUG_ERR, "%s: expected 3 meter values to parse, got %d in '%s'\n", __func__, retval, ackbuf);
RETURNFUNC(-RIG_EPROTO);
}
RETURNFUNC(RIG_OK);
}
/*
* kenwood_ts480_get_level
@ -490,6 +538,8 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
case RIG_LEVEL_METER: {
int raw_value;
// TODO: Read all meters at the same time: RM10000;RM20000;RM30000;
retval = kenwood_safe_transaction(rig, "RM", ackbuf, sizeof(ackbuf), 7);
if (retval != RIG_OK)
{
@ -514,86 +564,41 @@ kenwood_ts480_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break;
}
case RIG_LEVEL_SWR: {
int meter_type;
int meter_value;
retval = kenwood_safe_transaction(rig, "RM", ackbuf, sizeof(ackbuf), 7);
if (retval != RIG_OK)
{
RETURNFUNC(retval);
}
sscanf(ackbuf, "RM%1d", &meter_type);
if (meter_type == 1)
{
sscanf(ackbuf + 3, "%d", &meter_value);
if (rig->caps->swr_cal.size)
{
val->f = rig_raw2val_float(meter_value, &rig->caps->swr_cal);
}
else
{
val->f = (float) meter_value / 2.0f;
}
}
else
{
val->f = 0;
}
break;
}
case RIG_LEVEL_COMP_METER: {
int meter_type;
int meter_value;
retval = kenwood_safe_transaction(rig, "RM", ackbuf, sizeof(ackbuf), 7);
if (retval != RIG_OK)
{
RETURNFUNC(retval);
}
sscanf(ackbuf, "RM%1d", &meter_type);
if (meter_type == 2)
{
sscanf(ackbuf + 3, "%d", &meter_value);
val->f = (float) meter_value; // Maximum value is 20dB
}
else
{
val->f = 0;
}
break;
}
case RIG_LEVEL_SWR:
case RIG_LEVEL_COMP_METER:
case RIG_LEVEL_ALC: {
int meter_type;
int meter_value;
int swr;
int comp;
int alc;
retval = kenwood_safe_transaction(rig, "RM", ackbuf, sizeof(ackbuf), 7);
retval = ts480_read_meters(rig, &swr, &comp, &alc);
if (retval != RIG_OK)
{
RETURNFUNC(retval);
}
sscanf(ackbuf, "RM%1d", &meter_type);
if (meter_type == 3)
switch (level)
{
sscanf(ackbuf + 3, "%d", &meter_value);
val->f = (float) meter_value / 10.0f;
case RIG_LEVEL_SWR:
if (rig->caps->swr_cal.size)
{
val->f = rig_raw2val_float(swr, &rig->caps->swr_cal);
}
else
{
val->f = (float) swr / 2.0f;
}
break;
case RIG_LEVEL_COMP_METER:
val->f = (float) comp; // Maximum value is 20dB
break;
case RIG_LEVEL_ALC:
// Maximum value is 20, so have the max at 5 just to be on the range where other rigs report ALC
val->f = (float) alc / 4.0f;
break;
default:
return -RIG_ENAVAIL;
}
else
{
val->f = 0;
}
break;
}