changeset 102:4f1f353e84f5

Add timeout to FX_Recv() function. Improve error handling in KKDataProvider
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Mon, 08 Apr 2013 16:18:05 +0200
parents 8b90fbba59ef
children 0e9f95525a8f
files KKFX80E.c KKFX80E.h kk-data-provider.c
diffstat 3 files changed, 109 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/KKFX80E.c	Mon Apr 08 16:15:44 2013 +0200
+++ b/KKFX80E.c	Mon Apr 08 16:18:05 2013 +0200
@@ -1,5 +1,8 @@
 #include <ctype.h>
 #include <windows.h>
+#include <utility.h>
+#include <ansi_c.h>
+
 
 int (_stdcall *FX_OpenPort)(char **Port) = NULL;
 void (_stdcall *FX_ClosePort)(void) = NULL;
@@ -12,11 +15,19 @@
 // BOOL (_stdcall *EnumeratePorts)(char **PortName, char *PortNamePrefix) = NULL;
 
 static HMODULE module;
+static char *errormsg;
+
+
+char * FX_Error(void)
+{
+	return errormsg;
+}
 
 
 int FX_Init(void)
 {
-	FARPROC funcp;
+	FARPROC funcp = NULL;
+	errormsg = "";
 	
 	module = LoadLibrary("KK_FX80E.dll");
 	if (! module)
@@ -64,10 +75,8 @@
 int FX_Open(char *port)
 {
 	int rv = FX_OpenPort(&port);
-#ifdef DEBUG
 	if (! rv)
-		fprintf(stderr, "%s\n", *port);
-#endif
+		errormsg = port;
 	return rv;
 }
 
@@ -81,30 +90,33 @@
 int FX_Send(char *cmd)
 {
 	int rv = FX_SendCommand(&cmd);
-#ifdef DEBUG
 	if (! rv)
-		fprintf(stderr, "%s\n", cmd);
-#endif
+		errormsg = cmd;
 	return rv;
 }
 
 
-char * FX_Recv(char **ret)
+int FX_Recv(char **ret, int timeout)
 {
 	int rv;
 	char *data;
+	double mark = Timer();
 	do {
 		data = ".";
 		rv = FX_GetReport(&data);
-	} while (! data);
-#ifdef DEBUG
-	if (! rv)
-		fprintf(stderr, "%s\n", data);
-#endif
-	if (! rv)
-		return NULL;
+		if ((Timer() - mark) > timeout) {
+			rv = 0;
+			data = "Function FX_Recv: Timeout";
+		}
+	} while ((! data) && (rv == 1));
+	
+	if (! rv) {
+		errormsg = data;
+		data = NULL;
+	}
+	
 	if (ret)
 		*ret = data;
 	
-	return data;
+	return rv;
 }
--- a/KKFX80E.h	Mon Apr 08 16:15:44 2013 +0200
+++ b/KKFX80E.h	Mon Apr 08 16:18:05 2013 +0200
@@ -16,7 +16,8 @@
 int FX_Open(char *port);
 void FX_Close(void);
 int FX_Send(char *cmd);
-char * FX_Recv(char **data);
+int FX_Recv(char **data, int timeout);
+char * FX_Error(void);
 
 #ifdef __cplusplus
     }
--- a/kk-data-provider.c	Mon Apr 08 16:15:44 2013 +0200
+++ b/kk-data-provider.c	Mon Apr 08 16:18:05 2013 +0200
@@ -11,6 +11,7 @@
 
 #define CONFIGFILE "FXAnalise.ini"
 #define DEFAULTPORT "COM4:115200"
+#define TIMEOUT 1 /* seconds */
 
 #define strneq(a, b, len) (strncmp((a), (b), (len)) == 0)
 
@@ -37,7 +38,7 @@
 
 	/* get serial port name configuration */
 	rv = Ini_GetStringIntoBuffer(configuration, "KK", "port", port, sizeof(port));
-	if (rv == 0)
+	if (! rv)
 		strncpy(port, DEFAULTPORT, sizeof(port));
 	
 	/* free */ 
@@ -45,30 +46,83 @@
 
 	/* initialize library */
 	FX_Init();
+	
 	/* connect to KK FX80E counter */
 	rv = FX_Open(port);
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
 	
 	/* clear transmit buffer */
-	FX_Send("\x80");
-	FX_Recv(&resp);
+	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;
+	}
+	
 	/* set report interval 1sec */
-	FX_Send("\x29");
-	FX_Recv(&resp);
+	rv = FX_Send("\x29");
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	rv = FX_Recv(&resp, TIMEOUT);
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	
 	/* read 4 channels */
-	FX_Send("\x34");
-	FX_Recv(&resp);
+	rv = FX_Send("\x34");
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	rv = FX_Recv(&resp, TIMEOUT);
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	
 	/* set mode to instantaneous frequency measurement */
-	FX_Send("\x42");
-	FX_Recv(&resp);
+	rv = FX_Send("\x42");
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	rv = FX_Recv(&resp, TIMEOUT);
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	
 	/* switch scrambler off */
-	FX_Send("\x50");
-	FX_Recv(&resp);
+	rv = FX_Send("\x50");
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
+	rv = FX_Recv(&resp, TIMEOUT);
+	if (! rv) {
+		SendMessage(mainThreadId, FX_Error());
+		goto error;
+	}
 	
 	while (acquiring) {
 		/* receive data from counter */
-		FX_Recv(&resp);
+		FX_Recv(&resp, TIMEOUT);
+		if (! resp) {
+			SendMessage(mainThreadId, FX_Error());
+			break;
+		}
 		
-		if (strneq(resp, "2900;", 5)) {
+		if (strneq(resp, "2900", 4)) {
 			
 			/* timestamp */
 			gettimeofday(&event.time, NULL);
@@ -86,18 +140,25 @@
 			/* push data into the data queue */
 			CmtWriteTSQData(dataQueue, &event, 1, TSQ_INFINITE_TIMEOUT, 0);
 		
-		} else if (strneq(resp, "7000;", 5)) {
+		} else if (strneq(resp, "7000", 4)) {
 			/* ignore heart beat packet */
-		} else if (strneq(resp, "7015;", 5)) {
+		} else if (strneq(resp, "7015", 4)) {
 			/* ignore undocumented packet. it is sent by newer kk counters
-			   for each data packet. it contains a sample count along with
-			   other information */
+			   for each data packet. it probably contains a sample count along
+			   with some other information */
+		} else if (strneq(resp, "7020", 4)) {
+			/* undocumented packet. it probably reports the header for
+			   subsequent data packets. match it against expected value  */
+			if (strcmp(resp + 6, "$2900")) {
+				SendMessage(mainThreadId, "KK Counter: %s", resp);
+			}
 		} else {
 			/* send message to the main thread */
-			SendMessage(mainThreadId, resp);
+			SendMessage(mainThreadId, "KK Counter: %s", resp);
 		}
 	}
 	
+error:
 	/* close serial port */
 	FX_Close();
 	/* free allocated resources */