# HG changeset patch # User Daniele Nicolodi # Date 1396278212 -7200 # Node ID 4b74b81e0c79fad202257656a9035d146069f5dc # Parent 3427013e4f70acbc90cf6fc448d1178d9225aafa Fix KK data provider. Wait for command reply before sending the next one. diff -r 3427013e4f70 -r 4b74b81e0c79 kk-data-provider.c --- a/kk-data-provider.c Mon Mar 31 17:03:32 2014 +0200 +++ b/kk-data-provider.c Mon Mar 31 17:03:32 2014 +0200 @@ -13,14 +13,43 @@ #define DEFAULT_PORT "COM4:115200" #define DEFAULT_NCHAN 4 #define TIMEOUT 1 /* seconds */ +#define MAXRETRY 20 #define strneq(a, b, len) (strncmp((a), (b), (len)) == 0) + +static inline int FX_Command(char cmd) +{ + char *resp; + int rv, retry = 0; + + /* reset counter buffer */ + cmd = cmd + 0x80; + + /* send command */ + rv = FX_Send(cmd); + if (! rv) + return rv; + + /* wait successfull reply */ + do { + rv = FX_Recv(&resp, TIMEOUT); + if (! rv) + return rv; + if (retry++ > MAXRETRY) + return 0; + } while (strneq(resp, "7020", 4)); + + return rv; +} + + int CVICALLBACK KKDataProvider (void *functionData) { int mainThreadId; int rv; - char *cmd, *resp; + char cmd; + char *resp; struct event event; int nchan; int scrambler; @@ -64,100 +93,54 @@ SendMessage(mainThreadId, FX_Error()); goto error; } - - /* clear transmit buffer */ - rv = FX_Send("\x80"); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - + /* get counter hardware version string */ - rv = FX_Send("\x81"); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + rv = FX_Send(0x81); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } /* wait for response */ - while (strneq(resp, "7000", 4)) { + do { rv = FX_Recv(&resp, TIMEOUT); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } - } - if (strneq(resp, "7001", 4)) - SendMessage(mainThreadId, "KK Counter version: %s", resp + 4); + } while (! strneq(resp, "7001", 4)); + SendMessage(mainThreadId, "KK Counter version: %s", resp + 4); /* set report interval 1sec */ - rv = FX_Send("\x29"); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + rv = FX_Command(0x29); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } /* read nchan channels */ - cmd = "\x30"; - cmd[0] += nchan; - rv = FX_Send(cmd); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + cmd = 0x30 + nchan; + rv = FX_Command(cmd); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } /* set mode to instantaneous frequency measurement */ - rv = FX_Send("\x42"); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + rv = FX_Command(0x42); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } - + /* scrambler */ - cmd = "\x50"; - cmd[0] += scrambler; - rv = FX_Send(cmd); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + rv = FX_Command(0x50 + scrambler); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; } /* enable synchronization */ - rv = FX_Send("\x0F"); - if (! rv) { - SendMessage(mainThreadId, FX_Error()); - goto error; - } - rv = FX_Recv(&resp, TIMEOUT); + rv = FX_Command(0x0F); if (! rv) { SendMessage(mainThreadId, FX_Error()); goto error; @@ -182,7 +165,7 @@ &event.data[0], &event.data[1], &event.data[2], &event.data[3], &event.data[4], &event.data[5], &event.data[6], &event.data[7]); if (rv != nchan) { - SendMessage(mainThreadId, "KK Counter: data conversion error"); + SendMessage(mainThreadId, "KK Counter: data conversion error: %d != %d", rv, nchan); goto error; }