Adding Expert Linear amplifier

pull/1269/head
Mike Black W9MDB 2023-03-28 17:08:40 -05:00
rodzic c331899d94
commit 7236942d89
5 zmienionych plików z 67 dodań i 63 usunięć

Wyświetl plik

@ -23,6 +23,7 @@
#include <string.h> #include <string.h>
#include "expert.h" #include "expert.h"
#include "register.h" #include "register.h"
#include "misc.h"
struct fault_list struct fault_list
{ {
@ -102,12 +103,15 @@ int expert_flushbuffer(AMP *amp)
return rig_flush(&rs->ampport); return rig_flush(&rs->ampport);
} }
int expert_transaction(AMP *amp, const char *cmd, char *response, int response_len) int expert_transaction(AMP *amp, const unsigned char *cmd, int cmd_len, unsigned char *response, int response_len)
{ {
struct amp_state *rs; struct amp_state *rs;
int err; int err;
int len = 0; int len = 0;
int loop; int loop;
char cmdbuf[64];
int checksum=0;
int bytes;
rig_debug(RIG_DEBUG_VERBOSE, "%s called, cmd=%s\n", __func__, cmd); rig_debug(RIG_DEBUG_VERBOSE, "%s called, cmd=%s\n", __func__, cmd);
@ -117,43 +121,35 @@ int expert_transaction(AMP *amp, const char *cmd, char *response, int response_l
rs = &amp->state; rs = &amp->state;
loop = 3; cmdbuf[0] = cmdbuf[1] = cmdbuf[2] = 0x55;
memcpy(&cmdbuf,cmd,cmd_len);
do // wake up the amp by sending ; until we receive ; for(int i=0;i<cmd_len;++i) checksum += cmd[i];
{ checksum = checksum % 256;
char c = ';'; cmdbuf[3] = cmd_len;
rig_debug(RIG_DEBUG_VERBOSE, "%s waiting for ;\n", __func__); cmdbuf[3+cmd_len+1] = checksum;
err = write_block(&rs->ampport, (unsigned char *) &c, 1);
if (err != RIG_OK) { return err; }
len = read_string(&rs->ampport, (unsigned char *) response, response_len, ";",
1, 0, 1);
if (len < 0) { return len; }
}
while (--loop > 0 && (len != 1 || response[0] != ';'));
// Now send our command // Now send our command
err = write_block(&rs->ampport, (unsigned char *) cmd, strlen(cmd)); err = write_block(&rs->ampport, (unsigned char *) cmdbuf, 3+cmd_len+2);
if (err != RIG_OK) { return err; } if (err != RIG_OK) { return err; }
if (response) // if response expected get it if (response) // if response expected get it
{ {
response[0] = 0; response[0] = 0;
len = read_string(&rs->ampport, (unsigned char *) response, response_len, ";", // read the 4-byte header x55x55x55xXX where XX is the hex # of bytes
1, 0, 1); len = read_block_direct(&rs->ampport, (unsigned char *) response, 4);
rig_debug(RIG_DEBUG_ERR, "%s: len=%d, bytes=%02x\n", __func__, len, response[3]);
if (len < 0) if (len < 0)
{ {
rig_debug(RIG_DEBUG_VERBOSE, "%s called, error=%s\n", __func__, rig_debug(RIG_DEBUG_VERBOSE, "%s: error=%s\n", __func__,
rigerror(len)); rigerror(len));
return len; return len;
} }
if (len == 4) bytes = response[3];
rig_debug(RIG_DEBUG_VERBOSE, "%s called, response='%s'\n", __func__, rig_debug(RIG_DEBUG_ERR, "%s: bytes=%d\n", __func__, bytes);
response); len = read_block_direct(&rs->ampport, (unsigned char *) response, bytes-3 );
dump_hex(response,len);
} }
else // if no response expected try to get one else // if no response expected try to get one
{ {
@ -208,7 +204,7 @@ int expert_get_freq(AMP *amp, freq_t *freq)
if (!amp) { return -RIG_EINVAL; } if (!amp) { return -RIG_EINVAL; }
retval = expert_transaction(amp, "^FR;", responsebuf, sizeof(responsebuf)); retval = expert_transaction(amp, NULL,0, NULL, sizeof(responsebuf));
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
@ -231,14 +227,14 @@ int expert_set_freq(AMP *amp, freq_t freq)
int retval; int retval;
unsigned long tfreq; unsigned long tfreq;
int nargs; int nargs;
char cmd[KPABUFSZ]; unsigned char cmd[KPABUFSZ];
rig_debug(RIG_DEBUG_VERBOSE, "%s called, freq=%"PRIfreq"\n", __func__, freq); rig_debug(RIG_DEBUG_VERBOSE, "%s called, freq=%"PRIfreq"\n", __func__, freq);
if (!amp) { return -RIG_EINVAL; } if (!amp) { return -RIG_EINVAL; }
SNPRINTF(cmd, sizeof(cmd), "^FR%05ld;", (long)freq / 1000); // SNPRINTF(cmd, sizeof(cmd), "^FR%05ld;", (long)freq / 1000);
retval = expert_transaction(amp, cmd, NULL, 0); retval = expert_transaction(amp, cmd, 0, NULL, 0);
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
@ -265,7 +261,7 @@ int expert_set_freq(AMP *amp, freq_t freq)
int expert_get_level(AMP *amp, setting_t level, value_t *val) int expert_get_level(AMP *amp, setting_t level, value_t *val)
{ {
char responsebuf[KPABUFSZ]; char responsebuf[KPABUFSZ];
char *cmd; unsigned char cmd[8];
int retval; int retval;
int fault; int fault;
int i; int i;
@ -284,8 +280,8 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
// get the current antenna selected // get the current antenna selected
cmd = "^AE;"; cmd[0] = 0x00;
retval = expert_transaction(amp, cmd, responsebuf, sizeof(responsebuf)); retval = expert_transaction(amp, cmd, 0, NULL, sizeof(responsebuf));
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
@ -305,46 +301,46 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
switch (level) switch (level)
{ {
case AMP_LEVEL_SWR: case AMP_LEVEL_SWR:
cmd = "^SW;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_NH: case AMP_LEVEL_NH:
cmd = "^DF;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_PF: case AMP_LEVEL_PF:
cmd = "^DF;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_PWR_INPUT: case AMP_LEVEL_PWR_INPUT:
cmd = "^PWI;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_PWR_FWD: case AMP_LEVEL_PWR_FWD:
cmd = "^PWF;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_PWR_REFLECTED: case AMP_LEVEL_PWR_REFLECTED:
cmd = "^PWR;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_PWR_PEAK: case AMP_LEVEL_PWR_PEAK:
cmd = "^PWK;"; cmd[0] = 0x00;
break; break;
case AMP_LEVEL_FAULT: case AMP_LEVEL_FAULT:
cmd = "^SF;"; cmd[0] = 0x00;
break; break;
} }
retval = expert_transaction(amp, cmd, responsebuf, sizeof(responsebuf)); retval = expert_transaction(amp, cmd, 0, NULL, sizeof(responsebuf));
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
switch (level) switch (level)
{ {
case AMP_LEVEL_SWR: case AMP_LEVEL_SWR:
nargs = sscanf(responsebuf, "^SW%f", &float_value); //nargs = sscanf(responsebuf, "^SW%f", &float_value);
if (nargs != 1) if (nargs != 1)
{ {
@ -358,7 +354,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
case AMP_LEVEL_NH: case AMP_LEVEL_NH:
case AMP_LEVEL_PF: case AMP_LEVEL_PF:
nargs = sscanf(responsebuf, "^DF%d,%d", &int_value, &int_value2); //nargs = sscanf(responsebuf, "^DF%d,%d", &int_value, &int_value2);
if (nargs != 2) if (nargs != 2)
{ {
@ -407,7 +403,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
case AMP_LEVEL_PWR_INPUT: case AMP_LEVEL_PWR_INPUT:
cmd = "^PWI;"; cmd[0] = 0x00;
nargs = sscanf(responsebuf, "^SW%d", &pwrinput); nargs = sscanf(responsebuf, "^SW%d", &pwrinput);
if (nargs != 1) if (nargs != 1)
@ -423,7 +419,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
break; break;
case AMP_LEVEL_PWR_FWD: case AMP_LEVEL_PWR_FWD:
cmd = "^PWF;"; cmd[0] = 0x00;
nargs = sscanf(responsebuf, "^SW%d", &pwrfwd); nargs = sscanf(responsebuf, "^SW%d", &pwrfwd);
if (nargs != 1) if (nargs != 1)
@ -439,7 +435,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
break; break;
case AMP_LEVEL_PWR_REFLECTED: case AMP_LEVEL_PWR_REFLECTED:
cmd = "^PWR;"; cmd[0] = 0x00;
nargs = sscanf(responsebuf, "^SW%d", &pwrref); nargs = sscanf(responsebuf, "^SW%d", &pwrref);
if (nargs != 1) if (nargs != 1)
@ -455,7 +451,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
break; break;
case AMP_LEVEL_PWR_PEAK: case AMP_LEVEL_PWR_PEAK:
cmd = "^PWK;"; cmd[0] = 0x00;
nargs = sscanf(responsebuf, "^SW%d", &pwrpeak); nargs = sscanf(responsebuf, "^SW%d", &pwrpeak);
if (nargs != 1) if (nargs != 1)
@ -471,7 +467,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
break; break;
case AMP_LEVEL_FAULT: case AMP_LEVEL_FAULT:
cmd = "^SF;"; cmd[0] = 0x00;
nargs = sscanf(responsebuf, "^SW%d", &fault); nargs = sscanf(responsebuf, "^SW%d", &fault);
if (nargs != 1) if (nargs != 1)
@ -509,11 +505,11 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val)
int expert_get_powerstat(AMP *amp, powerstat_t *status) int expert_get_powerstat(AMP *amp, powerstat_t *status)
{ {
char responsebuf[KPABUFSZ]; unsigned char responsebuf[KPABUFSZ];
int retval; int retval;
int operate; int operate = 0;
int ampon; int ampon = 0;
int nargs; int nargs = 0;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
@ -522,11 +518,11 @@ int expert_get_powerstat(AMP *amp, powerstat_t *status)
if (!amp) { return -RIG_EINVAL; } if (!amp) { return -RIG_EINVAL; }
retval = expert_transaction(amp, "^ON;", responsebuf, sizeof(responsebuf)); retval = expert_transaction(amp, NULL, 0, responsebuf, sizeof(responsebuf));
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
nargs = sscanf(responsebuf, "^ON%d", &ampon); //nargs = sscanf(responsebuf, "^ON%d", &ampon);
if (nargs != 1) if (nargs != 1)
{ {
@ -547,11 +543,11 @@ int expert_get_powerstat(AMP *amp, powerstat_t *status)
return -RIG_EPROTO; return -RIG_EPROTO;
} }
retval = expert_transaction(amp, "^OP;", responsebuf, sizeof(responsebuf)); retval = expert_transaction(amp, NULL, 0, responsebuf, sizeof(responsebuf));
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }
nargs = sscanf(responsebuf, "^ON%d", &operate); //nargs = sscanf(responsebuf, "^ON%d", &operate);
if (nargs != 1) if (nargs != 1)
{ {
@ -568,7 +564,8 @@ int expert_get_powerstat(AMP *amp, powerstat_t *status)
int expert_set_powerstat(AMP *amp, powerstat_t status) int expert_set_powerstat(AMP *amp, powerstat_t status)
{ {
int retval; int retval;
char *cmd = NULL; unsigned char cmd[8];
int cmd_len = 1;
rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__); rig_debug(RIG_DEBUG_VERBOSE, "%s called\n", __func__);
@ -578,13 +575,13 @@ int expert_set_powerstat(AMP *amp, powerstat_t status)
{ {
case RIG_POWER_UNKNOWN: break; case RIG_POWER_UNKNOWN: break;
case RIG_POWER_OFF: cmd = "^ON0;"; break; case RIG_POWER_OFF: cmd[0] = 0x0a; break;
case RIG_POWER_ON: cmd = "^ON1;"; break; case RIG_POWER_ON: cmd[0] = 0x0b; break;
case RIG_POWER_OPERATE: cmd = "^OS1;"; break; case RIG_POWER_OPERATE: cmd[0] = 0x0d; break;
case RIG_POWER_STANDBY: cmd = "^OS0;"; break; case RIG_POWER_STANDBY: cmd[0] = 0x0a; break;
default: default:
@ -592,7 +589,7 @@ int expert_set_powerstat(AMP *amp, powerstat_t status)
} }
retval = expert_transaction(amp, cmd, NULL, 0); retval = expert_transaction(amp, cmd, cmd_len, NULL, 0);
if (retval != RIG_OK) { return retval; } if (retval != RIG_OK) { return retval; }

Wyświetl plik

@ -48,7 +48,7 @@ int expert_init(AMP *amp);
int expert_close(AMP *amp); int expert_close(AMP *amp);
int expert_reset(AMP *amp, amp_reset_t reset); int expert_reset(AMP *amp, amp_reset_t reset);
int expert_flush_buffer(AMP *amp); int expert_flush_buffer(AMP *amp);
int expert_transaction(AMP *amp, const char *cmd, char *response, int expert_transaction(AMP *amp, const unsigned char *cmd, int cmd_len, unsigned char *response,
int response_len); int response_len);
const char *expert_get_info(AMP *amp); const char *expert_get_info(AMP *amp);
int expert_get_freq(AMP *amp, freq_t *freq); int expert_get_freq(AMP *amp, freq_t *freq);

Wyświetl plik

@ -52,7 +52,7 @@ dnl here but will be added later, e.g. "winradio".
RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace rigs/mds" RIG_BACKEND_LIST="rigs/adat rigs/alinco rigs/aor rigs/barrett rigs/codan rigs/dorji rigs/drake rigs/dummy rigs/elad rigs/flexradio rigs/icom rigs/icmarine rigs/jrc rigs/kachina rigs/kenwood rigs/kit rigs/lowe rigs/pcr rigs/prm80 rigs/racal rigs/rft rigs/rs rigs/skanti rigs/tapr rigs/tentec rigs/tuner rigs/uniden rigs/winradio rigs/wj rigs/yaesu rigs/gomspace rigs/mds"
ROT_BACKEND_LIST="rotators/amsat rotators/apex rotators/ars rotators/celestron rotators/cnctrk rotators/grbltrk rotators/easycomm rotators/ether6 rotators/flir rotators/fodtrack rotators/gs232a rotators/heathkit rotators/m2 rotators/meade rotators/rotorez rotators/sartek rotators/saebrtrack rotators/spid rotators/ts7400 rotators/prosistel rotators/ioptron rotators/satel rotators/radant" ROT_BACKEND_LIST="rotators/amsat rotators/apex rotators/ars rotators/celestron rotators/cnctrk rotators/grbltrk rotators/easycomm rotators/ether6 rotators/flir rotators/fodtrack rotators/gs232a rotators/heathkit rotators/m2 rotators/meade rotators/rotorez rotators/sartek rotators/saebrtrack rotators/spid rotators/ts7400 rotators/prosistel rotators/ioptron rotators/satel rotators/radant"
# Amplifiers are all in the amplifiers directory # Amplifiers are all in the amplifiers directory
AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini" AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini amplifiers/expert"
dnl See README.release on setting these values dnl See README.release on setting these values
# Values given to -version-info when linking. See libtool documentation. # Values given to -version-info when linking. See libtool documentation.
@ -907,6 +907,7 @@ scripts/Makefile
android/Makefile android/Makefile
amplifiers/elecraft/Makefile amplifiers/elecraft/Makefile
amplifiers/gemini/Makefile amplifiers/gemini/Makefile
amplifiers/expert/Makefile
simulators/Makefile simulators/Makefile
hamlib.pc hamlib.pc
]) ])

Wyświetl plik

@ -106,10 +106,15 @@
//! @endcond //! @endcond
#define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1) #define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1)
//#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2) //#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2)
#define AMP_GEMINI 3 #define AMP_GEMINI 3
#define AMP_BACKEND_GEMINI "gemini" #define AMP_BACKEND_GEMINI "gemini"
#define AMP_MODEL_GEMINI_DX1200 AMP_MAKE_MODEL(AMP_GEMINI, 1) #define AMP_MODEL_GEMINI_DX1200 AMP_MAKE_MODEL(AMP_GEMINI, 1)
#define AMP_EXPERT 4
#define AMP_BACKEND_EXPERT "expert"
#define AMP_MODEL_EXPERT_FA AMP_MAKE_MODEL(AMP_EXPERT, 1)
/** /**
* \brief Convenience type definition for an amplifier model. * \brief Convenience type definition for an amplifier model.

Wyświetl plik

@ -65,6 +65,7 @@
DEFINE_INITAMP_BACKEND(dummy); DEFINE_INITAMP_BACKEND(dummy);
DEFINE_INITAMP_BACKEND(kpa1500); DEFINE_INITAMP_BACKEND(kpa1500);
DEFINE_INITAMP_BACKEND(gemini); DEFINE_INITAMP_BACKEND(gemini);
DEFINE_INITAMP_BACKEND(expert);
//! @endcond //! @endcond
/** /**