homework 7

Dependencies:   mbed-rtos mbed C12832_lcd LM75B

Files at this revision

API Documentation at this revision

Comitter:
gatedClock
Date:
Wed Sep 11 21:16:58 2013 +0000
Parent:
69:55b836e8ced7
Child:
71:4a5f256ecf7c
Commit message:
evidence that within a function called by a ticker,; message put and get do not work.

Changed in this revision

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