#include	<stdio.h>

#define	_USE_MATH_DEFINES	1
#include	<math.h>

//==============================================================================
//==============================================================================
//-- The following code is a simple example to:
//-- generate a user defined file (.uda) consisting of a concatenation of
//-- sine, ramp, square, and triangle waveforms.
//-- Marker 1 is also active several times in each waveform
//-- From the GUI you can open the user-defined file generated by this code
//-- and then download that user-defined file to the module
//-- For best results, you should modify the next dozen lines to match your AWG model

#define	FULL_SCALE	4096

void	main( )
{
	int	mux = 16;		// 16:1 AWG801
	//int	mux = 8;	// 8:1 AWG452, AWG472
	//int	mux = 4;	// 4:1 AWG252, AWG272

	//FILE	*fout = fopen( "c:\\bin\\user_define_for801.uda", "w+" );
	FILE	*fout = fopen( "c:\\Program Files\\Euvis\\AWG\\user_define_for801.uda", "w+" );
	//FILE	*fout = fopen( "c:\\Program Files\\Euvis\\AWG\\user_define_for452.uda", "w+" );
	//FILE	*fout = fopen( "c:\\Program Files\\Euvis\\AWG\\user_define1.uda", "w+" );



	unsigned	i, j, k, v, marker;
	unsigned	length,length1,length2;

	printf( "User-Defined for Bench Marking ...\n" );
	if( !fout )
	{
		printf( "Error in Opening File\n" );
		return;
	}

	fprintf( fout, ";---- User-Defined for BenchMarking for 16 banks\n" );
	fprintf( fout, "#type=5\n" );
	fprintf( fout, "#hex=1\n" );
	fprintf( fout, ";---- User Defined File Generator Example\n" );

	//length	= 4096 + 1024;	// 0x1400
	length	= 8192 + 1024;	// 0x1400
	length1	= 512;
	length2	= 0x100;

	fprintf( fout, ";---- Head\n" );
	for( i=0; i<length1; i++ )
	{
		k = i % 0x40;
		v = (FULL_SCALE-1) * ( 1+ sin( k / 64. * 2 * M_PI ) ) / 2.;

		marker = 0;
		//---- Marker 1
		if( i==mux ) marker |= 1;

		if( i==mux*3 ) marker |= 1;
		if( i==mux*4 ) marker |= 1;

		if( i==mux*6 ) marker |= 1;
		if( i==mux*7 ) marker |= 1;
		if( i==mux*8 ) marker |= 1;
		if( i==mux*9 ) marker |= 1;

		//---- Marker 2
		//if( i>=0x200 && i<0x300 ) marker |= 2;

		//---- Marker 3
		//if( i>=0x300 && i<0x400 ) marker |= 4;

		fprintf( fout, "%03X %01X\t; [%6d]\n", v, marker, i );
	}

	fprintf( fout, ";---- Body\n" );
	for( ; i<(length-length2); i++ )
	{
		j=i/0x40;	// Select the waveform section
		j=j%4;
		k = i % 64;
		switch( j ) 
		{
		case	0:	// Sine
			v = (FULL_SCALE-1) * ( 1+ sin( k / 64. * 2 * M_PI ) ) / 2.;
			break;

		case	1:	// Ramp
			v = k * FULL_SCALE / 64;
			break;

		case	2:	// Square
			if( k<32 ) v =0;
			else v = FULL_SCALE-1;
			break;

		case	3:	// Triangle
			if( k<0x10 )		v = (FULL_SCALE-1) * ( 1. +  k/16. ) / 2;
			else if( k<0x30 )	v = (FULL_SCALE-1) * ( 2. - (k-16)/16. ) / 2;
			else				v = (FULL_SCALE-1) * ( (k-48)/16. ) / 2;
			break;
		}

		marker = 0;
		//if( i>=0x100 && i<0x200 ) marker |= 1;
		//if( i>=0x200 && i<0x300 ) marker |= 2;
		//if( i>=0x300 && i<0x400 ) marker |= 4;

		fprintf( fout, "%03X %01X\t; [%6d]\n", v, marker, i );
	}

	fprintf( fout, ";---- Tail\n" );

	for( ; i<length; i++ )
	{
			k = i % 0x40;
			if( k<0x10 )		v = (FULL_SCALE-1) * ( 1. +  k/16. ) / 2;
			else if( k<0x30 )	v = (FULL_SCALE-1) * ( 2. - (k-16)/16. ) / 2;
			else				v = (FULL_SCALE-1) * ( (k-48)/16. ) / 2;

		marker = 0;
		j = length - i;

		//---- Marker 1
		if( j==mux ) marker |= 1;

		if( j==mux*3 ) marker |= 1;
		if( j==mux*4 ) marker |= 1;

		if( j==mux*6 ) marker |= 1;
		if( j==mux*7 ) marker |= 1;
		if( j==mux*8 ) marker |= 1;
		if( j==mux*9 ) marker |= 1;

		//---- Marker 2
		if( j<0x40 ) marker |= 2;

		//---- Marker 3
		//if( i>=0x300 && i<0x400 ) marker |= 4;

		fprintf( fout, "%03X %01X\t; [%6d]\n", v, marker, i );
	}

	printf( "The .uda file has been generated in your program folder. \nPlease use the GUI to download that file to your module.\n" );

}