Plymouth ELEC351 Group T
/
ELEC351_Group_T
FINAL PROJECT isn't it
Fork of ELEC351 by
Diff: main.cpp
- Revision:
- 25:36699ed589ab
- Parent:
- 24:7d2da96e05ad
- Child:
- 26:78f5e454e59f
--- a/main.cpp Sat Dec 30 21:31:20 2017 +0000 +++ b/main.cpp Mon Jan 01 20:14:19 2018 +0000 @@ -12,96 +12,27 @@ */ //Includes and Definitions -#include "sample_hardware.hpp" -#include "Networkbits.hpp" -#include "rtos.h" -#include "LED.hpp" -#include "DATA.hpp" -#include "LCD.hpp" -#define SamplingTime 1 -#define NotSamplingTime 0 -#define Print_Time_to_LCD 1 -#define Dont_Print_Time_to_LCD 0 -#define TimerInterval 2 //This is in seconds -#define EDGE_RISEN 1 -#define EDGE_FALLEN 0 -#define mailsize 5 -#include <iostream> -Serial pc(USBTX, USBRX); -//SW1+SW2 are declared as interrupt ins in sample hardware.cpp - -void Serial_Comms(); - -//Thread IDs -osThreadId idMain; -osThreadId id1; -osThreadId id2; -osThreadId id3; -osThreadId id4; -osThreadId id5; - - -Timeout sw1TimeOut;//Used to prevent switch bounce - -LED Red_led(PE_15); -LED Yellow_led(PB_10); -LED Green_led(PB_11); - -LCD LCD(D8,D9,D4,A0,A1,A2,A3,D7,D6,D3,D1); -char LCD_buffer [50]; -int LCD_sprintf; - -//Tickers - -Ticker Sample_timer; - -//Threads -Thread t1; -Thread t2; -Thread t3; -Thread t4; -Thread t5; - -double temp = 0; -double pressure = 0; -double lux = 0; -string buffer_time = 0; - -char buffer[32]; -char scom_time_buffer[32]; -char msel_time_buffer[32]; - -void SW1FallingEdge(); -void SW1TimeOutHandler(); - - - -using namespace std; - -int mode = 0; - -Mail<DATA, mailsize> mail_box; //Mail Queue, Type DATA, Capacity mailsize(defined above), name mail_box +#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) - { + + 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 + 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() +void SW1TimeOutHandler() { sw1TimeOut.detach(); //Stop the timeout counter firing SW1.fall(&SW1FallingEdge); //Now wait for a falling edge @@ -109,72 +40,66 @@ void SDWrite()//End of skype chat { osEvent evt_sd = mail_box.get(); //Get the latest entry from "mail_box" - - if (evt_sd.status == osEventMail) - { + + 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 - + Yellow_led.Toggle(); //Toggle LED + mode = mode +1;//Cycles through modes - if(mode >1) - { - mode = 0; + if(mode >1) { + mode = 0; } - - sw1TimeOut.attach(&SW1TimeOutHandler, 0.2); //Start timeout counter + + sw1TimeOut.attach(&SW1TimeOutHandler, 0.2); //Start timeout counter } void ModeSelection() { - while(1){ + while(1) { //Thread::wait(1000); - + osEvent evt_lcd = mail_box.get(); //Get the latest entry from "mail_box" - - if (evt_lcd.status == osEventMail) - { + + 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 - { + + if(mode == 0) { //Print values to the LCD //Write new data to LCD (not fast!) - + /*LCD_sprintf = */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.Display_Clear(); LCD.DDRAM_Address(0x00); LCD.Write_String("Temp Pres li"); LCD.DDRAM_Address(0x40); - + LCD.Write_String(LCD_buffer); //LCD.Write_String("Temp Pres li\n"); //LCD.Write_String("%1.1f ", msg_lcd.get_temperature());//Print Temperature to LCD //LCD.Write_String("%1.1f ", msg_lcd.get_pressure());//Print Pressure to LCD //LCD.Write_String("%1.1f\n", msg_lcd.get_light()); //Print Light to LCD - - } - else if(mode == 1)//Print the Time to the LCD - { + + } 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(); @@ -184,9 +109,7 @@ LCD.DDRAM_Address(0x40); LCD.Write_String(LCD_buffer); - } - else - { + } else { mode = 0; } } @@ -195,89 +118,96 @@ void Serial_Commands() { string Serial_Input; - while(1) - { + 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 == "READ-ALL") + } + else if(Serial_Input == "READALL") { cout << "Read All Confirmed" << endl; t2.start(Serial_Comms); - } - else if(Serial_Input == "DELETE ALL") - { - - } - else if(Serial_Input == "READ <n>") + } + else if(Serial_Input == "DELETE.ALL") + { + + } + else if(Serial_Input == "READ.<n>") { - - } - else if(Serial_Input == "DELETE <n>") + + } + else if(Serial_Input == "DELETE.<n>") { - - } - else if(Serial_Input == "SETDATE <dd> <mm> <yyyy>") - { - - } - else if(Serial_Input == "SETT <T>") + + } + else if(Serial_Input == "SETDATE") + { + set_time(SETDATE()); + } + else if(Serial_Input == "SETT") { - - } - else if(Serial_Input == "STATE <x>") - { - - } - else if(Serial_Input == "LOGGING <x>") + + if(SETT() >= 1) + { + Sample_Rate = SETT(); + } + else + { + Sample_Rate = TimerInterval; + } + Sample_timer.detach(); + Sample_timer.attach(&Sample_signal_set,Sample_Rate); + } + else if(Serial_Input == "STATE.<x>") { - + + } + 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 == "HELP")// Use this to display all of the availble commands + else { - cout << "Avalible Commands are: "<< endl; - cout << "READ ALL , DELETE ALL READ<n> ,DELETE<n> , SETDATE<dd> <mm> <yyyy> , SETTIME <hh> <mm> <ss>, SETT <T> , STATE <x>, LOGGING <x>, HELP"<< endl; - } - else - { - cout << "Please enter a acceptable command" << endl; + cout << "Please enter a acceptable command" << endl; } } } void Serial_Comms()//Thread for Serial Communications { cout << "In Serial Comms" << endl; - while(1) - { + while(1) { Thread::signal_wait(1); osEvent evt_serial = mail_box.get(); //Get the latest entry from "mail_box" - - if (evt_serial.status == osEventMail) - { + + if (evt_serial.status == osEventMail) { 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(); - //Thread::wait(1000); + //Thread::wait(1000); } } @@ -288,30 +218,29 @@ } void Sample()//Samples the hardware and prints the result to the LCD { - while(1) - { + 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 + + 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 == osErrorResource){ //If mailbox overfills + + if (stat == osErrorResource) { //If mailbox overfills //pc.printf("queue->put() Error code: %4Xh, Resource not available\r\n", stat); //Print error message mail_box.free(Send_Data); //Free the mail box return; @@ -319,35 +248,35 @@ Red_led.Toggle(); t1.signal_set(NotSamplingTime); } -} -int main() -{ - +} +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(0x40); - - - /*post(); //Power on Self Test - + + + post(); //Power on Self Test + //Initialise the SD card (this needs to move) if ( sd.init() != 0) { printf("Init failed \n"); lcd.cls(); lcd.printf("CANNOT INIT SD"); //Change me errorCode(FATAL); - } - + } + //Create a filing system for SD Card - FATFileSystem fs("sd", &sd); + FATFileSystem fs("sd", &sd); //Open to WRITE FILE* fp = fopen("/sd/test.csv","a"); @@ -357,61 +286,61 @@ lcd.printf("CANNOT OPEN FILE\n\n");//Change me errorCode(FATAL); } - + //Last message before sampling begins lcd.cls();//change me lcd.printf("READY\n\n");//change me - - */ - + + + Sample_Rate = TimerInterval; //Run interrupt - Sample_timer.attach(&Sample_signal_set,TimerInterval); + Sample_timer.attach(&Sample_signal_set,Sample_Rate); SW1.fall(&SW1FallingEdge); t1.start(Sample); 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(); - - + + //Toggle Green LED after a button has been pressed //Press either switch to unmount DigitalIn onBoardSwitch(USER_BUTTON); - - while (onBoardSwitch == 0){ - + + 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); + wait(0.1); } } - +