diff --git a/amplifiers/expert/expert.c b/amplifiers/expert/expert.c index f66256d49..212f447a2 100644 --- a/amplifiers/expert/expert.c +++ b/amplifiers/expert/expert.c @@ -23,6 +23,7 @@ #include #include "expert.h" #include "register.h" +#include "misc.h" struct fault_list { @@ -102,12 +103,15 @@ int expert_flushbuffer(AMP *amp) 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; int err; int len = 0; int loop; + char cmdbuf[64]; + int checksum=0; + int bytes; 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 = &->state; - loop = 3; - - do // wake up the amp by sending ; until we receive ; - { - char c = ';'; - rig_debug(RIG_DEBUG_VERBOSE, "%s waiting for ;\n", __func__); - 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] != ';')); + cmdbuf[0] = cmdbuf[1] = cmdbuf[2] = 0x55; + memcpy(&cmdbuf,cmd,cmd_len); + for(int i=0;iampport, (unsigned char *) cmd, strlen(cmd)); + err = write_block(&rs->ampport, (unsigned char *) cmdbuf, 3+cmd_len+2); if (err != RIG_OK) { return err; } if (response) // if response expected get it { response[0] = 0; - len = read_string(&rs->ampport, (unsigned char *) response, response_len, ";", - 1, 0, 1); + // read the 4-byte header x55x55x55xXX where XX is the hex # of bytes + 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) { - rig_debug(RIG_DEBUG_VERBOSE, "%s called, error=%s\n", __func__, + rig_debug(RIG_DEBUG_VERBOSE, "%s: error=%s\n", __func__, rigerror(len)); return len; } - - rig_debug(RIG_DEBUG_VERBOSE, "%s called, response='%s'\n", __func__, - response); + if (len == 4) bytes = response[3]; + rig_debug(RIG_DEBUG_ERR, "%s: bytes=%d\n", __func__, bytes); + len = read_block_direct(&rs->ampport, (unsigned char *) response, bytes-3 ); + dump_hex(response,len); } 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; } - retval = expert_transaction(amp, "^FR;", responsebuf, sizeof(responsebuf)); + retval = expert_transaction(amp, NULL,0, NULL, sizeof(responsebuf)); if (retval != RIG_OK) { return retval; } @@ -231,14 +227,14 @@ int expert_set_freq(AMP *amp, freq_t freq) int retval; unsigned long tfreq; int nargs; - char cmd[KPABUFSZ]; + unsigned char cmd[KPABUFSZ]; rig_debug(RIG_DEBUG_VERBOSE, "%s called, freq=%"PRIfreq"\n", __func__, freq); if (!amp) { return -RIG_EINVAL; } - SNPRINTF(cmd, sizeof(cmd), "^FR%05ld;", (long)freq / 1000); - retval = expert_transaction(amp, cmd, NULL, 0); +// SNPRINTF(cmd, sizeof(cmd), "^FR%05ld;", (long)freq / 1000); + retval = expert_transaction(amp, cmd, 0, NULL, 0); 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) { char responsebuf[KPABUFSZ]; - char *cmd; + unsigned char cmd[8]; int retval; int fault; 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__); // get the current antenna selected - cmd = "^AE;"; - retval = expert_transaction(amp, cmd, responsebuf, sizeof(responsebuf)); + cmd[0] = 0x00; + retval = expert_transaction(amp, cmd, 0, NULL, sizeof(responsebuf)); if (retval != RIG_OK) { return retval; } @@ -305,46 +301,46 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) switch (level) { case AMP_LEVEL_SWR: - cmd = "^SW;"; + cmd[0] = 0x00; break; case AMP_LEVEL_NH: - cmd = "^DF;"; + cmd[0] = 0x00; break; case AMP_LEVEL_PF: - cmd = "^DF;"; + cmd[0] = 0x00; break; case AMP_LEVEL_PWR_INPUT: - cmd = "^PWI;"; + cmd[0] = 0x00; break; case AMP_LEVEL_PWR_FWD: - cmd = "^PWF;"; + cmd[0] = 0x00; break; case AMP_LEVEL_PWR_REFLECTED: - cmd = "^PWR;"; + cmd[0] = 0x00; break; case AMP_LEVEL_PWR_PEAK: - cmd = "^PWK;"; + cmd[0] = 0x00; break; case AMP_LEVEL_FAULT: - cmd = "^SF;"; + cmd[0] = 0x00; break; } - retval = expert_transaction(amp, cmd, responsebuf, sizeof(responsebuf)); + retval = expert_transaction(amp, cmd, 0, NULL, sizeof(responsebuf)); if (retval != RIG_OK) { return retval; } switch (level) { case AMP_LEVEL_SWR: - nargs = sscanf(responsebuf, "^SW%f", &float_value); + //nargs = sscanf(responsebuf, "^SW%f", &float_value); 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_PF: - nargs = sscanf(responsebuf, "^DF%d,%d", &int_value, &int_value2); + //nargs = sscanf(responsebuf, "^DF%d,%d", &int_value, &int_value2); if (nargs != 2) { @@ -407,7 +403,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) case AMP_LEVEL_PWR_INPUT: - cmd = "^PWI;"; + cmd[0] = 0x00; nargs = sscanf(responsebuf, "^SW%d", &pwrinput); if (nargs != 1) @@ -423,7 +419,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) break; case AMP_LEVEL_PWR_FWD: - cmd = "^PWF;"; + cmd[0] = 0x00; nargs = sscanf(responsebuf, "^SW%d", &pwrfwd); if (nargs != 1) @@ -439,7 +435,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) break; case AMP_LEVEL_PWR_REFLECTED: - cmd = "^PWR;"; + cmd[0] = 0x00; nargs = sscanf(responsebuf, "^SW%d", &pwrref); if (nargs != 1) @@ -455,7 +451,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) break; case AMP_LEVEL_PWR_PEAK: - cmd = "^PWK;"; + cmd[0] = 0x00; nargs = sscanf(responsebuf, "^SW%d", &pwrpeak); if (nargs != 1) @@ -471,7 +467,7 @@ int expert_get_level(AMP *amp, setting_t level, value_t *val) break; case AMP_LEVEL_FAULT: - cmd = "^SF;"; + cmd[0] = 0x00; nargs = sscanf(responsebuf, "^SW%d", &fault); 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) { - char responsebuf[KPABUFSZ]; + unsigned char responsebuf[KPABUFSZ]; int retval; - int operate; - int ampon; - int nargs; + int operate = 0; + int ampon = 0; + int nargs = 0; 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; } - retval = expert_transaction(amp, "^ON;", responsebuf, sizeof(responsebuf)); + retval = expert_transaction(amp, NULL, 0, responsebuf, sizeof(responsebuf)); if (retval != RIG_OK) { return retval; } - nargs = sscanf(responsebuf, "^ON%d", &on); + //nargs = sscanf(responsebuf, "^ON%d", &on); if (nargs != 1) { @@ -547,11 +543,11 @@ int expert_get_powerstat(AMP *amp, powerstat_t *status) 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; } - nargs = sscanf(responsebuf, "^ON%d", &operate); + //nargs = sscanf(responsebuf, "^ON%d", &operate); 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 retval; - char *cmd = NULL; + unsigned char cmd[8]; + int cmd_len = 1; 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_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: @@ -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; } diff --git a/amplifiers/expert/expert.h b/amplifiers/expert/expert.h index f8ef1de82..d2fdb4f32 100644 --- a/amplifiers/expert/expert.h +++ b/amplifiers/expert/expert.h @@ -48,7 +48,7 @@ int expert_init(AMP *amp); int expert_close(AMP *amp); int expert_reset(AMP *amp, amp_reset_t reset); 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); const char *expert_get_info(AMP *amp); int expert_get_freq(AMP *amp, freq_t *freq); diff --git a/configure.ac b/configure.ac index 92ce17f83..e07bc0858 100644 --- a/configure.ac +++ b/configure.ac @@ -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" 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 -AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini" +AMP_BACKEND_LIST="amplifiers/elecraft amplifiers/gemini amplifiers/expert" dnl See README.release on setting these values # Values given to -version-info when linking. See libtool documentation. @@ -907,6 +907,7 @@ scripts/Makefile android/Makefile amplifiers/elecraft/Makefile amplifiers/gemini/Makefile +amplifiers/expert/Makefile simulators/Makefile hamlib.pc ]) diff --git a/include/hamlib/amplist.h b/include/hamlib/amplist.h index 3e954c86d..4122062c8 100644 --- a/include/hamlib/amplist.h +++ b/include/hamlib/amplist.h @@ -106,10 +106,15 @@ //! @endcond #define AMP_MODEL_ELECRAFT_KPA1500 AMP_MAKE_MODEL(AMP_ELECRAFT, 1) //#define AMP_MODEL_ELECRAFT_KPA500 AMP_MAKE_MODEL(AMP_ELECRAFT, 2) + #define AMP_GEMINI 3 #define AMP_BACKEND_GEMINI "gemini" #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. diff --git a/src/amp_reg.c b/src/amp_reg.c index 998a58ffd..988927902 100644 --- a/src/amp_reg.c +++ b/src/amp_reg.c @@ -65,6 +65,7 @@ DEFINE_INITAMP_BACKEND(dummy); DEFINE_INITAMP_BACKEND(kpa1500); DEFINE_INITAMP_BACKEND(gemini); +DEFINE_INITAMP_BACKEND(expert); //! @endcond /**