Mercurial > hg > fxanalyse
changeset 174:d96f0b04f7fe
Make DDS addres configurable in configuration file. Modernize AD9912 driver.
author | Daniele Nicolodi <daniele.nicolodi@obspm.fr> |
---|---|
date | Fri, 21 Feb 2014 18:37:32 +0100 |
parents | 24ab61179ab5 |
children | e5ad3ed47d2c |
files | DDS4xAD9912.c DDS4xAD9912.h FXAnalyse.c |
diffstat | 3 files changed, 83 insertions(+), 133 deletions(-) [+] |
line wrap: on
line diff
--- a/DDS4xAD9912.c Mon Feb 17 18:39:36 2014 +0100 +++ b/DDS4xAD9912.c Fri Feb 21 18:37:32 2014 +0100 @@ -1,3 +1,4 @@ +#include <toolbox.h> #include <ansi_c.h> #include <utility.h> #include <userint.h> @@ -6,19 +7,17 @@ #include "DDS4xAD9912.h" -static int OnTCPEvent(unsigned handle, int xType, int errCode, void *callbackData) +void DDS4xAD9912_Init(DDS4xAD9912_Data *dds, const char *host, double clock) { - switch(xType) - { - case TCP_DISCONNECT: - break; - case TCP_DATAREADY: - ClientTCPRead(handle, Response, sizeof(Response), 0); - break; - } - return 0; + memset(dds, 0, sizeof(DDS4xAD9912_Data)); + dds->port[0] = 6665; + dds->port[1] = 6666; + dds->port[2] = 6667; + dds->port[3] = 6668; + dds->host = StrDup(host); + dds->clock = clock; } - + //============================================================================== // DDS4xAD9912_SendCmd @@ -28,40 +27,18 @@ // PARAM : Buffer contenant la chaîne de caractères à envoyer // RETURN : 0 si la connexion et l'ecriture sur le serveur TCP/IP sont OK //============================================================================== -static int DDS4xAD9912_SendCmd(int DDSNum, char * Buffer) +static int DDS4xAD9912_SendCmd(DDS4xAD9912_Data *dds, int channel, char *buffer) { - int port = 0; int rv; - - switch (DDSNum) { - case 1: - port = Port1; - break; - case 2: - port = Port2; - break; - case 3: - port = Port3; - break; - case 4: - port = Port4; - break; - default: - return -1; - } + unsigned int sock; - rv = ConnectToTCPServer(&hConv, port, Adress, OnTCPEvent, 0, 0); - if (rv < 0) { - MessagePopup("DDS4xAD9912", "Connection to server failed!"); + rv = ConnectToTCPServer(&sock, dds->port[channel - 1], dds->host, NULL, 0, 0); + if (rv < 0) return rv; - } - rv = ClientTCPWrite(hConv, Buffer, strlen(Buffer)+1, 0); - if (rv < 0) { - MessagePopup("DDS Serveur", "Write to server failed!"); - } + rv = ClientTCPWrite(sock, buffer, strlen(buffer) + 1, 0); - DisconnectFromTCPServer(hConv); + DisconnectFromTCPServer(sock); return rv; } @@ -74,23 +51,37 @@ // PARAM : // RETURN : 0 si le reset de la DDS 1 , DDS 2, DDS3 et DDS4 est OK //============================================================================== - int DDS4xAD9912_Reset(DDS4xAD9912_Data * Instance) + int DDS4xAD9912_Reset(DDS4xAD9912_Data *dds) { - int chan, rv; + int channel, rv; + char request[256]; + + sprintf(request, "set;%i;%i", 1, 17); - for (chan = 1; chan < 5; chan++) { - sprintf(Request, "set;%i;%i", 1, 17); - rv = DDS4xAD9912_SendCmd(chan, Request); + for (channel = 1; channel < 5; channel++) { + rv = DDS4xAD9912_SendCmd(dds, channel, request); if (rv < 0) { - MessagePopup("DDS Serveur", "DDS4xAD9912 reset failed"); + MessagePopup("DDS4xAD9912", "Reset failed"); return -1; } - Instance->frequency[chan - 1] = 0.0; + dds->frequency[channel - 1] = 0.0; } return 0; } +/* convert 64 bit integer into 6 bytes array */ +static inline void tobytes(unsigned long long x, unsigned char* bytes) +{ + /* 64 bits integer */ + for (int i = 0; i < 6; i++) + bytes[i] = (unsigned char)((x >> (i * 8)) & 0xFF); +} + + +#define WORD(freq, clock) ((double)(1ULL << 48) * (freq / clock)) + + //============================================================================== // DDS4xAD9912_SetFreq // @@ -98,37 +89,30 @@ // PARAM : DDSNum contient le numero de la DDS (1, 2 , 3 ou 4) // RETURN : 0 si la connexion et l'ecriture sur le serveur TCP/IP sont OK //============================================================================== -int DDS4xAD9912_SetFrequency(DDS4xAD9912_Data * Instance, int DDSNum, double Freq) - { - - double Word=WORD(Freq,Clk) ; - double reste ; +int DDS4xAD9912_SetFrequency(DDS4xAD9912_Data *dds, int channel, double frequency) +{ int rv; - unsigned char b5,b4,b3,b2,b1,b0 ; + char request[256]; + unsigned char b[6]; + unsigned long long ftw = WORD(frequency, dds->clock); + + tobytes(ftw, b); - b5=(unsigned char)(Word/E40); - b4=(unsigned char)((Word - E40*b5)/E32); - b3=(unsigned char)((Word - E40*b5 - E32*b4)/E24); - b2=(unsigned char)((Word - E40*b5 - E32*b4 - E24*b3)/E16); - b1=(unsigned char)((Word - E40*b5 - E32*b4 - E24*b3 - E16*b2)/E8); - b0=(unsigned char)((Word - E40*b5 - E32*b4 - E24*b3 - E16*b2 - E8*b1)/1.0); - reste = (Word - E40*b5 -E32*b4 -E24*b3 -E16*b2 -E8*b1-1.0*b0) ; - - sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",0,10,b5,b4,b3,b2,b1,b0); - rv = DDS4xAD9912_SendCmd(DDSNum, Request) ; + sprintf(request, "set;%i;%i;%i;%i;%i;%i;%i;%i", 0, 10, b[5], b[4], b[3], b[2], b[1], b[0]); + rv = DDS4xAD9912_SendCmd(dds, channel, request); if (rv < 0) { - MessagePopup("DDS Serveur", "SetFrequency function failed !"); + MessagePopup("DDS", "SetFrequency function failed"); return -1; } - sprintf(Request,"set;%i;%i",0,18); - rv = DDS4xAD9912_SendCmd(DDSNum, Request) ; + sprintf(request, "set;%i;%i", 0, 18); + rv = DDS4xAD9912_SendCmd(dds, channel, request) ; if (rv < 0) { - MessagePopup("DDS Serveur", "IO_Update function failed !"); + MessagePopup("DDS", "IOUpdate function failed"); return -1; } - Instance->frequency[DDSNum - 1] = Freq - reste * Clk / E48; + dds->frequency[channel - 1] = (double)ftw * dds->clock / (double)(1ULL << 48); return 0; }
--- a/DDS4xAD9912.h Mon Feb 17 18:39:36 2014 +0100 +++ b/DDS4xAD9912.h Fri Feb 21 18:37:32 2014 +0100 @@ -1,70 +1,24 @@ -//============================================================================== -// -// Title: DDS4xAD9912.h -// Purpose: -// -// Created on: by Volodimer Laurent, modified by YLC -// Copyright: syrte. All Rights Reserved. -// -//============================================================================== - #ifndef __DDS4XAD9912_H__ #define __DDS4XAD9912_H__ +typedef struct { + char *host; + int port[4]; + double clock; + double frequency[4]; +} DDS4xAD9912_Data; + #ifdef __cplusplus extern "C" { #endif -//============================================================================== -// Include files - -#include "cvidef.h" - -//============================================================================== -// Defines - -#define Adress "145.238.205.55" -#define Port1 6665 -#define Port2 6666 -#define Port3 6667 -#define Port4 6668 -#define Clk 1000000000 -#define E48 281474976710656.0 -#define E40 1099511627776.0 -#define E32 4294967296.0 -#define E24 16777216.0 -#define E16 65536.0 -#define E8 256.0 - -//============================================================================== -// Macros - -#define WORD(Freq,Clk) pow(2,48)*(Freq/Clk) - -// DDS4xAD9912_Data : the data of crypto class DDS4xAD9912 - -typedef struct { - double frequency[4]; -} DDS4xAD9912_Data ; - -//============================================================================== -// Variables - -char Request[255]; -char Response[255]; -unsigned int hConv; - - -//============================================================================== -// Functions - double DDS4xAD9912_GetFrequency(DDS4xAD9912_Data *dds, int channel); +void DDS4xAD9912_Init(DDS4xAD9912_Data *d, const char *host, double clock); int DDS4xAD9912_SetFrequency(DDS4xAD9912_Data * Instance, int DDSNum, double Freq); int DDS4xAD9912_Reset(DDS4xAD9912_Data * Instance); int DDS4xAD9912_RampFrequency(DDS4xAD9912_Data *dds, int channel, double f2, double fstep); int DDS4xAD9912_RampFrequency2(DDS4xAD9912_Data *dds, int channel, double f1, double f2, double fstep); - #ifdef __cplusplus } #endif
--- a/FXAnalyse.c Mon Feb 17 18:39:36 2014 +0100 +++ b/FXAnalyse.c Fri Feb 21 18:37:32 2014 +0100 @@ -358,6 +358,7 @@ mupDefineVar(parser, "Sign2", &Sign2); mupDefineVar(parser, "Sign3", &Sign3); mupDefineVar(parser, "Ndiv", &Ndiv); + mupDefinePostfixOprt(parser, "P", &Peta, 1); mupDefinePostfixOprt(parser, "T", &Tera, 1); mupDefinePostfixOprt(parser, "G", &Giga, 1); @@ -383,6 +384,9 @@ int rv; double frequency; char expr[1024]; + char host[256]; + int port; + double clock; if ((MainPanel = LoadPanel (0, "FXAnalyse.uir", PANEL)) < 0) return -1; @@ -402,16 +406,15 @@ // data folder rv = Ini_GetStringCopy(configuration, "data", "folder", &datafolder); - if (rv <= 0) { + if (rv > 0) { + logmessage(INFO, "writing data files in %s", datafolder); + } else { logmessage(ERROR, "data folder not configured in %s", path); // do not allow to start the acquisition SetCtrlAttribute(MainPanel, PANEL_STARTBUTTON, ATTR_DIMMED, TRUE); } - // get AD9956 configuration parameters - char host[256]; - int port; - double clock; + // AD9956 configuration parameters rv = Ini_GetStringIntoBuffer(configuration, "AD9956", "host", host, sizeof(host)); if (! rv) return -1; @@ -422,16 +425,19 @@ if (! rv) return -1; - // dispose configuration - Ini_Dispose(configuration); - - // Sr data logger - sr_datalogger_init(&datalogger); - // dedrift DDS DDSFox_Initialize(&DDS1xAD9956, host, port, dedrift.freq0); - // initialize 4x AD9959 DDS box + // AD9912 configuration parameters + rv = Ini_GetStringIntoBuffer(configuration, "AD9912", "host", host, sizeof(host)); + if (! rv) + return -1; + rv = Ini_GetDouble(configuration, "AD9912", "clock", &clock); + if (! rv) + return -1; + + // initialize 4x AD9912 DDS box + DDS4xAD9912_Init(&DDS4xAD9912, host, clock); DDS4xAD9912_Reset(&DDS4xAD9912); GetCtrlVal(MainPanel, PANEL_DDS1, &frequency); DDS4xAD9912_SetFrequency(&DDS4xAD9912, 1, frequency); @@ -442,6 +448,12 @@ GetCtrlVal(MainPanel, PANEL_DDS4, &frequency); DDS4xAD9912_SetFrequency(&DDS4xAD9912, 4, frequency); + // dispose configuration + Ini_Dispose(configuration); + + // Sr data logger + sr_datalogger_init(&datalogger); + GetCtrlVal(MainPanel, PANEL_N1CHOICE, &N1); GetCtrlVal(MainPanel, PANEL_N2CHOICE, &N2); GetCtrlVal(MainPanel, PANEL_N3CHOICE, &N3);