homework 7
Dependencies: mbed-rtos mbed C12832_lcd LM75B
Diff: main.cpp
- Revision:
- 70:7c0743c28b11
- Parent:
- 69:55b836e8ced7
- Child:
- 71:4a5f256ecf7c
--- a/main.cpp Wed Sep 11 20:44:18 2013 +0000 +++ b/main.cpp Wed Sep 11 21:16:58 2013 +0000 @@ -4,6 +4,8 @@ directory : RTOS_HW_07 file : main.cpp ----description---------------------------------//------------------------------ + gotchyas + 1. using pc.printf inside a ticker routine will freeze the routine. -----includes-----------------------------------//----------------------------*/ #include "mbed.h" // mbed class. #include "rtos.h" // rtos class. @@ -56,7 +58,7 @@ Queue<int, 1> queueModTotalTime; // message to modify total time. Queue<int, 1> queueUpdateFSM; // message to inform FSM. Queue<int, 1> queueUpdateRemainingTime; // message to update remaining time. - Queue<int, 1> queueSetRemainingTime; // tell countdown it's start time. + Queue<int, 16> queueSetRemainingTime; // tell countdown it's start time. Queue<int, 1> queueFSMnewState; // latest FSM state. //--global_variables----------------------------//------------------------------ char gcSignalWaitEnable; // 1 to wait on a signal. @@ -67,6 +69,8 @@ int gdLCDtotalCookTimeSec; // feed into LCD. int gdCookTimeRemainingSec; // feed into LCD. tButtons gtButtons; // ISR button updates. + + int gdDiagTotalTime; //--global_instances----------------------------//------------------------------ Serial pc(USBTX, USBRX); // PuTTY terminal communication. LM75B temperature(p28,p27); // on-board thermometer. @@ -148,19 +152,19 @@ // timerFSMdone.start(); // start 'done' timer. - // tickerSlowClock.attach_us(&slowClock ,SLOWCLOCKuS); + tickerSlowClock.attach_us(&slowClock ,SLOWCLOCKuS); // count-down by one second. pc.printf("\n\r starting cookRemainingTime"); tickerCookCountdown.attach(&cookRemainingTime,1); - // Thread thread_1(temperatureThread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); -// Thread thread_2(LCDthread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); -// Thread thread_3(threadTotalTimeControl ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); - // Thread thread_4(threadButtonStateManager,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); // was osPriorityIdle - // Thread thread_5(threadCookStateFSM ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); -// + Thread thread_1(temperatureThread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); + Thread thread_2(LCDthread ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); + Thread thread_3(threadTotalTimeControl ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); + Thread thread_4(threadButtonStateManager,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); // was osPriorityIdle + Thread thread_5(threadCookStateFSM ,NULL,osPriorityIdle,DEFAULT_STACK_SIZE,NULL); + //Thread thread_4(threadButtonStateManager); @@ -168,7 +172,9 @@ while(1) { - Thread::wait(10000); + pc.printf("\n\r gdDiagTotalTime %d",gdDiagTotalTime); + + Thread::wait(1000); @@ -245,6 +251,7 @@ static int dTotalTime = 0; // total time variable. int dMessage; // message. osEvent queueEvent; // queue event. + int dRC; while(1) // thread loop. { @@ -264,7 +271,8 @@ if (dTotalTime > 180) dTotalTime = 180; if (dTotalTime < 0) dTotalTime = 0; - queueSetRemainingTime.put((int *) dTotalTime,1); + dRC = queueSetRemainingTime.put((int *) dTotalTime,1); + pc.printf("\n\r just queueSetRemainingTime.put %d, dRC = %d",dTotalTime,dRC); } @@ -384,6 +392,7 @@ queueEvent = queueUpdateRemainingTime.get(1); if (queueEvent.status == osEventMessage)// update state variable. { + led3 = !led3; // interpret as integer, not pointer. dRemainingTime = (int) queueEvent.value.p; @@ -559,11 +568,8 @@ static int dTotalTime = 0; // local copy, total time. static int dRemainingTime = 0; // remaining time. osEvent queueEvent; // queue event. + osEvent queueEvent1; // queue event. - pc.printf("\n\r cookRemainingTime."); -if (0) -{ - // count-down while FSM is in cook mode. if (dFSMstate == FSM_COOK) dRemainingTime--; @@ -574,39 +580,33 @@ // saturate remaining time. if (dRemainingTime < 0) dRemainingTime = 0; + gdCookTimeRemainingSec = dRemainingTime; // update global. + // send to FSM. queueUpdateRemainingTime.put((int *) dRemainingTime,1); - - - pc.printf("\n\r dRemainingTime = %d",dRemainingTime); - - queueEvent = queueSetRemainingTime.get(1); - if (queueEvent.status == osEventMessage) // update state variable. - { - - // interpret as integer, not pointer. - dTotalTime = (int) queueEvent.value.p; - - pc.printf("\n\r dTotalTime = %d",dTotalTime); + queueEvent1 = queueSetRemainingTime.get(1); + if (queueEvent1.status == osEventMessage) // update state variable. + { + led0 = !led0; + dTotalTime = (int) queueEvent1.value.p; // interpret as integer, not pointer. + gdDiagTotalTime = dTotalTime; } - - - + queueEvent = queueFSMnewState.get(1); // get latest FSM state. if (queueEvent.status == osEventMessage) // if there is an FSM change. { + led1 = !led1; dFSMstate = (int) queueEvent.value.p; // mirror the FSM state. - - + if (dFSMstate == FSM_COOK) // if FSM just entered cook mode. { dRemainingTime = dTotalTime; // rewind countdown. - } + } // if FSM just entered cook mode. - } - } - } + } // get latest FSM state. + + } // cookRemainingTime. /*----------------------------------------------//----------------------------*/