A simple WIP that logs data from a Grove sensor, and can send and receive information over USB and SMS.
Dependencies: DHT DS_1337 SDFileSystem USBDevice mbed
Handlers/measurementhandler.cpp@0:2df78a4443cd, 2016-04-10 (annotated)
- Committer:
- Joseph Radford
- Date:
- Sun Apr 10 15:47:33 2016 +1000
- Revision:
- 0:2df78a4443cd
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Joseph Radford |
0:2df78a4443cd | 1 | #include "measurementhandler.h" |
Joseph Radford |
0:2df78a4443cd | 2 | #include "mbed.h" |
Joseph Radford |
0:2df78a4443cd | 3 | #include "SdHandler.h" |
Joseph Radford |
0:2df78a4443cd | 4 | #include "UsbComms.h" |
Joseph Radford |
0:2df78a4443cd | 5 | |
Joseph Radford |
0:2df78a4443cd | 6 | // declare led4 so we can flash it to reflect state of this handler |
Joseph Radford |
0:2df78a4443cd | 7 | extern DigitalOut myled4; |
Joseph Radford |
0:2df78a4443cd | 8 | |
Joseph Radford |
0:2df78a4443cd | 9 | // flags for the request register |
Joseph Radford |
0:2df78a4443cd | 10 | #define REQ_RESULT 0b00000001 |
Joseph Radford |
0:2df78a4443cd | 11 | #define REQ_ERROR 0b00000010 |
Joseph Radford |
0:2df78a4443cd | 12 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 13 | #define REQ_SMS 0b00000100 |
Joseph Radford |
0:2df78a4443cd | 14 | #endif |
Joseph Radford |
0:2df78a4443cd | 15 | |
Joseph Radford |
0:2df78a4443cd | 16 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 17 | MeasurementHandler::MeasurementHandler(SdHandler *_sd, UsbComms *_usb, GprsHandler *_gprs, MyTimers *_timer) |
Joseph Radford |
0:2df78a4443cd | 18 | : AbstractHandler(_timer), m_sd(_sd), m_usb(_usb), m_gprs(_gprs) |
Joseph Radford |
0:2df78a4443cd | 19 | #else |
Joseph Radford |
0:2df78a4443cd | 20 | MeasurementHandler::MeasurementHandler(SdHandler *_sd, UsbComms *_usb, MyTimers *_timer) |
Joseph Radford |
0:2df78a4443cd | 21 | : AbstractHandler(_timer), m_sd(_sd), m_usb(_usb) |
Joseph Radford |
0:2df78a4443cd | 22 | #endif |
Joseph Radford |
0:2df78a4443cd | 23 | { |
Joseph Radford |
0:2df78a4443cd | 24 | m_lastError = ERROR_NONE; |
Joseph Radford |
0:2df78a4443cd | 25 | mode = meas_Start; |
Joseph Radford |
0:2df78a4443cd | 26 | m_lastRequest = measreq_MeasReqNone; |
Joseph Radford |
0:2df78a4443cd | 27 | m_flashOn = false; |
Joseph Radford |
0:2df78a4443cd | 28 | m_requestRegister = 0; |
Joseph Radford |
0:2df78a4443cd | 29 | |
Joseph Radford |
0:2df78a4443cd | 30 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 31 | for (int i = 0; i < GPRS_RECIPIENTS_MAXLEN; i++) { |
Joseph Radford |
0:2df78a4443cd | 32 | m_lastSender[i] = 0; |
Joseph Radford |
0:2df78a4443cd | 33 | } |
Joseph Radford |
0:2df78a4443cd | 34 | #endif |
Joseph Radford |
0:2df78a4443cd | 35 | } |
Joseph Radford |
0:2df78a4443cd | 36 | |
Joseph Radford |
0:2df78a4443cd | 37 | void MeasurementHandler::run() |
Joseph Radford |
0:2df78a4443cd | 38 | { |
Joseph Radford |
0:2df78a4443cd | 39 | switch(mode) { |
Joseph Radford |
0:2df78a4443cd | 40 | case meas_Start: |
Joseph Radford |
0:2df78a4443cd | 41 | // start here, and come back here if an error has been flushed out and waited |
Joseph Radford |
0:2df78a4443cd | 42 | mode = meas_CheckRequest; |
Joseph Radford |
0:2df78a4443cd | 43 | break; |
Joseph Radford |
0:2df78a4443cd | 44 | |
Joseph Radford |
0:2df78a4443cd | 45 | case meas_CheckRequest: |
Joseph Radford |
0:2df78a4443cd | 46 | if (m_requestRegister) { |
Joseph Radford |
0:2df78a4443cd | 47 | // check what has been requested, starting from most highest priority |
Joseph Radford |
0:2df78a4443cd | 48 | |
Joseph Radford |
0:2df78a4443cd | 49 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 50 | if (m_requestRegister&REQ_SMS) { |
Joseph Radford |
0:2df78a4443cd | 51 | // an SMS has been requested |
Joseph Radford |
0:2df78a4443cd | 52 | mode = meas_PostStateSMS; |
Joseph Radford |
0:2df78a4443cd | 53 | } |
Joseph Radford |
0:2df78a4443cd | 54 | else if (m_requestRegister&REQ_RESULT) { |
Joseph Radford |
0:2df78a4443cd | 55 | #else |
Joseph Radford |
0:2df78a4443cd | 56 | if (m_requestRegister&REQ_RESULT) { |
Joseph Radford |
0:2df78a4443cd | 57 | #endif |
Joseph Radford |
0:2df78a4443cd | 58 | // a result has been sent, we need to post it |
Joseph Radford |
0:2df78a4443cd | 59 | mode = meas_PostResult; |
Joseph Radford |
0:2df78a4443cd | 60 | } |
Joseph Radford |
0:2df78a4443cd | 61 | else if (m_requestRegister&REQ_ERROR) { |
Joseph Radford |
0:2df78a4443cd | 62 | // an error has been sent, we need to post it |
Joseph Radford |
0:2df78a4443cd | 63 | mode = meas_PostError; |
Joseph Radford |
0:2df78a4443cd | 64 | } |
Joseph Radford |
0:2df78a4443cd | 65 | else { |
Joseph Radford |
0:2df78a4443cd | 66 | // something went wrong, a flag was set that isn't defined |
Joseph Radford |
0:2df78a4443cd | 67 | m_requestRegister = 0; |
Joseph Radford |
0:2df78a4443cd | 68 | mode = meas_FlashTimer; |
Joseph Radford |
0:2df78a4443cd | 69 | } |
Joseph Radford |
0:2df78a4443cd | 70 | } |
Joseph Radford |
0:2df78a4443cd | 71 | else { |
Joseph Radford |
0:2df78a4443cd | 72 | // no requests, check if running led needs to be flashed |
Joseph Radford |
0:2df78a4443cd | 73 | mode = meas_FlashTimer; |
Joseph Radford |
0:2df78a4443cd | 74 | } |
Joseph Radford |
0:2df78a4443cd | 75 | break; |
Joseph Radford |
0:2df78a4443cd | 76 | |
Joseph Radford |
0:2df78a4443cd | 77 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 78 | case meas_PostStateSMS: |
Joseph Radford |
0:2df78a4443cd | 79 | if (m_requestRegister&REQ_SMS) { |
Joseph Radford |
0:2df78a4443cd | 80 | char s[64]; |
Joseph Radford |
0:2df78a4443cd | 81 | // usb print |
Joseph Radford |
0:2df78a4443cd | 82 | sprintf(s, "Temperature is %4.2f degC\nHumidity is %4.2f pc\nDew point is %4.2f", m_lastResult.lastCelcius, m_lastResult.lastHumidity, m_lastResult.lastDewpoint); |
Joseph Radford |
0:2df78a4443cd | 83 | |
Joseph Radford |
0:2df78a4443cd | 84 | GprsRequest req; |
Joseph Radford |
0:2df78a4443cd | 85 | strcpy(req.message, s); |
Joseph Radford |
0:2df78a4443cd | 86 | strcpy(req.recipients, m_lastSender); |
Joseph Radford |
0:2df78a4443cd | 87 | m_gprs->setRequest(GprsHandler::gprsreq_SmsSend, &req); |
Joseph Radford |
0:2df78a4443cd | 88 | |
Joseph Radford |
0:2df78a4443cd | 89 | // clear the request reqister's sms flag |
Joseph Radford |
0:2df78a4443cd | 90 | m_requestRegister &= ~REQ_SMS; |
Joseph Radford |
0:2df78a4443cd | 91 | } |
Joseph Radford |
0:2df78a4443cd | 92 | mode = meas_CheckRequest; |
Joseph Radford |
0:2df78a4443cd | 93 | break; |
Joseph Radford |
0:2df78a4443cd | 94 | #endif |
Joseph Radford |
0:2df78a4443cd | 95 | |
Joseph Radford |
0:2df78a4443cd | 96 | case meas_PostResult: |
Joseph Radford |
0:2df78a4443cd | 97 | if (m_requestRegister&REQ_RESULT) { |
Joseph Radford |
0:2df78a4443cd | 98 | // we have a result, post it |
Joseph Radford |
0:2df78a4443cd | 99 | |
Joseph Radford |
0:2df78a4443cd | 100 | // TODO: check when the last result came in. if it has not been very long (< 5s? < 1s?) avoid posting, so we don't hammer it |
Joseph Radford |
0:2df78a4443cd | 101 | |
Joseph Radford |
0:2df78a4443cd | 102 | char s[50]; |
Joseph Radford |
0:2df78a4443cd | 103 | // usb print |
Joseph Radford |
0:2df78a4443cd | 104 | sprintf(s, "Temperature is %4.2f degC", m_lastResult.lastCelcius); |
Joseph Radford |
0:2df78a4443cd | 105 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, s); |
Joseph Radford |
0:2df78a4443cd | 106 | sprintf(s, "Humidity is %4.2f pc", m_lastResult.lastHumidity); |
Joseph Radford |
0:2df78a4443cd | 107 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, s); |
Joseph Radford |
0:2df78a4443cd | 108 | sprintf(s, "Dew point is %4.2f ", m_lastResult.lastDewpoint); |
Joseph Radford |
0:2df78a4443cd | 109 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, s); |
Joseph Radford |
0:2df78a4443cd | 110 | |
Joseph Radford |
0:2df78a4443cd | 111 | // post to SD card |
Joseph Radford |
0:2df78a4443cd | 112 | m_sd->setRequest(SdHandler::sdreq_LogData, &m_lastResult); |
Joseph Radford |
0:2df78a4443cd | 113 | |
Joseph Radford |
0:2df78a4443cd | 114 | // clear the request |
Joseph Radford |
0:2df78a4443cd | 115 | m_requestRegister &= ~REQ_RESULT; |
Joseph Radford |
0:2df78a4443cd | 116 | } |
Joseph Radford |
0:2df78a4443cd | 117 | |
Joseph Radford |
0:2df78a4443cd | 118 | // go back to check if there are more requests |
Joseph Radford |
0:2df78a4443cd | 119 | mode = meas_CheckRequest; |
Joseph Radford |
0:2df78a4443cd | 120 | break; |
Joseph Radford |
0:2df78a4443cd | 121 | |
Joseph Radford |
0:2df78a4443cd | 122 | |
Joseph Radford |
0:2df78a4443cd | 123 | case meas_PostError: |
Joseph Radford |
0:2df78a4443cd | 124 | if (m_requestRegister&REQ_ERROR) { |
Joseph Radford |
0:2df78a4443cd | 125 | // there is an error, check the value of it and post the corresponding string to USB |
Joseph Radford |
0:2df78a4443cd | 126 | // TODO: post to SD syslog |
Joseph Radford |
0:2df78a4443cd | 127 | switch (m_lastError) |
Joseph Radford |
0:2df78a4443cd | 128 | { |
Joseph Radford |
0:2df78a4443cd | 129 | case BUS_BUSY: |
Joseph Radford |
0:2df78a4443cd | 130 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"BUSY!"); |
Joseph Radford |
0:2df78a4443cd | 131 | break; |
Joseph Radford |
0:2df78a4443cd | 132 | case ERROR_NOT_PRESENT: |
Joseph Radford |
0:2df78a4443cd | 133 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"NOT PRESENT"); |
Joseph Radford |
0:2df78a4443cd | 134 | break; |
Joseph Radford |
0:2df78a4443cd | 135 | case ERROR_ACK_TOO_LONG: |
Joseph Radford |
0:2df78a4443cd | 136 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"TOO LONG"); |
Joseph Radford |
0:2df78a4443cd | 137 | break; |
Joseph Radford |
0:2df78a4443cd | 138 | case ERROR_SYNC_TIMEOUT: |
Joseph Radford |
0:2df78a4443cd | 139 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"SYNC TIMEOUTr\n"); |
Joseph Radford |
0:2df78a4443cd | 140 | break; |
Joseph Radford |
0:2df78a4443cd | 141 | case ERROR_DATA_TIMEOUT: |
Joseph Radford |
0:2df78a4443cd | 142 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"DATA TIMEOUT"); |
Joseph Radford |
0:2df78a4443cd | 143 | break; |
Joseph Radford |
0:2df78a4443cd | 144 | case ERROR_CHECKSUM: |
Joseph Radford |
0:2df78a4443cd | 145 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"CHECKSUM"); |
Joseph Radford |
0:2df78a4443cd | 146 | break; |
Joseph Radford |
0:2df78a4443cd | 147 | case ERROR_NO_PATIENCE: |
Joseph Radford |
0:2df78a4443cd | 148 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"NO PATIENCE!"); |
Joseph Radford |
0:2df78a4443cd | 149 | break; |
Joseph Radford |
0:2df78a4443cd | 150 | default: |
Joseph Radford |
0:2df78a4443cd | 151 | m_usb->setRequest(UsbComms::usbreq_PrintToTerminalTimestamp, (char*)"UNKNOWN"); |
Joseph Radford |
0:2df78a4443cd | 152 | break; |
Joseph Radford |
0:2df78a4443cd | 153 | } |
Joseph Radford |
0:2df78a4443cd | 154 | |
Joseph Radford |
0:2df78a4443cd | 155 | // we have posted it, clear the flag |
Joseph Radford |
0:2df78a4443cd | 156 | m_requestRegister &= ~REQ_ERROR; |
Joseph Radford |
0:2df78a4443cd | 157 | } |
Joseph Radford |
0:2df78a4443cd | 158 | // check if there are any more requests |
Joseph Radford |
0:2df78a4443cd | 159 | mode = meas_CheckRequest; |
Joseph Radford |
0:2df78a4443cd | 160 | break; |
Joseph Radford |
0:2df78a4443cd | 161 | |
Joseph Radford |
0:2df78a4443cd | 162 | case meas_FlashTimer: |
Joseph Radford |
0:2df78a4443cd | 163 | // flash timer to know that we are still alive. |
Joseph Radford |
0:2df78a4443cd | 164 | if (!m_timer->GetTimer(MyTimers::tmr_MeasFlash)) { // wait until timer has elapsed |
Joseph Radford |
0:2df78a4443cd | 165 | if (m_flashOn) { |
Joseph Radford |
0:2df78a4443cd | 166 | // turn off |
Joseph Radford |
0:2df78a4443cd | 167 | myled4 = 0; |
Joseph Radford |
0:2df78a4443cd | 168 | m_timer->SetTimer(MyTimers::tmr_MeasFlash, 2000); // stay off for 2 seconds |
Joseph Radford |
0:2df78a4443cd | 169 | m_flashOn = false; |
Joseph Radford |
0:2df78a4443cd | 170 | } |
Joseph Radford |
0:2df78a4443cd | 171 | else { |
Joseph Radford |
0:2df78a4443cd | 172 | // turn on |
Joseph Radford |
0:2df78a4443cd | 173 | myled4 = 1; |
Joseph Radford |
0:2df78a4443cd | 174 | m_timer->SetTimer(MyTimers::tmr_MeasFlash, 1000); // stay on for 1 second |
Joseph Radford |
0:2df78a4443cd | 175 | m_flashOn = true; |
Joseph Radford |
0:2df78a4443cd | 176 | } |
Joseph Radford |
0:2df78a4443cd | 177 | |
Joseph Radford |
0:2df78a4443cd | 178 | } |
Joseph Radford |
0:2df78a4443cd | 179 | mode = meas_CheckRequest; |
Joseph Radford |
0:2df78a4443cd | 180 | break; |
Joseph Radford |
0:2df78a4443cd | 181 | |
Joseph Radford |
0:2df78a4443cd | 182 | case meas_WaitError: |
Joseph Radford |
0:2df78a4443cd | 183 | // TODO: timer |
Joseph Radford |
0:2df78a4443cd | 184 | mode = meas_Start; |
Joseph Radford |
0:2df78a4443cd | 185 | break; |
Joseph Radford |
0:2df78a4443cd | 186 | } |
Joseph Radford |
0:2df78a4443cd | 187 | } |
Joseph Radford |
0:2df78a4443cd | 188 | |
Joseph Radford |
0:2df78a4443cd | 189 | void MeasurementHandler::setRequest(int request, void *data) |
Joseph Radford |
0:2df78a4443cd | 190 | { |
Joseph Radford |
0:2df78a4443cd | 191 | m_lastRequest = (request_t)request; |
Joseph Radford |
0:2df78a4443cd | 192 | switch(request) { |
Joseph Radford |
0:2df78a4443cd | 193 | case measreq_DhtResult: |
Joseph Radford |
0:2df78a4443cd | 194 | // this should contain time as well |
Joseph Radford |
0:2df78a4443cd | 195 | Dht22Result *result = (Dht22Result*)data; |
Joseph Radford |
0:2df78a4443cd | 196 | |
Joseph Radford |
0:2df78a4443cd | 197 | // copy the structure into our own structure |
Joseph Radford |
0:2df78a4443cd | 198 | m_lastResult = *result; |
Joseph Radford |
0:2df78a4443cd | 199 | |
Joseph Radford |
0:2df78a4443cd | 200 | // set the request |
Joseph Radford |
0:2df78a4443cd | 201 | m_requestRegister |= REQ_RESULT; |
Joseph Radford |
0:2df78a4443cd | 202 | |
Joseph Radford |
0:2df78a4443cd | 203 | break; |
Joseph Radford |
0:2df78a4443cd | 204 | |
Joseph Radford |
0:2df78a4443cd | 205 | case measreq_DhtError: |
Joseph Radford |
0:2df78a4443cd | 206 | int *iResult = (int*)data; |
Joseph Radford |
0:2df78a4443cd | 207 | m_lastError = *iResult; |
Joseph Radford |
0:2df78a4443cd | 208 | m_requestRegister |= REQ_ERROR; |
Joseph Radford |
0:2df78a4443cd | 209 | |
Joseph Radford |
0:2df78a4443cd | 210 | break; |
Joseph Radford |
0:2df78a4443cd | 211 | |
Joseph Radford |
0:2df78a4443cd | 212 | #ifdef ENABLE_GPRS_TESTING |
Joseph Radford |
0:2df78a4443cd | 213 | case measreq_Status: |
Joseph Radford |
0:2df78a4443cd | 214 | // need to send SMS of last result |
Joseph Radford |
0:2df78a4443cd | 215 | // the sender's number is the sent data |
Joseph Radford |
0:2df78a4443cd | 216 | char *sender = (char*)data; |
Joseph Radford |
0:2df78a4443cd | 217 | |
Joseph Radford |
0:2df78a4443cd | 218 | int i = 0; |
Joseph Radford |
0:2df78a4443cd | 219 | // copy the sender's number |
Joseph Radford |
0:2df78a4443cd | 220 | for (i = 0; (i < GPRS_RECIPIENTS_MAXLEN) && (sender[i] != 0); i++) { |
Joseph Radford |
0:2df78a4443cd | 221 | m_lastSender[i] = sender[i]; |
Joseph Radford |
0:2df78a4443cd | 222 | } |
Joseph Radford |
0:2df78a4443cd | 223 | |
Joseph Radford |
0:2df78a4443cd | 224 | // set the rest of the destination array to null |
Joseph Radford |
0:2df78a4443cd | 225 | for (i; i < GPRS_RECIPIENTS_MAXLEN; i++) { |
Joseph Radford |
0:2df78a4443cd | 226 | m_lastSender[i] = 0; |
Joseph Radford |
0:2df78a4443cd | 227 | } |
Joseph Radford |
0:2df78a4443cd | 228 | |
Joseph Radford |
0:2df78a4443cd | 229 | // set the request |
Joseph Radford |
0:2df78a4443cd | 230 | m_requestRegister |= REQ_SMS; |
Joseph Radford |
0:2df78a4443cd | 231 | break; |
Joseph Radford |
0:2df78a4443cd | 232 | #endif |
Joseph Radford |
0:2df78a4443cd | 233 | } |
Joseph Radford |
0:2df78a4443cd | 234 | } |