finished
Dependencies: C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed
Diff: main.cpp
- Revision:
- 0:151f0dbf3ca8
- Child:
- 1:57407e283b03
diff -r 000000000000 -r 151f0dbf3ca8 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Feb 26 15:00:42 2015 +0000 @@ -0,0 +1,244 @@ +#include "mbed.h" +#include "rtos.h" +#include "C12832.h" + +//FINITE STATE MACHINE EVENTS +#define NO_EVENT 0 +#define TIME_OUT 1 +#define BUTTON_PRESS 2 + +//STATES +#define STATE_0 0 +#define STATE_1 1 +#define STATE_2 2 +#define STATE_3 3 +#define STATE_4 4 +#define STATE_5 5 + +//pass event via message queue +typedef struct { + int event; /* AD result of measured voltage */ +} message_t; + +MemoryPool<message_t, 16> mpool; +Queue<message_t, 16> queue; + +//button plus local display +DigitalIn coin(p14); + +C12832 lcd(p5, p7, p6, p8, p11); + +//leds for debug +DigitalOut led_R(p23); //LED RGB red +DigitalOut led_G(p24); //LED RGB green + +DigitalOut led4(LED4); //LED RGB green +DigitalOut led3(LED3); //LED RGB green + + +void timeout_event(void const *n) +{ + //generate local display info + lcd.cls(); + lcd.locate(40,5); + lcd.printf("timeout event"); + + + //event via a message queue + message_t *message = mpool.alloc(); + message->event = TIME_OUT; + queue.put(message); + + led4 = !led4; + +} + + +void button_event_thread(void const *argument) { + int button_press=0; + while (true) { + + //debouce delay for switch + + if (coin) + { + button_press = 1; + if (button_press == 1 & coin == 0) + { + + lcd.cls(); + lcd.locate(0,1); + lcd.printf("button event"); + + + //event via a message queue + message_t *message = mpool.alloc(); + message->event = BUTTON_PRESS; + queue.put(message); + + led3 = !led3; + button_press = 0; + } + } + else + { + //button_press = coin; + //Thread::wait(100); + } + } +} + + +int main (void) { + +//Thread fsm(fsm_thread); +Thread button_event(button_event_thread); +RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0); + +int state = STATE_0; + + + //start timer with a 2 sec timeout + timer.start(2000); + + while (true) { + switch(state) + { + case STATE_0: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM START"); + + osEvent evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_1; + if(message->event == TIME_OUT) state = STATE_0; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_1: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 1"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_2; + if(message->event == TIME_OUT) state = STATE_0; + + mpool.free(message); + } + + + timer.start(2000); + + break; + + case STATE_2: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 2"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_3; + if(message->event == TIME_OUT) state = STATE_1; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_3: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 3"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_4; + if(message->event == TIME_OUT) state = STATE_2; + + mpool.free(message); + } + + + timer.start(2000); + + break; + + case STATE_4: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 4"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_5; + if(message->event == TIME_OUT) state = STATE_3; + + mpool.free(message); + } + + timer.start(2000); + + break; + + case STATE_5: + lcd.cls(); + lcd.locate(0,2); + lcd.printf("FSM COUNTER 5"); + + evt = queue.get(); + if (evt.status == osEventMessage) + { + message_t *message = (message_t*)evt.value.p; + + + if(message->event == BUTTON_PRESS) state = STATE_5; + if(message->event == TIME_OUT) state = STATE_4; + + mpool.free(message); + } + + + + timer.start(2000); + + break; + }//End of switch + + //toggle led for local testing + //led2= !led2; + + }//end of while(1) + + +} \ No newline at end of file