diff --git a/include/hamlib/rig.h b/include/hamlib/rig.h index c3a5f2696..5e01ee62e 100644 --- a/include/hamlib/rig.h +++ b/include/hamlib/rig.h @@ -140,6 +140,15 @@ enum rig_errcode_e { RIG_EDOM /*!< 17 Argument out of domain of func */ }; +/** + * \brief Determines if the given error code indicates a "soft" error + * Soft errors are caused by invalid parameters and software/hardware features + * and cannot be fixed by retries or by re-initializing hardware. + */ +#define RIG_IS_SOFT_ERRCODE(errcode) (errcode == RIG_EINVAL || errcode == RIG_ENIMPL || errcode == RIG_ERJCTED \ + || errcode == RIG_ETRUNC || errcode == RIG_ENAVAIL || errcode == RIG_ENTARGET \ + || errcode == RIG_EVFO || errcode == RIG_EDOM) + /** * \brief Token in the netrigctl protocol for returning error code */ diff --git a/rigs/icom/icom.c b/rigs/icom/icom.c index 8d4bdff66..11ead96e2 100644 --- a/rigs/icom/icom.c +++ b/rigs/icom/icom.c @@ -6532,20 +6532,6 @@ int icom_get_powerstat(RIG *rig, powerstat_t *status) RETURNFUNC(retval); } - if ((ack_len >= 1 && ackbuf[0] != ACK) && (ack_len >= 2 && ackbuf[1] != NAK)) - { - // if we don't get ACK/NAK some serial corruption occurred - // so we'll call it a timeout for retry purposes - RETURNFUNC(-RIG_ETIMEOUT); - } - - if (ack_len != 1 || (ack_len >= 1 && ackbuf[0] != ACK)) - { - rig_debug(RIG_DEBUG_ERR, "%s: ack NG (%#.2x), len=%d\n", __func__, - ackbuf[0], ack_len); - RETURNFUNC(-RIG_ERJCTED); - } - *status = ackbuf[1] == S_PWR_ON ? RIG_POWER_ON : RIG_POWER_OFF; } @@ -7385,13 +7371,6 @@ int icom_get_raw_buf(RIG *rig, int cmd, int subcmd, int subcmdbuflen, cmdhead += (subcmd == -1) ? 1 : 2; ack_len -= cmdhead; - if ((ack_len >= 1 && ackbuf[0] != ACK) && (ack_len >= 2 && ackbuf[1] != NAK)) - { - // if we don't get ACK/NAK some serial corruption occurred - // so we'll call it a timeout for retry purposes - RETURNFUNC(-RIG_ETIMEOUT); - } - rig_debug(RIG_DEBUG_TRACE, "%s: %d\n", __func__, ack_len); if (*reslen < ack_len || res == NULL) diff --git a/tests/rigctl.c b/tests/rigctl.c index 978fc8710..e982dbce6 100644 --- a/tests/rigctl.c +++ b/tests/rigctl.c @@ -611,14 +611,9 @@ int main(int argc, char *argv[]) interactive, prompt, &vfo_opt, send_cmd_term, &ext_resp, &resp_sep); - if (retcode == 2) - { - exitcode = 2; - } - // if we get a hard error we try to reopen the rig again // this should cover short dropouts that can occur - if (retcode == -RIG_EIO || retcode == 2) + if (retcode < 0 && !RIG_IS_SOFT_ERRCODE(-retcode)) { int retry = 3; rig_debug(RIG_DEBUG_ERR, "%s: i/o error\n", __func__) @@ -632,10 +627,9 @@ int main(int argc, char *argv[]) rig_debug(RIG_DEBUG_ERR, "%s: rig_open retcode=%d\n", __func__, retcode); } while (retry-- > 0 && retcode != RIG_OK); - } } - while (retcode == 0 || retcode == 2 || retcode == -RIG_ENAVAIL); + while (retcode == RIG_OK || RIG_IS_SOFT_ERRCODE(-retcode)); if (interactive && prompt) { diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index ebb8eb1b3..729382ba9 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -65,7 +65,6 @@ extern int read_history(); #include #include "misc.h" #include "iofunc.h" -#include "serial.h" #include "sprintflst.h" #include "rigctl_parse.h" @@ -662,7 +661,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#1? retcode=%d\n", __func__, retcode); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } if (cmd != 0xa) @@ -681,12 +680,12 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%c", &cmd) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#2?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } } else if (cmd == '+' && prompt) { - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } if (cmd != '\\' @@ -704,7 +703,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%c", &cmd) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#3?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } } else if (cmd != '\\' @@ -717,7 +716,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, && prompt) { - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* command by name */ @@ -728,7 +727,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%c", pcmd) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#4?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } retcode = fscanf(fin, "%s", ++pcmd); @@ -755,7 +754,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, fprintf_flush(fout, "\nRig command: "); } - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } last_was_ret = 1; @@ -773,11 +772,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%c", &cmd) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#6?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } } - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } my_rig->state.vfo_opt = *vfo_opt; @@ -790,14 +789,14 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (interactive && !prompt) { fprintf(fout, "%s0\n", NETRIGCTL_RET); } fflush(fout); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } if (cmd == '?') { usage_rig(fout); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } } else @@ -807,11 +806,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (EOF == retcode) { - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } else if ('\0' == command[1]) { @@ -832,7 +831,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, fprintf(stderr, "Command '%c' not found!\n", cmd); } - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } if (!(cmd_entry->flags & ARG_NOVFO) && *vfo_opt) @@ -850,7 +849,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%s", arg1) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#7?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } vfo = rig_parse_vfo(arg1); @@ -866,7 +865,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } vfo = rig_parse_vfo(arg1); @@ -889,7 +888,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (fgets(arg1, MAXARGSZ, fin) == NULL) { - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } if (arg1[0] == 0xa) @@ -903,7 +902,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (fgets(arg1, MAXARGSZ, fin) == NULL) { - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } } @@ -931,11 +930,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p1 = arg1; @@ -959,7 +958,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%s", arg1) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#8?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p1 = arg1; @@ -976,7 +975,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p1 = arg1; @@ -1005,7 +1004,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%s", arg2) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#9?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p2 = arg2; @@ -1019,11 +1018,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p2 = arg2; @@ -1052,7 +1051,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (scanfc(fin, "%s", arg3) < 1) { rig_debug(RIG_DEBUG_WARN, "%s: nothing to scan#10?\n", __func__); - RETURNFUNC(-1); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p3 = arg3; @@ -1067,11 +1066,11 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } else if (retcode < 0) { - RETURNFUNC(retcode); + RETURNFUNC(RIGCTL_PARSE_ERROR); } p3 = arg3; @@ -1098,13 +1097,13 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (!input_line) { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } /* Q or q to quit */ if (!(strncasecmp(input_line, "q", 1))) { - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } /* '?' for help */ @@ -1112,13 +1111,13 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { usage_rig(fout); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* '#' for comment */ if (!(strncmp(input_line, "#", 1))) { - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* Blank line entered */ @@ -1126,7 +1125,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } rig_debug(RIG_DEBUG_TRACE, "%s: input_line: %s\n", __func__, input_line); @@ -1149,7 +1148,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { /* Oops! Invoke GDB!! */ fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } /* At this point parsed_input contains the typed text of the command @@ -1208,7 +1207,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(stderr, "Valid multiple character command names contain alphanumeric characters plus '_'\n"); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } } @@ -1217,13 +1216,13 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, /* Single '\' entered, prompt again */ else if ((*parsed_input[0] == '\\') && (strlen(parsed_input[0]) == 1)) { - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* Multiple characters but no leading '\' */ else { fprintf(stderr, "Precede multiple character command names with '\\'\n"); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } cmd_entry = find_cmd_entry(cmd); @@ -1239,7 +1238,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, fprintf(stderr, "Command '%c' not found!\n", cmd); } - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* If vfo_opt is enabled (-o|--vfo) check if already given @@ -1264,7 +1263,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (!input_line) { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } /* Blank line entered */ @@ -1272,7 +1271,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } /* Get the first token of input, the rest, if any, will be @@ -1287,7 +1286,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, else { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } } @@ -1366,7 +1365,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } if (input_line) @@ -1376,7 +1375,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, else { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } } @@ -1428,7 +1427,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } result = strtok(input_line, " "); @@ -1440,7 +1439,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, else { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } } @@ -1494,7 +1493,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } result = strtok(input_line, " "); @@ -1506,7 +1505,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, else { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } } @@ -1560,7 +1559,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, { fprintf(fout, "? for help, q to quit.\n"); fflush(fout); - RETURNFUNC(0); + RETURNFUNC(RIG_OK); } result = strtok(input_line, " "); @@ -1572,7 +1571,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, else { fprintf_flush(fout, "\n"); - RETURNFUNC(1); + RETURNFUNC(RIGCTL_PARSE_END); } } @@ -1669,7 +1668,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, rig_debug(RIG_DEBUG_TRACE, "%s: vfo_opt=%d\n", __func__, *vfo_opt); - if (retcode == RIG_EIO) + if (retcode == -RIG_EIO) { rig_debug(RIG_DEBUG_ERR, "%s: RIG_EIO?\n", __func__); @@ -1727,12 +1726,7 @@ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc, if (sync_cb) { sync_cb(0); } /* unlock if necessary */ - if (retcode == -RIG_ENAVAIL) - { - RETURNFUNC(retcode); - } - - RETURNFUNC(retcode != RIG_OK ? 2 : 0); + RETURNFUNC(retcode); } diff --git a/tests/rigctl_parse.h b/tests/rigctl_parse.h index a741742f2..e1a86697a 100644 --- a/tests/rigctl_parse.h +++ b/tests/rigctl_parse.h @@ -28,6 +28,9 @@ #include #include +#define RIGCTL_PARSE_END 1 +#define RIGCTL_PARSE_ERROR 2 + /* * external prototype */ diff --git a/tests/rigctld.c b/tests/rigctld.c index c4edaf6d2..46ba02757 100644 --- a/tests/rigctld.c +++ b/tests/rigctld.c @@ -1075,21 +1075,9 @@ void *handle_socket(void *arg) if (retcode != 0) { rig_debug(RIG_DEBUG_ERR, "%s: rigctl_parse retcode=%d\n", __func__, retcode); } - -#if 0 // disabled -- don't think we need this - - // see https://github.com/Hamlib/Hamlib/issues/516 - if (retcode == -1) - { - //sleep(1); // probably don't need this delay - //continue; - } - -#endif - // if we get a hard error we try to reopen the rig again // this should cover short dropouts that can occur - if (retcode == -RIG_EIO || retcode == 2) + if (retcode < 0 && !RIG_IS_SOFT_ERRCODE(-retcode)) { int retry = 3; rig_debug(RIG_DEBUG_ERR, "%s: i/o error\n", __func__) @@ -1103,39 +1091,9 @@ void *handle_socket(void *arg) rig_debug(RIG_DEBUG_ERR, "%s: rig_open retcode=%d\n", __func__, retcode); } while (retry-- > 0 && retcode != RIG_OK); - } - - -#if 0 - - if (ferror(fsockin) || ferror(fsockout) || retcode == 2) - { - if (ferror(fsockout)) { fsockout = get_fsockout(handle_data_arg); } - - rig_debug(RIG_DEBUG_ERR, "%s: socket error in=%d, out=%d\n", __func__, - ferror(fsockin), ferror(fsockout)); - // if we get an error from the rig we'll try to repoen - // that may fix things when COM ports drop and such - int retry = 4; - - if (retcode == 2) - { - do - { - retcode = rig_close(my_rig); - hl_usleep(1000 * 1000); - rig_debug(RIG_DEBUG_ERR, "%s: rig_close retcode=%d\n", __func__, retcode); - retcode = rig_open(my_rig); - rig_debug(RIG_DEBUG_ERR, "%s: rig_open retcode=%d\n", __func__, retcode); - } - while (retry-- > 0 && retcode != RIG_OK); - } - } - -#endif } - while (retcode == 0 || retcode == 2 || retcode == -RIG_ENAVAIL); + while (retcode == RIG_OK || RIG_IS_SOFT_ERRCODE(-retcode)); #ifdef HAVE_PTHREAD #if 0