diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index d04b1f460..b80a640c3 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1158,13 +1158,16 @@ Sets rig clock -- note that some rigs do not handle seconds or milliseconds. If you try to set sec/msec and rig does not support it you will get a debug warning message. Format is ISO8601, .EX -Formats accepted -YYYY-MM-DDTHH:MM:SS.SSS+ZZ (where +ZZ is either -/+ UTC offset) +Formats accepted allow for 2-digit or 4-digit time zone +YYYY-MM-DDTHH:MM:SS.SSS+ZZ (where +ZZ is either -/+ UTC offset HH) +YYYY-MM-DDTHH:MM:SS.SSS+ZZZZ (where +ZZZZ is either -/+ UTC offset HHMM) YYYY-MM-DDTHH:MM:SS+ZZ +YYYY-MM-DDTHH:MM:SS+ZZZZ YYYY-MM-DDTHH:MM+ZZ +YYYY-MM-DDTHH:MM+ZZZZ YYYY-MM-DD (sets date only) Note: Icom rigs expect you to set local time and the hours off to UTC. -So...4PM EST example would be 2021-12-01T16:00:00+05 +So...4PM EST example would be 2021-12-01T16:00:00+0500 But...if you want to display GMT you must set the clock for GMT with zero UTC offset. Hopefully Icom will allow displaying either clock in the future diff --git a/rigs/yaesu/newcat.c b/rigs/yaesu/newcat.c index 1aee1fdc3..d10f76057 100644 --- a/rigs/yaesu/newcat.c +++ b/rigs/yaesu/newcat.c @@ -263,9 +263,9 @@ static const yaesu_newcat_commands_t valid_commands[] = {"CT", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, {"DA", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, {"DN", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, - {"DT", FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE }, {"DP", FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, {"DS", TRUE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE }, + {"DT", FALSE, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, TRUE, TRUE, TRUE, TRUE }, {"ED", TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE }, {"EK", FALSE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, FALSE, TRUE, FALSE }, {"EM", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE, TRUE }, @@ -11557,6 +11557,8 @@ int newcat_set_clock(RIG *rig, int year, int month, int day, int hour, int min, RETURNFUNC2(err); } + if (hour < 0) RETURNFUNC2(RIG_OK); + SNPRINTF(priv->cmd_str, sizeof(priv->cmd_str), "DT1%02d%02d%02d%c", hour, min, sec, cat_term); diff --git a/rigs/yaesu/newcat.h b/rigs/yaesu/newcat.h index 8b52fa793..765472103 100644 --- a/rigs/yaesu/newcat.h +++ b/rigs/yaesu/newcat.h @@ -50,7 +50,7 @@ typedef char ncboolean; /* shared function version */ -#define NEWCAT_VER "20221021" +#define NEWCAT_VER "20221025" /* Hopefully large enough for future use, 128 chars plus '\0' */ #define NEWCAT_DATA_LEN 129 diff --git a/simulators/simyaesu.c b/simulators/simyaesu.c index f332f459c..c5a313635 100644 --- a/simulators/simyaesu.c +++ b/simulators/simyaesu.c @@ -23,6 +23,8 @@ int roofing_filter_main = 1; int roofing_filter_sub = 6; int width_main = 0; int width_sub = 0; +int ex039 = 0; +int lk = 0; // ID 0310 == 310, Must drop leading zero typedef enum nc_rigid_e @@ -401,6 +403,40 @@ int main(int argc, char *argv[]) SNPRINTF(buf, sizeof(buf), "SH%c%02d;", buf[2], buf[2] == 0 ? width_main : width_sub); } + else if (strcmp(buf, "EX039;") == 0) + { + SNPRINTF(buf, sizeof(buf), "EX039%d;", ex039); + n = write(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "EX039", 3) == 0) + { + sscanf(buf, "EX039%d", &ex039); + } + else if (strcmp(buf, "LK;") == 0) + { + SNPRINTF(buf, sizeof(buf), "LK%d;", lk); + n = write(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "LK", 3) == 0) + { + sscanf(buf, "LK%d", &lk); + } + else if (strncmp(buf, "DT0;", 4) == 0) + { + SNPRINTF(buf, sizeof(buf), "DT020221022;"); + n = write(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "DT1;", 4) == 0) + { + SNPRINTF(buf, sizeof(buf), "DT1222100;"); + n = write(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "DT2;", 4) == 0) + { + SNPRINTF(buf, sizeof(buf), "DT2+0500;"); + n = write(fd, buf, strlen(buf)); + } + else if (strlen(buf) > 0) { diff --git a/tests/rigctl_parse.c b/tests/rigctl_parse.c index c52c5be6c..99fb07027 100644 --- a/tests/rigctl_parse.c +++ b/tests/rigctl_parse.c @@ -5172,9 +5172,9 @@ declare_proto_rig(get_cache) /* '0xf8' */ declare_proto_rig(set_clock) { - int year, mon, day, hour = -1, min = -1, sec = -1; - double msec; - int utc_offset = 0; + int year, mon, day, hour = -1, min = -1, sec = 0; + double msec=-1; + int utc_offset = 0; int n; char timebuf[64]; @@ -5196,22 +5196,35 @@ declare_proto_rig(set_clock) &hour, &min, &sec, &msec, &utc_offset); } - else - { + else if (arg1[16] == '+' || arg1[16] == '-') + { // YYYY-MM-DDTHH:MM+ZZ + n = sscanf(arg1, "%04d-%02d-%02dT%02d:%02d%d", &year, &mon, &day, &hour, + &min, &utc_offset); + } + else if (arg1[19] == '+' || arg1[19] == '-') + { // YYYY-MM-DDTHH:MM:SS+ZZ + n = sscanf(arg1, "%04d-%02d-%02dT%02d:%02d:%02d%d", &year, &mon, &day, &hour, + &min, &sec, &utc_offset); + } + else if (arg1[23] == '+' || arg1[23] == '-') + { // YYYY-MM-DDTHH:MM:SS.SSS+ZZ n = sscanf(arg1, "%04d-%02d-%02dT%02d:%02d:%02d%lf%d", &year, &mon, &day, &hour, &min, &sec, &msec, &utc_offset); } + else + { + rig_debug(RIG_DEBUG_ERR, "%s: '%s' not valid time format\n", __func__, arg1); + RETURNFUNC2(-RIG_EINVAL); + } rig_debug(RIG_DEBUG_VERBOSE, "%s: n=%d, %04d-%02d-%02dT%02d:%02d:%02d.%0.3f%s%02d\n", __func__, n, year, mon, day, hour, min, sec, msec, utc_offset >= 0 ? "+" : "-", (unsigned)abs(utc_offset)); - rig_debug(RIG_DEBUG_ERR, "%s: utc_offset=%d\n", __func__, utc_offset); - if (utc_offset < 24) { utc_offset *= 100; } // allow for minutes offset too - rig_debug(RIG_DEBUG_ERR, "%s: utc_offset=%d\n", __func__, utc_offset); + rig_debug(RIG_DEBUG_VERBOSE, "%s: utc_offset=%d\n", __func__, utc_offset); RETURNFUNC(rig_set_clock(rig, year, mon, day, hour, min, sec, msec, utc_offset));