v5.12.0e - Add Clock features

5.12.0e
* Add commands Color6 RRGGBB for Clock marker color and Rotation pixels
for Clock rotation (#2092)
This commit is contained in:
Theo Arends 2018-03-10 17:58:54 +01:00
parent f30135791d
commit 4063275f7d
7 changed files with 37 additions and 28 deletions

View File

@ -1,6 +1,7 @@
/* 5.12.0e /* 5.12.0e
* Add a second TLS fingerprint to allow switching keys in TLS mode (#2033, #2102) * Add a second TLS fingerprint to allow switching keys in TLS mode (#2033, #2102)
* Add HTML language header in local language (#2123) * Add HTML language header in local language (#2123)
* Add commands Color6 RRGGBB for Clock marker color and Rotation pixels for Clock rotation (#2092)
* *
* 5.12.0d * 5.12.0d
* Add support for optional MQTT drivers to be selected in user_config.h (#1992) * Add support for optional MQTT drivers to be selected in user_config.h (#1992)

View File

@ -250,6 +250,7 @@
#define D_CMND_LEDTABLE "LedTable" #define D_CMND_LEDTABLE "LedTable"
#define D_CMND_FADE "Fade" #define D_CMND_FADE "Fade"
#define D_CMND_PIXELS "Pixels" #define D_CMND_PIXELS "Pixels"
#define D_CMND_ROTATION "Rotation"
#define D_CMND_SCHEME "Scheme" #define D_CMND_SCHEME "Scheme"
#define D_CMND_SPEED "Speed" #define D_CMND_SPEED "Speed"
#define D_CMND_WAKEUP "Wakeup" #define D_CMND_WAKEUP "Wakeup"

View File

@ -116,11 +116,9 @@ struct SYSCFG {
byte syslog_level; // 1AA byte syslog_level; // 1AA
uint8_t webserver; // 1AB uint8_t webserver; // 1AB
byte weblog_level; // 1AC byte weblog_level; // 1AC
// char mqtt_fingerprint[60]; // 1AD
uint8_t mqtt_fingerprint[2][20]; // 1AD uint8_t mqtt_fingerprint[2][20]; // 1AD
byte free_1D5[20]; // 1D5 byte free_1D5[20]; // 1D5 Free since 5.12.0e
char mqtt_host[33]; // 1E9 char mqtt_host[33]; // 1E9
uint16_t mqtt_port; // 20A uint16_t mqtt_port; // 20A
@ -186,7 +184,7 @@ struct SYSCFG {
uint16_t blinktime; // 39A uint16_t blinktime; // 39A
uint16_t blinkcount; // 39C uint16_t blinkcount; // 39C
uint16_t ws_pixels; // 39E Not used since 5.8.0 uint16_t light_rotation; // 39E
uint8_t ws_red; // 3A0 Not used since 5.8.0 uint8_t ws_red; // 3A0 Not used since 5.8.0
uint8_t ws_green; // 3A1 Not used since 5.8.0 uint8_t ws_green; // 3A1 Not used since 5.8.0
uint8_t ws_blue; // 3A2 Not used since 5.8.0 uint8_t ws_blue; // 3A2 Not used since 5.8.0

View File

@ -579,6 +579,7 @@ void SettingsDefaultSet2()
// 5.8.0 // 5.8.0
Settings.light_pixels = WS2812_LEDS; Settings.light_pixels = WS2812_LEDS;
// Settings.light_rotation = 0;
// 5.8.1 // 5.8.1
// Settings.altitude = 0; // Settings.altitude = 0;
@ -597,7 +598,6 @@ void SettingsDefaultSet2()
void SettingsDefaultSet_3_2_4() void SettingsDefaultSet_3_2_4()
{ {
Settings.ws_pixels = WS2812_LEDS;
Settings.ws_red = 255; Settings.ws_red = 255;
Settings.ws_green = 0; Settings.ws_green = 0;
Settings.ws_blue = 0; Settings.ws_blue = 0;
@ -625,6 +625,7 @@ void SettingsDefaultSet_3_9_3()
} }
Settings.light_pixels = WS2812_LEDS; Settings.light_pixels = WS2812_LEDS;
Settings.light_rotation = 0;
for (byte i = 0; i < MAX_PWMS; i++) { for (byte i = 0; i < MAX_PWMS; i++) {
Settings.light_color[i] = 255; Settings.light_color[i] = 255;
} }
@ -835,7 +836,7 @@ void SettingsDelta()
} }
} }
if (!Settings.light_pixels && cfg_wsflg) { if (!Settings.light_pixels && cfg_wsflg) {
Settings.light_pixels = Settings.ws_pixels; Settings.light_pixels = WS2812_LEDS;
Settings.light_color[0] = Settings.ws_red; Settings.light_color[0] = Settings.ws_red;
Settings.light_color[1] = Settings.ws_green; Settings.light_color[1] = Settings.ws_green;
Settings.light_color[2] = Settings.ws_blue; Settings.light_color[2] = Settings.ws_blue;
@ -887,6 +888,7 @@ void SettingsDelta()
Settings.flag.not_power_linked = 0; Settings.flag.not_power_linked = 0;
} }
if (Settings.version < 0x050C0005) { if (Settings.version < 0x050C0005) {
Settings.light_rotation = 0;
char fingerprint[60]; char fingerprint[60];
memcpy(fingerprint, Settings.mqtt_fingerprint, sizeof(fingerprint)); memcpy(fingerprint, Settings.mqtt_fingerprint, sizeof(fingerprint));
char *p = fingerprint; char *p = fingerprint;

View File

@ -138,8 +138,8 @@ enum SettingsParmaIndex {P_HOLD_TIME, P_MAX_POWER_RETRY, P_MAX_PARAM8};
enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_AIRQUALITY, DZ_MAX_SENSORS}; enum DomoticzSensors {DZ_TEMP, DZ_TEMP_HUM, DZ_TEMP_HUM_BARO, DZ_POWER_ENERGY, DZ_ILLUMINANCE, DZ_COUNT, DZ_VOLTAGE, DZ_CURRENT, DZ_AIRQUALITY, DZ_MAX_SENSORS};
enum Ws2812ClockIndex {WS_SECOND, WS_MINUTE, WS_HOUR}; enum Ws2812ClockIndex { WS_SECOND, WS_MINUTE, WS_HOUR, WS_MARKER };
enum Ws2812Color {WS_RED, WS_GREEN, WS_BLUE}; enum Ws2812Color { WS_RED, WS_GREEN, WS_BLUE };
enum LightTypes {LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6, LT_PWM7, LT_NU8, LT_NU9, LT_NU10, LT_WS2812, LT_RGBW, LT_RGBWC}; enum LightTypes {LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT_PWM5, LT_PWM6, LT_PWM7, LT_NU8, LT_NU9, LT_NU10, LT_WS2812, LT_RGBW, LT_RGBWC};
enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC}; enum LichtSubtypes {LST_NONE, LST_SINGLE, LST_COLDWARM, LST_RGB, LST_RGBW, LST_RGBWC};
enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX}; enum LichtSchemes {LS_POWER, LS_WAKEUP, LS_CYCLEUP, LS_CYCLEDN, LS_RANDOM, LS_MAX};

View File

@ -55,10 +55,10 @@
enum LightCommands { enum LightCommands {
CMND_COLOR, CMND_COLORTEMPERATURE, CMND_DIMMER, CMND_LED, CMND_LEDTABLE, CMND_FADE, CMND_COLOR, CMND_COLORTEMPERATURE, CMND_DIMMER, CMND_LED, CMND_LEDTABLE, CMND_FADE,
CMND_PIXELS, CMND_SCHEME, CMND_SPEED, CMND_WAKEUP, CMND_WAKEUPDURATION, CMND_WIDTH, CMND_UNDOCA }; CMND_PIXELS, CMND_ROTATION, CMND_SCHEME, CMND_SPEED, CMND_WAKEUP, CMND_WAKEUPDURATION, CMND_WIDTH, CMND_UNDOCA };
const char kLightCommands[] PROGMEM = const char kLightCommands[] PROGMEM =
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_LED "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|" D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_LED "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
D_CMND_PIXELS "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_WIDTH "|UNDOCA" ; D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_WIDTH "|UNDOCA" ;
struct LRgbColor { struct LRgbColor {
uint8_t R, G, B; uint8_t R, G, B;
@ -1018,7 +1018,7 @@ boolean LightCommand()
char option = (1 == XdrvMailbox.data_len) ? XdrvMailbox.data[0] : '\0'; char option = (1 == XdrvMailbox.data_len) ? XdrvMailbox.data[0] : '\0';
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kLightCommands); int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kLightCommands);
if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 5)) { if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len); valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len);
if (valid_entry) { if (valid_entry) {
@ -1031,7 +1031,7 @@ boolean LightCommand()
} }
Settings.light_scheme = 0; Settings.light_scheme = 0;
coldim = true; coldim = true;
} else { // Color3, 4 and 5 } else { // Color3, 4, 5 and 6
for (byte i = 0; i < LST_RGB; i++) { for (byte i = 0; i < LST_RGB; i++) {
Settings.ws_color[XdrvMailbox.index -3][i] = light_entry_color[i]; Settings.ws_color[XdrvMailbox.index -3][i] = light_entry_color[i];
} }
@ -1065,11 +1065,18 @@ boolean LightCommand()
else if ((CMND_PIXELS == command_code) && (LT_WS2812 == light_type)) { else if ((CMND_PIXELS == command_code) && (LT_WS2812 == light_type)) {
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= WS2812_MAX_LEDS)) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= WS2812_MAX_LEDS)) {
Settings.light_pixels = XdrvMailbox.payload; Settings.light_pixels = XdrvMailbox.payload;
Settings.light_rotation = 0;
Ws2812Clear(); Ws2812Clear();
light_update = 1; light_update = 1;
} }
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.light_pixels); snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.light_pixels);
} }
else if ((CMND_ROTATION == command_code) && (LT_WS2812 == light_type)) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < Settings.light_pixels)) {
Settings.light_rotation = XdrvMailbox.payload;
}
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_NVALUE, command, Settings.light_rotation);
}
else if ((CMND_WIDTH == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) { else if ((CMND_WIDTH == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) {
if (1 == XdrvMailbox.index) { if (1 == XdrvMailbox.index) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 4)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 4)) {

View File

@ -114,9 +114,7 @@ void Ws2812StripShow()
int mod(int a, int b) int mod(int a, int b)
{ {
int ret = a % b; int ret = a % b;
if (ret < 0) { if (ret < 0) ret += b;
ret += b;
}
return ret; return ret;
} }
@ -142,13 +140,15 @@ void Ws2812UpdatePixelColor(int position, struct WsColor hand_color, float offse
void Ws2812UpdateHand(int position, uint8_t index) void Ws2812UpdateHand(int position, uint8_t index)
{ {
if (Settings.flag.ws_clock_reverse) { position = (position + Settings.light_rotation) % Settings.light_pixels;
position = Settings.light_pixels -position;
} if (Settings.flag.ws_clock_reverse) position = Settings.light_pixels -position;
WsColor hand_color = { Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE] }; WsColor hand_color = { Settings.ws_color[index][WS_RED], Settings.ws_color[index][WS_GREEN], Settings.ws_color[index][WS_BLUE] };
Ws2812UpdatePixelColor(position, hand_color, 1); Ws2812UpdatePixelColor(position, hand_color, 1);
uint8_t range = ((Settings.ws_width[index] -1) / 2) +1;
uint8_t range = 1;
if (index < WS_MARKER) range = ((Settings.ws_width[index] -1) / 2) +1;
for (uint8_t h = 1; h < range; h++) { for (uint8_t h = 1; h < range; h++) {
float offset = (float)(range - h) / (float)range; float offset = (float)(range - h) / (float)range;
Ws2812UpdatePixelColor(position -h, hand_color, offset); Ws2812UpdatePixelColor(position -h, hand_color, offset);
@ -160,9 +160,15 @@ void Ws2812Clock()
{ {
strip->ClearTo(0); // Reset strip strip->ClearTo(0); // Reset strip
int clksize = 60000 / (int)Settings.light_pixels; int clksize = 60000 / (int)Settings.light_pixels;
Ws2812UpdateHand((RtcTime.second * 1000) / clksize, WS_SECOND); Ws2812UpdateHand((RtcTime.second * 1000) / clksize, WS_SECOND);
Ws2812UpdateHand((RtcTime.minute * 1000) / clksize, WS_MINUTE); Ws2812UpdateHand((RtcTime.minute * 1000) / clksize, WS_MINUTE);
Ws2812UpdateHand(((RtcTime.hour % 12) * (5000 / clksize)) + ((RtcTime.minute * 1000) / (12 * clksize)), WS_HOUR); Ws2812UpdateHand(((RtcTime.hour % 12) * (5000 / clksize)) + ((RtcTime.minute * 1000) / (12 * clksize)), WS_HOUR);
if (Settings.ws_color[WS_MARKER][WS_RED] + Settings.ws_color[WS_MARKER][WS_GREEN] + Settings.ws_color[WS_MARKER][WS_BLUE]) {
for (byte i = 0; i < 12; i++) {
Ws2812UpdateHand((i * 5000) / clksize, WS_MARKER);
}
}
Ws2812StripShow(); Ws2812StripShow();
} }
@ -207,9 +213,7 @@ void Ws2812Gradient(uint8_t schemenr)
#endif #endif
ColorScheme scheme = kSchemes[schemenr]; ColorScheme scheme = kSchemes[schemenr];
if (scheme.count < 2) { if (scheme.count < 2) return;
return;
}
uint8_t repeat = kRepeat[Settings.light_width]; // number of scheme.count per ledcount uint8_t repeat = kRepeat[Settings.light_width]; // number of scheme.count per ledcount
uint16_t range = (uint16_t)ceil((float)Settings.light_pixels / (float)repeat); uint16_t range = (uint16_t)ceil((float)Settings.light_pixels / (float)repeat);
@ -260,9 +264,7 @@ void Ws2812Bars(uint8_t schemenr)
ColorScheme scheme = kSchemes[schemenr]; ColorScheme scheme = kSchemes[schemenr];
uint16_t maxSize = Settings.light_pixels / scheme.count; uint16_t maxSize = Settings.light_pixels / scheme.count;
if (kWidth[Settings.light_width] > maxSize) { if (kWidth[Settings.light_width] > maxSize) maxSize = 0;
maxSize = 0;
}
uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10); uint16_t speed = ((Settings.light_speed * 2) -1) * (STATES / 10);
uint8_t offset = speed > 0 ? strip_timer_counter / speed : 0; uint8_t offset = speed > 0 ? strip_timer_counter / speed : 0;
@ -280,9 +282,7 @@ void Ws2812Bars(uint8_t schemenr)
} }
uint8_t colorIndex = offset % scheme.count; uint8_t colorIndex = offset % scheme.count;
for (i = 0; i < Settings.light_pixels; i++) { for (i = 0; i < Settings.light_pixels; i++) {
if (maxSize) { if (maxSize) colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width];
colorIndex = ((i + offset) % (scheme.count * kWidth[Settings.light_width])) / kWidth[Settings.light_width];
}
c.R = mcolor[colorIndex].red; c.R = mcolor[colorIndex].red;
c.G = mcolor[colorIndex].green; c.G = mcolor[colorIndex].green;
c.B = mcolor[colorIndex].blue; c.B = mcolor[colorIndex].blue;