Change get_kenwood_level to return both float 0-1.0 and raw value

Fix Elecraft K3/K3S/KX2/KX3 RF level get/set
Update other rigs for new get_kenwood_level call
https://github.com/Hamlib/Hamlib/issues/388

(cherry picked from commit 3c6ae62e59)
Hamlib-4.0
Michael Black W9MDB 2020-09-30 12:46:54 -05:00 zatwierdzone przez Nate Bargmann
rodzic 309e19b273
commit 8965b62cd6
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: F72625E2EDBED598
7 zmienionych plików z 60 dodań i 25 usunięć

Wyświetl plik

@ -2249,6 +2249,17 @@ int kenwood_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val)
case RIG_LEVEL_RF: case RIG_LEVEL_RF:
/* XXX check level range */ /* XXX check level range */
// KX2 and KX3 have range -190 to 250
if (val.f > 1.0) return -RIG_EINVAL;
if (RIG_IS_KX2 || RIG_IS_KX3) {
val.f = val.f * (250.0 - 190.0) + 190;
}
else if (RIG_IS_K3 || RIG_IS_K3S) {
val.f = val.f * (250.0 / 100.0);
}
else { // other kenwood rigs
val.f = val.f * 255.0;
}
snprintf(levelbuf, sizeof(levelbuf), "RG%03d", kenwood_val); snprintf(levelbuf, sizeof(levelbuf), "RG%03d", kenwood_val);
break; break;
@ -2369,7 +2380,7 @@ int kenwood_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 get_kenwood_level(RIG *rig, const char *cmd, float *f) int get_kenwood_level(RIG *rig, const char *cmd, value_t *val)
{ {
char lvlbuf[10]; char lvlbuf[10];
int retval; int retval;
@ -2378,7 +2389,7 @@ int get_kenwood_level(RIG *rig, const char *cmd, float *f)
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
if (!f) if (!val)
{ {
return -RIG_EINVAL; return -RIG_EINVAL;
} }
@ -2392,7 +2403,8 @@ int get_kenwood_level(RIG *rig, const char *cmd, float *f)
/* 000..255 */ /* 000..255 */
sscanf(lvlbuf + len, "%d", &lvl); sscanf(lvlbuf + len, "%d", &lvl);
*f = lvl / 255.0; val->i = lvl; // raw value
val->f = lvl / 255.0; // our default scaling of 0-255
return RIG_OK; return RIG_OK;
}; };
@ -2560,7 +2572,7 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
* which is val=1.0 on most rigs, but * which is val=1.0 on most rigs, but
* get_kenwood_level maps 0...255 onto 0.0 ... 1.0 * get_kenwood_level maps 0...255 onto 0.0 ... 1.0
*/ */
ret = get_kenwood_level(rig, "PC", &val->f); ret = get_kenwood_level(rig, "PC", val);
val->f = val->f * (255.0 / 100.0); val->f = val->f * (255.0 / 100.0);
return ret; return ret;
@ -2626,15 +2638,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case 1: case 1:
return get_kenwood_level(rig, "AG", &val->f); return get_kenwood_level(rig, "AG", val);
break; break;
case 2: case 2:
return get_kenwood_level(rig, "AG0", &val->f); return get_kenwood_level(rig, "AG0", val);
break; break;
case 3: case 3:
return get_kenwood_level(rig, vfo == RIG_VFO_MAIN ? "AG0" : "AG1", &val->f); return get_kenwood_level(rig, vfo == RIG_VFO_MAIN ? "AG0" : "AG1", val);
break; break;
default: default:
@ -2644,13 +2656,23 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
} }
case RIG_LEVEL_RF: case RIG_LEVEL_RF:
return get_kenwood_level(rig, "RG", &val->f); retval = get_kenwood_level(rig, "RG", val);
if (retval != RIG_OK) return retval;
// KX2 and KX3 have range 190 to 250
if (RIG_IS_KX2 || RIG_IS_KX3) {
val->f = (val->i - 190) / (250-190);
}
else if (RIG_IS_K3 || RIG_IS_K3S) {
val->f = val->i / 250.0;
}
// other kenwod rigs are the default 0-255
return retval;
case RIG_LEVEL_SQL: case RIG_LEVEL_SQL:
return get_kenwood_level(rig, "SQ", &val->f); return get_kenwood_level(rig, "SQ", val);
case RIG_LEVEL_MICGAIN: case RIG_LEVEL_MICGAIN:
ret = get_kenwood_level(rig, "MG", &val->f); ret = get_kenwood_level(rig, "MG", val);
if (ret != RIG_OK) if (ret != RIG_OK)
{ {
@ -2662,8 +2684,8 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
return RIG_OK; return RIG_OK;
case RIG_LEVEL_AGC: case RIG_LEVEL_AGC:
ret = get_kenwood_level(rig, "GT", &val->f); ret = get_kenwood_level(rig, "GT", val);
agclevel = 255 * val->f; agclevel = val->i;
if (agclevel == 0) { val->i = 0; } if (agclevel == 0) { val->i = 0; }
else if (agclevel < 85) { val->i = 1; } else if (agclevel < 85) { val->i = 1; }

Wyświetl plik

@ -27,7 +27,7 @@
#include <string.h> #include <string.h>
#include "token.h" #include "token.h"
#define BACKEND_VER "20200917" #define BACKEND_VER "20200930"
#define EOM_KEN ';' #define EOM_KEN ';'
#define EOM_TH '\r' #define EOM_TH '\r'
@ -80,6 +80,9 @@ extern const struct confparams kenwood_cfg_params[];
#define RIG_IS_HPSDR (rig->caps->rig_model == RIG_MODEL_HPSDR) #define RIG_IS_HPSDR (rig->caps->rig_model == RIG_MODEL_HPSDR)
#define RIG_IS_K2 (rig->caps->rig_model == RIG_MODEL_K2) #define RIG_IS_K2 (rig->caps->rig_model == RIG_MODEL_K2)
#define RIG_IS_K3 (rig->caps->rig_model == RIG_MODEL_K3) #define RIG_IS_K3 (rig->caps->rig_model == RIG_MODEL_K3)
#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_THD7A (rig->caps->rig_model == RIG_MODEL_THD7A) #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_THD74 (rig->caps->rig_model == RIG_MODEL_THD74)
#define RIG_IS_TS2000 (rig->caps->rig_model == RIG_MODEL_TS2000) #define RIG_IS_TS2000 (rig->caps->rig_model == RIG_MODEL_TS2000)
@ -204,7 +207,7 @@ int kenwood_set_trn(RIG *rig, int trn);
int kenwood_get_trn(RIG *rig, int *trn); int kenwood_get_trn(RIG *rig, int *trn);
/* only use if returned string has length 6, e.g. 'SQ011;' */ /* only use if returned string has length 6, e.g. 'SQ011;' */
int get_kenwood_level(RIG *rig, const char *cmd, float *f); int get_kenwood_level(RIG *rig, const char *cmd, value_t *val);
int get_kenwood_func(RIG *rig, const char *cmd, int *status); int get_kenwood_func(RIG *rig, const char *cmd, int *status);
extern const struct rig_caps ts950s_caps; extern const struct rig_caps ts950s_caps;

Wyświetl plik

@ -1066,7 +1066,7 @@ int ts2000_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
case RIG_LEVEL_AGC: /* FIX ME: ts2000 returns 0 -20 for AGC */ case RIG_LEVEL_AGC: /* FIX ME: ts2000 returns 0 -20 for AGC */
ret = get_kenwood_level(rig, "GT", &val->f); ret = get_kenwood_level(rig, "GT", val);
agclevel = 255.0 * val->f; agclevel = 255.0 * val->f;
if (agclevel == 0) { val->i = 0; } if (agclevel == 0) { val->i = 0; }

Wyświetl plik

@ -481,19 +481,19 @@ static int ts870s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
case RIG_LEVEL_AF: case RIG_LEVEL_AF:
return get_kenwood_level(rig, "AG", &val->f); return get_kenwood_level(rig, "AG", val);
case RIG_LEVEL_RF: case RIG_LEVEL_RF:
return get_kenwood_level(rig, "RG", &val->f); return get_kenwood_level(rig, "RG", val);
case RIG_LEVEL_SQL: case RIG_LEVEL_SQL:
return get_kenwood_level(rig, "SQ", &val->f); return get_kenwood_level(rig, "SQ", val);
case RIG_LEVEL_MICGAIN: case RIG_LEVEL_MICGAIN:
return get_kenwood_level(rig, "MG", &val->f); return get_kenwood_level(rig, "MG", val);
case RIG_LEVEL_AGC: case RIG_LEVEL_AGC:
ret = get_kenwood_level(rig, "GT", &val->f); ret = get_kenwood_level(rig, "GT", val);
agclevel = 255 * val->f; agclevel = 255 * val->f;
if (agclevel == 0) { val->i = 0; } if (agclevel == 0) { val->i = 0; }

Wyświetl plik

@ -561,7 +561,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case RIG_LEVEL_MICGAIN: case RIG_LEVEL_MICGAIN:
retval = get_kenwood_level(rig, "MG", &val->f); retval = get_kenwood_level(rig, "MG", val);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -670,7 +670,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case RIG_LEVEL_VOXGAIN: case RIG_LEVEL_VOXGAIN:
retval = get_kenwood_level(rig, "VG00", &val->f); retval = get_kenwood_level(rig, "VG00", val);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {
@ -680,7 +680,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case RIG_LEVEL_ANTIVOX: case RIG_LEVEL_ANTIVOX:
retval = get_kenwood_level(rig, "VG00", &val->f); retval = get_kenwood_level(rig, "VG00", val);
if (retval != RIG_OK) if (retval != RIG_OK)
{ {

Wyświetl plik

@ -665,7 +665,7 @@ int HAMLIB_API read_string(hamlib_port_t *p,
struct timeval tv, tv_timeout, start_time, end_time, elapsed_time; struct timeval tv, tv_timeout, start_time, end_time, elapsed_time;
int total_count = 0; int total_count = 0;
rig_debug(RIG_DEBUG_TRACE, "%s called\n", __func__); rig_debug(RIG_DEBUG_TRACE, "%s called, rx_max=%ld\n", __func__, rxmax);
if (!p || !rxbuffer) if (!p || !rxbuffer)
{ {
@ -766,6 +766,7 @@ int HAMLIB_API read_string(hamlib_port_t *p,
} }
++total_count; ++total_count;
rig_debug(RIG_DEBUG_TRACE, "%s: total_count=%d rxmax-1=%ld\n", __func__, total_count, rxmax-1);
if (stopset && memchr(stopset, rxbuffer[total_count - 1], stopset_len)) if (stopset && memchr(stopset, rxbuffer[total_count - 1], stopset_len))
{ {

Wyświetl plik

@ -677,7 +677,16 @@ int ser_open(hamlib_port_t *p)
/* /*
* pathname is not uh_rig or uh_ptt: simply open() * pathname is not uh_rig or uh_ptt: simply open()
*/ */
ret = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY); int i;
for(i=0, ret=-1;i<5 && ret < 0;++i)
{
ret = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY);
if (ret < 0) {
rig_debug(RIG_DEBUG_ERR, "%s: OPEN attempt#%d failed %d=%s\n", __func__, i+1, ret, strerror(errno));
hl_usleep(100*1000); // 100ms between attempts
}
}
} }
} }
if (ret == -1) if (ret == -1)