Files
MyNotificationClock/SceneAnalogClock.h
T
2018-03-17 21:53:38 +01:00

149 lines
4.3 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_setup() noexcept {
_eeprom_NotificationLEDs_StatusTable statusTable;
statusTable.data = loadState(EEPROM_POS_STATUSTABLE);
if (statusTable.status.hourOffset == 1) {
sceneData.analogClock.hourOffset = (int8_t)loadState(EEPROM_POS_HOUROFFSET);
}
}
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;
_eeprom_NotificationLEDs_StatusTable statusTable;
statusTable.data = loadState(EEPROM_POS_STATUSTABLE);
statusTable.status.hourOffset = 1;
saveState(EEPROM_POS_HOUROFFSET, offset);
saveState(EEPROM_POS_STATUSTABLE, statusTable.data);
}
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_ */