homework 7
Dependencies: mbed-rtos mbed C12832_lcd LM75B
Diff: main.cpp
- Revision:
- 97:ee840478d6b3
- Parent:
- 96:c8b0f29d9758
- Child:
- 98:156298be5ba2
--- a/main.cpp Thu Sep 12 19:08:28 2013 +0000 +++ b/main.cpp Thu Sep 12 19:48:16 2013 +0000 @@ -57,8 +57,9 @@ #define RT_PAUSE 0x03 // remaining-time don't change. #define RT_CLEAR 0x04 // remaining-time set to zero. - #define TEMP_READ 0x01 // temperature synthesizer control. - #define TEMP_CALC 0x02 // temperature synthesizer control. + #define TEMP_READ 0x01 // temperature synthesizer control. + #define TEMP_CALC 0x02 // temperature synthesizer control. + #define TEMP_FREEZE 0x03 // temperature synthesizer control. #define GRANULARITY 0x400 // 1-second countdown ticker granularity. #define MAXSECONDS 180 // maximum microwave-on time. @@ -100,6 +101,7 @@ Queue<int, 1> queueFSMnewState; // latest FSM state. Queue<int, 1> queueSpeakerControl; // speaker control queue. Queue<int, 1> queueTemperatureControl; // control the temperature synthesizer. + Queue<int, 1> queueSuppressTimeAdjust; // total time control. //--global_variables----------------------------//------------------------------ char gcSignalWaitEnable; // 1 to wait on a signal. char gcSlowClock; // slow-clock signal. @@ -298,21 +300,35 @@ { static int dTotalTime = 0; // total time variable. int dMessage; // message. + int dSuppress; // 1 to suppress operation. osEvent queueEvent; // queue event. int dRC; + dSuppress = 0; // initialize. + while(1) // thread loop. { + + // suppression mail from FSM. + queueEvent = queueSuppressTimeAdjust.get(1); + if (queueEvent.status == osEventMessage) + { + dSuppress = (int) queueEvent.value.p; + } + + + + queueEvent = queueModTotalTime.get(1); // get message. if (queueEvent.status == osEventMessage) { dMessage = (int) queueEvent.value.p; // interpret as integer, not pointer. - // increment total time. + if (!dSuppress) // increment total time. if (dMessage == MSG_INC_TIME) dTotalTime += 60; - // decrement total time. + if (!dSuppress) // decrement total time. if (dMessage == MSG_DEC_TIME) dTotalTime -= 60; // saturations. @@ -322,6 +338,7 @@ dRC = queueSetRemainingTime.put((int *) dTotalTime,1); giRemainingTime.dTotalTime = dTotalTime; } + Thread::wait(THREAD_3_WAITmS); // multitasking. } // thread loop. @@ -362,6 +379,7 @@ if (dFSMstate != dFSMstateLast) // if just entered state. { queueTemperatureControl.put((int *) TEMP_READ,1); + queueSuppressTimeAdjust.put((int*) 0,1); } giLCD.dTotalCookTime = giRemainingTime.dTotalTime; @@ -380,6 +398,7 @@ { giRemainingTime.cControl = RT_DECREMENT; queueTemperatureControl.put((int *) TEMP_CALC,1); + queueSuppressTimeAdjust.put((int*) 1,1); } giLCD.dTotalCookTime = giRemainingTime.dTotalTime; @@ -402,6 +421,7 @@ if (dFSMstate != dFSMstateLast) // if just entered state. { + queueTemperatureControl.put((int *) TEMP_FREEZE,1); } @@ -425,6 +445,7 @@ if (dFSMstate != dFSMstateLast) // if just entered state. { + queueTemperatureControl.put((int *) TEMP_CALC,1); } @@ -452,7 +473,7 @@ if (dFSMstate != dFSMstateLast) // if just entered state. { - + queueTemperatureControl.put((int *) TEMP_FREEZE,1); Thread thread_beep(&speakerThread,(void *) &dBeepSeconds); @@ -639,7 +660,7 @@ dPreviousTimerMs = 0; fLastMeasuredTemperature = 0.0; - temperatureTimer.start(); + // temperatureTimer.start(); while(1) // thread loop. { @@ -654,12 +675,20 @@ { gfCelsius = temperature.read(); // physical measurement. fLastMeasuredTemperature = gfCelsius; - temperatureTimer.reset(); // reset timer while we're not using it. +// temperatureTimer.reset(); // reset timer while we're not using it. } if (dTempControl == TEMP_CALC) - gfCelsius = fLastMeasuredTemperature + (temperatureTimer.read_ms() / 6000.0); + + + + gfCelsius = ((float) (giRemainingTime.dTotalTime - giRemainingTime.dRemainingTime) / (float) 6.0) + fLastMeasuredTemperature; + + + + + // gfCelsius = fLastMeasuredTemperature + (temperatureTimer.read_ms() / 6000.0);