Add ic7300_get_parm and ic7300_set_parm

pull/379/head
Michael Black W9MDB 2020-09-14 11:08:38 -05:00
rodzic 1c5c44edd2
commit 15a879d5ea
1 zmienionych plików z 165 dodań i 2 usunięć

Wyświetl plik

@ -38,6 +38,10 @@
#include "bandplan.h"
#include "tones.h"
static int ic7300_set_parm(RIG *rig, setting_t parm, value_t val);
static int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val);
#define IC7300_ALL_RX_MODES (RIG_MODE_FM|RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PKTAM)
#define IC7300_1HZ_TS_MODES (RIG_MODE_CW|RIG_MODE_CWR|RIG_MODE_SSB|RIG_MODE_RTTY|RIG_MODE_RTTYR|RIG_MODE_PKTLSB|RIG_MODE_PKTUSB|RIG_MODE_PKTFM|RIG_MODE_PKTAM)
#define IC7300_NOT_TS_MODES (IC7300_ALL_RX_MODES &~IC7300_1HZ_TS_MODES)
@ -404,8 +408,8 @@ const struct rig_caps ic7300_caps =
.get_ext_level = icom_get_ext_level,
.set_func = icom_set_func,
.get_func = icom_get_func,
.set_parm = icom_set_parm,
.get_parm = icom_get_parm,
.set_parm = ic7300_set_parm,
.get_parm = ic7300_get_parm,
.set_mem = icom_set_mem,
.vfo_op = icom_vfo_op,
.scan = icom_scan,
@ -885,3 +889,162 @@ const struct rig_caps ic705_caps =
.send_morse = icom_send_morse,
.send_voice_mem = icom_send_voice_mem
};
int ic7300_set_parm(RIG *rig, setting_t parm, value_t val)
{
unsigned char prmbuf[MAXFRAMELEN];
int min, hr;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
switch (parm)
{
case RIG_PARM_ANN:
{
int ann_mode = -1;
int ann_lang = -1;
switch (val.i)
{
case RIG_ANN_OFF:
ann_mode = S_ANN_ALL;
break;
case RIG_ANN_FREQ:
ann_mode = S_ANN_FREQ;
break;
case RIG_ANN_RXMODE:
ann_mode = S_ANN_MODE;
break;
case RIG_ANN_ENG:
case RIG_ANN_JAP:
ann_lang = (val.i == RIG_ANN_ENG) ? 0 : 1;
break;
default:
rig_debug(RIG_DEBUG_ERR, "Unsupported RIG_PARM_ANN %d\n", val.i);
return -RIG_EINVAL;
}
if (ann_mode >= 0)
{
return icom_set_raw(rig, C_CTL_ANN, ann_mode, 0, NULL, 0, 0);
}
else if (ann_lang >= 0)
{
prmbuf[0] = 0x1a;
prmbuf[1] = 0x05;
switch (rig->caps->rig_model) {
case RIG_MODEL_IC7300:
prmbuf[2] = 0x00;
prmbuf[3] = 0x39;
break;
case RIG_MODEL_IC9700:
prmbuf[2] = 0x01;
prmbuf[3] = 0x77;
break;
case RIG_MODEL_IC705:
prmbuf[2] = 0x00;
prmbuf[3] = 0x53;
break;
default:
return -RIG_ENIMPL;
}
prmbuf[4] = ann_lang;
return icom_set_raw(rig, C_CTL_MEM, S_MEM_MODE_SLCT, 5, prmbuf, 0, 0);
}
rig_debug(RIG_DEBUG_ERR, "Unsupported RIG_PARM_ANN %d\n", val.i);
return -RIG_EINVAL;
}
case RIG_PARM_TIME:
hr = (int)((float) val.i / 3600.0);
min = (int)((float)(val.i - (hr * 3600)) / 60.0);
prmbuf[0] = 0x05;
switch (rig->caps->rig_model) {
case RIG_MODEL_IC7300:
prmbuf[2] = 0x00;
prmbuf[3] = 0x95;
break;
case RIG_MODEL_IC9700:
prmbuf[2] = 0x01;
prmbuf[3] = 0x80;
break;
case RIG_MODEL_IC705:
prmbuf[2] = 0x01;
prmbuf[3] = 0x66;
break;
default:
return -RIG_ENIMPL;
}
to_bcd_be(prmbuf + 3, (long long) hr, 2);
to_bcd_be(prmbuf + 4, (long long) min, 2);
return icom_set_raw(rig, C_CTL_MEM, S_MEM_PARM, 5, prmbuf, 0, 0);
default:
rig_debug(RIG_DEBUG_ERR, "Unsupported set_parm %s\n", rig_strparm(parm));
return -RIG_EINVAL;
}
}
int ic7300_get_parm(RIG *rig, setting_t parm, value_t *val)
{
unsigned char prmbuf[MAXFRAMELEN], resbuf[MAXFRAMELEN];
int prm_len, res_len;
int prm_cn, prm_sc;
int icom_val = 0;
int cmdhead;
int retval;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
switch (parm)
{
case RIG_PARM_ANN:
return -RIG_ENIMPL; // How can we implement this?
default:
rig_debug(RIG_DEBUG_TRACE, "%s: using icom routine for PARM=%s", __func__, rig_strparm(parm));
return icom_get_parm(rig,parm,val);
}
retval = icom_transaction(rig, prm_cn, prm_sc, prmbuf, prm_len, resbuf,
&res_len);
if (retval != RIG_OK)
{
return retval;
}
cmdhead = 3;
res_len -= cmdhead;
if (resbuf[0] != ACK && resbuf[0] != prm_cn)
{
rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, resbuf[0],
res_len);
return -RIG_ERJCTED;
}
switch (parm)
{
case RIG_PARM_ANN:
rig_debug(RIG_DEBUG_WARN, "%s: not implemented\n", __func__);
return -RIG_ENIMPL;
default:
return icom_get_parm(rig,parm,val);
}
rig_debug(RIG_DEBUG_TRACE, "%s: %d %d %d %f\n", __func__, res_len, icom_val,
val->i, val->f);
return RIG_OK;
}