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

Committer:
Joseph Radford
Date:
Sun Apr 10 15:47:33 2016 +1000
Revision:
0:2df78a4443cd
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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 }