refactor mode/width parsing among aor models, and update AR5000 caps

git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@2015 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.5
Stéphane Fillod, F8CFE 2005-04-15 17:48:41 +00:00
rodzic ae731ac9bd
commit f3f29c4b7a
4 zmienionych plików z 183 dodań i 119 usunięć

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib AOR backend - main file
* Copyright (c) 2000-2005 by Stephane Fillod
*
* $Id: aor.c,v 1.34 2005-04-10 20:59:30 fillods Exp $
* $Id: aor.c,v 1.35 2005-04-15 17:48: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
@ -51,17 +51,17 @@
#define BUFSZ 256
/*
* modes in use by the "MD" command
* modes in use by the "MD" command of AR8000 and AR8200
*/
#define MD_WFM '0'
#define MD_NFM '1'
#define MD_AM '2'
#define MD_USB '3'
#define MD_LSB '4'
#define MD_CW '5'
#define MD_SFM '6'
#define MD_WAM '7'
#define MD_NAM '8'
#define AR8K_WFM '0'
#define AR8K_NFM '1'
#define AR8K_AM '2'
#define AR8K_USB '3'
#define AR8K_LSB '4'
#define AR8K_CW '5'
#define AR8K_SFM '6'
#define AR8K_WAM '7'
#define AR8K_NAM '8'
/*
@ -71,7 +71,7 @@
* return value: RIG_OK if everything's fine, negative value otherwise
* TODO: error case handling
*/
int aor_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len)
static int aor_transaction(RIG *rig, const char *cmd, int cmd_len, char *data, int *data_len)
{
int retval;
struct rig_state *rs;
@ -235,7 +235,7 @@ int aor_get_vfo(RIG *rig, vfo_t *vfo)
return RIG_OK;
}
static int format_mode(char *buf, rmode_t mode, pbwidth_t width)
int format8k_mode(RIG *rig, char *buf, rmode_t mode, pbwidth_t width)
{
int aormode;
@ -243,10 +243,10 @@ static int format_mode(char *buf, rmode_t mode, pbwidth_t width)
case RIG_MODE_AM:
switch(width) {
case RIG_PASSBAND_NORMAL:
case s_kHz(9): aormode = MD_AM; break;
case s_kHz(9): aormode = AR8K_AM; break;
case s_kHz(12): aormode = MD_WAM; break;
case s_kHz(3): aormode = MD_NAM; break;
case s_kHz(12): aormode = AR8K_WAM; break;
case s_kHz(3): aormode = AR8K_NAM; break;
default:
rig_debug(RIG_DEBUG_ERR,
"%s: unsupported passband %d %d\n",
@ -255,16 +255,16 @@ static int format_mode(char *buf, rmode_t mode, pbwidth_t width)
return -RIG_EINVAL;
}
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;
case RIG_MODE_WFM: aormode = MD_WFM; break;
case RIG_MODE_CW: aormode = AR8K_CW; break;
case RIG_MODE_USB: aormode = AR8K_USB; break;
case RIG_MODE_LSB: aormode = AR8K_LSB; break;
case RIG_MODE_WFM: aormode = AR8K_WFM; break;
case RIG_MODE_FM:
switch(width) {
case RIG_PASSBAND_NORMAL:
case s_kHz(12): aormode = MD_NFM; break;
case s_kHz(12): aormode = AR8K_NFM; break;
case s_kHz(9): aormode = MD_SFM; break;
case s_kHz(9): aormode = AR8K_SFM; break;
default:
rig_debug(RIG_DEBUG_ERR,
"%s: unsupported passband %d %d\n",
@ -288,10 +288,11 @@ static int format_mode(char *buf, rmode_t mode, pbwidth_t width)
*/
int aor_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
{
struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv;
unsigned char mdbuf[BUFSZ];
int mdbuf_len, retval;
mdbuf_len = format_mode(mdbuf, mode, width);
mdbuf_len = priv->format_mode(rig, mdbuf, mode, width);
strcpy(mdbuf+mdbuf_len, EOM);
mdbuf_len += strlen(EOM);
@ -301,25 +302,29 @@ int aor_set_mode(RIG *rig, vfo_t vfo, rmode_t mode, pbwidth_t width)
return retval;
}
static int parse_aor_mode(RIG *rig, char aormode, rmode_t *mode, pbwidth_t *width)
/*
* parse8k_aor_mode * don't care about aorwidth,
* because there's no such BW command
*/
int parse8k_aor_mode(RIG *rig, char aormode, char aorwidth, rmode_t *mode, pbwidth_t *width)
{
*width = RIG_PASSBAND_NORMAL;
switch (aormode) {
case MD_AM: *mode = RIG_MODE_AM; break;
case MD_NAM:
case AR8K_AM: *mode = RIG_MODE_AM; break;
case AR8K_NAM:
*mode = RIG_MODE_AM;
*width = rig_passband_narrow(rig, *mode);
break;
case MD_WAM:
case AR8K_WAM:
*mode = RIG_MODE_AM;
*width = rig_passband_wide(rig, *mode);
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_WFM: *mode = RIG_MODE_WFM; break;
case MD_NFM: *mode = RIG_MODE_FM; break;
case MD_SFM:
case AR8K_CW: *mode = RIG_MODE_CW; break;
case AR8K_USB: *mode = RIG_MODE_USB; break;
case AR8K_LSB: *mode = RIG_MODE_LSB; break;
case AR8K_WFM: *mode = RIG_MODE_WFM; break;
case AR8K_NFM: *mode = RIG_MODE_FM; break;
case AR8K_SFM:
*mode = RIG_MODE_FM;
*width = rig_passband_narrow(rig, *mode);
break;
@ -334,14 +339,17 @@ static int parse_aor_mode(RIG *rig, char aormode, rmode_t *mode, pbwidth_t *widt
return RIG_OK;
}
/*
* aor_get_mode
* Assumes rig!=NULL, mode!=NULL
*/
int aor_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
{
struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv;
unsigned char ackbuf[BUFSZ], *mdp;
int ack_len, retval;
unsigned char ackbuf2[BUFSZ], *mdp2;
int ack_len, ack2_len, retval;
retval = aor_transaction (rig, "MD" EOM, 3, ackbuf, &ack_len);
@ -359,7 +367,16 @@ int aor_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
return -RIG_EPROTO;
}
retval = parse_aor_mode(rig, mdp[2], mode, width);
if (rig->caps->rig_model == RIG_MODEL_AR5000) {
retval = aor_transaction (rig, "BW" EOM, 3, ackbuf2, &ack2_len);
if (retval != RIG_OK)
return retval;
mdp2 = strstr(ackbuf2, "BW");
} else
mdp2 = mdp;
retval = priv->parse_aor_mode(rig, mdp[2], mdp2[2], mode, width);
return retval;
}
@ -630,6 +647,7 @@ int aor_set_bank(RIG *rig, vfo_t vfo, int bank)
int aor_set_channel(RIG *rig, const channel_t *chan)
{
struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv;
char aorcmd[BUFSZ];
int cmd_len;
@ -644,7 +662,7 @@ int aor_set_channel(RIG *rig, const channel_t *chan)
cmd_len += sprintf(aorcmd+cmd_len, " AU%d ST%06d ",
0, (int)chan->tuning_step);
cmd_len += format_mode(aorcmd+cmd_len, chan->mode, chan->width);
cmd_len += priv->format_mode(rig, aorcmd+cmd_len, chan->mode, chan->width);
cmd_len += sprintf(aorcmd+cmd_len, " AT%d TM%12s"EOM,
chan->levels[LVL_ATT].i ? 1:0, chan->channel_desc);
@ -654,6 +672,7 @@ int aor_set_channel(RIG *rig, const channel_t *chan)
int aor_get_channel(RIG *rig, channel_t *chan)
{
struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv;
char aorcmd[BUFSZ];
int cmd_len, chan_len;
char chanbuf[BUFSZ];
@ -737,14 +756,19 @@ int aor_get_channel(RIG *rig, channel_t *chan)
/* mode and width */
if (mem_caps->mode && mem_caps->width) {
char *tag2p;
tagp = strstr(basep, "MD");
if (!tagp && mem_caps->mode && mem_caps->width) {
rig_debug(RIG_DEBUG_WARN, "%s: no MD in returned string: '%s'\n",
__FUNCTION__, chanbuf);
return -RIG_EPROTO;
}
/* "BW" only on AR5000 */
tag2p = strstr(basep, "BW");
if (!tag2p)
tag2p = tagp;
retval = parse_aor_mode(rig, tagp[2], &chan->mode, &chan->width);
retval = priv->parse_aor_mode(rig, tagp[2], tag2p[2], &chan->mode, &chan->width);
if (retval != RIG_OK)
return retval;
}

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib AOR backend - main header
* Copyright (c) 2000-2005 by Stephane Fillod
*
* $Id: aor.h,v 1.19 2005-04-09 16:33:42 fillods Exp $
* $Id: aor.h,v 1.20 2005-04-15 17:48: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
@ -25,7 +25,16 @@
#include <hamlib/rig.h>
#define BACKEND_VER "0.3"
#define BACKEND_VER "0.4"
int format8k_mode(RIG *rig, char *buf, rmode_t mode, pbwidth_t width);
int parse8k_aor_mode(RIG *rig, char aormode, char aorwidth, rmode_t *mode, pbwidth_t *width);
struct aor_priv_caps {
int (*format_mode)(RIG *rig, char *buf, rmode_t mode, pbwidth_t width);
int (*parse_aor_mode)(RIG *rig, char aormode, char aorwidth, rmode_t *mode, pbwidth_t *width);
};
int aor_close(RIG *rig);

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib AOR backend - AR5000 description
* Copyright (c) 2000-2004 by Stephane Fillod
*
* $Id: ar5000.c,v 1.6 2005-04-03 19:41:26 fillods Exp $
* $Id: ar5000.c,v 1.7 2005-04-15 17:48: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
@ -38,7 +38,7 @@
#define AR5000_PARM (RIG_PARM_APO|RIG_PARM_BACKLIGHT|RIG_PARM_BEEP)
#define AR5000_VFO_OPS (RIG_OP_UP|RIG_OP_DOWN)
#define AR5000_VFO_OPS (RIG_OP_MCL|RIG_OP_UP|RIG_OP_DOWN|RIG_OP_LEFT|RIG_OP_RIGHT)
#define AR5000_VFO (RIG_VFO_A|RIG_VFO_B)
@ -82,8 +82,26 @@
{ 0xfd, dBm2S9(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);
#define AR5000_MEM_CAP { \
.freq = 1, \
.mode = 1, \
.width = 1, \
.bank_num = 1, \
.tuning_step = 1, \
.channel_desc = 1, \
.flags = 1, \
.levels = RIG_LEVEL_ATT|RIG_LEVEL_AGC, \
.funcs = RIG_FUNC_ABM, \
}
static int format5k_mode(RIG *rig, char *buf, rmode_t mode, pbwidth_t width);
static int parse5k_aor_mode(RIG *rig, char aormode, char aorwidth, rmode_t *mode, pbwidth_t *width);
static const struct aor_priv_caps ar5k_priv_caps = {
.format_mode = format5k_mode,
.parse_aor_mode = parse5k_aor_mode,
};
/*
* ar5000 rig capabilities.
@ -91,6 +109,8 @@ static int ar5k_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width);
* Also this struct is READONLY!
*
* part of info from http://www.aoruk.com/5000.htm
*
* TODO: retrieve BW info, and rest of commands
*/
const struct rig_caps ar5000_caps = {
.rig_model = RIG_MODEL_AR5000,
@ -130,12 +150,15 @@ const struct rig_caps ar5000_caps = {
.max_ifshift = Hz(0),
.targetable_vfo = 0,
.transceive = RIG_TRN_RIG,
.bank_qty = 20,
.bank_qty = 10,
.chan_desc_sz = 12,
.vfo_ops = AR5000_VFO_OPS,
.str_cal = AR5000_REAL_STR_CAL,
.chan_list = { RIG_CHAN_END, }, /* FIXME: memory channel list: 1000 memories */
.chan_list = {
{ 0, 999, RIG_MTYPE_MEM, AR5000_MEM_CAP },
RIG_CHAN_END, },
.rx_range_list1 = {
{kHz(10),MHz(2600),AR5000_MODES,-1,-1,AR5000_VFO},
@ -178,15 +201,17 @@ const struct rig_caps ar5000_caps = {
.filters = {
/* mode/filter list, .remember = order matters! */
{RIG_MODE_SSB|RIG_MODE_CW, kHz(3)},
{RIG_MODE_CW, Hz(500)},
{RIG_MODE_FM|RIG_MODE_AM, kHz(15)},
{RIG_MODE_FM|RIG_MODE_AM, kHz(6)}, /* narrow */
{RIG_MODE_FM|RIG_MODE_AM, kHz(30)}, /* wide */
{RIG_MODE_FM|RIG_MODE_AM, kHz(40)}, /* wide */
{RIG_MODE_WFM, kHz(220)},
{RIG_MODE_WFM, kHz(120)},
RIG_FLT_END,
},
.priv = NULL,
.priv = (void*)&ar5k_priv_caps,
.rig_init = NULL,
.rig_cleanup = NULL,
.rig_open = NULL,
@ -194,8 +219,8 @@ const struct rig_caps ar5000_caps = {
.set_freq = aor_set_freq,
.get_freq = aor_get_freq,
.set_mode = ar5k_set_mode,
.get_mode = ar5k_get_mode,
.set_mode = aor_set_mode,
.get_mode = aor_get_mode,
.set_vfo = aor_set_vfo,
.get_vfo = aor_get_vfo,
@ -208,6 +233,13 @@ const struct rig_caps ar5000_caps = {
.vfo_op = aor_vfo_op,
.get_info = aor_get_info,
.set_mem = aor_set_mem,
.get_mem = aor_get_mem,
.set_bank = aor_set_bank,
.set_channel = aor_set_channel,
.get_channel = aor_get_channel,
};
/*
@ -216,91 +248,81 @@ const struct rig_caps ar5000_caps = {
/*
* acknowledge is CR
* Is \r portable enough?
* modes in use by the "MD" command of AR5000
*/
#define CR '\r'
#define EOM "\r"
#define AR5K_FM '0'
#define AR5K_AM '1'
#define AR5K_LSB '2'
#define AR5K_USB '3'
#define AR5K_CW '4'
#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)
int format5k_mode(RIG *rig, char *buf, rmode_t mode, pbwidth_t width)
{
unsigned char mdbuf[BUFSZ],ackbuf[BUFSZ];
int mdbuf_len, ack_len, aormode, retval;
int aormode, aorwidth;
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;
case RIG_MODE_AM: aormode = AR5K_AM; break;
case RIG_MODE_WFM:
case RIG_MODE_FM: aormode = AR5K_FM; break;
case RIG_MODE_LSB: aormode = AR5K_LSB; break;
case RIG_MODE_USB: aormode = AR5K_USB; break;
case RIG_MODE_CW: aormode = AR5K_CW; break;
default:
rig_debug(RIG_DEBUG_ERR,"%s: unsupported mode %d\n",
__FUNCTION__,mode);
__FUNCTION__, mode);
return -RIG_EINVAL;
}
mdbuf_len = sprintf(mdbuf, "MD%c" EOM, aormode);
retval = aor_transaction (rig, mdbuf, mdbuf_len, ackbuf, &ack_len);
if (width == RIG_PASSBAND_NORMAL)
width = rig_passband_normal(rig, mode);
return retval;
switch (width) {
case 500: aorwidth = '0'; break;
case s_kHz(3): aorwidth = '1'; break;
case s_kHz(6): aorwidth = '2'; break;
case s_kHz(15): aorwidth = '3'; break;
case s_kHz(40): aorwidth = '4'; break;
case s_kHz(110): aorwidth = '5'; break;
case s_kHz(220): aorwidth = '6'; break;
default:
rig_debug(RIG_DEBUG_ERR,"%s: unsupported width %d\n",
__FUNCTION__, width);
return -RIG_EINVAL;
}
return sprintf(buf, "MD%c BW%c", aormode, aorwidth);
}
/*
* aor_get_mode
* Assumes rig!=NULL, mode!=NULL
*/
int ar5k_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
int parse5k_aor_mode(RIG *rig, char aormode, char aorwidth, rmode_t *mode, pbwidth_t *width)
{
unsigned char ackbuf[BUFSZ];
int ack_len, retval;
char *rfp;
switch (aormode) {
case AR5K_FM: *mode = RIG_MODE_FM; break;
case AR5K_AM: *mode = RIG_MODE_AM; break;
case AR5K_LSB: *mode = RIG_MODE_LSB; break;
case AR5K_USB: *mode = RIG_MODE_USB; break;
case AR5K_CW: *mode = RIG_MODE_CW; break;
default:
rig_debug(RIG_DEBUG_ERR,"%s: unsupported mode '%c'\n",
__FUNCTION__, aormode);
return -RIG_EPROTO;
}
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);
switch (aorwidth) {
case '0': *width = 500; break;
case '1': *width = s_kHz(3); break;
case '2': *width = s_kHz(6); break;
case '3': *width = s_kHz(15); break;
case '4': *width = s_kHz(40); break;
case '5': *width = s_kHz(110); break;
case '6': *width = s_kHz(220); break;
default:
rig_debug(RIG_DEBUG_ERR,"%s: unsupported width %d\n",
__FUNCTION__, aorwidth);
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;
}

Wyświetl plik

@ -1,8 +1,8 @@
/*
* Hamlib AOR backend - AR8200 description
* Copyright (c) 2000-2004 by Stephane Fillod
* Copyright (c) 2000-2005 by Stephane Fillod
*
* $Id: ar8200.c,v 1.18 2005-04-09 16:33:42 fillods Exp $
* $Id: ar8200.c,v 1.19 2005-04-15 17:48: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
@ -53,12 +53,20 @@
.freq = 1, \
.mode = 1, \
.width = 1, \
.bank_num = 1, \
.tuning_step = 1, \
.channel_desc = 1, \
.flags = 1, \
.levels = RIG_LEVEL_ATT, \
.funcs = RIG_FUNC_ABM, \
}
static const struct aor_priv_caps ar8k_priv_caps = {
.format_mode = format8k_mode,
.parse_aor_mode = parse8k_aor_mode,
};
/*
* ar8200 rig capabilities.
* Notice that some rigs share the same functions.
@ -153,7 +161,8 @@ const struct rig_caps ar8200_caps = {
RIG_FLT_END,
},
.priv = NULL,
.priv = (void*)&ar8k_priv_caps,
.rig_init = NULL,
.rig_cleanup = NULL,
.rig_open = NULL,