#include "KMotionDef.h"

#define PWMCHAN 1
#define FACTOR (255.0/1000.0) // PWM COUNT/RPM
#define DIRECTION_BIT 33
#define SPEEDVAR 99
#define STATEVAR 98
#define KMVAR 1


// desired speed is passed from KMotionCNC in variable KMVAR
// save in user variable STATEVAR whether it was off, CW, or CCW (0,1,-1)
// save in user variable SPEEDVAR the last desired speed

main()
{
	float speed = *(float *)&persist.UserData[KMVAR];  // value stored is actually a float 
	float LastState = persist.UserData[STATEVAR];  // get last state 
	int PWM;
	
	persist.UserData[SPEEDVAR] = persist.UserData[KMVAR];  // Always save the last desired speed 
	
	if (LastState==0)  
	{
		// if spindle is off and User Changes the speed 
		// just save the desired speed
		
		return 0;
	}
	
	// spindle is already on, so ramp to new speed
	PWM = (int)LastState * speed * FACTOR;
	if (PWM<0)PWM=0;
	if (PWM>255)PWM=255;

	SetBitDirection(26+PWMCHAN,1);  // define bit as an output
	FPGA(IO_PWMS_PRESCALE) = 130;  	// divide clock by 130 (500 Hz)
	FPGA(IO_PWMS+2*PWMCHAN) = PWM;  // Duty Cycle
    FPGA(IO_PWMS+2*PWMCHAN+1) = 1;  // Enable PWM1
	
	printf("Spindle Speed=%f RPM DIR=%d PWM=%d\n",speed,LastState,PWM);
}
