Urm didnt i write this already? Mostly same as georges code, except: buffer and sensor reads in seperate threads (Not Main) some other bits

Dependencies:   BMP280

Fork of Sample_LCD_Serial_Buffer by BDG

Revision:
6:64d346936f0e
Parent:
5:ea3ec65cbf5f
Child:
7:f017a37bcf1b
--- a/main.cpp	Wed Dec 20 21:28:52 2017 +0000
+++ b/main.cpp	Tue Dec 26 21:54:41 2017 +0000
@@ -2,7 +2,7 @@
 #include "main.h"
 
 #define ENTER_KEY 1
-#define MAX_SAMPLES 120
+#define MAX_SAMPLES 4
 
 LCD  lcd(PD_15, PF_12, PF_13, PE_9, PF_14, PF_15); 
 BMP280 Sensor(D14, D15);
@@ -13,13 +13,13 @@
 void Serial_CMD();
 
 //data FIFO buffer
-char data_buffer[MAX_SAMPLES][50];
+char data_buffer[MAX_SAMPLES][64];
+int sample_h = 0;
+int sample_t = 0;
 int data_h = 0;
 int data_t = 0;
-
-//Time-Date data
 struct tm * sample_epoch;
-char sample_time[20];
+Mutex DataBuffer;
 
 //Serial_CMD
 volatile int rx_in=0;
@@ -53,43 +53,44 @@
         while(1) {
             Green_int = !Green_int;
             
-            //Read sensors, send to mail-queue
+        //Read sensors, send to mail-queue
             mail_t *mail = mail_box.alloc();
             mail->LDR_Value = LDR_In.read(); 
             mail->temp_Value = Sensor.getTemperature();
             mail->press_Value = Sensor.getPressure();
             mail_box.put(mail);           
+        
+        //Lock data buffer
+            DataBuffer.lock();
             
-            //Format samples, send to FIFO buffer
-            memset(data_buffer[data_h],NULL,50);
+        //Format samples, send to FIFO buffer head
+            memset(data_buffer[sample_h],NULL,64);
             time( &raw_time );
             sample_epoch = localtime( &raw_time );
+            char sample_time[20];
             strftime(sample_time,20,"%d/%m/%Y %X",sample_epoch);
-            sprintf(data_buffer[data_h],"%s, %2.2f, %4.2f, %.4f\n\r", sample_time, mail->temp_Value, mail->press_Value, mail->LDR_Value);
+            sprintf(data_buffer[sample_h],"%s, %2.2f, %4.2f, %.4f\n\r", sample_time, mail->temp_Value, mail->press_Value, mail->LDR_Value);
             memset(sample_time,NULL,20);
             
-            //Print all samples to serial
-            for(int n = data_t; n<= MAX_SAMPLES; n++){
-                pc.puts(data_buffer[n]);
+        //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;
             }
-            
-            if(data_t > data_h){
-                for(int n = 0; n<= data_h; n++){
-                    pc.puts(data_buffer[n]);
+        //Check sample FIFO buffer tail
+            if(sample_t == sample_h){
+                sample_t++;
+                if(sample_t >= (MAX_SAMPLES)){
+                    sample_t = 0;
                 }
             }
-            
-            //Prepare buffer for next samples
-            data_h++;
-            if(data_h >= (MAX_SAMPLES)){
-                data_h = 0;
-            }
-            if(data_h == data_t){
-                data_t++;
-                if(data_t >= (MAX_SAMPLES)){
-                    data_t = 0;
-                }
-            }
+        //Unlock data buffer
+            DataBuffer.unlock();
             
             Thread::wait (15000);
         }
@@ -158,13 +159,19 @@
 //Interrupt when recieving from serial port
 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){
             S_CMD.signal_set(ENTER_KEY);
         }
+    
+    //Increment buffer head
         else{
             rx_in = (rx_in + 1);
         }
@@ -175,85 +182,173 @@
 void Serial_CMD(){
     
     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];
         
-        if(strstr(rx_buffer, "READ ALL")){
+/*----CARRAGE RETURN-------------*/        
+        if(rx_buffer[0] == 0xD){
+            pc.puts("\n\r");
+            }
+/*----READ ALL----------------------------------*/
+        else if(strstr(rx_buffer, "READ ALL")){
+            pc.puts(" READ ALL\n\r");
+        
+        //Lock data buffer
+            DataBuffer.lock();
+        
+        //Print all samples to serial
+            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++){
+                    pc.puts(data_buffer[n]);
+                }
+            }
             
-            /*time ( &raw_time );
-            s_time = localtime ( &raw_time );
-            strftime(serial_buffer, 80, "%d/%m/%Y, %X\n\r", time);
-            pc.puts(serial_buffer);*/
+        //Lock data buffer
+            DataBuffer.unlock();
         }
