Buffer working with LCD, Serial and SD Card

Dependencies:   BMP280

Fork of Thread_Communication by BDG

main.cpp

Committer:
GeorgeJourneaux
Date:
2017-12-14
Revision:
4:93d6d13d4de3
Parent:
3:73497379c0cb
Child:
5:ea3ec65cbf5f

File content as of revision 4:93d6d13d4de3:

#include "mbed.h"
#include "main.h"

#define ENTER_KEY 1

LCD  lcd(PD_15, PF_12, PF_13, PE_9, PF_14, PF_15); 
BMP280 Sensor(D14, D15);


void PrintLCD ();
void Rx_interrupt();
void Serial_CMD();

//Serial_CMD
volatile int rx_in=0;
char rx_line[80];

//Time date
time_t raw_time = time(NULL);
char time_buffer[80];

/* Mail */
typedef struct {
    float LDR_Value;
    float temp_Value;
    float press_Value;
} mail_t;

Mail<mail_t, 16> mail_box;

//Threads
Thread t1;
Thread t2;
Thread S_CMD;
    
/*--------------------------------MAIN--------------------------------*/
int main() {

    t1.start(PrintLCD);
    
    pc.baud(9600);
    pc.attach(&Rx_interrupt, Serial::RxIrq);
    S_CMD.start(Serial_CMD);

        while(1) {
            Green_int = !Green_int;

            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);        
        
            Thread::wait (15000);
        }
}
/*--------------------------------------------------------------------*/

/*--------------------------------LCD---------------------------------*/
void PrintLCD () {
    
    int i = 0;
    while(1){
        char lightString[16];
        char tempString[16];
        char pressString[16];
        

        lcd.Clear();
        lcd.RowSelect(0);
         
        switch (i){
            case 0: 
                osEvent evt = mail_box.get();
        
                if (evt.status == osEventMail) {
                    mail_t *mail = (mail_t*)evt.value.p;
            
                    sprintf(lightString,"%.4f", mail->LDR_Value);
                    sprintf(tempString,"%2.2f", mail->temp_Value);
                    sprintf(pressString,"%4.2f", mail->press_Value);    
                
                    mail_box.free(mail);
                }
               
                lcd.Write("Light Level:");
                lcd.RowSelect(1);
                lcd.Write(lightString);
                i++;
                
            break;
            
            case 1:

                lcd.Write("Temperature:");
                lcd.RowSelect(1);
                lcd.Write(tempString);
                i++;

            break;
        
            case 2:

                lcd.Write("Pressure:");
                lcd.RowSelect(1);
                lcd.Write(pressString);
                i =0;
                
            break;
            
            default:
            
                i = 0;
                
            break;
        }
        
        Red_int = !Red_int;        

        Thread::wait (5000);
    }
}
/*--------------------------------------------------------------------*/

/*------------------------------SERIAL_CMD----------------------------*/
//Interrupt when recieving from serial port
void Rx_interrupt() {
    
    while (pc.readable()) {
        rx_line[rx_in] = pc.getc();
        pc.putc(rx_line[rx_in]);
        
        if(rx_line[rx_in] == 0xD){
            S_CMD.signal_set(ENTER_KEY);
        }
        else{
            rx_in = (rx_in + 1);
        }
    }
}

//Check what command what recieved and execute
void Serial_CMD(){
    
    while(1){
        Thread::signal_wait(ENTER_KEY);
        pc.attach(NULL, Serial::RxIrq);
        
        struct tm * s_time;
        char tm_n[4];
        
        if(strstr(rx_line, "READ ALL")){
            time ( &raw_time );
            s_time = localtime ( &raw_time );
            strftime(time_buffer, 80, "%d/%m/%Y, %X\n\r", s_time);
            pc.puts(time_buffer);
        }
        else if(strstr(rx_line, "DELETE ALL")){
            pc.printf("DELETE ALL\n\r");
        }
        else if(strstr(rx_line, "READ")){
            pc.printf("READ\n\r");
        }
        else if(strstr(rx_line, "DELETE")){
            pc.printf("DELETE\n\r");
        }
        else if(strstr(rx_line, "SETDATE")){
            time ( &raw_time );
            s_time = localtime ( &raw_time );
            
            int dd = atoi(strncpy(tm_n,&rx_line[8],2));
            s_time->tm_mday = dd;
            memset(tm_n, NULL, 4);
            
            int mm = atoi(strncpy(tm_n,&rx_line[11],2));
            s_time->tm_mon = mm-1;
            memset(tm_n, NULL, 4);
            
            int yyyy = atoi(strncpy(tm_n,&rx_line[14],4));
            s_time->tm_year = yyyy-1900;
            memset(tm_n, NULL, 4);
            
            set_time(mktime(s_time));
            strftime(time_buffer, 80, "%d/%m/%Y\n\r", s_time);
            pc.puts(time_buffer);
        }
        else if(strstr(rx_line, "SETTIME")){
            time ( &raw_time );
            s_time = localtime ( &raw_time );
            
            int ss = atoi(strncpy(tm_n,&rx_line[14],2));
            s_time->tm_sec = ss;
            memset(tm_n, NULL, 4);
            
            int mm = atoi(strncpy(tm_n,&rx_line[11],2));
            s_time->tm_min = mm;
            memset(tm_n, NULL, 4);
            
            int hh = atoi(strncpy(tm_n,&rx_line[8],2));
            s_time->tm_hour = hh;
            memset(tm_n, NULL, 4);
            
            set_time(mktime(s_time));
            strftime(time_buffer, 80, "%X\n\r", s_time);
            pc.puts(time_buffer);
        }
        else if(strstr(rx_line, "SETT")){
            pc.printf("SETT\n\r");
        }
        else if(strstr(rx_line, "STATE")){
            pc.printf("STATE\n\r");
        }
        else if(strstr(rx_line, "LOGGING")){
            pc.printf("LOGGING\n\r");
        }
        else{
            pc.printf("ERROR\n\r");    
        }
        
        memset(time_buffer, NULL, 80);
        memset(rx_line, NULL, 80);
        rx_in = 0;
    
        pc.attach(&Rx_interrupt, Serial::RxIrq);
    }
}
/*--------------------------------------------------------------------*/