Changes to smooth out the transaction process for all Drakes, and more test edits for the R8.

pull/1796/head
Mark J. Fine 2025-06-30 21:17:37 -04:00
rodzic 8316886063
commit f94ec6a47b
3 zmienionych plików z 526 dodań i 105 usunięć

Wyświetl plik

@ -67,6 +67,11 @@ int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data,
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
if ((data) && (data_len))
{
data[0] = 0x00;
*data_len = 0;
}
return retval; return retval;
} }
@ -81,15 +86,19 @@ int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data,
if (retval == -RIG_ETIMEOUT) if (retval == -RIG_ETIMEOUT)
{ {
retval = 0; data[0] = 0x00;
*data_len = 0;
} }
if (retval < 0) if (retval < 0)
{ {
data[0] = 0x00;
*data_len = 0;
return retval; return retval;
} }
*data_len = retval; *data_len = retval;
data[*data_len] = 0x00;
return RIG_OK; return RIG_OK;
} }

Wyświetl plik

@ -52,7 +52,6 @@ int drake_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val);
int drake_set_powerstat (RIG * rig, powerstat_t status); int drake_set_powerstat (RIG * rig, powerstat_t status);
int drake_get_powerstat (RIG * rig, powerstat_t *status); int drake_get_powerstat (RIG * rig, powerstat_t *status);
const char *drake_get_info(RIG *rig); const char *drake_get_info(RIG *rig);
int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len);
extern struct rig_caps r8_caps; extern struct rig_caps r8_caps;
extern struct rig_caps r8a_caps; extern struct rig_caps r8a_caps;

Wyświetl plik

