From: <fi...@us...> - 2005-04-20 14:51:08
|
Update of /cvsroot/hamlib/hamlib/aor In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv7854 Modified Files: aor.c ar5000.c ar8000.c ar8200.c Log Message: make use of save memory at once API, don't expect and ack in aor_close Index: aor.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/aor/aor.c,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -r1.37 -r1.38 *** aor.c 15 Apr 2005 21:50:27 -0000 1.37 --- aor.c 20 Apr 2005 14:50:56 -0000 1.38 *************** *** 122,128 **** int aor_close(RIG *rig) { ! /* terminate remote operation via the RS-232 */ ! return aor_transaction (rig, "EX" EOM, 3, NULL, NULL); } --- 122,132 ---- int aor_close(RIG *rig) { ! /* ! * terminate remote operation via the RS-232 ! * Note: use write_block() instead of aor_transaction ! * since no reply is to be expected. ! */ ! return write_block(&rig->state.rigport, "EX" EOM, 3); } *************** *** 705,773 **** } ! 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]; ! int retval, i; ! char *basep, *tagp; ! channel_cap_t *mem_caps = NULL; ! chan_t *chan_list; ! int mem_num, channel_num = chan->channel_num; ! char bank_base; ! ! /* ! * find mem_caps in caps, we'll need it later ! */ ! chan_list = rig->caps->chan_list; ! for (i=0; i<CHANLSTSIZ && !RIG_IS_CHAN_END(chan_list[i]); i++) { ! if (channel_num >= chan_list[i].start && ! channel_num <= chan_list[i].end) { ! mem_caps = &chan_list[i].mem_caps; ! break; ! } ! } ! if (!mem_caps) ! return -RIG_EINVAL; ! ! ! /* ! * FIXME: we're assuming the banks are split 50/50. ! * MW should be called the first time instead, ! * and sizing memorized. ! */ ! mem_num = channel_num%100; ! if (mem_num >= 50 && priv->bank_base1 != priv->bank_base2) { ! bank_base = priv->bank_base2; ! mem_num -= 50; ! } else { ! bank_base = priv->bank_base1; ! } ! ! cmd_len = sprintf(aorcmd, "MR%c%02d" EOM, ! bank_base + channel_num/100, mem_num); ! retval = aor_transaction (rig, aorcmd, cmd_len, chanbuf, &chan_len); ! ! /* is the channel empty? */ ! if (retval == -RIG_EPROTO && chanbuf[0] == '?') { ! chan->freq = RIG_FREQ_NONE; ! return -RIG_ENAVAIL; ! } ! ! if (retval != RIG_OK) ! return retval; ! ! cmd_len = sprintf(aorcmd, "RX" EOM); ! retval = aor_transaction (rig, aorcmd, cmd_len, chanbuf, &chan_len); ! if (retval != RIG_OK) ! return retval; /* ! * search for attribute tags in the first line. * Using strstr enable support for various models * which may or may not have tag support. */ - basep = chanbuf; /* pass */ --- 709,723 ---- } ! static int parse_chan_line(RIG *rig, channel_t *chan, char *basep, const channel_cap_t *mem_caps) { struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv; ! int retval; ! char *tagp; /* ! * search for attribute tags in the line. * Using strstr enable support for various models * which may or may not have tag support. */ /* pass */ *************** *** 776,780 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no MP in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 726,730 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no MP in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 788,792 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no RF in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 738,742 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no RF in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 800,804 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no ST in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 750,754 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no ST in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 813,817 **** 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; } --- 763,767 ---- if (!tagp && mem_caps->mode && mem_caps->width) { rig_debug(RIG_DEBUG_WARN, "%s: no MD in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 831,835 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no AU in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 781,785 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no AU in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 844,848 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no AT in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 794,798 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no AT in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 858,862 **** if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no TM in returned string: '%s'\n", ! __FUNCTION__, chanbuf); return -RIG_EPROTO; } --- 808,812 ---- if (!tagp) { rig_debug(RIG_DEBUG_WARN, "%s: no TM in returned string: '%s'\n", ! __FUNCTION__, basep); return -RIG_EPROTO; } *************** *** 866,869 **** --- 816,882 ---- } + return RIG_OK; + } + + + 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]; + int retval, i; + channel_cap_t *mem_caps = NULL; + chan_t *chan_list; + int mem_num, channel_num = chan->channel_num; + char bank_base; + + /* + * find mem_caps in caps, we'll need it later + */ + chan_list = rig->caps->chan_list; + for (i=0; i<CHANLSTSIZ && !RIG_IS_CHAN_END(chan_list[i]); i++) { + if (channel_num >= chan_list[i].start && + channel_num <= chan_list[i].end) { + mem_caps = &chan_list[i].mem_caps; + break; + } + } + if (!mem_caps) + return -RIG_EINVAL; + + + /* + * FIXME: we're assuming the banks are split 50/50. + * MW should be called the first time instead, + * and sizing memorized. + */ + mem_num = channel_num%100; + if (mem_num >= 50 && priv->bank_base1 != priv->bank_base2) { + bank_base = priv->bank_base2; + mem_num -= 50; + } else { + bank_base = priv->bank_base1; + } + + cmd_len = sprintf(aorcmd, "MR%c%02d" EOM, + bank_base + channel_num/100, mem_num); + retval = aor_transaction (rig, aorcmd, cmd_len, chanbuf, &chan_len); + + /* is the channel empty? */ + if (retval == -RIG_EPROTO && chanbuf[0] == '?') { + chan->freq = RIG_FREQ_NONE; + return -RIG_ENAVAIL; + } + + if (retval != RIG_OK) + return retval; + + cmd_len = sprintf(aorcmd, "RX" EOM); + retval = aor_transaction (rig, aorcmd, cmd_len, chanbuf, &chan_len); + if (retval != RIG_OK) + return retval; + + retval = parse_chan_line(rig, chan, chanbuf, mem_caps); return RIG_OK; *************** *** 871,874 **** --- 884,961 ---- + #define LINES_PER_MA 10 + + int aor_get_chan_all_cb (RIG * rig, chan_cb_t chan_cb, rig_ptr_t arg) + { + struct aor_priv_caps *priv = (struct aor_priv_caps*)rig->caps->priv; + int i,j,retval; + chan_t *chan_list = rig->state.chan_list; + channel_t *chan; + int chan_count; + char aorcmd[BUFSZ]; + int cmd_len, chan_len; + char chanbuf[BUFSZ]; + int chan_next = chan_list[0].start; + + + chan_count = chan_list[0].end - chan_list[0].start + 1; + + /* + * setting chan to NULL means the application + * has to provide a struct where to store data + * future data for channel channel_num + */ + chan = NULL; + retval = chan_cb(rig, &chan, chan_next, chan_list, arg); + if (retval != RIG_OK) + return retval; + if (chan == NULL) + return -RIG_ENOMEM; + + cmd_len = sprintf(aorcmd, "MA%c" EOM, + priv->bank_base1); + + for (i=0; i < chan_count/LINES_PER_MA; i++) { + + retval = aor_transaction (rig, aorcmd, cmd_len, chanbuf, &chan_len); + if (retval != RIG_OK) + return retval; + + for (j=0; j<LINES_PER_MA; j++) { + + chan->vfo = RIG_VFO_MEM; + chan->channel_num = i*LINES_PER_MA + j; + + retval = parse_chan_line(rig, chan, chanbuf, &chan_list[0].mem_caps); + + if (retval != RIG_OK) + return retval; + + /* notify the end? */ + chan_next = chan_next < chan_list[i].end ? chan_next+1 : chan_next; + + /* + * provide application with channel data, + * and ask for a new channel structure + */ + chan_cb(rig, &chan, chan_next, chan_list, arg); + + if (j >= LINES_PER_MA-1) + break; + + /* + * get next line + */ + retval = read_string(&rig->state.rigport, chanbuf, BUFSZ, EOM, strlen(EOM)); + if (retval < 0) + return retval; + } + + cmd_len = sprintf(aorcmd, "MA" EOM); + } + + return RIG_OK; + } + /* * aor_get_info *************** *** 907,912 **** --- 994,1001 ---- rig_debug(RIG_DEBUG_VERBOSE, "aor: _init called\n"); + rig_register(&ar2700_caps); rig_register(&ar8200_caps); rig_register(&ar8000_caps); + rig_register(&ar8600_caps); rig_register(&ar5000_caps); rig_register(&ar3000a_caps); Index: ar5000.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/aor/ar5000.c,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** ar5000.c 15 Apr 2005 21:50:27 -0000 1.8 --- ar5000.c 20 Apr 2005 14:50:56 -0000 1.9 *************** *** 243,246 **** --- 243,248 ---- .get_channel = aor_get_channel, + .get_chan_all_cb = aor_get_chan_all_cb, + }; Index: ar8000.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/aor/ar8000.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** ar8000.c 7 Sep 2004 20:40:20 -0000 1.5 --- ar8000.c 20 Apr 2005 14:50:56 -0000 1.6 *************** *** 167,170 **** --- 167,172 ---- .get_info = aor_get_info, + .get_chan_all_cb = aor_get_chan_all_cb, + }; Index: ar8200.c =================================================================== RCS file: /cvsroot/hamlib/hamlib/aor/ar8200.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -r1.20 -r1.21 *** ar8200.c 15 Apr 2005 21:50:27 -0000 1.20 --- ar8200.c 20 Apr 2005 14:50:56 -0000 1.21 *************** *** 194,197 **** --- 194,199 ---- .get_channel = aor_get_channel, + .get_chan_all_cb = aor_get_chan_all_cb, + }; |