From 6b74097642353500f965bdc024c76051c090b4f4 Mon Sep 17 00:00:00 2001 From: daniel Date: Fri, 11 Jan 2013 20:37:30 +0900 Subject: The perl interface is cleaner at least. Need to work out how to get the call back working --- libvxi11client/Makefile | 5 +- libvxi11client/perlbits/Client.xs | 140 +++++++++++++++++++++++++++++++++ libvxi11client/perlbits/VXI11-Client.t | 32 ++++---- libvxi11client/perlbits/perlglue.c | 23 ++++++ libvxi11client/perlbits/perlglue.h | 5 ++ libvxi11client/perlglue.c | 73 ----------------- libvxi11client/perlglue.h | 17 ---- 7 files changed, 187 insertions(+), 108 deletions(-) create mode 100644 libvxi11client/perlbits/Client.xs create mode 100644 libvxi11client/perlbits/perlglue.c create mode 100644 libvxi11client/perlbits/perlglue.h delete mode 100644 libvxi11client/perlglue.c delete mode 100644 libvxi11client/perlglue.h (limited to 'libvxi11client') diff --git a/libvxi11client/Makefile b/libvxi11client/Makefile index 2da0a08..304e180 100644 --- a/libvxi11client/Makefile +++ b/libvxi11client/Makefile @@ -26,9 +26,10 @@ clean: perl: -rm -rf VXI11-Client - h2xs -A -x -n VXI11::Client perlglue.h + h2xs -A -x -n VXI11::Client cp vxi11.h libvxi11client.c libvxi11client.h vxi11_clnt.c vxi11_xdr.c VXI11-Client/ - cp perlglue.c perlglue.h VXI11-Client/ + cp perlbits/perlglue.c perlbits/perlglue.h VXI11-Client/ + cp perlbits/Client.xs VXI11-Client/ cp perlbits/Makefile.PL VXI11-Client/ cp perlbits/VXI11-Client.t VXI11-Client/t/ cp perlbits/typemap VXI11-Client/ diff --git a/libvxi11client/perlbits/Client.xs b/libvxi11client/perlbits/Client.xs new file mode 100644 index 0000000..b747707 --- /dev/null +++ b/libvxi11client/perlbits/Client.xs @@ -0,0 +1,140 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include "ppport.h" + +MODULE = VXI11::Client PACKAGE = VXI11::Client + +int +abort() + CODE: + RETVAL = vxi11_abort(); + OUTPUT: + RETVAL + +int +clear(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_clear(waitforlock); + OUTPUT: + RETVAL + +int +close() + CODE: + RETVAL = vxi11_close(); + OUTPUT: + RETVAL + +int +create_intr_chan() + CODE: + RETVAL = vxi11_create_intr_chan(); + OUTPUT: + RETVAL + +int +destroy_intr_chan() + CODE: + RETVAL = vxi11_destroy_intr_chan(); + OUTPUT: + RETVAL + +int +docmd(cmd, waitforlock) + unsigned long cmd + bool waitforlock + CODE: + RETVAL = vxi11_docmd(); + OUTPUT: + RETVAL + +int +enable_srq(enable, callback) + bool enable + SV * callback + CODE: + RETVAL = glue_enable_srq(enable, callback); + OUTPUT: + RETVAL + +int +local(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_local(waitforlock); + OUTPUT: + RETVAL + +int +lock(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_lock(waitforlock); + OUTPUT: + RETVAL + +int +open(address, device) + char * address + char * device + CODE: + RETVAL = vxi11_open(address, device); + OUTPUT: + RETVAL + +int +read(buffer, bufferlen, waitlock, termchrset, termchr) + char * buffer + unsigned int bufferlen + bool waitlock + bool termchrset + char termchr + CODE: + RETVAL = vxi11_read(buffer, bufferlen, waitlock, termchrset, termchr); + OUTPUT: + RETVAL + +int +readstatusbyte(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_readstatusbyte(); + OUTPUT: + RETVAL + +int +remote(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_remote(); + OUTPUT: + RETVAL + +int +trigger(waitforlock) + bool waitforlock + CODE: + RETVAL = vxi11_trigger(); + OUTPUT: + RETVAL + +int +unlock() + CODE: + RETVAL = vxi11_unlock(); + OUTPUT: + RETVAL + +int +write(data, len, waitlock, end) + char * data + unsigned int len + bool waitlock + bool end + CODE: + RETVAL = vxi11_write(data, len, waitlock, end); + OUTPUT: + RETVAL diff --git a/libvxi11client/perlbits/VXI11-Client.t b/libvxi11client/perlbits/VXI11-Client.t index ac3d581..5b7f35f 100644 --- a/libvxi11client/perlbits/VXI11-Client.t +++ b/libvxi11client/perlbits/VXI11-Client.t @@ -8,7 +8,7 @@ use strict; use warnings; -use Test::More tests => 16; +use Test::More tests => 14; BEGIN { use_ok('VXI11::Client') }; ######################### @@ -16,18 +16,18 @@ BEGIN { use_ok('VXI11::Client') }; # Insert your test code below, the Test::More module is use()ed here so read # its man page ( perldoc Test::More ) for help writing this test script. -is(&VXI11::Client::vopen("roi", 0), 1, "Open"); -is(&VXI11::Client::vlock(0), 1, "Lock"); -is(&VXI11::Client::vwrite("*IDN?", 6, 0, 0), 6, "Write"); -ok(&VXI11::Client::vreadstatusbyte(0) >= 0 , "Read status byte"); -is(&VXI11::Client::vcreate_intr_chan(), 1, "Create intr channel"); -is(&VXI11::Client::venable_srq(1), 1, "Enable interrupts"); -is(&VXI11::Client::venable_srq(0), 1, "Disable interrupts"); -is(&VXI11::Client::vdestroy_intr_chan(), 1, "Destroy intr channel"); -is(&VXI11::Client::vabort(), 1, "Abort"); -is(&VXI11::Client::vclear(0), 1, "Clear"); -is(&VXI11::Client::vtrigger(0), 1, "Trigger"); -is(&VXI11::Client::vlocal(0), 1, "Local"); -is(&VXI11::Client::vremote(0), 1, "Remote"); -is(&VXI11::Client::vunlock(), 1, "Unlock"); -is(&VXI11::Client::vclose(), 1, "Close"); +is(&VXI11::Client::open("roi", 0), 1, "Open"); +is(&VXI11::Client::lock(0), 1, "Lock"); +is(&VXI11::Client::write("*IDN?", 6, 0, 0), 6, "Write"); +ok(&VXI11::Client::readstatusbyte(0) >= 0 , "Read status byte"); +is(&VXI11::Client::create_intr_chan(), 1, "Create intr channel"); +#is(&VXI11::Client::enable_srq(1, sub { print "Interrupt fired\n" }), 1, "Enable interrupts"); +#is(&VXI11::Client::enable_srq(0), 1, "Disable interrupts"); +is(&VXI11::Client::destroy_intr_chan(), 1, "Destroy intr channel"); +is(&VXI11::Client::abort(), 1, "Abort"); +is(&VXI11::Client::clear(0), 1, "Clear"); +is(&VXI11::Client::trigger(0), 1, "Trigger"); +is(&VXI11::Client::local(0), 1, "Local"); +is(&VXI11::Client::remote(0), 1, "Remote"); +is(&VXI11::Client::unlock(), 1, "Unlock"); +is(&VXI11::Client::close(), 1, "Close"); diff --git a/libvxi11client/perlbits/perlglue.c b/libvxi11client/perlbits/perlglue.c new file mode 100644 index 0000000..e870477 --- /dev/null +++ b/libvxi11client/perlbits/perlglue.c @@ -0,0 +1,23 @@ +#include "EXTERN.h" +#include "perl.h" +#include "XSUB.h" + +#include "ppport.h" + +#include "perlglue.h" + +#define INTERRUPTHANDLE "libvxi11client" + +extern int vxi11_enable_srq(bool enable, char* handle, void (*callback)(void)); + +static SV* perlcallback = NULL; + +static void interruptcallback(void) { + //PUSHMARK(SP); + call_sv(perlcallback, G_DISCARD | G_NOARGS); +} + +int glue_enable_srq(bool enable, SV* callback) { + perlcallback = callback; + return vxi11_enable_srq(enable, INTERRUPTHANDLE, interruptcallback); +} diff --git a/libvxi11client/perlbits/perlglue.h b/libvxi11client/perlbits/perlglue.h new file mode 100644 index 0000000..09e71aa --- /dev/null +++ b/libvxi11client/perlbits/perlglue.h @@ -0,0 +1,5 @@ +#include +#include + +int glue_enable_srq(bool enable, SV* callback); + diff --git a/libvxi11client/perlglue.c b/libvxi11client/perlglue.c deleted file mode 100644 index 697a480..0000000 --- a/libvxi11client/perlglue.c +++ /dev/null @@ -1,73 +0,0 @@ -#include "perlglue.h" -#include "libvxi11client.h" -#include - -#define INTERRUPTHANDLE "libvxi11client" - -static void interruptcallback(void) { - -} - -int vopen(char* address, char* device) { - return vxi11_open(address, device); -} - -int vabort(void) { - return vxi11_abort(); -} - -int vtrigger(bool waitforlock) { - return vxi11_trigger(waitforlock); -} - -int vclear(bool waitforlock) { - return vxi11_clear(waitforlock); -} - -int vwrite(char* data, unsigned int len, bool waitlock, bool end) { - return vxi11_write(data, len, waitlock, end); -} - -int vread(char* buffer, unsigned int bufferlen, bool waitlock, bool termchrset, char termchr) { - return vxi11_read(buffer, bufferlen, waitlock, termchrset, termchr); -} - -int vlock(bool waitforlock) { - return vxi11_lock(waitforlock); -} - -int vunlock(void) { - return vxi11_unlock(); -} - -int vlocal(bool waitforlock) { - return vxi11_local(waitforlock); -} - -int vremote(bool waitforlock) { - return vxi11_remote(waitforlock); -} - -int vreadstatusbyte(bool waitforlock) { - return vxi11_readstatusbyte(waitforlock); -} - -int vcreate_intr_chan(void) { - return vxi11_create_intr_chan(); -} - -int vdestroy_intr_chan(void) { - return vxi11_destroy_intr_chan(); -} - -int venable_srq(bool enable) { - return vxi11_enable_srq(enable, INTERRUPTHANDLE, interruptcallback); -} - -int vdocmd(unsigned long cmd, bool waitforlock) { - return vxi11_docmd(cmd, waitforlock); -} - -int vclose(void) { - return vxi11_close(); -} diff --git a/libvxi11client/perlglue.h b/libvxi11client/perlglue.h deleted file mode 100644 index 680a061..0000000 --- a/libvxi11client/perlglue.h +++ /dev/null @@ -1,17 +0,0 @@ -#include -int vopen(char* address, char* device); -int vabort(void); -int vtrigger(bool waitforlock); -int vclear(bool waitforlock); -int vwrite(char* data, unsigned int len, bool waitlock, bool end); -int vread(char* buffer, unsigned int bufferlen, bool waitlock, bool termchrset, char termchr); -int vlock(bool waitforlock); -int vunlock(void); -int vlocal(bool waitforlock); -int vremote(bool waitforlock); -int vreadstatusbyte(bool waitforlock); -int vcreate_intr_chan(void); -int vdestroy_intr_chan(void); -int venable_srq(bool enable); -int vdocmd(unsigned long cmd, bool waitforlock); -int vclose(void); -- cgit