finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

Committer:
cathal66
Date:
Tue Mar 03 13:42:32 2015 +0000
Revision:
2:ff8262f6a385
Parent:
1:57407e283b03
Child:
3:c31a01f2c064
adjusted value and re positioned wait.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
cathal66 0:151f0dbf3ca8 1 #include "mbed.h"
cathal66 0:151f0dbf3ca8 2 #include "rtos.h"
cathal66 0:151f0dbf3ca8 3 #include "C12832.h"
cathal66 1:57407e283b03 4 #include "MMA7660.h"
cathal66 1:57407e283b03 5
cathal66 1:57407e283b03 6
cathal66 1:57407e283b03 7
cathal66 0:151f0dbf3ca8 8
cathal66 0:151f0dbf3ca8 9 //FINITE STATE MACHINE EVENTS
cathal66 0:151f0dbf3ca8 10 #define NO_EVENT 0
cathal66 0:151f0dbf3ca8 11 #define TIME_OUT 1
cathal66 0:151f0dbf3ca8 12 #define BUTTON_PRESS 2
cathal66 1:57407e283b03 13 #define TILT 3
cathal66 1:57407e283b03 14 #define PUSH 4
cathal66 0:151f0dbf3ca8 15
cathal66 0:151f0dbf3ca8 16 //STATES
cathal66 0:151f0dbf3ca8 17 #define STATE_0 0
cathal66 0:151f0dbf3ca8 18 #define STATE_1 1
cathal66 0:151f0dbf3ca8 19 #define STATE_2 2
cathal66 1:57407e283b03 20
cathal66 1:57407e283b03 21 //Mutex
cathal66 1:57407e283b03 22 Mutex LED_RGB;
cathal66 0:151f0dbf3ca8 23
cathal66 0:151f0dbf3ca8 24 //pass event via message queue
cathal66 0:151f0dbf3ca8 25 typedef struct {
cathal66 0:151f0dbf3ca8 26 int event; /* AD result of measured voltage */
cathal66 0:151f0dbf3ca8 27 } message_t;
cathal66 0:151f0dbf3ca8 28
cathal66 0:151f0dbf3ca8 29 MemoryPool<message_t, 16> mpool;
cathal66 0:151f0dbf3ca8 30 Queue<message_t, 16> queue;
cathal66 0:151f0dbf3ca8 31
cathal66 1:57407e283b03 32 //Digital input
cathal66 2:ff8262f6a385 33 //DigitalIn coin(p14);
cathal66 2:ff8262f6a385 34 InterruptIn button(p14);
cathal66 0:151f0dbf3ca8 35
cathal66 1:57407e283b03 36 //Analog input
cathal66 1:57407e283b03 37 AnalogIn push(p19);
cathal66 1:57407e283b03 38
cathal66 1:57407e283b03 39 //Setup hardware
cathal66 1:57407e283b03 40 MMA7660 MMA(p28, p27);
cathal66 0:151f0dbf3ca8 41 C12832 lcd(p5, p7, p6, p8, p11);
cathal66 0:151f0dbf3ca8 42
cathal66 1:57407e283b03 43 //RGB LEDs
cathal66 0:151f0dbf3ca8 44 DigitalOut led_R(p23); //LED RGB red
cathal66 0:151f0dbf3ca8 45 DigitalOut led_G(p24); //LED RGB green
cathal66 1:57407e283b03 46 DigitalOut led_B(p25); //LED RGB Blue
cathal66 0:151f0dbf3ca8 47
cathal66 1:57407e283b03 48 //leds for debug
cathal66 2:ff8262f6a385 49 DigitalOut led4(LED4); //LED
cathal66 2:ff8262f6a385 50 DigitalOut led3(LED3); //LED
cathal66 2:ff8262f6a385 51 DigitalOut led2(LED2); //LED
cathal66 2:ff8262f6a385 52
cathal66 2:ff8262f6a385 53 //Global varible
cathal66 2:ff8262f6a385 54 int button_press=0;
cathal66 0:151f0dbf3ca8 55
cathal66 0:151f0dbf3ca8 56
cathal66 0:151f0dbf3ca8 57 void timeout_event(void const *n)
cathal66 0:151f0dbf3ca8 58 {
cathal66 0:151f0dbf3ca8 59
cathal66 0:151f0dbf3ca8 60 //event via a message queue
cathal66 0:151f0dbf3ca8 61 message_t *message = mpool.alloc();
cathal66 0:151f0dbf3ca8 62 message->event = TIME_OUT;
cathal66 0:151f0dbf3ca8 63 queue.put(message);
cathal66 0:151f0dbf3ca8 64
cathal66 0:151f0dbf3ca8 65 led4 = !led4;
cathal66 0:151f0dbf3ca8 66
cathal66 0:151f0dbf3ca8 67 }
cathal66 0:151f0dbf3ca8 68
cathal66 0:151f0dbf3ca8 69
cathal66 0:151f0dbf3ca8 70 void button_event_thread(void const *argument) {
cathal66 2:ff8262f6a385 71
cathal66 0:151f0dbf3ca8 72 while (true) {
cathal66 2:ff8262f6a385 73
cathal66 2:ff8262f6a385 74 if (button_press == 1)
cathal66 0:151f0dbf3ca8 75 {
cathal66 2:ff8262f6a385 76
cathal66 2:ff8262f6a385 77 //event via a message queue
cathal66 2:ff8262f6a385 78 message_t *message = mpool.alloc();
cathal66 2:ff8262f6a385 79 message->event = BUTTON_PRESS;
cathal66 2:ff8262f6a385 80 queue.put(message);
cathal66 2:ff8262f6a385 81
cathal66 2:ff8262f6a385 82 led3 = !led3;
cathal66 2:ff8262f6a385 83 button_press = 0;
cathal66 2:ff8262f6a385 84 Thread::wait(500);
cathal66 0:151f0dbf3ca8 85 }
cathal66 1:57407e283b03 86
cathal66 2:ff8262f6a385 87
cathal66 1:57407e283b03 88
cathal66 0:151f0dbf3ca8 89 }
cathal66 0:151f0dbf3ca8 90 }
cathal66 0:151f0dbf3ca8 91
cathal66 1:57407e283b03 92
cathal66 1:57407e283b03 93 void tilt_event_thread(void const *argument) {
cathal66 1:57407e283b03 94 float tilt_value_Y = MMA.y();
cathal66 1:57407e283b03 95 float tilt_value_X = MMA.x();
cathal66 1:57407e283b03 96 while (true)
cathal66 1:57407e283b03 97 {
cathal66 1:57407e283b03 98
cathal66 1:57407e283b03 99 //debouce delay for switch
cathal66 2:ff8262f6a385 100
cathal66 1:57407e283b03 101
cathal66 2:ff8262f6a385 102 if (tilt_value_Y <= MMA.y()-0.2 ^ tilt_value_Y >= MMA.y()+0.2 )
cathal66 1:57407e283b03 103 {
cathal66 1:57407e283b03 104
cathal66 1:57407e283b03 105 //event via a message queue
cathal66 1:57407e283b03 106 message_t *message = mpool.alloc();
cathal66 1:57407e283b03 107 message->event = TILT;
cathal66 1:57407e283b03 108 queue.put(message);
cathal66 1:57407e283b03 109
cathal66 1:57407e283b03 110 led3 = !led3;
cathal66 2:ff8262f6a385 111 Thread::wait(1500);
cathal66 1:57407e283b03 112 tilt_value_Y = MMA.y();
cathal66 1:57407e283b03 113 }
cathal66 1:57407e283b03 114
cathal66 2:ff8262f6a385 115
cathal66 1:57407e283b03 116 }
cathal66 0:151f0dbf3ca8 117
cathal66 1:57407e283b03 118
cathal66 1:57407e283b03 119 }
cathal66 1:57407e283b03 120
cathal66 1:57407e283b03 121 void push_event_thread(void const *argument) {
cathal66 1:57407e283b03 122 float push_value = push.read();
cathal66 1:57407e283b03 123 while (true)
cathal66 1:57407e283b03 124 {
cathal66 1:57407e283b03 125
cathal66 1:57407e283b03 126 //debouce delay for switch
cathal66 2:ff8262f6a385 127
cathal66 2:ff8262f6a385 128 if (push_value >= push.read()- 0.15 ^ push_value <= push.read()+ 0.15 )
cathal66 1:57407e283b03 129 {
cathal66 1:57407e283b03 130 //event via a message queue
cathal66 1:57407e283b03 131 message_t *message = mpool.alloc();
cathal66 1:57407e283b03 132 message->event = PUSH;
cathal66 1:57407e283b03 133 queue.put(message);
cathal66 1:57407e283b03 134 led3 = !led3;
cathal66 2:ff8262f6a385 135 Thread::wait(1000);
cathal66 2:ff8262f6a385 136 push_value = push.read();
cathal66 1:57407e283b03 137 }
cathal66 1:57407e283b03 138 }
cathal66 1:57407e283b03 139
cathal66 1:57407e283b03 140
cathal66 1:57407e283b03 141 }
cathal66 1:57407e283b03 142 void flash_led_thread(void const *argument) {
cathal66 1:57407e283b03 143 while (true)
cathal66 1:57407e283b03 144 {
cathal66 1:57407e283b03 145 Thread::signal_wait(0x1);
cathal66 1:57407e283b03 146
cathal66 1:57407e283b03 147 for (int i=0;i<=20;i++)
cathal66 1:57407e283b03 148 {
cathal66 1:57407e283b03 149 LED_RGB.lock();
cathal66 1:57407e283b03 150 led_R = !led_R;
cathal66 1:57407e283b03 151 LED_RGB.unlock();
cathal66 1:57407e283b03 152 Thread::wait(100);
cathal66 1:57407e283b03 153 }
cathal66 1:57407e283b03 154 LED_RGB.lock();
cathal66 1:57407e283b03 155 led_R = 1;
cathal66 1:57407e283b03 156 LED_RGB.unlock();
cathal66 1:57407e283b03 157 }
cathal66 1:57407e283b03 158
cathal66 1:57407e283b03 159 }
cathal66 1:57407e283b03 160
cathal66 2:ff8262f6a385 161
cathal66 2:ff8262f6a385 162
cathal66 1:57407e283b03 163 void Button_Inter() {
cathal66 2:ff8262f6a385 164 //Flash_LED_Thread.signal_set(0x1);
cathal66 1:57407e283b03 165
cathal66 2:ff8262f6a385 166 button_press=1;
cathal66 2:ff8262f6a385 167
cathal66 2:ff8262f6a385 168 }
cathal66 1:57407e283b03 169
cathal66 0:151f0dbf3ca8 170 int main (void) {
cathal66 0:151f0dbf3ca8 171
cathal66 0:151f0dbf3ca8 172 //Thread fsm(fsm_thread);
cathal66 0:151f0dbf3ca8 173 Thread button_event(button_event_thread);
cathal66 1:57407e283b03 174 Thread tilt_event(tilt_event_thread);
cathal66 1:57407e283b03 175 Thread push_event(push_event_thread);
cathal66 1:57407e283b03 176 Thread Flash_LED_Thread(flash_led_thread);
cathal66 0:151f0dbf3ca8 177 RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0);
cathal66 0:151f0dbf3ca8 178
cathal66 1:57407e283b03 179 //Interrupts
cathal66 1:57407e283b03 180 button.rise(&Button_Inter);
cathal66 1:57407e283b03 181
cathal66 0:151f0dbf3ca8 182 int state = STATE_0;
cathal66 0:151f0dbf3ca8 183
cathal66 1:57407e283b03 184 LED_RGB.lock();
cathal66 1:57407e283b03 185 led_R=1;
cathal66 1:57407e283b03 186 led_G=1;
cathal66 1:57407e283b03 187 led_B=1;
cathal66 1:57407e283b03 188 LED_RGB.unlock();
cathal66 1:57407e283b03 189
cathal66 1:57407e283b03 190 if (MMA.testConnection()) //setup accler
cathal66 1:57407e283b03 191
cathal66 0:151f0dbf3ca8 192 //start timer with a 2 sec timeout
cathal66 0:151f0dbf3ca8 193 timer.start(2000);
cathal66 0:151f0dbf3ca8 194
cathal66 0:151f0dbf3ca8 195 while (true) {
cathal66 1:57407e283b03 196
cathal66 1:57407e283b03 197
cathal66 0:151f0dbf3ca8 198 switch(state)
cathal66 0:151f0dbf3ca8 199 {
cathal66 1:57407e283b03 200 case STATE_0:
cathal66 0:151f0dbf3ca8 201 osEvent evt = queue.get();
cathal66 0:151f0dbf3ca8 202 if (evt.status == osEventMessage)
cathal66 0:151f0dbf3ca8 203 {
cathal66 0:151f0dbf3ca8 204 message_t *message = (message_t*)evt.value.p;
cathal66 0:151f0dbf3ca8 205
cathal66 0:151f0dbf3ca8 206
cathal66 1:57407e283b03 207 if(message->event == BUTTON_PRESS)
cathal66 1:57407e283b03 208 {
cathal66 1:57407e283b03 209 LED_RGB.lock();
cathal66 1:57407e283b03 210 led_G=0;
cathal66 1:57407e283b03 211 led_R=1;
cathal66 1:57407e283b03 212 LED_RGB.unlock();
cathal66 1:57407e283b03 213 lcd.cls();
cathal66 1:57407e283b03 214 lcd.locate(0,2);
cathal66 1:57407e283b03 215 lcd.printf("Enter");
cathal66 1:57407e283b03 216 state = STATE_1;
cathal66 1:57407e283b03 217 }
cathal66 1:57407e283b03 218 if(message->event == PUSH)
cathal66 1:57407e283b03 219 {
cathal66 1:57407e283b03 220 LED_RGB.lock();
cathal66 1:57407e283b03 221 led_G=1; //off
cathal66 1:57407e283b03 222 led_R=0; //on
cathal66 1:57407e283b03 223 LED_RGB.unlock();
cathal66 1:57407e283b03 224 lcd.cls();
cathal66 1:57407e283b03 225 lcd.locate(0,2);
cathal66 1:57407e283b03 226 lcd.printf("Insert Coin push");
cathal66 1:57407e283b03 227 state = STATE_0;
cathal66 1:57407e283b03 228 }
cathal66 1:57407e283b03 229 if(message->event == TILT)
cathal66 1:57407e283b03 230 {
cathal66 1:57407e283b03 231 LED_RGB.lock();
cathal66 1:57407e283b03 232 led_G=1;
cathal66 1:57407e283b03 233 led_R=1;
cathal66 1:57407e283b03 234 LED_RGB.unlock();
cathal66 1:57407e283b03 235 lcd.cls();
cathal66 1:57407e283b03 236 lcd.locate(0,0);
cathal66 1:57407e283b03 237 lcd.printf("STOP");
cathal66 1:57407e283b03 238 lcd.locate(0,10);
cathal66 1:57407e283b03 239 lcd.printf("Please Insert Coin");
cathal66 1:57407e283b03 240 Flash_LED_Thread.signal_set(0x1);
cathal66 1:57407e283b03 241 state = STATE_2;
cathal66 1:57407e283b03 242 }
cathal66 1:57407e283b03 243 if(message->event == TIME_OUT)
cathal66 1:57407e283b03 244 {
cathal66 1:57407e283b03 245 LED_RGB.lock();
cathal66 1:57407e283b03 246 led_G=1;
cathal66 1:57407e283b03 247 led_R=0;
cathal66 1:57407e283b03 248 LED_RGB.unlock();
cathal66 1:57407e283b03 249 lcd.cls();
cathal66 1:57407e283b03 250 lcd.locate(0,2);
cathal66 1:57407e283b03 251 lcd.printf("Hello");
cathal66 1:57407e283b03 252 state = STATE_0;
cathal66 1:57407e283b03 253 }
cathal66 0:151f0dbf3ca8 254 mpool.free(message);
cathal66 0:151f0dbf3ca8 255 }
cathal66 0:151f0dbf3ca8 256
cathal66 0:151f0dbf3ca8 257 timer.start(2000);
cathal66 0:151f0dbf3ca8 258
cathal66 0:151f0dbf3ca8 259 break;
cathal66 0:151f0dbf3ca8 260
cathal66 0:151f0dbf3ca8 261 case STATE_1:
cathal66 1:57407e283b03 262
cathal66 0:151f0dbf3ca8 263 evt = queue.get();
cathal66 0:151f0dbf3ca8 264 if (evt.status == osEventMessage)
cathal66 0:151f0dbf3ca8 265 {
cathal66 0:151f0dbf3ca8 266 message_t *message = (message_t*)evt.value.p;
cathal66 0:151f0dbf3ca8 267
cathal66 0:151f0dbf3ca8 268
cathal66 1:57407e283b03 269 if(message->event == BUTTON_PRESS)
cathal66 1:57407e283b03 270 {
cathal66 1:57407e283b03 271 lcd.cls();
cathal66 1:57407e283b03 272 lcd.locate(0,2);
cathal66 1:57407e283b03 273 lcd.printf("Thanks");
cathal66 1:57407e283b03 274 state = STATE_1;
cathal66 1:57407e283b03 275 }
cathal66 1:57407e283b03 276 if(message->event == PUSH)
cathal66 1:57407e283b03 277 {
cathal66 1:57407e283b03 278 LED_RGB.lock();
cathal66 1:57407e283b03 279 led_R=0;
cathal66 1:57407e283b03 280 led_G=1;
cathal66 1:57407e283b03 281 LED_RGB.unlock();
cathal66 1:57407e283b03 282 lcd.cls();
cathal66 1:57407e283b03 283 lcd.locate(0,2);
cathal66 1:57407e283b03 284 lcd.printf("Hello");
cathal66 1:57407e283b03 285 state = STATE_0;
cathal66 1:57407e283b03 286 }
cathal66 1:57407e283b03 287
cathal66 0:151f0dbf3ca8 288 mpool.free(message);
cathal66 0:151f0dbf3ca8 289 }
cathal66 0:151f0dbf3ca8 290
cathal66 1:57407e283b03 291 timer.start(2000);
cathal66 1:57407e283b03 292
cathal66 0:151f0dbf3ca8 293
cathal66 0:151f0dbf3ca8 294 break;
cathal66 0:151f0dbf3ca8 295
cathal66 0:151f0dbf3ca8 296 case STATE_2:
cathal66 0:151f0dbf3ca8 297
cathal66 0:151f0dbf3ca8 298 evt = queue.get();
cathal66 0:151f0dbf3ca8 299 if (evt.status == osEventMessage)
cathal66 0:151f0dbf3ca8 300 {
cathal66 0:151f0dbf3ca8 301 message_t *message = (message_t*)evt.value.p;
cathal66 0:151f0dbf3ca8 302
cathal66 1:57407e283b03 303 if(message->event == BUTTON_PRESS)
cathal66 1:57407e283b03 304 {
cathal66 1:57407e283b03 305 LED_RGB.lock();
cathal66 1:57407e283b03 306 led_G=0;
cathal66 1:57407e283b03 307 led_R=1;
cathal66 1:57407e283b03 308 LED_RGB.unlock();
cathal66 1:57407e283b03 309 lcd.cls();
cathal66 1:57407e283b03 310 lcd.locate(0,2);
cathal66 1:57407e283b03 311 lcd.printf("Enter");
cathal66 1:57407e283b03 312 state = STATE_1;
cathal66 1:57407e283b03 313
cathal66 1:57407e283b03 314 }
cathal66 1:57407e283b03 315 if(message->event == TILT)
cathal66 1:57407e283b03 316 {
cathal66 1:57407e283b03 317 lcd.cls();
cathal66 1:57407e283b03 318 lcd.locate(0,0);
cathal66 1:57407e283b03 319 lcd.printf("STOP");
cathal66 1:57407e283b03 320 lcd.locate(0,10);
cathal66 1:57407e283b03 321 lcd.printf("Please Insert Coin");
cathal66 1:57407e283b03 322 state = STATE_2;
cathal66 1:57407e283b03 323 Flash_LED_Thread.signal_set(0x1);
cathal66 1:57407e283b03 324 }
cathal66 1:57407e283b03 325 if(message->event == TIME_OUT)
cathal66 1:57407e283b03 326 {
cathal66 1:57407e283b03 327 LED_RGB.lock();
cathal66 1:57407e283b03 328 led_R=0;
cathal66 1:57407e283b03 329 led_G=1;
cathal66 1:57407e283b03 330 LED_RGB.unlock();
cathal66 1:57407e283b03 331 lcd.cls();
cathal66 1:57407e283b03 332 lcd.locate(0,2);
cathal66 1:57407e283b03 333 lcd.printf("Insert Coin");
cathal66 1:57407e283b03 334 state = STATE_0;
cathal66 1:57407e283b03 335 }
cathal66 0:151f0dbf3ca8 336 mpool.free(message);
cathal66 0:151f0dbf3ca8 337 }
cathal66 0:151f0dbf3ca8 338
cathal66 0:151f0dbf3ca8 339 timer.start(2000);
cathal66 0:151f0dbf3ca8 340
cathal66 0:151f0dbf3ca8 341 break;
cathal66 0:151f0dbf3ca8 342
cathal66 1:57407e283b03 343
cathal66 1:57407e283b03 344
cathal66 0:151f0dbf3ca8 345 }//End of switch
cathal66 0:151f0dbf3ca8 346
cathal66 0:151f0dbf3ca8 347 //toggle led for local testing
cathal66 0:151f0dbf3ca8 348 //led2= !led2;
cathal66 0:151f0dbf3ca8 349
cathal66 0:151f0dbf3ca8 350 }//end of while(1)
cathal66 0:151f0dbf3ca8 351
cathal66 0:151f0dbf3ca8 352
cathal66 0:151f0dbf3ca8 353 }