Repo. for the ELEC351 Coursework - Oliver Thompson
Dependencies: BMP280 ELEC350-Practicals-FZ429- TextLCD watchdog_RTOS BME280 ntp-client
Revision 20:2ce28a5032d5, committed 2019-01-02
- Comitter:
- O_Thom
- Date:
- Wed Jan 02 12:12:30 2019 +0000
- Parent:
- 19:c3b396b65f2a
- Commit message:
- Serial Messaging Complete - SD Class need to handle commands. LCD and Networking Time and Date Update Needs Testing.
Changed in this revision
diff -r c3b396b65f2a -r 2ce28a5032d5 LCD.hpp --- a/LCD.hpp Thu Dec 13 16:09:54 2018 +0000 +++ b/LCD.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -7,7 +7,7 @@ #include <stdio.h> #include <string.h> - +Mail<time_and_date,5> Serial2LCD; // Serial -> LCD Mailbox 5 Elements Wide Time&Date class LCD_Data { @@ -49,7 +49,26 @@ EventQueue LCD_Queue; //create an event queue for main time_t timestamp; //current time in format of unix time, can be converted to DAY_OF_WEEK MONTH DAY HOUR:MINUTE:SECOND YEAR using ctime(×tamp); - + + void getSerial2LCD() // Queue Consumer + { + if (!Serial2LCD.empty()) + { + osEvent evt = Serial2LCD.get(); + switch (evt.status) + { + case osEventMail: + //Normal status + time_and_date *time_copy = (time_and_date*)evt.value.p; + time = time_copy->current_time; // Update the internal clock + Serial2Net.free(time_copy); // Free up the space in the memory Pool + default: + //All other errors (see cmsis_os.h for meaning of error code) + //printf("Serial2Net->get() returned %02x status\n\r", evt.status); + } + } + } + LCD_Data(){ //constructor, initializes the FLIP variable for use in toggling the bottom line of the LCD flip = 1; @@ -117,9 +136,9 @@ //printf("current day is: %s\n", day); - // printf("current year is: %s\n", year); - // printf("current time is: %s\n", time); - // printf("current date is: %s\n", date); + // printf("current year is: %s\n", year); + // printf("current time is: %s\n", time); + // printf("current date is: %s\n", date); // printf("current month is: %s\n", month); @@ -127,12 +146,12 @@ m_oNet.Network_Queue.call(&m_oNet, &Network::update_Time, current_time); time_and_date Timemsg; // Define instance of message structure - Timemsg.day = day; - Timemsg.month = month; - Timemsg.date = date; - Timemsg.time = time; - Timemsg.year = year; - Timemsg.current_time = current_time; + Timemsg.day = day; + Timemsg.month = month; + Timemsg.date = date; + Timemsg.time = time; + Timemsg.year = year; + Timemsg.current_time = current_time; flip = 3; //will tell the user that the time has been updated on next FLIP instance with the LCD @@ -143,8 +162,8 @@ }; //end of LCD class - - // Define the member object for the LCD LCD_Data m_oDisplay; -#endif \ No newline at end of file +#endif + + \ No newline at end of file
diff -r c3b396b65f2a -r 2ce28a5032d5 Network.hpp --- a/Network.hpp Thu Dec 13 16:09:54 2018 +0000 +++ b/Network.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -3,32 +3,17 @@ #define _NETWORK_ #include "mbed.h" - #include "FATFileSystem.h" - #include "sample_hardware.hpp" - #include "EthernetInterface.h" - #include "TCPServer.h" - //#include "messageStruct.hpp" - //#include "LCD.hpp" - #include "TCPSocket.h" - #include <iostream> - #include <string> - #include "ntp-client/NTPClient.h" - - - - - #define HTTP_STATUS_LINE "HTTP/1.0 200 OK" #define HTTP_HEADER_FIELDS "Content-Type: text/html; charset=utf-8" #define HTTP_MESSAGE_BODY1 "" \ @@ -72,39 +57,36 @@ #define IP "10.0.0.10" - #define NETMASK "255.0.0.0" - #define GATEWAY "10.0.0.2" +EthernetInterface eth; +NTPClient ntp(ð); -EthernetInterface eth; -NTPClient ntp(ð); +Mail<time_and_date,5> Serial2Net; // Serial -> Net Mailbox 5 Elements Wide Time&Date + class Network { //friend class LCD_Data; private: - float temp; //current temperature of sensor - float pressure; //current pressure of sensor - float fLDR; //current light level from LDR + double temp; //current temperature of sensor + double pressure; //current pressure of sensor + double fLDR; //current light level from LDR string time; - - void update_temp(double t) //use this function to update the current temperature value - { - temp = 5; - } - - void update_pressure(double p) //use this function to update the current pressure value - { - pressure = 4; - } - - void update_LDR(double L) - { - fLDR = 3; - } - + + void update_temp(double t) //use this function to update the current temperature value + { + temp = t; + } + void update_pressure(double p) //use this function to update the current pressure value + { + pressure = p; + } + void update_LDR(double L) + { + fLDR = L; + } public: EventQueue Network_Queue; @@ -116,16 +98,34 @@ //Configure an ethernet connection eth.set_network(IP, NETMASK, GATEWAY); eth.connect(); - + } ~Network(){ //deconstructor - } - void update_sensor_info(sample_message msg) //updates all current sensor information, this is called by a ticker every 5 seconds to read from the mailbox + void getSerial2Net() // Queue Consumer + { + if (!Serial2Net.empty()) + { + osEvent evt = Serial2Net.get(); + switch (evt.status) + { + case osEventMail: + //Normal status + time_and_date *time_copy = (time_and_date*)evt.value.p; + time = time_copy->current_time; // Update the internal clock + Serial2Net.free(time_copy); // Free up the space in the memory Pool + default: + //All other errors (see cmsis_os.h for meaning of error code) + //printf("Serial2Net->get() returned %02x status\n\r", evt.status); + } + } + } + + void update_sensor_info(sample_message msg) //updates all current sensor information, this is called by a ticker every 5 seconds to read from the mailbox { update_temp(msg.temp); // Include message class passing of data update_pressure(msg.pressure); @@ -140,8 +140,6 @@ void NetPush(){ - - //Now setup a web server TCPServer srv; //TCP/IP Server @@ -166,7 +164,7 @@ srv.accept(&clt_sock, &clt_addr); - printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port()); + //printf("accept %s:%d\n", clt_addr.get_ip_address(), clt_addr.get_port()); @@ -218,20 +216,10 @@ response += time; response += HTTP_MESSAGE_BODY5; - - - - - //Send static HTML response (as a C string) - clt_sock.send(response.c_str(), response.size()+6); - - - - - + clt_sock.send(response.c_str(), response.size()); } }; @@ -243,4 +231,4 @@ Network m_oNet; #endif - \ No newline at end of file +
diff -r c3b396b65f2a -r 2ce28a5032d5 SDCard.hpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDCard.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -0,0 +1,119 @@ +#ifndef _SDCARD_ +#define _SDCARD_ +#include "mbed.h" +#include "SDBlockDevice.h" +#include "FATFileSystem.h" +#include "sample_hardware.hpp" + + + +class SDcard + +{ + + private: + float temp; //current temperature of sensor + float pressure; //current pressure of sensor + float fLDR; //current light level from LDR + + void update_temp(double t) //use this function to update the current temperature value + { + temp = t; + } + + void update_pressure(double p) //use this function to update the current pressure value + { + pressure = p; + } + + void update_LDR(double L) + { + fLDR = L; + } + + + + public: + EventQueue SDcard_Queue; + + SDcard() + { //constructor, + + } + + + + ~SDcard(){ //Deconstructor, + + } + + + void getSerial2SD() // Queue Consumer + { + if (!Serial2SD.empty()) + { + osEvent evt = Serial2SD.get(); + switch (evt.status) + { + case osEventMail: + //Normal status + SD_message *mail = (SD_message*)evt.value.p; + // Pass onto a decoder/ handler + // i.e. InputHandler(message) // Will inspect the difference parameters in the structure and proceed accordingly + Serial2SD.free(mail); // Free up the space in the memory Pool + default: + //All other errors (see cmsis_os.h for meaning of error code) + //printf("Serial2Net->get() returned %02x status\n\r", evt.status); + } + } + } + + void update_sensor_info(sample_message msg) //updates all current sensor information, this is called by a ticker every 5 seconds to read from the mailbox + { + update_temp(msg.temp); // Include message class passing of data + update_pressure(msg.pressure); + update_LDR(msg.ldr); + } + + + + + void Save_Data() { + //Create a filing system for SD Card + + // initalising the SD card + if ( sd.init() != 0) { + printf("Init failed \n"); + //errorCode(FATAL); + } + + FATFileSystem fs("sd", &sd); + + FILE* fp = fopen("/sd/SensorData.csv","a"); + + if (fp == NULL) { + error("Could not open file for write\n"); + //errorCode(FATAL); + } + + //Storing sensor data in csv file + + fprintf(fp, " Temperature(C) , %4.2f , Pressure(mbar) , %4.2f , Lux , %4.2f \n", temp , pressure , fLDR ); + + //Close the file + fclose(fp); + + //Close down SD card + sd.deinit(); + + //errorCode(OK); + + + } +}; +// creating the instance SD of the class SDcard + + +SDcard m_oSD; + +#endif \ No newline at end of file
diff -r c3b396b65f2a -r 2ce28a5032d5 Sampler.hpp --- a/Sampler.hpp Thu Dec 13 16:09:54 2018 +0000 +++ b/Sampler.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -1,48 +1,59 @@ #ifndef _SAMPLER_ #define _SAMPLER_ + #include "mbed.h" #include "LCD.hpp" #include "SerialComms.hpp" +#include "SDcard.hpp" #include "sample_hardware.hpp" #include <vector> - - #define Activate_Flag 1 -LCD_Data m_oDisplay; -Serialcomms m_oSerial(m_oDisplay); +Serialcomms m_oSerial; class Sampler { private: - + int SampleEN; + sample_message message; + public: EventQueue SAMP_Queue; //Initialise the EventQueue - sample_message message; - int SampleEN = 1; + Sampler() //Constructor { SampleEN = 0; } ~Sampler() //Destructor - should the instance go out of scope, this is called { + } - - void publishSample() - { - if (SampleEN) + + void getSerial2Sampler() // Queue Consumer { - sample_message message = getData(); - m_oDisplay.LCD_Queue.call(&m_oDisplay, &LCD_Data::update_sensor_info, message); - m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::setsampledata, message); - //SD_Queue.call(this, &SD_Queue::update_sensor_info, sample_data, sample_data); + if (!Serial2Sampler.empty()) + { + osEvent evt = Serial2Sampler.get(); //With timeout + switch (evt.status) + { + case osEventMessage: + //Normal status + if ((evt.value.v == 0) || (evt.value.v == 1)) // Update the enable pin if the value co-responds to allowed cases + { + SampleEN = evt.value.v; + } + greenLED = !greenLED; + case osEventTimeout: + //Timeout + //printf("Serial2Sampler->get() returned %02x status (timeout)\n\r", evt.status); + default: + //All other errors (see cmsis_os.h for meaning of error code) + //printf("Serial2Sampler->get() returned %02x status\n\r", evt.status); + } + } } - } - - void updateSampleEN(int EN) - { - SampleEN = EN; - } + + void getData() { float temp = sensor.getTemperature(); @@ -55,12 +66,27 @@ msg.temp = temp; msg.pressure = pressure; msg.ldr = LDR; - redLED != redLED; message = msg; // Write to the private 'global' variable + } + + void publishSample() + { + if (SampleEN == 1) + { + getData(); + m_oDisplay.LCD_Queue.call(&m_oDisplay, &LCD_Data::update_sensor_info, message); + m_oNet.Network_Queue.call(&m_oNet, &Network::update_sensor_info, message); + m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::setsampledata, message); + //m_oSD.SDcard_Queue.call(&m_oSD, &SDcard::update_sensor_info, message); } - + } + + void updateTimeData(); +}; + +#endif -}; -#endif \ No newline at end of file +Sampler m_oSample; +
diff -r c3b396b65f2a -r 2ce28a5032d5 SerialComms.hpp --- a/SerialComms.hpp Thu Dec 13 16:09:54 2018 +0000 +++ b/SerialComms.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -1,6 +1,6 @@ #include "mbed.h" #include "mbed_events.h" -#include<string> +#include <string> #include <iostream> #include <vector> @@ -9,7 +9,6 @@ #define ERROR_SD_EXIT 3 #define ERROR_NET_EXIT 4 #define ERROR_SAMPLER_EXIT 5 - #define cmdRow 36 #define cmdCol 37 @@ -18,41 +17,61 @@ const int buffer_size = 30; char rx_buffer[buffer_size+1]; -struct Timestamp -{ - int Day; - int Month; - int Year; - int Second; - int Minute; - int Hour; -}; - -class Sampler; // Forward Declaration - -Sampler SampleRef; // Reference initialisation +Queue<uint32_t,5> Serial2Sampler; // Serial -> Sampler Message Queue. 5 Elements Wide +Mail<SD_message, 5> Serial2SD; // Serial -> SD Mailbox Time&Date + Sample Management class Serialcomms -{ - +{ private: float fTemp; //current temperature of sensor float fPressure; //current pressure of sensor float fLDR; //current light level from LDR + bool Logging; + bool SampleEN; vector<int> ErrorCodes; int rx_in; - //char rx_buffer[buffer_size + 1]; int cmdCount; int rxInputFlag; char RxIn[buffer_size+1]; char clearingArray[buffer_size+1]; - char timestampArray[buffer_size+1]; - Sampler& SampleRef; + char timestampArray[15+1]; public: EventQueue SERIAL_Queue; //Initialise the EventQueue + + void addtoSerial2Sampler(uint32_t Data) // Producer for the Queue + { + osStatus Stat = Serial2Sampler.put((uint32_t*)Data); // Put the data into the message queue + if (Stat == osErrorResource) // Try catch & Error Handling + { + printf("Serial2Sampler->put() Error code: %4Xh, Resource not available\r\n", Stat); + } + } + + void addtoSerial2Net() // Producer for the Mailbox + { + time_and_date *mail = Serial2Net.alloc(); // Allocatte space in the memory pool + mail -> current_time = timestampArray; + osStatus Stat = Serial2Net.put(mail); // Pointer to teh data package + if (Stat == osErrorResource) // Try catch & Error Handling + { + printf("Serial2Net->put() Error code: %4Xh, Resource not available\r\n", Stat); + } + } + + void addtoSerial2LCD() // Producer for the Mailbox + { + time_and_date *mail = Serial2Net.alloc(); + mail -> current_time = timestampArray; + osStatus Stat = Serial2LCD.put(mail); // Put the data into the message queue + if (Stat == osErrorResource) // Try catch & Error Handling + { + printf("Serial2LCD->put() Error code: %4Xh, Resource not available\r\n", Stat); + } + } + void displayFrame() - { + { printf("\033[2J"); // Clear screen printf("\033[0;0H"); // Home Positon Reset printf("*********************************************************************************\n" @@ -65,7 +84,7 @@ "* Pressure: * *\n" // Col 7 Row 12 "* Light Level: * *\n" // Col 8 Row15 "********************************* *\n" - "* Error Codes * *\n" //Col 10 + "* Error Codes * *\n" // Col 10 "********************************* *\n" // Col 11 Row 2 "* * *\n" "* * *\n" @@ -96,29 +115,32 @@ "*********************************************************************************\n\n" ); printf("\033[%d;%dfcmd: ", cmdRow, cmdCol); - } - //Serialcomms(Sampler& m_oSampler) : m_oSampleRef(m_oSampler) // Take the reference to the sampler object and state in m_oSamplerRef Serialcomms() // Take the reference of the sampler object and state in m_oSamplerRef { - //m_oSampleRef = m_oSampler; - //SampleQueueRef = m_oQueue; pc.baud(9600); rx_in = 0; cmdCount = 0; fTemp = 0; fPressure = 0; fLDR = 0; + Logging = 0; + SampleEN = 0; for (int i = 0; i < buffer_size+1; i++) { clearingArray[i] = ' '; - timestampArray[i] = 0; rx_buffer[i] = 0; + if (i < 16) + { + timestampArray[i] = ' '; + } + } + timestampArray[8] = ':'; displayFrame(); SERIAL_Queue.call_every(1000, callback(this, &Serialcomms::updateTerminal)); - SERIAL_Queue.call_every(50, callback(this, &Serialcomms::ReadData)); // Start the periodic event to check the buffer + SERIAL_Queue.call_every(50, callback(this, &Serialcomms::ReadData)); // Start the periodic event to check the serial buffer } ~Serialcomms() @@ -128,9 +150,9 @@ void setsampledata(sample_message msg) // Update internal values { - fTemp = msg.temp; - fPressure = msg.pressure; - fLDR = msg.ldr; + fTemp = msg.temp; + fPressure = msg.pressure; + fLDR = msg.ldr; } sample_message getsampledata() // Retrieves the data @@ -174,7 +196,6 @@ cmdCount++; } - int searchInput(char stream[], char command[]) { int match = 0; @@ -199,8 +220,9 @@ { if (int readall = searchInput(RxIn, "READ ALL") > 0) { - printstringtoTerminal("READING ALL"); + printstringtoTerminal("READING ALL"); } + else if(int readall = searchInput(RxIn, "DELETE ALL") > 0) { printf("\033[%d;%df%s", (cmdRow-(cmdCount+1)),(cmdCol+5), "DELETING ALL"); // Confirmation of Command @@ -226,42 +248,86 @@ } else if(int setdate = searchInput(RxIn, "SETDATE") > 0) //<dd> <mm> <yyyy> { - setdate = searchInput(RxIn, "SETDATE"); + setdate = searchInput(RxIn, "SETDATE"); // Returns the index of the last character char count[buffer_size] = {0}; for (int i = setdate; i < strlen(RxIn); i++) { + if (RxIn[i+1] != ' ') + { count[i-setdate] = RxIn[i+1]; - timestampArray[i-setdate] = RxIn[i+1]; + timestampArray[i-setdate] = RxIn[i+1]; + } } + addtoSerial2LCD(); // Update the DATE on the LCD + addtoSerial2Net(); // Update the DATE on the Webpage } else if(int settime = searchInput(RxIn, "SETTIME") > 0) //<hh> <mm> <ss> { settime = searchInput(RxIn, "SETTIME"); char count[buffer_size] = {0}; for (int i = settime; i < strlen(RxIn); i++) - { + { + if (RxIn[i+1] != ' ') + { count[i-settime] = RxIn[i+1]; - timestampArray[i-settime+6] = RxIn[i+1]; - } + timestampArray[i-settime+9] = RxIn[i+1]; + } + } + addtoSerial2LCD(); // Update the TIME on the LCD + addtoSerial2Net(); // Update the TIME on the Webpage } - else if(int sett = searchInput(RxIn, "SETT") > 0) + else if(int sett = searchInput(RxIn, "STATE") > 0) { - SampleRef.SAMP_Queue.call(&m_oSampleRef, &Sampler::updateSampleEN, 1) // Call the update function for the enable pin within the sampler class - //SampleQueueRef.call(&m_oSampleRef, &m_oSampleRef::updateSampleEN, 1) // Call the update function for the enable pin within the sampler class - } - else if(int state = searchInput(RxIn, "STATE") > 0) + SampleEN = !SampleEN; + if (SampleEN) + { + printstringtoTerminal("SAMPLING"); + } + else + { + printstringtoTerminal("SAMPLING DISABLED"); + } + addtoSerial2Sampler(SampleEN); +// uint32_t bit = (uint32_t)(RxIn[5] - '0'); // Take the last character after the "SETT" string and push it onto the queue +// if ((bit == 1) || (bit == 0)) +// { +// addtoSerial2Sampler(bit); +// } +// else +// { +// printf("Invalid STATE Entry"); +// } + } + else if(int state = searchInput(RxIn, "SETT") > 0) // PENDING WORK -> Set the time period of sampling { - } + uint32_t bit = 0; // Re-init + bit += (uint32_t)(RxIn[4] - '0'); // Take the last character after the "SETT" string and push it onto the queue + // Modify the enable sampling bit + if (bit > 0) + { + addtoSerial2Sampler(bit); + } + } else if(int logging = searchInput(RxIn, "LOGGING") > 0) // Verbose logging { + Logging = !Logging; // Toggle the private Logging Bool Variable + if (Logging) + { + printstringtoTerminal("LOGGING"); + } + else + { + printstringtoTerminal("LOGGING DISABLED"); + } } - else if(int clearall = searchInput(RxIn, "CLEAR ALL") > 0) + else if(int clearall = searchInput(RxIn, "CLEARALL") > 0) // Reset the terminal { cmdCount = 0; for (int i = 0; i < 22; i++) { printstringtoTerminal(clearingArray); } + displayFrame(); cmdCount = 0; } else @@ -272,8 +338,9 @@ for (int i = 0; i < (buffer_size+1); i++) // Init { RxIn[i] = 0; + rx_buffer[i] = ' '; } - printf("\033[%d;%dfcmd: ", cmdRow, cmdCol); // Reset to cmd location + printf("\033[%d;%dfcmd: %s", cmdRow, cmdCol, rx_buffer); // Reset to cmd location } @@ -322,10 +389,7 @@ } } void updateTimeDate() - { - - } - - + { + } };
diff -r c3b396b65f2a -r 2ce28a5032d5 main.cpp --- a/main.cpp Thu Dec 13 16:09:54 2018 +0000 +++ b/main.cpp Wed Jan 02 12:12:30 2019 +0000 @@ -1,14 +1,8 @@ #include "mbed.h" #include "sample_hardware.hpp" #include "Sampler.hpp" -//#include <watchdog_RTOS.h> #define WatchDogTimeout 2000 #define SerialRxFlag 1 -void LCD_Thread(void); -void SAMP_Thread(void); -void SERIAL_Thread(void); -void SERIAL_IRQ(void); -void Network_Thread(void); Thread tLCD, tSAMP, tSERIAL, tSD, tNET; @@ -19,13 +13,73 @@ //Watchdog_RTOS SDWatch; //Watchdog_RTOS NetWatch; -Serial m_oSerial(m_oSampler); // Pass a reference to the Sampler object +void LCD_Thread() +{ + vector<int> ErrorCodes; + // LCDWatch.kick(WatchDogTimeout); + while(1) + { + // m_oDisplay.LCD_Queue.call_every(1500, LCDWatch.kick); + m_oDisplay.LCD_Queue.call_every(1000, &m_oDisplay, &LCD_Data::display_LCD); //Displays the current sensor information onto the LCD screen every x miliseconds + m_oDisplay.LCD_Queue.call_every(1000, &m_oDisplay, &LCD_Data::getSerial2LCD); //Displays the current sensor information onto the LCD screen every x miliseconds + m_oDisplay.LCD_Queue.dispatch(); // Enters WAITING state when blocking + ErrorCodes.push_back(ERROR_LCD_EXIT); // Update Error Vector + m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::updateErrors, ErrorCodes); // Pass error vector to the serial thread + } +} + +void SAMP_Thread() +{ + vector<int> ErrorCodes; + //SamplerWatch.kick(WatchDogTimeout); + while(1) + { + //m_oSample.SAMP_Queue.call_every(1500, SamplerWatch.kick); + m_oSample.SAMP_Queue.call_every(500, &m_oSample, &Sampler::publishSample); // Publish sample default (0.5 Second Tp) + m_oSample.SAMP_Queue.call_every(500, &m_oSample, &Sampler::getSerial2Sampler); // Start the periodic event to check the serial buffer + m_oSample.SAMP_Queue.dispatch(); // Enters WAITING state when blocking + ErrorCodes.push_back(ERROR_SAMPLER_EXIT); // Update Error Vector + m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::updateErrors, ErrorCodes); // Pass error vector to the serial thread + } +} + +void SERIAL_Thread() +{ + vector<int> ErrorCodes; + //SerialWatch.kick(WatchDogTimeout); + while(1) + { + //m_oSerial.SERIAL_Queue.call_every(1500, SerialWatch.kick); + m_oSerial.SERIAL_Queue.dispatch(); // Enters WAITING state when blocking + ErrorCodes.push_back(ERROR_SERIAL_EXIT); // Update Error Vector + } +} -// Define member object -// LCD Defined in Cpp due to use in Sampler.hpp +void Network_Thread() +{ + vector<int> ErrorCodes; + while(1) + { + + m_oNet.Network_Queue.call_every(5000, &m_oNet, &Network::NetPush); + m_oNet.Network_Queue.call_every(1000, &m_oNet, &Network::getSerial2Net); // Poll the mailbox for an update in time and date + m_oNet.Network_Queue.dispatch(); + ErrorCodes.push_back(ERROR_NET_EXIT); // Update Error Vector +// m_oNet.Network_Queue.call(&m_oNet, &Network::updateErrors, ErrorCodes); // Pass error vector to the serial thread + } +} +void SD_Thread() +{ + while(1) + { + m_oSD.SDcard_Queue.call_every(5000, &m_oSD, &SDcard::Save_Data); + m_oSD.SDcard_Queue.dispatch(); + } +} + int main() { tLCD.start(LCD_Thread); @@ -36,64 +90,3 @@ Thread::wait(osWaitForever); } -void LCD_Thread() -{ - vector<int> ErrorCodes; - // LCDWatch.kick(WatchDogTimeout); - while(1) - { - // m_oDisplay.LCD_Queue.call_every(1500, LCDWatch.kick); - m_oDisplay.LCD_Queue.call_every(1000, &m_oDisplay, &LCD_Data::display_LCD); //Displays the current sensor information onto the LCD screen every x miliseconds - m_oDisplay.LCD_Queue.dispatch(); // Enters WAITING state when blocking - ErrorCodes.push_back(ERROR_LCD_EXIT); // Update Error Vector - m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::updateErrors, ErrorCodes); // Pass error vector to the serial thread - } -} - -void SAMP_Thread() -{ - vector<int> ErrorCodes; - // SamplerWatch.kick(WatchDogTimeout); - - while(1) - { - // m_oSample.SAMP_Queue.call_every(1500, SamplerWatch.kick); - m_oSample.SAMP_Queue.call_every(500, &m_oSample, &Sampler::publishSample); // Publish sample - m_oSample.SAMP_Queue.dispatch(); // Enters WAITING state when blocking - ErrorCodes.push_back(ERROR_SAMPLER_EXIT); // Update Error Vector - m_oSerial.SERIAL_Queue.call(&m_oSerial, &Serialcomms::updateErrors, ErrorCodes); // Pass error vector to the serial thread - - } -} - -void SERIAL_Thread() -{ - vector<int> ErrorCodes; - // SerialWatch.kick(WatchDogTimeout); - while(1) - { - //m_oSerial.SERIAL_Queue.call_every(1500, SerialWatch.kick); - m_oSerial.SERIAL_Queue.dispatch(); // Enters WAITING state when blocking - ErrorCodes.push_back(ERROR_SERIAL_EXIT); // Update Error Vector - - } -} - - -void Network_Thread() -{ - while(1) - { - m_oNet.Network_Queue.call_every(10, &m_oNet, &Network::NetPush); - m_oNet.Network_Queue.dispatch(); - - while(true) - { // Flash if the event queue is exited. - greenLED = 1; - wait(0.5); - greenLED = 0; - wait(0.1); - - } - } -}
diff -r c3b396b65f2a -r 2ce28a5032d5 messageStruct.hpp --- a/messageStruct.hpp Thu Dec 13 16:09:54 2018 +0000 +++ b/messageStruct.hpp Wed Jan 02 12:12:30 2019 +0000 @@ -14,14 +14,24 @@ typedef struct { - string day; //current day, mon - sun - string month; //current month, jan - dec - string date; //current date, 1-31 - string time; //current time SS:MM:HH - string year; //current year 1970 - 2035? + string day; //current day, mon - sun + string month; //current month, jan - dec + string date; //current date, 1-31 + string time; //current time SS:MM:HH + string year; //current year 1970 - 2035? string current_time; //all of the above in one string, day month date time year } time_and_date; -extern time_and_date Timemsg; \ No newline at end of file + +typedef struct +{ + time_and_date timestamp; + bool ReadDelete; //Read/Write (1/0) + signed int numberSamples; // -1 for all else interger +} SD_message; + + + +extern time_and_date Timemsg;