+/*----DELETE ALL----------------------------------*/
         else if(strstr(rx_buffer, "DELETE ALL")){
-            pc.printf("DELETE ALL\n\r");
+            pc.puts(" DELETE ALL\n\r");
+            
+        //Lock data buffer
+            DataBuffer.lock();
+            
+        //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
+            DataBuffer.unlock();
         }
+/*----READ----------------------------------*/
         else if(strstr(rx_buffer, "READ")){
-            pc.printf("READ\n\r");
+            pc.puts(" READ     \n\r");
+            int N = atoi(strncpy(tm_n,&rx_buffer[5],4));
+            int S = 0;
+            pc.printf("N = %d\n\r",N);
+            
+        //Lock data buffer
+            DataBuffer.lock();
+        
+        //Check if N is greater than buffer size
+            if(N >= MAX_SAMPLES){
+                N = MAX_SAMPLES;
+            }
+            
+        //Read N samples from FIFO buffer
+            if(N <= 0){
+                pc.puts("####ERROR####\n\r");
+            }
+            else{
+                for(int n=data_t; n<=MAX_SAMPLES-1; n++){
+                    if(S>=N){}
+                    else{
+                        pc.puts(data_buffer[n]);
+                        S++;
+                    }
+                }
+                for(int n=0; n<=data_t; n++){
+                    if(S>=N){}
+                    else{
+                        pc.puts(data_buffer[n]);
+                        S++;
+                    }
+                }
+            }
+
+        //Unlock data buffer
+            DataBuffer.unlock();
         }
+/*----DELETE----------------------------------*/
         else if(strstr(rx_buffer, "DELETE")){
-            pc.printf("DELETE\n\r");
+            pc.puts(" DELETE     \n\r");
         }
+/*----SETDATE----------------------------------*/
         else if(strstr(rx_buffer, "SETDATE")){
             time(&raw_time);
             s_time = localtime(&raw_time);
             
+        //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
             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
             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_time(mktime(s_time));
-            strftime(serial_buffer, 80, "%d/%m/%Y\n\r", s_time);
+            strftime(serial_buffer, 80, "\n\r Set Date: %d/%m/%Y\n\r", s_time);
             pc.puts(serial_buffer);
         }
+/*----SETTIME---------------------------------*/
         else if(strstr(rx_buffer, "SETTIME")){
             time(&raw_time);
             s_time = localtime(&raw_time);
             
+        //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
             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
             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(mktime(s_time));
-            strftime(serial_buffer, 80, "%X\n\r", s_time);
+            strftime(serial_buffer, 80, "\n\r Set Time: %X\n\r", s_time);
             pc.puts(serial_buffer);
         }
+/*----SETT----------------------------------*/
         else if(strstr(rx_buffer, "SETT")){
-            pc.printf("SETT\n\r");
+            pc.puts(" SETT\n\r");
         }
+/*----STATE----------------------------------*/
         else if(strstr(rx_buffer, "STATE")){
-            pc.printf("STATE\n\r");
+            pc.puts(" STATE\n\r");
         }
+/*----LOGGING----------------------------------*/
         else if(strstr(rx_buffer, "LOGGING")){
-            pc.printf("LOGGING\n\r");
+            pc.puts(" LOGGING\n\r");
         }
+/*----ERROR---*/
         else{
-            pc.printf("ERROR\n\r");    
+            pc.puts("####ERROR####\n\r");    
         }
-        
+/*----------------------------------------------*/
+    
+    //Clear serial buffers
         memset(serial_buffer, NULL, 80);
         memset(rx_buffer, NULL, 32);
         rx_in = 0;
     
+    //Attach serial interrupt
         pc.attach(&Rx_interrupt, Serial::RxIrq);
     }
 }