A simple microwave demo
Dependencies: C12832_lcd LM75B mbed-rtos mbed
rtos_hwk7.cpp@2:324dc8b89365, 2014-03-16 (annotated)
- 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?
User | Revision | Line number | New 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 |