#include <timers12.h>
#include "ME218_E128.h"
#include "S12eVec.h"
#include "ADS12e.H"
#include "Events.h"
#include "GameDefs.h"
static unsigned int beaconDC;
static char completedRuns;
typedef enum {
black, red, green, white
} TapeState;
static TapeState tapeB = white, tapeR = white,
tapeC = white, tapeL = white;
TapeState GetTapeB(void) {
return tapeB;
}
TapeState GetTapeL(void) {
return tapeL;
}
TapeState GetTapeR(void) {
return tapeR;
}
char SeeFlash(void) {
return((PTT & BIT1HI) != 0);
}
int BeaconStr(void) {
return ADS12_ReadADPin(4);
}
char CheckBeacon(void) {
static int cnt50, cnt90, cntBad;
static char duty, lastBeaconEvent;
if(!Expired(BEACON))
duty = beaconDC;
else
duty = 0;
if(duty > ABOUT_40 && duty < ABOUT_60)
cnt50++;
else
if(duty > ABOUT_80 && duty < ABOUT_100)
cnt90++;
else
cntBad++; if(cnt50 > ACCEPT_BEACON) {
if(cnt90 + cntBad <= REJECT_BEACON) {
cnt50 = cnt90 = cntBad = 0;
if(lastBeaconEvent != SEE_DISPENSER)
return(lastBeaconEvent = SEE_DISPENSER);
else
return(NO_EVENT);
}
else {
cnt50 = cnt90 = cntBad = 0;
if(lastBeaconEvent != LOST_BEACON)
return(lastBeaconEvent = LOST_BEACON);
else
return(NO_EVENT);
}
} if(cnt90 > ACCEPT_GOAL) {
if(cnt50 + cntBad <= REJECT_BEACON) {
cnt50 = cnt90 = cntBad = 0;
if(lastBeaconEvent != SEE_GOAL)
return(lastBeaconEvent = SEE_GOAL);
else
return(NO_EVENT);
}
else {
cnt50 = cnt90 = cntBad = 0;
if(lastBeaconEvent != LOST_BEACON)
return(lastBeaconEvent = LOST_BEACON);
else
return(NO_EVENT);
}
} if(cntBad > REJECT_BEACON) {
cnt50 = cnt90 = cntBad = 0;
if(lastBeaconEvent != LOST_BEACON)
return(lastBeaconEvent = LOST_BEACON);
else
return(NO_EVENT);
}
return(NO_EVENT);
}
char CheckTapeB(void) {
static unsigned int cntBlack;
if(ADS12_ReadADPin(0) > BLACK) {
if(++cntBlack > ACCEPT_TAPE) { cntBlack = ACCEPT_TAPE;
if(tapeB != black) {
tapeB = black;
return(TRUE);
}
}
}
else { cntBlack = 0;
if(tapeB != white) {
tapeB = white;
return(TRUE);
}
}
return(FALSE);
}
char CheckTapeL(void) {
static unsigned int cntBlack;
if(ADS12_ReadADPin(1) > BLACK) {
if(++cntBlack > ACCEPT_TAPE) { cntBlack = ACCEPT_TAPE;
if(tapeL != black) {
tapeL = black;
return(TRUE);
}
}
}
else { cntBlack = 0;
if(tapeL != white) {
tapeL = white;
return(TRUE);
}
}
return(FALSE);
}
char CheckTapeC(void) {
static unsigned int cntBlack;
if(ADS12_ReadADPin(2) > BLACK) {
if(++cntBlack > ACCEPT_TAPE) { cntBlack = ACCEPT_TAPE;
if(tapeC != black) {
tapeC = black;
return(TRUE);
}
}
}
else { cntBlack = 0;
if(tapeC != white) {
tapeC = white;
return(TRUE);
}
}
return(FALSE);
}
char CheckTapeR(void) {
static unsigned int cntBlack;
if(ADS12_ReadADPin(3) > BLACK) {
if(++cntBlack > ACCEPT_TAPE) { cntBlack = ACCEPT_TAPE;
if(tapeR != black) {
tapeR = black;
return(TRUE);
}
}
}
else { cntBlack = 0;
if(tapeR != white) {
tapeR = white;
return(TRUE);
}
}
return(FALSE);
}
char BumpIntoFT(void) {
return(!((PTP & BIT0HI) != 0));
}
char BumpIntoFB(void) {
return(!((PTP & BIT2HI) != 0));
}
char BumpIntoBL(void) {
return((PTS & BIT2HI) != 0);
}
char BumpIntoBR(void) {
return((PTS & BIT3HI) != 0);
}
char CheckEvents(void) {
static char lastBeaconEvent,
lastBumpFTEvent, lastBumpFBEvent,
lastBumpBREvent, lastBumpBLEvent; if(SeeFlash())
return(SEE_FLASH); if(lastBeaconEvent = CheckBeacon())
return(lastBeaconEvent); if(CheckTapeB() || CheckTapeL() ||
CheckTapeC() || CheckTapeR())
return(TAPE_CHANGE); if(BumpIntoFT()) {
if(lastBumpFTEvent != BUMP_FT)
return(lastBumpFTEvent = BUMP_FT);
}
else
if(lastBumpFTEvent != LOST_FT)
return(lastBumpFTEvent = LOST_FT);
if(BumpIntoFB()) {
if(lastBumpFBEvent != BUMP_FB)
return(lastBumpFBEvent = BUMP_FB);
}
else
if(lastBumpFBEvent != LOST_FB)
return(lastBumpFBEvent = LOST_FB);
if(BumpIntoBL()) {
if(lastBumpBLEvent != BUMP_BL)
return(lastBumpBLEvent = BUMP_BL);
}
else
if(lastBumpBLEvent != LOST_BL)
return(lastBumpBLEvent = LOST_BL);
if(BumpIntoBR()) {
if(lastBumpBREvent != BUMP_BR)
return(lastBumpBREvent = BUMP_BR);
}
else
if(lastBumpBREvent != LOST_BR)
return(lastBumpBREvent = LOST_BR); if(Expired(SM_TMR)) {
TMRS12_ClearTimerExpired(SM_TMR);
return(SM_TMR_XPD);
}
return(NO_EVENT);
}