From 137231cb7b1bdc9dfe075f4cf4c311a9ebfcc306 Mon Sep 17 00:00:00 2001 From: Mike Black W9MDB Date: Mon, 19 Aug 2024 09:01:05 -0500 Subject: [PATCH] Add RFPOWER_METER_WATTS and SWR for Elecraft K4 --- rigs/kenwood/k3.c | 86 ++++++++++++++++++++++++++++++++++---- rigs/kenwood/kenwood.h | 3 +- simulators/simelecraftk4.c | 18 +++++++- 3 files changed, 96 insertions(+), 11 deletions(-) diff --git a/rigs/kenwood/k3.c b/rigs/kenwood/k3.c index 587bd4cc9..22e85be3a 100644 --- a/rigs/kenwood/k3.c +++ b/rigs/kenwood/k3.c @@ -171,6 +171,29 @@ int k3_set_nb_level(RIG *rig, float dsp_nb, float if_nb); int k3_get_nb_level(RIG *rig, float *dsp_nb, float *if_nb); int k3_get_bar_graph_level(RIG *rig, float *smeter, float *pwr, float *alc, int *mode_tx); +int k4_get_bar_graph_level(RIG *rig, float *swr, float *pwr, float *alc, + int *mode_tx); +int kx3_get_bar_graph_level(RIG *rig, float *level); +int k3_send_voice_mem(RIG *rig, vfo_t vfo, int ch); +int k3_stop_voice_mem(RIG *rig, vfo_t vfo); +int k3_stop_morse(RIG *rig, vfo_t vfo); + +/* K4 functions */ +int k4_get_ptt(RIG *rig, vfo_t vfo, ptt_t *ptt); +int k4_set_ptt(RIG *rig, vfo_t vfo, ptt_t ptt); +int k4_send_voice_mem(RIG *rig, vfo_t vfo, int ch); +int k4_stop_voice_mem(RIG *rig, vfo_t vfo); +int k4_stop_morse(RIG *rig, vfo_t vfo); + +/* + * K3 rig capabilities. + * This kit can recognize a large subset of TS-570/K2 commands and has many + * extensions of its own. Extension backend functions to standard Kenwood + * command are defined in elecraft.c (shared with K2) and in this file. + * + * Part of info comes from http://www.elecraft.com/K2_Manual_Download_Page.htm#K3 + * look for K3 Programmer's Reference PDF + */ int kx3_get_bar_graph_level(RIG *rig, float *level); int k3_send_voice_mem(RIG *rig, vfo_t vfo, int ch); int k3_stop_voice_mem(RIG *rig, vfo_t vfo); @@ -519,7 +542,7 @@ struct rig_caps k4_caps = RIG_MODEL(RIG_MODEL_K4), .model_name = "K4", .mfg_name = "Elecraft", - .version = BACKEND_VER ".31", + .version = BACKEND_VER ".32", .copyright = "LGPL", .status = RIG_STATUS_STABLE, .rig_type = RIG_TYPE_TRANSCEIVER, @@ -2086,7 +2109,15 @@ int k3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int tx_mode; float alc; - retval = k3_get_bar_graph_level(rig, NULL, NULL, &alc, &tx_mode); + if (RIG_IS_K4) + { + retval = k4_get_bar_graph_level(rig, NULL, NULL, &alc, &tx_mode); + tx_mode = 1; // Assume ALC is zero when in Tx so we don't care about ptt status + } + else + { + retval = k3_get_bar_graph_level(rig, NULL, NULL, &alc, &tx_mode); + } if (retval != RIG_OK) { @@ -2114,7 +2145,15 @@ int k3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) int tx_mode; float pwr; - retval = k3_get_bar_graph_level(rig, NULL, &pwr, NULL, &tx_mode); + if (RIG_IS_K4) + { + retval = k4_get_bar_graph_level(rig, NULL, &pwr, NULL, &tx_mode); + tx_mode = 1; // Does K4 return pwr=0 when in Rx? Hope so. + } + else + { + retval = k3_get_bar_graph_level(rig, NULL, &pwr, NULL, &tx_mode); + } if (retval != RIG_OK) { @@ -2319,14 +2358,22 @@ int k3_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) break; case RIG_LEVEL_SWR: - retval = kenwood_safe_transaction(rig, "SW", levelbuf, sizeof(levelbuf), 5); - - if (retval != RIG_OK) + if (RIG_IS_K4) { - return retval; + retval = k4_get_bar_graph_level(rig, &val->f, NULL, NULL, NULL); + return RIG_OK; } + else + { + retval = kenwood_safe_transaction(rig, "SW", levelbuf, sizeof(levelbuf), 5); - sscanf(levelbuf + 2, "%d", &val->i); + if (retval != RIG_OK) + { + return retval; + } + + sscanf(levelbuf + 2, "%d", &val->i); + } val->f = (float) val->i / 10.0f; break; @@ -2694,6 +2741,29 @@ int k3_get_nb_level(RIG *rig, float *dsp_nb, float *if_nb) return RIG_OK; } +int k4_get_bar_graph_level(RIG *rig, float *swr, float *pwr, float *alc, + int *mode_tx) +{ + int retval; + int ialc,icmp,ifwd,iswr; + char levelbuf[16]; + + rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); + + retval = kenwood_safe_transaction(rig, "TM", levelbuf, sizeof(levelbuf), 14); + + if (retval != RIG_OK) + { + return retval; + } + + sscanf(levelbuf, "TM%03d%03d%03d%03d", &ialc, &icmp, &ifwd, &iswr); + if (swr) *swr = iswr/10.0; + if (pwr) *pwr = ifwd/100.0; // pwr is returned in 0-1 sscale + if (alc) *alc = ialc; + return RIG_OK; +} + int k3_get_bar_graph_level(RIG *rig, float *smeter, float *pwr, float *alc, int *mode_tx) { diff --git a/rigs/kenwood/kenwood.h b/rigs/kenwood/kenwood.h index 77f5129d2..54082c091 100644 --- a/rigs/kenwood/kenwood.h +++ b/rigs/kenwood/kenwood.h @@ -28,7 +28,7 @@ #include "token.h" #include "idx_builtin.h" -#define BACKEND_VER "20240818" +#define BACKEND_VER "20240819" #define EOM_KEN ';' #define EOM_TH '\r' @@ -89,6 +89,7 @@ extern struct confparams kenwood_cfg_params[]; #define RIG_IS_K3S (rig->caps->rig_model == RIG_MODEL_K3S) #define RIG_IS_KX2 (rig->caps->rig_model == RIG_MODEL_KX2) #define RIG_IS_KX3 (rig->caps->rig_model == RIG_MODEL_KX3) +#define RIG_IS_K4 (rig->caps->rig_model == RIG_MODEL_K4) #define RIG_IS_THD7A (rig->caps->rig_model == RIG_MODEL_THD7A) #define RIG_IS_THD74 (rig->caps->rig_model == RIG_MODEL_THD74) #define RIG_IS_TMD700 (rig->caps->rig_model == RIG_MODEL_TMD700) diff --git a/simulators/simelecraftk4.c b/simulators/simelecraftk4.c index 1aa4cad2f..11e40bbd1 100644 --- a/simulators/simelecraftk4.c +++ b/simulators/simelecraftk4.c @@ -37,6 +37,7 @@ int ai = 0; int dt = 0; int modeA = 2; int modeB = 2; +int ptt = 0; // int freqa = 14074000, freqb = 14073500; // ID 0310 == 310, Must drop leading zero @@ -312,7 +313,7 @@ int main(int argc, char *argv[]) { WRITE(fd, "K30;", 4); } - else if (strcmp(buf, "RVM;") == 0) + else if (strncmp(buf, "RV", 2) == 0) { WRITE(fd, "RV02.37;", 8); } @@ -375,7 +376,7 @@ int main(int argc, char *argv[]) } else if (strncmp(buf, "TQ;", 3) == 0) { - SNPRINTF(buf, sizeof(buf), "TQ0;"); + SNPRINTF(buf, sizeof(buf), "TQ%d;", ptt); WRITE(fd, buf, strlen(buf)); } else if (strncmp(buf, "PC;", 3) == 0) @@ -430,6 +431,19 @@ int main(int argc, char *argv[]) { printf("Morse: %s\n", buf); } + else if (strncmp(buf, "TM", 2) == 0) + { + SNPRINTF(buf, sizeof(buf), "TM001002003004;"); + WRITE(fd, buf, strlen(buf)); + } + else if (strncmp(buf, "TX", 2) == 0) + { + ptt = 1; + } + else if (strncmp(buf, "RX", 2) == 0) + { + ptt = 0; + } else if (strlen(buf) > 0) { fprintf(stderr, "Unknown command: %s\n", buf);