finished
Dependencies: C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed
Diff: main.cpp
- Revision:
- 1:57407e283b03
- Parent:
- 0:151f0dbf3ca8
- Child:
- 2:ff8262f6a385
--- a/main.cpp Thu Feb 26 15:00:42 2015 +0000 +++ b/main.cpp Mon Mar 02 12:56:15 2015 +0000 @@ -1,19 +1,25 @@ #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 -#define STATE_3 3 -#define STATE_4 4 -#define STATE_5 5 + +//Mutex +Mutex LED_RGB; //pass event via message queue typedef struct { @@ -23,26 +29,29 @@ MemoryPool<message_t, 16> mpool; Queue<message_t, 16> queue; -//button plus local display +//Digital input DigitalIn coin(p14); +InterruptIn button(p15); +//Analog input +AnalogIn push(p19); + +//Setup hardware +MMA7660 MMA(p28, p27); C12832 lcd(p5, p7, p6, p8, p11); -//leds for debug +//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 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(); @@ -59,17 +68,11 @@ 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(); @@ -80,44 +83,170 @@ button_press = 0; } } - else - { - //button_press = coin; - //Thread::wait(100); - } + + } } + +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 + Thread::wait(2000); + + if (tilt_value_Y <= MMA.y()-0.1 ^ tilt_value_Y >= MMA.y()+0.1 ) + { + + //event via a message queue + message_t *message = mpool.alloc(); + message->event = TILT; + queue.put(message); + + led3 = !led3; + tilt_value_Y = MMA.y(); + } + + + } + +} + +void push_event_thread(void const *argument) { + float push_value = push.read(); + while (true) + { + + //debouce delay for switch + Thread::wait(1000); + if (push_value >= push.read()- 0.05 ^ push_value <= push.read()+ 0.05 ) + { + push_value = push.read(); + //event via a message queue + message_t *message = mpool.alloc(); + message->event = PUSH; + queue.put(message); + led3 = !led3; + + } + } + + +} +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); + +} + + 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: - lcd.cls(); - lcd.locate(0,2); - lcd.printf("FSM START"); - + case STATE_0: 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; - + 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); } @@ -126,41 +255,80 @@ 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; - + 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); + 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; - + 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); } @@ -168,71 +336,8 @@ 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