3rd Repo, trying to figure this out.

Dependencies:   LPS25H hts221

Fork of SOFT253_Template_Weather_OS_54 by Stage-1 Students SoCEM

Revision:
82:668b51a39148
Parent:
81:996c0a3319b4
Child:
83:0d3572a8a851
--- a/main.cpp	Thu May 11 14:34:53 2017 +0000
+++ b/main.cpp	Thu May 11 15:53:15 2017 +0000
@@ -40,6 +40,7 @@
 //
 // THREADS DECLARATION
 //
+osThreadId mainThreadId;
 Thread *produceThread;
 Thread *measureThread;
 Thread *consumeThread;
@@ -52,7 +53,8 @@
 Mail<Measure, 16> mail_box;
 LocalDate *localDate;
 //Mail<>
-bool logging = true;
+bool logging = false;
+bool measuring = true;
 double sampleRate = 15;
 char temp[256];
 
@@ -72,9 +74,8 @@
 //  Ticker that signals the measureThread to do a measure
 //
  void SendSignalDoMeasure()
- {
-    if(logging == true)
-        measureThread->signal_set(SIGNAL_doMeasure);    
+{
+    measureThread->signal_set(SIGNAL_doMeasure);    
 }
 
 //
@@ -82,7 +83,7 @@
 //  Reads values from sensor board, sends over through mail queue
 void MeasureThread() 
 {
-    double temperature , humidity, pressure;
+    float temperature , humidity, pressure;
 
     while(true)
     {   
@@ -95,7 +96,7 @@
         Measure *measure = mail_box.alloc();
         if (measure == NULL) 
         {
-           logger.SendError("Out of memory\n\r");
+           logger.SendError("Out of memory\r\n");
            return;   
         }
     
@@ -118,6 +119,14 @@
             mail_box.free(measure);
             return;
         }
+        
+        if(logging)
+        {
+            logger.SendMessage("Measurement Taken:\r\n");
+            char *ptr = localDate->ToString();
+            snprintf(temp, 256, "    %s T: %f | H: %f | P: %f |\n\r",ptr, temperature, humidity, pressure);
+            logger.SendMessage(temp);
+        }
     }
 }
  
@@ -141,7 +150,7 @@
             buffer.pushValue(msr);
             mail_box.free(measure);
         } else {
-            snprintf(temp, 256, "ERROR: %x\n\r", evt.status);   
+            snprintf(temp, 256, "ERROR: %x\r\n", evt.status);   
             logger.SendError(temp);
         }          
     }
