126 lines
3.5 KiB
C++
126 lines
3.5 KiB
C++
#ifndef SCENEANALOGCLOCK_H_
|
|
#define SCENEANALOGCLOCK_H_
|
|
|
|
#include <nodemanager_config.h>
|
|
#include <MySensors.h>
|
|
#include <NodeManager.h>
|
|
#include <Adafruit_NeoPixel.h>
|
|
#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_ */
|