Mercurial > hg > fxanalyse
view 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 source
#ifdef _CVI_ #include <ansi_c.h> #include <toolbox.h> #else #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <errno.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 r; char buffer[256]; uint64 value; #ifdef _CVI_ WSADATA wsdata; WSAStartup(MAKEWORD(2,2), &wsdata); #endif d->sock = xsocket(hostname, 1234); d->profile = 0; d->clock = clock; r = xconnect(d->sock); if (r < 0) return r; /* check compatibility */ r = msend(d->sock, "REVISION", strlen("REVISION")); if (r < 0) return r; r = mrecv(d->sock, buffer, sizeof(buffer)); if (r < 0) return r; if (atoi(buffer) != REVISION) return -EINVAL; /* disable clock divider */ r = msend(d->sock, "GET CFR2", strlen("GET CFR2")); if (r < 0) return r; 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->sock, "SET CFR2 0x%X", value); if (r < 0) return r; return 0; } int ad9956_set_frequency(struct ad9956 *d, double f) { int r; uint64 value = ftw(d->clock, f); r = command(d->sock, "SET PCR%d 0x%llX", d->profile, value); if (r < 0) return r; d->frequency = freq(d->clock, value); return 0; } int ad9956_get_frequency(struct ad9956 *d, double *f) { int r, n; uint64 value; char buffer[256]; n = snprintf(buffer, sizeof(buffer), "GET PCR%d", d->profile); r = msend(d->sock, buffer, n); if (r < 0) return r; r = mrecv(d->sock, buffer, sizeof(buffer)); if (r < 0) return r; r = strtouint64(buffer, &value); if (r < 0) return r; d->frequency = freq(d->clock, value); if (f) *f = d->frequency; return 0; } int ad9956_set_sweep_rate(struct ad9956 *d, double rate) { int64 value = (int64)ftw(d->clock, fabs(rate * 0.01)); if (rate < 0.0) value = -value; return command(d->sock, "SWEEP SET DFTW %lld", value); } int ad9956_sweep_start(struct ad9956 *d) { return command(d->sock, "SWEEP START"); } int ad9956_sweep_stop(struct ad9956 *d) { return command(d->sock, "SWEEP STOP"); }