diff options
-rw-r--r-- | libvxi11client/client.c | 12 | ||||
-rw-r--r-- | libvxi11client/libvxi11client.c | 115 |
2 files changed, 103 insertions, 24 deletions
diff --git a/libvxi11client/client.c b/libvxi11client/client.c index f946547..747947b 100644 --- a/libvxi11client/client.c +++ b/libvxi11client/client.c @@ -6,7 +6,7 @@ static char* geterrorstring(int errorcode) { switch (errorcode) { case 0: - return "no response from server"; + return "invalid state (not connected) or no response from server"; case -8: return "operation not supported"; default: @@ -14,12 +14,18 @@ static char* geterrorstring(int errorcode) { } } -int main() { +int main(int argc, char *argv[]) { + printf("VXI-11 test client\n"); + if (argc != 2) { + printf("usage; %s <host>\n", argv[0]); + exit(1); + } + int err = 0; - if ((err = vxi11_open("192.168.2.250")) > 0) { + if ((err = vxi11_open(argv[1])) > 0) { // write some bytes int byteswritten = vxi11_write(IDENTIFY, sizeof(IDENTIFY)); diff --git a/libvxi11client/libvxi11client.c b/libvxi11client/libvxi11client.c index 20fa0fa..0cb4ab9 100644 --- a/libvxi11client/libvxi11client.c +++ b/libvxi11client/libvxi11client.c @@ -1,15 +1,25 @@ #include "vxi11.h" +/** + * This is a thin wrapper around the rpcgen generated code to give it a simpler interface. + * Only one server with a single link is supported. + */ + #define VXI11_DEFAULT_TIMEOUT 1000 static CLIENT* clnt = NULL; static Device_Link link; +/** + * create an RPC client and open a link to the server at $address. + * $device is apparently used for VXI-11 -> GPIB gateways.. this is untested. + */ + int vxi11_open(char* address, char* device) { clnt = clnt_create(address, DEVICE_CORE, DEVICE_CORE_VERSION, "tcp"); - if (clnt == NULL) { + if (clnt == NULL) return 0; - } + else { Create_LinkParms link_parms; link_parms.clientId = (long) clnt; @@ -29,9 +39,14 @@ int vxi11_open(char* address, char* device) { } } +/** + * read the status byte of the connected server + */ + int vxi11_readstatusbyte() { if (clnt == NULL) - return; + return 0; + Device_GenericParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .io_timeout = VXI11_DEFAULT_TIMEOUT }; Device_ReadStbResp* resp = device_readstb_1(¶ms, clnt); @@ -44,10 +59,13 @@ int vxi11_readstatusbyte() { return -1; } +/** + * write to the connected device + */ + int vxi11_write(char* data, unsigned int len) { - if (clnt == NULL) { - return; - } + if (clnt == NULL) + return 0; Device_WriteParms params = { .lid = link, .io_timeout = VXI11_DEFAULT_TIMEOUT, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .flags = 0x0 }; @@ -63,10 +81,13 @@ int vxi11_write(char* data, unsigned int len) { return -1; } +/** + * read from the connected device + */ + int vxi11_read() { - if (clnt == NULL) { - return; - } + if (clnt == NULL) + return 0; Device_ReadParms params = { .lid = link, .requestSize = 256, .io_timeout = VXI11_DEFAULT_TIMEOUT, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .flags = 0x0, .termChar = 0x0 }; @@ -80,9 +101,13 @@ int vxi11_read() { return -1; } +/** + * + */ + int vxi11_docmd(unsigned long cmd) { if (clnt == NULL) - return; + return 0; Device_DocmdParms params = { .lid = link, .flags = 0x0, .io_timeout = VXI11_DEFAULT_TIMEOUT, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .cmd = cmd, .network_order = 0, .datasize = 0 }; @@ -99,9 +124,13 @@ int vxi11_docmd(unsigned long cmd) { return -(resp->error); } +/** + * trigger the connected device + */ + int vxi11_trigger() { if (clnt == NULL) - return; + return 0; Device_GenericParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .io_timeout = VXI11_DEFAULT_TIMEOUT }; @@ -110,12 +139,16 @@ int vxi11_trigger() { if (error->error == 0) return 1; else - return -1; + return -(error->error); } +/** + * clear the connected device + */ + int vxi11_clear() { if (clnt == NULL) - return; + return 0; Device_GenericParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .io_timeout = VXI11_DEFAULT_TIMEOUT }; Device_Error* error = device_clear_1(¶ms, clnt); @@ -127,9 +160,13 @@ int vxi11_clear() { return -(error->error); } +/** + * remote the connected device + */ + int vxi11_remote() { if (clnt == NULL) - return; + return 0; Device_GenericParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .io_timeout = VXI11_DEFAULT_TIMEOUT }; Device_Error* error = device_remote_1(¶ms, clnt); @@ -141,9 +178,13 @@ int vxi11_remote() { return -(error->error); } +/** + * local the connected device + */ + int vxi11_local() { if (clnt == NULL) - return; + return 0; Device_GenericParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT, .io_timeout = VXI11_DEFAULT_TIMEOUT }; Device_Error* error = device_local_1(¶ms, clnt); @@ -155,9 +196,13 @@ int vxi11_local() { return -(error->error); } +/** + * lock the connected device + */ + int vxi11_lock() { if (clnt == NULL) - return; + return 0; Device_LockParms params = { .lid = link, .flags = 0x0, .lock_timeout = VXI11_DEFAULT_TIMEOUT }; Device_Error* error = device_lock_1(¶ms, clnt); if (error != NULL && error->error == 0) @@ -168,9 +213,13 @@ int vxi11_lock() { return -(error->error); } +/** + * unlock the connected device + */ + int vxi11_unlock() { if (clnt == NULL) - return; + return 0; Device_Error* error = device_unlock_1(&link, clnt); if (error != NULL && error->error == 0) return 1; @@ -180,9 +229,12 @@ int vxi11_unlock() { return -(error->error); } +/** + * create an interrupt channel from the connected device + */ int vxi11_create_intr_chan() { if (clnt == NULL) - return; + return 0; Device_RemoteFunc remotefunc = { .hostAddr = 0x0, .hostPort = 0x0, .progNum = 0x0, .progVers = 0x0, .progFamily = DEVICE_TCP }; Device_Error* error = create_intr_chan_1(&remotefunc, clnt); @@ -194,9 +246,13 @@ int vxi11_create_intr_chan() { return -(error->error); } +/** + * destroy an interrupt channel from the connected device + */ + int vxi11_destroy_intr_chan() { if (clnt == NULL) - return; + return 0; Device_Error* error = destroy_intr_chan_1(NULL, clnt); if (error != NULL && error->error == 0) return 1; @@ -206,9 +262,13 @@ int vxi11_destroy_intr_chan() { return -(error->error); } +/** + * send an abort to the connected device + */ + int vxi11_abort() { if (clnt == NULL) - return; + return 0; Device_Error* error = device_abort_1(&link, clnt); if (error != NULL && error->error == 0) return 1; @@ -218,9 +278,22 @@ int vxi11_abort() { return -(error->error); } +/** + * close the current link and free the RPC client + */ + int vxi11_close() { + if (clnt == NULL) + return 0; + Device_Error* error = destroy_link_1(&link, clnt); clnt_destroy(clnt); clnt = NULL; - return 1; + + if (error != NULL && error->error == 0) + return 1; + else if (error == NULL) + return 0; + else + return -(error->error); } |