From: <fi...@us...> - 2009-09-14 07:28:08
|
Revision: 2724 http://hamlib.svn.sourceforge.net/hamlib/?rev=2724&view=rev Author: fillods Date: 2009-09-14 07:27:58 +0000 (Mon, 14 Sep 2009) Log Message: ----------- check for memory support Modified Paths: -------------- trunk/tests/rigmem.1 trunk/tests/rigmem.c Modified: trunk/tests/rigmem.1 =================================================================== --- trunk/tests/rigmem.1 2009-09-14 07:25:44 UTC (rev 2723) +++ trunk/tests/rigmem.1 2009-09-14 07:27:58 UTC (rev 2724) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGMEM "1" "February 24, 2007" "Hamlib" "Radio Memory Operations" +.TH RIGMEM "1" "September 13, 2009" "Hamlib" "Radio Memory Operations" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -130,6 +130,9 @@ 1 if there was an invalid command line option or argument; .br 2 if an error was returned by \fBHamlib\fP. +.br +3 the \fBHamlib\fP backend has no memory support implemented and/or + the rig has no memory access available. .SH BUGS This empty section... .SH REPORTING BUGS Modified: trunk/tests/rigmem.c =================================================================== --- trunk/tests/rigmem.c 2009-09-14 07:25:44 UTC (rev 2723) +++ trunk/tests/rigmem.c 2009-09-14 07:27:58 UTC (rev 2724) @@ -1,5 +1,6 @@ /* - * rigmem.c - (C) Stephane Fillod and Thierry Leconte 2003-2005 + * rigmem.c - (C) Thierry Leconte 2003-2005 + * (C) Stephane Fillod 2003-2009 * * This program exercises the backup and restore of a radio * using Hamlib. @@ -212,6 +213,22 @@ exit(2); } + /* check channel support */ + if (rig->caps->set_channel == NULL && rig->caps->get_channel == NULL && + rig->caps->set_chan_all_cb == NULL && rig->caps->get_chan_all_cb == NULL && + (rig->caps->set_mem == NULL || rig->caps->set_vfo == NULL)) { + fprintf(stderr, "Error: rig num %d has no memory support implemented/available.\n", + my_model); + exit(3); + } + + /* check channel description */ + if (rig->caps->chan_list[0].type == 0) { + fprintf(stderr, "Error: rig num %d has no channel list.\n", + my_model); + exit(3); + } + if (rig_file) strncpy(rig->state.rigport.pathname, rig_file, FILPATHLEN); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2009-11-03 20:47:23
|
Revision: 2762 http://hamlib.svn.sourceforge.net/hamlib/?rev=2762&view=rev Author: fillods Date: 2009-11-03 20:47:15 +0000 (Tue, 03 Nov 2009) Log Message: ----------- fix syntax, thanks to debian qa for noticing Modified Paths: -------------- trunk/tests/rigctl.1 trunk/tests/rigctld.8 trunk/tests/rotctld.8 Modified: trunk/tests/rigctl.1 =================================================================== --- trunk/tests/rigctl.1 2009-11-02 22:58:03 UTC (rev 2761) +++ trunk/tests/rigctl.1 2009-11-03 20:47:15 UTC (rev 2762) @@ -123,7 +123,7 @@ \fBN.B.\fP Some options may not be implemented by a given backend and will return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. -.pp +.PP Please note that the backend for the radio to be controlled, or the radio itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error code. Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2009-11-02 22:58:03 UTC (rev 2761) +++ trunk/tests/rigctld.8 2009-11-03 20:47:15 UTC (rev 2762) @@ -127,7 +127,7 @@ \fBN.B.\fP Some options may not be implemented by a given backend and will return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. -.pp +.PP Please note that the backend for the radio to be controlled, or the radio itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error code. Modified: trunk/tests/rotctld.8 =================================================================== --- trunk/tests/rotctld.8 2009-11-02 22:58:03 UTC (rev 2761) +++ trunk/tests/rotctld.8 2009-11-03 20:47:15 UTC (rev 2762) @@ -97,7 +97,7 @@ \fBN.B.\fP Some options may not be implemented by a given backend and will return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. -.pp +.PP Please note that the backend for the rotator to be controlled, or the rotator itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error code. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-01-24 23:24:26
|
Revision: 2813 http://hamlib.svn.sourceforge.net/hamlib/?rev=2813&view=rev Author: n0nb Date: 2010-01-24 23:24:20 +0000 (Sun, 24 Jan 2010) Log Message: ----------- Added initial support for Block protocol in rigctld and documented same. Rewrote testctld.pl for new block protocol and included it with source distribution. Modified Paths: -------------- trunk/tests/Makefile.am trunk/tests/rigctl.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 trunk/tests/rigctld.c trunk/tests/testctld.pl Modified: trunk/tests/Makefile.am =================================================================== --- trunk/tests/Makefile.am 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/Makefile.am 2010-01-24 23:24:20 UTC (rev 2813) @@ -72,5 +72,5 @@ for f in `./listrigs | tail -n +2 | cut -f1` ; do ( ./rigctl -m $$f -u > sup-info/support/model$$f.txt || exit 0 ) ; done ./rigctl -l |sort -n | $(srcdir)/rig_split_lst.awk -v lst_dir="sup-info" -EXTRA_DIST = rigmatrix_head.html rig_split_lst.awk $(man_MANS) +EXTRA_DIST = rigmatrix_head.html rig_split_lst.awk $(man_MANS) testctld.pl Modified: trunk/tests/rigctl.c =================================================================== --- trunk/tests/rigctl.c 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/rigctl.c 2010-01-24 23:24:20 UTC (rev 2813) @@ -86,6 +86,7 @@ int interactive = 1; /* if no cmd on command line, switch to interactive */ int prompt = 1; /* Print prompt in rigctl */ int opt_end= 0; /* only used by rigctld */ +int opt_block = 0; /* only used by rigctld */ int vfo_mode; /* vfo_mode=0 means target VFO is current VFO */ char send_cmd_term = '\r'; /* send_cmd termination char */ Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/rigctl_parse.c 2010-01-24 23:24:20 UTC (rev 2813) @@ -3,26 +3,26 @@ * (C) Terry Embry 2008-2009 * * This program test/control a radio using Hamlib. - * It takes commands in interactive mode as well as + * It takes commands in interactive mode as well as * from command line options. * - * $Id: rigctl_parse.c,v 1.16 2009-02-06 17:28:38 fillods Exp $ + * $Id: rigctl_parse.c,v 1.16 2009-02-06 17:28:38 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -73,7 +73,7 @@ struct test_table { unsigned char cmd; const char *name; - int (*rig_routine)(RIG*, FILE*, int, const struct test_table*, vfo_t, + int (*rig_routine)(RIG*, FILE*, int, const struct test_table*, vfo_t, const char*, const char*, const char*); int flags; const char *arg1; @@ -167,20 +167,20 @@ { 'm', "get_mode", get_mode, ARG_OUT, "Mode", "Passband" }, { 'I', "set_split_freq", set_split_freq, ARG_IN, "Tx frequency" }, { 'i', "get_split_freq", get_split_freq, ARG_OUT, "Tx frequency" }, - { 'X', "set_split_mode", set_split_mode, ARG_IN, "Mode", "Passband" }, - { 'x', "get_split_mode", get_split_mode, ARG_OUT, "Mode", "Passband" }, - { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split mode", "TxVFO" }, - { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split mode", "TxVFO" }, + { 'X', "set_split_mode", set_split_mode, ARG_IN, "Tx mode", "Tx passband" }, + { 'x', "get_split_mode", get_split_mode, ARG_OUT, "Tx mode", "Tx passband" }, + { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split", "Tx VFO" }, + { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split", "Tx VFO" }, { 'N', "set_ts", set_ts, ARG_IN, "Tuning step" }, { 'n', "get_ts", get_ts, ARG_OUT, "Tuning step" }, - { 'L', "set_level", set_level, ARG_IN, "Level", "Value" }, - { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Value" }, + { 'L', "set_level", set_level, ARG_IN, "Level", "Level value" }, + { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Level value" }, { 'U', "set_func", set_func, ARG_IN, "Func", "Func status" }, { 'u', "get_func", get_func, ARG_IN1|ARG_OUT2, "Func", "Func status" }, - { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Value" }, - { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Value" }, + { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Parm value" }, + { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Parm value" }, { 'G', "vfo_op", vfo_op, ARG_IN, "Mem/VFO op" }, - { 'g', "scan", scan, ARG_IN, "Scan fct", "Channel" }, + { 'g', "scan", scan, ARG_IN, "Scan fct", "Scan channel" }, { 'A', "set_trn", set_trn, ARG_IN|ARG_NOVFO, "Transceive" }, { 'a', "get_trn", get_trn, ARG_OUT|ARG_NOVFO, "Transceive" }, { 'R', "set_rptr_shift", set_rptr_shift, ARG_IN, "Rptr shift" }, @@ -191,10 +191,10 @@ { 'c', "get_ctcss_tone", get_ctcss_tone, ARG_OUT, "CTCSS tone" }, { 'D', "set_dcs_code", set_dcs_code, ARG_IN, "DCS code" }, { 'd', "get_dcs_code", get_dcs_code, ARG_OUT, "DCS code" }, - { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS tone" }, - { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS tone" }, - { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS code" }, - { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS code" }, + { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS sql" }, + { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS sql" }, + { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS sql" }, + { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS sql" }, { 'V', "set_vfo", set_vfo, ARG_IN|ARG_NOVFO, "VFO" }, { 'v', "get_vfo", get_vfo, ARG_OUT, "VFO" }, { 'T', "set_ptt", set_ptt, ARG_IN, "PTT" }, @@ -216,14 +216,13 @@ { 0x89, "send_dtmf", send_dtmf, ARG_IN, "Digits" }, { 0x8a, "recv_dtmf", recv_dtmf, ARG_OUT, "Digits" }, { '*', "reset", reset, ARG_IN, "Reset" }, - { '2', "power2mW", power2mW, ARG_NOVFO }, { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2|ARG_NOVFO, "Cmd", "Reply" }, { 'b', "send_morse", send_morse, ARG_IN|ARG_IN_LINE, "Morse" }, { 0x8b, "get_dcd", get_dcd, ARG_OUT, "DCD" }, + { '2', "power2mW", power2mW, ARG_NOVFO }, { '1', "dump_caps", dump_caps, ARG_NOVFO }, { '3', "dump_conf", dump_conf, ARG_NOVFO }, { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, - /* next one is 0x89 */ { 0x00, "", NULL }, }; @@ -231,7 +230,7 @@ static struct test_table *find_cmd_entry(int cmd) { int i; - for (i=0; i<MAXNBOPT && test_list[i].cmd != 0x00; i++) + for (i = 0; i < MAXNBOPT && test_list[i].cmd != 0x00; i++) if (test_list[i].cmd == cmd) break; @@ -246,14 +245,14 @@ static char parse_arg(const char *arg) { int i; - for (i=0; i<MAXNBOPT && test_list[i].cmd != 0; i++) + for (i = 0; i < MAXNBOPT && test_list[i].cmd != 0; i++) if (!strncmp(arg, test_list[i].name, MAXNAMSIZ)) return test_list[i].cmd; return 0; } -/* +/* * This scanf works even in presence of signals (timer, SIGIO, ..) */ static int scanfc(FILE *fin, const char *format, void *p) @@ -276,6 +275,7 @@ extern int interactive; extern int prompt; extern int opt_end; +extern int opt_block; extern int vfo_mode; extern char send_cmd_term; @@ -312,7 +312,7 @@ return -1; *pcmd = '\0'; - cmd = parse_arg((char *) cmd_name); + cmd = parse_arg((char *)cmd_name); break; } @@ -371,7 +371,7 @@ vfo = rig_parse_vfo(arg1); } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -379,7 +379,7 @@ } } - if ((cmd_entry->flags & ARG_IN_LINE) && + if ((cmd_entry->flags & ARG_IN_LINE) && (cmd_entry->flags & ARG_IN1) && cmd_entry->arg1) { if (interactive) { char *nl; @@ -390,16 +390,16 @@ fgets(arg1, MAXARGSZ, fin); nl = strchr(arg1, 0xa); if (nl) *nl = '\0'; /* chomp */ - p1 = arg1[0]==' '?arg1+1:arg1; + p1 = arg1[0] == ' ' ? arg1 + 1 : arg1; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } p1 = argv[optind++]; } - } else + } else if ((cmd_entry->flags & ARG_IN1) && cmd_entry->arg1) { if (interactive) { if (prompt) @@ -409,14 +409,14 @@ p1 = arg1; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } p1 = argv[optind++]; } } - if (p1 && p1[0]!='?' && (cmd_entry->flags & ARG_IN2) && cmd_entry->arg2) { + if (p1 && p1[0] != '?' && (cmd_entry->flags & ARG_IN2) && cmd_entry->arg2) { if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg2); @@ -425,14 +425,14 @@ p2 = arg2; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } p2 = argv[optind++]; } } - if (p1 && p1[0]!='?' && (cmd_entry->flags & ARG_IN3) && cmd_entry->arg3) { + if (p1 && p1[0] != '?' && (cmd_entry->flags & ARG_IN3) && cmd_entry->arg3) { if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg3); @@ -441,7 +441,7 @@ p3 = arg3; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -458,10 +458,23 @@ #endif if (!prompt) - rig_debug(RIG_DEBUG_TRACE, "rigctl: %c '%s' '%s' '%s'\n", + rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '%s' '%s' '%s'\n", cmd, p1, p2, p3); - retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive, + /* Block protocol: output received command name and arguments response */ + if (interactive && opt_block) { + char a1[MAXARGSZ+1]; + char a2[MAXARGSZ+1]; + char a3[MAXARGSZ+1]; + + p1 == NULL ? a1[0] = '\0' : snprintf(a1, sizeof(a1), " %s", p1); + p2 == NULL ? a2[0] = '\0' : snprintf(a2, sizeof(a2), " %s", p2); + p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); + + fprintf(fout, "%s:%s%s%s\n", cmd_entry->name, a1, a2, a3); + } + + retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive, cmd_entry, vfo, p1, p2, p3); #ifdef HAVE_PTHREAD @@ -469,17 +482,19 @@ #endif if (retcode != RIG_OK) { - if (interactive && !prompt) + if (interactive && !prompt && opt_block) fprintf(fout, NETRIGCTL_RET "%d\n", retcode); /* only for rigctld */ else fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { if (interactive && !prompt) { /* only for rigctld */ - if (!(cmd_entry->flags & ARG_OUT) && !opt_end) /* netrigctl RIG_OK */ + if (!(cmd_entry->flags & ARG_OUT) && !opt_end) /* netrigctl RIG_OK */ fprintf(fout, NETRIGCTL_RET "0\n"); else if ((cmd_entry->flags & ARG_OUT) && opt_end) /* Nate's protocol */ fprintf(fout, "END\n"); - } + else if (opt_block) /* block marker protocol */ + fprintf(fout, NETRIGCTL_RET "0\n"); + } } fflush(fout); @@ -500,7 +515,7 @@ fprintf(fout, "Commands (some may not be available for this rig):\n"); for (i=0; test_list[i].cmd != 0; i++) { - fprintf(fout, "%c: %-16s(", isprint(test_list[i].cmd) ? + fprintf(fout, "%c: %-16s(", isprint(test_list[i].cmd) ? test_list[i].cmd:'?', test_list[i].name); nbspaces = 18; @@ -527,13 +542,13 @@ rig_get_conf(rig, cfp->token, buf); printf("%s: \"%s\"\n" "\t" - "Default: %s, Value: %s\n", - cfp->name, cfp->tooltip, + "Default: %s, Value: %s\n", + cfp->name, cfp->tooltip, cfp->dflt, buf ); switch (cfp->type) { case RIG_CONF_NUMERIC: - printf("\tRange: %.1f..%.1f, step %.1f\n", + printf("\tRange: %.1f..%.1f, step %.1f\n", cfp->u.n.min, cfp->u.n.max, cfp->u.n.step); break; case RIG_CONF_COMBO: @@ -605,7 +620,7 @@ /* - * static int (f)(RIG *rig, FILE *fout, int interactive, const struct test_table *cmd, + * static int (f)(RIG *rig, FILE *fout, int interactive, const struct test_table *cmd, * vfo_t vfo, const void *arg1, const void *arg2, const void *arg3) */ @@ -628,7 +643,7 @@ if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); /* i.e. "Frequency" */ fprintf(fout, "%"PRIll"\n", (long long)freq); @@ -714,10 +729,10 @@ status = rig_get_mode(rig, vfo, &mode, &width); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strrmode(mode)); - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%ld\n", width); @@ -738,7 +753,7 @@ status = rig_get_vfo(rig, &vfo); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strvfo(vfo)); @@ -763,13 +778,14 @@ status = rig_get_ptt(rig, vfo, &ptt); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", ptt); return status; } +/* '0x8b' */ declare_proto_rig(get_dcd) { int status; @@ -778,7 +794,7 @@ status = rig_get_dcd(rig, vfo, &dcd); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", dcd); @@ -803,7 +819,7 @@ status = rig_get_rptr_shift(rig, vfo, &rptr_shift); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strptrshift(rptr_shift)); @@ -828,7 +844,7 @@ status = rig_get_rptr_offs(rig, vfo, &rptr_offs); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", rptr_offs); @@ -853,7 +869,7 @@ status = rig_get_ctcss_tone(rig, vfo, &tone); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", tone); @@ -878,13 +894,14 @@ status = rig_get_dcs_code(rig, vfo, &code); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", code); return status; } +/* '0x90' */ declare_proto_rig(set_ctcss_sql) { tone_t tone; @@ -893,6 +910,7 @@ return rig_set_ctcss_sql(rig, vfo, tone); } +/* '0x91' */ declare_proto_rig(get_ctcss_sql) { int status; @@ -901,13 +919,14 @@ status = rig_get_ctcss_sql(rig, vfo, &tone); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", tone); return status; } +/* '0x92' */ declare_proto_rig(set_dcs_sql) { tone_t code; @@ -916,6 +935,7 @@ return rig_set_dcs_sql(rig, vfo, code); } +/* '0x93' */ declare_proto_rig(get_dcs_sql) { int status; @@ -924,7 +944,7 @@ status = rig_get_dcs_sql(rig, vfo, &code); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", code); @@ -947,11 +967,11 @@ int status; freq_t txfreq; vfo_t txvfo = RIG_VFO_TX; - + status = rig_get_split_freq(rig, txvfo, &txfreq); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%"PRIll"\n", (long long)txfreq); @@ -989,10 +1009,10 @@ status = rig_get_split_mode(rig, txvfo, &mode, &width); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strrmode(mode)); - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%ld\n", width); @@ -1018,10 +1038,10 @@ status = rig_get_split_vfo(rig, vfo, &split, &tx_vfo); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", split); - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%s\n", rig_strvfo(tx_vfo)); @@ -1046,7 +1066,7 @@ status = rig_get_ts(rig, vfo, &ts); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", ts); @@ -1165,7 +1185,7 @@ switch (cfp->type) { case RIG_CONF_BUTTON: - /* there's not sense in retrieving value of stateless button */ + /* there's no sense in retrieving value of stateless button */ return -RIG_EINVAL; case RIG_CONF_CHECKBUTTON: @@ -1379,7 +1399,7 @@ status = rig_get_mem(rig, vfo, &ch); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", ch); @@ -1506,7 +1526,7 @@ chan.tx_vfo = rig_parse_vfo(s); } if (mem_caps->rptr_shift) { - printf("rptr shift (+-0): "); + printf("rptr shift (+-0): "); status = scanf("%s", s); chan.rptr_shift = rig_parse_rptr_shift(s); } @@ -1580,7 +1600,7 @@ { int status; channel_t chan; - + memset(&chan, 0, sizeof(channel_t)); if (isdigit(arg1[0])) { @@ -1665,7 +1685,7 @@ status = rig_get_trn(rig, &trn); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", trn); @@ -1678,7 +1698,7 @@ const char *s; s = rig_get_info(rig); - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", s ? s : "None"); @@ -1693,7 +1713,7 @@ char widthbuf[16]; char prntbuf[256]; - fprintf(fout, "Channel: %d, Name: '%s'\n", chan->channel_num, + fprintf(fout, "Channel: %d, Name: '%s'\n", chan->channel_num, chan->channel_desc); fprintf(fout, "VFO: %s, Antenna: %d, Split: %s\n", rig_strvfo(chan->vfo), @@ -1701,12 +1721,12 @@ sprintf_freq(freqbuf, chan->freq); sprintf_freq(widthbuf, chan->width); - fprintf(fout, "Freq: %s\tMode: %s\tWidth: %s\n", + fprintf(fout, "Freq: %s\tMode: %s\tWidth: %s\n", freqbuf, rig_strrmode(chan->mode), widthbuf); sprintf_freq(freqbuf, chan->tx_freq); sprintf_freq(widthbuf, chan->tx_width); - fprintf(fout, "txFreq: %s\ttxMode: %s\ttxWidth: %s\n", + fprintf(fout, "txFreq: %s\ttxMode: %s\ttxWidth: %s\n", freqbuf, rig_strrmode(chan->tx_mode), widthbuf); sprintf_freq(freqbuf,chan->rptr_offs); @@ -1727,7 +1747,7 @@ sprintf_func(prntbuf, chan->funcs); fprintf(fout, "Functions: %s\n", prntbuf); - + fprintf(fout, "Levels:"); for (idx=0; idx<RIG_SETTING_MAX; idx++) { setting_t level = rig_idx2setting(idx); @@ -1798,13 +1818,13 @@ fprintf(fout, "0 0 0 0 0 0 0\n"); for (i=0; i<TSLSTSIZ && !RIG_IS_TS_END(rs->tuning_steps[i]); i++) - fprintf(fout, "0x%x %ld\n", + fprintf(fout, "0x%x %ld\n", rs->tuning_steps[i].modes, rs->tuning_steps[i].ts); fprintf(fout, "0 0\n"); for (i=0; i<FLTLSTSIZ && !RIG_IS_FLT_END(rs->filters[i]); i++) - fprintf(fout, "0x%x %ld\n", + fprintf(fout, "0x%x %ld\n", rs->filters[i].modes, rs->filters[i].width); fprintf(fout, "0 0\n"); @@ -1866,7 +1886,7 @@ status = rig_get_ant(rig, vfo, &ant); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", rig_setting2idx(ant)); @@ -1928,7 +1948,7 @@ status = rig_get_powerstat(rig, &stat); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", stat); @@ -2004,12 +2024,12 @@ retval = read_string(&rs->rigport, buf, BUFSZ, eom_buf, strlen(eom_buf)); if (retval < 0) break; - + if (retval < BUFSZ) buf[retval] = '\0'; else buf[BUFSZ-1] = '\0'; - + fprintf(fout, "%s\n", buf); } while (retval > 0); Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/rigctld.8 2010-01-24 23:24:20 UTC (rev 2813) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTLD "8" "January 14, 2009" "Hamlib" "Rig Control Daemon" +.TH RIGCTLD "8" "January 24, 2010" "Hamlib" "Rig Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -21,14 +21,15 @@ .B rigctld [\fIOPTION\fR]... .SH DESCRIPTION -The \fBrigctld\fP program is an EXPERIMENTAL \fBHamlib\fP rig daemon that -handles TCP client requests. This allows multiple user programs to share one -radio. Multiple radios can be controlled on different TCP ports. The syntax -of the commands are the same as \fBrigctl\fP. It is hoped that \fBrigctld\fP -will be especially useful for languages such as Perl, Python, and others. +The \fBrigctld\fP program is an EXPERIMENTAL \fBHamlib\fP rig control daemon +that handles TCP client requests. This allows multiple user programs to share +one radio. Multiple radios can be controlled on different TCP ports by use of +multiple \fBrigctld\fP processes. The syntax of the commands are the same as +\fBrigctl\fP. It is hoped that \fBrigctld\fP will be especially useful for +languages such as Perl, Python, PHP, and others. .PP .\" TeX users may be more comfortable with the \fB<whatever>\fP and -.\" \fI<whatever>\fP escape sequences to invoke bold face and italics, +.\" \fI<whatever>\fP escape sequences to invoke bold face and italics, .\" respectively. \fBrigctld\fP communicates to a client through a TCP socket using text commands shared with \fBrigctl\fP. The protocol is simple, commands are sent @@ -39,13 +40,19 @@ is zero when successful, otherwise is a regative number indicating the error code. Each line is terminated with a newline '\\n' character. .PP -Keep in mind that \fBHamlib\fP is BETA level software. +A separate \fBblock\fP protocol (-b, or --block option) extends the above +behavior by echoing the received command string as a header, any returned values +as a key: value pair, and the "RPTR x" string as the end of block marker which +includes the \fBHamlib\fP success or failure value. See the \fIPROTOCOL\fP +section for details. +.PP +Keep in mind that \fBHamlib\fP is BETA level software. While a lot of backend libraries lack complete rig support, the basic functions -are usually well supported. The API may change without publicized notice, +are usually well supported. The API may change without publicized notice, while an advancement of the minor version (e.g. 1.1.x to 1.2.x) indicates such a change. .PP -Please report bugs and provide feedback at the e-mail address given in the +Please report bugs and provide feedback at the e-mail address given in the REPORTING BUGS section. Patches and code enhancements are also welcome. .SH OPTIONS This program follows the usual GNU command line syntax, with long @@ -54,11 +61,11 @@ Here is a summary of the supported options: .TP .B \-m, --model=id -Select radio model number. See -l, "list" option below. +Select radio model number. See the -l, --list option below. .TP .B \-r, --rig-file=device Use \fIdevice\fP as the file name of the port the radio is connected. -Often a serial port, but could be a USB to serial adapter. Typically +Often a serial port, but could be a USB to serial adapter. Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. .TP .B \-p, --ptt-file=device @@ -74,7 +81,7 @@ Supported types are RIG (CAT command), DTR, RTS, PARALLEL, NONE. .TP .B \-D, --dcd-type=type -Use \fItype\fP of Data Carrier Detect device. +Use \fItype\fP of Data Carrier Detect device. Supported types are RIG (CAT command), DSR, CTS, CD, PARALLEL, NONE. .TP .B \-s, --serial-speed=baud @@ -82,32 +89,29 @@ backend capabilities (set by -m above) as the default. .TP .B \-c, --civaddr=id -Use \fIid\fP as the CI-V address to communicate with the rig. Only useful for -Icom rigs. +Use \fIid\fP as the CI-V address to communicate with the rig. Only useful for +Icom rigs. .br -NB: The \fIid\fP is in decimal notation, unless prefixed by -\fI0x\fP, in which case it is hexadecimal. +N.B.: The \fIid\fP is in decimal notation, unless prefixed by +\fI0x\fP for a hexadecimal value. .TP -.B \-L, --show-conf -List all config parameters for the radio defined with -m above. +.B \-T, --listen-addr=IPADDR +Use \fIIPADDR\fP as the listening IP address. The default is ANY. .TP +.B \-t, --port=number +Use \fInumber\fP as the TCP listening port. The default is 4532. +.TP .B \-C, --set-conf=parm=val[,parm=val]* Set config parameter. e.g. --set-conf=stop_bits=2 .br Use -L option for a list. .TP -.B \-e, --end-marker -Use END marker in rigctld protocol. -.TP -.B \-t, --port=number -Use \fInumber\fP as the TCP listening port. The default is 4532. -.TP -.B \-T, --listen-addr=IPADDR -Use \fIIPADDR\fP as the listening IP address. The default is ANY. -.TP .B \-l, --list List all model numbers defined in \fBHamlib\fP and exit. .TP +.B \-L, --show-conf +List all config parameters for the radio defined with -m above. +.TP .B \-u, --dump-caps Dump capabilities for the radio defined with -m above and exit. .TP @@ -115,8 +119,17 @@ Set vfo mode, requiring an extra VFO argument in front of each appropriate command. Otherwise, VFO_CURR is assumed when this option is not set. .TP +.B \-b, --block +Use the block rigctld protocol. \fIEXPERIMENTAL\fP +.TP +.B \-e, --end-marker +Use END marker in rigctld protocol. +.br +N.B.: This option can be considered obsolete. Please consider using the block +protocol instead (see \fIPROTOCOL\fP below). +.TP .B \-v, --verbose -Set verbose mode, cumulative (see DIAGNOSTICS below). +Set verbose mode, cumulative (see \fIDIAGNOSTICS\fP below). .TP .B \-h, --help Show a summary of these options and exit. @@ -125,247 +138,252 @@ Show the version of \fBrigctld\fP and exit. .PP \fBN.B.\fP Some options may not be implemented by a given backend and will -return an error. This is most likely to occur with the \fI\-\-set-conf\fP +return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. .PP -Please note that the backend for the radio to be controlled, -or the radio itself may not support some commands. In that case, +Please note that the backend for the radio to be controlled, +or the radio itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error code. .SH COMMANDS -Commands can be sent over the TCP socket either as a single char, or as a -long command name plus the value(s) on one '\\n' terminated line. See -PROTOCOL. +Commands can be sent over the TCP socket either as a single char, or as a +long command name plus the value(s) space separated on one '\\n' terminated +line. See \fIPROTOCOL\fP. .PP Since most of the \fBHamlib\fP operations have a \fIset\fP and a \fIget\fP method, -an upper case letter will be used for \fIset\fP method whereas the +an upper case letter will be used for \fIset\fP method whereas the corresponding lower case letter refers to the \fIget\fP method. Each operation also has a long name, prepend a backslash to send a long command name. .PP Example (Perl): `print $socket "\\\\dump_caps\\n";' to see what the radio's -backend can do. +backend can do (NOTE: In Perl and many other languages a '\\' will need to be +escaped with a preceding '\\' so that even though two backslash characters +appear in the code, only one will be passed to \fBrigctld\fP. This is a +possible bug!). .PP -Please note that the backend for the radio to be controlled, -or the radio itself may not support some commands. In that case, +Please note that the backend for the radio to be controlled, +or the radio itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error message. .PP -Here is a summary of the supported commands: +Here is a summary of the supported commands (In the case of "set" commands the +quoted string is replaced by the value in the description. In the case of "get" +commands the quoted string is the key name of the value returned.): .TP -.B F, set_freq -Set frequency, in Hz. +.B F, set_freq 'Frequency' +Set 'Frequency', in Hz. .TP .B f, get_freq -Get frequency, in Hz. +Get 'Frequency', in Hz. .TP -.B M, set_mode -Set mode/passband: AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, +.B M, set_mode 'Mode' 'Passband' +Set 'Mode': USB, LSB, CW, CWR, RTTY, RTTYR, AM, FM, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. -The passband is the exact passband in Hz, or 0 for the default. +Set 'Passband' in Hz, or 0 for the default. .TP .B m, get_mode -Get mode/passband. +Get 'Mode' 'Passband'. Returns Mode as a string from \fIset_mode\fP above +and Passband in Hz. .TP -.B V, set_vfo -Set VFO: VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. +.B V, set_vfo 'VFO' +Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. .TP .B v, get_vfo -Get current VFO. +Get current 'VFO'. Returns VFO as a string from \fIset_vfo\fP above. .TP -.B J, set_rit -Set RIT, in Hz. +.B J, set_rit 'RIT' +Set 'RIT', in Hz. .TP .B j, get_rit -Get RIT, in Hz. +Get 'RIT', in Hz. .TP -.B Z, set_xit -Set XIT, in Hz. +.B Z, set_xit 'XIT' +Set 'XIT', in Hz. .TP .B z, get_xit -Get XIT, in Hz. +Get 'XIT', in Hz. .TP -.B T, set_ptt -Set PTT, 0 (RX) or 1 (TX). +.B T, set_ptt 'PTT' +Set 'PTT', 0 (RX) or 1 (TX). .TP .B t, get_ptt -Get PTT status. +Get 'PTT' status. .TP -.B get_dcd -Get DCD status. +.B 0x8b, get_dcd +Get 'DCD' (squelch) status, 0 (Closed) or 1 (Open) .TP -.B R, set_rptr_shift -Set repeater shift: "+", "-" or something else for none. +.B R, set_rptr_shift 'Rptr shift' +Set 'Rptr shift': "+", "-" or something else for none. .TP .B r, get_rptr_shift -Get repeater shift. +Get 'Rptr shift'. Returns "+", "-" or "None". .TP -.B O, set_rptr_offs -Set repeater offset, in Hz. +.B O, set_rptr_offs 'Rptr offset' +Set 'Rptr offset', in Hz. .TP .B o, get_rptr_offs -Get repeater offset. +Get 'Rptr offset', in Hz. .TP -.B C, set_ctcss_tone -Set CTCSS tone, in tenth of Hz. +.B C, set_ctcss_tone 'CTCSS tone' +Set 'CTCSS tone', in tenths of Hz. .TP .B c, get_ctcss_tone -Get CTCSS tone, in tenth of Hz. +Get 'CTCSS tone', in tenths of Hz. .TP -.B D, set_dcs_code -Set DCS code. +.B D, set_dcs_code 'DCS code' +Set 'DCS code'. .TP .B d, get_dcs_code -Get DCS code. +Get 'DCS code'. .TP -.B set_ctcss_sql -Set CTCSS squelch tone, in tenth of Hz. +.B 0x90, set_ctcss_sql 'CTCSS sql' +Set 'CTCSS sql' tone, in tenths of Hz. .TP -.B get_ctcss_sql -Get CTCSS squelch tone, in tenth of Hz. +.B 0x91, get_ctcss_sql +Get 'CTCSS sql' tone, in tenths of Hz. .TP -.B set_dcs_sql -Set DCS squelch code. +.B 0x92, set_dcs_sql 'DCS sql' +Set 'DCS sql' code. .TP -.B get_dcs_sql -Get DCS squelch code. +.B 0x93, get_dcs_sql +Get 'DCS sql' code. .TP -.B I, set_split_freq -Set TX frequency, in Hz. +.B I, set_split_freq 'Tx frequency' +Set 'TX frequency', in Hz. .TP .B i, get_split_freq -Get TX frequency. +Get 'TX frequency', in Hz. .TP -.B X, set_split_mode -Set transmit mode/passband: AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, +.B X, set_split_mode 'Tx mode' 'Tx passband' +Set 'Tx mode': AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. -The passband is the exact passband in Hz, or 0 for the default. +The 'Tx passband' is the exact passband in Hz, or 0 for the default. .TP .B x, get_split_mode -Get transmit mode/passband. +Get 'Tx mode' and 'Tx passband'. Returns Tx mode as a string from +\fIset_split_mode\fP above and Tx passband in Hz. .TP -.B S, set_split_vfo -Set split mode, 0 or 1, and transmit VFO. +.B S, set_split_vfo 'Split' 'Tx VFO' +Set 'Split' mode, 0 or 1, and 'Tx VFO'. .TP .B s, get_split_vfo -Get split mode and transmit VFO. +Get 'Split' mode and 'Tx VFO'. .TP -.B N, set_ts -Set tuning step, in Hz. +.B N, set_ts 'Tuning step' +Set 'Tuning step', in Hz. .TP .B n, get_ts -Get tuning step. +Get 'Tuning step', in Hz. .TP -.B U, set_func -Set func/status: -FAGC, NB, COMP, VOX, TONE, TSQL, SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, -RF, ARO, LOCK, MUTE, VSC, REV, SQL, ABM, BC, MBC, AFC, SATMODE, SCOPE, -RESUME, TBURST, TUNER. +.B U, set_func 'Func' 'Func status' +Set 'Func' 'Func status'. Func is one of: FAGC, NB, COMP, VOX, TONE, TSQL, +SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, RF, ARO, LOCK, MUTE, VSC, REV, SQL, +ABM, BC, MBC, AFC, SATMODE, SCOPE, RESUME, TBURST, TUNER. +Func Status argument is a non null value for "activate", "de-activate" +otherwise, much as TRUE/FALSE definitions in C language. .TP .B u, get_func -Get func status. +Get 'Func' 'Func status'. Returns Func as a string from \fIset_func\fP above +and Func status as a non null value. .TP -.B L, set_level -Set level/value: -PREAMP, ATT, VOX, AF, RF, SQL, IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, RFPOWER, -MICGAIN, KEYSPD, NOTCHF, COMP, AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. -SLOPE_LOW, SLOPE_HIGH, RAWSTR, SQLSTAT, SWR, ALC, STRENGTH. +.B L, set_level 'Level' 'Level value' +Set 'Level' and 'Level value'. Level is one of: PREAMP, ATT, VOX, AF, RF, SQL, +IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, RFPOWER, MICGAIN, KEYSPD, NOTCHF, COMP, +AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. SLOPE_LOW, SLOPE_HIGH, RAWSTR, +SQLSTAT, SWR, ALC, STRENGTH. +The Level value can be a float or an integer. .TP .B l, get_level -Get level value. +Get 'Level' 'Level value'. Returns Level as a string from \fIset_level\fP +above and Level value as a float or integer. .TP -.B P, set_parm -Set parm/value: -ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT. +.B P, set_parm 'Parm' 'Parm value' +Set 'Parm' 'Parm value' Parm is one of: ANN, APO, BACKLIGHT, BEEP, TIME, BAT, +KEYLIGHT. .TP .B p, get_parm -Get parm value. +Get 'Parm' 'Parm value'. Returns Parm as a string from \fIset_parm\fP +above and Parm value as a float or integer. .TP -.B B, set_bank -Set bank. +.B B, set_bank 'Bank' +Set 'Bank'. Sets the current memory bank number. .TP -.B E, set_mem -Set memory channel number. +.B E, set_mem 'Memory#' +Set 'Memory#' channel number. .TP .B e, get_mem -Get memory channel number. +Get 'Memory#' channel number. .TP -.B G, vfo_op -Perform VFO operation: -CPY, XCHG, FROM_VFO, TO_VFO, MCL, UP, DOWN, BAND_UP, BAND_DOWN, LEFT, RIGHT, -TUNE, TOGGLE. +.B G, vfo_op 'Mem/VFO op' +Perform 'Mem/VFO op'. Mem VFO operation is one of: CPY, XCHG, FROM_VFO, TO_VFO, +MCL, UP, DOWN, BAND_UP, BAND_DOWN, LEFT, RIGHT, TUNE, TOGGLE. .TP -.B g, scan_op -Perform scan operation/channel: STOP, MEM, SLCT, PRIO, PROG, DELTA, VFO, PLT. +.B g, scan 'Scan fct' 'Scan channel' +Perform 'Scan fct' 'Scan channel'. Scan function/channel is one of: STOP, MEM, +SLCT, PRIO, PROG, DELTA, VFO, PLT. .TP -.B H, set_channel -Set memory channel data. Not implemented yet. +.B H, set_channel 'Channel' +Set memory 'Channel' data. Not implemented yet. .TP .B h, get_channel -Get memory channel data. +Get memory 'Channel' data. .TP -.B A, set_trn -Set transceive mode (reporting event): OFF, RIG, POLL. +.B A, set_trn 'Transceive' +Set 'Transceive' mode (reporting event): OFF, RIG, POLL. .TP .B a, get_trn -Get transceive mode (reporting event). +Get 'Transceive' mode (reporting event) as in \fIset_trn\fP above. .TP -.B Y, set_ant -Set antenna number (0, 1, 2, ..). +.B Y, set_ant 'Antenna' +Set 'Antenna' number (0, 1, 2, ..). .TP .B y, get_ant -Get antenna number (0, 1, 2, ..). +Get 'Antenna' number (0, 1, 2, ..). .TP -.B *, reset -Reset. +.B *, reset 'Reset' +Perform rig 'Reset'. 0 = None, 1 = Software reset, 2 = VFO reset, 4 = Memory +Clear reset, 8 = Master reset. Since these values are defined as a bitmask in +rig.h, it should be possible to AND these values together to do multiple resets +at once, if the backend supports it or supports a reset action via rig control +at all. .TP -.B b, send_morse -Send morse symbols. +.B b, send_morse 'Morse' +Send 'Morse' symbols. .TP -.B 0x87, set_powerstat -Set power status. +.B 0x87, set_powerstat 'Status' +Set power On/Off/Standby 'Status'. 0 = Power Off, 1 = Power On, 2 = Power +Standby. Defined as a bitmask in rig.h. .TP .B 0x88, get_powerstat -Get power status. +Get power On/Off/Standby 'Status' as in \fIset_powerstat\fP above. .TP -.B 0x89, send_dtmf -Set DTMF digits. +.B 0x89, send_dtmf 'Digits' +Set DTMF 'Digits'. .TP .B 0x8a, recv_dtmf -Get DTMF digits. +Get DTMF 'Digits'. .TP .B _, get_info -Get misc information about the rig. +Get misc information about the rig (no value is passed). .TP .B 1, dump_caps -Not a real rig remote command, it just dumps capabilities, i.e. what the +Not a real rig remote command, it just dumps capabilities, i.e. what the backend knows about this model, and what it can do. TODO: Ensure this is in a consistent format so it can be read into a hash, dictionary, etc. .TP .B 2, power2mW -Converts a power value in a range of \fI0.0 ... 1.0\fP to the real transmit -power in milli-Watts. The \fIfrequency\fP and \fImode\fP also need to be +Converts a power value in a range of \fI0.0 ... 1.0\fP to the real transmit +power in milli-Watts. The \fIfrequency\fP and \fImode\fP also need to be provided as output power may vary according to these values. .TP -.B w, send_cmd -Send raw command string to rig. +.B w, send_cmd 'Cmd' +Send raw command string to rig. .br -For binary protocols enter values as \\0xAA\\0xBB - -.SH EXAMPLES -Start \fBrigctld\fP for a Yaesu FT-920 using an USB-to-serial adapter and -backgrounding: -.PP -$ rigctld -m 114 -r /dev/ttyUSB1 & -.PP -Start \fBrigctld\fP for a Yaesu FT-920 using a USB to serial adapter while -setting baud rate and stop bits and backgrounding: -.PP -$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 & -.PP -Connect to the already running \fBrigctld\fP, and set current frequency to 14.266 MHz: -.PP -$ echo "\\set_freq 14266000" | nc localhost 4532 +For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the +rig which will likely be a binary block or an ASCII string. .SH PROTOCOL +\fBDefault Protocol\fP +.br The \fBrigctld\fP protocol is intentionally simple. Commands are entered on a single line with any needed values. In Perl, reliable results are obtained by terminating each command string with a newline character, '\\n'. @@ -378,36 +396,102 @@ .PP Responses from \fBrigctld\fP are text values and match the same tokens used in the \fIset\fP commands. Each value is returned on its own line. To -signal the end of a response the "END\\n" string is sent when the '-e' option -is passed. +signal the end of a response "0\\n" is returned. .PP Example \fIget\fP (Perl code): print $socket "f\\n"; "14250000\\n" -.br -"END\\n" .PP Most \fIget\fP functions return one to three values. A notable exception is -the \fIdump_caps\fP function which returns many lines of key:value pairs. +the \fI\\dump_caps\fP function which returns many lines of key:value pairs. Future work will focus on making this output compatible with assignment to a hash, dictionary, or other key:value variable. +.PP +\fBBlock Protocol\fP +.br +An \fIEXPERIMENTAL\fP Block protocol has been introduced into \fBrigctld\fP +as of January 24, 2010. This protocol adds several rules to the strings +returned by \fBrigctld\fP. +.PP +1. The command received by \fBrigctld\fP is echoed with its long command name +followed by the value(s) received from the client terminated by a newline +as the first line of the block. +.PP +2. The last line of each block is the string "RPTR \fIx\fP\\n" wheren \fIx\fP is +the numeric return value of the Hamlib backend function that was called by the +command. +.PP +3. Any lines consisting of data values returned by the rig backend are prepended +by a string immediately followed by a colon then a space and then the value +terminated by a newline. e.g. "Frequency: 14250000\\n" +.PP +4. All commands received will be acknowledged by \fBrigctld\fP with lines from +rules 1 and 2. Lines from rule 3 are only returned when data values must be +returned to the client. +.PP +An example response to a \fI\\set_mode\fP command: +.br +set_mode: USB 2400 +.br +RPRT 0 +.PP +In this case the long command name and values are returned on the first line and +the second line contains the end of block marker and the numeric rig backend +return value indicating success. +.PP +An example response to a \fI\\get_mode\fP query: +.br +get_mode: +.br +Mode: CW +.br +Passband: 2400 +.br +RPRT 0 +.PP +In this case, as no value is passed to \fBrigctld\fP, the first line consists +only of the long command name. The final line shows that the command was +processed successfully by the rig backend. +.PP +The following commands have been tested with the Block protocol and the included +`testctld.pl' script: +.br +\fI\\set_freq\fP \fI\\get-freq\fP +.br +\fI\\set_mode\fP \fI\\get_mode\fP +.SH EXAMPLES +Start \fBrigctld\fP for a Yaesu FT-920 using an USB-to-serial adapter and +backgrounding: +.PP +$ rigctld -m 114 -r /dev/ttyUSB1 & +.PP +Start \fBrigctld\fP for a Yaesu FT-920 using a USB to serial adapter while +setting baud rate and stop bits and backgrounding: +.PP +$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 & +.PP +Connect to the already running \fBrigctld\fP, and set current frequency to 14.266 MHz: +.PP +$ echo "\\set_freq 14266000" | nc localhost 4532 .SH DIAGNOSTICS -The \fB-v\fP, \fB--version\fP option allows different levels of diagnostics -to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, --vvv for WARN, -vvvv for VERBOSE, or -vvvvv for TRACE. +The \fB-v\fP, \fB--verbose\fP, option allows different levels of diagnostics +to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, +-vvv for WARN, -vvvv for VERBOSE, or -vvvvv for TRACE. .PP A given verbose level is useful for providing needed debugging information to the email address below. For example, TRACE output shows all of the values sent to and received from the radio which is very useful for radio backend -library development and may be requested by the developers. +library development and may be requested by the developers. See the +\fBREADME.betatester\fP and \fBREADME.developer\fP files for more information. .SH SECURITY -No authentication whatsoever; DO NOT leave this TCP port open wide to the -Internet. Please ask if stronger security is needed. +No authentication whatsoever; DO NOT leave this TCP port open wide to the +Internet. Please ask if stronger security is needed or consider using an +SSH tunnel. .SH BUGS The daemon is not detaching and backgrounding itself. - +.br Much testing needs to be done. .SH REPORTING BUGS Report bugs to <ham...@li...>. @@ -418,7 +502,7 @@ .br <http://www.hamlib.org>. .SH COPYRIGHT -Copyright \(co 2000-2009 Stephane Fillod and the Hamlib Group. +Copyright \(co 2000-2010 Stephane Fillod and the Hamlib Group. .PP This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY Modified: trunk/tests/rigctld.c =================================================================== --- trunk/tests/rigctld.c 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/rigctld.c 2010-01-24 23:24:20 UTC (rev 2813) @@ -4,23 +4,23 @@ * This program test/control a radio using Hamlib. * It takes commands from network connection. * - * $Id: rigctld.c,v 1.11 2009-01-04 14:49:17 fillods Exp $ + * $Id: rigctld.c,v 1.11 2009-01-04 14:49:17 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -63,12 +63,12 @@ #include "rigctl_parse.h" /* - * Reminder: when adding long options, + * Reminder: when adding long options, * keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks. * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file */ -#define SHORT_OPTIONS "m:r:p:d:P:D:s:c:lC:t:T:LeuovhV" +#define SHORT_OPTIONS "m:r:p:d:P:D:s:c:T:t:C:lLuobevhV" static struct option long_options[] = { {"model", 1, 0, 'm'}, @@ -79,13 +79,14 @@ {"dcd-type", 1, 0, 'D'}, {"serial-speed", 1, 0, 's'}, {"civaddr", 1, 0, 'c'}, + {"listen-addr", 1, 0, 'T'}, {"port", 1, 0, 't'}, - {"listen-addr", 1, 0, 'T'}, + {"set-conf", 1, 0, 'C'}, {"list", 0, 0, 'l'}, - {"set-conf", 1, 0, 'C'}, {"show-conf",0, 0, 'L'}, {"dump-caps", 0, 0, 'u'}, {"vfo", 0, 0, 'o'}, + {"block", 0, 0, 'b'}, {"end-marker", 0, 0, 'e'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, @@ -104,8 +105,9 @@ void usage(void); int interactive = 1; /* no cmd because of daemon */ -int prompt= 0 ; /* Daemon mode for rigparse return string */ -int opt_end= 0 ; /* END marker for rigctld */ +int prompt = 0; /* Daemon mode for rigparse return string */ +int opt_end = 0; /* END marker for rigctld */ +int opt_block = 0; /* Block markers for rigctld */ int vfo_mode; /* vfo_mode=0 means target VFO is current VFO */ char send_cmd_term = '\r'; /* send_cmd termination char */ @@ -116,7 +118,7 @@ #define MAXCONFLEN 128 int main (int argc, char *argv[]) -{ +{ RIG *my_rig; /* handle to rig (instance) */ rig_model_t my_model = RIG_MODEL_DUMMY; @@ -278,13 +280,17 @@ case 'e': opt_end = 1; break; + case 'b': + opt_block = 1; + break; default: usage(); /* unknown option? */ exit(1); } } - rig_set_debug(verbose<2 ? RIG_DEBUG_WARN: verbose); +// rig_set_debug(verbose < 2 ? RIG_DEBUG_WARN: verbose); + rig_set_debug(verbose); rig_debug(RIG_DEBUG_VERBOSE, "rigctld, %s\n", hamlib_version); rig_debug(RIG_DEBUG_VERBOSE, "Report bugs to " @@ -293,7 +299,7 @@ my_rig = rig_init(my_model); if (!my_rig) { - fprintf(stderr, "Unknown rig num %d, or initialization error.\n", + fprintf(stderr, "Unknown rig num %d, or initialization error.\n", my_model); fprintf(stderr, "Please check with --list option.\n"); exit(2); @@ -308,7 +314,7 @@ if (rig_file) strncpy(my_rig->state.rigport.pathname, rig_file, FILPATHLEN); - /* + /* * ex: RIG_PTT_PARALLEL and /dev/parport0 */ if (ptt_type != RIG_PTT_NONE) @@ -351,18 +357,18 @@ if (verbose > 0) printf("Opened rig model %d, '%s'\n", my_rig->caps->rig_model, my_rig->caps->model_name); - rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", + rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rig->caps->version, rig_strstatus(my_rig->caps->status)); /* * Prepare listening socket */ - sock_listen = socket(AF_INET, SOCK_STREAM, 0); + sock_listen = socket(AF_INET, SOCK_STREAM, 0); if (sock_listen < 0) { perror("ERROR opening socket"); exit(2); } - memset((char *) &serv_addr, 0, sizeof(serv_addr)); + memset((char *)&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(portno); @@ -370,15 +376,15 @@ if (setsockopt(sock_listen, SOL_SOCKET, SO_REUSEADDR, - (char *)&reuseaddr,sizeof(reuseaddr)) < 0) { + (char *)&reuseaddr, sizeof(reuseaddr)) < 0) { rig_debug(RIG_DEBUG_ERR, "setsockopt: %s\n", strerror(errno)); exit (1); } - if (bind(sock_listen, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) { + if (bind(sock_listen, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { rig_debug(RIG_DEBUG_ERR, "binding: %s\n", strerror(errno)); exit (1); } - if (listen(sock_listen,4) < 0) { + if (listen(sock_listen, 4) < 0) { rig_debug(RIG_DEBUG_ERR, "listening: %s\n", strerror(errno)); exit (1); } @@ -401,7 +407,7 @@ arg->rig = my_rig; arg->clilen = sizeof(arg->cli_addr); - arg->sock = accept(sock_listen, (struct sockaddr *) &arg->cli_addr, + arg->sock = accept(sock_listen, (struct sockaddr *)&arg->cli_addr, &arg->clilen); if (arg->sock < 0) { rig_debug(RIG_DEBUG_ERR, "accept: %s\n", strerror(errno)); @@ -511,6 +517,7 @@ " -l, --list list all model numbers and exit\n" " -u, --dump-caps dump capabilities and exit\n" " -o, --vfo do not default to VFO_CURR, require extra vfo arg\n" + " -b, --block use block rigctld protocol\n", " -e, --end-marker use END marker in rigctld protocol\n" " -v, --verbose set verbose mode, cumulative\n" " -h, --help display this help and exit\n" Modified: trunk/tests/testctld.pl =================================================================== --- trunk/tests/testctld.pl 2010-01-24 23:18:44 UTC (rev 2812) +++ trunk/tests/testctld.pl 2010-01-24 23:24:20 UTC (rev 2813) @@ -3,7 +3,7 @@ # testctld.pl - (C) Nate Bargmann 2008 # A Perl test script for the rigctld program. -# $Id: testctld.pl,v 1.3 2008-01-10 03:42:35 n0nb Exp $ +# $Id$ # It connects to the rigctld TCP port (default 4532) and queries # the daemon for some common rig information. It also aims to provide @@ -13,12 +13,12 @@ # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. -# +# # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. @@ -27,39 +27,71 @@ # Perl modules this script uses use warnings; use strict; -use IO::Socket; +use IO::Socket::INET; # Local variables my $socket; my @answer; -my $freq = "14250000"; -my $mode = "USB"; -my $bw = "2400"; +my $get_freq; +my $get_mode; +my $get_bw; my $flags; +# values to set rig +my $set_freq = "14250000"; +my $set_mode = "USB"; +my $set_bw = "2400"; + # Thanks to Uri Guttman on comp.lang.perl.misc for this function sub get_results { my ($sock) = @_; my @lines; + my $errno; + my $line; +# my $x; - while (my $line = <$sock>) { + do { + while ( !($line = $sock->getline)) { ;} + print $line; - return @lines if $line =~ /^END$/; - push @lines, $line; - } +# return @lines if $line =~ /^RPRT\s+0$/; + if ($line) { + print $line; + push @lines, $line; + } +# else { +# return @lines; +# } + #if ($line =~ /^RPRT.*$/) { + #print $line; + #$errno = (split $line)[1]; + #print $errno; + #unless ($errno) { + #return @lines; + #} + #else { + #return $errno * -1; + #} + #} + #else { + #push @lines, $line; + #} + } until ($line ne ""); + return @lines; } -# Create the new socket. -# 'localhost' may be replaced by any hostname or IP address where a +# Create the new socket. +# 'localhost' may be replaced by any hostname or IP address where a # rigctld instance is running. # Timeout is set to 5 seconds. -$socket = new IO::Socket::INET (PeerAddr => 'localhost', +$socket = IO::Socket::INET->new(PeerAddr => 'localhost', PeerPort => 4532, Proto => 'tcp', Type => SOCK_STREAM, - Timeout => 5 ) + Timeout => 5, + Blocking => 0 ) or die $@; # Query rigctld for the rig's frequency @@ -69,8 +101,12 @@ # Get the rig's frequency from rigctld and print it to STDOUT # N.B. Replies are newline terminated, so lines in @answer end with '\n'. @answer = get_results($socket); +#$get_freq = <$socket>; +#$get_freq = $socket->getline; +#chomp($get_freq); print "The rig's frequency is: $answer[0]"; +#print "The rig's frequency is: $get_freq\n"; # Extra newline for screen formatting. print "\n"; @@ -78,26 +114,41 @@ # Do the same for the mode (reading the mode also returns the bandwidth) print $socket "m\n"; @answer = get_results($socket); +#$get_mode = <$socket>; +#chomp($get_mode); +#$get_bw = <$socket>; +#chomp($get_bw); + +#print "The rig's mode is: $get_mode\n"; +#print "The rig's bandwidth is: $get_bw\n"; print "The rig's mode is: $answer[0]"; print "The rig's bandwidth is: $answer[1]"; print "\n"; # Now set the rig's frequency -print "Setting the rig's frequency to: $freq\n"; -print $socket "F $freq\n"; -print $socket "f\n"; -@answer = get_results($socket); -print "The rig's frequency is now: $answer[0]"; -print "\n"; +#print "Setting the rig's frequency to: $set_freq\n"; +#print $socket "F $set_freq\n"; +#<$socket>; +#print $socket "f\n"; +#@answer = get_results($socket); +#$get_freq = <$socket>; +#chomp($get_freq); +#print "The rig's frequency is now: $get_freq\n"; +#print "\n"; # Setting the mode takes two parameters, mode and bandwidth -print "Setting the rig's mode to $mode and bandwidth to $bw\n"; -print $socket "\\set_mode $mode $bw\n"; -print $socket "\\get_mode\n"; -@answer = get_results($socket); -print "The rig's mode is now: $answer[0]"; -print "The rig's bandwidth is now: $answer[1]"; -print "\n"; +#print "Setting the rig's mode to $set_mode and bandwidth to $set_bw\n"; +#print $socket "\\set_mode $set_mode $set_bw\n"; +#<$socket>; +#print $socket "\\get_mode\n"; +#@answer = get_results($socket); +#$get_mode = <$socket>; +#chomp($get_mode); +#$get_bw = <$socket>; +#chomp($get_bw); +#print "The rig's mode is now: $get_mode\n"; +#print "The rig's bandwidth is now: $get_bw\n"; +#print "\n"; # Close the connection before we exit. close($socket); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-04 02:43:18
|
Revision: 2820 http://hamlib.svn.sourceforge.net/hamlib/?rev=2820&view=rev Author: n0nb Date: 2010-02-04 00:53:56 +0000 (Thu, 04 Feb 2010) Log Message: ----------- Added two new commands to rigctl_parse.c, \chk_blk and \chk_vfo to allow clients to query the state of the -b|--block or -o|--vfo options from rigctld Cleaned up strings in dumpcaps.c to remove duplicates to facilite their use as key:value pairs Updated rigctld man page for new commands Modified Paths: -------------- trunk/tests/dumpcaps.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 trunk/tests/rigctld.c Modified: trunk/tests/dumpcaps.c =================================================================== --- trunk/tests/dumpcaps.c 2010-01-28 22:44:56 UTC (rev 2819) +++ trunk/tests/dumpcaps.c 2010-02-04 00:53:56 UTC (rev 2820) @@ -3,23 +3,23 @@ * This programs dumps the capabilities of a backend rig. * * - * $Id: dumpcaps.c,v 1.52 2009-01-28 22:49:58 fillods Exp $ + * $Id: dumpcaps.c,v 1.52 2009-01-28 22:49:58 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -45,12 +45,12 @@ * the rig may be in rig_init state, but not openned */ int dumpcaps (RIG* rig, FILE *fout) -{ +{ const struct rig_caps *caps; - int status,i; - int can_esplit,can_echannel; + int status, i; + int can_esplit, can_echannel; char freqbuf[20]; - int backend_warnings=0; + int backend_warnings = 0; static char prntbuf[1024]; /* a malloc would be better.. */ if (!rig || !rig->caps) @@ -58,11 +58,11 @@ caps = rig->caps; - fprintf(fout, "Caps dump for model %d\n",caps->rig_model); - fprintf(fout, "Model name:\t%s\n",caps->model_name); - fprintf(fout, "Mfg name:\t%s\n",caps->mfg_name); - fprintf(fout, "Backend version:\t%s\n",caps->version); - fprintf(fout, "Backend copyright:\t%s\n",caps->copyright); + fprintf(fout, "Caps dump for model: %d\n", caps->rig_model); + fprintf(fout, "Model name:\t%s\n", caps->model_name); + fprintf(fout, "Mfg name:\t%s\n", caps->mfg_name); + fprintf(fout, "Backend version:\t%s\n", caps->version); + fprintf(fout, "Backend copyright:\t%s\n", caps->copyright); fprintf(fout, "Backend status:\t%s\n", rig_strstatus(caps->status)); fprintf(fout, "Rig type:\t"); switch (caps->rig_type & RIG_TYPE_MASK) { @@ -104,16 +104,16 @@ fprintf(fout, "PTT type:\t"); switch (caps->ptt_type) { case RIG_PTT_RIG: - fprintf(fout, "rig capable\n"); + fprintf(fout, "Rig capable\n"); break; case RIG_PTT_PARALLEL: - fprintf(fout, "thru parallel port (DATA0)\n"); + fprintf(fout, "Parallel port (DATA0)\n"); break; case RIG_PTT_SERIAL_RTS: - fprintf(fout, "thru serial port (CTS/RTS)\n"); + fprintf(fout, "Serial port (CTS/RTS)\n"); break; case RIG_PTT_SERIAL_DTR: - fprintf(fout, "thru serial port (DTR/DSR)\n"); + fprintf(fout, "Serial port (DTR/DSR)\n"); break; case RIG_PTT_NONE: fprintf(fout, "None\n"); @@ -126,19 +126,19 @@ fprintf(fout, "DCD type:\t"); switch (caps->dcd_type) { case RIG_DCD_RIG: - fprintf(fout, "rig capable\n"); + fprintf(fout, "Rig capable\n"); break; case RIG_DCD_PARALLEL: - fprintf(fout, "thru parallel port (DATA1? STROBE?)\n"); + fprintf(fout, "Parallel port (DATA1? STROBE?)\n"); break; case RIG_DCD_SERIAL_CTS: - fprintf(fout, "thru serial port (CTS/RTS)\n"); + fprintf(fout, "Serial port (CTS/RTS)\n"); break; case RIG_DCD_SERIAL_DSR: - fprintf(fout, "thru serial port (DTR/DSR)\n"); + fprintf(fout, "Serial port (DTR/DSR)\n"); break; case RIG_DCD_SERIAL_CAR: - fprintf(fout, "thru serial port (CD)\n"); + fprintf(fout, "Serial port (CD)\n"); break; case RIG_DCD_NONE: fprintf(fout, "None\n"); @@ -157,13 +157,13 @@ fprintf(fout, "Parallel\n"); break; case RIG_PORT_DEVICE: - fprintf(fout, "device driver\n"); + fprintf(fout, "Device driver\n"); break; case RIG_PORT_USB: fprintf(fout, "USB\n"); break; case RIG_PORT_NETWORK: - fprintf(fout, "network link\n"); + fprintf(fout, "Network link\n"); break; case RIG_PORT_NONE: fprintf(fout, "None\n"); @@ -174,67 +174,67 @@ } fprintf(fout, "Serial speed: %d..%d bauds, %d%c%d %s\n", caps->serial_rate_min, - caps->serial_rate_max,caps->serial_data_bits, - caps->serial_parity==RIG_PARITY_NONE?'N': - (caps->serial_parity==RIG_PARITY_ODD?'O':'E'), + caps->serial_rate_max, caps->serial_data_bits, + caps->serial_parity == RIG_PARITY_NONE ? 'N': + (caps->serial_parity == RIG_PARITY_ODD ? 'O' : 'E'), caps->serial_stop_bits, - caps->serial_handshake==RIG_HANDSHAKE_NONE?"": - (caps->serial_handshake==RIG_HANDSHAKE_XONXOFF?"XONXOFF":"CTS/RTS") + caps->serial_handshake == RIG_HANDSHAKE_NONE ? "" : + (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? "XONXOFF" : "CTS/RTS") ); - fprintf(fout, "Write delay %dms, timeout %dms, %d retry\n", - caps->write_delay,caps->timeout,caps->retry); - fprintf(fout, "Post Write delay %dms\n", + fprintf(fout, "Write delay: %dms, timeout %dms, %d retry\n", + caps->write_delay, caps->timeout, caps->retry); + fprintf(fout, "Post Write delay: %dms\n", caps->post_write_delay); fprintf(fout, "Has targetable VFO: %s\n", - caps->targetable_vfo?"yes":"no"); + caps->targetable_vfo ? "Y" : "N"); fprintf(fout, "Has transceive: %s\n", - caps->transceive?"yes":"no"); + caps->transceive ? "Y" : "N"); fprintf(fout, "Announce: 0x%x\n", caps->announces); - fprintf(fout, "Max RIT: -%ld.%ldkHz/+%ld.%ldkHz\n", - caps->max_rit/1000, caps->max_rit%1000, - caps->max_rit/1000, caps->max_rit%1000); + fprintf(fout, "Max RIT: -%ld.%ldkHz/+%ld.%ldkHz\n", + caps->max_rit / 1000, caps->max_rit % 1000, + caps->max_rit / 1000, caps->max_rit % 1000); - fprintf(fout, "Max XIT: -%ld.%ldkHz/+%ld.%ldkHz\n", - caps->max_xit/1000, caps->max_xit%1000, - caps->max_xit/1000, caps->max_xit%1000); + fprintf(fout, "Max XIT: -%ld.%ldkHz/+%ld.%ldkHz\n", + caps->max_xit / 1000, caps->max_xit % 1000, + caps->max_xit / 1000, caps->max_xit % 1000); - fprintf(fout, "Max IF-SHIFT: -%ld.%ldkHz/+%ld.%ldkHz\n", - caps->max_ifshift/1000, caps->max_ifshift%1000, - caps->max_ifshift/1000, caps->max_ifshift%1000); + fprintf(fout, "Max IF-SHIFT: -%ld.%ldkHz/+%ld.%ldkHz\n", + caps->max_ifshift / 1000, caps->max_ifshift % 1000, + caps->max_ifshift / 1000, caps->max_ifshift % 1000); fprintf(fout, "Preamp:"); - for(i=0; i<MAXDBLSTSIZ && caps->preamp[i] != 0; i++) + for(i = 0; i < MAXDBLSTSIZ && caps->preamp[i] != 0; i++) fprintf(fout, " %ddB", caps->preamp[i]); if (i == 0) - fprintf(fout, " none"); + fprintf(fout, " None"); fprintf(fout, "\n"); fprintf(fout, "Attenuator:"); - for(i=0; i<MAXDBLSTSIZ && caps->attenuator[i] != 0; i++) + for(i = 0; i < MAXDBLSTSIZ && caps->attenuator[i] != 0; i++) fprintf(fout, " %ddB",caps->attenuator[i]); if (i == 0) - fprintf(fout, " none"); + fprintf(fout, " None"); fprintf(fout, "\n"); fprintf(fout, "CTCSS:"); - for(i=0; caps->ctcss_list && i<60 && caps->ctcss_list[i] != 0; i++) { - fprintf(fout, " %d.%1d",caps->ctcss_list[i]/10,caps->ctcss_list[i]%10); + for(i = 0; caps->ctcss_list && i < 60 && caps->ctcss_list[i] != 0; i++) { + fprintf(fout, " %d.%1d", caps->ctcss_list[i] / 10, caps->ctcss_list[i] % 10); } if (i == 0) - fprintf(fout, " none"); + fprintf(fout, " None"); else fprintf(fout, " Hz, %d tones", i); fprintf(fout, "\n"); fprintf(fout, "DCS:"); - for(i=0; caps->dcs_list && i<128 && caps->dcs_list[i] != 0; i++) { - fprintf(fout, " %d",caps->dcs_list[i]); + for(i = 0; caps->dcs_list && i < 128 && caps->dcs_list[i] != 0; i++) { + fprintf(fout, " %d", caps->dcs_list[i]); } if (i == 0) - fprintf(fout, " none"); + fprintf(fout, " None"); else fprintf(fout, ", %d codes", i); fprintf(fout, "\n"); @@ -248,23 +248,25 @@ sprintf_level_gran(prntbuf, caps->has_get_level, caps->level_gran); fprintf(fout, "Get level: %s\n", prntbuf); - if ((caps->has_get_level&RIG_LEVEL_SQLSTAT)) { - fprintf(fout, "Warning: backend uses deprecated SQLSTAT level!\n"); + if ((caps->has_get_level & RIG_LEVEL_SQLSTAT)) { + fprintf(fout, "Warning--backend uses deprecated SQLSTAT level!\n"); backend_warnings++; } - if ((caps->has_get_level&RIG_LEVEL_RAWSTR) && + if ((caps->has_get_level & RIG_LEVEL_RAWSTR) && caps->str_cal.size == 0) { - fprintf(fout, "Warning: backend has get RAWSTR, but not calibration data\n"); + fprintf(fout, "Warning--backend has get RAWSTR, but not calibration data\n"); backend_warnings++; } sprintf_level_gran(prntbuf, caps->has_set_level, caps->level_gran); fprintf(fout, "Set level: %s\n", prntbuf); - if (caps->has_set_level&RIG_LEVEL_READONLY_LIST) { - fprintf(fout, "Warning: backend can set readonly levels!\n"); + + if (caps->has_set_level & RIG_LEVEL_READONLY_LIST) { + fprintf(fout, "Warning--backend can set readonly levels!\n"); backend_warnings++; } + fprintf(fout, "Extra levels:"); rig_ext_level_foreach(rig, print_ext, fout); fprintf(fout, "\n"); @@ -274,8 +276,8 @@ sprintf_parm_gran(prntbuf, caps->has_set_parm, caps->parm_gran); fprintf(fout, "Set parameters: %s\n", prntbuf); - if (caps->has_set_parm&RIG_PARM_READONLY_LIST) { - fprintf(fout, "Warning: backend can set readonly parms!\n"); + if (caps->has_set_parm & RIG_PARM_READONLY_LIST) { + fprintf(fout, "Warning--backend can set readonly parms!\n"); backend_warnings++; } fprintf(fout, "Extra parameters:"); @@ -283,10 +285,10 @@ fprintf(fout, "\n"); - if (rig->state.vfo_list!=0) + if (rig->state.vfo_list != 0) sprintf_vfo(prntbuf, rig->state.vfo_list); else - strcpy(prntbuf," none! This backend might be bogus!\n"); + strcpy(prntbuf,"None. This backend might be bogus!\n"); fprintf(fout, "VFO list: %s\n", prntbuf); sprintf_vfop(prntbuf, caps->vfo_ops); @@ -299,44 +301,45 @@ fprintf(fout, "Memory name desc size:\t%d\n", caps->chan_desc_sz); fprintf(fout, "Memories:"); - for (i=0; i<CHANLSTSIZ && caps->chan_list[i].type; i++) { + for (i = 0; i < CHANLSTSIZ && caps->chan_list[i].type; i++) { fprintf(fout, "\n\t%d..%d: \t%s", caps->chan_list[i].start, caps->chan_list[i].end, rig_strmtype(caps->chan_list[i].type)); - fprintf(fout, "\n\t mem caps: "); + fprintf(fout, "\n\t Mem caps: "); dump_chan_caps(&caps->chan_list[i].mem_caps, fout); } if (i == 0) - fprintf(fout, " none"); + fprintf(fout, " None"); fprintf(fout, "\n"); /* TODO: print rx/tx ranges here */ - status = range_sanity_check(caps->tx_range_list1,0); - fprintf(fout, "TX ranges status, region 1:\t%s (%d)\n",status?"Bad":"OK",status); + status = range_sanity_check(caps->tx_range_list1, 0); + fprintf(fout, "TX ranges status, region 1:\t%s (%d)\n", status ? "Bad" : "OK", status); if (status) backend_warnings++; - status = range_sanity_check(caps->rx_range_list1,1); - fprintf(fout, "RX ranges status, region 1:\t%s (%d)\n",status?"Bad":"OK",status); + status = range_sanity_check(caps->rx_range_list1, 1); + fprintf(fout, "RX ranges status, region 1:\t%s (%d)\n", status ? "Bad" : "OK", status); if (status) backend_warnings++; - status = range_sanity_check(caps->tx_range_list2,0); - fprintf(fout, "TX ranges status, region 2:\t%s (%d)\n",status?"Bad":"OK",status); + status = range_sanity_check(caps->tx_range_list2, 0); + fprintf(fout, "TX ranges status, region 2:\t%s (%d)\n", status ? "Bad" : "OK", status); if (status) backend_warnings++; - status = range_sanity_check(caps->rx_range_list2,1); - fprintf(fout, "RX ranges status, region 2:\t%s (%d)\n",status?"Bad":"OK",status); + status = range_sanity_check(caps->rx_range_list2, 1); + fprintf(fout, "RX ranges status, region 2:\t%s (%d)\n", status ? "Bad" : "OK", status); if (status) backend_warnings++; fprintf(fout, "Tuning steps:"); - for (i=0; i<TSLSTSIZ && !RIG_IS_TS_END(caps->tuning_steps[i]); i++) { + for (i = 0; i < TSLSTSIZ && !RIG_IS_TS_END(caps->tuning_steps[i]); i++) { if (caps->tuning_steps[i].ts == RIG_TS_ANY) - strcpy(freqbuf, "ANY"); + strcpy(freqbuf, "ANY"); /* strcpy! Looks safe for now */ else - sprintf_freq(freqbuf,caps->tuning_steps[i].ts); - sprintf_mode(prntbuf,caps->tuning_steps[i].modes); + sprintf_freq(freqbuf, caps->tuning_steps[i].ts); + + sprintf_mode(prntbuf, caps->tuning_steps[i].modes); fprintf(fout, "\n\t%s: \t%s", freqbuf, prntbuf); } - if (i==0) { - fprintf(fout, " none! This backend might be bogus!"); - backend_warnings++; + if (i == 0) { + fprintf(fout, " None! This backend might be bogus!"); + backend_warnings++; } fprintf(fout, "\n"); status = ts_sanity_check(caps->tuning_steps); @@ -352,115 +355,115 @@ sprintf_mode(prntbuf,caps->filters[i].modes); fprintf(fout, "\n\t%s: \t%s", freqbuf, prntbuf); } - if (i==0) { - fprintf(fout, " none! This backend might be bogus!"); - backend_warnings++; + if (i == 0) { + fprintf(fout, " None. This backend might be bogus!"); + backend_warnings++; } fprintf(fout, "\n"); - fprintf(fout, "Bandwidths:"); - for (i=1; i < RIG_MODE_TESTS_MAX; i<<=1) { + fprintf(fout, "Bandwidths:"); + for (i = 1; i < RIG_MODE_TESTS_MAX; i <<= 1) { pbwidth_t pbnorm = rig_passband_normal(rig, i); if (pbnorm == 0) continue; sprintf_freq(freqbuf, pbnorm); - fprintf(fout, "\n\t%s\tnormal: %s,\t", rig_strrmode(i), freqbuf); + fprintf(fout, "\n\t%s\tNormal: %s,\t", rig_strrmode(i), freqbuf); sprintf_freq(freqbuf, rig_passband_narrow(rig, i)); - fprintf(fout, "narrow: %s,\t", freqbuf); + fprintf(fout, "Narrow: %s,\t", freqbuf); sprintf_freq(freqbuf, rig_passband_wide(rig, i)); - fprintf(fout, "wide: %s", freqbuf); + fprintf(fout, "Wide: %s", freqbuf); } fprintf(fout, "\n"); - fprintf(fout, "Has priv data:\t%c\n",caps->priv!=NULL?'Y':'N'); + fprintf(fout, "Has priv data:\t%c\n", caps->priv != NULL ? 'Y' : 'N'); /* * Status is either 'Y'es, 'E'mulated, 'N'o * * TODO: keep me up-to-date with API call list! */ - fprintf(fout, "Has init:\t%c\n",caps->rig_init!=NULL?'Y':'N'); - fprintf(fout, "Has cleanup:\t%c\n",caps->rig_cleanup!=NULL?'Y':'N'); - fprintf(fout, "Has open:\t%c\n",caps->rig_open!=NULL?'Y':'N'); - fprintf(fout, "Has close:\t%c\n",caps->rig_close!=NULL?'Y':'N'); - fprintf(fout, "Can set conf:\t%c\n",caps->set_conf!=NULL?'Y':'N'); - fprintf(fout, "Can get conf:\t%c\n",caps->get_conf!=NULL?'Y':'N'); - fprintf(fout, "Can set frequency:\t%c\n",caps->set_freq!=NULL?'Y':'N'); - fprintf(fout, "Can get frequency:\t%c\n",caps->get_freq!=NULL?'Y':'N'); - fprintf(fout, "Can set mode:\t%c\n",caps->set_mode!=NULL?'Y':'N'); - fprintf(fout, "Can get mode:\t%c\n",caps->get_mode!=NULL?'Y':'N'); - fprintf(fout, "Can set vfo:\t%c\n",caps->set_vfo!=NULL?'Y':'N'); - fprintf(fout, "Can get vfo:\t%c\n",caps->get_vfo!=NULL?'Y':'N'); - fprintf(fout, "Can set ptt:\t%c\n",caps->set_ptt!=NULL?'Y':'N'); - fprintf(fout, "Can get ptt:\t%c\n",caps->get_ptt!=NULL?'Y':'N'); - fprintf(fout, "Can get dcd:\t%c\n",caps->get_dcd!=NULL?'Y':'N'); - fprintf(fout, "Can set repeater duplex:\t%c\n",caps->set_rptr_shift!=NULL?'Y':'N'); - fprintf(fout, "Can get repeater duplex:\t%c\n",caps->get_rptr_shift!=NULL?'Y':'N'); - fprintf(fout, "Can set repeater offset:\t%c\n",caps->set_rptr_offs!=NULL?'Y':'N'); - fprintf(fout, "Can get repeater offset:\t%c\n",caps->get_rptr_offs!=NULL?'Y':'N'); + fprintf(fout, "Has init:\t%c\n", caps->rig_init != NULL ? 'Y' : 'N'); + fprintf(fout, "Has cleanup:\t%c\n", caps->rig_cleanup != NULL ? 'Y' : 'N'); + fprintf(fout, "Has open:\t%c\n", caps->rig_open != NULL ? 'Y' : 'N'); + fprintf(fout, "Has close:\t%c\n", caps->rig_close != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set conf:\t%c\n", caps->set_conf != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get conf:\t%c\n", caps->get_conf != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set frequency:\t%c\n", caps->set_freq != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get frequency:\t%c\n", caps->get_freq != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set mode:\t%c\n", caps->set_mode != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get mode:\t%c\n", caps->get_mode != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set vfo:\t%c\n", caps->set_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get vfo:\t%c\n", caps->get_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set ptt:\t%c\n", caps->set_ptt != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get ptt:\t%c\n", caps->get_ptt != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get dcd:\t%c\n", caps->get_dcd != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set repeater duplex:\t%c\n", caps->set_rptr_shift != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get repeater duplex:\t%c\n", caps->get_rptr_shift != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set repeater offset:\t%c\n", caps->set_rptr_offs != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get repeater offset:\t%c\n", caps->get_rptr_offs != NULL ? 'Y' : 'N'); - can_esplit = caps->set_vfo || + can_esplit = caps->set_vfo || (rig_has_vfo_op(rig, RIG_OP_TOGGLE) && caps->vfo_op); - fprintf(fout, "Can set split freq:\t%c\n",caps->set_split_freq!=NULL?'Y': - (can_esplit&&caps->set_freq?'E':'N')); - fprintf(fout, "Can get split freq:\t%c\n",caps->get_split_freq!=NULL?'Y': - (can_esplit&&caps->get_freq?'E':'N')); - fprintf(fout, "Can set split mode:\t%c\n",caps->set_split_mode!=NULL?'Y': - (can_esplit&&caps->set_mode?'E':'N')); - fprintf(fout, "Can get split mode:\t%c\n",caps->get_split_mode!=NULL?'Y': - (can_esplit&&caps->get_mode?'E':'N')); + fprintf(fout, "Can set split freq:\t%c\n", caps->set_split_freq != NULL ? 'Y' : + (can_esplit && caps->set_freq ? 'E' : 'N')); + fprintf(fout, "Can get split freq:\t%c\n", caps->get_split_freq != NULL ? 'Y' : + (can_esplit && caps->get_freq ? 'E' : 'N')); + fprintf(fout, "Can set split mode:\t%c\n", caps->set_split_mode != NULL ? 'Y' : + (can_esplit && caps->set_mode ? 'E' : 'N')); + fprintf(fout, "Can get split mode:\t%c\n", caps->get_split_mode != NULL ? 'Y' : + (can_esplit && caps->get_mode ? 'E' : 'N')); - fprintf(fout, "Can set split vfo:\t%c\n",caps->set_split_vfo!=NULL?'Y':'N'); - fprintf(fout, "Can get split vfo:\t%c\n",caps->get_split_vfo!=NULL?'Y':'N'); - fprintf(fout, "Can set tuning step:\t%c\n",caps->set_ts!=NULL?'Y':'N'); - fprintf(fout, "Can get tuning step:\t%c\n",caps->get_ts!=NULL?'Y':'N'); - fprintf(fout, "Can set RIT:\t%c\n",caps->set_rit!=NULL?'Y':'N'); - fprintf(fout, "Can get RIT:\t%c\n",caps->get_rit!=NULL?'Y':'N'); - fprintf(fout, "Can set XIT:\t%c\n",caps->set_xit!=NULL?'Y':'N'); - fprintf(fout, "Can get XIT:\t%c\n",caps->get_xit!=NULL?'Y':'N'); - fprintf(fout, "Can set CTCSS:\t%c\n",caps->set_ctcss_tone!=NULL?'Y':'N'); - fprintf(fout, "Can get CTCSS:\t%c\n",caps->get_ctcss_tone!=NULL?'Y':'N'); - fprintf(fout, "Can set DCS:\t%c\n",caps->set_dcs_code!=NULL?'Y':'N'); - fprintf(fout, "Can get DCS:\t%c\n",caps->get_dcs_code!=NULL?'Y':'N'); - fprintf(fout, "Can set CTCSS squelch:\t%c\n",caps->set_ctcss_sql!=NULL?'Y':'N'); - fprintf(fout, "Can get CTCSS squelch:\t%c\n",caps->get_ctcss_sql!=NULL?'Y':'N'); - fprintf(fout, "Can set DCS squelch:\t%c\n",caps->set_dcs_sql!=NULL?'Y':'N'); - fprintf(fout, "Can get DCS squelch:\t%c\n",caps->get_dcs_sql!=NULL?'Y':'N'); - fprintf(fout, "Can set power stat:\t%c\n",caps->set_powerstat!=NULL?'Y':'N'); - fprintf(fout, "Can get power stat:\t%c\n",caps->get_powerstat!=NULL?'Y':'N'); - fprintf(fout, "Can reset:\t%c\n",caps->reset!=NULL?'Y':'N'); - fprintf(fout, "Can get ant:\t%c\n",caps->get_ant!=NULL?'Y':'N'); - fprintf(fout, "Can set ant:\t%c\n",caps->set_ant!=NULL?'Y':'N'); - fprintf(fout, "Can set transceive:\t%c\n",caps->set_trn!=NULL?'Y':'N'); - fprintf(fout, "Can get transceive:\t%c\n",caps->get_trn!=NULL?'Y':'N'); - fprintf(fout, "Can set func:\t%c\n",caps->set_func!=NULL?'Y':'N'); - fprintf(fout, "Can get func:\t%c\n",caps->get_func!=NULL?'Y':'N'); - fprintf(fout, "Can set level:\t%c\n",caps->set_level!=NULL?'Y':'N'); - fprintf(fout, "Can get level:\t%c\n",caps->get_level!=NULL?'Y':'N'); - fprintf(fout, "Can set param:\t%c\n",caps->set_parm!=NULL?'Y':'N'); - fprintf(fout, "Can get param:\t%c\n",caps->get_parm!=NULL?'Y':'N'); - fprintf(fout, "Can send DTMF:\t%c\n",caps->send_dtmf!=NULL?'Y':'N'); - fprintf(fout, "Can recv DTMF:\t%c\n",caps->recv_dtmf!=NULL?'Y':'N'); - fprintf(fout, "Can send Morse:\t%c\n",caps->send_morse!=NULL?'Y':'N'); - fprintf(fout, "Can decode events:\t%c\n",caps->decode_event!=NULL?'Y':'N'); - fprintf(fout, "Can set bank:\t%c\n",caps->set_bank!=NULL?'Y':'N'); - fprintf(fout, "Can set mem:\t%c\n",caps->set_mem!=NULL?'Y':'N'); - fprintf(fout, "Can get mem:\t%c\n",caps->get_mem!=NULL?'Y':'N'); + fprintf(fout, "Can set split vfo:\t%c\n", caps->set_split_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get split vfo:\t%c\n", caps->get_split_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set tuning step:\t%c\n", caps->set_ts != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get tuning step:\t%c\n", caps->get_ts != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set RIT:\t%c\n", caps->set_rit != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get RIT:\t%c\n", caps->get_rit != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set XIT:\t%c\n", caps->set_xit != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get XIT:\t%c\n", caps->get_xit != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set CTCSS:\t%c\n", caps->set_ctcss_tone != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get CTCSS:\t%c\n", caps->get_ctcss_tone != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set DCS:\t%c\n", caps->set_dcs_code != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get DCS:\t%c\n", caps->get_dcs_code != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set CTCSS squelch:\t%c\n", caps->set_ctcss_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get CTCSS squelch:\t%c\n", caps->get_ctcss_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set DCS squelch:\t%c\n", caps->set_dcs_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get DCS squelch:\t%c\n", caps->get_dcs_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set power stat:\t%c\n", caps->set_powerstat != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get power stat:\t%c\n", caps->get_powerstat != NULL ? 'Y' : 'N'); + fprintf(fout, "Can reset:\t%c\n", caps->reset != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get ant:\t%c\n", caps->get_ant != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set ant:\t%c\n", caps->set_ant != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set transceive:\t%c\n", caps->set_trn != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get transceive:\t%c\n", caps->get_trn != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set func:\t%c\n", caps->set_func != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get func:\t%c\n", caps->get_func != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set level:\t%c\n", caps->set_level != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get level:\t%c\n", caps->get_level != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set param:\t%c\n", caps->set_parm != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get param:\t%c\n", caps->get_parm != NULL ? 'Y' : 'N'); + fprintf(fout, "Can send DTMF:\t%c\n", caps->send_dtmf != NULL ? 'Y ': 'N'); + fprintf(fout, "Can recv DTMF:\t%c\n", caps->recv_dtmf != NULL ? 'Y' : 'N'); + fprintf(fout, "Can send Morse:\t%c\n", caps->send_morse != NULL ? 'Y' : 'N'); + fprintf(fout, "Can decode events:\t%c\n", caps->decode_event != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set bank:\t%c\n", caps->set_bank != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set mem:\t%c\n", caps->set_mem != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get mem:\t%c\n", caps->get_mem != NULL ? 'Y' : 'N'); can_echannel = caps->set_mem && caps->set_vfo; - fprintf(fout, "Can set channel:\t%c\n",caps->set_channel!=NULL?'Y': - (can_echannel?'E':'N')); - fprintf(fout, "Can get channel:\t%c\n",caps->get_channel!=NULL?'Y': - (can_echannel?'E':'N')); + fprintf(fout, "Can set channel:\t%c\n", caps->set_channel != NULL ? 'Y' : + (can_echannel ? 'E' : 'N')); + fprintf(fout, "Can get channel:\t%c\n", caps->get_channel != NULL ? 'Y' : + (can_echannel ? 'E' : 'N')); - fprintf(fout, "Can ctl mem/vfo:\t%c\n",caps->vfo_op!=NULL?'Y':'N'); - fprintf(fout, "Can scan:\t%c\n",caps->scan!=NULL?'Y':'N'); - fprintf(fout, "Can get info:\t%c\n",caps->get_info!=NULL?'Y':'N'); - + fprintf(fout, "Can ctl mem/vfo:\t%c\n", caps->vfo_op != NULL ? 'Y' : 'N'); + fprintf(fout, "Can scan:\t%c\n", caps->scan != NULL ? 'Y' :' N'); + fprintf(fout, "Can get info:\t%c\n", caps->get_info != NULL ? 'Y' : 'N'); + fprintf(fout, "\nOverall backend warnings: %d\n", backend_warnings); return backend_warnings; @@ -469,20 +472,20 @@ static int print_ext(RIG *rig, const struct confparams *cfp, rig_ptr_t ptr) { - fprintf((FILE*)ptr, " %s", cfp->name); + fprintf((FILE *)ptr, " %s", cfp->name); return 1; /* process them all */ } -/* +/* * check for: - * - start_freq<end_freq return_code=-1 - * - modes are not 0 return_code=-2 - * - if(rx), low_power,high_power set to -1 return_code=-3 - * else, power is >0 - * - array is ended by a {0,0,0,0,0} element (before boundary) rc=-4 - * - ranges with same modes do not overlap rc=-5 + * - start_freq < end_freq return_code = -1 + * - modes are not 0 return_code = -2 + * - if(rx), low_power, high_power set to -1 return_code = -3 + * else, power is > 0 + * - array is ended by a {0,0,0,0,0} element (before boundary) rc = -4 + * - ranges with same modes do not overlap rc = -5 * ->fprintf(stderr,)! * * TODO: array is sorted in ascending freq order @@ -491,7 +494,7 @@ { int i; - for (i=0; i<FRQRANGESIZ; i++) { + for (i = 0; i < FRQRANGESIZ; i++) { if (range_list[i].start == 0 && range_list[i].end == 0) break; if (range_list[i].start > range_list[i].end) @@ -514,7 +517,7 @@ return 0; } -/* +/* * check for: * - steps sorted in ascending order return_code=-1 * - modes are not 0 return_code=-2 @@ -533,7 +536,7 @@ for (i=0; i<TSLSTSIZ; i++) { if (RIG_IS_TS_END(tuning_step[i])) break; - if (tuning_step[i].ts != RIG_TS_ANY && tuning_step[i].ts < last_ts && + if (tuning_step[i].ts != RIG_TS_ANY && tuning_step[i].ts < last_ts && last_modes == tuning_step[i].modes) return -1; if (tuning_step[i].modes == 0) Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-01-28 22:44:56 UTC (rev 2819) +++ trunk/tests/rigctl_parse.c 2010-02-04 00:53:56 UTC (rev 2820) @@ -1,8 +1,9 @@ /* * rigctl_parse.c - (C) Stephane Fillod 2000-2009 * (C) Terry Embry 2008-2009 + * (C) The Hamlib Group 2010 * - * This program test/control a radio using Hamlib. + * This program tests/controls a radio using Hamlib. * It takes commands in interactive mode as well as * from command line options. * @@ -149,6 +150,8 @@ declare_proto_rig(get_powerstat); declare_proto_rig(send_dtmf); declare_proto_rig(recv_dtmf); +declare_proto_rig(chk_blk); +declare_proto_rig(chk_vfo); /* @@ -223,6 +226,8 @@ { '1', "dump_caps", dump_caps, ARG_NOVFO }, { '3', "dump_conf", dump_conf, ARG_NOVFO }, { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, + { 0xf0,"chk_blk", chk_blk, ARG_NOVFO }, /* rigctld only--check for block protocol */ + { 0xf1,"chk_vfo", chk_vfo, ARG_NOVFO }, /* rigctld only--check for VFO mode */ { 0x00, "", NULL }, }; @@ -461,8 +466,11 @@ rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '%s' '%s' '%s'\n", cmd, p1, p2, p3); - /* Block protocol: output received command name and arguments response */ - if (interactive && opt_block) { + /* + * Block protocol: output received command name and arguments response + * Don't send response on '\chk_blk' command + */ + if (interactive && opt_block && (cmd != 0xf0 && cmd != 0xf1)) { char a1[MAXARGSZ+1]; char a2[MAXARGSZ+1]; char a3[MAXARGSZ+1]; @@ -481,18 +489,22 @@ pthread_mutex_unlock(&rig_mutex); #endif + if (retcode != RIG_OK) { - if (interactive && !prompt && opt_block) + if ((interactive && !prompt && opt_block) || (interactive && !prompt)) fprintf(fout, NETRIGCTL_RET "%d\n", retcode); /* only for rigctld */ else fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { +// rig_debug(RIG_DEBUG_TRACE, "rigctld: %d %s\n", cmd, cmd_entry->name); + if (interactive && !prompt) { /* only for rigctld */ - if (!(cmd_entry->flags & ARG_OUT) && !opt_end) /* netrigctl RIG_OK */ + if (!(cmd_entry->flags & ARG_OUT) + && !opt_end && !opt_block && (cmd != 0xf0 && cmd != 0xf1)) /* netrigctl RIG_OK */ fprintf(fout, NETRIGCTL_RET "0\n"); - else if ((cmd_entry->flags & ARG_OUT) && opt_end) /* Nate's protocol */ + else if ((cmd_entry->flags & ARG_OUT) && opt_end) /* Nate's protocol */ fprintf(fout, "END\n"); - else if (opt_block) /* block marker protocol */ + else if (opt_block && (cmd != 0xf0 && cmd != 0xf1)) /* block marker protocol */ fprintf(fout, NETRIGCTL_RET "0\n"); } } @@ -2040,3 +2052,19 @@ return retval; } +/* '0xf0'--test if rigctld called with -b|--block option */ +declare_proto_rig(chk_blk) +{ + fprintf(fout, "CHKBLK %d\n", opt_block); + + return RIG_OK; +} + +/* '0xf1'--test if rigctld called with -o|--vfo option */ +declare_proto_rig(chk_vfo) +{ + fprintf(fout, "CHKVFO %d\n", vfo_mode); + + return RIG_OK; +} + Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-01-28 22:44:56 UTC (rev 2819) +++ trunk/tests/rigctld.8 2010-02-04 00:53:56 UTC (rev 2820) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTLD "8" "January 24, 2010" "Hamlib" "Rig Control Daemon" +.TH RIGCTLD "8" "February 3, 2010" "Hamlib" "Rig Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -117,10 +117,12 @@ .TP .B \-o, --vfo Set vfo mode, requiring an extra VFO argument in front of each appropriate -command. Otherwise, VFO_CURR is assumed when this option is not set. +command (except \fI\\set_vfo\fP!). Otherwise, 'currVFO' is assumed when this +option is not set and an extra VFO argument is not used. See \fI\\chk_vfo\fP +below. .TP .B \-b, --block -Use the block rigctld protocol. \fIEXPERIMENTAL\fP +Use the block rigctld protocol. See \fI\\chk_blk\fP below. \fIEXPERIMENTAL\fP .TP .B \-e, --end-marker Use END marker in rigctld protocol. @@ -160,9 +162,9 @@ appear in the code, only one will be passed to \fBrigctld\fP. This is a possible bug!). .PP -Please note that the backend for the radio to be controlled, -or the radio itself may not support some commands. In that case, -the operation will fail with a \fBHamlib\fP error message. +Please note that the backend for the radio to be controlled, or the radio itself +may not support some commands. In that case, the operation will fail with a +\fBHamlib\fP error message. .PP Here is a summary of the supported commands (In the case of "set" commands the quoted string is replaced by the value in the description. In the case of "get" @@ -185,7 +187,8 @@ and Passband in Hz. .TP .B V, set_vfo 'VFO' -Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. +Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. In VFO mode +only a single VFO parameter is required. .TP .B v, get_vfo Get current 'VFO'. Returns VFO as a string from \fIset_vfo\fP above. @@ -369,7 +372,8 @@ .B 1, dump_caps Not a real rig remote command, it just dumps capabilities, i.e. what the backend knows about this model, and what it can do. TODO: Ensure this is -in a consistent format so it can be read into a hash, dictionary, etc. +in a consistent format so it can be read into a hash, dictionary, etc. Bug +reports requested. .TP .B 2, power2mW Converts a power value in a range of \fI0.0 ... 1.0\fP to the real transmit @@ -381,6 +385,20 @@ .br For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the rig which will likely be a binary block or an ASCII string. +.TP +.B chk_blk +Returns "CHKBLK 1\\n" (single line only) if \fBrigctld\fP was invoked with the +\fI-b\fP or \fI--block\fP option, "CHKBLK 0\\n" if not. +.br +.TP +.B chk_vfo +Returns "CHKVFO 1\\n" (single line only) if \fBrigctld\fP was invoked with the +\fI-o\fP or \fI--vfo\fP option, "CHKVFO 0\\n" if not. +.br +When in VFO mode client will need to pass 'VFO' as the first parameter to +\fI\\set\fP or \fI\\get\fP commands. 'VFO' is one of the strings defined +for \fI\\set_vfo\fP above. +.br .SH PROTOCOL \fBDefault Protocol\fP .br @@ -456,11 +474,13 @@ processed successfully by the rig backend. .PP The following commands have been tested with the Block protocol and the included -`testctld.pl' script: +\fBtestctld.pl\fP script: .br \fI\\set_freq\fP \fI\\get-freq\fP .br \fI\\set_mode\fP \fI\\get_mode\fP +.br +\fI\\set_vfo\fP \fI\\get_vfo\fP .SH EXAMPLES Start \fBrigctld\fP for a Yaesu FT-920 using an USB-to-serial adapter and backgrounding: @@ -468,13 +488,14 @@ $ rigctld -m 114 -r /dev/ttyUSB1 & .PP Start \fBrigctld\fP for a Yaesu FT-920 using a USB to serial adapter while -setting baud rate and stop bits and backgrounding: +setting baud rate and stop bits, invoking block protocol, and backgrounding: .PP -$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 & +$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 --block & .PP -Connect to the already running \fBrigctld\fP, and set current frequency to 14.266 MHz: +Connect to the already running \fBrigctld\fP, and set current frequency to +14.266 MHz with a 1 second read timeout: .PP -$ echo "\\set_freq 14266000" | nc localhost 4532 +$ echo "\\set_freq 14266000" | nc -w 1 localhost 4532 .SH DIAGNOSTICS The \fB-v\fP, \fB--verbose\fP, option allows different levels of diagnostics to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, @@ -498,11 +519,11 @@ .br We are already aware of the bugs in the previous section :-) .SH AUTHORS -Written by Stephane Fillod and the Hamlib Group +Written by Stephane Fillod, Nate Bargmann, and the Hamlib Group .br <http://www.hamlib.org>. .SH COPYRIGHT -Copyright \(co 2000-2010 Stephane Fillod and the Hamlib Group. +Copyright \(co 2000-2010 Stephane Fillod, Nate Bargmann, and the Hamlib Group. .PP This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY Modified: trunk/tests/rigctld.c =================================================================== --- trunk/tests/rigctld.c 2010-01-28 22:44:56 UTC (rev 2819) +++ trunk/tests/rigctld.c 2010-02-04 00:53:56 UTC (rev 2820) @@ -108,7 +108,7 @@ int prompt = 0; /* Daemon mode for rigparse return string */ int opt_end = 0; /* END marker for rigctld */ int opt_block = 0; /* Block markers for rigctld */ -int vfo_mode; /* vfo_mode=0 means target VFO is current VFO */ +int vfo_mode = 0; /* vfo_mode=0 means target VFO is current VFO */ char send_cmd_term = '\r'; /* send_cmd termination char */ @@ -278,10 +278,11 @@ dump_caps_opt++; break; case 'e': - opt_end = 1; + opt_end++; + fprintf(stderr, "-e|--end-marker option is deprecated. Please consider -b|--block instead.\n"); break; case 'b': - opt_block = 1; + opt_block++; break; default: usage(); /* unknown option? */ @@ -339,7 +340,7 @@ } /* - * print out conf parameters, and exists immediately + * print out conf parameters, and exits immediately * We may be interested only in only caps, and rig_open may fail. */ if (dump_caps_opt) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-06 15:05:24
|
Revision: 2824 http://hamlib.svn.sourceforge.net/hamlib/?rev=2824&view=rev Author: n0nb Date: 2010-02-06 15:05:17 +0000 (Sat, 06 Feb 2010) Log Message: ----------- Rewrote power2mW to work with modern rigctl and rigctld. Added mW2power for conversion the other way from power2mW. Text label edits to dumpcaps Modified Paths: -------------- trunk/tests/dumpcaps.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 Modified: trunk/tests/dumpcaps.c =================================================================== --- trunk/tests/dumpcaps.c 2010-02-06 14:59:59 UTC (rev 2823) +++ trunk/tests/dumpcaps.c 2010-02-06 15:05:17 UTC (rev 2824) @@ -385,41 +385,41 @@ * * TODO: keep me up-to-date with API call list! */ - fprintf(fout, "Has init:\t%c\n", caps->rig_init != NULL ? 'Y' : 'N'); - fprintf(fout, "Has cleanup:\t%c\n", caps->rig_cleanup != NULL ? 'Y' : 'N'); - fprintf(fout, "Has open:\t%c\n", caps->rig_open != NULL ? 'Y' : 'N'); - fprintf(fout, "Has close:\t%c\n", caps->rig_close != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set conf:\t%c\n", caps->set_conf != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get conf:\t%c\n", caps->get_conf != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set frequency:\t%c\n", caps->set_freq != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get frequency:\t%c\n", caps->get_freq != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set mode:\t%c\n", caps->set_mode != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get mode:\t%c\n", caps->get_mode != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set vfo:\t%c\n", caps->set_vfo != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get vfo:\t%c\n", caps->get_vfo != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set ptt:\t%c\n", caps->set_ptt != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get ptt:\t%c\n", caps->get_ptt != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get dcd:\t%c\n", caps->get_dcd != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set repeater duplex:\t%c\n", caps->set_rptr_shift != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get repeater duplex:\t%c\n", caps->get_rptr_shift != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set repeater offset:\t%c\n", caps->set_rptr_offs != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get repeater offset:\t%c\n", caps->get_rptr_offs != NULL ? 'Y' : 'N'); + fprintf(fout, "Has Init:\t%c\n", caps->rig_init != NULL ? 'Y' : 'N'); + fprintf(fout, "Has Cleanup:\t%c\n", caps->rig_cleanup != NULL ? 'Y' : 'N'); + fprintf(fout, "Has Open:\t%c\n", caps->rig_open != NULL ? 'Y' : 'N'); + fprintf(fout, "Has Close:\t%c\n", caps->rig_close != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Conf:\t%c\n", caps->set_conf != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Conf:\t%c\n", caps->get_conf != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Frequency:\t%c\n", caps->set_freq != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Frequency:\t%c\n", caps->get_freq != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Mode:\t%c\n", caps->set_mode != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Mode:\t%c\n", caps->get_mode != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set VFO:\t%c\n", caps->set_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get VFO:\t%c\n", caps->get_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set PTT:\t%c\n", caps->set_ptt != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get PTT:\t%c\n", caps->get_ptt != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get DCD:\t%c\n", caps->get_dcd != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Repeater Duplex:\t%c\n", caps->set_rptr_shift != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Repeater Duplex:\t%c\n", caps->get_rptr_shift != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Repeater Offset:\t%c\n", caps->set_rptr_offs != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Repeater Offset:\t%c\n", caps->get_rptr_offs != NULL ? 'Y' : 'N'); can_esplit = caps->set_vfo || (rig_has_vfo_op(rig, RIG_OP_TOGGLE) && caps->vfo_op); - fprintf(fout, "Can set split freq:\t%c\n", caps->set_split_freq != NULL ? 'Y' : + fprintf(fout, "Can set Split Freq:\t%c\n", caps->set_split_freq != NULL ? 'Y' : (can_esplit && caps->set_freq ? 'E' : 'N')); - fprintf(fout, "Can get split freq:\t%c\n", caps->get_split_freq != NULL ? 'Y' : + fprintf(fout, "Can get Split Freq:\t%c\n", caps->get_split_freq != NULL ? 'Y' : (can_esplit && caps->get_freq ? 'E' : 'N')); - fprintf(fout, "Can set split mode:\t%c\n", caps->set_split_mode != NULL ? 'Y' : + fprintf(fout, "Can set Split Mode:\t%c\n", caps->set_split_mode != NULL ? 'Y' : (can_esplit && caps->set_mode ? 'E' : 'N')); - fprintf(fout, "Can get split mode:\t%c\n", caps->get_split_mode != NULL ? 'Y' : + fprintf(fout, "Can get Split Mode:\t%c\n", caps->get_split_mode != NULL ? 'Y' : (can_esplit && caps->get_mode ? 'E' : 'N')); - fprintf(fout, "Can set split vfo:\t%c\n", caps->set_split_vfo != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get split vfo:\t%c\n", caps->get_split_vfo != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set tuning step:\t%c\n", caps->set_ts != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get tuning step:\t%c\n", caps->get_ts != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Split VFO:\t%c\n", caps->set_split_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Split VFO:\t%c\n", caps->get_split_vfo != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Tuning Step:\t%c\n", caps->set_ts != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Tuning Step:\t%c\n", caps->get_ts != NULL ? 'Y' : 'N'); fprintf(fout, "Can set RIT:\t%c\n", caps->set_rit != NULL ? 'Y' : 'N'); fprintf(fout, "Can get RIT:\t%c\n", caps->get_rit != NULL ? 'Y' : 'N'); fprintf(fout, "Can set XIT:\t%c\n", caps->set_xit != NULL ? 'Y' : 'N'); @@ -428,40 +428,42 @@ fprintf(fout, "Can get CTCSS:\t%c\n", caps->get_ctcss_tone != NULL ? 'Y' : 'N'); fprintf(fout, "Can set DCS:\t%c\n", caps->set_dcs_code != NULL ? 'Y' : 'N'); fprintf(fout, "Can get DCS:\t%c\n", caps->get_dcs_code != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set CTCSS squelch:\t%c\n", caps->set_ctcss_sql != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get CTCSS squelch:\t%c\n", caps->get_ctcss_sql != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set DCS squelch:\t%c\n", caps->set_dcs_sql != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get DCS squelch:\t%c\n", caps->get_dcs_sql != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set power stat:\t%c\n", caps->set_powerstat != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get power stat:\t%c\n", caps->get_powerstat != NULL ? 'Y' : 'N'); - fprintf(fout, "Can reset:\t%c\n", caps->reset != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get ant:\t%c\n", caps->get_ant != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set ant:\t%c\n", caps->set_ant != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set transceive:\t%c\n", caps->set_trn != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get transceive:\t%c\n", caps->get_trn != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set func:\t%c\n", caps->set_func != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get func:\t%c\n", caps->get_func != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set level:\t%c\n", caps->set_level != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get level:\t%c\n", caps->get_level != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set param:\t%c\n", caps->set_parm != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get param:\t%c\n", caps->get_parm != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set CTCSS Squelch:\t%c\n", caps->set_ctcss_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get CTCSS Squelch:\t%c\n", caps->get_ctcss_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set DCS Squelch:\t%c\n", caps->set_dcs_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get DCS Squelch:\t%c\n", caps->get_dcs_sql != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Power Stat:\t%c\n", caps->set_powerstat != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Power Stat:\t%c\n", caps->get_powerstat != NULL ? 'Y' : 'N'); + fprintf(fout, "Can Reset:\t%c\n", caps->reset != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Ant:\t%c\n", caps->get_ant != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Ant:\t%c\n", caps->set_ant != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Transceive:\t%c\n", caps->set_trn != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Transceive:\t%c\n", caps->get_trn != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Func:\t%c\n", caps->set_func != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Func:\t%c\n", caps->get_func != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Level:\t%c\n", caps->set_level != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Level:\t%c\n", caps->get_level != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Param:\t%c\n", caps->set_parm != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Param:\t%c\n", caps->get_parm != NULL ? 'Y' : 'N'); fprintf(fout, "Can send DTMF:\t%c\n", caps->send_dtmf != NULL ? 'Y ': 'N'); fprintf(fout, "Can recv DTMF:\t%c\n", caps->recv_dtmf != NULL ? 'Y' : 'N'); fprintf(fout, "Can send Morse:\t%c\n", caps->send_morse != NULL ? 'Y' : 'N'); - fprintf(fout, "Can decode events:\t%c\n", caps->decode_event != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set bank:\t%c\n", caps->set_bank != NULL ? 'Y' : 'N'); - fprintf(fout, "Can set mem:\t%c\n", caps->set_mem != NULL ? 'Y' : 'N'); - fprintf(fout, "Can get mem:\t%c\n", caps->get_mem != NULL ? 'Y' : 'N'); + fprintf(fout, "Can decode Events:\t%c\n", caps->decode_event != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Bank:\t%c\n", caps->set_bank != NULL ? 'Y' : 'N'); + fprintf(fout, "Can set Mem:\t%c\n", caps->set_mem != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get Mem:\t%c\n", caps->get_mem != NULL ? 'Y' : 'N'); can_echannel = caps->set_mem && caps->set_vfo; - fprintf(fout, "Can set channel:\t%c\n", caps->set_channel != NULL ? 'Y' : + fprintf(fout, "Can set Channel:\t%c\n", caps->set_channel != NULL ? 'Y' : (can_echannel ? 'E' : 'N')); - fprintf(fout, "Can get channel:\t%c\n", caps->get_channel != NULL ? 'Y' : + fprintf(fout, "Can get Channel:\t%c\n", caps->get_channel != NULL ? 'Y' : (can_echannel ? 'E' : 'N')); - fprintf(fout, "Can ctl mem/vfo:\t%c\n", caps->vfo_op != NULL ? 'Y' : 'N'); - fprintf(fout, "Can scan:\t%c\n", caps->scan != NULL ? 'Y' :' N'); - fprintf(fout, "Can get info:\t%c\n", caps->get_info != NULL ? 'Y' : 'N'); + fprintf(fout, "Can ctl Mem/VFO:\t%c\n", caps->vfo_op != NULL ? 'Y' : 'N'); + fprintf(fout, "Can Scan:\t%c\n", caps->scan != NULL ? 'Y' :' N'); + fprintf(fout, "Can get Info:\t%c\n", caps->get_info != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get power2mW:\t%c\n", caps->power2mW != NULL ? 'Y' : 'N'); + fprintf(fout, "Can get mW2power:\t%c\n", caps->mW2power != NULL ? 'Y' : 'N'); fprintf(fout, "\nOverall backend warnings: %d\n", backend_warnings); Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-02-06 14:59:59 UTC (rev 2823) +++ trunk/tests/rigctl_parse.c 2010-02-06 15:05:17 UTC (rev 2824) @@ -80,6 +80,7 @@ const char *arg1; const char *arg2; const char *arg3; + const char *arg4; }; @@ -122,6 +123,7 @@ declare_proto_rig(set_ts); declare_proto_rig(get_ts); declare_proto_rig(power2mW); +declare_proto_rig(mW2power); declare_proto_rig(set_level); declare_proto_rig(get_level); declare_proto_rig(set_func); @@ -168,36 +170,36 @@ { 'f', "get_freq", get_freq, ARG_OUT, "Frequency" }, { 'M', "set_mode", set_mode, ARG_IN, "Mode", "Passband" }, { 'm', "get_mode", get_mode, ARG_OUT, "Mode", "Passband" }, - { 'I', "set_split_freq", set_split_freq, ARG_IN, "Tx frequency" }, - { 'i', "get_split_freq", get_split_freq, ARG_OUT, "Tx frequency" }, - { 'X', "set_split_mode", set_split_mode, ARG_IN, "Tx mode", "Tx passband" }, - { 'x', "get_split_mode", get_split_mode, ARG_OUT, "Tx mode", "Tx passband" }, - { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split", "Tx VFO" }, - { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split", "Tx VFO" }, - { 'N', "set_ts", set_ts, ARG_IN, "Tuning step" }, - { 'n', "get_ts", get_ts, ARG_OUT, "Tuning step" }, - { 'L', "set_level", set_level, ARG_IN, "Level", "Level value" }, - { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Level value" }, - { 'U', "set_func", set_func, ARG_IN, "Func", "Func status" }, - { 'u', "get_func", get_func, ARG_IN1|ARG_OUT2, "Func", "Func status" }, - { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Parm value" }, - { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Parm value" }, - { 'G', "vfo_op", vfo_op, ARG_IN, "Mem/VFO op" }, - { 'g', "scan", scan, ARG_IN, "Scan fct", "Scan channel" }, + { 'I', "set_split_freq", set_split_freq, ARG_IN, "TX Frequency" }, + { 'i', "get_split_freq", get_split_freq, ARG_OUT, "TX Frequency" }, + { 'X', "set_split_mode", set_split_mode, ARG_IN, "TX Mode", "TX Passband" }, + { 'x', "get_split_mode", get_split_mode, ARG_OUT, "TX Mode", "TX Passband" }, + { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split", "TX VFO" }, + { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split", "TX VFO" }, + { 'N', "set_ts", set_ts, ARG_IN, "Tuning Step" }, + { 'n', "get_ts", get_ts, ARG_OUT, "Tuning Step" }, + { 'L', "set_level", set_level, ARG_IN, "Level", "Level Value" }, + { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Level Value" }, + { 'U', "set_func", set_func, ARG_IN, "Func", "Func Status" }, + { 'u', "get_func", get_func, ARG_IN1|ARG_OUT2, "Func", "Func Status" }, + { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Parm Value" }, + { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Parm Value" }, + { 'G', "vfo_op", vfo_op, ARG_IN, "Mem/VFO Op" }, + { 'g', "scan", scan, ARG_IN, "Scan Fct", "Scan Channel" }, { 'A', "set_trn", set_trn, ARG_IN|ARG_NOVFO, "Transceive" }, { 'a', "get_trn", get_trn, ARG_OUT|ARG_NOVFO, "Transceive" }, - { 'R', "set_rptr_shift", set_rptr_shift, ARG_IN, "Rptr shift" }, - { 'r', "get_rptr_shift", get_rptr_shift, ARG_OUT, "Rptr shift" }, - { 'O', "set_rptr_offs", set_rptr_offs, ARG_IN, "Rptr offset" }, - { 'o', "get_rptr_offs", get_rptr_offs, ARG_OUT, "Rptr offset" }, - { 'C', "set_ctcss_tone", set_ctcss_tone, ARG_IN, "CTCSS tone" }, - { 'c', "get_ctcss_tone", get_ctcss_tone, ARG_OUT, "CTCSS tone" }, - { 'D', "set_dcs_code", set_dcs_code, ARG_IN, "DCS code" }, - { 'd', "get_dcs_code", get_dcs_code, ARG_OUT, "DCS code" }, - { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS sql" }, - { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS sql" }, - { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS sql" }, - { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS sql" }, + { 'R', "set_rptr_shift", set_rptr_shift, ARG_IN, "Rptr Shift" }, + { 'r', "get_rptr_shift", get_rptr_shift, ARG_OUT, "Rptr Shift" }, + { 'O', "set_rptr_offs", set_rptr_offs, ARG_IN, "Rptr Offset" }, + { 'o', "get_rptr_offs", get_rptr_offs, ARG_OUT, "Rptr Offset" }, + { 'C', "set_ctcss_tone", set_ctcss_tone, ARG_IN, "CTCSS Tone" }, + { 'c', "get_ctcss_tone", get_ctcss_tone, ARG_OUT, "CTCSS Tone" }, + { 'D', "set_dcs_code", set_dcs_code, ARG_IN, "DCS Code" }, + { 'd', "get_dcs_code", get_dcs_code, ARG_OUT, "DCS Code" }, + { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS Sql" }, + { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS Sql" }, + { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS Sql" }, + { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS Sql" }, { 'V', "set_vfo", set_vfo, ARG_IN|ARG_NOVFO, "VFO" }, { 'v', "get_vfo", get_vfo, ARG_OUT, "VFO" }, { 'T', "set_ptt", set_ptt, ARG_IN, "PTT" }, @@ -214,15 +216,16 @@ { 'z', "get_xit", get_xit, ARG_OUT, "XIT" }, { 'Y', "set_ant", set_ant, ARG_IN, "Antenna" }, { 'y', "get_ant", get_ant, ARG_OUT, "Antenna" }, - { 0x87, "set_powerstat", set_powerstat, ARG_IN|ARG_NOVFO, "Status" }, - { 0x88, "get_powerstat", get_powerstat, ARG_OUT|ARG_NOVFO, "Status" }, + { 0x87, "set_powerstat", set_powerstat, ARG_IN|ARG_NOVFO, "Power Status" }, + { 0x88, "get_powerstat", get_powerstat, ARG_OUT|ARG_NOVFO, "Power Status" }, { 0x89, "send_dtmf", send_dtmf, ARG_IN, "Digits" }, { 0x8a, "recv_dtmf", recv_dtmf, ARG_OUT, "Digits" }, { '*', "reset", reset, ARG_IN, "Reset" }, { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2|ARG_NOVFO, "Cmd", "Reply" }, { 'b', "send_morse", send_morse, ARG_IN|ARG_IN_LINE, "Morse" }, { 0x8b, "get_dcd", get_dcd, ARG_OUT, "DCD" }, - { '2', "power2mW", power2mW, ARG_NOVFO }, + { '2', "power2mW", power2mW, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power [0.0..1.0]", "Frequency", "Mode", "Power mW" }, + { '4', "mW2power", mW2power, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power mW", "Frequency", "Mode", "Power [0.0..1.0]" }, { '1', "dump_caps", dump_caps, ARG_NOVFO }, { '3', "dump_conf", dump_conf, ARG_NOVFO }, { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, @@ -680,7 +683,7 @@ status = rig_get_rit(rig, vfo, &rit); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", rit); @@ -705,7 +708,7 @@ status = rig_get_xit(rig, vfo, &xit); if (status != RIG_OK) return status; - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && opt_block)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", xit); @@ -1086,29 +1089,51 @@ } /* '2' */ -/* FIXME: For rigctld */ declare_proto_rig(power2mW) { int status; float power; freq_t freq; - int mode; + rmode_t mode; unsigned int mwp; - fprintf(fout, "Power [0.0 .. 1.0]: "); - status = scanf("%f", &power); - fprintf(fout, "Frequency: "); - status = scanf("%"SCNfreq, &freq); - fprintf(fout, "Mode: "); - status = scanf("%d", &mode); - status = rig_power2mW(rig, &mwp, power, freq, (rmode_t) mode); - fprintf(fout, "rig_power2mW()-Power: %d mW\n", mwp); - status = rig_mW2power(rig, &power, mwp, freq, (rmode_t) mode); - fprintf(fout, "rig_mW2power()-Power ratio [0.0 .. 1.0]: %f\n", power); + sscanf(arg1, "%f", &power); + sscanf(arg2, "%"SCNfreq, &freq); + mode = rig_parse_mode(arg3); + status = rig_power2mW(rig, &mwp, power, freq, mode); + if (status != RIG_OK) + return status; + if ((interactive && prompt) || (interactive && !prompt && opt_block)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%i\n", mwp); + return status; } +/* '4' */ +declare_proto_rig(mW2power) +{ + int status; + float power; + freq_t freq; + rmode_t mode; + unsigned int mwp; + + sscanf(arg1, "%i", &mwp); + sscanf(arg2, "%"SCNfreq, &freq); + mode = rig_parse_mode(arg3); + + status = rig_mW2power(rig, &power, mwp, freq, mode); + if (status != RIG_OK) + return status; + if ((interactive && prompt) || (interactive && !prompt && opt_block)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%f\n", power); + + return status; +} + /* * RIG_CONF_ extparm's type: * NUMERIC: val.f Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-02-06 14:59:59 UTC (rev 2823) +++ trunk/tests/rigctld.8 2010-02-06 15:05:17 UTC (rev 2824) @@ -179,28 +179,39 @@ .B M, set_mode 'Mode' 'Passband' Set 'Mode': USB, LSB, CW, CWR, RTTY, RTTYR, AM, FM, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. - -Set 'Passband' in Hz, or 0 for the default. +.br +Set 'Passband' in Hz, or '0' for the Hamlib backend default. .TP .B m, get_mode -Get 'Mode' 'Passband'. Returns Mode as a string from \fIset_mode\fP above +Get 'Mode' 'Passband'. +.br +Returns Mode as a string from \fIset_mode\fP above and Passband in Hz. .TP .B V, set_vfo 'VFO' -Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. In VFO mode -only a single VFO parameter is required. +Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. +.br +In VFO mode only a single VFO parameter is required. .TP .B v, get_vfo -Get current 'VFO'. Returns VFO as a string from \fIset_vfo\fP above. +Get current 'VFO'. +.br +Returns VFO as a string from \fIset_vfo\fP above. .TP .B J, set_rit 'RIT' -Set 'RIT', in Hz. +Set 'RIT', in Hz, can be + or -. +.br +A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report +against the Hamlib backend. .TP .B j, get_rit Get 'RIT', in Hz. .TP .B Z, set_xit 'XIT' -Set 'XIT', in Hz. +Set 'XIT', in Hz can be + or -. +.br +A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report +against the Hamlib backend. .TP .B z, get_xit Get 'XIT', in Hz. @@ -214,99 +225,112 @@ .B 0x8b, get_dcd Get 'DCD' (squelch) status, 0 (Closed) or 1 (Open) .TP -.B R, set_rptr_shift 'Rptr shift' -Set 'Rptr shift': "+", "-" or something else for none. +.B R, set_rptr_shift 'Rptr Shift' +Set 'Rptr Shift': "+", "-" or something else for none. .TP .B r, get_rptr_shift -Get 'Rptr shift'. Returns "+", "-" or "None". +Get 'Rptr Shift'. Returns "+", "-" or "None". .TP -.B O, set_rptr_offs 'Rptr offset' -Set 'Rptr offset', in Hz. +.B O, set_rptr_offs 'Rptr Offset' +Set 'Rptr Offset', in Hz. .TP .B o, get_rptr_offs -Get 'Rptr offset', in Hz. +Get 'Rptr Offset', in Hz. .TP -.B C, set_ctcss_tone 'CTCSS tone' -Set 'CTCSS tone', in tenths of Hz. +.B C, set_ctcss_tone 'CTCSS Tone' +Set 'CTCSS Tone', in tenths of Hz. .TP .B c, get_ctcss_tone -Get 'CTCSS tone', in tenths of Hz. +Get 'CTCSS Tone', in tenths of Hz. .TP -.B D, set_dcs_code 'DCS code' -Set 'DCS code'. +.B D, set_dcs_code 'DCS Code' +Set 'DCS Code'. .TP .B d, get_dcs_code -Get 'DCS code'. +Get 'DCS Code'. .TP -.B 0x90, set_ctcss_sql 'CTCSS sql' -Set 'CTCSS sql' tone, in tenths of Hz. +.B 0x90, set_ctcss_sql 'CTCSS Sql' +Set 'CTCSS Sql' tone, in tenths of Hz. .TP .B 0x91, get_ctcss_sql -Get 'CTCSS sql' tone, in tenths of Hz. +Get 'CTCSS Sql' tone, in tenths of Hz. .TP -.B 0x92, set_dcs_sql 'DCS sql' -Set 'DCS sql' code. +.B 0x92, set_dcs_sql 'DCS Sql' +Set 'DCS Sql' code. .TP .B 0x93, get_dcs_sql -Get 'DCS sql' code. +Get 'DCS Sql' code. .TP -.B I, set_split_freq 'Tx frequency' -Set 'TX frequency', in Hz. +.B I, set_split_freq 'Tx Frequency' +Set 'TX Frequency', in Hz. .TP .B i, get_split_freq -Get 'TX frequency', in Hz. +Get 'TX Frequency', in Hz. .TP -.B X, set_split_mode 'Tx mode' 'Tx passband' -Set 'Tx mode': AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, +.B X, set_split_mode 'TX Mode' 'TX Passband' +Set 'TX Mode': AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. - -The 'Tx passband' is the exact passband in Hz, or 0 for the default. +.br +The 'TX Passband' is the exact passband in Hz, or '0' for the Hamlib +backend default. .TP .B x, get_split_mode -Get 'Tx mode' and 'Tx passband'. Returns Tx mode as a string from -\fIset_split_mode\fP above and Tx passband in Hz. +Get 'TX Mode' and 'TX Passband'. +.br +Returns TX mode as a string from \fIset_split_mode\fP above and TX passband in Hz. .TP -.B S, set_split_vfo 'Split' 'Tx VFO' -Set 'Split' mode, 0 or 1, and 'Tx VFO'. +.B S, set_split_vfo 'Split' 'TX VFO' +Set 'Split' mode, '0' or '1', and 'TX VFO' from \fIset_vfo\fP above. .TP .B s, get_split_vfo -Get 'Split' mode and 'Tx VFO'. +Get 'Split' mode, '0' or '1', and 'TX VFO'. .TP -.B N, set_ts 'Tuning step' -Set 'Tuning step', in Hz. +.B N, set_ts 'Tuning Step' +Set 'Tuning Step', in Hz. .TP .B n, get_ts -Get 'Tuning step', in Hz. +Get 'Tuning Step', in Hz. .TP -.B U, set_func 'Func' 'Func status' -Set 'Func' 'Func status'. Func is one of: FAGC, NB, COMP, VOX, TONE, TSQL, +.B U, set_func 'Func' 'Func Status' +Set 'Func' 'Func Status'. +.br +Func is one of: FAGC, NB, COMP, VOX, TONE, TSQL, SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, RF, ARO, LOCK, MUTE, VSC, REV, SQL, ABM, BC, MBC, AFC, SATMODE, SCOPE, RESUME, TBURST, TUNER. +.br Func Status argument is a non null value for "activate", "de-activate" otherwise, much as TRUE/FALSE definitions in C language. .TP .B u, get_func -Get 'Func' 'Func status'. Returns Func as a string from \fIset_func\fP above -and Func status as a non null value. +Get 'Func' 'Func Status'. +.br +Returns Func as a string from \fIset_func\fP above and Func status as a non null value. .TP -.B L, set_level 'Level' 'Level value' -Set 'Level' and 'Level value'. Level is one of: PREAMP, ATT, VOX, AF, RF, SQL, -IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, RFPOWER, MICGAIN, KEYSPD, NOTCHF, COMP, -AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. SLOPE_LOW, SLOPE_HIGH, RAWSTR, -SQLSTAT, SWR, ALC, STRENGTH. -The Level value can be a float or an integer. +.B L, set_level 'Level' 'Level Value' +Set 'Level' and 'Level Value'. +.br +Level is one of: PREAMP, ATT, VOX, AF, RF, SQL, IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, +RFPOWER, MICGAIN, KEYSPD, NOTCHF, COMP, AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. +SLOPE_LOW, SLOPE_HIGH, RAWSTR, SQLSTAT, SWR, ALC, STRENGTH. +.br +The Level Value can be a float or an integer. .TP .B l, get_level -Get 'Level' 'Level value'. Returns Level as a string from \fIset_level\fP -above and Level value as a float or integer. +Get 'Level' 'Level Value'. +.br +Returns Level as a string from \fIset_level\fP above and Level value as a float or +integer. .TP -.B P, set_parm 'Parm' 'Parm value' -Set 'Parm' 'Parm value' Parm is one of: ANN, APO, BACKLIGHT, BEEP, TIME, BAT, -KEYLIGHT. +.B P, set_parm 'Parm' 'Parm Value' +Set 'Parm' 'Parm Value' +.br +Parm is one of: ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT. .TP .B p, get_parm -Get 'Parm' 'Parm value'. Returns Parm as a string from \fIset_parm\fP -above and Parm value as a float or integer. +Get 'Parm' 'Parm Value'. +.br +Returns Parm as a string from \fIset_parm\fP above and Parm Value as a float or +integer. .TP .B B, set_bank 'Bank' Set 'Bank'. Sets the current memory bank number. @@ -317,19 +341,22 @@ .B e, get_mem Get 'Memory#' channel number. .TP -.B G, vfo_op 'Mem/VFO op' -Perform 'Mem/VFO op'. Mem VFO operation is one of: CPY, XCHG, FROM_VFO, TO_VFO, -MCL, UP, DOWN, BAND_UP, BAND_DOWN, LEFT, RIGHT, TUNE, TOGGLE. +.B G, vfo_op 'Mem/VFO Op' +Perform 'Mem/VFO Op'. +.br +Mem VFO operation is one of: CPY, XCHG, FROM_VFO, TO_VFO, MCL, UP, DOWN, BAND_UP, +BAND_DOWN, LEFT, RIGHT, TUNE, TOGGLE. .TP -.B g, scan 'Scan fct' 'Scan channel' -Perform 'Scan fct' 'Scan channel'. Scan function/channel is one of: STOP, MEM, -SLCT, PRIO, PROG, DELTA, VFO, PLT. +.B g, scan 'Scan Fct' 'Scan Channel' +Perform 'Scan Fct' 'Scan Channel'. +.br +Scan function/channel is one of: STOP, MEM, SLCT, PRIO, PROG, DELTA, VFO, PLT. .TP .B H, set_channel 'Channel' Set memory 'Channel' data. Not implemented yet. .TP .B h, get_channel -Get memory 'Channel' data. +Get memory 'Channel' data. Not implemented yet. .TP .B A, set_trn 'Transceive' Set 'Transceive' mode (reporting event): OFF, RIG, POLL. @@ -344,21 +371,23 @@ Get 'Antenna' number (0, 1, 2, ..). .TP .B *, reset 'Reset' -Perform rig 'Reset'. 0 = None, 1 = Software reset, 2 = VFO reset, 4 = Memory -Clear reset, 8 = Master reset. Since these values are defined as a bitmask in -rig.h, it should be possible to AND these values together to do multiple resets -at once, if the backend supports it or supports a reset action via rig control -at all. +Perform rig 'Reset'. +.br +0 = None, 1 = Software reset, 2 = VFO reset, 4 = Memory Clear reset, 8 = Master reset. +Since these values are defined as a bitmask in rig.h, it should be possible to AND +these values together to do multiple resets at once, if the backend supports it or +supports a reset action via rig control at all. .TP .B b, send_morse 'Morse' Send 'Morse' symbols. .TP -.B 0x87, set_powerstat 'Status' -Set power On/Off/Standby 'Status'. 0 = Power Off, 1 = Power On, 2 = Power -Standby. Defined as a bitmask in rig.h. +.B 0x87, set_powerstat 'Power Status' +Set power On/Off/Standby 'Power Status'. +.br +0 = Power Off, 1 = Power On, 2 = Power Standby. Defined as a bitmask in rig.h. .TP .B 0x88, get_powerstat -Get power On/Off/Standby 'Status' as in \fIset_powerstat\fP above. +Get power On/Off/Standby 'Power Status' as in \fIset_powerstat\fP above. .TP .B 0x89, send_dtmf 'Digits' Set DTMF 'Digits'. @@ -374,12 +403,27 @@ backend knows about this model, and what it can do. TODO: Ensure this is in a consistent format so it can be read into a hash, dictionary, etc. Bug reports requested. +.br +VFO parameter not used in 'VFO mode'. .TP -.B 2, power2mW -Converts a power value in a range of \fI0.0 ... 1.0\fP to the real transmit -power in milli-Watts. The \fIfrequency\fP and \fImode\fP also need to be -provided as output power may vary according to these values. +.B 2, power2mW 'Power [0.0..1.0]' 'Frequency' 'Mode' +Returns 'Power mW' +.br +Converts a Power value in a range of \fI0.0 ... 1.0\fP to the real transmit +power in milli-Watts (integer). The \fIfrequency\fP and \fImode\fP also need to +be provided as output power may vary according to these values. +.br +VFO parameter not used in 'VFO mode'. .TP +.B 4, mW2power 'Power mW' 'Frequency' 'Mode' +Returns 'Power [0.0..1.0]' +.br +Converts the real transmit power in milli-Watts (integer) to a Power value in +a range of \fI0.0 ... 1.0\fP. The \fIfrequency\fP and \fImode\fP also need to +be provided as output power may vary according to these values. +.br +VFO parameter not used in 'VFO mode'. +.TP .B w, send_cmd 'Cmd' Send raw command string to rig. .br @@ -476,12 +520,20 @@ The following commands have been tested with the Block protocol and the included \fBtestctld.pl\fP script: .br -\fI\\set_freq\fP \fI\\get-freq\fP +\fI\\set_freq\fP \fI\\get_freq\fP \fI\\set_split_freq\fP \fI\\get_split_freq\fP .br -\fI\\set_mode\fP \fI\\get_mode\fP +\fI\\set_mode\fP \fI\\get_mode\fP \fI\\set_split_mode\fP \fI\\get_split_mode\fP .br -\fI\\set_vfo\fP \fI\\get_vfo\fP +\fI\\set_vfo\fP \fI\\get_vfo\fP \fI\\set_split_vfo\fP \fI\\get_split_vfo\fP .br +\fI\\set_rit\fP \fI\\get_rit\fP +.br +\fI\\set_xit\fP \fI\\get_xit\fP +.br +\fI\\set_ptt\fP \fI\\get_ptt\fP +.br +\fI\\power2mW\fP \fI\\mW2power\fP +.br \fI\\dump_caps\fP .SH EXAMPLES Start \fBrigctld\fP for a Yaesu FT-920 using an USB-to-serial adapter and This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-08 23:37:13
|
Revision: 2827 http://hamlib.svn.sourceforge.net/hamlib/?rev=2827&view=rev Author: n0nb Date: 2010-02-08 23:37:07 +0000 (Mon, 08 Feb 2010) Log Message: ----------- Removed -b|--block option in favor of using '+' prepended to a command from the client to request Extended Response protocol. Modified Paths: -------------- trunk/tests/rigctl.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 trunk/tests/rigctld.c Modified: trunk/tests/rigctl.c =================================================================== --- trunk/tests/rigctl.c 2010-02-06 15:28:25 UTC (rev 2826) +++ trunk/tests/rigctl.c 2010-02-08 23:37:07 UTC (rev 2827) @@ -2,26 +2,26 @@ * rigctl.c - (C) Stephane Fillod 2000-2009 * * This program test/control a radio using Hamlib. - * It takes commands in interactive mode as well as + * It takes commands in interactive mode as well as * from command line options. * - * $Id: rigctl.c,v 1.70 2009-01-04 14:49:17 fillods Exp $ + * $Id: rigctl.c,v 1.70 2009-01-04 14:49:17 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -53,7 +53,7 @@ /* - * Reminder: when adding long options, + * Reminder: when adding long options, * keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks. * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file @@ -86,7 +86,7 @@ int interactive = 1; /* if no cmd on command line, switch to interactive */ int prompt = 1; /* Print prompt in rigctl */ int opt_end= 0; /* only used by rigctld */ -int opt_block = 0; /* only used by rigctld */ +//int opt_block = 0; /* only used by rigctld */ int vfo_mode; /* vfo_mode=0 means target VFO is current VFO */ char send_cmd_term = '\r'; /* send_cmd termination char */ @@ -251,7 +251,7 @@ "<ham...@li...>\n\n"); /* - * at least one command on command line, + * at least one command on command line, * disable interactive mode */ if (optind < argc) @@ -260,7 +260,7 @@ my_rig = rig_init(my_model); if (!my_rig) { - fprintf(stderr, "Unknown rig num %d, or initialization error.\n", + fprintf(stderr, "Unknown rig num %d, or initialization error.\n", my_model); fprintf(stderr, "Please check with --list option.\n"); exit(2); @@ -275,7 +275,7 @@ if (rig_file) strncpy(my_rig->state.rigport.pathname, rig_file, FILPATHLEN); - /* + /* * ex: RIG_PTT_PARALLEL and /dev/parport0 */ if (ptt_type != RIG_PTT_NONE) @@ -318,7 +318,7 @@ if (verbose > 0) printf("Opened rig model %d, '%s'\n", my_rig->caps->rig_model, my_rig->caps->model_name); - rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", + rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rig->caps->version, rig_strstatus(my_rig->caps->status)); do { Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-02-06 15:28:25 UTC (rev 2826) +++ trunk/tests/rigctl_parse.c 2010-02-08 23:37:07 UTC (rev 2827) @@ -152,7 +152,6 @@ declare_proto_rig(get_powerstat); declare_proto_rig(send_dtmf); declare_proto_rig(recv_dtmf); -declare_proto_rig(chk_blk); declare_proto_rig(chk_vfo); @@ -229,8 +228,7 @@ { '1', "dump_caps", dump_caps, ARG_NOVFO }, { '3', "dump_conf", dump_conf, ARG_NOVFO }, { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, - { 0xf0,"chk_blk", chk_blk, ARG_NOVFO }, /* rigctld only--check for block protocol */ - { 0xf1,"chk_vfo", chk_vfo, ARG_NOVFO }, /* rigctld only--check for VFO mode */ + { 0xf0,"chk_vfo", chk_vfo, ARG_NOVFO }, /* rigctld only--check for VFO mode */ { 0x00, "", NULL }, }; @@ -283,9 +281,9 @@ extern int interactive; extern int prompt; extern int opt_end; -extern int opt_block; extern int vfo_mode; extern char send_cmd_term; +int ext_resp = 0; int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) { @@ -307,6 +305,16 @@ if (scanfc(fin, "%c", &cmd) < 0) return -1; + /* Extended response protocol requested with leading '+' on command + * string--rigctld only! */ + if (cmd == '+' && !prompt) { + ext_resp = 1; + if (scanfc(fin, "%c", &cmd) < 0) + return -1; + } else if (cmd == '+' && prompt) { + return 0; + } + /* command by name */ if (cmd == '\\') { unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name; @@ -466,23 +474,25 @@ #endif if (!prompt) - rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '%s' '%s' '%s'\n", - cmd, p1, p2, p3); + rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '0x%02x' '%s' '%s' '%s'\n", + cmd, vfo, p1, p2, p3); /* - * Block protocol: output received command name and arguments response - * Don't send response on '\chk_blk' command + * Extended Response protocol: output received command name and arguments + * response. Don't send command header on '\chk_vfo' command. */ - if (interactive && opt_block && (cmd != 0xf0 && cmd != 0xf1)) { - char a1[MAXARGSZ+1]; - char a2[MAXARGSZ+1]; - char a3[MAXARGSZ+1]; + if (interactive && ext_resp && cmd != 0xf0) { + char a1[MAXARGSZ + 1]; + char a2[MAXARGSZ + 1]; + char a3[MAXARGSZ + 1]; + char vfo_str[MAXARGSZ + 1]; - p1 == NULL ? a1[0] = '\0' : snprintf(a1, sizeof(a1), " %s", p1); + vfo_mode == 0 ? vfo_str[0] = '\0' : snprintf(vfo_str, sizeof(vfo_str), " %s", rig_strvfo(vfo)); + p1 == NULL ? a1[0] = '\0' : snprintf(a1, sizeof(a1), " %s", p1); p2 == NULL ? a2[0] = '\0' : snprintf(a2, sizeof(a2), " %s", p2); p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); - fprintf(fout, "%s:%s%s%s\n", cmd_entry->name, a1, a2, a3); + fprintf(fout, "%s:%s%s%s%s\n", cmd_entry->name, vfo_str, a1, a2, a3); } retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive, @@ -494,21 +504,28 @@ if (retcode != RIG_OK) { - if ((interactive && !prompt && opt_block) || (interactive && !prompt)) - fprintf(fout, NETRIGCTL_RET "%d\n", retcode); /* only for rigctld */ + /* only for rigctld */ + if ((interactive && !prompt && ext_resp) || (interactive && !prompt)) { + fprintf(fout, NETRIGCTL_RET "%d\n", retcode); + ext_resp = 0; + } else fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { -// rig_debug(RIG_DEBUG_TRACE, "rigctld: %d %s\n", cmd, cmd_entry->name); - - if (interactive && !prompt) { /* only for rigctld */ + /* only for rigctld */ + if (interactive && !prompt) { + /* netrigctl RIG_OK */ if (!(cmd_entry->flags & ARG_OUT) - && !opt_end && !opt_block && (cmd != 0xf0 && cmd != 0xf1)) /* netrigctl RIG_OK */ + && !opt_end && !ext_resp && cmd != 0xf0) fprintf(fout, NETRIGCTL_RET "0\n"); - else if ((cmd_entry->flags & ARG_OUT) && opt_end) /* Nate's protocol */ + /* block marker protocol */ + else if (ext_resp && cmd != 0xf0) { + fprintf(fout, NETRIGCTL_RET "0\n"); + ext_resp = 0; + } + /* Nate's protocol (obsolete) */ + else if ((cmd_entry->flags & ARG_OUT) && opt_end) fprintf(fout, "END\n"); - else if (opt_block && (cmd != 0xf0 && cmd != 0xf1)) /* block marker protocol */ - fprintf(fout, NETRIGCTL_RET "0\n"); } } @@ -658,7 +675,7 @@ if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); /* i.e. "Frequency" */ fprintf(fout, "%"PRIll"\n", (long long)freq); @@ -683,7 +700,7 @@ status = rig_get_rit(rig, vfo, &rit); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", rit); @@ -708,7 +725,7 @@ status = rig_get_xit(rig, vfo, &xit); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", xit); @@ -744,10 +761,10 @@ status = rig_get_mode(rig, vfo, &mode, &width); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strrmode(mode)); - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%ld\n", width); @@ -768,7 +785,7 @@ status = rig_get_vfo(rig, &vfo); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strvfo(vfo)); @@ -793,7 +810,7 @@ status = rig_get_ptt(rig, vfo, &ptt); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", ptt); @@ -809,7 +826,7 @@ status = rig_get_dcd(rig, vfo, &dcd); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", dcd); @@ -834,7 +851,7 @@ status = rig_get_rptr_shift(rig, vfo, &rptr_shift); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strptrshift(rptr_shift)); @@ -859,7 +876,7 @@ status = rig_get_rptr_offs(rig, vfo, &rptr_offs); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", rptr_offs); @@ -884,7 +901,7 @@ status = rig_get_ctcss_tone(rig, vfo, &tone); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", tone); @@ -909,7 +926,7 @@ status = rig_get_dcs_code(rig, vfo, &code); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", code); @@ -934,7 +951,7 @@ status = rig_get_ctcss_sql(rig, vfo, &tone); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", tone); @@ -959,7 +976,7 @@ status = rig_get_dcs_sql(rig, vfo, &code); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", code); @@ -986,7 +1003,7 @@ status = rig_get_split_freq(rig, txvfo, &txfreq); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%"PRIll"\n", (long long)txfreq); @@ -1024,10 +1041,10 @@ status = rig_get_split_mode(rig, txvfo, &mode, &width); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", rig_strrmode(mode)); - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%ld\n", width); @@ -1053,10 +1070,10 @@ status = rig_get_split_vfo(rig, vfo, &split, &tx_vfo); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", split); - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); fprintf(fout, "%s\n", rig_strvfo(tx_vfo)); @@ -1081,7 +1098,7 @@ status = rig_get_ts(rig, vfo, &ts); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%ld\n", ts); @@ -1104,7 +1121,7 @@ status = rig_power2mW(rig, &mwp, power, freq, mode); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg4); fprintf(fout, "%i\n", mwp); @@ -1127,7 +1144,7 @@ status = rig_mW2power(rig, &power, mwp, freq, mode); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg4); fprintf(fout, "%f\n", power); @@ -1436,7 +1453,7 @@ status = rig_get_mem(rig, vfo, &ch); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", ch); @@ -1722,7 +1739,7 @@ status = rig_get_trn(rig, &trn); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", trn); @@ -1735,7 +1752,7 @@ const char *s; s = rig_get_info(rig); - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%s\n", s ? s : "None"); @@ -1923,7 +1940,7 @@ status = rig_get_ant(rig, vfo, &ant); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", rig_setting2idx(ant)); @@ -1985,7 +2002,7 @@ status = rig_get_powerstat(rig, &stat); if (status != RIG_OK) return status; - if ((interactive && prompt) || (interactive && !prompt && opt_block)) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); fprintf(fout, "%d\n", stat); @@ -2077,14 +2094,6 @@ return retval; } -/* '0xf0'--test if rigctld called with -b|--block option */ -declare_proto_rig(chk_blk) -{ - fprintf(fout, "CHKBLK %d\n", opt_block); - - return RIG_OK; -} - /* '0xf1'--test if rigctld called with -o|--vfo option */ declare_proto_rig(chk_vfo) { Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-02-06 15:28:25 UTC (rev 2826) +++ trunk/tests/rigctld.8 2010-02-08 23:37:07 UTC (rev 2827) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTLD "8" "February 3, 2010" "Hamlib" "Rig Control Daemon" +.TH RIGCTLD "8" "February 8, 2010" "Hamlib" "Rig Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -16,23 +16,24 @@ .\" .sp <n> insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME -rigctld \- Hamlib rig control daemon +rigctld \- Hamlib TCP rig control daemon .SH SYNOPSIS .B rigctld [\fIOPTION\fR]... .SH DESCRIPTION -The \fBrigctld\fP program is an EXPERIMENTAL \fBHamlib\fP rig control daemon -that handles TCP client requests. This allows multiple user programs to share -one radio. Multiple radios can be controlled on different TCP ports by use of -multiple \fBrigctld\fP processes. The syntax of the commands are the same as -\fBrigctl\fP. It is hoped that \fBrigctld\fP will be especially useful for -languages such as Perl, Python, PHP, and others. +The \fBrigctld\fP program is a NEW \fBHamlib\fP rig control daemon ready for testing +that handles client requests via TCP sockets. This allows multiple user programs to +share one radio (this needs testing). Multiple radios can be controlled +on different TCP ports by use of multiple \fBrigctld\fP processes. The syntax of the +commands are the same as \fBrigctl\fP. It is hoped that \fBrigctld\fP will be +especially useful for client authors using languages such as Perl, Python, PHP, +and others. .PP .\" TeX users may be more comfortable with the \fB<whatever>\fP and .\" \fI<whatever>\fP escape sequences to invoke bold face and italics, .\" respectively. \fBrigctld\fP communicates to a client through a TCP socket using text -commands shared with \fBrigctl\fP. The protocol is simple, commands are sent +commands shared with \fBrigctl\fP. The protocol is simple; commands are sent to \fBrigctld\fP on one line and \fBrigctld\fP responds to "get" commands with the requested values, one per line, when successful, otherwise, it responds with one line "RPTR x", where x is a negative number indicating the error code. @@ -40,24 +41,22 @@ is zero when successful, otherwise is a regative number indicating the error code. Each line is terminated with a newline '\\n' character. .PP -A separate \fBblock\fP protocol (-b, or --block option) extends the above +A separate \fBExtended Response\fP protocol extends the above behavior by echoing the received command string as a header, any returned values -as a key: value pair, and the "RPTR x" string as the end of block marker which +as a key: value pair, and the "RPTR x" string as the end of response marker which includes the \fBHamlib\fP success or failure value. See the \fIPROTOCOL\fP section for details. .PP Keep in mind that \fBHamlib\fP is BETA level software. While a lot of backend libraries lack complete rig support, the basic functions -are usually well supported. The API may change without publicized notice, -while an advancement of the minor version (e.g. 1.1.x to 1.2.x) indicates such -a change. +are usually well supported. .PP Please report bugs and provide feedback at the e-mail address given in the -REPORTING BUGS section. Patches and code enhancements are also welcome. +\fIREPORTING BUGS\fP section. Patches and code enhancements are also welcome. .SH OPTIONS This program follows the usual GNU command line syntax, with long options starting with two dashes ('-'). - +.PP Here is a summary of the supported options: .TP .B \-m, --model=id @@ -92,7 +91,7 @@ Use \fIid\fP as the CI-V address to communicate with the rig. Only useful for Icom rigs. .br -N.B.: The \fIid\fP is in decimal notation, unless prefixed by +\fBN.B.\fP: The \fIid\fP is in decimal notation, unless prefixed by \fI0x\fP for a hexadecimal value. .TP .B \-T, --listen-addr=IPADDR @@ -100,6 +99,9 @@ .TP .B \-t, --port=number Use \fInumber\fP as the TCP listening port. The default is 4532. +.br +\fBN.B.\fP: As \fBrotctld\fP's default port is 4533, it is advisable to use even +numbered ports for \fBrigctld\fP, e.g. 4532, 4534, 4536, etc. .TP .B \-C, --set-conf=parm=val[,parm=val]* Set config parameter. e.g. --set-conf=stop_bits=2 @@ -121,14 +123,12 @@ option is not set and an extra VFO argument is not used. See \fI\\chk_vfo\fP below. .TP -.B \-b, --block -Use the block rigctld protocol. See \fI\\chk_blk\fP below. \fIEXPERIMENTAL\fP -.TP .B \-e, --end-marker Use END marker in rigctld protocol. .br -N.B.: This option can be considered obsolete. Please consider using the block -protocol instead (see \fIPROTOCOL\fP below). +\fBN.B.\fP: This option can be considered obsolete. Please consider using the Extended +Response protocol instead (see \fIPROTOCOL\fP below). This option will be removed +in a future Hamlib release. .TP .B \-v, --verbose Set verbose mode, cumulative (see \fIDIAGNOSTICS\fP below). @@ -157,10 +157,12 @@ also has a long name, prepend a backslash to send a long command name. .PP Example (Perl): `print $socket "\\\\dump_caps\\n";' to see what the radio's -backend can do (NOTE: In Perl and many other languages a '\\' will need to be +backend can do +.br +(\fBN.B.\fP: In Perl and many other languages a '\\' will need to be escaped with a preceding '\\' so that even though two backslash characters appear in the code, only one will be passed to \fBrigctld\fP. This is a -possible bug!). +possible bug, beware!). .PP Please note that the backend for the radio to be controlled, or the radio itself may not support some commands. In that case, the operation will fail with a @@ -404,6 +406,10 @@ in a consistent format so it can be read into a hash, dictionary, etc. Bug reports requested. .br +\fBN.B.\fP: This command will produce many lines of output so be very careful +if using a fixed length array! For example, running this command against these +Dummy backend results in over 5kB of text output. +.br VFO parameter not used in 'VFO mode'. .TP .B 2, power2mW 'Power [0.0..1.0]' 'Frequency' 'Mode' @@ -430,16 +436,11 @@ For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the rig which will likely be a binary block or an ASCII string. .TP -.B chk_blk -Returns "CHKBLK 1\\n" (single line only) if \fBrigctld\fP was invoked with the -\fI-b\fP or \fI--block\fP option, "CHKBLK 0\\n" if not. -.br -.TP .B chk_vfo Returns "CHKVFO 1\\n" (single line only) if \fBrigctld\fP was invoked with the \fI-o\fP or \fI--vfo\fP option, "CHKVFO 0\\n" if not. .br -When in VFO mode client will need to pass 'VFO' as the first parameter to +When in VFO mode the client will need to pass 'VFO' as the first parameter to \fI\\set\fP or \fI\\get\fP commands. 'VFO' is one of the strings defined for \fI\\set_vfo\fP above. .br @@ -471,15 +472,17 @@ Future work will focus on making this output compatible with assignment to a hash, dictionary, or other key:value variable. .PP -\fBBlock Protocol\fP +\fBExtended Response Protocol\fP .br -An \fIEXPERIMENTAL\fP Block protocol has been introduced into \fBrigctld\fP -as of January 24, 2010. This protocol adds several rules to the strings -returned by \fBrigctld\fP. +An \fIEXPERIMENTAL\fP Extended Response protocol has been introduced into +\fBrigctld\fP as of February 8, 2010. This protocol is invoked by prepending +a '+' character immediately ahead of the command string with no intervening +space. Also, several rules are added to the strings returned by \fBrigctld\fP. .PP 1. The command received by \fBrigctld\fP is echoed with its long command name followed by the value(s) received from the client terminated by a newline -as the first line of the block. +as the first line of the block. The leading '+' and '\\' characters are not +included in the echoed command string. .PP 2. The last line of each block is the string "RPTR \fIx\fP\\n" wheren \fIx\fP is the numeric return value of the Hamlib backend function that was called by the @@ -495,6 +498,8 @@ .PP An example response to a \fI\\set_mode\fP command: .br +$ echo "+F USB 2400" | nc -w 1 localhost 4532 +.br set_mode: USB 2400 .br RPRT 0 @@ -505,9 +510,11 @@ .PP An example response to a \fI\\get_mode\fP query: .br +$ echo "+\\get_mode" | nc -w 1 localhost 4532 +.br get_mode: .br -Mode: CW +Mode: USB .br Passband: 2400 .br @@ -517,8 +524,8 @@ only of the long command name. The final line shows that the command was processed successfully by the rig backend. .PP -The following commands have been tested with the Block protocol and the included -\fBtestctld.pl\fP script: +The following commands have been tested with the Extended Response protocol and the +included \fBtestctld.pl\fP script: .br \fI\\set_freq\fP \fI\\get_freq\fP \fI\\set_split_freq\fP \fI\\get_split_freq\fP .br @@ -542,12 +549,12 @@ $ rigctld -m 114 -r /dev/ttyUSB1 & .PP Start \fBrigctld\fP for a Yaesu FT-920 using a USB to serial adapter while -setting baud rate and stop bits, invoking block protocol, and backgrounding: +setting baud rate and stop bits, and backgrounding: .PP -$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 --block & +$ rigctld -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 & .PP Connect to the already running \fBrigctld\fP, and set current frequency to -14.266 MHz with a 1 second read timeout: +14.266 MHz with a 1 second read timeout using the default protocol: .PP $ echo "\\set_freq 14266000" | nc -w 1 localhost 4532 .SH DIAGNOSTICS @@ -564,6 +571,10 @@ No authentication whatsoever; DO NOT leave this TCP port open wide to the Internet. Please ask if stronger security is needed or consider using an SSH tunnel. +.PP +As \fBrigctld\fP does not need any greater permissions than \fBrigctl\fP, it +is advisable to not start \fBrigctld\fP as \fIroot\fP or another system user +account in order to limit any vulnerability. .SH BUGS The daemon is not detaching and backgrounding itself. .br Modified: trunk/tests/rigctld.c =================================================================== --- trunk/tests/rigctld.c 2010-02-06 15:28:25 UTC (rev 2826) +++ trunk/tests/rigctld.c 2010-02-08 23:37:07 UTC (rev 2827) @@ -68,7 +68,7 @@ * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file */ -#define SHORT_OPTIONS "m:r:p:d:P:D:s:c:T:t:C:lLuobevhV" +#define SHORT_OPTIONS "m:r:p:d:P:D:s:c:T:t:C:lLuoevhV" static struct option long_options[] = { {"model", 1, 0, 'm'}, @@ -86,7 +86,6 @@ {"show-conf",0, 0, 'L'}, {"dump-caps", 0, 0, 'u'}, {"vfo", 0, 0, 'o'}, - {"block", 0, 0, 'b'}, {"end-marker", 0, 0, 'e'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, @@ -107,7 +106,6 @@ int interactive = 1; /* no cmd because of daemon */ int prompt = 0; /* Daemon mode for rigparse return string */ int opt_end = 0; /* END marker for rigctld */ -int opt_block = 0; /* Block markers for rigctld */ int vfo_mode = 0; /* vfo_mode=0 means target VFO is current VFO */ char send_cmd_term = '\r'; /* send_cmd termination char */ @@ -279,11 +277,8 @@ break; case 'e': opt_end++; - fprintf(stderr, "-e|--end-marker option is deprecated. Please consider -b|--block instead.\n"); + fprintf(stderr, "-e|--end-marker option is deprecated!\nPlease consider using the Extended Response protocol instead.\n"); break; - case 'b': - opt_block++; - break; default: usage(); /* unknown option? */ exit(1); @@ -518,8 +513,7 @@ " -l, --list list all model numbers and exit\n" " -u, --dump-caps dump capabilities and exit\n" " -o, --vfo do not default to VFO_CURR, require extra vfo arg\n" - " -b, --block use block rigctld protocol\n", - " -e, --end-marker use END marker in rigctld protocol\n" + " -e, --end-marker use END marker in rigctld protocol (obsolete)\n" " -v, --verbose set verbose mode, cumulative\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n\n", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-14 22:18:10
|
Revision: 2831 http://hamlib.svn.sourceforge.net/hamlib/?rev=2831&view=rev Author: n0nb Date: 2010-02-14 22:18:00 +0000 (Sun, 14 Feb 2010) Log Message: ----------- Implement and document Extended Response Protocol for rotctld New test program, testrotctld.pl for rotctld Implemented locator.c functions in rotctl and rotctld Modified Paths: -------------- trunk/tests/Makefile.am trunk/tests/rotctl.c trunk/tests/rotctl_parse.c trunk/tests/rotctl_parse.h trunk/tests/rotctld.8 trunk/tests/rotctld.c Added Paths: ----------- trunk/tests/testrotctld.pl Modified: trunk/tests/Makefile.am =================================================================== --- trunk/tests/Makefile.am 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/Makefile.am 2010-02-14 22:18:00 UTC (rev 2831) @@ -5,15 +5,15 @@ DISTCLEANFILES = rigctl.log rigctl.sum testbcd.log testbcd.sum bin_PROGRAMS = rigctl rigmem rigswr rigsmtr rotctl rigctld rotctld -man_MANS = rigctl.1 rigmem.1 rigswr.1 rigsmtr.1 rotctl.1 rigctld.8 rotctld.8 +man_MANS = rigctl.1 rigmem.1 rigswr.1 rigsmtr.1 rotctl.1 rigctld.8 rotctld.8 check_PROGRAMS = dumpmem testrig testtrn testbcd testfreq listrigs \ testloc rig_bench @RIGMATRIX@ rigctl_SOURCES = rigctl.c rigctl_parse.c dumpcaps.c sprintflst.c rigctld_SOURCES = rigctld.c rigctl_parse.c dumpcaps.c sprintflst.c -rotctl_SOURCES = rotctl.c rotctl_parse.c -rotctld_SOURCES = rotctld.c rotctl_parse.c +rotctl_SOURCES = rotctl.c rotctl_parse.c dumpcaps_rot.c +rotctld_SOURCES = rotctld.c rotctl_parse.c dumpcaps_rot.c rigswr_SOURCES = rigswr.c rigsmtr_SOURCES = rigsmtr.c rigmem_SOURCES = rigmem.c memsave.c memload.c memcsv.c sprintflst.c @@ -40,11 +40,11 @@ rotctl_LDFLAGS = @ROT_BACKENDLNK@ rigctld_LDFLAGS = @BACKENDLNK@ @PTHREAD_LIBS@ @NET_LIBS@ rotctld_LDFLAGS = @ROT_BACKENDLNK@ @PTHREAD_LIBS@ @NET_LIBS@ - + # temporary hack testbcd_LDFLAGS = -dlpreopen self testloc_LDFLAGS = -dlpreopen self - + # rigmatrix needs also libgd rigmatrix_LDFLAGS = -lgd -lz @BACKENDLNK@ @@ -72,5 +72,5 @@ for f in `./listrigs | tail -n +2 | cut -f1` ; do ( ./rigctl -m $$f -u > sup-info/support/model$$f.txt || exit 0 ) ; done ./rigctl -l |sort -n | $(srcdir)/rig_split_lst.awk -v lst_dir="sup-info" -EXTRA_DIST = rigmatrix_head.html rig_split_lst.awk $(man_MANS) testctld.pl +EXTRA_DIST = rigmatrix_head.html rig_split_lst.awk $(man_MANS) testctld.pl testrotctld.pl Modified: trunk/tests/rotctl.c =================================================================== --- trunk/tests/rotctl.c 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/rotctl.c 2010-02-14 22:18:00 UTC (rev 2831) @@ -2,26 +2,26 @@ * rotctl.c - (C) Stephane Fillod 2000-2009 * * This program test/control a rotator using Hamlib. - * It takes commands in interactive mode as well as + * It takes commands in interactive mode as well as * from command line options. * - * $Id: rotctl.c,v 1.14 2009-02-17 08:03:22 fillods Exp $ + * $Id: rotctl.c,v 1.14 2009-02-17 08:03:22 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -41,13 +41,13 @@ #include "rotctl_parse.h" -/* +/* * Prototypes */ void usage(); /* - * Reminder: when adding long options, + * Reminder: when adding long options, * keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks. * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file @@ -77,7 +77,7 @@ char send_cmd_term = '\r'; /* send_cmd termination char */ int main (int argc, char *argv[]) -{ +{ ROT *my_rot; /* handle to rot (instance) */ rot_model_t my_model = ROT_MODEL_DUMMY; @@ -167,7 +167,7 @@ "<ham...@li...>\n\n"); /* - * at least one command on command line, + * at least one command on command line, * disable interactive mode */ if (optind < argc) @@ -176,7 +176,7 @@ my_rot = rot_init(my_model); if (!my_rot) { - fprintf(stderr, "Unknown rot num %d, or initialization error.\n", + fprintf(stderr, "Unknown rot num %d, or initialization error.\n", my_model); fprintf(stderr, "Please check with --list option.\n"); exit(2); Modified: trunk/tests/rotctl_parse.c =================================================================== --- trunk/tests/rotctl_parse.c 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/rotctl_parse.c 2010-02-14 22:18:00 UTC (rev 2831) @@ -2,26 +2,26 @@ * rotctl.c - (C) Stephane Fillod 2000-2009 * * This program test/control a rotator using Hamlib. - * It takes commands in interactive mode as well as + * It takes commands in interactive mode as well as * from command line options. * - * $Id: rotctl_parse.c,v 1.5 2009-01-04 14:49:17 fillods Exp $ + * $Id: rotctl_parse.c,v 1.5 2009-01-04 14:49:17 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -70,17 +70,20 @@ struct test_table { unsigned char cmd; const char *name; - int (*rot_routine)(ROT*, FILE*, int, const struct test_table*, const char*, - const char*, const char*); + int (*rot_routine)(ROT*, FILE*, int, const struct test_table*, const char*, + const char*, const char*, const char*, const char*, const char*); int flags; const char *arg1; const char *arg2; const char *arg3; + const char *arg4; + const char *arg5; + const char *arg6; }; #define declare_proto_rot(f) static int (f)(ROT *rot, FILE *fout, int interactive, \ - const struct test_table *cmd, const char *arg1, \ - const char *arg2, const char *arg3) + const struct test_table *cmd, const char *arg1, const char *arg2, \ + const char *arg3, const char *arg4, const char *arg5, const char *arg6) declare_proto_rot(set_position); declare_proto_rot(get_position); @@ -92,6 +95,17 @@ declare_proto_rot(inter_set_conf); /* interactive mode set_conf */ declare_proto_rot(send_cmd); declare_proto_rot(dump_state); +declare_proto_rot(dump_caps); +/* Follows are functions from locator.c */ +declare_proto_rot(loc2lonlat); +declare_proto_rot(lonlat2loc); +declare_proto_rot(d_m_s2dec); +declare_proto_rot(dec2d_m_s); +declare_proto_rot(d_mm2dec); +declare_proto_rot(dec2d_mm); +declare_proto_rot(coord2qrb); +declare_proto_rot(az_sp2az_lp); +declare_proto_rot(dist_sp2dist_lp); /* * convention: upper case cmd is set, lowercase is get @@ -99,24 +113,34 @@ * NB: 'q' 'Q' '?' are reserved by interactive mode interface */ struct test_table test_list[] = { - { 'P', "set_pos", set_position, ARG_IN, "Azimuth", "Elevation" }, - { 'p', "get_pos", get_position, ARG_OUT, "Azimuth", "Elevation" }, - { 'K', "park", park, ARG_NONE, }, - { 'S', "stop", stop, ARG_NONE, }, - { 'R', "reset", reset, ARG_IN, "Reset" }, - { 'M', "move", move, ARG_IN, "Direction", "Speed" }, - { 'C', "set_conf", inter_set_conf, ARG_IN, "Token", "Value" }, - { '_', "get_info", get_info, ARG_OUT, "Info" }, - { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2, "Cmd", "Reply" }, - { 0x8f,"dump_state", dump_state, ARG_OUT }, - { 0x00, "", NULL }, + { 'P', "set_pos", set_position, ARG_IN, "Azimuth", "Elevation" }, + { 'p', "get_pos", get_position, ARG_OUT, "Azimuth", "Elevation" }, + { 'K', "park", park, ARG_NONE, }, + { 'S', "stop", stop, ARG_NONE, }, + { 'R', "reset", reset, ARG_IN, "Reset" }, + { 'M', "move", move, ARG_IN, "Direction", "Speed" }, + { 'C', "set_conf", inter_set_conf, ARG_IN, "Token", "Value" }, + { '_', "get_info", get_info, ARG_OUT, "Info" }, + { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2, "Cmd", "Reply" }, + { '1', "dump_caps", dump_caps, }, + { 0x8f,"dump_state",dump_state, ARG_OUT }, + { 'L', "lonlat2loc",lonlat2loc, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1, "Longitude", "Latitude", "Loc Len [2-12]", "Locator" }, + { 'l', "loc2lonlat",loc2lonlat, ARG_IN1|ARG_OUT1|ARG_OUT2, "Locator", "Longitude", "Latitude" }, + { 'D', "dms2dec", d_m_s2dec, ARG_IN1|ARG_IN2|ARG_IN3|ARG_IN4|ARG_OUT1, "Degrees", "Minutes", "Seconds", "S/W", "Dec Degrees" }, + { 'd', "dec2dms", dec2d_m_s, ARG_IN1|ARG_OUT1|ARG_OUT2|ARG_OUT3|ARG_OUT4, "Dec Degrees", "Degrees", "Minutes", "Seconds", "S/W" }, + { 'E', "dmmm2dec", d_mm2dec, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1, "Degrees", "Dec Minutes", "S/W", "Dec Deg" }, + { 'e', "dec2dmmm", dec2d_mm, ARG_IN1|ARG_OUT1|ARG_OUT2|ARG_OUT3, "Dec Deg", "Degrees", "Dec Minutes", "S/W" }, + { 'B', "qrb", coord2qrb, ARG_IN1|ARG_IN2|ARG_IN3|ARG_IN4|ARG_OUT1|ARG_OUT2, "Lon 1", "Lat 1", "Lon 2", "Lat 2", "QRB Distance", "QRB Azimuth" }, + { 'A', "a_sp2a_lp", az_sp2az_lp, ARG_IN1|ARG_OUT1, "Short Path Deg", "Long Path Deg" }, + { 'a', "d_sp2d_lp", dist_sp2dist_lp,ARG_IN1|ARG_OUT1, "Short Path km", "Long Path km" }, + { 0x00, "", NULL }, }; struct test_table *find_cmd_entry(int cmd) { int i; - for (i=0; i<MAXNBOPT && test_list[i].cmd != 0x00; i++) + for (i = 0; i < MAXNBOPT && test_list[i].cmd != 0x00; i++) if (test_list[i].cmd == cmd) break; @@ -131,13 +155,13 @@ char parse_arg(const char *arg) { int i; - for (i=0; i<MAXNBOPT && test_list[i].cmd != 0; i++) + for (i = 0; i < MAXNBOPT && test_list[i].cmd != 0; i++) if (!strncmp(arg, test_list[i].name, MAXNAMSIZ)) return test_list[i].cmd; return 0; } -/* +/* * This scanf works even in presence of signals (timer, SIGIO, ..) */ static int scanfc(FILE *fin, const char *format, void *p) @@ -161,16 +185,20 @@ extern int prompt; extern int opt_end; extern char send_cmd_term; +int ext_resp = 0; +unsigned char resp_sep = '\n'; /* Default response separator */ int rotctl_parse(ROT *my_rot, FILE *fin, FILE *fout, char *argv[], int argc) -{ +{ int retcode; /* generic return code from functions */ unsigned char cmd; struct test_table *cmd_entry; - char arg1[MAXARGSZ+1], *p1; - char arg2[MAXARGSZ+1], *p2; - char arg3[MAXARGSZ+1], *p3; + char arg1[MAXARGSZ + 1], *p1; + char arg2[MAXARGSZ + 1], *p2; + char arg3[MAXARGSZ + 1], *p3; + char arg4[MAXARGSZ + 1], *p4; + char *p5, *p6; static int last_was_ret = 1; if (interactive) { @@ -181,11 +209,31 @@ if (scanfc(fin, "%c", &cmd) < 0) return -1; + /* Extended response protocol requested with leading '+' on command + * string -- rotctld only! */ + if (cmd == '+' && !prompt) { + ext_resp = 1; + if (scanfc(fin, "%c", &cmd) < 0) + return -1; + } else if (cmd == '+' && prompt) { + return 0; + } + + if (cmd != '\\' && cmd != '_' && ispunct(cmd) && !prompt) { + ext_resp = 1; + resp_sep = cmd; + if (scanfc(fin, "%c", &cmd) < 0) + return -1; + continue; + } else if (cmd != '\\' && cmd != '?' && cmd != '_' && ispunct(cmd) && prompt) { + return 0; + } + /* command by name */ if (cmd == '\\') { unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name; int c_len = MAXNAMSIZ; - + if (scanfc(fin, "%c", pcmd) < 0) return -1; @@ -202,7 +250,6 @@ if (last_was_ret) { if (prompt) { fprintf(fout, "? for help, q to quit.\n"); - fprintf(fout, "\nRotator command: "); } return 0; } @@ -243,9 +290,9 @@ return 0; } - p1 = p2 = p3 = NULL; + p1 = p2 = p3 = p4 = p5 = p6 = NULL; - if ((cmd_entry->flags & ARG_IN_LINE) && + if ((cmd_entry->flags & ARG_IN_LINE) && (cmd_entry->flags & ARG_IN1) && cmd_entry->arg1) { if (interactive) { char *nl; @@ -259,7 +306,7 @@ p1 = arg1[0]==' '?arg1+1:arg1; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -274,7 +321,7 @@ p1 = arg1; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -290,7 +337,7 @@ p2 = arg2; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -306,7 +353,7 @@ p3 = arg3; } else { if (!argv[optind]) { - fprintf(stderr, "Invalid arg for command '%s'\n", + fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); exit(2); } @@ -314,6 +361,23 @@ } } + if (p1 && p1[0]!='?' && (cmd_entry->flags & ARG_IN4) && cmd_entry->arg4) { + if (interactive) { + if (prompt) + fprintf(fout, "%s: ", cmd_entry->arg4); + if (scanfc(fin, "%s", arg4) < 0) + return -1; + p4 = arg4; + } else { + if (!argv[optind]) { + fprintf(stderr, "Invalid arg for command '%s'\n", + cmd_entry->name); + exit(2); + } + p4 = argv[optind++]; + } + } + /* * mutex locking needed because rigctld is multithreaded * and hamlib is not MT-safe @@ -323,28 +387,60 @@ #endif if (!prompt) - rig_debug(RIG_DEBUG_TRACE, "rotctl: %c '%s' '%s' '%s'\n", - cmd, p1, p2, p3); + rig_debug(RIG_DEBUG_TRACE, "rotctl(d): %c '%s' '%s' '%s' '%s'\n", + cmd, p1, p2, p3, p4); - retcode = (*cmd_entry->rot_routine)(my_rot, fout, interactive, - cmd_entry, p1, p2, p3); + /* + * Extended Response protocol: output received command name and arguments + * response. + */ + if (interactive && ext_resp && !prompt) { + char a1[MAXARGSZ + 1]; + char a2[MAXARGSZ + 1]; + char a3[MAXARGSZ + 1]; + char a4[MAXARGSZ + 1]; + p1 == NULL ? a1[0] = '\0' : snprintf(a1, sizeof(a1), " %s", p1); + p2 == NULL ? a2[0] = '\0' : snprintf(a2, sizeof(a2), " %s", p2); + p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); + p4 == NULL ? a4[0] = '\0' : snprintf(a4, sizeof(a4), " %s", p4); + + fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, a1, a2, a3, a4, resp_sep); + } + + retcode = (*cmd_entry->rot_routine)(my_rot, fout, interactive, + cmd_entry, p1, p2, p3, p4, p5, p6); + #ifdef HAVE_PTHREAD pthread_mutex_unlock(&rot_mutex); #endif if (retcode != RIG_OK) { - if (interactive && !prompt) - fprintf(fout, NETROTCTL_RET "%d\n", retcode); /* only for rotctld */ + /* only for rotctld */ + if (interactive && !prompt) { + fprintf(fout, NETROTCTL_RET "%d\n", retcode); + ext_resp = 0; + resp_sep = '\n'; + } else - fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); + fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { - if (interactive && !prompt) { /* only for rotctld */ - if (!(cmd_entry->flags & ARG_OUT) && !opt_end) /* netrotctl RIG_OK */ + /* only for rotctld */ + if (interactive && !prompt) { + /* netrotctl RIG_OK */ + if (!(cmd_entry->flags & ARG_OUT) + && !opt_end && !ext_resp && cmd != 0xf0) fprintf(fout, NETROTCTL_RET "0\n"); - else if ((cmd_entry->flags & ARG_OUT) && opt_end) /* Nate's protocol */ + /* block marker protocol */ + else if (ext_resp && cmd != 0xf0) { + fprintf(fout, NETROTCTL_RET "0\n"); + ext_resp = 0; + resp_sep = '\n'; + } + /* Nate's protocol (obsolete) */ + else if ((cmd_entry->flags & ARG_OUT) && opt_end) fprintf(fout, "END\n"); - } + } } fflush(fout); @@ -360,26 +456,31 @@ printf("%s\n", hamlib_copyright); } + void usage_rot(FILE *fout) { - int i; + int i, nbspaces; - fprintf(fout, "Commands (may not be available for this rotator):\n"); - for (i=0; test_list[i].cmd != 0; i++) { - fprintf(fout, "%c: %-16s(", test_list[i].cmd, test_list[i].name); - if (test_list[i].arg1) - fprintf(fout, "%s", test_list[i].arg1); - if (test_list[i].arg2) - fprintf(fout, ",%s", test_list[i].arg2); - if (test_list[i].arg3) - fprintf(fout, ",%s", test_list[i].arg3); - fprintf(fout, ") \t"); + fprintf(fout, "Commands (some may not be available for this rig):\n"); + for (i = 0; test_list[i].cmd != 0; i++) { + fprintf(fout, "%c: %-12s(", isprint(test_list[i].cmd) ? + test_list[i].cmd : '?', test_list[i].name); - if (i%2) - fprintf(fout, "\n"); + nbspaces = 16; + if (test_list[i].arg1 && (test_list[i].flags&ARG_IN1)) + nbspaces -= fprintf(fout, "%s", test_list[i].arg1); + if (test_list[i].arg2 && (test_list[i].flags&ARG_IN2)) + nbspaces -= fprintf(fout, ", %s", test_list[i].arg2); + if (test_list[i].arg3 && (test_list[i].flags&ARG_IN3)) + nbspaces -= fprintf(fout, ", %s", test_list[i].arg3); + if (test_list[i].arg4 && (test_list[i].flags&ARG_IN4)) + nbspaces -= fprintf(fout, ", %s", test_list[i].arg4); + + fprintf(fout, ")\n"); } } + int print_conf_list(const struct confparams *cfp, rig_ptr_t data) { ROT *rot = (ROT*) data; @@ -387,33 +488,33 @@ char buf[128] = ""; rot_get_conf(rot, cfp->token, buf); - printf("%s: \"%s\"\n" "\tDefault: %s, Value: %s\n", - cfp->name, cfp->tooltip, + printf("%s: \"%s\"\n" "\tDefault: %s, Value: %s\n", + cfp->name, cfp->tooltip, cfp->dflt, buf ); switch (cfp->type) { case RIG_CONF_NUMERIC: - printf("\tRange: %.1f..%.1f, step %.1f\n", + printf("\tRange: %.1f..%.1f, step %.1f\n", cfp->u.n.min, cfp->u.n.max, cfp->u.n.step); break; case RIG_CONF_COMBO: if (!cfp->u.c.combostr) - break; + break; printf("\tCombo: %s", cfp->u.c.combostr[0]); - for (i=1 ; i<RIG_COMBO_MAX && cfp->u.c.combostr[i]; i++) - printf(", %s", cfp->u.c.combostr[i]); + for (i = 1 ; i < RIG_COMBO_MAX && cfp->u.c.combostr[i]; i++) + printf(", %s", cfp->u.c.combostr[i]); printf("\n"); break; - default: - break; + default: + break; } - return 1; /* !=0, we want them all ! */ + return 1; /* != 0, we want them all ! */ } static int print_model_list(const struct rot_caps *caps, void *data) { - printf("%d\t%-14s%-16s%-8s%s\n", caps->rot_model, caps->mfg_name, + printf("%-8d%-16s%-25s%-10s%s\n", caps->rot_model, caps->mfg_name, caps->model_name, caps->version, rig_strstatus(caps->status)); return 1; /* !=0, we want them all ! */ } @@ -424,7 +525,7 @@ rot_load_all_backends(); - printf("Rot#\tMfg Model Vers.\n"); + printf("Rot# Mfg Model Vers.\n"); status = rot_list_foreach(print_model_list, NULL); if (status != RIG_OK ) { printf("rot_list_foreach: error = %s \n", rigerror(status)); @@ -459,6 +560,7 @@ * static int (f)(ROT *rot, int interactive, const void *arg1, const void *arg2, const void *arg3, const void *arg4) */ +/* 'P' */ declare_proto_rot(set_position) { azimuth_t az; @@ -469,6 +571,7 @@ return rot_set_position(rot, az, el); } +/* 'p' */ declare_proto_rot(get_position) { int status; @@ -477,28 +580,30 @@ status = rot_get_position(rot, &az, &el); if (status != RIG_OK) - return status; - if (interactive && prompt) + return status; + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%f\n", az); - if (interactive && prompt) + fprintf(fout, "%f%c", az, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); - fprintf(fout, "%f\n", el); + fprintf(fout, "%f%c", el, resp_sep); return status; } +/* 'S' */ declare_proto_rot(stop) { return rot_stop(rot); } +/* 'K' */ declare_proto_rot(park) { return rot_park(rot); } - +/* 'R' */ declare_proto_rot(reset) { rot_reset_t reset; @@ -507,28 +612,31 @@ return rot_reset(rot, reset); } +/* '_' */ declare_proto_rot(get_info) { const char *s; s = rot_get_info(rot); - if (interactive && prompt) + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", s ? s : "None"); + fprintf(fout, "%s%c", s ? s : "None", resp_sep); return RIG_OK; } +/* 'M' */ declare_proto_rot(move) { - int direction; - int speed; + int direction; + int speed; - sscanf(arg1, "%d", &direction); + sscanf(arg1, "%d", &direction); sscanf(arg2, "%d", &speed); return rot_move(rot, direction, speed); } +/* 'C' */ declare_proto_rot(inter_set_conf) { token_t token; @@ -539,7 +647,19 @@ return rot_set_conf(rot, token, val); } -/* For rotctld internal use */ + +/* '1' */ +declare_proto_rot(dump_caps) +{ + dumpcaps_rot(rot, fout); + + return RIG_OK; +} + + +/* For rotctld internal use + * '0x8f' + */ declare_proto_rot(dump_state) { struct rot_state *rs = &rot->state; @@ -548,14 +668,30 @@ * - Protocol version */ #define ROTCTLD_PROT_VER 0 - fprintf(fout, "%d\n", ROTCTLD_PROT_VER); - fprintf(fout, "%d\n", rot->caps->rot_model); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "rotctld Protocol Ver: "); + fprintf(fout, "%d%c", ROTCTLD_PROT_VER, resp_sep); - fprintf(fout, "%lf\n", rs->min_az); - fprintf(fout, "%lf\n", rs->max_az); - fprintf(fout, "%lf\n", rs->min_el); - fprintf(fout, "%lf\n", rs->max_el); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Rotor Model: "); + fprintf(fout, "%d%c", rot->caps->rot_model, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Minimum Azimuth: "); + fprintf(fout, "%lf%c", rs->min_az, resp_sep); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Maximum Azimuth: "); + fprintf(fout, "%lf%c", rs->max_az, resp_sep); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Minimum Elevation: "); + fprintf(fout, "%lf%c", rs->min_el, resp_sep); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Maximum Elevation: "); + fprintf(fout, "%lf%c", rs->max_el, resp_sep); + return RIG_OK; } @@ -584,21 +720,21 @@ if (send_cmd_term == -1 || backend_num == -1) { const char *p = arg1, *pp = NULL; int i; - for (i=0; i < BUFSZ-1 && p != pp; i++) { - pp = p+1; - bufcmd[i] = strtol(p+1, (char **) &p, 0); + for (i = 0; i < BUFSZ - 1 && p != pp; i++) { + pp = p + 1; + bufcmd[i] = strtol(p + 1, (char **) &p, 0); } /* must save length to allow 0x00 to be sent as part of a command */ - cmd_len = i-1; + cmd_len = i - 1; /* no End Of Message chars */ eom_buf[0] = '\0'; } else { /* text protocol */ - strncpy(bufcmd,arg1,BUFSZ); - bufcmd[BUFSZ-2] = '\0'; + strncpy(bufcmd,arg1, BUFSZ); + bufcmd[BUFSZ - 2] = '\0'; cmd_len = strlen(bufcmd); @@ -627,12 +763,12 @@ retval = read_string(&rs->rotport, buf, BUFSZ, eom_buf, strlen(eom_buf)); if (retval < 0) break; - + if (retval < BUFSZ) buf[retval] = '\0'; else buf[BUFSZ-1] = '\0'; - + fprintf(fout, "%s\n", buf); } while (retval > 0); @@ -643,3 +779,207 @@ return retval; } +/* 'L' */ +declare_proto_rot(lonlat2loc) +{ + unsigned char loc[MAXARGSZ + 1]; + double lat, lon; + int err, pair; + + sscanf(arg1, "%lf", &lon); + sscanf(arg2, "%lf", &lat); + sscanf(arg3, "%d", &pair); + + pair /= 2; + + err = longlat2locator(lon, lat, (char *)&loc, pair); + + if (err != RIG_OK) + return err; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%s%c", loc, resp_sep); + + return err; +} + +/* 'l' */ +declare_proto_rot(loc2lonlat) +{ + unsigned char loc[MAXARGSZ + 1]; + double lat, lon; + int status; + + sscanf(arg1, "%s", (char *)&loc); + + status = locator2longlat(&lon, &lat, (const char *)loc); + + if (status != RIG_OK) + return status; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg2); + fprintf(fout, "%f%c", lon, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg3); + fprintf(fout, "%f%c", lat, resp_sep); + + return status; +} + +/* 'D' */ +declare_proto_rot(d_m_s2dec) +{ + int deg, min, sw; + double sec, dec_deg; + + sscanf(arg1, "%d", °); + sscanf(arg2, "%d", &min); + sscanf(arg3, "%lf", &sec); + sscanf(arg4, "%d", &sw); + + dec_deg = dms2dec(deg, min, sec, sw); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg5); + fprintf(fout, "%lf%c", dec_deg, resp_sep); + + return RIG_OK; +} + +/* 'd' */ +declare_proto_rot(dec2d_m_s) +{ + int deg, min, sw, err; + double sec, dec_deg; + + sscanf(arg1, "%lf", &dec_deg); + + err = dec2dms(dec_deg, °, &min, &sec, &sw); + + if (err != RIG_OK) + return err; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg2); + fprintf(fout, "%d%c", deg, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg3); + fprintf(fout, "%d%c", min, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%lf%c", sec, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg5); + fprintf(fout, "%d%c", sw, resp_sep); + + return err; +} + +/* 'E' */ +declare_proto_rot(d_mm2dec) +{ + int deg, sw; + double dec_deg, min; + + sscanf(arg1, "%d", °); + sscanf(arg2, "%lf", &min); + sscanf(arg3, "%d", &sw); + + dec_deg = dmmm2dec(deg, min, sw); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%lf%c", dec_deg, resp_sep); + + return RIG_OK; +} + +/* 'e' */ +declare_proto_rot(dec2d_mm) +{ + int deg, sw, err; + double min, dec_deg; + + sscanf(arg1, "%lf", &dec_deg); + + err = dec2dmmm(dec_deg, °, &min, &sw); + + if (err != RIG_OK) + return err; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg2); + fprintf(fout, "%d%c", deg, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg3); + fprintf(fout, "%lf%c", min, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg4); + fprintf(fout, "%d%c", sw, resp_sep); + + return err; +} + +/* 'B' */ +declare_proto_rot(coord2qrb) +{ + double lon1, lat1, lon2, lat2, dist, az; + int err; + + sscanf(arg1, "%lf", &lon1); + sscanf(arg2, "%lf", &lat1); + sscanf(arg3, "%lf", &lon2); + sscanf(arg4, "%lf", &lat2); + + err = qrb(lon1, lat1, lon2, lat2, &dist, &az); + + if (err != RIG_OK) + return err; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg5); + fprintf(fout, "%lf%c", dist, resp_sep); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg6); + fprintf(fout, "%lf%c", az, resp_sep); + + return err; +} + +/* 'A' */ +declare_proto_rot(az_sp2az_lp) +{ + double az_sp, az_lp; + + sscanf(arg1, "%lf", &az_sp); + + az_lp = azimuth_long_path(az_sp); + + if (az_lp < 0) + return -RIG_EINVAL; + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg2); + fprintf(fout, "%lf%c", az_lp, resp_sep); + + return RIG_OK; +} + +/* 'a' */ +declare_proto_rot(dist_sp2dist_lp) +{ + double dist_sp, dist_lp; + + sscanf(arg1, "%lf", &dist_sp); + + dist_lp = distance_long_path(dist_sp); + + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "%s: ", cmd->arg2); + fprintf(fout, "%lf%c", dist_lp, resp_sep); + + return RIG_OK; +} + Modified: trunk/tests/rotctl_parse.h =================================================================== --- trunk/tests/rotctl_parse.h 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/rotctl_parse.h 2010-02-14 22:18:00 UTC (rev 2831) @@ -2,26 +2,26 @@ * rotctl_parse.h - (C) Stephane Fillod 2000-2008 * * This program test/control a radio using Hamlib. - * It takes commands in interactive mode as well as + * It takes commands in interactive mode as well as * from command line options. * - * $Id: rotctl_parse.h,v 1.1 2008-09-12 22:55:09 fillods Exp $ + * $Id: rotctl_parse.h,v 1.1 2008-09-12 22:55:09 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifndef ROTCTL_PARSE_H @@ -30,7 +30,14 @@ #include <stdio.h> #include <hamlib/rotator.h> -/* +/* + * external prototype + */ + +int dumpcaps_rot (ROT *, FILE *); + + +/* * Prototypes */ void usage_rot(FILE *); Modified: trunk/tests/rotctld.8 =================================================================== --- trunk/tests/rotctld.8 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/rotctld.8 2010-02-14 22:18:00 UTC (rev 2831) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH ROTCTLD "8" "January 14, 2009" "Hamlib" "Rotator Control Daemon" +.TH ROTCTLD "8" "February 14, 2010" "Hamlib" "Rotator Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -16,19 +16,21 @@ .\" .sp <n> insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME -rotctld \- Hamlib rotator control daemon +rotctld \- Hamlib TCP rotator control daemon .SH SYNOPSIS .B rotctld [\fIOPTION\fR]... .SH DESCRIPTION -The \fBrotctld\fP program is an EXPERIMENTAL \fBHamlib\fP rotator daemon that -handles TCP client requests. This allows multiple user programs to share one -rotator. Multiple rotators can be controlled on different TCP ports. The syntax -of the commands are the same as \fBrotctl\fP. It is hoped that \fBrotctld\fP -will be especially useful for languages such as Perl, Python, and others. +The \fBrotctld\fP program is an NEW \fBHamlib\fP rotator control daemon ready for +testing that handles client requests via TCP sockets. This allows multiple user +programs to share one rotator (this needs testing). Multiple rotators can be +controlled on different TCP ports by use of multiple \fBrotctld\fP processes. The +syntax of the commands are the same as \fBrotctl\fP. It is hoped that \fBrotctld\fP +will be especially useful for client authors using languages such as Perl, Python, +PHP, and others. .PP .\" TeX users may be more comfortable with the \fB<whatever>\fP and -.\" \fI<whatever>\fP escape sequences to invoke bold face and italics, +.\" \fI<whatever>\fP escape sequences to invoke bold face and italics, .\" respectively. \fBrotctld\fP communicates to a client through a TCP socket using text commands shared with \fBrotctl\fP. The protocol is simple, commands are sent @@ -37,20 +39,28 @@ with one line "RPTR x", where x is a negative number indicating the error code. Commands that do not return values respond with the line "RPTR x", where x is zero when successful, otherwise is a regative number indicating the error code. -Each line is terminated with a newline '\\n' character. +Each line is terminated with a newline '\\n' character. This protocol is primarily +for use by the \fINET rotctl\fP (rot model 2) backend. .PP -Keep in mind that \fBHamlib\fP is BETA level software. +A separate \fBExtended Response\fP protocol extends the above +behavior by echoing the received command string as a header, any returned values +as a key: value pair, and the "RPTR x" string as the end of response marker which +includes the \fBHamlib\fP success or failure value. See the \fIPROTOCOL\fP +section for details. Consider using this protocol for clients that will interact +with \fBrotctld\fP directly through a TCP socket. +.PP +Keep in mind that \fBHamlib\fP is BETA level software. While a lot of backend libraries lack complete rotator support, the basic functions -are usually well supported. The API may change without publicized notice, +are usually well supported. The API may change without publicized notice, while an advancement of the minor version (e.g. 1.1.x to 1.2.x) indicates such a change. .PP -Please report bugs and provide feedback at the e-mail address given in the +Please report bugs and provide feedback at the e-mail address given in the REPORTING BUGS section. Patches and code enhancements are also welcome. .SH OPTIONS This program follows the usual GNU command line syntax, with long options starting with two dashes ('-'). - +.PP Here is a summary of the supported options: .TP .B \-m, --model=id @@ -58,13 +68,19 @@ .TP .B \-r, --rot-file=device Use \fIdevice\fP as the file name of the port the rotator is connected. -Often a serial port, but could be a USB to serial adapter. Typically -/dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. +Often a serial port, but could be a USB to serial adapter or USB port device. +Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. .TP .B \-s, --serial-speed=baud Set serial speed to \fIbaud\fP rate. Uses maximum serial speed from rotor backend capabilities (set by -m above) as the default. .TP +.B \-T, --listen-addr=IPADDR +Use \fIIPADDR\fP as the listening IP address. The default is ANY. +.TP +.B \-t, --port=number +Use \fInumber\fP as the TCP listening port. The default is 4533. +.TP .B \-L, --show-conf List all config parameters for the rotator defined with -m above. .TP @@ -73,18 +89,18 @@ .br Use -L option for a list. .TP +.B \-l, --list +List all model numbers defined in \fBHamlib\fP and exit. +.TP +.B \-u, --dump-caps +Dump capabilities for the radio defined with -m above and exit. +.TP .B \-e, --end-marker Use END marker in rotctld protocol. +.br +N.B.: This option can be considered obsolete. Please consider using the block +protocol instead (see \fIPROTOCOL\fP below). .TP -.B \-t, --port=number -Use \fInumber\fP as the TCP listening port. The default is 4533. -.TP -.B \-T, --listen-addr=IPADDR -Use \fIIPADDR\fP as the listening IP address. The default is ANY. -.TP -.B \-l, --list -List all model numbers defined in \fBHamlib\fP and exit. -.TP .B \-v, --verbose Set verbose mode, cumulative (see DIAGNOSTICS below). .TP @@ -95,109 +111,302 @@ Show the version of \fBrotctld\fP and exit. .PP \fBN.B.\fP Some options may not be implemented by a given backend and will -return an error. This is most likely to occur with the \fI\-\-set-conf\fP +return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. .PP -Please note that the backend for the rotator to be controlled, -or the rotator itself may not support some commands. In that case, +Please note that the backend for the rotator to be controlled, +or the rotator itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error code. .SH COMMANDS -Commands can be sent over the TCP socket either as a single char, or as a -long command name plus the value(s) on one '\\n' terminated line. See -PROTOCOL. +Commands can be sent over the TCP socket either as a single char, or as a +long command name plus the value(s) space separated on one '\\n' terminated +line. See \fIPROTOCOL\fP. .PP Since most of the \fBHamlib\fP operations have a \fIset\fP and a \fIget\fP method, -an upper case letter will be used for \fIset\fP method whereas the +an upper case letter will be used for \fIset\fP methods whereas the corresponding lower case letter refers to the \fIget\fP method. Each operation -also has a long name, prepend a backslash to send a long command name. +also has a long name; prepend a backslash to send a long command name. .PP -Please note that the backend for the rotator to be controlled, -or the rotator itself may not support some commands. In that case, -the operation will fail with a \fBHamlib\fP error message. +Example (Perl): `print $socket "\\\\dump_caps\\n";' to see what the rotor's +backend can do (NOTE: In Perl and many other languages a '\\' will need to be +escaped with a preceding '\\' so that even though two backslash characters +appear in the code, only one will be passed to \fBrotctld\fP. This is a +possible bug!). .PP -Here is a summary of the supported commands: +Please note that the backend for the rotator to be controlled, or the rotator +itself may not support some commands. In that case, the operation will fail +with a \fBHamlib\fP error message. +.PP +Here is a summary of the supported commands (In the case of "set" commands the +quoted string is replaced by the value in the description. In the case of "get" +commands the quoted string is the key name of the value returned.): .TP -.B P, set_pos -Set position: azimuth and elevation. +.B P, set_pos 'Azimuth' 'Elevation' +Set position: Azimuth and Elevation as double precision floating point values. .TP .B p, get_pos -Get position: azimuth and elevation. +Get position: 'Azimuth' and 'Elevation' as double precision floating point +values. .TP -.B K, park -Park the antenna. .TP +.B M, move 'Direction' 'Speed' +Move the rotator in a specific direction at the given rate. +.sp +Values are integers where Direction is defined as 2 = Up, 4 = Down, 8 = Left, +and 16 = Right. Speed is an integer between 1 and 100. Not all backends that +implement the move command use the Speed value. At this time only the gs232a +utilizes the Speed parameter. +.TP .B S, stop Stop the rotator. +.B K, park +Park the antenna. .TP -.B R, reset +.B C, set_conf 'Token' 'Value' +Set Token to Value. +.sp +Backend dependent. Needs testing. +.TP +.B R, reset 'Reset' Reset the rotator. +.sp +Integer value of '1' for Reset All. .TP -.B M, move -Move the rotator in a specific direction. -.TP .B _, get_info Get misc information about the rotator. +.sp +At the moment returns 'Model Name'. .TP -.B w, send_cmd -Send raw command string to rotator. -.br -For binary protocols enter values as \\0xAA\\0xBB - +.B w, send_cmd 'Cmd' +Send raw command string to rotator. +.sp +For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the +rotator which will likely be a binary block or an ASCII string. +.PP +\fBLocator Commands\fP +.PP +These commands offer conversions of Degrees Minutes Seconds to other formats, +Maidenhead square locator conversions and distance and azimuth conversions. +.TP +.B L, lonlat2loc 'Longitude' 'Latitude' 'Loc Len [2-12]' +Returns the Maidenhead locator for the given 'Longitude' and 'Latitude'. +.sp +Both are floating point values. The precision of the returned square is +controlled by 'Loc Len' which should be an even numbered integer value between +2 and 12. +.sp +For example, "+L -170.000000 -85.000000 12\\n" returns "Locator: AA55AA00AA00\\n". +.TP +.B l, loc2lonlat 'Locator' +Returns 'Longitude' and 'Latitude' in decimal degrees at the approximate +center of the requested grid square (despite the use of double precision +variables internally, some rounding error occurs). West longitude is +expressed as a negative value. South latitude is expressed as a negative +value. Locator can be from 2 to 12 characters in length. +.sp +For example, "+l AA55AA00AA00\\n" returns "Longitude: -169.999983\\nLatitude: +-84.999991\\n". +.TP +.B D, dms2dec 'Degrees' 'Minutes' 'Seconds' 'S/W' +Returns 'Dec Degrees', a signed floating point value. +.sp +Degrees and Minutes are +integer values and Seconds is a floating point value. S/W is a flag with '1' +indicating South latitude or West longitude and '0' North or East (the flag is +needed as computers don't recognize a signed zero even though only the Degrees +value only is typically signed in DMS notation). +.TP +.B d, dec2dms 'Dec Degrees' +Returns 'Degrees' 'Minutes' 'Seconds' 'S/W'. +.sp +Values are as in dms2dec above. +.TP +.B E, dmmm2dec 'Degrees' 'Dec Minutes' 'S/W' +Returns 'Dec Degrees', a signed floating point value. +.sp +Degrees is an integer +value and Minutes is a floating point value. S/W is a flag with '1' +indicating South latitude or West longitude and '0' North or East (the flag is +needed as computers don't recognize a signed zero even though only the Degrees +value only is typically signed in DMS notation). +.TP +.B e, dec2dmmm 'Dec Deg' +Returns 'Degrees' 'Minutes' 'S/W'. +.sp +Values are as in dmmm2dec above. +.TP +.B B, qrb 'Lon 1' 'Lat 1' 'Lon 2' 'Lat 2' +Returns 'Distance' 'Azimuth' where Distance is in km and Azimuth is in degrees. +.sp +All Lon/Lat values are signed floating point numbers. +.TP +.B A, a_sp2a_lp 'Short Path Deg' +Returns 'Long Path Deg' or -RIG_EINVAL upon input error.. +.sp +Both are floating point values within the range 0.00 to 360.00. +.TP +.B a, d_sp2d_lp 'Short Path km' +Returns 'Long Path km'. +.sp +Both are floating point values. .SH PROTOCOL +\fBDefault Protocol\fP +.PP The \fBrotctld\fP protocol is intentionally simple. Commands are entered on a single line with any needed values. In Perl, reliable results are obtained by terminating each command string with a newline character, '\\n'. -.PP +.sp Example \fIset\fP (Perl code): - +.sp print $socket "P 135 10\\n"; -.br +.sp print $socket "\\\\set_pos 135 10\\n"; # escape leading '\\' .PP -Responses from \fBrotctld\fP are text values and match the same tokens used -in the \fIset\fP commands. Each value is returned on its own line. To -signal the end of a response the "END\\n" string is sent when the '-e' option -is passed. +A one line response will be sent to \fIset\fP commands, "RPTR \fIx\fP\\n" +where \fIx\fP is the Hamlib error code with '0' indicating success of the +command. .PP +Responses from \fBrotctld\fP \fIget\fP commands are text values and match the +same tokens used in the \fIset\fP commands. Each value is returned on its own +line. On error the string "RPTR \fIx\fP\\n" where \fIx\fP is the Hamlib error +code. +.sp Example \fIget\fP (Perl code): - +.sp print $socket "p\\n"; - +.sp "135" .br "10" .br -"END" .PP -Most \fIget\fP functions return one to three values. -Future work will focus on making this output compatible with assignment to a -hash, dictionary, or other key:value variable. +Most \fIget\fP functions return one to three values. A notable exception is +the \fI\\dump_caps\fP function which returns many lines of key:value pairs. +.PP +This protocol is primarily used by the \fINET rotctl\fP (rotctl model 2) backend +which allows applications already written for Hamlib to take advantage of +\fBrotctld\fP without the need of rewriting application code. An application +user can select rotor model 2 ("NET rotctl") and then set rot_pathname to +"localhost:4533" or other network host:port. +.PP +\fBExtended Response Protocol\fP +.PP +An \fIEXPERIMENTAL\fP Extended Response protocol has been introduced into +\fBrotctld\fP as of February 10, 2010. This protocol adds several rules to the +strings returned by \fBrotctld\fP. +.PP +1. The command received by \fBrotctld\fP is echoed with its long command name +followed by the value(s) (if any) received from the client terminated by the +specified response separator as the first record of the block. +.PP +2. The last record of each block is the string "RPTR \fIx\fP\\n" where \fIx\fP is +the numeric return value of the Hamlib backend function that was called by the +command. +.PP +3. Any records consisting of data values returned by the rotor backend are +prepended by a string immediately followed by a colon then a space and then the +value terminated by the response separator. e.g. "Azimuth: 90.000000\\n" when the +command was prepended by '+'. +.PP +4. All commands received will be acknowledged by \fBrotctld\fP with records from +rules 1 and 2. Records from rule 3 are only returned when data values must be +returned to the client. +.PP +An example response to a \fI+P\fP command (note the prepended '+'): +.br +set_pos: 90 45 +.br +RPRT 0 +.PP +In this case the long command name and values are returned on the first line and +the second line contains the end of block marker and the numeric rig backend +return value indicating success. +.PP +An example response to a \fI+\\get_pos\fP query: +.br +get_pos: +.br +Azimuth: 90.000000 +.br +Elevation: 45.000000 +.br +RPRT 0 +.PP +In this case, as no value is passed to \fBrotctld\fP, the first line consists +only of the long command name. The final line shows that the command was +processed successfully by the rotor backend. +.PP +Invoking the Extended Response protocol requires prepending a command with a +punctuation character. As shown in the examples above, prepending a '+' +character to the command results in the responses being separated by a newline +character ('\\n'). Any other punctuation character recognized by the C +\fIispunct()\fP function except '\\', '?', or '_' will cause that character to +become the response separator and the entire response will be on one line. +.PP +For example, invoking a \fI;\\get_pos\fP query with a leading ';' returns: +.sp +get_pos:;Azimuth: 90.000000;Elevation: 45.000000;RPRT 0 +.sp +Or, using the pipe character '|' returns: +.sp +get_pos:|Azimuth: 90.000000|Elevation: 45.000000|RPRT 0 +.sp +And a \\set_pos command prepended with a '|' returns: +.sp +set_pos: 135 22.5|RPRT 0 +.PP +Such a format will allow reading a response as a single event using a prefered +response separator. Other punctuation characters have not been tested! +.PP +All commands with the exception of \fI\\set_conf\fP have been tested with the +Extended Response protocol and the included \fBtestrotctld.pl\fP script. +.PP +.SH EXAMPLES +Start \fBrotctld\fP for a Ham IV rotor with the RotorEZ installed using a +USB-to-serial adapter and backgrounding: +.sp +$ rotctld -m 401 -r /dev/ttyUSB1 & +.sp +Connect to the already running \fBrotctld\fP, and set position to +135.0 degrees azimuth and 30.0 degrees elevation with a 1 second read timeout: +.sp +$ echo "\\set_pos 135.0 30.0" | nc -w 1 localhost 4533 +.sp +Connect to a running \fBrotctld\fP with \fBrotctl\fP on the local host: +.sp +$ rotctl -m2 .SH DIAGNOSTICS The \fB-v\fP, \fB--version\fP option allows different levels of diagnostics -to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, --vvv for WARN, -vvvv for VERBOSE, or -vvvvv for TRACE. +to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, +-vvv for WARN, -vvvv for VERBOSE, or -vvvvv for TRACE. .PP A given verbose level is useful for providing needed debugging information to the email address below. For example, TRACE output shows all of the values sent to and received from the rotator which is very useful for rotator backend -library development and may be requested by the developers. +library development and may be requested by the developers. See the +\fBREADME.betatester\fP and \fBREADME.developer\fP files for more information. .SH SECURITY -No authentication whatsoever; DO NOT leave this TCP port open wide to the Internet. -Please ask if stronger security is needed. +No authentication whatsoever; DO NOT leave this TCP port open wide to the +Internet. Please ask if stronger security is needed or consider using an +SSH tunnel. .SH BUGS The daemon is not detaching and backgrounding itself. - +.PP Much testing needs to be done. .SH REPORTING BUGS Report bugs to <ham...@li...>. -.br +.PP We are already aware of the bugs in the previous section :-) .SH AUTHORS -Written by Stephane Fillod and the Hamlib Group +Written by Stephane Fillod, Nate Bargmann, and the Hamlib Group .br <http://www.hamlib.org>. .SH COPYRIGHT -Copyright \(co 2000-2009 Stephane Fillod and the Hamlib Group. +Copyright \(co 2000-2009 Stephane Fillod +.br +Copyright \(co 2010 Nate Bargmann +.br +Copyright \(co 2000-2009 the Hamlib Group. .PP This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY Modified: trunk/tests/rotctld.c =================================================================== --- trunk/tests/rotctld.c 2010-02-14 22:06:40 UTC (rev 2830) +++ trunk/tests/rotctld.c 2010-02-14 22:18:00 UTC (rev 2831) @@ -4,23 +4,23 @@ * This program test/control a rotator using Hamlib. * It takes commands from network connection. * - * $Id: rotctld.c,v 1.7 2009-01-04 14:49:17 fillods Exp $ + * $Id: rotctld.c,v 1.7 2009-01-04 14:49:17 fillods Exp $ * * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * + * */ #ifdef HAVE_CONFIG_H @@ -71,26 +71,27 @@ void usage(); /* - * Reminder: when adding long options, + * Reminder: when adding long options, * keep up to date SHORT_OPTIONS, usage()'s output and man page. thanks. * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file */ -#define SHORT_OPTIONS "m:r:s:C:t:T:LevhVl" +#define SHORT_OPTIONS "m:r:s:C:t:T:LuevhVl" static struct option long_options[] = { - {"model", 1, 0, 'm'}, - {"rot-file", 1, 0, 'r'}, - {"serial-speed", 1, 0, 's'}, - {"port", 1, 0, 't'}, - {"listen-addr", 1, 0, 'T'}, - {"list", 0, 0, 'l'}, - {"set-conf", 1, 0, 'C'}, - {"show-conf",0, 0, 'L'}, - {"end-marker", 0, 0, 'e'}, - {"verbose", 0, 0, 'v'}, - {"help", 0, 0, 'h'}, - {"version", 0, 0, 'V'}, + {"model", 1, 0, 'm'}, + {"rot-file", 1, 0, 'r'}, + {"serial-speed",1, 0, 's'}, + {"port", 1, 0, 't'}, + {"listen-addr", 1, 0, 'T'}, + {"list", 0, 0, 'l'}, + {"set-conf", 1, 0, 'C'}, + {"show-conf", 0, 0, 'L'}, + {"dump-caps", 0, 0, 'u'}, + {"end-marker", 0, 0, 'e'}, + {"verbose", 0, 0, 'v'}, + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, {0, 0, 0, 0} }; @@ -107,7 +108,7 @@ int main (int argc, char *argv[]) -{ +{ ROT *my_rot; /* handle to rot (instance) */ rot_model_t my_model = ROT_MODEL_DUMMY; @@ -115,6 +116,7 @@ int verbose = 0; int show_conf = 0; + int dump_caps_opt = 0; const char *rot_file=NULL; int serial_rate = 0; char conf_parms[MAXCONFLEN] = ""; @@ -135,79 +137,81 @@ switch(c) { case 'h': - usage(); - exit(0); + usage(); + exit(0); case 'V': - version(); - exit(0); + version(); + exit(0); case 'm': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - my_model = atoi(optarg); - break; + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + my_model = atoi(optarg); + break; case 'r': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - rot_file = optarg; - break; + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + rot_file = optarg; + break; case 's': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - serial_rate = atoi(optarg); - break; + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + serial_rate = atoi(optarg); + break; case 'C': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - if (*conf_parms != '\0') - strcat(conf_parms, ","); - strncat(conf_parms, optarg, MAXCONFLEN-strlen(conf_parms)); - break; - case 't': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - portno = atoi(optarg); - break; + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + if (*conf_parms != '\0') + strcat(conf_parms, ","); + strncat(conf_parms, optarg, MAXCONFLEN-strlen(conf_parms)); + break; + case 't': + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + portno = atoi(optarg); + break; case 'T': - if (!optarg) { - usage(); /* wrong arg count */ - exit(1); - } - if (4 != sscanf(optarg, "%d.%d.%d.%d", &a0,&a1,&a2,&a3)) { - usage(); /* wrong arg count */ - exit(1); - } - src_addr = (a0<<24)|(a1<<16)|(a2<<8)|a3; - break; + if (!optarg) { + usage(); /* wrong arg count */ + exit(1); + } + if (4 != sscanf(optarg, "%d.%d.%d.%d", &a0,&a1,&a2,&a3)) { + usage(); /* wrong arg count */ + exit(1); + } + src_addr = (a0<<24)|(a1<<16)|(a2<<8)|a3; + break; case 'v': - verbose++; - break; + verbose++; + break; case 'L': - show_conf++; - break; + show_conf++; + break; case 'l': - list_models(); - exit(0); + list_models(); + exit(0); + case 'u': + dump_caps_opt++; + break; case 'e': - opt_end = 1; - break; + opt_end = 1; + fprintf(stderr, "-e|--end-marker option is deprecated!\nPlease consider using the Extended Response protocol instead.\n"); + break; default: - usage(); /* unknown option? */ - exit(1); + usage(); /* unknown option? */ + exit(1); } } - rig_set_debug(verbose<2 ? RIG_DEBUG_WARN: verbose); - rig_debug(RIG_DEBUG_VERBOSE, "rotctld, %s\n", hamlib_version); rig_debug(RIG_DEBUG_VERBOSE, "Report bugs to " "<ham...@li...>\n\n"); @@ -215,7 +219,7 @@ my_rot = rot_init(my_model); if (!my_rot) { - fprintf(stderr, "Unknown rot num %d, or initialization error.\n", + fprintf(stderr, "Unknown rot num %d, or initialization error.\n", my_model); fprintf(stderr, "Please check with --list option.\n"); exit(2); @@ -241,6 +245,16 @@ rot_token_foreach(my_rot, print_conf_list, (rig_ptr_t)my_rot); } + /* + * print out conf parameters, and exits immediately + * We may be interested only in only caps, and rig_open may fail. + */ + if (dump_caps_opt) { + dumpcaps_rot(my_rot, stdout); + rig_cleanup(my_rot); /* if you care about memory */ + exit(0); + } + retcode = rot_open(my_rot); if (retcode != RIG_OK) { fprintf(stderr,"rot_open: error = %s \n", rigerror(retcode)); @@ -257,7 +271,7 @@ /* * Prepare listening socket */ - sock_listen = socket(AF_INET, SOCK_STREAM, 0); + sock_listen = socket(AF_INET, SOCK_STREAM, 0); if (sock_listen < 0) { perror("ERROR opening socket"); exit(1); @@ -403,7 +417,8 @@ " -C, --set-conf=PARM=VAL set config parameters\n" " -L, --show-conf list all config parameters\n" " -l, --list list all model numbers and exit\n" - " -e, --end-marker use END marker in rotctld protocol\n" + " -u, --dump-caps dump capabilities and exit\n" + " -e, --end-marker use END marker in rotctld protocol (obsolete)\n" " -v, --verbose set verbose mode, cumulative\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n\n", Added: trunk/tests/testrotctld.pl =================================================================== --- trunk/tests/testrotctld.pl (rev 0) +++ trunk/tests/testrotctld.pl 2010-02-14 22:18:00 UTC (rev 2831) @@ -0,0 +1,678 @@ +#! /usr/bin/perl + +# testrotctld.pl - (C) 2008,2010 Nate Bargmann, n0...@ar... +# A Perl test script for the rotctld program. +# +# $Id$ +# +# It connects to the rotctld TCP port (default 4533) and queries the daemon +# for some common rot information and sets some values. It also aims to +# provide a bit of example code for Perl scripting. +# +# This program utilizes the Extended Response protocol of rotctld in line +# response mode. See the rotctld(8) man page for details. + +############################################################################# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# See the file 'COPYING' in the main Hamlib distribution directory for the +# complete text of the GNU Public License version 2. +# +############################################################################# + + +# Perl modules this script uses +use warnings; +use strict; +use IO::Socket; +use Getopt::Long; +use Pod::Usage; + +# Global variables +my $socket; +my $host = 'localhost'; +my $port = 4533; +my $vfo = ''; +my %rot_state = (); # State of the rotor--position, etc. +my %rot_caps = (); # Rotor capabilities from \dump_caps + +my $man = 0; +my $help = 0; +my $debug = 0; +my $user_in; +my $ret_val; + +# Error values returned from rotctld by Hamlib name +my %errstr = ( + RIG_OK => "0", # No error, operation completed sucessfully + RIG_EINVAL => "-1", # invalid parameter + RIG_ECONF => "-2", # invalid configuration (serial,..) + RIG_ENOMEM => "-3", # memory shortage + RIG_ENIMPL => "-4", # function not implemented, but will be + RIG_ETIMEOUT => "-5", # communication timed out + RIG_EIO => "-6", # IO error, including open failed + RIG_EINTERNAL => "-7", # Internal Hamlib error, huh?! + RIG_EPROTO => "-8", # Protocol error + RIG_ERJCTED => "-9", # Command rejected by the rot + RIG_ETRUNC => "-10", # Command performed, but arg truncated + RIG_ENAVAIL => "-11", # function not available + RIG_ENTARGET => "-12", # VFO not targetable + RIG_BUSERROR => "-13", # Error talking on the bus + RIG_BUSBUSY => "-14", # Collision on the bus + RIG_EARG => "-15", # NULL RIG handle or any invalid pointer parameter in get arg + RIG_EVFO ... [truncated message content] |
From: <n0...@us...> - 2010-02-14 23:01:59
|
Revision: 2832 http://hamlib.svn.sourceforge.net/hamlib/?rev=2832&view=rev Author: n0nb Date: 2010-02-14 23:01:53 +0000 (Sun, 14 Feb 2010) Log Message: ----------- Synchronize rotctl and rotctld man pages. Give "NET rotctl" example in roctl man page. Modified Paths: -------------- trunk/tests/rotctl.1 trunk/tests/rotctld.8 Modified: trunk/tests/rotctl.1 =================================================================== --- trunk/tests/rotctl.1 2010-02-14 22:18:00 UTC (rev 2831) +++ trunk/tests/rotctl.1 2010-02-14 23:01:53 UTC (rev 2832) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH ROTCTL "1" "January 4, 2009" "Hamlib" "Rotator Control Program" +.TH ROTCTL "1" "February 14, 2010" "Hamlib" "Rotator Control Program" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -47,9 +47,9 @@ .TP .B \-r, --rot-file=device Use \fIdevice\fP as the file name of the port the rotator is connected. -Often a serial port, but could be a USB to serial adapter. Typically -/dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. -.br +Often a serial port, but could be a USB to serial adapter or USB port device. +Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. +.sp Default is \fB/dev/rotator\fP (may be a symbolic link to the actual device). .TP .B \-s, --serial-speed=baud @@ -67,7 +67,7 @@ List all config parameters for the rotor defined with -m above. .TP .B \-C, --set-conf=parm=val[,parm=val]* -Set config parameter. e.g. stop_bits=2 +Set config parameter. e.g. --set_conf=stop_bits=2 .br Use -L option for a list. .TP @@ -83,9 +83,13 @@ .B \-V, \-\-version Show version of \fBrotctl\fP and exit. .PP -\fBNOTE!\fP Some options may not be implemented by a given backend and will +\fBN.B.\fP Some options may not be implemented by a given backend and will return an error. This is most likely to occur with the \fI\-\-set-conf\fP and \fI\-\-show-conf\fP options. +.PP +Please note that the backend for the rotator to be controlled, +or the rotator itself may not support some commands. In that case, +the operation will fail with a \fBHamlib\fP error code. .SH COMMANDS Commands can be entered either as a single char, or as a long command name. Basically, the commands do not take a dash in front of them, as @@ -94,9 +98,10 @@ .PP Since most of the \fBHamlib\fP operations have a \fIset\fP and a \fIget\fP method, an upper case letter will be used for \fIset\fP method whereas the -corresponding lower case letter refers to the \fIget\fP method. In -interactive mode, prepend a backslash to enter a long command name. -.br +corresponding lower case letter refers to the \fIget\fP method. Each operation +also has a long name; in interactive mode, prepend a backslash to enter a long +command name. +.sp Example: Use "\\get_info" to see the rotor's info. .PP Please note that the backend for the rotator to be controlled, @@ -105,53 +110,132 @@ .PP A summary of commands is included below. .TP -.B P, set_pos -Set position: azimuth and elevation. +.B P, set_pos 'Azimuth' 'Elevation' +Set position: Azimuth and Elevation as double precision floating point values. .TP .B p, get_pos -Get position: azimuth and elevation. +Get position: 'Azimuth' and 'Elevation' as double precision floating point values. .TP -.B K, park -Park the antenna. +.B M, move 'Direction' 'Speed' +Move the rotator in a specific direction at the given rate. +.sp +Values are integers where Direction is defined as 2 = Up, 4 = Down, 8 = Left, +and 16 = Right. Speed is an integer between 1 and 100. Not all backends that +implement the move command use the Speed value. At this time only the gs232a +utilizes the Speed parameter. .TP .B S, stop Stop the rotator. .TP -.B R, reset -Reset the rotator. +.B K, park +Park the antenna. .TP -.B M, move -Move the rotator in a specific direction. -.TP -.B C, set_conf +.B C, set_conf 'Token' 'Value' Set a configuration parameter. It is safe to give "Token" a value of '0' (zero). "Value" may be a string up to 20 characters. .br See -L output .TP +.B R, reset 'Reset' +Reset the rotator. +.sp +Integer value of '1' for Reset All. +.TP .B _, get_info Get misc information on the rotator. +.sp +At the moment returns 'Model Name'. .TP -.B w, send_cmd +.B w, send_cmd 'Cmd' Send raw command string to the rotator. .br <CR> (or send-cmd-term, see \fI-t\fP option) is appended automatically at the end of the command for text protocols. For binary protocols, enter values as \\0xAA\\0xBB - +.PP +\fBLocator Commands\fP +.PP +These commands offer conversions of Degrees Minutes Seconds to other formats, +Maidenhead square locator conversions and distance and azimuth conversions. +.TP +.B L, lonlat2loc 'Longitude' 'Latitude' 'Loc Len [2-12]' +Returns the Maidenhead locator for the given 'Longitude' and 'Latitude'. +.sp +Both are floating point values. The precision of the returned square is +controlled by 'Loc Len' which should be an even numbered integer value between +2 and 12. +.sp +For example, "+L -170.000000 -85.000000 12\\n" returns "Locator: AA55AA00AA00\\n". +.TP +.B l, loc2lonlat 'Locator' +Returns 'Longitude' and 'Latitude' in decimal degrees at the approximate +center of the requested grid square (despite the use of double precision +variables internally, some rounding error occurs). West longitude is +expressed as a negative value. South latitude is expressed as a negative +value. Locator can be from 2 to 12 characters in length. +.sp +For example, "+l AA55AA00AA00\\n" returns "Longitude: -169.999983\\nLatitude: +-84.999991\\n". +.TP +.B D, dms2dec 'Degrees' 'Minutes' 'Seconds' 'S/W' +Returns 'Dec Degrees', a signed floating point value. +.sp +Degrees and Minutes are +integer values and Seconds is a floating point value. S/W is a flag with '1' +indicating South latitude or West longitude and '0' North or East (the flag is +needed as computers don't recognize a signed zero even though only the Degrees +value only is typically signed in DMS notation). +.TP +.B d, dec2dms 'Dec Degrees' +Returns 'Degrees' 'Minutes' 'Seconds' 'S/W'. +.sp +Values are as in dms2dec above. +.TP +.B E, dmmm2dec 'Degrees' 'Dec Minutes' 'S/W' +Returns 'Dec Degrees', a signed floating point value. +.sp +Degrees is an integer +value and Minutes is a floating point value. S/W is a flag with '1' +indicating South latitude or West longitude and '0' North or East (the flag is +needed as computers don't recognize a signed zero even though only the Degrees +value only is typically signed in DMS notation). +.TP +.B e, dec2dmmm 'Dec Deg' +Returns 'Degrees' 'Minutes' 'S/W'. +.sp +Values are as in dmmm2dec above. +.TP +.B B, qrb 'Lon 1' 'Lat 1' 'Lon 2' 'Lat 2' +Returns 'Distance' 'Azimuth' where Distance is in km and Azimuth is in degrees. +.sp +All Lon/Lat values are signed floating point numbers. +.TP +.B A, a_sp2a_lp 'Short Path Deg' +Returns 'Long Path Deg' or -RIG_EINVAL upon input error.. +.sp +Both are floating point values within the range 0.00 to 360.00. +.TP +.B a, d_sp2d_lp 'Short Path km' +Returns 'Long Path km'. +.sp +Both are floating point values. .SH EXAMPLES Start \fBrotctl\fP for RotorEZ using COM1: - +.sp $ rotctl -m 401 -r /dev/ttyS0 - +.sp Start \fBrotctl\fP using \fBrpc.rotd\fP: - +.sp $ rotctl -m 101 +Connect to a running \fBrotctld\fP with rotor model 2 ("NET rotctl") on the +local host: +.sp +$ rotctl -m2 .SH DIAGNOSTICS The \fB-v\fP, \fB--version\fP option allows different levels of diagnostics to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, -vvv for WARN, -vvvv for VERBOSE, or -vvvvv for TRACE. - +.PP A given verbose level is useful for providing needed debugging information to the email address below. For example, TRACE output shows all of the values sent to and received from the radio which is very useful for radio backend @@ -172,16 +256,21 @@ .br We are already aware of the bug in the previous section :-) .SH AUTHOR -Written by Stephane Fillod and the Hamlib Group +Written by Stephane Fillod, Nate Bargmann, and the Hamlib Group .br <http://www.hamlib.org>. .SH COPYRIGHT -Copyright \(co 2000-2009 Stephane Fillod and the Hamlib Group. +Copyright \(co 2000-2009 Stephane Fillod .br +Copyright \(co 2010 Nate Bargmann +.br +Copyright \(co 2000-2009 the Hamlib Group +.PP This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO .BR hamlib (3), .BR rpc.rotd (8) +.BR rotctld (8) Modified: trunk/tests/rotctld.8 =================================================================== --- trunk/tests/rotctld.8 2010-02-14 22:18:00 UTC (rev 2831) +++ trunk/tests/rotctld.8 2010-02-14 23:01:53 UTC (rev 2832) @@ -70,6 +70,8 @@ Use \fIdevice\fP as the file name of the port the rotator is connected. Often a serial port, but could be a USB to serial adapter or USB port device. Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. +.sp +Default is \fB/dev/rotator\fP (may be a symbolic link to the actual device). .TP .B \-s, --serial-speed=baud Set serial speed to \fIbaud\fP rate. Uses maximum serial speed from rotor @@ -148,7 +150,6 @@ Get position: 'Azimuth' and 'Elevation' as double precision floating point values. .TP -.TP .B M, move 'Direction' 'Speed' Move the rotator in a specific direction at the given rate. .sp @@ -159,6 +160,7 @@ .TP .B S, stop Stop the rotator. +.TP .B K, park Park the antenna. .TP This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-14 23:59:00
|
Revision: 2835 http://hamlib.svn.sourceforge.net/hamlib/?rev=2835&view=rev Author: n0nb Date: 2010-02-14 23:58:54 +0000 (Sun, 14 Feb 2010) Log Message: ----------- Really set rotctl/rotctld to follow debug level set on command line. Modified Paths: -------------- trunk/tests/rotctl.c trunk/tests/rotctld.c Modified: trunk/tests/rotctl.c =================================================================== --- trunk/tests/rotctl.c 2010-02-14 23:41:19 UTC (rev 2834) +++ trunk/tests/rotctl.c 2010-02-14 23:58:54 UTC (rev 2835) @@ -160,6 +160,8 @@ } } + rig_set_debug(verbose); + rig_debug(RIG_DEBUG_VERBOSE, "rotctl, %s\n", hamlib_version); rig_debug(RIG_DEBUG_VERBOSE, "Report bugs to " "<ham...@li...>\n\n"); Modified: trunk/tests/rotctld.c =================================================================== --- trunk/tests/rotctld.c 2010-02-14 23:41:19 UTC (rev 2834) +++ trunk/tests/rotctld.c 2010-02-14 23:58:54 UTC (rev 2835) @@ -212,6 +212,8 @@ } } + rig_set_debug(verbose); + rig_debug(RIG_DEBUG_VERBOSE, "rotctld, %s\n", hamlib_version); rig_debug(RIG_DEBUG_VERBOSE, "Report bugs to " "<ham...@li...>\n\n"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <n0...@us...> - 2010-02-18 01:09:46
|
Revision: 2837 http://hamlib.svn.sourceforge.net/hamlib/?rev=2837&view=rev Author: n0nb Date: 2010-02-18 00:18:54 +0000 (Thu, 18 Feb 2010) Log Message: ----------- Complete addition of Extended Response Protocol to rigctld Update and synchronize rig and rot ctl(d) man pages Update testctld.pl for ERp. Modified Paths: -------------- trunk/tests/rigctl.1 trunk/tests/rigctl.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 trunk/tests/rigctld.c trunk/tests/rotctl.1 trunk/tests/rotctld.8 trunk/tests/testctld.pl Modified: trunk/tests/rigctl.1 =================================================================== --- trunk/tests/rigctl.1 2010-02-15 01:37:39 UTC (rev 2836) +++ trunk/tests/rigctl.1 2010-02-18 00:18:54 UTC (rev 2837) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTL "1" "January 4, 2009" "Hamlib" "Radio Control Program" +.TH RIGCTL "1" "February 17, 2010" "Hamlib" "Radio Control Program" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -44,14 +44,16 @@ .TP .B \-m, --model=id Select radio model number. See model list (use 'rigctl -l'). -.br +.sp NB: \fBrigctl\fP (or third party software) will use rig model 1901 -when using \fBrpc.rigd\fP. +when using \fBrpc.rigd\fP or rig model 2 for NET rigctl (rigctld). .TP .B \-r, --rig-file=device Use \fIdevice\fP as the file name of the port the radio is connected. Often a serial port, but could be a USB to serial adapter. Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. +.sp +Default is \fB/dev/rig\fP (may be a symbolic link to the actual device). .TP .B \-p, --ptt-file=device Use \fIdevice\fP as the file name of the Push-To-Talk device using a @@ -65,7 +67,7 @@ Use \fItype\fP of Push-To-Talk device. Supported types are RIG, DTR, RTS, PARALLEL, NONE, overriding PTT type defined in the rig's backend. - +.sp Some side effects of this command are that when type is set to DTR, read PTT state comes from Hamlib frontend, not read from the radio. When set to NONE, PTT state cannot be read or set even if rig backend supports @@ -82,7 +84,7 @@ .B \-c, --civaddr=id Use \fIid\fP as the CI-V address to communicate with the rig. Only useful for Icom rigs. -.br +.sp NB: the \fIid\fP is in decimal notation, unless prefixed by \fI0x\fP, in which case it is hexadecimal. .TP @@ -98,7 +100,7 @@ .TP .B \-C, --set-conf=parm=val[,parm=val]* Set config parameter. e.g. stop_bits=2 -.br +.sp Use -L option for a list. .TP .B \-l, --list @@ -135,243 +137,307 @@ .PP Since most of the \fBHamlib\fP operations have a \fIset\fP and a \fIget\fP method, an upper case letter will be used for \fIset\fP method whereas the -corresponding lower case letter refers to the \fIget\fP method. -In interactive mode, prepend a backslash to enter a long command name. -.br +corresponding lower case letter refers to the \fIget\fP method. Each operation +also has a long name; in interactive mode, prepend a backslash to enter a long +command name. +.sp Example: Use "\\dump_caps" to see what this radio can do. .PP Please note that the backend for the radio to be controlled, or the radio itself may not support some commands. In that case, the operation will fail with a \fBHamlib\fP error message. .PP -Here is a summary of the supported commands: +Here is a summary of the supported commands (In the case of "set" commands the +quoted string is replaced by the value in the description. In the case of "get" +commands the quoted string is the key name of the value returned.): .TP -.B F, set_freq -Set frequency, in Hz. +.B F, set_freq 'Frequency' +Set 'Frequency', in Hz. .TP .B f, get_freq -Get frequency, in Hz. +Get 'Frequency', in Hz. .TP -.B M, set_mode -Set mode/passband: AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, +.B M, set_mode 'Mode' 'Passband' +Set 'Mode': USB, LSB, CW, CWR, RTTY, RTTYR, AM, FM, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. - -The passband is the exact passband in Hz, or 0 for the default. +.sp +Set 'Passband' in Hz, or '0' for the Hamlib backend default. .TP .B m, get_mode -Get mode/passband. +Get 'Mode' 'Passband'. +.sp +Returns Mode as a string from \fIset_mode\fP above +and Passband in Hz. .TP -.B V, set_vfo -Set VFO: VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. +.B V, set_vfo 'VFO' +Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. +.sp +In VFO mode only a single VFO parameter is required. .TP .B v, get_vfo -Get current VFO. +Get current 'VFO'. +.sp +Returns VFO as a string from \fIset_vfo\fP above. .TP -.B J, set_rit -Set RIT, in Hz. +.B J, set_rit 'RIT' +Set 'RIT', in Hz, can be + or -. +.sp +A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report +against the Hamlib backend. .TP .B j, get_rit -Get RIT, in Hz. +Get 'RIT', in Hz. .TP -.B Z, set_xit -Set XIT, in Hz. +.B Z, set_xit 'XIT' +Set 'XIT', in Hz can be + or -. +.sp +A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report +against the Hamlib backend. .TP .B z, get_xit -Get XIT, in Hz. +Get 'XIT', in Hz. .TP -.B T, set_ptt -Set PTT, 0 or 1. +.B T, set_ptt 'PTT' +Set 'PTT', 0 (RX) or 1 (TX). .TP .B t, get_ptt -Get PTT status. +Get 'PTT' status. .TP -.B get_dcd -Get DCD status. +.B 0x8b, get_dcd +Get 'DCD' (squelch) status, 0 (Closed) or 1 (Open) .TP -.B R, set_rptr_shift -Set repeater shift: "+", "-" or something else for none. +.B R, set_rptr_shift 'Rptr Shift' +Set 'Rptr Shift': "+", "-" or something else for none. .TP .B r, get_rptr_shift -Get repeater shift. +Get 'Rptr Shift'. Returns "+", "-" or "None". .TP -.B O, set_rptr_offs -Set repeater offset, in Hz. +.B O, set_rptr_offs 'Rptr Offset' +Set 'Rptr Offset', in Hz. .TP .B o, get_rptr_offs -Get repeater offset. +Get 'Rptr Offset', in Hz. .TP -.B C, set_ctcss_tone -Set CTCSS tone, in tenth of Hz. +.B C, set_ctcss_tone 'CTCSS Tone' +Set 'CTCSS Tone', in tenths of Hz. .TP .B c, get_ctcss_tone -Get CTCSS tone, in tenth of Hz. +Get 'CTCSS Tone', in tenths of Hz. .TP -.B D, set_dcs_code -Set DCS code. +.B D, set_dcs_code 'DCS Code' +Set 'DCS Code'. .TP .B d, get_dcs_code -Get DCS code. +Get 'DCS Code'. .TP -.B set_ctcss_sql -Set CTCSS squelch tone, in tenth of Hz. +.B 0x90, set_ctcss_sql 'CTCSS Sql' +Set 'CTCSS Sql' tone, in tenths of Hz. .TP -.B get_ctcss_sql -Get CTCSS squelch tone, in tenth of Hz. +.B 0x91, get_ctcss_sql +Get 'CTCSS Sql' tone, in tenths of Hz. .TP -.B set_dcs_sql -Set DCS squelch code. +.B 0x92, set_dcs_sql 'DCS Sql' +Set 'DCS Sql' code. .TP -.B get_dcs_sql -Get DCS squelch code. +.B 0x93, get_dcs_sql +Get 'DCS Sql' code. .TP -.B I, set_split_freq -Set TX frequency, in Hz. +.B I, set_split_freq 'Tx Frequency' +Set 'TX Frequency', in Hz. .TP .B i, get_split_freq -Get TX frequency. +Get 'TX Frequency', in Hz. .TP -.B X, set_split_mode -Set transmit mode/passband: AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, +.B X, set_split_mode 'TX Mode' 'TX Passband' +Set 'TX Mode': AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. - -The passband is the exact passband in Hz, or 0 for the default. +.sp +The 'TX Passband' is the exact passband in Hz, or '0' for the Hamlib +backend default. .TP .B x, get_split_mode -Get transmit mode/passband. +Get 'TX Mode' and 'TX Passband'. +.sp +Returns TX mode as a string from \fIset_split_mode\fP above and TX passband in Hz. .TP -.B S, set_split_vfo -Set split mode, 0 or 1, and transmit VFO. +.B S, set_split_vfo 'Split' 'TX VFO' +Set 'Split' mode, '0' or '1', and 'TX VFO' from \fIset_vfo\fP above. .TP .B s, get_split_vfo -Get split mode and transmit VFO. +Get 'Split' mode, '0' or '1', and 'TX VFO'. .TP -.B N, set_ts -Set tuning step, in Hz. +.B N, set_ts 'Tuning Step' +Set 'Tuning Step', in Hz. .TP .B n, get_ts -Get tuning step. +Get 'Tuning Step', in Hz. .TP -.B U, set_func -Set func/status: -FAGC, NB, COMP, VOX, TONE, TSQL, SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, -RF, ARO, LOCK, MUTE, VSC, REV, SQL, ABM, BC, MBC, AFC, SATMODE, SCOPE, -RESUME, TBURST, TUNER. +.B U, set_func 'Func' 'Func Status' +Set 'Func' 'Func Status'. +.sp +Func is one of: FAGC, NB, COMP, VOX, TONE, TSQL, +SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, RF, ARO, LOCK, MUTE, VSC, REV, SQL, +ABM, BC, MBC, AFC, SATMODE, SCOPE, RESUME, TBURST, TUNER. +.sp +Func Status argument is a non null value for "activate", "de-activate" +otherwise, much as TRUE/FALSE definitions in C language. .TP .B u, get_func -Get func status. +Get 'Func' 'Func Status'. +.sp +Returns Func as a string from \fIset_func\fP above and Func status as a non null value. .TP -.B L, set_level -Set level/value: -PREAMP, ATT, VOX, AF, RF, SQL, IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, RFPOWER, -MICGAIN, KEYSPD, NOTCHF, COMP, AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. +.B L, set_level 'Level' 'Level Value' +Set 'Level' and 'Level Value'. +.sp +Level is one of: PREAMP, ATT, VOX, AF, RF, SQL, IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, +RFPOWER, MICGAIN, KEYSPD, NOTCHF, COMP, AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. SLOPE_LOW, SLOPE_HIGH, RAWSTR, SQLSTAT, SWR, ALC, STRENGTH. +.sp +The Level Value can be a float or an integer. .TP .B l, get_level -Get level value. +Get 'Level' 'Level Value'. +.sp +Returns Level as a string from \fIset_level\fP above and Level value as a float or +integer. .TP -.B P, set_parm -Set parm/value: -ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT. +.B P, set_parm 'Parm' 'Parm Value' +Set 'Parm' 'Parm Value' +.sp +Parm is one of: ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT. .TP .B p, get_parm -Get parm value. +Get 'Parm' 'Parm Value'. +.sp +Returns Parm as a string from \fIset_parm\fP above and Parm Value as a float or +integer. .TP -.B B, set_bank -Set bank. +.B B, set_bank 'Bank' +Set 'Bank'. Sets the current memory bank number. .TP -.B E, set_mem -Set memory channel number. +.B E, set_mem 'Memory#' +Set 'Memory#' channel number. .TP .B e, get_mem -Get memory channel number. +Get 'Memory#' channel number. .TP -.B G, vfo_op -Perform VFO operation: -CPY, XCHG, FROM_VFO, TO_VFO, MCL, UP, DOWN, BAND_UP, BAND_DOWN, LEFT, RIGHT, -TUNE, TOGGLE. +.B G, vfo_op 'Mem/VFO Op' +Perform 'Mem/VFO Op'. +.sp +Mem VFO operation is one of: CPY, XCHG, FROM_VFO, TO_VFO, MCL, UP, DOWN, BAND_UP, +BAND_DOWN, LEFT, RIGHT, TUNE, TOGGLE. .TP -.B g, scan_op -Perform scan operation/channel: STOP, MEM, SLCT, PRIO, PROG, DELTA, VFO, PLT. +.B g, scan 'Scan Fct' 'Scan Channel' +Perform 'Scan Fct' 'Scan Channel'. +.sp +Scan function/channel is one of: STOP, MEM, SLCT, PRIO, PROG, DELTA, VFO, PLT. .TP -.B H, set_channel -Set memory channel data. Partially implemented. +.B H, set_channel 'Channel' +Set memory 'Channel' data. Not implemented yet. .TP .B h, get_channel -Get memory channel data. +Get memory 'Channel' data. Not implemented yet. .TP -.B A, set_trn -Set transceive mode (reporting event): OFF, RIG, POLL. +.B A, set_trn 'Transceive' +Set 'Transceive' mode (reporting event): OFF, RIG, POLL. .TP .B a, get_trn -Get transceive mode (reporting event). +Get 'Transceive' mode (reporting event) as in \fIset_trn\fP above. .TP -.B Y, set_ant -Set antenna number (0, 1, 2, ..). +.B Y, set_ant 'Antenna' +Set 'Antenna' number (0, 1, 2, ..). .TP .B y, get_ant -Get antenna number (0, 1, 2, ..). +Get 'Antenna' number (0, 1, 2, ..). .TP -.B *, reset -Reset. +.B *, reset 'Reset' +Perform rig 'Reset'. +.sp +0 = None, 1 = Software reset, 2 = VFO reset, 4 = Memory Clear reset, 8 = Master reset. +Since these values are defined as a bitmask in rig.h, it should be possible to AND +these values together to do multiple resets at once, if the backend supports it or +supports a reset action via rig control at all. .TP -.B b, send_morse -Send morse symbols. +.B b, send_morse 'Morse' +Send 'Morse' symbols. .TP -.B 0x87, set_powerstat -Set power status. +.B 0x87, set_powerstat 'Power Status' +Set power On/Off/Standby 'Power Status'. +.sp +0 = Power Off, 1 = Power On, 2 = Power Standby. Defined as a bitmask in rig.h. .TP .B 0x88, get_powerstat -Get power status. +Get power On/Off/Standby 'Power Status' as in \fIset_powerstat\fP above. .TP -.B 0x89, send_dtmf -Set DTMF digits. +.B 0x89, send_dtmf 'Digits' +Set DTMF 'Digits'. .TP .B 0x8a, recv_dtmf -Get DTMF digits. +Get DTMF 'Digits'. .TP .B _, get_info -Get misc information about the rig. +Get misc information about the rig (no VFO in 'VFO mode' or value is passed). .TP .B 1, dump_caps -Not a real rig remote command, it just dumps capabilities, i.e. what the +Not a real rig remote command, it just dumps capabilities, i.e. what the backend knows about this model, and what it can do. TODO: Ensure this is -in a consistent format so it can be read into a hash, dictionary, etc. +in a consistent format so it can be read into a hash, dictionary, etc. Bug +reports requested. +.sp +\fBN.B.\fP: This command will produce many lines of output so be very careful +if using a fixed length array! For example, running this command against the +Dummy backend results in over 5kB of text output. +.sp +VFO parameter not used in 'VFO mode'. .TP -.B 3, dump_conf -Not a real rig remote command, it just dumps a list of all config parameters -defined for the radio. +.B 2, power2mW 'Power [0.0..1.0]' 'Frequency' 'Mode' +Returns 'Power mW' +.sp +Converts a Power value in a range of \fI0.0 ... 1.0\fP to the real transmit +power in milli-Watts (integer). The \fIfrequency\fP and \fImode\fP also need to +be provided as output power may vary according to these values. +.sp +VFO parameter not used in 'VFO mode'. .TP -.B 2, power2mW -Converts a power value in a range of \fI0.0 ... 1.0\fP to the real transmit -power in milli-Watts. The \fIfrequency\fP and \fImode\fP also need to be -provided as output power may vary according to these values. +.B 4, mW2power 'Power mW' 'Frequency' 'Mode' +Returns 'Power [0.0..1.0]' +.sp +Converts the real transmit power in milli-Watts (integer) to a Power value in +a range of \fI0.0 ... 1.0\fP. The \fIfrequency\fP and \fImode\fP also need to +be provided as output power may vary according to these values. +.sp +VFO parameter not used in 'VFO mode'. .TP -.B w, send_cmd -Send raw command string to the rig. -.br -<CR> (or send-cmd-term, see \fI-t\fP option) is appended automatically at the end -of the command for text protocols. -For binary protocols, enter values as \\0xAA\\0xBB - +.B w, send_cmd 'Cmd' +Send raw command string to rig. +.sp +For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the +rig which will likely be a binary block or an ASCII string. .SH EXAMPLES Start \fBrigctl\fP for a Yaesu FT-920 using a USB to serial adapter in interactive mode: - +.sp $ rigctl -m 114 -r /dev/ttyUSB1 - +.sp Start \fBrigctl\fP for a Yaesu FT-920 using COM1 while generating TRACE output to \fBstderr\fP: - +.sp $ rigctl -m 114 -r /dev/ttyS0 -vvvvv - +.sp Start \fBrigctl\fP for a Yaesu FT-920 using a USB to serial adapter while setting baud rate and stop bits: - +.sp $ rigctl -m 114 -r /dev/ttyUSB1 -s 4800 -C stop_bits=2 - +.sp Start \fBrigctl\fP using \fBrpc.rigd\fP and setting the frequency and mode: - +.sp $ rigctl -m 1901 -r localhost F 7253500 M LSB 0 +.sp +Connect to a running \fBrigctld\fP with rig model 2 ("NET rigctl") on the +local host and specifying the TCP port: +.sp +$ rotctl -m 2 -r localhost:4532 .SH DIAGNOSTICS The \fB-v\fP, \fB--verbose\fP option allows different levels of diagnostics to be output to \fBstderr\fP and correspond to -v for BUG, -vv for ERR, @@ -395,20 +461,23 @@ This almost empty section... .SH REPORTING BUGS Report bugs to <ham...@li...>. -.br +.PP We are already aware of the bugs in the previous section :-) .SH AUTHORS -Written by Stephane Fillod and the Hamlib Group -.br +Written by Stephane Fillod, Nate Bargmann, and the Hamlib Group +.PP <http://www.hamlib.org>. .SH COPYRIGHT -Copyright \(co 2000-2009 Stephane Fillod, Frank Singleton, and the Hamlib -Group. +Copyright \(co 2000-2009 Stephane Fillod .br +Copyright \(co 2010 Nate Bargmann +.br +Copyright \(co 2000-2009 the Hamlib Group. +.sp This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH SEE ALSO .BR hamlib (3), .BR rpc.rigd (8) - +.BR rigctld(8) Modified: trunk/tests/rigctl.c =================================================================== --- trunk/tests/rigctl.c 2010-02-15 01:37:39 UTC (rev 2836) +++ trunk/tests/rigctl.c 2010-02-18 00:18:54 UTC (rev 2837) @@ -61,23 +61,23 @@ #define SHORT_OPTIONS "m:r:p:d:P:D:s:c:t:lC:LuovhV" static struct option long_options[] = { - {"model", 1, 0, 'm'}, - {"rig-file", 1, 0, 'r'}, - {"ptt-file", 1, 0, 'p'}, - {"dcd-file", 1, 0, 'd'}, - {"ptt-type", 1, 0, 'P'}, - {"dcd-type", 1, 0, 'D'}, - {"serial-speed", 1, 0, 's'}, - {"civaddr", 1, 0, 'c'}, - {"send-cmd-term", 1, 0, 't'}, - {"list", 0, 0, 'l'}, - {"set-conf", 1, 0, 'C'}, - {"show-conf",0, 0, 'L'}, - {"dump-caps", 0, 0, 'u'}, - {"vfo", 0, 0, 'o'}, - {"verbose", 0, 0, 'v'}, - {"help", 0, 0, 'h'}, - {"version", 0, 0, 'V'}, + {"model", 1, 0, 'm'}, + {"rig-file", 1, 0, 'r'}, + {"ptt-file", 1, 0, 'p'}, + {"dcd-file", 1, 0, 'd'}, + {"ptt-type", 1, 0, 'P'}, + {"dcd-type", 1, 0, 'D'}, + {"serial-speed", 1, 0, 's'}, + {"civaddr", 1, 0, 'c'}, + {"send-cmd-term", 1, 0, 't'}, + {"list", 0, 0, 'l'}, + {"set-conf", 1, 0, 'C'}, + {"show-conf", 0, 0, 'L'}, + {"dump-caps", 0, 0, 'u'}, + {"vfo", 0, 0, 'o'}, + {"verbose", 0, 0, 'v'}, + {"help", 0, 0, 'h'}, + {"version", 0, 0, 'V'}, {0, 0, 0, 0} }; @@ -85,11 +85,10 @@ int interactive = 1; /* if no cmd on command line, switch to interactive */ int prompt = 1; /* Print prompt in rigctl */ -int opt_end= 0; /* only used by rigctld */ -//int opt_block = 0; /* only used by rigctld */ -int vfo_mode; /* vfo_mode=0 means target VFO is current VFO */ +int opt_end = 0; /* only used by rigctld */ +int vfo_mode = 0; /* vfo_mode = 0 means target VFO is 'currVFO' */ -char send_cmd_term = '\r'; /* send_cmd termination char */ +char send_cmd_term = '\r'; /* send_cmd termination char */ int main (int argc, char *argv[]) { @@ -244,7 +243,7 @@ } } - rig_set_debug(verbose<2 ? RIG_DEBUG_WARN: verbose); + rig_set_debug(verbose); rig_debug(RIG_DEBUG_VERBOSE, "rigctl, %s\n", hamlib_version); rig_debug(RIG_DEBUG_VERBOSE, "Report bugs to " Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-02-15 01:37:39 UTC (rev 2836) +++ trunk/tests/rigctl_parse.c 2010-02-18 00:18:54 UTC (rev 2837) @@ -1,6 +1,6 @@ /* * rigctl_parse.c - (C) Stephane Fillod 2000-2009 - * (C) Terry Embry 2008-2009 + * (C) Terry Embry 2008-2009 * (C) The Hamlib Group 2010 * * This program tests/controls a radio using Hamlib. @@ -165,72 +165,71 @@ * Available alphabetic letters: -.--------K-----*-----W-Y- */ static struct test_table test_list[] = { - { 'F', "set_freq", set_freq, ARG_IN, "Frequency" }, - { 'f', "get_freq", get_freq, ARG_OUT, "Frequency" }, - { 'M', "set_mode", set_mode, ARG_IN, "Mode", "Passband" }, - { 'm', "get_mode", get_mode, ARG_OUT, "Mode", "Passband" }, - { 'I', "set_split_freq", set_split_freq, ARG_IN, "TX Frequency" }, - { 'i', "get_split_freq", get_split_freq, ARG_OUT, "TX Frequency" }, - { 'X', "set_split_mode", set_split_mode, ARG_IN, "TX Mode", "TX Passband" }, - { 'x', "get_split_mode", get_split_mode, ARG_OUT, "TX Mode", "TX Passband" }, - { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split", "TX VFO" }, - { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split", "TX VFO" }, - { 'N', "set_ts", set_ts, ARG_IN, "Tuning Step" }, - { 'n', "get_ts", get_ts, ARG_OUT, "Tuning Step" }, - { 'L', "set_level", set_level, ARG_IN, "Level", "Level Value" }, - { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Level Value" }, - { 'U', "set_func", set_func, ARG_IN, "Func", "Func Status" }, - { 'u', "get_func", get_func, ARG_IN1|ARG_OUT2, "Func", "Func Status" }, - { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Parm Value" }, - { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Parm Value" }, - { 'G', "vfo_op", vfo_op, ARG_IN, "Mem/VFO Op" }, - { 'g', "scan", scan, ARG_IN, "Scan Fct", "Scan Channel" }, - { 'A', "set_trn", set_trn, ARG_IN|ARG_NOVFO, "Transceive" }, - { 'a', "get_trn", get_trn, ARG_OUT|ARG_NOVFO, "Transceive" }, - { 'R', "set_rptr_shift", set_rptr_shift, ARG_IN, "Rptr Shift" }, - { 'r', "get_rptr_shift", get_rptr_shift, ARG_OUT, "Rptr Shift" }, - { 'O', "set_rptr_offs", set_rptr_offs, ARG_IN, "Rptr Offset" }, - { 'o', "get_rptr_offs", get_rptr_offs, ARG_OUT, "Rptr Offset" }, - { 'C', "set_ctcss_tone", set_ctcss_tone, ARG_IN, "CTCSS Tone" }, - { 'c', "get_ctcss_tone", get_ctcss_tone, ARG_OUT, "CTCSS Tone" }, - { 'D', "set_dcs_code", set_dcs_code, ARG_IN, "DCS Code" }, - { 'd', "get_dcs_code", get_dcs_code, ARG_OUT, "DCS Code" }, - { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS Sql" }, - { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS Sql" }, - { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS Sql" }, - { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS Sql" }, - { 'V', "set_vfo", set_vfo, ARG_IN|ARG_NOVFO, "VFO" }, - { 'v', "get_vfo", get_vfo, ARG_OUT, "VFO" }, - { 'T', "set_ptt", set_ptt, ARG_IN, "PTT" }, - { 't', "get_ptt", get_ptt, ARG_OUT, "PTT" }, - { 'E', "set_mem", set_mem, ARG_IN, "Memory#" }, - { 'e', "get_mem", get_mem, ARG_OUT, "Memory#" }, - { 'H', "set_channel", set_channel, ARG_IN|ARG_NOVFO, "Channel" }, - { 'h', "get_channel", get_channel, ARG_IN|ARG_NOVFO, "Channel" }, - { 'B', "set_bank", set_bank, ARG_IN, "Bank" }, - { '_', "get_info", get_info, ARG_OUT|ARG_NOVFO, "Info" }, - { 'J', "set_rit", set_rit, ARG_IN, "RIT" }, - { 'j', "get_rit", get_rit, ARG_OUT, "RIT" }, - { 'Z', "set_xit", set_xit, ARG_IN, "XIT" }, - { 'z', "get_xit", get_xit, ARG_OUT, "XIT" }, - { 'Y', "set_ant", set_ant, ARG_IN, "Antenna" }, - { 'y', "get_ant", get_ant, ARG_OUT, "Antenna" }, - { 0x87, "set_powerstat", set_powerstat, ARG_IN|ARG_NOVFO, "Power Status" }, - { 0x88, "get_powerstat", get_powerstat, ARG_OUT|ARG_NOVFO, "Power Status" }, - { 0x89, "send_dtmf", send_dtmf, ARG_IN, "Digits" }, - { 0x8a, "recv_dtmf", recv_dtmf, ARG_OUT, "Digits" }, - { '*', "reset", reset, ARG_IN, "Reset" }, - { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2|ARG_NOVFO, "Cmd", "Reply" }, - { 'b', "send_morse", send_morse, ARG_IN|ARG_IN_LINE, "Morse" }, - { 0x8b, "get_dcd", get_dcd, ARG_OUT, "DCD" }, - { '2', "power2mW", power2mW, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power [0.0..1.0]", "Frequency", "Mode", "Power mW" }, - { '4', "mW2power", mW2power, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power mW", "Frequency", "Mode", "Power [0.0..1.0]" }, - { '1', "dump_caps", dump_caps, ARG_NOVFO }, - { '3', "dump_conf", dump_conf, ARG_NOVFO }, - { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, - { 0xf0,"chk_vfo", chk_vfo, ARG_NOVFO }, /* rigctld only--check for VFO mode */ + { 'F', "set_freq", set_freq, ARG_IN, "Frequency" }, + { 'f', "get_freq", get_freq, ARG_OUT, "Frequency" }, + { 'M', "set_mode", set_mode, ARG_IN, "Mode", "Passband" }, + { 'm', "get_mode", get_mode, ARG_OUT, "Mode", "Passband" }, + { 'I', "set_split_freq", set_split_freq, ARG_IN, "TX Frequency" }, + { 'i', "get_split_freq", get_split_freq, ARG_OUT, "TX Frequency" }, + { 'X', "set_split_mode", set_split_mode, ARG_IN, "TX Mode", "TX Passband" }, + { 'x', "get_split_mode", get_split_mode, ARG_OUT, "TX Mode", "TX Passband" }, + { 'S', "set_split_vfo", set_split_vfo, ARG_IN, "Split", "TX VFO" }, + { 's', "get_split_vfo", get_split_vfo, ARG_OUT, "Split", "TX VFO" }, + { 'N', "set_ts", set_ts, ARG_IN, "Tuning Step" }, + { 'n', "get_ts", get_ts, ARG_OUT, "Tuning Step" }, + { 'L', "set_level", set_level, ARG_IN, "Level", "Level Value" }, + { 'l', "get_level", get_level, ARG_IN1|ARG_OUT2, "Level", "Level Value" }, + { 'U', "set_func", set_func, ARG_IN, "Func", "Func Status" }, + { 'u', "get_func", get_func, ARG_IN1|ARG_OUT2, "Func", "Func Status" }, + { 'P', "set_parm", set_parm, ARG_IN|ARG_NOVFO, "Parm", "Parm Value" }, + { 'p', "get_parm", get_parm, ARG_IN1|ARG_OUT2|ARG_NOVFO, "Parm", "Parm Value" }, + { 'G', "vfo_op", vfo_op, ARG_IN, "Mem/VFO Op" }, + { 'g', "scan", scan, ARG_IN, "Scan Fct", "Scan Channel" }, + { 'A', "set_trn", set_trn, ARG_IN|ARG_NOVFO, "Transceive" }, + { 'a', "get_trn", get_trn, ARG_OUT|ARG_NOVFO, "Transceive" }, + { 'R', "set_rptr_shift", set_rptr_shift, ARG_IN, "Rptr Shift" }, + { 'r', "get_rptr_shift", get_rptr_shift, ARG_OUT, "Rptr Shift" }, + { 'O', "set_rptr_offs", set_rptr_offs, ARG_IN, "Rptr Offset" }, + { 'o', "get_rptr_offs", get_rptr_offs, ARG_OUT, "Rptr Offset" }, + { 'C', "set_ctcss_tone", set_ctcss_tone, ARG_IN, "CTCSS Tone" }, + { 'c', "get_ctcss_tone", get_ctcss_tone, ARG_OUT, "CTCSS Tone" }, + { 'D', "set_dcs_code", set_dcs_code, ARG_IN, "DCS Code" }, + { 'd', "get_dcs_code", get_dcs_code, ARG_OUT, "DCS Code" }, + { 0x90, "set_ctcss_sql", set_ctcss_sql, ARG_IN, "CTCSS Sql" }, + { 0x91, "get_ctcss_sql", get_ctcss_sql, ARG_OUT, "CTCSS Sql" }, + { 0x92, "set_dcs_sql", set_dcs_sql, ARG_IN, "DCS Sql" }, + { 0x93, "get_dcs_sql", get_dcs_sql, ARG_OUT, "DCS Sql" }, + { 'V', "set_vfo", set_vfo, ARG_IN|ARG_NOVFO, "VFO" }, + { 'v', "get_vfo", get_vfo, ARG_OUT, "VFO" }, + { 'T', "set_ptt", set_ptt, ARG_IN, "PTT" }, + { 't', "get_ptt", get_ptt, ARG_OUT, "PTT" }, + { 'E', "set_mem", set_mem, ARG_IN, "Memory#" }, + { 'e', "get_mem", get_mem, ARG_OUT, "Memory#" }, + { 'H', "set_channel", set_channel, ARG_IN|ARG_NOVFO, "Channel" }, + { 'h', "get_channel", get_channel, ARG_IN|ARG_NOVFO, "Channel" }, + { 'B', "set_bank", set_bank, ARG_IN, "Bank" }, + { '_', "get_info", get_info, ARG_OUT|ARG_NOVFO, "Info" }, + { 'J', "set_rit", set_rit, ARG_IN, "RIT" }, + { 'j', "get_rit", get_rit, ARG_OUT, "RIT" }, + { 'Z', "set_xit", set_xit, ARG_IN, "XIT" }, + { 'z', "get_xit", get_xit, ARG_OUT, "XIT" }, + { 'Y', "set_ant", set_ant, ARG_IN, "Antenna" }, + { 'y', "get_ant", get_ant, ARG_OUT, "Antenna" }, + { 0x87, "set_powerstat", set_powerstat, ARG_IN|ARG_NOVFO, "Power Status" }, + { 0x88, "get_powerstat", get_powerstat, ARG_OUT|ARG_NOVFO, "Power Status" }, + { 0x89, "send_dtmf", send_dtmf, ARG_IN, "Digits" }, + { 0x8a, "recv_dtmf", recv_dtmf, ARG_OUT, "Digits" }, + { '*', "reset", reset, ARG_IN, "Reset" }, + { 'w', "send_cmd", send_cmd, ARG_IN1|ARG_IN_LINE|ARG_OUT2|ARG_NOVFO, "Cmd", "Reply" }, + { 'b', "send_morse", send_morse, ARG_IN|ARG_IN_LINE, "Morse" }, + { 0x8b, "get_dcd", get_dcd, ARG_OUT, "DCD" }, + { '2', "power2mW", power2mW, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power [0.0..1.0]", "Frequency", "Mode", "Power mW" }, + { '4', "mW2power", mW2power, ARG_IN1|ARG_IN2|ARG_IN3|ARG_OUT1|ARG_NOVFO, "Power mW", "Frequency", "Mode", "Power [0.0..1.0]" }, + { '1', "dump_caps", dump_caps, ARG_NOVFO }, + { '3', "dump_conf", dump_conf, ARG_NOVFO }, + { 0x8f,"dump_state", dump_state, ARG_OUT|ARG_NOVFO }, + { 0xf0,"chk_vfo", chk_vfo, ARG_NOVFO }, /* rigctld only--check for VFO mode */ { 0x00, "", NULL }, - }; static struct test_table *find_cmd_entry(int cmd) @@ -284,6 +283,7 @@ extern int vfo_mode; extern char send_cmd_term; int ext_resp = 0; +unsigned char resp_sep = '\n'; /* Default response separator */ int rigctl_parse(RIG *my_rig, FILE *fin, FILE *fout, char *argv[], int argc) { @@ -306,7 +306,8 @@ return -1; /* Extended response protocol requested with leading '+' on command - * string--rigctld only! */ + * string--rigctld only! + */ if (cmd == '+' && !prompt) { ext_resp = 1; if (scanfc(fin, "%c", &cmd) < 0) @@ -315,6 +316,15 @@ return 0; } + if (cmd != '\\' && cmd != '_' && ispunct(cmd) && !prompt) { + ext_resp = 1; + resp_sep = cmd; + if (scanfc(fin, "%c", &cmd) < 0) + return -1; + } else if (cmd != '\\' && cmd != '?' && cmd != '_' && ispunct(cmd) && prompt) { + return 0; + } + /* command by name */ if (cmd == '\\') { unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name; @@ -477,23 +487,23 @@ rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '0x%02x' '%s' '%s' '%s'\n", cmd, vfo, p1, p2, p3); - /* - * Extended Response protocol: output received command name and arguments - * response. Don't send command header on '\chk_vfo' command. - */ - if (interactive && ext_resp && cmd != 0xf0) { - char a1[MAXARGSZ + 1]; - char a2[MAXARGSZ + 1]; - char a3[MAXARGSZ + 1]; - char vfo_str[MAXARGSZ + 1]; + /* + * Extended Response protocol: output received command name and arguments + * response. Don't send command header on '\chk_vfo' command. + */ + if (interactive && ext_resp && !prompt && cmd != 0xf0) { + char a1[MAXARGSZ + 1]; + char a2[MAXARGSZ + 1]; + char a3[MAXARGSZ + 1]; + char vfo_str[MAXARGSZ + 1]; vfo_mode == 0 ? vfo_str[0] = '\0' : snprintf(vfo_str, sizeof(vfo_str), " %s", rig_strvfo(vfo)); p1 == NULL ? a1[0] = '\0' : snprintf(a1, sizeof(a1), " %s", p1); - p2 == NULL ? a2[0] = '\0' : snprintf(a2, sizeof(a2), " %s", p2); - p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); + p2 == NULL ? a2[0] = '\0' : snprintf(a2, sizeof(a2), " %s", p2); + p3 == NULL ? a3[0] = '\0' : snprintf(a3, sizeof(a3), " %s", p3); - fprintf(fout, "%s:%s%s%s%s\n", cmd_entry->name, vfo_str, a1, a2, a3); - } + fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, vfo_str, a1, a2, a3, resp_sep); + } retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive, cmd_entry, vfo, p1, p2, p3); @@ -505,12 +515,13 @@ if (retcode != RIG_OK) { /* only for rigctld */ - if ((interactive && !prompt && ext_resp) || (interactive && !prompt)) { - fprintf(fout, NETRIGCTL_RET "%d\n", retcode); - ext_resp = 0; - } + if (interactive && !prompt) { + fprintf(fout, NETRIGCTL_RET "%d\n", retcode); + ext_resp = 0; + resp_sep = '\n'; + } else - fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); + fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { /* only for rigctld */ if (interactive && !prompt) { @@ -518,15 +529,18 @@ if (!(cmd_entry->flags & ARG_OUT) && !opt_end && !ext_resp && cmd != 0xf0) fprintf(fout, NETRIGCTL_RET "0\n"); - /* block marker protocol */ - else if (ext_resp && cmd != 0xf0) { + + /* Extended Response protocol */ + else if (ext_resp && cmd != 0xf0) { fprintf(fout, NETRIGCTL_RET "0\n"); ext_resp = 0; + resp_sep = '\n'; } + /* Nate's protocol (obsolete) */ else if ((cmd_entry->flags & ARG_OUT) && opt_end) fprintf(fout, "END\n"); - } + } } fflush(fout); @@ -546,7 +560,7 @@ int i, nbspaces; fprintf(fout, "Commands (some may not be available for this rig):\n"); - for (i=0; test_list[i].cmd != 0; i++) { + for (i = 0; test_list[i].cmd != 0; i++) { fprintf(fout, "%c: %-16s(", isprint(test_list[i].cmd) ? test_list[i].cmd:'?', test_list[i].name); @@ -558,7 +572,7 @@ if (test_list[i].arg3 && (test_list[i].flags&ARG_IN3)) nbspaces -= fprintf(fout, ",%s", test_list[i].arg3); - if (i%2) + if (i % 2) fprintf(fout, ")\n"); else fprintf(fout, ")%*s", nbspaces, " "); @@ -609,7 +623,7 @@ static int print_model_list(const struct rig_caps *caps, void *data) { - printf("%d\t%-16s%-24s%-8s%s\n", caps->rig_model, caps->mfg_name, + printf("%d\t%-23s%-24s%-12s%s\n", caps->rig_model, caps->mfg_name, caps->model_name, caps->version, rig_strstatus(caps->status)); return 1; /* !=0, we want them all ! */ } @@ -620,7 +634,7 @@ rig_load_all_backends(); - printf("Rig#\tMfg Model Vers. Status\n"); + printf("Rig#\tMfgr Model Vers. Status\n"); status = rig_list_foreach(print_model_list, NULL); if (status != RIG_OK ) { printf("rig_list_foreach: error = %s \n", rigerror(status)); @@ -677,7 +691,7 @@ if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); /* i.e. "Frequency" */ - fprintf(fout, "%"PRIll"\n", (long long)freq); + fprintf(fout, "%"PRIll"%c", (long long)freq, resp_sep); return status; } @@ -702,7 +716,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%ld\n", rit); + fprintf(fout, "%ld%c", rit, resp_sep); return status; } @@ -727,7 +741,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%ld\n", xit); + fprintf(fout, "%ld%c", xit, resp_sep); return status; } @@ -763,10 +777,10 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", rig_strrmode(mode)); + fprintf(fout, "%s%c", rig_strrmode(mode), resp_sep); if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); - fprintf(fout, "%ld\n", width); + fprintf(fout, "%ld%c", width, resp_sep); return status; } @@ -787,7 +801,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", rig_strvfo(vfo)); + fprintf(fout, "%s%c", rig_strvfo(vfo), resp_sep); return status; } @@ -795,7 +809,7 @@ /* 'T' */ declare_proto_rig(set_ptt) { - int ptt; + int ptt; sscanf(arg1, "%d", &ptt); return rig_set_ptt(rig, vfo, (ptt_t) ptt); @@ -812,7 +826,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", ptt); + fprintf(fout, "%d%c", ptt, resp_sep); return status; } @@ -828,7 +842,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", dcd); + fprintf(fout, "%d%c", dcd, resp_sep); return status; } @@ -853,7 +867,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", rig_strptrshift(rptr_shift)); + fprintf(fout, "%s%c", rig_strptrshift(rptr_shift), resp_sep); return status; } @@ -878,7 +892,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%ld\n", rptr_offs); + fprintf(fout, "%ld%c", rptr_offs, resp_sep); return status; } @@ -903,7 +917,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", tone); + fprintf(fout, "%d%c", tone, resp_sep); return status; } @@ -928,7 +942,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", code); + fprintf(fout, "%d%c", code, resp_sep); return status; } @@ -953,7 +967,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", tone); + fprintf(fout, "%d%c", tone, resp_sep); return status; } @@ -978,7 +992,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", code); + fprintf(fout, "%d%c", code, resp_sep); return status; } @@ -1005,7 +1019,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%"PRIll"\n", (long long)txfreq); + fprintf(fout, "%"PRIll"%c", (long long)txfreq, resp_sep); return status; } @@ -1014,7 +1028,7 @@ declare_proto_rig(set_split_mode) { rmode_t mode; - int width; + int width; vfo_t txvfo = RIG_VFO_TX; #if 0 @@ -1043,10 +1057,10 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", rig_strrmode(mode)); + fprintf(fout, "%s%c", rig_strrmode(mode), resp_sep); if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); - fprintf(fout, "%ld\n", width); + fprintf(fout, "%ld%c", width, resp_sep); return status; } @@ -1072,10 +1086,10 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", split); + fprintf(fout, "%d%c", split, resp_sep); if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg2); - fprintf(fout, "%s\n", rig_strvfo(tx_vfo)); + fprintf(fout, "%s%c", rig_strvfo(tx_vfo), resp_sep); return status; } @@ -1100,7 +1114,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%ld\n", ts); + fprintf(fout, "%ld%c", ts, resp_sep); return status; } @@ -1123,7 +1137,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg4); - fprintf(fout, "%i\n", mwp); + fprintf(fout, "%i%c", mwp, resp_sep); return status; } @@ -1146,7 +1160,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg4); - fprintf(fout, "%f\n", power); + fprintf(fout, "%f%c", power, resp_sep); return status; } @@ -1455,7 +1469,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", ch); + fprintf(fout, "%d%c", ch, resp_sep); return status; } @@ -1497,156 +1511,156 @@ /* 'H' */ declare_proto_rig(set_channel) { - const channel_cap_t *mem_caps = NULL; - const chan_t *chan_list; - channel_t chan; - int status; - char s[16]; + const channel_cap_t *mem_caps = NULL; + const chan_t *chan_list; + channel_t chan; + int status; + char s[16]; - rig_debug(RIG_DEBUG_TRACE, "set_channel: arg1[0] = %d\n", arg1[0]); + rig_debug(RIG_DEBUG_TRACE, "set_channel: arg1[0] = %d\n", arg1[0]); - memset(&chan, 0, sizeof(channel_t)); + memset(&chan, 0, sizeof(channel_t)); - if (isdigit(arg1[0])) { - chan.vfo = RIG_VFO_MEM; - if (sscanf(arg1, "%d", &chan.channel_num) != 1) - return -RIG_EINVAL; - /* - * find mem_caps in caps, we'll need it later - */ - chan_list = rig_lookup_mem_caps(rig, chan.channel_num); - if (chan_list) - mem_caps = &chan_list->mem_caps; + if (isdigit(arg1[0])) { + chan.vfo = RIG_VFO_MEM; + if (sscanf(arg1, "%d", &chan.channel_num) != 1) + return -RIG_EINVAL; + /* + * find mem_caps in caps, we'll need it later + */ + chan_list = rig_lookup_mem_caps(rig, chan.channel_num); + if (chan_list) + mem_caps = &chan_list->mem_caps; - } else { - chan.vfo = rig_parse_vfo(arg1); - chan.channel_num = 0; + } else { + chan.vfo = rig_parse_vfo(arg1); + chan.channel_num = 0; - /* TODO: mem_caps for VFO! */ - } + /* TODO: mem_caps for VFO! */ + } - if (!mem_caps) - return -RIG_ECONF; + if (!mem_caps) + return -RIG_ECONF; - rig_debug(RIG_DEBUG_TRACE, "set_channel: mem_caps->bank_num = %d, mem_caps->freq = %d\n", mem_caps->bank_num, mem_caps->freq); + rig_debug(RIG_DEBUG_TRACE, "set_channel: mem_caps->bank_num = %d, mem_caps->freq = %d\n", mem_caps->bank_num, mem_caps->freq); - if (mem_caps->bank_num) { - printf("Bank Num: "); - status = scanf("%d", &chan.bank_num); - } - if (mem_caps->vfo) { - printf("vfo (VFOA,MEM,etc...): "); - status = scanf("%s", s); - chan.vfo = rig_parse_vfo(s); - } - if (mem_caps->ant) { - printf("ant: "); - status = scanf("%d", &chan.ant); - } - if (mem_caps->freq) { - printf("Frequency: "); - status = scanf("%"SCNfreq, &chan.freq); - } - if (mem_caps->mode) { - printf("mode (FM,LSB,etc...): "); - status = scanf("%s", s); - chan.mode = rig_parse_mode(s); - } - if (mem_caps->width) { - printf("width: "); - status = scanf("%ld", &chan.width); - } - if (mem_caps->tx_freq) { - printf("tx freq (VFOA,MEM,etc...): "); - status = scanf("%"SCNfreq, &chan.tx_freq); - } - if (mem_caps->tx_mode) { - printf("tx mode (FM,LSB,etc...): "); - status = scanf("%s", s); - chan.tx_mode = rig_parse_mode(s); - } - if (mem_caps->tx_width) { - printf("tx width: "); - status = scanf("%ld", &chan.tx_width); - } - if (mem_caps->split) { - printf("split (0,1): "); - status = scanf("%d", &status); - chan.split = status; - } - if (mem_caps->tx_vfo) { - printf("tx vfo (VFOA,MEM,etc...): "); - status = scanf("%s", s); - chan.tx_vfo = rig_parse_vfo(s); - } - if (mem_caps->rptr_shift) { - printf("rptr shift (+-0): "); - status = scanf("%s", s); - chan.rptr_shift = rig_parse_rptr_shift(s); - } - if (mem_caps->rptr_offs) { - printf("rptr offset: "); - status = scanf("%ld", &chan.rptr_offs); - } - if (mem_caps->tuning_step) { - printf("tuning step: "); - status = scanf("%ld", &chan.tuning_step); - } - if (mem_caps->rit) { - printf("rit (Hz,0=off): "); - status = scanf("%ld", &chan.rit); - } - if (mem_caps->xit) { - printf("xit (Hz,0=off): "); - status = scanf("%ld", &chan.xit); - } - if (mem_caps->funcs) { - printf("funcs: "); - status = scanf("%lx", &chan.funcs); - } + if (mem_caps->bank_num) { + printf("Bank Num: "); + status = scanf("%d", &chan.bank_num); + } + if (mem_caps->vfo) { + printf("vfo (VFOA,MEM,etc...): "); + status = scanf("%s", s); + chan.vfo = rig_parse_vfo(s); + } + if (mem_caps->ant) { + printf("ant: "); + status = scanf("%d", &chan.ant); + } + if (mem_caps->freq) { + printf("Frequency: "); + status = scanf("%"SCNfreq, &chan.freq); + } + if (mem_caps->mode) { + printf("mode (FM,LSB,etc...): "); + status = scanf("%s", s); + chan.mode = rig_parse_mode(s); + } + if (mem_caps->width) { + printf("width: "); + status = scanf("%ld", &chan.width); + } + if (mem_caps->tx_freq) { + printf("tx freq (VFOA,MEM,etc...): "); + status = scanf("%"SCNfreq, &chan.tx_freq); + } + if (mem_caps->tx_mode) { + printf("tx mode (FM,LSB,etc...): "); + status = scanf("%s", s); + chan.tx_mode = rig_parse_mode(s); + } + if (mem_caps->tx_width) { + printf("tx width: "); + status = scanf("%ld", &chan.tx_width); + } + if (mem_caps->split) { + printf("split (0,1): "); + status = scanf("%d", &status); + chan.split = status; + } + if (mem_caps->tx_vfo) { + printf("tx vfo (VFOA,MEM,etc...): "); + status = scanf("%s", s); + chan.tx_vfo = rig_parse_vfo(s); + } + if (mem_caps->rptr_shift) { + printf("rptr shift (+-0): "); + status = scanf("%s", s); + chan.rptr_shift = rig_parse_rptr_shift(s); + } + if (mem_caps->rptr_offs) { + printf("rptr offset: "); + status = scanf("%ld", &chan.rptr_offs); + } + if (mem_caps->tuning_step) { + printf("tuning step: "); + status = scanf("%ld", &chan.tuning_step); + } + if (mem_caps->rit) { + printf("rit (Hz,0=off): "); + status = scanf("%ld", &chan.rit); + } + if (mem_caps->xit) { + printf("xit (Hz,0=off): "); + status = scanf("%ld", &chan.xit); + } + if (mem_caps->funcs) { + printf("funcs: "); + status = scanf("%lx", &chan.funcs); + } #if 0 - /* for all levels, ask */ - if (mem_caps->levels) - sscanf(arg1, "%d", &chan.levels); + /* for all levels, ask */ + if (mem_caps->levels) + sscanf(arg1, "%d", &chan.levels); #endif - if (mem_caps->ctcss_tone) { - printf("ctcss tone freq in tenth of Hz (0=off): "); - status = scanf("%d", &chan.ctcss_tone); - } - if (mem_caps->ctcss_sql) { - printf("ctcss sql freq in tenth of Hz (0=off): "); - status = scanf("%d", &chan.ctcss_sql); - } - if (mem_caps->dcs_code) { - printf("dcs code: "); - status = scanf("%d", &chan.dcs_code); - } - if (mem_caps->dcs_sql) { - printf("dcs sql: "); - status = scanf("%d", &chan.dcs_sql); - } - if (mem_caps->scan_group) { - printf("scan group: "); - status = scanf("%d", &chan.scan_group); - } - if (mem_caps->flags) { - printf("flags: "); - status = scanf("%d", &chan.flags); - } - if (mem_caps->channel_desc) { - printf("channel desc: "); - status = scanf("%s", s); - strcpy(chan.channel_desc, s); - } + if (mem_caps->ctcss_tone) { + printf("ctcss tone freq in tenth of Hz (0=off): "); + status = scanf("%d", &chan.ctcss_tone); + } + if (mem_caps->ctcss_sql) { + printf("ctcss sql freq in tenth of Hz (0=off): "); + status = scanf("%d", &chan.ctcss_sql); + } + if (mem_caps->dcs_code) { + printf("dcs code: "); + status = scanf("%d", &chan.dcs_code); + } + if (mem_caps->dcs_sql) { + printf("dcs sql: "); + status = scanf("%d", &chan.dcs_sql); + } + if (mem_caps->scan_group) { + printf("scan group: "); + status = scanf("%d", &chan.scan_group); + } + if (mem_caps->flags) { + printf("flags: "); + status = scanf("%d", &chan.flags); + } + if (mem_caps->channel_desc) { + printf("channel desc: "); + status = scanf("%s", s); + strcpy(chan.channel_desc, s); + } #if 0 - /* TODO: same as levels */ - if (mem_caps->ext_levels) - sscanf(arg1, "%d", &chan.ext_levels); + /* TODO: same as levels */ + if (mem_caps->ext_levels) + sscanf(arg1, "%d", &chan.ext_levels); #endif - status = rig_set_channel(rig, &chan); + status = rig_set_channel(rig, &chan); - return status; + return status; } /* 'h' */ @@ -1655,7 +1669,7 @@ int status; channel_t chan; - memset(&chan, 0, sizeof(channel_t)); + memset(&chan, 0, sizeof(channel_t)); if (isdigit(arg1[0])) { chan.vfo = RIG_VFO_MEM; @@ -1741,7 +1755,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", trn); + fprintf(fout, "%d%c", trn, resp_sep); return status; } @@ -1754,7 +1768,7 @@ s = rig_get_info(rig); if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%s\n", s ? s : "None"); + fprintf(fout, "%s%c", s ? s : "None", resp_sep); return RIG_OK; } @@ -1908,7 +1922,7 @@ #if 0 gran_t level_gran[RIG_SETTING_MAX]; /*!< level granularity */ - gran_t parm_gran[RIG_SETTING_MAX]; /*!< parm granularity */ + gran_t parm_gran[RIG_SETTING_MAX]; /*!< parm granularity */ #endif return RIG_OK; @@ -1942,7 +1956,7 @@ return status; if ((interactive && prompt) || (interactive && !prompt && ext_resp)) fprintf(fout, "%s: ", cmd->arg1); - fprintf(fout, "%d\n", rig_setting2idx(ant)); + fprintf(fout, "%d%c", rig_setting2idx(ant), resp_sep); return status; } Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-02-15 01:37:39 UTC (rev 2836) +++ trunk/tests/rigctld.8 2010-02-18 00:18:54 UTC (rev 2837) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTLD "8" "February 8, 2010" "Hamlib" "Rig Control Daemon" +.TH RIGCTLD "8" "February 17, 2010" "Hamlib" "Rig Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -39,17 +39,21 @@ with one line "RPTR x", where x is a negative number indicating the error code. Commands that do not return values respond with the line "RPTR x", where x is zero when successful, otherwise is a regative number indicating the error code. -Each line is terminated with a newline '\\n' character. +Each line is terminated with a newline '\\n' character. This protocol is primarily +for use by the \fINET rigctl\fP (rig model 2)backend. .PP A separate \fBExtended Response\fP protocol extends the above behavior by echoing the received command string as a header, any returned values as a key: value pair, and the "RPTR x" string as the end of response marker which includes the \fBHamlib\fP success or failure value. See the \fIPROTOCOL\fP -section for details. +section for details. Consider using this protocol for clients that will interact +with \fBrigctld\fP directly through a TCP socket. .PP Keep in mind that \fBHamlib\fP is BETA level software. While a lot of backend libraries lack complete rig support, the basic functions -are usually well supported. +are usually well supported. The API may change without publicized notice, +while an advancement of the minor version (e.g. 1.1.x to 1.2.x) indicates such +a change. .PP Please report bugs and provide feedback at the e-mail address given in the \fIREPORTING BUGS\fP section. Patches and code enhancements are also welcome. @@ -64,8 +68,8 @@ .TP .B \-r, --rig-file=device Use \fIdevice\fP as the file name of the port the radio is connected. -Often a serial port, but could be a USB to serial adapter. Typically -/dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. +Often a serial port, but could be a USB to serial adapter or USB port device. +Typically /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc. .TP .B \-p, --ptt-file=device Use \fIdevice\fP as the file name of the Push-To-Talk device using a @@ -90,7 +94,7 @@ .B \-c, --civaddr=id Use \fIid\fP as the CI-V address to communicate with the rig. Only useful for Icom rigs. -.br +.sp \fBN.B.\fP: The \fIid\fP is in decimal notation, unless prefixed by \fI0x\fP for a hexadecimal value. .TP @@ -99,21 +103,21 @@ .TP .B \-t, --port=number Use \fInumber\fP as the TCP listening port. The default is 4532. -.br +.sp \fBN.B.\fP: As \fBrotctld\fP's default port is 4533, it is advisable to use even numbered ports for \fBrigctld\fP, e.g. 4532, 4534, 4536, etc. .TP +.B \-L, --show-conf +List all config parameters for the radio defined with -m above. +.TP .B \-C, --set-conf=parm=val[,parm=val]* Set config parameter. e.g. --set-conf=stop_bits=2 -.br +.sp Use -L option for a list. .TP .B \-l, --list List all model numbers defined in \fBHamlib\fP and exit. .TP -.B \-L, --show-conf -List all config parameters for the radio defined with -m above. -.TP .B \-u, --dump-caps Dump capabilities for the radio defined with -m above and exit. .TP @@ -125,8 +129,8 @@ .TP .B \-e, --end-marker Use END marker in rigctld protocol. -.br -\fBN.B.\fP: This option can be considered obsolete. Please consider using the Extended +.sp +\fBN.B.\fP: This option should be considered obsolete. Please consider using the Extended Response protocol instead (see \fIPROTOCOL\fP below). This option will be removed in a future Hamlib release. .TP @@ -152,9 +156,9 @@ line. See \fIPROTOCOL\fP. .PP Since most of the \fBHamlib\fP operations have a \fIset\fP and a \fIget\fP method, -an upper case letter will be used for \fIset\fP method whereas the +an upper case letter will be used for \fIset\fP methods whereas the corresponding lower case letter refers to the \fIget\fP method. Each operation -also has a long name, prepend a backslash to send a long command name. +also has a long name; prepend a backslash to send a long command name. .PP Example (Perl): `print $socket "\\\\dump_caps\\n";' to see what the radio's backend can do @@ -181,28 +185,28 @@ .B M, set_mode 'Mode' 'Passband' Set 'Mode': USB, LSB, CW, CWR, RTTY, RTTYR, AM, FM, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. -.br +.sp Set 'Passband' in Hz, or '0' for the Hamlib backend default. .TP .B m, get_mode Get 'Mode' 'Passband'. -.br +.sp Returns Mode as a string from \fIset_mode\fP above and Passband in Hz. .TP .B V, set_vfo 'VFO' Set 'VFO': VFOA, VFOB, VFOC, currVFO, VFO, MEM, Main, Sub, TX, RX. -.br +.sp In VFO mode only a single VFO parameter is required. .TP .B v, get_vfo Get current 'VFO'. -.br +.sp Returns VFO as a string from \fIset_vfo\fP above. .TP .B J, set_rit 'RIT' Set 'RIT', in Hz, can be + or -. -.br +.sp A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report against the Hamlib backend. .TP @@ -211,7 +215,7 @@ .TP .B Z, set_xit 'XIT' Set 'XIT', in Hz can be + or -. -.br +.sp A value of '0' resets RIT and *should* turn RIT off. If not, file a bug report against the Hamlib backend. .TP @@ -272,13 +276,13 @@ .B X, set_split_mode 'TX Mode' 'TX Passband' Set 'TX Mode': AM, FM, CW, CWR, USB, LSB, RTTY, RTTYR, WFM, AMS, PKTLSB, PKTUSB, PKTFM, ECSSUSB, ECSSLSB, FAX, SAM, SAL, SAH, DSB. -.br +.sp The 'TX Passband' is the exact passband in Hz, or '0' for the Hamlib backend default. .TP .B x, get_split_mode Get 'TX Mode' and 'TX Passband'. -.br +.sp Returns TX mode as a string from \fIset_split_mode\fP above and TX passband in Hz. .TP .B S, set_split_vfo 'Split' 'TX VFO' @@ -295,42 +299,42 @@ .TP .B U, set_func 'Func' 'Func Status' Set 'Func' 'Func Status'. -.br +.sp Func is one of: FAGC, NB, COMP, VOX, TONE, TSQL, SBKIN, FBKIN, ANF, NR, AIP, APF, MON, MN, RF, ARO, LOCK, MUTE, VSC, REV, SQL, ABM, BC, MBC, AFC, SATMODE, SCOPE, RESUME, TBURST, TUNER. -.br +.sp Func Status argument is a non null value for "activate", "de-activate" otherwise, much as TRUE/FALSE definitions in C language. .TP .B u, get_func Get 'Func' 'Func Status'. -.br +.sp Returns Func as a string from \fIset_func\fP above and Func status as a non null value. .TP .B L, set_level 'Level' 'Level Value' Set 'Level' and 'Level Value'. -.br +.sp Level is one of: PREAMP, ATT, VOX, AF, RF, SQL, IF, APF, NR, PBT_IN, PBT_OUT, CWPITCH, RFPOWER, MICGAIN, KEYSPD, NOTCHF, COMP, AGC, BKINDL, BAL, METER, VOXGAIN, ANTIVOX. SLOPE_LOW, SLOPE_HIGH, RAWSTR, SQLSTAT, SWR, ALC, STRENGTH. -.br +.sp The Level Value can be a float or an integer. .TP .B l, get_level Get 'Level' 'Level Value'. -.br +.sp Returns Level as a string from \fIset_level\fP above and Level value as a float or integer. .TP .B P, set_parm 'Parm' 'Parm Value' Set 'Parm' 'Parm Value' -.br +.sp Parm is one of: ANN, APO, BACKLIGHT, BEEP, TIME, BAT, KEYLIGHT. .TP .B p, get_parm Get 'Parm' 'Parm Value'. -.br +.sp Returns Parm as a string from \fIset_parm\fP above and Parm Value as a float or integer. .TP @@ -345,13 +349,13 @@ .TP .B G, vfo_op 'Mem/VFO Op' Perform 'Mem/VFO Op'. -.br +.sp Mem VFO operation is one of: CPY, XCHG, FROM_VFO, TO_VFO, MCL, UP, DOWN, BAND_UP, BAND_DOWN, LEFT, RIGHT, TUNE, TOGGLE. .TP .B g, scan 'Scan Fct' 'Scan Channel' Perform 'Scan Fct' 'Scan Channel'. -.br +.sp Scan function/channel is one of: STOP, MEM, SLCT, PRIO, PROG, DELTA, VFO, PLT. .TP .B H, set_channel 'Channel' @@ -374,7 +378,7 @@ .TP .B *, reset 'Reset' Perform rig 'Reset'. -.br +.sp 0 = None, 1 = Software reset, 2 = VFO reset, 4 = Memory Clear reset, 8 = Master reset. Since these values are defined as a bitmask in rig.h, it should be possible to AND these values together to do multiple resets at once, if the backend supports it or @@ -385,7 +389,7 @@ .TP .B 0x87, set_powerstat 'Power Status' Set power On/Off/Standby 'Power Status'. -.br +.sp 0 = Power Off, 1 = Power On, 2 = Power Standby. Defined as a bitmask in rig.h. .TP .B 0x88, get_powerstat @@ -398,106 +402,114 @@ Get DTMF 'Digits'. .TP .B _, get_info -Get misc information about the rig (no value is passed). +Get misc information about the rig (no VFO in 'VFO mode' or value is passed). .TP .B 1, dump_caps Not a real rig remote command, it just dumps capabilities, i.e. what the backend knows about this model, and what it can do. TODO: Ensure this is in a consistent format so it can be read into a hash, dictionary, etc. Bug reports requested. -.br +.sp \fBN.B.\fP: This command will produce many lines of output so be very careful -if using a fixed length array! For example, running this command against these +if using a fixed length array! For example, running this command against the Dummy backend results in over 5kB of text output. -.br +.sp VFO parameter not used in 'VFO mode'. .TP .B 2, power2mW 'Power [0.0..1.0]' 'Frequency' 'Mode' Returns 'Power mW' -.br +.sp Converts a Power value in a range of \fI0.0 ... 1.0\fP to the real transmit power in milli-Watts (integer). The \fIfrequency\fP and \fImode\fP also need to be provided as output power may vary according to these values. -.br +.sp VFO parameter not used in 'VFO mode'. .TP .B 4, mW2power 'Power mW' 'Frequency' 'Mode' Returns 'Power [0.0..1.0]' -.br +.sp Converts the real transmit power in milli-Watts (integer) to a Power value in a range of \fI0.0 ... 1.0\fP. The \fIfrequency\fP and \fImode\fP also need to be provided as output power may vary according to these values. -.br +.sp VFO parameter not used in 'VFO mode'. .TP .B w, send_cmd 'Cmd' Send raw command string to rig. -.br +.sp For binary protocols enter values as \\0xAA\\0xBB. Expect a 'Reply' from the rig which will likely be a binary block or an ASCII string. .TP .B chk_vfo Returns "CHKVFO 1\\n" (single line only) if \fBrigctld\fP was invoked with the \fI-o\fP or \fI--vfo\fP option, "CHKVFO 0\\n" if not. -.br +.sp When in VFO mode the client will need to pass 'VFO' as the first parameter to \fI\\set\fP or \fI\\get\fP commands. 'VFO' is one of the strings defined for \fI\\set_vfo\fP above. -.br .SH PROTOCOL \fBDefault Protocol\fP -.br +.PP The \fBrigctld\fP protocol is intentionally simple. Commands are entered on a single line with any needed values. In Perl, reliable results are obtained by terminating each command string with a newline character, '\\n'. -.PP +.sp Example \fIset\fP (Perl code): - +.sp print $socket "F 14250000\\n"; .br print $socket "\\\\set_mode LSB 2400\\n"; # escape leading '\\' .PP -Responses from \fBrigctld\fP are text values and match the same tokens used -in the \fIset\fP commands. Each value is returned on its own line. To -signal the end of a response "0\\n" is returned. +A one line response will be sent as a reply to \fIset\fP commands, +"RPTR \fIx\fP\\n" where \fIx\fP is the Hamlib error code with '0' +indicating success of the command. .PP +Responses from \fBrigctld\fP \fIget\fP commands are text values and match the +same tokens used in the \fIset\fP commands. Each value is returned on its own +line. On error the string "RPTR \fIx\fP\\n" is returned where \fIx\fP is the +Hamlib error code. +.sp Example \fIget\fP (Perl code): - +.sp print $socket "f\\n"; - +.br "14250000\\n" .PP Most \fIget\fP functions return one to three values. A notable exception is the \fI\\dump_caps\fP function which returns many lines of key:value pairs. -Future work will focus on making this output compatible with assignment to a -hash, dictionary, or other key:value variable. .PP +This protocol is primarily used by the \fINET rigctl\fP (rigctl model 2) backend +which allows applications already written for Hamlib's C API to take advantage of +\fBrigctld\fP without the n... [truncated message content] |
From: <n0...@us...> - 2010-03-01 22:37:17
|
Revision: 2842 http://hamlib.svn.sourceforge.net/hamlib/?rev=2842&view=rev Author: n0nb Date: 2010-03-01 22:37:06 +0000 (Mon, 01 Mar 2010) Log Message: ----------- Reserve '#' for comments in Extended Response Protocol Modified Paths: -------------- trunk/tests/rigctl_parse.c trunk/tests/rigctld.8 trunk/tests/rotctl_parse.c trunk/tests/rotctld.8 Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-03-01 18:43:38 UTC (rev 2841) +++ trunk/tests/rigctl_parse.c 2010-03-01 22:37:06 UTC (rev 2842) @@ -316,12 +316,12 @@ return 0; } - if (cmd != '\\' && cmd != '_' && ispunct(cmd) && !prompt) { + if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) { ext_resp = 1; resp_sep = cmd; if (scanfc(fin, "%c", &cmd) < 0) return -1; - } else if (cmd != '\\' && cmd != '?' && cmd != '_' && ispunct(cmd) && prompt) { + } else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) { return 0; } @@ -357,7 +357,7 @@ last_was_ret = 0; /* comment line */ - if (cmd == '#' || cmd == ';') { + if (cmd == '#') { while( cmd != '\n' && cmd != '\r') if (scanfc(fin, "%c", &cmd) < 0) return -1; Modified: trunk/tests/rigctld.8 =================================================================== --- trunk/tests/rigctld.8 2010-03-01 18:43:38 UTC (rev 2841) +++ trunk/tests/rigctld.8 2010-03-01 22:37:06 UTC (rev 2842) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH RIGCTLD "8" "February 17, 2010" "Hamlib" "Rig Control Daemon" +.TH RIGCTLD "8" "March 1, 2010" "Hamlib" "Rig Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -563,6 +563,10 @@ .B '_' .br Reserved for \\get_info short command +.TP +.B '#' +.br +Reserved for comments when reading a command file script .sp Other punctuation characters have not been tested! Use at your own risk. .PP Modified: trunk/tests/rotctl_parse.c =================================================================== --- trunk/tests/rotctl_parse.c 2010-03-01 18:43:38 UTC (rev 2841) +++ trunk/tests/rotctl_parse.c 2010-03-01 22:37:06 UTC (rev 2842) @@ -210,7 +210,8 @@ return -1; /* Extended response protocol requested with leading '+' on command - * string -- rotctld only! */ + * string--rotctld only! + */ if (cmd == '+' && !prompt) { ext_resp = 1; if (scanfc(fin, "%c", &cmd) < 0) @@ -219,13 +220,12 @@ return 0; } - if (cmd != '\\' && cmd != '_' && ispunct(cmd) && !prompt) { - ext_resp = 1; - resp_sep = cmd; + if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) { + ext_resp = 1; + resp_sep = cmd; if (scanfc(fin, "%c", &cmd) < 0) return -1; - continue; - } else if (cmd != '\\' && cmd != '?' && cmd != '_' && ispunct(cmd) && prompt) { + } else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) { return 0; } @@ -260,7 +260,7 @@ last_was_ret = 0; /* comment line */ - if (cmd == '#' || cmd == ';') { + if (cmd == '#') { while( cmd != '\n' && cmd != '\r') if (scanfc(fin, "%c", &cmd) < 0) return -1; @@ -418,29 +418,30 @@ if (retcode != RIG_OK) { /* only for rotctld */ if (interactive && !prompt) { - fprintf(fout, NETROTCTL_RET "%d\n", retcode); - ext_resp = 0; - resp_sep = '\n'; - } + fprintf(fout, NETROTCTL_RET "%d\n", retcode); + ext_resp = 0; + resp_sep = '\n'; + } else - fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); + fprintf(fout, "%s: error = %s\n", cmd_entry->name, rigerror(retcode)); } else { /* only for rotctld */ if (interactive && !prompt) { /* netrotctl RIG_OK */ - if (!(cmd_entry->flags & ARG_OUT) - && !opt_end && !ext_resp && cmd != 0xf0) + if (!(cmd_entry->flags & ARG_OUT) && !opt_end && !ext_resp) fprintf(fout, NETROTCTL_RET "0\n"); - /* block marker protocol */ - else if (ext_resp && cmd != 0xf0) { + + /* Extended Response protocol */ + else if (ext_resp && cmd != 0xf0) { fprintf(fout, NETROTCTL_RET "0\n"); ext_resp = 0; - resp_sep = '\n'; + resp_sep = '\n'; } + /* Nate's protocol (obsolete) */ else if ((cmd_entry->flags & ARG_OUT) && opt_end) fprintf(fout, "END\n"); - } + } } fflush(fout); Modified: trunk/tests/rotctld.8 =================================================================== --- trunk/tests/rotctld.8 2010-03-01 18:43:38 UTC (rev 2841) +++ trunk/tests/rotctld.8 2010-03-01 22:37:06 UTC (rev 2842) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH ROTCTLD "8" "February 17, 2010" "Hamlib" "Rotator Control Daemon" +.TH ROTCTLD "8" "March 1, 2010" "Hamlib" "Rotator Control Daemon" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -372,6 +372,10 @@ .B '_' .br Reserved for \\get_info short command +.TP +.B '#' +.br +Reserved for comments when reading a command file script .sp Other punctuation characters have not been tested! Use at your own risk. .PP This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2010-04-05 10:15:42
|
Revision: 2867 http://hamlib.svn.sourceforge.net/hamlib/?rev=2867&view=rev Author: fillods Date: 2010-04-05 10:15:36 +0000 (Mon, 05 Apr 2010) Log Message: ----------- error checking when parsing Modified Paths: -------------- trunk/tests/rigctl_parse.c trunk/tests/rotctl_parse.c Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-04-05 10:10:16 UTC (rev 2866) +++ trunk/tests/rigctl_parse.c 2010-04-05 10:15:36 UTC (rev 2867) @@ -1,5 +1,5 @@ /* - * rigctl_parse.c - (C) Stephane Fillod 2000-2009 + * rigctl_parse.c - (C) Stephane Fillod 2000-2010 * (C) Terry Embry 2008-2009 * (C) The Hamlib Group 2010 * @@ -74,7 +74,7 @@ struct test_table { unsigned char cmd; const char *name; - int (*rig_routine)(RIG*, FILE*, int, const struct test_table*, vfo_t, + int (*rig_routine)(RIG*, FILE*, FILE*, int, const struct test_table*, vfo_t, const char*, const char*, const char*); int flags; const char *arg1; @@ -84,7 +84,9 @@ }; -#define declare_proto_rig(f) static int (f)(RIG *rig, FILE *fout, int interactive, \ +#define CHKSCN1ARG(a) if ((a) != 1) return -RIG_EINVAL; else do {} while(0) + +#define declare_proto_rig(f) static int (f)(RIG *rig, FILE *fout, FILE *fin, int interactive, \ const struct test_table *cmd, vfo_t vfo, const char *arg1, \ const char *arg2, const char *arg3) @@ -302,7 +304,7 @@ fprintf(fout, "\nRig command: "); do { - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; /* Extended response protocol requested with leading '+' on command @@ -310,7 +312,7 @@ */ if (cmd == '+' && !prompt) { ext_resp = 1; - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; } else if (cmd == '+' && prompt) { return 0; @@ -319,7 +321,7 @@ if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) { ext_resp = 1; resp_sep = cmd; - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; } else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) { return 0; @@ -330,11 +332,11 @@ unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name; int c_len = MAXNAMSIZ; - if (scanfc(fin, "%c", pcmd) < 0) + if (scanfc(fin, "%c", pcmd) < 1) return -1; while(c_len-- && (isalnum(*pcmd) || *pcmd == '_' )) - if (scanfc(fin, "%c", ++pcmd) < 0) + if (scanfc(fin, "%c", ++pcmd) < 1) return -1; *pcmd = '\0'; @@ -359,7 +361,7 @@ /* comment line */ if (cmd == '#') { while( cmd != '\n' && cmd != '\r') - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; return 0; } @@ -392,7 +394,7 @@ if (interactive) { if (prompt) fprintf(fout, "VFO: "); - if (scanfc(fin, "%s", arg1) < 0) + if (scanfc(fin, "%s", arg1) < 1) return -1; vfo = rig_parse_vfo(arg1); } else { @@ -411,9 +413,11 @@ char *nl; if (prompt) fprintf(fout, "%s: ", cmd_entry->arg1); - fgets(arg1, MAXARGSZ, fin); + if (fgets(arg1, MAXARGSZ, fin) == NULL) + return -1; if (arg1[0] == 0xa) - fgets(arg1, MAXARGSZ, fin); + if (fgets(arg1, MAXARGSZ, fin) == NULL) + return -1; nl = strchr(arg1, 0xa); if (nl) *nl = '\0'; /* chomp */ p1 = arg1[0] == ' ' ? arg1 + 1 : arg1; @@ -430,7 +434,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg1); - if (scanfc(fin, "%s", arg1) < 0) + if (scanfc(fin, "%s", arg1) < 1) return -1; p1 = arg1; } else { @@ -446,7 +450,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg2); - if (scanfc(fin, "%s", arg2) < 0) + if (scanfc(fin, "%s", arg2) < 1) return -1; p2 = arg2; } else { @@ -462,7 +466,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg3); - if (scanfc(fin, "%s", arg3) < 0) + if (scanfc(fin, "%s", arg3) < 1) return -1; p3 = arg3; } else { @@ -505,8 +509,8 @@ fprintf(fout, "%s:%s%s%s%s%c", cmd_entry->name, vfo_str, a1, a2, a3, resp_sep); } - retcode = (*cmd_entry->rig_routine)(my_rig, fout, interactive, - cmd_entry, vfo, p1, p2, p3); + retcode = (*cmd_entry->rig_routine)(my_rig, fout, fin, interactive, + cmd_entry, vfo, p1, p2 ? p2 : "", p3 ? p3 : ""); #ifdef HAVE_PTHREAD pthread_mutex_unlock(&rig_mutex); @@ -675,7 +679,7 @@ { freq_t freq; - sscanf(arg1, "%"SCNfreq, &freq); + CHKSCN1ARG(sscanf(arg1, "%"SCNfreq, &freq)); return rig_set_freq(rig, vfo, freq); } @@ -701,7 +705,7 @@ { shortfreq_t rit; - sscanf(arg1, "%ld", &rit); + CHKSCN1ARG(sscanf(arg1, "%ld", &rit)); return rig_set_rit(rig, vfo, rit); } @@ -726,7 +730,7 @@ { shortfreq_t xit; - sscanf(arg1, "%ld", &xit); + CHKSCN1ARG(sscanf(arg1, "%ld", &xit)); return rig_set_xit(rig, vfo, xit); } @@ -760,7 +764,7 @@ } mode = rig_parse_mode(arg1); - sscanf(arg2, "%ld", &width); + CHKSCN1ARG(sscanf(arg2, "%ld", &width)); return rig_set_mode(rig, vfo, mode, width); } @@ -808,9 +812,9 @@ /* 'T' */ declare_proto_rig(set_ptt) { - int ptt; + int ptt; - sscanf(arg1, "%d", &ptt); + CHKSCN1ARG(sscanf(arg1, "%d", &ptt)); return rig_set_ptt(rig, vfo, (ptt_t) ptt); } @@ -876,7 +880,7 @@ { unsigned long rptr_offs; - sscanf(arg1, "%ld", &rptr_offs); + CHKSCN1ARG(sscanf(arg1, "%ld", &rptr_offs)); return rig_set_rptr_offs(rig, vfo, rptr_offs); } @@ -901,7 +905,7 @@ { tone_t tone; - sscanf(arg1, "%d", &tone); + CHKSCN1ARG(sscanf(arg1, "%d", &tone)); return rig_set_ctcss_tone(rig, vfo, tone); } @@ -926,7 +930,7 @@ { tone_t code; - sscanf(arg1, "%d", &code); + CHKSCN1ARG(sscanf(arg1, "%d", &code)); return rig_set_dcs_code(rig, vfo, code); } @@ -951,7 +955,7 @@ { tone_t tone; - sscanf(arg1, "%d", &tone); + CHKSCN1ARG(sscanf(arg1, "%d", &tone)); return rig_set_ctcss_sql(rig, vfo, tone); } @@ -976,7 +980,7 @@ { tone_t code; - sscanf(arg1, "%d", &code); + CHKSCN1ARG(sscanf(arg1, "%d", &code)); return rig_set_dcs_sql(rig, vfo, code); } @@ -1002,7 +1006,7 @@ freq_t txfreq; vfo_t txvfo = RIG_VFO_TX; - sscanf(arg1, "%"SCNfreq, &txfreq); + CHKSCN1ARG(sscanf(arg1, "%"SCNfreq, &txfreq)); return rig_set_split_freq(rig, txvfo, txfreq); } @@ -1038,7 +1042,7 @@ } mode = rig_parse_mode(arg1); - sscanf(arg2, "%d", &width); + CHKSCN1ARG(sscanf(arg2, "%d", &width)); return rig_set_split_mode(rig, txvfo, mode, (pbwidth_t) width); } @@ -1068,7 +1072,7 @@ { int split; - sscanf(arg1, "%d", &split); + CHKSCN1ARG(sscanf(arg1, "%d", &split)); return rig_set_split_vfo(rig, vfo, (split_t) split, rig_parse_vfo(arg2)); } @@ -1097,7 +1101,7 @@ { unsigned long ts; - sscanf(arg1, "%ld", &ts); + CHKSCN1ARG(sscanf(arg1, "%ld", &ts)); return rig_set_ts(rig, vfo, ts); } @@ -1126,8 +1130,8 @@ rmode_t mode; unsigned int mwp; - sscanf(arg1, "%f", &power); - sscanf(arg2, "%"SCNfreq, &freq); + CHKSCN1ARG(sscanf(arg1, "%f", &power)); + CHKSCN1ARG(sscanf(arg2, "%"SCNfreq, &freq)); mode = rig_parse_mode(arg3); status = rig_power2mW(rig, &mwp, power, freq, mode); @@ -1149,8 +1153,8 @@ rmode_t mode; unsigned int mwp; - sscanf(arg1, "%i", &mwp); - sscanf(arg2, "%"SCNfreq, &freq); + CHKSCN1ARG(sscanf(arg1, "%i", &mwp)); + CHKSCN1ARG(sscanf(arg2, "%"SCNfreq, &freq)); mode = rig_parse_mode(arg3); status = rig_mW2power(rig, &power, mwp, freq, mode); @@ -1198,10 +1202,10 @@ break; case RIG_CONF_CHECKBUTTON: case RIG_CONF_COMBO: - sscanf(arg2, "%d", &val.i); + CHKSCN1ARG(sscanf(arg2, "%d", &val.i)); break; case RIG_CONF_NUMERIC: - sscanf(arg2, "%f", &val.f); + CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); break; case RIG_CONF_STRING: val.cs = arg2; @@ -1213,9 +1217,9 @@ } if (RIG_LEVEL_IS_FLOAT(level)) - sscanf(arg2, "%f", &val.f); + CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); else - sscanf(arg2, "%d", &val.i); + CHKSCN1ARG(sscanf(arg2, "%d", &val.i)); return rig_set_level(rig, vfo, level, val); } @@ -1297,7 +1301,7 @@ } func = rig_parse_func(arg1); - sscanf(arg2, "%d", &func_stat); + CHKSCN1ARG(sscanf(arg2, "%d", &func_stat)); return rig_set_func(rig, vfo, func, func_stat); } @@ -1354,10 +1358,10 @@ break; case RIG_CONF_CHECKBUTTON: case RIG_CONF_COMBO: - sscanf(arg2, "%d", &val.i); + CHKSCN1ARG(sscanf(arg2, "%d", &val.i)); break; case RIG_CONF_NUMERIC: - sscanf(arg2, "%f", &val.f); + CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); break; case RIG_CONF_STRING: val.cs = arg2; @@ -1369,9 +1373,9 @@ } if (RIG_PARM_IS_FLOAT(parm)) - sscanf(arg2, "%f", &val.f); + CHKSCN1ARG(sscanf(arg2, "%f", &val.f)); else - sscanf(arg2, "%d", &val.i); + CHKSCN1ARG(sscanf(arg2, "%d", &val.i)); return rig_set_parm(rig, parm, val); } @@ -1443,7 +1447,7 @@ { int bank; - sscanf(arg1, "%d", &bank); + CHKSCN1ARG(sscanf(arg1, "%d", &bank)); return rig_set_bank(rig, vfo, bank); } @@ -1452,7 +1456,7 @@ { int ch; - sscanf(arg1, "%d", &ch); + CHKSCN1ARG(sscanf(arg1, "%d", &ch)); return rig_set_mem(rig, vfo, ch); } @@ -1502,7 +1506,7 @@ } op = rig_parse_scan(arg1); - sscanf(arg2, "%d", &ch); + CHKSCN1ARG(sscanf(arg2, "%d", &ch)); return rig_scan(rig, vfo, op, ch); } @@ -1521,8 +1525,7 @@ if (isdigit(arg1[0])) { chan.vfo = RIG_VFO_MEM; - if (sscanf(arg1, "%d", &chan.channel_num) != 1) - return -RIG_EINVAL; + CHKSCN1ARG(sscanf(arg1, "%d", &chan.channel_num)); /* * find mem_caps in caps, we'll need it later */ @@ -1543,78 +1546,95 @@ rig_debug(RIG_DEBUG_TRACE, "set_channel: mem_caps->bank_num = %d, mem_caps->freq = %d\n", mem_caps->bank_num, mem_caps->freq); if (mem_caps->bank_num) { - printf("Bank Num: "); - status = scanf("%d", &chan.bank_num); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Bank Num: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.bank_num)); } if (mem_caps->vfo) { - printf("vfo (VFOA,MEM,etc...): "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "vfo (VFOA,MEM,etc...): "); + CHKSCN1ARG(scanfc(fin, "%s", s)); chan.vfo = rig_parse_vfo(s); } if (mem_caps->ant) { - printf("ant: "); - status = scanf("%d", &chan.ant); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "ant: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.ant)); } if (mem_caps->freq) { - printf("Frequency: "); - status = scanf("%"SCNfreq, &chan.freq); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "Frequency: "); + CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.freq)); } if (mem_caps->mode) { - printf("mode (FM,LSB,etc...): "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "mode (FM,LSB,etc...): "); + CHKSCN1ARG(scanfc(fin, "%s", s)); chan.mode = rig_parse_mode(s); } if (mem_caps->width) { - printf("width: "); - status = scanf("%ld", &chan.width); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "width: "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.width)); } if (mem_caps->tx_freq) { - printf("tx freq (VFOA,MEM,etc...): "); - status = scanf("%"SCNfreq, &chan.tx_freq); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "tx freq (VFOA,MEM,etc...): "); + CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.tx_freq)); } if (mem_caps->tx_mode) { - printf("tx mode (FM,LSB,etc...): "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "tx mode (FM,LSB,etc...): "); + CHKSCN1ARG(scanfc(fin, "%s", s)); chan.tx_mode = rig_parse_mode(s); } if (mem_caps->tx_width) { - printf("tx width: "); - status = scanf("%ld", &chan.tx_width); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "tx width: "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.tx_width)); } if (mem_caps->split) { - printf("split (0,1): "); - status = scanf("%d", &status); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "split (0,1): "); + CHKSCN1ARG(scanfc(fin, "%d", &status)); chan.split = status; } if (mem_caps->tx_vfo) { - printf("tx vfo (VFOA,MEM,etc...): "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "tx vfo (VFOA,MEM,etc...): "); + CHKSCN1ARG(scanfc(fin, "%s", s)); chan.tx_vfo = rig_parse_vfo(s); } if (mem_caps->rptr_shift) { - printf("rptr shift (+-0): "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "rptr shift (+-0): "); + CHKSCN1ARG(scanfc(fin, "%s", s)); chan.rptr_shift = rig_parse_rptr_shift(s); } if (mem_caps->rptr_offs) { - printf("rptr offset: "); - status = scanf("%ld", &chan.rptr_offs); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "rptr offset: "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.rptr_offs)); } if (mem_caps->tuning_step) { - printf("tuning step: "); - status = scanf("%ld", &chan.tuning_step); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "tuning step: "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.tuning_step)); } if (mem_caps->rit) { - printf("rit (Hz,0=off): "); - status = scanf("%ld", &chan.rit); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "rit (Hz,0=off): "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.rit)); } if (mem_caps->xit) { - printf("xit (Hz,0=off): "); - status = scanf("%ld", &chan.xit); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "xit (Hz,0=off): "); + CHKSCN1ARG(scanfc(fin, "%ld", &chan.xit)); } if (mem_caps->funcs) { - printf("funcs: "); - status = scanf("%lx", &chan.funcs); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "funcs: "); + CHKSCN1ARG(scanfc(fin, "%lx", &chan.funcs)); } #if 0 /* for all levels, ask */ @@ -1622,32 +1642,39 @@ sscanf(arg1, "%d", &chan.levels); #endif if (mem_caps->ctcss_tone) { - printf("ctcss tone freq in tenth of Hz (0=off): "); - status = scanf("%d", &chan.ctcss_tone); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "ctcss tone freq in tenth of Hz (0=off): "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_tone)); } if (mem_caps->ctcss_sql) { - printf("ctcss sql freq in tenth of Hz (0=off): "); - status = scanf("%d", &chan.ctcss_sql); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "ctcss sql freq in tenth of Hz (0=off): "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_sql)); } if (mem_caps->dcs_code) { - printf("dcs code: "); - status = scanf("%d", &chan.dcs_code); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "dcs code: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_code)); } if (mem_caps->dcs_sql) { - printf("dcs sql: "); - status = scanf("%d", &chan.dcs_sql); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "dcs sql: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_sql)); } if (mem_caps->scan_group) { - printf("scan group: "); - status = scanf("%d", &chan.scan_group); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "scan group: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.scan_group)); } if (mem_caps->flags) { - printf("flags: "); - status = scanf("%d", &chan.flags); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "flags: "); + CHKSCN1ARG(scanfc(fin, "%d", &chan.flags)); } if (mem_caps->channel_desc) { - printf("channel desc: "); - status = scanf("%s", s); + if ((interactive && prompt) || (interactive && !prompt && ext_resp)) + fprintf(fout, "channel desc: "); + CHKSCN1ARG(scanfc(fin, "%s", s)); strcpy(chan.channel_desc, s); } #if 0 @@ -1671,8 +1698,7 @@ if (isdigit(arg1[0])) { chan.vfo = RIG_VFO_MEM; - if (sscanf(arg1, "%d", &chan.channel_num) != 1) - return -RIG_EINVAL; + CHKSCN1ARG(sscanf(arg1, "%d", &chan.channel_num)); } else { chan.vfo = rig_parse_vfo(arg1); chan.channel_num = 0; @@ -1939,7 +1965,7 @@ { ant_t ant; - sscanf(arg1, "%d", &ant); + CHKSCN1ARG(sscanf(arg1, "%d", &ant)); return rig_set_ant(rig, vfo, rig_idx2setting(ant)); } @@ -1964,7 +1990,7 @@ { int reset; - sscanf(arg1, "%d", &reset); + CHKSCN1ARG(sscanf(arg1, "%d", &reset)); return rig_reset(rig, (reset_t) reset); } @@ -2001,7 +2027,7 @@ { int stat; - sscanf(arg1, "%d", &stat); + CHKSCN1ARG(sscanf(arg1, "%d", &stat)); return rig_set_powerstat(rig, (powerstat_t) stat); } Modified: trunk/tests/rotctl_parse.c =================================================================== --- trunk/tests/rotctl_parse.c 2010-04-05 10:10:16 UTC (rev 2866) +++ trunk/tests/rotctl_parse.c 2010-04-05 10:15:36 UTC (rev 2867) @@ -1,5 +1,5 @@ /* - * rotctl.c - (C) Stephane Fillod 2000-2009 + * rotctl.c - (C) Stephane Fillod 2000-2010 * * This program test/control a rotator using Hamlib. * It takes commands in interactive mode as well as @@ -81,6 +81,8 @@ const char *arg6; }; +#define CHKSCN1ARG(a) if ((a) != 1) return -RIG_EINVAL; else do {} while(0) + #define declare_proto_rot(f) static int (f)(ROT *rot, FILE *fout, int interactive, \ const struct test_table *cmd, const char *arg1, const char *arg2, \ const char *arg3, const char *arg4, const char *arg5, const char *arg6) @@ -206,7 +208,7 @@ fprintf(fout, "\nRotator command: "); do { - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; /* Extended response protocol requested with leading '+' on command @@ -214,7 +216,7 @@ */ if (cmd == '+' && !prompt) { ext_resp = 1; - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; } else if (cmd == '+' && prompt) { return 0; @@ -223,7 +225,7 @@ if (cmd != '\\' && cmd != '_' && cmd != '#' && ispunct(cmd) && !prompt) { ext_resp = 1; resp_sep = cmd; - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; } else if (cmd != '\\' && cmd != '?' && cmd != '_' && cmd != '#' && ispunct(cmd) && prompt) { return 0; @@ -234,11 +236,11 @@ unsigned char cmd_name[MAXNAMSIZ], *pcmd = cmd_name; int c_len = MAXNAMSIZ; - if (scanfc(fin, "%c", pcmd) < 0) + if (scanfc(fin, "%c", pcmd) < 1) return -1; while(c_len-- && (isalnum(*pcmd) || *pcmd == '_' )) - if (scanfc(fin, "%c", ++pcmd) < 0) + if (scanfc(fin, "%c", ++pcmd) < 1) return -1; *pcmd = '\0'; @@ -262,7 +264,7 @@ /* comment line */ if (cmd == '#') { while( cmd != '\n' && cmd != '\r') - if (scanfc(fin, "%c", &cmd) < 0) + if (scanfc(fin, "%c", &cmd) < 1) return -1; return 0; } @@ -298,9 +300,11 @@ char *nl; if (prompt) fprintf(fout, "%s: ", cmd_entry->arg1); - fgets(arg1, MAXARGSZ, fin); + if (fgets(arg1, MAXARGSZ, fin) == NULL) + return -1; if (arg1[0] == 0xa) - fgets(arg1, MAXARGSZ, fin); + if (fgets(arg1, MAXARGSZ, fin) == NULL) + return -1; nl = strchr(arg1, 0xa); if (nl) *nl = '\0'; /* chomp */ p1 = arg1[0]==' '?arg1+1:arg1; @@ -316,7 +320,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg1); - if (scanfc(fin, "%s", arg1) < 0) + if (scanfc(fin, "%s", arg1) < 1) return -1; p1 = arg1; } else { @@ -332,7 +336,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg2); - if (scanfc(fin, "%s", arg2) < 0) + if (scanfc(fin, "%s", arg2) < 1) return -1; p2 = arg2; } else { @@ -348,7 +352,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg3); - if (scanfc(fin, "%s", arg3) < 0) + if (scanfc(fin, "%s", arg3) < 1) return -1; p3 = arg3; } else { @@ -365,7 +369,7 @@ if (interactive) { if (prompt) fprintf(fout, "%s: ", cmd_entry->arg4); - if (scanfc(fin, "%s", arg4) < 0) + if (scanfc(fin, "%s", arg4) < 1) return -1; p4 = arg4; } else { @@ -409,7 +413,8 @@ } retcode = (*cmd_entry->rot_routine)(my_rot, fout, interactive, - cmd_entry, p1, p2, p3, p4, p5, p6); + cmd_entry, p1, p2 ? p2 : "", p3 ? p3 : "", + p4 ? p4 : "", p5 ? p5 : "", p6 ? p6 : ""); #ifdef HAVE_PTHREAD pthread_mutex_unlock(&rot_mutex); @@ -567,8 +572,8 @@ azimuth_t az; elevation_t el; - sscanf(arg1, "%f", &az); - sscanf(arg2, "%f", &el); + CHKSCN1ARG(sscanf(arg1, "%f", &az)); + CHKSCN1ARG(sscanf(arg2, "%f", &el)); return rot_set_position(rot, az, el); } @@ -609,7 +614,7 @@ { rot_reset_t reset; - sscanf(arg1, "%d", &reset); + CHKSCN1ARG(sscanf(arg1, "%d", &reset)); return rot_reset(rot, reset); } @@ -632,8 +637,8 @@ int direction; int speed; - sscanf(arg1, "%d", &direction); - sscanf(arg2, "%d", &speed); + CHKSCN1ARG(sscanf(arg1, "%d", &direction)); + CHKSCN1ARG(sscanf(arg2, "%d", &speed)); return rot_move(rot, direction, speed); } @@ -643,8 +648,8 @@ token_t token; char val[21] = ""; /* 20 chars enough? */ - sscanf(arg1, "%ld", &token); - sscanf(arg2, "%s", val); + CHKSCN1ARG(sscanf(arg1, "%ld", &token)); + CHKSCN1ARG(sscanf(arg2, "%s", val)); return rot_set_conf(rot, token, val); } @@ -787,9 +792,9 @@ double lat, lon; int err, pair; - sscanf(arg1, "%lf", &lon); - sscanf(arg2, "%lf", &lat); - sscanf(arg3, "%d", &pair); + CHKSCN1ARG(sscanf(arg1, "%lf", &lon)); + CHKSCN1ARG(sscanf(arg2, "%lf", &lat)); + CHKSCN1ARG(sscanf(arg3, "%d", &pair)); pair /= 2; @@ -812,7 +817,7 @@ double lat, lon; int status; - sscanf(arg1, "%s", (char *)&loc); + CHKSCN1ARG(sscanf(arg1, "%s", (char *)&loc)); status = locator2longlat(&lon, &lat, (const char *)loc); @@ -835,10 +840,10 @@ int deg, min, sw; double sec, dec_deg; - sscanf(arg1, "%d", °); - sscanf(arg2, "%d", &min); - sscanf(arg3, "%lf", &sec); - sscanf(arg4, "%d", &sw); + CHKSCN1ARG(sscanf(arg1, "%d", °)); + CHKSCN1ARG(sscanf(arg2, "%d", &min)); + CHKSCN1ARG(sscanf(arg3, "%lf", &sec)); + CHKSCN1ARG(sscanf(arg4, "%d", &sw)); dec_deg = dms2dec(deg, min, sec, sw); @@ -855,7 +860,7 @@ int deg, min, sw, err; double sec, dec_deg; - sscanf(arg1, "%lf", &dec_deg); + CHKSCN1ARG(sscanf(arg1, "%lf", &dec_deg)); err = dec2dms(dec_deg, °, &min, &sec, &sw); @@ -884,9 +889,9 @@ int deg, sw; double dec_deg, min; - sscanf(arg1, "%d", °); - sscanf(arg2, "%lf", &min); - sscanf(arg3, "%d", &sw); + CHKSCN1ARG(sscanf(arg1, "%d", °)); + CHKSCN1ARG(sscanf(arg2, "%lf", &min)); + CHKSCN1ARG(sscanf(arg3, "%d", &sw)); dec_deg = dmmm2dec(deg, min, sw); @@ -903,7 +908,7 @@ int deg, sw, err; double min, dec_deg; - sscanf(arg1, "%lf", &dec_deg); + CHKSCN1ARG(sscanf(arg1, "%lf", &dec_deg)); err = dec2dmmm(dec_deg, °, &min, &sw); @@ -929,10 +934,10 @@ double lon1, lat1, lon2, lat2, dist, az; int err; - sscanf(arg1, "%lf", &lon1); - sscanf(arg2, "%lf", &lat1); - sscanf(arg3, "%lf", &lon2); - sscanf(arg4, "%lf", &lat2); + CHKSCN1ARG(sscanf(arg1, "%lf", &lon1)); + CHKSCN1ARG(sscanf(arg2, "%lf", &lat1)); + CHKSCN1ARG(sscanf(arg3, "%lf", &lon2)); + CHKSCN1ARG(sscanf(arg4, "%lf", &lat2)); err = qrb(lon1, lat1, lon2, lat2, &dist, &az); @@ -954,7 +959,7 @@ { double az_sp, az_lp; - sscanf(arg1, "%lf", &az_sp); + CHKSCN1ARG(sscanf(arg1, "%lf", &az_sp)); az_lp = azimuth_long_path(az_sp); @@ -973,7 +978,7 @@ { double dist_sp, dist_lp; - sscanf(arg1, "%lf", &dist_sp); + CHKSCN1ARG(sscanf(arg1, "%lf", &dist_sp)); dist_lp = distance_long_path(dist_sp); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2010-04-25 17:29:59
|
Revision: 2895 http://hamlib.svn.sourceforge.net/hamlib/?rev=2895&view=rev Author: fillods Date: 2010-04-25 17:29:53 +0000 (Sun, 25 Apr 2010) Log Message: ----------- - allow litteral command for \move - added dump-caps option to rotctl Modified Paths: -------------- trunk/tests/rotctl.1 trunk/tests/rotctl.c trunk/tests/rotctl_parse.c Modified: trunk/tests/rotctl.1 =================================================================== --- trunk/tests/rotctl.1 2010-04-25 17:24:25 UTC (rev 2894) +++ trunk/tests/rotctl.1 2010-04-25 17:29:53 UTC (rev 2895) @@ -2,7 +2,7 @@ .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) -.TH ROTCTL "1" "February 17, 2010" "Hamlib" "Rotator Control Program" +.TH ROTCTL "1" "April 25, 2010" "Hamlib" "Rotator Control Program" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: @@ -74,6 +74,9 @@ .sp Use -L option for a list. .TP +.B \-u, --dump-caps +Dump capabilities for the rotor defined with -m above and exit. +.TP .B \-l, --list List all model numbers defined in \fBHamlib\fP and exit. .TP Modified: trunk/tests/rotctl.c =================================================================== --- trunk/tests/rotctl.c 2010-04-25 17:24:25 UTC (rev 2894) +++ trunk/tests/rotctl.c 2010-04-25 17:29:53 UTC (rev 2895) @@ -1,13 +1,11 @@ /* - * rotctl.c - (C) Stephane Fillod 2000-2009 + * rotctl.c - (C) Stephane Fillod 2000-2010 * * This program test/control a rotator using Hamlib. * It takes commands in interactive mode as well as * from command line options. * - * $Id: rotctl.c,v 1.14 2009-02-17 08:03:22 fillods Exp $ * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -52,7 +50,7 @@ * NB: do NOT use -W since it's reserved by POSIX. * TODO: add an option to read from a file */ -#define SHORT_OPTIONS "m:r:s:C:t:LvhVl" +#define SHORT_OPTIONS "m:r:s:C:t:LvhVlu" static struct option long_options[] = { {"model", 1, 0, 'm'}, @@ -62,6 +60,7 @@ {"list", 0, 0, 'l'}, {"set-conf", 1, 0, 'C'}, {"show-conf",0, 0, 'L'}, + {"dump-caps",0, 0, 'u'}, {"verbose", 0, 0, 'v'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'V'}, @@ -85,6 +84,7 @@ int verbose = 0; int show_conf = 0; + int dump_caps_opt = 0; const char *rot_file=NULL; int serial_rate = 0; char conf_parms[MAXCONFLEN] = ""; @@ -154,6 +154,9 @@ case 'l': list_models(); exit(0); + case 'u': + dump_caps_opt++; + break; default: usage(); /* unknown option? */ exit(1); @@ -202,6 +205,16 @@ rot_token_foreach(my_rot, print_conf_list, (rig_ptr_t)my_rot); } + /* + * print out capabilities, and exists immediately + * We may be interested only in caps, and rig_open may fail. + */ + if (dump_caps_opt) { + dumpcaps_rot(my_rot, stdout); + rot_cleanup(my_rot); /* if you care about memory */ + exit(0); + } + retcode = rot_open(my_rot); if (retcode != RIG_OK) { fprintf(stderr,"rot_open: error = %s \n", rigerror(retcode)); @@ -240,6 +253,7 @@ " -C, --set-conf=PARM=VAL set config parameters\n" " -L, --show-conf list all config parameters\n" " -l, --list list all model numbers and exit\n" + " -u, --dump-caps dump capabilities and exit\n" " -v, --verbose set verbose mode, cumulative\n" " -h, --help display this help and exit\n" " -V, --version output version information and exit\n\n" Modified: trunk/tests/rotctl_parse.c =================================================================== --- trunk/tests/rotctl_parse.c 2010-04-25 17:24:25 UTC (rev 2894) +++ trunk/tests/rotctl_parse.c 2010-04-25 17:29:53 UTC (rev 2895) @@ -1,13 +1,11 @@ /* - * rotctl.c - (C) Stephane Fillod 2000-2010 + * rotctl_parse.c - (C) Stephane Fillod 2000-2010 * * This program test/control a rotator using Hamlib. * It takes commands in interactive mode as well as * from command line options. * - * $Id: rotctl_parse.c,v 1.5 2009-01-04 14:49:17 fillods Exp $ * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -392,7 +390,7 @@ if (!prompt) rig_debug(RIG_DEBUG_TRACE, "rotctl(d): %c '%s' '%s' '%s' '%s'\n", - cmd, p1, p2, p3, p4); + cmd, p1?p1:"", p2?p2:"", p3?p3:"", p4?p4:""); /* * Extended Response protocol: output received command name and arguments @@ -637,7 +635,20 @@ int direction; int speed; - CHKSCN1ARG(sscanf(arg1, "%d", &direction)); + if (!strcmp(arg1, "LEFT") || !strcmp(arg1, "CCW")) + direction = ROT_MOVE_LEFT; + else + if (!strcmp(arg1, "RIGHT") || !strcmp(arg1, "CW")) + direction = ROT_MOVE_RIGHT; + else + if (!strcmp(arg1, "UP")) + direction = ROT_MOVE_UP; + else + if (!strcmp(arg1, "DOWN")) + direction = ROT_MOVE_DOWN; + else + CHKSCN1ARG(sscanf(arg1, "%d", &direction)); + CHKSCN1ARG(sscanf(arg2, "%d", &speed)); return rot_move(rot, direction, speed); } @@ -646,11 +657,11 @@ declare_proto_rot(inter_set_conf) { token_t token; - char val[21] = ""; /* 20 chars enough? */ CHKSCN1ARG(sscanf(arg1, "%ld", &token)); - CHKSCN1ARG(sscanf(arg2, "%s", val)); - return rot_set_conf(rot, token, val); + if (!arg2 || arg2[0] == '\0') + return -RIG_EINVAL; + return rot_set_conf(rot, token, arg2); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2010-04-25 17:30:59
|
Revision: 2896 http://hamlib.svn.sourceforge.net/hamlib/?rev=2896&view=rev Author: fillods Date: 2010-04-25 17:30:52 +0000 (Sun, 25 Apr 2010) Log Message: ----------- Only dump serial specs for serial type rigs Modified Paths: -------------- trunk/tests/dumpcaps.c trunk/tests/dumpcaps_rot.c Modified: trunk/tests/dumpcaps.c =================================================================== --- trunk/tests/dumpcaps.c 2010-04-25 17:29:53 UTC (rev 2895) +++ trunk/tests/dumpcaps.c 2010-04-25 17:30:52 UTC (rev 2896) @@ -3,9 +3,6 @@ * This programs dumps the capabilities of a backend rig. * * - * $Id: dumpcaps.c,v 1.52 2009-01-28 22:49:58 fillods Exp $ - * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -129,7 +126,7 @@ fprintf(fout, "Rig capable\n"); break; case RIG_DCD_PARALLEL: - fprintf(fout, "Parallel port (DATA1? STROBE?)\n"); + fprintf(fout, "Parallel port (/STROBE)\n"); break; case RIG_DCD_SERIAL_CTS: fprintf(fout, "Serial port (CTS/RTS)\n"); @@ -152,6 +149,14 @@ switch (caps->port_type) { case RIG_PORT_SERIAL: fprintf(fout, "RS-232\n"); + fprintf(fout, "Serial speed: %d..%d bauds, %d%c%d %s\n", caps->serial_rate_min, + caps->serial_rate_max, caps->serial_data_bits, + caps->serial_parity == RIG_PARITY_NONE ? 'N': + (caps->serial_parity == RIG_PARITY_ODD ? 'O' : 'E'), + caps->serial_stop_bits, + caps->serial_handshake == RIG_HANDSHAKE_NONE ? "" : + (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? "XONXOFF" : "CTS/RTS") + ); break; case RIG_PORT_PARALLEL: fprintf(fout, "Parallel\n"); @@ -173,15 +178,6 @@ backend_warnings++; } - fprintf(fout, "Serial speed: %d..%d bauds, %d%c%d %s\n", caps->serial_rate_min, - caps->serial_rate_max, caps->serial_data_bits, - caps->serial_parity == RIG_PARITY_NONE ? 'N': - (caps->serial_parity == RIG_PARITY_ODD ? 'O' : 'E'), - caps->serial_stop_bits, - caps->serial_handshake == RIG_HANDSHAKE_NONE ? "" : - (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? "XONXOFF" : "CTS/RTS") - ); - fprintf(fout, "Write delay: %dms, timeout %dms, %d retry\n", caps->write_delay, caps->timeout, caps->retry); fprintf(fout, "Post Write delay: %dms\n", Modified: trunk/tests/dumpcaps_rot.c =================================================================== --- trunk/tests/dumpcaps_rot.c 2010-04-25 17:29:53 UTC (rev 2895) +++ trunk/tests/dumpcaps_rot.c 2010-04-25 17:30:52 UTC (rev 2896) @@ -1,11 +1,8 @@ /* - * dumpcaps_rot.c - Copyright (C) 2000-2009 Stephane Fillod + * dumpcaps_rot.c - Copyright (C) 2000-2010 Stephane Fillod * This programs dumps the capabilities of a backend rig. * * - * $Id: dumpcaps_rot.c,v 1.52 2009-01-28 22:49:58 fillods Exp $ - * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -79,6 +76,14 @@ switch (caps->port_type) { case RIG_PORT_SERIAL: fprintf(fout, "RS-232\n"); + fprintf(fout, "Serial speed:\t\t%d..%d bauds, %d%c%d%s\n", caps->serial_rate_min, + caps->serial_rate_max, caps->serial_data_bits, + caps->serial_parity == RIG_PARITY_NONE ? 'N': + (caps->serial_parity == RIG_PARITY_ODD ? 'O' : 'E'), + caps->serial_stop_bits, + caps->serial_handshake == RIG_HANDSHAKE_NONE ? "" : + (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? " XONXOFF" : " CTS/RTS") + ); break; case RIG_PORT_PARALLEL: fprintf(fout, "Parallel\n"); @@ -100,15 +105,6 @@ backend_warnings++; } - fprintf(fout, "Serial speed:\t\t%d..%d bauds, %d%c%d%s\n", caps->serial_rate_min, - caps->serial_rate_max, caps->serial_data_bits, - caps->serial_parity == RIG_PARITY_NONE ? 'N': - (caps->serial_parity == RIG_PARITY_ODD ? 'O' : 'E'), - caps->serial_stop_bits, - caps->serial_handshake == RIG_HANDSHAKE_NONE ? "" : - (caps->serial_handshake == RIG_HANDSHAKE_XONXOFF ? " XONXOFF" : " CTS/RTS") - ); - fprintf(fout, "Write delay:\t\t%dmS, timeout %dmS, %d retr%s\n", caps->write_delay, caps->timeout, caps->retry, (caps->retry == 1) ? "y" : "ies"); fprintf(fout, "Post Write delay:\t%dmS\n", This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2010-05-28 19:47:41
|
Revision: 2928 http://hamlib.svn.sourceforge.net/hamlib/?rev=2928&view=rev Author: fillods Date: 2010-05-28 19:47:35 +0000 (Fri, 28 May 2010) Log Message: ----------- - Tx VFO arg checking in set_split_vfo() - get/set channel improvements (stdout flushing, ext_levels, ..) Modified Paths: -------------- trunk/tests/rigctl_parse.c trunk/tests/rigctl_parse.h Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-05-28 14:36:52 UTC (rev 2927) +++ trunk/tests/rigctl_parse.c 2010-05-28 19:47:35 UTC (rev 2928) @@ -1076,9 +1076,13 @@ declare_proto_rig(set_split_vfo) { int split; + vfo_t tx_vfo; CHKSCN1ARG(sscanf(arg1, "%d", &split)); - return rig_set_split_vfo(rig, vfo, (split_t) split, rig_parse_vfo(arg2)); + tx_vfo = rig_parse_vfo(arg2); + if (tx_vfo == RIG_VFO_NONE) + return -RIG_EINVAL; + return rig_set_split_vfo(rig, vfo, (split_t) split, tx_vfo); } /* 's' */ @@ -1524,8 +1528,6 @@ int status; char s[16]; - rig_debug(RIG_DEBUG_TRACE, "set_channel: arg1[0] = %d\n", arg1[0]); - memset(&chan, 0, sizeof(channel_t)); if (isdigit(arg1[0])) { @@ -1543,149 +1545,150 @@ chan.channel_num = 0; /* TODO: mem_caps for VFO! */ + /* either from mem, or reverse computed from caps */ } if (!mem_caps) return -RIG_ECONF; - rig_debug(RIG_DEBUG_TRACE, "set_channel: mem_caps->bank_num = %d, mem_caps->freq = %d\n", mem_caps->bank_num, mem_caps->freq); - if (mem_caps->bank_num) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "Bank Num: "); + fprintf_flush(fout, "Bank Num: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.bank_num)); } +#if 0 if (mem_caps->vfo) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "vfo (VFOA,MEM,etc...): "); + fprintf_flush(fout, "vfo (VFOA,MEM,etc...): "); CHKSCN1ARG(scanfc(fin, "%s", s)); chan.vfo = rig_parse_vfo(s); } +#endif if (mem_caps->ant) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "ant: "); + fprintf_flush(fout, "ant: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.ant)); } if (mem_caps->freq) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "Frequency: "); + fprintf_flush(fout, "Frequency: "); CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.freq)); } if (mem_caps->mode) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "mode (FM,LSB,etc...): "); + fprintf_flush(fout, "mode (FM,LSB,etc...): "); CHKSCN1ARG(scanfc(fin, "%s", s)); chan.mode = rig_parse_mode(s); } if (mem_caps->width) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "width: "); + fprintf_flush(fout, "width: "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.width)); } if (mem_caps->tx_freq) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "tx freq (VFOA,MEM,etc...): "); + fprintf_flush(fout, "tx freq: "); CHKSCN1ARG(scanfc(fin, "%"SCNfreq, &chan.tx_freq)); } if (mem_caps->tx_mode) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "tx mode (FM,LSB,etc...): "); + fprintf_flush(fout, "tx mode (FM,LSB,etc...): "); CHKSCN1ARG(scanfc(fin, "%s", s)); chan.tx_mode = rig_parse_mode(s); } if (mem_caps->tx_width) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "tx width: "); + fprintf_flush(fout, "tx width: "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.tx_width)); } if (mem_caps->split) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "split (0,1): "); + fprintf_flush(fout, "split (0,1): "); CHKSCN1ARG(scanfc(fin, "%d", &status)); chan.split = status; } if (mem_caps->tx_vfo) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "tx vfo (VFOA,MEM,etc...): "); + fprintf_flush(fout, "tx vfo (VFOA,MEM,etc...): "); CHKSCN1ARG(scanfc(fin, "%s", s)); chan.tx_vfo = rig_parse_vfo(s); } if (mem_caps->rptr_shift) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "rptr shift (+-0): "); + fprintf_flush(fout, "rptr shift (+-0): "); CHKSCN1ARG(scanfc(fin, "%s", s)); chan.rptr_shift = rig_parse_rptr_shift(s); } if (mem_caps->rptr_offs) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "rptr offset: "); + fprintf_flush(fout, "rptr offset: "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.rptr_offs)); } if (mem_caps->tuning_step) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "tuning step: "); + fprintf_flush(fout, "tuning step: "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.tuning_step)); } if (mem_caps->rit) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "rit (Hz,0=off): "); + fprintf_flush(fout, "rit (Hz,0=off): "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.rit)); } if (mem_caps->xit) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "xit (Hz,0=off): "); + fprintf_flush(fout, "xit (Hz,0=off): "); CHKSCN1ARG(scanfc(fin, "%ld", &chan.xit)); } if (mem_caps->funcs) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "funcs: "); + fprintf_flush(fout, "funcs: "); CHKSCN1ARG(scanfc(fin, "%lx", &chan.funcs)); } #if 0 - /* for all levels, ask */ + /* for all levels (except READONLY), ask */ if (mem_caps->levels) sscanf(arg1, "%d", &chan.levels); #endif if (mem_caps->ctcss_tone) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "ctcss tone freq in tenth of Hz (0=off): "); + fprintf_flush(fout, "ctcss tone freq in tenth of Hz (0=off): "); CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_tone)); } if (mem_caps->ctcss_sql) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "ctcss sql freq in tenth of Hz (0=off): "); + fprintf_flush(fout, "ctcss sql freq in tenth of Hz (0=off): "); CHKSCN1ARG(scanfc(fin, "%d", &chan.ctcss_sql)); } if (mem_caps->dcs_code) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "dcs code: "); + fprintf_flush(fout, "dcs code: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_code)); } if (mem_caps->dcs_sql) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "dcs sql: "); + fprintf_flush(fout, "dcs sql: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.dcs_sql)); } if (mem_caps->scan_group) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "scan group: "); + fprintf_flush(fout, "scan group: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.scan_group)); } if (mem_caps->flags) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "flags: "); + fprintf_flush(fout, "flags: "); CHKSCN1ARG(scanfc(fin, "%d", &chan.flags)); } if (mem_caps->channel_desc) { if ((interactive && prompt) || (interactive && !prompt && ext_resp)) - fprintf(fout, "channel desc: "); + fprintf_flush(fout, "channel desc: "); CHKSCN1ARG(scanfc(fin, "%s", s)); strcpy(chan.channel_desc, s); } #if 0 - /* TODO: same as levels */ + /* TODO: same as levels, allocate/free the array */ if (mem_caps->ext_levels) - sscanf(arg1, "%d", &chan.ext_levels); + sscanf(arg1, "%d", &chan.ext_levels[i].val.i); #endif status = rig_set_channel(rig, &chan); @@ -1712,8 +1715,12 @@ status = rig_get_channel(rig, &chan); if (status != RIG_OK) return status; - dump_chan(fout, rig, &chan); + status = dump_chan(fout, rig, &chan); + + if (chan.ext_levels) + free(chan.ext_levels); + return status; } @@ -1802,8 +1809,7 @@ return RIG_OK; } - -void dump_chan(FILE *fout, RIG *rig, channel_t *chan) +int dump_chan(FILE *fout, RIG *rig, channel_t *chan) { int idx, firstloop=1; char freqbuf[16]; @@ -1854,7 +1860,7 @@ (!rig_has_set_level(rig, level) && !rig_has_get_level(rig, level))) continue; level_s = rig_strlevel(level); - if (!level_s) + if (!level_s || level_s[0] == '\0') continue; /* duh! */ if (firstloop) firstloop = 0; @@ -1865,7 +1871,40 @@ else fprintf(fout, " %s: %d", level_s, chan->levels[idx].i); } + + /* ext_levels */ + for (idx=0; chan->ext_levels && !RIG_IS_EXT_END(chan->ext_levels[idx]); idx++) { + const struct confparams *cfp; + char lstr[32]; + + cfp = rig_ext_lookup_tok(rig, chan->ext_levels[idx].token); + if (!cfp) + return -RIG_EINVAL; + + switch (cfp->type) { + case RIG_CONF_STRING: + strcpy(lstr, chan->ext_levels[idx].val.s); + break; + case RIG_CONF_COMBO: + sprintf(lstr, "%d", chan->ext_levels[idx].val.i); + break; + case RIG_CONF_NUMERIC: + sprintf(lstr, "%f", chan->ext_levels[idx].val.f); + break; + case RIG_CONF_CHECKBUTTON: + sprintf(lstr, "%s", chan->ext_levels[idx].val.i ? "ON" : "OFF"); + break; + case RIG_CONF_BUTTON: + continue; + default: + return -RIG_EINTERNAL; + } + fprintf(fout, ",\t %s: %s", cfp->name, lstr); + } + fprintf(fout, "\n"); + + return RIG_OK; } /* '1' */ Modified: trunk/tests/rigctl_parse.h =================================================================== --- trunk/tests/rigctl_parse.h 2010-05-28 14:36:52 UTC (rev 2927) +++ trunk/tests/rigctl_parse.h 2010-05-28 19:47:35 UTC (rev 2928) @@ -1,13 +1,11 @@ /* - * rigctl_parse.h - (C) Stephane Fillod 2000-2008 + * rigctl_parse.h - (C) Stephane Fillod 2000-2010 * * This program test/control a radio using Hamlib. * It takes commands in interactive mode as well as * from command line options. * - * $Id: rigctl_parse.h,v 1.3 2008-05-23 14:26:09 fillods Exp $ * - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 @@ -43,7 +41,7 @@ void usage_rig(FILE *); void version(); void list_models(); -void dump_chan(FILE *, RIG*, channel_t*); +int dump_chan(FILE *, RIG*, channel_t*); int print_conf_list(const struct confparams *cfp, rig_ptr_t data); int set_conf(RIG *my_rig, char *conf_parms); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <fi...@us...> - 2010-12-01 21:42:01
|
Revision: 3009 http://hamlib.svn.sourceforge.net/hamlib/?rev=3009&view=rev Author: fillods Date: 2010-12-01 21:41:55 +0000 (Wed, 01 Dec 2010) Log Message: ----------- Implement exit status according to manual page: 1 if there was an invalid command line option or argument; 2 if an error was returned by Hamlib. Modified Paths: -------------- trunk/tests/rigctl.c trunk/tests/rigctl_parse.c trunk/tests/rigctld.c trunk/tests/rotctl.c trunk/tests/rotctl_parse.c trunk/tests/rotctld.c Modified: trunk/tests/rigctl.c =================================================================== --- trunk/tests/rigctl.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rigctl.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -96,6 +96,7 @@ rig_model_t my_model = RIG_MODEL_DUMMY; int retcode; /* generic return code from functions */ + int exitcode; int verbose = 0; int show_conf = 0; @@ -320,15 +321,19 @@ rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rig->caps->version, rig_strstatus(my_rig->caps->status)); + exitcode = 0; + do { retcode = rigctl_parse(my_rig, stdin, stdout, argv, argc); + if (retcode == 2) + exitcode = 2; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_close(my_rig); /* close port */ rig_cleanup(my_rig); /* if you care about memory */ - return 0; + return exitcode; } Modified: trunk/tests/rigctl_parse.c =================================================================== --- trunk/tests/rigctl_parse.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rigctl_parse.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -406,7 +406,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } vfo = rig_parse_vfo(argv[optind++]); } @@ -430,7 +430,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -446,7 +446,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -462,7 +462,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p2 = argv[optind++]; } @@ -478,7 +478,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p3 = argv[optind++]; } @@ -493,7 +493,7 @@ #endif if (!prompt) - rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '0x%02x' '%s' '%s' '%s'\n", + rig_debug(RIG_DEBUG_TRACE, "rigctl(d): %c '%s' '%s' '%s' '%s'\n", cmd, rig_strvfo(vfo), p1?p1:"", p2?p2:"", p3?p3:""); /* @@ -554,7 +554,7 @@ fflush(fout); - return 0; + return retcode != RIG_OK ? 2 : 0; } @@ -1198,12 +1198,15 @@ } level = rig_parse_level(arg1); + if (RIG_LEVEL_NONE == level) + return -RIG_EINVAL; + if (!rig_has_set_level(rig, level)) { const struct confparams *cfp; cfp = rig_ext_lookup(rig, arg1); if (!cfp) - return -RIG_EINVAL; /* no such parameter */ + return -RIG_ENAVAIL; /* no such parameter */ switch (cfp->type) { case RIG_CONF_BUTTON: @@ -1248,6 +1251,9 @@ } level = rig_parse_level(arg1); + if (RIG_LEVEL_NONE == level) + return -RIG_EINVAL; + if (!rig_has_get_level(rig, level)) { const struct confparams *cfp; @@ -1310,6 +1316,9 @@ } func = rig_parse_func(arg1); + if (RIG_FUNC_NONE == func) + return -RIG_EINVAL; + CHKSCN1ARG(sscanf(arg2, "%d", &func_stat)); return rig_set_func(rig, vfo, func, func_stat); } @@ -1329,6 +1338,9 @@ } func = rig_parse_func(arg1); + if (RIG_FUNC_NONE == func) + return -RIG_EINVAL; + status = rig_get_func(rig, vfo, func, &func_stat); if (status != RIG_OK) return status; @@ -1353,6 +1365,8 @@ } parm = rig_parse_parm(arg1); + if (RIG_PARM_NONE == parm) + return -RIG_EINVAL; if (!rig_has_set_parm(rig, parm)) { const struct confparams *cfp; @@ -1404,6 +1418,9 @@ } parm = rig_parse_parm(arg1); + if (RIG_PARM_NONE == parm) + return -RIG_EINVAL; + if (!rig_has_get_parm(rig, parm)) { const struct confparams *cfp; @@ -1498,6 +1515,9 @@ } op = rig_parse_vfo_op(arg1); + if (RIG_OP_NONE == op) + return -RIG_EINVAL; + return rig_vfo_op(rig, vfo, op); } Modified: trunk/tests/rigctld.c =================================================================== --- trunk/tests/rigctld.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rigctld.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -479,7 +479,7 @@ if (ferror(fsockin) || ferror(fsockout)) retcode = 1; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%d\n", inet_ntoa(handle_data_arg->cli_addr.sin_addr), Modified: trunk/tests/rotctl.c =================================================================== --- trunk/tests/rotctl.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rotctl.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -81,6 +81,7 @@ rot_model_t my_model = ROT_MODEL_DUMMY; int retcode; /* generic return code from functions */ + int exitcode; int verbose = 0; int show_conf = 0; @@ -228,15 +229,19 @@ rig_debug(RIG_DEBUG_VERBOSE, "Backend version: %s, Status: %s\n", my_rot->caps->version, rig_strstatus(my_rot->caps->status)); + exitcode = 0; + do { retcode = rotctl_parse(my_rot, stdin, stdout, argv, argc); + if (retcode == 2) + exitcode = 2; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rot_close(my_rot); /* close port */ rot_cleanup(my_rot); /* if you care about memory */ - return 0; + return exitcode; } void usage() Modified: trunk/tests/rotctl_parse.c =================================================================== --- trunk/tests/rotctl_parse.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rotctl_parse.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -318,7 +318,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -333,7 +333,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p1 = argv[optind++]; } @@ -349,7 +349,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p2 = argv[optind++]; } @@ -365,7 +365,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p3 = argv[optind++]; } @@ -382,7 +382,7 @@ if (!argv[optind]) { fprintf(stderr, "Invalid arg for command '%s'\n", cmd_entry->name); - exit(2); + exit(1); } p4 = argv[optind++]; } @@ -457,7 +457,7 @@ fflush(fout); - return 0; + return retcode != RIG_OK ? 2 : 0; } Modified: trunk/tests/rotctld.c =================================================================== --- trunk/tests/rotctld.c 2010-11-29 21:56:05 UTC (rev 3008) +++ trunk/tests/rotctld.c 2010-12-01 21:41:55 UTC (rev 3009) @@ -394,7 +394,7 @@ if (ferror(fsockin) || ferror(fsockout)) retcode = 1; } - while (retcode == 0); + while (retcode == 0 || retcode == 2); rig_debug(RIG_DEBUG_VERBOSE, "Connection closed from %s:%d\n", inet_ntoa(handle_data_arg->cli_addr.sin_addr), This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |