Repo. for the ELEC351 Coursework - Oliver Thompson

Dependencies:   BMP280 ELEC350-Practicals-FZ429- TextLCD watchdog_RTOS BME280 ntp-client

Committer:
O_Thom
Date:
Sat Dec 08 00:59:10 2018 +0000
Revision:
17:da78a552339d
Parent:
16:73af0e3ddcaa
Child:
18:a036c2e5ff89
Set time and date working. Bugs however include the date needing to be entered before the time.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
O_Thom 6:b7f6e0c0f646 1 #include "mbed.h"
O_Thom 14:dbb0741ce576 2 #include "mbed_events.h"
O_Thom 14:dbb0741ce576 3 #include <stdio.h>
O_Thom 14:dbb0741ce576 4
O_Thom 10:08c366434f2b 5 #include<string>
O_Thom 11:b8e8630c7e3b 6 #include <iostream>
O_Thom 9:654e14de9d74 7 #include <vector>
O_Thom 10:08c366434f2b 8
O_Thom 9:654e14de9d74 9 #define ERROR_LCD_EXIT 1
O_Thom 9:654e14de9d74 10 #define ERROR_SERIAL_EXIT 2
O_Thom 9:654e14de9d74 11 #define ERROR_SD_EXIT 3
O_Thom 9:654e14de9d74 12 #define ERROR_NET_EXIT 4
O_Thom 9:654e14de9d74 13 #define ERROR_SAMPLER_EXIT 5
O_Thom 9:654e14de9d74 14
O_Thom 16:73af0e3ddcaa 15 #define cmdRow 36
O_Thom 16:73af0e3ddcaa 16 #define cmdCol 37
O_Thom 13:37a7c57f4641 17 Serial pc(USBTX, USBRX); // USB Tx and Rx Connections
O_Thom 6:b7f6e0c0f646 18
O_Thom 17:da78a552339d 19 const int buffer_size = 30;
O_Thom 13:37a7c57f4641 20 char rx_buffer[buffer_size+1];
O_Thom 13:37a7c57f4641 21
O_Thom 16:73af0e3ddcaa 22 struct Timestamp
O_Thom 16:73af0e3ddcaa 23 {
O_Thom 16:73af0e3ddcaa 24 int Day;
O_Thom 16:73af0e3ddcaa 25 int Month;
O_Thom 16:73af0e3ddcaa 26 int Year;
O_Thom 16:73af0e3ddcaa 27 int Second;
O_Thom 16:73af0e3ddcaa 28 int Minute;
O_Thom 16:73af0e3ddcaa 29 int Hour;
O_Thom 16:73af0e3ddcaa 30 };
O_Thom 10:08c366434f2b 31
O_Thom 6:b7f6e0c0f646 32 class Serialcomms
O_Thom 1:f89c930c6491 33 {
O_Thom 1:f89c930c6491 34 private:
O_Thom 8:7d218affea71 35 float fTemp; //current temperature of sensor
O_Thom 8:7d218affea71 36 float fPressure; //current pressure of sensor
O_Thom 9:654e14de9d74 37 float fLDR; //current light level from LDR
O_Thom 9:654e14de9d74 38 vector<int> ErrorCodes;
O_Thom 15:f8748fd0c5b1 39 int rx_in;
O_Thom 16:73af0e3ddcaa 40 //char rx_buffer[buffer_size + 1];
O_Thom 15:f8748fd0c5b1 41 int cmdCount;
O_Thom 16:73af0e3ddcaa 42 int rxInputFlag;
O_Thom 16:73af0e3ddcaa 43 char RxIn[buffer_size+1];
O_Thom 16:73af0e3ddcaa 44 char clearingArray[buffer_size+1];
O_Thom 17:da78a552339d 45 char timestampArray[buffer_size+1];
O_Thom 11:b8e8630c7e3b 46 public:
O_Thom 9:654e14de9d74 47 EventQueue SERIAL_Queue; //Initialise the EventQueue
O_Thom 14:dbb0741ce576 48 void displayFrame()
O_Thom 14:dbb0741ce576 49 {
O_Thom 14:dbb0741ce576 50 printf("\033[2J"); // Clear screen
O_Thom 14:dbb0741ce576 51 printf("\033[0;0H"); // Home Positon Reset
O_Thom 16:73af0e3ddcaa 52 printf("*********************************************************************************\n"
O_Thom 16:73af0e3ddcaa 53 "* ELEC351 COURSEWORK ENVIRONMENTAL SYSTEM *\n"
O_Thom 16:73af0e3ddcaa 54 "*********************************************************************************\n"
O_Thom 16:73af0e3ddcaa 55 "* Sensor Readout * Terminal *\n"
O_Thom 16:73af0e3ddcaa 56 "*********************************************************************************\n"
O_Thom 16:73af0e3ddcaa 57 "* Timestamp: * *\n" // Col 5 Row 13
O_Thom 16:73af0e3ddcaa 58 "* Temperature: * *\n" // Col 6 Row 15
O_Thom 16:73af0e3ddcaa 59 "* Pressure: * *\n" // Col 7 Row 12
O_Thom 16:73af0e3ddcaa 60 "* Light Level: * *\n" // Col 8 Row15
O_Thom 16:73af0e3ddcaa 61 "********************************* *\n"
O_Thom 16:73af0e3ddcaa 62 "* Error Codes * *\n" //Col 10
O_Thom 16:73af0e3ddcaa 63 "********************************* *\n" // Col 11 Row 2
O_Thom 16:73af0e3ddcaa 64 "* * *\n"
O_Thom 16:73af0e3ddcaa 65 "* * *\n"
O_Thom 16:73af0e3ddcaa 66 "* * *\n"
O_Thom 16:73af0e3ddcaa 67 "* * *\n"
O_Thom 16:73af0e3ddcaa 68 "* * *\n"
O_Thom 16:73af0e3ddcaa 69 "* * *\n"
O_Thom 16:73af0e3ddcaa 70 "* * *\n"
O_Thom 16:73af0e3ddcaa 71 "* * *\n"
O_Thom 16:73af0e3ddcaa 72 "* * *\n"
O_Thom 16:73af0e3ddcaa 73 "* * *\n"
O_Thom 16:73af0e3ddcaa 74 "* * *\n"
O_Thom 16:73af0e3ddcaa 75 "********************************* *\n"
O_Thom 16:73af0e3ddcaa 76 "* Thread Health * *\n"
O_Thom 16:73af0e3ddcaa 77 "********************************* *\n"
O_Thom 16:73af0e3ddcaa 78 "* * *\n"
O_Thom 16:73af0e3ddcaa 79 "* * *\n"
O_Thom 16:73af0e3ddcaa 80 "* * *\n"
O_Thom 16:73af0e3ddcaa 81 "* * *\n"
O_Thom 16:73af0e3ddcaa 82 "* * *\n"
O_Thom 16:73af0e3ddcaa 83 "* * *\n"
O_Thom 16:73af0e3ddcaa 84 "* * *\n"
O_Thom 16:73af0e3ddcaa 85 "* * *\n"
O_Thom 16:73af0e3ddcaa 86 "* * *\n"
O_Thom 16:73af0e3ddcaa 87 "* * *\n"
O_Thom 16:73af0e3ddcaa 88 "* * *\n"
O_Thom 16:73af0e3ddcaa 89 "* * *\n" // cmd position r:36 c:37
O_Thom 16:73af0e3ddcaa 90 "*********************************************************************************\n\n"
O_Thom 14:dbb0741ce576 91 );
O_Thom 16:73af0e3ddcaa 92 printf("\033[%d;%dfcmd: ", cmdRow, cmdCol);
O_Thom 15:f8748fd0c5b1 93
O_Thom 14:dbb0741ce576 94 }
O_Thom 14:dbb0741ce576 95
O_Thom 10:08c366434f2b 96 Serialcomms()
O_Thom 10:08c366434f2b 97 {
O_Thom 10:08c366434f2b 98 pc.baud(9600);
O_Thom 15:f8748fd0c5b1 99 rx_in = 0;
O_Thom 15:f8748fd0c5b1 100 cmdCount = 0;
O_Thom 15:f8748fd0c5b1 101 fTemp = 0;
O_Thom 15:f8748fd0c5b1 102 fPressure = 0;
O_Thom 15:f8748fd0c5b1 103 fLDR = 0;
O_Thom 16:73af0e3ddcaa 104 for (int i = 0; i < buffer_size+1; i++)
O_Thom 16:73af0e3ddcaa 105 {
O_Thom 16:73af0e3ddcaa 106 clearingArray[i] = ' ';
O_Thom 17:da78a552339d 107 timestampArray[i] = 0;
O_Thom 17:da78a552339d 108 rx_buffer[i] = 0;
O_Thom 16:73af0e3ddcaa 109 }
O_Thom 14:dbb0741ce576 110 displayFrame();
O_Thom 16:73af0e3ddcaa 111 SERIAL_Queue.call_every(1000, callback(this, &Serialcomms::updateTerminal));
O_Thom 15:f8748fd0c5b1 112 SERIAL_Queue.call_every(50, callback(this, &Serialcomms::ReadData)); // Start the periodic event queue to check the buffer
O_Thom 10:08c366434f2b 113 }
O_Thom 13:37a7c57f4641 114
O_Thom 10:08c366434f2b 115 ~Serialcomms()
O_Thom 10:08c366434f2b 116 {
O_Thom 11:b8e8630c7e3b 117 printf("Closing Serial Comms.");
O_Thom 10:08c366434f2b 118 }
O_Thom 10:08c366434f2b 119
O_Thom 6:b7f6e0c0f646 120 void setsampledata(sample_message msg) // Update internal values
O_Thom 6:b7f6e0c0f646 121 {
O_Thom 6:b7f6e0c0f646 122 fTemp = msg.temp;
O_Thom 6:b7f6e0c0f646 123 fPressure = msg.pressure;
O_Thom 6:b7f6e0c0f646 124 fLDR = msg.ldr;
O_Thom 6:b7f6e0c0f646 125 }
O_Thom 6:b7f6e0c0f646 126
O_Thom 9:654e14de9d74 127 sample_message getsampledata() // Retrieves the data
O_Thom 6:b7f6e0c0f646 128 {
O_Thom 6:b7f6e0c0f646 129 sample_message msg;
O_Thom 6:b7f6e0c0f646 130 msg.temp = fTemp;
O_Thom 6:b7f6e0c0f646 131 msg.pressure = fPressure;
O_Thom 6:b7f6e0c0f646 132 msg.ldr = fLDR;
O_Thom 6:b7f6e0c0f646 133 return msg;
O_Thom 6:b7f6e0c0f646 134 }
O_Thom 16:73af0e3ddcaa 135
O_Thom 6:b7f6e0c0f646 136 void updateTerminal() // Print internal values of sensors
O_Thom 17:da78a552339d 137 {
O_Thom 17:da78a552339d 138 printf("\033[6;16f%s", timestampArray);
O_Thom 15:f8748fd0c5b1 139 printf("\033[7;16f%5.2f", fTemp);
O_Thom 15:f8748fd0c5b1 140 printf("\033[8;16f%5.2f", fPressure);
O_Thom 15:f8748fd0c5b1 141 printf("\033[9;16f%5.2f", fLDR);
O_Thom 9:654e14de9d74 142 if (ErrorCodes.size() == 0)
O_Thom 9:654e14de9d74 143 {
O_Thom 16:73af0e3ddcaa 144 printf("\033[13;3fNo Error Codes Raised\n");
O_Thom 9:654e14de9d74 145 }
O_Thom 9:654e14de9d74 146 else
O_Thom 9:654e14de9d74 147 {
O_Thom 9:654e14de9d74 148 for (int idx = 0; idx < ErrorCodes.size(); idx++)
O_Thom 9:654e14de9d74 149 {
O_Thom 16:73af0e3ddcaa 150 printf("\033[%d;3: %d\n",(11+idx),ErrorCodes[idx]);
O_Thom 9:654e14de9d74 151 }
O_Thom 9:654e14de9d74 152 }
O_Thom 15:f8748fd0c5b1 153 // Add code to receive feedback from watchdog and place into thread safe section
O_Thom 9:654e14de9d74 154 }
O_Thom 16:73af0e3ddcaa 155
O_Thom 16:73af0e3ddcaa 156
O_Thom 16:73af0e3ddcaa 157 void printstringtoTerminal(char Data[])
O_Thom 16:73af0e3ddcaa 158 {
O_Thom 16:73af0e3ddcaa 159 printf("\033[%d;%df%s", (cmdRow-(cmdCount+1)),(cmdCol+5), Data); // Confirmation of Command
O_Thom 16:73af0e3ddcaa 160 cmdCount++;
O_Thom 16:73af0e3ddcaa 161 }
O_Thom 16:73af0e3ddcaa 162 void printintegertoTerminal(int Data)
O_Thom 16:73af0e3ddcaa 163 {
O_Thom 16:73af0e3ddcaa 164 printf("\033[%d;%df%d", (cmdRow-(cmdCount+1)),(cmdCol+5), Data); // Confirmation of Command
O_Thom 16:73af0e3ddcaa 165 cmdCount++;
O_Thom 16:73af0e3ddcaa 166 }
O_Thom 16:73af0e3ddcaa 167
O_Thom 16:73af0e3ddcaa 168
O_Thom 16:73af0e3ddcaa 169 int searchInput(char stream[], char command[])
O_Thom 16:73af0e3ddcaa 170 {
O_Thom 16:73af0e3ddcaa 171 int match = 0;
O_Thom 17:da78a552339d 172 const int commandLength = strlen(command);
O_Thom 16:73af0e3ddcaa 173 for (int i = 0; i < commandLength; i++)
O_Thom 16:73af0e3ddcaa 174 {
O_Thom 16:73af0e3ddcaa 175 if (stream[i] == command[i])
O_Thom 16:73af0e3ddcaa 176 {
O_Thom 16:73af0e3ddcaa 177 match = i; // Return the position of the last command character
O_Thom 16:73af0e3ddcaa 178 }
O_Thom 16:73af0e3ddcaa 179 else
O_Thom 16:73af0e3ddcaa 180 {
O_Thom 17:da78a552339d 181 match = 0;
O_Thom 17:da78a552339d 182 i = commandLength-1;
O_Thom 16:73af0e3ddcaa 183 }
O_Thom 17:da78a552339d 184 }
O_Thom 16:73af0e3ddcaa 185 return match;
O_Thom 16:73af0e3ddcaa 186 }
O_Thom 16:73af0e3ddcaa 187
O_Thom 16:73af0e3ddcaa 188
O_Thom 9:654e14de9d74 189
O_Thom 13:37a7c57f4641 190 void handleInput()
O_Thom 16:73af0e3ddcaa 191 {
O_Thom 16:73af0e3ddcaa 192 if (int readall = searchInput(RxIn, "READ ALL") > 0)
O_Thom 16:73af0e3ddcaa 193 {
O_Thom 16:73af0e3ddcaa 194 printstringtoTerminal("READING ALL");
O_Thom 9:654e14de9d74 195 }
O_Thom 16:73af0e3ddcaa 196 else if(int readall = searchInput(RxIn, "DELETE ALL") > 0)
O_Thom 16:73af0e3ddcaa 197 {
O_Thom 16:73af0e3ddcaa 198 printf("\033[%d;%df%s", (cmdRow-(cmdCount+1)),(cmdCol+5), "DELETING ALL"); // Confirmation of Command
O_Thom 16:73af0e3ddcaa 199 cmdCount++;
O_Thom 16:73af0e3ddcaa 200 }
O_Thom 16:73af0e3ddcaa 201 else if(int read = searchInput(RxIn, "READ") > 0)
O_Thom 9:654e14de9d74 202 {
O_Thom 17:da78a552339d 203 read = searchInput(RxIn, "READ");
O_Thom 16:73af0e3ddcaa 204 char count[buffer_size] = {0};
O_Thom 16:73af0e3ddcaa 205 for (int i = read; i < strlen(RxIn); i++)
O_Thom 16:73af0e3ddcaa 206 {
O_Thom 17:da78a552339d 207 count[i-read] = RxIn[i+1];
O_Thom 16:73af0e3ddcaa 208 }
O_Thom 17:da78a552339d 209 }
O_Thom 16:73af0e3ddcaa 210 else if(int del = searchInput(RxIn, "DELETE") > 0)
O_Thom 9:654e14de9d74 211 {
O_Thom 17:da78a552339d 212 del = searchInput(RxIn, "DELETE");
O_Thom 17:da78a552339d 213 char count[buffer_size] = {0};
O_Thom 17:da78a552339d 214 for (int i = del; i < strlen(RxIn); i++)
O_Thom 17:da78a552339d 215 {
O_Thom 17:da78a552339d 216 count[i-del] = RxIn[i+1];
O_Thom 17:da78a552339d 217 }
O_Thom 9:654e14de9d74 218 }
O_Thom 16:73af0e3ddcaa 219 else if(int setdate = searchInput(RxIn, "SETDATE") > 0) //<dd> <mm> <yyyy>
O_Thom 17:da78a552339d 220 {
O_Thom 17:da78a552339d 221 setdate = searchInput(RxIn, "SETDATE");
O_Thom 17:da78a552339d 222 char count[buffer_size] = {0};
O_Thom 17:da78a552339d 223 for (int i = setdate; i < strlen(RxIn); i++)
O_Thom 17:da78a552339d 224 {
O_Thom 17:da78a552339d 225 count[i-setdate] = RxIn[i+1];
O_Thom 17:da78a552339d 226 timestampArray[i-setdate] = RxIn[i+1];
O_Thom 17:da78a552339d 227 }
O_Thom 9:654e14de9d74 228 }
O_Thom 16:73af0e3ddcaa 229 else if(int settime = searchInput(RxIn, "SETTIME") > 0) //<hh> <mm> <ss>
O_Thom 9:654e14de9d74 230 {
O_Thom 17:da78a552339d 231 settime = searchInput(RxIn, "SETTIME");
O_Thom 17:da78a552339d 232 char count[buffer_size] = {0};
O_Thom 17:da78a552339d 233 for (int i = settime; i < strlen(RxIn); i++)
O_Thom 17:da78a552339d 234 {
O_Thom 17:da78a552339d 235 count[i-settime] = RxIn[i+1];
O_Thom 17:da78a552339d 236 timestampArray[i-settime+6] = RxIn[i+1];
O_Thom 17:da78a552339d 237 }
O_Thom 17:da78a552339d 238 }
O_Thom 16:73af0e3ddcaa 239 else if(int sett = searchInput(RxIn, "SETT") > 0)
O_Thom 9:654e14de9d74 240 {
O_Thom 9:654e14de9d74 241 }
O_Thom 16:73af0e3ddcaa 242 else if(int state = searchInput(RxIn, "STATE") > 0)
O_Thom 9:654e14de9d74 243 {
O_Thom 9:654e14de9d74 244 }
O_Thom 16:73af0e3ddcaa 245 else if(int logging = searchInput(RxIn, "LOGGING") > 0) // Verbose logging
O_Thom 16:73af0e3ddcaa 246 {
O_Thom 16:73af0e3ddcaa 247 }
O_Thom 16:73af0e3ddcaa 248 else if(int clearall = searchInput(RxIn, "CLEAR ALL") > 0)
O_Thom 16:73af0e3ddcaa 249 {
O_Thom 17:da78a552339d 250 cmdCount = 0;
O_Thom 17:da78a552339d 251 for (int i = 0; i < 22; i++)
O_Thom 17:da78a552339d 252 {
O_Thom 17:da78a552339d 253 printstringtoTerminal(clearingArray);
O_Thom 17:da78a552339d 254 }
O_Thom 17:da78a552339d 255 cmdCount = 0;
O_Thom 16:73af0e3ddcaa 256 }
O_Thom 16:73af0e3ddcaa 257 else
O_Thom 9:654e14de9d74 258 {
O_Thom 16:73af0e3ddcaa 259 printstringtoTerminal("UNKNOWN COMMAND");
O_Thom 16:73af0e3ddcaa 260 }
O_Thom 16:73af0e3ddcaa 261
O_Thom 16:73af0e3ddcaa 262 for (int i = 0; i < (buffer_size+1); i++) // Init
O_Thom 16:73af0e3ddcaa 263 {
O_Thom 16:73af0e3ddcaa 264 RxIn[i] = 0;
O_Thom 16:73af0e3ddcaa 265 }
O_Thom 16:73af0e3ddcaa 266 printf("\033[%d;%dfcmd: ", cmdRow, cmdCol); // Reset to cmd location
O_Thom 9:654e14de9d74 267 }
O_Thom 10:08c366434f2b 268
O_Thom 13:37a7c57f4641 269
O_Thom 13:37a7c57f4641 270 void ReadData()
O_Thom 10:08c366434f2b 271 {
O_Thom 16:73af0e3ddcaa 272 while(pc.readable()) // While there's data in the Rx buffer
O_Thom 10:08c366434f2b 273 {
O_Thom 16:73af0e3ddcaa 274 char c = pc.getc(); // Take a character off the buffer
O_Thom 16:73af0e3ddcaa 275 if (c == 0x0D) // Enter ASCII Code
O_Thom 13:37a7c57f4641 276 {
O_Thom 16:73af0e3ddcaa 277 printf("\033[%d;%df%s", (cmdRow-(cmdCount+1)),(cmdCol+5), rx_buffer); // Echo the Command back to the terminal
O_Thom 16:73af0e3ddcaa 278 rx_in = 0; // Reset the buffer indexer
O_Thom 16:73af0e3ddcaa 279 int stringLength = strlen(rx_buffer); //finds length of the array
O_Thom 16:73af0e3ddcaa 280 for (int i = 0; i < stringLength; i++) {
O_Thom 16:73af0e3ddcaa 281 RxIn[i] = rx_buffer[i]; // Copies buffer into global // stringLength-1-i
O_Thom 16:73af0e3ddcaa 282 }
O_Thom 16:73af0e3ddcaa 283 RxIn[stringLength] = '\0'; //adds NULL character
O_Thom 16:73af0e3ddcaa 284 SERIAL_Queue.call(callback(this, &Serialcomms::handleInput));
O_Thom 16:73af0e3ddcaa 285
O_Thom 16:73af0e3ddcaa 286 for (int i = 0 ; i < stringLength; i++)
O_Thom 15:f8748fd0c5b1 287 {
O_Thom 16:73af0e3ddcaa 288 rx_buffer[i] = 0; // Clear the buffer with spaces
O_Thom 15:f8748fd0c5b1 289 }
O_Thom 16:73af0e3ddcaa 290 printf("\033[%d;%df%s", cmdRow, (cmdCol+5), clearingArray); // Clear the Command entry space
O_Thom 16:73af0e3ddcaa 291 //printf("\033[%d;%df%s", (cmdRow -(cmdCount+2)), cmdCol, clearingArray); // Clear above the oldest record Command
O_Thom 15:f8748fd0c5b1 292
O_Thom 16:73af0e3ddcaa 293 if (cmdCount >= 20)
O_Thom 15:f8748fd0c5b1 294 {
O_Thom 15:f8748fd0c5b1 295 cmdCount = 0;
O_Thom 15:f8748fd0c5b1 296 }
O_Thom 15:f8748fd0c5b1 297 cmdCount++;
O_Thom 15:f8748fd0c5b1 298
O_Thom 15:f8748fd0c5b1 299 break;
O_Thom 13:37a7c57f4641 300 }
O_Thom 13:37a7c57f4641 301 rx_buffer[rx_in] = c;
O_Thom 16:73af0e3ddcaa 302 printf("\033[%d;%df%s",cmdRow, (cmdCol+5), rx_buffer); // Echo
O_Thom 13:37a7c57f4641 303 rx_in += 1; // Increase received indexer
O_Thom 11:b8e8630c7e3b 304 }
O_Thom 10:08c366434f2b 305 }
O_Thom 13:37a7c57f4641 306
O_Thom 9:654e14de9d74 307 void updateErrors(vector<int> ErrorsIn)
O_Thom 9:654e14de9d74 308 {
O_Thom 9:654e14de9d74 309 for (int idx = 0; idx < ErrorsIn.size() ; idx++) // Add the Error Codes to the vector
O_Thom 9:654e14de9d74 310 {
O_Thom 9:654e14de9d74 311 ErrorCodes.push_back(ErrorsIn[idx]);
O_Thom 9:654e14de9d74 312 }
O_Thom 6:b7f6e0c0f646 313 }
O_Thom 6:b7f6e0c0f646 314 void updateTimeDate()
O_Thom 6:b7f6e0c0f646 315 {
O_Thom 16:73af0e3ddcaa 316
O_Thom 6:b7f6e0c0f646 317 }
O_Thom 6:b7f6e0c0f646 318
O_Thom 10:08c366434f2b 319
O_Thom 1:f89c930c6491 320 };
O_Thom 7:8664a45f5ce1 321