mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-29 05:36:39 +00:00
Merge branch 'development' into release-7.1
This commit is contained in:
commit
c69d5db434
2
.github/issue-close-app.yml
vendored
2
.github/issue-close-app.yml
vendored
@ -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?
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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_
|
||||||
|
@ -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);"
|
||||||
"}"
|
"}"
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user