program WFG
%%#include <math.h>
%%#define PI 3.14159265
int SET;
assign SET to "TDL:WFG:SET";
monitor SET;

int FUNC;
assign FUNC to "TDL:WFG:FUNC";

double WAVE[500];
assign WAVE to "TDL:WFG:WAVE";

double AMP;
double PERIOD;
assign AMP to "TDL:WFG:AMP";
assign PERIOD to "TDL:WFG:PERIOD";

int i;
double a;

ss function_generator
{
	state init
	{
  	 when()
	 {
	   for (i=0;i<500;i++)
	   {
		 WAVE[i]=0;
	   }
		
	 } state fg
	}
	state fg
	{
	 when(SET == 1){
	  SET=0;
	  pvPut(SET);
	  pvGet(AMP);
	  pvGet(PERIOD);
	  if (PERIOD <1e-3) PERIOD=1e-3;
          pvGet(FUNC);
	  
	%{
	  switch (FUNC){
		case 0 :for (i=0;i<500;i++)
	    		{
			WAVE[i]=AMP*sin(2*PI/PERIOD*i);
	    		}
			break;
	  	case 1 : 
			for (i=0;i<500;i++) { 
			WAVE[i]=AMP/PERIOD*(fmod(i*1.0,PERIOD));
			}
			break;
		case 2 : for (i=0;i<500;i++){
			if (fmod(i*1.0,PERIOD)>PERIOD/2.0) WAVE[i]=AMP;
			else WAVE[i]=-AMP;
			}
			break;
			}
	}%
	 pvPut(WAVE);
	} state fg
	}
}