@@ -182,6 +191,12 @@
     {
         charCmd = NULL;
         charCmd = getchar();
+        if(logging)
+        {
+            logging = false;
+            logger.SendMessage("\r\033[1AKey Pressed. Debug logging disabled.\r\n");
+            charCmd = NULL;
+        }
         
         if(charCmd != NULL)
         {
@@ -208,9 +223,7 @@
                     charPos = strtok(NULL," -,");
                     //Check if it's a "LIST ALL" command
                     if(CompareCommands(charPos, "all",3))
-                    {
-                        logger.SendMessage("Printing all measures performed so far: \r\n"); 
-                        
+                    {                        
                         // Changed to use circular buffer rather than list buffer
                         buffer.readAll();
                         logger.SendMessage("D O N E ! \r\n");
@@ -219,12 +232,7 @@
                     else if(strtol(charPos,NULL,10) != 0)
                     {
                         int num = atoi(charPos);
-                        //char *temp1;
-                        //strncpy(temp1, "\r\nPrinting ", 31);
-                        //strcat(temp1, charPos);
-                        //strcat(temp1, " measures: \r\n");
                         
-                        snprintf(temp, 256, "Printing %i measures: \r\n", num);
                         logger.SendMessage(temp);
                         
                         // Changed to use circular buffer rather than list buffer
@@ -247,7 +255,6 @@
                         
                         // Changed to use circular buffer rather than list buffer
                         buffer.deleteAll();
-                        logger.SendMessage("Elements deleted!\r\n");
                     }
                     //Check if it's a "DELETE X" command
                     else if (strtol(charPos,NULL,10) != 0)
@@ -267,14 +274,17 @@
                     char *ptr = localDate->ToString();
                     
                     // Changed to use circular buffer rather than list buffer
-                    if(logging == true)
-                    {
-                        snprintf(temp, 256, "STATUS: \r\n   # of measures: %i \r\n   SAMPLING: ON \r\n   Current Date: %s \r\n   Sample Rate(s): %2.2f \r\n", buffer.getSize(), ptr,sampleRate);   
-                    }
-                    else
-                    {
-                        snprintf(temp, 256, "STATUS: \r\n   # of measures: %i \r\n   SAMPLING: OFF \r\n   Current Date: %s \r\n   Sample Rate(s): %2.2f \r\n", buffer.getSize(), ptr,sampleRate);  
-                    }
+                    snprintf(temp, 256, "\nStatus: \r\n");
+                    logger.SendMessage(temp);                    
+                    snprintf(temp, 256, "    # of measures: %i \r\n", buffer.getSize());
+                    logger.SendMessage(temp);
+                    snprintf(temp, 256, "    Sampling: %s \r\n", measuring ? "On" : "Off");
+                    logger.SendMessage(temp);
+                    snprintf(temp, 256, "    Logging: %s \r\n", logging ? "On" : "Off");
+                    logger.SendMessage(temp);
+                    snprintf(temp, 256, "    Current Date: %s \r\n", ptr);
+                    logger.SendMessage(temp);
+                    snprintf(temp, 256, "    Sample Rate(s): %2.2f \r\n", sampleRate);
                     logger.SendMessage(temp);
                 }
                 //Check if it's a "SETTIME" command
@@ -353,20 +363,43 @@
                         logger.SendMessage("Wrong format! please use DD-MM-YYYY. \r\n");  
                     }
                 }
-                // Check if it's a "LOGGING" command
+                // Check if it's a "STATE" command
                 else if(CompareCommands(charPos,"state",5))
                 {
                     charPos = strtok(NULL," ,");
                     //Check if it should be turned ON / OFF
                     if(CompareCommands(charPos,"on",2))
                     {
-                        logging = true;   
                         logger.SendMessage("Sampling turned ON!\r\n");
+                        timer.attach(&SendSignalDoMeasure, sampleRate);
+                        SendSignalDoMeasure();
+                        measuring = true;
                     }
                     else if (CompareCommands(charPos,"off",3))
                     {
-                        logging = false; 
                         logger.SendMessage("Sampling turned OFF!\r\n");
+                        timer.detach();
+                        measuring = false;
+                    }
+                    else
+                    {
+                        logger.SendMessage("Expected parameters: \"on\" | \"off\"\r\n");   
+                    }
+                }
+                // Check if it's a "LOGGING" command
+                else if(CompareCommands(charPos,"logging",7))
+                {
+                    charPos = strtok(NULL," ,");
+                    //Check if it should be turned ON / OFF
+                    if(CompareCommands(charPos,"on",2))
+                    {
+                        logging = true;   
+                        logger.SendMessage("Debug logging turned ON!\r\n");
+                        logger.SendMessage("Press any key to deactivate\r\n");
+                    }
+                    else if (CompareCommands(charPos,"off",3))
+                    {
+                        logger.SendMessage("Logging is already turned off.\r\n");
                     }
                     else
                     {
@@ -397,22 +430,30 @@
                 // Check if it's a "HELP" command
                 else if (CompareCommands(charPos,"help",4) || CompareCommands(charPos,"?",1))
                 {
-                    logger.SendMessage("Available Commands:\r\n");
-                    logger.SendMessage("    read <ALL|N> - Read ALL or N first measures.\r\n");
-                    logger.SendMessage("    delete <ALL|N> - Delete ALL or N first measures.\r\n");
+                    logger.SendMessage("\nAvailable Commands:\r\n");
+                    logger.SendMessage("    read <all|n> - Read all or n first measures.\r\n");
+                    logger.SendMessage("    delete <all|n> - Delete all or n first measures.\r\n");
                     logger.SendMessage("    setdate <DD> <MM> <YYYY> Set current date.\r\n");
                     logger.SendMessage("    settime <HH> <MM> <SS> Set current time.\r\n");
                     logger.SendMessage("    sett <T> Set sample rate (in seconds).\r\n");
                     logger.SendMessage("    status - Status report of device.\r\n");
-                    logger.SendMessage("    state - <ON|OFF> - Turn sampling on or OFF.\r\n");
-                    logger.SendMessage("    logging <ON|OFF> - Turn logging on or OFF.\r\n");
+                    logger.SendMessage("    state - <on|off> - Turn sampling on or off.\r\n");
+                    logger.SendMessage("    logging <on|off> - Turn logging on or off.\r\n");
+                }
+                // Check if it's a "HELP" command
+                else if (CompareCommands(charPos,"reset",5))
+                {
+                    logger.SendError("Program Terminating...\r\n");
                 }
                 // If command not recognized
                 else
                 {
                     logger.SendMessage("Command not recognized. Type \"help\" for more info.\r\n");
                 }
-                logger.SendMessage("\r\nAwaiting Command:\n\r");
+                if(!logging)
+                {
+                    logger.SendMessage("\r\nAwaiting Command:\r\n");
+                }
                 //Clear command!
                 //* NOTE * Setting first char in array to '\0' WILL NOT RESET IT...for some reason.
                 int i = 0;
@@ -438,27 +479,27 @@
      // Some queue system holding lines to print
      // If the queue has something to print, print it.
      
-     while(true)
-     {
-            Thread::signal_wait(SIGNAL_printMessage);
-            
+    while(true)
+    {
+        Thread::signal_wait(SIGNAL_printMessage);
+        
+        while(true)
+        {
             if(logger.GetError())
             {
-                // Kill EVERYTHING
-                //mbed_reset();
-                //NVIC_SystemReset();
+                osSignalSet(mainThreadId, SIGNAL_terminate);
             }
             else if(!logger.GetMessage())
             {
-                
-            }
-        
-     }
+                break;
+            }      
+        } 
+    }
 }
  
 // Main thread
 int main() {
-           
+           mainThreadId = osThreadGetId();
     //Initialize all stuff you need here:
     measurer.init();
     measurer.calib();
@@ -483,11 +524,22 @@
     consumeThread = new Thread();
     consumeThread->start(ConsumeThread);
     
-    logger.SendMessage("\r\n--- W E L C O M E --\r\n");
+    logger.SendMessage("\r\n--- W E L C O M E ---\r\n");
+    
+    SendSignalDoMeasure();
     
     while(true) 
     {
-        // Is there a sleep method that could be used instead or waiting and awaking every 3 seconds?
-        Thread::signal_wait(SIGNAL_terminate);
+        osSignalWait(SIGNAL_terminate, osWaitForever);
+        
+        produceThread->terminate();
+        measureThread->terminate();
+        consumeThread->terminate();
+        loggingThread->terminate();
+        
+        printf("Press any key to restart...");
+        char c = getchar();    
+            
+        NVIC_SystemReset();        
     }
 } 
\ No newline at end of file