diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 06e444658..e9e8f390c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -345,7 +345,7 @@ #define USE_SONOFF_IFAN // Add support for Sonoff iFan02 and iFan03 (+2k code) #define USE_BUZZER // Add support for a buzzer (+0k6 code) #define USE_ARILUX_RF // Add support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0)) -//#define USE_SHUTTER // Add Shutter support for up to 4 shutter with different motortypes (+6k code) +//#define USE_SHUTTER // Add Shutter support for up to 4 shutter with different motortypes (+11k code) #define USE_DEEPSLEEP // Add support for deepsleep (+1k code) //#define USE_EXS_DIMMER // Add support for ES-Store WiFi Dimmer (+1k5 code) // #define EXS_MCU_CMNDS // Add command to send MCU commands (+0k8 code) diff --git a/tasmota/support.ino b/tasmota/support.ino index 9e23c1423..6ae6898e4 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -499,17 +499,14 @@ bool NewerVersion(char* version_str) uint32_t version = 0; uint32_t i = 0; char *str_ptr; - char* version_dup = strdup(version_str); // Duplicate the version_str as strtok_r will modify it. - if (!version_dup) { - return false; // Bail if we can't duplicate. Assume bad. - } + char version_dup[strlen(version_str) +1]; + strncpy(version_dup, version_str, sizeof(version_dup)); // Duplicate the version_str as strtok_r will modify it. // Loop through the version string, splitting on '.' seperators. for (char *str = strtok_r(version_dup, ".", &str_ptr); str && i < sizeof(VERSION); str = strtok_r(nullptr, ".", &str_ptr), i++) { int field = atoi(str); // The fields in a version string can only range from 0-255. if ((field < 0) || (field > 255)) { - free(version_dup); return false; } // Shuffle the accumulated bytes across, and add the new byte. @@ -521,7 +518,6 @@ bool NewerVersion(char* version_str) i++; } } - free(version_dup); // We no longer need this. // A version string should have 2-4 fields. e.g. 1.2, 1.2.3, or 1.2.3a (= 1.2.3.1). // If not, then don't consider it a valid version string. if ((i < 2) || (i > sizeof(VERSION))) { diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index e4fdc1479..057e159fb 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -808,18 +808,22 @@ void CmndShutterButton(void) // (setting>> 2)&(0x3f) : shutter_position single press 0 disabled, 1..101 == 0..100% // (setting>> 0)&(0x03) : shutter_index if (XdrvMailbox.data_len > 0) { - uint32_t i = 0, button_index = 0; - bool done = false, isShortCommand = false; + uint32_t i = 0; + uint32_t button_index = 0; + bool done = false; + bool isShortCommand = false; char *str_ptr; - char* version_dup = strdup(XdrvMailbox.data); // Duplicate the version_str as strtok_r will modify it. - // Loop through the version string, splitting on ' ' seperators. - for (char *str = strtok_r(version_dup, " ", &str_ptr); str && i < (1+4+4+1); str = strtok_r(nullptr, " ", &str_ptr), i++) { - int field; - if (str[0] == '-') - field = -1; - else - field = atoi(str); + char data_copy[strlen(XdrvMailbox.data) +1]; + strncpy(data_copy, XdrvMailbox.data, sizeof(data_copy)); // Duplicate data as strtok_r will modify it. + // Loop through the data string, splitting on ' ' seperators. + for (char *str = strtok_r(data_copy, " ", &str_ptr); str && i < (1+4+4+1); str = strtok_r(nullptr, " ", &str_ptr), i++) { + int field; + if (str[0] == '-') { + field = -1; + } else { + field = atoi(str); + } switch (i) { case 0: if ((field >= -1) && (field<=4)) { @@ -866,7 +870,6 @@ void CmndShutterButton(void) } if (done) break; } - free(version_dup); if (button_index) { if (button_index==-1) { @@ -957,30 +960,31 @@ void CmndShutterInvert(void) } } -void CmndShutterCalibration(void) // ???? +void CmndShutterCalibration(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= shutters_present)) { if (XdrvMailbox.data_len > 0) { - uint32_t i = 0; - char *str_ptr; - char* version_dup = strdup(XdrvMailbox.data); // Duplicate the version_str as strtok_r will modify it. - // Loop through the version string, splitting on '.' seperators. - for (char *str = strtok_r(version_dup, " ", &str_ptr); str && i < 5; str = strtok_r(nullptr, " ", &str_ptr), i++) { - int field = atoi(str); - // The fields in a version string can only range from 1-30000. - // and following value must be higher than previous one - if ((field <= 0) || (field > 30000) || ( (i>0) && (field <= messwerte[i-1]) ) ) { - break; - } - messwerte[i] = field; + uint32_t i = 0; + char *str_ptr; + + char data_copy[strlen(XdrvMailbox.data) +1]; + strncpy(data_copy, XdrvMailbox.data, sizeof(data_copy)); // Duplicate data as strtok_r will modify it. + // Loop through the data string, splitting on ' ' seperators. + for (char *str = strtok_r(data_copy, " ", &str_ptr); str && i < 5; str = strtok_r(nullptr, " ", &str_ptr), i++) { + int field = atoi(str); + // The fields in a data string can only range from 1-30000. + // and following value must be higher than previous one + if ((field <= 0) || (field > 30000) || ( (i>0) && (field <= messwerte[i-1]) ) ) { + break; } - free(version_dup); - for (i=0 ; i < 5 ; i++) { - Settings.shuttercoeff[i][XdrvMailbox.index -1] = (uint32_t)messwerte[i] * 1000 / messwerte[4]; - AddLog_P2(LOG_LEVEL_INFO, PSTR("Settings.shuttercoeff: %d, i: %d, value: %d, messwert %d"), i,XdrvMailbox.index -1,Settings.shuttercoeff[i][XdrvMailbox.index -1], messwerte[i]); - } - ShutterInit(); - ResponseCmndIdxChar(XdrvMailbox.data); + messwerte[i] = field; + } + for (i = 0; i < 5; i++) { + Settings.shuttercoeff[i][XdrvMailbox.index -1] = (uint32_t)messwerte[i] * 1000 / messwerte[4]; + AddLog_P2(LOG_LEVEL_INFO, PSTR("Settings.shuttercoeff: %d, i: %d, value: %d, messwert %d"), i,XdrvMailbox.index -1,Settings.shuttercoeff[i][XdrvMailbox.index -1], messwerte[i]); + } + ShutterInit(); + ResponseCmndIdxChar(XdrvMailbox.data); } else { char setting_chr[30] = "0"; snprintf_P(setting_chr, sizeof(setting_chr), PSTR("%d %d %d %d %d"), Settings.shuttercoeff[0][XdrvMailbox.index -1], Settings.shuttercoeff[1][XdrvMailbox.index -1], Settings.shuttercoeff[2][XdrvMailbox.index -1], Settings.shuttercoeff[3][XdrvMailbox.index -1], Settings.shuttercoeff[4][XdrvMailbox.index -1]);