Merge pull request #1610 from GeoBaltz/fix17

Implement kenwood_get_clock + fixes for TZ offsets
This commit is contained in:
Michael Black 2024-09-10 23:26:01 -05:00 committed by GitHub
commit f4bb956bf9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 153 additions and 8 deletions

View File

@ -6006,6 +6006,65 @@ int kenwood_set_ext_parm(RIG *rig, hamlib_token_t token, value_t val)
RETURNFUNC(-RIG_EINVAL); RETURNFUNC(-RIG_EINVAL);
} }
/*
* kenwood_set_clock
*/
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;
}
/*
* kenwood_get_clock
*/
int kenwood_get_clock(RIG *rig, int *year, int *month, int *day, int *hour, int *min, int *sec, double *msec, int *utc_offset)
{
int retval;
int fields, zone;
char ans[20];
// Make sure the clock has been set at least once
retval = kenwood_transaction(rig, "CK1", ans, sizeof(ans));
if (retval != RIG_OK) {return retval;}
if (ans[3] != '1')
{
return -RIG_ENAVAIL;
}
// Get the local clock
retval = kenwood_transaction(rig, "CK0", ans, sizeof(ans));
if (retval != RIG_OK) {return retval;}
fields = sscanf(ans, "CK0%2d%2d%2d%2d%2d%2d", year, month, day, hour, min, sec);
// TS-890S doesn't define what P6 is, but it sure looks like seconds to me.
// TS-990S doesn't have a P6, so set it to 0
if (fields < 6)
{
*sec = 0;
}
// Add the century
if (*year <= 20) //TODO: Update this every decade or so
{
*year += 100;
}
*year += 2000; //TODO: Update this every century or so
// Now figure out the time zone
retval = kenwood_transaction(rig, "CK2", ans, sizeof(ans));
if (retval != RIG_OK) {return retval;}
zone = atoi(&ans[3]); // UTC offset in 15 minute intervals, centered on 56
zone = (zone / 4) * 100 + (zone % 4) * 15; // Pack as hours * 100 + minutes
*utc_offset = zone - 1400;
// No msec available
*msec = 0;
return RIG_OK;
}
int kenwood_get_ext_parm(RIG *rig, hamlib_token_t token, value_t *val) int kenwood_get_ext_parm(RIG *rig, hamlib_token_t token, value_t *val)
{ {
int err; int err;

View File

@ -264,6 +264,8 @@ int kenwood_get_id(RIG *rig, char *buf);
int kenwood_get_if(RIG *rig); int kenwood_get_if(RIG *rig);
int kenwood_send_voice_mem(RIG *rig, vfo_t vfo, int bank); int kenwood_send_voice_mem(RIG *rig, vfo_t vfo, int bank);
int kenwood_stop_voice_mem(RIG *rig, vfo_t vfo); int kenwood_stop_voice_mem(RIG *rig, vfo_t vfo);
int kenwood_get_clock(RIG *rig, int *year, int *month, int *day, int *hour, int *min, int *sec, double *msec, int *utc_offset);
int kenwood_set_clock(RIG *rig, int year, int month, int day, int hour, int min, int sec, double msec, int utc_offset);
int kenwood_set_trn(RIG *rig, int trn); int kenwood_set_trn(RIG *rig, int trn);
int kenwood_get_trn(RIG *rig, int *trn); int kenwood_get_trn(RIG *rig, int *trn);

View File

@ -41,7 +41,7 @@
#define TS890_VFO_OPS (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_BAND_UP|RIG_OP_BAND_DOWN|RIG_OP_CPY|RIG_OP_TUNE) #define TS890_VFO_OPS (RIG_OP_UP|RIG_OP_DOWN|RIG_OP_BAND_UP|RIG_OP_BAND_DOWN|RIG_OP_CPY|RIG_OP_TUNE)
int kenwood_ts890_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) static int kenwood_ts890_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
{ {
char levelbuf[16], *command_string; char levelbuf[16], *command_string;
int kenwood_val, retval; int kenwood_val, retval;
@ -109,7 +109,7 @@ int kenwood_ts890_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
return kenwood_transaction(rig, levelbuf, NULL, 0); return kenwood_transaction(rig, levelbuf, NULL, 0);
} }
int kenwood_ts890_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) static int kenwood_ts890_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
{ {
char ackbuf[50]; char ackbuf[50];
size_t ack_len, ack_len_expected, len; size_t ack_len, ack_len_expected, len;
@ -403,7 +403,7 @@ int kenwood_ts890_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
return -RIG_EINTERNAL; return -RIG_EINTERNAL;
} }
int ts890_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) static int ts890_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
{ {
int mask, retval; int mask, retval;
char current[4]; char current[4];
@ -434,7 +434,7 @@ int ts890_set_func(RIG *rig, vfo_t vfo, setting_t func, int status)
return kenwood_transaction(rig, current, NULL, 0); return kenwood_transaction(rig, current, NULL, 0);
} }
int ts890_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) static int ts890_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
{ {
int mask, retval; int mask, retval;
char current[4]; char current[4];
@ -671,5 +671,7 @@ struct rig_caps ts890s_caps =
.has_set_func = TS890_FUNC_ALL, .has_set_func = TS890_FUNC_ALL,
.set_func = ts890_set_func, .set_func = ts890_set_func,
.get_func = ts890_get_func, .get_func = ts890_get_func,
.get_clock = kenwood_get_clock,
.set_clock = kenwood_set_clock,
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
}; };

