/***********************************************************
         /\ /\
       -'<o_o>'-   _
 Nyaw!   () ()\  ,'_\
         ( . ) )/._./
        (_)-(_).--'

	Jesse W.
	Timer3 pulse width modulation Header file
	designed for standard r/c servos and speed controls
	Made: 8-11-06
************************************************************/
#ifndef PWM_H
#define PWM_H

/*roll over number*/
#define TOP	40000u

#define CH_3A	0x01
#define CH_3B	0x02
#define CH_3C	0x04

/*standard servo positions*/
#define CENTER_POS 	1500u
#define LEFT_POS	500u
#define RIGHT_POS	2500u

/*compare registers*/
#define PWM_3A		OCR3A
#define PWM_3B		OCR3B
#define PWM_3C		OCR3C


#define POA(pos, offset)	( pos + offset ) //Pysical Offset Applied 

/*to define later*/
#define PWM_3A_LEFT			(LEFT_POS+500)//raw
#define PWM_3A_RIGHT		(RIGHT_POS-500)//raw
#define PWM_3A_CENTER		CENTER_POS//raw
#define PWM_3A_OFFSET		0//when set to signal center, the difference to the physical center
#define PWM_3A_LEFT_OA		POA(PWM_3A_LEFT, PWM_3A_OFFSET)	//Offset applied
#define PWM_3A_RIGHT_OA		POA(PWM_3A_RIGHT, PWM_3A_OFFSET)//Offset applied
#define PWM_3A_CENTER_OA	POA(PWM_3A_CENTER, PWM_3A_OFFSET)//Offset applied


#define PWM_3B_LEFT			(LEFT_POS+800)//raw
#define PWM_3B_RIGHT		(RIGHT_POS-800)//raw
#define PWM_3B_CENTER		CENTER_POS//raw
#define PWM_3B_OFFSET		0
#define PWM_3B_LEFT_OA		POA(PWM_3B_LEFT, PWM_3B_OFFSET)	//Offset applied
#define PWM_3B_RIGHT_OA		POA(PWM_3B_RIGHT, PWM_3B_OFFSET)//Offset applied
#define PWM_3B_CENTER_OA	POA(PWM_3B_CENTER, PWM_3B_OFFSET)//Offset applied

//needs to be swaped left is actually right
#define PWM_3C_LEFT			(LEFT_POS)//raw
#define PWM_3C_RIGHT		(RIGHT_POS)//raw
#define PWM_3C_CENTER		CENTER_POS//raw
#define PWM_3C_OFFSET		(1* 200)
#define PWM_3C_LEFT_OA		POA(PWM_3C_LEFT, PWM_3C_OFFSET)	//Offset applied
#define PWM_3C_RIGHT_OA		POA(PWM_3C_RIGHT, PWM_3C_OFFSET)//Offset applied
#define PWM_3C_CENTER_OA	POA(PWM_3C_CENTER, PWM_3C_OFFSET)//Offset applied




/*set by raw value*/
#define PWM_SET(pwm, position)	pwm = (position*2)


/*to set up initialy*/
void pwm3Init(unsigned char mask);

/*to turn off*/
void pwm3Off(unsigned char mask);

/*to ensure that a servo doesn't go
  over or under a certain value*/
void pwm3A_SetSafe(signed int pos);
void pwm3B_SetSafe(signed int pos);
void pwm3C_SetSafe(signed int pos);

/* defines for easier reading in main.c*/
//Scan = 3C
#define Scan_Left_Limit			(PWM_3C_LEFT - CENTER_POS )
#define Scan_Right_Limit 		(PWM_3C_RIGHT - CENTER_POS )
#define	Scan_Center		 		(PWM_3C_CENTER - CENTER_POS )

//Steer = 3B
#define Steer_Left_Limit 		(PWM_3B_LEFT - CENTER_POS )
#define Steer_Right_Limit 		(PWM_3B_RIGHT - CENTER_POS )
#define	Steer_Center			(PWM_3B_CENTER - CENTER_POS )

//Speed = 3A
#define Speed_Reverse_Limit 	(PWM_3A_LEFT - CENTER_POS )
#define Speed_Forward_Limit 	(PWM_3A_RIGHT - CENTER_POS )
#define	Speed_Stop		 		(PWM_3A_CENTER - CENTER_POS )

#define Speed_Set(position)		pwm3A_SetSafe(position)
#define Steer_Set(position)		pwm3B_SetSafe(position)
#define Scan_Set(position)		pwm3C_SetSafe(position)

#endif 
