finished

Dependencies:   C12832 DebouncedInterrupt MMA7660 mbed-rtos mbed

Committer:
cathal66
Date:
Mon Mar 02 12:56:15 2015 +0000
Revision:
1:57407e283b03
Parent:
0:151f0dbf3ca8
Child:
2:ff8262f6a385
Full program working with LED in a thread

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