Back

Chase.c:

#include "comatos8515.c"
//initial task state variables
#define NoPush 0
#define MaybePush 1
#define Pushed 2
#define DebouncePress 3
#define Waiting 4
#define Done 10
#define error 5
#define StillPressed 6

//initial task state variables

#define MeasureStart 1
#define MeasureBlink 2
#define MeasureDetect 4
#define MeasureDone 3
#define MeasureWait 5
#define Check 6
//Comatos constants
//Turn off debugger
#define NODebug 0
#define OSDebug 1
//Comatos constants
//Turn off debugger
#define NODebug 0
#define OSDebug 1
//Any task longer than 10 mS is an error
#define OSTimeOut 50
//mask to define that a task does not listen to messages
#define NoMessage 0xff
//mask to define that a task is not time-scheduled
#define NoTime 0
char led;
unsigned char i, j, count, miss, repeat, temp, PrevNum, temp2;
flash unsigned char TimeOut[3] = {8, 4, 1};
flash unsigned char Blink[8] = {0x01,0x20,0x10,0x80,0x02,0x08,0x04,0x40};
char MeasureTask(void);
char DisplayTask(void);

void main(void)
begin

DDRB = 0xff;
PORTB = 0xff;
DDRD = 0x00;
led=0x00;
j=1;
OSInit(OSTimeOut, OSDebug);
OSCreateTask(MeasureTask, 200, 0xff, MeasureStart);
OSCreateTask(DisplayTask, 0, 0x01, 0); //waiting for MeasureTask
OSStart(); //never returns
end

char MeasureTask(void)
begin
// char temp;
if(OSGetState()==MeasureStart)
{
led = led ^ 0xff;
PORTB = ~led;

if(~PIND==0x40)
{
OSSetState(MeasureWait);
PORTB=0xff;
}
}

if(OSGetState()==MeasureWait)
{
if(temp==10)
{
OSSetState(MeasureBlink);
temp=0;
}
else temp++;
}
if(OSGetState()==MeasureBlink)
{
OSSetTimeout(TimeOut[j]);
OSSetState(MeasureDetect);
repeat++;
if(repeat>=5)
{
OSSetState(Check);
OSSendMess(0x01, miss);

OSSetTimeout(10);
repeat =0;
miss = 0;
}
else PORTB=~Blink[i];
// else PORTB=~Blink[Random()];
}
if(OSGetState()==MeasureDetect)
{
if(~PIND==Blink[i] && count<150)
{
OSSetState(MeasureBlink);
i++;
if(i==8) i=0;
count = 0;
}
else if(count==150)
{
OSSetState(MeasureBlink);
miss++;
i++;
if(i==8) i=0;
count=0;
}
else count++;
}
if(OSGetState()==Check)
{
if(~PIND!=0x40)
OSSetState(MeasureDone);
else OSSetState(Check);
}
if(OSGetState()==MeasureDone && OSGetAck()==0x02)
{
OSSetState(MeasureStart);
OSSetTimeout(200);
led=0x00;
}

return 0;
end

char DisplayTask(void)
begin
//char result;
char SwTime[10];
printf("You've missed: ");
sprintf(SwTime,"%-d\r\n",OSGetMess(0x00));
OSUARTTransmitBytes(SwTime,4);
OSSendAck(0);
return 0;

end
/*
char Random(unsigned char PrevNum)
{
int temp1;
while(temp2==PrevNum)
{
temp1=rand();
temp2 = (temp1 & 0x0001);
temp2 |= ((temp1 & 0x0010)>>3);
temp2 |= ((temp1 & 0x1000)>>10);
}
PrevNum = temp2;
//itoa(temp2,c);
//OSUARTTransmitByte(c[0]);
//printf(" ");
return temp2;

}

Back