Optimize command handling

Optimize command handling
This commit is contained in:
Theo Arends 2018-05-09 10:49:43 +02:00
parent 49aec2e307
commit 016b1dd029
11 changed files with 58 additions and 28 deletions

View File

@ -9,6 +9,7 @@
* Add Portuguese in Brazil language file
* Add rule state test for On/Off in addition to 0/1 (#2613)
* Updated Italian language file (#2618)
* Optimize command handling
*
* 5.13.1 20180501
* Fix JSON buffers size too small for execution in some situations (#2580)

View File

@ -437,7 +437,12 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
// AddLog(LOG_LEVEL_DEBUG);
int command_code = GetCommandCode(command, sizeof(command), type, kTasmotaCommands);
if (CMND_BACKLOG == command_code) {
if (-1 == command_code) {
if (!XdrvCommand(grpflg, type, index, dataBuf, data_len, payload, payload16)) {
type = NULL; // Unknown command
}
}
else if (CMND_BACKLOG == command_code) {
if (data_len) {
uint8_t bl_pointer = (!backlog_pointer) ? MAX_BACKLOG -1 : backlog_pointer;
bl_pointer--;
@ -1065,12 +1070,7 @@ void MqttDataHandler(char* topic, byte* data, unsigned int data_len)
I2cScan(mqtt_data, sizeof(mqtt_data));
}
#endif // USE_I2C
else if (XdrvCommand(grpflg, type, index, dataBuf, data_len, payload, payload16)) {
// Serviced
}
else {
type = NULL;
}
else type = NULL; // Unknown command
}
if (type == NULL) {
blinks = 201;

View File

@ -541,7 +541,10 @@ bool MqttCommand()
char *dataBuf = XdrvMailbox.data;
int command_code = GetCommandCode(command, sizeof(command), type, kMqttCommands);
if (CMND_MQTTHOST == command_code) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if (CMND_MQTTHOST == command_code) {
if ((data_len > 0) && (data_len < sizeof(Settings.mqtt_host))) {
strlcpy(Settings.mqtt_host, (!strcmp(dataBuf,"0")) ? "" : (1 == payload) ? MQTT_HOST : dataBuf, sizeof(Settings.mqtt_host));
restart_flag = 2;
@ -740,7 +743,8 @@ bool MqttCommand()
}
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, GetStateText(Settings.flag.mqtt_sensor_retain));
}
else serviced = false;
else serviced = false; // Unknown command
return serviced;
}

View File

@ -1034,7 +1034,10 @@ boolean LightCommand()
char option = (1 == XdrvMailbox.data_len) ? XdrvMailbox.data[0] : '\0';
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kLightCommands);
if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if ((CMND_COLOR == command_code) && (light_subtype > LST_SINGLE) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 6)) {
if (XdrvMailbox.data_len > 0) {
valid_entry = LightColorEntry(XdrvMailbox.data, XdrvMailbox.data_len);
if (valid_entry) {
@ -1272,9 +1275,11 @@ boolean LightCommand()
else {
serviced = false; // Unknown command
}
if (coldim) {
LightPreparePower();
}
return serviced;
}

View File

@ -384,6 +384,7 @@ boolean IrSendCommand()
}
#endif // USE_IR_HVAC
else serviced = false; // Unknown command
return serviced;
}

View File

@ -803,7 +803,10 @@ boolean EnergyCommand()
unsigned long nvalue = 0;
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kEnergyCommands);
if (CMND_POWERDELTA == command_code) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if (CMND_POWERDELTA == command_code) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 101)) {
Settings.energy_power_delta = (1 == XdrvMailbox.payload) ? DEFAULT_POWER_DELTA : XdrvMailbox.payload;
}
@ -1005,16 +1008,16 @@ boolean EnergyCommand()
unit = UNIT_HOUR;
}
#endif // FEATURE_POWER_LIMIT
else {
serviced = false;
}
if (!status_flag) {
else serviced = false; // Unknown command
if (serviced && !status_flag) {
if (Settings.flag.value_units) {
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_LVALUE_SPACE_UNIT, command, nvalue, GetTextIndexed(sunit, sizeof(sunit), unit, kUnitNames));
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_LVALUE, command, nvalue);
}
}
return serviced;
}

