3rd Repo, trying to figure this out.

Dependencies:   LPS25H hts221

Fork of SOFT253_Template_Weather_OS_54 by Stage-1 Students SoCEM

Committer:
aburch1
Date:
Thu Apr 27 17:09:50 2017 +0000
Revision:
78:6c2b8ade8414
Parent:
77:db3384071634
Errors now terminate the program and give user option to restart. Started to replace printf statements with message logger functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
FairyMental 36:19d3f752f9c3 1
Jonathan Austin 0:2757d7abb7d9 2 #include "mbed.h"
martinsimpson 32:260a288be58f 3 #include "rtos.h"
aburch1 74:749727490f44 4 #include "hts221.h"
aburch1 74:749727490f44 5 #include "LPS25H.h"
aburch1 74:749727490f44 6
aburch1 74:749727490f44 7 #include "CircularArray.h"
aburch1 74:749727490f44 8 #include "FakeSensor.h"
aburch1 74:749727490f44 9 #include "MessageLogger.h"
aburch1 74:749727490f44 10
FairyMental 43:3983059e0d91 11 #include <string.h>
FairyMental 34:09ed07f2acba 12 #include <stdio.h>
FairyMental 34:09ed07f2acba 13 #include <ctype.h>
FairyMental 41:d222c043c96d 14 #include <iostream>
aburch1 74:749727490f44 15 #include <sstream>
martinsimpson 32:260a288be58f 16
FairyMental 36:19d3f752f9c3 17 #define SIGNAL_doMeasure 1
aburch1 75:b44645bbf2d2 18 #define SIGNAL_printMessage 2
aburch1 78:6c2b8ade8414 19 #define SIGNAL_terminate 3
FairyMental 36:19d3f752f9c3 20 #define SWITCH1_RELEASE 90
Netaphous 65:3723d2729b68 21 #define BUFFER_SIZE 120
FairyMental 34:09ed07f2acba 22
FairyMental 57:dfcdda1e42b6 23 //
FairyMental 57:dfcdda1e42b6 24 // MBED DECLARATIONS
FairyMental 57:dfcdda1e42b6 25 //
martinsimpson 32:260a288be58f 26 DigitalOut myled(LED1);
Netaphous 50:c07e968b9582 27 DigitalIn onBoardSwitch(USER_BUTTON);
martinsimpson 32:260a288be58f 28 I2C i2c2(I2C_SDA, I2C_SCL);
Netaphous 50:c07e968b9582 29
FairyMental 57:dfcdda1e42b6 30 //
FairyMental 57:dfcdda1e42b6 31 // SENSOR DECLARATIONS
Netaphous 50:c07e968b9582 32 // MAKE SURE ONE OF THESE IS COMMENTED OUT
Netaphous 50:c07e968b9582 33 // Real sensor
aburch1 75:b44645bbf2d2 34 // LPS25H barometer(i2c2, LPS25H_V_CHIP_ADDR);
aburch1 75:b44645bbf2d2 35 // HTS221 measurer(I2C_SDA, I2C_SCL);
Netaphous 50:c07e968b9582 36 // Fake sensor
aburch1 75:b44645bbf2d2 37 FakeBarometer barometer(1029.0, 1031.0);
aburch1 75:b44645bbf2d2 38 FakeMeasurer measurer(20.0, 25.0, 30.0, 50.0);
Netaphous 50:c07e968b9582 39
FairyMental 57:dfcdda1e42b6 40 //
FairyMental 57:dfcdda1e42b6 41 // THREADS DECLARATION
FairyMental 57:dfcdda1e42b6 42 //
aburch1 78:6c2b8ade8414 43 osThreadId mainThreadID;
FairyMental 37:00775e368a71 44 Thread *produceThread;
FairyMental 37:00775e368a71 45 Thread *measureThread;
FairyMental 39:618ad21e2b34 46 Thread *consumeThread;
aburch1 74:749727490f44 47 Thread *loggingThread;
FairyMental 58:7fc6e3e4d746 48 Ticker timer;
FairyMental 58:7fc6e3e4d746 49 Ticker realTimeDate;
FairyMental 57:dfcdda1e42b6 50 //
FairyMental 57:dfcdda1e42b6 51 // GLOBAL VARIABLES
FairyMental 57:dfcdda1e42b6 52 //
FairyMental 34:09ed07f2acba 53 Mail<Measure, 16> mail_box;
Netaphous 65:3723d2729b68 54 CircularArray buffer(BUFFER_SIZE);
FairyMental 46:0de1f3c7d118 55 LocalDate *localDate;
aburch1 74:749727490f44 56 //Mail<>
FairyMental 49:83bea7fb2728 57 bool logging = true;
FairyMental 58:7fc6e3e4d746 58 float sampleRate = 1;
FairyMental 49:83bea7fb2728 59
aburch1 74:749727490f44 60 // Logging objects
aburch1 74:749727490f44 61 std::ostringstream oss;
aburch1 75:b44645bbf2d2 62 MessageLogger logger;
aburch1 74:749727490f44 63
FairyMental 57:dfcdda1e42b6 64 //
FairyMental 57:dfcdda1e42b6 65 // Called by a TICKER
FairyMental 57:dfcdda1e42b6 66 // Adds 1 second every second to the clock
FairyMental 46:0de1f3c7d118 67 void RealTimeDate()
FairyMental 46:0de1f3c7d118 68 {
FairyMental 46:0de1f3c7d118 69 localDate->TickSecond();
FairyMental 46:0de1f3c7d118 70 }
FairyMental 58:7fc6e3e4d746 71
FairyMental 58:7fc6e3e4d746 72 //
FairyMental 58:7fc6e3e4d746 73 // Ticker that signals the measureThread to do a measure
FairyMental 58:7fc6e3e4d746 74 //
FairyMental 58:7fc6e3e4d746 75 void SendSignalDoMeasure()
FairyMental 58:7fc6e3e4d746 76 {
FairyMental 58:7fc6e3e4d746 77 if(logging == true)
FairyMental 58:7fc6e3e4d746 78 measureThread->signal_set(SIGNAL_doMeasure);
FairyMental 58:7fc6e3e4d746 79 }
FairyMental 58:7fc6e3e4d746 80
FairyMental 57:dfcdda1e42b6 81 //
FairyMental 57:dfcdda1e42b6 82 // SIGNALED BY Ticker at a frequency of <T> Hz
FairyMental 57:dfcdda1e42b6 83 // Reads values from sensor board, sends over through mail queue
FairyMental 37:00775e368a71 84 void MeasureThread() {
FairyMental 35:484e384f9bf1 85
FairyMental 36:19d3f752f9c3 86 while(true)
FairyMental 36:19d3f752f9c3 87 {
FairyMental 57:dfcdda1e42b6 88 //Await signal from ticker
FairyMental 36:19d3f752f9c3 89 Thread::signal_wait(SIGNAL_doMeasure);
FairyMental 57:dfcdda1e42b6 90
FairyMental 36:19d3f752f9c3 91 float temperature = 0 , humidity = 0,pressure = 0;
FairyMental 57:dfcdda1e42b6 92
FairyMental 36:19d3f752f9c3 93 Measure *measure = mail_box.alloc();
FairyMental 36:19d3f752f9c3 94 if (measure == NULL)
FairyMental 36:19d3f752f9c3 95 {
aburch1 78:6c2b8ade8414 96 logger.SendError("Out of memory");
FairyMental 36:19d3f752f9c3 97 return;
FairyMental 36:19d3f752f9c3 98 }
FairyMental 34:09ed07f2acba 99
FairyMental 57:dfcdda1e42b6 100 //Read and fill in data
FairyMental 36:19d3f752f9c3 101 measurer.ReadTempHumi(&temperature,&humidity);
FairyMental 36:19d3f752f9c3 102 barometer.get();
FairyMental 36:19d3f752f9c3 103 pressure = barometer.pressure();
FairyMental 47:468a89d62c23 104
FairyMental 36:19d3f752f9c3 105 measure->temperature = temperature;
FairyMental 36:19d3f752f9c3 106 measure->humidity = humidity;
FairyMental 36:19d3f752f9c3 107 measure->pressure = pressure;
Netaphous 67:8d0e88172e2a 108 measure->date.setValues(localDate);
FairyMental 36:19d3f752f9c3 109
FairyMental 57:dfcdda1e42b6 110 osStatus stat = mail_box.put(measure);
martinsimpson 32:260a288be58f 111
FairyMental 36:19d3f752f9c3 112 //Check if succesful
aburch1 78:6c2b8ade8414 113 if (stat == osErrorResource)
aburch1 78:6c2b8ade8414 114 {
aburch1 78:6c2b8ade8414 115 char* c;
aburch1 78:6c2b8ade8414 116 sprintf(c, "%4X - Resource not available\n\r", stat);
aburch1 78:6c2b8ade8414 117 string s(c);
aburch1 78:6c2b8ade8414 118 logger.SendError(s);
FairyMental 36:19d3f752f9c3 119 mail_box.free(measure);
FairyMental 36:19d3f752f9c3 120 return;
FairyMental 36:19d3f752f9c3 121 }
FairyMental 34:09ed07f2acba 122 }
FairyMental 34:09ed07f2acba 123 }
FairyMental 34:09ed07f2acba 124
FairyMental 57:dfcdda1e42b6 125 //
FairyMental 57:dfcdda1e42b6 126 // Receives data through mail queue, then adds it to the global declared list
FairyMental 57:dfcdda1e42b6 127 // A.K.A. Producer Thread
FairyMental 37:00775e368a71 128 void ProducerThread()
FairyMental 34:09ed07f2acba 129 {
FairyMental 57:dfcdda1e42b6 130 while (true)
FairyMental 57:dfcdda1e42b6 131 {
FairyMental 34:09ed07f2acba 132 //Block on the queue
FairyMental 34:09ed07f2acba 133 osEvent evt = mail_box.get();
FairyMental 34:09ed07f2acba 134
FairyMental 34:09ed07f2acba 135 //Check status
FairyMental 34:09ed07f2acba 136 if (evt.status == osEventMail) {
FairyMental 39:618ad21e2b34 137
FairyMental 57:dfcdda1e42b6 138 Measure *measure = (Measure*)evt.value.p;
FairyMental 47:468a89d62c23 139 Measure msr(measure->date,measure->temperature, measure->humidity,measure->pressure);
Netaphous 65:3723d2729b68 140
Netaphous 65:3723d2729b68 141 // Changed to use circlar buffer rather than list buffer
Netaphous 65:3723d2729b68 142 buffer.pushValue(msr);
FairyMental 34:09ed07f2acba 143 mail_box.free(measure);
aburch1 78:6c2b8ade8414 144 }
aburch1 78:6c2b8ade8414 145 else
aburch1 78:6c2b8ade8414 146 {
aburch1 78:6c2b8ade8414 147 char* c;
aburch1 78:6c2b8ade8414 148 sprintf(c, "%4X - Failed to allocate memory\n\r", evt.status);
aburch1 78:6c2b8ade8414 149 string s(c);
aburch1 78:6c2b8ade8414 150 logger.SendError(s);
FairyMental 34:09ed07f2acba 151 }
FairyMental 34:09ed07f2acba 152
FairyMental 57:dfcdda1e42b6 153 }
FairyMental 34:09ed07f2acba 154 }
Netaphous 69:72f237750d85 155 int i;
FairyMental 57:dfcdda1e42b6 156 //
FairyMental 57:dfcdda1e42b6 157 // Compares two char arrays and returns result
FairyMental 57:dfcdda1e42b6 158 // Param1: First char Array / pointer
FairyMental 57:dfcdda1e42b6 159 // Param2: Second char Array / pointer
FairyMental 57:dfcdda1e42b6 160 // Param3. Size of the smallest char arrays (between param1 and param2)
FairyMental 57:dfcdda1e42b6 161 // Return: "-1" IF NOT EQUAL
FairyMental 57:dfcdda1e42b6 162 // "1 " IF EQUAL
FairyMental 42:b1f29874ab70 163 int CompareCommands(char command[],char targetcommand[], int size)
FairyMental 42:b1f29874ab70 164 {
FairyMental 43:3983059e0d91 165 for(i = 0; i < size; i ++)
FairyMental 42:b1f29874ab70 166 {
FairyMental 42:b1f29874ab70 167 if(command[i] != targetcommand[i])
FairyMental 42:b1f29874ab70 168 return -1;
FairyMental 42:b1f29874ab70 169 }
FairyMental 42:b1f29874ab70 170 return 1;
FairyMental 42:b1f29874ab70 171 }
aburch1 74:749727490f44 172
FairyMental 57:dfcdda1e42b6 173 //
FairyMental 57:dfcdda1e42b6 174 // Reads commands through PUTTY and 'consumes the data' accordingly
FairyMental 57:dfcdda1e42b6 175 // A.K.A. Consumer Thread
FairyMental 39:618ad21e2b34 176 void ConsumeThread()
FairyMental 39:618ad21e2b34 177 {
FairyMental 57:dfcdda1e42b6 178 //Last character pressed read (last key input)
FairyMental 41:d222c043c96d 179 char charCmd;
FairyMental 57:dfcdda1e42b6 180 //Char array that stores the command after user presses ENTER
FairyMental 41:d222c043c96d 181 char command[40];
FairyMental 57:dfcdda1e42b6 182 //Current Command Size
FairyMental 41:d222c043c96d 183 int crtChar = 0;
aburch1 78:6c2b8ade8414 184 logger.SendMessage("\n\rAwaiting command:\n\r");
aburch1 78:6c2b8ade8414 185
FairyMental 39:618ad21e2b34 186 while(1)
FairyMental 39:618ad21e2b34 187 {
FairyMental 41:d222c043c96d 188 charCmd = NULL;
FairyMental 41:d222c043c96d 189 charCmd = getchar();
FairyMental 41:d222c043c96d 190 if(charCmd != NULL)
FairyMental 41:d222c043c96d 191 {
FairyMental 57:dfcdda1e42b6 192 //If BACKSPACE is pressed, Print "DEL" so it deletes last character typed.
FairyMental 57:dfcdda1e42b6 193 if (charCmd == 127 && crtChar > 0 )
FairyMental 43:3983059e0d91 194 {
aburch1 78:6c2b8ade8414 195 char* c;
aburch1 78:6c2b8ade8414 196 sprintf(c, "%c", charCmd);
aburch1 78:6c2b8ade8414 197 string s(c);
aburch1 78:6c2b8ade8414 198 logger.SendMessage(s);
FairyMental 43:3983059e0d91 199 command[--crtChar] = '\0';
FairyMental 43:3983059e0d91 200 }
FairyMental 57:dfcdda1e42b6 201 //If NOT enter AND NOT Backspace is pressed, SAVE the char
FairyMental 57:dfcdda1e42b6 202 else if(charCmd != 13 && charCmd != 127)
FairyMental 41:d222c043c96d 203 {
FairyMental 41:d222c043c96d 204 command[crtChar++] = charCmd;
aburch1 78:6c2b8ade8414 205 char* c;
aburch1 78:6c2b8ade8414 206 sprintf(c, "%c", charCmd);
aburch1 78:6c2b8ade8414 207 string s(c);
aburch1 78:6c2b8ade8414 208 logger.SendMessage(s);
FairyMental 41:d222c043c96d 209 }
FairyMental 57:dfcdda1e42b6 210 //If ENTER is pressed, PROCESS it
FairyMental 44:b523c9a9dd97 211 else if(charCmd == 13) // If Enter is pressed
FairyMental 49:83bea7fb2728 212 {
FairyMental 57:dfcdda1e42b6 213 //Get first word of command:
FairyMental 43:3983059e0d91 214 char *charPos;
FairyMental 43:3983059e0d91 215 charPos = strtok(command," -,");
FairyMental 57:dfcdda1e42b6 216
FairyMental 57:dfcdda1e42b6 217 //Check if it's a "LIST" command
FairyMental 60:db8c5b7fc548 218 if(CompareCommands(charPos, "read",4) == 1)
FairyMental 42:b1f29874ab70 219 {
FairyMental 43:3983059e0d91 220 charPos = strtok(NULL," -,");
FairyMental 57:dfcdda1e42b6 221 //Check if it's a "LIST ALL" command
FairyMental 43:3983059e0d91 222 if(CompareCommands(charPos, "all",3) == 1)
FairyMental 43:3983059e0d91 223 {
aburch1 78:6c2b8ade8414 224 logger.SendMessage("\n\rPrinting all measures performed so far: \n\r");
Netaphous 65:3723d2729b68 225
Netaphous 65:3723d2729b68 226 // Changed to use circular buffer rather than list buffer
Netaphous 65:3723d2729b68 227 buffer.readAll();
aburch1 78:6c2b8ade8414 228 logger.SendMessage("\n\rD O N E ! \n\r");
FairyMental 43:3983059e0d91 229 }
FairyMental 57:dfcdda1e42b6 230 //Check if it's a "LIST X" command
FairyMental 43:3983059e0d91 231 else if(strtol(charPos,NULL,10) != 0)
FairyMental 43:3983059e0d91 232 {
Netaphous 69:72f237750d85 233 int num = atoi(charPos);
aburch1 78:6c2b8ade8414 234 char* c;
aburch1 78:6c2b8ade8414 235 sprintf(c, "\n\rPrinting %i measures: \n\r", num);
aburch1 78:6c2b8ade8414 236 string s(c);
aburch1 78:6c2b8ade8414 237 logger.SendMessage(s);
Netaphous 65:3723d2729b68 238
Netaphous 65:3723d2729b68 239 // Changed to use circular buffer rather than list buffer
Netaphous 69:72f237750d85 240 buffer.readX(num);
aburch1 78:6c2b8ade8414 241 logger.SendMessage("\n\rD O N E ! \n\r");
FairyMental 60:db8c5b7fc548 242 }
FairyMental 60:db8c5b7fc548 243 else
FairyMental 60:db8c5b7fc548 244 {
aburch1 78:6c2b8ade8414 245 logger.SendMessage("\n\rExpected parameters: \"all\" | \"n\", where n is a number.");
FairyMental 43:3983059e0d91 246 }
FairyMental 42:b1f29874ab70 247 }
FairyMental 57:dfcdda1e42b6 248 //Check if it's a "DELETE" command
FairyMental 44:b523c9a9dd97 249 else if (CompareCommands(charPos,"delete",6) == 1)
FairyMental 44:b523c9a9dd97 250 {
FairyMental 44:b523c9a9dd97 251 charPos = strtok(NULL," -,");
FairyMental 57:dfcdda1e42b6 252 //Check if it's a "DELETE ALL" command
FairyMental 44:b523c9a9dd97 253 if(CompareCommands(charPos,"all",3) == 1)
FairyMental 44:b523c9a9dd97 254 {
aburch1 78:6c2b8ade8414 255 logger.SendMessage("\n\rDeleting all measures performed so far: \n\r");
Netaphous 65:3723d2729b68 256
Netaphous 65:3723d2729b68 257 // Changed to use circular buffer rather than list buffer
Netaphous 65:3723d2729b68 258 buffer.deleteAll();
aburch1 78:6c2b8ade8414 259 logger.SendMessage("\n\rElements deleted!\n\r");
FairyMental 44:b523c9a9dd97 260 }
FairyMental 57:dfcdda1e42b6 261 //Check if it's a "DELETE X" command
FairyMental 44:b523c9a9dd97 262 else if (strtol(charPos,NULL,10) != 0)
FairyMental 44:b523c9a9dd97 263 {
Netaphous 65:3723d2729b68 264 // Changed to use circular buffer rather than list buffer
Netaphous 65:3723d2729b68 265 buffer.deleteX(atoi(charPos));
aburch1 78:6c2b8ade8414 266 logger.SendMessage("\n\rElements deleted!\n\r");
FairyMental 60:db8c5b7fc548 267 }
FairyMental 60:db8c5b7fc548 268 else
FairyMental 60:db8c5b7fc548 269 {
aburch1 78:6c2b8ade8414 270 logger.SendMessage("\n\rExpected parameters: \"all\" | \"n\", where n is a number.");
FairyMental 44:b523c9a9dd97 271 }
FairyMental 44:b523c9a9dd97 272
FairyMental 44:b523c9a9dd97 273 }
FairyMental 60:db8c5b7fc548 274 //Check if it's a "STATUS" command
aburch1 76:ee1f132e5744 275 else if (CompareCommands(charPos,"status",6) == 1)
FairyMental 45:9a33f2bc2b4e 276 {
FairyMental 46:0de1f3c7d118 277 char *ptr = localDate->ToString();
Netaphous 65:3723d2729b68 278
Netaphous 65:3723d2729b68 279 // Changed to use circular buffer rather than list buffer
FairyMental 49:83bea7fb2728 280 if(logging == true)
aburch1 78:6c2b8ade8414 281 {
aburch1 78:6c2b8ade8414 282 char* c;
aburch1 78:6c2b8ade8414 283 sprintf(c, "\n\rSTATUS: \n\r # of measures: %i \n\r SAMPLING: ON \n\r Current Date: %s \n\r Sample Rate(s): %2.2f \n\r", buffer.getSize(), ptr,sampleRate);
aburch1 78:6c2b8ade8414 284 string s(c);
aburch1 78:6c2b8ade8414 285 logger.SendMessage(s);
aburch1 78:6c2b8ade8414 286 }
FairyMental 49:83bea7fb2728 287 else
aburch1 78:6c2b8ade8414 288 {
aburch1 78:6c2b8ade8414 289 char* c;
aburch1 78:6c2b8ade8414 290 sprintf(c, "\n\rSTATUS: \n\r # of measures: %i \n\r SAMPLING: OFF \n\r Current Date: %s \n\r Sample Rate(s): %2.2f \n\r", buffer.getSize(), ptr,sampleRate);
aburch1 78:6c2b8ade8414 291 string s(c);
aburch1 78:6c2b8ade8414 292 logger.SendMessage(s);
aburch1 78:6c2b8ade8414 293 }
FairyMental 45:9a33f2bc2b4e 294 }
FairyMental 57:dfcdda1e42b6 295 //Check if it's a "SETTIME" command
FairyMental 48:a8219954b3f2 296 else if (CompareCommands(charPos,"settime",7) == 1)
FairyMental 48:a8219954b3f2 297 {
FairyMental 48:a8219954b3f2 298 int h,m,s;
FairyMental 57:dfcdda1e42b6 299 //Fetch 1st Param
FairyMental 48:a8219954b3f2 300 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 301 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 302 {
FairyMental 48:a8219954b3f2 303 h = atoi(charPos);
FairyMental 48:a8219954b3f2 304 }
FairyMental 57:dfcdda1e42b6 305 //Fech 2nd Param
FairyMental 48:a8219954b3f2 306 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 307 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 308 {
FairyMental 48:a8219954b3f2 309 m = atoi(charPos);
FairyMental 48:a8219954b3f2 310 }
FairyMental 57:dfcdda1e42b6 311 //Fetch 3rd Param
FairyMental 48:a8219954b3f2 312 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 313 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 314 {
FairyMental 48:a8219954b3f2 315 s = atoi(charPos);
FairyMental 48:a8219954b3f2 316 }
FairyMental 57:dfcdda1e42b6 317 //Check if parameters are valid
FairyMental 48:a8219954b3f2 318 if((h>=0 && h < 24) && (m>=0 && m<60) && (s>=0 && s<60))
FairyMental 48:a8219954b3f2 319 {
FairyMental 48:a8219954b3f2 320 localDate->hour = h;
FairyMental 48:a8219954b3f2 321 localDate->min = m;
FairyMental 48:a8219954b3f2 322 localDate->sec = s;
FairyMental 60:db8c5b7fc548 323 char *ptr = localDate->ToString();
aburch1 78:6c2b8ade8414 324 char* c;
aburch1 78:6c2b8ade8414 325 sprintf(c, "\n\rUpdated Date to: %s \n\r", ptr);
aburch1 78:6c2b8ade8414 326 string s(c);
aburch1 78:6c2b8ade8414 327 logger.SendMessage(s);
FairyMental 48:a8219954b3f2 328 }
FairyMental 57:dfcdda1e42b6 329 //If not valid, prompt user
FairyMental 48:a8219954b3f2 330 else
FairyMental 48:a8219954b3f2 331 {
aburch1 78:6c2b8ade8414 332 printf("\n\rWrong format! please use HH-MM-SS separated by spaces. \n\r");
FairyMental 48:a8219954b3f2 333 }
FairyMental 48:a8219954b3f2 334 }
FairyMental 57:dfcdda1e42b6 335 //Check if it's a "SETDATE" command
FairyMental 48:a8219954b3f2 336 else if (CompareCommands(charPos,"setdate",7) == 1)
FairyMental 48:a8219954b3f2 337 {
FairyMental 48:a8219954b3f2 338 int d,m,y;
FairyMental 57:dfcdda1e42b6 339 //Fetch 1st Parameter
FairyMental 48:a8219954b3f2 340 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 341 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 342 {
FairyMental 48:a8219954b3f2 343 d = atoi(charPos);
FairyMental 48:a8219954b3f2 344 }
FairyMental 57:dfcdda1e42b6 345 //Fetch 2nd Parameter
FairyMental 48:a8219954b3f2 346 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 347 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 348 {
FairyMental 48:a8219954b3f2 349 m = atoi(charPos);
FairyMental 48:a8219954b3f2 350 }
FairyMental 57:dfcdda1e42b6 351 //Fetch 3rd Parameter
FairyMental 48:a8219954b3f2 352 charPos = strtok(NULL," ,");
FairyMental 48:a8219954b3f2 353 if(strtol(charPos,NULL,10) != 0)
FairyMental 48:a8219954b3f2 354 {
FairyMental 48:a8219954b3f2 355 y = atoi(charPos);
FairyMental 48:a8219954b3f2 356 }
FairyMental 57:dfcdda1e42b6 357 //Check if parameters are valid
FairyMental 48:a8219954b3f2 358 if((d>=0 && d < 31) && (m>=0 && m<13))
FairyMental 48:a8219954b3f2 359 {
FairyMental 48:a8219954b3f2 360 localDate->day = d;
FairyMental 48:a8219954b3f2 361 localDate->month = m;
FairyMental 48:a8219954b3f2 362 localDate->year = y;
FairyMental 60:db8c5b7fc548 363 char *ptr = localDate->ToString();
aburch1 78:6c2b8ade8414 364 printf("\n\rUpdated Date to: %s \n\r", ptr);
FairyMental 48:a8219954b3f2 365 }
FairyMental 57:dfcdda1e42b6 366 // Prompt user if they are not.
FairyMental 48:a8219954b3f2 367 else
FairyMental 48:a8219954b3f2 368 {
aburch1 78:6c2b8ade8414 369 printf("\n\rWrong format! please use DD-MM-YYYY separated by spaces. \n\r");
FairyMental 48:a8219954b3f2 370 }
FairyMental 48:a8219954b3f2 371 }
FairyMental 57:dfcdda1e42b6 372 // Check if it's a "LOGGING" command
FairyMental 60:db8c5b7fc548 373 else if(CompareCommands(charPos,"state",5) == 1)
FairyMental 49:83bea7fb2728 374 {
FairyMental 49:83bea7fb2728 375 charPos = strtok(NULL," ,");
FairyMental 57:dfcdda1e42b6 376 //Check if it should be turned ON / OFF
FairyMental 49:83bea7fb2728 377 if(CompareCommands(charPos,"on",2) == 1)
FairyMental 49:83bea7fb2728 378 {
FairyMental 49:83bea7fb2728 379 logging = true;
aburch1 78:6c2b8ade8414 380 printf("\n\rSampling turned ON!\n\r");
FairyMental 49:83bea7fb2728 381 }
FairyMental 49:83bea7fb2728 382 else if (CompareCommands(charPos,"off",3) == 1)
FairyMental 49:83bea7fb2728 383 {
FairyMental 49:83bea7fb2728 384 logging = false;
aburch1 78:6c2b8ade8414 385 printf("\n\rSampling turned OFF!\n\r");
FairyMental 60:db8c5b7fc548 386 }
FairyMental 60:db8c5b7fc548 387 else
FairyMental 60:db8c5b7fc548 388 {
Netaphous 69:72f237750d85 389 printf("\n\rExpected parameters: \"on\" | \"off\"");
FairyMental 49:83bea7fb2728 390 }
FairyMental 58:7fc6e3e4d746 391 }
FairyMental 68:d3765f93c16a 392 // Check if it's a "SETT" command
FairyMental 58:7fc6e3e4d746 393 else if(CompareCommands(charPos,"sett",4) == 1)
FairyMental 58:7fc6e3e4d746 394 {
FairyMental 58:7fc6e3e4d746 395 charPos = strtok(NULL," ,");
FairyMental 58:7fc6e3e4d746 396 float auxRate = atof(charPos);
FairyMental 68:d3765f93c16a 397 // Validate rate
aburch1 73:cfad270d2f2c 398 if(auxRate >= 0.1 &&
Netaphous 69:72f237750d85 399 auxRate <= 60 )
FairyMental 58:7fc6e3e4d746 400 {
FairyMental 58:7fc6e3e4d746 401 sampleRate = auxRate;
FairyMental 58:7fc6e3e4d746 402 timer.detach();
FairyMental 58:7fc6e3e4d746 403 timer.attach(&SendSignalDoMeasure, sampleRate);
aburch1 78:6c2b8ade8414 404 printf("\n\rSuccessfully updated sample rate to: %2.2f .\n\r",sampleRate);
FairyMental 58:7fc6e3e4d746 405 }
FairyMental 68:d3765f93c16a 406 // if rate is not valid, prompt:
FairyMental 58:7fc6e3e4d746 407 else
FairyMental 58:7fc6e3e4d746 408 {
aburch1 78:6c2b8ade8414 409 printf("\n\r Sample rate must be between 0.1 and 60. \n\r");
FairyMental 58:7fc6e3e4d746 410 }
FairyMental 58:7fc6e3e4d746 411 }
FairyMental 68:d3765f93c16a 412 // Check if it's a "HELP" command
FairyMental 60:db8c5b7fc548 413 else if (CompareCommands(charPos,"help",4) == 1 || CompareCommands(charPos,"?",1) == 1)
FairyMental 59:a69cd12dafca 414 {
aburch1 78:6c2b8ade8414 415 printf("\n\rAvailable Commands:\n\r");
aburch1 78:6c2b8ade8414 416 printf(" read <ALL|N> - Read ALL or N first measures.\n\r");
aburch1 78:6c2b8ade8414 417 printf(" delete <ALL|N> - Delete ALL or N first measures.\n\r");
aburch1 78:6c2b8ade8414 418 printf(" setdate <DD> <MM> <YYYY> Set current date.\n\r");
aburch1 78:6c2b8ade8414 419 printf(" settime <HH> <MM> <SS> Set current time.\n\r");
aburch1 78:6c2b8ade8414 420 printf(" sett <T> Set sample rate (in seconds).\n\r");
aburch1 78:6c2b8ade8414 421 printf(" status - Status report of device.\n\r");
aburch1 78:6c2b8ade8414 422 printf(" state - <ON|OFF> - Turn sampling on or OFF.\n\r");
aburch1 78:6c2b8ade8414 423 printf(" logging <ON|OFF> - Turn logging on or OFF.\n\r");
FairyMental 59:a69cd12dafca 424 }
aburch1 75:b44645bbf2d2 425 else if(CompareCommands(charPos, "test", 4) == 1)
aburch1 75:b44645bbf2d2 426 {
aburch1 77:db3384071634 427 charPos = strtok(NULL," ,");
aburch1 77:db3384071634 428 //Check if it should be turned ON / OFF
aburch1 77:db3384071634 429 if(CompareCommands(charPos,"1",1) == 1)
aburch1 77:db3384071634 430 {
aburch1 77:db3384071634 431 char *temp;
aburch1 77:db3384071634 432 int i = 1337;
aburch1 77:db3384071634 433 sprintf(temp, "DIE YOU %d", i);
aburch1 77:db3384071634 434 logger.SendMessage(temp);
aburch1 77:db3384071634 435 }
aburch1 77:db3384071634 436 else
aburch1 77:db3384071634 437 {
aburch1 77:db3384071634 438 char *temp;
aburch1 77:db3384071634 439 int i = 50;
aburch1 77:db3384071634 440 sprintf(temp, "DIE YOU %d", i);
aburch1 77:db3384071634 441 logger.SendError(temp);
aburch1 77:db3384071634 442
aburch1 77:db3384071634 443 }
aburch1 75:b44645bbf2d2 444 }
FairyMental 68:d3765f93c16a 445 // If command not recognized
FairyMental 60:db8c5b7fc548 446 else
FairyMental 60:db8c5b7fc548 447 {
aburch1 78:6c2b8ade8414 448 printf("\n\r Command not recognized. Type \"help\" for more info.\n\r");
FairyMental 60:db8c5b7fc548 449 }
aburch1 78:6c2b8ade8414 450 printf("\n\rAwaiting command: \n\r");
FairyMental 57:dfcdda1e42b6 451 //Clear command!
FairyMental 57:dfcdda1e42b6 452 //* NOTE * Setting first char in array to '\0' WILL NOT RESET IT...for some reason.
FairyMental 41:d222c043c96d 453 int i = 0;
FairyMental 41:d222c043c96d 454 for(i =0 ; i < crtChar; i++)
FairyMental 41:d222c043c96d 455 command[i] = ' ';
FairyMental 41:d222c043c96d 456 command[0] = 0;
FairyMental 41:d222c043c96d 457 crtChar = 0;
FairyMental 41:d222c043c96d 458 }
FairyMental 41:d222c043c96d 459 }
FairyMental 39:618ad21e2b34 460 }
FairyMental 39:618ad21e2b34 461 }
aburch1 73:cfad270d2f2c 462
aburch1 73:cfad270d2f2c 463 void LoggingThread()
aburch1 73:cfad270d2f2c 464 {
aburch1 75:b44645bbf2d2 465 //Thread::wait(300000);
aburch1 73:cfad270d2f2c 466 // ARRON: TODO
aburch1 73:cfad270d2f2c 467
aburch1 73:cfad270d2f2c 468 // - Printing messages
aburch1 73:cfad270d2f2c 469 // - Out of memory
aburch1 73:cfad270d2f2c 470 // - Current status
aburch1 73:cfad270d2f2c 471 // - Display time every X seconds/minutes
aburch1 73:cfad270d2f2c 472
aburch1 73:cfad270d2f2c 473 // Some queue system holding lines to print
aburch1 73:cfad270d2f2c 474 // If the queue has something to print, print it.
aburch1 75:b44645bbf2d2 475
aburch1 75:b44645bbf2d2 476 while(true)
aburch1 75:b44645bbf2d2 477 {
aburch1 75:b44645bbf2d2 478 Thread::signal_wait(SIGNAL_printMessage);
aburch1 78:6c2b8ade8414 479 while(true)
aburch1 78:6c2b8ade8414 480
aburch1 78:6c2b8ade8414 481 {
aburch1 75:b44645bbf2d2 482 if(logger.GetError())
aburch1 75:b44645bbf2d2 483 {
aburch1 78:6c2b8ade8414 484 osSignalSet(mainThreadID, SIGNAL_terminate);
aburch1 75:b44645bbf2d2 485 }
aburch1 75:b44645bbf2d2 486 else if(!logger.GetMessage())
aburch1 75:b44645bbf2d2 487 {
aburch1 78:6c2b8ade8414 488 break;
aburch1 75:b44645bbf2d2 489 }
aburch1 78:6c2b8ade8414 490 }
aburch1 75:b44645bbf2d2 491 }
aburch1 73:cfad270d2f2c 492 }
FairyMental 34:09ed07f2acba 493
FairyMental 34:09ed07f2acba 494 // Main thread
aburch1 78:6c2b8ade8414 495 int main()
aburch1 78:6c2b8ade8414 496 {
aburch1 78:6c2b8ade8414 497 mainThreadID = osThreadGetId();
aburch1 78:6c2b8ade8414 498
FairyMental 57:dfcdda1e42b6 499 //Initialize all stuff you need here:
FairyMental 34:09ed07f2acba 500 measurer.init();
FairyMental 34:09ed07f2acba 501 measurer.calib();
Netaphous 54:53ee2d07d684 502
FairyMental 46:0de1f3c7d118 503 localDate = new LocalDate();
FairyMental 34:09ed07f2acba 504 //Start message
aburch1 78:6c2b8ade8414 505 printf("\n\r\n\r--- W E L C O M E --\n\r");
FairyMental 34:09ed07f2acba 506
FairyMental 34:09ed07f2acba 507 //Hook up timer interrupt
FairyMental 58:7fc6e3e4d746 508 timer.attach(&SendSignalDoMeasure, sampleRate);
FairyMental 46:0de1f3c7d118 509 realTimeDate.attach(&RealTimeDate,1.0);
FairyMental 34:09ed07f2acba 510
FairyMental 57:dfcdda1e42b6 511 //Run Threads
FairyMental 37:00775e368a71 512 produceThread = new Thread();
FairyMental 37:00775e368a71 513 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 514 measureThread = new Thread();
FairyMental 37:00775e368a71 515 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 516 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 517 consumeThread->start(ConsumeThread);
aburch1 74:749727490f44 518 loggingThread = new Thread();
aburch1 74:749727490f44 519 loggingThread->start(LoggingThread);
aburch1 74:749727490f44 520
aburch1 75:b44645bbf2d2 521 logger.SetThread(loggingThread);
FairyMental 34:09ed07f2acba 522
aburch1 75:b44645bbf2d2 523 while(true)
martinsimpson 32:260a288be58f 524 {
aburch1 78:6c2b8ade8414 525 osSignalWait(SIGNAL_terminate, osWaitForever);
aburch1 78:6c2b8ade8414 526
aburch1 78:6c2b8ade8414 527 produceThread->terminate();
aburch1 78:6c2b8ade8414 528 measureThread->terminate();
aburch1 78:6c2b8ade8414 529 consumeThread->terminate();
aburch1 78:6c2b8ade8414 530 loggingThread->terminate();
aburch1 78:6c2b8ade8414 531
aburch1 78:6c2b8ade8414 532 printf("Press any key to restart... ");
aburch1 78:6c2b8ade8414 533 char c = getchar();
aburch1 78:6c2b8ade8414 534
aburch1 78:6c2b8ade8414 535 NVIC_SystemReset();
FairyMental 68:d3765f93c16a 536 }
Netaphous 70:ee19a73ed215 537 }