diff DDS_Fox.c @ 0:d9aae7d7f2c6

Import
author Daniele Nicolodi <daniele.nicolodi@obspm.fr>
date Tue, 03 Jul 2012 10:38:59 +0200
parents
children adc9e2a67547
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DDS_Fox.c	Tue Jul 03 10:38:59 2012 +0200
@@ -0,0 +1,474 @@
+#include "DDS Fox control.h"
+#include <userint.h>
+#include <tcpsupp.h>
+#include <ansi_c.h>
+#include "DDS_Fox.h"
+
+//#define DDS_IP "192.168.0.3"
+//#define TCP_PORT 6665
+
+#define DIV 0			   // divided by 1
+#define CMD_SEP ";"
+#define BASE_TIME 0.01
+
+#define CMD_CONFIG_REG1 1  // cmd d'acces direct au rergistre 1 de config de la DDS (voir datasheet)
+#define CMD_CONFIG_REG2 2  // cmd d'acces direct au rergistre 1 de config de la DDS (voir datasheet)
+#define CMD_SINGLE_FREQ_PROF0 7
+#define CMD_PROFILE 15	   // cmd de choix du profile de fonctionnement de la DDS (voir datasheet)
+#define CMD_ATTENUATION 16
+#define CMD_RESET_DDS 17
+#define CMD_NOP 20
+#define CMD_FREQ_INF 21
+#define CMD_FREQ_SUP 22
+#define CMD_DF 23
+#define CMD_DT 24
+#define CMD_START_SWEEP 25
+#define CMD_STOP_SWEEP 26
+#define CMD_GET_FREQ 28
+#define CMD_SWEEP_SIGN 29
+
+
+/************************* Global variables ***********************************/ 
+//static char  Request[255]; 
+
+/************************* My own functions ***********************************/
+/*DDSParameter DDSGetParam (int panel, int control) {
+	DDSParameter Parameter ;
+	
+	GetCtrlVal (panel, CONTROL_DDS_IP, Parameter->ip) ;
+	GetCtrlVal (panel, CONTROL_DDS_PORT, &(Parameter->Port)) ;
+	GetCtrlVal (panel, CONTROL_DDS_CLOCK, &(Parameter->Clock)) ;
+	GetCtrlVal (panel, CONTROL_DDS_RATE, &(Parameter->SweepRate)) ;
+	GetCtrlVal (panel, CONTROL_DDS_DELTA_T, &(Parameter->Delta_T)) ;
+	return(Parameter);
+}*/
+
+
+
+void DDS_Initialize (DDSParameter *Param) {
+	char  Request[255]; 
+	//send NOP command 
+	sprintf(Request,"set;%i;%i",1,CMD_NOP);   
+	SendCmd(Request, Param) ;
+	//reset the DDS
+	DDSFox_Reset(Param);
+	
+	//Set Profile Number 0 (only one used for soft frequecy sweep)
+//	sprintf(Request,"set;%i;%i;%i",1,CMD_PROFILE,0);   
+//	SendCmd(Request, Param) ; 
+	
+	//Set Profile Number 7 (only one used for soft frequecy sweep)
+	sprintf(Request,"set;%i;%i;%i",1,CMD_PROFILE,7);   
+	SendCmd(Request, Param) ; 
+
+
+	//Set Clock Divider to 00b (which means 1)
+	DDSFox_SetDiv(Param);
+    //Set sweep rate at 0	
+	DDSFox_SetFreqMax (Param);
+	DDSFox_SetFreq (Param) ;
+	DDSFox_SetDT (Param) ;
+	DDSFox_SetDf (Param) ;
+	DDSFox_StartSweep (Param) ;
+	return ;
+}
+
+void DDS_ReInitialize (DDSParameter *Param) {
+	char  Request[255]; 
+	//send NOP command 
+	sprintf(Request,"set;%i;%i",1,CMD_NOP);   
+	SendCmd(Request, Param) ;
+	//reset the DDS
+	//DDSFox_Reset(Param);
+	
+	//Set Profile Number 0 (only one used for soft frequecy sweep)
+//	sprintf(Request,"set;%i;%i;%i",1,CMD_PROFILE,0);   
+//	SendCmd(Request, Param) ; 
+	
+	//Set Profile Number 7 (only one used for soft frequecy sweep)
+	sprintf(Request,"set;%i;%i;%i",1,CMD_PROFILE,7);   
+	SendCmd(Request, Param) ; 
+
+
+	//Set Clock Divider to 00b (which means 1)
+	DDSFox_SetDiv(Param);
+    //Set sweep rate at 0	
+	DDSFox_SetFreqMax (Param);
+	DDSFox_SetFreq (Param) ;
+	DDSFox_SetDT (Param) ;
+	DDSFox_SetDf (Param) ;
+	DDSFox_StartSweep (Param) ;
+	return ;
+}
+
+
+void DDSFox_Reset(DDSParameter *Param) {
+	char  Request[255]; 
+	sprintf(Request,"set;%i;%i",1,CMD_NOP);   
+	SendCmd(Request, Param) ;
+	sprintf(Request,"set;%i;%i",1,CMD_RESET_DDS);   
+	SendCmd(Request, Param) ;
+	return ;
+}
+
+
+void DDSFox_StopSweep(DDSParameter *Param) {
+	char  Request[255];
+    sprintf(Request,"set;%i;%i;%i",1,CMD_STOP_SWEEP,1); 
+  	SendCmd(Request, Param);
+	return ;
+}
+
+
+void DDSFox_StartSweep(DDSParameter *Param) {
+	char  Request[255];
+    sprintf(Request,"set;%i;%i;%i",1,CMD_START_SWEEP,1); 
+  	SendCmd(Request, Param);
+	return ;
+}
+
+void DDSFox_SetFreqMax (DDSParameter *Param) {
+	double word ;
+	unsigned char octets[6];
+	char  Request[255]; 
+	convert_double_6char(pow(2,48)/2,octets);	 // borne sup : clock / 2
+	sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_FREQ_SUP,
+		*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+	SendCmd(Request, Param);
+	DDSFox_SetSweepSign (Param);
+	return ;
+}
+
+void DDSFox_SetFreqMin (DDSParameter *Param) {
+	double word ;
+	unsigned char octets[6];
+	char  Request[255]; 
+	convert_double_6char(1,octets);	 // borne inf : ~0
+	sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_FREQ_INF,
+		*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+	SendCmd(Request, Param);
+	DDSFox_SetSweepSign (Param);
+	return ;
+}
+
+void DDSFox_SetFreq (DDSParameter *Param) {
+	double word ;
+	unsigned char octets[6];
+	int SweepSign = -1 ;
+	char  Request[255]; 
+	if (Param->Profil == 0) {
+		word = pow(2,48)*(Param->Frequency/Param->Clock);
+		convert_double_6char(word, octets);			// borne inf : la freq voulu	
+		sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_FREQ_INF,
+			*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+		SendCmd(Request, Param);
+	}
+	else if(Param->Profil == 7) {
+		SweepSign = DDSFox_GetSweepSign(Param) ;
+		if(SweepSign == 0){								// sweep positif
+			word = pow(2,48)*(Param->Frequency/Param->Clock);
+			convert_double_6char(word, octets);			// borne inf : la freq voulu	
+			sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_FREQ_INF,
+				*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+			SendCmd(Request, Param);
+			DDSFox_SetFreqMax (Param);
+		}
+		else {											// sweep neg
+			word = pow(2,48)*(Param->Frequency/Param->Clock);
+			convert_double_6char(word, octets);				// borne sup : la freq voulue	
+			sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_FREQ_SUP,
+				*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+			SendCmd(Request, Param);
+			DDSFox_SetFreqMin (Param);
+		}
+	}
+	return ;
+}
+
+
+// Change le signe de sweep en frequence. Argument: struct de param de la DDS
+void DDSFox_SetSweepSign(DDSParameter *Param) {
+	char  Request[255] ; 
+	int SweepSign ;
+	SweepSign = DDSFox_GetSweepSign(Param) ;
+	sprintf(Request,"set;%i;%i;%i",1,CMD_SWEEP_SIGN, SweepSign) ; 
+	SendCmd(Request, Param) ;
+	return ;
+}
+
+/*void DDSFox_SetSweepSign(DDSParameter *Param) {
+	char  Request[255] ; 
+	int SweepSign ;
+	if (Param->Profil == 7)
+		Param->Frequency = DDSFox_ReadFreq(Param) ;
+	DDSFox_SetFreq (Param) ;
+	SweepSign = DDSFox_GetSweepSign(Param) ;
+	sprintf(Request,"set;%i;%i;%i",1,CMD_SWEEP_SIGN, SweepSign) ; 
+	SendCmd(Request, Param) ;
+	return ;
+}*/
+
+
+// Change la valeur de la base pour 'lincrement de frequence (sweep). Argument: delta T x 10ms, retourne rien.
+void DDSFox_SetDT(DDSParameter *Param) {
+	char  Request[255]; 
+	int dt= 0;
+	char FTW0[255]="0";	   /**** sinon le fichier inf.xx est faux 	   ***/
+	dt = ((Param->Delta_T)/BASE_TIME) - 1 ;
+	sprintf(FTW0,"%ims",dt);
+	sprintf(Request,"set;%i;%i;%i;%s",1,CMD_DT, dt ,FTW0);
+	SendCmd(Request, Param) ; 
+	return ;
+}
+
+
+// Change le facteur de division de la clock. Argument: facteur de div, retourne rien 
+void DDSFox_SetDiv(DDSParameter *Param) {
+	char  Request[255]; 
+	int Div = DIV ;
+	Command Rd;
+	char  temp;
+	init_command(&Rd);
+	sprintf(Request,"get;%i;%i",1,CMD_CONFIG_REG2);      
+	if (RecvCmd(&Rd, Request, Param) < 0)
+		return;
+	temp = atoi(Rd.value2) ;
+	temp = temp & 0x9F ; 
+	temp = temp | Div << 5 ;
+	sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i",1,CMD_CONFIG_REG2,atoi(Rd.value0),
+			atoi(Rd.value1),temp,atoi(Rd.value3),atoi(Rd.value4)) ;
+	SendCmd(Request, Param) ;
+	return ;
+}
+
+
+
+void DDSFox_SetDf(DDSParameter *Param) {
+	char  Request[255]; 
+	double word ;
+	unsigned char *octets;
+	word = pow(2,48)*(fabs(Param->SweepRate)*Param->Delta_T/Param->Clock);
+	octets=malloc(6*sizeof(unsigned char));
+	convert_double_6char(word, octets);	
+	sprintf(Request,"set;%i;%i;%i;%i;%i;%i;%i;%i",1,CMD_DF,
+		*(octets+5),*(octets+4),*(octets+3),*(octets+2),*(octets+1),*octets); 
+	SendCmd(Request, Param);
+	free(octets);
+	return ;
+}
+
+int DDSFox_GetSweepSign(DDSParameter *Param) {
+	if (Param->SweepRate >= 0) return(0);
+	else return(1);
+}
+
+
+double DDSFox_ReadFreq(DDSParameter *Param) {
+	char  Request[255]; 
+	unsigned int OctetA, OctetB, OctetC, OctetD, OctetE, OctetF ;
+	double FreqRead ;
+	int cmd[20];
+	Command Rd;
+	init_command(&Rd);
+	sprintf(Request,"get;%i;%i",1,CMD_GET_FREQ); 
+	if (RecvCmd(&Rd, Request, Param) == -1)
+		return -1.;
+	OctetA=atoi(Rd.value0);
+	OctetB=atoi(Rd.value1); 
+	OctetC=atoi(Rd.value2); 
+	OctetD=atoi(Rd.value3); 
+	OctetE=atoi(Rd.value4); 
+	OctetF=atoi(Rd.value5);
+	FreqRead=(double)(1099511627776*OctetA +4294967296*OctetB +16777216*OctetC +65536*OctetD +256*OctetE +OctetF);    
+	FreqRead=(FreqRead*Param->Clock)/ pow(2,48);
+	//sprintf(parsebuf,"%fMHz",FreqRead/1000000);
+	return(FreqRead);
+}
+
+
+/************************ Fonction de communications TCP ******************/
+static const double timeout = 0.5;
+
+
+int SendCmd(char *Buffer, DDSParameter *Param) {
+	unsigned int hConv=0;
+	char  Response[255];
+	char parsebuf[255];
+	if (ConnectToTCPServer (&hConv, Param->Port, Param->ip, OnTCPEvent, Response, 0) < 0) {
+		printf("Connect failed\n");
+		return -1;
+	}
+	if (ClientTCPWrite (hConv, Buffer, strlen(Buffer)+1, 0) < 0) {
+		printf("Write failed\n");
+		return -1;
+	}
+	sprintf(Response,"                              ");
+	if (ClientTCPRead (hConv, Response, 255, 0) < 0) {
+		printf("Read failed\n");
+		return -1;
+	}
+	if (strncmp("OK",Response,2)) {
+		printf("Response failed %s %s\n", Buffer, Response);
+		return -1;
+	}
+	return 0;
+}
+
+
+int RecvCmd(Command *Rd, char * Buffer, DDSParameter *Param) {
+	unsigned int hConv=0;
+	char parsebuf[255];
+	char  Response[255];
+	if (ConnectToTCPServer (&hConv, Param->Port, Param->ip, OnTCPEvent, Response, 0) < 0) {
+		printf("Connect failed\n");
+		return -1;     
+	}
+	if (ClientTCPWrite (hConv, Buffer, strlen(Buffer)+1, 0) < 0) {
+		printf("Write failed\n");
+		return -1;
+	}
+	sprintf(Response,"                              ");     
+	if (ClientTCPRead (hConv, Response, 255, 0) < 0) {
+		printf("Read failed\n");
+		return -1;
+	}
+
+	if (strncmp(Buffer,Response,strlen(Buffer))) {
+		printf("Response failed %s %s\n", Buffer, Response);
+		return -1;
+	}
+	
+	sprintf(parsebuf,"%s",Response) ;	 
+	parse_command(Rd, parsebuf) ; 	 
+	return 0;
+}
+
+
+int OnTCPEvent(unsigned handle, int xType, int errCode, void *callbackData) {
+	//char* Response = (char*)(callbackData);
+	//char Response[255];
+	//switch(xType) {
+	//	case TCP_DISCONNECT :
+			//printf("Server disconnected\n");
+	//		break;
+	//	case TCP_DATAREADY :
+			//printf("Server data ready\n");
+			//ClientTCPRead (handle, Response, 255, 5);
+	//		break;
+	//}
+	return 0;
+}
+
+/************************ Fonction de mise en forme des données pour le transfert ******************/
+
+void parse_command2(int* cmd, char* buf)
+{
+	char* pointer;
+	int c = 0;
+	
+	pointer = strtok( buf, CMD_SEP );
+	while( pointer ){
+		if ((c > 2) && ( c < 19 ))
+		{
+			cmd[c-3] = atoi(pointer);
+			printf("%i", cmd[c-3]);
+		}
+			
+			
+		pointer = strtok( NULL, CMD_SEP );
+		c++;
+	}
+}
+
+
+int parse_command(Command *cmd1, char *buf){
+	char* pointer;
+	int c = 0;
+	
+	pointer = strtok( buf, CMD_SEP );
+	while( pointer ){
+		if( c == 0 ){
+			cmd1->action = pointer;
+		}
+		else if( c == 1 ){
+			cmd1->canal = pointer;
+		}
+		else if( c == 2 ){
+			cmd1->command = pointer;
+		}
+		else if( c == 3 ){
+			cmd1->value0 = pointer;
+		}
+		else if( c == 4 ){
+			cmd1->value1 = pointer;
+		}
+		else if( c == 5 ){
+			cmd1->value2 = pointer;
+		}
+		else if( c == 6 ){
+			cmd1->value3 = pointer;
+		}
+		else if( c == 7 ){
+			cmd1->value4 = pointer;
+		}				 
+		else if( c == 8 ){
+			cmd1->value5 = pointer;
+		}
+		else if( c == 9 ){
+			cmd1->value6 = pointer;
+		}
+		else if( c == 10 ){
+			cmd1->value7 = pointer;
+		}
+		pointer = strtok( NULL, CMD_SEP );
+		c++;
+	}
+	return 0;
+}
+
+
+int init_command(Command *cmd1){
+	cmd1->action = NULL;
+	cmd1->canal = NULL;
+	cmd1->command = NULL;
+	cmd1->value0 = NULL;
+	cmd1->value1 = NULL;
+	cmd1->value2 = NULL;
+	cmd1->value3 = NULL;
+	cmd1->value4 = NULL;
+	cmd1->value5 = NULL;
+	cmd1->value6 = NULL;
+	cmd1->value7 = NULL;
+	cmd1->value8 = NULL;
+	cmd1->value9 = NULL;
+	cmd1->value10 = NULL;
+	cmd1->value11 = NULL;
+	cmd1->value12 = NULL;
+	cmd1->value13 = NULL;
+	cmd1->value14 = NULL;
+	cmd1->value15 = NULL;
+	cmd1->value16 = NULL;
+	cmd1->value17 = NULL;
+	cmd1->value18 = NULL;
+	cmd1->value19 = NULL;
+	return 0;
+}
+
+
+//Convert double into 6 bytes sent back by an unsigned char pointer
+int convert_double_6char (double fraction, unsigned char* octets) {
+	double  bita, bitb, bitc, bitd, bite, bitf;
+	bitf= fraction/(1099511627776.0); 
+	*(octets+5)=(unsigned char)bitf;
+	bite= (fraction-1099511627776.0*(*(octets+5)))/(4294967296.0);
+	*(octets+4)=(unsigned char)bite;
+	bitd=(fraction-1099511627776.0*(*(octets+5))- 4294967296.0*(*(octets+4)))/( 16777216.0);
+	*(octets+3)=(unsigned char)bitd;
+	bitc=(fraction-1099511627776.0*(*(octets+5))- 4294967296.0*(*(octets+4))-16777216.0*(*(octets+3)))/( 65536.0);
+	*(octets+2)=(unsigned char)bitc;
+	bitb= (fraction-1099511627776.0*(*(octets+5))- 4294967296.0*(*(octets+4))-16777216.0*(*(octets+3))-65536*(*(octets+2)))/ 256.0;
+	*(octets+1)=(unsigned char)bitb;
+	bita= (fraction-1099511627776.0*(*(octets+5))- 4294967296.0*(*(octets+4))-16777216.0*(*(octets+3))-65536*(*(octets+2))-256.0*(*(octets+1)))/ 1.0;  
+	*(octets)=(unsigned char)bita;
+	return 0;
+}