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 10:00:19 2017 +0000
Revision:
76:ee1f132e5744
Parent:
75:b44645bbf2d2
Child:
77:db3384071634
Started using char arrays for strings instead of stringstream objects

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 75:b44645bbf2d2 393 //logger.SendError("DIE");
aburch1 75:b44645bbf2d2 394 logger.SendMessage("Ur Ded m9");
aburch1 75:b44645bbf2d2 395 //logger.GetMessage();
aburch1 75:b44645bbf2d2 396 }
FairyMental 68:d3765f93c16a 397 // If command not recognized
FairyMental 60:db8c5b7fc548 398 else
FairyMental 60:db8c5b7fc548 399 {
FairyMental 60:db8c5b7fc548 400 printf("\r\n Command not recognized. Type \"help\" for more info.\r\n");
FairyMental 60:db8c5b7fc548 401 }
FairyMental 58:7fc6e3e4d746 402 printf("\r\nAwaiting command: \r\n");
FairyMental 57:dfcdda1e42b6 403 //Clear command!
FairyMental 57:dfcdda1e42b6 404 //* NOTE * Setting first char in array to '\0' WILL NOT RESET IT...for some reason.
FairyMental 41:d222c043c96d 405 int i = 0;
FairyMental 41:d222c043c96d 406 for(i =0 ; i < crtChar; i++)
FairyMental 41:d222c043c96d 407 command[i] = ' ';
FairyMental 41:d222c043c96d 408 command[0] = 0;
FairyMental 41:d222c043c96d 409 crtChar = 0;
FairyMental 41:d222c043c96d 410 }
FairyMental 41:d222c043c96d 411 }
FairyMental 39:618ad21e2b34 412 }
FairyMental 39:618ad21e2b34 413 }
aburch1 73:cfad270d2f2c 414
aburch1 73:cfad270d2f2c 415 void LoggingThread()
aburch1 73:cfad270d2f2c 416 {
aburch1 75:b44645bbf2d2 417 //Thread::wait(300000);
aburch1 73:cfad270d2f2c 418 // ARRON: TODO
aburch1 73:cfad270d2f2c 419
aburch1 73:cfad270d2f2c 420 // - Printing messages
aburch1 73:cfad270d2f2c 421 // - Out of memory
aburch1 73:cfad270d2f2c 422 // - Current status
aburch1 73:cfad270d2f2c 423 // - Display time every X seconds/minutes
aburch1 73:cfad270d2f2c 424
aburch1 73:cfad270d2f2c 425 // Some queue system holding lines to print
aburch1 73:cfad270d2f2c 426 // If the queue has something to print, print it.
aburch1 75:b44645bbf2d2 427
aburch1 75:b44645bbf2d2 428 while(true)
aburch1 75:b44645bbf2d2 429 {
aburch1 75:b44645bbf2d2 430 Thread::signal_wait(SIGNAL_printMessage);
aburch1 75:b44645bbf2d2 431 if(logger.GetError())
aburch1 75:b44645bbf2d2 432 {
aburch1 75:b44645bbf2d2 433 // Kill EVERYTHING
aburch1 76:ee1f132e5744 434 //mbed_reset();
aburch1 76:ee1f132e5744 435 //NVIC_SystemReset();
aburch1 75:b44645bbf2d2 436 }
aburch1 75:b44645bbf2d2 437 else if(!logger.GetMessage())
aburch1 75:b44645bbf2d2 438 {
aburch1 76:ee1f132e5744 439
aburch1 75:b44645bbf2d2 440 }
aburch1 75:b44645bbf2d2 441
aburch1 75:b44645bbf2d2 442 }
aburch1 73:cfad270d2f2c 443 }
FairyMental 34:09ed07f2acba 444
FairyMental 34:09ed07f2acba 445 // Main thread
FairyMental 34:09ed07f2acba 446 int main() {
FairyMental 34:09ed07f2acba 447
FairyMental 57:dfcdda1e42b6 448 //Initialize all stuff you need here:
FairyMental 34:09ed07f2acba 449 measurer.init();
FairyMental 34:09ed07f2acba 450 measurer.calib();
Netaphous 54:53ee2d07d684 451
FairyMental 46:0de1f3c7d118 452 localDate = new LocalDate();
FairyMental 34:09ed07f2acba 453 //Start message
FairyMental 68:d3765f93c16a 454 printf("\r\n--- W E L C O M E --\r\n");
FairyMental 34:09ed07f2acba 455
FairyMental 34:09ed07f2acba 456 //Hook up timer interrupt
FairyMental 58:7fc6e3e4d746 457 timer.attach(&SendSignalDoMeasure, sampleRate);
FairyMental 46:0de1f3c7d118 458 realTimeDate.attach(&RealTimeDate,1.0);
FairyMental 34:09ed07f2acba 459
FairyMental 57:dfcdda1e42b6 460 //Run Threads
FairyMental 37:00775e368a71 461 produceThread = new Thread();
FairyMental 37:00775e368a71 462 produceThread->start(ProducerThread);
FairyMental 37:00775e368a71 463 measureThread = new Thread();
FairyMental 37:00775e368a71 464 measureThread->start(MeasureThread);
FairyMental 39:618ad21e2b34 465 consumeThread = new Thread();
FairyMental 39:618ad21e2b34 466 consumeThread->start(ConsumeThread);
aburch1 74:749727490f44 467 loggingThread = new Thread();
aburch1 74:749727490f44 468 loggingThread->start(LoggingThread);
aburch1 74:749727490f44 469
aburch1 75:b44645bbf2d2 470 logger.SetThread(loggingThread);
FairyMental 34:09ed07f2acba 471
FairyMental 34:09ed07f2acba 472 printf("Main Thread\n");
aburch1 75:b44645bbf2d2 473 while(true)
martinsimpson 32:260a288be58f 474 {
aburch1 73:cfad270d2f2c 475 // Is there a sleep method that could be used instead or waiting and awaking every 3 seconds?
aburch1 75:b44645bbf2d2 476 Thread::wait(300);
FairyMental 68:d3765f93c16a 477 }
Netaphous 70:ee19a73ed215 478 }