finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

Committer:
cathal66
Date:
Fri May 08 10:21:04 2015 +0000
Revision:
3:c31a01f2c064
Parent:
2:ff8262f6a385
finished

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 3:c31a01f2c064 49 DigitalOut led4(LED4); //LED
cathal66 2:ff8262f6a385 50 DigitalOut led3(LED3); //LED
cathal66 2:ff8262f6a385 51 DigitalOut led2(LED2); //LED
cathal66 3:c31a01f2c064 52
cathal66 2:ff8262f6a385 53 //Global varible
cathal66 2:ff8262f6a385 54 int button_press=0;
cathal66 0:151f0dbf3ca8 55
cathal66 3:c31a01f2c064 56
cathal66 3:c31a01f2c064 57 void timeout_event(void const *n)
cathal66 0:151f0dbf3ca8 58 {
cathal66 3:c31a01f2c064 59
cathal66 3:c31a01f2c064 60 //event via a message queue
cathal66 3:c31a01f2c064 61 message_t *message = mpool.alloc();
cathal66 3:c31a01f2c064 62 message->event = TIME_OUT;
cathal66 3:c31a01f2c064 63 queue.put(message);
cathal66 3:c31a01f2c064 64
cathal66 3:c31a01f2c064 65 led4 = !led4;
cathal66 3:c31a01f2c064 66
cathal66 0:151f0dbf3ca8 67 }
cathal66 0:151f0dbf3ca8 68
cathal66 0:151f0dbf3ca8 69
cathal66 3:c31a01f2c064 70 void button_event_thread(void const *argument)
cathal66 3:c31a01f2c064 71 {
cathal66 3:c31a01f2c064 72
cathal66 0:151f0dbf3ca8 73 while (true) {
cathal66 3:c31a01f2c064 74
cathal66 3:c31a01f2c064 75 if (button_press == 1) {
cathal66 3:c31a01f2c064 76
cathal66 2:ff8262f6a385 77 //event via a message queue
cathal66 2:ff8262f6a385 78 message_t *message = mpool.alloc();
cathal66 3:c31a01f2c064 79 message->event = BUTTON_PRESS;
cathal66 2:ff8262f6a385 80 queue.put(message);
cathal66 3:c31a01f2c064 81
cathal66 2:ff8262f6a385 82 led3 = !led3;
cathal66 2:ff8262f6a385 83 button_press = 0;
cathal66 2:ff8262f6a385 84 Thread::wait(500);
cathal66 3:c31a01f2c064 85 }
cathal66 3:c31a01f2c064 86
cathal66 3:c31a01f2c064 87
cathal66 3:c31a01f2c064 88
cathal66 0:151f0dbf3ca8 89 }
cathal66 0:151f0dbf3ca8 90 }
cathal66 0:151f0dbf3ca8 91
cathal66 1:57407e283b03 92
cathal66 3:c31a01f2c064 93 void tilt_event_thread(void const *argument)
cathal66 3:c31a01f2c064 94 {
cathal66 1:57407e283b03 95 float tilt_value_Y = MMA.y();
cathal66 1:57407e283b03 96 float tilt_value_X = MMA.x();
cathal66 3:c31a01f2c064 97 while (true) {
cathal66 3:c31a01f2c064 98
cathal66 1:57407e283b03 99 //debouce delay for switch
cathal66 3:c31a01f2c064 100
cathal66 1:57407e283b03 101
cathal66 3:c31a01f2c064 102 if (tilt_value_Y <= MMA.y()-0.2 ^ tilt_value_Y >= MMA.y()+0.2 ) {
cathal66 1:57407e283b03 103
cathal66 1:57407e283b03 104 //event via a message queue
cathal66 1:57407e283b03 105 message_t *message = mpool.alloc();
cathal66 3:c31a01f2c064 106 message->event = TILT;
cathal66 1:57407e283b03 107 queue.put(message);
cathal66 3:c31a01f2c064 108
cathal66 1:57407e283b03 109 led3 = !led3;
cathal66 2:ff8262f6a385 110 Thread::wait(1500);
cathal66 1:57407e283b03 111 tilt_value_Y = MMA.y();
cathal66 1:57407e283b03 112 }
cathal66 3:c31a01f2c064 113
cathal66 3:c31a01f2c064 114
cathal66 3:c31a01f2c064 115 }
cathal66 3:c31a01f2c064 116
cathal66 3:c31a01f2c064 117
cathal66 1:57407e283b03 118 }
cathal66 3:c31a01f2c064 119
cathal66 3:c31a01f2c064 120 void push_event_thread(void const *argument)
cathal66 3:c31a01f2c064 121 {
cathal66 1:57407e283b03 122 float push_value = push.read();
cathal66 3:c31a01f2c064 123 while (true) {
cathal66 3:c31a01f2c064 124
cathal66 1:57407e283b03 125 //debouce delay for switch
cathal66 3:c31a01f2c064 126
cathal66 3:c31a01f2c064 127 if (push_value >= push.read()- 0.15 ^ push_value <= push.read()+ 0.15 ) {
cathal66 1:57407e283b03 128 //event via a message queue
cathal66 1:57407e283b03 129 message_t *message = mpool.alloc();
cathal66 3:c31a01f2c064 130 message->event = PUSH;
cathal66 1:57407e283b03 131 queue.put(message);
cathal66 1:57407e283b03 132 led3 = !led3;
cathal66 2:ff8262f6a385 133 Thread::wait(1000);
cathal66 2:ff8262f6a385 134 push_value = push.read();
cathal66 1:57407e283b03 135 }
cathal66 3:c31a01f2c064 136 }
cathal66 3:c31a01f2c064 137
cathal66 3:c31a01f2c064 138
cathal66 1:57407e283b03 139 }
cathal66 3:c31a01f2c064 140 void flash_led_thread(void const *argument)
cathal66 3:c31a01f2c064 141 {
cathal66 3:c31a01f2c064 142 while (true) {
cathal66 1:57407e283b03 143 Thread::signal_wait(0x1);
cathal66 3:c31a01f2c064 144
cathal66 3:c31a01f2c064 145 for (int i=0; i<=20; i++) {
cathal66 1:57407e283b03 146 LED_RGB.lock();
cathal66 3:c31a01f2c064 147 led_R = !led_R;
cathal66 3:c31a01f2c064 148 LED_RGB.unlock();
cathal66 1:57407e283b03 149 Thread::wait(100);
cathal66 3:c31a01f2c064 150 }
cathal66 1:57407e283b03 151 LED_RGB.lock();
cathal66 3:c31a01f2c064 152 led_R = 1;
cathal66 3:c31a01f2c064 153 LED_RGB.unlock();
cathal66 3:c31a01f2c064 154 }
cathal66 3:c31a01f2c064 155
cathal66 3:c31a01f2c064 156 }
cathal66 1:57407e283b03 157
cathal66 2:ff8262f6a385 158
cathal66 2:ff8262f6a385 159
cathal66 3:c31a01f2c064 160 void Button_Inter()
cathal66 3:c31a01f2c064 161 {
cathal66 3:c31a01f2c064 162 //Flash_LED_Thread.signal_set(0x1);
cathal66 3:c31a01f2c064 163
cathal66 3:c31a01f2c064 164 button_press=1;
cathal66 3:c31a01f2c064 165
cathal66 3:c31a01f2c064 166 }
cathal66 1:57407e283b03 167
cathal66 3:c31a01f2c064 168 int main (void)
cathal66 3:c31a01f2c064 169 {
cathal66 3:c31a01f2c064 170
cathal66 3:c31a01f2c064 171 //Thread fsm(fsm_thread);
cathal66 3:c31a01f2c064 172 Thread button_event(button_event_thread);
cathal66 3:c31a01f2c064 173 Thread tilt_event(tilt_event_thread);
cathal66 3:c31a01f2c064 174 Thread push_event(push_event_thread);
cathal66 3:c31a01f2c064 175 Thread Flash_LED_Thread(flash_led_thread);
cathal66 3:c31a01f2c064 176 RtosTimer timer(timeout_event, osTimerPeriodic, (void *)0);
cathal66 0:151f0dbf3ca8 177
cathal66 1:57407e283b03 178 //Interrupts
cathal66 3:c31a01f2c064 179 button.rise(&Button_Inter);
cathal66 1:57407e283b03 180
cathal66 3:c31a01f2c064 181 int state = STATE_0;
cathal66 0:151f0dbf3ca8 182
cathal66 3:c31a01f2c064 183 LED_RGB.lock();
cathal66 3:c31a01f2c064 184 led_R=1;
cathal66 3:c31a01f2c064 185 led_G=1;
cathal66 3:c31a01f2c064 186 led_B=1;
cathal66 3:c31a01f2c064 187 LED_RGB.unlock();
cathal66 1:57407e283b03 188
cathal66 3:c31a01f2c064 189 if (MMA.testConnection()) //setup accler
cathal66 1:57407e283b03 190
cathal66 3:c31a01f2c064 191 //start timer with a 2 sec timeout
cathal66 3:c31a01f2c064 192 timer.start(2000);
cathal66 3:c31a01f2c064 193
cathal66 0:151f0dbf3ca8 194 while (true) {
cathal66 3:c31a01f2c064 195
cathal66 3:c31a01f2c064 196
cathal66 3:c31a01f2c064 197 switch(state) {
cathal66 3:c31a01f2c064 198 case STATE_0:
cathal66 0:151f0dbf3ca8 199 osEvent evt = queue.get();
cathal66 3:c31a01f2c064 200 if (evt.status == osEventMessage) {
cathal66 0:151f0dbf3ca8 201 message_t *message = (message_t*)evt.value.p;
cathal66 3:c31a01f2c064 202
cathal66 3:c31a01f2c064 203
cathal66 3:c31a01f2c064 204 if(message->event == BUTTON_PRESS) {
cathal66 1:57407e283b03 205 LED_RGB.lock();
cathal66 1:57407e283b03 206 led_G=0;
cathal66 1:57407e283b03 207 led_R=1;
cathal66 1:57407e283b03 208 LED_RGB.unlock();
cathal66 1:57407e283b03 209 lcd.cls();
cathal66 1:57407e283b03 210 lcd.locate(0,2);
cathal66 1:57407e283b03 211 lcd.printf("Enter");
cathal66 1:57407e283b03 212 state = STATE_1;
cathal66 3:c31a01f2c064 213 }
cathal66 3:c31a01f2c064 214 if(message->event == PUSH) {
cathal66 1:57407e283b03 215 LED_RGB.lock();
cathal66 1:57407e283b03 216 led_G=1; //off
cathal66 1:57407e283b03 217 led_R=0; //on
cathal66 1:57407e283b03 218 LED_RGB.unlock();
cathal66 1:57407e283b03 219 lcd.cls();
cathal66 1:57407e283b03 220 lcd.locate(0,2);
cathal66 1:57407e283b03 221 lcd.printf("Insert Coin push");
cathal66 1:57407e283b03 222 state = STATE_0;
cathal66 3:c31a01f2c064 223 }
cathal66 3:c31a01f2c064 224 if(message->event == TILT) {
cathal66 1:57407e283b03 225 LED_RGB.lock();
cathal66 1:57407e283b03 226 led_G=1;
cathal66 1:57407e283b03 227 led_R=1;
cathal66 1:57407e283b03 228 LED_RGB.unlock();
cathal66 1:57407e283b03 229 lcd.cls();
cathal66 1:57407e283b03 230 lcd.locate(0,0);
cathal66 1:57407e283b03 231 lcd.printf("STOP");
cathal66 1:57407e283b03 232 lcd.locate(0,10);
cathal66 3:c31a01f2c064 233 lcd.printf("Please Insert Coin");
cathal66 3:c31a01f2c064 234 Flash_LED_Thread.signal_set(0x1);
cathal66 1:57407e283b03 235 state = STATE_2;
cathal66 3:c31a01f2c064 236 }
cathal66 3:c31a01f2c064 237 if(message->event == TIME_OUT) {
cathal66 1:57407e283b03 238 LED_RGB.lock();
cathal66 1:57407e283b03 239 led_G=1;
cathal66 1:57407e283b03 240 led_R=0;
cathal66 1:57407e283b03 241 LED_RGB.unlock();
cathal66 1:57407e283b03 242 lcd.cls();
cathal66 1:57407e283b03 243 lcd.locate(0,2);
cathal66 1:57407e283b03 244 lcd.printf("Hello");
cathal66 1:57407e283b03 245 state = STATE_0;
cathal66 3:c31a01f2c064 246 }
cathal66 0:151f0dbf3ca8 247 mpool.free(message);
cathal66 3:c31a01f2c064 248 }
cathal66 3:c31a01f2c064 249
cathal66 0:151f0dbf3ca8 250 timer.start(2000);
cathal66 3:c31a01f2c064 251
cathal66 3:c31a01f2c064 252 break;
cathal66 3:c31a01f2c064 253
cathal66 0:151f0dbf3ca8 254 case STATE_1:
cathal66 3:c31a01f2c064 255
cathal66 0:151f0dbf3ca8 256 evt = queue.get();
cathal66 3:c31a01f2c064 257 if (evt.status == osEventMessage) {
cathal66 0:151f0dbf3ca8 258 message_t *message = (message_t*)evt.value.p;
cathal66 3:c31a01f2c064 259
cathal66 3:c31a01f2c064 260
cathal66 3:c31a01f2c064 261 if(message->event == BUTTON_PRESS) {
cathal66 1:57407e283b03 262 lcd.cls();
cathal66 1:57407e283b03 263 lcd.locate(0,2);
cathal66 1:57407e283b03 264 lcd.printf("Thanks");
cathal66 1:57407e283b03 265 state = STATE_1;
cathal66 3:c31a01f2c064 266 }
cathal66 3:c31a01f2c064 267 if(message->event == PUSH) {
cathal66 1:57407e283b03 268 LED_RGB.lock();
cathal66 1:57407e283b03 269 led_R=0;
cathal66 1:57407e283b03 270 led_G=1;
cathal66 1:57407e283b03 271 LED_RGB.unlock();
cathal66 1:57407e283b03 272 lcd.cls();
cathal66 1:57407e283b03 273 lcd.locate(0,2);
cathal66 1:57407e283b03 274 lcd.printf("Hello");
cathal66 1:57407e283b03 275 state = STATE_0;
cathal66 3:c31a01f2c064 276 }
cathal66 3:c31a01f2c064 277
cathal66 0:151f0dbf3ca8 278 mpool.free(message);
cathal66 3:c31a01f2c064 279 }
cathal66 3:c31a01f2c064 280
cathal66 3:c31a01f2c064 281 timer.start(2000);
cathal66 3:c31a01f2c064 282
cathal66 3:c31a01f2c064 283
cathal66 3:c31a01f2c064 284 break;
cathal66 3:c31a01f2c064 285
cathal66 0:151f0dbf3ca8 286 case STATE_2:
cathal66 0:151f0dbf3ca8 287
cathal66 3:c31a01f2c064 288 evt = queue.get();
cathal66 3:c31a01f2c064 289 if (evt.status == osEventMessage) {
cathal66 0:151f0dbf3ca8 290 message_t *message = (message_t*)evt.value.p;
cathal66 3:c31a01f2c064 291
cathal66 3:c31a01f2c064 292 if(message->event == BUTTON_PRESS) {
cathal66 1:57407e283b03 293 LED_RGB.lock();
cathal66 1:57407e283b03 294 led_G=0;
cathal66 1:57407e283b03 295 led_R=1;
cathal66 1:57407e283b03 296 LED_RGB.unlock();
cathal66 1:57407e283b03 297 lcd.cls();
cathal66 1:57407e283b03 298 lcd.locate(0,2);
cathal66 1:57407e283b03 299 lcd.printf("Enter");
cathal66 1:57407e283b03 300 state = STATE_1;
cathal66 3:c31a01f2c064 301
cathal66 3:c31a01f2c064 302 }
cathal66 3:c31a01f2c064 303 if(message->event == TILT) {
cathal66 1:57407e283b03 304 lcd.cls();
cathal66 1:57407e283b03 305 lcd.locate(0,0);
cathal66 1:57407e283b03 306 lcd.printf("STOP");
cathal66 1:57407e283b03 307 lcd.locate(0,10);
cathal66 3:c31a01f2c064 308 lcd.printf("Please Insert Coin");
cathal66 1:57407e283b03 309 state = STATE_2;
cathal66 3:c31a01f2c064 310 Flash_LED_Thread.signal_set(0x1);
cathal66 3:c31a01f2c064 311 }
cathal66 3:c31a01f2c064 312 if(message->event == TIME_OUT) {
cathal66 1:57407e283b03 313 LED_RGB.lock();
cathal66 1:57407e283b03 314 led_R=0;
cathal66 1:57407e283b03 315 led_G=1;
cathal66 1:57407e283b03 316 LED_RGB.unlock();
cathal66 1:57407e283b03 317 lcd.cls();
cathal66 1:57407e283b03 318 lcd.locate(0,2);
cathal66 1:57407e283b03 319 lcd.printf("Insert Coin");
cathal66 1:57407e283b03 320 state = STATE_0;
cathal66 3:c31a01f2c064 321 }
cathal66 0:151f0dbf3ca8 322 mpool.free(message);
cathal66 3:c31a01f2c064 323 }
cathal66 0:151f0dbf3ca8 324
cathal66 0:151f0dbf3ca8 325 timer.start(2000);
cathal66 3:c31a01f2c064 326
cathal66 3:c31a01f2c064 327 break;
cathal66 3:c31a01f2c064 328
cathal66 3:c31a01f2c064 329
cathal66 3:c31a01f2c064 330
cathal66 0:151f0dbf3ca8 331 }//End of switch
cathal66 3:c31a01f2c064 332
cathal66 3:c31a01f2c064 333 //toggle led for local testing
cathal66 3:c31a01f2c064 334 //led2= !led2;
cathal66 3:c31a01f2c064 335
cathal66 0:151f0dbf3ca8 336 }//end of while(1)
cathal66 3:c31a01f2c064 337
cathal66 3:c31a01f2c064 338
cathal66 0:151f0dbf3ca8 339 }