Blynk library for embedded hardware. Works with Arduino, ESP8266, Raspberry Pi, Intel Edison/Galileo, LinkIt ONE, Particle Core/Photon, Energia, ARM mbed, etc. http://www.blynk.cc/
Dependents: Blynk_RBL_BLE_Nano Blynk_MicroBit Blynk_Serial Blynk_RBL_BLE_Nano
Diff: WidgetTimeInput.h
- Revision:
- 7:8879692d4e6c
- Child:
- 13:ed6276c0afb7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WidgetTimeInput.h Wed Oct 12 09:18:39 2016 +0300 @@ -0,0 +1,129 @@ +/** + * @file WidgetTimeInput.h + * @author Volodymyr Shymanskyy + * @license This project is released under the MIT License (MIT) + * @copyright Copyright (c) 2015 Volodymyr Shymanskyy + * @date Aug 2016 + * @brief + * + */ + +#ifndef WidgetTimeInput_h +#define WidgetTimeInput_h + +#include <Blynk/BlynkApi.h> +#include <utility/BlynkDateTime.h> +#include <utility/BlynkUtility.h> + +class TimeInputParam +{ +public: + enum TimeMode { + TIME_UNDEFINED, + TIME_SUNSET, + TIME_SUNRISE, + TIME_SPECIFIED + }; + + TimeInputParam(const BlynkParam& param) + { + mStartMode = TIME_UNDEFINED; + mStopMode = TIME_UNDEFINED; + mTZ[0] = '\0'; + mWeekdays = -1; // All set + mTZ_Offset = 0; + + BlynkParam::iterator it = param.begin(); + if (it >= param.end()) + return; + + if (0 == strcmp(it.asStr(), "sr")) { + mStartMode = TIME_SUNRISE; + } else if (0 == strcmp(it.asStr(), "ss")) { + mStartMode = TIME_SUNSET; + } else if (!it.isEmpty()) { + mStart = BlynkTime(it.asLong()); + if (mStart.isValid()) { + mStartMode = TIME_SPECIFIED; + } + } + + if (++it >= param.end()) + return; + + if (0 == strcmp(it.asStr(), "sr")) { + mStopMode = TIME_SUNRISE; + } else if (0 == strcmp(it.asStr(), "ss")) { + mStopMode = TIME_SUNSET; + } else if (!it.isEmpty()) { + mStop = BlynkTime(it.asLong()); + if (mStop.isValid()) { + mStopMode = TIME_SPECIFIED; + } + } + + if (++it >= param.end()) + return; + + strncpy(mTZ, it.asStr(), sizeof(mTZ)); + + if (++it >= param.end()) + return; + + if (!it.isEmpty()) { + mWeekdays = 0; + const char* p = it.asStr(); + + while (int c = *p++) { + if (c >= '1' && c <= '7') { + BlynkBitSet(mWeekdays, c - '1'); + } + } + } + + if (++it >= param.end()) + return; + + mTZ_Offset = it.asLong(); + } + + BlynkTime& getStart() { return mStart; } + BlynkTime& getStop() { return mStop; } + + TimeMode getStartMode() const { return mStartMode; } + TimeMode getStopMode() const { return mStopMode; } + + bool hasStartTime() const { return mStartMode == TIME_SPECIFIED; } + bool isStartSunrise() const { return mStartMode == TIME_SUNRISE; } + bool isStartSunset() const { return mStartMode == TIME_SUNSET; } + int getStartHour() const { return mStart.hour(); } + int getStartMinute() const { return mStart.minute(); } + int getStartSecond() const { return mStart.second(); } + + bool hasStopTime() const { return mStopMode == TIME_SPECIFIED; } + bool isStopSunrise() const { return mStopMode == TIME_SUNRISE; } + bool isStopSunset() const { return mStopMode == TIME_SUNSET; } + int getStopHour() const { return mStop.hour(); } + int getStopMinute() const { return mStop.minute(); } + int getStopSecond() const { return mStop.second(); } + + const char* getTZ() const { return mTZ; } + uint32_t getTZ_Offset() const { return mTZ_Offset; } + + bool isWeekdaySelected(int day) const { + return BlynkBitRead(mWeekdays, (day - 1) % 7); + } + +private: + BlynkTime mStart; + BlynkTime mStop; + char mTZ[32]; + uint32_t mTZ_Offset; + + TimeMode mStopMode; + TimeMode mStartMode; + + uint8_t mWeekdays; +}; + +#endif