FINAL PROJECT isn't it

Fork of ELEC351 by Plymouth ELEC351 Group T

main.cpp

Committer:
thomasmorris
Date:
2018-01-03
Revision:
29:64b1f95a807c
Parent:
28:09b5c46c8afd
Child:
30:4cde05cc7c4f

File content as of revision 29:64b1f95a807c:

/*
ELEC 351 Group T
Team Members : Christopher Hills, Thomas Morris
Current Verision 12
Overiew: Working Tasks 1,2,4,5,6,7,8,10,11,12,13

Last Revision: Added Mail Box to serial
Todo:
make a mailbox within SD card, LCD, network so they can be used from within
Fix the network so it uses the mail box data.
*/

#include "SETUP.hpp"

void Network()//Interrupt service routine for handling the timeout
{
    osEvent evt_network = mail_box.get();                                        //Get the latest entry from "mail_box"

    if (evt_network.status == osEventMail) {
        DATA *Rec_Data_Network = (DATA*)evt_network.value.p;                    //Create pointer to mailbox
        DATA msg_network;                                                       //Create temporary instance of DATA class

        msg_network.set_time(Rec_Data_Network->get_time());                     //Copy time from mailbox to temporary instance
        msg_network.set_temperature(Rec_Data_Network->get_temperature());       //Copy temperature from mailbox to temporary instance
        msg_network.set_pressure(Rec_Data_Network->get_pressure());             //Copy pressure from mailbox to temporary instance
        msg_network.set_light(Rec_Data_Network->get_light());                   //Copy light from mailbox to temporary instance
        mail_box.free(Rec_Data_Network);                                        //Free space in the mailbox (delete earliest sample taken)

        networktest();
    }
}

