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:
Wed Apr 26 21:58:08 2017 +0000
Revision:
77:db3384071634
Parent:
76:ee1f132e5744
Child:
78:6c2b8ade8414
Child:
79:4e6b53eb678b
Finished message logger so both errors and normal messages can be sent through to be printed. Any error codes are also displayed.

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