From 2fc7626025e2e77d4d4e665e043a7ae11bafe399 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 23 Sep 2020 08:45:14 +0200 Subject: [PATCH] JSMN phase 2 --- tasmota/xdrv_17_rcswitch.ino | 17 +++++++---------- tasmota/xdrv_39_thermostat.ino | 16 ++++++---------- tasmota/xdrv_40_telegram.ino | 26 ++++++++++++++++---------- 3 files changed, 29 insertions(+), 30 deletions(-) diff --git a/tasmota/xdrv_17_rcswitch.ino b/tasmota/xdrv_17_rcswitch.ino index ac4111e83..af89e0a9f 100644 --- a/tasmota/xdrv_17_rcswitch.ino +++ b/tasmota/xdrv_17_rcswitch.ino @@ -104,18 +104,15 @@ void CmndRfSend(void) int repeat = 10; int pulse = 350; - char dataBufUc[XdrvMailbox.data_len + 1]; - UpperCase(dataBufUc, XdrvMailbox.data); - StaticJsonBuffer<150> jsonBuf; // ArduinoJSON entry used to calculate jsonBuf: JSON_OBJECT_SIZE(5) + 40 = 134 - JsonObject &root = jsonBuf.parseObject(dataBufUc); - if (root.success()) { + JsonParserObject root = JsonParser(XdrvMailbox.data).getRootObject(); + if (root) { // RFsend {"data":0x501014,"bits":24,"protocol":1,"repeat":10,"pulse":350} char parm_uc[10]; - data = strtoul(root[UpperCase_P(parm_uc, PSTR(D_JSON_RF_DATA))], nullptr, 0); // Allow decimal (5246996) and hexadecimal (0x501014) input - bits = root[UpperCase_P(parm_uc, PSTR(D_JSON_RF_BITS))]; - protocol = root[UpperCase_P(parm_uc, PSTR(D_JSON_RF_PROTOCOL))]; - repeat = root[UpperCase_P(parm_uc, PSTR(D_JSON_RF_REPEAT))]; - pulse = root[UpperCase_P(parm_uc, PSTR(D_JSON_RF_PULSE))]; + data = root.getUInt(PSTR(D_JSON_RF_DATA), data); + bits = root.getUInt(PSTR(D_JSON_RF_BITS), bits); + protocol = root.getInt(PSTR(D_JSON_RF_PROTOCOL), protocol); + repeat = root.getInt(PSTR(D_JSON_RF_REPEAT), repeat); + pulse = root.getInt(PSTR(D_JSON_RF_PULSE), pulse); } else { // RFsend data, bits, protocol, repeat, pulse char *p; diff --git a/tasmota/xdrv_39_thermostat.ino b/tasmota/xdrv_39_thermostat.ino index 8e863822d..9c70fcb2d 100644 --- a/tasmota/xdrv_39_thermostat.ino +++ b/tasmota/xdrv_39_thermostat.ino @@ -1328,17 +1328,13 @@ void ThermostatDebug(uint8_t ctr_output) #endif // DEBUG_THERMOSTAT void ThermostatGetLocalSensor(uint8_t ctr_output) { - DynamicJsonBuffer jsonBuffer; - JsonObject& root = jsonBuffer.parseObject((const char*)mqtt_data); - if (root.success()) { - const char* value_c = root[THERMOSTAT_SENSOR_NAME]["Temperature"]; - if (value_c != NULL && strlen(value_c) > 0 && (isdigit(value_c[0]) || (value_c[0] == '-' && isdigit(value_c[1])) ) ) { - int16_t value; + JsonParserObject root = JsonParser(mqtt_data).getRootObject(); + if (root) { + JsonParserToken value_token = root[PSTR(THERMOSTAT_SENSOR_NAME)].getObject()[PSTR("Temperature")]; + if (value_token.isNum()) { + int16_t value = value_token.getFloat() * 10; if (Thermostat[ctr_output].status.temp_format == TEMP_FAHRENHEIT) { - value = (int16_t)ThermostatFahrenheitToCelsius((int32_t)(CharToFloat(value_c) * 10), TEMP_CONV_ABSOLUTE); - } - else { - value = (int16_t)(CharToFloat(value_c) * 10); + value = ThermostatFahrenheitToCelsius(value, TEMP_CONV_ABSOLUTE); } if ( (value >= -1000) && (value <= 1000) diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index 92fca7c90..e1716f56d 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -76,7 +76,7 @@ bool TelegramInit(void) { if (!telegramClient) { telegramClient = new BearSSL::WiFiClientSecure_light(tls_rx_size, tls_tx_size); #ifdef USE_MQTT_TLS_CA_CERT - telegramClient->setTrustAnchor(&GoDaddyCAG2_TA); + telegramClient->setTrustAnchor(&GoDaddyCAG2_TA, 1); #else telegramClient->setPubKeyFingerprint(Telegram_Fingerprint, Telegram_Fingerprint, false); // check server fingerprint #endif @@ -225,15 +225,21 @@ void TelegramAnalizeMessage(void) { for (uint32_t i = 1; i < Telegram.message[0][0].toInt() +1; i++) { Telegram.message[i][5] = ""; - DynamicJsonBuffer jsonBuffer; - JsonObject &root = jsonBuffer.parseObject(Telegram.message[i][0]); - if (root.success()) { - Telegram.message[i][0] = root["update_id"].as(); - Telegram.message[i][1] = root["message"]["from"]["id"].as(); - Telegram.message[i][2] = root["message"]["from"]["first_name"].as(); - Telegram.message[i][3] = root["message"]["from"]["last_name"].as(); - Telegram.message[i][4] = root["message"]["chat"]["id"].as(); - Telegram.message[i][5] = root["message"]["text"].as(); + String buf = Telegram.message[i][0]; // we need to keep a copy of the buffer + JsonParserObject root = JsonParser((char*)buf.c_str()).getRootObject(); + if (root) { + Telegram.message[i][0] = root["update_id"].getStr(); + Telegram.message[i][1] = root["message"].getObject()["from"].getObject()["id"].getStr(); + Telegram.message[i][2] = root["message"].getObject()["from"].getObject()["first_name"].getStr(); + Telegram.message[i][3] = root["message"].getObject()["from"].getObject()["last_name"].getStr(); + Telegram.message[i][4] = root["message"].getObject()["chat"].getObject()["id"].getStr(); + Telegram.message[i][5] = root["message"].getObject()["text"].getStr(); + // Telegram.message[i][0] = root["update_id"].as(); + // Telegram.message[i][1] = root["message"]["from"]["id"].as(); + // Telegram.message[i][2] = root["message"]["from"]["first_name"].as(); + // Telegram.message[i][3] = root["message"]["from"]["last_name"].as(); + // Telegram.message[i][4] = root["message"]["chat"]["id"].as(); + // Telegram.message[i][5] = root["message"]["text"].as(); } int id = Telegram.message[Telegram.message[0][0].toInt()][0].toInt() +1;