View File

@ -198,7 +198,10 @@ boolean SonoffBridgeCommand()
boolean serviced = true;
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kSonoffBridgeCommands);
if ((command_code >= CMND_RFSYNC) && (command_code <= CMND_RFCODE)) { // RfSync, RfLow, RfHigh, RfHost and RfCode
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if ((command_code >= CMND_RFSYNC) && (command_code <= CMND_RFCODE)) { // RfSync, RfLow, RfHigh, RfHost and RfCode
char *p;
char stemp [10];
uint32_t code = 0;
@ -290,7 +293,8 @@ boolean SonoffBridgeCommand()
} else {
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_JSON_LEARNING_ACTIVE);
}
} else serviced = false;
} else serviced = false; // Unknown command
return serviced;
}

View File

@ -228,7 +228,10 @@ boolean DomoticzCommand()
if (!strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_DOMOTICZ), dmtcz_len)) { // Prefix
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic +dmtcz_len, kDomoticzCommands);
if ((CMND_IDX == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if ((CMND_IDX == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_DOMOTICZ_IDX)) {
if (XdrvMailbox.payload >= 0) {
Settings.domoticz_relay_idx[XdrvMailbox.index -1] = XdrvMailbox.payload;
restart_flag = 2;
@ -259,9 +262,10 @@ boolean DomoticzCommand()
}
snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_DOMOTICZ "%s\":%d}"), command, Settings.domoticz_update_timer);
}
else serviced = false;
else serviced = false; // Unknown command
}
else serviced = false;
else serviced = false; // Unknown command
return serviced;
}

View File

@ -89,7 +89,10 @@ boolean SerialBridgeCommand()
boolean serviced = true;
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kSerialBridgeCommands);
if ((CMND_SSERIALSEND == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if ((CMND_SSERIALSEND == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 3)) {
if (XdrvMailbox.data_len > 0) {
if (1 == XdrvMailbox.index) {
SerialBridgeSerial->write(XdrvMailbox.data, XdrvMailbox.data_len);
@ -114,9 +117,8 @@ boolean SerialBridgeCommand()
}
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_LVALUE, command, Settings.sbaudrate * 1200);
}
else {
serviced = false; // Unknown command
}
else serviced = false; // Unknown command
return serviced;
}

View File

@ -345,7 +345,10 @@ boolean TimerCommand()
UpperCase(dataBufUc, XdrvMailbox.data);
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kTimerCommands);
if ((CMND_TIMER == command_code) && (index > 0) && (index <= MAX_TIMERS)) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if ((CMND_TIMER == command_code) && (index > 0) && (index <= MAX_TIMERS)) {
uint8_t error = 0;
if (XdrvMailbox.data_len) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= MAX_TIMERS)) {
@ -484,7 +487,7 @@ boolean TimerCommand()
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, lbuff);
}
#endif
else serviced = false;
else serviced = false; // Unknown command
return serviced;
}

View File

@ -391,7 +391,10 @@ boolean RulesCommand()
uint8_t index = XdrvMailbox.index;
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kRulesCommands);
if (CMND_RULE == command_code) {
if (-1 == command_code) {
serviced = false; // Unknown command
}
else if (CMND_RULE == command_code) {
if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(Settings.rules))) {
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 6)) {
switch (XdrvMailbox.payload) {
@ -447,7 +450,7 @@ boolean RulesCommand()
}
snprintf_P(mqtt_data, sizeof(mqtt_data), S_JSON_COMMAND_SVALUE, command, D_JSON_DONE);
}
else serviced = false;
else serviced = false; // Unknown command
return serviced;
}