AlphaBot - Defines *******************************************************************************/ #ifndef _ALPHABOT_H_ #define _ALPHABOT_H_ #include //------------------------------------------------------------------------------ //-- Data Types typedef unsigned char byte; typedef unsigned char bool; typedef unsigned char uchar; typedef unsigned int uint; typedef unsigned long ulong; //------------------------------------------------------------------------------ //-- Defines #define FOREVER while(1) #define FALSE 0 #define TRUE 1 #define BTN_ON 0 #define BTN_OFF 1 #define LED_ON 0 #define LED_OFF 1 #define MAX_LONG 0x7FFFFFFF #define sign(a) ((a<0)?-1:1) #define min(a,b) ((ab)?a:b) #define abs(a) ((a<0)?-a:a) //------------------------------------------------------------------------------ //-- Input interface pins #define D_JMP P3_4 #define D_BTN P3_4 #define MODE_S1 P1_2 //-- Debug mode #define MODE_S2 P1_1 //-- Dansing/Artistic Mode #define MODE_S3 PX_X #define MODE_DEBUG (MODE_S1==BTN_ON) #define MODE_ARTISTIC (MODE_S2==BTN_ON) #define BUMPER_LEFT P3_5 #define BUMPER_RIGHT P3_7 #define BUMPER_REAR P3_6 #define SENSOR_TILT P2_1 #define IS_TILTED (SENSOR_TILT==BTN_OFF) #define SENSOR_DARK P0_4 #define IS_DARK (SENSOR_DARK==BTN_OFF) #define SENSOR_HEADHOME P1_7 #define SENSOR_IR_SHORT P2_0 #define SENSOR_IR_SHORT_PUSHED (SENSOR_IR_SHORT == 1) #define SENSOR_IR_LONG_1 P0_5 #define SENSOR_IR_LONG_2 P0_6 #define SENSOR_IR_LONG_3 P0_7 #define SENSOR_LOWBAT PX_X #define SENSOR_SPEED_LEFT INT0 // P3_2 #define SENSOR_SPEED_RIGHT INT1 // P3_3 //------------------------------------------------------------------------------ //-- Beeper output #define BEEPER P1_0 #define BEEPER_ON TR2=1 #define BEEPER_OFF TR2=0 //------------------------------------------------------------------------------ //-- LEDs #define LED_HEART P0_0 #define LED_HEART_ON LED_HEART=LED_ON #define LED_HEART_OFF LED_HEART=LED_OFF #define LED_TWR_YELLOW P0_1 //-- do not use directly, use SetTwrColor #define LED_TWR_BLUE P0_2 #define LED_TWR_RED P0_3 #define LED_LOWBAT PX_X //------------------------------------------------------------------------------ //-- Head #define HEAD_HOME P1_7 #define HEAD_MOTOR1 P2_7 #define HEAD_MOTOR2 P2_6 #define HEAD_MOTOR3 P2_5 #define HEAD_MOTOR4 P2_4 #define HEAD_MAXRESETMOVES 100 //-- (no more than ~2 full head spins?) #define HEAD_RESETOFFSET 24 //-- clicks (left) from HH sensor to srtait position #define HEAD_MOVEDELAY 12 //-- ms //------------------------------------------------------------------------------ //-- Timer #define TIMER_VALUE 0xB7FE #define TIMER_RELOAD TH1=0xB7; TL1=0xFE; //#define TIMER_GET ((uint)256*TH1+TL1) #define TIMER_GET ((uint)256*(uint)TH1) //-- (presision is good enough) #define SECONDS *100 #define MINUTES *60*100 //------------------------------------------------------------------------------ //-- Drive/Speed #define SPEED_MIN 6 // in clicks/sec #define SPEED_NORMAL 9 #define SPEED_MAX 24 // 2 turns/sec #define MOTOR_MIN_LOAD 50 #define MOTOR_MAX_LOAD 255 #define SPEED_ADJUSTPERIOD (1 SECONDS / 4) //-- how oftern to adjust the speed #define SPEED_ERROR_ALLOW ( (long)(0xFFFF-TIMER_VALUE)*1 SECONDS /50 ) #define SPEED_MAX_STALL_COUNT (5 SECONDS) #define IS_WHEEL_STALLED(Side) (uiSpeed_StalledSheelCounter[Side] > SPEED_MAX_STALL_COUNT) #define MOTOR_L_SPEED_F CCAP1H #define MOTOR_L_SPEED_B CCAP0H #define MOTOR_R_SPEED_F CCAP2H #define MOTOR_R_SPEED_B CCAP3H //------------------------------------------------------------------------------ typedef enum { LEFT = 0, RIGHT = 1, ANYSIDE=2 } Side; typedef enum { SOFT, MEDIUM, HARD } StopMethod; //------------------------------------------------------------------------------ typedef enum { // YBR TWR_OFF = 0x00, // 000 TWR_YELLOW = 0x01, // 001 TWR_BLUE = 0x02, // 010 TWR_RED = 0x04, // 100 TWR_GREEN = 0x03, // 011 TWR_PURPLE = 0x06, // 110 TWR_ORANGE = 0x05, // 101 TWR_ON = 0x07 // 111 } TwrColor; //-- Show modes typedef enum { S_START, S_DIAG_BEGIN, S_DIAG_ERROR, S_DIAG_OK, S_BUMP_LEFT, S_BUMP_RIGHT, S_BUMP_REAR, S_BUMP_IR_SHORT, S_IR_LONG_SCAN, S_GOTHERE, S_TIME2SLEEP, S_SNORE, S_WAKEUP, S_WAITING, S_RANDOM, S_TILTED, S_STALLED, S_DANCE_STEP, S_DANCE_END } ShowMode; //------------------------------------------------------------------------------ //-- Sounds typedef enum { SND_OK, SND_ERROR, SND_RND, SND_CALL, SND_CONFUSED, SND_2WAY, SND_PHONE, SND_DEFAULT } SoundType; //------------------------------------------------------------------------------ //-- Status/Error massages typedef enum { STAT_INFO, STAT_WARN, STAT_ERROR } StatusCodeType; typedef enum { ST_DEFAULT, // 0 ST_DIAG_BUMBER_TEST, // 1 ST_DIAG_IR_SHORT_TEST, // 2 ST_DIAG_WAITFORFIX, // 3 ST_HEADHOMEERROR, // 4 ST_TASK_QUEUE_FULL // 5 } StatusCode; //------------------------------------------------------------------------------ //-- Behavioral Tasks / Doctrines #define MAX_TASKQUEUE_SIZE 10 typedef enum { T_WANDER, //-- Carry on, default begavior T_DRIVE, T_STOP, T_TURN, T_TILTED, T_DIAG, T_SWEEP, T_HIDE, //-- Drive out of the open area, until any bumber is hit T_PLAY, //-- Play with LEDs and sound T_IDLE } TaskType; typedef struct { TaskType Task; ulong Param; } TaskData; extern _idat TaskData TaskQueue[MAX_TASKQUEUE_SIZE]; extern _idat uchar ucTaskQueueLen; //------------------------------------------------------------------------------ //-- Drive /* typedef enum { DT_MAINTAIN, DT_STOP, DT_FORWARD, DT_LEFT, DT_RIGHT, DT_BACK, DT_BACK_LEFT, DT_BACK_RIGHT } DriveTask; */ //------------------------------------------------------------------------------ //-- Externals' Declarations extern ulong ulTickCount; //-- ****** SPEED ****** //-- LEFT([0]) & RIGHT([1]) //-- Speed setting to establish and maintain // +=forward & -=backward, // specified in wheel markings(clicks) per second // @ 12 wheel markings & 5" wheel: // 1 whhelturn/sec = 12 clicks/sec = 31.4"/sec // min speed = 1 unit = 1 click/sec = 31.4/12 = 2.6"/sec ~ 6.5cm/sec extern char cSpeed[2]; extern ulong ulMileage[2]; //-- Internal speed counters extern ulong ulSpeed_PrevTick[2], ulSpeed_CurTick[2]; extern uint uiSpeed_PrevCount[2], uiSpeed_CurCount[2]; extern uint uiSpeed_StalledSheelCounter[2]; //-- ****** ***** ****** extern _idat char cHeadPosition; //-- in clicks from the forwatd position, -=Left, +=Rihgt extern _idat uchar ucLrSensorDistance; //--- stoires result of the last Long Range IR Scan extern bit bButtonState; //------------------------------------------------------------------------------ extern void SetTwrColor(TwrColor eColor); extern void Show( ShowMode eShowMode ); extern void Delay( unsigned int uiMSecs ); //extern char sign( long lParam ); extern void Sound( SoundType eSound ); extern void Beep( unsigned int uiFreq, unsigned int uiMsec ); extern void SetBeeperFreq( unsigned int uiFreq ); extern void HeartBeat(void); extern bool Diagnostic( bool bFull ); //extern void CommStatusCode ( StatusCodeType eType, uchar ucCode ); extern void CommStatusCode ( StatusCodeType eType, ulong ulCode ); extern void Drive (void); extern bool MaintainSpeed(void); extern bool Stalled(void); extern void Reverse( Side eSide ); extern void Spin( char cSpeedLeft, char cSpeedRight, uint uiClicks ); extern void AllStop(StopMethod eStopMenthod); extern int Drive_GetLoad( Side eSide ); extern void Drive_SetLoad( Side eSide, int iValue ); extern uchar Drive_CalcLoadChange( long lSpeedError ); extern void AdjustWheelSpeed( Side eSide ); extern uchar ScanAt ( char cPosition ); extern char Sweep(void); extern void HeadMove( Side eSide ); extern bool HeadReset(void); extern bool Head2Home(void); extern void HeadStop(void); extern uchar LrSensor(void); extern void Behavior(void); extern void Behave_Tilted(void); extern void Behave_Dark(void); extern void Behave_Wander(void); extern void Dance(void); extern bool SetTask_Reverse(Side eSide); extern bool SetTask_Drive( char cSpeedLeft, char cSpeedRight, uchar ucMilageMax ); extern bool TaskQueue_Add( TaskType Task, ulong Param ); extern void TaskQueue_Remove(void); //------------------------------------------------------------------------------ //-- Misc #define IF_BUTTON_PUSHED(BUTTON) bButtonState = FALSE; \ if( BUTTON == BTN_ON ) \ { \ Delay(30); \ if( BUTTON == BTN_ON ) \ { \ bButtonState = TRUE; \ while( BUTTON == BTN_ON ) ; \ } \ } \ if( bButtonState ) //------------------------------------------------------------------------------ #endif // _ALPHABOT_H_