V4

Dependencies:   BMP280

Fork of Thread_Communication_V3 by BDG

Files at this revision

API Documentation at this revision

Comitter:
benparkes
Date:
Sat Jan 06 18:05:43 2018 +0000
Parent:
15:864d936b51cf
Commit message:
Mail Queues!!!

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
main.h Show annotated file Show diff for this revision Revisions of this file
--- a/main.cpp	Sat Jan 06 13:52:46 2018 +0000
+++ b/main.cpp	Sat Jan 06 18:05:43 2018 +0000
@@ -6,7 +6,7 @@
 #define RisingEdge 1
 #define USER_BUTTON_PRESSED 1
 
-LCD  lcd(PD_15, PF_12, PF_13, PE_9, PF_14, PF_15); 
+LCD  lcd(PD_15, PF_12, PF_13, PE_9, PF_14, PF_15);
 BMP280 Sensor(D14, D15);
 
 //Define Functions
@@ -30,7 +30,7 @@
 Timeout userButtonTimeout; // FOR debouncing User Switch
 Ticker read;            //  ***Sets sampling period!*** (ISR Signals sampling Thread)
 Ticker refresh;
-/* LOCKS */ 
+/* LOCKS */
 Mutex DataBuffer;
 Mutex dataLock;
 
@@ -54,22 +54,25 @@
 /* DEBOUNCER INTERRUPTS */
 InterruptIn userButton(USER_BUTTON);
 
