Skip to content

Commit

Permalink
rig.swg: New properly formatted macro
Browse files Browse the repository at this point in the history
I made a patch, you can see in that there is the solution, which
describe the error: if a function in hamlib looks 3 argument
(rig, vfo, any 3rd arg), the order of the 2nd and 3rd argument
were reversed, because the macro METHOD1 reversed them.

I've collected these functions, compared its arguments with
hamlib docs (http://hamlib.sourceforge.net/manuals/1.2.15/), and
where 1st arg is rig, 2nd arg is vfo, and 3rd is any kind of
type, changed to METHOD3, which is a new macro, and keeps the
correct order of original function - see the patch. (I didn't
find any info about the expected diff format, so I just created
the `diff -uprN ORIG NEW'.)

To check my theory, I've tested with another function, which uses
vfo type at 2nd argument, eg. rig_set_freq; here is the Python
code:

  my_rig.set_freq(Hamlib.RIG_VFO_A, 7013200.0)

and the original code drop the exception:

    my_rig.set_freq(Hamlib.RIG_VFO_A, 7012500.0)
  File "/usr/local/lib/python2.7/dist-packages/Hamlib.py", line 2513, in
set_freq
    def set_freq(self, *args): return _Hamlib.Rig_set_freq(self, *args)
TypeError: in method 'Rig_set_freq', argument 3 of type 'vfo_t'

As you can see, it's same as my original error above.

So, after I patched the source and recompiled it again, these two
function works correctly - I will test it at soon, but I think
_this_ is good and stable.

Signed-off-by: Nate Bargmann <n0nb@n0nb.us>
  • Loading branch information
airween authored and N0NB committed Feb 13, 2013
1 parent 7e9f628 commit d9fc9c0
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 33 deletions.
10 changes: 0 additions & 10 deletions bindings/hamlib.swg
Expand Up @@ -64,14 +64,6 @@
%include <hamlib/rotlist.h>
%include <hamlib/rotator.h>

/* needed because rig.swg and rotator.swg macros require identifiers like arg (no spaces) */
%header %{
typedef char * char_string;
typedef const char * const_char_string;
typedef channel_t * channel_t_p;
typedef channel_t * const_channel_t_p;
%}

/*
* The Rig "class"
*/
Expand All @@ -90,5 +82,3 @@
%include "python.i"
%include "whatever.i"
*/


49 changes: 27 additions & 22 deletions bindings/rig.swg
Expand Up @@ -29,6 +29,11 @@ typedef struct Rig {
int do_exception;
} Rig;

typedef char * char_string;
typedef const char * const_char_string;
typedef channel_t * channel_t_p;
typedef channel_t * const_channel_t_p;

%}

%extend channel {
Expand All @@ -54,23 +59,24 @@ typedef struct Rig {
%array_class(tone_t, toneArray);

/*
* decalre wrapper method with one argument besides RIG* and optional no target vfo
* declare wrapper method with one argument besides RIG* and optional no target vfo
*/
#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); }
#define METHOD2_INIT(f, t1, t2, i2) void f (t1 _##t1##_1, t2 _##t2##_2 = i2 _VFO_DECL) \
{ self->error_status = rig_##f(self->rig _VFO_ARG, _##t1##_1, _##t2##_2); }

#define METHOD3(f, t1) void f ( vfo_t vfo, t1 _##t1) \
{ self->error_status = rig_##f(self->rig _VFO_ARG, _##t1); }
/*
* decalre wrapper method with one output argument besides RIG* (no target vfo)
* declare wrapper method with one output argument besides RIG* (no target vfo)
*/
#define METHOD1GET(f, t1) t1 f (void) \
{ t1 _##t1; self->error_status = rig_##f(self->rig, &_##t1); return _##t1; }

/*
* decalre wrapper method with one output argument besides RIG* and vfo
* declare wrapper method with one output argument besides RIG* and vfo
*/
#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; }
Expand Down Expand Up @@ -267,28 +273,28 @@ typedef struct Rig {
#define _VFO_ARG ,vfo
#define _VFO_DECL ,vfo_t vfo = RIG_VFO_CURR

METHOD1(set_freq, freq_t)
METHOD3(set_freq, freq_t)
METHOD2_INIT(set_mode, rmode_t, pbwidth_t, RIG_PASSBAND_NORMAL)
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)
METHOD3(set_ptt, ptt_t)
METHOD3(set_rptr_shift, rptr_shift_t)
METHOD3(set_rptr_offs, shortfreq_t)
METHOD3(set_ctcss_tone, tone_t)
METHOD3(set_dcs_code, tone_t)
METHOD3(set_ctcss_sql, tone_t)
METHOD1(set_dcs_sql, tone_t)
METHOD1(set_split_freq, freq_t)
METHOD3(set_split_freq, freq_t)
METHOD2_INIT(set_split_mode, rmode_t, pbwidth_t, RIG_PASSBAND_NORMAL)
METHOD2(set_split_vfo, split_t, vfo_t)
METHOD1(set_rit, shortfreq_t)
METHOD1(set_xit, shortfreq_t)
METHOD1(set_ts, shortfreq_t)
METHOD1(set_ant, ant_t)
METHOD3(set_rit, shortfreq_t)
METHOD3(set_xit, shortfreq_t)
METHOD3(set_ts, shortfreq_t)
METHOD3(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)
METHOD3(set_bank, int)
METHOD3(set_mem, int)
METHOD3(send_dtmf, const_char_string)
METHOD3(send_morse, const_char_string)
METHOD3(vfo_op, vfo_op_t)
METHOD2(scan, scan_t, int)
METHODSIMPLESET(level, int, i, RIG_LEVEL_IS_FLOAT(stg))
METHODSIMPLESET(level, float, f, !RIG_LEVEL_IS_FLOAT(stg))
Expand Down Expand Up @@ -521,4 +527,3 @@ struct channel *Rig_get_chan_all(Rig *self)
}

%}

4 changes: 3 additions & 1 deletion bindings/rotator.swg
Expand Up @@ -29,10 +29,12 @@ typedef struct Rot {
int do_exception;
} Rot;

typedef const char * const_char_string;

%}

/*
* decalre wrapper method with 0,1,2 arguments besides ROT*
* declare wrapper method with 0,1,2 arguments besides ROT*
*/
#define ROTMETHOD0(f) void f () \
{ self->error_status = rot_##f(self->rot); }
Expand Down

0 comments on commit d9fc9c0

Please sign in to comment.