From e6ba94d9e3ef984157b9808b0b0e4a5021479dca Mon Sep 17 00:00:00 2001 From: Pablo2048 Date: Sat, 2 Sep 2023 12:02:37 +0200 Subject: [PATCH] Aktualizace varovani z clang-tidy, prace na RING (zatim neuspesna...) --- src/DTE.h | 231 +++++++-------- src/ThreadedGSM.h | 713 +++++++++++++++++++++++----------------------- 2 files changed, 479 insertions(+), 465 deletions(-) diff --git a/src/DTE.h b/src/DTE.h index 072bf84..a20dc54 100644 --- a/src/DTE.h +++ b/src/DTE.h @@ -1,120 +1,125 @@ /* -* DTE.h -* -* Created: 20/09/2016 15:40:51 -* Author: Neta Yahav -*/ + * DTE.h + * + * Created: 20/09/2016 15:40:51 + * Author: Neta Yahav + */ #pragma once #include -class DTE -{ -public: - enum CommandResult - { - EXPECT_BUSY, - EXPECT_TIMEOUT, - EXPECT_DELAY, - EXPECT_RESULT, +class DTE { + public: + enum CommandResult { + EXPECT_BUSY, + EXPECT_TIMEOUT, + EXPECT_DELAY, + EXPECT_RESULT, EXPECT_RING - }; + }; -private: - String buffer; - Stream& stream; - unsigned int bufferIndex; - unsigned int bufferSize; - String response[3]; - unsigned long timeout; - unsigned long tick; - unsigned int match; - CommandResult result; + private: + String buffer; + Stream & stream; + unsigned int bufferIndex; + unsigned int bufferSize; + String response[3]; + unsigned long timeout; + unsigned long tick; + unsigned int match; + CommandResult result; -public: - DTE(Stream& stream, unsigned int size) - : stream(stream) - , bufferSize(size) - , result(EXPECT_RESULT) { - buffer.reserve(size); - } + public: + DTE(Stream & stream, unsigned int size) + : stream(stream), bufferSize(size), result(EXPECT_RESULT) + { + buffer.reserve(size); + } - ~DTE() {}; + ~DTE() = default; - void SendCommand(const char* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0) { - match = 0; - result = EXPECT_BUSY; - response[0] = response1; - response[1] = response2; - response[2] = response3; - this->timeout = timeout; + void SendCommand(const char * command, unsigned long timeout, const char * response1, const char * response2 = 0, const char * response3 = 0) + { + match = 0; + result = EXPECT_BUSY; + response[0] = response1; + response[1] = response2; + response[2] = response3; + this->timeout = timeout; flush(); - stream.print(command); - buffer = ""; - tick = millis(); - proccess(); - } + stream.print(command); + buffer = ""; + tick = millis(); + proccess(); + } - void SendCommand(const __FlashStringHelper* command, unsigned long timeout, const char* response1, const char* response2 = 0, const char* response3 = 0) { + void SendCommand(const __FlashStringHelper * command, unsigned long timeout, const char * response1, const char * response2 = 0, const char * response3 = 0) + { - match = 0; - result = EXPECT_BUSY; - response[0] = response1; - response[1] = response2; - response[2] = response3; - this->timeout = timeout; - // clear rx buffer + match = 0; + result = EXPECT_BUSY; + response[0] = response1; + response[1] = response2; + response[2] = response3; + this->timeout = timeout; + // clear rx buffer flush(); - // send command - stream.print((const __FlashStringHelper *)command); - buffer = ""; - tick = millis(); - proccess(); - } + // send command + stream.print((const __FlashStringHelper *) command); + buffer = ""; + tick = millis(); + proccess(); + } - void Delay(unsigned long delay) { - timeout = delay; - result = EXPECT_DELAY; - tick = millis(); - proccess(); - } + void Delay(unsigned long delay) + { + timeout = delay; + result = EXPECT_DELAY; + tick = millis(); + proccess(); + } - bool getIsBusy(void) { - proccess(); - return (result == EXPECT_BUSY) || (result == EXPECT_DELAY); - } + bool getIsBusy() + { + proccess(); + return (result == EXPECT_BUSY) || (result == EXPECT_DELAY); + } - CommandResult getResult(void) { + CommandResult getResult() + { return result; } - unsigned int getMatch(void) { + unsigned int getMatch() const + { return match; } - String& getBuffer(void) { + String & getBuffer() + { return buffer; } -private: - - void flush(void) { + private: + void flush() + { // clear rx buffer while (stream.available()) { stream.read(); } } - void proccess(void) { - if (result == EXPECT_DELAY) { - if(millis() - tick >= timeout) - result = EXPECT_RESULT; + void proccess() + { + if (result == EXPECT_DELAY) { + if (millis() - tick >= timeout) + result = EXPECT_RESULT; - return; - } + return; + } - if (result != EXPECT_BUSY) { + if (result != EXPECT_BUSY) { if (stream.available()) { char c; @@ -130,36 +135,36 @@ private: return; } - char c; - unsigned long now = millis(); + char c; + unsigned long now = millis(); - while (millis() - tick < timeout) { - while (stream.available() && (buffer.length() < bufferSize)) { - c = stream.read(); - buffer += c; - if (buffer.endsWith(response[0])) { - match = 0; - result = EXPECT_RESULT; - return; - } else if (response[1].length() != 0) { - if (buffer.endsWith(response[1])) { - match = 1; - result = EXPECT_RESULT; - return; - } - } else if (response[2].length() != 0) { - if (buffer.endsWith(response[2])) { - match = 2; - result = EXPECT_RESULT; - return; - } - } - } - if (millis() - now > 5) - return; - } + while (millis() - tick < timeout) { + while (stream.available() && (buffer.length() < bufferSize)) { + c = stream.read(); + buffer += c; + if (buffer.endsWith(response[0])) { + match = 0; + result = EXPECT_RESULT; + return; + } else if (response[1].length() != 0) { + if (buffer.endsWith(response[1])) { + match = 1; + result = EXPECT_RESULT; + return; + } + } else if (response[2].length() != 0) { + if (buffer.endsWith(response[2])) { + match = 2; + result = EXPECT_RESULT; + return; + } + } + } + if (millis() - now > 5) + return; + } - // time out - result = EXPECT_TIMEOUT; - } -}; //DTE + // time out + result = EXPECT_TIMEOUT; + } +}; // DTE diff --git a/src/ThreadedGSM.h b/src/ThreadedGSM.h index 17f4caa..0828bb2 100644 --- a/src/ThreadedGSM.h +++ b/src/ThreadedGSM.h @@ -1,51 +1,49 @@ /* -* ThreadedGSM.h -* -* Created: 20/09/2016 11:14:02 -* Author: Neta Yahav -*/ + * ThreadedGSM.h + * + * Created: 20/09/2016 11:14:02 + * Author: Neta Yahav + */ #pragma once -#include #include "DTE.h" +#include // Defaults -#define THREADEDGSM_DEF_DTE_BUF_SIZ 512 -#define THREADEDGSM_DEF_AT_TIMEOUT 5000 -#define THREADEDGSM_DEF_STA_PON 10000 -#define THREADEDGSM_DEF_STA_POF 1000 +#define THREADEDGSM_DEF_DTE_BUF_SIZ 512 +#define THREADEDGSM_DEF_AT_TIMEOUT 5000 +#define THREADEDGSM_DEF_STA_PON 10000 +#define THREADEDGSM_DEF_STA_POF 1000 // Use custom values or default ones #ifndef THREADEDGSM_DTE_BUFFER_SIZE -# define THREADEDGSM_DTE_BUFFER_SIZE THREADEDGSM_DEF_DTE_BUF_SIZ + #define THREADEDGSM_DTE_BUFFER_SIZE THREADEDGSM_DEF_DTE_BUF_SIZ #endif #ifndef THREADEDGSM_AT_TIMEOUT -# define THREADEDGSM_AT_TIMEOUT THREADEDGSM_DEF_AT_TIMEOUT + #define THREADEDGSM_AT_TIMEOUT THREADEDGSM_DEF_AT_TIMEOUT #endif #ifndef THREADEDGSM_STARTUP_DELAY -# define THREADEDGSM_STARTUP_DELAY THREADEDGSM_DEF_STA_PON + #define THREADEDGSM_STARTUP_DELAY THREADEDGSM_DEF_STA_PON #endif #ifndef THREADEDGSM_STARTUP_POWER_OFF_DELAY -# define THREADEDGSM_STARTUP_POWER_OFF_DELAY THREADEDGSM_DEF_STA_POF + #define THREADEDGSM_STARTUP_POWER_OFF_DELAY THREADEDGSM_DEF_STA_POF #endif -#define THREADEDGSM_INTERVAL_COUNT 4 +#define THREADEDGSM_INTERVAL_COUNT 4 #ifdef THREADEDGSM_DEBUG -# define DEBUG_PRINT(x) THREADEDGSM_DEBUG.print (x) -# define DEBUG_PRINTLN(x) THREADEDGSM_DEBUG.println (x) + #define DEBUG_PRINT(x) THREADEDGSM_DEBUG.print(x) + #define DEBUG_PRINTLN(x) THREADEDGSM_DEBUG.println(x) #else -# define DEBUG_PRINT(x) -# define DEBUG_PRINTLN(x) + #define DEBUG_PRINT(x) + #define DEBUG_PRINTLN(x) #endif -class ThreadedGSM -{ -//variables -public: - struct NetworkTime - { +class ThreadedGSM { + // variables + public: + struct NetworkTime { int year; int month; int day; @@ -62,41 +60,36 @@ public: READ_TYPE_ALL = 4 }; - enum IntervalSourceE - { + enum IntervalSourceE { INTERVAL_CLOCK, INTERVAL_INBOX, INTERVAL_SIGNAL, INTERVAL_BATTERY }; - struct SignalLevel - { + struct SignalLevel { int Dbm; int Value; }; - struct BatteryInfo - { + struct BatteryInfo { int Percent; int Voltage; }; - struct SMSInfo - { + struct SMSInfo { String Number; String Text; }; - typedef void (*ThreadedGSMCallbackSignal)(ThreadedGSM&, SignalLevel&); - typedef void (*ThreadedGSMCallbackClock)(ThreadedGSM&, NetworkTime&); - typedef void (*ThreadedGSMCallbackBattery)(ThreadedGSM&, BatteryInfo&); - typedef void (*ThreadedGSMCallbackIncomingSMS)(ThreadedGSM&, SMSInfo&); - typedef void (*ThreadedGSMCallbackBool)(ThreadedGSM&, bool); - typedef void (*ThreadedGSMCallback)(ThreadedGSM&); - typedef void (*ThreadedGSMCallbackRing)(ThreadedGSM&, String&); - struct conf - { + typedef void (*ThreadedGSMCallbackSignal)(ThreadedGSM &, SignalLevel &); + typedef void (*ThreadedGSMCallbackClock)(ThreadedGSM &, NetworkTime &); + typedef void (*ThreadedGSMCallbackBattery)(ThreadedGSM &, BatteryInfo &); + typedef void (*ThreadedGSMCallbackIncomingSMS)(ThreadedGSM &, SMSInfo &); + typedef void (*ThreadedGSMCallbackBool)(ThreadedGSM &, bool); + typedef void (*ThreadedGSMCallback)(ThreadedGSM &); + typedef void (*ThreadedGSMCallbackRing)(ThreadedGSM &, String &); + struct conf { ThreadedGSMCallbackSignal signal; ThreadedGSMCallbackClock clock; ThreadedGSMCallbackIncomingSMS incoming; @@ -106,10 +99,10 @@ public: ThreadedGSMCallbackBattery battery; ThreadedGSMCallbackRing ring; }; -protected: -private: - enum StatesStartup - { + + protected: + private: + enum StatesStartup { STARTUP_POWER_OFF, STARTUP_POWER_OFF_DELAY, STARTUP_POWER_ON, @@ -121,26 +114,22 @@ private: STARTUP_CHK_CENG }; - enum StatesClock - { + enum StatesClock { CLOCK_REQ, CLOCK_VERIFY }; - enum StatesSignal - { + enum StatesSignal { SIGNAL_REQ, SIGNAL_VERIFY }; - enum StatesBattry - { + enum StatesBattry { BATTERY_REQ, BATTERY_VERIFY }; - enum StatesInbox - { + enum StatesInbox { READ_REQ, READ_CHK_CMGF, READ_CHK_CPMS, @@ -151,16 +140,14 @@ private: READ_CHK_CMGD }; - enum StatesOutbox - { + enum StatesOutbox { SEND_REQ, SEND_CHK_CMGF, SEND_CHK_RDY, SEND_CHK_OK }; - enum StatesCheckRing - { + enum StatesCheckRing { RING_WAIT, RING_CHK, }; @@ -175,18 +162,17 @@ private: SMSInfo SMSi; // Inbox SMS (incoming) SMSInfo SMSo; // Outbox SMS (outgoing) - Stream& stream; + Stream & stream; DTE dte; unsigned long tickSync[THREADEDGSM_INTERVAL_COUNT]; unsigned long Intervals[THREADEDGSM_INTERVAL_COUNT]; // callbacks -// conf configuration = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; + // conf configuration = {nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; conf configuration{0}; - enum ReqTypes - { + enum ReqTypes { REQ_CLOCK = 1, REQ_SIG = 2, REQ_INBOX = 4, @@ -198,44 +184,47 @@ private: int state; int job; int ringState; -//functions -public: - ThreadedGSM(Stream& stream) - : stream(stream) - , dte(stream, THREADEDGSM_DTE_BUFFER_SIZE) - , ringState(RING_WAIT) + // functions + public: + ThreadedGSM(Stream & stream) + : stream(stream), dte(stream, THREADEDGSM_DTE_BUFFER_SIZE), ringState(RING_WAIT) { - for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++) - Intervals[i] = 0; + for (unsigned long & Interval : Intervals) + Interval = 0; job = state = requests = 0; - //SMSo.Text.reserve(150); - //SMSi.Text.reserve(150); + // SMSo.Text.reserve(150); + // SMSi.Text.reserve(150); } - ~ThreadedGSM() {}; + ~ThreadedGSM() = default; - void nextJob(void) { + void nextJob() + { job = 0; } - void setHandlers(conf config) { + void setHandlers(conf config) + { this->configuration = config; } - void setInterval(IntervalSourceE source, unsigned long interval) { + void setInterval(IntervalSourceE source, unsigned long interval) + { Intervals[source] = interval; tickSync[source] = millis(); } // Initialization - void begin(void) { + void begin() + { requests = (REQ_STARTUP); } // Call this function for executing thread - void loop(void) { + void loop() + { if (dte.getIsBusy()) return; @@ -244,21 +233,21 @@ public: if (Intervals[i]) { if (millis() - tickSync[i] >= Intervals[i]) { switch (i) { - case INTERVAL_CLOCK: - requests |= REQ_CLOCK; - break; + case INTERVAL_CLOCK: + requests |= REQ_CLOCK; + break; - case INTERVAL_INBOX: - requests |= REQ_INBOX; - break; + case INTERVAL_INBOX: + requests |= REQ_INBOX; + break; - case INTERVAL_SIGNAL: - requests |= REQ_SIG; - break; + case INTERVAL_SIGNAL: + requests |= REQ_SIG; + break; - case INTERVAL_BATTERY: - requests |= REQ_BATTERY; - break; + case INTERVAL_BATTERY: + requests |= REQ_BATTERY; + break; } tickSync[i] = millis(); } @@ -300,107 +289,110 @@ public: Outbox(); else if (job == REQ_BATTERY) Battery(); - else CheckRing(); + else + CheckRing(); } // Requests - void sendSMS(String& Number, String& Text) { + void sendSMS(String & Number, String & Text) + { requests |= (REQ_OUTBOX); SMSo.Number = Number; SMSo.Text = Text; } - void sendSMS(String& Number, char *Text) { + void sendSMS(String & Number, const char * Text) + { String t = Text; sendSMS(Number, t); } -protected: -private: - + protected: + private: // States - void Startup(void) { + void Startup() + { int lastState = state; switch (state) { - case STARTUP_POWER_OFF: - if (this->configuration.power != NULL) - this->configuration.power(*this, false); - tick = millis(); - state = STARTUP_POWER_OFF_DELAY; - break; + case STARTUP_POWER_OFF: + if (this->configuration.power != nullptr) + this->configuration.power(*this, false); + tick = millis(); + state = STARTUP_POWER_OFF_DELAY; + break; - case STARTUP_POWER_OFF_DELAY: - if (millis() - tick >= THREADEDGSM_STARTUP_POWER_OFF_DELAY) - state = STARTUP_POWER_ON; - break; + case STARTUP_POWER_OFF_DELAY: + if (millis() - tick >= THREADEDGSM_STARTUP_POWER_OFF_DELAY) + state = STARTUP_POWER_ON; + break; - case STARTUP_POWER_ON: - if (this->configuration.power != NULL) - this->configuration.power(*this, true); - // begin delay - tick = millis(); - state = STARTUP_DELAY; - break; + case STARTUP_POWER_ON: + if (this->configuration.power != nullptr) + this->configuration.power(*this, true); + // begin delay + tick = millis(); + state = STARTUP_DELAY; + break; - case STARTUP_DELAY: - if (millis() - tick >= THREADEDGSM_STARTUP_DELAY) { - dte.SendCommand(F("AT\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = STARTUP_ENTER_AT; - } - break; + case STARTUP_DELAY: + if (millis() - tick >= THREADEDGSM_STARTUP_DELAY) { + dte.SendCommand(F("AT\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = STARTUP_ENTER_AT; + } + break; - case STARTUP_ENTER_AT: - if (dte.getResult() == DTE::EXPECT_RESULT) { - dte.SendCommand(F("AT+CPIN?\r"), 10000, "OK\r"); - state = STARTUP_CHK_CPIN; - } else { - state = STARTUP_POWER_OFF; - } - break; - - case STARTUP_CHK_CPIN: - if (dte.getResult() == DTE::EXPECT_RESULT) { - if (dte.getBuffer().indexOf(F("+CPIN: READY")) != -1) { - dte.SendCommand(F("AT+CREG?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = STARTUP_CHK_CREG; + case STARTUP_ENTER_AT: + if (dte.getResult() == DTE::EXPECT_RESULT) { + dte.SendCommand(F("AT+CPIN?\r"), 10000, "OK\r"); + state = STARTUP_CHK_CPIN; } else { state = STARTUP_POWER_OFF; } - } else - state = STARTUP_POWER_OFF; - break; + break; - case STARTUP_CHK_CREG: - if (dte.getResult() == DTE::EXPECT_RESULT) { - if ((dte.getBuffer().indexOf(F(",1")) >= 0) || (dte.getBuffer().indexOf(F(",5")) >= 0)) { - dte.SendCommand(F("AT+CLTS=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = STARTUP_CHK_CLTS; + case STARTUP_CHK_CPIN: + if (dte.getResult() == DTE::EXPECT_RESULT) { + if (dte.getBuffer().indexOf(F("+CPIN: READY")) != -1) { + dte.SendCommand(F("AT+CREG?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = STARTUP_CHK_CREG; + } else { + state = STARTUP_POWER_OFF; + } } else state = STARTUP_POWER_OFF; - } else - state = STARTUP_POWER_OFF; - break; + break; - case STARTUP_CHK_CLTS: - if (dte.getResult() == DTE::EXPECT_RESULT) { - dte.SendCommand(F("AT+CENG=3\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = STARTUP_CHK_CENG; - } else - state = STARTUP_POWER_OFF; - break; + case STARTUP_CHK_CREG: + if (dte.getResult() == DTE::EXPECT_RESULT) { + if ((dte.getBuffer().indexOf(F(",1")) >= 0) || (dte.getBuffer().indexOf(F(",5")) >= 0)) { + dte.SendCommand(F("AT+CLTS=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = STARTUP_CHK_CLTS; + } else + state = STARTUP_POWER_OFF; + } else + state = STARTUP_POWER_OFF; + break; - case STARTUP_CHK_CENG: - if (dte.getResult() == DTE::EXPECT_RESULT) { - requests |= ((REQ_CLOCK) | (REQ_SIG) | (REQ_BATTERY)); - clearReq(REQ_STARTUP); - for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++) - tickSync[i] = millis(); - if (this->configuration.ready != NULL) - this->configuration.ready(*this); - } else - state = STARTUP_POWER_OFF; - break; + case STARTUP_CHK_CLTS: + if (dte.getResult() == DTE::EXPECT_RESULT) { + dte.SendCommand(F("AT+CENG=3\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = STARTUP_CHK_CENG; + } else + state = STARTUP_POWER_OFF; + break; + + case STARTUP_CHK_CENG: + if (dte.getResult() == DTE::EXPECT_RESULT) { + requests |= ((REQ_CLOCK) | (REQ_SIG) | (REQ_BATTERY)); + clearReq(REQ_STARTUP); + for (int i = 0; i < THREADEDGSM_INTERVAL_COUNT; i++) + tickSync[i] = millis(); + if (this->configuration.ready != nullptr) + this->configuration.ready(*this); + } else + state = STARTUP_POWER_OFF; + break; } if (state != lastState) { DEBUG_PRINT(F("STARTUP_STATE: ")); @@ -409,44 +401,46 @@ private: } // Threads - void Clock(void) { + void Clock(void) + { String clockTime; int lastState = state; switch (state) { - case CLOCK_REQ: - dte.SendCommand(F("AT+CCLK?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = CLOCK_VERIFY; - break; + case CLOCK_REQ: + dte.SendCommand(F("AT+CCLK?\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = CLOCK_VERIFY; + break; - case CLOCK_VERIFY: - int index = dte.getBuffer().indexOf(F("+CCLK: ")); - if (index >= 0) { - // parse clock - index += 8; - int endindex; - endindex = dte.getBuffer().indexOf(F("+"), index); - if (endindex >= 0) - clockTime = dte.getBuffer().substring(index, endindex); - else { - endindex = dte.getBuffer().indexOf(F("-"), index); + case CLOCK_VERIFY: + int index = dte.getBuffer().indexOf(F("+CCLK: ")); + if (index >= 0) { + // parse clock + index += 8; + int endindex; + endindex = dte.getBuffer().indexOf(F("+"), index); if (endindex >= 0) clockTime = dte.getBuffer().substring(index, endindex); - } + else { + endindex = dte.getBuffer().indexOf(F("-"), index); + if (endindex >= 0) + clockTime = dte.getBuffer().substring(index, endindex); + } - if (endindex >= 0) { - NetworkTime ClockTime; - ClockTime.year = 2000 + clockTime.substring(0, 2).toInt(); - ClockTime.month = clockTime.substring(3, 5).toInt(); - ClockTime.day = clockTime.substring(6, 8).toInt(); - ClockTime.hour = clockTime.substring(9, 11).toInt(); - ClockTime.minute = clockTime.substring(12, 14).toInt(); - ClockTime.second = clockTime.substring(15, 17).toInt(); - if (this->configuration.clock != NULL) - this->configuration.clock(*this, ClockTime); + if (endindex >= 0) { + NetworkTime ClockTime{}; + + ClockTime.year = 2000 + clockTime.substring(0, 2).toInt(); + ClockTime.month = clockTime.substring(3, 5).toInt(); + ClockTime.day = clockTime.substring(6, 8).toInt(); + ClockTime.hour = clockTime.substring(9, 11).toInt(); + ClockTime.minute = clockTime.substring(12, 14).toInt(); + ClockTime.second = clockTime.substring(15, 17).toInt(); + if (this->configuration.clock != nullptr) + this->configuration.clock(*this, ClockTime); + } } - } - clearReq(REQ_CLOCK); - break; + clearReq(REQ_CLOCK); + break; } if (state != lastState) { DEBUG_PRINT(F("CLOCK_STATE: ")); @@ -454,29 +448,30 @@ private: } } - void Signal(void) { + void Signal() + { int lastState = state; switch (state) { - case SIGNAL_REQ: - dte.SendCommand(F("AT+CSQ\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = SIGNAL_VERIFY; - break; + case SIGNAL_REQ: + dte.SendCommand(F("AT+CSQ\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = SIGNAL_VERIFY; + break; - case SIGNAL_VERIFY: - int index = dte.getBuffer().indexOf(F("+CSQ: ")); - if (index >= 0) { - // parse signal - index += 6; - SignalLevel GsmSignal; - GsmSignal.Value = dte.getBuffer().substring(index, index + 2).toInt(); - GsmSignal.Dbm = dte.getBuffer().substring(index + 3, index + 5).toInt(); - if (GsmSignal.Value != 0) { - if (this->configuration.signal != NULL) - this->configuration.signal(*this, GsmSignal); + case SIGNAL_VERIFY: + int index = dte.getBuffer().indexOf(F("+CSQ: ")); + if (index >= 0) { + // parse signal + index += 6; + SignalLevel GsmSignal{}; + GsmSignal.Value = dte.getBuffer().substring(index, index + 2).toInt(); + GsmSignal.Dbm = dte.getBuffer().substring(index + 3, index + 5).toInt(); + if (GsmSignal.Value != 0) { + if (this->configuration.signal != nullptr) + this->configuration.signal(*this, GsmSignal); + } } - } - clearReq(REQ_SIG); - break; + clearReq(REQ_SIG); + break; } if (state != lastState) { DEBUG_PRINT(F("SIGNAL_STATE: ")); @@ -484,30 +479,31 @@ private: } } - void Battery(void) { + void Battery() + { int lastState = state; switch (state) { - case BATTERY_REQ: - dte.SendCommand(F("AT+CBC\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = BATTERY_VERIFY; - break; + case BATTERY_REQ: + dte.SendCommand(F("AT+CBC\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = BATTERY_VERIFY; + break; - case BATTERY_VERIFY: - int index = dte.getBuffer().indexOf(F("+CBC:")); - if (index >= 0) { - BatteryInfo BattInfo; - // parse battery level - String buffer = dte.getBuffer().substring(index); - String buffer2 = buffer.substring(buffer.indexOf(F(",")) + 1); - buffer = buffer2; - BattInfo.Percent = buffer2.substring(0, buffer2.indexOf(F(","))).toInt(); // converts the result to interger - buffer2 = buffer.substring(buffer.indexOf(F(",")) + 1); - BattInfo.Voltage = buffer2.substring(0, buffer2.indexOf(F("\r"))).toInt(); // converts the result to interger - if (this->configuration.battery != NULL) - this->configuration.battery(*this, BattInfo); - } - clearReq(REQ_BATTERY); - break; + case BATTERY_VERIFY: + int index = dte.getBuffer().indexOf(F("+CBC:")); + if (index >= 0) { + BatteryInfo BattInfo{}; + // parse battery level + String buffer = dte.getBuffer().substring(index); + String buffer2 = buffer.substring(buffer.indexOf(F(",")) + 1); + buffer = buffer2; + BattInfo.Percent = buffer2.substring(0, buffer2.indexOf(F(","))).toInt(); // converts the result to interger + buffer2 = buffer.substring(buffer.indexOf(F(",")) + 1); + BattInfo.Voltage = buffer2.substring(0, buffer2.indexOf(F("\r"))).toInt(); // converts the result to interger + if (this->configuration.battery != nullptr) + this->configuration.battery(*this, BattInfo); + } + clearReq(REQ_BATTERY); + break; } if (state != lastState) { DEBUG_PRINT(F("BATTERY_STATE: ")); @@ -515,110 +511,112 @@ private: } } - void clearReq(int req) { + void clearReq(int req) + { requests &= ~(req); nextJob(); } - void Inbox(void) { + void Inbox() + { String CMD; int lastState = state; switch (state) { - case READ_REQ: - SMSi.Text = ""; - SMSi.Number = ""; - dte.SendCommand(F("AT+CMGF=0\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Message format set as PDU - state = READ_CHK_CMGF; - break; + case READ_REQ: + SMSi.Text = ""; + SMSi.Number = ""; + dte.SendCommand(F("AT+CMGF=0\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Message format set as PDU + state = READ_CHK_CMGF; + break; - case READ_CHK_CMGF: - if (dte.getResult() == DTE::EXPECT_RESULT) { - dte.SendCommand(F("AT+CPMS=\"SM\"\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SIM Message storage - state = READ_CHK_CPMS; - } - else clearReq(REQ_INBOX); - break; + case READ_CHK_CMGF: + if (dte.getResult() == DTE::EXPECT_RESULT) { + dte.SendCommand(F("AT+CPMS=\"SM\"\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SIM Message storage + state = READ_CHK_CPMS; + } else + clearReq(REQ_INBOX); + break; - case READ_CHK_CPMS: - if (dte.getResult() == DTE::EXPECT_RESULT) { - CMD = F("AT+CMGL="); // Read all SMS messages - CMD += (int) READ_TYPE_ALL; - CMD += "\r"; - dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, ","); - state = READ_CHK_CMGL; - } - else clearReq(REQ_INBOX); - break; + case READ_CHK_CPMS: + if (dte.getResult() == DTE::EXPECT_RESULT) { + CMD = F("AT+CMGL="); // Read all SMS messages + CMD += (int) READ_TYPE_ALL; + CMD += "\r"; + dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, ","); + state = READ_CHK_CMGL; + } else + clearReq(REQ_INBOX); + break; - case READ_CHK_CMGL: - if (dte.getResult() == DTE::EXPECT_RESULT) { - //fetch index - int indexStart = dte.getBuffer().indexOf(F("+CMGL: ")); - if (indexStart >= 0) { - Message.Index = dte.getBuffer().substring(indexStart + 7, dte.getBuffer().indexOf(F(","))).toInt(); - if (Message.Index != 0) { - dte.Delay(2000); - state = READ_DELAY_CLEAR_BUFF; + case READ_CHK_CMGL: + if (dte.getResult() == DTE::EXPECT_RESULT) { + // fetch index + int indexStart = dte.getBuffer().indexOf(F("+CMGL: ")); + if (indexStart >= 0) { + Message.Index = dte.getBuffer().substring(indexStart + 7, dte.getBuffer().indexOf(F(","))).toInt(); + if (Message.Index != 0) { + dte.Delay(2000); + state = READ_DELAY_CLEAR_BUFF; + } } } - } - if (state != READ_DELAY_CLEAR_BUFF) - clearReq(REQ_INBOX); + if (state != READ_DELAY_CLEAR_BUFF) + clearReq(REQ_INBOX); - break; + break; - case READ_DELAY_CLEAR_BUFF: - dte.SendCommand(F("AT+CMGF=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Message format set as TEXT - state = READ_TEXT_CMGR; - break; + case READ_DELAY_CLEAR_BUFF: + dte.SendCommand(F("AT+CMGF=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Message format set as TEXT + state = READ_TEXT_CMGR; + break; - case READ_TEXT_CMGR: - if (dte.getResult() == DTE::EXPECT_RESULT) { - CMD = F("AT+CMGR="); // Read the SMS message - CMD += Message.Index; - CMD += "\r"; - dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = READ_CHK_CMGR; - } else - clearReq(REQ_INBOX); - break; + case READ_TEXT_CMGR: + if (dte.getResult() == DTE::EXPECT_RESULT) { + CMD = F("AT+CMGR="); // Read the SMS message + CMD += Message.Index; + CMD += "\r"; + dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = READ_CHK_CMGR; + } else + clearReq(REQ_INBOX); + break; - case READ_CHK_CMGR: - if (dte.getResult() == DTE::EXPECT_RESULT) { - int indexStart = dte.getBuffer().indexOf(F("+CMGR: ")); - if (indexStart >= 0) { - int indexStartPDU = dte.getBuffer().indexOf(F("\r\n"), indexStart); - if (indexStartPDU >= 0) { - indexStartPDU += 2; - int indexEndPDU = dte.getBuffer().indexOf(F("\r"), indexStartPDU); - if (indexEndPDU >= 0) - SMSi.Text = dte.getBuffer().substring(indexStartPDU, indexEndPDU); - } - indexStartPDU = dte.getBuffer().indexOf(F(",\""), indexStart); - if (indexStartPDU >= 0) { - indexStartPDU += 2; - int indexEndPDU = dte.getBuffer().indexOf(F("\","), indexStartPDU); - if (indexEndPDU >= 0) - SMSi.Number = dte.getBuffer().substring(indexStartPDU, indexEndPDU); + case READ_CHK_CMGR: + if (dte.getResult() == DTE::EXPECT_RESULT) { + int indexStart = dte.getBuffer().indexOf(F("+CMGR: ")); + if (indexStart >= 0) { + int indexStartPDU = dte.getBuffer().indexOf(F("\r\n"), indexStart); + if (indexStartPDU >= 0) { + indexStartPDU += 2; + int indexEndPDU = dte.getBuffer().indexOf(F("\r"), indexStartPDU); + if (indexEndPDU >= 0) + SMSi.Text = dte.getBuffer().substring(indexStartPDU, indexEndPDU); + } + indexStartPDU = dte.getBuffer().indexOf(F(",\""), indexStart); + if (indexStartPDU >= 0) { + indexStartPDU += 2; + int indexEndPDU = dte.getBuffer().indexOf(F("\","), indexStartPDU); + if (indexEndPDU >= 0) + SMSi.Number = dte.getBuffer().substring(indexStartPDU, indexEndPDU); + } } + CMD = F("AT+CMGD="); // Delete the SMS message + CMD += Message.Index; + CMD += "\r"; + dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r"); + state = READ_CHK_CMGD; + } else + clearReq(REQ_INBOX); + break; + + case READ_CHK_CMGD: + // if( (dte.getResult() == DTE::EXPECT_RESULT) && (SMS.InboxMsgContents != "")) + if (dte.getResult() == DTE::EXPECT_RESULT) { + if (this->configuration.incoming != nullptr) + this->configuration.incoming(*this, SMSi); } - CMD = F("AT+CMGD="); // Delete the SMS message - CMD += Message.Index; - CMD += "\r"; - dte.SendCommand(CMD.c_str(), THREADEDGSM_AT_TIMEOUT, "OK\r"); - state = READ_CHK_CMGD; - } else clearReq(REQ_INBOX); - break; - - case READ_CHK_CMGD: - //if( (dte.getResult() == DTE::EXPECT_RESULT) && (SMS.InboxMsgContents != "")) - if (dte.getResult() == DTE::EXPECT_RESULT) { - if (this->configuration.incoming != NULL) - this->configuration.incoming(*this, SMSi); - } - clearReq(REQ_INBOX); - break; + break; } if (state != lastState) { DEBUG_PRINT(F("INBOX_STATE: ")); @@ -626,44 +624,46 @@ private: } } - void Outbox(void) { + void Outbox() + { String CMD; - //CMD.reserve(200); + // CMD.reserve(200); int lastState = state; switch (state) { - case SEND_REQ: - dte.SendCommand(F("AT+CMGF=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Text mode - state = SEND_CHK_CMGF; - break; + case SEND_REQ: + dte.SendCommand(F("AT+CMGF=1\r"), THREADEDGSM_AT_TIMEOUT, "OK\r"); // SMS Text mode + state = SEND_CHK_CMGF; + break; - case SEND_CHK_CMGF: - if (dte.getResult() == DTE::EXPECT_RESULT) { - CMD = F("AT+CMGS=\""); - CMD += SMSo.Number; - CMD += "\"\r"; - dte.SendCommand(CMD.c_str(), 15000, "> "); - state = SEND_CHK_RDY; - } - else clearReq(REQ_OUTBOX); - break; + case SEND_CHK_CMGF: + if (dte.getResult() == DTE::EXPECT_RESULT) { + CMD = F("AT+CMGS=\""); + CMD += SMSo.Number; + CMD += "\"\r"; + dte.SendCommand(CMD.c_str(), 15000, "> "); + state = SEND_CHK_RDY; + } else + clearReq(REQ_OUTBOX); + break; - case SEND_CHK_RDY: - if (dte.getResult() == DTE::EXPECT_RESULT) { - CMD = SMSo.Text; - CMD += (char)26; - dte.SendCommand(CMD.c_str(), 10000, "OK\r"); - state = SEND_CHK_OK; - } else clearReq(REQ_OUTBOX); - break; + case SEND_CHK_RDY: + if (dte.getResult() == DTE::EXPECT_RESULT) { + CMD = SMSo.Text; + CMD += (char) 26; + dte.SendCommand(CMD.c_str(), 10000, "OK\r"); + state = SEND_CHK_OK; + } else + clearReq(REQ_OUTBOX); + break; - case SEND_CHK_OK: - if (dte.getResult() == DTE::EXPECT_RESULT) { - if (this->configuration.outgoing != NULL) - this->configuration.outgoing(*this); - } - clearReq(REQ_OUTBOX); - break; + case SEND_CHK_OK: + if (dte.getResult() == DTE::EXPECT_RESULT) { + if (this->configuration.outgoing != nullptr) + this->configuration.outgoing(*this); + } + clearReq(REQ_OUTBOX); + break; } if (state != lastState) { DEBUG_PRINT(F("OUTBOX_STATE: ")); @@ -671,7 +671,8 @@ private: } } - void CheckRing(void) { + void CheckRing() + { int lastState = ringState; switch (ringState) { case RING_WAIT: @@ -679,11 +680,19 @@ private: ringState = RING_CHK; } - break; + break; + + case RING_CHK: + if (this->configuration.ring != nullptr) { + String s = "Ring"; + this->configuration.ring(*this, s); + } + ringState = RING_WAIT; + break; } if (ringState != lastState) { DEBUG_PRINT(F("RING_STATE: ")); DEBUG_PRINTLN(ringState); } } -}; //ThreadedGSM +}; // ThreadedGSM