/** * @file TinyGsmTime.tpp * @author Volodymyr Shymanskyy * @license LGPL-3.0 * @copyright Copyright (c) 2016 Volodymyr Shymanskyy * @date Nov 2016 */ #ifndef SRC_TINYGSMTIME_H_ #define SRC_TINYGSMTIME_H_ #include "TinyGsmCommon.h" #define TINY_GSM_MODEM_HAS_TIME enum TinyGSMDateTimeFormat { DATE_FULL = 0, DATE_TIME = 1, DATE_DATE = 2 }; template class TinyGsmTime { public: /* * Time functions */ String getGSMDateTime(TinyGSMDateTimeFormat format) { return thisModem().getGSMDateTimeImpl(format); } bool getNetworkTime(int* year, int* month, int* day, int* hour, int* minute, int* second, float* timezone) { return thisModem().getNetworkTimeImpl(year, month, day, hour, minute, second, timezone); } /* * CRTP Helper */ protected: inline const modemType& thisModem() const { return static_cast(*this); } inline modemType& thisModem() { return static_cast(*this); } /* * Time functions */ protected: String getGSMDateTimeImpl(TinyGSMDateTimeFormat format) { thisModem().sendAT(GF("+CCLK?")); if (thisModem().waitResponse(2000L, GF("+CCLK: \"")) != 1) { return ""; } String res; switch (format) { case DATE_FULL: res = thisModem().stream.readStringUntil('"'); break; case DATE_TIME: thisModem().streamSkipUntil(','); res = thisModem().stream.readStringUntil('"'); break; case DATE_DATE: res = thisModem().stream.readStringUntil(','); break; } return res; } bool getNetworkTimeImpl(int* year, int* month, int* day, int* hour, int* minute, int* second, float* timezone) { thisModem().sendAT(GF("+CCLK?")); if (thisModem().waitResponse(2000L, GF("+CCLK: \"")) != 1) { return false; } int iyear = 0; int imonth = 0; int iday = 0; int ihour = 0; int imin = 0; int isec = 0; int itimezone = 0; // Date & Time iyear = thisModem().streamGetIntBefore('/'); imonth = thisModem().streamGetIntBefore('/'); iday = thisModem().streamGetIntBefore(','); ihour = thisModem().streamGetIntBefore(':'); imin = thisModem().streamGetIntBefore(':'); isec = thisModem().streamGetIntLength(2); char tzSign = thisModem().stream.read(); itimezone = thisModem().streamGetIntBefore('\n'); if (tzSign == '-') { itimezone = itimezone * -1; } // Set pointers if (iyear < 2000) iyear += 2000; if (year != NULL) *year = iyear; if (month != NULL) *month = imonth; if (day != NULL) *day = iday; if (hour != NULL) *hour = ihour; if (minute != NULL) *minute = imin; if (second != NULL) *second = isec; if (timezone != NULL) *timezone = static_cast(itimezone) / 4.0; // Final OK thisModem().waitResponse(); return true; } }; #endif // SRC_TINYGSMTIME_H_