Professional Documents
Culture Documents
Ledservicesm C
Ledservicesm C
#include "BITDEFS.H"
#include "LEDServiceSM.h"
#include "ShiftRegisterWrite.h"
#include "MarathonServiceSM.h"
#include "ADMulti.h"
#define FIRST_LED_ROW 15
#define ROW_TIMER_DURATION_BASE 500
#define ROW_TIMER_DURATION_1 2000
#define ROW_TIMER_DURATION_2 1000
#define ROW_TIMER_DURATION_QUICK 500
#define NUM_ROWS 96
#define GAME_TIMER_DURATION 24000
#define KNOB_THRESHOLD 2000
#define NUM_TIMEOUTS_FIRST_PATTERN 4
#define NUM_PST_TIMEOUTS_FIRST_PATTERN 3
#define PATTERN_MAX_VALUE 15
#define PLAYER_FINISH_LINE 1
#define OPPONENT_FINISH_LINE 3
#define FLAG_START_POSITION 4
switch (CurrentState)
{
case InitialLEDState:
{
if (ThisEvent.EventType == WELCOME_DONE)
{
SR_Write16(0);
SR_Write4(FourBitOutputPattern);
NextState = OneRowState;
ES_Timer_InitTimer(ROW_TIMER, ROW_TIMER_DURATION_BASE);
}
}
break;
case OneRowState:
{
//If seed for random number generator is received, populate array with
//numbers between 0 and 15
if (ThisEvent.EventType == SEED_RECEIVED)
{
uint32_t seed = ThisEvent.EventParam;
srand(seed);
for (int i = 0; i < NUM_ROWS; i++)
{
LEDRowBank[i] = (rand() % PATTERN_MAX_VALUE);
}
}
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROW_TIMER))
{
NumberOfTimeouts++;
SR_Write4(0);
ES_Timer_InitTimer(ROW_TIMER, ROW_TIMER_DURATION_BASE);
if (NumberOfTimeouts == NUM_TIMEOUTS_FIRST_PATTERN)
{
NextState = PlayState;
ES_Timer_InitTimer(GAME_TIMER, GAME_TIMER_DURATION);
}
}
}
break;
case PlayState:
{
//If game is finished
if (((ThisEvent.EventType == FENCE_HIT) && (ThisEvent.EventParam ==
PLAYER_FINISH_LINE))
|| ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
GAME_TIMER))
|| ((ThisEvent.EventType == FENCE_HIT) && (ThisEvent.EventParam ==
OPPONENT_FINISH_LINE)))
{
ES_Timer_StopTimer(ROW_TIMER);
SR_Write16(0);
NextState = FinishedState;
MotorOpponentStop();
MotorPlayerStop();
}
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROW_TIMER))
{
if (NumberOfPSTimeouts > NUM_PST_TIMEOUTS_FIRST_PATTERN)
{
MotorOpponentForward();
}
NumberOfPSTimeouts++;
SR_Write4(LEDRowBank[NumberOfPSTimeouts - 1]);
uint32_t results[2];
ADC_MultiRead(results);
uint16_t RowTimerDuration = (results[1] < KNOB_THRESHOLD) ?
ROW_TIMER_DURATION_1 : ROW_TIMER_DURATION_2;
if (NumberOfPSTimeouts < NUM_PST_TIMEOUTS_FIRST_PATTERN)
{
ES_Timer_InitTimer(ROW_TIMER, ROW_TIMER_DURATION_QUICK);
}
else
{
ES_Timer_InitTimer(ROW_TIMER, RowTimerDuration);
}
}
}
break;
case FinishedState:
{
if ((ThisEvent.EventType == FENCE_HIT) && (ThisEvent.EventParam ==
FLAG_START_POSITION))
{
NextState = InitialLEDState;
NumberOfTimeouts = 0;
NumberOfPSTimeouts = 0;
}
}
break;
}
CurrentState = NextState;
return ReturnEvent;
}