Correctly detect if in memory mode in get_vfo()

Reduced large decision trees with bitwise math


git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1831 7ae35d74-ebe9-4afe-98af-79ac388436b8
Hamlib-1.2.3
Mark J. Fine 2004-09-01 01:08:11 +00:00
rodzic 395d62ead0
commit 8aa94a79a8
1 zmienionych plików z 44 dodań i 91 usunięć

Wyświetl plik

@ -2,7 +2,7 @@
* Hamlib Drake backend - main file * Hamlib Drake backend - main file
* Copyright (c) 2001-2004 by Stephane Fillod * Copyright (c) 2001-2004 by Stephane Fillod
* *
* $Id: drake.c,v 1.13 2004-08-31 03:45:34 fineware Exp $ * $Id: drake.c,v 1.14 2004-09-01 01:08:11 fineware Exp $
* *
* This library is free software; you can redistribute it and/or modify * This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as * it under the terms of the GNU Library General Public License as
@ -204,42 +204,29 @@ int drake_get_vfo(RIG *rig, vfo_t *vfo)
char mdbuf[BUFSZ]; char mdbuf[BUFSZ];
char cvfo; char cvfo;
retval = drake_transaction (rig, "RM" EOM, 3, mdbuf, &mdbuf_len); retval = drake_transaction (rig, "RA" EOM, 3, mdbuf, &mdbuf_len);
if (retval != RIG_OK) if (retval != RIG_OK)
return retval; return retval;
if (mdbuf_len != 8) { if (mdbuf_len < 35) {
rig_debug(RIG_DEBUG_ERR,"drake_get_vfo: wrong answer %s, " rig_debug(RIG_DEBUG_ERR,"drake_get_vfo: wrong answer %s, "
"len=%d\n", mdbuf, mdbuf_len); "len=%d\n", mdbuf, mdbuf_len);
return -RIG_ERJCTED; return -RIG_ERJCTED;
} }
cvfo = mdbuf[5]; if (mdbuf[0]=='*')
*vfo = RIG_VFO_MEM;
else {
cvfo = (mdbuf[9] & 0x38);
switch (cvfo) { switch (cvfo) {
case '0': case '0' : *vfo = RIG_VFO_B; break;
case '1': case '8' : *vfo = RIG_VFO_A; break;
case '2': default : rig_debug(RIG_DEBUG_ERR,
case '3': "drake_get_vfo: unsupported vfo %c\n", cvfo);
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; *vfo = RIG_VFO_VFO;
return -RIG_EINVAL; return -RIG_EINVAL;
} }
}
return RIG_OK; return RIG_OK;
} }
@ -333,17 +320,12 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
cwidth = mdbuf[4]; cwidth = mdbuf[4];
csynch = mdbuf[5]; csynch = mdbuf[5];
switch(cwidth){ switch(cwidth & 0x37){
case '0': case '0': *width = s_Hz(500); break;
case '8': *width = s_Hz(500); break; case '1': *width = s_Hz(1800); break;
case '1': case '2': *width = s_Hz(2300); break;
case '9': *width = s_Hz(1800); break; case '3': *width = s_Hz(4000); break;
case '2': case '4': *width = s_Hz(6000); break;
case ':': *width = s_Hz(2300); break;
case '3':
case ';': *width = s_Hz(4000); break;
case '4':
case '<': *width = s_Hz(6000); break;
default : default :
rig_debug(RIG_DEBUG_ERR, rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported width %c\n", "drake_get_mode: unsupported width %c\n",
@ -352,17 +334,11 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
return -RIG_EINVAL; return -RIG_EINVAL;
} }
if (cwidth=='0'||cwidth=='1'||cwidth=='2'||cwidth=='3'||cwidth=='4'){ if ((cwidth >= '0') && (cwidth <= '4')) {
switch(cmode){ switch(cmode & 0x33){
case '0': case '0': *mode = RIG_MODE_LSB; break;
case '4': case '1': *mode = RIG_MODE_RTTY; break;
case '8': *mode = RIG_MODE_LSB; break; case '2': *mode = RIG_MODE_FM; *width = s_Hz(12000); 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 : default :
rig_debug(RIG_DEBUG_ERR, rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported mode %c\n", "drake_get_mode: unsupported mode %c\n",
@ -371,16 +347,10 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
return -RIG_EINVAL; return -RIG_EINVAL;
} }
} else { } else {
switch(cmode){ switch(cmode & 0x33){
case '0': case '0': *mode = RIG_MODE_USB; break;
case '4': case '1': *mode = RIG_MODE_CW; break;
case '8': *mode = RIG_MODE_USB; break; case '2': *mode = RIG_MODE_AM; break;
case '1':
case '5':
case '9': *mode = RIG_MODE_CW; break;
case '2':
case '6':
case ':': *mode = RIG_MODE_AM; break;
default : default :
rig_debug(RIG_DEBUG_ERR, rig_debug(RIG_DEBUG_ERR,
"drake_get_mode: unsupported mode %c\n", "drake_get_mode: unsupported mode %c\n",
@ -390,9 +360,7 @@ int drake_get_mode(RIG *rig, vfo_t vfo, rmode_t *mode, pbwidth_t *width)
} }
} }
/*FIXME USB/LSB synch in R8B*/ if ((csynch & 0x34) == '4') {
if (csynch=='4'||csynch=='5'||csynch=='6'||csynch=='7'||
csynch=='<'||csynch=='='||csynch=='>'||csynch=='?') {
if (*mode == RIG_MODE_AM) if (*mode == RIG_MODE_AM)
*mode = RIG_MODE_AMS; *mode = RIG_MODE_AMS;
else else
@ -443,16 +411,10 @@ int drake_get_ant(RIG *rig, vfo_t vfo, ant_t *ant)
cant = mdbuf[3]; cant = mdbuf[3];
switch(cant){ switch(cant & 0x3c){
case '0': case '0': *ant = RIG_ANT_1; break;
case '1': case '4': *ant = RIG_ANT_3; break;
case '2': *ant = RIG_ANT_1; break; case '8': *ant = RIG_ANT_2; break;
case '4':
case '5':
case '6': *ant = RIG_ANT_3; break;
case '8':
case '9':
case ':': *ant = RIG_ANT_2; break;
default : default :
rig_debug(RIG_DEBUG_ERR, rig_debug(RIG_DEBUG_ERR,
"drake_get_ant: unsupported antenna %c\n", "drake_get_ant: unsupported antenna %c\n",
@ -609,12 +571,12 @@ int drake_get_func(RIG *rig, vfo_t vfo, setting_t func, int *status)
switch(func) { switch(func) {
case RIG_FUNC_MN: case RIG_FUNC_MN:
mc = mdbuf[2]; mc = mdbuf[2];
*status = (mc=='2'||mc=='3'||mc=='6'||mc=='7'||mc==':'||mc==';'||mc=='>'||mc=='?'); *status = ((mc & 0x32) =='2');
break; break;
case RIG_FUNC_NB: case RIG_FUNC_NB:
/* TODO: NB narrow */ /* TODO: NB narrow */
mc = mdbuf[1]; mc = mdbuf[1];
*status = ((mc!='0')&&(mc!='1')&&(mc!='2')&&(mc!='3')); *status = ((mc >= '4') && (mc <= '?'));
break; break;
default: default:
rig_debug(RIG_DEBUG_ERR,"Unsupported get func %d\n",func); rig_debug(RIG_DEBUG_ERR,"Unsupported get func %d\n",func);
@ -708,33 +670,24 @@ int drake_get_level(RIG *rig, vfo_t vfo, setting_t level, value_t *val)
break; break;
case RIG_LEVEL_PREAMP: case RIG_LEVEL_PREAMP:
mc = lvlbuf[2]; mc = lvlbuf[2];
if (mc=='8'||mc=='9'||mc==':'||mc==';') if ((mc & 0x3c) == '8')
val->i = 10; val->i = 10;
else else
val->i = 0; val->i = 0;
break; break;
case RIG_LEVEL_ATT: case RIG_LEVEL_ATT:
mc = lvlbuf[2]; mc = lvlbuf[2];
if (mc=='4'||mc=='5'||mc=='6'||mc=='7') if ((mc & 0x3c) =='4')
val->i = 10; val->i = 10;
else else
val->i = 0; val->i = 0;
break; break;
case RIG_LEVEL_AGC: case RIG_LEVEL_AGC:
mc = lvlbuf[1]; mc = lvlbuf[1];
switch(mc){ switch(mc & 0x33){
case '0': case '0': val->i = RIG_AGC_OFF; break;
case '4': case '2': val->i = RIG_AGC_FAST; break;
case '8': case '3': val->i = RIG_AGC_SLOW; break;
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; default : val->i = RIG_AGC_FAST;
} }
break; break;