Escolar Documentos
Profissional Documentos
Cultura Documentos
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "inc/hw_sysctl.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h" // Define PART_TM4C123GH6PM in project
#include "driverlib/gpio.h"
#include "ES_Port.h"
#include "termio.h"
#include "LEDService.h"
#include "ShiftRegisterWrite.h"
#include "VibratingMotor.h"
#include "FanService.h"
/****************************************************************************/
bool InitializeLEDService ( uint8_t Priority )
{
ES_Event ThisEvent;
MyPriority = Priority; //Initialize the MyPriority variable with the passed in
parameter.
CurrentState = Welcome;
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC); //Initialize cycle by which LEDs
flash for lever
SR_Init();
counter= 0;
TorchLEDOn = 0;
flame_on = 0;
ButtonOn = 0;
//ThisEvent.EventType ;
/****************************************************************************/
bool PostLEDService( ES_Event ThisEvent )
{
return ES_PostToService( MyPriority, ThisEvent);
}
/****************************************************************************/
/*
SHIFT REGISTER PINOUT FOR LEDs:
0-2 are for Rocket LEDs
3-5 are for Button LEDs
6 is for Knob LED
7 is for Torch indicator LEDs (on both prop torch and actual torch)
On Tiva:
Port C Pin 4 controls Torch Flame LEDs
*/
LEDServiceState_t NextState;
NextState = CurrentState;
switch(CurrentState){
//Inititate the relevant variables
case Welcome : //If the CurrentState is Welcome
//Create cycle of flashing Rocket LEDs in Welcome state
if(ThisEvent.EventType == ES_LEVER_PULLED){//If the lever is pulled
SR_Write(0x00); //Turn off Rocket LEDs
NextState = Terraform;
ES_Timer_InitTimer(INACTIVITY_TIMER, THIRTY_SEC);
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
SR_Write(KnobLED);
KnobLEDOn = 1;
//Start flashing Terraform LED
}
if(ThisEvent.EventType == ES_TIMEOUT){
LEDstate = counter % 4;
if (LEDstate == 0){
SR_Write(0X00);
}
if (LEDstate == 1){
LEDinput = RocketLED1;
SR_Write(LEDinput);
}
if (LEDstate == 2){
LEDinput = RocketLED1 | RocketLED2;
SR_Write(LEDinput);
}
if (LEDstate == 3){
LEDinput = RocketLED1 | RocketLED2 | RocketLED3;
SR_Write(LEDinput);
}
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
counter = counter + 1;
}
if (flame_on == 1){
ThisEvent.EventType = BACK_TO_WELCOME;
PostVibratingMotor(ThisEvent);
flame_on = 0;
}
break;
case Terraform :
// //When knob is first turned, keep LED on (the way you currently have
it, you keep LED on after a timer expires, but this way may make more sense)
// //Wait some time and then start flashing the PopUp LED(s) (Do we want
to trigger the PopUp by making the user press a particular button or any of the three
buttons?)
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
INACTIVITY_TIMER)){
//Reset back to the Welcome state:
NextState = Welcome;
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
KnobLEDOn = 0;
SR_Write(0x00);
}
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROCKET_TIMER1)){
if (KnobLEDOn == 1){
SR_Write(0x00);
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
KnobLEDOn = 0;
}
else if(KnobLEDOn == 0){
SR_Write(KnobLED);
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
KnobLEDOn = 1;
}
}
if (ThisEvent.EventType == ES_KNOB_TURNED){
if (KnobLEDOn != 2){
SR_Write(KnobLED);
ES_Timer_InitTimer(ROCKET_TIMER2, HALF_SEC);
}
KnobLEDOn = 2;
ES_Timer_InitTimer(INACTIVITY_TIMER, THIRTY_SEC);
}
if (KnobLEDOn == 2){
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROCKET_TIMER2) ){ //All button LEDs flash if no button has been pressed
if (ButtonLEDOn == 1){
SR_Write(KnobLED | Button1LED);
ButtonLEDOn = 0;
}
else if(ButtonLEDOn == 0){
SR_Write(KnobLED);
ButtonLEDOn = 1;
}
ES_Timer_InitTimer(ROCKET_TIMER2, HALF_SEC);
}
}
}
break;
case Popup :
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
INACTIVITY_TIMER)){
//Reset back to the Welcome state:
NextState = Welcome;
Button1 = 0;
Button2 = 0;
Button3 = 0;
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
}
//Once a user has pressed a button, keep the associated LED for that
button on
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROCKET_TIMER1)){
if(ButtonOn == 0){
if (Button2 == 0){
SR_Write(KnobLED | Button1LED | Button2LED); }
if ((Button2==1) && (Button3 == 0)){
SR_Write(KnobLED | Button1LED | Button2LED | Button3LED );
}
if (Button3 == 1){
SR_Write(KnobLED | Button1LED | Button2LED | Button3LED |
TorchIndLED);
TorchLEDOn = 1;
}
ButtonOn = 1;
}
else if(ButtonOn == 1){
if (Button2 == 0){
SR_Write(KnobLED | Button1LED );
}
if ((Button2==1) && (Button3 == 0)){
SR_Write(KnobLED | Button1LED | Button2LED);
}
if (Button3 == 1){
SR_Write(KnobLED | Button1LED | Button2LED | Button3LED);
TorchLEDOn = 1;
}
ButtonOn = 0;
}
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
}
ES_Event NewEvent;
NewEvent.EventType = ES_FAN_TRIGGER;
PostFan(NewEvent);
case Torch :
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROCKET_TIMER2)){
if(TorchLED == 1){
HWREG(GPIO_PORTC_BASE+(GPIO_O_DATA+ALL_BITS)) &= BIT6LO;
TorchLED = 0;
}
else if (TorchLED == 0){
HWREG(GPIO_PORTC_BASE+(GPIO_O_DATA+ALL_BITS)) |= BIT6HI;
TorchLED = 1;
}
ES_Timer_InitTimer(ROCKET_TIMER2, QUARTER_SEC);
}
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
ROCKET_TIMER1)){
if(AllLED == 1){
SR_Write(0x00);
AllLED = 0;
}
else if (AllLED == 0){
SR_Write(KnobLED | Button1LED | Button2LED | Button3LED|
TorchIndLED);
AllLED = 1;
}
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
}
if ((ThisEvent.EventType == ES_TIMEOUT) && (ThisEvent.EventParam ==
INACTIVITY_TIMER)){
//Reset back to the Welcome state:
NextState = Welcome;
flame_on = 1;
ES_Timer_InitTimer(ROCKET_TIMER1, HALF_SEC);
HWREG(GPIO_PORTC_BASE+(GPIO_O_DATA+ALL_BITS)) &= BIT6LO; //turn off
torch flame LEDs
Button1 = 0;
Button2 = 0;
Button3 = 0;
}
break;
}
CurrentState = NextState;
return ReturnEvent; //Return ES_NO_EVENT
}