diff ad9956.c @ 258:5296f3bcd160

Implement DDS clients reconnect On network send() failures try to reconnect to the server before returning an error. This allows to restart the network servers controlling the DDSes wiothout having to restart the clients.
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Tue, 16 Jun 2015 14:31:35 +0200
parents fcc988c6f841
children ebbe0f198322
line wrap: on
line diff
--- a/ad9956.c	Fri Jun 05 21:51:25 2015 +0200
+++ b/ad9956.c	Tue Jun 16 14:31:35 2015 +0200
@@ -1,86 +1,61 @@
 #ifdef _CVI_
-#include <winsock2.h>
 #include <ansi_c.h>
 #include <toolbox.h>
 #else
 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>
+#include <string.h>
 #include <errno.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#include <netdb.h>
-#include <ctype.h>
-#include <stdarg.h>
+#include <math.h>
 #endif
 
 #include "dds.h"
+#include "xsocket.h"
 #include "ad9956.h"
 
 
 int ad9956_init(struct ad9956 *d, const char *hostname, double clock)
 {
-	int sock, n, r;
+	int r;
 	char buffer[256];
-	struct sockaddr_in addr;
-	struct hostent* host;
 	uint64 value;
 
 #ifdef _CVI_
 	WSADATA wsdata;
 	WSAStartup(MAKEWORD(2,2), &wsdata);	
 #endif
-	
-	d->hostname = strdup(hostname);
-	d->port = 1234;
+
+	d->sock = xsocket(hostname, 1234);
 	d->profile = 0;
 	d->clock = clock;
 
-	host = gethostbyname(hostname);
-	if (host == NULL)
-		return -1;
-  
-	sock = socket(AF_INET, SOCK_STREAM, 0);
-	if (sock < 0)
-		return -2;
-
-	addr.sin_family = host->h_addrtype;
-	memcpy(&addr.sin_addr.s_addr, host->h_addr_list[0], host->h_length);
-	addr.sin_port = htons(d->port);
-
-	r = connect(sock, (struct sockaddr*)&addr, sizeof(addr));
+	r = xconnect(d->sock);
 	if (r < 0)
-		return -3;
-
-	d->fd = sock;
+		return r;
 
 	/* check compatibility */
-	n = snprintf(buffer, sizeof(buffer), "REVISION");
-	r = msend(d->fd, buffer, n);
+	r = msend(d->sock, "REVISION", strlen("REVISION"));
 	if (r < 0)
 		return r;
-	r = mrecv(d->fd, buffer, sizeof(buffer));
+	r = mrecv(d->sock, buffer, sizeof(buffer));
 	if (r < 0)
 		return r;
 	if (atoi(buffer) != REVISION)
 		return -EINVAL;
 
 	/* disable clock divider */
-	n = snprintf(buffer, sizeof(buffer), "GET CFR2");
-	r = msend(d->fd, buffer, n);
+	r = msend(d->sock, "GET CFR2", strlen("GET CFR2"));
 	if (r < 0)
 		return r;
-	r = mrecv(d->fd, buffer, sizeof(buffer));
+	r = mrecv(d->sock, buffer, sizeof(buffer));
 	if (r < 0)
 		return r;
 	r = strtouint64(buffer, &value);
 	if (r < 0)
 		return r;	
         value = value | (1ULL << 16);
-	r = command(d->fd, "SET CFR2 0x%X", value);
+	r = command(d->sock, "SET CFR2 0x%X", value);
 	if (r < 0)
 		return r;
 
@@ -93,7 +68,7 @@
 	int r;
 	uint64 value = ftw(d->clock, f);
 
-	r = command(d->fd, "SET PCR%d 0x%llX", d->profile, value);
+	r = command(d->sock, "SET PCR%d 0x%llX", d->profile, value);
 	if (r < 0)
 		return r;
 
@@ -110,12 +85,11 @@
 	char buffer[256];
 
 	n = snprintf(buffer, sizeof(buffer), "GET PCR%d", d->profile);
-
-	r = msend(d->fd, buffer, n);
+	r = msend(d->sock, buffer, n);
 	if (r < 0)
 		return r;
 
-	r = mrecv(d->fd, buffer, sizeof(buffer));
+	r = mrecv(d->sock, buffer, sizeof(buffer));
 	if (r < 0)
 		return r;
 
@@ -136,17 +110,18 @@
 	int64 value = (int64)ftw(d->clock, fabs(rate * 0.01));
 	if (rate < 0.0)
 		value = -value;
-	return command(d->fd, "SWEEP SET DFTW %lld", value);
+	
+	return command(d->sock, "SWEEP SET DFTW %lld", value);
 }
 
 
 int ad9956_sweep_start(struct ad9956 *d)
 {
-	return command(d->fd, "SWEEP START");
+	return command(d->sock, "SWEEP START");
 }
 
 
 int ad9956_sweep_stop(struct ad9956 *d)
 {
-	return command(d->fd, "SWEEP STOP");
+	return command(d->sock, "SWEEP STOP");
 }