void SW1TimeOutHandler()
{
    sw1TimeOut.detach();        //Stop the timeout counter firing
    SW1.fall(&SW1FallingEdge);  //Now wait for a falling edge
}
void SDWrite()
{
    osEvent evt_sd = mail_box.get();                                    //Get the latest entry from "mail_box"

    if (evt_sd.status == osEventMail) {
        DATA *Rec_Data_SD = (DATA*)evt_sd.value.p;                      //Create pointer to mailbox
        DATA msg_sd;                                                    //Create temporary instance of DATA class

        msg_sd.set_time(Rec_Data_SD->get_time());                       //Copy time from mailbox to temporary instance
        msg_sd.set_temperature(Rec_Data_SD->get_temperature());         //Copy temperature from mailbox to temporary instance
        msg_sd.set_pressure(Rec_Data_SD->get_pressure());               //Copy pressure from mailbox to temporary instance
        msg_sd.set_light(Rec_Data_SD->get_light());                     //Copy light from mailbox to temporary instance
        mail_box.free(Rec_Data_SD);                                     //Free space in the mailbox (delete earliest sample taken)
    }
}
//Interrupt service routive for SW1 falling edge (release)
void SW1FallingEdge()
{
    SW1.fall(NULL);                             //Disable this interrupt
    Yellow_led.Toggle();                        //Toggle LED

    mode = mode +1;//Cycles through modes
    if(mode >1) {
        mode = 0;
    }

    sw1TimeOut.attach(&SW1TimeOutHandler, 0.2); //Start timeout counter
}
void ModeSelection()
{
    while(1) 
    {
        osEvent evt_lcd = mail_box.get();                        //Get the latest entry from "mail_box"

        if (evt_lcd.status == osEventMail) {
            DATA *Rec_Data_LCD = (DATA*)evt_lcd.value.p;                    //Create pointer to mailbox
            DATA msg_lcd;                                                   //Create temporary instance of DATA class

            msg_lcd.set_time(Rec_Data_LCD->get_time());                     //Copy time from mailbox to temporary instance
            msg_lcd.set_temperature(Rec_Data_LCD->get_temperature());       //Copy temperature from mailbox to temporary instance
            msg_lcd.set_pressure(Rec_Data_LCD->get_pressure());             //Copy pressure from mailbox to temporary instance
            msg_lcd.set_light(Rec_Data_LCD->get_light());                   //Copy light from mailbox to temporary instance
            mail_box.free(Rec_Data_LCD);                                    //Free space in the mailbox (delete earliest sample taken)

            if(mode == 0) { //Print values to the LCD
                //Write new data to LCD (not fast!)

                sprintf (LCD_buffer, "%1.1f %1.1f %1.1f",msg_lcd.get_temperature(),msg_lcd.get_pressure(),msg_lcd.get_light());//Used for converting to a sting
                
                LCD.DDRAM_Address(0x00);
                LCD.Write_String("Temp Pres  li");
                LCD.DDRAM_Address(0x40);
                LCD.Write_String(LCD_buffer);

            } 
            else if(mode == 1)  //Print the Time to the LCD
            {    
                time_t msel_time = msg_lcd.get_time();                                  //Declare local variable for time
                strftime(scom_time_buffer, 32, "%I:%M %p", localtime(&msel_time));     //Format time as a string
                LCD.Display_Clear();
                LCD_sprintf = sprintf (LCD_buffer, "%s",scom_time_buffer);
                LCD.DDRAM_Address(0x00);
                LCD.Write_String("Current Time:");
                LCD.DDRAM_Address(0x40);
                LCD.Write_String(LCD_buffer);

            }else{mode = 0;}//Set a default mode
        }
    }
}
void Serial_Commands()//Used for getting input from the user to determine the opperations to perform
{
    string Serial_Input;
    while(1) {
        Serial_Input = "Blank";
        cout << "Please type in a command" << endl;

        cin >> Serial_Input;

        if (Serial_Input == "Test")
        {
            cout << "Test Confirmed" << endl;
        } 
        else if(Serial_Input == "READALL")
        {
            cout << "Read All Confirmed " << Sample_Rate << endl;
            Console_Output_Timer.attach(&Console_Output_ISR,Sample_Rate);
        } 
        else if(Serial_Input == "DELETEALL")
        {   
        Sampling_Timer.detach();
        Console_Output_Timer.detach();
        for (int x = 0; x < mailsize; x++)
        {
            DATA *Delete_Data = mail_box.alloc();       //Allocate a block from the memory pool, Type Data
            mail_box.free(Delete_Data);                 //Puts "Send_Data" into the mailbox
        }
        Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);
        cout << "Sampling Restarted" << endl;
        } 
        else if(Serial_Input == "READ") 
        {
            cout << "Please enter in the number of samples to read" <<endl;
            int Loops;  cin >> Loops;
            for (int x = 0; x < Loops; x++)
            {
                Serial_Comms_Stealth_Mode();
            }
        } 
        else if(Serial_Input == "DELETE")
        {
            Sampling_Timer.detach();
            Console_Output_Timer.detach();
            cout << "Number of samples to delete:" << endl;
            int Loops;  cin >> Loops;
            for (int x = 0; x < Loops; x++){
                DATA *Delete_Data = mail_box.alloc();       //Allocate a block from the memory pool, Type Data
                mail_box.free(Delete_Data);                 //Puts "Send_Data" into the mailbox
            }
            Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);
            cout << "Sampling Restarted" << endl;
        } 
        else if(Serial_Input == "SETDATE")
        {
                set_time(SETDATE());
        } 
        else if(Serial_Input == "SETT")
        {
            float Temp_Sample_Rate = SETT();
            
            if(Temp_Sample_Rate >= 1){Sample_Rate = Temp_Sample_Rate;}
             
            Sampling_Timer.detach();
            Console_Output_Timer.detach();
            Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);
        } 
        else if(Serial_Input == "STATE")
        {   
            Sampling_Timer.detach(); Console_Output_Timer.detach();
            cout << "Turn Sampling On or Off:" << endl;
            string State;   cin >> State;
            
            if(State == "On"){Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);}
            if(State == "Off"){Sampling_Timer.detach();}
        } 
        else if(Serial_Input == "LOGGING.<x>")
        {

        } 
        else if(Serial_Input == "HELP")// Use this to display all of the availble commands
        { 
            HELP();
        }
        else if(Serial_Input == "STOP")
        {
            Console_Output_Timer.detach(); //Stops Sampling   
        }
        else 
        {
            cout << "Please enter an acceptable command" << endl;
        }
    }
}
void Serial_Comms_Stealth_Mode()//Change this name
{
    osEvent evt_serial = mail_box.get();                                    //Get the latest entry from "mail_box"

    DATA *Rec_Data_Serial = (DATA*)evt_serial.value.p;                      //Create pointer to mailbox
    DATA msg_serial;                                                        //Create temporary instance of DATA class
    
    msg_serial.set_time(Rec_Data_Serial->get_time());                       //Copy time from mailbox to temporary instance
    msg_serial.set_temperature(Rec_Data_Serial->get_temperature());         //Copy teperature from mailbox to temporary instance
    msg_serial.set_pressure(Rec_Data_Serial->get_pressure());               //Copy pressure from mailbox to temporary instance
    msg_serial.set_light(Rec_Data_Serial->get_light());                     //Copy light from mailbox to temporary instance
    mail_box.free(Rec_Data_Serial);                                         //Free space in the mailbox (delete earliest sample taken)
    time_t scom_time = msg_serial.get_time();                               //Declare local variable for time
    strftime(scom_time_buffer, 32, "%I:%M %p\t", localtime(&scom_time));    //Format time as a string
    pc.printf("Time = %s", scom_time_buffer);                               //Print the string formatted time
    pc.printf("Temperature = %f\t", msg_serial.get_temperature());          //Print Temperature
    pc.printf("Pressure = %f\t", msg_serial.get_pressure());                //Print Pressure
    pc.printf("Light = %f\n\r", msg_serial.get_light());                     //Print Light
    
    Green_led.Toggle();
}
void Serial_Comms()//Thread for Serial Communications
{
    while(1) {
        Thread::signal_wait(SerialCommsTime);//Stupid 0 Bug
        Serial_Comms_Stealth_Mode();
    }
}

