A simple microwave demo

Dependencies:   C12832_lcd LM75B mbed-rtos mbed

Committer:
joeroop
Date:
Sun Mar 16 01:57:02 2014 +0000
Revision:
2:324dc8b89365
Parent:
1:896789dcc911
Child:
3:4fb0721ce794
have a working project still trying to clean up

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joeroop 0:3a19dcea1a01 1
joeroop 0:3a19dcea1a01 2
joeroop 0:3a19dcea1a01 3
joeroop 0:3a19dcea1a01 4 #include "mbed.h"
joeroop 0:3a19dcea1a01 5 #include "rtos.h"
joeroop 0:3a19dcea1a01 6 #include "C12832_lcd.h" //LCD interface
joeroop 0:3a19dcea1a01 7 #include "LM75B.h" //temperature interface
joeroop 0:3a19dcea1a01 8
joeroop 1:896789dcc911 9
joeroop 1:896789dcc911 10 #define DEBOUNCE_TIME_MS 10
joeroop 2:324dc8b89365 11 #define MAX_COOK_TIME_S 20 //3min
joeroop 1:896789dcc911 12 #define INIT_COOK_TIME_S 5
joeroop 2:324dc8b89365 13 #define TEMP_INTERVAL_S 5
joeroop 1:896789dcc911 14
joeroop 1:896789dcc911 15
joeroop 0:3a19dcea1a01 16 //globals and types
joeroop 0:3a19dcea1a01 17 DigitalOut led1(LED1);
joeroop 0:3a19dcea1a01 18 DigitalOut led2(LED2);
joeroop 1:896789dcc911 19 DigitalOut led3(LED3);
joeroop 1:896789dcc911 20 DigitalOut led4(LED4);
joeroop 0:3a19dcea1a01 21 C12832_LCD lcd;
joeroop 2:324dc8b89365 22 PwmOut spkr(p26);
joeroop 2:324dc8b89365 23 LM75B therm(p28,p27);
joeroop 1:896789dcc911 24 Timer debounceTimer;
joeroop 1:896789dcc911 25 InterruptIn irptTimeDn(p16); //cook down
joeroop 1:896789dcc911 26 InterruptIn irptTimeUp(p13); //cook up
joeroop 1:896789dcc911 27 InterruptIn irptStart(p15); //start cooking
joeroop 1:896789dcc911 28 InterruptIn irptStop(p12); //stop cooking
joeroop 1:896789dcc911 29 InterruptIn irptDoor(p14); //door interrupt
joeroop 1:896789dcc911 30 Thread *proxy_lcd;
joeroop 1:896789dcc911 31 Thread *proxy_temp;
joeroop 1:896789dcc911 32 Thread *proxy_sound;
joeroop 1:896789dcc911 33 Thread *proxy_state;
joeroop 1:896789dcc911 34 Thread *proxy_led;
joeroop 1:896789dcc911 35 Thread *proxy_timer;
joeroop 1:896789dcc911 36
joeroop 1:896789dcc911 37
joeroop 1:896789dcc911 38 typedef enum { //start at one as we are using this as signals
joeroop 1:896789dcc911 39 //states
joeroop 1:896789dcc911 40 WAITING = 1,
joeroop 1:896789dcc911 41 COOKING,
joeroop 1:896789dcc911 42 DONE,
joeroop 1:896789dcc911 43 //interrupts signals
joeroop 1:896789dcc911 44 TIMEUP,
joeroop 1:896789dcc911 45 TIMEDN,
joeroop 1:896789dcc911 46 START,
joeroop 1:896789dcc911 47 STOP,
joeroop 1:896789dcc911 48 DOOR
joeroop 1:896789dcc911 49 } state_t;
joeroop 1:896789dcc911 50
joeroop 1:896789dcc911 51 char *stateStr[] = {"NULL","WAIT","COOK","DONE"};
joeroop 1:896789dcc911 52
joeroop 0:3a19dcea1a01 53
joeroop 1:896789dcc911 54 typedef enum {TEMP_VAL, TIME_ELPS, TIME_RQST} type_t;
joeroop 1:896789dcc911 55 typedef enum {STATE, TEMP, SOUND, LCD, LED, TIMER, ALL} thread_t;
joeroop 1:896789dcc911 56 char *threadStr[] = {"STATE", "TEMP", "SOUND", "LCD", "LED", "TIMER", "ALL"};
joeroop 1:896789dcc911 57
joeroop 1:896789dcc911 58 typedef struct {
joeroop 1:896789dcc911 59 state_t state;
joeroop 1:896789dcc911 60 type_t type;
joeroop 1:896789dcc911 61 union {
joeroop 1:896789dcc911 62 float temp;
joeroop 1:896789dcc911 63 int time_elapsed; //seconds of cooking
joeroop 1:896789dcc911 64 int time_request; //seconds
joeroop 2:324dc8b89365 65 } data;
joeroop 2:324dc8b89365 66 } message_t;
joeroop 1:896789dcc911 67
joeroop 1:896789dcc911 68
joeroop 1:896789dcc911 69
joeroop 1:896789dcc911 70
joeroop 2:324dc8b89365 71 MemoryPool<message_t,10> mpool; //used to hold all messages
joeroop 2:324dc8b89365 72 Queue<message_t,10> queue; //used to hold the messages
joeroop 0:3a19dcea1a01 73
joeroop 1:896789dcc911 74 bool debounce(void);
joeroop 1:896789dcc911 75 void blink_led(void const *args);
joeroop 2:324dc8b89365 76 void send_time(void const *args);
joeroop 1:896789dcc911 77
joeroop 1:896789dcc911 78 //Threads
joeroop 1:896789dcc911 79 void thread_state(void const *args);
joeroop 1:896789dcc911 80 void thread_lcd(void const *args);
joeroop 1:896789dcc911 81 void thread_temp(void const *args);
joeroop 1:896789dcc911 82 void thread_sound(void const *args);
joeroop 1:896789dcc911 83 void thread_led(void const *args);
joeroop 1:896789dcc911 84 void thread_timer(void const *args);
joeroop 1:896789dcc911 85
joeroop 1:896789dcc911 86
joeroop 1:896789dcc911 87
joeroop 1:896789dcc911 88 //ISRs
joeroop 1:896789dcc911 89 void isrTimeUp(void);
joeroop 1:896789dcc911 90 void isrTimeDn(void);
joeroop 1:896789dcc911 91 void isrStart(void);
joeroop 1:896789dcc911 92 void isrStop(void);
joeroop 1:896789dcc911 93 void isrDoor(void);
joeroop 1:896789dcc911 94
joeroop 1:896789dcc911 95
joeroop 0:3a19dcea1a01 96
joeroop 0:3a19dcea1a01 97 int main(void){
joeroop 1:896789dcc911 98 debounceTimer.start();
joeroop 1:896789dcc911 99 //interrupts
joeroop 1:896789dcc911 100 irptTimeUp.rise(&isrTimeUp);
joeroop 1:896789dcc911 101 irptTimeDn.rise(&isrTimeDn);
joeroop 1:896789dcc911 102 irptStart.rise(&isrStart);
joeroop 1:896789dcc911 103 irptStop.rise(&isrStop);
joeroop 1:896789dcc911 104 irptDoor.rise(&isrDoor); //debounce everything except for the door
joeroop 1:896789dcc911 105
joeroop 1:896789dcc911 106 Thread t1(thread_state);
joeroop 1:896789dcc911 107 Thread t2(thread_temp);
joeroop 1:896789dcc911 108 Thread t3(thread_sound);
joeroop 1:896789dcc911 109 Thread t4(thread_lcd);
joeroop 1:896789dcc911 110 Thread t5(thread_led);
joeroop 1:896789dcc911 111 Thread t6(thread_timer);
joeroop 1:896789dcc911 112
joeroop 2:324dc8b89365 113 proxy_state = &t1;
joeroop 2:324dc8b89365 114 proxy_temp = &t2;
joeroop 2:324dc8b89365 115 proxy_sound = &t3;
joeroop 2:324dc8b89365 116 proxy_lcd = &t4;
joeroop 2:324dc8b89365 117 proxy_led = &t5;
joeroop 2:324dc8b89365 118 proxy_timer = &t6;
joeroop 0:3a19dcea1a01 119
joeroop 1:896789dcc911 120
joeroop 1:896789dcc911 121
joeroop 2:324dc8b89365 122 t1.set_priority(osPriorityRealtime);
joeroop 2:324dc8b89365 123 proxy_state->signal_set(WAITING); //initialize all the threads
joeroop 1:896789dcc911 124
joeroop 0:3a19dcea1a01 125 while(1){
joeroop 0:3a19dcea1a01 126 Thread::wait(250);
joeroop 0:3a19dcea1a01 127 }
joeroop 0:3a19dcea1a01 128 }
joeroop 0:3a19dcea1a01 129
joeroop 1:896789dcc911 130 //function for a global debounce on the isrstick
joeroop 1:896789dcc911 131 bool debounce(void){
joeroop 1:896789dcc911 132 if(debounceTimer.read_ms() > DEBOUNCE_TIME_MS){
joeroop 1:896789dcc911 133 debounceTimer.reset();
joeroop 1:896789dcc911 134 return true;
joeroop 1:896789dcc911 135 }else{
joeroop 1:896789dcc911 136 return false;
joeroop 1:896789dcc911 137 }
joeroop 1:896789dcc911 138 }
joeroop 1:896789dcc911 139 //ISRs
joeroop 1:896789dcc911 140 void isrTimeUp(void){
joeroop 1:896789dcc911 141 if(debounce()){
joeroop 1:896789dcc911 142 proxy_state->signal_set(TIMEUP); //left
joeroop 1:896789dcc911 143 }
joeroop 1:896789dcc911 144 }
joeroop 1:896789dcc911 145 void isrTimeDn(void){
joeroop 1:896789dcc911 146 if(debounce()){
joeroop 1:896789dcc911 147 proxy_state->signal_set(TIMEDN); //right
joeroop 1:896789dcc911 148 }
joeroop 1:896789dcc911 149 }
joeroop 1:896789dcc911 150 void isrStart(void){
joeroop 1:896789dcc911 151 if(debounce()){
joeroop 1:896789dcc911 152 proxy_state->signal_set(START); //up
joeroop 1:896789dcc911 153 }
joeroop 1:896789dcc911 154 }
joeroop 1:896789dcc911 155 void isrStop(void){
joeroop 1:896789dcc911 156 if(debounce()){
joeroop 1:896789dcc911 157 proxy_state->signal_set(STOP); //down
joeroop 1:896789dcc911 158 }
joeroop 1:896789dcc911 159 }
joeroop 1:896789dcc911 160 void isrDoor(void){
joeroop 1:896789dcc911 161 //no debounce this is most important function!
joeroop 1:896789dcc911 162 proxy_state->signal_set(DOOR);
joeroop 1:896789dcc911 163 }
joeroop 1:896789dcc911 164
joeroop 1:896789dcc911 165 //State thread to do most of the main state machine logic
joeroop 1:896789dcc911 166 void thread_state(void const *args){
joeroop 1:896789dcc911 167 osEvent evt;
joeroop 1:896789dcc911 168 int32_t mask;
joeroop 1:896789dcc911 169 bool openDoor = false; //start with door closed
joeroop 1:896789dcc911 170 state_t state = WAITING; //WAITING, COOKING, DONE
joeroop 1:896789dcc911 171 while(1){
joeroop 1:896789dcc911 172 evt = Thread::signal_wait(0);
joeroop 1:896789dcc911 173 mask = evt.value.signals;
joeroop 1:896789dcc911 174 switch(mask){
joeroop 1:896789dcc911 175 case WAITING:
joeroop 1:896789dcc911 176 state = WAITING;
joeroop 2:324dc8b89365 177 proxy_led->signal_set(state);
joeroop 2:324dc8b89365 178 proxy_timer->signal_set(state);
joeroop 2:324dc8b89365 179 proxy_temp->signal_set(state);
joeroop 1:896789dcc911 180 break;
joeroop 1:896789dcc911 181 case COOKING:
joeroop 2:324dc8b89365 182 if(!openDoor){ //can't cook if door is open
joeroop 2:324dc8b89365 183 state = COOKING;
joeroop 2:324dc8b89365 184 proxy_led->signal_set(state);
joeroop 2:324dc8b89365 185 proxy_timer->signal_set(state);
joeroop 2:324dc8b89365 186 proxy_temp->signal_set(state);
joeroop 2:324dc8b89365 187 }
joeroop 1:896789dcc911 188 break;
joeroop 1:896789dcc911 189 case DONE: //timer can signal this
joeroop 2:324dc8b89365 190 state = DONE;
joeroop 2:324dc8b89365 191 //tell everyone we are done
joeroop 2:324dc8b89365 192 proxy_led->signal_set(state);
joeroop 2:324dc8b89365 193 proxy_timer->signal_set(state);
joeroop 2:324dc8b89365 194 proxy_temp->signal_set(state);
joeroop 2:324dc8b89365 195
joeroop 2:324dc8b89365 196 proxy_state->signal_set(WAITING); //goto waiting
joeroop 1:896789dcc911 197 break;
joeroop 1:896789dcc911 198 case TIMEUP: //change the timer up
joeroop 1:896789dcc911 199 if(state == WAITING) proxy_timer->signal_set(TIMEUP);
joeroop 1:896789dcc911 200 break;
joeroop 1:896789dcc911 201 case TIMEDN: //change the timer down
joeroop 1:896789dcc911 202 if(state == WAITING) proxy_timer->signal_set(TIMEDN);
joeroop 1:896789dcc911 203 break;
joeroop 1:896789dcc911 204 case START:
joeroop 2:324dc8b89365 205 if(state == WAITING){
joeroop 2:324dc8b89365 206 state = COOKING;
joeroop 2:324dc8b89365 207 proxy_state->signal_set(state);
joeroop 2:324dc8b89365 208 }
joeroop 1:896789dcc911 209 break;
joeroop 1:896789dcc911 210 case STOP:
joeroop 2:324dc8b89365 211 if(state == COOKING){
joeroop 2:324dc8b89365 212 state = DONE;
joeroop 2:324dc8b89365 213 proxy_state->signal_set(state);
joeroop 2:324dc8b89365 214 }
joeroop 1:896789dcc911 215 break;
joeroop 1:896789dcc911 216 case DOOR: //door changed state
joeroop 1:896789dcc911 217 openDoor = !openDoor;
joeroop 1:896789dcc911 218 state = (openDoor == true) ? DONE : WAITING; //open door then done else state back to waiting
joeroop 2:324dc8b89365 219 led4 = openDoor;
joeroop 2:324dc8b89365 220 proxy_state->signal_set(state); //signal back to state thread
joeroop 2:324dc8b89365 221 break;
joeroop 2:324dc8b89365 222 }
joeroop 2:324dc8b89365 223 }
joeroop 2:324dc8b89365 224 }
joeroop 2:324dc8b89365 225 //helper function for the timer thread
joeroop 2:324dc8b89365 226 void send_time(void const *args){
joeroop 2:324dc8b89365 227 int time = (*((int*)args))--; //have the time in seconds send to lcd now
joeroop 2:324dc8b89365 228 state_t state = COOKING;
joeroop 2:324dc8b89365 229 if(time == 0){
joeroop 2:324dc8b89365 230 state = DONE;
joeroop 2:324dc8b89365 231 proxy_state->signal_set(state); //tell all threads cooking time up
joeroop 2:324dc8b89365 232 proxy_sound->signal_set(state);
joeroop 2:324dc8b89365 233 }
joeroop 2:324dc8b89365 234 proxy_temp->signal_set(state); //use this timer to schedule temperature read
joeroop 2:324dc8b89365 235
joeroop 2:324dc8b89365 236 message_t *msg = mpool.alloc(); //allocate a new message
joeroop 2:324dc8b89365 237 msg->state = state;
joeroop 2:324dc8b89365 238 msg->type = TIME_ELPS;
joeroop 2:324dc8b89365 239 msg->data.time_elapsed = time;
joeroop 2:324dc8b89365 240 queue.put(msg);
joeroop 2:324dc8b89365 241 }
joeroop 2:324dc8b89365 242
joeroop 2:324dc8b89365 243 void thread_timer(void const *args){
joeroop 2:324dc8b89365 244 int time_set, time;
joeroop 2:324dc8b89365 245 time_set = INIT_COOK_TIME_S;
joeroop 2:324dc8b89365 246 int *ptime = &time;
joeroop 2:324dc8b89365 247 RtosTimer timer(send_time, osTimerPeriodic,(void*)ptime);
joeroop 2:324dc8b89365 248 osEvent evt;
joeroop 2:324dc8b89365 249 int32_t sig;
joeroop 2:324dc8b89365 250 state_t state;
joeroop 2:324dc8b89365 251 while(1){
joeroop 2:324dc8b89365 252 evt = Thread::signal_wait(0); //will time out then loop not needed
joeroop 2:324dc8b89365 253 sig = evt.value.signals;
joeroop 2:324dc8b89365 254 switch(sig){
joeroop 2:324dc8b89365 255 case WAITING:
joeroop 2:324dc8b89365 256 state = WAITING;
joeroop 2:324dc8b89365 257 break;
joeroop 2:324dc8b89365 258 case COOKING:
joeroop 2:324dc8b89365 259 if(state != COOKING){ //protect agains multiple start pushed if already cooking
joeroop 2:324dc8b89365 260 timer.stop();
joeroop 2:324dc8b89365 261 state = COOKING;
joeroop 2:324dc8b89365 262 time = time_set;
joeroop 2:324dc8b89365 263 timer.start(1000); //this is the increments of the timer 1s
joeroop 2:324dc8b89365 264 }
joeroop 2:324dc8b89365 265 break;
joeroop 2:324dc8b89365 266 case DONE:
joeroop 2:324dc8b89365 267 if(state != DONE){
joeroop 2:324dc8b89365 268 state = DONE;
joeroop 2:324dc8b89365 269 time = INIT_COOK_TIME_S;
joeroop 2:324dc8b89365 270 timer.stop();
joeroop 2:324dc8b89365 271 }
joeroop 2:324dc8b89365 272 break;
joeroop 2:324dc8b89365 273 case TIMEUP:
joeroop 2:324dc8b89365 274 if(state == WAITING){
joeroop 2:324dc8b89365 275 time_set = (++time_set) > MAX_COOK_TIME_S ? MAX_COOK_TIME_S : time_set; //check limits
joeroop 2:324dc8b89365 276 }
joeroop 2:324dc8b89365 277 break;
joeroop 2:324dc8b89365 278 case TIMEDN:
joeroop 2:324dc8b89365 279 if(state == WAITING)
joeroop 2:324dc8b89365 280 time_set = (--time_set) < 1 ? 1 : time_set; //check limits
joeroop 2:324dc8b89365 281 break;
joeroop 2:324dc8b89365 282 }
joeroop 2:324dc8b89365 283 if(sig){
joeroop 2:324dc8b89365 284 message_t *msg = mpool.alloc(); //allocate a new message
joeroop 2:324dc8b89365 285 msg->state = state;
joeroop 2:324dc8b89365 286 msg->type = TIME_RQST;
joeroop 2:324dc8b89365 287 msg->data.time_request = time_set;
joeroop 2:324dc8b89365 288 queue.put(msg);
joeroop 2:324dc8b89365 289 }
joeroop 2:324dc8b89365 290 }
joeroop 2:324dc8b89365 291 }
joeroop 2:324dc8b89365 292 //Threads
joeroop 2:324dc8b89365 293 void thread_lcd(void const *args){
joeroop 2:324dc8b89365 294 osEvent evt;
joeroop 2:324dc8b89365 295 int32_t sig;
joeroop 2:324dc8b89365 296 state_t state;
joeroop 2:324dc8b89365 297 int time_set = 0;
joeroop 2:324dc8b89365 298 lcd.cls();
joeroop 2:324dc8b89365 299 while(1){
joeroop 2:324dc8b89365 300 evt = queue.get(10); //wait for data message to post
joeroop 2:324dc8b89365 301 if(evt.status == osEventMessage){
joeroop 2:324dc8b89365 302 message_t *msg = (message_t*)evt.value.p;
joeroop 2:324dc8b89365 303 lcd.locate(70,0);
joeroop 2:324dc8b89365 304 if(msg->state)
joeroop 2:324dc8b89365 305 lcd.printf("State: %s ",stateStr[msg->state]);
joeroop 2:324dc8b89365 306 switch(msg->type){
joeroop 2:324dc8b89365 307 case TIME_RQST:
joeroop 2:324dc8b89365 308 time_set = msg->data.time_request;
joeroop 2:324dc8b89365 309 lcd.locate(0,0);
joeroop 2:324dc8b89365 310 lcd.printf("Request: %3d ",time_set);
joeroop 2:324dc8b89365 311 break;
joeroop 2:324dc8b89365 312 case TIME_ELPS:
joeroop 2:324dc8b89365 313 lcd.locate(0,10);
joeroop 2:324dc8b89365 314 lcd.printf("Elapsed: %3d ",time_set - msg->data.time_elapsed);
joeroop 2:324dc8b89365 315 break;
joeroop 2:324dc8b89365 316 case TEMP_VAL:
joeroop 2:324dc8b89365 317 lcd.locate(0,20);
joeroop 2:324dc8b89365 318 lcd.printf("Temp: %-3.2f ",msg->data.temp);
joeroop 2:324dc8b89365 319 break;
joeroop 2:324dc8b89365 320 }
joeroop 2:324dc8b89365 321 mpool.free(msg);
joeroop 2:324dc8b89365 322 }
joeroop 2:324dc8b89365 323 }
joeroop 2:324dc8b89365 324 }
joeroop 2:324dc8b89365 325
joeroop 2:324dc8b89365 326 void thread_temp(void const *args){
joeroop 2:324dc8b89365 327 osEvent evt;
joeroop 2:324dc8b89365 328 int32_t sig;
joeroop 2:324dc8b89365 329 int seconds = -1;
joeroop 2:324dc8b89365 330 float temp = 0.0;
joeroop 2:324dc8b89365 331 while(1){
joeroop 2:324dc8b89365 332 evt = Thread::signal_wait(0);
joeroop 2:324dc8b89365 333 sig = evt.value.signals;
joeroop 2:324dc8b89365 334 switch(sig){
joeroop 2:324dc8b89365 335 case COOKING:
joeroop 2:324dc8b89365 336 if(!(seconds++ % TEMP_INTERVAL_S)){
joeroop 2:324dc8b89365 337 temp+= 10.0;
joeroop 2:324dc8b89365 338 }else{
joeroop 2:324dc8b89365 339 sig = 0x0; //set to zero so don't print since no changes
joeroop 2:324dc8b89365 340 }
joeroop 2:324dc8b89365 341 break;
joeroop 2:324dc8b89365 342 case WAITING:
joeroop 2:324dc8b89365 343 case DONE:
joeroop 2:324dc8b89365 344 seconds = -1;
joeroop 2:324dc8b89365 345 temp = 0.0;
joeroop 2:324dc8b89365 346 break;
joeroop 2:324dc8b89365 347 }
joeroop 2:324dc8b89365 348 if(sig){
joeroop 2:324dc8b89365 349 message_t *msg = mpool.alloc(); //allocate a new message
joeroop 2:324dc8b89365 350 msg->state = (state_t)0; //don't pass a value
joeroop 2:324dc8b89365 351 msg->type = TEMP_VAL;
joeroop 2:324dc8b89365 352 msg->data.temp = seconds > 0 ? temp+9.0/5.0*therm.read()+32.0 : 0.0;
joeroop 2:324dc8b89365 353 queue.put(msg);
joeroop 2:324dc8b89365 354 }
joeroop 2:324dc8b89365 355 }
joeroop 2:324dc8b89365 356 }
joeroop 2:324dc8b89365 357 void thread_sound(void const *args){
joeroop 2:324dc8b89365 358 osEvent evt;
joeroop 2:324dc8b89365 359 int32_t sig;
joeroop 2:324dc8b89365 360 while(1){
joeroop 2:324dc8b89365 361 evt = Thread::signal_wait(0);
joeroop 2:324dc8b89365 362 sig = evt.value.signals;
joeroop 2:324dc8b89365 363 switch(sig){
joeroop 2:324dc8b89365 364 case DONE:
joeroop 2:324dc8b89365 365 spkr.period(1.0/5000);
joeroop 2:324dc8b89365 366 spkr=0.5;
joeroop 2:324dc8b89365 367 Thread::wait(1000);
joeroop 2:324dc8b89365 368 spkr=0.0;
joeroop 1:896789dcc911 369 break;
joeroop 1:896789dcc911 370 }
joeroop 1:896789dcc911 371 }
joeroop 1:896789dcc911 372 }
joeroop 1:896789dcc911 373 //helper function to thread_led used to blink led
joeroop 1:896789dcc911 374 void blink_led(void const *args){
joeroop 1:896789dcc911 375 led1 = !led1;
joeroop 1:896789dcc911 376 }
joeroop 1:896789dcc911 377 //Thread led to blink the light when cooking and stop when done
joeroop 1:896789dcc911 378 void thread_led(void const *args){
joeroop 1:896789dcc911 379 RtosTimer timer(blink_led, osTimerPeriodic);
joeroop 1:896789dcc911 380 osEvent evt;
joeroop 1:896789dcc911 381 int32_t sig;
joeroop 0:3a19dcea1a01 382 while(1){
joeroop 1:896789dcc911 383 //may need to sleep somewhere to give up thread check to see if signal_wait equiv of wait
joeroop 1:896789dcc911 384 evt = Thread::signal_wait(0); //will time out then loop not needed
joeroop 1:896789dcc911 385 sig = evt.value.signals;
joeroop 1:896789dcc911 386 switch(sig){
joeroop 1:896789dcc911 387 case COOKING:
joeroop 1:896789dcc911 388 timer.start(250);
joeroop 1:896789dcc911 389 break;
joeroop 1:896789dcc911 390 case DONE:
joeroop 1:896789dcc911 391 timer.stop();
joeroop 1:896789dcc911 392 led1 = 0;
joeroop 1:896789dcc911 393 break;
joeroop 1:896789dcc911 394 default:
joeroop 1:896789dcc911 395 //Thread::wait(2000); if wait can miss signal
joeroop 1:896789dcc911 396 break;
joeroop 1:896789dcc911 397 }
joeroop 1:896789dcc911 398 }
joeroop 1:896789dcc911 399 }
joeroop 2:324dc8b89365 400