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:
|
||||
/* 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);
|
||||
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);
|
||||
}
|
||||
|
||||
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];
|
||||
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__);
|
||||
|
||||
if (!f)
|
||||
if (!val)
|
||||
{
|
||||
return -RIG_EINVAL;
|
||||
}
|
||||
|
@ -2392,7 +2403,8 @@ int get_kenwood_level(RIG *rig, const char *cmd, float *f)
|
|||
|
||||
/* 000..255 */
|
||||
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;
|
||||
};
|
||||
|
||||
|
@ -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
|
||||
* 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);
|
||||
return ret;
|
||||
|
||||
|
@ -2626,15 +2638,15 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
break;
|
||||
|
||||
case 1:
|
||||
return get_kenwood_level(rig, "AG", &val->f);
|
||||
return get_kenwood_level(rig, "AG", val);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
return get_kenwood_level(rig, "AG0", &val->f);
|
||||
return get_kenwood_level(rig, "AG0", val);
|
||||
break;
|
||||
|
||||
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;
|
||||
|
||||
default:
|
||||
|
@ -2644,13 +2656,23 @@ int kenwood_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
}
|
||||
|
||||
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:
|
||||
return get_kenwood_level(rig, "SQ", &val->f);
|
||||
return get_kenwood_level(rig, "SQ", val);
|
||||
|
||||
case RIG_LEVEL_MICGAIN:
|
||||
ret = get_kenwood_level(rig, "MG", &val->f);
|
||||
ret = get_kenwood_level(rig, "MG", val);
|
||||
|
||||
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;
|
||||
|
||||
case RIG_LEVEL_AGC:
|
||||
ret = get_kenwood_level(rig, "GT", &val->f);
|
||||
agclevel = 255 * val->f;
|
||||
ret = get_kenwood_level(rig, "GT", val);
|
||||
agclevel = val->i;
|
||||
|
||||
if (agclevel == 0) { val->i = 0; }
|
||||
else if (agclevel < 85) { val->i = 1; }
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
#include <string.h>
|
||||
#include "token.h"
|
||||
|
||||
#define BACKEND_VER "20200917"
|
||||
#define BACKEND_VER "20200930"
|
||||
|
||||
#define EOM_KEN ';'
|
||||
#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_K2 (rig->caps->rig_model == RIG_MODEL_K2)
|
||||
#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_THD74 (rig->caps->rig_model == RIG_MODEL_THD74)
|
||||
#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);
|
||||
|
||||
/* 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);
|
||||
|
||||
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 */
|
||||
ret = get_kenwood_level(rig, "GT", &val->f);
|
||||
ret = get_kenwood_level(rig, "GT", val);
|
||||
agclevel = 255.0 * val->f;
|
||||
|
||||
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:
|
||||
return get_kenwood_level(rig, "AG", &val->f);
|
||||
return get_kenwood_level(rig, "AG", val);
|
||||
|
||||
case RIG_LEVEL_RF:
|
||||
return get_kenwood_level(rig, "RG", &val->f);
|
||||
return get_kenwood_level(rig, "RG", val);
|
||||
|
||||
case RIG_LEVEL_SQL:
|
||||
return get_kenwood_level(rig, "SQ", &val->f);
|
||||
return get_kenwood_level(rig, "SQ", val);
|
||||
|
||||
case RIG_LEVEL_MICGAIN:
|
||||
return get_kenwood_level(rig, "MG", &val->f);
|
||||
return get_kenwood_level(rig, "MG", val);
|
||||
|
||||
case RIG_LEVEL_AGC:
|
||||
ret = get_kenwood_level(rig, "GT", &val->f);
|
||||
ret = get_kenwood_level(rig, "GT", val);
|
||||
agclevel = 255 * val->f;
|
||||
|
||||
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;
|
||||
|
||||
case RIG_LEVEL_MICGAIN:
|
||||
retval = get_kenwood_level(rig, "MG", &val->f);
|
||||
retval = get_kenwood_level(rig, "MG", val);
|
||||
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
|
@ -670,7 +670,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
break;
|
||||
|
||||
case RIG_LEVEL_VOXGAIN:
|
||||
retval = get_kenwood_level(rig, "VG00", &val->f);
|
||||
retval = get_kenwood_level(rig, "VG00", val);
|
||||
|
||||
if (retval != RIG_OK)
|
||||
{
|
||||
|
@ -680,7 +680,7 @@ int ts990s_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
|
|||
break;
|
||||
|
||||
case RIG_LEVEL_ANTIVOX:
|
||||
retval = get_kenwood_level(rig, "VG00", &val->f);
|
||||
retval = get_kenwood_level(rig, "VG00", val);
|
||||
|
||||
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;
|
||||
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)
|
||||
{
|
||||
|
@ -766,6 +766,7 @@ int HAMLIB_API read_string(hamlib_port_t *p,
|
|||
}
|
||||
|
||||
++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))
|
||||
{
|
||||
|
|
11
src/serial.c
11
src/serial.c
|
@ -677,7 +677,16 @@ int ser_open(hamlib_port_t *p)
|
|||
/*
|
||||
* 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)
|
||||
|
|
Ładowanie…
Reference in New Issue