From d81726e72452aa6d8150ad6f0468d86070440e51 Mon Sep 17 00:00:00 2001 From: George Baltz N3GB Date: Sun, 15 Sep 2024 15:47:43 -0400 Subject: [PATCH] Implement kenwood_set_clock Add warning to man page about NTP use and aux clock display. --- doc/man1/rigctl.1 | 7 ++++++- rigs/kenwood/kenwood.c | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/doc/man1/rigctl.1 b/doc/man1/rigctl.1 index 02a55aee2..48baede60 100644 --- a/doc/man1/rigctl.1 +++ b/doc/man1/rigctl.1 @@ -1320,10 +1320,15 @@ YYYY-MM-DD (sets date only) local (sets both clocks to local time) utc (sets both clocks to utc time) 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+0500 +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 +Note: Kenwood rigs only allow setting local clock, and then only if not autoset by NTP. +Trying to set clock when NTP is in use will set the offset, but not the time - + and no error status will be returned. +Time displayed on the auxiliary clock is solely determined by UTC and the aux offset. + .EE . .TP diff --git a/rigs/kenwood/kenwood.c b/rigs/kenwood/kenwood.c index 668c94d36..b48fe37d3 100644 --- a/rigs/kenwood/kenwood.c +++ b/rigs/kenwood/kenwood.c @@ -6011,7 +6011,46 @@ int kenwood_set_ext_parm(RIG *rig, hamlib_token_t token, value_t val) */ int kenwood_set_clock(RIG *rig, int year, int month, int day, int hour, int min, int sec, double msec, int utc_offset) { - return -RIG_ENIMPL; + char cmd[20]; + int retval, kenwood_val; + + /* Do the offset first. Then if the clock is synced to NTP, + * the set failure still should allow correct display + * + * utc_offset = hours * 100 + minutes + * Kenwood value = 15 minute intervals normalized to 56 ( = UTC+00) + */ + // Convert utc_offset to minutes + kenwood_val = ((utc_offset / 100) * 60) + (utc_offset % 100); + // Now convert to 15 minute intervals, centered on 56 + kenwood_val = kenwood_val / 15 + 56; + SNPRINTF(cmd, sizeof(cmd), "CK2%03d", kenwood_val); + retval = kenwood_transaction(rig, cmd, NULL, 0); + if (retval != RIG_OK) {return retval;} + + // Offset is set, now check if clock is settable + retval = kenwood_transaction(rig, "CK6", cmd, sizeof(cmd)); + if (retval != RIG_OK) {return retval;} + if (cmd[3] == '1') + { + // OK, autoset by NTP is on so we can't set it + // What should we tell the user? + // Until I hear otherwise, pretend everything worked, and + // the local clock should display the correct time in whatever + // zone the app thought it was trying to set. + return RIG_OK; + } + + // Local clock should be settable; build the command + SNPRINTF(cmd, sizeof(cmd), "CK0%02d%02d%02d%02d%02d%02d", year % 100, month, day, + hour, min, sec); + if (RIG_IS_TS990S) + { // TS-990S does not have seconds + cmd[13] = '\0'; + } + retval = kenwood_transaction(rig, cmd, NULL, 0); + + return retval; } /*