finished
Dependencies: C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed
main.cpp
- Committer:
- cathal66
- Date:
- 2015-03-03
- Revision:
- 2:ff8262f6a385
- Parent:
- 1:57407e283b03
- Child:
- 3:c31a01f2c064
File content as of revision 2:ff8262f6a385:
#include "mbed.h" #include "rtos.h" #include "C12832.h" #include "MMA7660.h" //FINITE STATE MACHINE EVENTS #define NO_EVENT 0 #define TIME_OUT 1 #define BUTTON_PRESS 2 #define TILT 3 #define PUSH 4 //STATES #define STATE_0 0 #define STATE_1 1 #define STATE_2 2 //Mutex Mutex LED_RGB; //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; //Digital input //DigitalIn coin(p14); InterruptIn button(p14); //Analog input AnalogIn push(p19); //Setup hardware MMA7660 MMA(p28, p27); C12832 lcd(p5, p7, p6, p8, p11); //RGB LEDs DigitalOut led_R(p23); //LED RGB red DigitalOut led_G(p24); //LED RGB green DigitalOut led_B(p25); //LED RGB Blue //leds for debug DigitalOut led4(LED4); //LED DigitalOut led3(LED3); //LED DigitalOut led2(LED2); //LED //Global varible int button_press=0; void timeout_event(void const *n) { //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) { while (true) { if (button_press == 1) { //event via a message queue message_t *message = mpool.alloc(); message->event = BUTTON_PRESS; queue.put(message); led3 = !led3; button_press = 0; Thread::wait(500); } } } void tilt_event_thread(void const *argument) { float tilt_value_Y = MMA.y(); float tilt_value_X = MMA.x(); while (true) { //debouce delay for switch if (tilt_value_Y <= MMA.y()-0.2 ^ tilt_value_Y >= MMA.y()+0.2 ) { //event via a message queue message_t *message = mpool.alloc(); message->event = TILT; queue.put(message); led3 = !led3; Thread::wait(1500); tilt_value_Y = MMA.y(); } } } void push_event_thread(void const *argument) { float push_value = push.read(); while (true) { //debouce delay for switch if (push_value >= push.read()- 0.15 ^ push_value <= push.read()+ 0.15 ) { //event via a message queue message_t *message = mpool.alloc(); message->event = PUSH; queue.put(message); led3 = !led3; Thread::wait(1000); push_value = push.read(); } } } void flash_led_thread(void const *argument) { while (true) { Thread::signal_wait(0x1); for (int i=0;i<=20;i++) { LED_RGB.lock(); led_R = !led_R; LED_RGB.unlock(); Thread::wait(100); } LED_RGB.lock(); led_R = 1; LED_RGB.unlock(); } } void Button_Inter() { //Flash_LED_Thread.signal_set(0x1); button_press=1; } int main (void) { //Thread fsm(fsm_thread); Thread button_event(button_event_thread); Thread tilt_event(tilt_event_thread); Thread push_event(push_event_thread); Thread Flash_LED_Thread(flash_led_thread); RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0); //Interrupts button.rise(&Button_Inter); int state = STATE_0; LED_RGB.lock(); led_R=1; led_G=1; led_B=1; LED_RGB.unlock(); if (MMA.testConnection()) //setup accler //start timer with a 2 sec timeout timer.start(2000); while (true) { switch(state) { case STATE_0: osEvent evt = queue.get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p; if(message->event == BUTTON_PRESS) { LED_RGB.lock(); led_G=0; led_R=1; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Enter"); state = STATE_1; } if(message->event == PUSH) { LED_RGB.lock(); led_G=1; //off led_R=0; //on LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Insert Coin push"); state = STATE_0; } if(message->event == TILT) { LED_RGB.lock(); led_G=1; led_R=1; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,0); lcd.printf("STOP"); lcd.locate(0,10); lcd.printf("Please Insert Coin"); Flash_LED_Thread.signal_set(0x1); state = STATE_2; } if(message->event == TIME_OUT) { LED_RGB.lock(); led_G=1; led_R=0; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Hello"); state = STATE_0; } mpool.free(message); } timer.start(2000); break; case STATE_1: evt = queue.get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p; if(message->event == BUTTON_PRESS) { lcd.cls(); lcd.locate(0,2); lcd.printf("Thanks"); state = STATE_1; } if(message->event == PUSH) { LED_RGB.lock(); led_R=0; led_G=1; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Hello"); state = STATE_0; } mpool.free(message); } timer.start(2000); break; case STATE_2: evt = queue.get(); if (evt.status == osEventMessage) { message_t *message = (message_t*)evt.value.p; if(message->event == BUTTON_PRESS) { LED_RGB.lock(); led_G=0; led_R=1; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Enter"); state = STATE_1; } if(message->event == TILT) { lcd.cls(); lcd.locate(0,0); lcd.printf("STOP"); lcd.locate(0,10); lcd.printf("Please Insert Coin"); state = STATE_2; Flash_LED_Thread.signal_set(0x1); } if(message->event == TIME_OUT) { LED_RGB.lock(); led_R=0; led_G=1; LED_RGB.unlock(); lcd.cls(); lcd.locate(0,2); lcd.printf("Insert Coin"); state = STATE_0; } mpool.free(message); } timer.start(2000); break; }//End of switch //toggle led for local testing //led2= !led2; }//end of while(1) }