From 03160aa72f69463b5989bb020c4565f046f6d445 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Fillod=2C=20F8CFE?= Date: Mon, 7 Oct 2002 21:44:51 +0000 Subject: [PATCH] more work on swig bindings, nearly every calls supported, some chan wrapping missing, and also lists git-svn-id: https://hamlib.svn.sourceforge.net/svnroot/hamlib/trunk@1200 7ae35d74-ebe9-4afe-98af-79ac388436b8 --- bindings/Makefile.am | 6 +- bindings/hamlib.swg | 5 +- bindings/ignore.swg | 103 +++++++++++++ bindings/perltest.pl | 48 ++++++- bindings/rig.swg | 336 ++++++++++++++++++++++++++++++++++--------- bindings/rotator.swg | 48 ++++++- bindings/tcltest.tcl | 32 ++++- 7 files changed, 496 insertions(+), 82 deletions(-) diff --git a/bindings/Makefile.am b/bindings/Makefile.am index c88692b27..9ec8ff79a 100644 --- a/bindings/Makefile.am +++ b/bindings/Makefile.am @@ -2,12 +2,14 @@ # hamlibtcl, hamlibperl, etc. are temproray modules names # They will be generated in separate subdirs in the future +# more information on swig at http://www.swig.org #lib_LTLIBRARIES = @BINDING_LA@ #EXTRA_LTLIBRARIES = hamlibperl.la hamlibtcl.la lib_LTLIBRARIES = hamlibperl.la hamlibtcl.la -INCLUDES = @INCLUDES@ -Dbool=char -I/usr/lib/perl/5.6.1/CORE -I@TCL_SRC_DIR@/generic + +INCLUDES = @INCLUDES@ -Dbool=char -I@PERL_INC_DIR@ -I@TCL_SRC_DIR@/generic # Perl binding #hamlibperl_la_INCLUDES = @INCLUDES@ -Dbool=char -I/usr/lib/perl/5.6.1/CORE @@ -30,7 +32,6 @@ hamlibtcl_la_LIBADD = ../src/libhamlib.la hamlibtcl_wrap.c: hamlib.swg swig -tcl @INCLUDES@ -o $@ $< - rig.swg: ../include/hamlib/rig.h ../include/hamlib/riglist.h rotator.swg: ../include/hamlib/rotator.h ../include/hamlib/rotlist.h @@ -39,3 +40,4 @@ hamlib.swg: ignore.swg rig.swg rotator.swg EXTRA_DIST = hamlib.swg ignore.swg rig.swg rotator.swg CLEANFILES = hamlibperl_wrap.c hamlib.pm hamlibtcl_wrap.c + diff --git a/bindings/hamlib.swg b/bindings/hamlib.swg index 4361c3004..d509a8f35 100644 --- a/bindings/hamlib.swg +++ b/bindings/hamlib.swg @@ -6,7 +6,7 @@ * Hamlib bindings - swig interface file * Copyright (c) 2001,2002 by Stephane Fillod * - * $Id: hamlib.swg,v 1.2 2002-09-16 06:50:13 fillods Exp $ + * $Id: hamlib.swg,v 1.3 2002-10-07 21:44:51 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -30,6 +30,9 @@ #include #include +#include "misc.h" + +#include %} /* diff --git a/bindings/ignore.swg b/bindings/ignore.swg index 2b95775ca..31eb6a1e3 100644 --- a/bindings/ignore.swg +++ b/bindings/ignore.swg @@ -46,3 +46,106 @@ %ignore RIG_BACKEND_RPC; %ignore RIG_GNURADIO; %ignore RIG_BACKEND_GNURADIO; + +%ignore rig_open; +%ignore rig_set_freq; +%ignore rig_get_freq; +%ignore rig_set_mode; +%ignore rig_get_mode; +%ignore rig_set_vfo; +%ignore rig_get_vfo; +%ignore rig_set_ptt; +%ignore rig_get_ptt; +%ignore rig_get_dcd; +%ignore rig_set_rptr_shift; +%ignore rig_get_rptr_shift; +%ignore rig_set_rptr_offs; +%ignore rig_get_rptr_offs; +%ignore rig_set_ctcss_tone; +%ignore rig_get_ctcss_tone; +%ignore rig_set_dcs_code; +%ignore rig_get_dcs_code; +%ignore rig_set_ctcss_sql; +%ignore rig_get_ctcss_sql; +%ignore rig_set_dcs_sql; +%ignore rig_get_dcs_sql; +%ignore rig_set_split_freq; +%ignore rig_get_split_freq; +%ignore rig_set_split_mode; +%ignore rig_get_split_mode; +%ignore rig_set_split; +%ignore rig_get_split; +%ignore rig_set_rit; +%ignore rig_get_rit; +%ignore rig_set_xit; +%ignore rig_get_xit; +%ignore rig_set_ts; +%ignore rig_get_ts; +%ignore rig_power2mW; +%ignore rig_mW2power; +%ignore rig_get_resolution; +%ignore rig_set_level; +%ignore rig_get_level; +%ignore rig_set_parm; +%ignore rig_get_parm; +%ignore rig_set_conf; +%ignore rig_get_conf; +%ignore rig_set_powerstat; +%ignore rig_get_powerstat; +%ignore rig_reset; +%ignore rig_set_ext_level; +%ignore rig_get_ext_level; +%ignore rig_set_ext_parm; +%ignore rig_get_ext_parm; +%ignore rig_ext_level_foreach; +%ignore rig_ext_parm_foreach; +%ignore rig_token_lookup; +%ignore rig_close; +%ignore rig_cleanup; +%ignore rig_probe; +%ignore rig_set_ant; +%ignore rig_get_ant; +%ignore rig_has_get_level; +%ignore rig_has_set_level; +%ignore rig_has_get_parm; +%ignore rig_has_set_parm; +%ignore rig_has_get_func; +%ignore rig_has_set_func; +%ignore rig_set_func; +%ignore rig_get_func; +%ignore rig_send_dtmf; +%ignore rig_recv_dtmf; +%ignore rig_send_morse; +%ignore rig_set_bank; +%ignore rig_set_mem; +%ignore rig_get_mem; +%ignore rig_vfo_op; +%ignore rig_has_vfo_op; +%ignore rig_scan; +%ignore rig_has_scan; +%ignore rig_set_channel; +%ignore rig_get_channel; +%ignore rig_set_trn; +%ignore rig_get_trn; +%ignore rig_set_freq_callback; +%ignore rig_set_mode_callback; +%ignore rig_set_vfo_callback; +%ignore rig_set_ptt_callback; +%ignore rig_set_dcd_callback; +%ignore rig_get_info; +%ignore rig_passband_normal; +%ignore rig_passband_narrow; +%ignore rig_passband_wide; + +%ignore rot_open; +%ignore rot_close; +%ignore rot_cleanup; +%ignore rot_set_conf; +%ignore rot_get_conf; +%ignore rot_set_position; +%ignore rot_get_position; +%ignore rot_stop; +%ignore rot_park; +%ignore rot_reset; +%ignore rot_move; +%ignore rot_get_info; diff --git a/bindings/perltest.pl b/bindings/perltest.pl index e4455158a..6e6ba49e9 100755 --- a/bindings/perltest.pl +++ b/bindings/perltest.pl @@ -6,14 +6,60 @@ use hamlib; print "Version: $hamlib::hamlib_version\n"; print "FM: $hamlib::RIG_MODE_FM\n"; -hamlib::rig_set_debug(5); +hamlib::rig_set_debug($hamlib::RIG_DEBUG_TRACE); $rig = new hamlib::Rig($hamlib::RIG_MODEL_DUMMY); $rig->open(); +$rpath = $rig->get_conf("rig_pathname"); +$region = $rig->get_conf(1073741944); +print "get_conf: path=\"$rpath\", ITU region=$region\n"; + + $rig->set_freq(12000000, $hamlib::RIG_VFO_A); +$f = $rig->get_freq(); +print "freq: $f\n"; + +($mode, $width) = $rig->get_mode(); + +print "mode: $mode, width: $width\n"; + print "ITU region: $rig->{state}->{itu_region}\n"; print "Copyright: $rig->{caps}->{copyright}\n"; +$inf = $rig->get_info(); + +print "get_info: $inf\n"; + +$rig->set_level("VOX", 1); +$lvl = $rig->get_level_i("VOX"); +print "level: $lvl\n"; +$rig->set_level($hamlib::RIG_LEVEL_VOX, 5); +$lvl = $rig->get_level_i($hamlib::RIG_LEVEL_VOX); +print "level: $lvl\n"; + + + +$chan = new hamlib::Chan($hamlib::RIG_VFO_A); + +$rig->get_channel(\$chan); + +print "VFO: $chan->{fields}->{vfo}, $chan->{fields}->{freq}\n"; $rig->close(); + +($long1, $lat1) = locator2longlat("IN98EC"); +($long2, $lat2) = locator2longlat("DM33DX"); +$loc1 = longlat2locator($long1, $lat1); +$loc2 = longlat2locator($long2, $lat2); +print "Loc1: $loc1\n"; +print "Loc2: $loc2\n"; + +($dist, $az) = qrb($long1, $lat1, $long2, $lat2); +$longpath = distance_long_path($dist); +print "Distance: $dist km, long path: $longpath\n"; +($deg, $min, $sec) = dec2dms($az); +$az2 = dms2dec($deg, $min, $sec); +print "Bearing: $az, $deg° $min' $sec\", recoded: $az2\n" + + diff --git a/bindings/rig.swg b/bindings/rig.swg index 9e3e93070..8acbc05ef 100644 --- a/bindings/rig.swg +++ b/bindings/rig.swg @@ -2,7 +2,7 @@ * Hamlib bindings - Rig interface * Copyright (c) 2001,2002 by Stephane Fillod * - * $Id: rig.swg,v 1.2 2002-09-16 06:50:13 fillods Exp $ + * $Id: rig.swg,v 1.3 2002-10-07 21:44:51 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -32,24 +32,15 @@ typedef struct Rig { %} +#define MAX_STATIC 256 /* - * decalre wrapper method with one argument besides RIG* (no target vfo) + * decalre wrapper method with one argument besides RIG* and optional no target vfo */ -#define METHOD1(f, t1) void f (t1 _##t1) \ - { self->error_status = rig_##f(self->rig, _##t1); } -#define METHOD2(f, t1, t2) void f (t1 _##t1##_1, t2 _##t2##_2) \ - { self->error_status = rig_##f(self->rig, _##t1##_1, _##t2##_2); } -/* - * decalre wrapper method with one argument besides RIG* and vfo - */ -#define METHOD1V(f, t1) void f (t1 _##t1, vfo_t vfo = RIG_VFO_CURR) \ - { self->error_status = rig_##f(self->rig, vfo, _##t1); } -/* - * decalre wrapper method with two arguments besides RIG* and vfo - */ -#define METHOD2V(f, t1, t2) void f (t1 _##t1##_1, t2 _##t2##_2, vfo_t vfo = RIG_VFO_CURR) \ - { self->error_status = rig_##f(self->rig, vfo, _##t1##_1, _##t2##_2); } +#define METHOD1(f, t1) void f (t1 _##t1 _VFO_DECL) \ + { self->error_status = rig_##f(self->rig _VFO_ARG, _##t1); } +#define METHOD2(f, t1, t2) void f (t1 _##t1##_1, t2 _##t2##_2 _VFO_DECL) \ + { self->error_status = rig_##f(self->rig _VFO_ARG, _##t1##_1, _##t2##_2); } /* * decalre wrapper method with one output argument besides RIG* (no target vfo) @@ -63,6 +54,142 @@ typedef struct Rig { #define METHOD1VGET(f, t1) t1 f (vfo_t vfo = RIG_VFO_CURR) \ { t1 _##t1; self->error_status = rig_##f(self->rig, vfo, &_##t1); return _##t1; } + +#define METHODSIMPLESET(f, t1, fld, chk) void set_##f (setting_t stg, t1 fld _VFO_DECL) \ + { value_t val; if (chk (stg)) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return; \ + } \ + val.fld = fld; \ + self->error_status = rig_set_##f(self->rig _VFO_ARG , stg, val); \ + } + +/* + * RIG_CONF_ extparm's type: + * NUMERIC: val.f + * COMBO: val.i, starting from 0 + * STRING: val.s + * CHECKBUTTON: val.i 0/1 + */ + +#define METHODSUPERSET(f, t1, fld, chk) void set_##f (const char *name, t1 fld _VFO_DECL) \ + { setting_t stg; value_t val; \ + stg = parse_##f(name); \ + if (!rig_has_set_##f(self->rig, stg)) { \ + const struct confparams *cfp; \ + cfp = rig_ext_lookup(self->rig, name); \ + if (!cfp) { \ + self->error_status = -RIG_EINVAL; /* no such parameter */ \ + return; \ + } \ + switch (cfp->type) { \ + case RIG_CONF_NUMERIC: \ + val.fld = fld; \ + break; \ + case RIG_CONF_CHECKBUTTON: \ + case RIG_CONF_COMBO: \ + val.i = (int)fld; \ + break; \ + case RIG_CONF_STRING: \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return; \ + default: \ + self->error_status = -RIG_ECONF; \ + return; \ + } \ + self->error_status = rig_set_ext_##f(self->rig _VFO_ARG, cfp->token, val); \ + return; \ + } \ + if (chk (stg)) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return; \ + } \ + val.fld = fld; \ + self->error_status = rig_set_##f(self->rig _VFO_ARG , stg, val); \ + } + +#define METHODSTRSET(f) void set_##f (const char *name, const char *s _VFO_DECL) \ + { value_t val; /* only ext_level/parm's can have string values */ \ + const struct confparams *cfp; \ + cfp = rig_ext_lookup(self->rig, name); \ + if (!cfp) { \ + self->error_status = -RIG_EINVAL; /* no such parameter */ \ + return; \ + } \ + if (cfp->type != RIG_CONF_STRING) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return; \ + } \ + val.cs = s; \ + self->error_status = rig_set_ext_##f(self->rig _VFO_ARG, cfp->token, val); \ + } + +#define METHODSIMPLEGET(f, t1, fld, chk) t1 get_##f##_##fld (setting_t stg _VFO_DECL) \ + { value_t val; if (chk (stg)) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return val.fld; /* undefined value */ \ + } \ + self->error_status = rig_get_##f(self->rig _VFO_ARG , stg, &val); \ + return val.fld; \ + } + + + +#define METHODSUPERGET(fct, t1, fld, chk) t1 get_##fct##_##fld(const char *name _VFO_DECL) \ + { setting_t stg; value_t val; \ + stg = parse_##fct(name); \ + if (!rig_has_get_##fct(self->rig, stg)) { \ + const struct confparams *cfp; \ + cfp = rig_ext_lookup(self->rig, name); \ + if (!cfp) { \ + self->error_status = -RIG_EINVAL; /* no such parameter */ \ + return val.fld; /* undefined */ \ + } \ + if (cfp->type == RIG_CONF_STRING) { \ + self->error_status = -RIG_EINVAL; \ + return val.fld; /* undefined */ \ + } \ + self->error_status = rig_get_ext_##fct(self->rig _VFO_ARG, cfp->token, &val); \ + switch (cfp->type) { \ + case RIG_CONF_NUMERIC: \ + return (t1)val.f; \ + case RIG_CONF_CHECKBUTTON: \ + case RIG_CONF_COMBO: \ + return (t1)val.i; \ + default: \ + self->error_status = -RIG_ECONF; \ + return val.fld; /* undefined */ \ + } \ + } \ + if (chk (stg)) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return val.fld; /* undefined */ \ + } \ + self->error_status = rig_get_##fct(self->rig _VFO_ARG , stg, &val); \ + return val.fld; \ + } + +#define METHODSTRGET(f) const char * get_##f (const char *name _VFO_DECL) \ + { static char s[MAX_STATIC]=""; value_t val; /* only ext_level/parm's can have string values */ \ + const struct confparams *cfp; \ + cfp = rig_ext_lookup(self->rig, name); \ + if (!cfp) { \ + self->error_status = -RIG_EINVAL; /* no such parameter */ \ + return ""; \ + } \ + if (cfp->type != RIG_CONF_STRING) { \ + self->error_status = -RIG_EINVAL; /* invalid type */ \ + return ""; \ + } \ + val.s = s; \ + self->error_status = rig_get_ext_##f(self->rig _VFO_ARG, cfp->token, &val); \ + return val.s; \ + } + + +/* + * Rig class alike + */ %extend Rig { Rig(rig_model_t rig_model) { Rig *r; @@ -103,27 +230,57 @@ typedef struct Rig { void close () { self->error_status = rig_close(self->rig); } - /* set methods */ - METHOD1V(set_freq, freq_t) - METHOD2V(set_mode, rmode_t, pbwidth_t) - METHOD1(set_vfo, vfo_t) - METHOD1V(set_ptt, ptt_t) - METHOD1V(set_rptr_shift, rptr_shift_t) - METHOD1V(set_rptr_offs, shortfreq_t) - METHOD1V(set_ctcss_tone, tone_t) - METHOD1V(set_dcs_code, tone_t) - METHOD1V(set_ctcss_sql, tone_t) - METHOD1V(set_dcs_sql, tone_t) - METHOD1V(set_split_freq, freq_t) - METHOD2V(set_split_mode, rmode_t, pbwidth_t) - METHOD1V(set_split, split_t) - METHOD1V(set_rit, shortfreq_t) - METHOD1V(set_xit, shortfreq_t) - METHOD1V(set_ts, shortfreq_t) - METHOD1V(set_ant, ant_t) - METHOD2V(set_func, setting_t, int) - METHOD1V(set_bank, int) - METHOD1V(set_mem, int) + + /* + * group all vfo, and non vfo apart + */ +#define _VFO_ARG ,vfo +#define _VFO_DECL ,vfo_t vfo = RIG_VFO_CURR + + METHOD1(set_freq, freq_t) + METHOD2(set_mode, rmode_t, pbwidth_t) + METHOD1(set_ptt, ptt_t) + METHOD1(set_rptr_shift, rptr_shift_t) + METHOD1(set_rptr_offs, shortfreq_t) + METHOD1(set_ctcss_tone, tone_t) + METHOD1(set_dcs_code, tone_t) + METHOD1(set_ctcss_sql, tone_t) + METHOD1(set_dcs_sql, tone_t) + METHOD1(set_split_freq, freq_t) + METHOD2(set_split_mode, rmode_t, pbwidth_t) + METHOD1(set_split, split_t) + METHOD1(set_rit, shortfreq_t) + METHOD1(set_xit, shortfreq_t) + METHOD1(set_ts, shortfreq_t) + METHOD1(set_ant, ant_t) + METHOD2(set_func, setting_t, int) + METHOD1(set_bank, int) + METHOD1(set_mem, int) + METHOD1(send_dtmf, const_char_string) + METHOD1(send_morse, const_char_string) + METHOD1(vfo_op, vfo_op_t) + METHOD2(scan, scan_t, int) + METHODSIMPLESET(level, int, i, RIG_LEVEL_IS_FLOAT) + METHODSIMPLESET(level, float, f, !RIG_LEVEL_IS_FLOAT) + METHODSUPERSET(level, int, i, RIG_LEVEL_IS_FLOAT) + METHODSUPERSET(level, float, f, !RIG_LEVEL_IS_FLOAT) + METHODSTRSET(level) + METHOD2(set_ext_level, token_t, value_t) + + METHODSIMPLEGET(level, int, i, RIG_LEVEL_IS_FLOAT) + METHODSIMPLEGET(level, float, f, !RIG_LEVEL_IS_FLOAT) + METHODSUPERGET(level, int, i, RIG_LEVEL_IS_FLOAT) + METHODSUPERGET(level, float, f, !RIG_LEVEL_IS_FLOAT) + METHODSTRGET(level) + + /* + * these ones do not take a vfo arg + */ +#undef _VFO_ARG +#undef _VFO_DECL +#define _VFO_ARG +#define _VFO_DECL + METHOD1(set_vfo, vfo_t) /* particular case */ METHOD1(set_powerstat, powerstat_t) METHOD1(set_channel, const_channel_t_p) METHOD1(set_trn, int) @@ -131,10 +288,6 @@ typedef struct Rig { METHOD1(has_set_parm, setting_t) METHOD1(has_set_func, setting_t) METHOD1(reset, reset_t) - METHOD1V(send_dtmf, const_char_string) - METHOD1V(send_morse, const_char_string) - METHOD1V(vfo_op, vfo_op_t) - METHOD2V(scan, scan_t, int) METHOD1(has_scan, scan_t) METHOD1(has_vfo_op, vfo_op_t) METHOD1(passband_normal, rmode_t) @@ -144,33 +297,36 @@ typedef struct Rig { METHOD1(ext_token_lookup, const_char_string) /* level & parm */ METHOD1(token_lookup, const_char_string) /* conf */ - void set_conf_s(const char *name, const char *val) { - token_t tok = rig_token_lookup(self->rig, name); - /* FIXME: token not found */ - self->error_status = rig_set_conf(self->rig, tok, val); - } - void set_ext_parm_s(const char *name, value_t val) { - token_t tok = rig_ext_token_lookup(self->rig, name); - /* FIXME: token not found */ - self->error_status = rig_set_ext_parm(self->rig, tok, val); - } - void set_ext_level_s(const char *name, value_t val, vfo_t vfo = RIG_VFO_CURR) { - token_t tok = rig_ext_token_lookup(self->rig, name); - /* FIXME: token not found */ - self->error_status = rig_set_ext_level(self->rig, vfo, tok, val); - } - METHOD2(set_conf, token_t, const_char_string) METHOD2(set_ext_parm, token_t, value_t) - METHOD2V(set_ext_level, token_t, value_t) + + METHODSIMPLESET(parm, int, i, RIG_PARM_IS_FLOAT) + METHODSIMPLESET(parm, float, f, !RIG_PARM_IS_FLOAT) + METHODSUPERSET(parm, int, i, RIG_PARM_IS_FLOAT) + METHODSUPERSET(parm, float, f, !RIG_PARM_IS_FLOAT) + METHODSTRSET(parm) + + METHODSIMPLEGET(parm, int, i, RIG_PARM_IS_FLOAT) + METHODSIMPLEGET(parm, float, f, !RIG_PARM_IS_FLOAT) + METHODSUPERGET(parm, int, i, RIG_PARM_IS_FLOAT) + METHODSUPERGET(parm, float, f, !RIG_PARM_IS_FLOAT) + METHODSTRGET(parm) + /* TODO: get rid of value_t, use dynamic casting */ - METHOD2V(set_level, setting_t, value_t) - METHOD2(set_parm, setting_t, value_t) + void set_conf(const char *name, const char *val) { + token_t tok = rig_token_lookup(self->rig, name); + if (tok == RIG_CONF_END) + self->error_status = -RIG_EINVAL; + else + self->error_status = rig_set_conf(self->rig, tok, val); + } + + /* TODO: get_ext_parm_list, level, conf, .. */ - /* TODO: all the get functions */ + /* get functions */ METHOD1VGET(get_freq, freq_t) extern void get_mode(rmode_t *OUTPUT, pbwidth_t *OUTPUT, vfo_t vfo = RIG_VFO_CURR); @@ -191,14 +347,54 @@ typedef struct Rig { METHOD1VGET(get_ant, ant_t) METHOD1VGET(get_mem, int) METHOD1GET(get_powerstat, powerstat_t) - //METHOD2GET(get_parm, setting_t, value_t) - //METHOD1GET(get_channel, channel_t) /* special input/output */ METHOD1GET(get_trn, int) - // METHOD1V(recv_dtmf, char_string, int *length) - //METHOD2GET(get_conf, token_t, const_char_string) + + //METHOD2GET(get_ext_parm, token_t, value_t) - //METHOD2VGET(get_ext_level, token_t, value_t) - //METHOD1GET(get_info, const_char_string) + + + /* get_channel() returns current VFO data + * get_channel(10) returns content of memory #10 + * get_channel(0, RIG_VFO_A) returns VFO A data + */ + const channel_t *get_channel(int channel_num = INT_MAX, vfo_t vfo = RIG_VFO_MEM) { + static channel_t chan; + chan.channel_num = channel_num; + chan.vfo = channel_num != INT_MAX ? vfo : RIG_VFO_CURR; + self->error_status = rig_get_channel(self->rig, &chan); + /* TODO: copy ext_level's */ + return &chan; + } + + const char *get_conf(token_t tok) { + static char s[MAX_STATIC] = ""; + self->error_status = rig_get_conf(self->rig, tok, s); + return s; + } + + const char *get_conf(const char *name) { + token_t tok = rig_token_lookup(self->rig, name); + static char s[MAX_STATIC] = ""; + if (tok == RIG_CONF_END) + self->error_status = -RIG_EINVAL; + else + self->error_status = rig_get_conf(self->rig, tok, s); + return s; + } + + const char *recv_dtmf(vfo_t vfo = RIG_VFO_CURR) { + static char s[64]; + int len = sizeof(s)-1; + self->error_status = rig_recv_dtmf(self->rig, vfo, s, &len); + s[len] = '\0'; + return s; + } + const char * get_info(void) { + const char *s; + s = rig_get_info(self->rig); + self->error_status = s ? RIG_OK : -RIG_EINVAL; + return s; + } int get_func(setting_t func, vfo_t vfo = RIG_VFO_CURR) { int status; @@ -206,14 +402,15 @@ typedef struct Rig { return status; } + + #ifndef SWIGJAVA void get_level(setting_t level, vfo_t vfo = RIG_VFO_CURR) { value_t val; self->error_status = rig_get_level(self->rig, vfo, level, &val); //if (RIG_LEVEL_IS_FLOAT(level)) /* TODO: dynamic casting */ } -#else - /* TODO */ + /* TODO also: get_parm */ #endif }; @@ -234,3 +431,4 @@ void Rig_get_split_mode(Rig *self, rmode_t *mode, pbwidth_t *width, vfo_t vfo) } %} + diff --git a/bindings/rotator.swg b/bindings/rotator.swg index ba3708167..d47372620 100644 --- a/bindings/rotator.swg +++ b/bindings/rotator.swg @@ -2,7 +2,7 @@ * Hamlib bindings - Rotator interface * Copyright (c) 2001,2002 by Stephane Fillod * - * $Id: rotator.swg,v 1.2 2002-09-16 06:50:13 fillods Exp $ + * $Id: rotator.swg,v 1.3 2002-10-07 21:44:51 fillods Exp $ * * This library is free software; you can redistribute it and/or modify * it under the terms of the GNU Library General Public License as @@ -80,6 +80,7 @@ typedef struct Rot { ROTMETHOD0(close) ROTMETHOD2(set_position, azimuth_t, elevation_t) + extern void get_position(azimuth_t *OUTPUT, elevation_t *OUTPUT); ROTMETHOD0(stop) ROTMETHOD0(park) ROTMETHOD1(reset, rot_reset_t) @@ -87,16 +88,51 @@ typedef struct Rot { ROTMETHOD1(token_lookup, const_char_string) /* conf */ - void set_conf_s(const char *name, const char *val) { + void set_conf(const char *name, const char *val) { token_t tok = rot_token_lookup(self->rot, name); - /* FIXME: token not found */ - self->error_status = rot_set_conf(self->rot, tok, val); + if (tok == RIG_CONF_END) + self->error_status = -RIG_EINVAL; + else + self->error_status = rot_set_conf(self->rot, tok, val); } ROTMETHOD2(set_conf, token_t, const_char_string) - /* TODO: get_ext_parm_list, level, conf, .. */ + const char *get_conf(token_t tok) { + static char s[128] = ""; + self->error_status = rot_get_conf(self->rot, tok, s); + return s; + } - /* TODO: all the get functions */ + const char *get_conf(const char *name) { + token_t tok = rot_token_lookup(self->rot, name); + static char s[128] = ""; + if (tok == RIG_CONF_END) + self->error_status = -RIG_EINVAL; + else + self->error_status = rot_get_conf(self->rot, tok, s); + return s; + } + + const char * get_info(void) { + const char *s; + s = rot_get_info(self->rot); + self->error_status = s ? RIG_OK : -RIG_EINVAL; + return s; + } + + /* TODO: get_conf_list, .. */ }; +%{ + +/* + * this one returns 2 values, here is a perl example: + * ($az, $elevation) = $rig->get_position(); + */ +void Rot_get_position(Rot *self, azimuth_t *azimuth, elevation_t *elevation) +{ + self->error_status = rot_get_position(self->rot, azimuth, elevation); +} + +%} diff --git a/bindings/tcltest.tcl b/bindings/tcltest.tcl index b9fb6a936..af0afac24 100755 --- a/bindings/tcltest.tcl +++ b/bindings/tcltest.tcl @@ -6,16 +6,42 @@ load ".libs/hamlibtcl.so" Hamlib puts $hamlib_version\n +rig_set_debug $RIG_DEBUG_TRACE + # Init RIG_MODEL_DUMMY Rig my_rig $RIG_MODEL_DUMMY my_rig open my_rig set_freq 145550000 -# note: get_level may not be implemented yet! -puts [my_rig get_level $RIG_LEVEL_STRENGTH] +puts status:[my_rig cget -error_status] + +set mode [my_rig get_mode] +puts "mode:[lindex $mode 0], bandwidth:[lindex $mode 1]Hz (0=normal)" + +set state [my_rig cget -state] +puts ITU_region:[$state cget -itu_region] + +# The following works well also +# puts ITU_region:[[my_rig cget -state] cget -itu_region] + +puts getinfo:[my_rig get_info] + +my_rig set_level "VOX" 1 +puts status:[my_rig cget -error_status] +puts level:[my_rig get_level_i "VOX"] +puts status:[my_rig cget -error_status] +my_rig set_level $RIG_LEVEL_VOX 5 +puts status:[my_rig cget -error_status] +puts level:[my_rig get_level_i $RIG_LEVEL_VOX] +puts status:[my_rig cget -error_status] + +puts str:[my_rig get_level_i $RIG_LEVEL_STRENGTH] +puts status:[my_rig cget -error_status] +puts status(str):[rigerror [my_rig cget -error_status]] + my_rig close -my_rig cleanup +#my_rig cleanup exit 0