finished
Dependencies: C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed
main.cpp
- Committer:
- cathal66
- Date:
- 2015-02-26
- Revision:
- 0:151f0dbf3ca8
- Child:
- 1:57407e283b03
File content as of revision 0:151f0dbf3ca8:
#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) }