/* ECE 4760 Final Project
 * Spring 2010
 * Image Capture Using Phototransistor Array
 * Yunchi Luo yl477 Mengliang Yu my288
 *
 * Declarations of global constants. Contains macros for
 * converting from mm to motor steps and simpifying motor
 * movement
 */

//Port A Phototransistor
//Port B Motor
//Port C LEDs for debugging (motor positions)
//Port D2 LED on PCB. Flips whenever an Timer0
//                    overflow interrupt triggers

#define PORTMOTOR PORTB

#define READ(U, N) ((U) >> (N) & 1u)
#define SET(U, N) ((void)((U) |= 1u << (N)))
#define CLR(U, N) ((void)((U) &= ~(1u << (N))))
#define FLIP(U, N) ((void)((U) ^= 1u << (N)))

//Define Square Wave Width
#define pulse_width 34

//Define Motor Step State
#define STEP1 0
#define STEP2 1
#define STEP3 2
#define STEP4 3

//Define motor pins
#define H1 0
#define H2 2
#define H3 1
#define H4 3
#define V1 4
#define V2 6
#define V3 5
#define V4 7
//forward order
/*
#define H1 0
#define H2 2
#define H3 1
#define H4 3
#define V1 4
#define V2 6
#define V3 5
#define V4 7
*/
//reverse order
/*
#define H1 3
#define H2 1
#define H3 2
#define H4 0
#define V1 7
#define V2 5
#define V3 6
#define V4 4*/

//ideal 180 115
#define X_MAX MM_TO_STEP(180)//MM_TO_STEP(120) 180
#define Y_MAX MM_TO_STEP(115)//MM_TO_STEP(95) 150

//convert millimeter to number of steps
#define MM_TO_STEP(M) (int)((float)M/0.026458)

//scanning control steps
#define X_STEP MM_TO_STEP(5)//7.5
#define Y_STEP MM_TO_STEP(40)
#define LEFT 0
#define RIGHT 1

//State Variables
char count;
volatile int posX, posY, posXtarget, posYtarget;
volatile char moving; //indicate whether motors are moving
volatile char scanning; //flag to indicate whether scan in progress
char motorStateH, motorStateV; //motor state

//Serial I/O variables
char in_buffer[40];

//Define Functions
void moveTo(int x, int y);
void transistorScan(void);
void initialize(void);

//Define Macros
//macros to help motor control
#define up(s)   moveTo(posXtarget,posYtarget-s)
#define down(s) moveTo(posXtarget,posYtarget+s)
#define left(s) moveTo(posXtarget+s,posYtarget)
#define right(s) moveTo(posXtarget-s,posYtarget)
