first compiled version

Dependencies:   mbed-rtos mbed C12832_lcd LM75B

Revision:
9:f40c7c08d1c2
Parent:
8:4fcba095bdf0
--- a/main.cpp	Tue Mar 11 05:40:23 2014 +0000
+++ b/main.cpp	Tue Mar 11 06:39:37 2014 +0000
@@ -1,18 +1,38 @@
 //LAB 6: RTOS AND IPC
 //WRITTEN BY: ROBERT HARRELL AND NAPOLEON LEONI
 
+//IPC: INTER PROGRAMMER COMMUNICATION....
+//This program tests IPC for the mbed RTOS
+//It features an LCD thread that updates the Pot value,
+//Temperature and the fortune cookie using IPC methods with timeout
+//The POT thread reads the POT value in a polling loop every 10 seconds
+//and uses the IPC queue to send the data to the LCD thread
+//The TEMP thread reads the temp value in a polling loop every 60 seconds
+//and uses the IPC queue to send the data to the LCD thread
+//The fortune cookie thread reads a fortune from a user using getc on a polling loop
+//every 100 ms and sends the fortune cookie via an IPC memory pool to the LCD thread
+//The TOD thread updates the time of date once a minute, it uses a mutex to share the LCD
+//with the LCD thread.
 
-//IPC: INTER PROGRAMMER COMMUNICATION....
-//Rob I updated the LCD update and read pot thread and they are working
-//One key issues was adding timeout for the put and get methods of the queue
-//Maybe you can work on the TOD thread and MUTEX (you'll need to add it to the 
-//LCD thread and I will finish the scan thread, sounds like Plan?? :-)
-//In the end I had to add the memory pool combined with the queue as otherwise
-//the queues just keep pointers to data and being that the putting and getting of
-//the pot values in the queue is asynchronous you need a buffer to keep the values
-//and this is provided by the MemoryPool.
 
-//I also merged your changes with mine.....temproarily commented out the pc.printf meessage for pot read. 3/4/14
+//***************************** TESTING ********************************************************//
+//  TEST        TEST DESCRIPTION                                                STATUS          //
+//  1           POT thread updates to a in less than 10 s when pot              PASS            //
+//              value is changed                                                                //
+//  2           Temp thread updates to a in less than 60 s when sensor          PASS            //
+//              sensor temperature changes                                                      //
+//  3           Strings entered with the terminal are faithfully displayed      PASS            //
+//              in the LCD, no missing characters regardless of typing                          //
+//              speed                                                                           //
+//  4           Enetering a fortune cookie in the terminal does not block       PASS            //
+//              normsl executions o the other threads                                           //
+//  5           There is no risk of overunning the fortune cookie buffer        PASS            //
+//              if the user continues to type beyond the allowable cookie                       //
+//              length the program trims the fortune cookie and reads the                       //
+//              reamining characters for the next cookie, no missing characters                 //
+//  6           Pressing center joystick button at reset allows entering date   PASS            //
+//              from the terminal.             
+//**********************************************************************************************//
 
 
 #include "mbed.h"
@@ -24,6 +44,7 @@
 //#define _DEBUGMODE  //Uncomment to enter debug mode which prints some diagnostic strings to the terminal
 #define BUFFER 17
 #define COOKIEQUEUE 30
+#define TIMEOUT 200
 
 C12832_LCD lcd;
 Serial pc(USBTX, USBRX);   //To differentiate from LCD functions
@@ -55,22 +76,22 @@
 *******************************************************************/
 void lcdUpdate(void const*){
 while(1){
-        osStatus lcdStatus = lcdMutex.lock(1200);
+        osStatus lcdStatus = lcdMutex.lock(TIMEOUT);
         if(lcdStatus == osOK){
-            osEvent evtPot = potReadingQueue.get(1200);
+            osEvent evtPot = potReadingQueue.get(TIMEOUT);
             if (evtPot.status == osEventMessage) {
                 float *queuePot = (float*)evtPot.value.p;
                 lcd.locate(0,0);
-                lcd.printf("Voltage: %.2f V", *queuePot);
+                lcd.printf("Volt: %.2f V", *queuePot);
                 potReadingBuffer.free(queuePot);      
             }
-            osEvent evtTemp = tempReadingQueue.get(1200);
+            osEvent evtTemp = tempReadingQueue.get(TIMEOUT);
             if (evtPot.status == osEventMessage) {
                 float *queueTemp = (float*)evtTemp.value.p;
                 lcd.locate(0,8);
                 lcd.printf("Temp: %.2f F", *queueTemp);      
             }
-            osEvent evtCookie = cookieReadingQueue.get(1200);
+            osEvent evtCookie = cookieReadingQueue.get(TIMEOUT);
             if (evtCookie.status == osEventMessage) {
                 char (*queueCookie)[BUFFER] = (char (*)[BUFFER])evtCookie.value.p;
                 lcd.locate(0,16);
@@ -94,7 +115,7 @@
 while(1){
         float *queue = potReadingBuffer.alloc();
         *queue = pot1; 
-        potReadingQueue.put(queue,1200);
+        potReadingQueue.put(queue,TIMEOUT);
         #ifdef _DEBUGMODE
         pc.printf("POT read");
         #endif
@@ -136,7 +157,10 @@
     char *ptrChar;
     ptrChar=*ptrBuffer;
     while(1){
-
+    //Note the choice of using getc instead of scanf to read the fortune cookie,
+    //this is a non-blocking call and allows the rest of our threads to continue operating
+    //only when a new character is typed this thread executes its body otherwise
+    //it immediately yields to other threads.
         if(pc.readable()){
             *ptrChar=pc.getc();
             pc.putc(*ptrChar);
@@ -146,14 +170,15 @@
                        *ptrChar++=' ';
                     }
                    *ptrChar='\0';
-                   cookieReadingQueue.put(ptrBuffer,500);
+                   cookieReadingQueue.put(ptrBuffer,TIMEOUT);
                    pc.printf(">Enter your fortune cookie\n>");
                    ptrChar=*ptrBuffer;
             } else {
                 ptrChar++;
             }
         }
-    Thread::wait(10);
+    //A 100 ms wait seems like reasonable delay which allows operation of the remaining threads.
+    Thread::wait(100);
     }  
 }
 
@@ -172,7 +197,7 @@
     dtp = &dt;
     
     while(1){
-        osStatus lcdStatus = lcdMutex.lock(1200);
+        osStatus lcdStatus = lcdMutex.lock(TIMEOUT);
         if(lcdStatus == osOK){
             //pc.printf("TOD updated");
             t       = time( NULL );