-void userButtonRise () {
+void userButtonRise ()
+{
     userButton.rise(NULL);
     userButtonState = RisingEdge;
     userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
 }
 
-void userButtonFall () {
+void userButtonFall ()
+{
     userButton.fall(NULL);
     _writeRemove_SD.signal_set(USER_BUTTON_PRESSED);
     userButtonState = FallingEdge;
     userButtonTimeout.attach(&userButtonTimeoutHandler, 0.1);
 }
 
-void userButtonTimeoutHandler() {
+void userButtonTimeoutHandler()
+{
     userButtonTimeout.detach();
-    
+
     switch (userButtonState) {
         case RisingEdge:
             userButton.fall(&userButtonFall);
@@ -77,15 +80,16 @@
         case FallingEdge:
             userButton.rise(userButtonRise);
             break;
-    }// End Switch        
-} //End ISR       
+    }// End Switch
+} //End ISR
 /*--------------------------------MAIN--------------------------------*/
-int main() {
-    
+int main()
+{
+
     pc.baud(57600);
     pc.attach(&Rx_interrupt, Serial::RxIrq);
     POST();
-    
+
     pc.printf("\n\n\nType HELP for list of available Commands\n\n\n\r");
     _serialCMD.start(serialCMD);
     _sensorRead.start(sensorRead);
@@ -93,117 +97,145 @@
     _circBuff.start(circBuff);
     _writeRemove_SD.start(writeRemove_SD);
     _Network1.start(Network1);
-    
+
     userButton.rise(&userButtonRise);
     read.attach(&readISR, sampleTime);
     refresh.attach(&LCD_timerISR, LCD_REFRESH);
-    
+
     while (1) {
         Yellow_ext = ON;
         Thread::wait (200);
         Yellow_ext = OFF;
         Thread::wait(200);
-        }// End While
+    }// End While
 } // End Main
 /*--------------------------------------------------------------------*/
 /*-----------------Circular Buffer------------------------------------*/
-void circBuff () {
-    
-    while(1) { 
-            Thread::signal_wait(DATA_READY); // wait for signal from sensorRead
-            
-            //Lock data buffer
-            DataBuffer.lock();
-            
-            //Format samples, send to FIFO buffer head
-            memset(data_buffer[sample_h],NULL,64);            
-            
-            dataLock.lock(); //lock critical section
-            sprintf(data_buffer[sample_h],"%s, %2.2f, %4.2f, %.4f\n\r", TIME, TEMP, PRES, LDR);
-            dataLock.unlock(); //unlock critical section
-            
-            
-            //Set seperate FIFO head and tail for printing data
-            data_h = sample_h;
-            data_t = sample_t;
-            
-            //Move sample FIFO buffer head to next row in buffer
-            sample_h++;
-            //Check sample FIFO buffer head
-            if(sample_h >= MAX_SAMPLES){
-                sample_h = 0;
+void circBuff ()
+{
+
+    while(1) {
+        Thread::signal_wait(DATA_READY); // wait for signal from sensorRead
+
+        //Lock data buffer
+        DataBuffer.lock();
+
+        //Format samples, send to FIFO buffer head
+        memset(data_buffer[sample_h],NULL,64);
+
+        osEvent evt = mail_FIFO.get();
+
+        if (evt.status == osEventMail) {
+            mail_t *mail = (mail_t*)evt.value.p;
+
+            sprintf(data_buffer[sample_h],"%s, %2.2f, %4.2f, %.4f\n\r", mail->Time_Date, mail->temp_Value, mail->press_Value, mail->LDR_Value);
+
+            mail_FIFO.free(mail);
+        }
+
+
+
+
+        //Set seperate FIFO head and tail for printing data
+        data_h = sample_h;
+        data_t = sample_t;
+
+        //Move sample FIFO buffer head to next row in buffer
+        sample_h++;
+        //Check sample FIFO buffer head
+        if(sample_h >= MAX_SAMPLES) {
+            sample_h = 0;
+        }
+        //Check sample FIFO buffer tail
+        if(sample_t == sample_h) {
+            sample_t++;
+            if(sample_t >= (MAX_SAMPLES)) {
+                sample_t = 0;
             }
-            //Check sample FIFO buffer tail
-            if(sample_t == sample_h){
-                sample_t++;
-                if(sample_t >= (MAX_SAMPLES)){
-                    sample_t = 0;
-                }
-            }
-            //Unlock data buffer
-            DataBuffer.unlock();
+        }
+        //Unlock data buffer
+        DataBuffer.unlock();
     }// End While
 }// End Circular buffer
 /*-------------------------------------------------------------*/
 /*---------------------Read Sensors ---------------------------*/
 
-void readISR () { // Ticker interrupt defined in main
-    
+void readISR ()   // Ticker interrupt defined in main
+{
+
     _sensorRead.signal_set(SENSOR_UPDATE);
 }
 // Keep short
-void sensorRead () {
-    
+void sensorRead ()
+{
+
     while (1) {
-        
+
         dataLock.lock(); // Entering Critial Section
-    
+
         // Store Data in global Variables
         LDR = LDR_In.read();
         TEMP = Sensor.getTemperature();
         PRES = Sensor.getPressure();
-        
+
         memset((char *)TIME, NULL, 21);
         time(&raw_time);
         sample_epoch = localtime(&raw_time);
         strftime((char *)TIME, 21,"%d/%m/%Y, %X", sample_epoch);
-        
+
         dataLock.unlock(); // Exiting Critical Section
-    
+
         Green_int = !Green_int; // debugging
-            
+
         //Read sensors, send to mail-queue
-        mail_t *mail = mail_box.alloc();
-        mail->LDR_Value = LDR; 
+        mail_t *mail = mail_LCD.alloc();
+        mail->LDR_Value = LDR;
         mail->temp_Value = TEMP;
         mail->press_Value = PRES;
-        mail_box.put(mail);
-        
-        
+        mail_LCD.put(mail);
+
+        mail_t *mail1 = mail_FIFO.alloc();
+        strcpy(mail1->Time_Date, (char*)TIME);
+        mail1->LDR_Value = LDR;
+        mail1->temp_Value = TEMP;
+        mail1->press_Value = PRES;
+        mail_FIFO.put(mail);
+
+        mail_t *mail2 = mail_Network.alloc();
+        strcpy(mail2->Time_Date, (char*)TIME);
+        mail2->LDR_Value = LDR;
+        mail2->temp_Value = TEMP;
+        mail2->press_Value = PRES;
+        mail_Network.put(mail);
+
+
+
         _circBuff.signal_set(DATA_READY);  // Set signal to buffer to store updated values
         Thread::signal_wait(SENSOR_UPDATE); // Wait for the Timer interrupt
     }
 }
-/*--------------------------------------------------------------------*/    
+/*--------------------------------------------------------------------*/
 
 /*--------------------------------LCD---------------------------------*/
-void LCD_timerISR () {
+void LCD_timerISR ()
+{
     _PrintLCD.signal_set(LCD_READY);
-    }
+}
 
-void PrintLCD () {
-    
+void PrintLCD ()
+{
+
     int i = 0;
     int j = 4;
     char lightString[16];
     char tempString[16];
     char pressString[16];
     char lcd_TIME[21];
-    
-    while(1){
-        
+
+    while(1) {
+
         lcd.RowSelect(3);
-        
+
 
         if (j == 4) {
 
@@ -211,7 +243,7 @@
             lcd.RowSelect(0);
             switch (i) {
                 case 0: {
-                    osEvent evt = mail_box.get();
+                    osEvent evt = mail_LCD.get();
 
                     if (evt.status == osEventMail) {
                         mail_t *mail = (mail_t*)evt.value.p;
@@ -220,7 +252,7 @@
                         sprintf(tempString,"%2.2f", mail->temp_Value);
                         sprintf(pressString,"%4.2f", mail->press_Value);
 
-                        mail_box.free(mail);
+                        mail_LCD.free(mail);
                     }
 
                     lcd.Write("Light:");
@@ -252,7 +284,7 @@
                     break;
             }//end switch
         }// end if
-        else{
+        else {
             j++;
         }
         lcd.RowSelect(3);
@@ -273,161 +305,160 @@
 
 /*------------------------------SERIAL_CMD----------------------------*/
 //Interrupt when recieving from serial port
-void Rx_interrupt() {
-    
+void Rx_interrupt()
+{
+
     //Wait for serial input
     while (pc.readable()) {
-    
+
         //Return input to serial
         rx_buffer[rx_in] = pc.getc();
         pc.putc(rx_buffer[rx_in]);
-    
+
         //If enter key is pressed, set serial thread signal
-        if(rx_buffer[rx_in] == 0xD){
+        if(rx_buffer[rx_in] == 0xD) {
             _serialCMD.signal_set(ENTER_KEY);
         }
-    
+
         //Increment buffer head
-        else{
-            if(rx_in>=32){
+        else {
+            if(rx_in>=32) {
                 puts("\n\rERROR - Stop typing so much!\n\r");
                 rx_in = 0;
                 memset(rx_buffer, NULL, 32);
-            }
-            else{
-                rx_in = (rx_in + 1);    
+            } else {
+                rx_in = (rx_in + 1);
             }
         }
     }
 }
 
 //Check what command what recieved and execute
-void serialCMD(){
+void serialCMD()
+{
     bool xx = 1; // State for CMD STATE
-    while(1){
+    while(1) {
         //Wait for thread signal
         Thread::signal_wait(ENTER_KEY);
-        
+
         //Detach serial interrupt
         pc.attach(NULL, Serial::RxIrq);
 
         struct tm * s_time;
         char tm_n[4];
-        
-/*----CARRAGE RETURN-------------*/        
-        if(rx_buffer[0] == 0xD){
+
+        /*----CARRAGE RETURN-------------*/
+        if(rx_buffer[0] == 0xD) {
             pc.puts("\n\r");
-            }
-/*----READ ALL----------------------------------*/
-        else if(strstr(rx_buffer, "READ ALL")){
+        }
+        /*----READ ALL----------------------------------*/
+        else if(strstr(rx_buffer, "READ ALL")) {
             pc.puts("\n\r Reading all samples...\n\r");
-        
+
             //Lock data buffer
             DataBuffer.lock();
-        
+
             //Print all samples to serial
-            for(int n=data_t; n<=MAX_SAMPLES; n++){
+            for(int n=data_t; n<=MAX_SAMPLES; n++) {
                 pc.puts(data_buffer[n]);
             }
-            if(data_t>data_h){
-                for(int n=0; n<=(data_t-1); n++){
+            if(data_t>data_h) {
+                for(int n=0; n<=(data_t-1); n++) {
                     pc.puts(data_buffer[n]);
                 }
             }
-            
+
             //Lock data buffer
             DataBuffer.unlock();
             pc.puts(" All Samples read!\n\r");
         }
-/*----DELETE ALL----------------------------------*/
-        else if(strstr(rx_buffer, "DELETE ALL")){
+        /*----DELETE ALL----------------------------------*/
+        else if(strstr(rx_buffer, "DELETE ALL")) {
             pc.puts("\n\r Deleting all samples...\n\r");
-            
-        //Lock data buffer
+
+            //Lock data buffer
             DataBuffer.lock();
-            
-        //Delete all sampled data
-            for(int n=0; n<=MAX_SAMPLES; n++){
+
+            //Delete all sampled data
+            for(int n=0; n<=MAX_SAMPLES; n++) {
                 memset(data_buffer[n], NULL, 64);
             }
             data_h = data_t;
             sample_h = sample_t;
-            
-        //Unlock data buffer
+
+            //Unlock data buffer
             DataBuffer.unlock();
             pc.puts(" All previous samples deleted!\n\r");
         }
-/*----READ----------------------------------*/
-        else if(strstr(rx_buffer, "READ")){
+        /*----READ----------------------------------*/
+        else if(strstr(rx_buffer, "READ")) {
             pc.puts("\n\r Reading N samples...\n\r");
             int N = atoi(strncpy(tm_n,&rx_buffer[5],4));
             int S = 0;
-            
-        //Lock data buffer
+
+            //Lock data buffer
             DataBuffer.lock();
-        
-        //Check if N is greater than buffer size
-            if(N >= MAX_SAMPLES){
+
+            //Check if N is greater than buffer size
+            if(N >= MAX_SAMPLES) {
                 N = MAX_SAMPLES;
             }
-            
-        //Read N samples from FIFO buffer
-            if(N <= 0){
+
+            //Read N samples from FIFO buffer
+            if(N <= 0) {
                 pc.puts("ERROR - N must be greater than 0\n\r");
                 N = 0;
-            }
-            else{
-                for(int n=data_h; n>=0; n--){
-                    if(S>=N){}
-                    else{
+            } else {
+                for(int n=data_h; n>=0; n--) {
+                    if(S>=N) {}
+                    else {
                         pc.puts(data_buffer[n]);
                         S++;
                     }
                 }
-                for(int n=MAX_SAMPLES-1; n<=data_t; n--){
-                    if(S>=N){}
-                    else{
+                for(int n=MAX_SAMPLES-1; n<=data_t; n--) {
+                    if(S>=N) {}
+                    else {
                         pc.puts(data_buffer[n]);
                         S++;
                     }
                 }
             }
-        pc.printf(" Read %d samples\n\r",N);
-        //Unlock data buffer
+            pc.printf(" Read %d samples\n\r",N);
+            //Unlock data buffer
             DataBuffer.unlock();
         }
-/*----DELETE----------------------------------*/
-        else if(strstr(rx_buffer, "DELETE")){
+        /*----DELETE----------------------------------*/
+        else if(strstr(rx_buffer, "DELETE")) {
             pc.puts("\n\r Deleting N samples...\n\r");
             int N = atoi(strncpy(tm_n,&rx_buffer[6],4));
             int S = 0;
 
-        //Lock data buffer
+            //Lock data buffer
             DataBuffer.lock();
-        
-        //Check if N is greater than buffer size
-            if(N >= MAX_SAMPLES){
+
+            //Check if N is greater than buffer size
+            if(N >= MAX_SAMPLES) {
                 N = MAX_SAMPLES;
             }
 
-        //Read N samples from FIFO buffer
-            if(N <= 0){
+            //Read N samples from FIFO buffer
+            if(N <= 0) {
                 pc.puts("ERROR - N must be greater than 0\n\r");
                 N = 0;
-            }
-            else{
-                for(int n=data_t; n<=MAX_SAMPLES; n++){
-                    if(S>=N){}
-                    else{
+            } else {
+                for(int n=data_t; n<=MAX_SAMPLES; n++) {
+                    if(S>=N) {}
+                    else {
                         memset(data_buffer[n], NULL, 64);
                         S++;
                         data_t = n;
                         sample_t = n;
                     }
                 }
-                for(int n=MAX_SAMPLES-1; n<=data_t; n--){
-                    if(S>=N){}
-                    else{
+                for(int n=MAX_SAMPLES-1; n<=data_t; n--) {
+                    if(S>=N) {}
+                    else {
                         memset(data_buffer[n], NULL, 64);
                         S++;
                         data_t = n;
@@ -435,65 +466,65 @@
                     }
                 }
             }
-        pc.printf(" Deleted %d samples\n\r",N);   
-        //Unlock data buffer
-        DataBuffer.unlock();
+            pc.printf(" Deleted %d samples\n\r",N);
+            //Unlock data buffer
+            DataBuffer.unlock();
         }
-/*----SETDATE----------------------------------*/
-        else if(strstr(rx_buffer, "SETDATE")){
+        /*----SETDATE----------------------------------*/
+        else if(strstr(rx_buffer, "SETDATE")) {
             time(&raw_time);
             s_time = localtime(&raw_time);
-            
-        //Update day in time structure            
+
+            //Update day in time structure
             int dd = atoi(strncpy(tm_n,&rx_buffer[8],2));
             s_time->tm_mday = dd;
             memset(tm_n, NULL, 4);
-            
-        //Update month in time structure
+
+            //Update month in time structure
             int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
             s_time->tm_mon = mm-1;
             memset(tm_n, NULL, 4);
-            
-        //Update year in time structure
+
+            //Update year in time structure
             int yyyy = atoi(strncpy(tm_n,&rx_buffer[14],4));
             s_time->tm_year = yyyy-1900;
             memset(tm_n, NULL, 4);
-            
-        //Set date from updated time structure
+
+            //Set date from updated time structure
             set_time(mktime(s_time));
             strftime(serial_buffer, 80, "\n\r Date updated to: %d/%m/%Y\n\r", s_time);
             pc.puts(serial_buffer);
         }
-/*----SETTIME---------------------------------*/
-        else if(strstr(rx_buffer, "SETTIME")){
+        /*----SETTIME---------------------------------*/
+        else if(strstr(rx_buffer, "SETTIME")) {
             time(&raw_time);
             s_time = localtime(&raw_time);
-            
-        //Update seconds in time structure
+
+            //Update seconds in time structure
             int ss = atoi(strncpy(tm_n,&rx_buffer[14],2));
             s_time->tm_sec = ss;
             memset(tm_n, NULL, 4);
-        
-        //Update minutes in time structure
+
+            //Update minutes in time structure
             int mm = atoi(strncpy(tm_n,&rx_buffer[11],2));
             s_time->tm_min = mm;
             memset(tm_n, NULL, 4);
-            
-        //Update hour in time structure
+
+            //Update hour in time structure
             int hh = atoi(strncpy(tm_n,&rx_buffer[8],2));
             s_time->tm_hour = hh;
             memset(tm_n, NULL, 4);
-        
-        //Set time from updated time structure
+
+            //Set time from updated time structure
             set_time(mktime(s_time));
             strftime(serial_buffer, 80, "\n\r Time updated to: %X\n\r", s_time);
             pc.puts(serial_buffer);
         }
-/*----SETT----------------------------------*/
-        else if(strstr(rx_buffer, "SETT")){
+        /*----SETT----------------------------------*/
+        else if(strstr(rx_buffer, "SETT")) {
             read.detach();
             double AA = atof(strncpy(tm_n,&rx_buffer[5],4));
-            
+
             if (AA < 0.1 || AA > 60) {
                 AA = 15;
                 pc.puts("ERROR - Sample Time out of range (0.1<=T<=60)\n\r");
@@ -503,40 +534,36 @@
             read.attach(readISR, sampleTime);
             memset(tm_n, NULL, 4);
         }
-/*----STATE----------------------------------*/
-        else if(strstr(rx_buffer, "STATE")){
-            
+        /*----STATE----------------------------------*/
+        else if(strstr(rx_buffer, "STATE")) {
+
             strncpy(tm_n,&rx_buffer[6],3);
             if  (strstr(tm_n, "ON")) {
                 if (xx == 1) {
                     pc.puts("\n\r Already Sampling\n\r");
-                }
-                else {
+                } else {
                     read.attach(&readISR, sampleTime);
                     pc.puts("\n\r Sampling ON\n\r");
                     xx = 1;
                 }
-            }
-            else if (strstr(tm_n, "OFF")) {
+            } else if (strstr(tm_n, "OFF")) {
                 if ( xx == 0 ) {
                     pc.puts("\n\r Already not Sampling\n\r");
-                }
-                else {
+                } else {
                     read.detach();
                     pc.puts("\n\r Sampling OFF\n\r");
                     xx = 0;
                 }
+            } else {
+                pc.puts("Error - STATE can only be ON or OFF\n\r");
             }
-            else {
-                pc.puts("Error - STATE can only be ON or OFF\n\r");
-                }
             //pc.puts(" STATE\n\r");
         }
-/*----LOGGING----------------------------------*/
-        else if(strstr(rx_buffer, "LOGGING")){
+        /*----LOGGING----------------------------------*/
+        else if(strstr(rx_buffer, "LOGGING")) {
             pc.puts(" LOGGING\n\r");
         }
-/*----HELP--------------------------------------*/
+        /*----HELP--------------------------------------*/
         else if (strstr(rx_buffer, "HELP")) {
             pc.puts("\n\n\r Currently Available Commands:\n\r");
             pc.puts("\tREAD n   - Read n previous samples\n\r");
@@ -545,24 +572,23 @@
             pc.puts("\tSETDATE dd/mm/yyyy - Set time in specified format\n\r");
             pc.puts("\tDELETE ALL   - Delete all sampled held in internal memory\n\r");
             pc.puts("\tSETT - Set sample period. must be an integer in range 0 < T < 61\n\r");
-        } 
-        else if (strstr(rx_buffer,"tell me a joke")) {
+        } else if (strstr(rx_buffer,"tell me a joke")) {
             pc.puts("\n\r Why do programmers always get Halloween and Christmas mixed up...?\n\r");
             Thread::wait(5000);
             pc.puts(" Because Oct 31 == Dec 25! LOL");
         }
-/*----ERROR---*/
-        else{
-            pc.puts("Error - Command not recognised. Type HELP for a list of available commands\n\r");    
+        /*----ERROR---*/
+        else {
+            pc.puts("Error - Command not recognised. Type HELP for a list of available commands\n\r");
         }
-/*----------------------------------------------*/
-    
-    //Clear serial buffers
+        /*----------------------------------------------*/
+
+        //Clear serial buffers
         memset(serial_buffer, NULL, 80);
         memset(rx_buffer, NULL, 32);
         rx_in = 0;
-    
-    //Attach serial interrupt
+
+        //Attach serial interrupt
         pc.attach(&Rx_interrupt, Serial::RxIrq);
     }
 }
@@ -574,7 +600,7 @@
     while(1) {
         Thread::signal_wait(USER_BUTTON_PRESSED); //wait for debounce signal
         int sd_state = sdIn;
-        
+
         switch (sd_state) {
             case 1:
                 pc.printf("SD Card not inserted!\n\r");
@@ -589,8 +615,7 @@
                 //check init
                 if (sd.init() != 0) {
                     pc.printf(" ERROR - SD card failed to initialise.\n\rRestart board\n\r PROBABLY wires come out\n\r");
-                } 
-                else {
+                } else {
                     // Create Filing system for SD Card
                     FATFileSystem fs("sd", &sd);
 
@@ -665,8 +690,7 @@
     if (eth.get_ip_address() == NULL) {
         pc.printf("Error - Can't get IP. Network not setup\n\r");
         pc.printf("Reset Required. Make sure network cables are plugged in\n\r");
-    }
-     else {
+    } else {
         printf("The target IP address is '%s'\n\r", eth.get_ip_address());
 
         //Now setup a web server
@@ -682,13 +706,13 @@
 
         /* Can handle 5 simultaneous connections */
         srv.listen(5);
-        
+
         TCPSocket clt_sock;      //Socket for communication
-        
+
         pc.printf("\rServer Ready\n\r");
-        
+
         while (true) {
-            
+
             using namespace std;
             //Block and wait on an incoming connection
             srv.accept(&clt_sock, &clt_addr);
@@ -699,10 +723,10 @@
             string strL = "LDR:";
             string strP = ",  Pressure(mBar): ";
             string strT = ",  Temp(C): ";
-            string strDT ="Date/Time:  ,"; 
+            string strDT ="Date/Time:  ,";
 
             //This is a C string
-        
+
             char X_str[128];
 
             /*//Read the LDR value
@@ -718,10 +742,16 @@
             //sprintf(l_str, "%1.3f", L ); // try \n\r??
             //sprintf(t_str, "%2.2f", T);
             //sprintf(p_str, "%4.2f", P);*/
-            
-            dataLock.lock();
-            sprintf(X_str,"%s, \n\rTemperature: %2.2f, \n\rPressure: %4.2f, \n\rLight: %.4f", TIME, TEMP, PRES, LDR);
-            dataLock.unlock();
+            osEvent evt = mail_Network.get();
+
+            if (evt.status == osEventMail) {
+                mail_t *mail = (mail_t*)evt.value.p;
+
+                sprintf(X_str,"%s, \n\rTemperature: %2.2f, \n\rPressure: %4.2f, \n\rLight: %.4f", mail->Time_Date, mail->temp_Value, mail->press_Value, mail->LDR_Value);
+
+                mail_Network.free(mail);
+            }
+
 
 
             //Build the C++ string response
@@ -744,10 +774,11 @@
     }//end if
 }// end thread
 /*---------------------------POST--------------------------------------------*/
-void POST () {
-    pc.printf(" Basic POST\n\r"); 
+void POST ()
+{
+    pc.printf(" Basic POST\n\r");
     pc.printf(" ALL Leds should be flashing\n\r");
-    
+
     for(unsigned int n = 0; n<10; n++) {
         Green_int = ON;
         Blue_int = ON;
@@ -755,7 +786,7 @@
         Green_ext = ON;
         Yellow_ext = ON;
         Red_ext = ON;
-    
+
         wait (0.2);
         Green_int = OFF;
         Blue_int = OFF;
@@ -765,19 +796,19 @@
         Red_ext = OFF;
         wait (0.2);
     }
-    
+
     pc.printf("Switch states:\n\r");
     pc.printf("\tSW_L: %d\n\r\tSW_R %d\n\r", SW_L.read(), SW_R.read());
-    
+
     float Temp = Sensor.getTemperature();
     float Pres = Sensor.getPressure();
     float ldrs = LDR_In.read();
-    
+
     pc.printf("Sensor test:\n\r");
     pc.printf("T: %f\tP: %f\tL: %f\n\r",Temp,Pres,ldrs);
-    
+
     pc.printf("LCD Test\n\r");
-    
+
     lcd.Clear();
     lcd.RowSelect(0);
     lcd.Write("1******LCD*********1");
@@ -787,8 +818,8 @@
     lcd.Write("3******LCD*********3");
     lcd.RowSelect(3);
     lcd.Write("4******TEST********4");
-    
+
     wait(1);
     lcd.Clear();
-    pc.printf("Basic POST end\n\r");    
+    pc.printf("Basic POST end\n\r");
 }
--- a/main.h	Sat Jan 06 13:52:46 2018 +0000
+++ b/main.h	Sat Jan 06 18:05:43 2018 +0000
@@ -77,12 +77,15 @@
 
 /* Mail */
 typedef struct {
+    char Time_Date[21];
     float LDR_Value;
     float temp_Value;
     float press_Value;
 } mail_t;
 
-Mail<mail_t, 16> mail_box;
+Mail<mail_t, 16> mail_LCD;
+Mail<mail_t, 16> mail_FIFO;
+Mail<mail_t, 16> mail_Network;
 //Mail<mail_t, 16> mail_box2;
 
 //data FIFO buffer