Refactor Light commands

Refactor Light commands
This commit is contained in:
Theo Arends 2019-08-01 15:47:00 +02:00
parent 714f938c05
commit c7f810da54

View File

@ -128,16 +128,24 @@
#define XDRV_04 4 #define XDRV_04 4
//#define DEBUG_LIGHT //#define DEBUG_LIGHT
const uint8_t WS2812_SCHEMES = 7; // Number of additional WS2812 schemes supported by xdrv_ws2812.ino const uint8_t LIGHT_COLOR_SIZE = 25; // Char array scolor size
const uint8_t WS2812_SCHEMES = 7; // Number of additional WS2812 schemes supported by xdrv_ws2812.ino
enum LightCommands {
CMND_COLOR, CMND_COLORTEMPERATURE, CMND_DIMMER, CMND_LED, CMND_LEDTABLE, CMND_FADE,
CMND_PIXELS, CMND_RGBWWTABLE, CMND_ROTATION, CMND_SCHEME, CMND_SPEED, CMND_WAKEUP, CMND_WAKEUPDURATION,
CMND_WHITE, CMND_WIDTH, CMND_CHANNEL, CMND_HSBCOLOR, 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 "|" #ifdef USE_WS2812
D_CMND_PIXELS "|" D_CMND_RGBWWTABLE "|" D_CMND_ROTATION "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_LED "|" D_CMND_PIXELS "|" D_CMND_ROTATION "|" D_CMND_WIDTH "|"
D_CMND_WHITE "|" D_CMND_WIDTH "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR "|UNDOCA" ; #endif // USE_WS2812
D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|"
D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|"
D_CMND_WHITE "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR "|UNDOCA" ;
void (* const LightCommand[])(void) PROGMEM = {
#ifdef USE_WS2812
&CmndLed, &CmndPixels, &CmndRotation, &CmndWidth,
#endif // USE_WS2812
&CmndColor, &CmndColorTemperature, &CmndDimmer, &CmndLedTable, &CmndFade,
&CmndRgbwwTable, &CmndScheme, &CmndSpeed, &CmndWakeup, &CmndWakeupDuration,
&CmndWhite, &CmndChannel, &CmndHsbColor, &CmndUndocA };
// Light color mode, either RGB alone, or white-CT alone, or both only available if ct_rgb_linked is false // Light color mode, either RGB alone, or white-CT alone, or both only available if ct_rgb_linked is false
enum LightColorModes { enum LightColorModes {
@ -1531,9 +1539,9 @@ char* LightGetColor(char* scolor, boolean force_hex = false)
scolor[0] = '\0'; scolor[0] = '\0';
for (uint32_t i = 0; i < light_subtype; i++) { for (uint32_t i = 0; i < light_subtype; i++) {
if (!force_hex && Settings.flag.decimal_text) { if (!force_hex && Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", light_current_color[i]); snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", light_current_color[i]);
} else { } else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, light_current_color[i]); snprintf_P(scolor, LIGHT_COLOR_SIZE, PSTR("%s%02X"), scolor, light_current_color[i]);
} }
} }
return scolor; return scolor;
@ -1548,7 +1556,7 @@ void LightPowerOn(void)
void LightState(uint8_t append) void LightState(uint8_t append)
{ {
char scolor[25]; char scolor[LIGHT_COLOR_SIZE];
char scommand[33]; char scommand[33];
if (append) { if (append) {
@ -1964,12 +1972,12 @@ void LightAnimate(void)
* Commands * Commands
\*********************************************************************************************/ \*********************************************************************************************/
bool LightColorEntry(char *buffer, uint8_t buffer_length) bool LightColorEntry(char *buffer, uint32_t buffer_length)
{ {
char scolor[10]; char scolor[10];
char *p; char *p;
char *str; char *str;
uint8_t entry_type = 0; // Invalid uint32_t entry_type = 0; // Invalid
uint8_t value = light_fixed_color_index; uint8_t value = light_fixed_color_index;
if (buffer[0] == '#') { // Optional hexadecimal entry if (buffer[0] == '#') { // Optional hexadecimal entry
@ -2033,69 +2041,80 @@ bool LightColorEntry(char *buffer, uint8_t buffer_length)
/********************************************************************************************/ /********************************************************************************************/
bool LightCommand(void) void CmndSupportColor(void)
{ {
char command [CMDSZ];
bool serviced = true;
bool coldim = false;
bool valid_entry = false; bool valid_entry = false;
char scolor[25]; bool coldim = false;
char option = (1 == XdrvMailbox.data_len) ? XdrvMailbox.data[0] : '\0';
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kLightCommands); if (XdrvMailbox.data_len > 0) {
if (-1 == command_code) { valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len);
serviced = false; // Unknown command if (valid_entry) {
if (XdrvMailbox.index <= 2) { // Color(1), 2
uint32_t old_bri = light_state.getBri();
// change all channels to specified values
light_controller.changeChannels(light_entry_color);
if (2 == XdrvMailbox.index) {
// If Color2, set back old brightness
light_controller.changeBri(old_bri);
}
Settings.light_scheme = 0;
coldim = true;
} else { // Color3, 4, 5 and 6
for (uint32_t i = 0; i < LST_RGB; i++) {
Settings.ws_color[XdrvMailbox.index -3][i] = light_entry_color[i];
}
}
}
} }
else if (((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) || char scolor[LIGHT_COLOR_SIZE];
((CMND_WHITE == command_code) && (light_subtype == LST_RGBW) && (XdrvMailbox.index == 1))) { if (!valid_entry && (XdrvMailbox.index <= 2)) {
if (CMND_WHITE == command_code) { Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, LightGetColor(scolor));
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { }
uint8_t whiteBri = changeUIntScale(XdrvMailbox.payload,0,100,0,255); if (XdrvMailbox.index >= 3) {
snprintf_P(scolor, sizeof(scolor), PSTR("0,0,0,%d"), whiteBri); scolor[0] = '\0';
light_state.setBri(whiteBri); // save target Bri, will be confirmed below for (uint32_t i = 0; i < LST_RGB; i++) {
XdrvMailbox.data = scolor; if (Settings.flag.decimal_text) {
XdrvMailbox.data_len = strlen(scolor); snprintf_P(scolor, sizeof(scolor), PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.ws_color[XdrvMailbox.index -3][i]);
} else { } else {
XdrvMailbox.data_len = 0; snprintf_P(scolor, sizeof(scolor), PSTR("%s%02X"), scolor, Settings.ws_color[XdrvMailbox.index -3][i]);
} }
} }
if (XdrvMailbox.data_len > 0) { Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, scolor);
valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len);
if (valid_entry) {
if (XdrvMailbox.index <= 2) { // Color(1), 2
uint8_t old_bri = light_state.getBri();
// change all channels to specified values
light_controller.changeChannels(light_entry_color);
if (2 == XdrvMailbox.index) {
// If Color2, set back old brightness
light_controller.changeBri(old_bri);
}
Settings.light_scheme = 0;
coldim = true;
} else { // Color3, 4, 5 and 6
for (uint32_t i = 0; i < LST_RGB; i++) {
Settings.ws_color[XdrvMailbox.index -3][i] = light_entry_color[i];
}
}
}
}
if (!valid_entry && (XdrvMailbox.index <= 2)) {
Response_P(S_JSON_COMMAND_SVALUE, command, LightGetColor(scolor));
}
if (XdrvMailbox.index >= 3) {
scolor[0] = '\0';
for (uint32_t i = 0; i < LST_RGB; i++) {
if (Settings.flag.decimal_text) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.ws_color[XdrvMailbox.index -3][i]);
} else {
snprintf_P(scolor, 25, PSTR("%s%02X"), scolor, Settings.ws_color[XdrvMailbox.index -3][i]);
}
}
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, scolor);
}
} }
else if ((CMND_CHANNEL == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= light_subtype ) ) { if (coldim) {
LightPreparePower();
}
}
void CmndColor(void)
{
if ((light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
CmndSupportColor();
}
}
void CmndWhite(void)
{
if ((light_subtype == LST_RGBW) && (XdrvMailbox.index == 1)) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
uint32_t whiteBri = changeUIntScale(XdrvMailbox.payload,0,100,0,255);
char scolor[LIGHT_COLOR_SIZE];
snprintf_P(scolor, sizeof(scolor), PSTR("0,0,0,%d"), whiteBri);
light_state.setBri(whiteBri); // save target Bri, will be confirmed below
XdrvMailbox.data = scolor;
XdrvMailbox.data_len = strlen(scolor);
} else {
XdrvMailbox.data_len = 0;
}
CmndSupportColor();
}
}
void CmndChannel(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= light_subtype )) {
bool coldim = false;
// Set "Channel" directly - this allows Color and Direct PWM control to coexist // Set "Channel" directly - this allows Color and Direct PWM control to coexist
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
light_current_color[XdrvMailbox.index-1] = changeUIntScale(XdrvMailbox.payload,0,100,0,255); light_current_color[XdrvMailbox.index-1] = changeUIntScale(XdrvMailbox.payload,0,100,0,255);
@ -2106,9 +2125,16 @@ bool LightCommand(void)
light_controller.changeChannels(light_current_color); light_controller.changeChannels(light_current_color);
coldim = true; coldim = true;
} }
Response_P(S_JSON_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, light_current_color[XdrvMailbox.index -1] * 100 / 255); Response_P(S_JSON_COMMAND_INDEX_NVALUE, XdrvMailbox.command, XdrvMailbox.index, light_current_color[XdrvMailbox.index -1] * 100 / 255);
if (coldim) {
LightPreparePower();
}
} }
else if ((CMND_HSBCOLOR == command_code) && (light_subtype >= LST_RGB)) { }
void CmndHsbColor(void)
{
if (light_subtype >= LST_RGB) {
bool validHSB = (XdrvMailbox.data_len > 0); bool validHSB = (XdrvMailbox.data_len > 0);
if (validHSB) { if (validHSB) {
uint16_t HSB[3]; uint16_t HSB[3];
@ -2155,8 +2181,12 @@ bool LightCommand(void)
LightState(0); LightState(0);
} }
} }
}
#ifdef USE_WS2812 // *********************************************************************** #ifdef USE_WS2812 // ***********************************************************************
else if ((CMND_LED == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= Settings.light_pixels)) { void CmndLed(void)
{
if ((LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= Settings.light_pixels)) {
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
char *p; char *p;
uint16_t idx = XdrvMailbox.index; uint16_t idx = XdrvMailbox.index;
@ -2165,7 +2195,7 @@ bool LightCommand(void)
if (LightColorEntry(color, strlen(color))) { if (LightColorEntry(color, strlen(color))) {
Ws2812SetColor(idx, light_entry_color[0], light_entry_color[1], light_entry_color[2], light_entry_color[3]); Ws2812SetColor(idx, light_entry_color[0], light_entry_color[1], light_entry_color[2], light_entry_color[3]);
idx++; idx++;
if (idx > Settings.light_pixels) break; if (idx > Settings.light_pixels) { break; }
} else { } else {
break; break;
} }
@ -2173,44 +2203,63 @@ bool LightCommand(void)
Ws2812ForceUpdate(); Ws2812ForceUpdate();
} }
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, Ws2812GetColor(XdrvMailbox.index, scolor)); char scolor[LIGHT_COLOR_SIZE];
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, Ws2812GetColor(XdrvMailbox.index, scolor));
} }
else if ((CMND_PIXELS == command_code) && (LT_WS2812 == light_type)) { }
void CmndPixels(void)
{
if (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; Settings.light_rotation = 0;
Ws2812Clear(); Ws2812Clear();
light_update = 1; light_update = 1;
} }
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_pixels); Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_pixels);
} }
else if ((CMND_ROTATION == command_code) && (LT_WS2812 == light_type)) { }
void CmndRotation(void)
{
if (LT_WS2812 == light_type) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < Settings.light_pixels)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < Settings.light_pixels)) {
Settings.light_rotation = XdrvMailbox.payload; Settings.light_rotation = XdrvMailbox.payload;
} }
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_rotation); Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_rotation);
} }
else if ((CMND_WIDTH == command_code) && (LT_WS2812 == light_type) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 4)) { }
void CmndWidth(void)
{
if ((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)) {
Settings.light_width = XdrvMailbox.payload; Settings.light_width = XdrvMailbox.payload;
} }
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_width); Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_width);
} else { } else {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32)) {
Settings.ws_width[XdrvMailbox.index -2] = XdrvMailbox.payload; Settings.ws_width[XdrvMailbox.index -2] = XdrvMailbox.payload;
} }
Response_P(S_JSON_COMMAND_INDEX_NVALUE, command, XdrvMailbox.index, Settings.ws_width[XdrvMailbox.index -2]); Response_P(S_JSON_COMMAND_INDEX_NVALUE, XdrvMailbox.command, XdrvMailbox.index, Settings.ws_width[XdrvMailbox.index -2]);
} }
} }
}
#endif // USE_WS2812 ************************************************************************ #endif // USE_WS2812 ************************************************************************
else if ((CMND_SCHEME == command_code) && (light_subtype >= LST_RGB)) {
uint8_t max_scheme = (LT_WS2812 == light_type) ? LS_MAX + WS2812_SCHEMES : LS_MAX -1; void CmndScheme(void)
if (('+' == option) && (Settings.light_scheme < max_scheme)) { {
XdrvMailbox.payload = Settings.light_scheme + ((0 == Settings.light_scheme) ? 2 : 1); // Skip wakeup if (light_subtype >= LST_RGB) {
} uint32_t max_scheme = (LT_WS2812 == light_type) ? LS_MAX + WS2812_SCHEMES : LS_MAX -1;
else if (('-' == option) && (Settings.light_scheme > 0)) { if (1 == XdrvMailbox.data_len) {
XdrvMailbox.payload = Settings.light_scheme - ((2 == Settings.light_scheme) ? 2 : 1); // Skip wakeup if (('+' == XdrvMailbox.data[0]) && (Settings.light_scheme < max_scheme)) {
XdrvMailbox.payload = Settings.light_scheme + ((0 == Settings.light_scheme) ? 2 : 1); // Skip wakeup
}
else if (('-' == XdrvMailbox.data[0]) && (Settings.light_scheme > 0)) {
XdrvMailbox.payload = Settings.light_scheme - ((2 == Settings.light_scheme) ? 2 : 1); // Skip wakeup
}
} }
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= max_scheme)) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= max_scheme)) {
Settings.light_scheme = XdrvMailbox.payload; Settings.light_scheme = XdrvMailbox.payload;
@ -2222,138 +2271,153 @@ bool LightCommand(void)
// Publish state message for Hass // Publish state message for Hass
if (Settings.flag3.hass_tele_on_power) { MqttPublishTeleState(); } if (Settings.flag3.hass_tele_on_power) { MqttPublishTeleState(); }
} }
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_scheme); Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_scheme);
} }
else if (CMND_WAKEUP == command_code) { }
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
Settings.light_dimmer = XdrvMailbox.payload; void CmndWakeup(void)
} {
light_wakeup_active = 3; if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
Settings.light_scheme = LS_WAKEUP; Settings.light_dimmer = XdrvMailbox.payload;
LightPowerOn();
Response_P(S_JSON_COMMAND_SVALUE, command, D_JSON_STARTED);
} }
else if ((CMND_COLORTEMPERATURE == command_code) && ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype))) { // ColorTemp light_wakeup_active = 3;
uint16_t ct = light_state.getCT(); Settings.light_scheme = LS_WAKEUP;
if (option != '\0') { LightPowerOn();
if ('+' == option) { Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, D_JSON_STARTED);
}
void CmndColorTemperature(void)
{
if ((LST_COLDWARM == light_subtype) || (LST_RGBWC == light_subtype)) { // ColorTemp
uint32_t ct = light_state.getCT();
if (1 == XdrvMailbox.data_len) {
if ('+' == XdrvMailbox.data[0]) {
XdrvMailbox.payload = (ct > (500-34)) ? 500 : ct + 34; XdrvMailbox.payload = (ct > (500-34)) ? 500 : ct + 34;
} }
else if ('-' == option) { else if ('-' == XdrvMailbox.data[0]) {
XdrvMailbox.payload = (ct < (153+34)) ? 153 : ct - 34; XdrvMailbox.payload = (ct < (153+34)) ? 153 : ct - 34;
} }
} }
if ((XdrvMailbox.payload >= 153) && (XdrvMailbox.payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts if ((XdrvMailbox.payload >= 153) && (XdrvMailbox.payload <= 500)) { // https://developers.meethue.com/documentation/core-concepts
light_controller.changeCTB(XdrvMailbox.payload, light_state.getBri()); light_controller.changeCTB(XdrvMailbox.payload, light_state.getBri());
coldim = true; LightPreparePower();
} else { } else {
Response_P(S_JSON_COMMAND_NVALUE, command, ct); Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, ct);
} }
} }
else if (CMND_DIMMER == command_code) { }
uint32_t dimmer = light_state.getDimmer();
if ('+' == option) { void CmndDimmer(void)
{
uint32_t dimmer = light_state.getDimmer();
if (1 == XdrvMailbox.data_len) {
if ('+' == XdrvMailbox.data[0]) {
XdrvMailbox.payload = (dimmer > 89) ? 100 : dimmer + 10; XdrvMailbox.payload = (dimmer > 89) ? 100 : dimmer + 10;
} }
else if ('-' == option) { else if ('-' == XdrvMailbox.data[0]) {
XdrvMailbox.payload = (dimmer < 11) ? 1 : dimmer - 10; XdrvMailbox.payload = (dimmer < 11) ? 1 : dimmer - 10;
} }
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
light_controller.changeDimmer(XdrvMailbox.payload);
light_update = 1;
coldim = true;
} else {
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_dimmer);
}
} }
else if (CMND_LEDTABLE == command_code) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 100)) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) { light_controller.changeDimmer(XdrvMailbox.payload);
switch (XdrvMailbox.payload) { light_update = 1;
case 0: // Off LightPreparePower();
case 1: // On } else {
Settings.light_correction = XdrvMailbox.payload; Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_dimmer);
break;
case 2: // Toggle
Settings.light_correction ^= 1;
break;
}
light_update = 1;
}
Response_P(S_JSON_COMMAND_SVALUE, command, GetStateText(Settings.light_correction));
} }
else if (CMND_RGBWWTABLE == command_code) { }
bool validtable = (XdrvMailbox.data_len > 0);
char scolor[25];
if (validtable) {
if (strstr(XdrvMailbox.data, ",") != nullptr) { // Command with up to 5 comma separated parameters
for (uint32_t i = 0; i < LST_RGBWC; i++) {
char *substr;
if (0 == i) { void CmndLedTable(void)
substr = strtok(XdrvMailbox.data, ","); {
} else { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) {
substr = strtok(nullptr, ",");
}
if (substr != nullptr) {
Settings.rgbwwTable[i] = atoi(substr);
}
}
}
light_update = 1;
}
scolor[0] = '\0';
for (uint32_t i = 0; i < LST_RGBWC; i++) {
snprintf_P(scolor, 25, PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.rgbwwTable[i]);
}
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, scolor);
}
else if (CMND_FADE == command_code) {
switch (XdrvMailbox.payload) { switch (XdrvMailbox.payload) {
case 0: // Off case 0: // Off
case 1: // On case 1: // On
Settings.light_fade = XdrvMailbox.payload; Settings.light_correction = XdrvMailbox.payload;
break; break;
case 2: // Toggle case 2: // Toggle
Settings.light_fade ^= 1; Settings.light_correction ^= 1;
break; break;
} }
Response_P(S_JSON_COMMAND_SVALUE, command, GetStateText(Settings.light_fade)); light_update = 1;
} }
else if (CMND_SPEED == command_code) { // 1 - fast, 20 - very slow Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, GetStateText(Settings.light_correction));
if (('+' == option) && (Settings.light_speed > 1)) { }
void CmndRgbwwTable(void)
{
if ((XdrvMailbox.data_len > 0)) {
if (strstr(XdrvMailbox.data, ",") != nullptr) { // Command with up to 5 comma separated parameters
for (uint32_t i = 0; i < LST_RGBWC; i++) {
char *substr;
if (0 == i) {
substr = strtok(XdrvMailbox.data, ",");
} else {
substr = strtok(nullptr, ",");
}
if (substr != nullptr) {
Settings.rgbwwTable[i] = atoi(substr);
}
}
}
light_update = 1;
}
char scolor[LIGHT_COLOR_SIZE];
scolor[0] = '\0';
for (uint32_t i = 0; i < LST_RGBWC; i++) {
snprintf_P(scolor, sizeof(scolor), PSTR("%s%s%d"), scolor, (i > 0) ? "," : "", Settings.rgbwwTable[i]);
}
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, scolor);
}
void CmndFade(void)
{
switch (XdrvMailbox.payload) {
case 0: // Off
case 1: // On
Settings.light_fade = XdrvMailbox.payload;
break;
case 2: // Toggle
Settings.light_fade ^= 1;
break;
}
Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, GetStateText(Settings.light_fade));
}
void CmndSpeed(void)
{ // 1 - fast, 20 - very slow
if (1 == XdrvMailbox.data_len) {
if (('+' == XdrvMailbox.data[0]) && (Settings.light_speed > 1)) {
XdrvMailbox.payload = Settings.light_speed -1; XdrvMailbox.payload = Settings.light_speed -1;
} }
else if (('-' == option) && (Settings.light_speed < STATES)) { else if (('-' == XdrvMailbox.data[0]) && (Settings.light_speed < STATES)) {
XdrvMailbox.payload = Settings.light_speed +1; XdrvMailbox.payload = Settings.light_speed +1;
} }
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= STATES)) {
Settings.light_speed = XdrvMailbox.payload;
}
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_speed);
} }
else if (CMND_WAKEUPDURATION == command_code) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= STATES)) {
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 3001)) { Settings.light_speed = XdrvMailbox.payload;
Settings.light_wakeup = XdrvMailbox.payload;
light_wakeup_active = 0;
}
Response_P(S_JSON_COMMAND_NVALUE, command, Settings.light_wakeup);
}
else if (CMND_UNDOCA == command_code) { // Theos legacy status
LightGetColor(scolor, true); // force hex whatever Option 17
scolor[6] = '\0'; // RGB only
Response_P(PSTR("%s,%d,%d,%d,%d,%d"), scolor, Settings.light_fade, Settings.light_correction, Settings.light_scheme, Settings.light_speed, Settings.light_width);
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.topic);
mqtt_data[0] = '\0';
}
else {
serviced = false; // Unknown command
} }
Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_speed);
}
if (coldim) { void CmndWakeupDuration(void)
LightPreparePower(); {
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload < 3001)) {
Settings.light_wakeup = XdrvMailbox.payload;
light_wakeup_active = 0;
} }
Response_P(S_JSON_COMMAND_NVALUE, XdrvMailbox.command, Settings.light_wakeup);
}
return serviced; void CmndUndocA(void)
{ // Theos legacy status
char scolor[LIGHT_COLOR_SIZE];
LightGetColor(scolor, true); // force hex whatever Option 17
scolor[6] = '\0'; // RGB only
Response_P(PSTR("%s,%d,%d,%d,%d,%d"), scolor, Settings.light_fade, Settings.light_correction, Settings.light_scheme, Settings.light_speed, Settings.light_width);
MqttPublishPrefixTopic_P(STAT, XdrvMailbox.topic);
mqtt_data[0] = '\0';
} }
/*********************************************************************************************\ /*********************************************************************************************\
@ -2372,20 +2436,20 @@ bool Xdrv04(uint8_t function)
case FUNC_EVERY_50_MSECOND: case FUNC_EVERY_50_MSECOND:
LightAnimate(); LightAnimate();
#ifdef USE_ARILUX_RF #ifdef USE_ARILUX_RF
if (pin[GPIO_ARIRFRCV] < 99) AriluxRfHandler(); if (pin[GPIO_ARIRFRCV] < 99) { AriluxRfHandler(); }
#endif // USE_ARILUX_RF #endif // USE_ARILUX_RF
break; break;
#ifdef USE_ARILUX_RF #ifdef USE_ARILUX_RF
case FUNC_EVERY_SECOND: case FUNC_EVERY_SECOND:
if (10 == uptime) AriluxRfInit(); // Needs rest before enabling RF interrupts if (10 == uptime) { AriluxRfInit(); } // Needs rest before enabling RF interrupts
break; break;
#endif // USE_ARILUX_RF #endif // USE_ARILUX_RF
case FUNC_COMMAND:
result = LightCommand();
break;
case FUNC_SET_POWER: case FUNC_SET_POWER:
LightSetPower(); LightSetPower();
break; break;
case FUNC_COMMAND:
result = DecodeCommand(kLightCommands, LightCommand);
break;
} }
} }
return result; return result;