diff --git a/drake/drake.c b/drake/drake.c index fbd0fed2b..228ea0605 100644 --- a/drake/drake.c +++ b/drake/drake.c @@ -2,7 +2,7 @@ * Hamlib Drake backend - main file * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: drake.c,v 1.8 2004-03-10 23:33:48 fillods Exp $ + * $Id: drake.c,v 1.9 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -122,13 +122,47 @@ int drake_set_freq(RIG *rig, vfo_t vfo, freq_t freq) * 10Hz resolution * TODO: round nearest? */ - freq_len = sprintf(freqbuf,"F%07d", (unsigned int)freq/10); + freq_len = sprintf(freqbuf,"F%07d" EOM, (unsigned int)freq/10); retval = drake_transaction(rig, freqbuf, freq_len, ackbuf, &ack_len); return retval; } +/* + * drake_get_freq + * Assumes rig!=NULL, freq!=NULL + */ +int drake_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) +{ + int freq_len, retval; + char freqbuf[BUFSZ]; + double f; + char fmult; + + retval = drake_transaction (rig, "RF" EOM, 3, freqbuf, &freq_len); + if (retval != RIG_OK) + return retval; + + /* RA command returns *fffff.ff*mHz */ + if (freq_len != 15) { + rig_debug(RIG_DEBUG_ERR,"drake_get_freq: wrong answer %s, " + "len=%d\n", freqbuf, freq_len); + return -RIG_ERJCTED; + } + fmult = freqbuf[10]; + freqbuf[9] = '\0'; + + /* extract freq */ + sscanf(freqbuf+1, "%lf", &f); + f *= 1000.0; + if (fmult=='M'||fmult=='m') + f *= 1000.0; + *freq = (freq_t)f; + + return RIG_OK; +} + /* * drake_set_vfo * Assumes rig!=NULL @@ -156,6 +190,56 @@ int drake_set_vfo(RIG *rig, vfo_t vfo) } +/* + * drake_get_vfo + * Assumes rig!=NULL + */ +int drake_get_vfo(RIG *rig, vfo_t *vfo) +{ + int mdbuf_len, retval; + char mdbuf[BUFSZ]; + char cvfo; + + retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len); + if (retval != RIG_OK) + return retval; + + if (mdbuf_len != 8) { + rig_debug(RIG_DEBUG_ERR,"drake_get_vfo: wrong answer %s, " + "len=%d\n", mdbuf, mdbuf_len); + return -RIG_ERJCTED; + } + + cvfo = mdbuf[5]; + + switch(cvfo){ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': *vfo = RIG_VFO_B; break; + case '8': + case '9': + case ':': + case ';': + case '<': + case '=': + case '>': + case '?': *vfo = RIG_VFO_A; break; + default : + rig_debug(RIG_DEBUG_ERR, + "drake_get_vfo: unsupported vfo %c\n", + cvfo); + *vfo = RIG_VFO_VFO; + return -RIG_EINVAL; + } + + return RIG_OK; +} + /* * drake_set_mode * Assumes rig!=NULL @@ -215,6 +299,97 @@ int drake_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) } +/* + * drake_get_mode + * Assumes rig!=NULL + */ +int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) +{ + int mdbuf_len, retval; + char mdbuf[BUFSZ]; + char cmode; + char cwidth; + char csynch; + + retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len); + if (retval != RIG_OK) + return retval; + + if (mdbuf_len != 8) { + rig_debug(RIG_DEBUG_ERR,"drake_get_mode: wrong answer %s, " + "len=%d\n", mdbuf, mdbuf_len); + return -RIG_ERJCTED; + } + + cmode = mdbuf[3]; + cwidth = mdbuf[4]; + csynch = mdbuf[5]; + + switch(cwidth){ + case '0': + case '8': *width = s_Hz(500); break; + case '1': + case '9': *width = s_Hz(1800); break; + case '2': + case ':': *width = s_Hz(2300); break; + case '3': + case ';': *width = s_Hz(4000); break; + case '4': + case '<': *width = s_Hz(6000); break; + default : + rig_debug(RIG_DEBUG_ERR, + "drake_get_mode: unsupported width %c\n", + cwidth); + *width = RIG_PASSBAND_NORMAL; + return -RIG_EINVAL; + } + + if (cwidth=='0'||cwidth=='1'||cwidth=='2'||cwidth=='3'||cwidth=='4'){ + switch(cmode){ + case '0': + case '4': + case '8': *mode = RIG_MODE_LSB; break; + case '1': + case '5': + case '9': *mode = RIG_MODE_RTTY; break; + case '2': + case '6': + case ':': *mode = RIG_MODE_FM; *width = s_Hz(12000); break; + default : + rig_debug(RIG_DEBUG_ERR, + "drake_get_mode: unsupported mode %c\n", + cmode); + *mode = RIG_MODE_NONE; + return -RIG_EINVAL; + } + } else { + switch(cmode){ + case '0': + case '4': + case '8': *mode = RIG_MODE_USB; break; + case '1': + case '5': + case '9': *mode = RIG_MODE_CW; break; + case '2': + case '6': + case ':': *mode = RIG_MODE_AM; break; + default : + rig_debug(RIG_DEBUG_ERR, + "drake_get_mode: unsupported mode %c\n", + cmode); + *mode = RIG_MODE_NONE; + return -RIG_EINVAL; + } + } + + /*FIXME USB/LSB synch in R8B*/ + if (csynch=='4'||csynch=='5'||csynch=='6'||csynch=='7'|| + csynch=='<'||csynch=='='||csynch=='>'||csynch=='?') + *mode = RIG_MODE_AMS; + + return RIG_OK; +} + /* * drake_set_ant * Assumes rig!=NULL @@ -224,13 +399,56 @@ int drake_set_ant(RIG *rig, vfo_t vfo, ant_t ant) unsigned char buf[16], ackbuf[16]; int len, ack_len, retval; - len = sprintf(buf,"A%c"EOM, ant==RIG_ANT_1?'1':(ant==RIG_ANT_2?'2':'C')); + len = sprintf(buf,"A%c" EOM, ant==RIG_ANT_1?'1':(ant==RIG_ANT_2?'2':'C')); retval = drake_transaction(rig, buf, len, ackbuf, &ack_len); return retval; } +/* + * drake_get_ant + * Assumes rig!=NULL + */ +int drake_get_ant(RIG *rig, vfo_t vfo, ant_t *ant) +{ + int mdbuf_len, retval; + char mdbuf[BUFSZ]; + char cant; + + retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len); + if (retval != RIG_OK) + return retval; + + if (mdbuf_len != 8) { + rig_debug(RIG_DEBUG_ERR,"drake_get_ant: wrong answer %s, " + "len=%d\n", mdbuf, mdbuf_len); + return -RIG_ERJCTED; + } + + cant = mdbuf[3]; + + switch(cant){ + case '0': + case '1': + case '2': *ant = RIG_ANT_1; break; + case '4': + case '5': + case '6': *ant = RIG_ANT_3; break; + case '8': + case '9': + case ':': *ant = RIG_ANT_2; break; + default : + rig_debug(RIG_DEBUG_ERR, + "drake_get_ant: unsupported antenna %c\n", + cant); + *ant = RIG_ANT_NONE; + return -RIG_EINVAL; + } + + return RIG_OK; +} + /* * drake_set_mem * Assumes rig!=NULL @@ -244,6 +462,35 @@ int drake_set_mem(RIG *rig, vfo_t vfo, int ch) return RIG_OK; } +/* + * drake_get_mem + * Assumes rig!=NULL + */ +int drake_get_mem(RIG *rig, vfo_t vfo, int *ch) +{ + int mdbuf_len, retval; + char mdbuf[BUFSZ]; + int chan; + + retval = drake_transaction (rig, "RC" EOM, 3, mdbuf, &mdbuf_len); + if (retval != RIG_OK) + return retval; + + if (mdbuf_len != 6) { + rig_debug(RIG_DEBUG_ERR,"drake_get_mem: wrong answer %s, " + "len=%d\n", mdbuf, mdbuf_len); + return -RIG_ERJCTED; + } + + mdbuf[4] = '\0'; + + /* extract channel no */ + sscanf(mdbuf+1, "%03d", &chan); + *ch = chan; + + return RIG_OK; +} + /* * drake_vfo_op * Assumes rig!=NULL @@ -262,16 +509,16 @@ int drake_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op) len = sprintf(buf,"D"); break; case RIG_OP_CPY: - len = sprintf(buf,"A E B"EOM); + len = sprintf(buf,"A E B" EOM); break; case RIG_OP_TO_VFO: - len = sprintf(buf,"C%03d", priv->curr_ch); + len = sprintf(buf,"C%03d" EOM, priv->curr_ch); break; case RIG_OP_MCL: - len = sprintf(buf,"EC%03d"EOM, priv->curr_ch); + len = sprintf(buf,"EC%03d" EOM, priv->curr_ch); break; case RIG_OP_FROM_VFO: - len = sprintf(buf,"PR"EOM"%03d"EOM, priv->curr_ch); + len = sprintf(buf,"PR" EOM "%03d" EOM, priv->curr_ch); break; default: return -RIG_EINVAL; @@ -293,14 +540,14 @@ int drake_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) switch(func) { case RIG_FUNC_MN: - len = sprintf(buf,"N%c"EOM, status?'O':'F'); + len = sprintf(buf,"N%c" EOM, status?'O':'F'); break; case RIG_FUNC_LOCK: - len = sprintf(buf,"L%c"EOM, status?'O':'F'); + len = sprintf(buf,"L%c" EOM, status?'O':'F'); break; case RIG_FUNC_NB: /* TODO: NB narrow */ - len = sprintf(buf,"B%c"EOM, status?'W':'F'); + len = sprintf(buf,"B%c" EOM, status?'W':'F'); break; default: return -RIG_EINVAL; @@ -311,6 +558,44 @@ int drake_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) return retval; } +/* + * drake_get_func + * Assumes rig!=NULL + */ +int drake_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) +{ + int mdbuf_len, retval; + char mdbuf[BUFSZ]; + char mc; + + retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len); + if (retval != RIG_OK) + return retval; + + if (mdbuf_len != 8) { + rig_debug(RIG_DEBUG_ERR,"drake_get_func: wrong answer %s, " + "len=%d\n", mdbuf, mdbuf_len); + return -RIG_ERJCTED; + } + + switch(func) { + case RIG_FUNC_MN: + mc = mdbuf[2]; + *status = (mc=='2'||mc=='3'||mc=='6'||mc=='7'||mc==':'||mc==';'||mc=='>'||mc=='?'); + break; + case RIG_FUNC_NB: + /* TODO: NB narrow */ + mc = mdbuf[1]; + *status = ((mc!='0')&&(mc!='1')&&(mc!='2')&&(mc!='3')); + break; + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported get func %d\n",func); + return -RIG_EINVAL; + } + + return RIG_OK; +} + /* * drake_set_level * Assumes rig!=NULL @@ -322,13 +607,13 @@ int drake_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) switch(level) { case RIG_LEVEL_PREAMP: - len = sprintf(buf,"G%c"EOM, val.i?'+':'0'); + len = sprintf(buf,"G%c" EOM, val.i?'+':'0'); break; case RIG_LEVEL_ATT: - len = sprintf(buf,"G%c"EOM, val.i?'-':'0'); + len = sprintf(buf,"G%c" EOM, val.i?'-':'0'); break; case RIG_LEVEL_AGC: - len = sprintf(buf,"A%c"EOM, + len = sprintf(buf,"A%c" EOM, val.i==RIG_AGC_OFF?'O': (val.i==RIG_AGC_FAST?'F':'S')); break; @@ -341,18 +626,109 @@ int drake_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) return retval; } +/* + * drake_get_level + * Assumes rig!=NULL + */ +int drake_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) +{ + int lvl_len, retval; + char lvlbuf[BUFSZ]; + char mc; + + if (level != RIG_LEVEL_RAWSTR) { + retval = drake_transaction (rig, "RM" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 8) { + rig_debug(RIG_DEBUG_ERR,"drake_get_level: wrong answer %s, " + "len=%d\n", lvlbuf, lvl_len); + return -RIG_ERJCTED; + } + } + + switch(level) { + case RIG_LEVEL_RAWSTR: + retval = drake_transaction (rig, "RSS" EOM, 4, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 5) { + rig_debug(RIG_DEBUG_ERR,"drake_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + + lvlbuf[3] = '\0'; + val->i = strtol(lvlbuf+1, (char **)NULL, 16); + break; + case RIG_LEVEL_PREAMP: + mc = lvlbuf[2]; + if (mc=='8'||mc=='9'||mc==':'||mc==';') + val->i = 10; + else + val->i = 0; + break; + case RIG_LEVEL_ATT: + mc = lvlbuf[2]; + if (mc=='4'||mc=='5'||mc=='6'||mc=='7') + val->i = 10; + else + val->i = 0; + break; + case RIG_LEVEL_AGC: + mc = lvlbuf[1]; + switch(mc){ + case '0': + case '4': + case '8': + case '<': val->i = RIG_AGC_OFF; break; + case '2': + case '6': + case ':': + case '>': val->i = RIG_AGC_FAST; break; + case '3': + case '7': + case ';': + case '?': val->i = RIG_AGC_SLOW; break; + default : val->i = RIG_AGC_FAST; + } + break; + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d\n",level); + return -RIG_EINVAL; + } + + return RIG_OK; +} + int drake_set_powerstat (RIG * rig, powerstat_t status) { unsigned char buf[16], ackbuf[16]; int len, ack_len, retval; - len = sprintf(buf,"P%c"EOM, status==RIG_POWER_OFF?'F':'O'); + len = sprintf(buf,"P%c" EOM, status==RIG_POWER_OFF?'F':'O'); retval = drake_transaction(rig, buf, len, ackbuf, &ack_len); return retval; } +int drake_get_powerstat (RIG * rig, powerstat_t *status) +{ + int mdlen, retval; + char mdbuf[BUFSZ]; + + retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdlen); + if (retval != RIG_OK) + return retval; + + *status = (mdlen == 8); + + return RIG_OK; +} + /* @@ -373,6 +749,7 @@ const char *drake_get_info(RIG *rig) return idbuf; } + /* * initrigs_drake is called by rig_backend_load */ @@ -441,4 +818,3 @@ DECLARE_PROBERIG_BACKEND(drake) return RIG_MODEL_NONE; } - diff --git a/drake/drake.h b/drake/drake.h index 671a093bf..3aeefb905 100644 --- a/drake/drake.h +++ b/drake/drake.h @@ -2,7 +2,7 @@ * Hamlib Drake backend - main header * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: drake.h,v 1.5 2004-03-10 23:33:48 fillods Exp $ + * $Id: drake.h,v 1.6 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -30,16 +30,24 @@ struct drake_priv_data { }; int drake_set_freq(RIG *rig, vfo_t vfo, freq_t freq); +int drake_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); int drake_set_vfo(RIG *rig, vfo_t vfo); +int drake_get_vfo(RIG *rig, vfo_t *vfo); int drake_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); +int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); int drake_init(RIG *rig); int drake_cleanup(RIG *rig); int drake_set_ant(RIG *rig, vfo_t vfo, ant_t ant); +int drake_get_ant(RIG *rig, vfo_t vfo, ant_t *ant); int drake_set_mem(RIG *rig, vfo_t vfo, int ch); +int drake_get_mem(RIG *rig, vfo_t vfo, int *ch); int drake_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op); int drake_set_func(RIG *rig, vfo_t vfo, setting_t func, int status); +int drake_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status); int drake_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); +int drake_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); int drake_set_powerstat (RIG * rig, powerstat_t status); +int drake_get_powerstat (RIG * rig, powerstat_t *status); const char *drake_get_info(RIG *rig); extern const struct rig_caps r8a_caps; diff --git a/drake/r8a.c b/drake/r8a.c index c3d4d2ac0..037f3ecd1 100644 --- a/drake/r8a.c +++ b/drake/r8a.c @@ -1,8 +1,8 @@ /* * Hamlib Drake backend - R-8A description - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: r8a.c,v 1.1 2004-03-10 23:32:01 fillods Exp $ + * $Id: r8a.c,v 1.2 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -34,9 +34,9 @@ #define R8A_FUNC (RIG_FUNC_MN|RIG_FUNC_LOCK|RIG_FUNC_NB) -#define R8A_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC) +#define R8A_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR) -#define R8A_PARM_ALL (RIG_PARM_NONE) +#define R8A_PARM_ALL (RIG_PARM_TIME) #define R8A_VFO (RIG_VFO_A|RIG_VFO_B) @@ -55,9 +55,9 @@ const struct rig_caps r8a_caps = { .rig_model = RIG_MODEL_DKR8A, .model_name = "R-8A", .mfg_name = "Drake", -.version = "0.2", +.version = "0.3", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, /* and only basic support */ +.status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -95,7 +95,7 @@ const struct rig_caps r8a_caps = { .vfo_ops = R8A_VFO_OPS, .chan_list = { - { 0, 999, RIG_MTYPE_MEM }, + { 0, 439, RIG_MTYPE_MEM }, RIG_CHAN_END }, @@ -133,16 +133,22 @@ const struct rig_caps r8a_caps = { .rig_cleanup = drake_cleanup, .set_freq = drake_set_freq, +.get_freq = drake_get_freq, .set_vfo = drake_set_vfo, +.get_vfo = drake_get_vfo, .set_mode = drake_set_mode, - -.set_ant = drake_set_ant, -.set_mem = drake_set_mem, -.vfo_op = drake_vfo_op, +.get_mode = drake_get_mode, .set_func = drake_set_func, +.get_func = drake_get_func, .set_level = drake_set_level, +.get_level = drake_get_level, +.set_ant = drake_set_ant, +.get_ant = drake_get_ant, +.set_mem = drake_set_mem, +.get_mem = drake_get_mem, +.vfo_op = drake_vfo_op, .set_powerstat = drake_set_powerstat, - +.get_powerstat = drake_get_powerstat, .get_info = drake_get_info, }; diff --git a/drake/r8b.c b/drake/r8b.c index 222878402..145ea4553 100644 --- a/drake/r8b.c +++ b/drake/r8b.c @@ -1,8 +1,8 @@ /* * Hamlib Drake backend - R-8B description - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: r8b.c,v 1.5 2004-03-10 23:33:48 fillods Exp $ + * $Id: r8b.c,v 1.6 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -34,9 +34,9 @@ #define R8B_FUNC (RIG_FUNC_MN|RIG_FUNC_LOCK|RIG_FUNC_NB) -#define R8B_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC) +#define R8B_LEVEL_ALL (RIG_LEVEL_PREAMP|RIG_LEVEL_ATT|RIG_LEVEL_AGC|RIG_LEVEL_RAWSTR) -#define R8B_PARM_ALL (RIG_PARM_NONE) +#define R8B_PARM_ALL (RIG_PARM_TIME) #define R8B_VFO (RIG_VFO_A|RIG_VFO_B) @@ -56,9 +56,9 @@ const struct rig_caps r8b_caps = { .rig_model = RIG_MODEL_DKR8B, .model_name = "R-8B", .mfg_name = "Drake", -.version = "0.2", +.version = "0.3", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, /* and only basic support */ +.status = RIG_STATUS_UNTESTED, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -134,15 +134,22 @@ const struct rig_caps r8b_caps = { .rig_cleanup = drake_cleanup, .set_freq = drake_set_freq, +.get_freq = drake_get_freq, .set_vfo = drake_set_vfo, +.get_vfo = drake_get_vfo, .set_mode = drake_set_mode, - -.set_mem = drake_set_mem, -.vfo_op = drake_vfo_op, +.get_mode = drake_get_mode, .set_func = drake_set_func, +.get_func = drake_get_func, .set_level = drake_set_level, +.get_level = drake_get_level, +.set_ant = drake_set_ant, +.get_ant = drake_get_ant, +.set_mem = drake_set_mem, +.get_mem = drake_get_mem, +.vfo_op = drake_vfo_op, .set_powerstat = drake_set_powerstat, - +.get_powerstat = drake_get_powerstat, .get_info = drake_get_info, }; diff --git a/jrc/jrc.c b/jrc/jrc.c index 6e51b32f2..fe4c6be67 100644 --- a/jrc/jrc.c +++ b/jrc/jrc.c @@ -2,7 +2,7 @@ * Hamlib JRC backend - main file * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: jrc.c,v 1.12 2004-05-19 08:57:45 fillods Exp $ + * $Id: jrc.c,v 1.13 2004-06-04 21:48:03 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -535,13 +535,11 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) return -RIG_ENIMPL; /* get_dcd ? */ case RIG_LEVEL_ATT: - //retval = jrc_transaction (rig, "A" EOM, 2, lvlbuf, &lvl_len); retval = jrc_transaction (rig, "I" EOM, 2, lvlbuf, &lvl_len); if (retval != RIG_OK) return retval; - //if (lvl_len != 3) { - if (lvlbuf[0] != 'I' || lvl_len != priv->info_len) { + if (lvlbuf[0] != 'I' || lvl_len != priv->info_len) { rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" "len=%d\n", lvl_len); return -RIG_ERJCTED; @@ -550,6 +548,32 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) val->i = lvlbuf[1] == '1' ? 20 : 0; break; + case RIG_LEVEL_AGC: + retval = jrc_transaction (rig, "I" EOM, 2, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvlbuf[0] != 'I' || lvl_len != priv->info_len) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + + lvlbuf[priv->info_len-1] = '\0'; + + if (priv->info_len==14) { + switch (lvlbuf[priv->info_len-2]){ + case '0' : val->i = RIG_AGC_SLOW; break; + case '1' : val->i = RIG_AGC_FAST; break; + case '2' : val->i = RIG_AGC_OFF; break; + default : val->i = RIG_AGC_FAST; + } + } + else { + val->i = atoi(lvlbuf+priv->info_len-4); + } + break; + case RIG_LEVEL_RF: retval = jrc_transaction (rig, "HH" EOM, 3, lvlbuf, &lvl_len); if (retval != RIG_OK) @@ -640,7 +664,7 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) if (retval != RIG_OK) return retval; - if (lvlbuf[0] != 'P' || lvl_len != priv->pbs_info_len) { + if (lvlbuf[0] != 'P' || lvl_len != priv->pbs_info_len) { rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" "len=%d\n", lvl_len); return -RIG_ERJCTED; @@ -684,7 +708,6 @@ int jrc_set_parm(RIG *rig, setting_t parm, value_t val) case RIG_PARM_BEEP: - //cmd_len = sprintf(cmdbuf, "U%03d" EOM, val.i?101:100); cmd_len = sprintf(cmdbuf, "U%0*d" EOM, priv->beep_len, priv->beep + val.i?1:0); return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); @@ -710,8 +733,11 @@ int jrc_set_parm(RIG *rig, setting_t parm, value_t val) */ int jrc_get_parm(RIG *rig, setting_t parm, value_t *val) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int retval, lvl_len, i; char lvlbuf[BUFSZ]; + char cmdbuf[BUFSZ]; + int cmd_len; /* Optimize: * sort the switch cases with the most frequent first @@ -739,17 +765,18 @@ int jrc_get_parm(RIG *rig, setting_t parm, value_t *val) break; case RIG_PARM_BEEP: - retval = jrc_transaction (rig, "U9" EOM, 3, lvlbuf, &lvl_len); + cmd_len = sprintf(cmdbuf, "U%d" EOM, priv->beep/10); + retval = jrc_transaction (rig, cmdbuf, cmd_len, lvlbuf, &lvl_len); if (retval != RIG_OK) return retval; - if (lvl_len != 4) { + if (lvl_len != priv->beep_len+2) { rig_debug(RIG_DEBUG_ERR,"jrc_get_parm: wrong answer" "len=%d\n", lvl_len); return -RIG_ERJCTED; } - val->i = lvlbuf[2] == 0 ? 0 : 1; + val->i = lvlbuf[priv->beep_len] == 0 ? 0 : 1; break; default: @@ -811,6 +838,30 @@ int jrc_set_powerstat(RIG *rig, powerstat_t status) return jrc_transaction (rig, pwrbuf, pwr_len, NULL, NULL); } +/* + * jrc_get_powerstat + * Assumes rig!=NULL + */ +int jrc_get_powerstat(RIG *rig, powerstat_t *status) +//powerstat_t jrc_get_powerstat(RIG *rig) +{ + char pwrbuf[BUFSZ]; + int pwr_len, retval; + + retval = jrc_transaction (rig, "T" EOM, 2, pwrbuf, &pwr_len); + if (retval != RIG_OK) + return retval; + + if (pwr_len != 3) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_powerstat: wrong answer %s, " + "len=%d\n", pwrbuf, pwr_len); + return -RIG_ERJCTED; + } + *status = pwrbuf[1] == '0' ? RIG_POWER_OFF : RIG_POWER_ON; + + return RIG_OK; +} + /* * jrc_reset * Assumes rig!=NULL diff --git a/jrc/jrc.h b/jrc/jrc.h index 094ac07e6..289fd65d1 100644 --- a/jrc/jrc.h +++ b/jrc/jrc.h @@ -2,7 +2,7 @@ * Hamlib JRC backend - main header * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: jrc.h,v 1.7 2004-05-19 08:57:50 fillods Exp $ + * $Id: jrc.h,v 1.8 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -53,6 +53,7 @@ int jrc_set_trn(RIG *rig, int trn); int jrc_set_mem(RIG *rig, vfo_t vfo, int ch); int jrc_get_mem(RIG *rig, vfo_t vfo, int *ch); int jrc_set_powerstat(RIG *rig, powerstat_t status); +int jrc_get_powerstat(RIG *rig, powerstat_t *status); int jrc_reset(RIG *rig, reset_t reset); int jrc_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op); int jrc_scan(RIG *rig, vfo_t vfo, scan_t scan, int ch); diff --git a/jrc/nrd535.c b/jrc/nrd535.c index 5d9113e81..ab011da76 100644 --- a/jrc/nrd535.c +++ b/jrc/nrd535.c @@ -2,7 +2,7 @@ * Hamlib JRC backend - NRD-535 DSP description * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: nrd535.c,v 1.3 2004-05-19 08:57:50 fillods Exp $ + * $Id: nrd535.c,v 1.4 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -91,7 +91,7 @@ const struct rig_caps nrd535_caps = { .mfg_name = "JRC", .version = "0.2", .copyright = "LGPL", -.status = RIG_STATUS_ALPHA, +.status = RIG_STATUS_BETA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -115,6 +115,9 @@ const struct rig_caps nrd535_caps = { .has_set_parm = RIG_PARM_SET(NRD535_PARM), .level_gran = { [LVL_RAWSTR] = { .min = { .i = 0 }, .max = { .i = 255 } }, + [LVL_ATT] = { .min = { .i = 0 }, .max = { .i = 20 } }, + [LVL_IF] = { .min = { .i = -2000 }, .max = { .i = 2000 } }, + [LVL_CWPITCH] = { .min = { .i = -5000 }, .max = { .i = 5000 } }, }, .parm_gran = {}, .ctcss_list = NULL, @@ -184,6 +187,7 @@ const struct rig_caps nrd535_caps = { .vfo_op = jrc_vfo_op, .scan = jrc_scan, .set_powerstat = jrc_set_powerstat, +.get_powerstat = jrc_get_powerstat, .decode_event = jrc_decode_event, }; diff --git a/jrc/nrd545.c b/jrc/nrd545.c index 5cfe8ffad..05930d330 100644 --- a/jrc/nrd545.c +++ b/jrc/nrd545.c @@ -2,7 +2,7 @@ * Hamlib JRC backend - NRD-545 DSP description * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: nrd545.c,v 1.8 2004-05-19 08:57:50 fillods Exp $ + * $Id: nrd545.c,v 1.9 2004-06-04 21:48:05 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -83,7 +83,7 @@ const struct rig_caps nrd545_caps = { .mfg_name = "JRC", .version = "0.2", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, +.status = RIG_STATUS_ALPHA, .rig_type = RIG_TYPE_RECEIVER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -183,6 +183,7 @@ const struct rig_caps nrd545_caps = { .vfo_op = jrc_vfo_op, .scan = jrc_scan, .set_powerstat = jrc_set_powerstat, +.get_powerstat = jrc_get_powerstat, .decode_event = jrc_decode_event, };