View File

@ -379,6 +379,8 @@ struct rig_caps ts990s_caps =
.set_powerstat = kenwood_set_powerstat, .set_powerstat = kenwood_set_powerstat,
.get_powerstat = kenwood_get_powerstat, .get_powerstat = kenwood_get_powerstat,
.reset = kenwood_reset, .reset = kenwood_reset,
.get_clock = kenwood_get_clock,
.set_clock = kenwood_set_clock,
.hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS .hamlib_check_rig_caps = HAMLIB_CHECK_RIG_CAPS
}; };
@ -387,7 +389,7 @@ struct rig_caps ts990s_caps =
*/ */
/* /*
* ts2000_get_level * ts990s_get_level
* Assumes rig!=NULL, val!=NULL * Assumes rig!=NULL, val!=NULL
*/ */

View File

@ -46,7 +46,8 @@ int ra=0;
int rl=0; int rl=0;
int is=0; int is=0;
int sp=0; int sp=0;
int tzs[2] = {40, 56}; // 0=primary(EDT), 1=auxiiary(UTC)
char auxtzc = 'U'; // Auxiliary clock identifier (UTC)
#if defined(WIN32) || defined(_WIN32) #if defined(WIN32) || defined(_WIN32)
int openPort(char *comport) // doesn't matter for using pts devices int openPort(char *comport) // doesn't matter for using pts devices
@ -629,6 +630,85 @@ int main(int argc, char *argv[])
{ {
sscanf(buf,"SP%d", &sp); sscanf(buf,"SP%d", &sp);
} }
else if (strncmp(buf, "CK", 2) == 0)
{ // All the clock functions
switch (buf[2]) {
case '0': // Get/Set Local clock
{
time_t t;
struct tm *localtm;
if (buf[3] == ';')
{
t = time(NULL);
localtm = localtime(&t);
strftime(&buf[3], BUFSIZ - 3, "%y%m%d%H%M%S;", localtm);
write(fd, buf, strlen(buf));
}
else
{
printf("Sorry, can't set time (yet)\n");
}
break;
}
case '1': // Setting status
buf[3] = '1';
buf[4] = ';';
buf[5] = 0;
write(fd, buf, 6);
break;
case '2': // Local clock time zone
case '3': // Secondary clock time zone
{
int idx = buf[2] - '2';
if (buf[3] == ';')
{
sprintf(&buf[3], "%3d;", tzs[idx]);
write(fd, buf, strlen(buf));
}
else
{
sscanf(&buf[3], "%3d;", &tzs[idx]);
}
break;
}
case '4': // ID character for secondary clock
if (buf[3] == ';')
{
buf[3] = auxtzc;
buf[4] = ';';
buf[5] = '\0';
write(fd, buf, 6);
}
else
{
auxtzc = buf[3];
}
break;
case '5': // Date format
break;
case '6': // Automatic date/time retrieval (NTP)
//For the time being, assume this is always on.
//TODO: Fix this when we can set the clock
if (buf[3] == ';')
{
buf[3] = 1;
buf[4] = ';';
buf[5] = 0;
write(fd, buf, strlen(buf));
}
else
{
printf("Can't run without NTP, sorry\n");
}
break;
case '7': // NTP server address
case '8': // Force time update via NTP
case '9': // Clock display (primary/secondary/both)
default:
printf("Bad clock command - %s\n", buf);
}
}
else if (strlen(buf) > 0) else if (strlen(buf) > 0)
{ {
fprintf(stderr, "Unknown command: %s\n", buf); fprintf(stderr, "Unknown command: %s\n", buf);

View File

@ -2834,7 +2834,7 @@ char *date_strget(char *buf, int buflen, int localtime)
if (localtime) if (localtime)
{ {
mytm = localtime_r(&t, &result); mytm = localtime_r(&t, &result);
mytimezone = timezone; mytimezone = - (int)result.tm_gmtoff;
} }
else else
{ {

View File

@ -5657,7 +5657,7 @@ declare_proto_rig(set_clock)
__func__, n, year, mon, day, hour, min, sec, msec, utc_offset >= 0 ? "+" : "-", __func__, n, year, mon, day, hour, min, sec, msec, utc_offset >= 0 ? "+" : "-",
(unsigned)abs(utc_offset)); (unsigned)abs(utc_offset));
if (utc_offset < 24) { utc_offset *= 100; } // allow for minutes offset too if (abs(utc_offset) < 24) { utc_offset *= 100; } // allow for minutes offset too
rig_debug(RIG_DEBUG_VERBOSE, "%s: utc_offset=%d\n", __func__, utc_offset); rig_debug(RIG_DEBUG_VERBOSE, "%s: utc_offset=%d\n", __func__, utc_offset);