diff --git a/aor/aor.c b/aor/aor.c index ff97f6233..390b8b868 100644 --- a/aor/aor.c +++ b/aor/aor.c @@ -2,7 +2,7 @@ * Hamlib AOR backend - main file * Copyright (c) 2000-2003 by Stephane Fillod * - * $Id: aor.c,v 1.21 2003-02-13 22:17:44 fillods Exp $ + * $Id: aor.c,v 1.22 2003-02-24 22:27:40 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 @@ -47,7 +47,7 @@ * Is \r portable enough? */ #define CR '\r' -#define EOM "\x0a" +#define EOM "\r" #define BUFSZ 64 @@ -154,6 +154,12 @@ int aor_get_freq(RIG *rig, vfo_t vfo, freq_t *freq) return retval; rfp = strstr(freqbuf, "RF"); + if (!rfp) { + rig_debug(RIG_DEBUG_WARN, "NO RF in returned string in aor_get_freq: '%s'\n", + freqbuf); + return -RIG_EPROTO; + } + sscanf(rfp+2,"%lld", freq); return RIG_OK; @@ -332,6 +338,104 @@ int aor_set_ts(RIG *rig, vfo_t vfo, shortfreq_t ts) return aor_transaction (rig, tsbuf, ts_len, ackbuf, &ack_len); } + +/* + * aor_set_level + * Assumes rig!=NULL, rig->state.priv!=NULL + */ +int aor_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val) +{ + struct aor_priv_data *priv; + struct rig_state *rs; + unsigned char lvlbuf[BUFSZ],ackbuf[BUFSZ]; + int lvl_len, ack_len; + unsigned i; + + rs = &rig->state; + priv = (struct aor_priv_data*)rs->priv; + + + switch (level) { + case RIG_LEVEL_ATT: + { + unsigned att = 0; + for (i=0; iattenuator[i]); i++) { + if (rs->attenuator[i] == val.i) { + att = i+1; + break; + } + } + /* should be catched by the front end */ + if (i>=MAXDBLSTSIZ || RIG_IS_DBLST_END(rs->attenuator[i])) + return -RIG_EINVAL; + + lvl_len = sprintf(lvlbuf, "AT%u" EOM, att); + break; + } + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported aor_set_level %d", level); + return -RIG_EINVAL; + } + + return aor_transaction (rig, lvlbuf, lvl_len, ackbuf, &ack_len); +} + +/* + * aor_get_level + * Assumes rig!=NULL, rig->state.priv!=NULL, val!=NULL + */ +int aor_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val) +{ + struct aor_priv_data *priv; + struct rig_state *rs; + unsigned char lvlbuf[BUFSZ],ackbuf[BUFSZ]; + int lvl_len, ack_len, retval; + + rs = &rig->state; + priv = (struct aor_priv_data*)rs->priv; + + switch (level) { + case RIG_LEVEL_ATT: + lvl_len = sprintf(lvlbuf, "AT" EOM); + break; + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported aor_set_level %d", level); + return -RIG_EINVAL; + } + + retval = aor_transaction (rig, lvlbuf, lvl_len, ackbuf, &ack_len); + + if (retval != RIG_OK) + return retval; + + switch (level) { + case RIG_LEVEL_ATT: + { + unsigned att; + if (ack_len < 4 || ackbuf[0] != 'A' || ackbuf[1] != 'T') + return -RIG_EPROTO; + att = ackbuf[3]-'0'; + if (att == 0) { + val->i = 0; + break; + } + if (att > MAXDBLSTSIZ || rs->attenuator[att-1]==0) { + rig_debug(RIG_DEBUG_ERR,"Unsupported att aor_get_level %d", + att); + return -RIG_EPROTO; + } + val->i = rs->attenuator[att-1]; + break; + } + default: + rig_debug(RIG_DEBUG_ERR,"Unsupported aor_get_level %d", level); + return -RIG_EINVAL; + } + + return RIG_OK; +} + + /* * aor_set_powerstat * Assumes rig!=NULL, rig->state.priv!=NULL @@ -415,4 +519,3 @@ int initrigs_aor(void *be_handle) return RIG_OK; } - diff --git a/aor/aor.h b/aor/aor.h index 5209435ed..eb8bddda9 100644 --- a/aor/aor.h +++ b/aor/aor.h @@ -2,7 +2,7 @@ * Hamlib AOR backend - main header * Copyright (c) 2000-2003 by Stephane Fillod * - * $Id: aor.h,v 1.12 2003-02-13 22:17:44 fillods Exp $ + * $Id: aor.h,v 1.13 2003-02-24 22:27:41 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,6 +34,9 @@ int aor_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); int aor_set_vfo(RIG *rig, vfo_t vfo); int aor_get_vfo(RIG *rig, vfo_t *vfo); +int aor_set_level(RIG *rig, vfo_t vfo, setting_t level, value_t val); +int aor_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val); + int aor_set_ts(RIG *rig, vfo_t vfo, shortfreq_t ts); int aor_set_powerstat(RIG *rig, powerstat_t status); int aor_vfo_op(RIG *rig, vfo_t vfo, vfo_op_t op); diff --git a/aor/ar5000.c b/aor/ar5000.c index d169b8200..236d69a64 100644 --- a/aor/ar5000.c +++ b/aor/ar5000.c @@ -1,8 +1,8 @@ /* * Hamlib AOR backend - AR5000 description - * Copyright (c) 2000-2002 by Stephane Fillod + * Copyright (c) 2000-2003 by Stephane Fillod * - * $Id: ar5000.c,v 1.2 2002-08-16 17:43:01 fillods Exp $ + * $Id: ar5000.c,v 1.3 2003-02-24 22:27:41 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 @@ -24,6 +24,7 @@ #include "config.h" #endif +#include #include #include "aor.h" @@ -36,10 +37,55 @@ #define AR5000_PARM (RIG_PARM_APO|RIG_PARM_BACKLIGHT|RIG_PARM_BEEP) -#define AR5000_VFO_OPS (RIG_OP_MCL|RIG_OP_UP|RIG_OP_DOWN|RIG_OP_LEFT|RIG_OP_RIGHT) +#define AR5000_VFO_OPS (RIG_OP_UP|RIG_OP_DOWN) #define AR5000_VFO (RIG_VFO_A|RIG_VFO_B) +/* + * Data was obtained from AR5000 pdf on http://www.aoruk.com + */ +#define dBm2S(x) (x) /* FIXME */ + +#define AR5000_REAL_STR_CAL { 33, \ + { \ + { 0x02, dBm2S(-120) }, \ + { 0x06, dBm2S(-111) }, \ + { 0x0b, dBm2S(-110) }, \ + { 0x14, dBm2S(-109) }, \ + { 0x1d, dBm2S(-108) }, \ + { 0x25, dBm2S(-107) }, \ + { 0x2b, dBm2S(-106) }, \ + { 0x32, dBm2S(-105) }, \ + { 0x38, dBm2S(-104) }, \ + { 0x3d, dBm2S(-103) }, \ + { 0x43, dBm2S(-102) }, \ + { 0x49, dBm2S(-101) }, \ + { 0x4e, dBm2S(-100) }, \ + { 0x63, dBm2S(-95) }, \ + { 0x71, dBm2S(-90) }, \ + { 0x7f, dBm2S(-85) }, \ + { 0x8b, dBm2S(-80) }, \ + { 0x96, dBm2S(-75) }, \ + { 0xa0, dBm2S(-70) }, \ + { 0xaa, dBm2S(-65) }, \ + { 0xb3, dBm2S(-60) }, \ + { 0xbd, dBm2S(-55) }, \ + { 0xc6, dBm2S(-50) }, \ + { 0xce, dBm2S(-45) }, \ + { 0xd7, dBm2S(-40) }, \ + { 0xe0, dBm2S(-35) }, \ + { 0xe8, dBm2S(-30) }, \ + { 0xf1, dBm2S(-25) }, \ + { 0xf8, dBm2S(-20) }, \ + { 0xfa, dBm2S(-15) }, \ + { 0xfb, dBm2S(-10) }, \ + { 0xfc, dBm2S(-5) }, \ + { 0xfd, dBm2S(0) }, \ + } } + +static int ar5k_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width); +static int ar5k_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width); + /* * ar5000 rig capabilities. * Notice that some rigs share the same functions. @@ -51,9 +97,9 @@ const struct rig_caps ar5000_caps = { .rig_model = RIG_MODEL_AR5000, .model_name = "AR5000", .mfg_name = "AOR", -.version = "0.1", +.version = "0.1.1", .copyright = "LGPL", -.status = RIG_STATUS_UNTESTED, +.status = RIG_STATUS_ALPHA, .rig_type = RIG_TYPE_SCANNER, .ptt_type = RIG_PTT_NONE, .dcd_type = RIG_DCD_NONE, @@ -79,7 +125,7 @@ const struct rig_caps ar5000_caps = { .ctcss_list = NULL, /* FIXME: CTCSS list */ .dcs_list = NULL, .preamp = { RIG_DBLST_END, }, -.attenuator = { 20, RIG_DBLST_END, }, /* TBC */ +.attenuator = { 10, 20, RIG_DBLST_END, }, .max_rit = Hz(0), .max_xit = Hz(0), .max_ifshift = Hz(0), @@ -148,11 +194,14 @@ const struct rig_caps ar5000_caps = { .set_freq = aor_set_freq, .get_freq = aor_get_freq, -.set_mode = aor_set_mode, -.get_mode = aor_get_mode, +.set_mode = ar5k_set_mode, +.get_mode = ar5k_get_mode, .set_vfo = aor_set_vfo, .get_vfo = aor_get_vfo, +.set_level = aor_set_level, +.get_level = aor_get_level, + .set_ts = aor_set_ts, .set_powerstat = aor_set_powerstat, .vfo_op = aor_vfo_op, @@ -165,3 +214,92 @@ const struct rig_caps ar5000_caps = { */ +/* + * acknowledge is CR + * Is \r portable enough? + */ +#define CR '\r' +#define EOM "\r" + +#define BUFSZ 64 + +/* + * modes in use by the "MD" command + */ +#define MD_FM '0' +#define MD_AM '1' +#define MD_LSB '2' +#define MD_USB '3' +#define MD_CW '4' + + +extern int aor_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len); + +/* + * aor_set_mode + * Assumes rig!=NULL + */ +int ar5k_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width) +{ + unsigned char mdbuf[BUFSZ],ackbuf[BUFSZ]; + int mdbuf_len, ack_len, aormode, retval; + + switch (mode) { + case RIG_MODE_FM: aormode = MD_FM; break; + case RIG_MODE_AM: aormode = MD_AM; break; + case RIG_MODE_CW: aormode = MD_CW; break; + case RIG_MODE_USB: aormode = MD_USB; break; + case RIG_MODE_LSB: aormode = MD_LSB; break; + default: + rig_debug(RIG_DEBUG_ERR,"%s: unsupported mode %d\n", + __FUNCTION__,mode); + return -RIG_EINVAL; + } + + mdbuf_len = sprintf(mdbuf, "MD%c" EOM, aormode); + retval = aor_transaction (rig, mdbuf, mdbuf_len, ackbuf, &ack_len); + + return retval; +} + +/* + * aor_get_mode + * Assumes rig!=NULL, mode!=NULL + */ +int ar5k_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width) +{ + unsigned char ackbuf[BUFSZ]; + int ack_len, retval; + char *rfp; + + + retval = aor_transaction (rig, "MD" EOM, strlen("MD" EOM), ackbuf, &ack_len); + if (retval != RIG_OK) + return retval; + + rfp = strstr(ackbuf, "MD"); + if (!rfp) { + rig_debug(RIG_DEBUG_WARN, "No MD in returned string in %s: '%s'\n", + __FUNCTION__, ackbuf); + return -RIG_EPROTO; + } + + *width = RIG_PASSBAND_NORMAL; + switch (rfp[2]) { + case MD_AM: *mode = RIG_MODE_AM; break; + case MD_CW: *mode = RIG_MODE_CW; break; + case MD_FM: *mode = RIG_MODE_FM; break; + case MD_USB: *mode = RIG_MODE_USB; break; + case MD_LSB: *mode = RIG_MODE_LSB; break; + default: + rig_debug(RIG_DEBUG_ERR,"%s: unsupported mode %d\n", + __FUNCTION__, rfp[2]); + return -RIG_EINVAL; + } + if (*width == RIG_PASSBAND_NORMAL) + *width = rig_passband_normal(rig, *mode); + + return RIG_OK; +} + +