view ad9956.c @ 268:ec4462c7f8b7

Extensive cleanup of beatnote specific variables Reorganize the beatnote specific variables in arrays indexed by the beatnote enum constants LO, HG, SR. Also reorganize DDS frequency related variables in arrays indexed by the DDS channel number.
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Thu, 09 Jul 2015 23:11:00 +0200
parents 8d9a4c5eb7a4
children
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;

	d->sock = xsocket(hostname, 1234);
	d->profile = 0;
	d->clock = clock;

	r = xconnect(d->sock);
	if (r < 0)
		return r;

	/* check compatibility */
	r = xask(d->sock, "REVISION", strlen("REVISION"), buffer, sizeof(buffer));
	if (r < 0)
		return r;
	if (atoi(buffer) != REVISION)
		return -EINVAL;

	/* disable clock divider */
	r = xask(d->sock, "GET CFR2", strlen("GET CFR2"), buffer, sizeof(buffer));
	if (r < 0)
		return r;

	r = strtouint64(buffer, &value);
	if (r < 0)
		return r;
	
	value = value | (1ULL << 16);
	r = xcommand(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 = xcommand(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 = xask(d->sock, buffer, n, 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 xcommand(d->sock, "SWEEP SET DFTW %lld", value);
}


int ad9956_sweep_start(struct ad9956 *d)
{
	return xcommand(d->sock, "SWEEP START");
}


int ad9956_sweep_stop(struct ad9956 *d)
{
	return xcommand(d->sock, "SWEEP STOP");
}