Merge branch 'development' into release-7.1

This commit is contained in:
Theo Arends 2019-12-01 12:27:10 +01:00
commit c69d5db434
6 changed files with 47 additions and 35 deletions

View File

@ -10,7 +10,7 @@ comment: >-
Filling the template is required so standard questions don't need to be asked again each time. Filling the template is required so standard questions don't need to be asked again each time.
Our ability to provide assistance is greatly hampered if few minutes are not taken to complete the issue template Our ability to provide assistance is greatly hampered if few minutes are not taken to complete the issue template
with the requested information. The details requested potentially affect which options to pursue. The small amount with the requested information. The details requested potentially affect which options to pursue. The small amount
of time you spend completing the template will also help the volunteers providing the assistance to you, to reduce of time you will spend completing the template will also help the volunteers, providing assistance to you, to reduce
the time required to help you. the time required to help you.
Please, could you be so kind on completing the [issue template](https://github.com/arendst/Tasmota/issues/new/choose) in order to have more information so as to properly help you? Please, could you be so kind on completing the [issue template](https://github.com/arendst/Tasmota/issues/new/choose) in order to have more information so as to properly help you?

View File

@ -1,5 +1,11 @@
## Unreleased (development) ## Unreleased (development)
### 7.1.0.1 20191130
- Fix slider for devices with one or two channels like only white or white/yellow
- Fix TasmotaSlave buffer overrun on Tele
- Fix light scheme 4 speed (#7072)
- Add support for TasmotaSlave executing commands on Tasmota
## Released ## Released

View File

@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_ #ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_
const uint32_t VERSION = 0x07010000; const uint32_t VERSION = 0x07010001;
#endif // _TASMOTA_VERSION_H_ #endif // _TASMOTA_VERSION_H_

View File

@ -154,9 +154,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM =
const char HTTP_SCRIPT_ROOT_PART2[] PROGMEM = const char HTTP_SCRIPT_ROOT_PART2[] PROGMEM =
"function lc(v,i,p){" "function lc(v,i,p){"
"if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too "if(eb('s')){" // Check if Saturation is in DOM otherwise javascript fails on la()
"var sl=eb('sl4').value;" "if(v=='h'||v=='d'){" // Hue or Brightness changed so change Saturation colors too
"eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';" "var sl=eb('sl4').value;"
"eb('s').style.background='linear-gradient(to right,rgb('+sl+'%%,'+sl+'%%,'+sl+'%%),hsl('+eb('sl2').value+',100%%,50%%))';"
"}"
"}" "}"
"la('&'+v+i+'='+p);" "la('&'+v+i+'='+p);"
"}" "}"

View File

@ -242,6 +242,7 @@ struct LIGHT {
uint8_t color_remap[LST_MAX]; uint8_t color_remap[LST_MAX];
uint8_t wheel = 0; uint8_t wheel = 0;
uint8_t random = 0;
uint8_t subtype = 0; // LST_ subtype uint8_t subtype = 0; // LST_ subtype
uint8_t device = 0; uint8_t device = 0;
uint8_t old_power = 1; uint8_t old_power = 1;
@ -1541,28 +1542,19 @@ void LightCycleColor(int8_t direction)
if (Light.strip_timer_counter % (Settings.light_speed * 2)) { if (Light.strip_timer_counter % (Settings.light_speed * 2)) {
return; return;
} }
Light.wheel += direction;
if (0 == direction) {
if (Light.random == Light.wheel) {
Light.random = random(255);
}
Light.wheel += (Light.random < Light.wheel) ? -1 : 1;
} else {
Light.wheel += direction;
}
LightWheel(Light.wheel); LightWheel(Light.wheel);
memcpy(Light.new_color, Light.entry_color, sizeof(Light.new_color)); memcpy(Light.new_color, Light.entry_color, sizeof(Light.new_color));
} }
void LightRandomColor(void)
{
bool update = false;
for (uint32_t i = 0; i < LST_RGB; i++) {
if (Light.new_color[i] != Light.current_color[i]) {
update = true;
}
}
if (!update) {
Light.wheel = random(255);
LightWheel(Light.wheel);
memcpy(Light.current_color, Light.entry_color, sizeof(Light.current_color));
}
memcpy(Light.new_color, Light.current_color, sizeof(Light.new_color));
}
void LightSetPower(void) void LightSetPower(void)
{ {
// Light.power = XdrvMailbox.index; // Light.power = XdrvMailbox.index;
@ -1652,7 +1644,7 @@ void LightAnimate(void)
LightCycleColor(-1); LightCycleColor(-1);
break; break;
case LS_RANDOM: case LS_RANDOM:
LightRandomColor(); LightCycleColor(0);
break; break;
default: default:
XlgtCall(FUNC_SET_SCHEME); XlgtCall(FUNC_SET_SCHEME);

View File

@ -47,6 +47,7 @@
#define CMND_FUNC_EVERY_100_MSECOND 0x04 #define CMND_FUNC_EVERY_100_MSECOND 0x04
#define CMND_SLAVE_SEND 0x05 #define CMND_SLAVE_SEND 0x05
#define CMND_PUBLISH_TELE 0x06 #define CMND_PUBLISH_TELE 0x06
#define CMND_EXECUTE_CMND 0x07
#define PARAM_DATA_START 0xFE #define PARAM_DATA_START 0xFE
#define PARAM_DATA_END 0xFF #define PARAM_DATA_END 0xFF
@ -142,6 +143,7 @@ struct TSLAVE {
bool flashing = false; bool flashing = false;
bool SerialEnabled = false; bool SerialEnabled = false;
uint8_t waitstate = 0; // We use this so that features detection does not slow down other stuff on startup uint8_t waitstate = 0; // We use this so that features detection does not slow down other stuff on startup
bool unsupported = false;
} TSlave; } TSlave;
typedef union { typedef union {
@ -461,9 +463,14 @@ void TasmotaSlave_Init(void)
TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_START), buffer, sizeof(buffer)); TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_START), buffer, sizeof(buffer));
uint8_t len = TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_END), buffer, sizeof(buffer)); uint8_t len = TasmotaSlave_Serial->readBytesUntil(char(PARAM_DATA_END), buffer, sizeof(buffer));
memcpy(&TSlaveSettings, &buffer, sizeof(TSlaveSettings)); memcpy(&TSlaveSettings, &buffer, sizeof(TSlaveSettings));
if (20191101 == TSlaveSettings.features_version) { if (20191129 == TSlaveSettings.features_version) {
TSlave.type = true; TSlave.type = true;
AddLog_P2(LOG_LEVEL_INFO, PSTR("Tasmota Slave Version %u"), TSlaveSettings.features_version); AddLog_P2(LOG_LEVEL_INFO, PSTR("Tasmota Slave Version %u"), TSlaveSettings.features_version);
} else {
if ((!TSlave.unsupported) && (TSlaveSettings.features_version > 0)) {
AddLog_P2(LOG_LEVEL_INFO, PSTR("Tasmota Slave Version %u not supported!"), TSlaveSettings.features_version);
TSlave.unsupported = true;
}
} }
} }
} }
@ -506,8 +513,9 @@ void (* const TasmotaSlaveCommand[])(void) PROGMEM = {
void CmndTasmotaSlaveReset(void) void CmndTasmotaSlaveReset(void)
{ {
TasmotaSlave_Reset(); TasmotaSlave_Reset();
TSlave.type = false; // Force redetection TSlave.type = false; // Force redetection
TSlave.waitstate = 7; // give it at least 3 seconds to restart from bootloader TSlave.waitstate = 7; // give it at least 3 seconds to restart from bootloader
TSlave.unsupported = false; // Reset unsupported flag
ResponseCmndDone(); ResponseCmndDone();
} }
@ -536,21 +544,25 @@ void TasmotaSlave_ProcessIn(void)
} }
TasmotaSlave_Serial->read(); // read trailing byte of command TasmotaSlave_Serial->read(); // read trailing byte of command
memcpy(&TSlaveCommand, &buffer, sizeof(TSlaveCommand)); memcpy(&TSlaveCommand, &buffer, sizeof(TSlaveCommand));
char inbuf[TSlaveCommand.parameter+1];
TasmotaSlave_waitForSerialData(TSlaveCommand.parameter, 50);
TasmotaSlave_Serial->read(); // Read leading byte
for (uint8_t idx = 0; idx < TSlaveCommand.parameter; idx++) {
inbuf[idx] = TasmotaSlave_Serial->read();
}
TasmotaSlave_Serial->read(); // Read trailing byte
inbuf[TSlaveCommand.parameter] = '\0';
if (CMND_PUBLISH_TELE == TSlaveCommand.command) { // We need to publish stat/ with incoming stream as content if (CMND_PUBLISH_TELE == TSlaveCommand.command) { // We need to publish stat/ with incoming stream as content
char inbuf[sizeof(TSlaveCommand.parameter)+1];
TasmotaSlave_waitForSerialData(TSlaveCommand.parameter, 50);
TasmotaSlave_Serial->read(); // Read leading byte
for (uint8_t idx = 0; idx < TSlaveCommand.parameter; idx++) {
inbuf[idx] = TasmotaSlave_Serial->read();
}
TasmotaSlave_Serial->read(); // Read trailing byte
inbuf[TSlaveCommand.parameter] = '\0';
Response_P(PSTR("{\"TasmotaSlave\":")); Response_P(PSTR("{\"TasmotaSlave\":"));
ResponseAppend_P("%s", inbuf); ResponseAppend_P("%s", inbuf);
ResponseJsonEnd(); ResponseJsonEnd();
MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data); MqttPublishPrefixTopic_P(RESULT_OR_TELE, mqtt_data);
XdrvRulesProcess(); XdrvRulesProcess();
} }
if (CMND_EXECUTE_CMND == TSlaveCommand.command) { // We need to execute the incoming command
ExecuteCommand(inbuf, SRC_IGNORE);
}
break; break;
default: default:
break; break;