kopia lustrzana https://github.com/Hamlib/Hamlib
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
rodzic
309e19b273
commit
8965b62cd6
|
@ -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; }
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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()
|
||||||
*/
|
*/
|
||||||
|
int i;
|
||||||
|
for(i=0, ret=-1;i<5 && ret < 0;++i)
|
||||||
|
{
|
||||||
ret = OPEN(p->pathname, O_RDWR | O_NOCTTY | O_NDELAY);
|
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)
|
||||||
|
|
Ładowanie…
Reference in New Issue