Mercurial > hg > fxanalyse
diff ad9912.c @ 207:9e0c3541104b
Move common AD99xx code to dds.{ch}
author | Daniele Nicolodi <daniele.nicolodi@obspm.fr> |
---|---|
date | Mon, 31 Mar 2014 17:03:38 +0200 |
parents | f8118b90490e |
children | 5296f3bcd160 |
line wrap: on
line diff
--- a/ad9912.c Mon Mar 31 17:03:38 2014 +0200 +++ b/ad9912.c Mon Mar 31 17:03:38 2014 +0200 @@ -1,12 +1,7 @@ #ifdef _CVI_ +#include <winsock2.h> #include <ansi_c.h> #include <toolbox.h> -#include <tcpsupp.h> -#define TIMEOUT 0 -#define send(fd, buf, len, f) ClientTCPWrite(fd, buf, len, TIMEOUT) -#define recv(fd, buf, len, f) ClientTCPRead(fd, buf, len, TIMEOUT) -#define usleep(t) Delay(t / 1000000.0) -#define strdup(s) StrDup(s) #else #include <stdio.h> #include <stdlib.h> @@ -19,117 +14,29 @@ #include <arpa/inet.h> #include <netdb.h> #include <ctype.h> -#include <math.h> #include <stdarg.h> #endif +#include "dds.h" #include "ad9912.h" -#define streq(x, y) (strcmp((x), (y)) == 0) - -typedef unsigned long long uint64; - - -static inline uint64 ftw(double clock, double freq) -{ - uint64 ftw = freq * ((double)(1ULL << 48) / clock); - ftw = ftw & ~1ULL; - return ftw; -} - - -static inline double freq(double clock, uint64 ftw) -{ - double freq = (double)ftw * (clock / (double)(1ULL << 48)); - return freq; -} - - -static inline int strtouint64(const char *str, uint64 *v) -{ - char *end; - *v = strtoull(str, &end, 0); - if (*end != '\0') - return -1; - return 0; -} - - -static int msend(int fd, char *buffer, int n) -{ - int r; - - buffer[n++] = '\r'; - buffer[n++] = '\n'; - - r = send(fd, buffer, n, 0); - if (r < 0) - return r; - - return 0; -} - - -static int mrecv(int fd, char *buffer, int len) -{ - int n; - - n = recv(fd, buffer, len, 0); - if (n < 0) - return n; - - if ((buffer[--n] != '\n') || (buffer[--n] != '\r')) - return -1; - - buffer[n] = '\0'; - - return n; -} - - -static int command(int fd, char *frmt, ...) -{ - int r, n; - char buffer[1024]; - va_list v; - - va_start(v, frmt); - n = vsnprintf(buffer, sizeof(buffer) - 2, frmt, v); - va_end(v); - - r = msend(fd, buffer, n); - if (r < 0) - return r; - - r = mrecv(fd, buffer, sizeof(buffer)); - if (r < 0) - return r; - - if (! streq(buffer, "OK")) - return -1; - - return 0; -} - int ad9912_init(struct ad9912 *d, const char *hostname, double clock) { int n, r; char buffer[256]; - - d->hostname = StrDup(hostname); - d->port = 1234; - d->clock = clock; - -#ifdef _CVI_ - unsigned int sock; - r = ConnectToTCPServer(&sock, d->port, d->hostname, NULL, NULL, TIMEOUT); - if (r < 0) - return -1; -#else int sock; struct sockaddr_in addr; struct hostent* host; + +#ifdef _CVI_ + WSADATA wsdata; + WSAStartup(MAKEWORD(2,2), &wsdata); +#endif + + d->hostname = strdup(hostname); + d->port = 1234; + d->clock = clock; host = gethostbyname(hostname); if (host == NULL) @@ -141,13 +48,12 @@ addr.sin_family = host->h_addrtype; memcpy(&addr.sin_addr.s_addr, host->h_addr_list[0], host->h_length); - addr.sin_port = htons(port); + addr.sin_port = htons(d->port); r = connect(sock, (struct sockaddr*)&addr, sizeof(addr)); if (r < 0) return -3; -#endif - + d->fd = sock; /* check compatibility */ @@ -169,6 +75,9 @@ { int r; uint64 value = ftw(d->clock, f); + + /* ad9912 ignores ftw last bit */ + value = value & ~1ULL; r = command(d->fd, "SET CH%d:FTW0 0x%llX", channel, value); if (r < 0)