@ -25,7 +25,9 @@
//#include <unistd.h> /* UNIX standard function definitions */ //#include <unistd.h> /* UNIX standard function definitions */
#include <hamlib/rig.h> #include <hamlib/rig.h>
//#include "serial.h" #include "serial.h"
#include "misc.h"
#include "idx_builtin.h"
//#include "cal.h" //#include "cal.h"
//#include "register.h" //#include "register.h"
@ -37,6 +39,8 @@ int drake_r8_set_vfo(RIG *rig, vfo_t vfo);
int drake_r8_get_vfo(RIG *rig, vfo_t *vfo); int drake_r8_get_vfo(RIG *rig, vfo_t *vfo);
int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width);
int drake_r8_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); int drake_r8_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
int drake_r8_init(RIG *rig);
int drake_r8_cleanup(RIG *rig);
int drake_r8_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option); int drake_r8_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option);
int drake_r8_get_ant(RIG *rig, vfo_t vfo, ant_t dummy, value_t *option, ant_t *ant_curr, ant_t *ant_tx, ant_t *ant_rx); int drake_r8_get_ant(RIG *rig, vfo_t vfo, ant_t dummy, value_t *option, ant_t *ant_curr, ant_t *ant_tx, ant_t *ant_rx);
int drake_r8_set_mem(RIG *rig, vfo_t vfo, int ch); int drake_r8_set_mem(RIG *rig, vfo_t vfo, int ch);
@ -69,7 +73,7 @@ const char *drake_r8_get_info(RIG *rig);
#define R8_FUNC (RIG_FUNC_MN|RIG_FUNC_NB|RIG_FUNC_NB2) #define R8_FUNC (RIG_FUNC_MN|RIG_FUNC_NB|RIG_FUNC_NB2)
#define R8_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC) #define R8_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR|RIG_LEVEL_STRENGTH)
#define R8_PARM_ALL (RIG_PARM_TIME) #define R8_PARM_ALL (RIG_PARM_TIME)
@ -79,6 +83,11 @@ const char *drake_r8_get_info(RIG *rig);
#define R8_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3) #define R8_ANTS (RIG_ANT_1|RIG_ANT_2|RIG_ANT_3)
#define R8_STR_CAL { 2, { \
{ 0, -60 }, \
{ 1, 0 }, \
} }
/* /*
* channel caps. * channel caps.
*/ */
@ -108,7 +117,7 @@ struct rig_caps r8_caps =
.status = RIG_STATUS_NEW, .status = RIG_STATUS_NEW,
.rig_type = RIG_TYPE_RECEIVER, .rig_type = RIG_TYPE_RECEIVER,
.ptt_type = RIG_PTT_NONE, .ptt_type = RIG_PTT_NONE,
.dcd_type = RIG_DCD_SERIAL_CAR, .dcd_type = RIG_DCD_NONE,
.port_type = RIG_PORT_SERIAL, .port_type = RIG_PORT_SERIAL,
.serial_rate_min = 9600, .serial_rate_min = 9600,
.serial_rate_max = 9600, .serial_rate_max = 9600,
@ -116,9 +125,9 @@ struct rig_caps r8_caps =
.serial_stop_bits = 1, .serial_stop_bits = 1,
.serial_parity = RIG_PARITY_EVEN, .serial_parity = RIG_PARITY_EVEN,
.serial_handshake = RIG_HANDSHAKE_HARDWARE, .serial_handshake = RIG_HANDSHAKE_HARDWARE,
.write_delay = 0, .write_delay = 1,
.post_write_delay = 1, .post_write_delay = 100, //1,
.timeout = 200, .timeout = 250,
.retry = 3, .retry = 3,
.has_get_func = R8_FUNC, .has_get_func = R8_FUNC,
@ -127,7 +136,11 @@ struct rig_caps r8_caps =
.has_set_level = RIG_LEVEL_SET(R8_LEVEL_ALL), .has_set_level = RIG_LEVEL_SET(R8_LEVEL_ALL),
.has_get_parm = R8_PARM_ALL, .has_get_parm = R8_PARM_ALL,
.has_set_parm = RIG_PARM_SET(R8_PARM_ALL), .has_set_parm = RIG_PARM_SET(R8_PARM_ALL),
.level_gran = {}, .level_gran = {
[LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } },
[LVL_ATT] = { .min = { .i = 0 }, .max = { .i = 10 } },
[LVL_PREAMP] = { .min = { .i = 0 }, .max = { .i = 10 } },
},
.parm_gran = {}, .parm_gran = {},
.ctcss_list = NULL, .ctcss_list = NULL,
.dcs_list = NULL, .dcs_list = NULL,
@ -138,9 +151,11 @@ struct rig_caps r8_caps =
.max_ifshift = Hz(0), .max_ifshift = Hz(0),
.targetable_vfo = 0, .targetable_vfo = 0,
.transceive = RIG_TRN_OFF, .transceive = RIG_TRN_OFF,
.vfo_ops = R8_VFO_OPS,
.scan_ops = 0,
.bank_qty = 0, .bank_qty = 0,
.chan_desc_sz = 0, .chan_desc_sz = 0,
.vfo_ops = R8_VFO_OPS, .priv = NULL,
.chan_list = { .chan_list = {
{ 0, 99, RIG_MTYPE_MEM, DRAKE_MEM_CAP }, { 0, 99, RIG_MTYPE_MEM, DRAKE_MEM_CAP },
@ -185,11 +200,10 @@ struct rig_caps r8_caps =
{RIG_MODE_CW, kHz(6)}, {RIG_MODE_CW, kHz(6)},
RIG_FLT_END, RIG_FLT_END,
}, },
.str_cal = {0,{}}, .str_cal = R8_STR_CAL,
.priv = NULL,
.rig_init = drake_init, .rig_init = drake_r8_init,
.rig_cleanup = drake_cleanup, .rig_cleanup = drake_r8_cleanup,
.set_freq = drake_r8_set_freq, .set_freq = drake_r8_set_freq,
.get_freq = drake_r8_get_freq, .get_freq = drake_r8_get_freq,
@ -218,43 +232,42 @@ struct rig_caps r8_caps =
* Function definitions below * Function definitions below
*/ */
/* /*
* drake_r8_fix_string * drake_r8_fix_string
* recursively replaces all special characters so they are readable at output * recursively replaces all special characters so they are readable at output
* *
*/ */
void drake_r8_fix_string(char** inStr) void drake_r8_fix_string(char* inStr)
{ {
char chChkAry[3] = {0x20, 0x0d, 0x0a}; char chChkAry[3] = {0x20, 0x0d, 0x0a};
char* chRepAry[3] = {"<SP>", "<CR>", "<LF>"}; char* chRepAry[3] = {"<SP>", "<CR>", "<LF>"};
char* chPos; char* chPos;
char newStr[100];
char* repStr;
int newLen; int newLen;
int i;
int offset; int offset;
int i;
int j;
repStr = *inStr;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
do { do {
chPos = strchr(repStr, chChkAry[i]); chPos = strchr(inStr, chChkAry[i]);
if (chPos != NULL) if (chPos != NULL)
{ {
offset = chPos - repStr; newLen = strlen(inStr);
strncpy(newStr, repStr, offset); offset = chPos - inStr;
strcat(newStr, chRepAry[i]); for (j = newLen; j > offset; j--)
strcat(newStr, repStr + offset + 1); {
newLen = strlen(repStr) + 3; inStr[j+3] = inStr[j];
newStr[newLen] = 0x00; }
free(repStr); for (j = 0; j < 4; j++)
repStr = strdup((char*)newStr); {
inStr[offset+j] = chRepAry[i][j];
}
} }
} }
while (chPos); while (chPos);
} }
*inStr = strdup(repStr);
free(repStr);
} }
@ -264,38 +277,130 @@ void drake_r8_fix_string(char** inStr)
*/ */
void drake_r8_trans_rept(char* hdrStr, char* sentStr, int sentLen, char* recdStr, int recdLen, int res) void drake_r8_trans_rept(char* hdrStr, char* sentStr, int sentLen, char* recdStr, int recdLen, int res)
{ {
char* sent; char sent[BUFSZ];
char* recd; char recd[BUFSZ];
char nullStr[7] = {'<','N','U','L','L','>',0x00};
int i;
//in most cases each string is a buffer, so we need to ensure both command and response //in most cases each string is a buffer, so we need to ensure both command and response
//are not NULL and null-terminated before duplicastion and conversion. //are not NULL and null-terminated before duplicastion and conversion.
if (sentStr != NULL) if ((sentStr != NULL) && (sentLen > 0))
{ {
//sentStr[sentLen] = '\0'; for (i = 0; i < sentLen; i++)
sent = strdup(sentStr); sent[i] = sentStr[i];
drake_r8_fix_string(&sent); sent[sentLen] = 0x00;
drake_r8_fix_string((char*)sent);
} }
else else
{ {
sent = strdup("<NULL>"); for (i = 0; i < 7; i++)
sent[i] = nullStr[i];
} }
if (recdStr != NULL) if ((recdStr != NULL) && (recdLen > 0))
{ {
//recdStr[recdLen] = '\0'; for (i = 0; i < recdLen; i++)
recd = strdup(recdStr); recd[i] = recdStr[i];
drake_r8_fix_string(&recd); recd[recdLen] = 0x00;
drake_r8_fix_string((char*)recd);
} }
else else
{ {
recd = strdup("<NULL>"); for (i = 0; i < 7; i++)
recd[i] = nullStr[i];
} }
rig_debug(RIG_DEBUG_WARN, "Hamlib %s: Result %d - Sent %d chars: %s, Recd %d chars: %s\n", hdrStr, res, sentLen, sent, recdLen, recd); rig_debug(RIG_DEBUG_WARN, "Hamlib %s: Result %d - Sent %d chars: %s, Recd %d chars: %s\n", hdrStr, res, sentLen, sent, recdLen, recd);
free(sent); }
free(recd);
/*
* drake_r8_transaction
* We assume that rig!=NULL, STATE(rig)!= NULL, data!=NULL, data_len!=NULL
*/
int drake_r8_transaction(RIG *rig, const char *cmd, int cmd_len, char *data,
int *data_len)
{
int retval;
hamlib_port_t *rp = RIGPORT(rig);
rig_flush(rp);
//fprintf(stderr, "Sending %d bytes: %s.\n", cmd_len, cmd);
retval = write_block(rp, (unsigned char *) cmd, cmd_len);
if (retval != RIG_OK)
{
//fprintf(stderr, "Send error %d.\n", retval);
if ((data) && (data_len))
{
data[0] = 0x00;
*data_len = 0;
}
return retval;
}
/* no data expected, TODO: flush input? */
if (!data || !data_len)
{
//fprintf(stderr, "No response expected.\n");
return 0;
}
//fprintf(stderr, "Receiving...\n");
retval = read_string(rp, (unsigned char *) data, BUFSZ,
LF, 1, 0, 1);
if (retval == -RIG_ETIMEOUT)
{
//fprintf(stderr, "Receive timeout.\n");
data[0] = 0x00;
*data_len = 0;
}
if (retval < 0)
{
//fprintf(stderr, "Receive error %d.\n", retval);
data[0] = 0x00;
*data_len = 0;
return retval;
}
//fprintf(stderr, "Received %d bytes.\n", retval);
*data_len = retval;
data[*data_len] = 0x00;
return RIG_OK;
}
int drake_r8_init(RIG *rig)
{
struct drake_priv_data *priv;
STATE(rig)->priv = calloc(1, sizeof(struct drake_priv_data));
if (!STATE(rig)->priv)
{
return -RIG_ENOMEM;
}
priv = STATE(rig)->priv;
priv->curr_ch = 0;
return RIG_OK;
}
int drake_r8_cleanup(RIG *rig)
{
struct drake_priv_data *priv = STATE(rig)->priv;
free(priv);
return RIG_OK;
} }
@ -305,20 +410,30 @@ void drake_r8_trans_rept(char* hdrStr, char* sentStr, int sentLen, char* recdStr
*/ */
int drake_r8_set_freq(RIG *rig, vfo_t vfo, freq_t freq) int drake_r8_set_freq(RIG *rig, vfo_t vfo, freq_t freq)
{ {
unsigned char freqbuf[16], ackbuf[16]; char freqbuf[16], ackbuf[16];
int ack_len, retval; int ack_len, retval;
/* /*
* 10Hz resolution * 10Hz resolution
* TODO: round nearest? * TODO: round nearest?
*/ */
SNPRINTF((char *) freqbuf, sizeof(freqbuf), "F%07u" EOM, SNPRINTF((char *) freqbuf, sizeof(freqbuf), "F%07u" EOM, (unsigned int)freq / 10);
(unsigned int)freq / 10);
retval = drake_transaction(rig, (char *) freqbuf, strlen((char *)freqbuf),
(char *) ackbuf,
&ack_len);
drake_r8_trans_rept("set_freq", (char*)freqbuf, strlen((char*)freqbuf), (char*)ackbuf, ack_len, retval); retval = drake_r8_transaction(rig, freqbuf, strlen(freqbuf), ackbuf, &ack_len);
//let's trick it
/*
char testbuf[2] = {0x0d, 0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ackbuf[1] = testbuf[1];
ack_len = 2;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_freq", freqbuf, strlen(freqbuf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -335,9 +450,22 @@ int drake_r8_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
double f; double f;
//char fmult; //char fmult;
retval = drake_transaction(rig, "RF" EOM, 3, freqbuf, &freq_len); retval = drake_r8_transaction(rig, "RF" EOM, 3, freqbuf, &freq_len);
drake_r8_trans_rept("get_freq", "RF" EOM, 3, (char*)freqbuf, freq_len, retval); //let's trick it
/*
char testbuf[15] = {' ', '1', '5', '.', '0', '0', '0', '0', '0', '#', 'm', 'H', 'z', 0x0d, 0x0a }; //mem off, ch 00, NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (freq_len == 0)
{
for (int i=0; i < 15; i++) {
freqbuf[i] = testbuf[i];
}
freq_len = 15;
freqbuf[freq_len] = 0x00;
retval = RIG_OK;
}*/
drake_r8_trans_rept("get_freq", "RF" EOM, 3, freqbuf, freq_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -345,7 +473,7 @@ int drake_r8_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
} }
/* RA command returns fff.fffff*mHz<CR><LF> */ /* RA command returns fff.fffff*mHz<CR><LF> */
if (freq_len < 15) if (freq_len != 15)
{ {
rig_debug(RIG_DEBUG_ERR, "drake_get_freq: wrong answer %s, " rig_debug(RIG_DEBUG_ERR, "drake_get_freq: wrong answer %s, "
"len=%d\n", freqbuf, freq_len); "len=%d\n", freqbuf, freq_len);
@ -370,7 +498,7 @@ int drake_r8_get_freq(RIG *rig, vfo_t vfo, freq_t *freq)
*/ */
int drake_r8_set_vfo(RIG *rig, vfo_t vfo) int drake_r8_set_vfo(RIG *rig, vfo_t vfo)
{ {
unsigned char cmdbuf[16], ackbuf[16]; char cmdbuf[16], ackbuf[16];
int ack_len, retval; int ack_len, retval;
char vfo_function; char vfo_function;
@ -400,11 +528,20 @@ int drake_r8_set_vfo(RIG *rig, vfo_t vfo)
SNPRINTF((char *) cmdbuf, sizeof(cmdbuf), "%c" EOM, vfo_function); SNPRINTF((char *) cmdbuf, sizeof(cmdbuf), "%c" EOM, vfo_function);
} }
retval = drake_transaction(rig, (char *) cmdbuf, strlen((char *)cmdbuf), retval = drake_r8_transaction(rig, cmdbuf, strlen(cmdbuf), ackbuf, &ack_len);
(char *) ackbuf,
&ack_len);
drake_r8_trans_rept("set_vfo", (char*)cmdbuf, strlen((char*)cmdbuf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = RIG_OK;
}*/
drake_r8_trans_rept("set_vfo", cmdbuf, strlen(cmdbuf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -420,9 +557,22 @@ int drake_r8_get_vfo(RIG *rig, vfo_t *vfo)
int mdbuf_len, retval; int mdbuf_len, retval;
char mdbuf[BUFSZ]; char mdbuf[BUFSZ];
retval = drake_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
drake_r8_trans_rept("get_vfo", "RA" EOM, 3, (char*)mdbuf, mdbuf_len, retval); //let's trick it
/*
char testbuf[25] = {' ','0','0',' ','2','0','2','<','8', ' ', ' ', '1', '5', '.', '0', '0', '0', '0', '0', '#', 'm', 'H', 'z', 0x0d, 0x0a }; //mem off, ch 00, NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (mdbuf_len == 0)
{
for (int i=0; i < 25; i++) {
mdbuf[i] = testbuf[i];
}
mdbuf_len = 25;
mdbuf[mdbuf_len] = 0x00;
retval = RIG_OK;
}*/
drake_r8_trans_rept("get_vfo", "RA" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -467,8 +617,8 @@ int drake_r8_get_vfo(RIG *rig, vfo_t *vfo)
*/ */
int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
{ {
unsigned char mdbuf[16], ackbuf[16]; char mdbuf[16], ackbuf[16];
unsigned char mode_sel; char mode_sel;
int ack_len, retval; int ack_len, retval;
switch (mode) switch (mode)
@ -493,11 +643,20 @@ int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
} }
SNPRINTF((char *) mdbuf, sizeof(mdbuf), "M%c" EOM, mode_sel); SNPRINTF((char *) mdbuf, sizeof(mdbuf), "M%c" EOM, mode_sel);
retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len);
(char *) ackbuf,
&ack_len);
drake_r8_trans_rept("set_mode", (char*)mdbuf, strlen((char*)mdbuf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_mode", mdbuf, strlen(mdbuf), ackbuf, ack_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -537,10 +696,20 @@ int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
} }
SNPRINTF((char *) mdbuf, sizeof(mdbuf), "W%c" EOM, width_sel); SNPRINTF((char *) mdbuf, sizeof(mdbuf), "W%c" EOM, width_sel);
retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len);
(char *) ackbuf,
&ack_len); //let's trick it
drake_r8_trans_rept("set_bw", (char*)mdbuf, strlen((char*)mdbuf), (char*)ackbuf, ack_len, retval); /*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_bw", mdbuf, strlen(mdbuf), ackbuf, ack_len, retval);
} }
} }
@ -549,11 +718,20 @@ int drake_r8_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
{ {
SNPRINTF((char *) mdbuf, sizeof(mdbuf), "S%c" EOM, SNPRINTF((char *) mdbuf, sizeof(mdbuf), "S%c" EOM,
(mode == RIG_MODE_AMS) ? 'O' : 'F'); (mode == RIG_MODE_AMS) ? 'O' : 'F');
retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len);
(char *) ackbuf,
&ack_len);
drake_r8_trans_rept("set_synch", (char*)mdbuf, strlen((char*)mdbuf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_synch", mdbuf, strlen(mdbuf), ackbuf, ack_len, retval);
} }
return retval; return retval;
@ -572,9 +750,22 @@ int drake_r8_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
char cwidth; char cwidth;
char csynch; char csynch;
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
drake_r8_trans_rept("get_mode", "RM" EOM, 3, (char*)mdbuf, mdbuf_len, retval); //let's trick it
/*
char testbuf[7] = {'2','0','2','<','8', 0x0d, 0x0a}; //NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (mdbuf_len == 0)
{
for (int i=0; i < 7; i++) {
mdbuf[i] = testbuf[i];
}
mdbuf_len = 7;
mdbuf[mdbuf_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_mode", "RM" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -675,16 +866,26 @@ int drake_r8_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
*/ */
int drake_r8_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option) int drake_r8_set_ant(RIG *rig, vfo_t vfo, ant_t ant, value_t option)
{ {
unsigned char buf[16], ackbuf[16]; char buf[16], ackbuf[16];
int ack_len, retval; int ack_len, retval;
SNPRINTF((char *) buf, sizeof(buf), "A%c" EOM, SNPRINTF((char *) buf, sizeof(buf), "A%c" EOM,
ant == RIG_ANT_1 ? '1' : (ant == RIG_ANT_2 ? '2' : 'C')); ant == RIG_ANT_1 ? '1' : (ant == RIG_ANT_2 ? '2' : 'C'));
retval = drake_transaction(rig, (char *) buf, strlen((char *)buf), retval = drake_r8_transaction(rig, buf, strlen(buf), ackbuf, &ack_len);
(char *) ackbuf, &ack_len);
drake_r8_trans_rept("set_ant", (char*)buf, strlen((char*)buf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_ant", buf, strlen(buf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -701,7 +902,22 @@ int drake_r8_get_ant(RIG *rig, vfo_t vfo, ant_t dummy, value_t *option,
char mdbuf[BUFSZ]; char mdbuf[BUFSZ];
char cant; char cant;
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
//let's trick it
/*
char testbuf[7] = {'2','0','2','<','8', 0x0d, 0x0a}; //NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (mdbuf_len == 0)
{
for (int i=0; i < 7; i++) {
mdbuf[i] = testbuf[i];
}
mdbuf_len = 7;
mdbuf[mdbuf_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_ant", "RM" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -751,9 +967,21 @@ int drake_r8_set_mem(RIG *rig, vfo_t vfo, int ch)
SNPRINTF(buf, sizeof(buf), "C%02d" , ch); SNPRINTF(buf, sizeof(buf), "C%02d" , ch);
ack_len = 0; // fix compile-time warning "possibly uninitialized" ack_len = 0; // fix compile-time warning "possibly uninitialized"
retval = drake_transaction(rig, buf, strlen(buf), ackbuf, &ack_len); retval = drake_r8_transaction(rig, buf, strlen(buf), ackbuf, &ack_len);
drake_r8_trans_rept("set_mem", (char*)buf, strlen((char*)buf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[2] = {0x0d, 0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ackbuf[1] = testbuf[1];
ack_len = 2;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_mem", buf, strlen(buf), ackbuf, ack_len, retval);
if (ack_len != 2) if (ack_len != 2)
{ {
@ -775,16 +1003,29 @@ int drake_r8_get_mem(RIG *rig, vfo_t vfo, int *ch)
char mdbuf[BUFSZ]; char mdbuf[BUFSZ];
int chan; int chan;
retval = drake_transaction(rig, "RC" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RC" EOM, 3, mdbuf, &mdbuf_len);
drake_r8_trans_rept("get_mem", "RC" EOM, 3, (char*)mdbuf, mdbuf_len, retval); //let's trick it
/*
char testbuf[5] = {' ','0','0', 0x0d, 0x0a };
if (mdbuf_len == 0)
{
for (int i=0; i < 5; i++) {
mdbuf[i] = testbuf[i];
}
mdbuf_len = 5;
mdbuf[mdbuf_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_mem", "RC" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
return retval; return retval;
} }
if (mdbuf_len < 5) if (mdbuf_len != 5)
{ {
rig_debug(RIG_DEBUG_ERR, "drake_get_mem: wrong answer %s, " rig_debug(RIG_DEBUG_ERR, "drake_get_mem: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len); "len=%d\n", mdbuf, mdbuf_len);
@ -849,9 +1090,21 @@ int drake_r8_set_chan(RIG *rig, vfo_t vfo, const channel_t *chan)
(chan->funcs & RIG_FUNC_MN) == RIG_FUNC_MN); (chan->funcs & RIG_FUNC_MN) == RIG_FUNC_MN);
SNPRINTF(mdbuf, sizeof(mdbuf), "PR" EOM "%02d" EOM, chan->channel_num); SNPRINTF(mdbuf, sizeof(mdbuf), "PR" EOM "%02d" EOM, chan->channel_num);
retval = drake_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len); retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len);
drake_r8_trans_rept("set_chan", (char*)mdbuf, strlen((char*)mdbuf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[2] = {0x0d, 0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ackbuf[1] = testbuf[1];
ack_len = 2;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_chan", mdbuf, strlen(mdbuf), ackbuf, ack_len, retval);
if (old_vfo == RIG_VFO_MEM) if (old_vfo == RIG_VFO_MEM)
{ {
@ -918,7 +1171,9 @@ int drake_r8_get_chan(RIG *rig, vfo_t vfo, channel_t *chan, int read_only)
} }
//now decipher it //now decipher it
retval = drake_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
drake_r8_trans_rept("get_chan", "RA" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -1100,10 +1355,25 @@ int drake_r8_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op)
} }
len = strlen(buf); len = strlen(buf);
retval = drake_transaction(rig, buf, len, buf[len - 1] == 0x0d ? ackbuf : NULL, retval = drake_r8_transaction(rig, buf, len, len == 1 ? ackbuf : NULL,
&ack_len); len == 1 ? &ack_len : NULL);
drake_r8_trans_rept("vfo_op", (char*)buf, len, buf[len - 1] == 0x0d ? (char*)ackbuf : NULL, ack_len, retval); //let's trick it
/*
if ((op == RIG_OP_TO_VFO) || (op == RIG_OP_FROM_VFO))
{
char testbuf[2] = {0x0d, 0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ackbuf[1] = testbuf[1];
ack_len = 2;
ackbuf[ack_len] = 0x00;
retval = 0;
}
}*/
drake_r8_trans_rept("vfo_op", buf, len, buf[len - 1] == 0x0d ? ackbuf : NULL, ack_len, retval);
return retval; return retval;
} }
@ -1140,9 +1410,20 @@ int drake_r8_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
return -RIG_EINVAL; return -RIG_EINVAL;
} }
retval = drake_transaction(rig, buf, strlen(buf), ackbuf, &ack_len); retval = drake_r8_transaction(rig, buf, strlen(buf), ackbuf, &ack_len);
drake_r8_trans_rept("set_func", (char*)buf, strlen((char*)buf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_func", buf, strlen(buf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -1159,7 +1440,22 @@ int drake_r8_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
char mc; char mc;
char blanker; char blanker;
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len); retval = drake_r8_transaction(rig, "RM" EOM, 3, mdbuf, &mdbuf_len);
//let's trick it
/*
char testbuf[7] = {'2','0','2','<','8', 0x0d, 0x0a}; //NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (mdbuf_len == 0)
{
for (int i=0; i < 7; i++) {
mdbuf[i] = testbuf[i];
}
mdbuf_len = 7;
mdbuf[mdbuf_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_func", "RM" EOM, 3, mdbuf, mdbuf_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -1232,9 +1528,20 @@ int drake_r8_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
return -RIG_EINVAL; return -RIG_EINVAL;
} }
retval = drake_transaction(rig, buf, strlen(buf), ackbuf, &ack_len); retval = drake_r8_transaction(rig, buf, strlen(buf), ackbuf, &ack_len);
drake_r8_trans_rept("set_level", (char*)buf, strlen((char*)buf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_level", buf, strlen(buf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -1250,7 +1557,47 @@ int drake_r8_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
char lvlbuf[BUFSZ]; char lvlbuf[BUFSZ];
char mc; char mc;
retval = drake_transaction(rig, "RM" EOM, 3, lvlbuf, &lvl_len); if ((level == RIG_LEVEL_STRENGTH) || (level == RIG_LEVEL_RAWSTR))
{
retval = drake_r8_transaction(rig, "RA" EOM, 3, lvlbuf, &lvl_len);
//let's trick it
/*
char testbuf[25] = {' ','0','0',' ','2','0','2','<','8', ' ', ' ', '1', '5', '.', '0', '0', '0', '0', '0', '#', 'm', 'H', 'z', 0x0d, 0x0a }; //mem off, ch 00, NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (lvl_len == 0)
{
for (int i=0; i < 25; i++) {
lvlbuf[i] = testbuf[i];
}
lvl_len = 25;
lvlbuf[lvl_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_level", "RA" EOM, 3, lvlbuf, lvl_len, retval);
}
else
{
retval = drake_r8_transaction(rig, "RM" EOM, 3, lvlbuf, &lvl_len);
//let's trick it
/*
char testbuf[7] = {'2','0','2','<','8', 0x0d, 0x0a}; //NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (lvl_len == 0)
{
for (int i=0; i < 7; i++) {
lvlbuf[i] = testbuf[i];
}
lvl_len = 7;
lvlbuf[lvl_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_level", "RM" EOM, 3, lvlbuf, lvl_len, retval);
}
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -1310,6 +1657,34 @@ int drake_r8_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case RIG_LEVEL_RAWSTR:
mc = lvlbuf[19];
switch (mc)
{
case ' ': val->i = 0; break;
case '#': val->i = 1; break;
default : val->i = 0;
}
break;
case RIG_LEVEL_STRENGTH:
mc = lvlbuf[19];
switch (mc)
{
case ' ': val->i = -60; break;
case '#': val->i = 0; break;
default : val->i = -60;
}
break;
default: default:
rig_debug(RIG_DEBUG_ERR, "Unsupported get_level %s\n", rig_strlevel(level)); rig_debug(RIG_DEBUG_ERR, "Unsupported get_level %s\n", rig_strlevel(level));
return -RIG_EINVAL; return -RIG_EINVAL;
@ -1326,9 +1701,20 @@ int drake_r8_set_powerstat(RIG *rig, powerstat_t status)
SNPRINTF(buf, sizeof(buf), "P%c" EOM, status == RIG_POWER_OFF ? 'F' : 'O'); SNPRINTF(buf, sizeof(buf), "P%c" EOM, status == RIG_POWER_OFF ? 'F' : 'O');
retval = drake_transaction(rig, buf, strlen(buf), ackbuf, &ack_len); retval = drake_r8_transaction(rig, buf, strlen(buf), ackbuf, &ack_len);
drake_r8_trans_rept("set_power", (char*)buf, strlen((char*)buf), (char*)ackbuf, ack_len, retval); //let's trick it
/*
char testbuf[1] = {0x0a};
if (ack_len == 0)
{
ackbuf[0] = testbuf[0];
ack_len = 1;
ackbuf[ack_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("set_power", buf, strlen(buf), ackbuf, ack_len, retval);
return retval; return retval;
} }
@ -1339,7 +1725,22 @@ int drake_r8_get_powerstat(RIG *rig, powerstat_t *status)
int mdlen, retval; int mdlen, retval;
char mdbuf[BUFSZ]; char mdbuf[BUFSZ];
retval = drake_transaction(rig, "RM" EOM, 3, mdbuf, &mdlen); retval = drake_r8_transaction(rig, "RM" EOM, 3, &mdbuf[0], &mdlen);
//let's trick it
/*
char testbuf[7] = {'2','0','2','<','8', 0x0d, 0x0a}; //NB off, AGC fast, RF off, MN off, ant 1, AM mode, 6.0 bw, VFOA, sync off, not scanning
if (mdlen == 0)
{
for (int i=0; i < 7; i++) {
mdbuf[i] = testbuf[i];
}
mdlen = 7;
mdbuf[mdlen] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_power", "RM" EOM, 3, mdbuf, mdlen, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -1361,16 +1762,28 @@ const char *drake_r8_get_info(RIG *rig)
static char idbuf[BUFSZ]; static char idbuf[BUFSZ];
int retval, id_len; int retval, id_len;
retval = drake_transaction(rig, "ID" EOM, 3, idbuf, &id_len); retval = drake_r8_transaction(rig, "ID" EOM, 3, idbuf, &id_len);
drake_r8_trans_rept("get_id", "ID" EOM, 3, (char*)idbuf, id_len, retval); //let's trick it
/*
char testbuf[4] = {'R','8',0x0d,0x0a};
if (id_len == 0)
{
for (int i = 0; i < 4; i++)
idbuf[i] = testbuf[i];
id_len = 4;
idbuf[id_len] = 0x00;
retval = 0;
}*/
drake_r8_trans_rept("get_id", "ID" EOM, 3, idbuf, id_len, retval);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
return NULL; return NULL;
} }
idbuf[id_len] = '\0'; idbuf[id_len - 2] = '\0';
return idbuf; return idbuf;
} }