Add RFPOWER_METER_WATTS and SWR for Elecraft K4

This commit is contained in:
Mike Black W9MDB 2024-08-19 09:01:05 -05:00
parent 4170953aa0
commit 137231cb7b
3 changed files with 96 additions and 11 deletions

View File

@ -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)
{

View File

@ -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)

View File

@ -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);