homework 7

Dependencies:   mbed-rtos mbed C12832_lcd LM75B

Files at this revision

API Documentation at this revision

Comitter:
gatedClock
Date:
Thu Sep 12 19:48:16 2013 +0000
Parent:
96:c8b0f29d9758
Child:
98:156298be5ba2
Commit message:
prevent total time change while countdown.

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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);