diff --git a/jrc/jrc.c b/jrc/jrc.c index 275467222..6e51b32f2 100644 --- a/jrc/jrc.c +++ b/jrc/jrc.c @@ -1,8 +1,8 @@ /* * Hamlib JRC backend - main file - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: jrc.c,v 1.11 2003-11-16 17:14:43 fillods Exp $ + * $Id: jrc.c,v 1.12 2004-05-19 08:57:45 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 @@ -28,6 +28,7 @@ #include #include /* String function definitions */ #include /* UNIX standard function definitions */ +#include #include "hamlib/rig.h" #include "serial.h" @@ -116,14 +117,14 @@ int jrc_close(RIG *rig) */ int jrc_set_freq(RIG *rig, vfo_t vfo, freq_t freq) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; char freqbuf[BUFSZ]; int freq_len; - /* max 10 digits */ - if (freq >= GHz(10)) - return -RIG_EINVAL; + if (freq >= (freq_t)pow(10, priv->max_freq_len)) + return -RIG_EINVAL; - freq_len = sprintf(freqbuf, "F%10Ld" EOM, (long long)freq); + freq_len = sprintf(freqbuf, "F%0*Ld" EOM, priv->max_freq_len, (long long)freq); return jrc_transaction (rig, freqbuf, freq_len, NULL, NULL); } @@ -134,23 +135,26 @@ int jrc_set_freq(RIG *rig, vfo_t vfo, freq_t freq) */ int jrc_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int freq_len, retval; char freqbuf[BUFSZ]; long long f; - retval = jrc_transaction (rig, "F" EOM, 2, freqbuf, &freq_len); + //note: JRCs use "I" to get information + retval = jrc_transaction (rig, "I" EOM, 2, freqbuf, &freq_len); if (retval != RIG_OK) - return retval; - - if (freq_len != 12) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_freq: wrong answer %s, " - "len=%d\n", freqbuf, freq_len); - return -RIG_ERJCTED; + return retval; + + //I command returns Iabdffffffffg + if (freqbuf[0] != 'I' || freq_len != priv->info_len) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_freq: wrong answer %s, " + "len=%d\n", freqbuf, freq_len); + return -RIG_ERJCTED; } - freqbuf[freq_len-1] = '\0'; + freqbuf[4+priv->max_freq_len] = '\0'; /* extract freq */ - sscanf(freqbuf+1, "%llu", &f); + sscanf(freqbuf+4, "%llu", &f); *freq = f; return RIG_OK; @@ -168,43 +172,109 @@ int jrc_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) const char *bandwidth; switch (mode) { - /* FIXME: WFM, MD_AMS and ECSS modes */ - case RIG_MODE_CW: amode = MD_CW; break; - case RIG_MODE_USB: amode = MD_USB; break; - case RIG_MODE_LSB: amode = MD_LSB; break; - case RIG_MODE_FM: amode = MD_FM; break; - case RIG_MODE_AM: amode = MD_AM; break; - case RIG_MODE_RTTY: amode = MD_RTTY; break; - case RIG_MODE_WFM: amode = MD_WFM; break; - default: - rig_debug(RIG_DEBUG_ERR, - "jrc_set_mode: unsupported mode %d\n", - mode); - return -RIG_EINVAL; + /* FIXME: ECSS modes */ + case RIG_MODE_CW: amode = MD_CW; break; + case RIG_MODE_USB: amode = MD_USB; break; + case RIG_MODE_LSB: amode = MD_LSB; break; + case RIG_MODE_FM: amode = MD_FM; break; + case RIG_MODE_AM: amode = MD_AM; break; + case RIG_MODE_RTTY: amode = MD_RTTY; break; + case RIG_MODE_WFM: amode = MD_WFM; break; + case RIG_MODE_AMS: amode = MD_AMS; break; + default: + rig_debug(RIG_DEBUG_ERR, + "jrc_set_mode: unsupported mode %d\n", mode); + return -RIG_EINVAL; } mdbuf_len = sprintf(mdbuf, "D" "%c" EOM, amode); retval = jrc_transaction (rig, mdbuf, mdbuf_len, NULL, NULL); if (retval != RIG_OK) - return retval; + return retval; - /* - * determine passband - */ - if (width != RIG_PASSBAND_NORMAL && - width < rig_passband_normal(rig, mode)) - bandwidth = "B2" EOM; /* narrow */ - else if (width != RIG_PASSBAND_NORMAL && - width > rig_passband_normal(rig, mode)) - bandwidth = "B0" EOM; /* wide */ - else - bandwidth = "B1" EOM; /* intermediate */ + if (width == RIG_PASSBAND_NORMAL) + width = rig_passband_normal(rig, mode); + + if (width <= s_Hz(1500)) + bandwidth = "B2" EOM; /*narr*/ + else if (width <= s_Hz(4000)) + bandwidth = "B1" EOM; /*inter*/ + else if (width <= s_Hz(9000)) + bandwidth = "B0" EOM; /*wide*/ + else if (rig->caps->rig_model == RIG_MODEL_NRD535) + bandwidth = "B3" EOM; /*aux - nrd535 only*/ + else + bandwidth = "B1" EOM; /*inter*/ retval = jrc_transaction (rig, bandwidth, 3, NULL, NULL); return retval; } +/* + * jrc_get_mode + * Assumes rig!=NULL, freq!=NULL + */ +int jrc_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) +{ + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; + int freq_len, retval; + char freqbuf[BUFSZ]; + char cmode; + char cwidth; + + //note: JRCs use "I" to get information + retval = jrc_transaction (rig, "I" EOM, 2, freqbuf, &freq_len); + if (retval != RIG_OK) + return retval; + + //I command returns Iabdffffffffg + if (freqbuf[0] != 'I' || freq_len != priv->info_len) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_mode: wrong answer %s, " + "len=%d\n", freqbuf, freq_len); + return -RIG_ERJCTED; + } + + /* extract width and mode */ + cwidth = freqbuf[2]; + cmode = freqbuf[3]; + + switch(cwidth) { + case '0' : *width = s_Hz(6000); break; //wide + case '1' : *width = s_Hz(2000); break; //inter + case '2' : *width = s_Hz(1000); break; //narr + case '3' : *width = s_Hz(12000); break; //aux - nrd535 only + default: + rig_debug(RIG_DEBUG_ERR, + "jrc_get_mode: unsupported width %c\n", + cwidth); + *width = RIG_PASSBAND_NORMAL; + return -RIG_EINVAL; + } + + switch(cmode) { + /* FIXME: FAX/AMS, and ECSS modes */ + case '0' : *mode = RIG_MODE_RTTY; break; + case '1' : *mode = RIG_MODE_CW; break; + case '2' : *mode = RIG_MODE_USB; break; + case '3' : *mode = RIG_MODE_LSB; break; + case '4' : *mode = RIG_MODE_AM; break; + case '5' : *mode = RIG_MODE_FM; break; + case '6' : *mode = RIG_MODE_AMS; break; //FAX on nrd535 + case '7' : *mode = RIG_MODE_AMS; break; //ECSS-USB + case '8' : *mode = RIG_MODE_AMS; break; //ECSS-LSB + case '9' : *mode = RIG_MODE_WFM; break; //nrd545 only + default: + rig_debug(RIG_DEBUG_ERR, + "jrc_get_mode: unsupported mode %c\n", + cmode); + *mode = RIG_MODE_NONE; + return -RIG_EINVAL; + } + + return RIG_OK; +} + /* * jrc_set_func * Assumes rig!=NULL @@ -220,7 +290,7 @@ int jrc_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) switch (func) { case RIG_FUNC_FAGC: /* FIXME: FAGC levels */ - cmd_len = sprintf(cmdbuf, "G%d" EOM, status?0:2); + cmd_len = sprintf(cmdbuf, "G%d" EOM, status?1:2); return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); @@ -263,6 +333,7 @@ int jrc_set_func(RIG *rig, vfo_t vfo, setting_t func, int status) */ int jrc_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int retval, func_len; char funcbuf[BUFSZ]; @@ -271,19 +342,22 @@ int jrc_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) */ switch (func) { case RIG_FUNC_FAGC: - /* FIXME: FAGC levels */ - retval = jrc_transaction (rig, "G" EOM, 2, funcbuf, &func_len); - if (retval != RIG_OK) - return retval; + /* FIXME: FAGC levels */ + //retval = jrc_transaction (rig, "G" EOM, 2, funcbuf, &func_len); + retval = jrc_transaction (rig, "I" EOM, 2, funcbuf, &func_len); + if (retval != RIG_OK) + return retval; - if (func_len != 3 || func_len != 6) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_func: wrong answer %s, " - "len=%d\n", funcbuf, func_len); - return -RIG_ERJCTED; - } - *status = funcbuf[1] != '2'; - - return RIG_OK; + //if (func_len != 3 || func_len != 6) { + if (funcbuf[0] != 'I' || func_len != priv->info_len) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_func: wrong answer %s, " + "len=%d\n", funcbuf, func_len); + return -RIG_ERJCTED; + } + //*status = funcbuf[1] != '2'; + *status = funcbuf[4+priv->max_freq_len] != '2'; + + return RIG_OK; case RIG_FUNC_NB: /* FIXME: NB1 and NB2 */ @@ -360,6 +434,7 @@ int jrc_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status) */ int jrc_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int cmd_len; char cmdbuf[BUFSZ]; @@ -368,39 +443,56 @@ int jrc_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) */ switch (level) { case RIG_LEVEL_ATT: - cmd_len = sprintf(cmdbuf, "A%d" EOM, val.i?1:0); + cmd_len = sprintf(cmdbuf, "A%d" EOM, val.i?1:0); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_LEVEL_RF: - cmd_len = sprintf(cmdbuf, "HH%03d" EOM, (int)(val.f*255.0)); + cmd_len = sprintf(cmdbuf, "HH%03d" EOM, (int)(val.f*255.0)); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_LEVEL_AF: - cmd_len = sprintf(cmdbuf, "JJ%03d" EOM, (int)(val.f*255.0)); + cmd_len = sprintf(cmdbuf, "JJ%03d" EOM, (int)(val.f*255.0)); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_LEVEL_SQL: - cmd_len = sprintf(cmdbuf, "JJ%03d" EOM, (int)(val.f*255.0)); + cmd_len = sprintf(cmdbuf, "JJ%03d" EOM, (int)(val.f*255.0)); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_LEVEL_NOTCHF: - cmd_len = sprintf(cmdbuf, "FF%+04d" EOM, val.i); + cmd_len = sprintf(cmdbuf, "FF%+04d" EOM, val.i); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_LEVEL_AGC: - cmd_len = sprintf(cmdbuf, "NN%03d" EOM, (int)(val.f*255.0)); + if (val.i < 10) + cmd_len = sprintf(cmdbuf, "G%d" EOM, + val.i == RIG_AGC_SLOW ? 0 : + val.i == RIG_AGC_FAST ? 1 : 2); + else + cmd_len = sprintf(cmdbuf, "G3%03d" EOM, val.i/20); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + case RIG_LEVEL_CWPITCH: + cmd_len = sprintf(cmdbuf, "%s%+05d" EOM, priv->cw_pitch, val.i); + + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + + case RIG_LEVEL_IF: + if (priv->pbs_len == 3) + val.i /= 10; + + cmd_len = sprintf(cmdbuf, "P%+0*d" EOM, priv->pbs_len+1, val.i); + + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); default: - rig_debug(RIG_DEBUG_ERR,"Unsupported set_level %d\n", level); - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR,"Unsupported set_level %d\n", level); + return -RIG_EINVAL; } return RIG_OK; @@ -413,117 +505,157 @@ int jrc_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) */ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int retval, lvl_len, lvl; char lvlbuf[BUFSZ]; + char cwbuf[BUFSZ]; + int cw_len; /* Optimize: * sort the switch cases with the most frequent first */ switch (level) { case RIG_LEVEL_RAWSTR: - /* read A/D converted value */ - retval = jrc_transaction (rig, "M" EOM, 2, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; - - if (lvl_len != 5) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - - lvlbuf[4] = '\0'; - val->i = atoi(lvlbuf+1); - break; - + /* read A/D converted value */ + retval = jrc_transaction (rig, "M" EOM, 2, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 5) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + + lvlbuf[4] = '\0'; + val->i = atoi(lvlbuf+1); + break; + case RIG_LEVEL_SQLSTAT: - return -RIG_ENIMPL; /* get_dcd ? */ + return -RIG_ENIMPL; /* get_dcd ? */ case RIG_LEVEL_ATT: - retval = jrc_transaction (rig, "A" EOM, 2, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; + //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) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } + //if (lvl_len != 3) { + 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; + } - val->i = lvlbuf[1] == '1' ? 20 : 0; - break; + val->i = lvlbuf[1] == '1' ? 20 : 0; + break; case RIG_LEVEL_RF: - retval = jrc_transaction (rig, "HH" EOM, 3, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; - - if (lvl_len != 6) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - /* - * 000..255 - */ - sscanf(lvlbuf+2, "%u", &lvl); - val->f = (float)lvl/255.0; - break; + retval = jrc_transaction (rig, "HH" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 6) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + /* + * 000..255 + */ + sscanf(lvlbuf+2, "%u", &lvl); + val->f = (float)lvl/255.0; + break; case RIG_LEVEL_AF: - retval = jrc_transaction (rig, "JJ" EOM, 3, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; - - if (lvl_len != 6) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - /* - * 000..255 - */ - sscanf(lvlbuf+2, "%u", &lvl); - val->f = (float)lvl/255.0; - break; - + retval = jrc_transaction (rig, "JJ" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 6) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + /* + * 000..255 + */ + sscanf(lvlbuf+2, "%u", &lvl); + val->f = (float)lvl/255.0; + break; + case RIG_LEVEL_SQL: - retval = jrc_transaction (rig, "LL" EOM, 3, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; - - if (lvl_len != 6) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - /* - * 000..255 - */ - sscanf(lvlbuf+2, "%u", &lvl); - val->f = (float)lvl/255.0; - break; - + retval = jrc_transaction (rig, "LL" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 6) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + /* + * 000..255 + */ + sscanf(lvlbuf+2, "%u", &lvl); + val->f = (float)lvl/255.0; + break; + case RIG_LEVEL_NOTCHF: - retval = jrc_transaction (rig, "GG" EOM, 3, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; + retval = jrc_transaction (rig, "GG" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 8) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + /* + * 000..255 + */ + sscanf(lvlbuf+2, "%d", &lvl); + val->f = (float)lvl/255.0; + break; - if (lvl_len != 8) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - /* - * 000..255 - */ - sscanf(lvlbuf+2, "%d", &lvl); - val->f = (float)lvl/255.0; - break; + case RIG_LEVEL_CWPITCH: + cw_len = sprintf(cwbuf, "%s" EOM, priv->cw_pitch); + + retval = jrc_transaction (rig, cwbuf, cw_len, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != cw_len+5) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_level: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + + sscanf(lvlbuf+(cw_len-1), "%05d", &lvl); + val->i = lvl; + break; + + case RIG_LEVEL_IF: + retval = jrc_transaction (rig, "P" EOM, 2, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + 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; + } + + sscanf(lvlbuf+1, "%d", &lvl); + if (priv->pbs_len == 3) + lvl *= 10; + + val->i = lvl; + break; default: - rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d\n", level); - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR,"Unsupported get_level %d\n", level); + return -RIG_EINVAL; } return RIG_OK; @@ -536,6 +668,7 @@ int jrc_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) */ int jrc_set_parm(RIG *rig, setting_t parm, value_t val) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; int cmd_len; char cmdbuf[BUFSZ]; int minutes; @@ -550,33 +683,34 @@ int jrc_set_parm(RIG *rig, setting_t parm, value_t val) return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); case RIG_PARM_BEEP: - cmd_len = sprintf(cmdbuf, "U%03d" EOM, val.i?101:100); - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + //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); case RIG_PARM_TIME: - minutes = val.i/60; - cmd_len = sprintf(cmdbuf, "R1%02d%02d" EOM, - minutes/60, minutes%60); - - return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); - + minutes = val.i/60; + cmd_len = sprintf(cmdbuf, "R1%02d%02d" EOM, + minutes/60, minutes%60); + + return jrc_transaction (rig, cmdbuf, cmd_len, NULL, NULL); + default: - rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm %d\n", parm); - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR,"Unsupported set_parm %d\n", parm); + return -RIG_EINVAL; } - + return RIG_OK; } - /* * jrc_get_parm * Assumes rig!=NULL, val!=NULL */ int jrc_get_parm(RIG *rig, setting_t parm, value_t *val) { - int retval, lvl_len, i; + int retval, lvl_len, i; char lvlbuf[BUFSZ]; /* Optimize: @@ -584,29 +718,43 @@ int jrc_get_parm(RIG *rig, setting_t parm, value_t *val) */ switch (parm) { case RIG_PARM_TIME: - retval = jrc_transaction (rig, "R0" EOM, 3, lvlbuf, &lvl_len); - if (retval != RIG_OK) - return retval; - - /* "Rhhmmss"CR */ - if (lvl_len != 7) { - rig_debug(RIG_DEBUG_ERR,"jrc_get_parm: wrong answer" - "len=%d\n", lvl_len); - return -RIG_ERJCTED; - } - - /* convert ASCII to numeric 0..9 */ - for (i=1; i<7; i++) { - lvlbuf[i] -= '0'; - } - val->i = ((10*lvlbuf[1] + lvlbuf[2])*60 + /* hours */ - 10*lvlbuf[3] + lvlbuf[4])*60 + /* minutes */ - 10*lvlbuf[5] + lvlbuf[6]; /* secondes */ - break; + retval = jrc_transaction (rig, "R0" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + /* "Rhhmmss"CR */ + if (lvl_len != 8) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_parm: wrong answer" + "len=%d\n", lvl_len); + return -RIG_ERJCTED; + } + + /* convert ASCII to numeric 0..9 */ + for (i=1; i<7; i++) { + lvlbuf[i] -= '0'; + } + val->i = ((10*lvlbuf[1] + lvlbuf[2])*60 + /* hours */ + 10*lvlbuf[3] + lvlbuf[4])*60 + /* minutes */ + 10*lvlbuf[5] + lvlbuf[6]; /* secondes */ + break; + + case RIG_PARM_BEEP: + retval = jrc_transaction (rig, "U9" EOM, 3, lvlbuf, &lvl_len); + if (retval != RIG_OK) + return retval; + + if (lvl_len != 4) { + 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; + break; + default: - rig_debug(RIG_DEBUG_ERR,"Unsupported get_parm %d\n", parm); - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR,"Unsupported get_parm %d\n", parm); + return -RIG_EINVAL; } return RIG_OK; @@ -697,8 +845,8 @@ int jrc_set_mem(RIG *rig, vfo_t vfo, int ch) char membuf[BUFSZ]; int cmd_len, mem_len; - if (ch < 0 || ch > 999) - return -RIG_EINVAL; + if (ch < 0 || ch > rig->caps->chan_list[0].end) + return -RIG_EINVAL; cmd_len = sprintf(cmdbuf, "C%03u" EOM, ch); @@ -707,6 +855,35 @@ int jrc_set_mem(RIG *rig, vfo_t vfo, int ch) return jrc_transaction (rig, cmdbuf, cmd_len, membuf, &mem_len); } +/* + * jrc_get_mem + * Assumes rig!=NULL + */ +int jrc_get_mem(RIG *rig, vfo_t vfo, int *ch) +{ + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; + int mem_len, retval; + char membuf[BUFSZ]; + int chan; + + retval = jrc_transaction (rig, "L" EOM, 2, membuf, &mem_len); + if (retval != RIG_OK) + return retval; + + if (mem_len != priv->mem_len) { + rig_debug(RIG_DEBUG_ERR,"jrc_get_mem: wrong answer %s, " + "len=%d\n", membuf, mem_len); + return -RIG_ERJCTED; + } + membuf[4] = '\0'; + + /*extract current channel*/ + sscanf(membuf+1, "%d", &chan); + *ch = chan; + + return RIG_OK; +} + /* * jrc_vfo_op * Assumes rig!=NULL @@ -759,19 +936,19 @@ static int jrc2rig_mode(RIG *rig, char jmode, char jwidth, rmode_t *mode, pbwidth_t *width) { switch (jmode) { - case MD_CW: *mode = RIG_MODE_CW; break; + case MD_CW: *mode = RIG_MODE_CW; break; case MD_USB: *mode = RIG_MODE_USB; break; case MD_LSB: *mode = RIG_MODE_LSB; break; - case MD_FM: *mode = RIG_MODE_FM; break; - case MD_AM: *mode = RIG_MODE_AM; break; + case MD_FM: *mode = RIG_MODE_FM; break; + case MD_AM: *mode = RIG_MODE_AM; break; case MD_RTTY: *mode = RIG_MODE_RTTY; break; case MD_WFM: *mode = RIG_MODE_WFM; break; default: - rig_debug(RIG_DEBUG_ERR, - "jrc_set_mode: unsupported mode %c\n", - jmode); - *mode = RIG_MODE_NONE; - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR, + "jrc_set_mode: unsupported mode %c\n", + jmode); + *mode = RIG_MODE_NONE; + return -RIG_EINVAL; } /* @@ -779,20 +956,20 @@ static int jrc2rig_mode(RIG *rig, char jmode, char jwidth, */ switch (jwidth) { case '0': - *width = rig_passband_wide(rig, *mode); - break; + *width = rig_passband_wide(rig, *mode); + break; case '1': - *width = rig_passband_normal(rig, *mode); - break; + *width = rig_passband_normal(rig, *mode); + break; case '2': - *width = rig_passband_narrow(rig, *mode); - break; + *width = rig_passband_narrow(rig, *mode); + break; default: - rig_debug(RIG_DEBUG_ERR, - "jrc_set_mode: unsupported width %c\n", - jwidth); - *width = RIG_PASSBAND_NORMAL; - return -RIG_EINVAL; + rig_debug(RIG_DEBUG_ERR, + "jrc_set_mode: unsupported width %c\n", + jwidth); + *width = RIG_PASSBAND_NORMAL; + return -RIG_EINVAL; } return RIG_OK; @@ -804,6 +981,7 @@ static int jrc2rig_mode(RIG *rig, char jmode, char jwidth, */ int jrc_decode_event(RIG *rig) { + struct jrc_priv_caps *priv = (struct jrc_priv_caps*)rig->caps->priv; struct rig_state *rs; freq_t freq; rmode_t mode; @@ -816,18 +994,19 @@ int jrc_decode_event(RIG *rig) rs = &rig->state; /* "Iabdfg"CR */ -#define SETUP_STATUS_LEN 17 + //#define SETUP_STATUS_LEN 17 - count = read_string(&rs->rigport, buf, SETUP_STATUS_LEN, "", 0); + //count = read_string(&rs->rigport, buf, SETUP_STATUS_LEN, "", 0); + count = read_string(&rs->rigport, buf, priv->info_len, "", 0); if (count < 0) { - return count; + return count; } buf[31] = '\0'; /* stop run away.. */ if (buf[0] != 'I') { - rig_debug(RIG_DEBUG_WARN, "jrc: unexpected data: %s\n", - buf); - return -RIG_EPROTO; + rig_debug(RIG_DEBUG_WARN, "jrc: unexpected data: %s\n", + buf); + return -RIG_EPROTO; } /* @@ -835,21 +1014,22 @@ int jrc_decode_event(RIG *rig) */ if (rig->callbacks.freq_event) { - long long f; - - buf[14] = '\0'; /* side-effect: destroy AGC first digit! */ - sscanf(buf+4, "%lld", &f); - freq = f; - return rig->callbacks.freq_event(rig, RIG_VFO_CURR, freq, - rig->callbacks.freq_arg); + long long f; + + //buf[14] = '\0'; /* side-effect: destroy AGC first digit! */ + buf[4+priv->max_freq_len] = '\0'; /* side-effect: destroy AGC first digit! */ + sscanf(buf+4, "%lld", &f); + freq = f; + return rig->callbacks.freq_event(rig, RIG_VFO_CURR, freq, + rig->callbacks.freq_arg); } - + if (rig->callbacks.mode_event) { - jrc2rig_mode(rig, buf[3], buf[2], &mode, &width); - return rig->callbacks.mode_event(rig, RIG_VFO_CURR, mode, width, - rig->callbacks.freq_arg); + jrc2rig_mode(rig, buf[3], buf[2], &mode, &width); + return rig->callbacks.mode_event(rig, RIG_VFO_CURR, mode, width, + rig->callbacks.freq_arg); } - + return RIG_OK; } diff --git a/jrc/jrc.h b/jrc/jrc.h index 6685e576a..094ac07e6 100644 --- a/jrc/jrc.h +++ b/jrc/jrc.h @@ -1,8 +1,8 @@ /* * Hamlib JRC backend - main header - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: jrc.h,v 1.6 2003-11-16 17:14:43 fillods Exp $ + * $Id: jrc.h,v 1.7 2004-05-19 08:57:50 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 @@ -25,11 +25,23 @@ #include +struct jrc_priv_caps { + int max_freq_len; + int info_len; + int mem_len; + int pbs_info_len; + int pbs_len; + int beep; + int beep_len; + const char * cw_pitch; +}; + int jrc_open(RIG *rig); int jrc_close(RIG *rig); int jrc_set_freq(RIG *rig, vfo_t vfo, freq_t freq); int jrc_get_freq(RIG *rig, vfo_t vfo, freq_t *freq); int jrc_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); +int jrc_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); int jrc_set_func(RIG *rig, vfo_t vfo, setting_t func, int status); int jrc_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status); int jrc_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); @@ -39,6 +51,7 @@ int jrc_get_parm(RIG *rig, setting_t parm, value_t *val); int jrc_get_dcd(RIG *rig, vfo_t vfo, dcd_t *dcd); 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_reset(RIG *rig, reset_t reset); int jrc_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op); diff --git a/jrc/nrd535.c b/jrc/nrd535.c index 86698ac47..5d9113e81 100644 --- a/jrc/nrd535.c +++ b/jrc/nrd535.c @@ -1,8 +1,8 @@ /* * Hamlib JRC backend - NRD-535 DSP description - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: nrd535.c,v 1.2 2003-12-08 08:39:05 fillods Exp $ + * $Id: nrd535.c,v 1.3 2004-05-19 08:57:50 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 @@ -33,12 +33,12 @@ #define NRD535_MODES (RIG_MODE_AM|RIG_MODE_CW|RIG_MODE_SSB|RIG_MODE_FM|RIG_MODE_RTTY) /* + FAX */ -#define NRD535_FUNC (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_LOCK|RIG_FUNC_ABM|RIG_FUNC_BC|RIG_FUNC_NR) +#define NRD535_FUNC (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_ABM) -#define NRD535_LEVEL (RIG_LEVEL_SQLSTAT|RIG_LEVEL_RAWSTR|RIG_LEVEL_RF|RIG_LEVEL_AF|RIG_LEVEL_AGC|RIG_LEVEL_IF|RIG_LEVEL_NR|RIG_LEVEL_NOTCHF|RIG_LEVEL_SQL) +#define NRD535_LEVEL (RIG_LEVEL_RAWSTR|RIG_LEVEL_ATT|RIG_LEVEL_IF|RIG_LEVEL_AGC|RIG_LEVEL_CWPITCH) /* FIXME: add more from "U" command */ -#define NRD535_PARM (RIG_PARM_TIME|RIG_PARM_BACKLIGHT|RIG_PARM_BEEP) +#define NRD535_PARM (RIG_PARM_TIME|RIG_PARM_BEEP) #define NRD535_VFO (RIG_VFO_A) @@ -66,20 +66,32 @@ .freq = 1, \ .mode = 1, \ .width = 1, \ + .funcs = RIG_FUNC_FAGC, \ .levels = RIG_LEVEL_ATT|RIG_LEVEL_AGC, \ } +static const struct jrc_priv_caps nrd535_priv_caps = { + .max_freq_len = 8, + .info_len = 14, + .mem_len = 17, + .pbs_info_len = 7, + .pbs_len = 4, + .beep = 90, + .beep_len = 2, + .cw_pitch = "U2" +}; + /* * NRD-535 rig capabilities. * */ const struct rig_caps nrd535_caps = { .rig_model = RIG_MODEL_NRD535, -.model_name = "NRD-535 DSP", +.model_name = "NRD-535D", .mfg_name = "JRC", -.version = "0.1", +.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, @@ -91,7 +103,7 @@ const struct rig_caps nrd535_caps = { .serial_parity = RIG_PARITY_NONE, .serial_handshake = RIG_HANDSHAKE_NONE, .write_delay = 0, -.post_write_delay = 0, +.post_write_delay = 10, .timeout = 200, .retry = 3, @@ -118,6 +130,7 @@ const struct rig_caps nrd535_caps = { .scan_ops = RIG_SCAN_STOP|RIG_SCAN_SLCT, .bank_qty = 0, .chan_desc_sz = 0, +.priv = (void*)&nrd535_priv_caps, .chan_list = { { 0, 199, RIG_MTYPE_MEM, NRD535_MEM_CAP }, @@ -143,10 +156,10 @@ const struct rig_caps nrd535_caps = { }, /* mode/filter list, .remember = order matters! */ .filters = { - {RIG_MODE_AM|RIG_MODE_FM, kHz(12)}, + {RIG_MODE_FM, kHz(12)}, {NRD535_MODES, kHz(2)}, {NRD535_MODES, kHz(1)}, - {NRD535_MODES, kHz(4)}, + {NRD535_MODES, kHz(6)}, RIG_FLT_END, }, .str_cal = NRD535_STR_CAL, @@ -156,6 +169,7 @@ const struct rig_caps nrd535_caps = { .set_freq = jrc_set_freq, .get_freq = jrc_get_freq, .set_mode = jrc_set_mode, +.get_mode = jrc_get_mode, .set_func = jrc_set_func, .get_func = jrc_get_func, .set_level = jrc_set_level, @@ -166,6 +180,7 @@ const struct rig_caps nrd535_caps = { .set_trn = jrc_set_trn, .reset = jrc_reset, .set_mem = jrc_set_mem, +.get_mem = jrc_get_mem, .vfo_op = jrc_vfo_op, .scan = jrc_scan, .set_powerstat = jrc_set_powerstat, diff --git a/jrc/nrd545.c b/jrc/nrd545.c index 6016daf85..5cfe8ffad 100644 --- a/jrc/nrd545.c +++ b/jrc/nrd545.c @@ -1,8 +1,8 @@ /* * Hamlib JRC backend - NRD-545 DSP description - * Copyright (c) 2001-2003 by Stephane Fillod + * Copyright (c) 2001-2004 by Stephane Fillod * - * $Id: nrd545.c,v 1.7 2003-12-08 08:39:06 fillods Exp $ + * $Id: nrd545.c,v 1.8 2004-05-19 08:57:50 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 @@ -35,7 +35,7 @@ #define NRD545_FUNC (RIG_FUNC_FAGC|RIG_FUNC_NB|RIG_FUNC_LOCK|RIG_FUNC_ABM|RIG_FUNC_BC|RIG_FUNC_NR) -#define NRD545_LEVEL (RIG_LEVEL_SQLSTAT|RIG_LEVEL_RAWSTR|RIG_LEVEL_RF|RIG_LEVEL_AF|RIG_LEVEL_AGC|RIG_LEVEL_IF|RIG_LEVEL_NR|RIG_LEVEL_NOTCHF|RIG_LEVEL_SQL) +#define NRD545_LEVEL (RIG_LEVEL_SQLSTAT|RIG_LEVEL_RAWSTR|RIG_LEVEL_ATT|RIG_LEVEL_RF|RIG_LEVEL_AF|RIG_LEVEL_AGC|RIG_LEVEL_IF|RIG_LEVEL_NR|RIG_LEVEL_NOTCHF|RIG_LEVEL_SQL|RIG_LEVEL_IF|RIG_LEVEL_CWPITCH) /* FIXME: add more from "U" command */ #define NRD545_PARM (RIG_PARM_TIME|RIG_PARM_BACKLIGHT|RIG_PARM_BEEP) @@ -50,6 +50,29 @@ { 255, 60 }, \ } } +/* + * channel caps. + */ +#define NRD545_MEM_CAP { \ + .freq = 1, \ + .mode = 1, \ + .width = 1, \ + .levels = RIG_LEVEL_ATT|RIG_LEVEL_AGC, \ +} + + +static const struct jrc_priv_caps nrd545_priv_caps = { + .max_freq_len = 10, + .info_len = 18, + .mem_len = 21, + .pbs_info_len = 6, + .pbs_len = 3, + .beep = 100, + .beep_len = 3, + .cw_pitch = "U14" +}; + + /* * NRD-545 rig capabilities. * @@ -58,7 +81,7 @@ const struct rig_caps nrd545_caps = { .rig_model = RIG_MODEL_NRD545, .model_name = "NRD-545 DSP", .mfg_name = "JRC", -.version = "0.1", +.version = "0.2", .copyright = "LGPL", .status = RIG_STATUS_UNTESTED, .rig_type = RIG_TYPE_RECEIVER, @@ -99,11 +122,12 @@ const struct rig_caps nrd545_caps = { .scan_ops = RIG_SCAN_STOP|RIG_SCAN_SLCT, .bank_qty = 0, .chan_desc_sz = 0, +.priv = (void*)&nrd545_priv_caps, .chan_list = { - { 0, 999, RIG_MTYPE_MEM }, - RIG_CHAN_END, - }, + { 0, 999, RIG_MTYPE_MEM, NRD545_MEM_CAP }, + RIG_CHAN_END, + }, .rx_range_list1 = { RIG_FRNG_END, }, /* FIXME: enter region 1 setting */ .tx_range_list1 = { RIG_FRNG_END, }, @@ -144,6 +168,7 @@ const struct rig_caps nrd545_caps = { .set_freq = jrc_set_freq, .get_freq = jrc_get_freq, .set_mode = jrc_set_mode, +.get_mode = jrc_get_mode, .set_func = jrc_set_func, .get_func = jrc_get_func, .set_level = jrc_set_level, @@ -154,6 +179,7 @@ const struct rig_caps nrd545_caps = { .set_trn = jrc_set_trn, .reset = jrc_reset, .set_mem = jrc_set_mem, +.get_mem = jrc_get_mem, .vfo_op = jrc_vfo_op, .scan = jrc_scan, .set_powerstat = jrc_set_powerstat,