From f94ec6a47b3b06f166a19d74cf34148342a9bea2 Mon Sep 17 00:00:00 2001 From: "Mark J. Fine" Date: Mon, 30 Jun 2025 21:17:37 -0400 Subject: [PATCH] Changes to smooth out the transaction process for all Drakes, and more test edits for the R8. --- rigs/drake/drake.c | 11 +- rigs/drake/drake.h | 1 - rigs/drake/r8.c | 619 +++++++++++++++++++++++++++++++++++++-------- 3 files changed, 526 insertions(+), 105 deletions(-) diff --git a/rigs/drake/drake.c b/rigs/drake/drake.c index 40806ed14..cf2024f74 100644 --- a/rigs/drake/drake.c +++ b/rigs/drake/drake.c @@ -67,6 +67,11 @@ int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, if (retval != RIG_OK) { + if ((data) && (data_len)) + { + data[0] = 0x00; + *data_len = 0; + } return retval; } @@ -81,15 +86,19 @@ int drake_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, if (retval == -RIG_ETIMEOUT) { - retval = 0; + data[0] = 0x00; + *data_len = 0; } if (retval < 0) { + data[0] = 0x00; + *data_len = 0; return retval; } *data_len = retval; + data[*data_len] = 0x00; return RIG_OK; } diff --git a/rigs/drake/drake.h b/rigs/drake/drake.h index 13bd52c5f..b3ddae5a7 100644 --- a/rigs/drake/drake.h +++ b/rigs/drake/drake.h @@ -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_get_powerstat (RIG * rig, powerstat_t *status); 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 r8a_caps; diff --git a/rigs/drake/r8.c b/rigs/drake/r8.c index 7d4ba90f2..ab5311434 100644 --- a/rigs/drake/r8.c +++ b/rigs/drake/r8.c @@ -25,7 +25,9 @@ //#include /* UNIX standard function definitions */ #include -//#include "serial.h" +#include "serial.h" +#include "misc.h" +#include "idx_builtin.h" //#include "cal.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_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_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_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); @@ -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_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) @@ -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_STR_CAL { 2, { \ + { 0, -60 }, \ + { 1, 0 }, \ + } } + /* * channel caps. */ @@ -108,7 +117,7 @@ struct rig_caps r8_caps = .status = RIG_STATUS_NEW, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, - .dcd_type = RIG_DCD_SERIAL_CAR, + .dcd_type = RIG_DCD_NONE, .port_type = RIG_PORT_SERIAL, .serial_rate_min = 9600, .serial_rate_max = 9600, @@ -116,9 +125,9 @@ struct rig_caps r8_caps = .serial_stop_bits = 1, .serial_parity = RIG_PARITY_EVEN, .serial_handshake = RIG_HANDSHAKE_HARDWARE, - .write_delay = 0, - .post_write_delay = 1, - .timeout = 200, + .write_delay = 1, + .post_write_delay = 100, //1, + .timeout = 250, .retry = 3, .has_get_func = R8_FUNC, @@ -127,7 +136,11 @@ struct rig_caps r8_caps = .has_set_level = RIG_LEVEL_SET(R8_LEVEL_ALL), .has_get_parm = 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 = {}, .ctcss_list = NULL, .dcs_list = NULL, @@ -138,9 +151,11 @@ struct rig_caps r8_caps = .max_ifshift = Hz(0), .targetable_vfo = 0, .transceive = RIG_TRN_OFF, + .vfo_ops = R8_VFO_OPS, + .scan_ops = 0, .bank_qty = 0, .chan_desc_sz = 0, - .vfo_ops = R8_VFO_OPS, + .priv = NULL, .chan_list = { { 0, 99, RIG_MTYPE_MEM, DRAKE_MEM_CAP }, @@ -185,11 +200,10 @@ struct rig_caps r8_caps = {RIG_MODE_CW, kHz(6)}, RIG_FLT_END, }, - .str_cal = {0,{}}, - .priv = NULL, + .str_cal = R8_STR_CAL, - .rig_init = drake_init, - .rig_cleanup = drake_cleanup, + .rig_init = drake_r8_init, + .rig_cleanup = drake_r8_cleanup, .set_freq = drake_r8_set_freq, .get_freq = drake_r8_get_freq, @@ -218,43 +232,42 @@ struct rig_caps r8_caps = * Function definitions below */ + /* * drake_r8_fix_string * 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* chRepAry[3] = {"", "", ""}; char* chPos; - char newStr[100]; - char* repStr; int newLen; - int i; int offset; + int i; + int j; - repStr = *inStr; for (i = 0; i < 3; i++) { do { - chPos = strchr(repStr, chChkAry[i]); + chPos = strchr(inStr, chChkAry[i]); if (chPos != NULL) { - offset = chPos - repStr; - strncpy(newStr, repStr, offset); - strcat(newStr, chRepAry[i]); - strcat(newStr, repStr + offset + 1); - newLen = strlen(repStr) + 3; - newStr[newLen] = 0x00; - free(repStr); - repStr = strdup((char*)newStr); + newLen = strlen(inStr); + offset = chPos - inStr; + for (j = newLen; j > offset; j--) + { + inStr[j+3] = inStr[j]; + } + for (j = 0; j < 4; j++) + { + inStr[offset+j] = chRepAry[i][j]; + } } } 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) { - char* sent; - char* recd; + char sent[BUFSZ]; + 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 //are not NULL and null-terminated before duplicastion and conversion. - if (sentStr != NULL) + if ((sentStr != NULL) && (sentLen > 0)) { - //sentStr[sentLen] = '\0'; - sent = strdup(sentStr); - drake_r8_fix_string(&sent); + for (i = 0; i < sentLen; i++) + sent[i] = sentStr[i]; + sent[sentLen] = 0x00; + drake_r8_fix_string((char*)sent); } else { - sent = strdup(""); + for (i = 0; i < 7; i++) + sent[i] = nullStr[i]; } - if (recdStr != NULL) + if ((recdStr != NULL) && (recdLen > 0)) { - //recdStr[recdLen] = '\0'; - recd = strdup(recdStr); - drake_r8_fix_string(&recd); + for (i = 0; i < recdLen; i++) + recd[i] = recdStr[i]; + recd[recdLen] = 0x00; + drake_r8_fix_string((char*)recd); } else { - recd = strdup(""); + 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); - 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) { - unsigned char freqbuf[16], ackbuf[16]; + char freqbuf[16], ackbuf[16]; int ack_len, retval; /* * 10Hz resolution * TODO: round nearest? */ - SNPRINTF((char *) freqbuf, sizeof(freqbuf), "F%07u" EOM, - (unsigned int)freq / 10); - retval = drake_transaction(rig, (char *) freqbuf, strlen((char *)freqbuf), - (char *) ackbuf, - &ack_len); + SNPRINTF((char *) freqbuf, sizeof(freqbuf), "F%07u" EOM, (unsigned int)freq / 10); + + retval = drake_r8_transaction(rig, freqbuf, strlen(freqbuf), ackbuf, &ack_len); - drake_r8_trans_rept("set_freq", (char*)freqbuf, strlen((char*)freqbuf), (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_freq", freqbuf, strlen(freqbuf), ackbuf, ack_len, retval); return retval; } @@ -335,9 +450,22 @@ int drake_r8_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) double f; //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) { @@ -345,7 +473,7 @@ int drake_r8_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) } /* RA command returns fff.fffff*mHz */ - if (freq_len < 15) + if (freq_len != 15) { rig_debug(RIG_DEBUG_ERR, "drake_get_freq: wrong answer %s, " "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) { - unsigned char cmdbuf[16], ackbuf[16]; + char cmdbuf[16], ackbuf[16]; int ack_len, retval; 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); } - retval = drake_transaction(rig, (char *) cmdbuf, strlen((char *)cmdbuf), - (char *) ackbuf, - &ack_len); + retval = drake_r8_transaction(rig, cmdbuf, strlen(cmdbuf), 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; } @@ -420,9 +557,22 @@ int drake_r8_get_vfo(RIG *rig, vfo_t *vfo) int mdbuf_len, retval; 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) { @@ -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) { - unsigned char mdbuf[16], ackbuf[16]; - unsigned char mode_sel; + char mdbuf[16], ackbuf[16]; + char mode_sel; int ack_len, retval; 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); - retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), - (char *) ackbuf, - &ack_len); + retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), 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) { @@ -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); - retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), - (char *) ackbuf, - &ack_len); - drake_r8_trans_rept("set_bw", (char*)mdbuf, strlen((char*)mdbuf), (char*)ackbuf, ack_len, retval); + retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), ackbuf, &ack_len); + + //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_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, (mode == RIG_MODE_AMS) ? 'O' : 'F'); - retval = drake_transaction(rig, (char *) mdbuf, strlen((char *)mdbuf), - (char *) ackbuf, - &ack_len); + retval = drake_r8_transaction(rig, mdbuf, strlen(mdbuf), 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; @@ -572,9 +750,22 @@ int drake_r8_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) char cwidth; 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) { @@ -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) { - unsigned char buf[16], ackbuf[16]; + char buf[16], ackbuf[16]; int ack_len, retval; SNPRINTF((char *) buf, sizeof(buf), "A%c" EOM, ant == RIG_ANT_1 ? '1' : (ant == RIG_ANT_2 ? '2' : 'C')); - retval = drake_transaction(rig, (char *) buf, strlen((char *)buf), - (char *) ackbuf, &ack_len); + retval = drake_r8_transaction(rig, buf, strlen(buf), 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; } @@ -701,7 +902,22 @@ int drake_r8_get_ant(RIG *rig, vfo_t vfo, ant_t dummy, value_t *option, char mdbuf[BUFSZ]; 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) { @@ -751,9 +967,21 @@ int drake_r8_set_mem(RIG *rig, vfo_t vfo, int ch) SNPRINTF(buf, sizeof(buf), "C%02d" , ch); 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) { @@ -775,16 +1003,29 @@ int drake_r8_get_mem(RIG *rig, vfo_t vfo, int *ch) char mdbuf[BUFSZ]; 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) { return retval; } - if (mdbuf_len < 5) + if (mdbuf_len != 5) { rig_debug(RIG_DEBUG_ERR, "drake_get_mem: wrong answer %s, " "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); 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) { @@ -918,7 +1171,9 @@ int drake_r8_get_chan(RIG *rig, vfo_t vfo, channel_t *chan, int read_only) } //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) { @@ -1100,10 +1355,25 @@ int drake_r8_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) } len = strlen(buf); - retval = drake_transaction(rig, buf, len, buf[len - 1] == 0x0d ? ackbuf : NULL, - &ack_len); + retval = drake_r8_transaction(rig, buf, len, len == 1 ? ackbuf : NULL, + 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; } @@ -1140,9 +1410,20 @@ int drake_r8_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) 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; } @@ -1159,7 +1440,22 @@ int drake_r8_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) char mc; 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) { @@ -1232,9 +1528,20 @@ int drake_r8_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) 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; } @@ -1250,7 +1557,47 @@ int drake_r8_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) char lvlbuf[BUFSZ]; 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) { @@ -1310,6 +1657,34 @@ int drake_r8_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) 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: rig_debug(RIG_DEBUG_ERR, "Unsupported get_level %s\n", rig_strlevel(level)); return -RIG_EINVAL; @@ -1326,10 +1701,21 @@ int drake_r8_set_powerstat(RIG *rig, powerstat_t status) 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; } @@ -1339,7 +1725,22 @@ int drake_r8_get_powerstat(RIG *rig, powerstat_t *status) int mdlen, retval; 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) { @@ -1361,16 +1762,28 @@ const char *drake_r8_get_info(RIG *rig) static char idbuf[BUFSZ]; 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) { return NULL; } - idbuf[id_len] = '\0'; + idbuf[id_len - 2] = '\0'; return idbuf; }