#ifndef SCENEANALOGCLOCK_H_ #define SCENEANALOGCLOCK_H_ #include #include #include #include #include "NotificationLEDs.h" template< uint8_t _tpin, uint8_t _trgbwId, uint8_t _tdimmerId, uint8_t _tpowerSwitchId, uint8_t _tcommandId, uint16_t _tpixelCount, unsigned long _msgSendInterval > void NotificationLEDs<_tpin, _trgbwId, _tdimmerId, _tpowerSwitchId, _tcommandId, _tpixelCount, _msgSendInterval> ::analogClock_config() noexcept { auto token = strtok(NULL, _configDelims); if (token && token[0] != ' ') { auto offset = atoi(token); sceneData.analogClock.hourOffset = offset; } token = strtok(NULL, _configDelims); if (token && token[0] != ' ') { bool innerClock = atoi(token); sceneData.analogClock.showInnerClock = innerClock; } sceneData.analogClock.temporaryDisableInnerClock = false; sceneData.analogClock.lastUnixTime = 0; } template< uint8_t _tpin, uint8_t _trgbwId, uint8_t _tdimmerId, uint8_t _tpowerSwitchId, uint8_t _tcommandId, uint16_t _tpixelCount, unsigned long _msgSendInterval > void NotificationLEDs<_tpin, _trgbwId, _tdimmerId, _tpowerSwitchId, _tcommandId, _tpixelCount, _msgSendInterval> ::analogClock_init() noexcept { for (uint8_t i = 0; i < 12; i++) { pixels.setPixelColor(i, 0); } if (sceneData.analogClock.showInnerClock && !sceneData.analogClock.temporaryDisableInnerClock) { for (uint8_t i = 12; i < 16; i++) { pixels.setPixelColor(i, 0); } } pixels.show(); sceneData.analogClock.lastUnixTime = 0; } template< uint8_t _tpin, uint8_t _trgbwId, uint8_t _tdimmerId, uint8_t _tpowerSwitchId, uint8_t _tcommandId, uint16_t _tpixelCount, unsigned long _msgSendInterval > void NotificationLEDs<_tpin, _trgbwId, _tdimmerId, _tpowerSwitchId, _tcommandId, _tpixelCount, _msgSendInterval> ::analogClock_loop(unsigned long currentUnixTime, unsigned long) noexcept { if (sceneData.analogClock.lastUnixTime != currentUnixTime) { auto seconds = currentUnixTime % 60; auto _tmp = currentUnixTime / 60; auto minutes = _tmp % 60; auto hours = (_tmp / 60 + sceneData.analogClock.hourOffset) % 12; auto p_h = (11 - hours) % 12; auto p_m = (11 - minutes/5) % 12; auto p_m2 = minutes % 5; auto p_s = (11 - seconds/5) % 12; auto p_s2 = seconds % 5; /*Serial.print("Time: "); Serial.print(hours); Serial.print(":"); Serial.print(minutes); Serial.print(":"); Serial.println(seconds); Serial.print("Pixels: "); Serial.print(p_h); Serial.print(":"); Serial.print(p_m); Serial.print(":"); Serial.println(p_s);*/ for (uint8_t i = 0; i < 12; i++) { uint32_t c = 0; if (i == p_h) { // hour => red c |= ((uint32_t)255*(uint32_t)brightness/(uint32_t)100) << 16; } if (i == p_m) { // min => green c |= ((uint32_t)255*(uint32_t)brightness/(uint32_t)100) << 8; } if (i == p_s) { // sec => blue c |= (uint32_t)255*(uint32_t)brightness/(uint32_t)100; } if (c == 0) { c = ((uint32_t)20*(uint32_t)brightness/(uint32_t)100) << 24; } pixels.setPixelColor(i, c); } if (sceneData.analogClock.showInnerClock && !sceneData.analogClock.temporaryDisableInnerClock) { for (uint8_t i = 0; i < 4; i++) { uint32_t c = 0; if (i < p_s2) { c |= (uint32_t)255*(uint32_t)brightness/(uint32_t)100; } if (i < p_m2) { c |= ((uint32_t)255*(uint32_t)brightness/(uint32_t)100) << 8; } pixels.setPixelColor(15 - i, c); } } pixels.show(); sceneData.analogClock.lastUnixTime = currentUnixTime; } } #endif /* SCENEANALOGCLOCK_H_ */