void Console_Output_ISR()   {t2.signal_set(SerialCommsTime);}
void Sampling_ISR()         {t1.signal_set(SamplingTime);}


void Sample()//Samples the hardware and prints the result to the LCD
{
    while(1) {
        Thread::signal_wait(SamplingTime);      //Set the time between samples

        temp = sensor.getTemperature();         //Read Temperature
        pressure = sensor.getPressure();        //Read Pressure
        lux = adcIn.read();                     //Read Light
        time_t buffer_time = time(NULL);        //Read Time

        DATA *Send_Data = mail_box.alloc();     //Allocate a block from the memory pool, Type Data

        if (Send_Data ==  NULL) {               //If Data is empty
            //pc.printf("Out of memory\n\r");   //Print out of memory warning
            return;
        }
        Send_Data->set_time(buffer_time);       //Pass in Time
        Send_Data->set_temperature(temp);       //Pass in Temp
        Send_Data->set_pressure(pressure);      //Pass in Pres
        Send_Data->set_light(lux);              //Pass in Light

        osStatus stat = mail_box.put(Send_Data);    //Puts "Send_Data" into the mailbox
        
        //if(stat == osErrorNoMemory)
       // {
        //    mail_box.free(Send_Data);
       // }

        if (stat == osErrorResource) {  //If mailbox overfills
            mail_box.free(Send_Data);   //Free the mail box
        }
        Red_led.Toggle();
        t1.signal_set(NotSamplingTime);
    }
}
int main()
{
    //Greeting
    pc.printf("Test Start");
    pc.printf("\n\r");

    set_time(1512940530);               //Set RTC time to December 10 2017
    pc.baud(9600);                      //Sets the Serial Comms Baud Rate

    LCD.Initialise();
    LCD.DDRAM_Address(0x00);
 
    post();     //Power on Self Test

    //Initialise the SD card (this needs to move)
    if ( sd.init() != 0) {
        printf("Init failed \n");
        LCD.Display_Clear();
        LCD.Write_String("CANNOT INIT SD");        //Change me
        errorCode(FATAL);
    }
    //Create a filing system for SD Card
    FATFileSystem fs("sd", &sd);

    //Open to WRITE
    FILE* fp = fopen("/sd/test.csv","a");
    if (fp == NULL) {
        error("Could not open file for write\n");
        LCD.Display_Clear();
        LCD.Write_String("CANNOT OPEN FILE\n\n");//Change me
        errorCode(FATAL);
    }
    //Last message before sampling begins
    LCD.Display_Clear();
    LCD.Write_String("READY\n\n");


    Sample_Rate = TimerInterval;
    //Run interrupt
    SW1.fall(&SW1FallingEdge);
    Sampling_Timer.attach(&Sampling_ISR,Sample_Rate);

    t1.start(Sample);
    t2.start(Serial_Comms);
    t3.start(ModeSelection);
    //t4.start(Network);
    t5.start(Serial_Commands);

    //Main thread ID

    idMain = osThreadGetId();   //CMSIS RTOS call

    //Thread ID
    id1 = t1.gettid();
    id2 = t2.gettid();
    id3 = t3.gettid();
    id4 = t4.gettid();
    id5 = t5.gettid();

    while (onBoardSwitch == 0) {

    }

    //Close File
    /*
    fclose(fp);

    //Close down
    sd.deinit();
    printf("Unmounted...\n");
    lcd.cls();
    lcd.printf("Unmounted...\n\n");
    */

    while(true) {
        greenLED = 1;
        wait(0.5);
        greenLED = 0;
        wait(0.1);
    }
}