![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
FINAL PROJECT isn't it
Fork of ELEC351 by
main.cpp
- Committer:
- chills
- Date:
- 2017-12-30
- Revision:
- 24:7d2da96e05ad
- Parent:
- 23:3c85d7f657a2
- Child:
- 25:36699ed589ab
File content as of revision 24:7d2da96e05ad:
/* ELEC 351 Group T Team Members : Christopher Hills, Thomas Morris Current Verision 3 Overiew: Working Tasks 1,5,7 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. Place the LCD write functions in their own function */ //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 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()//End of skype chat { 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){ //Thread::wait(1000); 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!) /*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 { 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; } } } } void Serial_Commands() { string Serial_Input; while(1) { cout << "Please type in a command" << endl; cin >> Serial_Input; if (Serial_Input == "Test") { cout << "Test Confirmed" << endl; } else if(Serial_Input == "READ-ALL") { 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 <n>") { } else if(Serial_Input == "SETDATE <dd> <mm> <yyyy>") { } else if(Serial_Input == "SETT <T>") { } 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 { 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; } } } void Serial_Comms()//Thread for Serial Communications { cout << "In Serial Comms" << endl; while(1) { Thread::signal_wait(1); osEvent evt_serial = mail_box.get(); //Get the latest entry from "mail_box" 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); } } void Sample_signal_set() //Sets the Signal for when to sample the sensors { t1.signal_set(SamplingTime); //Set the sampling thread signal high t2.signal_set(1); } 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 == 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; } 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(0x40); /*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); //Open to WRITE FILE* fp = fopen("/sd/test.csv","a"); if (fp == NULL) { error("Could not open file for write\n"); lcd.cls(); 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 */ //Run interrupt Sample_timer.attach(&Sample_signal_set,TimerInterval); 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){ } //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); } }