diff --git a/README.md b/README.md index cfa2dca4d..858eca87f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ## Sonoff-Tasmota Provide ESP8266 based Sonoff by [iTead Studio](https://www.itead.cc/) and ElectroDragon IoT Relay with Serial, Web and MQTT control allowing 'Over the Air' or OTA firmware updates using Arduino IDE. -Current version is **5.5.1** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information. +Current version is **5.5.2** - See [sonoff/_releasenotes.ino](https://github.com/arendst/Sonoff-Tasmota/blob/master/sonoff/_releasenotes.ino) for change information. ### ATTENTION All versions diff --git a/sonoff/_releasenotes.ino b/sonoff/_releasenotes.ino index 99fe095fb..79bce7b42 100644 --- a/sonoff/_releasenotes.ino +++ b/sonoff/_releasenotes.ino @@ -1,4 +1,10 @@ -/* 5.5.1 20170805 +/* 5.5.2 20170808 + * Extent max number of WS2812 pixels from 256 to 512 (#667) + * Add OTA handling if server responds with no update available (#695) + * Removed undocumented command FlashMode (#696) + * Fix compile time error message due to increased message buffer size (#703) + * + * 5.5.1 20170805 * Fix Sonoff Rf Bridge issues * Add Sonoff RF Bridge MQTT messages on received and learned RF signal * Add command VoltRes 0|1 to select voltage resolution to 0.1 V (#654) diff --git a/sonoff/settings.ino b/sonoff/settings.ino index e5c4b70f2..47a537a1b 100644 --- a/sonoff/settings.ino +++ b/sonoff/settings.ino @@ -141,33 +141,23 @@ uint32_t _cfgLocation = CFG_LOCATION; /* * Based on cores/esp8266/Updater.cpp */ -void setFlashMode(byte option, byte mode) +void setFlashModeDout() { - char log[LOGSZ]; uint8_t *_buffer; uint32_t address; -// option 0 - Use absolute address 0 -// option 1 - Use OTA/Upgrade relative address - - if (option) { - eboot_command ebcmd; - eboot_command_read(&ebcmd); - address = ebcmd.args[0]; - } else { - address = 0; - } + eboot_command ebcmd; + eboot_command_read(&ebcmd); + address = ebcmd.args[0]; _buffer = new uint8_t[FLASH_SECTOR_SIZE]; if (SPI_FLASH_RESULT_OK == spi_flash_read(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE)) { - if (_buffer[2] != mode) { - _buffer[2] = mode &3; + if (_buffer[2] != 3) { // DOUT + _buffer[2] = 3; noInterrupts(); if (SPI_FLASH_RESULT_OK == spi_flash_erase_sector(address / FLASH_SECTOR_SIZE)) { spi_flash_write(address, (uint32_t*)_buffer, FLASH_SECTOR_SIZE); } interrupts(); - snprintf_P(log, sizeof(log), PSTR("FLSH: Set Flash Mode to %d"), (option) ? mode : ESP.getFlashChipMode()); - addLog(LOG_LEVEL_DEBUG, log); } } delete[] _buffer; diff --git a/sonoff/sonoff.ino b/sonoff/sonoff.ino index 1cda5a168..30cde67fb 100644 --- a/sonoff/sonoff.ino +++ b/sonoff/sonoff.ino @@ -25,7 +25,7 @@ - Select IDE Tools - Flash Size: "1M (no SPIFFS)" ====================================================*/ -#define VERSION 0x05050100 // 5.5.1 +#define VERSION 0x05050200 // 5.5.2 enum log_t {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE, LOG_LEVEL_ALL}; enum week_t {Last, First, Second, Third, Fourth}; @@ -119,7 +119,7 @@ enum emul_t {EMUL_NONE, EMUL_WEMO, EMUL_HUE, EMUL_MAX}; #define APP_POWER 0 // Default saved power state Off #define MAX_COUNTERS 4 // Max number of counter sensors #define MAX_PULSETIMERS 4 // Max number of supported pulse timers -#define WS2812_MAX_LEDS 256 // Max number of LEDs +#define WS2812_MAX_LEDS 512 // Max number of LEDs #define PWM_RANGE 1023 // 255..1023 needs to be devisible by 256 //#define PWM_FREQ 1000 // 100..1000 Hz led refresh @@ -1282,14 +1282,6 @@ void mqttDataCb(char* topic, byte* data, unsigned int data_len) } snprintf_P(svalue, sizeof(svalue), PSTR("{\"Sleep\":\"%d%s (%d%s)\"}"), sleep, (sysCfg.flag.value_units) ? " mS" : "", sysCfg.sleep, (sysCfg.flag.value_units) ? " mS" : ""); } - else if (!strcmp_P(type,PSTR("FLASHMODE"))) { // 0 = QIO, 1 = QOUT, 2 = DIO, 3 = DOUT - if ((payload >= 0) && (payload <= 3)) { - if (ESP.getFlashChipMode() != payload) { - setFlashMode(0, payload &3); - } - } - snprintf_P(svalue, sizeof(svalue), PSTR("{\"FlashMode\":%d}"), ESP.getFlashChipMode()); - } else if (!strcmp_P(type,PSTR("UPGRADE")) || !strcmp_P(type,PSTR("UPLOAD"))) { // Check if the payload is numerically 1, and had no trailing chars. // e.g. "1foo" or "1.2.3" could fool us. @@ -2388,21 +2380,21 @@ void stateloop() if (otaretry) { // snprintf_P(log, sizeof(log), PSTR("OTA: Attempt %d"), OTA_ATTEMPTS - otaretry); // addLog(LOG_LEVEL_INFO, log); - otaok = (HTTP_UPDATE_OK == ESPhttpUpdate.update(sysCfg.otaUrl)); + otaok = (HTTP_UPDATE_FAILED != ESPhttpUpdate.update(sysCfg.otaUrl)); if (!otaok) { otaflag = 2; } } } - if (90 == otaflag) { // Allow MQTT to reconnect + if (90 == otaflag) { // Allow MQTT to reconnect otaflag = 0; if (otaok) { - setFlashMode(1, 3); // DOUT for both ESP8266 and ESP8285 + setFlashModeDout(); // Force DOUT for both ESP8266 and ESP8285 snprintf_P(svalue, sizeof(svalue), PSTR("Successful. Restarting")); } else { snprintf_P(svalue, sizeof(svalue), PSTR("Failed %s"), ESPhttpUpdate.getLastErrorString().c_str()); } - restartflag = 2; // Restart anyway to keep memory clean webserver + restartflag = 2; // Restart anyway to keep memory clean webserver mqtt_publish_topic_P(1, PSTR("UPGRADE"), svalue); } } diff --git a/sonoff/webserver.ino b/sonoff/webserver.ino index 9f4f17f86..249fd51e5 100644 --- a/sonoff/webserver.ino +++ b/sonoff/webserver.ino @@ -1245,7 +1245,7 @@ void handleUploadLoop() _uploaderror = 4; return; } - upload.buf[2] = 3; // Force DOUT - ESP8285 + upload.buf[2] = 3; // Force DOUT - ESP8285 } } if (_uploadfiletype) { // config diff --git a/sonoff/xdrv_ws2812.ino b/sonoff/xdrv_ws2812.ino index 9b3d7f898..93a6e5fe4 100644 --- a/sonoff/xdrv_ws2812.ino +++ b/sonoff/xdrv_ws2812.ino @@ -259,18 +259,18 @@ void ws2812_clock() ws2812_stripShow(); } -void ws2812_gradientColor(struct wsColor* mColor, uint8_t range, uint8_t gradRange, uint8_t i) +void ws2812_gradientColor(struct wsColor* mColor, uint16_t range, uint16_t gradRange, uint16_t i) { /* * Compute the color of a pixel at position i using a gradient of the color scheme. * This function is used internally by the gradient function. */ ColorScheme scheme = schemes[sysCfg.ws_scheme -3]; - uint8_t curRange = i / range; - uint8_t rangeIndex = i % range; - uint8_t colorIndex = rangeIndex / gradRange; - uint8_t start = colorIndex; - uint8_t end = colorIndex +1; + uint16_t curRange = i / range; + uint16_t rangeIndex = i % range; + uint16_t colorIndex = rangeIndex / gradRange; + uint16_t start = colorIndex; + uint16_t end = colorIndex +1; if (curRange % 2 != 0) { start = (scheme.count -1) - start; end = (scheme.count -1) - end; @@ -299,9 +299,9 @@ void ws2812_gradient() } uint8_t repeat = repeatValues[sysCfg.ws_width]; // number of scheme.count per ledcount - uint8_t range = (uint8_t)ceil((float)sysCfg.ws_pixels / (float)repeat); - uint8_t gradRange = (uint8_t)ceil((float)range / (float)(scheme.count - 1)); - uint8_t offset = speedValues[sysCfg.ws_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.ws_speed] : 0; + uint16_t range = (uint16_t)ceil((float)sysCfg.ws_pixels / (float)repeat); + uint16_t gradRange = (uint16_t)ceil((float)range / (float)(scheme.count - 1)); + uint16_t offset = speedValues[sysCfg.ws_speed] > 0 ? stripTimerCntr / speedValues[sysCfg.ws_speed] : 0; wsColor oldColor, currentColor; ws2812_gradientColor(&oldColor, range, gradRange, offset); @@ -340,7 +340,7 @@ void ws2812_bars() ColorScheme scheme = schemes[sysCfg.ws_scheme -3]; - uint8_t maxSize = sysCfg.ws_pixels / scheme.count; + uint16_t maxSize = sysCfg.ws_pixels / scheme.count; if (widthValues[sysCfg.ws_width] > maxSize) { maxSize = 0; }