From 83b3aa576da923748e33df154922e1fa2caa980b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 27 Dec 2020 16:25:34 +0100 Subject: [PATCH 001/255] Add BSSID and Signal Strength Indicator to GUI wifi scan result (#10253) Add BSSID and Signal Strength Indicator to GUI wifi scan result (#10253) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/my_user_config.h | 1 + tasmota/tasmota_configurations.h | 3 ++ tasmota/xdrv_01_webserver.ino | 63 +++++++++++++++++++++++++++++++- 5 files changed, 68 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c8911bad..4e938070f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs (#10196) - Support for FTC532 8-button touch controller by Peter Franck (#10222) - Support character `#` to be replaced by `space`-character in command ``Publish`` topic (#10258) +- BSSID and Signal Strength Indicator to GUI wifi scan result (#10253) ### Changed - Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 04a07fa85..b3c8ada89 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -64,6 +64,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - Support for FTC532 8-button touch controller by Peter Franck [#10222](https://github.com/arendst/Tasmota/issues/10222) - Support character `#` to be replaced by `space`-character in command ``Publish`` topic [#10258](https://github.com/arendst/Tasmota/issues/10258) +- BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) ### Changed - Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e75f54ee5..f649f3664 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -415,6 +415,7 @@ #define WEB_PORT 80 // Web server Port for User and Admin mode #define WEB_USERNAME "admin" // Web server Admin mode user name // #define USE_JAVASCRIPT_ES6 // Enable ECMAScript6 syntax using less JavaScript code bytes (fails on IE11) + #define USE_ENHANCED_GUI_WIFI_SCAN // Enable wifi scan output with BSSID (+0k5 code) // #define USE_WEBSEND_RESPONSE // Enable command WebSend response message (+1k code) #define USE_EMULATION_HUE // Enable Hue Bridge emulation for Alexa (+14k code, +2k mem common) #define USE_EMULATION_WEMO // Enable Belkin WeMo emulation for Alexa (+6k code, +2k mem common) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 7b5e63372..52bd19c58 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -472,6 +472,7 @@ #undef USE_KNX // Disable KNX IP Protocol Support //#undef USE_WEBSERVER // Disable Webserver +#undef USE_ENHANCED_GUI_WIFI_SCAN // Disable wifi scan output with BSSID (+0k5 code) //#undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) #define USE_EMULATION // Enable Hue emulation #define USE_EMULATION_HUE // Enable Hue Bridge emulation for Alexa (+14k code, +2k mem common) @@ -607,6 +608,7 @@ #undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set #undef USE_KNX // Disable KNX IP Protocol Support //#undef USE_WEBSERVER // Disable Webserver +#undef USE_ENHANCED_GUI_WIFI_SCAN // Disable wifi scan output with BSSID (+0k5 code) #undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) //#undef USE_EMULATION // Disable Wemo or Hue emulation //#undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common) @@ -739,6 +741,7 @@ //#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set #undef USE_KNX // Disable KNX IP Protocol Support //#undef USE_WEBSERVER // Disable Webserver +#undef USE_ENHANCED_GUI_WIFI_SCAN // Disable wifi scan output with BSSID (+0k5 code) #undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) #undef USE_EMULATION // Disable Wemo or Hue emulation #undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 243ab46d5..82dd3b182 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -651,6 +651,12 @@ const char HTTP_HEAD_STYLE_ZIGBEE[] PROGMEM = #endif // USE_UNISHOX_COMPRESSION #endif // USE_ZIGBEE +const char HTTP_HEAD_STYLE_SSI[] PROGMEM = + // Signal Strength Indicator + ".si{display:inline-flex;align-items:flex-end;height:15px;padding:0}" + ".si i{width:3px;margin-right:1px;border-radius:3px;background-color:#%06x}" + ".si .b0{height:25%%}.si .b1{height:50%%}.si .b2{height:75%%}.si .b3{height:100%%}.o30{opacity:.3}"; + const char HTTP_HEAD_STYLE3[] PROGMEM = "" @@ -2084,7 +2090,11 @@ void HandleWifiConfiguration(void) WSContentStart_P(PSTR(D_CONFIGURE_WIFI), !WifiIsInManagerMode()); WSContentSend_P(HTTP_SCRIPT_WIFI); +#ifdef USE_ENHANCED_GUI_WIFI_SCAN + WSContentSendStyle_P(HTTP_HEAD_STYLE_SSI, WebColor(COL_TEXT)); +#else WSContentSendStyle(); +#endif // USE_ENHANCED_GUI_WIFI_SCAN if (HTTP_MANAGER_RESET_ONLY != Web.state) { if (Webserver->hasArg("scan")) { @@ -2105,6 +2115,7 @@ void HandleWifiConfiguration(void) indices[i] = i; } + // RSSI SORT for (uint32_t i = 0; i < n; i++) { for (uint32_t j = i + 1; j < n; j++) { @@ -2114,6 +2125,47 @@ void HandleWifiConfiguration(void) } } +#ifdef USE_ENHANCED_GUI_WIFI_SCAN + //display networks in page + for (uint32_t i = 0; i < n; i++) { + if (indices[i] < n) { + int32_t rssi = WiFi.RSSI(indices[i]); + String ssid = WiFi.SSID(indices[i]); + DEBUG_CORE_LOG(PSTR(D_LOG_WIFI D_SSID " %s, " D_BSSID " %s, " D_CHANNEL " %d, " D_RSSI " %d"), + ssid.c_str(), WiFi.BSSIDstr(indices[i]).c_str(), WiFi.channel(indices[i]), rssi); + + // Print SSID + WSContentSend_P(PSTR("
%s
"), HtmlEscape(ssid).c_str()); + + String nextSSID = ""; + // Handle all APs with the same SSID + for (uint32_t j = 0; j < n; j++) { + if ((indices[j] < n) && ((nextSSID = WiFi.SSID(indices[j])) == ssid)) { + // Update RSSI / quality + rssi = WiFi.RSSI(indices[j]); + uint32_t rssi_as_quality = WifiGetRssiAsQuality(rssi); + uint32_t num_bars = changeUIntScale(rssi_as_quality, 0, 100, 0, 4); + + // Print item + WSContentSend_P(PSTR("
%s(%d)
"), + rssi, rssi_as_quality, + WiFi.BSSIDstr(indices[j]).c_str(), + WiFi.channel(indices[j]) + ); + // Print signal strength indicator + for (uint32_t k = 0; k < 4; ++k) { + WSContentSend_P(PSTR(""), k, (num_bars < k) ? PSTR(" o30") : PSTR("")); + } + WSContentSend_P(PSTR("
")); + + indices[j] = n; + } + delay(0); + } + WSContentSend_P(PSTR("
")); + } + } +#else // No USE_ENHANCED_GUI_WIFI_SCAN // remove duplicates ( must be RSSI sorted ) String cssid; for (uint32_t i = 0; i < n; i++) { @@ -2135,6 +2187,7 @@ void HandleWifiConfiguration(void) DEBUG_CORE_LOG(PSTR(D_LOG_WIFI D_SSID " %s, " D_BSSID " %s, " D_CHANNEL " %d, " D_RSSI " %d"), WiFi.SSID(indices[i]).c_str(), WiFi.BSSIDstr(indices[i]).c_str(), WiFi.channel(indices[i]), rssi); int quality = WifiGetRssiAsQuality(rssi); +/* int auth = WiFi.encryptionType(indices[i]); char encryption[20]; WSContentSend_P(PSTR("
%s (%d) %s %d%% (%d dBm)
"), @@ -2143,9 +2196,17 @@ void HandleWifiConfiguration(void) GetTextIndexed(encryption, sizeof(encryption), auth +1, kEncryptionType), quality, rssi ); - delay(0); +*/ + WSContentSend_P(PSTR("
%s (%d) %d%% (%d dBm)
"), + HtmlEscape(WiFi.SSID(indices[i])).c_str(), + WiFi.channel(indices[i]), + quality, rssi + ); + delay(0); } +#endif // USE_ENHANCED_GUI_WIFI_SCAN + WSContentSend_P(PSTR("
")); } } else { From d161026534c9092b1bbe0f5224172a2a1facadd4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 28 Dec 2020 11:53:02 +0100 Subject: [PATCH 002/255] Add support for Afrikaans language translations by Christiaan Heerze --- .github/workflows/CI_github.yml | 39 ++++++++++++++++++++------- .github/workflows/CI_github_ESP32.yml | 36 +++++++++++++++++++------ .github/workflows/Tasmota_build.yml | 24 +++++++++++++++++ CHANGELOG.md | 1 + RELEASENOTES.md | 5 ++-- platformio_tasmota32.ini | 1 + platformio_tasmota_env32.ini | 4 +++ 7 files changed, 90 insertions(+), 20 deletions(-) diff --git a/.github/workflows/CI_github.yml b/.github/workflows/CI_github.yml index b8844bb5c..74cd0573a 100644 --- a/.github/workflows/CI_github.yml +++ b/.github/workflows/CI_github.yml @@ -1,6 +1,6 @@ name: Tasmota CI -on: +on: pull_request: jobs: @@ -16,7 +16,7 @@ jobs: pip install -U platformio platformio upgrade --dev platformio update - - name: Run PlatformIO + - name: Run PlatformIO run: platformio run -e tasmota - uses: actions/upload-artifact@v2 with: @@ -79,7 +79,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-sensors: runs-on: ubuntu-latest steps: @@ -156,6 +156,25 @@ jobs: name: firmware path: ./build_output/firmware + tasmota-AF: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: platformio run -e tasmota-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + tasmota-BG: runs-on: ubuntu-latest steps: @@ -174,7 +193,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-BR: runs-on: ubuntu-latest steps: @@ -250,7 +269,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-ES: runs-on: ubuntu-latest steps: @@ -269,7 +288,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-FR: runs-on: ubuntu-latest steps: @@ -326,7 +345,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-HU: runs-on: ubuntu-latest steps: @@ -402,7 +421,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-PL: runs-on: ubuntu-latest steps: @@ -478,7 +497,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-SE: runs-on: ubuntu-latest steps: @@ -554,7 +573,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota-UK: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/CI_github_ESP32.yml b/.github/workflows/CI_github_ESP32.yml index aca4ddb15..a36d747dc 100644 --- a/.github/workflows/CI_github_ESP32.yml +++ b/.github/workflows/CI_github_ESP32.yml @@ -23,7 +23,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-webcam: runs-on: ubuntu-latest steps: @@ -103,7 +103,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-sensors: runs-on: ubuntu-latest steps: @@ -164,6 +164,26 @@ jobs: name: firmware path: ./build_output/firmware + tasmota32-AF: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + tasmota32-BG: runs-on: ubuntu-latest steps: @@ -183,7 +203,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-BR: runs-on: ubuntu-latest steps: @@ -263,7 +283,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-ES: runs-on: ubuntu-latest steps: @@ -343,7 +363,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-HU: runs-on: ubuntu-latest steps: @@ -423,7 +443,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-PL: runs-on: ubuntu-latest steps: @@ -503,7 +523,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-SE: runs-on: ubuntu-latest steps: @@ -583,7 +603,7 @@ jobs: with: name: firmware path: ./build_output/firmware - + tasmota32-UK: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index b0044da28..1507fc2c2 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -230,6 +230,30 @@ jobs: name: firmware path: ./build_output/firmware + + tasmota-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota-BG: needs: tasmota_pull runs-on: ubuntu-latest diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e938070f..6911291d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Support for FTC532 8-button touch controller by Peter Franck (#10222) - Support character `#` to be replaced by `space`-character in command ``Publish`` topic (#10258) - BSSID and Signal Strength Indicator to GUI wifi scan result (#10253) +- Support for Afrikaans language translations by Christiaan Heerze ### Changed - Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b3c8ada89..4335614c2 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -59,12 +59,13 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.2.0.1 ### Added - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) +- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) +- BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) - Support for P9813 RGB Led MOSFET controller [#10104](https://github.com/arendst/Tasmota/issues/10104) - Support for GPIO option selection -- Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - Support for FTC532 8-button touch controller by Peter Franck [#10222](https://github.com/arendst/Tasmota/issues/10222) - Support character `#` to be replaced by `space`-character in command ``Publish`` topic [#10258](https://github.com/arendst/Tasmota/issues/10258) -- BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) +- Support for Afrikaans language translations by Christiaan Heerze ### Changed - Logging from fixed global memory buffer to stack buffer freeing 700 bytes RAM diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index c3aa37f2f..1fe7667a2 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -15,6 +15,7 @@ default_envs = ${build_envs.default_envs} ; tasmota32-display ; tasmota32-ir ; tasmota32-ircustom +; tasmota32-AF ; tasmota32-BG ; tasmota32-BR ; tasmota32-CN diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 4fd87373c..ff416538e 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -70,6 +70,10 @@ lib_extra_dirs = lib/libesp32, lib/lib_basic extends = env:tasmota32 build_flags = ${common32.build_flags} ${irremoteesp_full.build_flags} -DFIRMWARE_IR_CUSTOM +[env:tasmota32-AF] +extends = env:tasmota32 +build_flags = ${common32.build_flags} -DMY_LANGUAGE=af_AF + [env:tasmota32-BG] extends = env:tasmota32 build_flags = ${common32.build_flags} -DMY_LANGUAGE=bg_BG From ad5b04934dc39442620350b9b6defb0952d56809 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Mon, 28 Dec 2020 12:27:45 +0100 Subject: [PATCH 003/255] Update xdrv_27_shutter.ino code and variable optimization. Now internally testest against regression test --- tasmota/xdrv_27_shutter.ino | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index 735277e32..e46dbbca7 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -155,7 +155,7 @@ void ShutterRtc50mS(void) } } -int32_t ShutterPercentToRealPosition(uint32_t percent, uint32_t index) +int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) { if (Settings.shutter_set50percent[index] != 50) { return (percent <= 5) ? Settings.shuttercoeff[2][index] * percent*10 : (Settings.shuttercoeff[1][index] * percent + (Settings.shuttercoeff[0][index]*10))*10; @@ -177,26 +177,26 @@ int32_t ShutterPercentToRealPosition(uint32_t percent, uint32_t index) } else { //AddLog_P(LOG_LEVEL_ERROR, PSTR("Shutter[%d].open_max: %d"),index, Shutter[index].open_max); if (0 == k) { - realpos = SHT_DIV_ROUND(SHT_DIV_ROUND(percent * Shutter[index].open_max * calibrate_pos[k+1], Settings.shuttercoeff[k][index]), 10 ); + realpos = SHT_DIV_ROUND((int64_t)percent * Shutter[index].open_max * calibrate_pos[k+1], Settings.shuttercoeff[k][index]*10 ); //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realposition TEMP3: %d, %d %%, coeff %d"), realpos, percent, Settings.shuttercoeff[k][index]); } else { //uint32_t addon = ( percent*10 - Settings.shuttercoeff[k-1][index] ) * Shutter[index].open_max * (calibrate_pos[k+1] - calibrate_pos[k]) / (Settings.shuttercoeff[k][index] -Settings.shuttercoeff[k-1][index]) / 100; //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realposition TEMP2: %d, %d %%, coeff %d"), addon, (calibrate_pos[k+1] - calibrate_pos[k]), (Settings.shuttercoeff[k][index] -Settings.shuttercoeff[k-1][index])); - realpos += SHT_DIV_ROUND(SHT_DIV_ROUND((percent*10 - Settings.shuttercoeff[k-1][index] ) * Shutter[index].open_max * (calibrate_pos[k+1] - calibrate_pos[k]), Settings.shuttercoeff[k][index] - Settings.shuttercoeff[k-1][index]), 100); + realpos += SHT_DIV_ROUND(((int64_t)percent*10 - Settings.shuttercoeff[k-1][index] ) * Shutter[index].open_max * (calibrate_pos[k+1] - calibrate_pos[k]), (Settings.shuttercoeff[k][index] - Settings.shuttercoeff[k-1][index])*100); } break; } } - return realpos; + return realpos < 0 ? 0 : realpos; } } -uint8_t ShutterRealToPercentPosition(int64_t realpos, uint32_t index) +uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) { if (Settings.shutter_set50percent[index] != 50) { return (Settings.shuttercoeff[2][index] * 5 > realpos/10) ? SHT_DIV_ROUND(realpos/10, Settings.shuttercoeff[2][index]) : SHT_DIV_ROUND(realpos/10-Settings.shuttercoeff[0][index]*10, Settings.shuttercoeff[1][index]); } else { - uint64_t realpercent; + int64_t realpercent; for (uint32_t j = 0; j < 5; j++) { if (realpos >= Shutter[index].open_max * calibrate_pos[j+1] / 100) { realpercent = SHT_DIV_ROUND(Settings.shuttercoeff[j][index], 10); @@ -204,18 +204,17 @@ uint8_t ShutterRealToPercentPosition(int64_t realpos, uint32_t index) } else { //AddLog_P(LOG_LEVEL_ERROR, PSTR("Shutter[%d].open_max: %d"),index, Shutter[index].open_max); if (0 == j) { - realpercent = SHT_DIV_ROUND(SHT_DIV_ROUND((realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * Settings.shuttercoeff[j][index], calibrate_pos[j+1]/10), Shutter[index].open_max); - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realpercent TEMP3: %d %%, %d, coeff %d"), realpercent, realpos, Shutter[index].open_max * calibrate_pos[j+1] / 100); + realpercent = SHT_DIV_ROUND(((int64_t)realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * Settings.shuttercoeff[j][index], calibrate_pos[j+1]/10*Shutter[index].open_max); } else { //uint16_t addon = ( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) * 10 * (Settings.shuttercoeff[j][index] - Settings.shuttercoeff[j-1][index]) / (calibrate_pos[j+1] - calibrate_pos[j])/Shutter[index].open_max; //uint16_t addon = ( realpercent*10 - Settings.shuttercoeff[j-1][index] ) * Shutter[index].open_max * (calibrate_pos[j+1] - calibrate_pos[j]) / (Settings.shuttercoeff[j][index] -Settings.shuttercoeff[j-1][index]) / 100; //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realpercent TEMP2: %d %%, delta %d, %d, coeff %d"), addon,( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) , (calibrate_pos[j+1] - calibrate_pos[j])* Shutter[index].open_max/100, (Settings.shuttercoeff[j][index] -Settings.shuttercoeff[j-1][index])); - realpercent += SHT_DIV_ROUND(SHT_DIV_ROUND((realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * (Settings.shuttercoeff[j][index] - Settings.shuttercoeff[j-1][index]), (calibrate_pos[j+1] - calibrate_pos[j])/10), Shutter[index].open_max) ; - } + realpercent += SHT_DIV_ROUND(((int64_t)realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * (Settings.shuttercoeff[j][index] - Settings.shuttercoeff[j-1][index]), (calibrate_pos[j+1] - calibrate_pos[j])/10*Shutter[index].open_max) ; + } break; } } - return (int16_t)realpercent < 0 ? 0 : realpercent; + return realpercent < 0 ? 0 : realpercent; } } From 4d516c65a6b3d1a2ddfbbf7144028c368a84df3e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 28 Dec 2020 12:36:44 +0100 Subject: [PATCH 004/255] Prep for embedded ESP32 module template re-introduction --- tasmota/tasmota_template.h | 495 +++--------------------------- tasmota/tasmota_template_legacy.h | 480 +++++++++++++++++++++++++++++ 2 files changed, 515 insertions(+), 460 deletions(-) create mode 100644 tasmota/tasmota_template_legacy.h diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 48dd7a30f..c38b037bc 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -836,462 +836,15 @@ typedef struct MYTMPLT { //******************************************************************************************** #ifdef ESP8266 +#include "tasmota_template_legacy.h" -// User selectable GPIO functionality -// ATTENTION: No additions are supported -enum LegacyUserSelectablePins { - GPI8_NONE, // Not used - GPI8_DHT11, // DHT11 - GPI8_DHT22, // DHT21, DHT22, AM2301, AM2302, AM2321 - GPI8_SI7021, // iTead SI7021 - GPI8_DSB, // Single wire DS18B20 or DS18S20 - GPI8_I2C_SCL, // I2C SCL - GPI8_I2C_SDA, // I2C SDA - GPI8_WS2812, // WS2812 Led string - GPI8_IRSEND, // IR remote - GPI8_SWT1, // User connected external switches - GPI8_SWT2, - GPI8_SWT3, - GPI8_SWT4, - GPI8_SWT5, - GPI8_SWT6, - GPI8_SWT7, - GPI8_SWT8, - GPI8_KEY1, // Button usually connected to GPIO0 - GPI8_KEY2, - GPI8_KEY3, - GPI8_KEY4, - GPI8_REL1, // Relays - GPI8_REL2, - GPI8_REL3, - GPI8_REL4, - GPI8_REL5, - GPI8_REL6, - GPI8_REL7, - GPI8_REL8, - GPI8_REL1_INV, - GPI8_REL2_INV, - GPI8_REL3_INV, - GPI8_REL4_INV, - GPI8_REL5_INV, - GPI8_REL6_INV, - GPI8_REL7_INV, - GPI8_REL8_INV, - GPI8_PWM1, // RGB Red or C Cold White - GPI8_PWM2, // RGB Green or CW Warm White - GPI8_PWM3, // RGB Blue - GPI8_PWM4, // RGBW (Cold) White - GPI8_PWM5, // RGBCW Warm White - GPI8_CNTR1, - GPI8_CNTR2, - GPI8_CNTR3, - GPI8_CNTR4, - GPI8_PWM1_INV, // RGB Red or C Cold White - GPI8_PWM2_INV, // RGB Green or CW Warm White - GPI8_PWM3_INV, // RGB Blue - GPI8_PWM4_INV, // RGBW (Cold) White - GPI8_PWM5_INV, // RGBCW Warm White - GPI8_IRRECV, // IR receiver - GPI8_LED1, // Leds - GPI8_LED2, - GPI8_LED3, - GPI8_LED4, - GPI8_LED1_INV, - GPI8_LED2_INV, - GPI8_LED3_INV, - GPI8_LED4_INV, - GPI8_MHZ_TXD, // MH-Z19 Serial interface - GPI8_MHZ_RXD, // MH-Z19 Serial interface - GPI8_PZEM0XX_TX, // PZEM0XX Serial interface - GPI8_PZEM004_RX, // PZEM004T Serial interface - GPI8_SAIR_TX, // SenseAir Serial interface - GPI8_SAIR_RX, // SenseAir Serial interface - GPI8_SPI_CS, // SPI Chip Select - GPI8_SPI_DC, // SPI Data Direction - GPI8_BACKLIGHT, // Display backlight control - GPI8_PMS5003_RX, // Plantower PMS5003 Serial interface - GPI8_SDS0X1_RX, // Nova Fitness SDS011 Serial interface - GPI8_SBR_TX, // Serial Bridge Serial interface - GPI8_SBR_RX, // Serial Bridge Serial interface - GPI8_SR04_TRIG, // SR04 Trigger/TX pin - GPI8_SR04_ECHO, // SR04 Echo/RX pin - GPI8_SDM120_TX, // SDM120 Serial interface - GPI8_SDM120_RX, // SDM120 Serial interface - GPI8_SDM630_TX, // SDM630 Serial interface - GPI8_SDM630_RX, // SDM630 Serial interface - GPI8_TM16CLK, // TM1638 Clock - GPI8_TM16DIO, // TM1638 Data I/O - GPI8_TM16STB, // TM1638 Strobe - GPI8_SWT1_NP, // User connected external switches - GPI8_SWT2_NP, - GPI8_SWT3_NP, - GPI8_SWT4_NP, - GPI8_SWT5_NP, - GPI8_SWT6_NP, - GPI8_SWT7_NP, - GPI8_SWT8_NP, - GPI8_KEY1_NP, // Button usually connected to GPIO0 - GPI8_KEY2_NP, - GPI8_KEY3_NP, - GPI8_KEY4_NP, - GPI8_CNTR1_NP, - GPI8_CNTR2_NP, - GPI8_CNTR3_NP, - GPI8_CNTR4_NP, - GPI8_PZEM016_RX, // PZEM-014,016 Serial Modbus interface - GPI8_PZEM017_RX, // PZEM-003,017 Serial Modbus interface - GPI8_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player - GPI8_SDS0X1_TX, // Nova Fitness SDS011 Serial interface - GPI8_HX711_SCK, // HX711 Load Cell clock - GPI8_HX711_DAT, // HX711 Load Cell data - GPI8_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin - GPI8_RFSEND, // RF transmitter - GPI8_RFRECV, // RF receiver - GPI8_TUYA_TX, // Tuya Serial interface - GPI8_TUYA_RX, // Tuya Serial interface - GPI8_MGC3130_XFER, // MGC3130 Transfer - GPI8_MGC3130_RESET, // MGC3130 Reset - GPI8_SSPI_MISO, // Software SPI Master Input Client Output - GPI8_SSPI_MOSI, // Software SPI Master Output Client Input - GPI8_SSPI_SCLK, // Software SPI Serial Clock - GPI8_SSPI_CS, // Software SPI Chip Select - GPI8_SSPI_DC, // Software SPI Data or Command - GPI8_RF_SENSOR, // Rf receiver with sensor decoding - GPI8_AZ_TXD, // AZ-Instrument 7798 Serial interface - GPI8_AZ_RXD, // AZ-Instrument 7798 Serial interface - GPI8_MAX31855CS, // MAX31855 Serial interface - GPI8_MAX31855CLK, // MAX31855 Serial interface - GPI8_MAX31855DO, // MAX31855 Serial interface - GPI8_KEY1_INV, // Inverted buttons - GPI8_KEY2_INV, - GPI8_KEY3_INV, - GPI8_KEY4_INV, - GPI8_KEY1_INV_NP, // Inverted buttons without pull-up - GPI8_KEY2_INV_NP, - GPI8_KEY3_INV_NP, - GPI8_KEY4_INV_NP, - GPI8_NRG_SEL, // HLW8012/HLJ-01 Sel output (1 = Voltage) - GPI8_NRG_SEL_INV, // HLW8012/HLJ-01 Sel output (0 = Voltage) - GPI8_NRG_CF1, // HLW8012/HLJ-01 CF1 voltage / current - GPI8_HLW_CF, // HLW8012 CF power - GPI8_HJL_CF, // HJL-01/BL0937 CF power - GPI8_MCP39F5_TX, // MCP39F501 Serial interface (Shelly2) - GPI8_MCP39F5_RX, // MCP39F501 Serial interface (Shelly2) - GPI8_MCP39F5_RST, // MCP39F501 Reset (Shelly2) - GPI8_PN532_TXD, // PN532 NFC Serial Tx - GPI8_PN532_RXD, // PN532 NFC Serial Rx - GPI8_SM16716_CLK, // SM16716 CLOCK - GPI8_SM16716_DAT, // SM16716 DATA - GPI8_SM16716_SEL, // SM16716 SELECT - GPI8_DI, // my92x1 PWM input - GPI8_DCKI, // my92x1 CLK input - GPI8_CSE7766_TX, // CSE7766 Serial interface (S31 and Pow R2) - Not used anymore 20200121 - GPI8_CSE7766_RX, // CSE7766 Serial interface (S31 and Pow R2) - GPI8_ARIRFRCV, // AriLux RF Receive input - GPI8_TXD, // Serial interface - GPI8_RXD, // Serial interface - GPI8_ROT1A, // Rotary switch1 A Pin - GPI8_ROT1B, // Rotary switch1 B Pin - GPI8_ROT2A, // Rotary switch2 A Pin - GPI8_ROT2B, // Rotary switch2 B Pin - GPI8_HRE_CLOCK, // Clock/Power line for HR-E Water Meter - GPI8_HRE_DATA, // Data line for HR-E Water Meter - GPI8_ADE7953_IRQ, // ADE7953 IRQ - GPI8_LEDLNK, // Link led - GPI8_LEDLNK_INV, // Inverted link led - GPI8_ARIRFSEL, // Arilux RF Receive input selected - GPI8_BUZZER, // Buzzer - GPI8_BUZZER_INV, // Inverted buzzer - GPI8_OLED_RESET, // OLED Display Reset - GPI8_SOLAXX1_TX, // Solax Inverter tx pin - GPI8_SOLAXX1_RX, // Solax Inverter rx pin - GPI8_ZIGBEE_TX, // Zigbee Serial interface - GPI8_ZIGBEE_RX, // Zigbee Serial interface - GPI8_RDM6300_RX, // RDM6300 RX - GPI8_IBEACON_TX, // HM17 IBEACON TX - GPI8_IBEACON_RX, // HM17 IBEACON RX - GPI8_A4988_DIR, // A4988 direction pin - GPI8_A4988_STP, // A4988 step pin - GPI8_A4988_ENA, // A4988 enabled pin - GPI8_A4988_MS1, // A4988 microstep pin1 - GPI8_A4988_MS2, // A4988 microstep pin2 - GPI8_A4988_MS3, // A4988 microstep pin3 - GPI8_DDS2382_TX, // DDS2382 Serial interface - GPI8_DDS2382_RX, // DDS2382 Serial interface - GPI8_DDSU666_TX, // DDSU666 Serial interface - GPI8_DDSU666_RX, // DDSU666 Serial interface - GPI8_SM2135_CLK, // SM2135 Clk - GPI8_SM2135_DAT, // SM2135 Dat - GPI8_DEEPSLEEP, // Kill switch for deepsleep - GPI8_EXS_ENABLE, // EXS MCU Enable - GPI8_TASMOTACLIENT_TXD, // Client TX - GPI8_TASMOTACLIENT_RXD, // Client RX - GPI8_TASMOTACLIENT_RST, // Client Reset Pin - GPI8_TASMOTACLIENT_RST_INV, // Client Reset Inverted - GPI8_HPMA_RX, // Honeywell HPMA115S0 Serial interface - GPI8_HPMA_TX, // Honeywell HPMA115S0 Serial interface - GPI8_GPS_RX, // GPS serial interface - GPI8_GPS_TX, // GPS serial interface - GPI8_DSB_OUT, // Pseudo Single wire DS18B20 or DS18S20 - GPI8_DHT11_OUT, // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 - GPI8_HM10_RX, // HM10-BLE-Mijia-bridge serial interface - GPI8_HM10_TX, // HM10-BLE-Mijia-bridge serial interface - GPI8_LE01MR_RX, // F&F LE-01MR energy meter - GPI8_LE01MR_TX, // F&F LE-01MR energy meter - GPI8_CC1101_GDO0, // CC1101 pin for RX - GPI8_CC1101_GDO2, // CC1101 pin for RX - GPI8_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor - GPI8_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX - GPI8_AS3935, // Franklin Lightning Sensor - GPI8_PMS5003_TX, // Plantower PMS5003 Serial interface - GPI8_BOILER_OT_RX, // OpenTherm Boiler RX pin - GPI8_BOILER_OT_TX, // OpenTherm Boiler TX pin - GPI8_WINDMETER_SPEED, // WindMeter speed counter pin - GPI8_BL0940_RX, // BL0940 serial interface - GPI8_TCP_TX, // TCP Serial bridge - GPI8_TCP_RX, // TCP Serial bridge - GPI8_TELEINFO_RX, // TELEINFO serial interface - GPI8_TELEINFO_ENABLE,// TELEINFO Enable PIN - GPI8_LMT01, // LMT01 input counting pin - GPI8_IEM3000_TX, // IEM3000 Serial interface - GPI8_IEM3000_RX, // IEM3000 Serial interface - GPI8_ZIGBEE_RST, // Zigbee reset - GPI8_DYP_RX, - GPI8_SENSOR_END }; +/********************************************************************************************\ + * ESP8266 Module Templates +\********************************************************************************************/ -// Programmer selectable GPIO functionality -enum LegacyProgramSelectablePins { - GPI8_FIX_START = 251, - GPI8_SPI_MISO, // SPI MISO library fixed pin GPIO12 - GPI8_SPI_MOSI, // SPI MOSI library fixed pin GPIO13 - GPI8_SPI_CLK, // SPI Clk library fixed pin GPIO14 - GPI8_USER, // User configurable needs to be 255 - GPI8_MAX }; +#define USER_MODULE 255 -// Indexed by LegacyUserSelectablePins to convert legacy (8-bit) GPIOs -const uint16_t kGpioConvert[] PROGMEM = { - GPIO_NONE, - AGPIO(GPIO_DHT11), // DHT11 - AGPIO(GPIO_DHT22), // DHT21, DHT22, AM2301, AM2302, AM2321 - AGPIO(GPIO_SI7021), // iTead SI7021 - AGPIO(GPIO_DSB), // Single wire DS18B20 or DS18S20 - AGPIO(GPIO_I2C_SCL), // I2C SCL - AGPIO(GPIO_I2C_SDA), // I2C SDA - AGPIO(GPIO_WS2812), // WS2812 Led string - AGPIO(GPIO_IRSEND), // IR remote - AGPIO(GPIO_SWT1), // Switch - AGPIO(GPIO_SWT1) +1, - AGPIO(GPIO_SWT1) +2, - AGPIO(GPIO_SWT1) +3, - AGPIO(GPIO_SWT1) +4, - AGPIO(GPIO_SWT1) +5, - AGPIO(GPIO_SWT1) +6, - AGPIO(GPIO_SWT1) +7, - AGPIO(GPIO_KEY1), // Button - AGPIO(GPIO_KEY1) +1, - AGPIO(GPIO_KEY1) +2, - AGPIO(GPIO_KEY1) +3, - AGPIO(GPIO_REL1), // Relay - AGPIO(GPIO_REL1) +1, - AGPIO(GPIO_REL1) +2, - AGPIO(GPIO_REL1) +3, - AGPIO(GPIO_REL1) +4, - AGPIO(GPIO_REL1) +5, - AGPIO(GPIO_REL1) +6, - AGPIO(GPIO_REL1) +7, - AGPIO(GPIO_REL1_INV), // Relay inverted - AGPIO(GPIO_REL1_INV) +1, - AGPIO(GPIO_REL1_INV) +2, - AGPIO(GPIO_REL1_INV) +3, - AGPIO(GPIO_REL1_INV) +4, - AGPIO(GPIO_REL1_INV) +5, - AGPIO(GPIO_REL1_INV) +6, - AGPIO(GPIO_REL1_INV) +7, - AGPIO(GPIO_PWM1), // PWM - AGPIO(GPIO_PWM1) +1, - AGPIO(GPIO_PWM1) +2, - AGPIO(GPIO_PWM1) +3, - AGPIO(GPIO_PWM1) +4, - AGPIO(GPIO_CNTR1), // Counter - AGPIO(GPIO_CNTR1) +1, - AGPIO(GPIO_CNTR1) +2, - AGPIO(GPIO_CNTR1) +3, - AGPIO(GPIO_PWM1_INV), // PWM inverted - AGPIO(GPIO_PWM1_INV) +1, - AGPIO(GPIO_PWM1_INV) +2, - AGPIO(GPIO_PWM1_INV) +3, - AGPIO(GPIO_PWM1_INV) +4, - AGPIO(GPIO_IRRECV), // IR receive - AGPIO(GPIO_LED1), // Led - AGPIO(GPIO_LED1) +1, - AGPIO(GPIO_LED1) +2, - AGPIO(GPIO_LED1) +3, - AGPIO(GPIO_LED1_INV), // Led inverted - AGPIO(GPIO_LED1_INV) +1, - AGPIO(GPIO_LED1_INV) +2, - AGPIO(GPIO_LED1_INV) +3, - AGPIO(GPIO_MHZ_TXD), // MH-Z19 Serial interface - AGPIO(GPIO_MHZ_RXD), - AGPIO(GPIO_PZEM0XX_TX), // PZEM0XX Serial interface - AGPIO(GPIO_PZEM004_RX), // PZEM004T Serial interface - AGPIO(GPIO_SAIR_TX), // SenseAir Serial interface - AGPIO(GPIO_SAIR_RX), // SenseAir Serial interface - AGPIO(GPIO_SPI_CS), // SPI Chip Select - AGPIO(GPIO_SPI_DC), // SPI Data Direction - AGPIO(GPIO_BACKLIGHT), // Display backlight control - AGPIO(GPIO_PMS5003_RX), // Plantower PMS5003 Serial interface - AGPIO(GPIO_SDS0X1_RX), // Nova Fitness SDS011 Serial interface - AGPIO(GPIO_SBR_TX), // Serial Bridge Serial interface - AGPIO(GPIO_SBR_RX), // Serial Bridge Serial interface - AGPIO(GPIO_SR04_TRIG), // SR04 Tri/TXgger pin - AGPIO(GPIO_SR04_ECHO), // SR04 Ech/RXo pin - AGPIO(GPIO_SDM120_TX), // SDM120 Serial interface - AGPIO(GPIO_SDM120_RX), // SDM120 Serial interface - AGPIO(GPIO_SDM630_TX), // SDM630 Serial interface - AGPIO(GPIO_SDM630_RX), // SDM630 Serial interface - AGPIO(GPIO_TM16CLK), // TM1638 Clock - AGPIO(GPIO_TM16DIO), // TM1638 Data I/O - AGPIO(GPIO_TM16STB), // TM1638 Strobe - AGPIO(GPIO_SWT1_NP), // Switch no pullup - AGPIO(GPIO_SWT1_NP) +1, - AGPIO(GPIO_SWT1_NP) +2, - AGPIO(GPIO_SWT1_NP) +3, - AGPIO(GPIO_SWT1_NP) +4, - AGPIO(GPIO_SWT1_NP) +5, - AGPIO(GPIO_SWT1_NP) +6, - AGPIO(GPIO_SWT1_NP) +7, - AGPIO(GPIO_KEY1_NP), // Button no pullup - AGPIO(GPIO_KEY1_NP) +1, - AGPIO(GPIO_KEY1_NP) +2, - AGPIO(GPIO_KEY1_NP) +3, - AGPIO(GPIO_CNTR1_NP), // Counter no pullup - AGPIO(GPIO_CNTR1_NP) +1, - AGPIO(GPIO_CNTR1_NP) +2, - AGPIO(GPIO_CNTR1_NP) +3, - AGPIO(GPIO_PZEM016_RX), // PZEM-014,016 Serial Modbus interface - AGPIO(GPIO_PZEM017_RX), // PZEM-003,017 Serial Modbus interface - AGPIO(GPIO_MP3_DFR562), // RB-DFR-562, DFPlayer Mini MP3 Player Serial interface - AGPIO(GPIO_SDS0X1_TX), // Nova Fitness SDS011 Serial interface - AGPIO(GPIO_HX711_SCK), // HX711 Load Cell clock - AGPIO(GPIO_HX711_DAT), // HX711 Load Cell data - AGPIO(GPIO_TX2X_TXD_BLACK), // TX20/TX23 Transmission Pin - AGPIO(GPIO_RFSEND), // RF transmitter - AGPIO(GPIO_RFRECV), // RF receiver - AGPIO(GPIO_TUYA_TX), // Tuya Serial interface - AGPIO(GPIO_TUYA_RX), // Tuya Serial interface - AGPIO(GPIO_MGC3130_XFER), - AGPIO(GPIO_MGC3130_RESET), - AGPIO(GPIO_SSPI_MISO), // Software SPI Master Input Client Output - AGPIO(GPIO_SSPI_MOSI), // Software SPI Master Output Client Input - AGPIO(GPIO_SSPI_SCLK), // Software SPI Serial Clock - AGPIO(GPIO_SSPI_CS), // Software SPI Chip Select - AGPIO(GPIO_SSPI_DC), // Software SPI Data or Command - AGPIO(GPIO_RF_SENSOR), // Rf receiver with sensor decoding - AGPIO(GPIO_AZ_TXD), // AZ-Instrument 7798 CO2 datalogger Serial interface - AGPIO(GPIO_AZ_RXD), // AZ-Instrument 7798 CO2 datalogger Serial interface - AGPIO(GPIO_MAX31855CS), // MAX31855 Serial interface - AGPIO(GPIO_MAX31855CLK), // MAX31855 Serial interface - AGPIO(GPIO_MAX31855DO), // MAX31855 Serial interface - AGPIO(GPIO_KEY1_INV), // Button inverted - AGPIO(GPIO_KEY1_INV) +1, - AGPIO(GPIO_KEY1_INV) +2, - AGPIO(GPIO_KEY1_INV) +3, - AGPIO(GPIO_KEY1_INV_NP), // Button inverted no pullup - AGPIO(GPIO_KEY1_INV_NP) +1, - AGPIO(GPIO_KEY1_INV_NP) +2, - AGPIO(GPIO_KEY1_INV_NP) +3, - AGPIO(GPIO_NRG_SEL), // HLW8012/HLJ-01 Sel output (1 = Voltage) - AGPIO(GPIO_NRG_SEL_INV), // HLW8012/HLJ-01 Sel output (0 = Voltage) - AGPIO(GPIO_NRG_CF1), // HLW8012/HLJ-01 CF1 voltage / current - AGPIO(GPIO_HLW_CF), // HLW8012 CF power - AGPIO(GPIO_HJL_CF), // HJL-01/BL0937 CF power - AGPIO(GPIO_MCP39F5_TX), // MCP39F501 Serial interface (Shelly2) - AGPIO(GPIO_MCP39F5_RX), // MCP39F501 Serial interface (Shelly2) - AGPIO(GPIO_MCP39F5_RST), // MCP39F501 Reset (Shelly2) - AGPIO(GPIO_PN532_TXD), // PN532 HSU Tx - AGPIO(GPIO_PN532_RXD), // PN532 HSU Rx - AGPIO(GPIO_SM16716_CLK), // SM16716 CLOCK - AGPIO(GPIO_SM16716_DAT), // SM16716 DATA - AGPIO(GPIO_SM16716_SEL), // SM16716 SELECT - AGPIO(GPIO_DI), // my92x1 PWM input - AGPIO(GPIO_DCKI), // my92x1 CLK input - AGPIO(GPIO_CSE7766_TX), // CSE7766 Serial interface (S31 and Pow R2) - AGPIO(GPIO_CSE7766_RX), // CSE7766 Serial interface (S31 and Pow R2) - AGPIO(GPIO_ARIRFRCV), // AriLux RF Receive input - AGPIO(GPIO_TXD), // Serial interface - AGPIO(GPIO_RXD), // Serial interface - AGPIO(GPIO_ROT1A), // Rotary A Pin - AGPIO(GPIO_ROT1B), // Rotary B Pin - AGPIO(GPIO_ROT1A) +1, // Rotary A Pin - AGPIO(GPIO_ROT1B) +1, // Rotary B Pin - AGPIO(GPIO_HRE_CLOCK), - AGPIO(GPIO_HRE_DATA), - AGPIO(GPIO_ADE7953_IRQ), // ADE7953 IRQ - AGPIO(GPIO_LEDLNK), // Link led - AGPIO(GPIO_LEDLNK_INV), // Inverted link led - AGPIO(GPIO_ARIRFSEL), // Arilux RF Receive input selected - AGPIO(GPIO_BUZZER), // Buzzer - AGPIO(GPIO_BUZZER_INV), // Inverted buzzer - AGPIO(GPIO_OLED_RESET), // OLED Display Reset - AGPIO(GPIO_SOLAXX1_TX), // Solax Inverter tx pin - AGPIO(GPIO_SOLAXX1_RX), // Solax Inverter rx pin - AGPIO(GPIO_ZIGBEE_TX), // Zigbee Serial interface - AGPIO(GPIO_ZIGBEE_RX), // Zigbee Serial interface - AGPIO(GPIO_RDM6300_RX), - AGPIO(GPIO_IBEACON_TX), - AGPIO(GPIO_IBEACON_RX), - AGPIO(GPIO_A4988_DIR), // A4988 direction pin - AGPIO(GPIO_A4988_STP), // A4988 step pin - AGPIO(GPIO_A4988_ENA), // A4988 enabled pin - AGPIO(GPIO_A4988_MS1), // A4988 microstep pin1 - AGPIO(GPIO_A4988_MS1) +1, // A4988 microstep pin2 - AGPIO(GPIO_A4988_MS1) +2, // A4988 microstep pin3 - AGPIO(GPIO_DDS2382_TX), // DDS2382 Serial interface - AGPIO(GPIO_DDS2382_RX), // DDS2382 Serial interface - AGPIO(GPIO_DDSU666_TX), // DDSU666 Serial interface - AGPIO(GPIO_DDSU666_RX), // DDSU666 Serial interface - AGPIO(GPIO_SM2135_CLK), // SM2135 CLOCK - AGPIO(GPIO_SM2135_DAT), // SM2135 DATA - AGPIO(GPIO_DEEPSLEEP), - AGPIO(GPIO_EXS_ENABLE), // EXS MCU Enable - AGPIO(GPIO_TASMOTACLIENT_TXD), // Tasmota Client TX - AGPIO(GPIO_TASMOTACLIENT_RXD), // Tasmota Client RX - AGPIO(GPIO_TASMOTACLIENT_RST), // Tasmota Client Reset - AGPIO(GPIO_TASMOTACLIENT_RST_INV), // Tasmota Client Reset Inverted - AGPIO(GPIO_HPMA_RX), // Honeywell HPMA115S0 Serial interface - AGPIO(GPIO_HPMA_TX), // Honeywell HPMA115S0 Serial interface - AGPIO(GPIO_GPS_RX), // GPS serial interface - AGPIO(GPIO_GPS_TX), // GPS serial interface - AGPIO(GPIO_DSB_OUT), // Pseudo Single wire DS18B20 or DS18S20 - AGPIO(GPIO_DHT11_OUT), // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 - AGPIO(GPIO_HM10_RX), // GPS serial interface - AGPIO(GPIO_HM10_TX), // GPS serial interface - AGPIO(GPIO_LE01MR_RX), // F7F LE-01MR energy meter rx pin - AGPIO(GPIO_LE01MR_TX), // F7F LE-01MR energy meter tx pin - AGPIO(GPIO_CC1101_GDO0), // CC1101 pin for RX - AGPIO(GPIO_CC1101_GDO2), // CC1101 pin for RX - AGPIO(GPIO_HRXL_RX), - AGPIO(GPIO_ELECTRIQ_MOODL_TX), - AGPIO(GPIO_AS3935), // AS3935 IRQ Pin - AGPIO(GPIO_PMS5003_TX), // Plantower PMS5003 Serial interface - AGPIO(GPIO_BOILER_OT_RX), - AGPIO(GPIO_BOILER_OT_TX), - AGPIO(GPIO_WINDMETER_SPEED), - AGPIO(GPIO_BL0940_RX), // BL0940 Serial interface - AGPIO(GPIO_TCP_TX), // TCP Serial bridge - AGPIO(GPIO_TCP_RX), // TCP Serial bridge - AGPIO(GPIO_TELEINFO_RX), - AGPIO(GPIO_TELEINFO_ENABLE), - AGPIO(GPIO_LMT01), // LMT01, count pulses on GPIO - AGPIO(GPIO_IEM3000_TX), // IEM3000 Serial interface - AGPIO(GPIO_IEM3000_RX), // IEM3000 Serial interface - AGPIO(GPIO_ZIGBEE_RST), // Zigbee reset - AGPIO(GPIO_DYP_RX) -}; - -/********************************************************************************************/ // Supported hardware modules - enum SupportedModules { SONOFF_BASIC, SONOFF_RF, SONOFF_SV, SONOFF_TH, SONOFF_DUAL, SONOFF_POW, SONOFF_4CH, SONOFF_S2X, SLAMPHER, SONOFF_TOUCH, SONOFF_LED, CH1, CH4, MOTOR, ELECTRODRAGON, EXS_RELAY, WION, WEMOS, SONOFF_DEV, H801, @@ -1303,8 +856,6 @@ enum SupportedModules { SONOFF_IFAN03, EXS_DIMMER, PWM_DIMMER, SONOFF_D1, SONOFF_ZB_BRIDGE, MAXMODULE }; -#define USER_MODULE 255 - const char kModuleNames[] PROGMEM = "Sonoff Basic|Sonoff RF|Sonoff SV|Sonoff TH|Sonoff Dual|Sonoff Pow|Sonoff 4CH|Sonoff S2X|Slampher|Sonoff Touch|" "Sonoff LED|1 Channel|4 Channel|Motor C/AC|ElectroDragon|EXS Relay(s)|WiOn|Generic|Sonoff Dev|H801|" @@ -2696,18 +2247,42 @@ const mytmplt8285 kModules8285[TMP_MAXMODULE_8266 - TMP_WEMOS] PROGMEM = { }; #endif // ESP8266 -#ifdef ESP32 -/********************************************************************************************/ -// Supported hardware modules -enum SupportedModules { WEMOS, ESP32_CAM_AITHINKER, MAXMODULE }; +#ifdef ESP32 +/********************************************************************************************\ + * ESP32 Module templates +\********************************************************************************************/ #define USER_MODULE 255 -const char kModuleNames[] PROGMEM = "ESP32-DevKit|ESP32 Cam AiThinker"; +// Supported hardware modules +enum SupportedModules { + WEMOS, + ESP32_CAM_AITHINKER, +// ESP32_Solo, +// WT32_ETH01, +// TTGO_WATCH, +// M5STACK_CORE2, + MAXMODULE }; + +const char kModuleNames[] PROGMEM = + "ESP32-DevKit|" + "ESP32-Cam|" +// "ESP32-Solo|" +// "WT32-Eth01|" +// "TTGO Watch|" +// "M5Stack Core2|" + ; // Default module settings -const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = { WEMOS, ESP32_CAM_AITHINKER }; +const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = { + WEMOS, + ESP32_CAM_AITHINKER, +// ESP32_Solo, +// WT32_ETH01, +// TTGO_WATCH, +// M5STACK_CORE2, +}; const mytmplt kModules PROGMEM = { // WEMOS - Espressif ESP32-DevKitC - Any ESP32 device like WeMos and NodeMCU hardware (ESP32) diff --git a/tasmota/tasmota_template_legacy.h b/tasmota/tasmota_template_legacy.h new file mode 100644 index 000000000..153a6801b --- /dev/null +++ b/tasmota/tasmota_template_legacy.h @@ -0,0 +1,480 @@ +/* + tasmota_template_legacy.h - template settings for Tasmota + + Copyright (C) 2020 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifndef _TASMOTA_TEMPLATE_LEGACY_H_ +#define _TASMOTA_TEMPLATE_LEGACY_H_ + +#ifdef ESP8266 +//******************************************************************************************** +// User selectable GPIO functionality +// ATTENTION: No additions are supported +enum LegacyUserSelectablePins { + GPI8_NONE, // Not used + GPI8_DHT11, // DHT11 + GPI8_DHT22, // DHT21, DHT22, AM2301, AM2302, AM2321 + GPI8_SI7021, // iTead SI7021 + GPI8_DSB, // Single wire DS18B20 or DS18S20 + GPI8_I2C_SCL, // I2C SCL + GPI8_I2C_SDA, // I2C SDA + GPI8_WS2812, // WS2812 Led string + GPI8_IRSEND, // IR remote + GPI8_SWT1, // User connected external switches + GPI8_SWT2, + GPI8_SWT3, + GPI8_SWT4, + GPI8_SWT5, + GPI8_SWT6, + GPI8_SWT7, + GPI8_SWT8, + GPI8_KEY1, // Button usually connected to GPIO0 + GPI8_KEY2, + GPI8_KEY3, + GPI8_KEY4, + GPI8_REL1, // Relays + GPI8_REL2, + GPI8_REL3, + GPI8_REL4, + GPI8_REL5, + GPI8_REL6, + GPI8_REL7, + GPI8_REL8, + GPI8_REL1_INV, + GPI8_REL2_INV, + GPI8_REL3_INV, + GPI8_REL4_INV, + GPI8_REL5_INV, + GPI8_REL6_INV, + GPI8_REL7_INV, + GPI8_REL8_INV, + GPI8_PWM1, // RGB Red or C Cold White + GPI8_PWM2, // RGB Green or CW Warm White + GPI8_PWM3, // RGB Blue + GPI8_PWM4, // RGBW (Cold) White + GPI8_PWM5, // RGBCW Warm White + GPI8_CNTR1, + GPI8_CNTR2, + GPI8_CNTR3, + GPI8_CNTR4, + GPI8_PWM1_INV, // RGB Red or C Cold White + GPI8_PWM2_INV, // RGB Green or CW Warm White + GPI8_PWM3_INV, // RGB Blue + GPI8_PWM4_INV, // RGBW (Cold) White + GPI8_PWM5_INV, // RGBCW Warm White + GPI8_IRRECV, // IR receiver + GPI8_LED1, // Leds + GPI8_LED2, + GPI8_LED3, + GPI8_LED4, + GPI8_LED1_INV, + GPI8_LED2_INV, + GPI8_LED3_INV, + GPI8_LED4_INV, + GPI8_MHZ_TXD, // MH-Z19 Serial interface + GPI8_MHZ_RXD, // MH-Z19 Serial interface + GPI8_PZEM0XX_TX, // PZEM0XX Serial interface + GPI8_PZEM004_RX, // PZEM004T Serial interface + GPI8_SAIR_TX, // SenseAir Serial interface + GPI8_SAIR_RX, // SenseAir Serial interface + GPI8_SPI_CS, // SPI Chip Select + GPI8_SPI_DC, // SPI Data Direction + GPI8_BACKLIGHT, // Display backlight control + GPI8_PMS5003_RX, // Plantower PMS5003 Serial interface + GPI8_SDS0X1_RX, // Nova Fitness SDS011 Serial interface + GPI8_SBR_TX, // Serial Bridge Serial interface + GPI8_SBR_RX, // Serial Bridge Serial interface + GPI8_SR04_TRIG, // SR04 Trigger/TX pin + GPI8_SR04_ECHO, // SR04 Echo/RX pin + GPI8_SDM120_TX, // SDM120 Serial interface + GPI8_SDM120_RX, // SDM120 Serial interface + GPI8_SDM630_TX, // SDM630 Serial interface + GPI8_SDM630_RX, // SDM630 Serial interface + GPI8_TM16CLK, // TM1638 Clock + GPI8_TM16DIO, // TM1638 Data I/O + GPI8_TM16STB, // TM1638 Strobe + GPI8_SWT1_NP, // User connected external switches + GPI8_SWT2_NP, + GPI8_SWT3_NP, + GPI8_SWT4_NP, + GPI8_SWT5_NP, + GPI8_SWT6_NP, + GPI8_SWT7_NP, + GPI8_SWT8_NP, + GPI8_KEY1_NP, // Button usually connected to GPIO0 + GPI8_KEY2_NP, + GPI8_KEY3_NP, + GPI8_KEY4_NP, + GPI8_CNTR1_NP, + GPI8_CNTR2_NP, + GPI8_CNTR3_NP, + GPI8_CNTR4_NP, + GPI8_PZEM016_RX, // PZEM-014,016 Serial Modbus interface + GPI8_PZEM017_RX, // PZEM-003,017 Serial Modbus interface + GPI8_MP3_DFR562, // RB-DFR-562, DFPlayer Mini MP3 Player + GPI8_SDS0X1_TX, // Nova Fitness SDS011 Serial interface + GPI8_HX711_SCK, // HX711 Load Cell clock + GPI8_HX711_DAT, // HX711 Load Cell data + GPI8_TX2X_TXD_BLACK, // TX20/TX23 Transmission Pin + GPI8_RFSEND, // RF transmitter + GPI8_RFRECV, // RF receiver + GPI8_TUYA_TX, // Tuya Serial interface + GPI8_TUYA_RX, // Tuya Serial interface + GPI8_MGC3130_XFER, // MGC3130 Transfer + GPI8_MGC3130_RESET, // MGC3130 Reset + GPI8_SSPI_MISO, // Software SPI Master Input Client Output + GPI8_SSPI_MOSI, // Software SPI Master Output Client Input + GPI8_SSPI_SCLK, // Software SPI Serial Clock + GPI8_SSPI_CS, // Software SPI Chip Select + GPI8_SSPI_DC, // Software SPI Data or Command + GPI8_RF_SENSOR, // Rf receiver with sensor decoding + GPI8_AZ_TXD, // AZ-Instrument 7798 Serial interface + GPI8_AZ_RXD, // AZ-Instrument 7798 Serial interface + GPI8_MAX31855CS, // MAX31855 Serial interface + GPI8_MAX31855CLK, // MAX31855 Serial interface + GPI8_MAX31855DO, // MAX31855 Serial interface + GPI8_KEY1_INV, // Inverted buttons + GPI8_KEY2_INV, + GPI8_KEY3_INV, + GPI8_KEY4_INV, + GPI8_KEY1_INV_NP, // Inverted buttons without pull-up + GPI8_KEY2_INV_NP, + GPI8_KEY3_INV_NP, + GPI8_KEY4_INV_NP, + GPI8_NRG_SEL, // HLW8012/HLJ-01 Sel output (1 = Voltage) + GPI8_NRG_SEL_INV, // HLW8012/HLJ-01 Sel output (0 = Voltage) + GPI8_NRG_CF1, // HLW8012/HLJ-01 CF1 voltage / current + GPI8_HLW_CF, // HLW8012 CF power + GPI8_HJL_CF, // HJL-01/BL0937 CF power + GPI8_MCP39F5_TX, // MCP39F501 Serial interface (Shelly2) + GPI8_MCP39F5_RX, // MCP39F501 Serial interface (Shelly2) + GPI8_MCP39F5_RST, // MCP39F501 Reset (Shelly2) + GPI8_PN532_TXD, // PN532 NFC Serial Tx + GPI8_PN532_RXD, // PN532 NFC Serial Rx + GPI8_SM16716_CLK, // SM16716 CLOCK + GPI8_SM16716_DAT, // SM16716 DATA + GPI8_SM16716_SEL, // SM16716 SELECT + GPI8_DI, // my92x1 PWM input + GPI8_DCKI, // my92x1 CLK input + GPI8_CSE7766_TX, // CSE7766 Serial interface (S31 and Pow R2) - Not used anymore 20200121 + GPI8_CSE7766_RX, // CSE7766 Serial interface (S31 and Pow R2) + GPI8_ARIRFRCV, // AriLux RF Receive input + GPI8_TXD, // Serial interface + GPI8_RXD, // Serial interface + GPI8_ROT1A, // Rotary switch1 A Pin + GPI8_ROT1B, // Rotary switch1 B Pin + GPI8_ROT2A, // Rotary switch2 A Pin + GPI8_ROT2B, // Rotary switch2 B Pin + GPI8_HRE_CLOCK, // Clock/Power line for HR-E Water Meter + GPI8_HRE_DATA, // Data line for HR-E Water Meter + GPI8_ADE7953_IRQ, // ADE7953 IRQ + GPI8_LEDLNK, // Link led + GPI8_LEDLNK_INV, // Inverted link led + GPI8_ARIRFSEL, // Arilux RF Receive input selected + GPI8_BUZZER, // Buzzer + GPI8_BUZZER_INV, // Inverted buzzer + GPI8_OLED_RESET, // OLED Display Reset + GPI8_SOLAXX1_TX, // Solax Inverter tx pin + GPI8_SOLAXX1_RX, // Solax Inverter rx pin + GPI8_ZIGBEE_TX, // Zigbee Serial interface + GPI8_ZIGBEE_RX, // Zigbee Serial interface + GPI8_RDM6300_RX, // RDM6300 RX + GPI8_IBEACON_TX, // HM17 IBEACON TX + GPI8_IBEACON_RX, // HM17 IBEACON RX + GPI8_A4988_DIR, // A4988 direction pin + GPI8_A4988_STP, // A4988 step pin + GPI8_A4988_ENA, // A4988 enabled pin + GPI8_A4988_MS1, // A4988 microstep pin1 + GPI8_A4988_MS2, // A4988 microstep pin2 + GPI8_A4988_MS3, // A4988 microstep pin3 + GPI8_DDS2382_TX, // DDS2382 Serial interface + GPI8_DDS2382_RX, // DDS2382 Serial interface + GPI8_DDSU666_TX, // DDSU666 Serial interface + GPI8_DDSU666_RX, // DDSU666 Serial interface + GPI8_SM2135_CLK, // SM2135 Clk + GPI8_SM2135_DAT, // SM2135 Dat + GPI8_DEEPSLEEP, // Kill switch for deepsleep + GPI8_EXS_ENABLE, // EXS MCU Enable + GPI8_TASMOTACLIENT_TXD, // Client TX + GPI8_TASMOTACLIENT_RXD, // Client RX + GPI8_TASMOTACLIENT_RST, // Client Reset Pin + GPI8_TASMOTACLIENT_RST_INV, // Client Reset Inverted + GPI8_HPMA_RX, // Honeywell HPMA115S0 Serial interface + GPI8_HPMA_TX, // Honeywell HPMA115S0 Serial interface + GPI8_GPS_RX, // GPS serial interface + GPI8_GPS_TX, // GPS serial interface + GPI8_DSB_OUT, // Pseudo Single wire DS18B20 or DS18S20 + GPI8_DHT11_OUT, // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 + GPI8_HM10_RX, // HM10-BLE-Mijia-bridge serial interface + GPI8_HM10_TX, // HM10-BLE-Mijia-bridge serial interface + GPI8_LE01MR_RX, // F&F LE-01MR energy meter + GPI8_LE01MR_TX, // F&F LE-01MR energy meter + GPI8_CC1101_GDO0, // CC1101 pin for RX + GPI8_CC1101_GDO2, // CC1101 pin for RX + GPI8_HRXL_RX, // Data from MaxBotix HRXL sonar range sensor + GPI8_ELECTRIQ_MOODL_TX, // ElectriQ iQ-wifiMOODL Serial TX + GPI8_AS3935, // Franklin Lightning Sensor + GPI8_PMS5003_TX, // Plantower PMS5003 Serial interface + GPI8_BOILER_OT_RX, // OpenTherm Boiler RX pin + GPI8_BOILER_OT_TX, // OpenTherm Boiler TX pin + GPI8_WINDMETER_SPEED, // WindMeter speed counter pin + GPI8_BL0940_RX, // BL0940 serial interface + GPI8_TCP_TX, // TCP Serial bridge + GPI8_TCP_RX, // TCP Serial bridge + GPI8_TELEINFO_RX, // TELEINFO serial interface + GPI8_TELEINFO_ENABLE,// TELEINFO Enable PIN + GPI8_LMT01, // LMT01 input counting pin + GPI8_IEM3000_TX, // IEM3000 Serial interface + GPI8_IEM3000_RX, // IEM3000 Serial interface + GPI8_ZIGBEE_RST, // Zigbee reset + GPI8_DYP_RX, + GPI8_SENSOR_END }; + +// Programmer selectable GPIO functionality +enum LegacyProgramSelectablePins { + GPI8_FIX_START = 251, + GPI8_SPI_MISO, // SPI MISO library fixed pin GPIO12 + GPI8_SPI_MOSI, // SPI MOSI library fixed pin GPIO13 + GPI8_SPI_CLK, // SPI Clk library fixed pin GPIO14 + GPI8_USER, // User configurable needs to be 255 + GPI8_MAX }; + +// Indexed by LegacyUserSelectablePins to convert legacy (8-bit) GPIOs +const uint16_t kGpioConvert[] PROGMEM = { + GPIO_NONE, + AGPIO(GPIO_DHT11), // DHT11 + AGPIO(GPIO_DHT22), // DHT21, DHT22, AM2301, AM2302, AM2321 + AGPIO(GPIO_SI7021), // iTead SI7021 + AGPIO(GPIO_DSB), // Single wire DS18B20 or DS18S20 + AGPIO(GPIO_I2C_SCL), // I2C SCL + AGPIO(GPIO_I2C_SDA), // I2C SDA + AGPIO(GPIO_WS2812), // WS2812 Led string + AGPIO(GPIO_IRSEND), // IR remote + AGPIO(GPIO_SWT1), // Switch + AGPIO(GPIO_SWT1) +1, + AGPIO(GPIO_SWT1) +2, + AGPIO(GPIO_SWT1) +3, + AGPIO(GPIO_SWT1) +4, + AGPIO(GPIO_SWT1) +5, + AGPIO(GPIO_SWT1) +6, + AGPIO(GPIO_SWT1) +7, + AGPIO(GPIO_KEY1), // Button + AGPIO(GPIO_KEY1) +1, + AGPIO(GPIO_KEY1) +2, + AGPIO(GPIO_KEY1) +3, + AGPIO(GPIO_REL1), // Relay + AGPIO(GPIO_REL1) +1, + AGPIO(GPIO_REL1) +2, + AGPIO(GPIO_REL1) +3, + AGPIO(GPIO_REL1) +4, + AGPIO(GPIO_REL1) +5, + AGPIO(GPIO_REL1) +6, + AGPIO(GPIO_REL1) +7, + AGPIO(GPIO_REL1_INV), // Relay inverted + AGPIO(GPIO_REL1_INV) +1, + AGPIO(GPIO_REL1_INV) +2, + AGPIO(GPIO_REL1_INV) +3, + AGPIO(GPIO_REL1_INV) +4, + AGPIO(GPIO_REL1_INV) +5, + AGPIO(GPIO_REL1_INV) +6, + AGPIO(GPIO_REL1_INV) +7, + AGPIO(GPIO_PWM1), // PWM + AGPIO(GPIO_PWM1) +1, + AGPIO(GPIO_PWM1) +2, + AGPIO(GPIO_PWM1) +3, + AGPIO(GPIO_PWM1) +4, + AGPIO(GPIO_CNTR1), // Counter + AGPIO(GPIO_CNTR1) +1, + AGPIO(GPIO_CNTR1) +2, + AGPIO(GPIO_CNTR1) +3, + AGPIO(GPIO_PWM1_INV), // PWM inverted + AGPIO(GPIO_PWM1_INV) +1, + AGPIO(GPIO_PWM1_INV) +2, + AGPIO(GPIO_PWM1_INV) +3, + AGPIO(GPIO_PWM1_INV) +4, + AGPIO(GPIO_IRRECV), // IR receive + AGPIO(GPIO_LED1), // Led + AGPIO(GPIO_LED1) +1, + AGPIO(GPIO_LED1) +2, + AGPIO(GPIO_LED1) +3, + AGPIO(GPIO_LED1_INV), // Led inverted + AGPIO(GPIO_LED1_INV) +1, + AGPIO(GPIO_LED1_INV) +2, + AGPIO(GPIO_LED1_INV) +3, + AGPIO(GPIO_MHZ_TXD), // MH-Z19 Serial interface + AGPIO(GPIO_MHZ_RXD), + AGPIO(GPIO_PZEM0XX_TX), // PZEM0XX Serial interface + AGPIO(GPIO_PZEM004_RX), // PZEM004T Serial interface + AGPIO(GPIO_SAIR_TX), // SenseAir Serial interface + AGPIO(GPIO_SAIR_RX), // SenseAir Serial interface + AGPIO(GPIO_SPI_CS), // SPI Chip Select + AGPIO(GPIO_SPI_DC), // SPI Data Direction + AGPIO(GPIO_BACKLIGHT), // Display backlight control + AGPIO(GPIO_PMS5003_RX), // Plantower PMS5003 Serial interface + AGPIO(GPIO_SDS0X1_RX), // Nova Fitness SDS011 Serial interface + AGPIO(GPIO_SBR_TX), // Serial Bridge Serial interface + AGPIO(GPIO_SBR_RX), // Serial Bridge Serial interface + AGPIO(GPIO_SR04_TRIG), // SR04 Tri/TXgger pin + AGPIO(GPIO_SR04_ECHO), // SR04 Ech/RXo pin + AGPIO(GPIO_SDM120_TX), // SDM120 Serial interface + AGPIO(GPIO_SDM120_RX), // SDM120 Serial interface + AGPIO(GPIO_SDM630_TX), // SDM630 Serial interface + AGPIO(GPIO_SDM630_RX), // SDM630 Serial interface + AGPIO(GPIO_TM16CLK), // TM1638 Clock + AGPIO(GPIO_TM16DIO), // TM1638 Data I/O + AGPIO(GPIO_TM16STB), // TM1638 Strobe + AGPIO(GPIO_SWT1_NP), // Switch no pullup + AGPIO(GPIO_SWT1_NP) +1, + AGPIO(GPIO_SWT1_NP) +2, + AGPIO(GPIO_SWT1_NP) +3, + AGPIO(GPIO_SWT1_NP) +4, + AGPIO(GPIO_SWT1_NP) +5, + AGPIO(GPIO_SWT1_NP) +6, + AGPIO(GPIO_SWT1_NP) +7, + AGPIO(GPIO_KEY1_NP), // Button no pullup + AGPIO(GPIO_KEY1_NP) +1, + AGPIO(GPIO_KEY1_NP) +2, + AGPIO(GPIO_KEY1_NP) +3, + AGPIO(GPIO_CNTR1_NP), // Counter no pullup + AGPIO(GPIO_CNTR1_NP) +1, + AGPIO(GPIO_CNTR1_NP) +2, + AGPIO(GPIO_CNTR1_NP) +3, + AGPIO(GPIO_PZEM016_RX), // PZEM-014,016 Serial Modbus interface + AGPIO(GPIO_PZEM017_RX), // PZEM-003,017 Serial Modbus interface + AGPIO(GPIO_MP3_DFR562), // RB-DFR-562, DFPlayer Mini MP3 Player Serial interface + AGPIO(GPIO_SDS0X1_TX), // Nova Fitness SDS011 Serial interface + AGPIO(GPIO_HX711_SCK), // HX711 Load Cell clock + AGPIO(GPIO_HX711_DAT), // HX711 Load Cell data + AGPIO(GPIO_TX2X_TXD_BLACK), // TX20/TX23 Transmission Pin + AGPIO(GPIO_RFSEND), // RF transmitter + AGPIO(GPIO_RFRECV), // RF receiver + AGPIO(GPIO_TUYA_TX), // Tuya Serial interface + AGPIO(GPIO_TUYA_RX), // Tuya Serial interface + AGPIO(GPIO_MGC3130_XFER), + AGPIO(GPIO_MGC3130_RESET), + AGPIO(GPIO_SSPI_MISO), // Software SPI Master Input Client Output + AGPIO(GPIO_SSPI_MOSI), // Software SPI Master Output Client Input + AGPIO(GPIO_SSPI_SCLK), // Software SPI Serial Clock + AGPIO(GPIO_SSPI_CS), // Software SPI Chip Select + AGPIO(GPIO_SSPI_DC), // Software SPI Data or Command + AGPIO(GPIO_RF_SENSOR), // Rf receiver with sensor decoding + AGPIO(GPIO_AZ_TXD), // AZ-Instrument 7798 CO2 datalogger Serial interface + AGPIO(GPIO_AZ_RXD), // AZ-Instrument 7798 CO2 datalogger Serial interface + AGPIO(GPIO_MAX31855CS), // MAX31855 Serial interface + AGPIO(GPIO_MAX31855CLK), // MAX31855 Serial interface + AGPIO(GPIO_MAX31855DO), // MAX31855 Serial interface + AGPIO(GPIO_KEY1_INV), // Button inverted + AGPIO(GPIO_KEY1_INV) +1, + AGPIO(GPIO_KEY1_INV) +2, + AGPIO(GPIO_KEY1_INV) +3, + AGPIO(GPIO_KEY1_INV_NP), // Button inverted no pullup + AGPIO(GPIO_KEY1_INV_NP) +1, + AGPIO(GPIO_KEY1_INV_NP) +2, + AGPIO(GPIO_KEY1_INV_NP) +3, + AGPIO(GPIO_NRG_SEL), // HLW8012/HLJ-01 Sel output (1 = Voltage) + AGPIO(GPIO_NRG_SEL_INV), // HLW8012/HLJ-01 Sel output (0 = Voltage) + AGPIO(GPIO_NRG_CF1), // HLW8012/HLJ-01 CF1 voltage / current + AGPIO(GPIO_HLW_CF), // HLW8012 CF power + AGPIO(GPIO_HJL_CF), // HJL-01/BL0937 CF power + AGPIO(GPIO_MCP39F5_TX), // MCP39F501 Serial interface (Shelly2) + AGPIO(GPIO_MCP39F5_RX), // MCP39F501 Serial interface (Shelly2) + AGPIO(GPIO_MCP39F5_RST), // MCP39F501 Reset (Shelly2) + AGPIO(GPIO_PN532_TXD), // PN532 HSU Tx + AGPIO(GPIO_PN532_RXD), // PN532 HSU Rx + AGPIO(GPIO_SM16716_CLK), // SM16716 CLOCK + AGPIO(GPIO_SM16716_DAT), // SM16716 DATA + AGPIO(GPIO_SM16716_SEL), // SM16716 SELECT + AGPIO(GPIO_DI), // my92x1 PWM input + AGPIO(GPIO_DCKI), // my92x1 CLK input + AGPIO(GPIO_CSE7766_TX), // CSE7766 Serial interface (S31 and Pow R2) + AGPIO(GPIO_CSE7766_RX), // CSE7766 Serial interface (S31 and Pow R2) + AGPIO(GPIO_ARIRFRCV), // AriLux RF Receive input + AGPIO(GPIO_TXD), // Serial interface + AGPIO(GPIO_RXD), // Serial interface + AGPIO(GPIO_ROT1A), // Rotary A Pin + AGPIO(GPIO_ROT1B), // Rotary B Pin + AGPIO(GPIO_ROT1A) +1, // Rotary A Pin + AGPIO(GPIO_ROT1B) +1, // Rotary B Pin + AGPIO(GPIO_HRE_CLOCK), + AGPIO(GPIO_HRE_DATA), + AGPIO(GPIO_ADE7953_IRQ), // ADE7953 IRQ + AGPIO(GPIO_LEDLNK), // Link led + AGPIO(GPIO_LEDLNK_INV), // Inverted link led + AGPIO(GPIO_ARIRFSEL), // Arilux RF Receive input selected + AGPIO(GPIO_BUZZER), // Buzzer + AGPIO(GPIO_BUZZER_INV), // Inverted buzzer + AGPIO(GPIO_OLED_RESET), // OLED Display Reset + AGPIO(GPIO_SOLAXX1_TX), // Solax Inverter tx pin + AGPIO(GPIO_SOLAXX1_RX), // Solax Inverter rx pin + AGPIO(GPIO_ZIGBEE_TX), // Zigbee Serial interface + AGPIO(GPIO_ZIGBEE_RX), // Zigbee Serial interface + AGPIO(GPIO_RDM6300_RX), + AGPIO(GPIO_IBEACON_TX), + AGPIO(GPIO_IBEACON_RX), + AGPIO(GPIO_A4988_DIR), // A4988 direction pin + AGPIO(GPIO_A4988_STP), // A4988 step pin + AGPIO(GPIO_A4988_ENA), // A4988 enabled pin + AGPIO(GPIO_A4988_MS1), // A4988 microstep pin1 + AGPIO(GPIO_A4988_MS1) +1, // A4988 microstep pin2 + AGPIO(GPIO_A4988_MS1) +2, // A4988 microstep pin3 + AGPIO(GPIO_DDS2382_TX), // DDS2382 Serial interface + AGPIO(GPIO_DDS2382_RX), // DDS2382 Serial interface + AGPIO(GPIO_DDSU666_TX), // DDSU666 Serial interface + AGPIO(GPIO_DDSU666_RX), // DDSU666 Serial interface + AGPIO(GPIO_SM2135_CLK), // SM2135 CLOCK + AGPIO(GPIO_SM2135_DAT), // SM2135 DATA + AGPIO(GPIO_DEEPSLEEP), + AGPIO(GPIO_EXS_ENABLE), // EXS MCU Enable + AGPIO(GPIO_TASMOTACLIENT_TXD), // Tasmota Client TX + AGPIO(GPIO_TASMOTACLIENT_RXD), // Tasmota Client RX + AGPIO(GPIO_TASMOTACLIENT_RST), // Tasmota Client Reset + AGPIO(GPIO_TASMOTACLIENT_RST_INV), // Tasmota Client Reset Inverted + AGPIO(GPIO_HPMA_RX), // Honeywell HPMA115S0 Serial interface + AGPIO(GPIO_HPMA_TX), // Honeywell HPMA115S0 Serial interface + AGPIO(GPIO_GPS_RX), // GPS serial interface + AGPIO(GPIO_GPS_TX), // GPS serial interface + AGPIO(GPIO_DSB_OUT), // Pseudo Single wire DS18B20 or DS18S20 + AGPIO(GPIO_DHT11_OUT), // Pseudo Single wire DHT11, DHT21, DHT22, AM2301, AM2302, AM2321 + AGPIO(GPIO_HM10_RX), // GPS serial interface + AGPIO(GPIO_HM10_TX), // GPS serial interface + AGPIO(GPIO_LE01MR_RX), // F7F LE-01MR energy meter rx pin + AGPIO(GPIO_LE01MR_TX), // F7F LE-01MR energy meter tx pin + AGPIO(GPIO_CC1101_GDO0), // CC1101 pin for RX + AGPIO(GPIO_CC1101_GDO2), // CC1101 pin for RX + AGPIO(GPIO_HRXL_RX), + AGPIO(GPIO_ELECTRIQ_MOODL_TX), + AGPIO(GPIO_AS3935), // AS3935 IRQ Pin + AGPIO(GPIO_PMS5003_TX), // Plantower PMS5003 Serial interface + AGPIO(GPIO_BOILER_OT_RX), + AGPIO(GPIO_BOILER_OT_TX), + AGPIO(GPIO_WINDMETER_SPEED), + AGPIO(GPIO_BL0940_RX), // BL0940 Serial interface + AGPIO(GPIO_TCP_TX), // TCP Serial bridge + AGPIO(GPIO_TCP_RX), // TCP Serial bridge + AGPIO(GPIO_TELEINFO_RX), + AGPIO(GPIO_TELEINFO_ENABLE), + AGPIO(GPIO_LMT01), // LMT01, count pulses on GPIO + AGPIO(GPIO_IEM3000_TX), // IEM3000 Serial interface + AGPIO(GPIO_IEM3000_RX), // IEM3000 Serial interface + AGPIO(GPIO_ZIGBEE_RST), // Zigbee reset + AGPIO(GPIO_DYP_RX) +}; + +/********************************************************************************************/ +#endif // ESP8266 + +#endif // _TASMOTA_TEMPLATE_LEGACY_H_ From 6058cf014ef57d5fdd53c7c383cbc3684e0630a5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 28 Dec 2020 18:01:02 +0100 Subject: [PATCH 005/255] Prep for embedded ESP32 module template re-introduction --- tasmota/support.ino | 17 +++- tasmota/tasmota_template.h | 200 +++++++++++++++++++++++++++---------- 2 files changed, 164 insertions(+), 53 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 30436fd2f..577c8bb95 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1304,6 +1304,17 @@ uint8_t ModuleNr(void) return (USER_MODULE == Settings.module) ? 0 : Settings.module +1; } +uint32_t ModuleTemplate(uint32_t module) { + uint32_t i = 0; + for (i = 0; i < sizeof(kModuleNiceList); i++) { + if (Settings.module == pgm_read_byte(kModuleNiceList + i)) { + break; + } + } + if (i == sizeof(kModuleNiceList)) { i = 0; } + return i; +} + bool ValidTemplateModule(uint32_t index) { for (uint32_t i = 0; i < sizeof(kModuleNiceList); i++) { @@ -1399,7 +1410,7 @@ void TemplateGpios(myio *gp) GetInternalTemplate(&src, Settings.module, 1); #endif // ESP8266 #ifdef ESP32 - memcpy_P(&src, &kModules.gp, sizeof(mycfgio)); + memcpy_P(&src, &kModules[ModuleTemplate(Settings.module)].gp, sizeof(mycfgio)); #endif // ESP32 } // 11 85 00 85 85 00 00 00 15 38 85 00 00 81 @@ -1429,7 +1440,7 @@ gpio_flag ModuleFlag(void) GetInternalTemplate(&flag, Settings.module, 2); #endif // ESP8266 #ifdef ESP32 - memcpy_P(&flag, &kModules.flag, sizeof(gpio_flag)); + memcpy_P(&flag, &kModules[ModuleTemplate(Settings.module)].flag, sizeof(gpio_flag)); #endif // ESP32 } @@ -1446,7 +1457,7 @@ void ModuleDefault(uint32_t module) GetInternalTemplate(&Settings.user_template, module, 3); #endif // ESP8266 #ifdef ESP32 - memcpy_P(&Settings.user_template, &kModules, sizeof(mytmplt)); + memcpy_P(&Settings.user_template, &kModules[module], sizeof(mytmplt)); #endif // ESP32 } diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index c38b037bc..be9507d60 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -2259,74 +2259,174 @@ const mytmplt8285 kModules8285[TMP_MAXMODULE_8266 - TMP_WEMOS] PROGMEM = { enum SupportedModules { WEMOS, ESP32_CAM_AITHINKER, -// ESP32_Solo, -// WT32_ETH01, -// TTGO_WATCH, -// M5STACK_CORE2, + ESP32_Solo, + WT32_ETH01, + TTGO_WATCH, + M5STACK_CORE2, MAXMODULE }; const char kModuleNames[] PROGMEM = "ESP32-DevKit|" +#ifdef USE_WEBCAM "ESP32-Cam|" +#endif // USE_WEBCAM // "ESP32-Solo|" // "WT32-Eth01|" // "TTGO Watch|" -// "M5Stack Core2|" +#ifdef USE_M5STACK_CORE2 + "M5Stack Core2|" +#endif // USE_M5STACK_CORE2 ; // Default module settings -const uint8_t kModuleNiceList[MAXMODULE] PROGMEM = { +const uint8_t kModuleNiceList[] PROGMEM = { WEMOS, +#ifdef USE_WEBCAM ESP32_CAM_AITHINKER, +#endif // USE_WEBCAM // ESP32_Solo, // WT32_ETH01, // TTGO_WATCH, -// M5STACK_CORE2, +#ifdef USE_M5STACK_CORE2 + M5STACK_CORE2, +#endif // USE_M5STACK_CORE2 }; -const mytmplt kModules PROGMEM = -{ // WEMOS - Espressif ESP32-DevKitC - Any ESP32 device like WeMos and NodeMCU hardware (ESP32) - AGPIO(GPIO_USER), // 0 (I)O GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK - AGPIO(GPIO_USER), // 1 IO TXD0 GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 - AGPIO(GPIO_USER), // 2 IO GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0 - AGPIO(GPIO_USER), // 3 IO RXD0 GPIO3, U0RXD, CLK_OUT2 - AGPIO(GPIO_USER), // 4 IO GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER - AGPIO(GPIO_USER), // 5 IO GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK - // 6 IO GPIO6, Flash CLK - // 7 IO GPIO7, Flash D0 - // 8 IO GPIO8, Flash D1 - AGPIO(GPIO_USER), // 9 IO GPIO9, Flash D2, U1RXD - AGPIO(GPIO_USER), // 10 IO GPIO10, Flash D3, U1TXD - // 11 IO GPIO11, Flash CMD - AGPIO(GPIO_USER), // 12 (I)O GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 (If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. Has internal pull-down, so unconnected = Low = 3.3V. May prevent flashing and/or booting if 3.3V flash is connected and pulled high. See ESP32 datasheet for more details.) - AGPIO(GPIO_USER), // 13 IO GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER - AGPIO(GPIO_USER), // 14 IO GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 - AGPIO(GPIO_USER), // 15 (I)O GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 (If driven Low, silences boot messages from normal boot. Has internal pull-up, so unconnected = High = normal output.) - AGPIO(GPIO_USER), // 16 IO GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT - AGPIO(GPIO_USER), // 17 IO GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 - AGPIO(GPIO_USER), // 18 IO GPIO18, VSPICLK, HS1_DATA7 - AGPIO(GPIO_USER), // 19 IO GPIO19, VSPIQ, U0CTS, EMAC_TXD0 - 0, // 20 - AGPIO(GPIO_USER), // 21 IO GPIO21, VSPIHD, EMAC_TX_EN - AGPIO(GPIO_USER), // 22 IO LED GPIO22, VSPIWP, U0RTS, EMAC_TXD1 - AGPIO(GPIO_USER), // 23 IO GPIO23, VSPID, HS1_STROBE - 0, // 24 - AGPIO(GPIO_USER), // 25 IO GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 - AGPIO(GPIO_USER), // 26 IO GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 - AGPIO(GPIO_USER), // 27 IO GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV - 0, // 28 - 0, // 29 - 0, // 30 - 0, // 31 - AGPIO(GPIO_USER), // 32 IO GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4, TOUCH9, RTC_GPIO9 - AGPIO(GPIO_USER), // 33 IO GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8 - AGPIO(GPIO_USER), // 34 I NO PULLUP GPIO34, ADC1_CH6, RTC_GPIO4 - AGPIO(GPIO_USER), // 35 I NO PULLUP GPIO35, ADC1_CH7, RTC_GPIO5 - AGPIO(GPIO_USER), // 36 I NO PULLUP GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0 - 0, // 37 NO PULLUP - 0, // 38 NO PULLUP - AGPIO(GPIO_USER), // 39 I NO PULLUP GPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3 - 0 // Flag +const mytmplt kModules[] PROGMEM = +{ + { // WEMOS - Espressif ESP32-DevKitC - Any ESP32 device like WeMos and NodeMCU hardware (ESP32) + AGPIO(GPIO_USER), // 0 (I)O GPIO0, ADC2_CH1, TOUCH1, RTC_GPIO11, CLK_OUT1, EMAC_TX_CLK + AGPIO(GPIO_USER), // 1 IO TXD0 GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 + AGPIO(GPIO_USER), // 2 IO GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0 + AGPIO(GPIO_USER), // 3 IO RXD0 GPIO3, U0RXD, CLK_OUT2 + AGPIO(GPIO_USER), // 4 IO GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER + AGPIO(GPIO_USER), // 5 IO GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK + // 6 IO GPIO6, Flash CLK + // 7 IO GPIO7, Flash D0 + // 8 IO GPIO8, Flash D1 + AGPIO(GPIO_USER), // 9 IO GPIO9, Flash D2, U1RXD + AGPIO(GPIO_USER), // 10 IO GPIO10, Flash D3, U1TXD + // 11 IO GPIO11, Flash CMD + AGPIO(GPIO_USER), // 12 (I)O GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 (If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. Has internal pull-down, so unconnected = Low = 3.3V. May prevent flashing and/or booting if 3.3V flash is connected and pulled high. See ESP32 datasheet for more details.) + AGPIO(GPIO_USER), // 13 IO GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER + AGPIO(GPIO_USER), // 14 IO GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 + AGPIO(GPIO_USER), // 15 (I)O GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 (If driven Low, silences boot messages from normal boot. Has internal pull-up, so unconnected = High = normal output.) + AGPIO(GPIO_USER), // 16 IO GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT + AGPIO(GPIO_USER), // 17 IO GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 + AGPIO(GPIO_USER), // 18 IO GPIO18, VSPICLK, HS1_DATA7 + AGPIO(GPIO_USER), // 19 IO GPIO19, VSPIQ, U0CTS, EMAC_TXD0 + 0, // 20 + AGPIO(GPIO_USER), // 21 IO GPIO21, VSPIHD, EMAC_TX_EN + AGPIO(GPIO_USER), // 22 IO LED GPIO22, VSPIWP, U0RTS, EMAC_TXD1 + AGPIO(GPIO_USER), // 23 IO GPIO23, VSPID, HS1_STROBE + 0, // 24 + AGPIO(GPIO_USER), // 25 IO GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 + AGPIO(GPIO_USER), // 26 IO GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 + AGPIO(GPIO_USER), // 27 IO GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + AGPIO(GPIO_USER), // 32 IO GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4, TOUCH9, RTC_GPIO9 + AGPIO(GPIO_USER), // 33 IO GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8 + AGPIO(GPIO_USER), // 34 I NO PULLUP GPIO34, ADC1_CH6, RTC_GPIO4 + AGPIO(GPIO_USER), // 35 I NO PULLUP GPIO35, ADC1_CH7, RTC_GPIO5 + AGPIO(GPIO_USER), // 36 I NO PULLUP GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0 + 0, // 37 NO PULLUP + 0, // 38 NO PULLUP + AGPIO(GPIO_USER), // 39 I NO PULLUP GPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3 + 0 // Flag + }, +#ifdef USE_WEBCAM + { // ESP32_CAM_AITHINKER - Any ESP32 device with webcam (ESP32) + AGPIO(GPIO_WEBCAM_XCLK), // 0 (I)O GPIO0, CAM_XCLK + AGPIO(GPIO_USER), // 1 IO TXD0 GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 + AGPIO(GPIO_USER), // 2 IO GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0 + AGPIO(GPIO_USER), // 3 IO RXD0 GPIO3, U0RXD, CLK_OUT2 + AGPIO(GPIO_USER), // 4 IO GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER + AGPIO(GPIO_WEBCAM_DATA), // 5 IO GPIO5, CAM_DATA1 + // 6 IO GPIO6, Flash CLK + // 7 IO GPIO7, Flash D0 + // 8 IO GPIO8, Flash D1 + AGPIO(GPIO_USER), // 9 IO GPIO9, Flash D2, U1RXD + AGPIO(GPIO_USER), // 10 IO GPIO10, Flash D3, U1TXD + // 11 IO GPIO11, Flash CMD + AGPIO(GPIO_USER), // 12 (I)O GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 (If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. Has internal pull-down, so unconnected = Low = 3.3V. May prevent flashing and/or booting if 3.3V flash is connected and pulled high. See ESP32 datasheet for more details.) + AGPIO(GPIO_USER), // 13 IO GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER + AGPIO(GPIO_USER), // 14 IO GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 + AGPIO(GPIO_USER), // 15 (I)O GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 (If driven Low, silences boot messages from normal boot. Has internal pull-up, so unconnected = High = normal output.) + AGPIO(GPIO_USER), // 16 IO GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT + AGPIO(GPIO_USER), // 17 IO GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 + AGPIO(GPIO_WEBCAM_DATA) +1, // 18 IO GPIO18, CAM_DATA2 + AGPIO(GPIO_WEBCAM_DATA) +2, // 19 IO GPIO19, CAM_DATA3 + 0, // 20 + AGPIO(GPIO_WEBCAM_DATA) +3, // 21 IO GPIO21, CAM_DATA4 + AGPIO(GPIO_WEBCAM_PCLK), // 22 IO LED GPIO22, CAM_PCLK + AGPIO(GPIO_WEBCAM_HREF), // 23 IO GPIO23, CAM_HREF + 0, // 24 + AGPIO(GPIO_WEBCAM_VSYNC), // 25 IO GPIO25, CAM_VSYNC + AGPIO(GPIO_WEBCAM_SIOD), // 26 IO GPIO26, CAM_SIOD + AGPIO(GPIO_WEBCAM_SIOC), // 27 IO GPIO27, CAM_SIOC + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + AGPIO(GPIO_WEBCAM_PWDN), // 32 IO GPIO32, CAM_PWDN + AGPIO(GPIO_USER), // 33 IO GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8 + AGPIO(GPIO_WEBCAM_DATA) +6, // 34 I NO PULLUP GPIO34, CAM_DATA7 + AGPIO(GPIO_WEBCAM_DATA) +7, // 35 I NO PULLUP GPIO35, CAM_DATA8 + AGPIO(GPIO_WEBCAM_DATA) +4, // 36 I NO PULLUP GPIO36, CAM_DATA5 + 0, // 37 NO PULLUP + 0, // 38 NO PULLUP + AGPIO(GPIO_WEBCAM_DATA) +5, // 39 I NO PULLUP GPIO39, CAM_DATA6 + 0 // Flag + } +#endif // USE_WEBCAM +#ifdef USE_M5STACK_CORE2 + { // WEMOS - Espressif ESP32-DevKitC - Any ESP32 device like WeMos and NodeMCU hardware (ESP32) + AGPIO(GPIO_USER), // 0 (I)O GPIO0, SPKR_LRCK + AGPIO(GPIO_USER), // 1 IO TXD0 GPIO1, U0TXD + AGPIO(GPIO_USER), // 2 IO GPIO2, SPKR_DATA + AGPIO(GPIO_USER), // 3 IO RXD0 GPIO3, U0RXD + 0, // 4 IO GPIO4, SPI_CS_CARD + 0, // 5 IO GPIO5, SPI_CS_LCD + // 6 IO GPIO6, Flash CLK + // 7 IO GPIO7, Flash D0 + // 8 IO GPIO8, Flash D1 + 0, // 9 IO GPIO9, Flash D2, PSRAM_D3 + 0, // 10 IO GPIO10, Flash D3, PSRAM_D2 + // 11 IO GPIO11, Flash CMD + 0, // 12 (I)O GPIO12, SPKR_CLK + AGPIO(GPIO_USER), // 13 IO GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER + AGPIO(GPIO_USER), // 14 IO GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 + 0, // 15 (I)O GPIO15, SPI_DC_LCD + 0, // 16 IO GPIO16, PSRAM_CS + 0, // 17 IO GPIO17, PSRAM_CLK + AGPIO(GPIO_SPI_CLK), // 18 IO GPIO18, SPI_CLK + AGPIO(GPIO_USER), // 19 IO GPIO19, VSPIQ, U0CTS, EMAC_TXD0 + 0, // 20 + 0, // 21 IO GPIO21, I2C_SDA_INTERNAL + 0, // 22 IO LED GPIO22, I2C_SCL_INTERNAL + AGPIO(GPIO_SPI_MOSI), // 23 IO GPIO23, SPI_MOSI + 0, // 24 + AGPIO(GPIO_USER), // 25 IO GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 + AGPIO(GPIO_USER), // 26 IO GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 + AGPIO(GPIO_USER), // 27 IO GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV + 0, // 28 + 0, // 29 + 0, // 30 + 0, // 31 + AGPIO(GPIO_I2C_SDA), // 32 IO GPIO32, I2C_SDA + AGPIO(GPIO_I2C_SCL), // 33 IO GPIO33, I2C_SCL + AGPIO(GPIO_USER), // 34 I NO PULLUP GPIO34, ADC1_CH6, RTC_GPIO4 + AGPIO(GPIO_USER), // 35 I NO PULLUP GPIO35, ADC1_CH7, RTC_GPIO5 + AGPIO(GPIO_USER), // 36 I NO PULLUP GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0 + 0, // 37 NO PULLUP + AGPIO(GPIO_SPI_MISO), // 38 NO PULLUP GPIO38, SPI_MISO + 0, // 39 I NO PULLUP GPIO39, INT_TOUCHPAD + 0 // Flag + } +#endif // USE_M5STACK_CORE2 }; /*********************************************************************************************\ From c04c97af882c47e017d35b572326b62868a0940c Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Mon, 28 Dec 2020 15:29:26 -0800 Subject: [PATCH 006/255] Update contributing doc to point to development branch. I think this was a typo, as the dev branch doesn't exist, yet development does. --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 34c3c2b98..8a2d4afc5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -47,13 +47,13 @@ The process is straight-forward. - Fork the Tasmota Repository [git repository](https://github.com/arendst/Tasmota). - Write/Change the code in your Fork for a new feature, bug fix, new sensor, optimization, etc. - Ensure tests work. - - Create a Pull Request against the [**dev**](https://github.com/arendst/Tasmota/tree/dev) branch of Tasmota. + - Create a Pull Request against the [**development**](https://github.com/arendst/Tasmota/tree/development) branch of Tasmota. -1. All pull requests must be done against the dev branch. +1. All pull requests must be done against the development branch. 2. Only relevant files should be touched (Also beware if your editor has auto-formatting feature enabled). 3. Only one feature/fix should be added per PR. 4. If adding a new functionality (new hardware, new library support) not related to an existing component move it to it's own modules (.ino file). -5. PRs that don't compile (fail in CI Tests) or cause coding errors will not be merged. Please fix the issue. Same goes for PRs that are raised against older commit in dev - you might need to rebase and resolve conflicts. +5. PRs that don't compile (fail in CI Tests) or cause coding errors will not be merged. Please fix the issue. Same goes for PRs that are raised against older commit in development - you might need to rebase and resolve conflicts. 6. All pull requests should undergo peer review by at least one contributor other than the creator, excepts for the owner. 7. All pull requests should consider updates to the documentation. 8. Pull requests that address an outstanding issue, particularly an issue deemed to be severe, should be given priority. From 02f34a3d6d0ca5892ca9fe3986fe11a23e0372ee Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 29 Dec 2020 10:35:44 +0100 Subject: [PATCH 007/255] Add IR_SEND_INVERTED and IR_SEND_USE_MODULATION compile options --- tasmota/my_user_config.h | 4 ++++ tasmota/xdrv_05_irremote.ino | 2 +- tasmota/xdrv_05_irremote_full.ino | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index fc108ce9f..7c354c8bf 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -719,6 +719,10 @@ // -- IR Remote features - subset of IR protocols -------------------------- #define USE_IR_REMOTE // Send IR remote commands using library IRremoteESP8266 and ArduinoJson (+4k3 code, 0k3 mem, 48 iram) + #define IR_SEND_INVERTED false // Invert the output. (default = false) e.g. LED is illuminated when GPIO is LOW rather than HIGH. + // Setting inverted to something other than the default could easily destroy your IR LED if you are overdriving it. + // Unless you REALLY know what you are doing, don't change this. + #define IR_SEND_USE_MODULATION true // Do we do frequency modulation during transmission? i.e. If not, assume a 100% duty cycle. #define USE_IR_SEND_NEC // Support IRsend NEC protocol #define USE_IR_SEND_RC5 // Support IRsend Philips RC5 protocol #define USE_IR_SEND_RC6 // Support IRsend Philips RC6 protocol diff --git a/tasmota/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino index 881ce62bf..efa048465 100644 --- a/tasmota/xdrv_05_irremote.ino +++ b/tasmota/xdrv_05_irremote.ino @@ -128,7 +128,7 @@ IRsend *irsend = nullptr; void IrSendInit(void) { - irsend = new IRsend(Pin(GPIO_IRSEND)); // an IR led is at GPIO_IRSEND + irsend = new IRsend(Pin(GPIO_IRSEND), IR_SEND_INVERTED, IR_SEND_USE_MODULATION); // an IR led is at GPIO_IRSEND irsend->begin(); } diff --git a/tasmota/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino index 31dd22968..4bfd00da2 100644 --- a/tasmota/xdrv_05_irremote_full.ino +++ b/tasmota/xdrv_05_irremote_full.ino @@ -136,7 +136,7 @@ StateModes strToStateMode(class JsonParserToken token, StateModes def); // decla void IrSendInit(void) { - irsend = new IRsend(Pin(GPIO_IRSEND)); // an IR led is at GPIO_IRSEND + irsend = new IRsend(Pin(GPIO_IRSEND), IR_SEND_INVERTED, IR_SEND_USE_MODULATION); // an IR led is at GPIO_IRSEND irsend->begin(); } @@ -470,7 +470,7 @@ uint32_t IrRemoteCmndIrHvacJson(void) if (!IR_RCV_WHILE_SENDING && (irrecv != nullptr)) { irrecv->disableIRIn(); } if (stateMode == StateModes::SEND_ONLY || stateMode == StateModes::SEND_STORE) { - IRac ac(Pin(GPIO_IRSEND)); + IRac ac(Pin(GPIO_IRSEND), IR_SEND_INVERTED, IR_SEND_USE_MODULATION); bool success = ac.sendAc(state, irhvac_stateful && irac_prev_state.protocol == state.protocol ? &irac_prev_state : nullptr); if (!success) { return IE_SYNTAX_IRHVAC; } } From cb71466bd449b0e9c32a863bc27d274d7b86230e Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Tue, 29 Dec 2020 09:53:15 +0000 Subject: [PATCH 008/255] webserver - move all compressed scripts to subfolders /html_uncompressed and /htmlcompressed. Add utility tools/unishox/compress-html-uncompressed.py to compress all files found in tasmota/html_uncompressed and write compressed version to tasmota/htmlcompressed --- tasmota/html_compressed/HTTP_HEADER1_ES6.h | 22 + tasmota/html_compressed/HTTP_HEADER1_NOES6.h | 22 + .../html_compressed/HTTP_HEAD_LAST_SCRIPT.h | 16 + tasmota/html_compressed/HTTP_HEAD_STYLE1.h | 24 + tasmota/html_compressed/HTTP_HEAD_STYLE2.h | 20 + .../html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h | 19 + tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h | 39 ++ .../HTTP_SCRIPT_MODULE_TEMPLATE.h | 30 + .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 27 + .../html_compressed/HTTP_SCRIPT_ROOT_PART2.h | 17 + .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 33 ++ .../html_compressed/HTTP_SCRIPT_TEMPLATE.h | 20 + tasmota/html_uncompressed/HTTP_HEADER1_ES6.h | 16 + .../html_uncompressed/HTTP_HEADER1_NOES6.h | 22 + .../html_uncompressed/HTTP_HEAD_LAST_SCRIPT.h | 12 + tasmota/html_uncompressed/HTTP_HEAD_STYLE1.h | 12 + tasmota/html_uncompressed/HTTP_HEAD_STYLE2.h | 11 + .../HTTP_HEAD_STYLE_ZIGBEE.h | 5 + .../html_uncompressed/HTTP_SCRIPT_CONSOL.h | 49 ++ .../HTTP_SCRIPT_MODULE_TEMPLATE.h | 24 + .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 24 + .../HTTP_SCRIPT_ROOT_PART2.h | 11 + .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 44 ++ .../html_uncompressed/HTTP_SCRIPT_TEMPLATE.h | 21 + tasmota/xdrv_01_webserver.ino | 555 ++---------------- tools/unishox/compress-html-uncompressed.py | 137 +++++ 26 files changed, 724 insertions(+), 508 deletions(-) create mode 100644 tasmota/html_compressed/HTTP_HEADER1_ES6.h create mode 100644 tasmota/html_compressed/HTTP_HEADER1_NOES6.h create mode 100644 tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h create mode 100644 tasmota/html_compressed/HTTP_HEAD_STYLE1.h create mode 100644 tasmota/html_compressed/HTTP_HEAD_STYLE2.h create mode 100644 tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h create mode 100644 tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h create mode 100644 tasmota/html_uncompressed/HTTP_HEADER1_ES6.h create mode 100644 tasmota/html_uncompressed/HTTP_HEADER1_NOES6.h create mode 100644 tasmota/html_uncompressed/HTTP_HEAD_LAST_SCRIPT.h create mode 100644 tasmota/html_uncompressed/HTTP_HEAD_STYLE1.h create mode 100644 tasmota/html_uncompressed/HTTP_HEAD_STYLE2.h create mode 100644 tasmota/html_uncompressed/HTTP_HEAD_STYLE_ZIGBEE.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_MODULE_TEMPLATE.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_PART2.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h create mode 100644 tasmota/html_uncompressed/HTTP_SCRIPT_TEMPLATE.h create mode 100644 tools/unishox/compress-html-uncompressed.py diff --git a/tasmota/html_compressed/HTTP_HEADER1_ES6.h b/tasmota/html_compressed/HTTP_HEADER1_ES6.h new file mode 100644 index 000000000..d95dc2499 --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEADER1_ES6.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEADER1_SIZE = 371; +const char HTTP_HEADER1_COMPRESSED[] PROGMEM = "\x3D\x0F\xE1\x10\x98\x1D\x19\x0C\x64\x85\x50\xD0\x8F\xC3\xD0\x55\x0D\x09\x05\x7C" + "\x3C\x7C\x3D\x87\xD7\x8F\x62\x0C\x2B\xF7\x8F\x87\xB0\xF6\x1F\x87\xA0\xA7\x62\x1F" + "\x87\xA0\xD7\x56\x83\x15\x7F\xF3\xA3\xE1\xF6\x2E\x8C\x1D\x67\x3E\x7D\x90\x21\x52" + "\xEB\x1A\xCF\x87\xB0\xCF\x58\xF8\xCC\xFD\x1E\xC4\x1E\x75\x3E\xA3\xE1\xEC\x1F\xD1" + "\x28\x51\xF0\x46\x67\xA1\xB3\xAC\x7F\x44\xA1\x47\x56\xF6\xD6\xD8\x47\x5F\x83\xB0" + "\x99\xF0\xE4\x3A\x88\x5F\x9F\xCE\xBF\x07\x61\x58\xE0\x99\xF3\xB0\xF6\x1D\x87\xE1" + "\xE9\x5B\x41\x33\xF0\xFA\xF2\x3A\xD1\xF5\xE3\xD0\xEC\x04\x19\x67\xA7\x83\xFE\x8C" + "\xA3\xF0\xCE\xFE\x8D\x87\xCE\x16\x10\x47\x50\x54\x75\x56\x1D\x54\x30\xEA\x18\x19" + "\xF0\xFB\x3E\xCF\x0C\x71\xF3\xC7\xC3\xF0\x4C\x0C\x58\xD7\xD4\x74\x1E\x74\x4C\x26" + "\x35\xF5\x10\xE3\x22\xD1\x0E\xEF\x8E\xF1\xE0\xD5\xE0\x48\xBA\x6A\x16\xFE\x64\x5E" + "\x61\x30\xEB\x3E\x77\x7C\x77\x8F\x1E\x18\x7C\xD3\xE1\xF8\xC7\x1D\xDD\x3B\xC7\x4A" + "\x32\x18\xCF\x87\x74\x11\xA4\x1F\x0F\x87\xDD\x33\x65\x1F\x67\x68\xFB\x19\x7E\xF0" + "\xFE\x7C\x43\xEC\xF3\x04\x19\xC7\x78\xF0\x3E\x11\xF0\xC1\xF0\xFC\x1F\xDE\x13\x07" + "\xCE\x96\x20\x84\xCC\xDF\x51\x05\xBE\xA7\xCF\xE7\x74\xFB\x0B\x2C\x43\xEC\xEA\x30" + "\x77\x8F\x06"; + +#define HTTP_HEADER1 Decompress(HTTP_HEADER1_COMPRESSED,HTTP_HEADER1_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_HEADER1_NOES6.h b/tasmota/html_compressed/HTTP_HEADER1_NOES6.h new file mode 100644 index 000000000..fae966b15 --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEADER1_NOES6.h @@ -0,0 +1,22 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEADER1_SIZE = 425; +const char HTTP_HEADER1_COMPRESSED[] PROGMEM = "\x3D\x0F\xE1\x10\x98\x1D\x19\x0C\x64\x85\x50\xD0\x8F\xC3\xD0\x55\x0D\x09\x05\x7C" + "\x3C\x7C\x3D\x87\xD7\x8F\x62\x0C\x2B\xF7\x8F\x87\xB0\xF6\x1F\x87\xA0\xA7\x62\x1F" + "\x87\xA0\xD7\x56\x83\x15\x7F\xF3\xA3\xE1\xF6\x2E\x8C\x1D\x67\x3E\x7D\x90\x21\x52" + "\xEB\x1A\xCF\x87\xB0\xCF\x58\xF8\xCC\xFD\x1E\xC4\x1E\x75\x3E\xA3\xE1\xEC\x1F\xD1" + "\x28\x51\xF0\x46\x67\xA1\xB3\xAC\x7F\x44\xA1\x47\x56\xF6\xD6\xD8\x47\x5F\x83\xB0" + "\x99\xF0\xE4\x3A\x88\x5F\x9F\xCE\xBF\x07\x61\x58\xE0\x99\xF3\xB0\xF6\x1D\x87\xE1" + "\xE9\x5B\x41\x33\xF0\xFA\xF2\x3A\xD1\xF5\xE3\xD0\xEC\x04\x19\x67\xA7\x83\xFE\x8C" + "\xA3\xF0\xCE\xFE\x8D\x87\xCE\x16\x10\x47\x50\x54\x75\x56\x1D\x54\x30\xEA\x18\x19" + "\xF0\xFB\x3E\xCF\x06\x05\xF0\x75\xB9\xC9\x8E\x3B\xBE\x3B\xC7\xB7\xEE\x85\xFF\x90" + "\x98\x18\xB1\xAF\xA8\xE8\x3C\xE8\x98\x4C\x6B\xEA\x21\xC6\x45\xA2\x1D\xDF\x1D\xE3" + "\xC1\xEE\x04\x4C\x38\xD5\xE0\x4F\xC3\x8D\x42\xDF\xCC\x8B\xCC\x26\x1D\x67\xC1\x27" + "\x0D\xF0\xC3\xBB\xA7\x78\xF6\xB1\xC7\x77\x4E\xF1\xD2\x8C\x86\x33\xE1\xDD\x04\x69" + "\x07\xC3\xE1\xF7\x4C\xD9\x47\xD9\xDA\x3E\xC6\x5F\xBC\x3F\x9F\x10\xFB\x3C\xC1\x06" + "\x70\x23\xE3\xE3\xE1\x1D\xD3\x07\x78\xF6\x8F\xEF\x09\x83\xE7\x4B\x10\x42\x66\x6F" + "\xA8\x82\xDF\x53\xE7\xF3\xBA\x7D\x85\x96\x21\xF6\x75\x18\x3B\xC7\x83\xDC"; + +#define HTTP_HEADER1 Decompress(HTTP_HEADER1_COMPRESSED,HTTP_HEADER1_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h new file mode 100644 index 000000000..feaa2ee1e --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT.h @@ -0,0 +1,16 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEAD_LAST_SCRIPT_SIZE = 226; +const char HTTP_HEAD_LAST_SCRIPT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x46\xB1\x0E\xE9\xDE\x3D\xA6\x77\xF5\x47\xC3\x8C\xEA\x2D\x3E" + "\x09\x81\x8B\x1A\xFA\x8E\x86\xA1\x6F\xE6\x45\xE6\x13\x0E\xB3\xE5\x61\x04\x77\x4F" + "\xBD\xE1\x82\xE8\xEA\x1C\x2E\xAB\x38\xEA\xA6\x6C\xAB\xFB\xB3\xAB\xCC\x26\x1D\x1F" + "\x67\x78\xF0\x3E\x2B\x42\x67\x77\x4E\x81\x3E\x1E\xA1\x47\xE1\xF2\x8E\xF1\xED\xD3" + "\x07\x77\x4F\x7A\x8F\x7C\xEF\x1E\xDD\x3D\xEA\x3D\xF3\xDE\x3E\xFA\xC6\xB3\xEC\xF7" + "\xCF\x87\x77\x4F\x7A\x8F\x7C\xE8\x2A\x2B\xFC\x57\x55\xFD\x1C\x2E\x99\xDD\x3E\xF4" + "\x43\xEC\xEF\x1F\xA3\xF4\x77\x4F\xE0\x27\x57\xEB\x1A\xCF\xB3\xBC\x77\x8E\xF1\xDA" + "\x04\x1C\x87\x44\x3E\xCF\x7C\xF3\x04\x7C\xB0\xF0\x7B\xA8\xED\x9D\xB3\xC1\xEE\x3D" + "\xC3\xE1\x1D\xD3\x58\x87\x78\xF0\x7A\x1D\x9E\x0F\xFA\x32\x8F\xC3"; + +#define HTTP_HEAD_LAST_SCRIPT Decompress(HTTP_HEAD_LAST_SCRIPT_COMPRESSED,HTTP_HEAD_LAST_SCRIPT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE1.h b/tasmota/html_compressed/HTTP_HEAD_STYLE1.h new file mode 100644 index 000000000..52440cd82 --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE1.h @@ -0,0 +1,24 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEAD_STYLE1_SIZE = 591; +const char HTTP_HEAD_STYLE1_COMPRESSED[] PROGMEM = "\x3D\x3D\x46\x41\x33\xF0\x4D\x33\x3A\x8C\x6B\x08\x4F\x3A\x3A\xB7\x86\x0B\xA3\xAB" + "\xCC\x26\x1D\x1E\xD1\x96\x20\x9B\xC3\xC7\x99\xCD\x21\x86\xC3\xC1\x8C\xEA\x3A\xFD" + "\xA6\xD6\x79\x9C\x84\xC6\x9E\x0F\x70\x21\xE1\xA7\xB4\x75\x86\x68\x3D\xFC\x17\xC2" + "\x1E\x67\x91\xF4\x71\xF1\x1B\x0F\x07\xB8\x61\xED\x1B\x7F\x1E\xDE\x3C\xCE\x33\xA6" + "\x93\x1A\x8E\x33\xC1\xEE\x2D\xE1\x82\xE8\xF6\x8F\xE8\x94\x28\xF3\x39\x1B\x3E\x8F" + "\xA3\xC1\x0E\xC3\x61\xD7\xED\x36\xEF\x0F\x1E\x63\xB3\xE2\x3F\x9D\x63\xB0\xD8\x78" + "\x3A\xC7\xD8\xE3\x4D\xA3\xAC\x14\xAD\x0D\xC3\x68\x29\x57\x04\xCD\x84\x3C\x0B\x3E" + "\x08\x7B\x6E\xF0\xC1\x74\x7B\xD4\x64\x31\x9F\x03\x14\xC3\x34\x1D\x86\xC3\xDF\x04" + "\x1E\x11\x41\x06\x8F\xEC\x4D\xC3\xDF\x04\x3D\xF1\x8D\x3C\x02\x0F\x03\x87\x5F\xF4" + "\x78\x55\x1E\x67\x38\x86\x1B\x0F\x06\x6F\xF5\xA1\xD8\x47\x5D\x85\xA3\xDC\x79\x9D" + "\x67\x21\x0C\x04\x9C\xCF\xF7\xC3\xCC\x10\xF1\xE3\x89\x1F\x47\xD1\xE0\xF7\x10\x21" + "\x71\x3E\x09\x1C\x28\x82\xC7\x2A\x01\x54\xCD\x95\x7F\x76\x7B\x7E\xFD\xA6\xD6\x79" + "\x82\x1E\xA0\x78\x04\x2C\xC8\xE7\xCF\xA3\xE8\xF0\x42\x9E\x8F\x0A\xA3\xCC\xE5\xCF" + "\x90\xC3\x61\xE0\x11\xF8\xFA\xC3\x37\xF3\x01\x60\xF9\xE7\x62\xEB\x01\x6B\x45\x1D" + "\x82\x19\x1E\xDA\x66\xCA\x04\x2E\x0A\x83\x7D\x4F\xE0\x83\xC9\xE9\x8B\x1B\xA1\x19" + "\x1E\x66\x6F\xE2\x5F\x59\xD5\xEB\xEF\x1D\x7E\x7F\xD3\x2A\x01\x9B\x98\x1E\xEA\x10" + "\x11\x39\x7D\x38\xC8\x61\xB0\xF0\x7B\x8D"; + +#define HTTP_HEAD_STYLE1 Decompress(HTTP_HEAD_STYLE1_COMPRESSED,HTTP_HEAD_STYLE1_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE2.h b/tasmota/html_compressed/HTTP_HEAD_STYLE2.h new file mode 100644 index 000000000..4c1da5898 --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE2.h @@ -0,0 +1,20 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEAD_STYLE2_SIZE = 478; +const char HTTP_HEAD_STYLE2_COMPRESSED[] PROGMEM = "\x1C\x2E\xAB\x38\xF6\x8E\xCF\x88\xFE\x79\x9C\x67\x82\x04\x18\xA7\x5F\xEC\x4D\x17" + "\xE3\xCC\xE3\x3A\x59\x7D\x8D\x3C\x0E\xB0\xCD\x07\xBF\x82\xF8\x43\xCC\xF2\x3E\x8E" + "\x3E\x23\x61\xE0\x3C\x0B\x3E\x08\x52\x02\xDE\x67\x58\xA7\xA3\xC2\xA8\xF3\x39\x47" + "\x4C\x2F\xB1\xA7\x83\x19\xD4\x75\xFB\x4D\xAC\xF3\x39\x0E\x94\x5F\x63\x4F\x03\xFA" + "\x25\x0A\x3C\xCE\x46\xCF\xA3\xE8\xF0\x75\x90\xFB\x1C\x69\xB4\x75\xD7\xEF\xBD\xB5" + "\xB9\xC7\x58\x82\xFF\x75\xB9\xC7\x99\xC6\x74\xC2\xF1\xE0\x15\x2A\x2B\x86\x2F\xFE" + "\xCF\x9E\x63\x33\x7A\x9F\xCF\x07\xB8\x10\x78\x18\x3C\xC5\x61\x9B\xF9\xED\x04\xCE" + "\x2A\x01\x0F\x71\xD0\x77\xD8\x80\xA7\x50\x15\xB1\x21\xEF\xF0\x29\xD4\x05\x4C\x4A" + "\xCF\x68\x23\xF0\xDF\x4C\xD9\x47\x58\x8C\x3C\x04\x2E\x06\xBB\x39\x9E\x0F\x71\xD0" + "\x61\xED\x30\x16\x5D\x1E\x61\x33\x14\x08\x38\x05\x85\xA3\xDC\x08\x33\x0F\x71\xD0" + "\xD4\x08\x56\xFF\xA3\xC2\x81\x22\xE0\x20\xCD\x3D\xC7\x4F\x82\x17\x20\x60\x8D\xC7" + "\xD3\x1A\x78\x19\x62\x09\xBC\x3C\x79\x9C\xA2\x18\x6C\x3C\x0D\xBF\x8F\x6F\x1E\x67" + "\x38\x86\x1B\x11\xCA\x21\x86\xC3\xC1\xEE"; + +#define HTTP_HEAD_STYLE2 Decompress(HTTP_HEAD_STYLE2_COMPRESSED,HTTP_HEAD_STYLE2_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h b/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h new file mode 100644 index 000000000..29269d0d0 --- /dev/null +++ b/tasmota/html_compressed/HTTP_HEAD_STYLE_ZIGBEE.h @@ -0,0 +1,19 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_HEAD_STYLE_ZIGBEE_SIZE = 363; +const char HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED[] PROGMEM = "\x3A\x0E\xA3\xDA\x3B\x0D\x87\x5F\xB4\xDB\xBC\x3C\x79\x8E\xCF\x88\xFE\x75\x8E\xC3" + "\x61\xE0\x66\x7B\x6B\x73\x8F\x3F\xB0\xAE\xB4\xCD\x9E\x04\xDF\x0C\x0A\xCC\x8F\x3D" + "\xE0\xB7\x99\xD6\x38\x2C\x0C\xD0\xF0\x3F\xA2\x50\xA3\xCC\xE5\x32\x18\x6C\x3C\x0A" + "\x7A\x3C\x2A\x2B\x8F\x33\x92\x88\x61\xB0\xF0\x08\x39\x29\xE6\x72\x88\x61\xB1\x7B" + "\x02\xD1\x01\x0A\x69\xD7\xFB\x13\x45\xF8\xF3\x39\x64\x30\xD8\x78\x1B\x7F\x1E\xDE" + "\x3A\xC2\x66\x28\xF3\x3A\xCE\x59\x0C\x36\x1E\xE3\xA0\xEA\x3C\xCF\x3B\x31\x4F\xE7" + "\x51\xD0\x75\x1E\x67\x98\xE6\x63\x3E\xCF\x68\x79\xD4\xFA\x8F\x33\xD8\x7B\x01\x13" + "\x5E\x04\x1D\x5C\x16\xB8\x14\xB1\xDE\xC0\x85\xD3\x04\x3D\xD0\xE7\x10\xC3\x61\xE0" + "\x75\x86\x68\x3D\xFC\x17\xC2\x1E\x61\x8B\xFF\xDF\x51\x07\x81\x67\xCF\x15\x83\x0F" + "\x33\x90\x81\x0F\x5F\x04\x2D\x53\xFA\x3C\x2A\x2B\x8F\x33\xAC\xE6\x10\x22\x70\x54" + "\x08\xFC\x0C\x82\x0F\x0A\x67\x30\x81\x23\x81\x23\xDA\x08\x34\x4C\xEF\xE7\x74\xEB" + "\x3A\xC7\x04\x75\x1C\x98\x43\x0D\x87\x78\xF0\x13\x31\x47\x99\xC8\x43\x0D\x87\xB8"; + +#define HTTP_HEAD_STYLE_ZIGBEE Decompress(HTTP_HEAD_STYLE_ZIGBEE_COMPRESSED,HTTP_HEAD_STYLE_ZIGBEE_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h new file mode 100644 index 000000000..91e1fab76 --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_CONSOL_SIZE = 853; +const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x82\x30\x2F\x83\xAD\xCE\x41\x1D" + "\xD1\x87\x78\xF6\x99\xDF\xD0\x67\x56\x1F\x0F\xB3\xEC\xEA\xA3\xC0\x61\x3B\xF9\x56" + "\x8D\x78\x2E\x8E\xE8\x54\x77\x8F\x14\x7C\x63\x8E\xE9\xF7\x47\x21\xF6\x77\x8F\x05" + "\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7\x74\xFB\x0C\xE4\x3E\xCE" + "\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0\x78\x23\x21\x65\xF2\xD2" + "\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3\xC0\x21\x45\x3E\x1F\x67" + "\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD\x2A\x01\xF1\xEE\x3E\x02" + "\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE\x3D\xBA\x60\xEE\x9B\x0F" + "\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD\x3B\xC7\x83\xDC\x6C\x3E" + "\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F\xD4\x77\x4E\xF1\xE0\xD8" + "\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08\x7C\x28\x1D\xD0\x41\xCA" + "\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F" + "\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\x03\x69\xD4\x21\xE0\x43\xE1\xB0\xE9\xF7\xE1\x99" + "\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4\x3B\x0E\xF1\xE0\xB4\x43" + "\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44\x92\x7C\x3E\x1C\x67\x78" + "\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13\xE1\xEA\x14\x7E\x02\x2E" + "\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xDE\x1E\x4F\x71\xE0\xD8\x74\xC1\x8F\x8E\xE9\xF6" + "\x43\xC4\xCA\x8F\xB3\xA8\xFB\x0F\xC7\x68\x33\x94\x7C\x3E\xCE\xD9\x68\x87\x6F\x0E" + "\xAA\xF8\xB6\x77\x8F\x06\xC3\xA7\x9F\x08\x77\x4E\xF1\xE0\xF7\x05\x47\xCF\x3A\x04" + "\x4E\x4A\x4E\xA3\xE8\x43\xBC\x78\xFB\xA1\x7F\xE4\x62\xC2\xF3\x3C\x1E\xE1\xF0\x8E" + "\xE8\x47\x78\xF0\x67\x7F\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF0\x23\xF2\xF4\x28\xEE" + "\x9D\xE3\xDA\x08\x7C\xA2\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F\xCE\xE9\xF6" + "\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE2\xDD\x82\x0F\x12\xA3\x81\x13\x97\xB3\xA8" + "\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2\x0C\xFF\x1F" + "\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13\xA6\x7C\x3E" + "\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76\xC3\xE3\xF0" + "\x50\x60\x85\xC4\x31\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E\x04\x2E\x2E" + "\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C\x67\xC3\xE1" + "\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78\x41\xC9\x67" + "\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28\x33\xA0\xCC" + "\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x44\x01\x0B\x1C\x3B\xC7\x50\x7C\x7C" + "\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0"; + +#define HTTP_SCRIPT_CONSOL Decompress(HTTP_SCRIPT_CONSOL_COMPRESSED,HTTP_SCRIPT_CONSOL_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h new file mode 100644 index 000000000..e7f059b0b --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_MODULE_TEMPLATE.h @@ -0,0 +1,30 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_MODULE_TEMPLATE_SIZE = 602; +const char HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED[] PROGMEM = "\x33\xBF\xAC\xF1\xD4\x2B\xC7\x83\x02\xF8\x3A\xDC\xE4\x1B\x3B\xBA\x75\x1A\x8E\xF1" + "\xED\x33\xBF\xAC\x3E\x09\x81\x8B\x1A\xFA\x8E\x81\xFD\xDD\x32\x61\x31\xAF\xA8\xEE" + "\x9F\x78\x32\xB7\x38\xFB\x3B\xC7\x8C\x3A\x53\x36\x51\x07\x9D\x4F\xA8\xF9\xA7\x83" + "\x51\xD2\xC6\x0C\x7C\x21\x06\x2B\x42\x10\xEE\xE1\xDE\x3C\x1E\xE0\x44\xCD\xB2\x8E" + "\xE8\xF1\xD5\xE0\x41\xCD\xAC\xF9\xE3\xF4\x71\x91\xB0\xC1\x86\x71\x9D\x44\x38\xF8" + "\x71\x9D\x44\x19\xD4\x30\xEA\x08\xEA\xA3\xE1\xAB\xC7\x74\xFB\x3C\x85\x1F\x67\x6C" + "\x78\xEF\x1D\x42\xCF\x9E\x3F\x47\x19\x1B\x0E\x37\x08\xC1\xE0\x23\xE5\x1D\x01\x07" + "\x4D\xF1\xD0\x27\xC3\xD4\x28\xF0\x63\x3E\x77\x74\xF8\x11\xE3\x4F\x1A\x75\x9D\x67" + "\x78\xF6\x8C\x04\x5B\xC7\xBD\xA7\x59\xC8\x7B\xE7\x42\x19\x7F\x7D\x45\xD8\x23\x3C" + "\x0C\x3A\x7D\x8D\xC3\x36\x08\x3B\x70\x24\xE0\x87\x78\xF0\x7B\x82\x3E\x0A\x04\xAC" + "\xC8\xE3\x3C\x16\x9E\x81\x1E\x34\xED\x9D\xB3\xBC\x7B\x43\x3E\x0A\xF1\xEF\x69\xEF" + "\x82\x17\x2A\x01\xE7\x8D\x30\x77\x6C\xF8\x7C\x0C\xEF\x1E\xD1\xC0\x89\x50\xE3\x70" + "\x8C\x1E\x07\x7D\xD9\xA1\xE0\xF7\x1E\xEF\x1F\x87\xE1\xF0\xE6\x90\x21\x64\x47\x21" + "\xE0\xB4\xF4\x3E\x0E\x04\x2C\x8D\x9D\xD3\xBB\xA7\xA1\xC8\xCE\xF1\xDA\x3B\xA7\xD9" + "\xDC\x3E\xCE\xD9\x69\xDE\x3C\xF4\xEA\xA3\xBC\x78\x3D\xCC\x71\xDD\x3E\xC5\x1F\x67" + "\x6C\x78\xEF\x1D\x0C\xEC\x21\x6C\xF8\x2C\xED\x9C\x87\x82\xA3\xA7\xA8\xC8\x26\x74" + "\x33\xDF\x68\xED\x0B\x68\xC8\xF8\x77\x47\x1F\x87\x19\xDE\x3B\x47\xD9\xF6\x79\x9F" + "\x64\x2B\x44\x11\xF1\xF6\x08\xDC\x58\xF8\xD0\xEE\xF8\xEA\x1E\x04\x3E\x42\xF3\xC7" + "\x4F\xB1\x81\x58\x6C\xEE\x9D\x87\xB8\xE5\x1D\x84\x3C\x75\x1E\xC3\xD0\x10\x78\x4B" + "\x40\x83\x9E\x9F\x67\xB0\xEF\x02\x35\xD3\x96\x76\x10\xF1\xD4\x7B\x0F\x43\xB0\x10" + "\x6F\x1F\x87\xB0\xEF\x1E\x18\xE3\xBA\x7D\x8F\x1F\x67\x6C\x78\xEF\x1D\x37\xB9\xFC" + "\x85\x15\x10\xD2\x08\xF9\x80\x8D\x48\x10\x72\x13\xBA\x3C\x7A\x1C\x48\xEF\x1D\xA2" + "\x04\x3E\x47\x4F\x3F\x1E\x34\xC0\x20\xD0\x3D\xA0\x85\xC9\xF9\xE0\xF7\x1E\xE3"; + +#define HTTP_SCRIPT_MODULE_TEMPLATE Decompress(HTTP_SCRIPT_MODULE_TEMPLATE_COMPRESSED,HTTP_SCRIPT_MODULE_TEMPLATE_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h new file mode 100644 index 000000000..2f61ce116 --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -0,0 +1,27 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_ROOT_SIZE = 524; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x69\x9D\xFD\x59\xF0\xFB\x3E\xCF\x1A" + "\x60\xEE\x85\x67\x4B\xF8\xF0\xB1\xAF\xAB\xC7\x40\x9F\x0F\x50\xA3\xE1\xF0\xE4\x3B" + "\xC7\xB4\xAC\xF8\x30\xF0\x18\x4E\xFE\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE3\xC1\xEE" + "\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE" + "\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3" + "\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xDA" + "\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F" + "\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x80\x7F\x1F\x0D\x87" + "\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B" + "\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C" + "\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2" + "\x85\x02\x4D\x71\xA0\x83\x5C\xEC\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36" + "\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E" + "\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC" + "\x3D\x04\xD3\x30\x43\xCE\xE9\x9B\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6" + "\x75\x1D\x63\xEF\x47\x85\x51\xE6\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77" + "\x8E\x85\xBD\xCF\xE4\x28\xA8\x86\x90\x47\xCF\x1E\x0F\x71\xEE\x3C\x1B\x0E\x98\x31" + "\xF1\xDD\x3E\xC8\x78\x99\x51\xF6\x75\x1F\x67\x43\xB4\x34\xF8\x72\x1F\x67\x6C\xAC" + "\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x02\xA3\xE7\x9D\x02\x27" + "\x23\x96\x75\x1F\x42\x1D\xE3\xC1\xEE"; + +#define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h new file mode 100644 index 000000000..17af45427 --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_PART2.h @@ -0,0 +1,17 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_ROOT_PART2_SIZE = 222; +const char HTTP_SCRIPT_ROOT_PART2_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x06\x77\x4C\xCE\xAD\x3A\x86\x1D\xE3\xDB\xA6\x0E\xEB\x1C" + "\x77\x4F\xBF\x1F\x67\x78\xEF\x1E\xDD\x30\x77\x4C\xCF\x87\xC3\xEC\x51\xF6\x7F\x8F" + "\xF1\x99\xF0\xF8\x7D\x88\x7D\x9D\xE3\xDA\x67\x7F\x5E\x08\xF8\xC7\x1D\xD3\xEF\xC1" + "\x1C\xC3\xEC\xEF\x1D\x08\xCE\xC2\x16\xCF\x2A\x01\x85\x87\x9D\x3D\x46\x41\x33\xA0" + "\xEB\x0C\xD0\x7B\xF8\x2F\x84\x3E\x1F\x61\x6F\x3B\xF9\xD6\x3D\xFB\x13\x5F\x51\xDD" + "\xAC\x5F\xD1\xE1\x54\x75\x7C\x78\x71\xDD\x3E\xCE\xDF\x82\x3B\x67\xD9\xF4\x7D\x1D" + "\x40\x89\x14\x10\xE2\x9D\xE3\xA8\x57\x82\x3B\xA7\xD9\xDB\x04\x1D\x14\xE5\x10\x21" + "\xE8\xA7\x6C\xFB\x3A\x8E\x46\xCF\xA3\xE8\xEA\xD6\x7D\x1F\x47\x78\xEF\x1F\x67\x83" + "\xDC\x7B\x88\x2B\x3B\xA7\xD9\xFA\x3E\xCE\xD9\x99\xDB\xD3\xB6\x7D\x9F\x0F\xB3\xB6" + "\x30\xEF\x1E\x0F\x70\xF8\x47\x74\x2B\x3B\xC7\x83"; + +#define HTTP_SCRIPT_ROOT_PART2 Decompress(HTTP_SCRIPT_ROOT_PART2_COMPRESSED,HTTP_SCRIPT_ROOT_PART2_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h new file mode 100644 index 000000000..bb52fbbcd --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_ROOT_SIZE = 744; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x78\x23\x02\xF8\x3A\xDC\xE4\x15\x9D\xD1\x87\x78" + "\xF6\x99\xDF\xD5\x9F\x0F\xB3\xEC\xF1\xA6\x0E\xE8\x56\x74\xBF\x8F\x0B\x1A\xFA\xBC" + "\x74\x09\xF0\xF5\x0A\x3E\x1F\x0E\x43\xBC\x7B\x4A\xCF\x83\x0F\x01\x84\xEF\xE5\x5A" + "\x35\xE0\xBA\x3B\xA1\x51\xDE\x3C\x1E\xED\x30\x77\x4D\x87\xF0\xF9\xC2\xC2\x08\xEF" + "\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36\x10\xD2" + "\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8\x86\x5E" + "\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\xA0\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0\xE9\xF7" + "\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC\x7C\x3E" + "\x1C\xA6\xC8\x10\x78\x07\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\xD8" + "\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56\x38\x26\xBD\x46" + "\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0\xF6\x1D\xE2\x04" + "\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE\xCA\x14\x7E\x1E" + "\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32\xC3\x67\x9F\x60" + "\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D\x90\xCF\x71\xD8" + "\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99\xB2\x8E\xBB\x0B" + "\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E\x67\xB0\xEF\x1E" + "\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88\x69\x04\x7C\xF1" + "\xE0\xF7\x1E\xE3\xC6\x98\x47\x77\xE6\x3C\x28\xEF\x23\xDA\x6C\x3A\x60\xC7\xC7\x74" + "\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3\xAA\xBE" + "\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x0A\x8F\x9E\x74\x08\x9C\x93\xD9" + "\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x02\x27\x2E\x9E\x66\x76\x77\x46\x5F\xCE\xAD\x33" + "\xBF\x9D\xE3\xDA\x15\x9D\xD3\xEC\xFD\x78\xCC\xF8\x7D\x9D\xBD\x33\xBF\x9D\xB3\xEC" + "\xFD\x9F\x67\x6C\x65\xFC\xEF\x1E\x01\x1B\x0D\xD0\x48\xC3\x41\x0B\x9C\x40\x53\xC5" + "\x3E\x63\xC2\x8F\x87\x19\x02\x36\x36\x33\xE7\x74\xC1\xDE\x3D\xBA\x61\x1D\xD3\x07" + "\x79\x1E\xD0\x50\xDE\x81\x0B\x2F\x3D\xC9\x85\xE6\x8F\x68\x26\x73\xD0\x08\x79\x81" + "\xEE"; + +#define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h b/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h new file mode 100644 index 000000000..36ac7939d --- /dev/null +++ b/tasmota/html_compressed/HTTP_SCRIPT_TEMPLATE.h @@ -0,0 +1,20 @@ +///////////////////////////////////////////////////////////////////// +// compressed by tools/unishox/compress-html-uncompressed.py +///////////////////////////////////////////////////////////////////// + +const size_t HTTP_SCRIPT_TEMPLATE_SIZE = 303; +const char HTTP_SCRIPT_TEMPLATE_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x08\x77\x45\x9D\x46\x0E\xF1\xED\x33\xBF\xA3\x61\xF3\x98" + "\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3\xBA\x77\x8F\x06\xC3\xA6" + "\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xC7\x4E\xE9\xDE\x3D\xBA\x60" + "\xEE\xD0\xAD\xF1\xD3\xEE\xC4\x32\x2F\x55\xD3\x3E\x1F\x0E\x61\xFA\x3F\x45\x42\xB7" + "\xC7\x4F\x55\xD0\xBF\x1F\x0F\x87\x29\xB3\xBC\x7B\x48\x10\x70\x43\xBC\x78\x3D\xC7" + "\xB8\xF0\x6C\x3A\x60\xC7\xC7\x74\xFB\x21\xE2\x65\x47\xD9\xD4\x2C\xEA\xAF\x8B\x67" + "\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x0F\x71\x9D\xFD\x06\x78\x04\x4E\x2A\x01" + "\x4D\x87\x21\xDD\x21\xC0\x83\xBF\xE9\xD4\x6B\x3A\x87\x8E\xA3\x43\xAB\x0F\x18\x7C" + "\x1C\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\x86\x05\xB4\x77\x4E\xC3\xDC\x72\x1D" + "\x87\x78\xF0\x46\x87\xCC\x3A\x78\x56\x98\xA3\xBA\x77\x8F\x1A\x60\xEE\xB1\xC7\x74" + "\xFB\xF1\xC8\x7D\x9D\xE3\xA1\x19\xD8\x42\xD9\xF0\xF8\x7D\x9F\x67\x78\xF6\x82\x55" + "\x03\x43\xC1\xEE\x1E\x04\x5C\x44\x10\xB2\x93\xEC\xEA\x3E\xCE\xF1\xE3\x3C\x7C\x3D" + "\x86"; + +#define HTTP_SCRIPT_TEMPLATE Decompress(HTTP_SCRIPT_TEMPLATE_COMPRESSED,HTTP_SCRIPT_TEMPLATE_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_HEADER1_ES6.h b/tasmota/html_uncompressed/HTTP_HEADER1_ES6.h new file mode 100644 index 000000000..d89b93352 --- /dev/null +++ b/tasmota/html_uncompressed/HTTP_HEADER1_ES6.h @@ -0,0 +1,16 @@ +const char HTTP_HEADER1[] PROGMEM = + "" + "" + "" + "" + "%s - %s" + + ""; diff --git a/tasmota/html_uncompressed/HTTP_HEAD_STYLE1.h b/tasmota/html_uncompressed/HTTP_HEAD_STYLE1.h new file mode 100644 index 000000000..3ec441914 --- /dev/null +++ b/tasmota/html_uncompressed/HTTP_HEAD_STYLE1.h @@ -0,0 +1,12 @@ +const char HTTP_HEAD_STYLE1[] PROGMEM = + "" "\0" @@ -1739,7 +1739,7 @@ const char ZB_WEB_U[] PROGMEM = "" "%s" // name "%s" // sbatt (Battery Indicator) - "
" // slqi + "
" // slqi "\0" // +++++++++++++++++++++++++++++++++++++++++++++++++++++++ //=ZB_WEB_BATTERY @@ -1779,22 +1779,22 @@ const char ZB_WEB_U[] PROGMEM = // ++++++++++++++++++++vvvvvvvvvvvvvvvvvvv++++++++++++++++++++ enum { ZB_WEB_CSS=0, - ZB_WEB_PERMITJOIN_ACTIVE=512, - ZB_WEB_VIS_JS_BEFORE=566, - ZB_WEB_VIS_JS_AFTER=1039, - ZB_WEB_AUTO_REFRESH=1103, - ZB_WEB_MAP_REFRESH=1169, - ZB_WEB_STATUS_LINE=1235, - ZB_WEB_BATTERY=1344, - ZB_WEB_LAST_SEEN=1394, - ZB_WEB_COLOR_RGB=1442, - ZB_WEB_LINE_START=1502, - ZB_WEB_LIGHT_CT=1542, - ZB_WEB_END_STATUS=1597, - ZB_WEB_LINE_END=1614, + ZB_WEB_PERMITJOIN_ACTIVE=507, + ZB_WEB_VIS_JS_BEFORE=561, + ZB_WEB_VIS_JS_AFTER=1034, + ZB_WEB_AUTO_REFRESH=1098, + ZB_WEB_MAP_REFRESH=1164, + ZB_WEB_STATUS_LINE=1230, + ZB_WEB_BATTERY=1338, + ZB_WEB_LAST_SEEN=1388, + ZB_WEB_COLOR_RGB=1436, + ZB_WEB_LINE_START=1496, + ZB_WEB_LIGHT_CT=1536, + ZB_WEB_END_STATUS=1591, + ZB_WEB_LINE_END=1608, }; -// Compressed from 1631 to 1109, -32.0% +// Compressed from 1625 to 1111, -31.6% const char ZB_WEB[] PROGMEM = "\x00\x66\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\x3D\x3D\x46\x41\x33\xF0\xE8\x6D" "\xA1\x15\x08\x79\xF6\x51\xDD\x3C\xCC\x6F\xFD\x47\x58\x62\xB4\x21\x0E\xF1\xED\x1F" "\xD1\x28\x51\xE6\x72\x99\x0C\x36\x1E\x0C\x67\x51\xD7\xED\x36\xB3\xCC\xE7\x99\xF4" @@ -1805,52 +1805,52 @@ const char ZB_WEB[] PROGMEM = "\x00\x66\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\ "\x13\x7C\x30\x2B\x32\x3C\xF7\x82\xDE\x67\x58\xE0\xB0\x33\x43\xC0\xEC\xF8\x8F\xE7" "\x99\xC8\x43\x0D\x8B\xD8\x16\x88\x83\x17\xFF\xBE\xA2\x0F\x02\xCF\x9E\x07\x58\x66" "\x83\xDF\xC1\x7C\x21\xD6\x1E\x05\x9F\x3C\xCC\xEF\xE7\x74\xEB\x3A\xC3\x08\xEA\x3C" - "\x8C\x18\x30\x77\x8F\x71\xD3\xDE\xD3\xDA\x09\x59\xA1\x80\x99\xB0\xF1\x61\x68\xF7" - "\x1D\x7B\x4C\x6F\x8F\x33\x01\x33\x61\xD6\xF8\x43\xC0\x21\xEE\x87\x34\x86\x1B\x0F" - "\x03\x2C\x41\x37\x87\x8F\x33\x8C\xF7\x1D\x0B\xDE\xD5\xA0\x85\xC2\x91\xCB\x21\x86" - "\xC3\xC0\x24\xF0\x90\x30\xD8\x08\x5C\x2A\x01\x1D\x7F\xB1\x34\x5F\x8F\x33\x96\x43" - "\x0D\x80\x9B\xBA\x1E\x4D\xB0\x41\xC9\x8E\x83\x8E\x32\x04\x3E\x17\x4E\x56\x9F\x47" - "\xD1\x02\x1D\x13\x90\x81\x0E\x89\xCD\x64\x08\xB4\x4E\x51\x02\x1D\x13\x9E\x20\x46" - "\xC1\x8E\x59\x02\x27\x13\x87\x1B\x3E\x8F\xA3\xDC\x74\x2C\x39\x6C\xF6\x96\x0C\xB0" - "\xF6\x8C\x8F\x33\xA1\xCB\x3D\xC7\xA1\xD8\x40\x83\xCA\x4C\xE1\x7C\xF4\x18\x7E\x1E" - "\x83\x8F\xC3\xDE\x47\xA7\x86\x5F\x2F\x51\x90\x4C\xF8\x7D\x82\x16\xD4\x71\xFD\x9E" - "\x0F\xB3\xF0\xFA\x2F\x1E\x87\x67\x86\x5F\x1F\x88\xF7\xCF\x43\xB0\x71\xF8\x7A\x1D" - "\x83\x0F\xC9\xC2\xF9\xE9\xE0\xFF\xA3\x29\x51\x90\xC6\x7C\x3D\x94\xCD\x94\x76\x1A" - "\xEC\xCE\xC1\x06\x91\xEC\x5E\xF8\x67\xC3\xD8\x2A\x2B\xA8\x67\x8F\x33\xB0\xEC\x17" - "\xC3\x0D\x07\x8E\x81\xE0\xD3\xB0\xCF\x7C\x75\xF3\xA1\xFC\xF9\xA1\xD9\xEA\xBE\x12" - "\xC2\xCE\x67\x60\xB1\xA2\x02\x3D\x73\xA0\xDD\xE3\xA1\xAF\xC7\xB0\xFC\x3D\x0E\xC0" - "\x41\xCB\x0F\xC3\xD0\x4D\x33\x5A\x21\xF0\xF6\x0D\x32\x04\x2C\x2A\x01\xF6\x02\x17" - "\x2A\x01\xC7\xB0\x13\x78\x9F\x30\x60\xC1\xE0\x10\xF8\x1C\x38\xD9\x02\x17\x32\xC7" - "\x3E\xD9\x0C\x36\x02\x1F\x22\xC7\x31\xB2\x04\x4E\x3A\xC1\x1B\x98\xF0\xB4\x78\x55" - "\x0F\x7E\xCC\x8F\x1F\x7E\xD3\x6B\x3C\xC7\x65\x0A\x3C\x1E\xC3\xF0\x85\xF5\x8E\x09" - "\xAA\xC4\x16\x58\x88\xCF\x7C\x74\x35\xF8\xF4\x3B\x04\xD3\x33\xF0\x16\x78\x63\x3F" - "\x0C\xEF\xE8\x3C\xEA\xBD\xE7\xF3\xE0\x98\x18\xB1\xAF\xA8\xE8\x3C\xE8\x98\x4C\x6B" - "\xEA\x21\xC6\x45\xA2\x1D\xD0\x46\xE0\xC8\xEF\x1E\x0C\xEF\xEB\x06\x56\xE7\x78\xF8" - "\x7B\x47\xBF\x82\xC6\x78\xF3\x3D\xB8\x79\x9E\xDF\x0A\xB1\x8C\xF3\x3D\x81\xEF\xC3" - "\x09\x9E\xC3\xA8\x10\x78\x3D\x3D\x87\x90\x87\x37\x4F\x61\xEE\x3A\x8B\xE0\x89\x70" - "\x76\x1B\x01\x16\xC9\x81\xC7\x3C\x7B\x0F\x71\xD4\x4C\x11\x2C\xB0\x82\xD1\x9E\x04" - "\x6C\x6A\xC4\x30\x7B\x0F\x71\xEE\x3D\xC7\x83\x3B\xFA\x12\xEA\xCF\x87\xB6\x70\xBE" - "\x08\x32\x41\x0B\x6C\x3E\x73\x1F\x46\x7B\xE3\xA1\x70\x20\xCC\x3B\xA0\x89\xC1\x49" - "\xD4\x25\xD5\x9D\x40\x85\xC0\x29\xDE\x3C\x02\x27\x20\xC0\x87\xCB\xA9\xF9\xE7\x45" - "\x5A\x35\xE0\xBA\x3B\xA6\x05\xF0\x75\xB9\xC7\x74\xEF\x1E\xD0\xB0\x3B\xAD\xCE\x3A" - "\x7D\x85\x96\x21\xDD\x3B\xC7\x83\xDC\x75\x1C\x89\x32\x04\x8C\x78\x61\xF8\x7A\x1D" - "\x83\x0F\xC3\xD0\xC6\x7C\x6A\xB0\xEB\x73\x8F\x87\xD9\xB4\x77\xCF\xB4\x35\xD0\xAC" - "\x10\xF8\x7D\x8F\x3A\x3E\xCF\xC3\xD0\x70\xBA\xAC\xE3\xF0\xFA\xF1\xE8\x76\x02\x14" - "\x73\xD0\xEC\x31\x9F\x1A\x7E\x4E\x17\xCF\x4A\xFA\x0C\x2B\xF7\x8F\x87\xD9\xB6\x84" - "\x42\xAB\xE7\xD9\xF8\x7A\x50\x87\xE1\xE8\x39\x56\xD0\x4C\xF8\x7D\x9C\x64\x6C\x3E" - "\x8E\x3C\x22\x36\x23\xEB\xC8\xEB\x47\xD7\x81\x07\xA0\x7E\x38\xFC\x3D\x0E\xCA\x10" - "\xFC\x3D\x28\x43\xF0\xFA\xF0\x22\x47\x3D\x04\xD3\x30\x43\xC4\x88\x22\x35\x16\xA3" - "\xEB\xC7\xD8\x21\xE7\x1E\xF6\x9F\x67\xE4\xE1\x7C\xF4\xD0\x42\x98\x7B\x07\x51\xEC" - "\x04\x2C\x18\xF6\x1F\x42\x1F\x47\xD0\x22\x73\xFE\x75\x9D\x63\x82\x3C\xCF\xA1\x06" - "\x1B\x0F\x61\xF8\x7A\x1D\x9A\x7E\x4E\x17\xCF\x4A\x10\x10\xEB\x82\x17\x40\x10\xFA" - "\x38\xE8\x8D\x87\xD1\xC7\x44\x6C\x3E\x8E\x3A\x23\x61\xEC\x3F\x0F\xD1\xE4\x6C\x39" - "\x08\x8C\x1C\xDD\xF1\xE0\xFA\x74\x42\x1F\x41\xCE\x17\xD0\x23\x67\xE6\xC0\x46\xCC" - "\x83\x08\xF3\x3C\x8F\xA3\x8E\x88\x8D\x87\xD1\xC7\x44\x46\xC3\xE8\xE3\xA2\x23\x60" - "\x20\xE7\x60\x91\x3C\x11\xF8\x67\x04\x3E\x18\xD0\x78\x17\x86\x5F\x1F\x0F\x61\xCC" - "\x3D\x87\xE1\xFA\x3C\x96\x7B\xE7\x82\x9C\x2F\x82\x17\x45\x6C\x10\xB8\x1B\x20\xCA" - "\x91\xF4\x21\xEC\x3F\x0F\x4F\x0D\xB0\x82\x3F\x0F\xD1\xE4\x71\x7D\x7C\xF0\x77\x0F" - "\x43\xB0\x81\x06\x61\xF4\x21\x1A\x02\x17\x45\xB6\x70\xBE\x08\x5D\x06\x23\xB2\x84" - "\x3F\x0F\xAF\x1E\xD6\x7B\x81\x32\x6C\xE1\x7C"; + "\x8C\x18\x30\x77\x8F\x71\xD3\xDA\x7B\x41\x2B\x33\x30\x13\x36\x1E\x2C\x2D\x1E\xE3" + "\xAF\x69\x8D\xF1\xE6\x60\x26\x6C\x3A\xDF\x08\x78\x04\x3D\xCC\xE6\x90\xC3\x61\xE0" + "\x65\x88\x26\xF0\xF1\xE6\x71\x9E\xE3\xA1\x7B\x56\x82\x17\x0A\x07\x2C\x86\x1B\x0F" + "\x2A\x01\x93\xC2\x30\xC3\x60\x21\x6F\xC7\x5F\xEC\x4D\x17\xE3\xCC\xE5\x90\xC3\x60" + "\x26\xEE\x47\x91\xF4\x71\xF1\x1B\x0F\x71\xD3\xDA\x8E\x83\x8E\x32\x04\x3E\x16\xCE" + "\x56\x9F\x47\xD1\x02\x15\x03\x90\x81\x0E\x81\xCD\x64\x08\x94\x0E\x51\x02\x1D\x03" + "\x9E\x20\x45\xC1\x0E\x59\x02\x27\x12\xE7\x1B\x3E\x8F\xA3\xDC\x74\x2C\x39\x6C\xF6" + "\x96\x0C\xB0\xF6\x8C\x8F\x33\xA1\xCB\x3D\xC7\xA1\xD8\x40\x83\xCA\x24\xE1\x7C\xF4" + "\x18\x7E\x1E\x83\x8F\xC3\xDE\x47\xA7\x86\x5F\x2F\x51\x90\x4C\xF8\x7D\x82\x16\xCE" + "\x71\xFD\x9E\x0F\xB3\xF0\xFA\x2F\x1E\x87\x67\x86\x5F\x1F\x88\xF7\xCF\x43\xB0\x71" + "\xF8\x7A\x1D\x83\x0F\xC9\xC2\xF9\xE9\xE0\xFF\xA3\x29\x51\x90\xC6\x7C\x3D\x94\xCD" + "\x94\x76\x1A\xEC\xCE\xC1\x06\x91\xEC\x5E\xF8\x67\xC3\xD8\x2A\x2B\xA8\x67\x8F\x33" + "\xB0\xEC\x17\xC3\x0D\x07\x8E\x81\xE0\xD3\xB0\xCF\x7C\x75\xF3\xA1\xFC\xF9\xA1\xD9" + "\xEA\xBE\x12\xC2\xCE\x67\x60\xB1\xA2\x02\x3D\x73\xA0\xDD\xE3\xA1\xAF\xC7\xB0\xFC" + "\x3D\x0E\xC0\x41\xCB\x0F\xC3\xD0\x4D\x33\x5A\x21\xF0\xF6\x0D\x32\x04\x2C\x2A\x01" + "\xF6\x02\x17\x2A\x01\xC7\xB0\x13\x78\x9C\x30\x60\xC1\xE0\x10\xF8\x1C\x38\xD9\x02" + "\x17\x32\x27\x3E\xD9\x0C\x36\x02\x1F\x22\x47\x31\xB2\x04\x4E\x3A\x01\x1B\x98\xA0" + "\xB4\x78\x55\x0F\x7E\xCC\x8F\x1F\x7E\xD3\x6B\x3C\xC7\x65\x0A\x3C\x1E\xC3\xF0\x85" + "\xF5\x8E\x09\xAA\xC4\x16\x58\x88\xCF\x7C\x74\x35\xF8\xF4\x3B\x04\xD3\x33\xF0\x16" + "\x78\x63\x3F\x0C\xEF\xE8\x3C\xEA\xBD\xE7\xF3\xE0\x98\x18\xB1\xAF\xA8\xE8\x3C\xE8" + "\x98\x4C\x6B\xEA\x21\xC6\x45\xA2\x1D\xD0\x46\xE0\xC8\xEF\x1E\x0C\xEF\xEB\x06\x56" + "\xE7\x78\xF8\x7B\x47\xBF\x82\xC6\x78\xF3\x3D\xB8\x79\x9E\xDF\x0A\xB1\x8C\xF3\x3D" + "\x81\xEF\xC3\x09\x9E\xC3\xA8\x10\x78\x3D\x3D\x87\x90\x87\x37\x4F\x61\xEE\x3A\x8B" + "\xE0\x89\x70\x76\x1B\x01\x16\xC9\x81\xC7\x3C\x7B\x0F\x71\xD4\x4C\x11\x2C\xB0\x82" + "\xD1\x9E\x04\x6C\x6A\xC4\x30\x7B\x0F\x71\xEE\x3D\xC7\x83\x3B\xFA\x12\xEA\xCF\x87" + "\xB6\x70\xBE\x08\x32\x41\x0B\x6C\x3E\x73\x1F\x46\x7B\xE3\xA1\x70\x20\xCC\x3B\xA0" + "\x89\xC1\x49\xD4\x25\xD5\x9D\x40\x85\xC0\x29\xDE\x3C\x02\x27\x20\xC0\x87\xCB\xA9" + "\xF9\xE7\x45\x5A\x35\xE0\xBA\x3B\xA6\x05\xF0\x75\xB9\xC7\x74\xEF\x1E\xD0\xB0\x3B" + "\xAD\xCE\x3A\x7D\x85\x96\x21\xDD\x3B\xC7\x83\xDC\x75\x1C\x89\x32\x04\x8C\x78\x61" + "\xF8\x7A\x1D\x83\x0F\xC3\xD0\xC6\x7C\x6A\xB0\xEB\x73\x8F\x87\xD9\xB4\x77\xCF\xB4" + "\x35\xD0\xAC\x10\xF8\x7D\x8F\x3A\x3E\xCF\xC3\xD0\x70\xBA\xAC\xE3\xF0\xFA\xF1\xE8" + "\x76\x02\x14\x73\xD0\xEC\x31\x9F\x1A\x7E\x4E\x17\xCF\x4A\xFA\x0C\x2B\xF7\x8F\x87" + "\xD9\xB6\x84\x42\xAB\xE7\xD9\xF8\x7A\x50\x87\xE1\xE8\x39\x56\xD0\x4C\xF8\x7D\x9C" + "\x64\x6C\x3E\x8E\x3C\x22\x36\x23\xEB\xC8\xEB\x47\xD7\x81\x07\xA0\x7E\x38\xFC\x3D" + "\x0E\xCA\x10\xFC\x3D\x28\x43\xF0\xFA\xF0\x22\x47\x3D\x04\xD3\x30\x43\xC4\x88\x22" + "\x35\x16\xA3\xEB\xC7\xD8\x21\xE7\x1E\xD3\xEC\xFC\x9C\x2F\x9E\x9A\x08\x52\xCF\x60" + "\xEA\x3D\x80\x85\x82\x9E\xC3\xE8\x43\xE8\xFA\x04\x4E\x7F\x8E\xB3\xAC\x70\x47\x99" + "\xF4\x20\xC3\x61\xEC\x3F\x0F\x43\xB3\x4F\xC9\xC2\xF9\xE9\x42\x02\x1D\x70\x44\xE8" + "\xA7\x1C\xA2\x36\x1F\x47\x1D\x11\xB0\xFA\x38\xE8\x8D\x87\xB0\xFC\x3F\x47\x91\xB0" + "\xE4\x22\x30\x73\x77\xC7\x83\xE9\xD1\x08\x7D\x07\x38\x5F\x40\x8D\x9F\x9B\x01\x1B" + "\x32\x0C\x23\xCC\xF2\x3E\x8E\x3A\x22\x36\x1F\x47\x1D\x11\x1B\x0F\xA3\x8E\x88\x8D" + "\x80\x83\x9D\x82\x44\xF0\x47\xE1\x98\x10\xF8\x62\x41\xE0\x5E\x19\x7C\x7C\x3D\x87" + "\x30\xF6\x1F\x87\xE8\xF2\x59\xEF\x9E\x0A\x70\xBE\x08\x5D\x15\xA0\x42\xE0\x6C\x83" + "\x2A\x2B\x47\xD0\x87\xB0\xFC\x3D\x3C\x36\xC2\x08\xFC\x3F\x47\x91\xC5\xF5\xF3\xC1" + "\xDC\x3D\x0E\xC2\x04\x19\x87\xD0\x84\x68\x08\x5D\x16\xC9\xC2\xF8\x21\x74\x18\x4E" + "\xCA\x10\xFC\x3E\xBC\x7B\x59\xEE\x04\xC9\xB3\x85\xF3"; // ++++++++++++++++++++^^^^^^^^^^^^^^^^^^^++++++++++++++++++++ // ++++++++++++++++++++ DO NOT EDIT ABOVE ++++++++++++++++++++ @@ -1887,7 +1887,11 @@ extern "C" { uint32_t convert_seconds_to_dhm(uint32_t seconds, char *unit, uint8_t *color){ static uint32_t conversions[3] = {24 * 3600, 3600, 60}; static char units[3] = { 'd', 'h', 'm'}; // day, hour, minute - static uint8_t colors[3] = { 0x60, 0xA0, 0xEA}; + uint8_t color_text_8 = WebColor(COL_TEXT) & 0xFF; // color of text on 8 bits + uint8_t color_back_8 = WebColor(COL_BACKGROUND) & 0xFF; // color of background on 8 bits + uint8_t colors[3] = { (uint8_t) changeUIntScale(6, 0, 16, color_back_8, color_text_8), // 6/16 of text + (uint8_t) changeUIntScale(10, 0, 16, color_back_8, color_text_8), // 10/16 of text color + color_text_8}; for(int i = 0; i < 3; ++i) { *color = colors[i]; *unit = units[i]; @@ -1915,7 +1919,7 @@ void ZigbeeShow(bool json) if (!zigbee_num) { return; } if (zigbee_num > 255) { zigbee_num = 255; } - WSContentSend_P(msg[ZB_WEB_CSS]); + WSContentSend_P(msg[ZB_WEB_CSS], WebColor(COL_TEXT)); // WSContentSend_compressed(ZB_WEB, 0); // sort elements by name, then by id From 805b69e289bdb0fca38354553ee51d84a41f0df4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 29 Dec 2020 15:55:14 +0100 Subject: [PATCH 017/255] add tasmota-AF --- .github/workflows/Tasmota_build_master.yml | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 244bfe8ce..5d1453c60 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -230,6 +230,30 @@ jobs: name: firmware path: ./build_output/firmware + + tasmota-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota-BG: needs: tasmota_pull runs-on: ubuntu-latest From 8fb6ba2bf7c7bfaf70c587f62e854b7ce6b08325 Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Tue, 29 Dec 2020 17:42:36 +0100 Subject: [PATCH 018/255] fix: ST7789 display driver for 135*240px Improved the driver to support both 135*240 and 240*240 formats. These are the most common for the ST7789 display. Fixes #10282 --- .../Arduino_ST7789.cpp | 68 ++++++++++++------- .../Arduino_ST7789-gemu-1.0/Arduino_ST7789.h | 20 ++++-- tasmota/xdsp_12_ST7789.ino | 18 +++-- 3 files changed, 72 insertions(+), 34 deletions(-) diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp index f45b33095..74837242b 100644 --- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp +++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp @@ -27,7 +27,7 @@ uint16_t Arduino_ST7789::GetColorFromIndex(uint8_t index) { } static const uint8_t PROGMEM - cmd_240x240[] = { // Initialization commands for 7789 screens + init_cmd[] = { // Initialization commands for 7789 screens 10, // 9 commands in list: ST7789_SWRESET, ST_CMD_DELAY, // 1: Software reset, no args, w/delay 150, // 150 ms delay @@ -38,14 +38,6 @@ static const uint8_t PROGMEM 10, // 10 ms delay ST7789_MADCTL , 1, // 4: Memory access ctrl (directions), 1 arg: 0x00, // Row addr/col addr, bottom to top refresh - ST7789_CASET , 4, // 5: Column addr set, 4 args, no delay: - 0x00, ST7789_240x240_XSTART, // XSTART = 0 - (ST7789_TFTWIDTH+ST7789_240x240_XSTART) >> 8, - (ST7789_TFTWIDTH+ST7789_240x240_XSTART) & 0xFF, // XEND = 240 - ST7789_RASET , 4, // 6: Row addr set, 4 args, no delay: - 0x00, ST7789_240x240_YSTART, // YSTART = 0 - (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) >> 8, - (ST7789_TFTHEIGHT+ST7789_240x240_YSTART) & 0xFF, // YEND = 240 ST7789_INVON , ST_CMD_DELAY, // 7: Inversion ON 10, ST7789_NORON , ST_CMD_DELAY, // 8: Normal display on, no args, w/delay @@ -75,7 +67,7 @@ inline uint16_t swapcolor(uint16_t x) { // Constructor when using software SPI. All output pins are configurable. Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t sid, int8_t sclk, int8_t cs, int8_t bp) - : Renderer(ST7789_TFTWIDTH, ST7789_TFTHEIGHT) + : Renderer(_width, _height) { _cs = cs; _dc = dc; @@ -91,7 +83,7 @@ Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t sid, int8_t sclk, i // Constructor when using hardware SPI. Faster, but must use SPI pins // specific to each board type (e.g. 11,13 for Uno, 51,52 for Mega, etc.) Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t cs, int8_t bp) - : Renderer(ST7789_TFTWIDTH, ST7789_TFTHEIGHT) { + : Renderer(_width, _height) { _cs = cs; _dc = dc; _rst = rst; @@ -335,29 +327,59 @@ void Arduino_ST7789::setRotation(uint8_t m) { case 0: writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MY | ST7789_MADCTL_RGB); - _xstart = _colstart; - // _ystart = _rowstart; - _ystart = 80; + _xstart = 0; + _ystart = 0; + if (_width==240 && _height==240) { + _xstart = ST7789_240x240_XSTART_R0; + _ystart = ST7789_240x240_YSTART_R0; + } + if (_width==135 && _height==240) { + _xstart = ST7789_135x240_XSTART_R0; + _ystart = ST7789_135x240_YSTART_R0; + } break; case 1: writedata(ST7789_MADCTL_MY | ST7789_MADCTL_MV | ST7789_MADCTL_RGB); - _ystart = _colstart; - // _xstart = _rowstart; - _xstart = 80; + _ystart = 0; + _xstart = 0; + if (_width==240 && _height==240) { + _xstart = ST7789_240x240_XSTART_R1; + _ystart = ST7789_240x240_YSTART_R1; + } + if (_width==240 && _height==135) { + _xstart = ST7789_135x240_XSTART_R1; + _ystart = ST7789_135x240_YSTART_R1; + } break; case 2: writedata(ST7789_MADCTL_RGB); - _xstart = _colstart; - _ystart = _rowstart; + _xstart = 0; + _ystart = 0; + if (_width==240 && _height==240) { + _xstart = ST7789_240x240_XSTART_R2; + _ystart = ST7789_240x240_YSTART_R2; + } + if (_width==135 && _height==240) { + _xstart = ST7789_135x240_XSTART_R2; + _ystart = ST7789_135x240_YSTART_R2; + } break; case 3: writedata(ST7789_MADCTL_MX | ST7789_MADCTL_MV | ST7789_MADCTL_RGB); - _ystart = _colstart; - _xstart = _rowstart; + _xstart = 0; + _ystart = 0; + if (_width==240 && _height==240) { + _xstart = ST7789_240x240_XSTART_R3; + _ystart = ST7789_240x240_YSTART_R3; + } + if (_width==240 && _height==135) { + _xstart = ST7789_135x240_XSTART_R3; + _ystart = ST7789_135x240_YSTART_R3; + } break; } } @@ -533,12 +555,10 @@ inline void Arduino_ST7789::DC_LOW(void) { void Arduino_ST7789::init(uint16_t width, uint16_t height) { commonInit(NULL); - _colstart = ST7789_240x240_XSTART; - _rowstart = ST7789_240x240_YSTART; _height = height; _width = width; - displayInit(cmd_240x240); + displayInit(init_cmd); setRotation(2); diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h index 2d97346e7..3dfaa03a8 100644 --- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h +++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.h @@ -39,11 +39,23 @@ //#define SPI_HAS_TRANSACTION // already defined in SPI.h -#define ST7789_TFTWIDTH 240 -#define ST7789_TFTHEIGHT 240 +#define ST7789_240x240_XSTART_R0 0 +#define ST7789_240x240_YSTART_R0 80 +#define ST7789_240x240_XSTART_R1 80 +#define ST7789_240x240_YSTART_R1 0 +#define ST7789_240x240_XSTART_R2 0 +#define ST7789_240x240_YSTART_R2 0 +#define ST7789_240x240_XSTART_R3 0 +#define ST7789_240x240_YSTART_R3 0 -#define ST7789_240x240_XSTART 0 -#define ST7789_240x240_YSTART 0 +#define ST7789_135x240_XSTART_R0 53 +#define ST7789_135x240_YSTART_R0 40 +#define ST7789_135x240_XSTART_R1 40 +#define ST7789_135x240_YSTART_R1 52 +#define ST7789_135x240_XSTART_R2 52 +#define ST7789_135x240_YSTART_R2 40 +#define ST7789_135x240_XSTART_R3 40 +#define ST7789_135x240_YSTART_R3 53 #define ST_CMD_DELAY 0x80 // special signifier for command lists diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index 3c85f168a..1c9ec1aff 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -64,11 +64,11 @@ void ST7789_InitDriver() if (XDSP_12 == Settings.display_model) { - if (Settings.display_width != ST7789_TFTWIDTH) { - Settings.display_width = ST7789_TFTWIDTH; + if (!Settings.display_width) { + Settings.display_width = 240; } - if (Settings.display_height != ST7789_TFTHEIGHT) { - Settings.display_height = ST7789_TFTHEIGHT; + if (!Settings.display_height) { + Settings.display_height = 240; } // disable screen buffer @@ -130,9 +130,15 @@ void ST7789_InitDriver() #ifdef SHOW_SPLASH // Welcome text - renderer->setTextFont(2); renderer->setTextColor(ST7789_WHITE,ST7789_BLACK); - renderer->DrawStringAt(30, 100, "ST7789 TFT!", ST7789_WHITE,0); + int fontSize = 2; + renderer->setTextFont(2); + if (Settings.display_width<240) { + fontSize = 1; + } + renderer->setTextFont(fontSize); + int fontHeight = 12 * fontSize; + renderer->DrawStringAt(30, (Settings.display_height-fontHeight)/2, "ST7789 TFT!", ST7789_WHITE,0); delay(1000); #endif From f004cfea60928a723419b35a618fce26fb30c1c1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 29 Dec 2020 17:42:53 +0100 Subject: [PATCH 019/255] Breaking change regarding MFRC522 and ILI9341 - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` --- CHANGELOG.md | 7 ++- RELEASENOTES.md | 6 +- platformio_tasmota32.ini | 1 + platformio_tasmota_env32.ini | 8 +++ tasmota/support.ino | 10 +++- tasmota/support_tasmota.ino | 62 ++++++++++++++------- tasmota/tasmota_configurations_ESP32.h | 20 ++++++- tasmota/tasmota_template.h | 76 ++++++++++++++------------ tasmota/tasmota_version.h | 2 +- tasmota/xdrv_80_odroidgo.ino | 34 ++++++++++++ tasmota/xdsp_04_ili9341.ino | 13 ++++- tasmota/xsns_80_mfrc522.ino | 6 +- 12 files changed, 182 insertions(+), 63 deletions(-) create mode 100644 tasmota/xdrv_80_odroidgo.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index 706721d0b..4e45bf32e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [9.2.0.1] +## [9.2.0.2] +### Breaking Changed +- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` +- Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` + +## [9.2.0.1] 20201229 ### Added - Milliseconds to console output (#10152) - Support for P9813 RGB Led MOSFET controller (#10104) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index b9ed48538..1f9677073 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -56,7 +56,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v9.2.0.1 +## Changelog v9.2.0.2 ### Added - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) @@ -69,6 +69,10 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) +### Breaking Changed +- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` +- Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` + ### Changed - Logging from heap to stack freeing 700 bytes RAM diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 1fe7667a2..430fcc344 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -8,6 +8,7 @@ default_envs = ${build_envs.default_envs} ; *** Uncomment by deleting ";" in the line(s) below to select version(s) ; tasmota32 ; tasmota32-webcam +; tasmota32-odroidgo ; tasmota32-minimal ; tasmota32-lite ; tasmota32-knx diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index ff416538e..886b2cfaf 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -36,6 +36,14 @@ board_build.f_cpu = 240000000L build_flags = ${common32.build_flags} -DFIRMWARE_WEBCAM lib_extra_dirs = lib/libesp32, lib/lib_basic +[env:tasmota32-odroidgo] +extends = env:tasmota32 +board = odroid_esp32 +board_build.f_cpu = 160000000L +board_build.partitions = esp32_partition_app1984k_ffat12M.csv +build_flags = ${common32.build_flags} -DFIRMWARE_ODROID_GO +lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_i2c, lib/lib_rf, lib/lib_div, lib/lib_ssl, lib/lib_display + [env:tasmota32-minimal] extends = env:tasmota32 build_flags = ${common32.build_flags} -DFIRMWARE_MINIMAL diff --git a/tasmota/support.ino b/tasmota/support.ino index 577c8bb95..fcf21a014 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1307,7 +1307,7 @@ uint8_t ModuleNr(void) uint32_t ModuleTemplate(uint32_t module) { uint32_t i = 0; for (i = 0; i < sizeof(kModuleNiceList); i++) { - if (Settings.module == pgm_read_byte(kModuleNiceList + i)) { + if (module == pgm_read_byte(kModuleNiceList + i)) { break; } } @@ -1346,6 +1346,9 @@ String AnyModuleName(uint32_t index) if (USER_MODULE == index) { return String(SettingsText(SET_TEMPLATE_NAME)); } else { +#ifdef ESP32 + index = ModuleTemplate(index); +#endif char name[TOPSZ]; return String(GetTextIndexed(name, sizeof(name), index, kModuleNames)); } @@ -1451,6 +1454,11 @@ void ModuleDefault(uint32_t module) { if (USER_MODULE == module) { module = WEMOS; } // Generic Settings.user_template_base = module; + +#ifdef ESP32 + module = ModuleTemplate(module); +#endif + char name[TOPSZ]; SettingsUpdateText(SET_TEMPLATE_NAME, GetTextIndexed(name, sizeof(name), module, kModuleNames)); #ifdef ESP8266 diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index bd92688f6..58b79e905 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1594,24 +1594,47 @@ void GpioInit(void) #ifdef ESP8266 if ((2 == Pin(GPIO_TXD)) || (H801 == TasmotaGlobal.module_type)) { Serial.set_tx(2); } +#endif + + TasmotaGlobal.soft_spi_enabled = (PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); #ifdef USE_SPI - TasmotaGlobal.spi_enabled = (((PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_CS) > 14)) || (Pin(GPIO_SPI_CS) < 12)) || ((PinUsed(GPIO_SPI_DC) && (Pin(GPIO_SPI_DC) > 14)) || (Pin(GPIO_SPI_DC) < 12))); - if (TasmotaGlobal.spi_enabled) { - TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); - SetPin(12, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); - SetPin(13, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); - SetPin(14, AGPIO(GPIO_SPI_CLK)); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK)")); + uint32_t pin_cs = Pin(GPIO_SPI_CS); + uint32_t pin_dc = Pin(GPIO_SPI_DC); + if (PinUsed(GPIO_RC522_CS)) { + pin_cs = Pin(GPIO_RC522_CS); + } + if (PinUsed(GPIO_ILI9341_CS)) { + pin_cs = Pin(GPIO_ILI9341_CS); + if (PinUsed(GPIO_ILI9341_DC)) { + pin_dc = Pin(GPIO_ILI9341_DC); + } + } + +#ifdef ESP8266 + if (!TasmotaGlobal.soft_spi_enabled) { + // If SPI_CS is used it must be valid + TasmotaGlobal.spi_enabled = ((pin_cs < 99) && ((pin_cs > 14) || (pin_cs < 12))); + if (TasmotaGlobal.spi_enabled && (pin_dc < 99)) { + // If SPI_DC is used it must be valid + TasmotaGlobal.spi_enabled = ((pin_dc > 14) || (pin_dc < 12)); + } + if (TasmotaGlobal.spi_enabled) { + TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); + SetPin(12, AGPIO(GPIO_SPI_MISO)); + TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); + SetPin(13, AGPIO(GPIO_SPI_MOSI)); + TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); + SetPin(14, AGPIO(GPIO_SPI_CLK)); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK)")); + } } -#endif // USE_SPI #endif // ESP8266 #ifdef ESP32 -#ifdef USE_SPI - if (PinUsed(GPIO_SPI_CS) || PinUsed(GPIO_SPI_DC)) { - if ((15 == Pin(GPIO_SPI_CS)) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI + if (pin_cs < 99) { +/* + // Do not do this as ESP32 can have SPI_CS everywhere + if ((15 == pin_cs) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); SetPin(12, AGPIO(GPIO_SPI_MISO)); TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); @@ -1619,7 +1642,7 @@ void GpioInit(void) TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); SetPin(14, AGPIO(GPIO_SPI_CLK)); } - else if ((5 == Pin(GPIO_SPI_CS)) && (!GetPin(19) && !GetPin(23) && !GetPin(18))) { // VSPI + else if ((5 == pin_cs) && (!GetPin(19) && !GetPin(23) && !GetPin(18))) { // VSPI TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); SetPin(19, AGPIO(GPIO_SPI_MISO)); TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); @@ -1644,24 +1667,25 @@ void GpioInit(void) SetPin(18, AGPIO(GPIO_SPI_CLK)); } TasmotaGlobal.spi_enabled = (PinUsed(GPIO_SPI_CLK) && (PinUsed(GPIO_SPI_MOSI) || PinUsed(GPIO_SPI_MISO))); +*/ + TasmotaGlobal.spi_enabled = (pin_cs < 99); if (TasmotaGlobal.spi_enabled) { - if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO)) { + if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } - else if (PinUsed(GPIO_SPI_MOSI)) { + else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } - else if (PinUsed(GPIO_SPI_MISO)) { + else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); } } } -#endif // USE_SPI #endif // ESP32 - TasmotaGlobal.soft_spi_enabled = (PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); +#endif // USE_SPI for (uint32_t i = 0; i < ARRAY_SIZE(TasmotaGlobal.my_module.io); i++) { uint32_t mpin = ValidPin(i, TasmotaGlobal.my_module.io[i]); diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index 86e27a534..c3bb7044b 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -33,9 +33,27 @@ #define CODE_IMAGE_STR "webcam" #define USE_WEBCAM -#undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +#undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #endif // FIRMWARE_WEBCAM +/*********************************************************************************************\ + * [tasmota32-odroidgo.bin] + * Provide an image with useful supported sensors enabled +\*********************************************************************************************/ + +#ifdef FIRMWARE_ODROID_GO + +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "odroid-go" + +#define USE_ODROID_GO // Add support for Odroid Go +#define USE_ADC +#define USE_SPI + #define USE_DISPLAY // Add SPI Display Support (+2k code) + #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code) +#define USE_MI_ESP32 // (ESP32 only) Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +#endif // FIRMWARE_ODROID_GO + #endif // ESP32 #endif // _TASMOTA_CONFIGURATIONS_ESP32_H_ diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 5f1eafb8e..46915f280 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -359,19 +359,23 @@ const uint16_t kGpioNiceList[] PROGMEM = { #endif #ifdef USE_SPI - AGPIO(GPIO_SPI_MISO), // SPI MISO - AGPIO(GPIO_SPI_MOSI), // SPI MOSI - AGPIO(GPIO_SPI_CLK), // SPI Clk - AGPIO(GPIO_SPI_CS), // SPI Chip Select - AGPIO(GPIO_SPI_DC), // SPI Data Direction + AGPIO(GPIO_SPI_MISO), // SPI MISO + AGPIO(GPIO_SPI_MOSI), // SPI MOSI + AGPIO(GPIO_SPI_CLK), // SPI Clk + AGPIO(GPIO_SPI_CS), // SPI Chip Select + AGPIO(GPIO_SPI_DC), // SPI Data Direction #ifdef USE_NRF24 // AGPIO(GPIO_NRF24_CS), // AGPIO(GPIO_NRF24_DC), #endif +#ifdef USE_RC522 + AGPIO(GPIO_RC522_CS), // RC522 Rfid Chip Select + AGPIO(GPIO_RC522_RST), // RC522 Rfid Reset +#endif #ifdef USE_DISPLAY #ifdef USE_DISPLAY_ILI9341 -// AGPIO(GPIO_ILI9341_CS), -// AGPIO(GPIO_ILI9341_DC), + AGPIO(GPIO_ILI9341_CS), + AGPIO(GPIO_ILI9341_DC), #endif // USE_DISPLAY_ILI9341 #endif // USE_DISPLAY #endif // USE_SPI @@ -710,10 +714,6 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_MIEL_HVAC_TX), // Mitsubishi Electric HVAC TX pin AGPIO(GPIO_MIEL_HVAC_RX), // Mitsubishi Electric HVAC RX pin #endif -#ifdef USE_RC522 - AGPIO(GPIO_RC522_RST), // RC522 Rfid reset -// AGPIO(GPIO_RC522_CS), // RC522 Rfid chip select -#endif /*-------------------------------------------------------------------------------------------*\ * ESP32 specifics @@ -2319,7 +2319,9 @@ const char kModuleNames[] PROGMEM = #ifdef USE_WEBCAM "ESP32-Cam|" #endif // USE_WEBCAM -// "Odroid Go|"" +#ifdef USE_ODROID_GO + "Odroid Go|" +#endif // USE_ODROID_GO // "ESP32-Solo|" // "WT32-Eth01|" // "TTGO Watch|" @@ -2334,7 +2336,9 @@ const uint8_t kModuleNiceList[] PROGMEM = { #ifdef USE_WEBCAM ESP32_CAM_AITHINKER, #endif // USE_WEBCAM -// ODROID_GO, +#ifdef USE_ODROID_GO + ODROID_GO, +#endif // USE_ODROID_GO // ESP32_SOLO, // WT32_ETH01, // TTGO_WATCH, @@ -2435,46 +2439,46 @@ const mytmplt kModules[] PROGMEM = #endif // USE_WEBCAM #ifdef USE_ODROID_GO { // ODROID_GO - (ESP32) - AGPIO(GPIO_KEY1), // 0 (I)O GPIO0, Button1 - AGPIO(GPIO_USER), // 1 IO TXD0 GPIO1, U0TXD, CLK_OUT3, EMAC_RXD2 - AGPIO(GPIO_USER), // 2 IO GPIO2, ADC2_CH2, TOUCH2, RTC_GPIO12, HSPIWP, HS2_DATA0, SD_DATA0 - AGPIO(GPIO_USER), // 3 IO RXD0 GPIO3, U0RXD, CLK_OUT2 + AGPIO(GPIO_KEY1), // 0 (I)O GPIO0, BTN-VOLUME + AGPIO(GPIO_TXD), // 1 IO TXD0 GPIO1, TXD0 + AGPIO(GPIO_LEDLNK), // 2 IO GPIO2, STATUS LED + AGPIO(GPIO_RXD), // 3 IO RXD0 GPIO3, RXD0 AGPIO(GPIO_USER), // 4 IO GPIO4, ADC2_CH0, TOUCH0, RTC_GPIO10, HSPIHD, HS2_DATA1, SD_DATA1, EMAC_TX_ER - AGPIO(GPIO_USER), // 5 IO GPIO5, VSPICS0, HS1_DATA6, EMAC_RX_CLK + AGPIO(GPIO_ILI9341_CS), // 5 IO GPIO5, VSPI_CS0_LCD // 6 IO GPIO6, Flash CLK // 7 IO GPIO7, Flash D0 // 8 IO GPIO8, Flash D1 - AGPIO(GPIO_USER), // 9 IO GPIO9, Flash D2, U1RXD - AGPIO(GPIO_USER), // 10 IO GPIO10, Flash D3, U1TXD + 0, // 9 IO GPIO9, Flash D2, U1RXD + 0, // 10 IO GPIO10, Flash D3, U1TXD // 11 IO GPIO11, Flash CMD AGPIO(GPIO_USER), // 12 (I)O GPIO12, ADC2_CH5, TOUCH5, RTC_GPIO15, MTDI, HSPIQ, HS2_DATA2, SD_DATA2, EMAC_TXD3 (If driven High, flash voltage (VDD_SDIO) is 1.8V not default 3.3V. Has internal pull-down, so unconnected = Low = 3.3V. May prevent flashing and/or booting if 3.3V flash is connected and pulled high. See ESP32 datasheet for more details.) - AGPIO(GPIO_USER), // 13 IO GPIO13, ADC2_CH4, TOUCH4, RTC_GPIO14, MTCK, HSPID, HS2_DATA3, SD_DATA3, EMAC_RX_ER - AGPIO(GPIO_USER), // 14 IO GPIO14, ADC2_CH6, TOUCH6, RTC_GPIO16, MTMS, HSPICLK, HS2_CLK, SD_CLK, EMAC_TXD2 + AGPIO(GPIO_KEY1) +1, // 13 IO GPIO13, BTN-MENU + AGPIO(GPIO_PWM1), // 14 IO GPIO14, LCD Backlight AGPIO(GPIO_USER), // 15 (I)O GPIO15, ADC2_CH3, TOUCH3, MTDO, HSPICS0, RTC_GPIO13, HS2_CMD, SD_CMD, EMAC_RXD3 (If driven Low, silences boot messages from normal boot. Has internal pull-up, so unconnected = High = normal output.) AGPIO(GPIO_USER), // 16 IO GPIO16, HS1_DATA4, U2RXD, EMAC_CLK_OUT AGPIO(GPIO_USER), // 17 IO GPIO17, HS1_DATA5, U2TXD, EMAC_CLK_OUT_180 - AGPIO(GPIO_USER), // 18 IO GPIO18, VSPICLK, HS1_DATA7 - AGPIO(GPIO_USER), // 19 IO GPIO19, VSPIQ, U0CTS, EMAC_TXD0 + AGPIO(GPIO_SPI_CLK), // 18 IO GPIO18, VSPI_CLK + AGPIO(GPIO_SPI_MISO), // 19 IO GPIO19, VSPI_MISO 0, // 20 - AGPIO(GPIO_USER), // 21 IO GPIO21, VSPIHD, EMAC_TX_EN - AGPIO(GPIO_USER), // 22 IO LED GPIO22, VSPIWP, U0RTS, EMAC_TXD1 - AGPIO(GPIO_USER), // 23 IO GPIO23, VSPID, HS1_STROBE + AGPIO(GPIO_ILI9341_DC), // 21 IO GPIO21, SPI_DC_LCD + 0, // 22 IO LED GPIO22, VSPI_CS1_TFLASH + AGPIO(GPIO_SPI_MOSI), // 23 IO GPIO23, VSPI_MOSI 0, // 24 - AGPIO(GPIO_USER), // 25 IO GPIO25, DAC_1, ADC2_CH8, RTC_GPIO6, EMAC_RXD0 - AGPIO(GPIO_USER), // 26 IO GPIO26, DAC_2, ADC2_CH9, RTC_GPIO7, EMAC_RXD1 - AGPIO(GPIO_USER), // 27 IO GPIO27, ADC2_CH7, TOUCH7, RTC_GPIO17, EMAC_RX_DV + 0, // 25 IO GPIO25, DAC_1 (PAM8304A) + 0, // 26 IO GPIO26, DAC_2 (PAM8304A) + AGPIO(GPIO_KEY1) +2, // 27 IO GPIO27, BTN-SELECT 0, // 28 0, // 29 0, // 30 0, // 31 - AGPIO(GPIO_USER), // 32 IO GPIO32, XTAL_32K_P (32.768 kHz crystal oscillator input), ADC1_CH4, TOUCH9, RTC_GPIO9 - AGPIO(GPIO_USER), // 33 IO GPIO33, XTAL_32K_N (32.768 kHz crystal oscillator output), ADC1_CH5, TOUCH8, RTC_GPIO8 - AGPIO(GPIO_USER), // 34 I NO PULLUP GPIO34, ADC1_CH6, RTC_GPIO4 - AGPIO(GPIO_USER), // 35 I NO PULLUP GPIO35, ADC1_CH7, RTC_GPIO5 - AGPIO(GPIO_USER), // 36 I NO PULLUP GPIO36, SENSOR_VP, ADC_H, ADC1_CH0, RTC_GPIO0 + AGPIO(GPIO_SWT1) +4, // 32 IO GPIO32, BTN-A + AGPIO(GPIO_SWT1) +5, // 33 IO GPIO33, BTN-B + AGPIO(GPIO_ADC_JOY), // 34 I NO PULLUP GPIO34, JOY-X (LEFT-RIGHT) + AGPIO(GPIO_ADC_JOY) +1, // 35 I NO PULLUP GPIO35, JOY-Y (UP-DOWN) + AGPIO(GPIO_ADC_RANGE) +2, // 36 I NO PULLUP GPIO36, SENSOR_VP (BATTERY CARGER) 0, // 37 NO PULLUP 0, // 38 NO PULLUP - AGPIO(GPIO_USER), // 39 I NO PULLUP GPIO39, SENSOR_VN, ADC1_CH3, ADC_H, RTC_GPIO3 + AGPIO(GPIO_KEY1) +3, // 39 I NO PULLUP GPIO39, BTN-START 0 // Flag }, #endif // USE_ODROID_GO diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index d4fbfcf76..490f68bd8 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x09020001; +const uint32_t VERSION = 0x09020002; #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/xdrv_80_odroidgo.ino b/tasmota/xdrv_80_odroidgo.ino new file mode 100644 index 000000000..4886f87d6 --- /dev/null +++ b/tasmota/xdrv_80_odroidgo.ino @@ -0,0 +1,34 @@ +/* + xdrv_81_webcam.ino - ESP32 webcam support for Tasmota + + Copyright (C) 2020 Gerhard Mutz and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef ESP32 +#ifdef USE_ODROID_GO +/*********************************************************************************************\ + * Odroid Go + * + * Clock frequency 160MHz (board_build.f_cpu = 160000000L) + * SPI Flash Size = 16MB (board_build.partitions = esp32_partition_app1984k_ffat12M.csv) + * + * To be done: + * - Audio on GPIO25/26 + * +/*********************************************************************************************/ + +#endif // USE_ODROID_GO +#endif // ESP32 diff --git a/tasmota/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino index fd61b4a82..adabfe6b0 100644 --- a/tasmota/xdsp_04_ili9341.ino +++ b/tasmota/xdsp_04_ili9341.ino @@ -97,7 +97,18 @@ void Ili9341Init(uint8_t mode) void Ili9341InitDriver(void) { + uint32_t pin_cs = Pin(GPIO_SPI_CS); + uint32_t pin_dc = Pin(GPIO_SPI_DC); if (!Settings.display_model) { + if (PinUsed(GPIO_ILI9341_CS)) { + pin_cs = Pin(GPIO_ILI9341_CS); + if (PinUsed(GPIO_ILI9341_DC)) { + pin_dc = Pin(GPIO_ILI9341_DC); + } + Settings.display_model = XDSP_04; + } + + // Legacy Settings.display_model = XDSP_04; } @@ -109,7 +120,7 @@ void Ili9341InitDriver(void) Settings.display_height = ILI9341_TFTHEIGHT; } - tft = new Adafruit_ILI9341(Pin(GPIO_SPI_CS), Pin(GPIO_SPI_DC)); + tft = new Adafruit_ILI9341(pin_cs, pin_dc); tft->begin(); #ifdef USE_DISPLAY_MODES1TO5 diff --git a/tasmota/xsns_80_mfrc522.ino b/tasmota/xsns_80_mfrc522.ino index 2c970119f..899c77909 100644 --- a/tasmota/xsns_80_mfrc522.ino +++ b/tasmota/xsns_80_mfrc522.ino @@ -17,6 +17,7 @@ along with this program. If not, see . */ +#ifdef USE_SPI #ifdef USE_RC522 /*********************************************************************************************\ * MFRC522 - 13.56 MHz RFID reader @@ -97,8 +98,8 @@ void RC522ScanForTag(void) { } void RC522Init(void) { - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_RC522_RST)) { - Mfrc522 = new MFRC522(Pin(GPIO_SPI_CS), Pin(GPIO_RC522_RST)); + if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST)) { + Mfrc522 = new MFRC522(Pin(GPIO_RC522_CS), Pin(GPIO_RC522_RST)); SPI.begin(); Mfrc522->PCD_Init(); // if (Mfrc522->PCD_PerformSelfTest()) { // Saves 0k5 code @@ -155,3 +156,4 @@ bool Xsns80(uint8_t function) { } #endif // USE_RC522 +#endif // USE_SPI From 01647b96dece90cb68dc6aaed371e0e71bc7e1fb Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 29 Dec 2020 17:52:25 +0100 Subject: [PATCH 020/255] Forgot the workflows for odroid-go --- .github/workflows/CI_github_ESP32.yml | 20 +++++++++++++++++ .github/workflows/Tasmota_build.yml | 23 ++++++++++++++++++++ .github/workflows/Tasmota_build_master.yml | 25 +++++++++++++++++++++- 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CI_github_ESP32.yml b/.github/workflows/CI_github_ESP32.yml index a36d747dc..ecf8bf561 100644 --- a/.github/workflows/CI_github_ESP32.yml +++ b/.github/workflows/CI_github_ESP32.yml @@ -44,6 +44,26 @@ jobs: name: firmware path: ./build_output/firmware + tasmota32-odroidgo: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-odroidgo + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + tasmota32-minimal: runs-on: ubuntu-latest steps: diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 1507fc2c2..fe06a70d2 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -875,6 +875,29 @@ jobs: path: ./build_output/firmware + tasmota32-odroidgo: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-odroidgo + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-knx: needs: tasmota_pull runs-on: ubuntu-latest diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 5d1453c60..4169bd028 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -875,6 +875,29 @@ jobs: path: ./build_output/firmware + tasmota32-odroidgo: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-odroidgo + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-knx: needs: tasmota_pull runs-on: ubuntu-latest @@ -1544,7 +1567,7 @@ jobs: [ ! -f ./mv_firmware/tasmota-ir*.* ] || mv ./mv_firmware/tasmota-ir*.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-display.* ] || mv ./mv_firmware/tasmota-display.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-knx.* ] || mv ./mv_firmware/tasmota-knx.* ./firmware/tasmota/ - [ ! -f ./mv_firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/tasmota-zbbridge.* ./firmware/tasmota/ + [ ! -f ./mv_firmware/tasmota-zbbridge.* ] || mv ./mv_firmware/tasmota-zbbridge.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota32.* ] || mv ./mv_firmware/tasmota32.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-sensors.* ] || mv ./mv_firmware/tasmota32-sensors.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-minimal.* ] || mv ./mv_firmware/tasmota32-minimal.* ./firmware/tasmota32/ From 37bd2a99f60092ef0419af6bfbc33c357c2c1c62 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 29 Dec 2020 18:03:05 +0100 Subject: [PATCH 021/255] Add basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin Add basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) --- CHANGELOG.md | 3 +++ RELEASENOTES.md | 1 + platformio_tasmota_env32.ini | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4e45bf32e..bd49bc4c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development ## [9.2.0.2] +### Added +- Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) + ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1f9677073..6f02fa36f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -68,6 +68,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for Afrikaans language translations by Christiaan Heerze - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) +- Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 886b2cfaf..bad0b800a 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -39,7 +39,7 @@ lib_extra_dirs = lib/libesp32, lib/lib_basic [env:tasmota32-odroidgo] extends = env:tasmota32 board = odroid_esp32 -board_build.f_cpu = 160000000L +board_build.f_cpu = 240000000L board_build.partitions = esp32_partition_app1984k_ffat12M.csv build_flags = ${common32.build_flags} -DFIRMWARE_ODROID_GO lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_i2c, lib/lib_rf, lib/lib_div, lib/lib_ssl, lib/lib_display From 488712c3f0ace7ccb3d6d12dc0c721c7e6e25597 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 29 Dec 2020 19:31:27 +0100 Subject: [PATCH 022/255] Commands `CTRange` and `VirtualCT` --- CHANGELOG.md | 2 + tasmota/i18n.h | 2 + tasmota/my_user_config.h | 2 + tasmota/support_command.ino | 5 + tasmota/tasmota_configurations.h | 2 + tasmota/xdrv_04_light.ino | 463 ++++++++++++++++++++++--------- 6 files changed, 345 insertions(+), 131 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd49bc4c8..d542934fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to this project will be documented in this file. ## [9.2.0.2] ### Added - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) +- Command ``CTRange`` to specify the visible CT range the bulb is capable of +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 17cd2fe53..3fd70be4e 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -425,6 +425,8 @@ #define D_CMND_DIMMER_RANGE "DimmerRange" #define D_CMND_DIMMER_STEP "DimmerStep" #define D_CMND_HSBCOLOR "HSBColor" +#define D_CMND_VIRTUALCT "VirtualCT" +#define D_CMND_CTRANGE "CTRange" #define D_CMND_LED "Led" #define D_CMND_LEDTABLE "LedTable" #define D_CMND_FADE "Fade" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 7c354c8bf..cc75735cf 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -309,6 +309,7 @@ #define LIGHT_WHITE_BLEND_MODE false // [SetOption105] White Blend Mode - used to be `RGBWWTable` last value `0`, now deprecated in favor of this option #define LIGHT_VIRTUAL_CT false // [SetOption106] Virtual CT - Creates a virtual White ColorTemp for RGBW lights #define LIGHT_VIRTUAL_CT_CW false // [SetOption107] Virtual CT Channel - signals whether the hardware white is cold CW (true) or warm WW (false) +#define LIGHT_VIRTUAL_CT_POINTS 3 // Number of reference points for Virtual CT (min 2, default 3) // -- Energy -------------------------------------- #define ENERGY_VOLTAGE_ALWAYS false // [SetOption21] Enable show voltage even if powered off @@ -494,6 +495,7 @@ #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code) #define USE_LIGHT_PALETTE // Add support for color palette (+0k7 code) +#define USE_LIGHT_VIRTUAL_CT // Add support for Virtual White Color Temperature (+1.1k code) #define USE_DGR_LIGHT_SEQUENCE // Add support for device group light sequencing (requires USE_DEVICE_GROUPS) (+0k2 code) // -- Counter input ------------------------------- diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 34a3bd2e3..bc1121123 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -941,6 +941,11 @@ void CmndSetoption(void) else if (4 == ptype) { // SetOption82 .. 113 bitWrite(Settings.flag4.data, pindex, XdrvMailbox.payload); switch (pindex) { +#ifdef USE_LIGHT + case 0: // SetOption 82 - (Alexa) Reduced CT range for Alexa (1) + setAlexaCTRange(); + break; +#endif case 3: // SetOption85 - Enable Device Groups case 6: // SetOption88 - PWM Dimmer Buttons control remote devices case 15: // SetOption97 - Set Baud rate for TuyaMCU serial communication (0 = 9600 or 1 = 115200) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 52bd19c58..6e4169e82 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -508,6 +508,7 @@ // -- Optional light modules ---------------------- //#undef USE_LIGHT // Enable Dimmer/Light support +#undef USE_LIGHT_VIRTUAL_CT // Disable support for Virtual White Color Temperature (SO106) #undef USE_WS2812 // Disable WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by // #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) @@ -643,6 +644,7 @@ //#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code) // -- Optional light modules ---------------------- +#undef USE_LIGHT_VIRTUAL_CT // Disable support for Virtual White Color Temperature (SO106) //#undef USE_LIGHT // Also disable all Dimmer/Light support #undef USE_WS2812 // Disable WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by // #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 2cd84f780..a47c4a4ca 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -132,6 +132,10 @@ const char kLightCommands[] PROGMEM = "|" // No prefix D_CMND_COLOR "|" D_CMND_COLORTEMPERATURE "|" D_CMND_DIMMER "|" D_CMND_DIMMER_RANGE "|" D_CMND_DIMMER_STEP "|" D_CMND_LEDTABLE "|" D_CMND_FADE "|" D_CMND_RGBWWTABLE "|" D_CMND_SCHEME "|" D_CMND_SPEED "|" D_CMND_WAKEUP "|" D_CMND_WAKEUPDURATION "|" D_CMND_WHITE "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR + "|" D_CMND_CTRANGE +#ifdef USE_LIGHT_VIRTUAL_CT + "|" D_CMND_VIRTUALCT +#endif // USE_LIGHT_VIRTUAL_CT #ifdef USE_LIGHT_PALETTE "|" D_CMND_PALETTE #endif // USE_LIGHT_PALETTE @@ -144,6 +148,10 @@ void (* const LightCommand[])(void) PROGMEM = { &CmndColor, &CmndColorTemperature, &CmndDimmer, &CmndDimmerRange, &CmndDimmerStep, &CmndLedTable, &CmndFade, &CmndRgbwwTable, &CmndScheme, &CmndSpeed, &CmndWakeup, &CmndWakeupDuration, &CmndWhite, &CmndChannel, &CmndHsbColor, + &CmndCTRange, +#ifdef USE_LIGHT_VIRTUAL_CT + &CmndVirtualCT, +#endif // USE_LIGHT_VIRTUAL_CT #ifdef USE_LIGHT_PALETTE &CmndPalette, #endif // USE_LIGHT_PALETTE @@ -181,6 +189,12 @@ const uint16_t CT_MAX = 500; // 2000K // Ranges used for Alexa const uint16_t CT_MIN_ALEXA = 200; // also 5000K const uint16_t CT_MAX_ALEXA = 380; // also 2600K +// Virtual CT default values +typedef uint8_t vct_pivot_t[LST_MAX]; +const size_t CT_PIVOTS = LIGHT_VIRTUAL_CT_POINTS; +const vct_pivot_t CT_PIVOTS_RGB PROGMEM = { 255, 255, 255, 0, 0 }; +const vct_pivot_t CT_PIVOTS_CWW PROGMEM = { 0, 0, 0, 255, 0 }; +const vct_pivot_t CT_PIVOTS_WWW PROGMEM = { 0, 0, 0, 0, 255 }; // New version of Gamma correction compute // Instead of a table, we do a multi-linear approximation, which is close enough @@ -308,6 +322,12 @@ struct LIGHT { uint16_t pwm_min = 0; // minimum value for PWM, from DimmerRange, 0..1023 uint16_t pwm_max = 1023; // maxumum value for PWM, from DimmerRange, 0..1023 + + // Virtual CT + uint16_t vct_ct[CT_PIVOTS]; // CT value for each segment +#ifdef USE_LIGHT_VIRTUAL_CT + vct_pivot_t vct_color[CT_PIVOTS]; // array of 3 colors each with 5 values +#endif } Light; power_t LightPower(void) @@ -378,13 +398,6 @@ class LightStateClass { uint8_t _briCT = 255; uint8_t _color_mode = LCM_RGB; // RGB by default - // the CT range below represents the rendered range, - // This is due to Alexa whose CT range is 199..383 - // Hence setting Min=200 and Max=380 makes Alexa use the full range - // Please note that you can still set CT to 153..500, but any - // value below _ct_min_range or above _ct_max_range not change the CT - uint16_t _ct_min_range = CT_MIN; // the minimum CT rendered range - uint16_t _ct_max_range = CT_MAX; // the maximum CT rendered range public: LightStateClass() { @@ -535,22 +548,7 @@ class LightStateClass { inline uint16_t getCT() const { return _ct; // 153..500, or CT_MIN..CT_MAX - } - - // get the CT value within the range into a 10 bits 0..1023 value - uint16_t getCT10bits() const { - return changeUIntScale(_ct, _ct_min_range, _ct_max_range, 0, 1023); - } - - inline void setCTRange(uint16_t ct_min_range, uint16_t ct_max_range) { - _ct_min_range = ct_min_range; - _ct_max_range = ct_max_range; - } - - inline void getCTRange(uint16_t *ct_min_range, uint16_t *ct_max_range) const { - if (ct_min_range) { *ct_min_range = _ct_min_range; } - if (ct_max_range) { *ct_max_range = _ct_max_range; } - } + } // get current color in XY format void getXY(float *x, float *y) { @@ -603,7 +601,7 @@ class LightStateClass { setColorMode(LCM_RGB); // try deactivating CT mode, setColorMode() will check which is legal } else { ct = (ct < CT_MIN ? CT_MIN : (ct > CT_MAX ? CT_MAX : ct)); - _ww = changeUIntScale(ct, _ct_min_range, _ct_max_range, 0, 255); + _ww = changeUIntScale(ct, Light.vct_ct[0], Light.vct_ct[CT_PIVOTS-1], 0, 255); _wc = 255 - _ww; _ct = ct; addCTMode(); @@ -932,15 +930,6 @@ public: return prev; } - void setAlexaCTRange(bool alexa_ct_range) { - // depending on SetOption82, full or limited CT range - if (alexa_ct_range) { - _state->setCTRange(CT_MIN_ALEXA, CT_MAX_ALEXA); // 200..380 - } else { - _state->setCTRange(CT_MIN, CT_MAX); // 153..500 - } - } - inline bool isCTRGBLinked() { return _ct_rgb_linked; } @@ -1190,6 +1179,63 @@ uint8_t change10to8(uint16_t v) { return (0 == v) ? 0 : changeUIntScale(v, 4, 1023, 1, 255); } +/*********************************************************************************************\ + * CT (White Color Temperature) +\*********************************************************************************************/ +// +// Ensure that invariants for Virtual CT are good: +// - CT_MIN <= ct[0] <= ct[1] <= ct[2] <= CT_MAX + +#ifdef USE_LIGHT_VIRTUAL_CT +void checkVirtualCT(void) { + if (Light.vct_ct[0] < CT_MIN) { Light.vct_ct[0] = CT_MIN; } + if (Light.vct_ct[CT_PIVOTS-1] > CT_MAX) { Light.vct_ct[CT_PIVOTS-1] = CT_MAX; } + for (uint32_t i = 0; i < CT_PIVOTS-1; i++) { + if (Light.vct_ct[i+1] < Light.vct_ct[i]) { Light.vct_ct[i+1] = Light.vct_ct[i]; } + } +} +#endif // USE_LIGHT_VIRTUAL_CT + +#ifdef USE_LIGHT_VIRTUAL_CT +// Init default values for virtual CT, depending on the number of channels +void initCTRange(uint32_t channels) { + if (channels == 4) { + if (Settings.flag4.virtual_ct_cw) { // Hardware White is Cold White + memcpy_P(Light.vct_color[0], CT_PIVOTS_CWW, sizeof(Light.vct_color[0])); // Cold white + memcpy_P(Light.vct_color[1], CT_PIVOTS_RGB, sizeof(Light.vct_color[1])); // Warm white + } else { // Hardware White is Warm White + memcpy_P(Light.vct_color[0], CT_PIVOTS_RGB, sizeof(Light.vct_color[0])); // Cold white + memcpy_P(Light.vct_color[1], CT_PIVOTS_CWW, sizeof(Light.vct_color[1])); // Warm white + } + } else if (channels == 5) { + memcpy_P(Light.vct_color[0], CT_PIVOTS_CWW, sizeof(Light.vct_color[0])); // Cold white + memcpy_P(Light.vct_color[1], CT_PIVOTS_WWW, sizeof(Light.vct_color[1])); // Warm white + } else { + memcpy_P(Light.vct_color[0], CT_PIVOTS_RGB, sizeof(Light.vct_color[0])); // Cold white + memcpy_P(Light.vct_color[1], CT_PIVOTS_RGB, sizeof(Light.vct_color[1])); // Warm white + } + for (uint32_t i = 1; i < CT_PIVOTS-1; i++) { + memcpy_P(Light.vct_color[i+1], Light.vct_color[i], sizeof(Light.vct_color[0])); // Copy slot 1 into slot 2 (slot 2 in unused) + } + checkVirtualCT(); +} +#endif // USE_LIGHT_VIRTUAL_CT + +void setCTRange(uint16_t ct_min, uint16_t ct_max) { + Light.vct_ct[0] = ct_min; + for (uint32_t i = 1; i < CT_PIVOTS; i++) { + Light.vct_ct[i] = ct_max; // all slots above [1] are not used + } +} + +void setAlexaCTRange(void) { // depending on SetOption82, full or limited CT range + if (Settings.flag4.alexa_ct_range) { + setCTRange(CT_MIN_ALEXA, CT_MAX_ALEXA); + } else { + setCTRange(CT_MIN, CT_MAX); + } +} + /*********************************************************************************************\ * Gamma correction \*********************************************************************************************/ @@ -1299,9 +1345,14 @@ bool LightModuleInit(void) } else if ((Settings.param[P_RGB_REMAP] & 128) && (LST_RGBW <= pwm_channels)) { // SetOption37 // if RGBW or RGBCW, and SetOption37 >= 128, we manage RGB and W separately, hence adding a device TasmotaGlobal.devices_present++; - } else if ((Settings.flag4.virtual_ct) && (LST_RGBW == pwm_channels)) { - Light.virtual_ct = true; // enabled - TasmotaGlobal.light_type++; // create an additional virtual 5th channel + } else { +#ifdef USE_LIGHT_VIRTUAL_CT + initCTRange(pwm_channels); + if ((Settings.flag4.virtual_ct) && (LST_RGB <= pwm_channels)) { + Light.virtual_ct = true; // enabled + TasmotaGlobal.light_type += 5 - pwm_channels; // pretend it is a 5 channels bulb + } +#endif // USE_LIGHT_VIRTUAL_CT } return (TasmotaGlobal.light_type > LT_BASIC); @@ -1367,7 +1418,7 @@ void LightInit(void) light_controller.setSubType(Light.subtype); light_controller.loadSettings(); - light_controller.setAlexaCTRange(Settings.flag4.alexa_ct_range); + setAlexaCTRange(); light_controller.calcLevels(); // calculate the initial values (#8058) if (LST_SINGLE == Light.subtype) { @@ -1859,7 +1910,6 @@ void LightAnimate(void) bool power_off = false; // make sure we update CT range in case SetOption82 was changed - light_controller.setAlexaCTRange(Settings.flag4.alexa_ct_range); Light.strip_timer_counter++; // set sleep parameter: either settings, @@ -1966,7 +2016,6 @@ void LightAnimate(void) uint16_t cur_col_10[LST_MAX]; // 10 bits resolution Light.update = false; - bool rgbwwtable_applied = false; // did we already applied RGBWWTable (ex: in white_blend_mode or virtual_ct) // first set 8 and 10 bits channels for (uint32_t i = 0; i < LST_MAX; i++) { @@ -1975,58 +2024,19 @@ void LightAnimate(void) cur_col_10[i] = change8to10(Light.new_color[i]); } + bool rgbwwtable_applied_white = false; // did we already applied RGBWWTable to white channels (ex: in white_blend_mode or virtual_ct) if (Light.pwm_multi_channels) { calcGammaMultiChannels(cur_col_10); } else { - calcGammaBulbs(cur_col_10); - - // Now see if we need to mix RGB and True White - // Valid only for LST_RGBW, LST_RGBCW, rgbwwTable[4] is zero, and white is zero (see doc) - if ((LST_RGBW <= Light.subtype) && (Settings.flag4.white_blend_mode) && (0 == cur_col_10[3]+cur_col_10[4])) { - uint32_t min_rgb_10 = min3(cur_col_10[0], cur_col_10[1], cur_col_10[2]); - for (uint32_t i=0; i<3; i++) { - // substract white and adjust according to rgbwwTable - uint32_t adjust10 = change8to10(Settings.rgbwwTable[i]); - cur_col_10[i] = changeUIntScale(cur_col_10[i] - min_rgb_10, 0, 1023, 0, adjust10); - } - - // compute the adjusted white levels for 10 and 8 bits - uint32_t adjust_w_10 = changeUIntScale(Settings.rgbwwTable[3], 0, 255, 0, 1023); - uint32_t white_10 = changeUIntScale(min_rgb_10, 0, 1023, 0, adjust_w_10); // set white power down corrected with rgbwwTable[3] - if (LST_RGBW == Light.subtype) { - // we simply set the white channel - cur_col_10[3] = white_10; - } else { // LST_RGBCW - // we distribute white between cold and warm according to CT value - uint32_t ct = light_state.getCT10bits(); - cur_col_10[4] = changeUIntScale(ct, 0, 1023, 0, white_10); - cur_col_10[3] = white_10 - cur_col_10[4]; - } - rgbwwtable_applied = true; - } else if ((Light.virtual_ct) && (0 == cur_col_10[0]+cur_col_10[1]+cur_col_10[2])) { - // virtual_ct is on and we don't have any RGB set - uint16_t sw_white = Settings.flag4.virtual_ct_cw ? cur_col_10[4] : cur_col_10[3]; // white power for virtual RGB - uint16_t hw_white = Settings.flag4.virtual_ct_cw ? cur_col_10[3] : cur_col_10[4]; // white for hardware LED - uint32_t adjust_sw = change8to10(Settings.flag4.virtual_ct_cw ? Settings.rgbwwTable[4] : Settings.rgbwwTable[3]); - uint32_t adjust_hw = change8to10(Settings.flag4.virtual_ct_cw ? Settings.rgbwwTable[3] : Settings.rgbwwTable[4]); - // set the target channels. Note: Gamma correction was arleady applied - cur_col_10[3] = changeUIntScale(hw_white, 0, 1023, 0, adjust_hw); - cur_col_10[4] = 0; // we don't actually have a 5the channel - sw_white = changeUIntScale(sw_white, 0, 1023, 0, adjust_sw); // pre-adjust virtual channel - for (uint32_t i=0; i<3; i++) { - uint32_t adjust = change8to10(Settings.rgbwwTable[i]); - cur_col_10[i] = changeUIntScale(sw_white, 0, 1023, 0, adjust); - } - rgbwwtable_applied = true; - } + // AddLog_P(LOG_LEVEL_INFO, PSTR(">>> calcGammaBulbs In %03X,%03X,%03X,%03X,%03X"), cur_col_10[0], cur_col_10[1], cur_col_10[2], cur_col_10[3], cur_col_10[4]); + rgbwwtable_applied_white = calcGammaBulbs(cur_col_10); // true means that one PWM channel is used for CT + // AddLog_P(LOG_LEVEL_INFO, PSTR(">>> calcGammaBulbs Out %03X,%03X,%03X,%03X,%03X"), cur_col_10[0], cur_col_10[1], cur_col_10[2], cur_col_10[3], cur_col_10[4]); } // Apply RGBWWTable only if not Settings.flag4.white_blend_mode - if (!rgbwwtable_applied) { - for (uint32_t i = 0; i 1023) ? 1023 : white_bri10; // max 1023 - -#ifdef ESP8266 - if ((PHILIPS == TasmotaGlobal.module_type) || (Settings.flag4.pwm_ct_mode)) { // channel 1 is the color tone, mapped to cold channel (0..255) - // Xiaomi Philips bulbs follow a different scheme: - cur_col_10[cw1] = light_state.getCT10bits(); - // channel 0=intensity, channel1=temperature - if (Settings.light_correction) { // gamma correction - cur_col_10[cw0] = ledGamma10_10(white_bri10_1023); // 10 bits gamma correction - } else { - cur_col_10[cw0] = white_bri10_1023; // no gamma, extend to 10 bits - } - } else -#endif // ESP8266 - if (Settings.light_correction) { - // if sum of both channels is > 255, then channels are probably uncorrelated - if (white_bri10 <= 1031) { // take a margin of 8 above 1023 to account for rounding errors - // we calculate the gamma corrected sum of CW + WW - uint16_t white_bri_gamma10 = ledGamma10_10(white_bri10_1023); - // then we split the total energy among the cold and warm leds - cur_col_10[cw0] = changeUIntScale(cur_col_10[cw0], 0, white_bri10_1023, 0, white_bri_gamma10); - cur_col_10[cw1] = changeUIntScale(cur_col_10[cw1], 0, white_bri10_1023, 0, white_bri_gamma10); - } else { - cur_col_10[cw0] = ledGamma10_10(cur_col_10[cw0]); - cur_col_10[cw1] = ledGamma10_10(cur_col_10[cw1]); - } - } - } +// +// Compute the Gamma correction for CW/WW +// Can be used for 2-channels (channels 0,1) or 5 channels (channels 3,4) +// +// It is implicitly called by calcGammaBulb5Channels() +// +// In: +// - 2 channels CW/WW in 10 bits format (0..1023) +// Out: +// - 2 channels CW/WW in 10 bits format, with Gamma corretion (if enabled), replaced in place +// - white_bri10: global brightness of white channel, split over CW/WW (basically the sum of CW+WW, but it's easier to compute on this basis) +// - white_free_cw: signals that CW/WW are free mode, and not linked via CT. This is used when channels are manually set on a channel per channel basis. CT is ignored +// +void calcGammaBulbCW(uint16_t cw10[2], uint16_t *white_bri10_out, bool *white_free_cw_out) { + uint16_t white_bri10 = cw10[0] + cw10[1]; // cumulated brightness + bool white_free_cw = (white_bri10 > 1031); // take a margin of 8 above 1023 to account for rounding errors + white_bri10 = (white_bri10 > 1023) ? 1023 : white_bri10; // max 1023 if (Settings.light_correction) { - // then apply gamma correction to RGB channels - if (LST_RGB <= Light.subtype) { - for (uint32_t i = 0; i < 3; i++) { - cur_col_10[i] = ledGamma10_10(cur_col_10[i]); - } - } - // If RGBW or Single channel, also adjust White channel - if ((LST_SINGLE == Light.subtype) || (LST_RGBW == Light.subtype)) { - cur_col_10[Light.subtype - 1] = ledGamma10_10(cur_col_10[Light.subtype - 1]); + if (white_free_cw) { + cw10[0] = ledGamma10_10(cw10[0]); + cw10[1] = ledGamma10_10(cw10[1]); + } else { + uint16_t white_bri10_gamma = ledGamma10_10(white_bri10); // gamma corrected white + // now distributed among both channels + cw10[0] = changeUIntScale(cw10[0], 0, white_bri10, 0, white_bri10_gamma); + cw10[1] = changeUIntScale(cw10[1], 0, white_bri10, 0, white_bri10_gamma); + // now use white_bri10_gamma as a reference + white_bri10 = white_bri10_gamma; } } + if (white_bri10_out != nullptr) { *white_bri10_out = white_bri10; } + if (white_free_cw_out != nullptr) { *white_free_cw_out = white_free_cw; } +} + +// +// Calculate the gamma correction for all 5 channels RGBCW +// Computation is valid for 1,3,4,5 channels +// 2-channels bulbs must be handled separately +// +// In: +// - 5 channels RGBCW in 10 bits format (0..1023) +// Out: +// - 5 channels RGBCW in 10 bits format, with Gamma corretion (if enabled), replaced in place +// - white_bri10: global brightness of white channel, split over CW/WW (basically the sum of CW+WW, but it's easier to compute on this basis) +// - white_free_cw: signals that CW/WW are free mode, and not linked via CT. This is used when channels are manually set on a channel per channel basis. CT is ignored +// +void calcGammaBulb5Channels(uint16_t col10[LST_MAX], uint16_t *white_bri10_out, bool *white_free_cw) { + for (uint32_t i = 0; i < 3; i++) { + if (Settings.light_correction) { + col10[i] = ledGamma10_10(col10[i]); + } + } + calcGammaBulbCW(&col10[3], white_bri10_out, white_free_cw); +} + +// sale but converts from 8 bits to 10 bits first +void calcGammaBulb5Channels_8(uint8_t in8[LST_MAX], uint16_t col10[LST_MAX]) { + for (uint32_t i = 0; i < LST_MAX; i++) { + col10[i] = change8to10(in8[i]); + } + calcGammaBulb5Channels(col10, nullptr, nullptr); +} + +bool calcGammaBulbs(uint16_t cur_col_10[5]) { + bool rgbwwtable_applied_white = false; + bool pwm_ct = false; + bool white_free_cw = false; // true if White channels are uncorrelated. Happens when CW+WW>255, i.e. manually setting white channels to exceed to total power of a single channel (may harm the power supply) + // Various values needed for accurate White calculation + // CT value streteched to 0..1023 (from within CT range, so not necessarily from 153 to 500). 0=Cold, 1023=Warm + uint16_t ct = light_state.getCT(); + uint16_t ct_10 = changeUIntScale(ct, Light.vct_ct[0], Light.vct_ct[CT_PIVOTS-1], 0, 1023); + + uint16_t white_bri10 = 0; // White total brightness normalized to 0..1023 + // uint32_t cw1 = Light.subtype - 1; // address for the ColorTone PWM + uint32_t cw0 = Light.subtype - 2; // address for the White Brightness PWM + + // calc basic gamma correction for all types + if ((LST_SINGLE == Light.subtype) || (LST_RGB <= Light.subtype)) { + calcGammaBulb5Channels(cur_col_10, &white_bri10, &white_free_cw); + } else if (LST_COLDWARM == Light.subtype) { + calcGammaBulbCW(cur_col_10, &white_bri10, &white_free_cw); + } + + // Now we know ct_10 and white_bri10 (gamma corrected if needed) + +#ifdef ESP8266 + if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) { + if ((PHILIPS == TasmotaGlobal.module_type) || (Settings.flag4.pwm_ct_mode)) { // channel 1 is the color tone, mapped to cold channel (0..255) + pwm_ct = true; + // Xiaomi Philips bulbs follow a different scheme: + // channel 0=intensity, channel1=temperature + cur_col_10[cw0] = white_bri10; + cur_col_10[cw0+1] = ct_10; + return false; // avoid any interference + } + } +#endif // ESP8266 + + // Now see if we need to mix RGB and White + // Valid only for LST_RGBW, LST_RGBCW, SetOption105 1, and white is zero (see doc) + if ((LST_RGBW <= Light.subtype) && (Settings.flag4.white_blend_mode) && (0 == cur_col_10[3]+cur_col_10[4])) { + uint32_t min_rgb_10 = min3(cur_col_10[0], cur_col_10[1], cur_col_10[2]); + cur_col_10[0] -= min_rgb_10; + cur_col_10[1] -= min_rgb_10; + cur_col_10[2] -= min_rgb_10; + + // Add to white level + uint32_t adjust_w_10 = change8to10(Settings.rgbwwTable[3]); // take the correction factor, bought back to 10 bits + white_bri10 += changeUIntScale(min_rgb_10, 0, 1023, 0, adjust_w_10); // set white power down corrected with rgbwwTable[3] + white_bri10 = (white_bri10 > 1023) ? 1023 : white_bri10; // max 1023 + rgbwwtable_applied_white = true; + } + +#ifdef USE_LIGHT_VIRTUAL_CT + // compute virtual CT, which is suppsed to be compatible with white_blend_mode + if (Light.virtual_ct && (!white_free_cw) && (LST_RGBW <= Light.subtype)) { // any light with a white channel + vct_pivot_t *pivot = &Light.vct_color[0]; + uint16_t *from_ct = &Light.vct_ct[0]; + + for (uint32_t i = 1; i < CT_PIVOTS-1; i++) { + if (ct > Light.vct_ct[i]) { // if above mid-point, take range [1]..[2] instead of [0]..[1] + pivot++; + from_ct++; + } + } + uint16_t from10[LST_MAX]; + uint16_t to10[LST_MAX]; + calcGammaBulb5Channels_8(*pivot, from10); + calcGammaBulb5Channels_8(*(pivot+1), to10); + + vct_pivot_t *pivot1 = pivot + 1; + // AddLog_P(LOG_LEVEL_INFO, PSTR("+++ from_ct %d, to_ct %d [%03X,%03X,%03X,%03X,%03X] - [%03X,%03X,%03X,%03X,%03X]"), + // *from_ct, *(from_ct+1), (*pivot)[0], (*pivot)[1], (*pivot)[2], (*pivot)[3], (*pivot)[4], + // (*pivot1)[0], (*pivot1)[1], (*pivot1)[2], (*pivot1)[3], (*pivot1)[4]); + // AddLog_P(LOG_LEVEL_INFO, PSTR("+++ from10 [%03X,%03X,%03X,%03X,%03X] - to 10 [%03X,%03X,%03X,%03X,%03X]"), + // from10[0],from10[0],from10[0],from10[0],from10[4], + // to10[0],to10[0],to10[0],to10[0],to10[4]); + + // set both CW/WW to zero since their previous value don't count anymore + cur_col_10[3] = 0; + cur_col_10[4] = 0; + + // Add the interpolated point to each component + for (uint32_t i = 0; i < LST_MAX; i++) { + cur_col_10[i] += changeUIntScale(changeUIntScale(ct, *from_ct, *(from_ct+1), from10[i], to10[i]), 0, 1023, 0, white_bri10); + if (cur_col_10[i] > 1023) { cur_col_10[i] = 1023; } + } + } else +#endif // USE_LIGHT_VIRTUAL_CT + // compute the actual levels for CW/WW + // We know ct_10 and white_bri_10 (which may be Gamma corrected) + // cur_col_10[cw0] and cur_col_10[cw1] were unmodified up to now + if (LST_RGBW == Light.subtype) { + cur_col_10[3] = white_bri10; // simple case, we set the White level to the required brightness + } else if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) { + // if sum of both channels is > 255, then channels are probably uncorrelated + if (!white_free_cw) { + // then we split the total energy among the cold and warm leds + cur_col_10[cw0+1] = changeUIntScale(ct_10, 0, 1023, 0, white_bri10); + cur_col_10[cw0] = white_bri10 - cur_col_10[cw0+1]; + } + } + return rgbwwtable_applied_white; } #ifdef USE_DEVICE_GROUPS @@ -3045,6 +3169,83 @@ void CmndWakeupDuration(void) ResponseCmndNumber(Settings.light_wakeup); } +void CmndCTRange(void) +{ + // Format is "CTRange ctmin,ctmax" + // Ex: + // CTRange 153,500 + // CTRange + // CTRange 200,350 + char *p; + strtok_r(XdrvMailbox.data, ",", &p); + if (p != nullptr) { + int32_t ct_min = strtol(XdrvMailbox.data, nullptr, 0); + int32_t ct_max = strtol(p, nullptr, 0); + if ( (ct_min >= CT_MIN) && (ct_min <= CT_MAX) && + (ct_max >= CT_MIN) && (ct_max <= CT_MAX) && + (ct_min <= ct_max) + ) { + setCTRange(ct_min, ct_max); + } else { + return; // error + } + } + Response_P(PSTR("{\"%s\":\"%d,%d\"}"), XdrvMailbox.command, Light.vct_ct[0], Light.vct_ct[CT_PIVOTS-1]); +} + +#ifdef USE_LIGHT_VIRTUAL_CT +void CmndVirtualCT(void) +{ + if (!Settings.flag4.virtual_ct) { + ResponseCmndChar_P(PSTR("You need to enable `SetOption106 1`")); + return; + } + if (XdrvMailbox.data[0] == ('{')) { + // parse JSON + JsonParser parser(XdrvMailbox.data); + JsonParserObject root = parser.getRootObject(); + if (!root) { return; } + + uint32_t idx = 0; + for (auto key : root) { + if (idx >= CT_PIVOTS) { ResponseCmndChar_P(PSTR("Too many points")); return; } + + int32_t ct_val = strtol(key.getStr(), nullptr, 0); + if ((ct_val < CT_MIN) || (ct_val > CT_MAX)) { ResponseCmndChar_P(PSTR("CT out of range")); return; } + char * color = (char*) key.getValue().getStr(); + // call color parser + Light.vct_ct[idx] = ct_val; + if (LightColorEntry(color, strlen(color))) { + memcpy(&Light.vct_color[idx], Light.entry_color, sizeof(Light.vct_color[idx])); + } + idx++; + } + for (uint32_t i = idx-1; i < CT_PIVOTS-1; i++) { + Light.vct_ct[i+1] = Light.vct_ct[i]; + memcpy(&Light.vct_color[i+1], &Light.vct_color[i], sizeof(Light.vct_color[0])); + } + } + checkVirtualCT(); + + Response_P(PSTR("{\"%s\":{"), XdrvMailbox.command); + uint32_t pivot_len = CT_PIVOTS; + vct_pivot_t * pivot = &Light.vct_color[0]; + if (Light.vct_ct[1] >= Light.vct_ct[2]) { pivot_len = 2; } // only 2 points are valid + + bool end = false; + for (uint32_t i = 0; (i < CT_PIVOTS) && !end; i++) { + if ((i >= CT_PIVOTS-1) || (Light.vct_ct[i] >= Light.vct_ct[i+1])) { + end = true; + } + ResponseAppend_P(PSTR("\"%d\":\"%02X%02X%02X%02X%02X\"%c"), Light.vct_ct[i], + (*pivot)[0], (*pivot)[1], (*pivot)[2], (*pivot)[3], (*pivot)[4], + end ? '}' : ','); + pivot++; + } + ResponseJsonEnd(); +} +#endif // USE_LIGHT_VIRTUAL_CT + #ifdef USE_LIGHT_PALETTE void CmndPalette(void) { From 2afc18bac2da5621d57d631807529b55d14725dc Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 29 Dec 2020 19:58:38 +0100 Subject: [PATCH 023/255] Fix compilation for TuyaMCU --- tasmota/xdrv_04_light.ino | 5 +++++ tasmota/xdrv_16_tuyamcu.ino | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index a47c4a4ca..f0b94bcec 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -1221,6 +1221,11 @@ void initCTRange(uint32_t channels) { } #endif // USE_LIGHT_VIRTUAL_CT +void getCTRange(uint16_t * min_ct, uint16_t * max_ct) { + if (min_ct != nullptr) { *min_ct = Light.vct_ct[0]; } + if (max_ct != nullptr) { *max_ct = Light.vct_ct[CT_PIVOTS-1]; } +} + void setCTRange(uint16_t ct_min, uint16_t ct_max) { Light.vct_ct[0] = ct_min; for (uint32_t i = 1; i < CT_PIVOTS; i++) { diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 13a7864c5..51a0a9c5b 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -517,7 +517,7 @@ bool TuyaSetChannels(void) Tuya.Snapshot[0] = changeUIntScale(Light.current_color[0], 0, 255, 0, 100); Tuya.Snapshot[1] = changeUIntScale(Light.current_color[1], 0, 255, 0, 100); } else { // CT Light or RGBWC - light_state.getCTRange(&Tuya.CTMin, &Tuya.CTMax); // SetOption82 - Reduce the CT range from 153..500 to 200..380 to accomodate with Alexa range + getCTRange(&Tuya.CTMin, &Tuya.CTMax); // SetOption82 - Reduce the CT range from 153..500 to 200..380 to accomodate with Alexa range Tuya.Snapshot[0] = light_state.getDimmer(); Tuya.Snapshot[1] = light_state.getCT(); } From e866db7364c1322d83e97b3adac73722b3bc1a0b Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Tue, 29 Dec 2020 22:39:06 +0100 Subject: [PATCH 024/255] feature: SSD1331 SPI display driver Based on release 1.2.0: https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/releases/tag/1.2.0 Inspired by the xdsp_09_SSD1351 driver. --- .../Adafruit_SPITFT_Renderer.cpp | 2217 +++++++++++++++++ .../Adafruit_SPITFT_Renderer.h | 520 ++++ .../Adafruit_SSD1331.cpp | 190 ++ .../Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h | 76 + .../Adafruit_SSD1331-1.2.0/README.md | 24 + .../Adafruit_SSD1331-1.2.0/library.properties | 10 + .../Adafruit_SSD1331-1.2.0/license.txt | 26 + tasmota/xdsp_14_SSD1331.ino | 182 ++ 8 files changed, 3245 insertions(+) create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/README.md create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt create mode 100644 tasmota/xdsp_14_SSD1331.ino diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp new file mode 100644 index 000000000..d49141a28 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp @@ -0,0 +1,2217 @@ +/*! + * @file Adafruit_SPITFT.cpp + * + * @mainpage Adafruit SPI TFT Displays (and some others) + * + * @section intro_sec Introduction + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + + * @section dependencies Dependencies + * + * This library depends on + * Adafruit_GFX being present on your system. Please make sure you have + * installed the latest version before using this library. + * + * @section author Author + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * @section license License + * + * BSD license, all text here must be included in any redistribution. + */ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_SPITFT_Renderer.h" + +#if defined(__AVR__) +#if defined(__AVR_XMEGA__) //only tested with __AVR_ATmega4809__ +#define AVR_WRITESPI(x) for(SPI0_DATA = (x); (!(SPI0_INTFLAGS & _BV(SPI_IF_bp))); ) +#else +#define AVR_WRITESPI(x) for(SPDR = (x); (!(SPSR & _BV(SPIF))); ) +#endif +#endif + +#if defined(PORT_IOBUS) +// On SAMD21, redefine digitalPinToPort() to use the slightly-faster +// PORT_IOBUS rather than PORT (not needed on SAMD51). +#undef digitalPinToPort +#define digitalPinToPort(P) (&(PORT_IOBUS->Group[g_APinDescription[P].ulPort])) +#endif // end PORT_IOBUS + +#if defined(USE_SPI_DMA) + #include + #include "wiring_private.h" // pinPeripheral() function + #include // memalign() function + #define tcNum 2 // Timer/Counter for parallel write strobe PWM + #define wrPeripheral PIO_CCL // Use CCL to invert write strobe + + // DMA transfer-in-progress indicator and callback + static volatile bool dma_busy = false; + static void dma_callback(Adafruit_ZeroDMA *dma) { + dma_busy = false; + } + + #if defined(__SAMD51__) + // Timer/counter info by index # + static const struct { + Tc *tc; // -> Timer/Counter base address + int gclk; // GCLK ID + int evu; // EVSYS user ID + } tcList[] = { + { TC0, TC0_GCLK_ID, EVSYS_ID_USER_TC0_EVU }, + { TC1, TC1_GCLK_ID, EVSYS_ID_USER_TC1_EVU }, + { TC2, TC2_GCLK_ID, EVSYS_ID_USER_TC2_EVU }, + { TC3, TC3_GCLK_ID, EVSYS_ID_USER_TC3_EVU }, + #if defined(TC4) + { TC4, TC4_GCLK_ID, EVSYS_ID_USER_TC4_EVU }, + #endif + #if defined(TC5) + { TC5, TC5_GCLK_ID, EVSYS_ID_USER_TC5_EVU }, + #endif + #if defined(TC6) + { TC6, TC6_GCLK_ID, EVSYS_ID_USER_TC6_EVU }, + #endif + #if defined(TC7) + { TC7, TC7_GCLK_ID, EVSYS_ID_USER_TC7_EVU } + #endif + }; + #define NUM_TIMERS (sizeof tcList / sizeof tcList[0]) ///< # timer/counters + #endif // end __SAMD51__ + +#endif // end USE_SPI_DMA + +// Possible values for Adafruit_SPITFT.connection: +#define TFT_HARD_SPI 0 ///< Display interface = hardware SPI +#define TFT_SOFT_SPI 1 ///< Display interface = software SPI +#define TFT_PARALLEL 2 ///< Display interface = 8- or 16-bit parallel + + +// CONSTRUCTORS ------------------------------------------------------------ + +/*! + @brief Adafruit_SPITFT constructor for software (bitbang) SPI. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param mosi Arduino pin # for bitbang SPI MOSI signal (required). + @param sck Arduino pin # for bitbang SPI SCK signal (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param miso Arduino pin # for bitbang SPI MISO signal (optional, + -1 default, many displays don't support SPI read). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t mosi, int8_t sck, int8_t rst, int8_t miso) : + Renderer(w, h), connection(TFT_SOFT_SPI), _rst(rst), _cs(cs), _dc(dc) { + swspi._sck = sck; + swspi._mosi = mosi; + swspi._miso = miso; +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + swspi.sckPinMask = digitalPinToBitMask(sck); + swspi.mosiPinMask = digitalPinToBitMask(mosi); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + swspi.sckPortSet = portSetRegister(sck); + swspi.sckPortClr = portClearRegister(sck); + swspi.mosiPortSet = portSetRegister(mosi); + swspi.mosiPortClr = portClearRegister(mosi); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if(miso >= 0) { + swspi.misoPort = portInputRegister(miso); + #if !defined(KINETISK) + swspi.misoPinMask = digitalPinToBitMask(miso); + #endif + } else { + swspi.misoPort = portInputRegister(dc); + } + #else // !CORE_TEENSY + dcPinMask =digitalPinToBitMask(dc); + swspi.sckPinMask =digitalPinToBitMask(sck); + swspi.mosiPinMask=digitalPinToBitMask(mosi); + dcPortSet =&(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr =&(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + swspi.sckPortSet =&(PORT->Group[g_APinDescription[sck].ulPort].OUTSET.reg); + swspi.sckPortClr =&(PORT->Group[g_APinDescription[sck].ulPort].OUTCLR.reg); + swspi.mosiPortSet=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTSET.reg); + swspi.mosiPortClr=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if(miso >= 0) { + swspi.misoPinMask=digitalPinToBitMask(miso); + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); + } else { + swspi.misoPinMask=0; + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); + } + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + dcPort =(PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet =digitalPinToBitMask(dc); + swspi.sckPort =(PORTreg_t)portOutputRegister(digitalPinToPort(sck)); + swspi.sckPinMaskSet =digitalPinToBitMask(sck); + swspi.mosiPort =(PORTreg_t)portOutputRegister(digitalPinToPort(mosi)); + swspi.mosiPinMaskSet=digitalPinToBitMask(mosi); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if(miso >= 0) { + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); + swspi.misoPinMask=digitalPinToBitMask(miso); + } else { + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); + swspi.misoPinMask=0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + swspi.sckPinMaskClr = ~swspi.sckPinMaskSet; + swspi.mosiPinMaskClr = ~swspi.mosiPinMaskSet; + #endif // !end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using the board's + default SPI peripheral. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +#if defined(ESP8266) // See notes below +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, + int8_t dc, int8_t rst) : Renderer(w, h), + connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { + hwspi._spi = &SPI; +} +#else // !ESP8266 +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, + int8_t dc, int8_t rst) : Adafruit_SPITFT(w, h, &SPI, cs, dc, rst) { + // This just invokes the hardware SPI constructor below, + // passing the default SPI device (&SPI). +} +#endif // end !ESP8266 + +#if !defined(ESP8266) +// ESP8266 compiler freaks out at this constructor -- it can't disambiguate +// beteween the SPIClass pointer (argument #3) and a regular integer. +// Solution here it to just not offer this variant on the ESP8266. You can +// use the default hardware SPI peripheral, or you can use software SPI, +// but if there's any library out there that creates a 'virtual' SPIClass +// peripheral and drives it with software bitbanging, that's not supported. +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using a specific + SPI peripheral. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param spiClass Pointer to SPIClass type (e.g. &SPI or &SPI1). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized in constructor; application + typically will need to call subclass' begin() function, which + in turn calls this library's initSPI() function to initialize + pins. EXCEPT...if you have built your own SERCOM SPI peripheral + (calling the SPIClass constructor) rather than one of the + built-in SPI devices (e.g. &SPI, &SPI1 and so forth), you will + need to call the begin() function for your object as well as + pinPeripheral() for the MOSI, MISO and SCK pins to configure + GPIO manually. Do this BEFORE calling the display-specific + begin or init function. Unfortunate but unavoidable. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + int8_t cs, int8_t dc, int8_t rst) : Renderer(w, h), + connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { + hwspi._spi = spiClass; +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + #else // !CORE_TEENSY + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} +#endif // end !ESP8266 + +/*! + @brief Adafruit_SPITFT constructor for parallel display connection. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param busWidth If tft16 (enumeration in header file), is a 16-bit + parallel connection, else 8-bit. + 16-bit isn't fully implemented or tested yet so + applications should pass "tft8bitbus" for now...needed to + stick a required enum argument in there to + disambiguate this constructor from the soft-SPI case. + Argument is ignored on 8-bit architectures (no 'wide' + support there since PORTs are 8 bits anyway). + @param d0 Arduino pin # for data bit 0 (1+ are extrapolated). + The 8 (or 16) data bits MUST be contiguous and byte- + aligned (or word-aligned for wide interface) within + the same PORT register (might not correspond to + Arduino pin sequence). + @param wr Arduino pin # for write strobe (required). + @param dc Arduino pin # for data/command select (required). + @param cs Arduino pin # for chip-select (optional, -1 if unused, + tie CS low). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param rd Arduino pin # for read strobe (optional, -1 if unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will need + to call subclass' begin() function, which in turn calls this + library's initSPI() function to initialize pins. + Yes, the name is a misnomer...this library originally handled + only SPI displays, parallel being a recent addition (but not + wanting to break existing code). +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + int8_t d0, int8_t wr, int8_t dc, int8_t cs, int8_t rst, int8_t rd) : + Renderer(w, h), connection(TFT_PARALLEL), _rst(rst), _cs(cs), _dc(dc) { + tft8._d0 = d0; + tft8._wr = wr; + tft8._rd = rd; + tft8.wide = (busWidth == tft16bitbus); +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + tft8.wrPortSet = portSetRegister(wr); + tft8.wrPortClr = portClearRegister(wr); + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if(rd >= 0) { // if read-strobe pin specified... + #if defined(KINETISK) + tft8.rdPinMask = 1; + #else // !KINETISK + tft8.rdPinMask = digitalPinToBitMask(rd); + #endif + tft8.rdPortSet = portSetRegister(rd); + tft8.rdPortClr = portClearRegister(rd); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = portOutputRegister(d0); + tft8.readPort = portInputRegister(d0); + tft8.dirSet = portModeRegister(d0); + tft8.dirClr = portModeRegister(d0); + #else // !CORE_TEENSY + tft8.wrPinMask = digitalPinToBitMask(wr); + tft8.wrPortSet = &(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg); + tft8.wrPortClr = &(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg); + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if(rd >= 0) { // if read-strobe pin specified... + tft8.rdPinMask =digitalPinToBitMask(rd); + tft8.rdPortSet =&(PORT->Group[g_APinDescription[rd].ulPort].OUTSET.reg); + tft8.rdPortClr =&(PORT->Group[g_APinDescription[rd].ulPort].OUTCLR.reg); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // Get pointers to PORT write/read/dir bytes within 32-bit PORT + uint8_t dBit = g_APinDescription[d0].ulPin; // d0 bit # in PORT + PortGroup *p = (&(PORT->Group[g_APinDescription[d0].ulPort])); + uint8_t offset = dBit / 8; // d[7:0] byte # within PORT + if(tft8.wide) offset &= ~1; // d[15:8] byte # within PORT + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = (volatile uint8_t *)&(p->OUT.reg) + offset; + tft8.readPort = (volatile uint8_t *)&(p->IN.reg) + offset; + tft8.dirSet = (volatile uint8_t *)&(p->DIRSET.reg) + offset; + tft8.dirClr = (volatile uint8_t *)&(p->DIRCLR.reg) + offset; + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + tft8.wrPort = (PORTreg_t)portOutputRegister(digitalPinToPort(wr)); + tft8.wrPinMaskSet = digitalPinToBitMask(wr); + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if(rd >= 0) { // if read-strobe pin specified... + tft8.rdPort =(PORTreg_t)portOutputRegister(digitalPinToPort(rd)); + tft8.rdPinMaskSet =digitalPinToBitMask(rd); + } else { + tft8.rdPort = dcPort; + tft8.rdPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + tft8.wrPinMaskClr = ~tft8.wrPinMaskSet; + tft8.rdPinMaskClr = ~tft8.rdPinMaskSet; + tft8.writePort = (PORTreg_t)portOutputRegister(digitalPinToPort(d0)); + tft8.readPort = (PORTreg_t)portInputRegister(digitalPinToPort(d0)); + tft8.portDir = (PORTreg_t)portModeRegister(digitalPinToPort(d0)); + #endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +// end constructors ------- + + +// CLASS MEMBER FUNCTIONS -------------------------------------------------- + +// begin() and setAddrWindow() MUST be declared by any subclass. + +/*! + @brief Configure microcontroller pins for TFT interfacing. Typically + called by a subclass' begin() function. + @param freq SPI frequency when using hardware SPI. If default (0) + is passed, will fall back on a device-specific value. + Value is ignored when using software SPI or parallel + connection. + @param spiMode SPI mode when using hardware SPI. MUST be one of the + values SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3 + defined in SPI.h. Do NOT attempt to pass '0' for + SPI_MODE0 and so forth...the values are NOT the same! + Use ONLY the defines! (Pity it's not an enum.) + @note Another anachronistically-named function; this is called even + when the display connection is parallel (not SPI). Also, this + could probably be made private...quite a few class functions + were generously put in the public section. +*/ +void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { + + if(!freq) freq = DEFAULT_SPI_FREQ; // If no freq specified, use default + + // Init basic control pins common to all connection types + if(_cs >= 0) { + pinMode(_cs, OUTPUT); + digitalWrite(_cs, HIGH); // Deselect + } + pinMode(_dc, OUTPUT); + digitalWrite(_dc, HIGH); // Data mode + + if(connection == TFT_HARD_SPI) { + +#if defined(SPI_HAS_TRANSACTION) + hwspi.settings = SPISettings(freq, MSBFIRST, spiMode); +#else + hwspi._freq = freq; // Save freq value for later +#endif + hwspi._mode = spiMode; // Save spiMode value for later + // Call hwspi._spi->begin() ONLY if this is among the 'established' + // SPI interfaces in variant.h. For DIY roll-your-own SERCOM SPIs, + // begin() and pinPeripheral() calls MUST be made in one's calling + // code, BEFORE the screen-specific begin/init function is called. + // Reason for this is that SPI::begin() makes its own calls to + // pinPeripheral() based on g_APinDescription[n].ulPinType, which + // on non-established SPI interface pins will always be PIO_DIGITAL + // or similar, while we need PIO_SERCOM or PIO_SERCOM_ALT...it's + // highly unique between devices and variants for each pin or + // SERCOM so we can't make those calls ourselves here. And the SPI + // device needs to be set up before calling this because it's + // immediately followed with initialization commands. Blargh. + if( +#if !defined(SPI_INTERFACES_COUNT) + 1 +#endif +#if SPI_INTERFACES_COUNT > 0 + (hwspi._spi == &SPI) +#endif +#if SPI_INTERFACES_COUNT > 1 + || (hwspi._spi == &SPI1) +#endif +#if SPI_INTERFACES_COUNT > 2 + || (hwspi._spi == &SPI2) +#endif +#if SPI_INTERFACES_COUNT > 3 + || (hwspi._spi == &SPI3) +#endif +#if SPI_INTERFACES_COUNT > 4 + || (hwspi._spi == &SPI4) +#endif +#if SPI_INTERFACES_COUNT > 5 + || (hwspi._spi == &SPI5) +#endif + ) { + hwspi._spi->begin(); + } + } else if(connection == TFT_SOFT_SPI) { + + pinMode(swspi._mosi, OUTPUT); + digitalWrite(swspi._mosi, LOW); + pinMode(swspi._sck, OUTPUT); + digitalWrite(swspi._sck, LOW); + if(swspi._miso >= 0) { + pinMode(swspi._miso, INPUT); + } + + } else { // TFT_PARALLEL + + // Initialize data pins. We were only passed d0, so scan + // the pin description list looking for the other pins. + // They'll be on the same PORT, and within the next 7 (or 15) bits + // (because we need to write to a contiguous PORT byte or word). +#if defined(__AVR__) + // PORT registers are 8 bits wide, so just need a register match... + for(uint8_t i=0; i= dBit ) && + (g_APinDescription[i].ulPin <= (uint32_t)lastBit)) { + pinMode(i, OUTPUT); + digitalWrite(i, LOW); + } + } + #endif // end !CORE_TEENSY +#endif + pinMode(tft8._wr, OUTPUT); + digitalWrite(tft8._wr, HIGH); + if(tft8._rd >= 0) { + pinMode(tft8._rd, OUTPUT); + digitalWrite(tft8._rd, HIGH); + } + } + + if(_rst >= 0) { + // Toggle _rst low to reset + pinMode(_rst, OUTPUT); + digitalWrite(_rst, HIGH); + delay(100); + digitalWrite(_rst, LOW); + delay(100); + digitalWrite(_rst, HIGH); + delay(200); + } + +#if defined(USE_SPI_DMA) + if(((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) && + (dma.allocate() == DMA_STATUS_OK)) { // Allocate channel + // The DMA library needs to alloc at least one valid descriptor, + // so we do that here. It's not used in the usual sense though, + // just before a transfer we copy descriptor[0] to this address. + if(dptr = dma.addDescriptor(NULL, NULL, 42, DMA_BEAT_SIZE_BYTE, + false, false)) { + // Alloc 2 scanlines worth of pixels on display's major axis, + // whichever that is, rounding each up to 2-pixel boundary. + int major = (WIDTH > HEIGHT) ? WIDTH : HEIGHT; + major += (major & 1); // -> next 2-pixel bound, if needed. + maxFillLen = major * 2; // 2 scanlines + // Note to future self: if you decide to make the pixel buffer + // much larger, remember that DMA transfer descriptors can't + // exceed 65,535 bytes (not 65,536), meaning 32,767 pixels max. + // Not that we have that kind of RAM to throw around right now. + if((pixelBuf[0] = + (uint16_t *)malloc(maxFillLen * sizeof(uint16_t)))) { + // Alloc OK. Get pointer to start of second scanline. + pixelBuf[1] = &pixelBuf[0][major]; + // Determine number of DMA descriptors needed to cover + // entire screen when entire 2-line pixelBuf is used + // (round up for fractional last descriptor). + int numDescriptors = (WIDTH * HEIGHT + (maxFillLen - 1)) / + maxFillLen; + // DMA descriptors MUST be 128-bit (16 byte) aligned. + // memalign() is considered obsolete but it's replacements + // (aligned_alloc() or posix_memalign()) are not currently + // available in the version of ARM GCC in use, but this + // is, so here we are. + if((descriptor = (DmacDescriptor *)memalign(16, + numDescriptors * sizeof(DmacDescriptor)))) { + int dmac_id; + volatile uint32_t *data_reg; + + if(connection == TFT_HARD_SPI) { + // THIS IS AN AFFRONT TO NATURE, but I don't know + // any "clean" way to get the sercom number from the + // the SPIClass pointer (e.g. &SPI or &SPI1), which + // is all we have to work with. SPIClass does contain + // a SERCOM pointer but it is a PRIVATE member! + // Doing an UNSPEAKABLY HORRIBLE THING here, directly + // accessing the first 32-bit value in the SPIClass + // structure, knowing that's (currently) where the + // SERCOM pointer lives, but this ENTIRELY DEPENDS on + // that structure not changing nor the compiler + // rearranging things. Oh the humanity! + + if(*(SERCOM **)hwspi._spi == &sercom0) { + dmac_id = SERCOM0_DMAC_ID_TX; + data_reg = &SERCOM0->SPI.DATA.reg; +#if defined SERCOM1 + } else if(*(SERCOM **)hwspi._spi == &sercom1) { + dmac_id = SERCOM1_DMAC_ID_TX; + data_reg = &SERCOM1->SPI.DATA.reg; +#endif +#if defined SERCOM2 + } else if(*(SERCOM **)hwspi._spi == &sercom2) { + dmac_id = SERCOM2_DMAC_ID_TX; + data_reg = &SERCOM2->SPI.DATA.reg; +#endif +#if defined SERCOM3 + } else if(*(SERCOM **)hwspi._spi == &sercom3) { + dmac_id = SERCOM3_DMAC_ID_TX; + data_reg = &SERCOM3->SPI.DATA.reg; +#endif +#if defined SERCOM4 + } else if(*(SERCOM **)hwspi._spi == &sercom4) { + dmac_id = SERCOM4_DMAC_ID_TX; + data_reg = &SERCOM4->SPI.DATA.reg; +#endif +#if defined SERCOM5 + } else if(*(SERCOM **)hwspi._spi == &sercom5) { + dmac_id = SERCOM5_DMAC_ID_TX; + data_reg = &SERCOM5->SPI.DATA.reg; +#endif +#if defined SERCOM6 + } else if(*(SERCOM **)hwspi._spi == &sercom6) { + dmac_id = SERCOM6_DMAC_ID_TX; + data_reg = &SERCOM6->SPI.DATA.reg; +#endif +#if defined SERCOM7 + } else if(*(SERCOM **)hwspi._spi == &sercom7) { + dmac_id = SERCOM7_DMAC_ID_TX; + data_reg = &SERCOM7->SPI.DATA.reg; +#endif + } + dma.setPriority(DMA_PRIORITY_3); + dma.setTrigger(dmac_id); + dma.setAction(DMA_TRIGGER_ACTON_BEAT); + + // Initialize descriptor list. + for(int d=0; dChannel[dmaChannel].CHEVCTRL.bit.EVOE = 1; + DMAC->Channel[dmaChannel].CHEVCTRL.bit.EVOMODE = 0; + + // CONFIGURE TIMER/COUNTER (for write strobe) + + Tc *timer = tcList[tcNum].tc; // -> Timer struct + int id = tcList[tcNum].gclk; // Timer GCLK ID + GCLK_PCHCTRL_Type pchctrl; + + // Set up timer clock source from GCLK + GCLK->PCHCTRL[id].bit.CHEN = 0; // Stop timer + while(GCLK->PCHCTRL[id].bit.CHEN); // Wait for it + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Enable + GCLK->PCHCTRL[id].reg = pchctrl.reg; + while(!GCLK->PCHCTRL[id].bit.CHEN); // Wait for it + + // Disable timer/counter before configuring it + timer->COUNT8.CTRLA.bit.ENABLE = 0; + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + + timer->COUNT8.WAVE.bit.WAVEGEN = 2; // NPWM + timer->COUNT8.CTRLA.bit.MODE = 1; // 8-bit + timer->COUNT8.CTRLA.bit.PRESCALER = 0; // 1:1 + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + + timer->COUNT8.CTRLBCLR.bit.DIR = 1; // Count UP + while(timer->COUNT8.SYNCBUSY.bit.CTRLB); + timer->COUNT8.CTRLBSET.bit.ONESHOT = 1; // One-shot + while(timer->COUNT8.SYNCBUSY.bit.CTRLB); + timer->COUNT8.PER.reg = 6; // PWM top + while(timer->COUNT8.SYNCBUSY.bit.PER); + timer->COUNT8.CC[0].reg = 2; // Compare + while(timer->COUNT8.SYNCBUSY.bit.CC0); + // Enable async input events, + // event action = restart. + timer->COUNT8.EVCTRL.bit.TCEI = 1; + timer->COUNT8.EVCTRL.bit.EVACT = 1; + + // Enable timer + timer->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE; + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + +#if(wrPeripheral == PIO_CCL) + // CONFIGURE CCL (inverts timer/counter output) + + MCLK->APBCMASK.bit.CCL_ = 1; // Enable CCL clock + CCL->CTRL.bit.ENABLE = 0; // Disable to config + CCL->CTRL.bit.SWRST = 1; // Reset CCL registers + CCL->LUTCTRL[tcNum].bit.ENABLE = 0; // Disable LUT + CCL->LUTCTRL[tcNum].bit.FILTSEL = 0; // No filter + CCL->LUTCTRL[tcNum].bit.INSEL0 = 6; // TC input + CCL->LUTCTRL[tcNum].bit.INSEL1 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.INSEL2 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.TRUTH = 1; // Invert in 0 + CCL->LUTCTRL[tcNum].bit.ENABLE = 1; // Enable LUT + CCL->CTRL.bit.ENABLE = 1; // Enable CCL +#endif + + // CONFIGURE EVENT SYSTEM + + // Set up event system clock source from GCLK... + // Disable EVSYS, wait for disable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN = 0; + while(GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Re-enable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].reg = pchctrl.reg; + // Wait for it, then enable EVSYS clock + while(!GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); + MCLK->APBBMASK.bit.EVSYS_ = 1; + + // Connect Timer EVU to ch 0 + EVSYS->USER[tcList[tcNum].evu].reg = 1; + // Datasheet recommends single write operation; + // reg instead of bit. Also datasheet: PATH bits + // must be zero when using async! + EVSYS_CHANNEL_Type ev; + ev.reg = 0; + ev.bit.PATH = 2; // Asynchronous + ev.bit.EVGEN = 0x22 + dmaChannel; // DMA channel 0+ + EVSYS->Channel[0].CHANNEL.reg = ev.reg; + + // Initialize descriptor list. + for(int d=0; d= 0) SPI_CS_LOW(); +} + +/*! + @brief Call after issuing command(s) or data to display. Performs + chip-deselect (if required) and ends an SPI transaction (if + using hardware SPI and transactions are supported). Required + for all display types; not an SPI-specific function. +*/ +void Adafruit_SPITFT::endWrite(void) { + if(_cs >= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + + +// ------------------------------------------------------------------------- +// Lower-level graphics operations. These functions require a chip-select +// and/or SPI transaction around them (via startWrite(), endWrite() above). +// Higher-level graphics primitives might start a single transaction and +// then make multiple calls to these functions (e.g. circle or text +// rendering might make repeated lines or rects) before ending the +// transaction. It's more efficient than starting a transaction every time. + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Not self-contained; should follow a startWrite() call. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { + if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + } +} + +/*! + @brief Issue a series of pixels from memory to the display. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param colors Pointer to array of 16-bit pixel values in '565' RGB + format. + @param len Number of elements in 'colors' array. + @param block If true (default case if unspecified), function blocks + until DMA transfer is complete. This is simply IGNORED + if DMA is not enabled. If false, the function returns + immediately after the last DMA transfer is started, + and one should use the dmaWait() function before + doing ANY other display-related activities (or even + any SPI-related activities, if using an SPI display + that shares the bus with other devices). + @param bigEndian If using DMA, and if set true, bitmap in memory is in + big-endian order (most significant byte first). By + default this is false, as most microcontrollers seem + to be little-endian and 16-bit pixel values must be + byte-swapped before issuing to the display (which tend + to be big-endian when using SPI or 8-bit parallel). + If an application can optimize around this -- for + example, a bitmap in a uint16_t array having the byte + values already reordered big-endian, this can save + some processing time here, ESPECIALLY if using this + function's non-blocking DMA mode. Not all cases are + covered...this is really here only for SAMD DMA and + much forethought on the application side. +*/ +void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, + bool block, bool bigEndian) { + + if(!len) return; // Avoid 0-byte transfers + +#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... + if(connection == TFT_HARD_SPI) { + hwspi._spi->writePixels(colors, len * 2); + return; + } +#elif defined(USE_SPI_DMA) + if((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) { + int maxSpan = maxFillLen / 2; // One scanline max + uint8_t pixelBufIdx = 0; // Active pixel buffer number + #if defined(__SAMD51__) + if(connection == TFT_PARALLEL) { + // Switch WR pin to PWM or CCL + pinPeripheral(tft8._wr, wrPeripheral); + } + #endif // end __SAMD51__ + if(!bigEndian) { // Normal little-endian situation... + while(len) { + int count = (len < maxSpan) ? len : maxSpan; + + // Because TFT and SAMD endianisms are different, must swap + // bytes from the 'colors' array passed into a DMA working + // buffer. This can take place while the prior DMA transfer + // is in progress, hence the need for two pixelBufs. + for(int i=0; isetDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ || _SAMD21_ + } + return; + } +#endif // end USE_SPI_DMA + + // All other cases (bitbang SPI or non-DMA hard SPI or parallel), + // use a loop with the normal 16-bit data write function: + while(len--) { + SPI_WRITE16(*colors++); + } +} + +/*! + @brief Wait for the last DMA transfer in a prior non-blocking + writePixels() call to complete. This does nothing if DMA + is not enabled, and is not needed if blocking writePixels() + was used (as is the default case). +*/ +void Adafruit_SPITFT::dmaWait(void) { +#if defined(USE_SPI_DMA) + while(dma_busy); + #if defined(__SAMD51__) || defined(_SAMD21_) + if(connection == TFT_HARD_SPI) { + // See SAMD51/21 note in writeColor() + hwspi._spi->setDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ || _SAMD21_ +#endif +} + +/*! + @brief Issue a series of pixels, all the same color. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param color 16-bit pixel color in '565' RGB format. + @param len Number of pixels to draw. +*/ +void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { + + if(!len) return; // Avoid 0-byte transfers + + uint8_t hi = color >> 8, lo = color; + +#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... + if(connection == TFT_HARD_SPI) { + #define SPI_MAX_PIXELS_AT_ONCE 32 + #define TMPBUF_LONGWORDS (SPI_MAX_PIXELS_AT_ONCE + 1) / 2 + #define TMPBUF_PIXELS (TMPBUF_LONGWORDS * 2) + static uint32_t temp[TMPBUF_LONGWORDS]; + uint32_t c32 = color * 0x00010001; + uint16_t bufLen = (len < TMPBUF_PIXELS) ? len : TMPBUF_PIXELS, + xferLen, fillLen; + // Fill temp buffer 32 bits at a time + fillLen = (bufLen + 1) / 2; // Round up to next 32-bit boundary + for(uint32_t t=0; t= 16)) { // Don't bother with DMA on short pixel runs + int i, d, numDescriptors; + if(hi == lo) { // If high & low bytes are same... + onePixelBuf = color; + // Can do this with a relatively short descriptor list, + // each transferring a max of 32,767 (not 32,768) pixels. + // This won't run off the end of the allocated descriptor list, + // since we're using much larger chunks per descriptor here. + numDescriptors = (len + 32766) / 32767; + for(d=0; d lastFillLen) { + int fillStart = lastFillLen / 2, + fillEnd = (((len < maxFillLen) ? + len : maxFillLen) + 1) / 2; + for(i=fillStart; isetDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ + return; + } + #endif // end USE_SPI_DMA +#endif // end !ESP32 + + // All other cases (non-DMA hard SPI, bitbang SPI, parallel)... + + if(connection == TFT_HARD_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if(pixelsThisPass > 50000) pixelsThisPass = 50000; + len -= pixelsThisPass; + yield(); // Periodic yield() on long fills + while(pixelsThisPass--) { + hwspi._spi->write(hi); + hwspi._spi->write(lo); + } + } while(len); +#else // !ESP8266 + while(len--) { + #if defined(__AVR__) + AVR_WRITESPI(hi); + AVR_WRITESPI(lo); + #elif defined(ESP32) + hwspi._spi->write(hi); + hwspi._spi->write(lo); + #else + hwspi._spi->transfer(hi); + hwspi._spi->transfer(lo); + #endif + } +#endif // end !ESP8266 + } else if(connection == TFT_SOFT_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if(pixelsThisPass > 20000) pixelsThisPass = 20000; + len -= pixelsThisPass; + yield(); // Periodic yield() on long fills + while(pixelsThisPass--) { + for(uint16_t bit=0, x=color; bit<16; bit++) { + if(x & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + } + } while(len); +#else // !ESP8266 + while(len--) { + #if defined(__AVR__) + for(uint8_t bit=0, x=hi; bit<8; bit++) { + if(x & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + for(uint8_t bit=0, x=lo; bit<8; bit++) { + if(x & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + #else // !__AVR__ + for(uint16_t bit=0, x=color; bit<16; bit++) { + if(x & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + x <<= 1; + SPI_SCK_LOW(); + } + #endif // end !__AVR__ + } +#endif // end !ESP8266 + } else { // PARALLEL + if(hi == lo) { +#if defined(__AVR__) + len *= 2; + *tft8.writePort = hi; + while(len--) { + TFT_WR_STROBE(); + } +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + len *= 2; + *tft8.writePort = hi; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } + while(len--) { + TFT_WR_STROBE(); + } +#endif + } else { + while(len--) { +#if defined(__AVR__) + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } +#endif + TFT_WR_STROBE(); + } + } + } +} + +/*! + @brief Draw a filled rectangle to the display. Not self-contained; + should follow startWrite(). Typically used by higher-level + graphics primitives; user code shouldn't need to call this and + is likely to use the self-contained fillRect() instead. + writeFillRect() performs its own edge clipping and rejection; + see writeFillRectPreclipped() for a more 'raw' implementation. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note Written in this deep-nested way because C by definition will + optimize for the 'if' case, not the 'else' -- avoids branches + and rejects clipped rectangles at the least-work possibility. +*/ +void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color) { + if(w && h) { // Nonzero width and height? + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(x2 >= _width) { w = _width - x; } // Clip right + if(y2 >= _height) { h = _height - y; } // Clip bottom + writeFillRectPreclipped(x, y, w, h, color); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Performs edge clipping + and rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastHLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(x2 >= _width) { w = _width - x; } // Clip right + writeFillRectPreclipped(x, y, w, 1, color); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Performs edge clipping and + rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastVLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(y2 >= _height) { h = _height - y; } // Clip bottom + writeFillRectPreclipped(x, y, 1, h, color); + } + } + } +} + +/*! + @brief A lower-level version of writeFillRect(). This version requires + all inputs are in-bounds, that width and height are positive, + and no part extends offscreen. NO EDGE CLIPPING OR REJECTION IS + PERFORMED. If higher-level graphics primitives are written to + handle their own clipping earlier in the drawing process, this + can avoid unnecessary function calls and repeated clipping + operations in the lower-level functions. + @param x Horizontal position of first corner. MUST BE WITHIN + SCREEN BOUNDS. + @param y Vertical position of first corner. MUST BE WITHIN SCREEN + BOUNDS. + @param w Rectangle width in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param h Rectangle height in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param color 16-bit fill color in '565' RGB format. + @note This is a new function, no graphics primitives besides rects + and horizontal/vertical lines are written to best use this yet. +*/ +inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color) { + setAddrWindow(x, y, w, h); + writeColor(color, (uint32_t)w * h); +} + + +// ------------------------------------------------------------------------- +// Ever-so-slightly higher-level graphics operations. Similar to the 'write' +// functions above, but these contain their own chip-select and SPI +// transactions as needed (via startWrite(), endWrite()). They're typically +// used solo -- as graphics primitives in themselves, not invoked by higher- +// level primitives (which should use the functions above for better +// performance). + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Self-contained and provides its own transaction as needed + (see writePixel(x,y,color) for a lower-level variant). + Edge clipping is performed here. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { + // Clip first... + if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + // THEN set up transaction (if needed) and draw... + startWrite(); + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + endWrite(); + } +} + +/*! + @brief Draw a filled rectangle to the display. Self-contained and + provides its own transaction as needed (see writeFillRect() or + writeFillRectPreclipped() for lower-level variants). Edge + clipping and rejection is performed here. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note This repeats the writeFillRect() function almost in its entirety, + with the addition of a transaction start/end. It's done this way + (rather than starting the transaction and calling writeFillRect() + to handle clipping and so forth) so that the transaction isn't + performed at all if the rectangle is rejected. It's really not + that much code. +*/ +void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + if(w && h) { // Nonzero width and height? + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(x2 >= _width) { w = _width - x; } // Clip right + if(y2 >= _height) { h = _height - y; } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, w, h, color); + endWrite(); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Self-contained and + provides its own transaction as needed (see writeFastHLine() for + a lower-level variant). Edge clipping and rejection is performed + here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastHLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastHLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(x2 >= _width) { w = _width - x; } // Clip right + startWrite(); + writeFillRectPreclipped(x, y, w, 1, color); + endWrite(); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Self-contained and provides + its own transaction as needed (see writeFastHLine() for a lower- + level variant). Edge clipping and rejection is performed here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastVLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastVLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(y2 >= _height) { h = _height - y; } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, 1, h, color); + endWrite(); + } + } + } +} + +/*! + @brief Essentially writePixel() with a transaction around it. I don't + think this is in use by any of our code anymore (believe it was + for some older BMP-reading examples), but is kept here in case + any user code relies on it. Consider it DEPRECATED. + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::pushColor(uint16_t color) { + startWrite(); + SPI_WRITE16(color); + endWrite(); +} + +/*! + @brief Draw a 16-bit image (565 RGB) at the specified (x,y) position. + For 16-bit display devices; no color reduction performed. + Adapted from https://github.com/PaulStoffregen/ILI9341_t3 + by Marc MERLIN. See examples/pictureEmbed to use this. + 5/6/2017: function name and arguments have changed for + compatibility with current GFX library and to avoid naming + problems in prior implementation. Formerly drawBitmap() with + arguments in different order. Handles its own transaction and + edge clipping/rejection. + @param x Top left corner horizontal coordinate. + @param y Top left corner vertical coordinate. + @param pcolors Pointer to 16-bit array of pixel values. + @param w Width of bitmap in pixels. + @param h Height of bitmap in pixels. +*/ +void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, + uint16_t *pcolors, int16_t w, int16_t h) { + + int16_t x2, y2; // Lower-right coord + if(( x >= _width ) || // Off-edge right + ( y >= _height) || // " top + ((x2 = (x+w-1)) < 0 ) || // " left + ((y2 = (y+h-1)) < 0) ) return; // " bottom + + int16_t bx1=0, by1=0, // Clipped top-left within bitmap + saveW=w; // Save original bitmap width value + if(x < 0) { // Clip left + w += x; + bx1 = -x; + x = 0; + } + if(y < 0) { // Clip top + h += y; + by1 = -y; + y = 0; + } + if(x2 >= _width ) w = _width - x; // Clip right + if(y2 >= _height) h = _height - y; // Clip bottom + + pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left + startWrite(); + setAddrWindow(x, y, w, h); // Clipped area + while(h--) { // For each (clipped) scanline... + writePixels(pcolors, w); // Push one (clipped) row + pcolors += saveW; // Advance pointer by one full (unclipped) line + } + endWrite(); +} + + +// ------------------------------------------------------------------------- +// Miscellaneous class member functions that don't draw anything. + +/*! + @brief Invert the colors of the display (if supported by hardware). + Self-contained, no transaction setup required. + @param i true = inverted display, false = normal display. +*/ +void Adafruit_SPITFT::invertDisplay(bool i) { + startWrite(); + writeCommand(i ? invertOnCommand : invertOffCommand); + endWrite(); +} + +/*! + @brief Given 8-bit red, green and blue values, return a 'packed' + 16-bit color value in '565' RGB format (5 bits red, 6 bits + green, 5 bits blue). This is just a mathematical operation, + no hardware is touched. + @param red 8-bit red brightnesss (0 = off, 255 = max). + @param green 8-bit green brightnesss (0 = off, 255 = max). + @param blue 8-bit blue brightnesss (0 = off, 255 = max). + @return 'Packed' 16-bit color value (565 format). +*/ +uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) { + return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); +} + +/*! + @brief Adafruit_SPITFT Send Command handles complete sending of commands and data + @param commandByte The Command Byte + @param dataBytes A pointer to the Data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if(_cs >= 0) SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i=0; i= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Adafruit_SPITFT Send Command handles complete sending of commands and const data + @param commandByte The Command Byte + @param dataBytes A pointer to the Data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if(_cs >= 0) SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i=0; i= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Read 8 bits of data from display configuration memory (not RAM). + This is highly undocumented/supported and should be avoided, + function is only included because some of the examples use it. + @param commandByte + The command register to read data from. + @param index + The byte index into the command to read from. + @return Unsigned 8-bit data read from display register. + */ +/**************************************************************************/ +uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { + uint8_t result; + startWrite(); + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); + SPI_DC_HIGH(); // Data mode + do { + result = spiRead(); + } while(index--); // Discard bytes up to index'th + endWrite(); + return result; +} + +// ------------------------------------------------------------------------- +// Lowest-level hardware-interfacing functions. Many of these are inline and +// compile to different things based on #defines -- typically just a few +// instructions. Others, not so much, those are not inlined. + +/*! + @brief Start an SPI transaction if using the hardware SPI interface to + the display. If using an earlier version of the Arduino platform + (before the addition of SPI transactions), this instead attempts + to set up the SPI clock and mode. No action is taken if the + connection is not hardware SPI-based. This does NOT include a + chip-select operation -- see startWrite() for a function that + encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { + if(connection == TFT_HARD_SPI) { +#if defined(SPI_HAS_TRANSACTION) + hwspi._spi->beginTransaction(hwspi.settings); +#else // No transactions, configure SPI manually... + #if defined(__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClockDivider(SPI_CLOCK_DIV2); + #elif defined(__arm__) + hwspi._spi->setClockDivider(11); + #elif defined(ESP8266) || defined(ESP32) + hwspi._spi->setFrequency(hwspi._freq); + #elif defined(RASPI) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClock(hwspi._freq); + #endif + hwspi._spi->setBitOrder(MSBFIRST); + hwspi._spi->setDataMode(hwspi._mode); +#endif // end !SPI_HAS_TRANSACTION + } +} + +/*! + @brief End an SPI transaction if using the hardware SPI interface to + the display. No action is taken if the connection is not + hardware SPI-based or if using an earlier version of the Arduino + platform (before the addition of SPI transactions). This does + NOT include a chip-deselect operation -- see endWrite() for a + function that encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { +#if defined(SPI_HAS_TRANSACTION) + if(connection == TFT_HARD_SPI) { + hwspi._spi->endTransaction(); + } +#endif +} + +/*! + @brief Issue a single 8-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the byte. This is another of + those functions in the library with a now-not-accurate name + that's being maintained for compatibility with outside code. + This function is used even if display connection is parallel. + @param b 8-bit value to write. +*/ +void Adafruit_SPITFT::spiWrite(uint8_t b) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(b); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write(b); +#else + hwspi._spi->transfer(b); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<8; bit++) { + if(b & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + b <<= 1; + SPI_SCK_LOW(); + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = b; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) *tft8.writePort = b; + else *(volatile uint16_t *)tft8.writePort = b; +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Write a single command byte to the display. Chip-select and + transaction must have been previously set -- this ONLY sets + the device to COMMAND mode, issues the byte and then restores + DATA mode. There is no corresponding explicit writeData() + function -- just use spiWrite(). + @param cmd 8-bit command to write. +*/ +void Adafruit_SPITFT::writeCommand(uint8_t cmd) { + SPI_DC_LOW(); + spiWrite(cmd); + SPI_DC_HIGH(); +} + +/*! + @brief Read a single 8-bit value from the display. Chip-select and + transaction must have been previously set -- this ONLY reads + the byte. This is another of those functions in the library + with a now-not-accurate name that's being maintained for + compatibility with outside code. This function is used even if + display connection is parallel. + @return Unsigned 8-bit value read (always zero if USE_FAST_PINIO is + not supported by the MCU architecture). +*/ +uint8_t Adafruit_SPITFT::spiRead(void) { + uint8_t b = 0; + uint16_t w = 0; + if(connection == TFT_HARD_SPI) { + return hwspi._spi->transfer((uint8_t)0); + } else if(connection == TFT_SOFT_SPI) { + if(swspi._miso >= 0) { + for(uint8_t i=0; i<8; i++) { + SPI_SCK_HIGH(); + b <<= 1; + if(SPI_MISO_READ()) b++; + SPI_SCK_LOW(); + } + } + return b; + } else { // TFT_PARALLEL + if(tft8._rd >= 0) { +#if defined(USE_FAST_PINIO) + TFT_RD_LOW(); // Read line LOW + #if defined(__AVR__) + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output + #else // !__AVR__ + if(!tft8.wide) { // 8-bit TFT connection + #if defined(HAS_PORT_SET_CLR) + *tft8.dirClr = 0xFF; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.dirSet = 0xFF; // Restore port to output + #else // !HAS_PORT_SET_CLR + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output + #endif // end HAS_PORT_SET_CLR + } else { // 16-bit TFT connection + #if defined(HAS_PORT_SET_CLR) + *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state + #else // !HAS_PORT_SET_CLR + *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state + #endif // end !HAS_PORT_SET_CLR + } + TFT_RD_HIGH(); // Read line HIGH + #endif // end !__AVR__ +#else // !USE_FAST_PINIO + w = 0; // Parallel TFT is NOT SUPPORTED without USE_FAST_PINIO +#endif // end !USE_FAST_PINIO + } + return w; + } +} + +/*! + @brief Set the software (bitbang) SPI MOSI line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.mosiPortSet = 1; + #else // !KINETISK + *swspi.mosiPortSet = swspi.mosiPinMask; + #endif + #else // !HAS_PORT_SET_CLR + *swspi.mosiPort |= swspi.mosiPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, HIGH); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI MOSI line LOW. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.mosiPortClr = 1; + #else // !KINETISK + *swspi.mosiPortClr = swspi.mosiPinMask; + #endif + #else // !HAS_PORT_SET_CLR + *swspi.mosiPort &= swspi.mosiPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, LOW); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.sckPortSet = 1; + #else // !KINETISK + *swspi.sckPortSet = swspi.sckPinMask; + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + for(volatile uint8_t i=0; i<1; i++); + #endif + #endif + #else // !HAS_PORT_SET_CLR + *swspi.sckPort |= swspi.sckPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, HIGH); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line LOW. +*/ +inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.sckPortClr = 1; + #else // !KINETISK + *swspi.sckPortClr = swspi.sckPinMask; + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + for(volatile uint8_t i=0; i<1; i++); + #endif + #endif + #else // !HAS_PORT_SET_CLR + *swspi.sckPort &= swspi.sckPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, LOW); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Read the state of the software (bitbang) SPI MISO line. + @return true if HIGH, false if LOW. +*/ +inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { +#if defined(USE_FAST_PINIO) + #if defined(KINETISK) + return *swspi.misoPort; + #else // !KINETISK + return *swspi.misoPort & swspi.misoPinMask; + #endif // end !KINETISK +#else // !USE_FAST_PINIO + return digitalRead(swspi._miso); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Issue a single 16-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the word. Despite the name, + this function is used even if display connection is parallel; + name was maintaned for backward compatibility. Naming is also + not consistent with the 8-bit version, spiWrite(). Sorry about + that. Again, staying compatible with outside code. + @param w 16-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(w >> 8); + AVR_WRITESPI(w); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write16(w); +#else + hwspi._spi->transfer(w >> 8); + hwspi._spi->transfer(w); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<16; bit++) { + if(w & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + w <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; + } else { + *(volatile uint16_t *)tft8.writePort = w; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Issue a single 32-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the longword. Despite the + name, this function is used even if display connection is + parallel; name was maintaned for backward compatibility. Naming + is also not consistent with the 8-bit version, spiWrite(). + Sorry about that. Again, staying compatible with outside code. + @param l 32-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(l >> 24); + AVR_WRITESPI(l >> 16); + AVR_WRITESPI(l >> 8); + AVR_WRITESPI(l ); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write32(l); +#else + hwspi._spi->transfer(l >> 24); + hwspi._spi->transfer(l >> 16); + hwspi._spi->transfer(l >> 8); + hwspi._spi->transfer(l); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<32; bit++) { + if(l & 0x80000000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + l <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; + } else { + *(volatile uint16_t *)tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *(volatile uint16_t *)tft8.writePort = l; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Set the WR line LOW, then HIGH. Used for parallel-connected + interfaces when writing data. +*/ +inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *tft8.wrPortClr = 1; + *tft8.wrPortSet = 1; + #else // !KINETISK + *tft8.wrPortClr = tft8.wrPinMask; + *tft8.wrPortSet = tft8.wrPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *tft8.wrPort &= tft8.wrPinMaskClr; + *tft8.wrPort |= tft8.wrPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._wr, LOW); + digitalWrite(tft8._wr, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line HIGH. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + *tft8.rdPortSet = tft8.rdPinMask; + #else // !HAS_PORT_SET_CLR + *tft8.rdPort |= tft8.rdPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line LOW. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + *tft8.rdPortClr = tft8.rdPinMask; + #else // !HAS_PORT_SET_CLR + *tft8.rdPort &= tft8.rdPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, LOW); +#endif // end !USE_FAST_PINIO +} + +#endif // end __AVR_ATtiny85__ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h new file mode 100644 index 000000000..dcfc1646b --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h @@ -0,0 +1,520 @@ +/*! + * @file Adafruit_SPITFT.h + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * BSD license, all text here must be included in any redistribution. + */ + +#ifndef _ADAFRUIT_SPITFT_H_ +#define _ADAFRUIT_SPITFT_H_ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include +#include "Adafruit_GFX.h" +#include "renderer.h" + +// HARDWARE CONFIG --------------------------------------------------------- + +#if defined(__AVR__) + typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit + #define USE_FAST_PINIO ///< Use direct PORT register access +#elif defined(ARDUINO_STM32_FEATHER) // WICED + typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#elif defined(__arm__) + #if defined(ARDUINO_ARCH_SAMD) + // Adafruit M0, M4 + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + #define USE_FAST_PINIO ///< Use direct PORT register access + #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers + #elif defined(CORE_TEENSY) + // PJRC Teensy 4.x + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + // PJRC Teensy 3.x + #else + typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit + #endif + #define USE_FAST_PINIO ///< Use direct PORT register access + #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers + #else + // Arduino Due? + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + // USE_FAST_PINIO not available here (yet)...Due has a totally different + // GPIO register set and will require some changes elsewhere (e.g. in + // constructors especially). + #endif +#else // !ARM + // Probably ESP8266 or ESP32. USE_FAST_PINIO is not available here (yet) + // but don't worry about it too much...the digitalWrite() implementation + // on these platforms is reasonably efficient and already RAM-resident, + // only gotcha then is no parallel connection support for now. + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#endif // end !ARM +typedef volatile ADAGFX_PORT_t* PORTreg_t; ///< PORT register type + +#if defined(__AVR__) + #define DEFAULT_SPI_FREQ 8000000L ///< Hardware SPI default speed +#else + #define DEFAULT_SPI_FREQ 16000000L ///< Hardware SPI default speed +#endif + +#if defined(ADAFRUIT_PYPORTAL) || defined(ADAFRUIT_PYBADGE_M4_EXPRESS) || defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define USE_SPI_DMA ///< Auto DMA if using PyPortal +#else + //#define USE_SPI_DMA ///< If set, use DMA if available +#endif +// Another "oops" name -- this now also handles parallel DMA. +// If DMA is enabled, Arduino sketch MUST #include +// Estimated RAM usage: +// 4 bytes/pixel on display major axis + 8 bytes/pixel on minor axis, +// e.g. 320x240 pixels = 320 * 4 + 240 * 8 = 3,200 bytes. + +#if !defined(ARDUINO_ARCH_SAMD) + #undef USE_SPI_DMA ///< DMA currently for SAMD chips only +#endif + +#if defined(USE_SPI_DMA) + #pragma message ("GFX DMA IS ENABLED. HIGHLY EXPERIMENTAL.") + #include +#endif + +// This is kind of a kludge. Needed a way to disambiguate the software SPI +// and parallel constructors via their argument lists. Originally tried a +// bool as the first argument to the parallel constructor (specifying 8-bit +// vs 16-bit interface) but the compiler regards this as equivalent to an +// integer and thus still ambiguous. SO...the parallel constructor requires +// an enumerated type as the first argument: tft8 (for 8-bit parallel) or +// tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested +// and might never be, still needed that disambiguation from soft SPI. +enum tftBusWidth { tft8bitbus, tft16bitbus }; ///< For first arg to parallel constructor + +// CLASS DEFINITION -------------------------------------------------------- + +/*! + @brief Adafruit_SPITFT is an intermediary class between Adafruit_GFX + and various hardware-specific subclasses for different displays. + It handles certain operations that are common to a range of + displays (address window, area fills, etc.). Originally these were + all color TFT displays interfaced via SPI, but it's since expanded + to include color OLEDs and parallel-interfaced TFTs. THE NAME HAS + BEEN KEPT TO AVOID BREAKING A LOT OF SUBCLASSES AND EXAMPLE CODE. + Many of the class member functions similarly live on with names + that don't necessarily accurately describe what they're doing, + again to avoid breaking a lot of other code. If in doubt, read + the comments. +*/ +class Adafruit_SPITFT : public Renderer { + + public: + + // CONSTRUCTORS -------------------------------------------------------- + + // Software SPI constructor: expects width & height (at default rotation + // setting 0), 4 signal pins (cs, dc, mosi, sclk), 2 optional pins + // (reset, miso). cs argument is required but can be -1 if unused -- + // rather than moving it to the optional arguments, it was done this way + // to avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t mosi, int8_t sck, + int8_t rst = -1, int8_t miso = -1); + + // Hardware SPI constructor using the default SPI port: expects width & + // height (at default rotation setting 0), 2 signal pins (cs, dc), + // optional reset pin. cs is required but can be -1 if unused -- rather + // than moving it to the optional arguments, it was done this way to + // avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t rst = -1); + +#if !defined(ESP8266) // See notes in .cpp + // Hardware SPI constructor using an arbitrary SPI peripheral: expects + // width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc) + // and optional reset pin. cs is required but can be -1 if unused. + Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + int8_t cs, int8_t dc, int8_t rst = -1); +#endif // end !ESP8266 + + // Parallel constructor: expects width & height (rotation 0), flag + // indicating whether 16-bit (true) or 8-bit (false) interface, 3 signal + // pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel + // isn't even fully implemented but the 'wide' flag was added as a + // required argument to avoid ambiguity with other constructors. + Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + int8_t d0, int8_t wr, int8_t dc, + int8_t cs = -1, int8_t rst = -1, int8_t rd = -1); + + // CLASS MEMBER FUNCTIONS ---------------------------------------------- + + // These first two functions MUST be declared by subclasses: + + /*! + @brief Display-specific initialization function. + @param freq SPI frequency, in hz (or 0 for default or unused). + */ + virtual void begin(uint32_t freq) = 0; + + /*! + @brief Set up the specific display hardware's "address window" + for subsequent pixel-pushing operations. + @param x Leftmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param y Topmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param w Width of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + @param h Height of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + */ + virtual void setAddrWindow( + uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0; + + // Remaining functions do not need to be declared in subclasses + // unless they wish to provide hardware-specific optimizations. + // Brief comments here...documented more thoroughly in .cpp file. + + // Subclass' begin() function invokes this to initialize hardware. + // freq=0 to use default SPI speed. spiMode must be one of the SPI_MODEn + // values defined in SPI.h, which are NOT the same as 0 for SPI_MODE0, + // 1 for SPI_MODE1, etc...use ONLY the SPI_MODEn defines! Only! + // Name is outdated (interface may be parallel) but for compatibility: + void initSPI(uint32_t freq = 0, uint8_t spiMode = SPI_MODE0); + // Chip select and/or hardware SPI transaction start as needed: + void startWrite(void); + // Chip deselect and/or hardware SPI transaction end as needed: + void endWrite(void); + void sendCommand(uint8_t commandByte, uint8_t *dataBytes = NULL, uint8_t numDataBytes = 0); + void sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes); + uint8_t readcommand8(uint8_t commandByte, uint8_t index = 0); + + // These functions require a chip-select and/or SPI transaction + // around them. Higher-level graphics primitives might start a + // single transaction and then make multiple calls to these functions + // (e.g. circle or text rendering might make repeated lines or rects) + // before ending the transaction. It's more efficient than starting a + // transaction every time. + void writePixel(int16_t x, int16_t y, uint16_t color); + void writePixels(uint16_t *colors, uint32_t len, + bool block=true, bool bigEndian=false); + void writeColor(uint16_t color, uint32_t len); + void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + void writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color); + void writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color); + // This is a new function, similar to writeFillRect() except that + // all arguments MUST be onscreen, sorted and clipped. If higher-level + // primitives can handle their own sorting/clipping, it avoids repeating + // such operations in the low-level code, making it potentially faster. + // CALLING THIS WITH UNCLIPPED OR NEGATIVE VALUES COULD BE DISASTROUS. + inline void writeFillRectPreclipped(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color); + // Another new function, companion to the new non-blocking + // writePixels() variant. + void dmaWait(void); + + + // These functions are similar to the 'write' functions above, but with + // a chip-select and/or SPI transaction built-in. They're typically used + // solo -- that is, as graphics primitives in themselves, not invoked by + // higher-level primitives (which should use the functions above). + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color); + // A single-pixel push encapsulated in a transaction. I don't think + // this is used anymore (BMP demos might've used it?) but is provided + // for backward compatibility, consider it deprecated: + void pushColor(uint16_t color); + + using Adafruit_GFX::drawRGBBitmap; // Check base class first + void drawRGBBitmap(int16_t x, int16_t y, + uint16_t *pcolors, int16_t w, int16_t h); + + void invertDisplay(bool i); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b); + + // Despite parallel additions, function names kept for compatibility: + void spiWrite(uint8_t b); // Write single byte as DATA + void writeCommand(uint8_t cmd); // Write single byte as COMMAND + uint8_t spiRead(void); // Read single byte of data + + // Most of these low-level functions were formerly macros in + // Adafruit_SPITFT_Macros.h. Some have been made into inline functions + // to avoid macro mishaps. Despite the addition of code for a parallel + // display interface, the names have been kept for backward + // compatibility (some subclasses may be invoking these): + void SPI_WRITE16(uint16_t w); // Not inline + void SPI_WRITE32(uint32_t l); // Not inline + // Old code had both a spiWrite16() function and SPI_WRITE16 macro + // in addition to the SPI_WRITE32 macro. The latter two have been + // made into functions here, and spiWrite16() removed (use SPI_WRITE16() + // instead). It looks like most subclasses had gotten comfortable with + // SPI_WRITE16 and SPI_WRITE32 anyway so those names were kept rather + // than the less-obnoxious camelcase variants, oh well. + + // Placing these functions entirely in the class definition inlines + // them implicitly them while allowing their use in other code: + + /*! + @brief Set the chip-select line HIGH. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_HIGH(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *csPortSet = 1; + #else // !KINETISK + *csPortSet = csPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *csPort |= csPinMaskSet; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_cs, HIGH); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the chip-select line LOW. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_LOW(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *csPortClr = 1; + #else // !KINETISK + *csPortClr = csPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *csPort &= csPinMaskClr; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_cs, LOW); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line HIGH (data mode). + */ + void SPI_DC_HIGH(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *dcPortSet = 1; + #else // !KINETISK + *dcPortSet = dcPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *dcPort |= dcPinMaskSet; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_dc, HIGH); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line LOW (command mode). + */ + void SPI_DC_LOW(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *dcPortClr = 1; + #else // !KINETISK + *dcPortClr = dcPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *dcPort &= dcPinMaskClr; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_dc, LOW); + #endif // end !USE_FAST_PINIO + } + + protected: + + // A few more low-level member functions -- some may have previously + // been macros. Shouldn't have a need to access these externally, so + // they've been moved to the protected section. Additionally, they're + // declared inline here and the code is in the .cpp file, since outside + // code doesn't need to see these. + inline void SPI_MOSI_HIGH(void); + inline void SPI_MOSI_LOW(void); + inline void SPI_SCK_HIGH(void); + inline void SPI_SCK_LOW(void); + inline bool SPI_MISO_READ(void); + inline void SPI_BEGIN_TRANSACTION(void); + inline void SPI_END_TRANSACTION(void); + inline void TFT_WR_STROBE(void); // Parallel interface write strobe + inline void TFT_RD_HIGH(void); // Parallel interface read high + inline void TFT_RD_LOW(void); // Parallel interface read low + + // CLASS INSTANCE VARIABLES -------------------------------------------- + + // Here be dragons! There's a big union of three structures here -- + // one each for hardware SPI, software (bitbang) SPI, and parallel + // interfaces. This is to save some memory, since a display's connection + // will be only one of these. The order of some things is a little weird + // in an attempt to get values to align and pack better in RAM. + +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + PORTreg_t csPortSet; ///< PORT register for chip select SET + PORTreg_t csPortClr; ///< PORT register for chip select CLEAR + PORTreg_t dcPortSet; ///< PORT register for data/command SET + PORTreg_t dcPortClr; ///< PORT register for data/command CLEAR +#else // !HAS_PORT_SET_CLR + PORTreg_t csPort; ///< PORT register for chip select + PORTreg_t dcPort; ///< PORT register for data/command +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +#if defined(__cplusplus) && (__cplusplus >= 201100) + union { +#endif + struct { // Values specific to HARDWARE SPI: + SPIClass *_spi; ///< SPI class pointer +#if defined(SPI_HAS_TRANSACTION) + SPISettings settings; ///< SPI transaction settings +#else + uint32_t _freq; ///< SPI bitrate (if no SPI transactions) +#endif + uint32_t _mode; ///< SPI data mode (transactions or no) + } hwspi; ///< Hardware SPI values + struct { // Values specific to SOFTWARE SPI: +#if defined(USE_FAST_PINIO) + PORTreg_t misoPort; ///< PORT (PIN) register for MISO +#if defined(HAS_PORT_SET_CLR) + PORTreg_t mosiPortSet; ///< PORT register for MOSI SET + PORTreg_t mosiPortClr; ///< PORT register for MOSI CLEAR + PORTreg_t sckPortSet; ///< PORT register for SCK SET + PORTreg_t sckPortClr; ///< PORT register for SCK CLEAR + #if !defined(KINETISK) + ADAGFX_PORT_t mosiPinMask; ///< Bitmask for MOSI + ADAGFX_PORT_t sckPinMask; ///< Bitmask for SCK + #endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + PORTreg_t mosiPort; ///< PORT register for MOSI + PORTreg_t sckPort; ///< PORT register for SCK + ADAGFX_PORT_t mosiPinMaskSet; ///< Bitmask for MOSI SET (OR) + ADAGFX_PORT_t mosiPinMaskClr; ///< Bitmask for MOSI CLEAR (AND) + ADAGFX_PORT_t sckPinMaskSet; ///< Bitmask for SCK SET (OR bitmask) + ADAGFX_PORT_t sckPinMaskClr; ///< Bitmask for SCK CLEAR (AND) +#endif // end HAS_PORT_SET_CLR + #if !defined(KINETISK) + ADAGFX_PORT_t misoPinMask; ///< Bitmask for MISO + #endif // end !KINETISK +#endif // end USE_FAST_PINIO + int8_t _mosi; ///< MOSI pin # + int8_t _miso; ///< MISO pin # + int8_t _sck; ///< SCK pin # + } swspi; ///< Software SPI values + struct { // Values specific to 8-bit parallel: +#if defined(USE_FAST_PINIO) + + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *writePort; ///< PORT register for DATA WRITE + volatile uint32_t *readPort; ///< PORT (PIN) register for DATA READ + #else + volatile uint8_t *writePort; ///< PORT register for DATA WRITE + volatile uint8_t *readPort; ///< PORT (PIN) register for DATA READ + #endif +#if defined(HAS_PORT_SET_CLR) + // Port direction register pointers are always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *dirSet; ///< PORT byte data direction SET + volatile uint32_t *dirClr; ///< PORT byte data direction CLEAR + #else + volatile uint8_t *dirSet; ///< PORT byte data direction SET + volatile uint8_t *dirClr; ///< PORT byte data direction CLEAR + #endif + PORTreg_t wrPortSet; ///< PORT register for write strobe SET + PORTreg_t wrPortClr; ///< PORT register for write strobe CLEAR + PORTreg_t rdPortSet; ///< PORT register for read strobe SET + PORTreg_t rdPortClr; ///< PORT register for read strobe CLEAR + #if !defined(KINETISK) + ADAGFX_PORT_t wrPinMask; ///< Bitmask for write strobe + #endif // end !KINETISK + ADAGFX_PORT_t rdPinMask; ///< Bitmask for read strobe +#else // !HAS_PORT_SET_CLR + // Port direction register pointer is always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. + volatile uint8_t *portDir; ///< PORT direction register + PORTreg_t wrPort; ///< PORT register for write strobe + PORTreg_t rdPort; ///< PORT register for read strobe + ADAGFX_PORT_t wrPinMaskSet; ///< Bitmask for write strobe SET (OR) + ADAGFX_PORT_t wrPinMaskClr; ///< Bitmask for write strobe CLEAR (AND) + ADAGFX_PORT_t rdPinMaskSet; ///< Bitmask for read strobe SET (OR) + ADAGFX_PORT_t rdPinMaskClr; ///< Bitmask for read strobe CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + int8_t _d0; ///< Data pin 0 # + int8_t _wr; ///< Write strobe pin # + int8_t _rd; ///< Read strobe pin # (or -1) + bool wide = 0; ///< If true, is 16-bit interface + } tft8; ///< Parallel interface settings +#if defined(__cplusplus) && (__cplusplus >= 201100) + }; ///< Only one interface is active +#endif +#if defined(USE_SPI_DMA) // Used by hardware SPI and tft8 + Adafruit_ZeroDMA dma; ///< DMA instance + DmacDescriptor *dptr = NULL; ///< 1st descriptor + DmacDescriptor *descriptor = NULL; ///< Allocated descriptor list + uint16_t *pixelBuf[2]; ///< Working buffers + uint16_t maxFillLen; ///< Max pixels per DMA xfer + uint16_t lastFillColor = 0; ///< Last color used w/fill + uint32_t lastFillLen = 0; ///< # of pixels w/last fill + uint8_t onePixelBuf; ///< For hi==lo fill +#endif +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + #if !defined(KINETISK) + ADAGFX_PORT_t csPinMask; ///< Bitmask for chip select + ADAGFX_PORT_t dcPinMask; ///< Bitmask for data/command + #endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + ADAGFX_PORT_t csPinMaskSet; ///< Bitmask for chip select SET (OR) + ADAGFX_PORT_t csPinMaskClr; ///< Bitmask for chip select CLEAR (AND) + ADAGFX_PORT_t dcPinMaskSet; ///< Bitmask for data/command SET (OR) + ADAGFX_PORT_t dcPinMaskClr; ///< Bitmask for data/command CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + uint8_t connection; ///< TFT_HARD_SPI, TFT_SOFT_SPI, etc. + int8_t _rst; ///< Reset pin # (or -1) + int8_t _cs; ///< Chip select pin # (or -1) + int8_t _dc; ///< Data/command pin # + + int16_t _xstart = 0; ///< Internal framebuffer X offset + int16_t _ystart = 0; ///< Internal framebuffer Y offset + uint8_t invertOnCommand = 0; ///< Command to enable invert mode + uint8_t invertOffCommand = 0; ///< Command to disable invert mode + + uint32_t _freq = 0; ///< Dummy var to keep subclasses happy +}; + +#endif // end __AVR_ATtiny85__ +#endif // end _ADAFRUIT_SPITFT_H_ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp new file mode 100644 index 000000000..78d9901d6 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp @@ -0,0 +1,190 @@ +/*! + * @file Adafruit_SSD1331.cpp + * + * @mainpage Adafruit SSD1331 Arduino Library + * + * @section intro_sec Introduction + * + * This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip + * + * Pick one up today in the adafruit shop! + * ------> http://www.adafruit.com/products/684 + * + * These displays use SPI to communicate, 4 or 5 pins are required to + * interface + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * @section author Author + * + * Written by Limor Fried/Ladyada for Adafruit Industries. + * + * @section license License + * + * BSD license, all text above must be included in any redistribution + */ + +#include "Adafruit_SSD1331.h" +#include "pins_arduino.h" +#include "wiring_private.h" + +/***********************************/ + +/*! + @brief SPI displays set an address window rectangle for blitting pixels + @param x Top left corner x coordinate + @param y Top left corner x coordinate + @param w Width of window + @param h Height of window +*/ +void Adafruit_SSD1331::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, + uint16_t h) { + + uint8_t x1 = x; + uint8_t y1 = y; + if (x1 > 95) + x1 = 95; + if (y1 > 63) + y1 = 63; + + uint8_t x2 = (x + w - 1); + uint8_t y2 = (y + h - 1); + if (x2 > 95) + x2 = 95; + if (y2 > 63) + y2 = 63; + + if (x1 > x2) { + uint8_t t = x2; + x2 = x1; + x1 = t; + } + if (y1 > y2) { + uint8_t t = y2; + y2 = y1; + y1 = t; + } + + sendCommand(0x15); // Column addr set + sendCommand(x1); + sendCommand(x2); + + sendCommand(0x75); // Column addr set + sendCommand(y1); + sendCommand(y2); + + startWrite(); +} + +/**************************************************************************/ +/*! + @brief Initialize SSD1331 chip + Connects to the SSD1331 over SPI and sends initialization procedure commands + @param freq Desired SPI clock frequency +*/ +/**************************************************************************/ +void Adafruit_SSD1331::begin(uint32_t freq) { + initSPI(freq); + + // Initialization Sequence + sendCommand(SSD1331_CMD_DISPLAYOFF); // 0xAE + sendCommand(SSD1331_CMD_SETREMAP); // 0xA0 +#if defined SSD1331_COLORORDER_RGB + sendCommand(0x72); // RGB Color +#else + sendCommand(0x76); // BGR Color +#endif + sendCommand(SSD1331_CMD_STARTLINE); // 0xA1 + sendCommand(0x0); + sendCommand(SSD1331_CMD_DISPLAYOFFSET); // 0xA2 + sendCommand(0x0); + sendCommand(SSD1331_CMD_NORMALDISPLAY); // 0xA4 + sendCommand(SSD1331_CMD_SETMULTIPLEX); // 0xA8 + sendCommand(0x3F); // 0x3F 1/64 duty + sendCommand(SSD1331_CMD_SETMASTER); // 0xAD + sendCommand(0x8E); + sendCommand(SSD1331_CMD_POWERMODE); // 0xB0 + sendCommand(0x0B); + sendCommand(SSD1331_CMD_PRECHARGE); // 0xB1 + sendCommand(0x31); + sendCommand(SSD1331_CMD_CLOCKDIV); // 0xB3 + sendCommand(0xF0); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio + // (A[3:0]+1 = 1..16) + sendCommand(SSD1331_CMD_PRECHARGEA); // 0x8A + sendCommand(0x64); + sendCommand(SSD1331_CMD_PRECHARGEB); // 0x8B + sendCommand(0x78); + sendCommand(SSD1331_CMD_PRECHARGEC); // 0x8C + sendCommand(0x64); + sendCommand(SSD1331_CMD_PRECHARGELEVEL); // 0xBB + sendCommand(0x3A); + sendCommand(SSD1331_CMD_VCOMH); // 0xBE + sendCommand(0x3E); + sendCommand(SSD1331_CMD_MASTERCURRENT); // 0x87 + sendCommand(0x06); + sendCommand(SSD1331_CMD_CONTRASTA); // 0x81 + sendCommand(0x91); + sendCommand(SSD1331_CMD_CONTRASTB); // 0x82 + sendCommand(0x50); + sendCommand(SSD1331_CMD_CONTRASTC); // 0x83 + sendCommand(0x7D); + sendCommand(SSD1331_CMD_DISPLAYON); //--turn on oled panel + _width = TFTWIDTH; + _height = TFTHEIGHT; +} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with software SPI + @param cs Chip select pin # + @param dc Data/Command pin # + @param mosi SPI MOSI pin # + @param sclk SPI Clock pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, + int8_t sclk, int8_t rst) + : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, mosi, sclk, rst, -1) {} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with hardware SPI + @param cs Chip select pin # + @param dc Data/Command pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst) + : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, rst) {} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with hardware SPI + @param spi Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param cs Chip select pin # + @param dc Data/Command pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, + int8_t rst) + : +#if defined(ESP8266) + Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, cs, dc, rst) { +#else + Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, spi, cs, dc, rst) { +#endif +} + +/**************************************************************************/ +/*! + @brief Change whether display is on or off + @param enable True if you want the display ON, false OFF +*/ +/**************************************************************************/ +void Adafruit_SSD1331::enableDisplay(boolean enable) { + sendCommand(enable ? SSD1331_CMD_DISPLAYON : SSD1331_CMD_DISPLAYOFF); +} diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h new file mode 100644 index 000000000..7d9bc85a0 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h @@ -0,0 +1,76 @@ +/*! + * @file Adafruit_SSD1331.h + */ + +#include "Arduino.h" +#include +// Tasmota change: use custom version of Adafruit_SPITFT which extends Renderer instead of Adafruit_GFX +#include +#include +#include + +/*! + * @brief Select one of these defines to set the pixel color order + */ +#define SSD1331_COLORORDER_RGB +// #define SSD1331_COLORORDER_BGR + +#if defined SSD1331_COLORORDER_RGB && defined SSD1331_COLORORDER_BGR +#error "RGB and BGR can not both be defined for SSD1331_COLORODER." +#endif + +// Timing Delays +#define SSD1331_DELAYS_HWFILL (3) //!< Fill delay +#define SSD1331_DELAYS_HWLINE (1) //!< Line delay + +// SSD1331 Commands +#define SSD1331_CMD_DRAWLINE 0x21 //!< Draw line +#define SSD1331_CMD_DRAWRECT 0x22 //!< Draw rectangle +#define SSD1331_CMD_FILL 0x26 //!< Fill enable/disable +#define SSD1331_CMD_SETCOLUMN 0x15 //!< Set column address +#define SSD1331_CMD_SETROW 0x75 //!< Set row adress +#define SSD1331_CMD_CONTRASTA 0x81 //!< Set contrast for color A +#define SSD1331_CMD_CONTRASTB 0x82 //!< Set contrast for color B +#define SSD1331_CMD_CONTRASTC 0x83 //!< Set contrast for color C +#define SSD1331_CMD_MASTERCURRENT 0x87 //!< Master current control +#define SSD1331_CMD_SETREMAP 0xA0 //!< Set re-map & data format +#define SSD1331_CMD_STARTLINE 0xA1 //!< Set display start line +#define SSD1331_CMD_DISPLAYOFFSET 0xA2 //!< Set display offset +#define SSD1331_CMD_NORMALDISPLAY 0xA4 //!< Set display to normal mode +#define SSD1331_CMD_DISPLAYALLON 0xA5 //!< Set entire display ON +#define SSD1331_CMD_DISPLAYALLOFF 0xA6 //!< Set entire display OFF +#define SSD1331_CMD_INVERTDISPLAY 0xA7 //!< Invert display +#define SSD1331_CMD_SETMULTIPLEX 0xA8 //!< Set multiplex ratio +#define SSD1331_CMD_SETMASTER 0xAD //!< Set master configuration +#define SSD1331_CMD_DISPLAYOFF 0xAE //!< Display OFF (sleep mode) +#define SSD1331_CMD_DISPLAYON 0xAF //!< Normal Brightness Display ON +#define SSD1331_CMD_POWERMODE 0xB0 //!< Power save mode +#define SSD1331_CMD_PRECHARGE 0xB1 //!< Phase 1 and 2 period adjustment +#define SSD1331_CMD_CLOCKDIV \ + 0xB3 //!< Set display clock divide ratio/oscillator frequency +#define SSD1331_CMD_PRECHARGEA 0x8A //!< Set second pre-charge speed for color A +#define SSD1331_CMD_PRECHARGEB 0x8B //!< Set second pre-charge speed for color B +#define SSD1331_CMD_PRECHARGEC 0x8C //!< Set second pre-charge speed for color C +#define SSD1331_CMD_PRECHARGELEVEL 0xBB //!< Set pre-charge voltage +#define SSD1331_CMD_VCOMH 0xBE //!< Set Vcomh voltge + +/// Class to manage hardware interface with SSD1331 chipset +class Adafruit_SSD1331 : public Adafruit_SPITFT { +public: + Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst); + Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst); + // 3-4 args using hardware SPI (must specify peripheral) (reset optional) + Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, int8_t rst = -1); + + // commands + void begin(uint32_t begin = 8000000); + + void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + + void enableDisplay(boolean enable); + + static const int16_t TFTWIDTH = 96; ///< The width of the display + static const int16_t TFTHEIGHT = 64; ///< The height of the display + +private: +}; diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md b/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md new file mode 100644 index 000000000..24c404c59 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md @@ -0,0 +1,24 @@ +# Adafruit SSD1331 Arduino Library [![Build Status](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/html/index.html) +This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/products/684 + +These displays use SPI to communicate, 4 or 5 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_SSD1131. Check that the Adafruit_SSD1331 folder contains Adafruit_SSD1331.cpp and Adafruit_SSD1331.h + +Place the Adafruit_SSD1331 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. + +You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from +https://github.com/adafruit/Adafruit-GFX-Library +and download/install that library as well diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties b/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties new file mode 100644 index 000000000..931f1aa38 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties @@ -0,0 +1,10 @@ +name=Adafruit SSD1331 OLED Driver Library for Arduino +version=1.2.0 +author=Adafruit +maintainer=Adafruit +sentence=For 0.96" OLEDs in the Adafruit shop +paragraph=For 0.96" OLEDs in the Adafruit shop +category=Display +url=https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino +architectures=* +depends=Adafruit GFX Library diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt b/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt new file mode 100644 index 000000000..f6a0f22b8 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt @@ -0,0 +1,26 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino new file mode 100644 index 000000000..031115beb --- /dev/null +++ b/tasmota/xdsp_14_SSD1331.ino @@ -0,0 +1,182 @@ +/* + xdsp_14_SSD1331.ino - Display SSD1331 support for Tasmota + + Copyright (C) 2020 Jeroen Vermeulen, Gerhard Mutz and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_SPI +#ifdef USE_DISPLAY +#ifdef USE_DISPLAY_SSD1331 + +#define XDSP_14 14 + +#define COLORED 1 +#define UNCOLORED 0 +#define USE_TINY_FONT + +#define SSD1331_BLACK 0x0000 // 0, 0, 0 +#define SSD1331_RED 0xF800 // 255, 0, 0 +#define SSD1331_WHITE 0xFFFF // 255, 255, 255 + +#include + +extern uint8_t *buffer; +extern uint8_t color_type; +Adafruit_SSD1331 *ssd1331; + +/*********************************************************************************************/ + +void SSD1331_InitDriver() { + if (!Settings.display_model) { + Settings.display_model = XDSP_14; + } + + if (XDSP_14 == Settings.display_model) { + + if (Settings.display_width != Adafruit_SSD1331::TFTWIDTH) { + Settings.display_width = Adafruit_SSD1331::TFTWIDTH; + } + if (Settings.display_height != Adafruit_SSD1331::TFTHEIGHT) { + Settings.display_height = Adafruit_SSD1331::TFTHEIGHT; + } + + buffer=0; + + // default colors + fg_color = SSD1331_WHITE; + bg_color = SSD1331_BLACK; + + // init renderer + if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK)){ + ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_DC),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),OLED_RESET); + } else { + if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { + ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK),OLED_RESET); + } else { + return; + } + } + + delay(100); + ssd1331->begin(); + renderer = ssd1331; + // Rotation is currently broken, https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/issues/26 + renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->dim(Settings.display_dimmer); + +#ifdef SHOW_SPLASH + // Welcome text + renderer->clearDisplay(); + renderer->setTextFont(1); + renderer->DrawStringAt(24, 27, "SSD1331", SSD1331_RED, 0); + delay(1000); +#endif + + color_type = COLOR_COLOR; + } +} + +#ifdef USE_DISPLAY_MODES1TO5 + +void SSD1331PrintLog(void) +{ + disp_refresh--; + if (!disp_refresh) { + disp_refresh = Settings.display_refresh; + if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); } + + char* txt = DisplayLogBuffer('\370'); + if (txt != NULL) { + uint8_t last_row = Settings.display_rows -1; + + renderer->clearDisplay(); + renderer->setTextSize(Settings.display_size); + renderer->setCursor(0,0); + for (byte i = 0; i < last_row; i++) { + strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); + renderer->println(disp_screen_buffer[i]); + } + strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); + DisplayFillScreen(last_row); + + AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); + + renderer->println(disp_screen_buffer[last_row]); + renderer->Updateframe(); + } + } +} + +void SSD1331Time(void) +{ + char line[12]; + + renderer->clearDisplay(); + renderer->setTextSize(2); + renderer->setCursor(0, 0); + snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ] + renderer->println(line); + snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018] + renderer->println(line); + renderer->Updateframe(); +} + +void SSD1331Refresh(void) // Every second +{ + if (Settings.display_mode) { // Mode 0 is User text + switch (Settings.display_mode) { + case 1: // Time + SSD1331Time(); + break; + case 2: // Local + case 3: // Local + case 4: // Mqtt + case 5: // Mqtt + SSD1331PrintLog(); + break; + } + } +} + +#endif // USE_DISPLAY_MODES1TO5 +/*********************************************************************************************/ +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ +bool Xdsp14(uint8_t function) +{ + bool result = false; + + if (FUNC_DISPLAY_INIT_DRIVER == function) { + SSD1331_InitDriver(); + } + else if (XDSP_14 == Settings.display_model) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; +#ifdef USE_DISPLAY_MODES1TO5 + case FUNC_DISPLAY_EVERY_SECOND: + SSD1331Refresh(); + break; +#endif // USE_DISPLAY_MODES1TO5 + } + } + return result; +} +#endif // USE_DISPLAY_SSD1331 +#endif // USE_DISPLAY +#endif // USE_SPI From d69be912e9e0a87dfc761506c8cd9dd6865f9c34 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Mon, 28 Dec 2020 15:43:59 -0800 Subject: [PATCH 025/255] Make all initial tabs two spaces for consistency. Also clean up some trailing comments spacing. This seems to be the common style. --- tasmota/WiFiClientSecureLightBearSSL.cpp | 410 +++++++++++------------ 1 file changed, 205 insertions(+), 205 deletions(-) diff --git a/tasmota/WiFiClientSecureLightBearSSL.cpp b/tasmota/WiFiClientSecureLightBearSSL.cpp index d7b53cf25..98cd5f4d6 100755 --- a/tasmota/WiFiClientSecureLightBearSSL.cpp +++ b/tasmota/WiFiClientSecureLightBearSSL.cpp @@ -57,8 +57,8 @@ extern "C" { #include "coredecls.h" #define LOG_HEAP_SIZE(a) _Log_heap_size(a) void _Log_heap_size(const char *msg) { - register uint32_t *sp asm("a1"); - int freestack = 4 * (sp - g_pcont->stack); + register uint32_t *sp asm("a1"); + int freestack = 4 * (sp - g_pcont->stack); Serial.printf("%s %d, Fragmentation=%d, Thunkstack=%d, Free stack=%d, FreeContStack=%d\n", msg, ESP.getFreeHeap(), ESP.getHeapFragmentation(), stack_thunk_light_get_max_usage(), freestack, ESP.getFreeContStack()); @@ -98,60 +98,60 @@ make_stack_thunk_light(br_ssl_engine_sendrec_buf); // unless the Thunk was initialized. Thanks to AES128 GCM, we can keep // symetric processing on the stack void min_br_ssl_engine_recvapp_ack(br_ssl_engine_context *cc, size_t len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_recvapp_ack(cc, len); - } else { - return br_ssl_engine_recvapp_ack(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_recvapp_ack(cc, len); + } else { + return br_ssl_engine_recvapp_ack(cc, len); + } } unsigned char *min_br_ssl_engine_recvapp_buf(const br_ssl_engine_context *cc, size_t *len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_recvapp_buf(cc, len); - } else { - return br_ssl_engine_recvapp_buf(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_recvapp_buf(cc, len); + } else { + return br_ssl_engine_recvapp_buf(cc, len); + } } void min_br_ssl_engine_recvrec_ack(br_ssl_engine_context *cc, size_t len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_recvrec_ack(cc, len); - } else { - return br_ssl_engine_recvrec_ack(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_recvrec_ack(cc, len); + } else { + return br_ssl_engine_recvrec_ack(cc, len); + } } unsigned char *min_br_ssl_engine_recvrec_buf(const br_ssl_engine_context *cc, size_t *len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_recvrec_buf(cc, len); - } else { - return br_ssl_engine_recvrec_buf(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_recvrec_buf(cc, len); + } else { + return br_ssl_engine_recvrec_buf(cc, len); + } } void min_br_ssl_engine_sendapp_ack(br_ssl_engine_context *cc, size_t len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_sendapp_ack(cc, len); - } else { - return br_ssl_engine_sendapp_ack(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_sendapp_ack(cc, len); + } else { + return br_ssl_engine_sendapp_ack(cc, len); + } } unsigned char *min_br_ssl_engine_sendapp_buf(const br_ssl_engine_context *cc, size_t *len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_sendapp_buf(cc, len); - } else { - return br_ssl_engine_sendapp_buf(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_sendapp_buf(cc, len); + } else { + return br_ssl_engine_sendapp_buf(cc, len); + } } void min_br_ssl_engine_sendrec_ack(br_ssl_engine_context *cc, size_t len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_sendrec_ack(cc, len); - } else { - return br_ssl_engine_sendrec_ack(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_sendrec_ack(cc, len); + } else { + return br_ssl_engine_sendrec_ack(cc, len); + } } unsigned char *min_br_ssl_engine_sendrec_buf(const br_ssl_engine_context *cc, size_t *len) { - if (stack_thunk_light_get_refcnt()) { - return thunk_light_br_ssl_engine_sendrec_buf(cc, len); - } else { - return br_ssl_engine_sendrec_buf(cc, len); - } + if (stack_thunk_light_get_refcnt()) { + return thunk_light_br_ssl_engine_sendrec_buf(cc, len); + } else { + return br_ssl_engine_sendrec_buf(cc, len); + } } // Use min_ instead of original thunk_ @@ -176,7 +176,7 @@ namespace BearSSL { void WiFiClientSecure_light::_clear() { // TLS handshake may take more than the 5 second default timeout - _timeout = 10000; // 10 seconds max, it should never go over 6 seconds + _timeout = 10000; // 10 seconds max, it should never go over 6 seconds _sc = nullptr; _ctx_present = false; @@ -185,17 +185,17 @@ void WiFiClientSecure_light::_clear() { _iobuf_out = nullptr; setBufferSizes(1024, 1024); // reasonable minimum _handshake_done = false; - _last_error = 0; + _last_error = 0; _recvapp_buf = nullptr; _recvapp_len = 0; - _fingerprint_any = true; // by default accept all fingerprints - _fingerprint1 = nullptr; - _fingerprint2 = nullptr; - _chain_P = nullptr; - _sk_ec_P = nullptr; - _ta_P = nullptr; + _fingerprint_any = true; // by default accept all fingerprints + _fingerprint1 = nullptr; + _fingerprint2 = nullptr; + _chain_P = nullptr; + _sk_ec_P = nullptr; + _ta_P = nullptr; _ta_size = 0; - _max_thunkstack_use = 0; + _max_thunkstack_use = 0; } // Constructor @@ -221,24 +221,24 @@ WiFiClientSecure_light::~WiFiClientSecure_light() { void WiFiClientSecure_light::allocateBuffers(void) { // We prefer to allocate all buffers at start, rather than lazy allocation and deallocation // in the long run it avoids heap fragmentation and improves stability - LOG_HEAP_SIZE("allocateBuffers before"); + LOG_HEAP_SIZE("allocateBuffers before"); _sc = std::make_shared(); - LOG_HEAP_SIZE("allocateBuffers ClientContext"); + LOG_HEAP_SIZE("allocateBuffers ClientContext"); _iobuf_in = std::shared_ptr(new unsigned char[_iobuf_in_size], std::default_delete()); _iobuf_out = std::shared_ptr(new unsigned char[_iobuf_out_size], std::default_delete()); - LOG_HEAP_SIZE("allocateBuffers after"); + LOG_HEAP_SIZE("allocateBuffers after"); } void WiFiClientSecure_light::setClientECCert(const br_x509_certificate *cert, const br_ec_private_key *sk, - unsigned allowed_usages, unsigned cert_issuer_key_type) { - _chain_P = cert; - _sk_ec_P = sk; + unsigned allowed_usages, unsigned cert_issuer_key_type) { + _chain_P = cert; + _sk_ec_P = sk; _allowed_usages = allowed_usages; _cert_issuer_key_type = cert_issuer_key_type; } void WiFiClientSecure_light::setTrustAnchor(const br_x509_trust_anchor *ta, size_t ta_size) { - _ta_P = ta; + _ta_P = ta; _ta_size = ta_size; } @@ -271,9 +271,9 @@ bool WiFiClientSecure_light::flush(unsigned int maxWaitMs) { int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port) { DEBUG_BSSL("connect(%s,%d)", ip.toString().c_str(), port); - clearLastError(); + clearLastError(); if (!WiFiClient::connect(ip, port)) { - setLastError(ERR_TCP_CONNECT); + setLastError(ERR_TCP_CONNECT); return 0; } return _connectSSL(nullptr); @@ -282,19 +282,19 @@ int WiFiClientSecure_light::connect(IPAddress ip, uint16_t port) { int WiFiClientSecure_light::connect(const char* name, uint16_t port) { DEBUG_BSSL("connect(%s,%d)\n", name, port); IPAddress remote_addr; - clearLastError(); + clearLastError(); if (!WiFi.hostByName(name, remote_addr)) { DEBUG_BSSL("connect: Name loopup failure\n"); - setLastError(ERR_CANT_RESOLVE_IP); + setLastError(ERR_CANT_RESOLVE_IP); return 0; } DEBUG_BSSL("connect(%s,%d)\n", remote_addr.toString().c_str(), port); if (!WiFiClient::connect(remote_addr, port)) { DEBUG_BSSL("connect: Unable to connect TCP socket\n"); - _last_error = ERR_TCP_CONNECT; + _last_error = ERR_TCP_CONNECT; return 0; } - LOG_HEAP_SIZE("Before calling _connectSSL"); + LOG_HEAP_SIZE("Before calling _connectSSL"); return _connectSSL(name); } @@ -355,7 +355,7 @@ size_t WiFiClientSecure_light::_write(const uint8_t *buf, size_t size, bool pmem } } while (size); - LOG_HEAP_SIZE("_write"); + LOG_HEAP_SIZE("_write"); return sent_bytes; } @@ -399,7 +399,7 @@ int WiFiClientSecure_light::read(uint8_t *buf, size_t size) { int avail = available(); bool conn = connected(); if (!avail && conn) { - return 0; // We're still connected, but nothing to read + return 0; // We're still connected, but nothing to read } if (!avail && !conn) { DEBUG_BSSL("read: Not connected, none left available\n"); @@ -434,7 +434,7 @@ int WiFiClientSecure_light::read() { int WiFiClientSecure_light::available() { if (_recvapp_buf) { - return _recvapp_len; // Anything from last call? + return _recvapp_len; // Anything from last call? } _recvapp_buf = nullptr; _recvapp_len = 0; @@ -443,7 +443,7 @@ int WiFiClientSecure_light::available() { } int st = br_ssl_engine_current_state(_eng); if (st == BR_SSL_CLOSED) { - return 0; // Nothing leftover, SSL is closed + return 0; // Nothing leftover, SSL is closed } if (st & BR_SSL_RECVAPP) { _recvapp_buf = br_ssl_engine_recvapp_buf(_eng, &_recvapp_len); @@ -620,24 +620,24 @@ static uint8_t htoi (unsigned char c) extern "C" { - // see https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c - void tohex(unsigned char * in, size_t insz, char * out, size_t outsz) { - unsigned char * pin = in; - static const char * hex = "0123456789ABCDEF"; - char * pout = out; - for(; pin < in+insz; pout +=3, pin++){ - pout[0] = hex[(*pin>>4) & 0xF]; - pout[1] = hex[ *pin & 0xF]; - pout[2] = ':'; - if (pout + 3 - out > outsz){ - /* Better to truncate output string than overflow buffer */ - /* it would be still better to either return a status */ - /* or ensure the target buffer is large enough and it never happen */ - break; - } - } - pout[-1] = 0; - } + // see https://stackoverflow.com/questions/6357031/how-do-you-convert-a-byte-array-to-a-hexadecimal-string-in-c + void tohex(unsigned char * in, size_t insz, char * out, size_t outsz) { + unsigned char * pin = in; + static const char * hex = "0123456789ABCDEF"; + char * pout = out; + for(; pin < in+insz; pout +=3, pin++){ + pout[0] = hex[(*pin>>4) & 0xF]; + pout[1] = hex[ *pin & 0xF]; + pout[2] = ':'; + if (pout + 3 - out > outsz){ + /* Better to truncate output string than overflow buffer */ + /* it would be still better to either return a status */ + /* or ensure the target buffer is large enough and it never happen */ + break; + } + } + pout[-1] = 0; + } // BearSSL doesn't define a true insecure decoder, so we make one ourselves @@ -648,12 +648,12 @@ extern "C" { // Private x509 decoder state struct br_x509_pubkeyfingerprint_context { const br_x509_class *vtable; - bool done_cert; // did we parse the first cert already? - bool fingerprint_all; - uint8_t *pubkey_recv_fingerprint; + bool done_cert; // did we parse the first cert already? + bool fingerprint_all; + uint8_t *pubkey_recv_fingerprint; const uint8_t *fingerprint1; const uint8_t *fingerprint2; - unsigned usages; // pubkey usage + unsigned usages; // pubkey usage br_x509_decoder_context ctx; // defined in BearSSL }; @@ -662,15 +662,15 @@ extern "C" { br_x509_pubkeyfingerprint_context *xc = (br_x509_pubkeyfingerprint_context *)ctx; // Don't process anything but the first certificate in the chain if (!xc->done_cert) { - br_x509_decoder_init(&xc->ctx, nullptr, nullptr, nullptr, nullptr); - } - (void)server_name; // ignore server name + br_x509_decoder_init(&xc->ctx, nullptr, nullptr, nullptr, nullptr); + } + (void)server_name; // ignore server name } // Callback for each certificate present in the chain (but only operates // on the first one by design). static void pubkeyfingerprint_start_cert(const br_x509_class **ctx, uint32_t length) { - (void) ctx; // do nothing + (void) ctx; // do nothing (void) length; } @@ -686,7 +686,7 @@ extern "C" { // Callback on individual cert end. static void pubkeyfingerprint_end_cert(const br_x509_class **ctx) { br_x509_pubkeyfingerprint_context *xc = (br_x509_pubkeyfingerprint_context *)ctx; - xc->done_cert = true; // first cert already processed + xc->done_cert = true; // first cert already processed } // **** Start patch Castellucci @@ -743,18 +743,18 @@ extern "C" { pubkeyfingerprint_pubkey_fingerprint(&sha1_context, xc->ctx.pkey.key.rsa); br_sha1_out(&sha1_context, xc->pubkey_recv_fingerprint); // copy to fingerprint - if (!xc->fingerprint_all) { - if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint1, 20)) { - return 0; - } - if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint2, 20)) { - return 0; - } - return 1; // no match, error - } else { - // Default (no validation at all) or no errors in prior checks = success. - return 0; - } + if (!xc->fingerprint_all) { + if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint1, 20)) { + return 0; + } + if (0 == memcmp_P(xc->pubkey_recv_fingerprint, xc->fingerprint2, 20)) { + return 0; + } + return 1; // no match, error + } else { + // Default (no validation at all) or no errors in prior checks = success. + return 0; + } */ // set fingerprint status byte to zero // FIXME: find a better way to pass this information @@ -796,7 +796,7 @@ extern "C" { xc->pubkey_recv_fingerprint[20] |= 2; // mark for update } if (!xc->pubkey_recv_fingerprint[20]) { - return 1; // not marked for update because no match, error + return 1; // not marked for update because no match, error } // the old fingerprint format matched, recompute new one for update @@ -822,9 +822,9 @@ extern "C" { // Set up the x509 insecure data structures for BearSSL core to use. void br_x509_pubkeyfingerprint_init(br_x509_pubkeyfingerprint_context *ctx, - const uint8_t *fingerprint1, const uint8_t *fingerprint2, - uint8_t *recv_fingerprint, - bool fingerprint_all) { + const uint8_t *fingerprint1, const uint8_t *fingerprint2, + uint8_t *recv_fingerprint, + bool fingerprint_all) { static const br_x509_class br_x509_pubkeyfingerprint_vtable PROGMEM = { sizeof(br_x509_pubkeyfingerprint_context), pubkeyfingerprint_start_chain, @@ -838,19 +838,19 @@ extern "C" { memset(ctx, 0, sizeof * ctx); ctx->vtable = &br_x509_pubkeyfingerprint_vtable; ctx->done_cert = false; - ctx->fingerprint1 = fingerprint1; - ctx->fingerprint2 = fingerprint2; - ctx->pubkey_recv_fingerprint = recv_fingerprint; - ctx->fingerprint_all = fingerprint_all; + ctx->fingerprint1 = fingerprint1; + ctx->fingerprint2 = fingerprint2; + ctx->pubkey_recv_fingerprint = recv_fingerprint; + ctx->fingerprint_all = fingerprint_all; } - // We limit to a single cipher to reduce footprint + // We limit to a single cipher to reduce footprint // we reference it, don't put in PROGMEM static const uint16_t suites[] = { #ifdef USE_MQTT_TLS_FORCE_EC_CIPHER - BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 + BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 #else - BR_TLS_RSA_WITH_AES_128_GCM_SHA256 + BR_TLS_RSA_WITH_AES_128_GCM_SHA256 #endif }; @@ -869,14 +869,14 @@ extern "C" { br_ssl_engine_set_hash(&cc->eng, br_sha256_ID, &br_sha256_vtable); br_ssl_engine_set_prf_sha256(&cc->eng, &br_tls12_sha256_prf); - // AES CTR/GCM small version, not contstant time (we don't really care here as there is no TPM anyways) - br_ssl_engine_set_gcm(&cc->eng, &br_sslrec_in_gcm_vtable, &br_sslrec_out_gcm_vtable); - br_ssl_engine_set_aes_ctr(&cc->eng, &br_aes_small_ctr_vtable); - br_ssl_engine_set_ghash(&cc->eng, &br_ghash_ctmul32); + // AES CTR/GCM small version, not contstant time (we don't really care here as there is no TPM anyways) + br_ssl_engine_set_gcm(&cc->eng, &br_sslrec_in_gcm_vtable, &br_sslrec_out_gcm_vtable); + br_ssl_engine_set_aes_ctr(&cc->eng, &br_aes_small_ctr_vtable); + br_ssl_engine_set_ghash(&cc->eng, &br_ghash_ctmul32); #ifdef USE_MQTT_TLS_FORCE_EC_CIPHER - // we support only P256 EC curve for AWS IoT, no EC curve for Letsencrypt unless forced - br_ssl_engine_set_ec(&cc->eng, &br_ec_p256_m15); // TODO + // we support only P256 EC curve for AWS IoT, no EC curve for Letsencrypt unless forced + br_ssl_engine_set_ec(&cc->eng, &br_ec_p256_m15); // TODO #endif static const char * alpn_mqtt = "mqtt"; br_ssl_engine_set_protocol_names(&cc->eng, &alpn_mqtt, 1); @@ -886,110 +886,110 @@ extern "C" { // Called by connect() to do the actual SSL setup and handshake. // Returns if the SSL handshake succeeded. bool WiFiClientSecure_light::_connectSSL(const char* hostName) { - // Validation context, either full CA validation or checking only fingerprints + // Validation context, either full CA validation or checking only fingerprints #ifdef USE_MQTT_TLS_CA_CERT - br_x509_minimal_context *x509_minimal; + br_x509_minimal_context *x509_minimal; #else br_x509_pubkeyfingerprint_context *x509_insecure; #endif - LOG_HEAP_SIZE("_connectSSL.start"); + LOG_HEAP_SIZE("_connectSSL.start"); - do { // used to exit on Out of Memory error and keep all cleanup code at the same place - // ============================================================ - // allocate Thunk stack, move to alternate stack and initialize - stack_thunk_light_add_ref(); - LOG_HEAP_SIZE("Thunk allocated"); - DEBUG_BSSL("_connectSSL: start connection\n"); - _freeSSL(); - clearLastError(); - if (!stack_thunk_light_get_stack_bot()) break; + do { // used to exit on Out of Memory error and keep all cleanup code at the same place + // ============================================================ + // allocate Thunk stack, move to alternate stack and initialize + stack_thunk_light_add_ref(); + LOG_HEAP_SIZE("Thunk allocated"); + DEBUG_BSSL("_connectSSL: start connection\n"); + _freeSSL(); + clearLastError(); + if (!stack_thunk_light_get_stack_bot()) break; - _ctx_present = true; - _eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr + _ctx_present = true; + _eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr - br_ssl_client_base_init(_sc.get()); + br_ssl_client_base_init(_sc.get()); - // ============================================================ - // Allocatte and initialize Decoder Context - LOG_HEAP_SIZE("_connectSSL before DecoderContext allocation"); - // Only failure possible in the installation is OOM - #ifdef USE_MQTT_TLS_CA_CERT - x509_minimal = (br_x509_minimal_context*) malloc(sizeof(br_x509_minimal_context)); - if (!x509_minimal) break; - br_x509_minimal_init(x509_minimal, &br_sha256_vtable, _ta_P, _ta_size); - br_x509_minimal_set_rsa(x509_minimal, br_ssl_engine_get_rsavrfy(_eng)); - br_x509_minimal_set_hash(x509_minimal, br_sha256_ID, &br_sha256_vtable); - br_ssl_engine_set_x509(_eng, &x509_minimal->vtable); + // ============================================================ + // Allocatte and initialize Decoder Context + LOG_HEAP_SIZE("_connectSSL before DecoderContext allocation"); + // Only failure possible in the installation is OOM + #ifdef USE_MQTT_TLS_CA_CERT + x509_minimal = (br_x509_minimal_context*) malloc(sizeof(br_x509_minimal_context)); + if (!x509_minimal) break; + br_x509_minimal_init(x509_minimal, &br_sha256_vtable, _ta_P, _ta_size); + br_x509_minimal_set_rsa(x509_minimal, br_ssl_engine_get_rsavrfy(_eng)); + br_x509_minimal_set_hash(x509_minimal, br_sha256_ID, &br_sha256_vtable); + br_ssl_engine_set_x509(_eng, &x509_minimal->vtable); uint32_t now = UtcTime(); uint32_t cfg_time = CfgTime(); if (cfg_time > now) { now = cfg_time; } br_x509_minimal_set_time(x509_minimal, now / 86400 + 719528, now % 86400); - #else - x509_insecure = (br_x509_pubkeyfingerprint_context*) malloc(sizeof(br_x509_pubkeyfingerprint_context)); - //x509_insecure = std::unique_ptr(new br_x509_pubkeyfingerprint_context); - if (!x509_insecure) break; - br_x509_pubkeyfingerprint_init(x509_insecure, _fingerprint1, _fingerprint2, _recv_fingerprint, _fingerprint_any); - br_ssl_engine_set_x509(_eng, &x509_insecure->vtable); - #endif - LOG_HEAP_SIZE("_connectSSL after DecoderContext allocation"); + #else + x509_insecure = (br_x509_pubkeyfingerprint_context*) malloc(sizeof(br_x509_pubkeyfingerprint_context)); + //x509_insecure = std::unique_ptr(new br_x509_pubkeyfingerprint_context); + if (!x509_insecure) break; + br_x509_pubkeyfingerprint_init(x509_insecure, _fingerprint1, _fingerprint2, _recv_fingerprint, _fingerprint_any); + br_ssl_engine_set_x509(_eng, &x509_insecure->vtable); + #endif + LOG_HEAP_SIZE("_connectSSL after DecoderContext allocation"); - // ============================================================ - // Set send/receive buffers - br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size); + // ============================================================ + // Set send/receive buffers + br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size); - // ============================================================ - // allocate Private key if needed, only if USE_MQTT_AWS_IOT - LOG_HEAP_SIZE("_connectSSL before PrivKey allocation"); - #ifdef USE_MQTT_AWS_IOT - // ============================================================ - // Set the EC Private Key, only USE_MQTT_AWS_IOT - // limited to P256 curve - br_ssl_client_set_single_ec(_sc.get(), _chain_P, 1, - _sk_ec_P, _allowed_usages, - _cert_issuer_key_type, &br_ec_p256_m15, br_ecdsa_sign_asn1_get_default()); - #endif // USE_MQTT_AWS_IOT + // ============================================================ + // allocate Private key if needed, only if USE_MQTT_AWS_IOT + LOG_HEAP_SIZE("_connectSSL before PrivKey allocation"); + #ifdef USE_MQTT_AWS_IOT + // ============================================================ + // Set the EC Private Key, only USE_MQTT_AWS_IOT + // limited to P256 curve + br_ssl_client_set_single_ec(_sc.get(), _chain_P, 1, + _sk_ec_P, _allowed_usages, + _cert_issuer_key_type, &br_ec_p256_m15, br_ecdsa_sign_asn1_get_default()); + #endif // USE_MQTT_AWS_IOT - // ============================================================ - // Start TLS connection, ALL - if (!br_ssl_client_reset(_sc.get(), hostName, 0)) break; + // ============================================================ + // Start TLS connection, ALL + if (!br_ssl_client_reset(_sc.get(), hostName, 0)) break; - auto ret = _wait_for_handshake(); - #ifdef DEBUG_ESP_SSL - if (!ret) { - DEBUG_BSSL("Couldn't connect. Error = %d\n", getLastError()); - } else { - DEBUG_BSSL("Connected! MFLNStatus = %d\n", getMFLNStatus()); - } - #endif - LOG_HEAP_SIZE("_connectSSL.end"); - _max_thunkstack_use = stack_thunk_light_get_max_usage(); - stack_thunk_light_del_ref(); - //stack_thunk_light_repaint(); - LOG_HEAP_SIZE("_connectSSL.end, freeing StackThunk"); + auto ret = _wait_for_handshake(); + #ifdef DEBUG_ESP_SSL + if (!ret) { + DEBUG_BSSL("Couldn't connect. Error = %d\n", getLastError()); + } else { + DEBUG_BSSL("Connected! MFLNStatus = %d\n", getMFLNStatus()); + } + #endif + LOG_HEAP_SIZE("_connectSSL.end"); + _max_thunkstack_use = stack_thunk_light_get_max_usage(); + stack_thunk_light_del_ref(); + //stack_thunk_light_repaint(); + LOG_HEAP_SIZE("_connectSSL.end, freeing StackThunk"); - #ifdef USE_MQTT_TLS_CA_CERT - free(x509_minimal); - #else - free(x509_insecure); - #endif - LOG_HEAP_SIZE("_connectSSL after release of Priv Key"); - return ret; - } while (0); + #ifdef USE_MQTT_TLS_CA_CERT + free(x509_minimal); + #else + free(x509_insecure); + #endif + LOG_HEAP_SIZE("_connectSSL after release of Priv Key"); + return ret; + } while (0); - // ============================================================ - // if we arrived here, this means we had an OOM error, cleaning up - setLastError(ERR_OOM); - DEBUG_BSSL("_connectSSL: Out of memory\n"); - stack_thunk_light_del_ref(); + // ============================================================ + // if we arrived here, this means we had an OOM error, cleaning up + setLastError(ERR_OOM); + DEBUG_BSSL("_connectSSL: Out of memory\n"); + stack_thunk_light_del_ref(); #ifdef USE_MQTT_TLS_CA_CERT - free(x509_minimal); + free(x509_minimal); #else - free(x509_insecure); + free(x509_insecure); #endif - LOG_HEAP_SIZE("_connectSSL clean_on_error"); - return false; + LOG_HEAP_SIZE("_connectSSL clean_on_error"); + return false; } }; From 00b3a9180a9de44af57a7954ee22d6edca5d0f2a Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Mon, 28 Dec 2020 15:54:28 -0800 Subject: [PATCH 026/255] Fix typo s/renegociation/renegotiation. --- tasmota/WiFiClientSecureLightBearSSL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/WiFiClientSecureLightBearSSL.cpp b/tasmota/WiFiClientSecureLightBearSSL.cpp index d7b53cf25..91f433c50 100755 --- a/tasmota/WiFiClientSecureLightBearSSL.cpp +++ b/tasmota/WiFiClientSecureLightBearSSL.cpp @@ -857,7 +857,7 @@ extern "C" { // Default initializion for our SSL clients static void br_ssl_client_base_init(br_ssl_client_context *cc) { br_ssl_client_zero(cc); - // forbid SSL renegociation, as we free the Private Key after handshake + // forbid SSL renegotiation, as we free the Private Key after handshake br_ssl_engine_add_flags(&cc->eng, BR_OPT_NO_RENEGOTIATION); br_ssl_engine_set_versions(&cc->eng, BR_TLS12, BR_TLS12); From 525e55ff6ef86bf608cb19daf66ff50d7affb3a7 Mon Sep 17 00:00:00 2001 From: Mike Harris Date: Tue, 29 Dec 2020 16:01:12 -0800 Subject: [PATCH 027/255] Change the pull pull request template branch to development. This was 'dev', I think it's supposed to be 'development'. This is similar to PR #10297. --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1cb3f42cd..e542181b9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -3,7 +3,7 @@ **Related issue (if applicable):** fixes # ## Checklist: - - [ ] The pull request is done against the latest dev branch + - [ ] The pull request is done against the latest development branch - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works on Tasmota core ESP8266 V.2.7.4.9 From a328f0e4de4d54bed62703d937911a64e66c2f98 Mon Sep 17 00:00:00 2001 From: Leon Wright Date: Tue, 29 Dec 2020 15:35:43 +0800 Subject: [PATCH 028/255] Only apply mcp230xx_oldoutpincount when USE_MCP230xx_OUTPUT set --- tasmota/xsns_29_mcp230xx.ino | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasmota/xsns_29_mcp230xx.ino b/tasmota/xsns_29_mcp230xx.ino index 6a960968a..27c91773b 100644 --- a/tasmota/xsns_29_mcp230xx.ino +++ b/tasmota/xsns_29_mcp230xx.ino @@ -196,6 +196,7 @@ void MCP230xx_ApplySettings(void) I2cWrite8(USE_MCP230xx_ADDR, MCP230xx_GPIO+mcp230xx_port, reg_portpins); #endif // USE_MCP230xx_OUTPUT } +#ifdef USE_MCP230xx_OUTPUT TasmotaGlobal.devices_present -= mcp230xx_oldoutpincount; mcp230xx_oldoutpincount = 0; for (uint32_t idx=0;idx Date: Wed, 30 Dec 2020 12:52:16 +0000 Subject: [PATCH 029/255] Allow up to 20s for an XHR request to succeed - only cancel & retry after that. Move refresh timer inside successful response. Applied to main menu and Console menu. Fixes times when commands are issued from Web Console, but get the XHR gets cancelled after the default 2.345s webrefresh time. --- tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h | 67 ++++++------- .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 42 ++++---- .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 54 +++++------ .../html_uncompressed/HTTP_SCRIPT_CONSOL.h | 97 ++++++++++--------- .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 16 +-- .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 27 +++--- 6 files changed, 156 insertions(+), 147 deletions(-) diff --git a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h index 91e1fab76..9138c4e8a 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h @@ -2,38 +2,39 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_CONSOL_SIZE = 853; -const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x82\x30\x2F\x83\xAD\xCE\x41\x1D" - "\xD1\x87\x78\xF6\x99\xDF\xD0\x67\x56\x1F\x0F\xB3\xEC\xEA\xA3\xC0\x61\x3B\xF9\x56" - "\x8D\x78\x2E\x8E\xE8\x54\x77\x8F\x14\x7C\x63\x8E\xE9\xF7\x47\x21\xF6\x77\x8F\x05" - "\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7\x74\xFB\x0C\xE4\x3E\xCE" - "\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0\x78\x23\x21\x65\xF2\xD2" - "\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3\xC0\x21\x45\x3E\x1F\x67" - "\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD\x2A\x01\xF1\xEE\x3E\x02" - "\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE\x3D\xBA\x60\xEE\x9B\x0F" - "\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD\x3B\xC7\x83\xDC\x6C\x3E" - "\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F\xD4\x77\x4E\xF1\xE0\xD8" - "\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08\x7C\x28\x1D\xD0\x41\xCA" - "\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F" - "\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\x03\x69\xD4\x21\xE0\x43\xE1\xB0\xE9\xF7\xE1\x99" - "\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4\x3B\x0E\xF1\xE0\xB4\x43" - "\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44\x92\x7C\x3E\x1C\x67\x78" - "\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13\xE1\xEA\x14\x7E\x02\x2E" - "\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xDE\x1E\x4F\x71\xE0\xD8\x74\xC1\x8F\x8E\xE9\xF6" - "\x43\xC4\xCA\x8F\xB3\xA8\xFB\x0F\xC7\x68\x33\x94\x7C\x3E\xCE\xD9\x68\x87\x6F\x0E" - "\xAA\xF8\xB6\x77\x8F\x06\xC3\xA7\x9F\x08\x77\x4E\xF1\xE0\xF7\x05\x47\xCF\x3A\x04" - "\x4E\x4A\x4E\xA3\xE8\x43\xBC\x78\xFB\xA1\x7F\xE4\x62\xC2\xF3\x3C\x1E\xE1\xF0\x8E" - "\xE8\x47\x78\xF0\x67\x7F\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF0\x23\xF2\xF4\x28\xEE" - "\x9D\xE3\xDA\x08\x7C\xA2\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F\xCE\xE9\xF6" - "\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE2\xDD\x82\x0F\x12\xA3\x81\x13\x97\xB3\xA8" - "\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2\x0C\xFF\x1F" - "\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13\xA6\x7C\x3E" - "\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76\xC3\xE3\xF0" - "\x50\x60\x85\xC4\x31\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E\x04\x2E\x2E" - "\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C\x67\xC3\xE1" - "\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78\x41\xC9\x67" - "\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28\x33\xA0\xCC" - "\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x44\x01\x0B\x1C\x3B\xC7\x50\x7C\x7C" - "\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0"; +const size_t HTTP_SCRIPT_CONSOL_SIZE = 913; +const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x3D\xA1\x3A\x5E\xE3\xE1\xC6\x75\x16\x88\x7C\x38\xCE\xA2\x31\x47\x83\x02\xF8\x3A" + "\xDC\xE4\x11\xDD\x18\x77\x8F\x68\x4E\x90\x67\x56\x1F\x0F\xB3\xEC\xF0\x18\x4E\xFE" + "\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE0\x49\x9A\x62\x8E\xF1\xE2\x8F\x8C\x71\xDD\x3E" + "\xE8\xE4\x3E\xCE\xF1\xE0\xB4\xC1\xDD\x18\x7C\x3E\x1C\x87\x78\xF6\x90\x67\xC6\x38" + "\xEE\x9F\x61\x9C\x87\xD9\xDE\x3C\x16\x1F\x0F\xB3\xF4\x19\xC8\x7C\x3E\xCE\xD9\x3E" + "\x0F\x04\x64\x2C\xBE\x5A\x41\xE0\xD1\x99\xCF\xA8\xEE\x86\x74\x33\xB0\x85\xB3\xBC" + "\x78\x04\x28\xA7\xC3\xEC\xFB\x3C\x51\xD3\xC1\xFF\x02\x08\xAB\x06\x1F\x0E\x22\x37" + "\xA0\x1E\x3D\xC7\xC0\x46\xA2\x78\x3D\xDA\x60\xEE\x82\x34\xC3\xF0\xF9\xEE\x3B\xC7" + "\xB7\x4C\x1D\xD3\x61\xFC\x3E\x70\xB0\x82\x3B\xC7\xB4\xD8\x74\xB1\xD9\xFA\x3B\xA7" + "\x78\xF0\x7B\x8D\x87\xCE\x63\xE8\x8D\x84\x34\x82\x21\x55\x43\x0B\xEC\xD4\x2D\xFA" + "\x8E\xE9\xDE\x3C\x1B\x0E\x99\xDF\x76\x21\x97\xAA\xE9\x86\x2A\x2B\xF8\x79\x9F\x01" + "\x0F\x85\xF3\xBA\x08\x39\x51\xD3\xEE\xC4\x32\x2F\x55\xD3\x3E\x1F\x0E\x61\xFA\x3F" + "\x44\x6C\x3A\x7A\xAE\x85\xF8\xF8\x7C\x39\x4D\x90\x20\xF0\xFE\x6D\x3A\x84\x3C\x08" + "\x7C\x36\x1D\x3E\xFC\x33\x3B\xCC\xA9\x9B\x28\xE9\xE1\x81\x6D\x1D\xD3\xB0\xF7\x1C" + "\x87\x61\xDE\x3C\x16\x88\x7C\x10\xE9\xE1\x5A\x62\x8E\xE9\xDE\x3C\x69\x83\xBA\x08" + "\x92\x4F\x87\xC3\x8C\xEF\x1E\xD2\xA0\x45\xE1\x44\xF7\x1B\x41\x27\x05\x36\x9D\x02" + "\x7C\x3D\x42\x8F\xC0\x45\xC0\xCE\xD9\xF0\xDA\x78\x3D\xC0\xB9\xC3\xC8\x26\x71\xF4" + "\x15\x1F\x3C\xE8\x11\x39\x1D\x3A\x8F\xA1\x0E\xF1\xE0\xF7\x1E\xE3\xC1\xB0\xE9\x83" + "\x1F\x1D\xD3\xEC\x87\x89\x95\x1F\x67\x51\xF6\x1F\x8E\xD0\x67\x28\xF8\x7D\x9D\xB2" + "\xD1\x0E\xDE\x1D\x55\xF1\x6C\xEF\x1E\x0D\x87\x4F\x3E\x10\xEE\x9D\xE3\xC1\x80\x4A" + "\xC7\x4E\x53\x6D\x9D\xE3\xC1\xEE\x2F\xBA\x17\xFE\x46\x2C\x2F\x33\xC1\xEE\x1F\x08" + "\xEE\x84\x77\x8F\x01\x3A\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF1\xF0\xE3\x20\x45\xE6" + "\xC4\x51\xDD\x3B\xC7\xB4\x10\xF9\x6D\x3A\x58\x82\x13\x33\x7D\x44\x16\xFA\x9F\x3F" + "\x9D\xD3\xEC\xD1\x99\x09\x83\xFC\x7D\x9D\x40\x89\xC6\xFB\x04\x1E\x2F\x47\x02\x27" + "\x34\x67\x50\x67\xC6\x74\x34\x66\x44\x1E\x08\xCF\x1A\x60\xEE\x9C\xBF\x9F\x0F\x84" + "\x19\xFE\x3F\xC7\x31\x9F\x0F\x84\x19\xDE\x3D\xA3\x8E\x96\x2E\xB0\x3C\x1A\x30\x27" + "\x4C\xF8\x7D\xE1\x83\x07\xD9\xE0\xF7\x1C\xBF\x9F\x0F\x84\x19\xDA\x3B\xA7\x6C\xED" + "\x87\xC7\xE0\xA0\xC1\x0B\x8A\xE3\xF4\x7E\x8E\xE8\x7C\x7C\x04\x49\x67\x78\xEA\x1C" + "\x08\x5C\x71\x0A\x0C\xF7\x83\xE3\xAC\xE4\x3D\xF3\xFC\x7F\x8F\xB3\xEC\xEF\x1E\x78" + "\xCF\x87\xC2\x0C\xED\x1D\xD3\x8C\xFC\x3A\xCE\xB2\x0F\x81\x07\x10\x38\xC8\x14\xF0" + "\x83\x92\xCF\x87\xC2\x0C\xFD\x1F\xA3\xBA\x08\x99\x89\xF8\x72\x23\xF4\x7E\x88\x50" + "\x67\x41\x98\x30\xEE\x9D\xE3\xA8\x50\x67\x41\x7C\x08\x3C\x9C\x02\x16\x38\x77\x8E" + "\xA0\xF8\xF8\x71\x9D\xE3\xDC\x77\x8F\x07\xB8\x87\xC2\x3B\xA2\x8E\xF1\xE0\xF7\x1B"; #define HTTP_SCRIPT_CONSOL Decompress(HTTP_SCRIPT_CONSOL_COMPRESSED,HTTP_SCRIPT_CONSOL_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index 2f61ce116..d7a530b43 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -2,26 +2,26 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 524; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x69\x9D\xFD\x59\xF0\xFB\x3E\xCF\x1A" - "\x60\xEE\x85\x67\x4B\xF8\xF0\xB1\xAF\xAB\xC7\x40\x9F\x0F\x50\xA3\xE1\xF0\xE4\x3B" - "\xC7\xB4\xAC\xF8\x30\xF0\x18\x4E\xFE\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE3\xC1\xEE" - "\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE" - "\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3" - "\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xDA" - "\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F" - "\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x80\x7F\x1F\x0D\x87" - "\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B" - "\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C" - "\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2" - "\x85\x02\x4D\x71\xA0\x83\x5C\xEC\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36" - "\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E" - "\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC" - "\x3D\x04\xD3\x30\x43\xCE\xE9\x9B\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6" - "\x75\x1D\x63\xEF\x47\x85\x51\xE6\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77" - "\x8E\x85\xBD\xCF\xE4\x28\xA8\x86\x90\x47\xCF\x1E\x0F\x71\xEE\x3C\x1B\x0E\x98\x31" - "\xF1\xDD\x3E\xC8\x78\x99\x51\xF6\x75\x1F\x67\x43\xB4\x34\xF8\x72\x1F\x67\x6C\xAC" - "\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x02\xA3\xE7\x9D\x02\x27" - "\x23\x96\x75\x1F\x42\x1D\xE3\xC1\xEE"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 574; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x3D\xA1\x3A\x46\x28\xF0\x60\x5F\x07\x5B\x9C\x82\xB3\xBA\x30\xEF\x1E\xDB\x3E\x0C" + "\x3F\xC7\xF8\xFB\x3E\xCF\x01\x84\xEF\xE5\x5A\x35\xE0\xBA\x3B\xA6\x28\xEF\x02\x4C" + "\xD0\xA8\xEF\x1E\x34\xC1\xDD\x36\x1F\xC3\xE7\x0B\x08\x23\xBC\x7B\x4D\x87\x4B\x1D" + "\x9F\xA3\xBA\x77\x8F\x71\xB0\xF9\xCC\x7D\x11\xB0\x86\x90\x44\x2A\x2B\xA8\x61\x7D" + "\x9A\x85\xBF\x51\xDD\x3B\xC7\x83\x61\xD3\x3B\xEE\xC4\x32\xF5\x5D\x30\xC5\x5F\x0F" + "\x33\xE0\x21\xEA\xE7\x74\xEF\x1E\xDD\x30\x77\x4D\x87\x4F\xBB\x10\xC8\xBD\x57\x4C" + "\xF8\x7C\x39\x87\xE8\xFD\x11\xB0\xE9\xEA\xBA\x17\xE3\xE1\xF0\xE5\x36\x77\x8F\x69" + "\x19\xDF\xD7\x8F\x86\xC3\xA7\xDF\x86\x67\x79\x95\x33\x65\x1D\x3E\xC6\x05\x61\xB3" + "\xBA\x76\x1E\xDA\x3D\xC7\x60\xF1\xD4\x7B\x0F\x4A\xB1\xC1\x35\xEA\x32\x09\x9F\x0F" + "\xB1\xFD\x12\x85\x1E\x67\x23\x67\xD1\xF4\x7D\x9F\x87\xB0\xEF\x10\x23\x61\x5E\x04" + "\x2C\x2B\xE7\xE1\xE9\x42\x81\x26\xB8\xD0\x41\xAE\x76\x50\xA3\xF0\xF4\xA1\x01\x27" + "\x27\x39\x4C\x86\x1B\x0F\x03\xE2\xB6\x99\xD7\xE1\x96\x1B\x3C\xFB\x07\xFF\x63\x01" + "\x2B\x39\x60\x87\x8F\x08\x7E\x1E\x87\x65\x7C\x12\x6C\x86\x7B\x8E\xC1\xE3\xA8\xF6" + "\x1F\x47\xD1\xF6\x7E\x1E\x82\x69\x98\x21\xE7\x74\xCD\x94\x75\xD8\x5A\x3D\xC7\x98" + "\x6F\xA9\xFC\xF0\x63\x3A\x8E\xB1\xF7\xA3\xC2\xA8\xF3\x3D\x87\x78\xF0\xC7\x1D\xD3" + "\xEC\x23\x90\xFB\x3B\xC7\x42\xDE\xE7\xF2\x14\x54\x43\x48\x23\xE7\x81\x7B\x90\x10" + "\xA8\xF9\xE7\x40\x89\x3A\xCE\xA3\xE8\x43\xBC\x78\x3D\xC7\xB8\xF0\x6C\x3A\x60\xC7" + "\xC7\x74\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3" + "\xAA\xBE\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x30\x09\x78\xD1\xCA\x6D" + "\xB3\xBC\x78\x3D\xC7\xB8"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index bb52fbbcd..1481a609c 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -2,32 +2,32 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 744; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x78\x23\x02\xF8\x3A\xDC\xE4\x15\x9D\xD1\x87\x78" - "\xF6\x99\xDF\xD5\x9F\x0F\xB3\xEC\xF1\xA6\x0E\xE8\x56\x74\xBF\x8F\x0B\x1A\xFA\xBC" - "\x74\x09\xF0\xF5\x0A\x3E\x1F\x0E\x43\xBC\x7B\x4A\xCF\x83\x0F\x01\x84\xEF\xE5\x5A" - "\x35\xE0\xBA\x3B\xA1\x51\xDE\x3C\x1E\xED\x30\x77\x4D\x87\xF0\xF9\xC2\xC2\x08\xEF" - "\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36\x10\xD2" - "\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8\x86\x5E" - "\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\xA0\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0\xE9\xF7" - "\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC\x7C\x3E" - "\x1C\xA6\xC8\x10\x78\x07\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\xD8" - "\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56\x38\x26\xBD\x46" - "\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0\xF6\x1D\xE2\x04" - "\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE\xCA\x14\x7E\x1E" - "\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32\xC3\x67\x9F\x60" - "\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D\x90\xCF\x71\xD8" - "\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99\xB2\x8E\xBB\x0B" - "\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E\x67\xB0\xEF\x1E" - "\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88\x69\x04\x7C\xF1" - "\xE0\xF7\x1E\xE3\xC6\x98\x47\x77\xE6\x3C\x28\xEF\x23\xDA\x6C\x3A\x60\xC7\xC7\x74" - "\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3\xAA\xBE" - "\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x0A\x8F\x9E\x74\x08\x9C\x93\xD9" - "\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x02\x27\x2E\x9E\x66\x76\x77\x46\x5F\xCE\xAD\x33" - "\xBF\x9D\xE3\xDA\x15\x9D\xD3\xEC\xFD\x78\xCC\xF8\x7D\x9D\xBD\x33\xBF\x9D\xB3\xEC" - "\xFD\x9F\x67\x6C\x65\xFC\xEF\x1E\x01\x1B\x0D\xD0\x48\xC3\x41\x0B\x9C\x40\x53\xC5" - "\x3E\x63\xC2\x8F\x87\x19\x02\x36\x36\x33\xE7\x74\xC1\xDE\x3D\xBA\x61\x1D\xD3\x07" - "\x79\x1E\xD0\x50\xDE\x81\x0B\x2F\x3D\xC9\x85\xE6\x8F\x68\x26\x73\xD0\x08\x79\x81" - "\xEE"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 844; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x09\xD2\xF9\x8F\x0A\x3E\x1C\x87\x51\x18\xA3\xC1\x81\x7C\x1D\x6E\x72\x0A\xCE\xE8" + "\xC3\xBC\x7B\x6C\xF8\x30\xFF\x1F\xE3\xEC\xFB\x3C\x06\x13\xBF\x95\x68\xD7\x82\xE8" + "\xEE\x98\xA3\xBC\x09\x33\x42\xA3\xBC\x78\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E" + "\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D" + "\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65" + "\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xD6\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F" + "\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3" + "\xE1\xCA\x6C\xEF\x1E\xD2\x33\xBF\xAF\x1F\x0D\x87\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66" + "\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63" + "\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F" + "\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2\x85\x02\x4D\x71\xA0\x83\x5C\xEC" + "\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C" + "\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9" + "\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC\x3D\x04\xD3\x30\x43\xCE\xE9\x9B" + "\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6\x75\x1D\x63\xEF\x47\x85\x51\xE6" + "\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77\x8E\x85\xBD\xCF\xE4\x28\xA8\x86" + "\x90\x47\xCF\x03\x01\xE4\x0B\xE6\x3C\x28\xEF\x1E\xD0\xA8\xF9\xE7\x40\x89\x5E\xCE" + "\xA3\xE8\x43\xBC\x78\x3D\xC7\xB8\xF7\x02\x2D\xE3\x61\xD3\x06\x3E\x3B\xA7\xD9\x0F" + "\x13\x2A\x2B\x3E\xCE\xA3\xEC\xE8\x76\x86\x9F\x0E\x43\xEC\xED\x95\x9D\x55\xF1\x6C" + "\xEF\x1E\x0D\x87\x4F\x3E\x10\xEE\x9D\xE3\xC1\x80\x4B\xC9\x0E\x53\x6D\x9D\xE3\xC1" + "\xEE\x3D\xC4\x08\x9C\xD3\x79\x99\xD9\xDD\x19\x7F\x3A\xB4\xCE\xFE\x77\x8F\x68\x56" + "\x77\x4F\xB3\xF5\xE3\x33\xE1\xF6\x76\xF4\xCE\xFE\x76\xCF\xB3\xF6\x7D\x9D\xB1\x97" + "\xF3\xBC\x78\x04\x6C\x37\x41\x23\x0D\x04\x1E\x7E\x4F\x2A\x01\xA7\x8A\x7C\xC7\x85" + "\x1F\x0E\x32\x04\x6C\x6C\x67\xCE\xE9\x83\xBC\x7B\x74\xC1\xDD\x30\x77\x8F\x68\x26" + "\x70\xBA\x09\x9C\x3F\x82\x87\x0C\xA0\x85\xA7\x9E\xE6\x17\x98\x2F\x64\x2A\x01\x87" + "\xAF\x9E\xE3"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h index 51cfb66a3..0351e828e 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h @@ -1,49 +1,54 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = - "var sn=0,id=0;" // Scroll position, Get most of weblog initially - "function l(p){" // Console log and command service - "var c,o='',t;" - "clearTimeout(lt);" - "t=eb('t1');" - "if(p==1){" - "c=eb('c1');" // Console command id - "o='&c1='+encodeURIComponent(c.value);" - "c.value='';" - "t.scrollTop=99999;" - "sn=t.scrollTop;" + "{" + "let sn=0,id=0,ft;" // Scroll position, Get most of weblog initially + "function l(p){" // Console log and command service + "let c,o='';" + "clearTimeout(lt);" + "clearTimeout(ft);" + "t=eb('t1');" + "if(p==1){" + "c=eb('c1');" // Console command id + "o='&c1='+encodeURIComponent(c.value);" + "c.value='';" + "t.scrollTop=99999;" + "sn=t.scrollTop;" + "}" + "if(t.scrollTop>=sn){" // User scrolled back so no updates + "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) + "x=new XMLHttpRequest();" + "x.onreadystatechange=function(){" + "if(x.readyState==4&&x.status==200){" + "let z,d;" + "d=x.responseText.split(/}1/);" // Field separator + "id=d.shift();" + "if(d.shift()==0){t.value='';}" + "z=d.shift();" + "if(z.length>0){t.value+=z;}" + "t.scrollTop=99999;" + "sn=t.scrollTop;" + "clearTimeout(ft);" + "lt=setTimeout(l,%d);" // webrefresh timer.... + "}" + "};" + "x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp)) + "x.send();" + "ft=setTimeout(l,20000);" // fail timeout, triggered 20s after asking for XHR + "}" + "return false;" "}" - "if(t.scrollTop>=sn){" // User scrolled back so no updates - "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) - "x=new XMLHttpRequest();" - "x.onreadystatechange=function(){" - "if(x.readyState==4&&x.status==200){" - "var z,d;" - "d=x.responseText.split(/}1/);" // Field separator - "id=d.shift();" - "if(d.shift()==0){t.value='';}" - "z=d.shift();" - "if(z.length>0){t.value+=z;}" - "t.scrollTop=99999;" - "sn=t.scrollTop;" - "}" - "};" - "x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp)) - "x.send();" - "}" - "lt=setTimeout(l,%d);" - "return false;" - "}" - "wl(l);" // Load initial console text + "wl(l);" // Load initial console text - // Console command history - "var hc=[],cn=0;" // hc = History commands, cn = Number of history being shown - "function h(){" -// "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete - "eb('c1').addEventListener('keydown',function(e){" - "var b=eb('c1'),c=e.keyCode;" // c1 = Console command id - "if(38==c||40==c){b.autocomplete='off';}" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete - "38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp - "40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown - "13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history - "});" - "}" - "wl(h);"; // Add console command key eventlistener after name has been synced with id (= wl(jd)) + // Console command history + "let hc=[],cn=0;" // hc = History commands, cn = Number of history being shown + "function h(){" + // "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete + "eb('c1').addEventListener('keydown',function(e){" + "let b=eb('c1'),c=e.keyCode;" // c1 = Console command id + "if(38==c||40==c){b.autocomplete='off';}" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete + "38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp + "40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown + "13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history + "});" + "}" + "wl(h);" // Add console command key eventlistener after name has been synced with id (= wl(jd)) + "}"; diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index 729bb54a5..dd2cdc796 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -1,11 +1,9 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = + "{let ft;" "function la(p){" - "var a='';" - "if(la.arguments.length==1){" - "a=p;" - "clearTimeout(lt);" - "}" - "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) + "a=p||'';" + "clearTimeout(ft);clearTimeout(lt);" + "if(x!=null){x.abort()}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" "if(x.readyState==4&&x.status==200){" @@ -16,9 +14,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>
hasArg("m") "x.send();" - "lt=setTimeout(la,%d);" // Settings.web_refresh - "}"; + "ft=setTimeout(la,20000);" // 20s failure timeout + "}}"; diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index 2d76a8c91..ddb5e6941 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -1,11 +1,8 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = - "var rfsh=1;" + "let rfsh=1,ft;" "function la(p){" - "var a='';" - "if(la.arguments.length==1){" - "a=p;" - "clearTimeout(lt);" - "}" + "a=p||'';" + "clearTimeout(ft);clearTimeout(lt);" "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" @@ -17,12 +14,16 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>
hasArg("m") "x.send();" - "lt=setTimeout(la,%d);" // Settings.web_refresh + "ft=setTimeout(la,20000);" // 20s failure timeout "}" "}" "function seva(par,ivar){" @@ -34,11 +35,13 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = "rfsh=0;" "}" "function pr(f){" - "if (f) {" + "if(f){" + "clearTimeout(lt);clearTimeout(ft);" "lt=setTimeout(la,%d);" "rfsh=1;" - "} else {" - "clearTimeout(lt);" + "}else{" + "clearTimeout(lt);clearTimeout(ft);" "rfsh=0;" "}" - "}"; + "}" + ; From ebbfc900e11b00577b582dbae6b68594885c6fee Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:27:04 +0100 Subject: [PATCH 030/255] Create Odroid_flash.bat --- tools/Esptool/odroid_go/Odroid_flash.bat | 1 + 1 file changed, 1 insertion(+) create mode 100644 tools/Esptool/odroid_go/Odroid_flash.bat diff --git a/tools/Esptool/odroid_go/Odroid_flash.bat b/tools/Esptool/odroid_go/Odroid_flash.bat new file mode 100644 index 000000000..eb1f160b3 --- /dev/null +++ b/tools/Esptool/odroid_go/Odroid_flash.bat @@ -0,0 +1 @@ +esptool.py --chip esp32 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions_ffat_12M.bin 0xe000 boot_app0.bin 0x10000 tasmota32.bin From 8f40741feb7f293c0b8dcc1154b1c094a56b1d11 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:28:28 +0100 Subject: [PATCH 031/255] Add files via upload --- tools/Esptool/odroid_go/boot_app0.bin | Bin 0 -> 8192 bytes tools/Esptool/odroid_go/bootloader_dout_40m.bin | Bin 0 -> 17072 bytes tools/Esptool/odroid_go/partitions_ffat_12M.bin | Bin 0 -> 3072 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/Esptool/odroid_go/boot_app0.bin create mode 100644 tools/Esptool/odroid_go/bootloader_dout_40m.bin create mode 100644 tools/Esptool/odroid_go/partitions_ffat_12M.bin diff --git a/tools/Esptool/odroid_go/boot_app0.bin b/tools/Esptool/odroid_go/boot_app0.bin new file mode 100644 index 0000000000000000000000000000000000000000..13562cabb9648287fdf70d2a22789fdf1e4156b4 GIT binary patch literal 8192 zcmeI#u?+wq2n0Z!&B7Ip%ZdwNPjZydJlFk*h+E9ra}_6R0t5&UAV7cs0RjXF5FkLH gk-)3}W&dyVhNuJx5FkK+009C72oNAZfWSu}0Te{nn*aa+ literal 0 HcmV?d00001 diff --git a/tools/Esptool/odroid_go/bootloader_dout_40m.bin b/tools/Esptool/odroid_go/bootloader_dout_40m.bin new file mode 100644 index 0000000000000000000000000000000000000000..267abf3dac6673a45831d387e0c66b6b754d62cb GIT binary patch literal 17072 zcmd73eOy%4_AtKBnPE809CHSc6!3OtbYM`(;YC5y%RpSz^xivBqM4hv-etit-aS?d+ql%->6kwi-xiNK(6_tCK54Q4JZ-*;vpT4fc(cp(aoSXsPj)5=ZdMH|bxx$`&~bgWwgS!71(`uiO-Hf~*&4|HA9GUHt|^(Zdj0(y)~|D{E8jGuc>VhFvh_v4w{p|w z4I9>PET6Gyu+IqO!lHEZiQEzn#g64p&_E-G8SxvZ!hXiJMWm6G3W-QZX~ z1`$$Pv~EqAgEP+K{;*{6;{U6<+EiL3sftLAE_1Bo%v=UHZyslbc5NtHv$FWXa>u5t zkkFNDHm$^FLF>$1?&3e*ylCapKNjTOhFr6(GcpMIpJ}XwhqC|w{9UDQkUwqatd%98 zcThC^{d*p^4Dg#vN*o*ipV0Y6=>GNhgW9i>wPbBs*-AMB?67S8mepnVtz7-!>M~IN zTrNE=b5`d6K|9&BeziOZXKXBAy|R4m{SL_}5Rl|3DqFdBUAbf9x}q|v-}rD_c_Jb4 z*8c2h2=N@m5LoZ!>{agmZ1HhXBzl-feip?w022;u9^%^}EQ7ED!iMuh*)gk*5yBF( ztcuv!XNm38XNZll_GfbtUdzK*+IfXg9V2 z+P(NKO#hUf2l*>dUgGzQ*lhCi8={y75`(_$K(|0&;SaNIpv3H6Xd@4?8sbJP@IY`w zcmhH@;3h)Y03jKI9YQ_eX%00i5;c@#2i{c}Kn}o-C#3%kkkJp7wtpZH+XxB(_VK`r z;Wofgt#(4b`%V-qJ_)lmLWuuIm`xA1LLjsoHMRi60qAcv#L0+YN&qS*@E`tqJ zM~1PcDrf_nCd5h=GJMU{5{p%sh)@gTxn6X)>OC={dl#10AeZKe0$9JwWZ;qzn*_y{ zEU*eXg-0v#MEr_J^Y1*%tU@Rx*Aon3JtLuO>lp<2+IoQD9776YuV=@d7{}hp9u$TV zAwhBMLqb4;SQgX2jO9#cw+lZhIhg)&EN2nhDtxEpVEUV}oSWEP!k0=8rq5$~??;ln zI^k4^2YKHIsUkA-)D>tI@Kt`5Le-PebTQ*LYT|f$_p> zt0=rCDlStA-*?$3q8Qc9);a zI?uVf{r-M3#lYt|xn6GmVZ-rv=O3o`AJ*txKuL)6SctS5_-P!g&EE=eZw4D@JJjtS zw)OtKJ>3sgwx8^0V>MFQEXY(L3-Dl0Lnu!0ii zIo(UR%-5n0F4;em&YY>y-;Z-ovnA+H#$GyS$!E`{NCp6AjfCD<;Xyv^y}21^u_=gLP}Bt3wZOkB?_vUDGv zp8+eI?bGdPUh2u2w0922M(#gMu{1Y@3-V+=hE~@ zEZ5|l-$5^p(xfmjAZVhqu-YCR94Xp)S~NklU3T#ix@nInycdLdCk4=e!?j~PDI6kc zrtmhpIVirklVKx)gQX{5!Z53d#GIzuXme0(${|hNT=NJdC^r5GBCnImsrZ*vR^J@P z>D9n&QerVWy%YIX&gor+Ump)&77=|57?=|Gpa4(@jweqLMz)0(UJAn4F}BK(XLrzD zr#J3KsD<|K2|L$na6hs6QiB0zbN+E0lL=W730t)Z6LpfHCJ;6a0!l8mwT@<;^f=yS z0MgzpRt57z#m{;J*B1~?^mT~`sfwRdR7eamxab5%XDLod)0X7wu!ymM?av`LTRA(C z)jqA|>MO0=cS4CT*5^1?OkymB1jt!LW>aif{v>E0 z=kTUFg4S7jVNKA*R7YjAT1bITAzm%TH!QyHtg7qoAggQB2`dp*dmJ+F#uU~|h)@`u z4YnfOfhg-Nf6;Bhd(%s)Ra?ASs@dUjOKfR5e-6u>xl^(M=y)#?79lAnZo!1@E$)a4 zOlBRGqJ?tiBd(2h{4AnnNqWt>Ihd;^g&CTh++b!#QBGFSmaFIZ{_W|)Z-d*@t=7xH zHw*b7o{4c#1#+vqvShha5mnm?nO2Di^aAM=DLpYYIq1BZ*i3#%%rQX@=0X5n3g#ea zI%X@4vi?RQ*9w!B*d)afLVU1p0jU@iqJv|57`wfk@cfRmJ6~FC#;W8DJRhXsfn@c&q5HEh) z7J9s|Y3saHHKp2~w_c(t~;tt``synO8yy+#SUp*gVDX?|;XatryNY+FMA4n+1 z^Zp3#y5M`w?(XCmEWC$=^$hGk8<4eu*?U~V=oDB7$WEs2718~ayup;=wlP@nk9gid zmYRsM_`enSh!P*hxHCdHGy+qlOnN{;bzVWeuAp8ULkasN6vHlbKP5{i)$Z9d;y$FW zYa*lAu9qY_7B>q|>De9aa$8uSKEryNN8D%i_xA7xh^7nd`cq9PyvkcQ+GdCw`qwxDyCvM!_QyG8Gp`S%Kmhb5*&= z81KtSt8CfZ4u(fR}!8!s{*$H*WY5gtF2`LD`RQZ~S z6PC#rCQtP8ybS$deL2V6B^Dkewhy>u_6XgkG9Q#?g;@gm>(6Qs3a7VHb+?!6@QQjL zC&XikX>U@nLQI)m)JB;FarXnM6Hs^;%s~#8%~z4|(r|W?yVvUXm-9kS;e}8q4U~hT zGsH=gA z+v47Fz$w#ktbxuuRK-iz$gRU&J%I`M3z09Tc&? zy+y;m>fye}#Ch77dzljy8`sxJ3bjm6EXdQo-LSo~j-hK8CQQ1eX9B5XRJC^`yfeNh zjF9??E=z-{CQSn(O6lC10?jy5p=&>&FFBO#c4tg)0Kq$f>_Ae@Y^Nz9&gCplkopPA zDQtjcfO1;s2D&CPuGK|VPjk1a`f5dKzcadic9D6sg^o!JhYg;}aT*M-@DmLiAqc~; zV75_xWn%5UOksI*x>A>}fF zGuer$8-`)Uo_q;NnwN_ST2p(g!RzBq(}>QLHYLGoIxmj{LQH#}R+3|50+;gpu-m{+ z)?(cB+y!AWCOnzL!W!)421WySMYD?NiZAEyT(DzrQ@0+(kGX~H@b!Hy!rrfWShT$= zE#JUiL=G5ShQ^jQs+lE?b9U^7#NWi))+1^dneT`@e9d2qx;$9>ey{pU{dU~V`EXw- zbDP6t?kq#&bHK!ma=)u^Hy;J=zH?&kTU44UAv5DxM;8OKG`}OuV*Xt0_Q8s}!zbK` z@|*u9f=!fwvP_n=*;JB2!;*>%)jPFWxt0P6hDHZ6vnD`yR__}>J)KK$cTKUR*8pig z9DV5|NLZ*WgEWq%af@@g3ClL#Fw8PF(6iEBq3|?0HF>ye^6-j9zRAOmrHqY>jsaZU zaM#4)6?gh34x0-Z+s2&yIIu&bVYrlDwJIY%Y}FFKed%gr6zbSQ7v_ppVT7yVbH)$b z7I>{rZM#*0mBNStYDS|1SQ(8Ct>G;@-Ad5L|C-#XJ<@_Kwp$9Oi{sKzoD($d+R z08GhnVfY}5h-0HLk~-Bt)HOWR;T3%SL%3sK%*6atm-GG50=13LIOj6Vt>An8AFUwW z-Yt;0v)9i@H!`O#4R!qhOi%c}MyBS4%-)MbusgjZ3ZD(ZhKJ8!2cMjH-Kh&hU0(uO zz3=RhV?NXVyrEeof-S(&2#zz&-;2ighb%PQWYwNN_1RF@CqVj)@AOb}9s?Ot`x7Gj zLGUvOEToMmt{~|uH91#j*mbk;&d~On7RDS3?N-N`UUz;2q;lW<`Vdj@V)X4jFqV(w z$)I*NtHZ6w;X|bj$uu#FcX}rajYqi<>Kb?wo74|Y;|9@cILPnt?dm~>ujslS`HU%5ho(N@9wm^ z{PQCCn|AusxhHqVJsHU$e;eKRzGza%)kYQ^osr? zqtJji46$*J8^qdJ<2oP%+k)W>7ch=lBAo7fTYDyx4lmA6XefY@+YeRVB=6b4iH>{_^9bj8fo3M1qHSwg& zTBB`@@$*mg9`nEDcRo+}-qmdy$1!n{=>$DLtpnEaS<;d(ofp0!&>PMi8?5472L}`D zSy+i-3c$Xq*8pZ&NkjC>4!+JXrlQkaV6FmZQ(ai>*S+P-16F$!(U@ z=|gkUgs`E^&KpvvK{B)R`qZSMIi`6`V&^!x4}!%Kt`n)qHByh($9vSfIF}js`>9?;kOaXjCNae?d>tG zaCn}4srL02gZUS+b{9LL2l@_O#LrJypC67g#0Z+9 z>O_jwtXfqLrtG1H<|mk~%NNFWl)g659elTneqqTOH{7 zo(6gFY!~hTEiAt!-B#lND&{>jD-=jRa~aRUykz`Lnw*ShA(GK#mX8#4hl;%v8~#|h zy{eM8m){}i3P#gT?~gS(kA>T+Dy{eIU; zMOyn&uG7<^cAP}wZ=(y;Ve!n;PP)fVmZ=MlPQ1gzhV_gi-A8F#Z+mf+T68F?ebumHxc_X zKMXl@d#LyL33X=<=&TD%xOZH^)XcOg6x^OwrICWEB-J>WIU%xfzoRYm>AheR;pX>& zu7@Tu)iBn`h8MX$pO~hOi>ahxZb+M&Ij1#Q2WD&zhF~i+6b_qRZIkz0>+`}I)C}0M zN-X?HlVDne{bGXFnA%My6^@7Z#lzaiXqJ|&fiL!EX~K)cANbSY)^He(50npXz22H> zovn#8O`mB?Z_m2fnwFE9_EFpt$*@f7utf77ERzi{_R+96X2a3GD}Dj{1_k%V6cr7Q z$=v)`dBKJb%SEwLG&oL8J`~AENnnDtvev3fw95%K`4YI&hmL;r&HhRbZfXEw|VCL_vkj4Gdpt@Q48{F9Kp=5R=g60gRH}XE9QCKYY3sS3U`gN0C1LsB$t8Kd4G8~K z3jJcNP&*&pyUbotjy7j6Fvcx`n|5HUvv%X@(UYJ1l{7qUtq%EG*e@qRo z4b9((p3?#0xKhorv1*`rP%rA{3lV0&>r0j88g&dJ6fPK7pX;tXzx`2AQ%@SIsqag% zCmHS+fn`W6Jg#$kZ&=zgS9mtS@6-!-2jCgT^C}kaTnmRLly{#jZ;Kj`yCW3Eyzcs{ z;OM!uH@W;sFl{$7^N&)<+>FdM5&z%qfA&9>2kkHL63?!H;6Z+{PvO5LDJ(?pd&l2J zP*2sVD;6M~XuuLAd-6RNaC|IwcxS@uF9-oJROb`|SHm@`(fJ(q548D1QP_&bf|+?{ z2ZTS3*0t%Hx|&bRwZQl>ZVABV=#(gJ9S6liEu4Z(O@y1GPojJq0_KxqYFWUz2H9uR zLNUgYO{K04z|{7hD3l_qo-y7N7=01zgfo|U049;zktA0an%?ND$-G+km_ND%%uSTC$<9z6w5rCda(Z(#-U?uhsIqRFa*YPC<`aTv5 zcd6}b{2NNT*TO0eZ*%tUoDCmy)?P378t>x*%^!*v4?eUct^^i%IH}J19P;fS_#uDV zYraVV*bPD>j$hpfxglWNoIS7bQMC=e4z&=4{mp9b(&R_L;rew$`$oQf9}i2BFb;F> z(tbJzmL1p!^!+H_rR}{puEe%EXUnV)gmBDGfxDT}IwV^qw-HYcqAo=E>IS^8U{CGF*Ia-<2N>(y9kC@qYo-z5k67Z! zRzSgp?PCM7?bJm0-c_W@lcafXOd8M00ijo^Zxzmci3kAiO5l~OE5dhJ;hib*zA?rN zg!NjbC8=1i?&_BKURT&=A)C{CXjB0`uqc!HTgQ1i281@bYFO64E**1@#%1?yl?iabR>@oca6cT=#^=rK5 zI@HN|q{qQHNvRzN?g!Ht9l;w1gnKa$ z4Ck(azB;iM9>1l%1-zM+VTOx_ErZQvFs>b#=JKo^aJ!m#=ZD790nXxti4Vqsu|%db zI)H+u*-3oTPMi`k&r>uY+%1mp8I9A+dYLy0H`Hn;>-2?lKXo{ zP~+X#)MXzyWgqZ9=j_vm3cHE%56I9|EWK!zM6$+32=9hn8}OBwSmT1LU}OFjK-yc$ za>CyJmt5S~!?_jHw@GQf9Q0J!!hHHKAr;wR4$U0klHkH|sx6(erlFm}>y}hcBqvxD zni&es2B0w^O_D-m;)EL%nnZ=h`zspZdWC>f2u@yG(N!`#@UCF0+Y5CD{b0rV?Ge>3#RD+m8Bz^{TZ z5rPI-i5`6mZ2<8Q;NFo~3CXg757|BeE+N5z4E{C%Uj+m)+Yd!kA@mT-I|t=}`=a

%d6q!o_?tm$Z^8S(_XFKtFPuT~cxA^j;KF5C#A0{ReWwEO zNJE)F2p}Kaoi3Ce*RVJV&X?WL>U`AbV(y0#%~X6dIzoXG_zLUP!d#hExJilUDDiA1 z&QfC8J&zG)Dez1s&XD8Dmju~ej}g+8oKz*YD)9^@zEO!&lsH+5r^~UTD{$+BMhnxV zuNkxI8DXkeUGr1(=|O+1K`@E@!KU_he3Ca^rQ;?q5mX4nn{yL9vk**obPurcEHjU3 zpIceiJ?O5jF#xab2`?xxBV zRo(GH_YP$4y^yfoz;-0Y8rai`yP|uLYm}9Zhf_JgF)yR@0nDgutoa+!@zvO!7P@_H z%Sfj*LLzEsR+gzzaLG z9!#}xS9lxccxJ#nnZQEO_nio3e2Qf_{DXZT4zdrkTJxtE#rFMUkX?jLdS`I&dm%u- zIcNr&{~i>2CI2_Z^Df2>j7N6zixA#HUp+w8MD(p6G-n6En)^Nw;ac!VPzK&AD(@u% ziC?_;jS!s6-;-Lwz%f=|@2yJ$4UYGIW4Cg|yVg$N5OIupec6}7>mhJ-x`1e|6wzE! zR0`$k2np?>>I36W?G1J94Xx1m_J;a&lxOcKx;@nOQfNh-@1>AK3lDIi>a=mEUJiA= z5Lz+a_d>`VF^X#mb@@UoZu0p;ec_a^G1S!<^7i^!ov=<(@eV1D6>1b%j$?&t1%3u& zqwG9L3x6GT2c+RG=t;~1jnvbE2k??|XrEispSCOjn<~g`&`K1e*^YnW*+Dz@wgmO? z|22VgQRmtX?HxJ%A+F=ypsz9{RAS+d&Vkxkn3v#j3C>7Dq1-jXk`Rm?;bDYa%)o^x z;UPH*9ux@{?Ft6Z_AAgA#Ob}{DG$MBv3}BSs=-hP_mMe-uQv$mLoF0^C%6+ii-_4v zyx!=O+bPd|fQC16aF*IlnVSKtJ_p#6tFWC0^Q_T1P$@JurW0UIE6FSY+GvNkGwhS2TD4l|7_nd@d1hk8XDvn)W=a zApa4Bq2+Fj2JxJ)Ji?pwAQLQFAIX(VH7A3ck)CDPSoiiytmpu`#hN(Q0v}0NoL}wz zl;ZZP^@pgF?{eI8(biVVe~{z;5^Zmw+IMqYb@T=o<*ny9r`qkJz=Vu11i_iuxDTrt zd)IWVA$<-~xQnoHZ8}`+?||E8xJafPSwz?ugmtZ}BX|lDtxoeJ1J*+Z?{i1Jhq(BH z#GCZVk^4KslTYvOKzGUbCiz7x84gfz$Dbt3_CSSD6+8(}pHLF1VdIjwo1Y=6O^9@< zj6RS?Z=$AfChR1@C8<2Sq`U~@Q*z$aOD0Om!y`I4Q~w1sECOdX+s4=;WIsq3o$3x+ zvn1<9YXkT(fFchyKrLwyF!6~)6L8nWvIFs2K!K$h#BKb(NQN26+z7;hTlmqGz zVvzxM3X_5`+rb-L4e{L<^fo!owXlJ5@FXj>qf6f+cw3$@KS+9G%`b^fUHZP~h^bo? zijdb-N)`uW{%LdocMs-yeg0K9VyBt6HG8 zEl}5WgR?gqc7K?=w9@wI&U=_BAzf}xfsfelKqVKHl9I@1a4Cc|c*qqrUBL_U5D7Or zbAvD&bM9!X5kq@X68kS;n1m#YwyU_NYJNLO?)pTZvL ziVXU6K{#o%WThy-RDpoAhdvw}U66x25~VnRJzr+&WHbXqceKu?r&9gu$mi zO!)hVa={P=PDwg+g~YuPA-Z%}OT!TsM9FIimNfdSsIO&*!Fs0P714eN%)JKi?uL>U zG9{6Q-($O%F{U;VrdCKMF^wwYW#oq8l9&UXga>d8FyF}zkKj|`J;WS~mG+fh zL^G21_q|Hp@BXT+V@g@0NARPV&vDUy6XmYMN~8=6`u5eq-9z-rbc1{6Rrrbqz}sxm zm-4`S`6|5UnUPWcQ5nF+5ZfE!Y_^Twx4@OmOC#_Y(JBkPWowk@1(^u^?qnjkc2dTI z=UFAo3t3W+N8nP_;Z-+zON2&jdGa{ew8MV0M5ssbw09S~SX!z|geMTej$>bz^W6&A zD}%KND)oRbe9U>$?S&au1(z5XrA@d{ft6brPbIW#Y)AmikHMqu1b%qykBQV6C3nAi z+PUYA(S4b5GZq6ox$+TMITphYhfrrVbmQvOJj`*aOnV;TERwCMV0RA_n(PgzGI@E< zg2YLxxzmItvb@GjWXhtUph~$Q<6TMxE3g7*Ga0P`q{B6Nx>O6jn1%^jzAvjBmD@N~ z&cm9n$pk)OGUkEp&PV50uI}nnVm;%0MT7>HM24As1b0U?@8pbnfj%C}EnmN*blcs1bON*24$Ofn;EKR6frLy3)Wc)91s`|M2@1 zD=ZhXN+O!PDnWl$9~ys>U3oaX-G)7FuFp0V;#7x1kBwlDxfmUbk1LSm@8_u5{YFjct@|?ni{-{+c}SHp)~Qp7YbNtwf)52_cx? z^Cz&IZNKx|^Yr#SgDqbYGn}0xe1v=`ZZ?V=j^dg%a0VQcHooW2Vc=nPwJ2_Oe^vPZ zD6E@(`?U8>_OLA5F%+Oc~lOOsTG$#wM{7n|$X`V+%25!_p<3twyyws$oh}y7U~POzd(Usdq`TsrVfe5+<5z z7bIA+s#ua*jo7p)#AO$hz35 zHik`t-%_k#*qcEDc9KQ|^?;P@6ba0y@l1ulId)P5y*qL?xI~WXNywFCVLWSx!Lj(s zdNus)#KduYKaqZoCCtHW{COdaH!eBnO2*xz8FHK8-FgLfg0B$q@T&1LzR&0?dHxCI zB%}3NhG8cp+zJD(gLkHSvs1xyN#{zPf*kNZeZ9oVq%It`&c-{>zOw_%tv&Se&N1rKdjKucJ&?uWH9A$$=4V0%WO5jW< zSD}_@HCL*5XQ&Uabf8@GDKYgJlA-b3G$E!E78|PhE3x^{Vo4NjeoRa=k;3;$hlzfD zx}_z}+=q)$N!0btkBg3nMe_*}+_0NF#3qvpgmx2BGKDr@Mj9v^T|`I!)(C>dwr=h8 hxEBr_KDJl)LCo^Evu{8Auy(%Y{auIVtXf$AzX6zD7<~W$ literal 0 HcmV?d00001 diff --git a/tools/Esptool/odroid_go/partitions_ffat_12M.bin b/tools/Esptool/odroid_go/partitions_ffat_12M.bin new file mode 100644 index 0000000000000000000000000000000000000000..4389fdc62b75f3347aea8a05b5dcfe4effe8a70e GIT binary patch literal 3072 zcmZ1#z{tcffq{V`fPo>etQg2Z1*-xW85kY_#S|DA@=Fp^5=#cs$r04 zNGvEYK#>G;fbxQ1%@BD*OnJse1_pbe@Ii*Ow8Rp0`PZ-iqk#IL9ZU2Uo#PUTtDWo2 m_dy6na+EU~0;3@?8UmvsFd71*Aut*OqaiRF0;3^-Hv|CwXI*0e literal 0 HcmV?d00001 From 0fac4044c3c4145c44dd8b877b0e6d0c5351a445 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:37:14 +0100 Subject: [PATCH 032/255] Odroid-go files --- .github/workflows/Tasmota_build.yml | 2 ++ .github/workflows/Tasmota_build_master.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index fe06a70d2..8bf360bcc 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1560,6 +1560,7 @@ jobs: mkdir -p ./firmware/tasmota/languages mkdir -p ./firmware/tasmota32/languages mkdir -p ./firmware/tasmota32/ESP32_needed_files/ + mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./mv_firmware/tasmota.* ] || mv ./mv_firmware/tasmota.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-sensors.* ] || mv ./mv_firmware/tasmota-sensors.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-minimal.* ] || mv ./mv_firmware/tasmota-minimal.* ./firmware/tasmota/ @@ -1581,6 +1582,7 @@ jobs: rm ./firmware/tasmota32/*.gz rm ./firmware/tasmota32/languages/*.gz [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ + [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md - name: Commit files # transfer the new binaries back into the repository run: | diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 4169bd028..cdf6ccc99 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1560,6 +1560,7 @@ jobs: mkdir -p ./firmware/tasmota/languages mkdir -p ./firmware/tasmota32/languages mkdir -p ./firmware/tasmota32/ESP32_needed_files/ + mkdir -p ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./mv_firmware/tasmota.* ] || mv ./mv_firmware/tasmota.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-sensors.* ] || mv ./mv_firmware/tasmota-sensors.* ./firmware/tasmota/ [ ! -f ./mv_firmware/tasmota-minimal.* ] || mv ./mv_firmware/tasmota-minimal.* ./firmware/tasmota/ @@ -1581,6 +1582,7 @@ jobs: rm ./firmware/tasmota32/*.gz rm ./firmware/tasmota32/languages/*.gz [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ + [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md - name: Commit files # transfer the new binaries back into the repository run: | From 8d9541320a215e77229f67ae0ca9b4d54f335ccf Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:38:35 +0100 Subject: [PATCH 033/255] Delete Odroid_flash.bat --- tools/Esptool/odroid_go/Odroid_flash.bat | 1 - 1 file changed, 1 deletion(-) delete mode 100644 tools/Esptool/odroid_go/Odroid_flash.bat diff --git a/tools/Esptool/odroid_go/Odroid_flash.bat b/tools/Esptool/odroid_go/Odroid_flash.bat deleted file mode 100644 index eb1f160b3..000000000 --- a/tools/Esptool/odroid_go/Odroid_flash.bat +++ /dev/null @@ -1 +0,0 @@ -esptool.py --chip esp32 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions_ffat_12M.bin 0xe000 boot_app0.bin 0x10000 tasmota32.bin From b83c5abbe957d9e95e83b55bd546dac50e83929e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:38:44 +0100 Subject: [PATCH 034/255] Delete boot_app0.bin --- tools/Esptool/odroid_go/boot_app0.bin | Bin 8192 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/Esptool/odroid_go/boot_app0.bin diff --git a/tools/Esptool/odroid_go/boot_app0.bin b/tools/Esptool/odroid_go/boot_app0.bin deleted file mode 100644 index 13562cabb9648287fdf70d2a22789fdf1e4156b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeI#u?+wq2n0Z!&B7Ip%ZdwNPjZydJlFk*h+E9ra}_6R0t5&UAV7cs0RjXF5FkLH gk-)3}W&dyVhNuJx5FkK+009C72oNAZfWSu}0Te{nn*aa+ From 190276f5c7eef13be43c698abf7cbd09eb1b0e4a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:38:53 +0100 Subject: [PATCH 035/255] Delete bootloader_dout_40m.bin --- tools/Esptool/odroid_go/bootloader_dout_40m.bin | Bin 17072 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/Esptool/odroid_go/bootloader_dout_40m.bin diff --git a/tools/Esptool/odroid_go/bootloader_dout_40m.bin b/tools/Esptool/odroid_go/bootloader_dout_40m.bin deleted file mode 100644 index 267abf3dac6673a45831d387e0c66b6b754d62cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17072 zcmd73eOy%4_AtKBnPE809CHSc6!3OtbYM`(;YC5y%RpSz^xivBqM4hv-etit-aS?d+ql%->6kwi-xiNK(6_tCK54Q4JZ-*;vpT4fc(cp(aoSXsPj)5=ZdMH|bxx$`&~bgWwgS!71(`uiO-Hf~*&4|HA9GUHt|^(Zdj0(y)~|D{E8jGuc>VhFvh_v4w{p|w z4I9>PET6Gyu+IqO!lHEZiQEzn#g64p&_E-G8SxvZ!hXiJMWm6G3W-QZX~ z1`$$Pv~EqAgEP+K{;*{6;{U6<+EiL3sftLAE_1Bo%v=UHZyslbc5NtHv$FWXa>u5t zkkFNDHm$^FLF>$1?&3e*ylCapKNjTOhFr6(GcpMIpJ}XwhqC|w{9UDQkUwqatd%98 zcThC^{d*p^4Dg#vN*o*ipV0Y6=>GNhgW9i>wPbBs*-AMB?67S8mepnVtz7-!>M~IN zTrNE=b5`d6K|9&BeziOZXKXBAy|R4m{SL_}5Rl|3DqFdBUAbf9x}q|v-}rD_c_Jb4 z*8c2h2=N@m5LoZ!>{agmZ1HhXBzl-feip?w022;u9^%^}EQ7ED!iMuh*)gk*5yBF( ztcuv!XNm38XNZll_GfbtUdzK*+IfXg9V2 z+P(NKO#hUf2l*>dUgGzQ*lhCi8={y75`(_$K(|0&;SaNIpv3H6Xd@4?8sbJP@IY`w zcmhH@;3h)Y03jKI9YQ_eX%00i5;c@#2i{c}Kn}o-C#3%kkkJp7wtpZH+XxB(_VK`r z;Wofgt#(4b`%V-qJ_)lmLWuuIm`xA1LLjsoHMRi60qAcv#L0+YN&qS*@E`tqJ zM~1PcDrf_nCd5h=GJMU{5{p%sh)@gTxn6X)>OC={dl#10AeZKe0$9JwWZ;qzn*_y{ zEU*eXg-0v#MEr_J^Y1*%tU@Rx*Aon3JtLuO>lp<2+IoQD9776YuV=@d7{}hp9u$TV zAwhBMLqb4;SQgX2jO9#cw+lZhIhg)&EN2nhDtxEpVEUV}oSWEP!k0=8rq5$~??;ln zI^k4^2YKHIsUkA-)D>tI@Kt`5Le-PebTQ*LYT|f$_p> zt0=rCDlStA-*?$3q8Qc9);a zI?uVf{r-M3#lYt|xn6GmVZ-rv=O3o`AJ*txKuL)6SctS5_-P!g&EE=eZw4D@JJjtS zw)OtKJ>3sgwx8^0V>MFQEXY(L3-Dl0Lnu!0ii zIo(UR%-5n0F4;em&YY>y-;Z-ovnA+H#$GyS$!E`{NCp6AjfCD<;Xyv^y}21^u_=gLP}Bt3wZOkB?_vUDGv zp8+eI?bGdPUh2u2w0922M(#gMu{1Y@3-V+=hE~@ zEZ5|l-$5^p(xfmjAZVhqu-YCR94Xp)S~NklU3T#ix@nInycdLdCk4=e!?j~PDI6kc zrtmhpIVirklVKx)gQX{5!Z53d#GIzuXme0(${|hNT=NJdC^r5GBCnImsrZ*vR^J@P z>D9n&QerVWy%YIX&gor+Ump)&77=|57?=|Gpa4(@jweqLMz)0(UJAn4F}BK(XLrzD zr#J3KsD<|K2|L$na6hs6QiB0zbN+E0lL=W730t)Z6LpfHCJ;6a0!l8mwT@<;^f=yS z0MgzpRt57z#m{;J*B1~?^mT~`sfwRdR7eamxab5%XDLod)0X7wu!ymM?av`LTRA(C z)jqA|>MO0=cS4CT*5^1?OkymB1jt!LW>aif{v>E0 z=kTUFg4S7jVNKA*R7YjAT1bITAzm%TH!QyHtg7qoAggQB2`dp*dmJ+F#uU~|h)@`u z4YnfOfhg-Nf6;Bhd(%s)Ra?ASs@dUjOKfR5e-6u>xl^(M=y)#?79lAnZo!1@E$)a4 zOlBRGqJ?tiBd(2h{4AnnNqWt>Ihd;^g&CTh++b!#QBGFSmaFIZ{_W|)Z-d*@t=7xH zHw*b7o{4c#1#+vqvShha5mnm?nO2Di^aAM=DLpYYIq1BZ*i3#%%rQX@=0X5n3g#ea zI%X@4vi?RQ*9w!B*d)afLVU1p0jU@iqJv|57`wfk@cfRmJ6~FC#;W8DJRhXsfn@c&q5HEh) z7J9s|Y3saHHKp2~w_c(t~;tt``synO8yy+#SUp*gVDX?|;XatryNY+FMA4n+1 z^Zp3#y5M`w?(XCmEWC$=^$hGk8<4eu*?U~V=oDB7$WEs2718~ayup;=wlP@nk9gid zmYRsM_`enSh!P*hxHCdHGy+qlOnN{;bzVWeuAp8ULkasN6vHlbKP5{i)$Z9d;y$FW zYa*lAu9qY_7B>q|>De9aa$8uSKEryNN8D%i_xA7xh^7nd`cq9PyvkcQ+GdCw`qwxDyCvM!_QyG8Gp`S%Kmhb5*&= z81KtSt8CfZ4u(fR}!8!s{*$H*WY5gtF2`LD`RQZ~S z6PC#rCQtP8ybS$deL2V6B^Dkewhy>u_6XgkG9Q#?g;@gm>(6Qs3a7VHb+?!6@QQjL zC&XikX>U@nLQI)m)JB;FarXnM6Hs^;%s~#8%~z4|(r|W?yVvUXm-9kS;e}8q4U~hT zGsH=gA z+v47Fz$w#ktbxuuRK-iz$gRU&J%I`M3z09Tc&? zy+y;m>fye}#Ch77dzljy8`sxJ3bjm6EXdQo-LSo~j-hK8CQQ1eX9B5XRJC^`yfeNh zjF9??E=z-{CQSn(O6lC10?jy5p=&>&FFBO#c4tg)0Kq$f>_Ae@Y^Nz9&gCplkopPA zDQtjcfO1;s2D&CPuGK|VPjk1a`f5dKzcadic9D6sg^o!JhYg;}aT*M-@DmLiAqc~; zV75_xWn%5UOksI*x>A>}fF zGuer$8-`)Uo_q;NnwN_ST2p(g!RzBq(}>QLHYLGoIxmj{LQH#}R+3|50+;gpu-m{+ z)?(cB+y!AWCOnzL!W!)421WySMYD?NiZAEyT(DzrQ@0+(kGX~H@b!Hy!rrfWShT$= zE#JUiL=G5ShQ^jQs+lE?b9U^7#NWi))+1^dneT`@e9d2qx;$9>ey{pU{dU~V`EXw- zbDP6t?kq#&bHK!ma=)u^Hy;J=zH?&kTU44UAv5DxM;8OKG`}OuV*Xt0_Q8s}!zbK` z@|*u9f=!fwvP_n=*;JB2!;*>%)jPFWxt0P6hDHZ6vnD`yR__}>J)KK$cTKUR*8pig z9DV5|NLZ*WgEWq%af@@g3ClL#Fw8PF(6iEBq3|?0HF>ye^6-j9zRAOmrHqY>jsaZU zaM#4)6?gh34x0-Z+s2&yIIu&bVYrlDwJIY%Y}FFKed%gr6zbSQ7v_ppVT7yVbH)$b z7I>{rZM#*0mBNStYDS|1SQ(8Ct>G;@-Ad5L|C-#XJ<@_Kwp$9Oi{sKzoD($d+R z08GhnVfY}5h-0HLk~-Bt)HOWR;T3%SL%3sK%*6atm-GG50=13LIOj6Vt>An8AFUwW z-Yt;0v)9i@H!`O#4R!qhOi%c}MyBS4%-)MbusgjZ3ZD(ZhKJ8!2cMjH-Kh&hU0(uO zz3=RhV?NXVyrEeof-S(&2#zz&-;2ighb%PQWYwNN_1RF@CqVj)@AOb}9s?Ot`x7Gj zLGUvOEToMmt{~|uH91#j*mbk;&d~On7RDS3?N-N`UUz;2q;lW<`Vdj@V)X4jFqV(w z$)I*NtHZ6w;X|bj$uu#FcX}rajYqi<>Kb?wo74|Y;|9@cILPnt?dm~>ujslS`HU%5ho(N@9wm^ z{PQCCn|AusxhHqVJsHU$e;eKRzGza%)kYQ^osr? zqtJji46$*J8^qdJ<2oP%+k)W>7ch=lBAo7fTYDyx4lmA6XefY@+YeRVB=6b4iH>{_^9bj8fo3M1qHSwg& zTBB`@@$*mg9`nEDcRo+}-qmdy$1!n{=>$DLtpnEaS<;d(ofp0!&>PMi8?5472L}`D zSy+i-3c$Xq*8pZ&NkjC>4!+JXrlQkaV6FmZQ(ai>*S+P-16F$!(U@ z=|gkUgs`E^&KpvvK{B)R`qZSMIi`6`V&^!x4}!%Kt`n)qHByh($9vSfIF}js`>9?;kOaXjCNae?d>tG zaCn}4srL02gZUS+b{9LL2l@_O#LrJypC67g#0Z+9 z>O_jwtXfqLrtG1H<|mk~%NNFWl)g659elTneqqTOH{7 zo(6gFY!~hTEiAt!-B#lND&{>jD-=jRa~aRUykz`Lnw*ShA(GK#mX8#4hl;%v8~#|h zy{eM8m){}i3P#gT?~gS(kA>T+Dy{eIU; zMOyn&uG7<^cAP}wZ=(y;Ve!n;PP)fVmZ=MlPQ1gzhV_gi-A8F#Z+mf+T68F?ebumHxc_X zKMXl@d#LyL33X=<=&TD%xOZH^)XcOg6x^OwrICWEB-J>WIU%xfzoRYm>AheR;pX>& zu7@Tu)iBn`h8MX$pO~hOi>ahxZb+M&Ij1#Q2WD&zhF~i+6b_qRZIkz0>+`}I)C}0M zN-X?HlVDne{bGXFnA%My6^@7Z#lzaiXqJ|&fiL!EX~K)cANbSY)^He(50npXz22H> zovn#8O`mB?Z_m2fnwFE9_EFpt$*@f7utf77ERzi{_R+96X2a3GD}Dj{1_k%V6cr7Q z$=v)`dBKJb%SEwLG&oL8J`~AENnnDtvev3fw95%K`4YI&hmL;r&HhRbZfXEw|VCL_vkj4Gdpt@Q48{F9Kp=5R=g60gRH}XE9QCKYY3sS3U`gN0C1LsB$t8Kd4G8~K z3jJcNP&*&pyUbotjy7j6Fvcx`n|5HUvv%X@(UYJ1l{7qUtq%EG*e@qRo z4b9((p3?#0xKhorv1*`rP%rA{3lV0&>r0j88g&dJ6fPK7pX;tXzx`2AQ%@SIsqag% zCmHS+fn`W6Jg#$kZ&=zgS9mtS@6-!-2jCgT^C}kaTnmRLly{#jZ;Kj`yCW3Eyzcs{ z;OM!uH@W;sFl{$7^N&)<+>FdM5&z%qfA&9>2kkHL63?!H;6Z+{PvO5LDJ(?pd&l2J zP*2sVD;6M~XuuLAd-6RNaC|IwcxS@uF9-oJROb`|SHm@`(fJ(q548D1QP_&bf|+?{ z2ZTS3*0t%Hx|&bRwZQl>ZVABV=#(gJ9S6liEu4Z(O@y1GPojJq0_KxqYFWUz2H9uR zLNUgYO{K04z|{7hD3l_qo-y7N7=01zgfo|U049;zktA0an%?ND$-G+km_ND%%uSTC$<9z6w5rCda(Z(#-U?uhsIqRFa*YPC<`aTv5 zcd6}b{2NNT*TO0eZ*%tUoDCmy)?P378t>x*%^!*v4?eUct^^i%IH}J19P;fS_#uDV zYraVV*bPD>j$hpfxglWNoIS7bQMC=e4z&=4{mp9b(&R_L;rew$`$oQf9}i2BFb;F> z(tbJzmL1p!^!+H_rR}{puEe%EXUnV)gmBDGfxDT}IwV^qw-HYcqAo=E>IS^8U{CGF*Ia-<2N>(y9kC@qYo-z5k67Z! zRzSgp?PCM7?bJm0-c_W@lcafXOd8M00ijo^Zxzmci3kAiO5l~OE5dhJ;hib*zA?rN zg!NjbC8=1i?&_BKURT&=A)C{CXjB0`uqc!HTgQ1i281@bYFO64E**1@#%1?yl?iabR>@oca6cT=#^=rK5 zI@HN|q{qQHNvRzN?g!Ht9l;w1gnKa$ z4Ck(azB;iM9>1l%1-zM+VTOx_ErZQvFs>b#=JKo^aJ!m#=ZD790nXxti4Vqsu|%db zI)H+u*-3oTPMi`k&r>uY+%1mp8I9A+dYLy0H`Hn;>-2?lKXo{ zP~+X#)MXzyWgqZ9=j_vm3cHE%56I9|EWK!zM6$+32=9hn8}OBwSmT1LU}OFjK-yc$ za>CyJmt5S~!?_jHw@GQf9Q0J!!hHHKAr;wR4$U0klHkH|sx6(erlFm}>y}hcBqvxD zni&es2B0w^O_D-m;)EL%nnZ=h`zspZdWC>f2u@yG(N!`#@UCF0+Y5CD{b0rV?Ge>3#RD+m8Bz^{TZ z5rPI-i5`6mZ2<8Q;NFo~3CXg757|BeE+N5z4E{C%Uj+m)+Yd!kA@mT-I|t=}`=a

%d6q!o_?tm$Z^8S(_XFKtFPuT~cxA^j;KF5C#A0{ReWwEO zNJE)F2p}Kaoi3Ce*RVJV&X?WL>U`AbV(y0#%~X6dIzoXG_zLUP!d#hExJilUDDiA1 z&QfC8J&zG)Dez1s&XD8Dmju~ej}g+8oKz*YD)9^@zEO!&lsH+5r^~UTD{$+BMhnxV zuNkxI8DXkeUGr1(=|O+1K`@E@!KU_he3Ca^rQ;?q5mX4nn{yL9vk**obPurcEHjU3 zpIceiJ?O5jF#xab2`?xxBV zRo(GH_YP$4y^yfoz;-0Y8rai`yP|uLYm}9Zhf_JgF)yR@0nDgutoa+!@zvO!7P@_H z%Sfj*LLzEsR+gzzaLG z9!#}xS9lxccxJ#nnZQEO_nio3e2Qf_{DXZT4zdrkTJxtE#rFMUkX?jLdS`I&dm%u- zIcNr&{~i>2CI2_Z^Df2>j7N6zixA#HUp+w8MD(p6G-n6En)^Nw;ac!VPzK&AD(@u% ziC?_;jS!s6-;-Lwz%f=|@2yJ$4UYGIW4Cg|yVg$N5OIupec6}7>mhJ-x`1e|6wzE! zR0`$k2np?>>I36W?G1J94Xx1m_J;a&lxOcKx;@nOQfNh-@1>AK3lDIi>a=mEUJiA= z5Lz+a_d>`VF^X#mb@@UoZu0p;ec_a^G1S!<^7i^!ov=<(@eV1D6>1b%j$?&t1%3u& zqwG9L3x6GT2c+RG=t;~1jnvbE2k??|XrEispSCOjn<~g`&`K1e*^YnW*+Dz@wgmO? z|22VgQRmtX?HxJ%A+F=ypsz9{RAS+d&Vkxkn3v#j3C>7Dq1-jXk`Rm?;bDYa%)o^x z;UPH*9ux@{?Ft6Z_AAgA#Ob}{DG$MBv3}BSs=-hP_mMe-uQv$mLoF0^C%6+ii-_4v zyx!=O+bPd|fQC16aF*IlnVSKtJ_p#6tFWC0^Q_T1P$@JurW0UIE6FSY+GvNkGwhS2TD4l|7_nd@d1hk8XDvn)W=a zApa4Bq2+Fj2JxJ)Ji?pwAQLQFAIX(VH7A3ck)CDPSoiiytmpu`#hN(Q0v}0NoL}wz zl;ZZP^@pgF?{eI8(biVVe~{z;5^Zmw+IMqYb@T=o<*ny9r`qkJz=Vu11i_iuxDTrt zd)IWVA$<-~xQnoHZ8}`+?||E8xJafPSwz?ugmtZ}BX|lDtxoeJ1J*+Z?{i1Jhq(BH z#GCZVk^4KslTYvOKzGUbCiz7x84gfz$Dbt3_CSSD6+8(}pHLF1VdIjwo1Y=6O^9@< zj6RS?Z=$AfChR1@C8<2Sq`U~@Q*z$aOD0Om!y`I4Q~w1sECOdX+s4=;WIsq3o$3x+ zvn1<9YXkT(fFchyKrLwyF!6~)6L8nWvIFs2K!K$h#BKb(NQN26+z7;hTlmqGz zVvzxM3X_5`+rb-L4e{L<^fo!owXlJ5@FXj>qf6f+cw3$@KS+9G%`b^fUHZP~h^bo? zijdb-N)`uW{%LdocMs-yeg0K9VyBt6HG8 zEl}5WgR?gqc7K?=w9@wI&U=_BAzf}xfsfelKqVKHl9I@1a4Cc|c*qqrUBL_U5D7Or zbAvD&bM9!X5kq@X68kS;n1m#YwyU_NYJNLO?)pTZvL ziVXU6K{#o%WThy-RDpoAhdvw}U66x25~VnRJzr+&WHbXqceKu?r&9gu$mi zO!)hVa={P=PDwg+g~YuPA-Z%}OT!TsM9FIimNfdSsIO&*!Fs0P714eN%)JKi?uL>U zG9{6Q-($O%F{U;VrdCKMF^wwYW#oq8l9&UXga>d8FyF}zkKj|`J;WS~mG+fh zL^G21_q|Hp@BXT+V@g@0NARPV&vDUy6XmYMN~8=6`u5eq-9z-rbc1{6Rrrbqz}sxm zm-4`S`6|5UnUPWcQ5nF+5ZfE!Y_^Twx4@OmOC#_Y(JBkPWowk@1(^u^?qnjkc2dTI z=UFAo3t3W+N8nP_;Z-+zON2&jdGa{ew8MV0M5ssbw09S~SX!z|geMTej$>bz^W6&A zD}%KND)oRbe9U>$?S&au1(z5XrA@d{ft6brPbIW#Y)AmikHMqu1b%qykBQV6C3nAi z+PUYA(S4b5GZq6ox$+TMITphYhfrrVbmQvOJj`*aOnV;TERwCMV0RA_n(PgzGI@E< zg2YLxxzmItvb@GjWXhtUph~$Q<6TMxE3g7*Ga0P`q{B6Nx>O6jn1%^jzAvjBmD@N~ z&cm9n$pk)OGUkEp&PV50uI}nnVm;%0MT7>HM24As1b0U?@8pbnfj%C}EnmN*blcs1bON*24$Ofn;EKR6frLy3)Wc)91s`|M2@1 zD=ZhXN+O!PDnWl$9~ys>U3oaX-G)7FuFp0V;#7x1kBwlDxfmUbk1LSm@8_u5{YFjct@|?ni{-{+c}SHp)~Qp7YbNtwf)52_cx? z^Cz&IZNKx|^Yr#SgDqbYGn}0xe1v=`ZZ?V=j^dg%a0VQcHooW2Vc=nPwJ2_Oe^vPZ zD6E@(`?U8>_OLA5F%+Oc~lOOsTG$#wM{7n|$X`V+%25!_p<3twyyws$oh}y7U~POzd(Usdq`TsrVfe5+<5z z7bIA+s#ua*jo7p)#AO$hz35 zHik`t-%_k#*qcEDc9KQ|^?;P@6ba0y@l1ulId)P5y*qL?xI~WXNywFCVLWSx!Lj(s zdNus)#KduYKaqZoCCtHW{COdaH!eBnO2*xz8FHK8-FgLfg0B$q@T&1LzR&0?dHxCI zB%}3NhG8cp+zJD(gLkHSvs1xyN#{zPf*kNZeZ9oVq%It`&c-{>zOw_%tv&Se&N1rKdjKucJ&?uWH9A$$=4V0%WO5jW< zSD}_@HCL*5XQ&Uabf8@GDKYgJlA-b3G$E!E78|PhE3x^{Vo4NjeoRa=k;3;$hlzfD zx}_z}+=q)$N!0btkBg3nMe_*}+_0NF#3qvpgmx2BGKDr@Mj9v^T|`I!)(C>dwr=h8 hxEBr_KDJl)LCo^Evu{8Auy(%Y{auIVtXf$AzX6zD7<~W$ From bf4b7b3b1e9673a1417b52596a17efaef5a672b4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:39:03 +0100 Subject: [PATCH 036/255] Delete partitions_ffat_12M.bin --- tools/Esptool/odroid_go/partitions_ffat_12M.bin | Bin 3072 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tools/Esptool/odroid_go/partitions_ffat_12M.bin diff --git a/tools/Esptool/odroid_go/partitions_ffat_12M.bin b/tools/Esptool/odroid_go/partitions_ffat_12M.bin deleted file mode 100644 index 4389fdc62b75f3347aea8a05b5dcfe4effe8a70e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3072 zcmZ1#z{tcffq{V`fPo>etQg2Z1*-xW85kY_#S|DA@=Fp^5=#cs$r04 zNGvEYK#>G;fbxQ1%@BD*OnJse1_pbe@Ii*Ow8Rp0`PZ-iqk#IL9ZU2Uo#PUTtDWo2 m_dy6na+EU~0;3@?8UmvsFd71*Aut*OqaiRF0;3^-Hv|CwXI*0e From 6c0ec48a6c0b36a9d02fc95496998d5707b31362 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:40:42 +0100 Subject: [PATCH 037/255] Odroid files --- tools/Esptool/Odroid_go/Odroid_flash.bat | 1 + tools/Esptool/Odroid_go/boot_app0.bin | Bin 0 -> 8192 bytes tools/Esptool/Odroid_go/bootloader_dout_40m.bin | Bin 0 -> 17072 bytes tools/Esptool/Odroid_go/partitions_ffat_12M.bin | Bin 0 -> 3072 bytes 4 files changed, 1 insertion(+) create mode 100644 tools/Esptool/Odroid_go/Odroid_flash.bat create mode 100644 tools/Esptool/Odroid_go/boot_app0.bin create mode 100644 tools/Esptool/Odroid_go/bootloader_dout_40m.bin create mode 100644 tools/Esptool/Odroid_go/partitions_ffat_12M.bin diff --git a/tools/Esptool/Odroid_go/Odroid_flash.bat b/tools/Esptool/Odroid_go/Odroid_flash.bat new file mode 100644 index 000000000..053742d27 --- /dev/null +++ b/tools/Esptool/Odroid_go/Odroid_flash.bat @@ -0,0 +1 @@ +esptool.py --chip esp32 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions_ffat_12M.bin 0xe000 boot_app0.bin 0x10000 tasmota32.bin \ No newline at end of file diff --git a/tools/Esptool/Odroid_go/boot_app0.bin b/tools/Esptool/Odroid_go/boot_app0.bin new file mode 100644 index 0000000000000000000000000000000000000000..13562cabb9648287fdf70d2a22789fdf1e4156b4 GIT binary patch literal 8192 zcmeI#u?+wq2n0Z!&B7Ip%ZdwNPjZydJlFk*h+E9ra}_6R0t5&UAV7cs0RjXF5FkLH gk-)3}W&dyVhNuJx5FkK+009C72oNAZfWSu}0Te{nn*aa+ literal 0 HcmV?d00001 diff --git a/tools/Esptool/Odroid_go/bootloader_dout_40m.bin b/tools/Esptool/Odroid_go/bootloader_dout_40m.bin new file mode 100644 index 0000000000000000000000000000000000000000..267abf3dac6673a45831d387e0c66b6b754d62cb GIT binary patch literal 17072 zcmd73eOy%4_AtKBnPE809CHSc6!3OtbYM`(;YC5y%RpSz^xivBqM4hv-etit-aS?d+ql%->6kwi-xiNK(6_tCK54Q4JZ-*;vpT4fc(cp(aoSXsPj)5=ZdMH|bxx$`&~bgWwgS!71(`uiO-Hf~*&4|HA9GUHt|^(Zdj0(y)~|D{E8jGuc>VhFvh_v4w{p|w z4I9>PET6Gyu+IqO!lHEZiQEzn#g64p&_E-G8SxvZ!hXiJMWm6G3W-QZX~ z1`$$Pv~EqAgEP+K{;*{6;{U6<+EiL3sftLAE_1Bo%v=UHZyslbc5NtHv$FWXa>u5t zkkFNDHm$^FLF>$1?&3e*ylCapKNjTOhFr6(GcpMIpJ}XwhqC|w{9UDQkUwqatd%98 zcThC^{d*p^4Dg#vN*o*ipV0Y6=>GNhgW9i>wPbBs*-AMB?67S8mepnVtz7-!>M~IN zTrNE=b5`d6K|9&BeziOZXKXBAy|R4m{SL_}5Rl|3DqFdBUAbf9x}q|v-}rD_c_Jb4 z*8c2h2=N@m5LoZ!>{agmZ1HhXBzl-feip?w022;u9^%^}EQ7ED!iMuh*)gk*5yBF( ztcuv!XNm38XNZll_GfbtUdzK*+IfXg9V2 z+P(NKO#hUf2l*>dUgGzQ*lhCi8={y75`(_$K(|0&;SaNIpv3H6Xd@4?8sbJP@IY`w zcmhH@;3h)Y03jKI9YQ_eX%00i5;c@#2i{c}Kn}o-C#3%kkkJp7wtpZH+XxB(_VK`r z;Wofgt#(4b`%V-qJ_)lmLWuuIm`xA1LLjsoHMRi60qAcv#L0+YN&qS*@E`tqJ zM~1PcDrf_nCd5h=GJMU{5{p%sh)@gTxn6X)>OC={dl#10AeZKe0$9JwWZ;qzn*_y{ zEU*eXg-0v#MEr_J^Y1*%tU@Rx*Aon3JtLuO>lp<2+IoQD9776YuV=@d7{}hp9u$TV zAwhBMLqb4;SQgX2jO9#cw+lZhIhg)&EN2nhDtxEpVEUV}oSWEP!k0=8rq5$~??;ln zI^k4^2YKHIsUkA-)D>tI@Kt`5Le-PebTQ*LYT|f$_p> zt0=rCDlStA-*?$3q8Qc9);a zI?uVf{r-M3#lYt|xn6GmVZ-rv=O3o`AJ*txKuL)6SctS5_-P!g&EE=eZw4D@JJjtS zw)OtKJ>3sgwx8^0V>MFQEXY(L3-Dl0Lnu!0ii zIo(UR%-5n0F4;em&YY>y-;Z-ovnA+H#$GyS$!E`{NCp6AjfCD<;Xyv^y}21^u_=gLP}Bt3wZOkB?_vUDGv zp8+eI?bGdPUh2u2w0922M(#gMu{1Y@3-V+=hE~@ zEZ5|l-$5^p(xfmjAZVhqu-YCR94Xp)S~NklU3T#ix@nInycdLdCk4=e!?j~PDI6kc zrtmhpIVirklVKx)gQX{5!Z53d#GIzuXme0(${|hNT=NJdC^r5GBCnImsrZ*vR^J@P z>D9n&QerVWy%YIX&gor+Ump)&77=|57?=|Gpa4(@jweqLMz)0(UJAn4F}BK(XLrzD zr#J3KsD<|K2|L$na6hs6QiB0zbN+E0lL=W730t)Z6LpfHCJ;6a0!l8mwT@<;^f=yS z0MgzpRt57z#m{;J*B1~?^mT~`sfwRdR7eamxab5%XDLod)0X7wu!ymM?av`LTRA(C z)jqA|>MO0=cS4CT*5^1?OkymB1jt!LW>aif{v>E0 z=kTUFg4S7jVNKA*R7YjAT1bITAzm%TH!QyHtg7qoAggQB2`dp*dmJ+F#uU~|h)@`u z4YnfOfhg-Nf6;Bhd(%s)Ra?ASs@dUjOKfR5e-6u>xl^(M=y)#?79lAnZo!1@E$)a4 zOlBRGqJ?tiBd(2h{4AnnNqWt>Ihd;^g&CTh++b!#QBGFSmaFIZ{_W|)Z-d*@t=7xH zHw*b7o{4c#1#+vqvShha5mnm?nO2Di^aAM=DLpYYIq1BZ*i3#%%rQX@=0X5n3g#ea zI%X@4vi?RQ*9w!B*d)afLVU1p0jU@iqJv|57`wfk@cfRmJ6~FC#;W8DJRhXsfn@c&q5HEh) z7J9s|Y3saHHKp2~w_c(t~;tt``synO8yy+#SUp*gVDX?|;XatryNY+FMA4n+1 z^Zp3#y5M`w?(XCmEWC$=^$hGk8<4eu*?U~V=oDB7$WEs2718~ayup;=wlP@nk9gid zmYRsM_`enSh!P*hxHCdHGy+qlOnN{;bzVWeuAp8ULkasN6vHlbKP5{i)$Z9d;y$FW zYa*lAu9qY_7B>q|>De9aa$8uSKEryNN8D%i_xA7xh^7nd`cq9PyvkcQ+GdCw`qwxDyCvM!_QyG8Gp`S%Kmhb5*&= z81KtSt8CfZ4u(fR}!8!s{*$H*WY5gtF2`LD`RQZ~S z6PC#rCQtP8ybS$deL2V6B^Dkewhy>u_6XgkG9Q#?g;@gm>(6Qs3a7VHb+?!6@QQjL zC&XikX>U@nLQI)m)JB;FarXnM6Hs^;%s~#8%~z4|(r|W?yVvUXm-9kS;e}8q4U~hT zGsH=gA z+v47Fz$w#ktbxuuRK-iz$gRU&J%I`M3z09Tc&? zy+y;m>fye}#Ch77dzljy8`sxJ3bjm6EXdQo-LSo~j-hK8CQQ1eX9B5XRJC^`yfeNh zjF9??E=z-{CQSn(O6lC10?jy5p=&>&FFBO#c4tg)0Kq$f>_Ae@Y^Nz9&gCplkopPA zDQtjcfO1;s2D&CPuGK|VPjk1a`f5dKzcadic9D6sg^o!JhYg;}aT*M-@DmLiAqc~; zV75_xWn%5UOksI*x>A>}fF zGuer$8-`)Uo_q;NnwN_ST2p(g!RzBq(}>QLHYLGoIxmj{LQH#}R+3|50+;gpu-m{+ z)?(cB+y!AWCOnzL!W!)421WySMYD?NiZAEyT(DzrQ@0+(kGX~H@b!Hy!rrfWShT$= zE#JUiL=G5ShQ^jQs+lE?b9U^7#NWi))+1^dneT`@e9d2qx;$9>ey{pU{dU~V`EXw- zbDP6t?kq#&bHK!ma=)u^Hy;J=zH?&kTU44UAv5DxM;8OKG`}OuV*Xt0_Q8s}!zbK` z@|*u9f=!fwvP_n=*;JB2!;*>%)jPFWxt0P6hDHZ6vnD`yR__}>J)KK$cTKUR*8pig z9DV5|NLZ*WgEWq%af@@g3ClL#Fw8PF(6iEBq3|?0HF>ye^6-j9zRAOmrHqY>jsaZU zaM#4)6?gh34x0-Z+s2&yIIu&bVYrlDwJIY%Y}FFKed%gr6zbSQ7v_ppVT7yVbH)$b z7I>{rZM#*0mBNStYDS|1SQ(8Ct>G;@-Ad5L|C-#XJ<@_Kwp$9Oi{sKzoD($d+R z08GhnVfY}5h-0HLk~-Bt)HOWR;T3%SL%3sK%*6atm-GG50=13LIOj6Vt>An8AFUwW z-Yt;0v)9i@H!`O#4R!qhOi%c}MyBS4%-)MbusgjZ3ZD(ZhKJ8!2cMjH-Kh&hU0(uO zz3=RhV?NXVyrEeof-S(&2#zz&-;2ighb%PQWYwNN_1RF@CqVj)@AOb}9s?Ot`x7Gj zLGUvOEToMmt{~|uH91#j*mbk;&d~On7RDS3?N-N`UUz;2q;lW<`Vdj@V)X4jFqV(w z$)I*NtHZ6w;X|bj$uu#FcX}rajYqi<>Kb?wo74|Y;|9@cILPnt?dm~>ujslS`HU%5ho(N@9wm^ z{PQCCn|AusxhHqVJsHU$e;eKRzGza%)kYQ^osr? zqtJji46$*J8^qdJ<2oP%+k)W>7ch=lBAo7fTYDyx4lmA6XefY@+YeRVB=6b4iH>{_^9bj8fo3M1qHSwg& zTBB`@@$*mg9`nEDcRo+}-qmdy$1!n{=>$DLtpnEaS<;d(ofp0!&>PMi8?5472L}`D zSy+i-3c$Xq*8pZ&NkjC>4!+JXrlQkaV6FmZQ(ai>*S+P-16F$!(U@ z=|gkUgs`E^&KpvvK{B)R`qZSMIi`6`V&^!x4}!%Kt`n)qHByh($9vSfIF}js`>9?;kOaXjCNae?d>tG zaCn}4srL02gZUS+b{9LL2l@_O#LrJypC67g#0Z+9 z>O_jwtXfqLrtG1H<|mk~%NNFWl)g659elTneqqTOH{7 zo(6gFY!~hTEiAt!-B#lND&{>jD-=jRa~aRUykz`Lnw*ShA(GK#mX8#4hl;%v8~#|h zy{eM8m){}i3P#gT?~gS(kA>T+Dy{eIU; zMOyn&uG7<^cAP}wZ=(y;Ve!n;PP)fVmZ=MlPQ1gzhV_gi-A8F#Z+mf+T68F?ebumHxc_X zKMXl@d#LyL33X=<=&TD%xOZH^)XcOg6x^OwrICWEB-J>WIU%xfzoRYm>AheR;pX>& zu7@Tu)iBn`h8MX$pO~hOi>ahxZb+M&Ij1#Q2WD&zhF~i+6b_qRZIkz0>+`}I)C}0M zN-X?HlVDne{bGXFnA%My6^@7Z#lzaiXqJ|&fiL!EX~K)cANbSY)^He(50npXz22H> zovn#8O`mB?Z_m2fnwFE9_EFpt$*@f7utf77ERzi{_R+96X2a3GD}Dj{1_k%V6cr7Q z$=v)`dBKJb%SEwLG&oL8J`~AENnnDtvev3fw95%K`4YI&hmL;r&HhRbZfXEw|VCL_vkj4Gdpt@Q48{F9Kp=5R=g60gRH}XE9QCKYY3sS3U`gN0C1LsB$t8Kd4G8~K z3jJcNP&*&pyUbotjy7j6Fvcx`n|5HUvv%X@(UYJ1l{7qUtq%EG*e@qRo z4b9((p3?#0xKhorv1*`rP%rA{3lV0&>r0j88g&dJ6fPK7pX;tXzx`2AQ%@SIsqag% zCmHS+fn`W6Jg#$kZ&=zgS9mtS@6-!-2jCgT^C}kaTnmRLly{#jZ;Kj`yCW3Eyzcs{ z;OM!uH@W;sFl{$7^N&)<+>FdM5&z%qfA&9>2kkHL63?!H;6Z+{PvO5LDJ(?pd&l2J zP*2sVD;6M~XuuLAd-6RNaC|IwcxS@uF9-oJROb`|SHm@`(fJ(q548D1QP_&bf|+?{ z2ZTS3*0t%Hx|&bRwZQl>ZVABV=#(gJ9S6liEu4Z(O@y1GPojJq0_KxqYFWUz2H9uR zLNUgYO{K04z|{7hD3l_qo-y7N7=01zgfo|U049;zktA0an%?ND$-G+km_ND%%uSTC$<9z6w5rCda(Z(#-U?uhsIqRFa*YPC<`aTv5 zcd6}b{2NNT*TO0eZ*%tUoDCmy)?P378t>x*%^!*v4?eUct^^i%IH}J19P;fS_#uDV zYraVV*bPD>j$hpfxglWNoIS7bQMC=e4z&=4{mp9b(&R_L;rew$`$oQf9}i2BFb;F> z(tbJzmL1p!^!+H_rR}{puEe%EXUnV)gmBDGfxDT}IwV^qw-HYcqAo=E>IS^8U{CGF*Ia-<2N>(y9kC@qYo-z5k67Z! zRzSgp?PCM7?bJm0-c_W@lcafXOd8M00ijo^Zxzmci3kAiO5l~OE5dhJ;hib*zA?rN zg!NjbC8=1i?&_BKURT&=A)C{CXjB0`uqc!HTgQ1i281@bYFO64E**1@#%1?yl?iabR>@oca6cT=#^=rK5 zI@HN|q{qQHNvRzN?g!Ht9l;w1gnKa$ z4Ck(azB;iM9>1l%1-zM+VTOx_ErZQvFs>b#=JKo^aJ!m#=ZD790nXxti4Vqsu|%db zI)H+u*-3oTPMi`k&r>uY+%1mp8I9A+dYLy0H`Hn;>-2?lKXo{ zP~+X#)MXzyWgqZ9=j_vm3cHE%56I9|EWK!zM6$+32=9hn8}OBwSmT1LU}OFjK-yc$ za>CyJmt5S~!?_jHw@GQf9Q0J!!hHHKAr;wR4$U0klHkH|sx6(erlFm}>y}hcBqvxD zni&es2B0w^O_D-m;)EL%nnZ=h`zspZdWC>f2u@yG(N!`#@UCF0+Y5CD{b0rV?Ge>3#RD+m8Bz^{TZ z5rPI-i5`6mZ2<8Q;NFo~3CXg757|BeE+N5z4E{C%Uj+m)+Yd!kA@mT-I|t=}`=a

%d6q!o_?tm$Z^8S(_XFKtFPuT~cxA^j;KF5C#A0{ReWwEO zNJE)F2p}Kaoi3Ce*RVJV&X?WL>U`AbV(y0#%~X6dIzoXG_zLUP!d#hExJilUDDiA1 z&QfC8J&zG)Dez1s&XD8Dmju~ej}g+8oKz*YD)9^@zEO!&lsH+5r^~UTD{$+BMhnxV zuNkxI8DXkeUGr1(=|O+1K`@E@!KU_he3Ca^rQ;?q5mX4nn{yL9vk**obPurcEHjU3 zpIceiJ?O5jF#xab2`?xxBV zRo(GH_YP$4y^yfoz;-0Y8rai`yP|uLYm}9Zhf_JgF)yR@0nDgutoa+!@zvO!7P@_H z%Sfj*LLzEsR+gzzaLG z9!#}xS9lxccxJ#nnZQEO_nio3e2Qf_{DXZT4zdrkTJxtE#rFMUkX?jLdS`I&dm%u- zIcNr&{~i>2CI2_Z^Df2>j7N6zixA#HUp+w8MD(p6G-n6En)^Nw;ac!VPzK&AD(@u% ziC?_;jS!s6-;-Lwz%f=|@2yJ$4UYGIW4Cg|yVg$N5OIupec6}7>mhJ-x`1e|6wzE! zR0`$k2np?>>I36W?G1J94Xx1m_J;a&lxOcKx;@nOQfNh-@1>AK3lDIi>a=mEUJiA= z5Lz+a_d>`VF^X#mb@@UoZu0p;ec_a^G1S!<^7i^!ov=<(@eV1D6>1b%j$?&t1%3u& zqwG9L3x6GT2c+RG=t;~1jnvbE2k??|XrEispSCOjn<~g`&`K1e*^YnW*+Dz@wgmO? z|22VgQRmtX?HxJ%A+F=ypsz9{RAS+d&Vkxkn3v#j3C>7Dq1-jXk`Rm?;bDYa%)o^x z;UPH*9ux@{?Ft6Z_AAgA#Ob}{DG$MBv3}BSs=-hP_mMe-uQv$mLoF0^C%6+ii-_4v zyx!=O+bPd|fQC16aF*IlnVSKtJ_p#6tFWC0^Q_T1P$@JurW0UIE6FSY+GvNkGwhS2TD4l|7_nd@d1hk8XDvn)W=a zApa4Bq2+Fj2JxJ)Ji?pwAQLQFAIX(VH7A3ck)CDPSoiiytmpu`#hN(Q0v}0NoL}wz zl;ZZP^@pgF?{eI8(biVVe~{z;5^Zmw+IMqYb@T=o<*ny9r`qkJz=Vu11i_iuxDTrt zd)IWVA$<-~xQnoHZ8}`+?||E8xJafPSwz?ugmtZ}BX|lDtxoeJ1J*+Z?{i1Jhq(BH z#GCZVk^4KslTYvOKzGUbCiz7x84gfz$Dbt3_CSSD6+8(}pHLF1VdIjwo1Y=6O^9@< zj6RS?Z=$AfChR1@C8<2Sq`U~@Q*z$aOD0Om!y`I4Q~w1sECOdX+s4=;WIsq3o$3x+ zvn1<9YXkT(fFchyKrLwyF!6~)6L8nWvIFs2K!K$h#BKb(NQN26+z7;hTlmqGz zVvzxM3X_5`+rb-L4e{L<^fo!owXlJ5@FXj>qf6f+cw3$@KS+9G%`b^fUHZP~h^bo? zijdb-N)`uW{%LdocMs-yeg0K9VyBt6HG8 zEl}5WgR?gqc7K?=w9@wI&U=_BAzf}xfsfelKqVKHl9I@1a4Cc|c*qqrUBL_U5D7Or zbAvD&bM9!X5kq@X68kS;n1m#YwyU_NYJNLO?)pTZvL ziVXU6K{#o%WThy-RDpoAhdvw}U66x25~VnRJzr+&WHbXqceKu?r&9gu$mi zO!)hVa={P=PDwg+g~YuPA-Z%}OT!TsM9FIimNfdSsIO&*!Fs0P714eN%)JKi?uL>U zG9{6Q-($O%F{U;VrdCKMF^wwYW#oq8l9&UXga>d8FyF}zkKj|`J;WS~mG+fh zL^G21_q|Hp@BXT+V@g@0NARPV&vDUy6XmYMN~8=6`u5eq-9z-rbc1{6Rrrbqz}sxm zm-4`S`6|5UnUPWcQ5nF+5ZfE!Y_^Twx4@OmOC#_Y(JBkPWowk@1(^u^?qnjkc2dTI z=UFAo3t3W+N8nP_;Z-+zON2&jdGa{ew8MV0M5ssbw09S~SX!z|geMTej$>bz^W6&A zD}%KND)oRbe9U>$?S&au1(z5XrA@d{ft6brPbIW#Y)AmikHMqu1b%qykBQV6C3nAi z+PUYA(S4b5GZq6ox$+TMITphYhfrrVbmQvOJj`*aOnV;TERwCMV0RA_n(PgzGI@E< zg2YLxxzmItvb@GjWXhtUph~$Q<6TMxE3g7*Ga0P`q{B6Nx>O6jn1%^jzAvjBmD@N~ z&cm9n$pk)OGUkEp&PV50uI}nnVm;%0MT7>HM24As1b0U?@8pbnfj%C}EnmN*blcs1bON*24$Ofn;EKR6frLy3)Wc)91s`|M2@1 zD=ZhXN+O!PDnWl$9~ys>U3oaX-G)7FuFp0V;#7x1kBwlDxfmUbk1LSm@8_u5{YFjct@|?ni{-{+c}SHp)~Qp7YbNtwf)52_cx? z^Cz&IZNKx|^Yr#SgDqbYGn}0xe1v=`ZZ?V=j^dg%a0VQcHooW2Vc=nPwJ2_Oe^vPZ zD6E@(`?U8>_OLA5F%+Oc~lOOsTG$#wM{7n|$X`V+%25!_p<3twyyws$oh}y7U~POzd(Usdq`TsrVfe5+<5z z7bIA+s#ua*jo7p)#AO$hz35 zHik`t-%_k#*qcEDc9KQ|^?;P@6ba0y@l1ulId)P5y*qL?xI~WXNywFCVLWSx!Lj(s zdNus)#KduYKaqZoCCtHW{COdaH!eBnO2*xz8FHK8-FgLfg0B$q@T&1LzR&0?dHxCI zB%}3NhG8cp+zJD(gLkHSvs1xyN#{zPf*kNZeZ9oVq%It`&c-{>zOw_%tv&Se&N1rKdjKucJ&?uWH9A$$=4V0%WO5jW< zSD}_@HCL*5XQ&Uabf8@GDKYgJlA-b3G$E!E78|PhE3x^{Vo4NjeoRa=k;3;$hlzfD zx}_z}+=q)$N!0btkBg3nMe_*}+_0NF#3qvpgmx2BGKDr@Mj9v^T|`I!)(C>dwr=h8 hxEBr_KDJl)LCo^Evu{8Auy(%Y{auIVtXf$AzX6zD7<~W$ literal 0 HcmV?d00001 diff --git a/tools/Esptool/Odroid_go/partitions_ffat_12M.bin b/tools/Esptool/Odroid_go/partitions_ffat_12M.bin new file mode 100644 index 0000000000000000000000000000000000000000..4389fdc62b75f3347aea8a05b5dcfe4effe8a70e GIT binary patch literal 3072 zcmZ1#z{tcffq{V`fPo>etQg2Z1*-xW85kY_#S|DA@=Fp^5=#cs$r04 zNGvEYK#>G;fbxQ1%@BD*OnJse1_pbe@Ii*Ow8Rp0`PZ-iqk#IL9ZU2Uo#PUTtDWo2 m_dy6na+EU~0;3@?8UmvsFd71*Aut*OqaiRF0;3^-Hv|CwXI*0e literal 0 HcmV?d00001 From b68d8c65f34a788b6cf54c761f710ca2e0162b2c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:44:54 +0100 Subject: [PATCH 038/255] tasmota32-odroid.bin --- tools/Esptool/Odroid_go/Odroid_flash.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/Esptool/Odroid_go/Odroid_flash.bat b/tools/Esptool/Odroid_go/Odroid_flash.bat index 053742d27..2ce84284f 100644 --- a/tools/Esptool/Odroid_go/Odroid_flash.bat +++ b/tools/Esptool/Odroid_go/Odroid_flash.bat @@ -1 +1 @@ -esptool.py --chip esp32 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions_ffat_12M.bin 0xe000 boot_app0.bin 0x10000 tasmota32.bin \ No newline at end of file +esptool.py --chip esp32 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dout --flash_freq 40m --flash_size detect 0x1000 bootloader_dout_40m.bin 0x8000 partitions_ffat_12M.bin 0xe000 boot_app0.bin 0x10000 tasmota32-odroid.bin \ No newline at end of file From 0703e5899b7d5251c4018c3706ae988798ec2f7b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:45:40 +0100 Subject: [PATCH 039/255] Update workflows --- .github/workflows/Tasmota_build.yml | 24 ++++++++++++++++++++++ .github/workflows/Tasmota_build_master.yml | 24 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index fe06a70d2..ba32bbe74 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1013,6 +1013,29 @@ jobs: path: ./build_output/firmware + tasmota32-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-BG: needs: tasmota_pull runs-on: ubuntu-latest @@ -1575,6 +1598,7 @@ jobs: [ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 4169bd028..1bc598370 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1013,6 +1013,29 @@ jobs: path: ./build_output/firmware + tasmota32-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-BG: needs: tasmota_pull runs-on: ubuntu-latest @@ -1575,6 +1598,7 @@ jobs: [ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/ From 8117d25f41f4b4250f9b28035a71a4f918a8aa15 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 14:56:52 +0100 Subject: [PATCH 040/255] Plus changes Theo --- .github/workflows/Tasmota_build.yml | 24 ++++++++++++++++++++++ .github/workflows/Tasmota_build_master.yml | 24 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 8bf360bcc..708a6b56b 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1013,6 +1013,29 @@ jobs: path: ./build_output/firmware + tasmota32-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-BG: needs: tasmota_pull runs-on: ubuntu-latest @@ -1576,6 +1599,7 @@ jobs: [ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index cdf6ccc99..e97ac181c 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1013,6 +1013,29 @@ jobs: path: ./build_output/firmware + tasmota32-AF: + needs: tasmota_pull + runs-on: ubuntu-latest + continue-on-error: true + steps: + - uses: actions/checkout@v1 + - name: Set up Python + uses: actions/setup-python@v1 + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -U platformio + platformio upgrade --dev + platformio update + - name: Run PlatformIO + run: | + platformio run -e tasmota32-AF + - uses: actions/upload-artifact@v2 + with: + name: firmware + path: ./build_output/firmware + + tasmota32-BG: needs: tasmota_pull runs-on: ubuntu-latest @@ -1576,6 +1599,7 @@ jobs: [ ! -f ./mv_firmware/tasmota32-ir*.* ] || mv ./mv_firmware/tasmota32-ir*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-display.* ] || mv ./mv_firmware/tasmota32-display.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-web*.* ] || mv ./mv_firmware/tasmota32-web*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32-knx.* ] || mv ./mv_firmware/tasmota32-knx.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/tasmota32* ] || mv ./mv_firmware/tasmota32* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/* ] || mv ./mv_firmware/* ./firmware/tasmota/languages/ From 8f90ad733da4bf05c9077765b771b90f1540ac8f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 16:37:22 +0100 Subject: [PATCH 041/255] Overlooked a needed change --- .github/workflows/Tasmota_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build.yml b/.github/workflows/Tasmota_build.yml index 708a6b56b..9e8f61219 100644 --- a/.github/workflows/Tasmota_build.yml +++ b/.github/workflows/Tasmota_build.yml @@ -1606,7 +1606,7 @@ jobs: rm ./firmware/tasmota32/*.gz rm ./firmware/tasmota32/languages/*.gz [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ - [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ + [ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./FIRMWARE.md ] || mv -f ./FIRMWARE.md ./README.md - name: Commit files # transfer the new binaries back into the repository run: | From 1cbc6bc80bd2926e8b49244eb85e9561cef641b9 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 30 Dec 2020 16:41:34 +0100 Subject: [PATCH 042/255] Forgot Odroid_go change --- .github/workflows/Tasmota_build_master.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index e97ac181c..8c00d25e3 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -1606,7 +1606,7 @@ jobs: rm ./firmware/tasmota32/*.gz rm ./firmware/tasmota32/languages/*.gz [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/ESP32/*.* ./firmware/tasmota32/ESP32_needed_files/ - [ ! -f ./tools/Esptool/ESP32/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ + [ ! -f ./tools/Esptool/Odroid_go/*.* ] || mv ./tools/Esptool/Odroid_go/*.* ./firmware/tasmota32/Odroid_go_needed_files/ [ ! -f ./FIRMWARE.md ] || mv -f ./RELEASENOTES.md ./README.md - name: Commit files # transfer the new binaries back into the repository run: | From 01f3a7da19cec91b62b4453852d6bb7cbebf0457 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 30 Dec 2020 17:49:52 +0100 Subject: [PATCH 043/255] Breaking change replaced NRF24L01 GPIO selection Breaking change replaced NRF24L01 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_NRF24_CS`` and ``GPIO_SPI_DC`` by ``GPIO_NRF24_DC`` --- CHANGELOG.md | 5 +- RELEASENOTES.md | 3 + tasmota/support.ino | 17 +++-- tasmota/support_tasmota.ino | 97 ++++++++------------------ tasmota/tasmota_configurations_ESP32.h | 5 ++ tasmota/xdrv_33_nrf24l01.ino | 35 +++++----- tasmota/xdsp_04_ili9341.ino | 43 +++--------- 7 files changed, 82 insertions(+), 123 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d542934fa..c39ba0abf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,13 @@ All notable changes to this project will be documented in this file. ## [9.2.0.2] ### Added - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) -- Command ``CTRange`` to specify the visible CT range the bulb is capable of -- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels +- Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311) +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` +- Replaced NRF24L01 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_NRF24_CS`` and ``GPIO_SPI_DC`` by ``GPIO_NRF24_DC`` ## [9.2.0.1] 20201229 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6f02fa36f..f7d6c073d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -58,6 +58,8 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.2.0.2 ### Added +- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) @@ -73,6 +75,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` +- Replaced NRF24L01 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_NRF24_CS`` and ``GPIO_SPI_DC`` by ``GPIO_NRF24_DC`` ### Changed - Logging from heap to stack freeing 700 bytes RAM diff --git a/tasmota/support.ino b/tasmota/support.ino index fcf21a014..81e826365 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1479,8 +1479,7 @@ bool FlashPin(uint32_t pin) return (((pin > 5) && (pin < 9)) || (11 == pin)); } -uint32_t ValidPin(uint32_t pin, uint32_t gpio) -{ +uint32_t ValidPin(uint32_t pin, uint32_t gpio) { if (FlashPin(pin)) { return GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11 } @@ -1495,8 +1494,7 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio) return gpio; } -bool ValidGPIO(uint32_t pin, uint32_t gpio) -{ +bool ValidGPIO(uint32_t pin, uint32_t gpio) { #ifdef ESP8266 #ifdef USE_ADC_VCC if (ADC0_PIN == pin) { return false; } // ADC0 = GPIO17 @@ -1505,6 +1503,17 @@ bool ValidGPIO(uint32_t pin, uint32_t gpio) return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins } +bool ValidSpiGPIO(uint32_t gpio) { + // ESP8266: If SPI pin selected chk if it's not one of the three Hardware SPI pins (12..14) + bool result = true; // Not used and therefore valid + uint32_t pin; + if (PinUsed(gpio)) { + pin = Pin(gpio); + result = ((pin < 12) || (pin > 14)); + } + return result; +} + bool JsonTemplate(char* dataBuf) { // Old: {"NAME":"Shelly 2.5","GPIO":[56,0,17,0,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18} diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 58b79e905..325ad3b2e 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1599,26 +1599,20 @@ void GpioInit(void) TasmotaGlobal.soft_spi_enabled = (PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); #ifdef USE_SPI - uint32_t pin_cs = Pin(GPIO_SPI_CS); - uint32_t pin_dc = Pin(GPIO_SPI_DC); - if (PinUsed(GPIO_RC522_CS)) { - pin_cs = Pin(GPIO_RC522_CS); - } - if (PinUsed(GPIO_ILI9341_CS)) { - pin_cs = Pin(GPIO_ILI9341_CS); - if (PinUsed(GPIO_ILI9341_DC)) { - pin_dc = Pin(GPIO_ILI9341_DC); - } - } - #ifdef ESP8266 if (!TasmotaGlobal.soft_spi_enabled) { - // If SPI_CS is used it must be valid - TasmotaGlobal.spi_enabled = ((pin_cs < 99) && ((pin_cs > 14) || (pin_cs < 12))); - if (TasmotaGlobal.spi_enabled && (pin_dc < 99)) { - // If SPI_DC is used it must be valid - TasmotaGlobal.spi_enabled = ((pin_dc > 14) || (pin_dc < 12)); - } + bool valid_cs = (ValidSpiGPIO(GPIO_SPI_CS) && + ValidSpiGPIO(GPIO_RC522_CS) && + ValidSpiGPIO(GPIO_NRF24_CS) && + ValidSpiGPIO(GPIO_ILI9341_CS) + ); + bool valid_dc = (ValidSpiGPIO(GPIO_SPI_DC) && + ValidSpiGPIO(GPIO_NRF24_DC) && + ValidSpiGPIO(GPIO_ILI9341_DC) + ); + + // If SPI_CS and/or SPI_DC is used they must be valid + TasmotaGlobal.spi_enabled = (valid_cs && valid_dc); if (TasmotaGlobal.spi_enabled) { TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); SetPin(12, AGPIO(GPIO_SPI_MISO)); @@ -1631,57 +1625,26 @@ void GpioInit(void) } #endif // ESP8266 #ifdef ESP32 - if (pin_cs < 99) { -/* - // Do not do this as ESP32 can have SPI_CS everywhere - if ((15 == pin_cs) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI - TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); - SetPin(12, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); - SetPin(13, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); - SetPin(14, AGPIO(GPIO_SPI_CLK)); + if (PinUsed(GPIO_SPI_CS) || + PinUsed(GPIO_RC522_CS) || + PinUsed(GPIO_NRF24_CS) || + PinUsed(GPIO_ILI9341_CS) + ) { + TasmotaGlobal.spi_enabled = true; + if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } - else if ((5 == pin_cs) && (!GetPin(19) && !GetPin(23) && !GetPin(18))) { // VSPI - TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); - SetPin(19, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); - SetPin(23, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); - SetPin(18, AGPIO(GPIO_SPI_CLK)); + else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } - else if ((12 == Pin(GPIO_SPI_MISO)) || (13 == Pin(GPIO_SPI_MOSI)) || (14 == Pin(GPIO_SPI_CLK))) { // HSPI - TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); - SetPin(12, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); - SetPin(13, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); - SetPin(14, AGPIO(GPIO_SPI_CLK)); - } - else if ((19 == Pin(GPIO_SPI_MISO)) || (23 == Pin(GPIO_SPI_MOSI)) || (18 == Pin(GPIO_SPI_CLK))) { // VSPI - TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); - SetPin(19, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); - SetPin(23, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); - SetPin(18, AGPIO(GPIO_SPI_CLK)); - } - TasmotaGlobal.spi_enabled = (PinUsed(GPIO_SPI_CLK) && (PinUsed(GPIO_SPI_MOSI) || PinUsed(GPIO_SPI_MISO))); -*/ - TasmotaGlobal.spi_enabled = (pin_cs < 99); - if (TasmotaGlobal.spi_enabled) { - if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); - } - else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); - } - else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); - } + else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); + } else { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Failed as no CLK and MISO and/or MOSI GPIO defined")); + TasmotaGlobal.spi_enabled = false; } } #endif // ESP32 diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index c3bb7044b..2f21ed0aa 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -46,6 +46,11 @@ #undef CODE_IMAGE_STR #define CODE_IMAGE_STR "odroid-go" +#undef MODULE +#define MODULE ODROID_GO // [Module] Select default module from tasmota_template.h +#undef FALLBACK_MODULE +#define FALLBACK_MODULE ODROID_GO // [Module2] Select default module on fast reboot where USER_MODULE is user template + #define USE_ODROID_GO // Add support for Odroid Go #define USE_ADC #define USE_SPI diff --git a/tasmota/xdrv_33_nrf24l01.ino b/tasmota/xdrv_33_nrf24l01.ino index 7c4d1b843..1b3c5b8c8 100644 --- a/tasmota/xdrv_33_nrf24l01.ino +++ b/tasmota/xdrv_33_nrf24l01.ino @@ -34,7 +34,7 @@ /*********************************************************************************************\ * NRF24l01(+) * -* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_SPI_CS/GPIO_SPI_DC +* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_NRF24_CS/GPIO_NRF24_DC \*********************************************************************************************/ #define XDRV_33 33 @@ -51,28 +51,26 @@ struct { RF24 NRF24radio; -bool NRF24initRadio() -{ - NRF24radio.begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); +bool NRF24initRadio() { + NRF24radio.begin(Pin(GPIO_NRF24_CS), Pin(GPIO_NRF24_DC)); NRF24radio.powerUp(); - if(NRF24radio.isChipConnected()){ - DEBUG_DRIVER_LOG(PSTR("NRF24 chip connected")); + if (NRF24radio.isChipConnected()) { + DEBUG_DRIVER_LOG(PSTR("NRF: Chip connected")); return true; } - DEBUG_DRIVER_LOG(PSTR("NRF24 chip NOT !!!! connected")); + DEBUG_DRIVER_LOG(PSTR("NRF: Chip NOT !!!! connected")); return false; } -bool NRF24Detect(void) -{ - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { - if(NRF24initRadio()){ +bool NRF24Detect(void) { + if (PinUsed(GPIO_NRF24_CS) && PinUsed(GPIO_NRF24_DC)) { + if (NRF24initRadio()) { NRF24.chipType = 32; // SPACE - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01 initialized")); - if(NRF24radio.isPVariant()){ + AddLog_P(LOG_LEVEL_INFO,PSTR("NRF: Model 24L01 initialized")); + if (NRF24radio.isPVariant()) { NRF24.chipType = 43; // + - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01+ detected")); + AddLog_P(LOG_LEVEL_INFO,PSTR("NRF: Model 24L01+ detected")); } return true; } @@ -84,12 +82,13 @@ bool NRF24Detect(void) * Interface \*********************************************************************************************/ -bool Xdrv33(uint8_t function) -{ +bool Xdrv33(uint8_t function) { bool result = false; - if (FUNC_INIT == function) { - result = NRF24Detect(); + if (TasmotaGlobal.spi_enabled) { + if (FUNC_INIT == function) { + result = NRF24Detect(); + } } return result; } diff --git a/tasmota/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino index adabfe6b0..005f048eb 100644 --- a/tasmota/xdsp_04_ili9341.ino +++ b/tasmota/xdsp_04_ili9341.ino @@ -57,8 +57,7 @@ bool Ili9341Header(void) { return (tft_cols > 17); } -void Ili9341InitMode(void) -{ +void Ili9341InitMode(void) { tft->setRotation(Settings.display_rotate); // 0 tft->invertDisplay(0); tft->fillScreen(ILI9341_BLACK); @@ -78,8 +77,7 @@ void Ili9341InitMode(void) } } -void Ili9341Init(uint8_t mode) -{ +void Ili9341Init(uint8_t mode) { switch(mode) { case DISPLAY_INIT_MODE: Ili9341InitMode(); @@ -95,24 +93,11 @@ void Ili9341Init(uint8_t mode) } } -void Ili9341InitDriver(void) -{ - uint32_t pin_cs = Pin(GPIO_SPI_CS); - uint32_t pin_dc = Pin(GPIO_SPI_DC); - if (!Settings.display_model) { - if (PinUsed(GPIO_ILI9341_CS)) { - pin_cs = Pin(GPIO_ILI9341_CS); - if (PinUsed(GPIO_ILI9341_DC)) { - pin_dc = Pin(GPIO_ILI9341_DC); - } - Settings.display_model = XDSP_04; - } +void Ili9341InitDriver(void) { + if (PinUsed(GPIO_ILI9341_CS) && PinUsed(GPIO_ILI9341_DC)) { - // Legacy Settings.display_model = XDSP_04; - } - if (XDSP_04 == Settings.display_model) { if (Settings.display_width != ILI9341_TFTWIDTH) { Settings.display_width = ILI9341_TFTWIDTH; } @@ -120,7 +105,7 @@ void Ili9341InitDriver(void) Settings.display_height = ILI9341_TFTHEIGHT; } - tft = new Adafruit_ILI9341(pin_cs, pin_dc); + tft = new Adafruit_ILI9341(Pin(GPIO_ILI9341_CS), Pin(GPIO_ILI9341_DC)); tft->begin(); #ifdef USE_DISPLAY_MODES1TO5 @@ -135,14 +120,12 @@ void Ili9341InitDriver(void) } } -void Ili9341Clear(void) -{ +void Ili9341Clear(void) { tft->fillScreen(ILI9341_BLACK); tft->setCursor(0, 0); } -void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) -{ +void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) { uint16_t active_color = ILI9341_WHITE; tft->setTextSize(Settings.display_size); @@ -156,8 +139,7 @@ void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint tft->println(str); } -void Ili9341DisplayOnOff() -{ +void Ili9341DisplayOnOff() { // tft->showDisplay(disp_power); // tft->invertDisplay(disp_power); if (PinUsed(GPIO_BACKLIGHT)) { @@ -170,8 +152,7 @@ void Ili9341DisplayOnOff() #ifdef USE_DISPLAY_MODES1TO5 -void Ili9341PrintLog(void) -{ +void Ili9341PrintLog(void) { disp_refresh--; if (!disp_refresh) { disp_refresh = Settings.display_refresh; @@ -217,8 +198,7 @@ void Ili9341PrintLog(void) } } -void Ili9341Refresh(void) // Every second -{ +void Ili9341Refresh(void) { // Every second if (Settings.display_mode) { // Mode 0 is User text // 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20 // 24-04-2017 13:45 = 16 + 1 ('\0') = 17 @@ -263,8 +243,7 @@ void Ili9341Refresh(void) // Every second * Interface \*********************************************************************************************/ -bool Xdsp04(uint8_t function) -{ +bool Xdsp04(uint8_t function) { bool result = false; if (TasmotaGlobal.spi_enabled) { From 9c2b8040f185164d9e2e1cad320fa01275caa996 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 30 Dec 2020 17:52:05 +0100 Subject: [PATCH 044/255] Revert "Breaking change replaced NRF24L01 GPIO selection" This reverts commit 01f3a7da19cec91b62b4453852d6bb7cbebf0457. --- CHANGELOG.md | 5 +- RELEASENOTES.md | 3 - tasmota/support.ino | 17 ++--- tasmota/support_tasmota.ino | 97 ++++++++++++++++++-------- tasmota/tasmota_configurations_ESP32.h | 5 -- tasmota/xdrv_33_nrf24l01.ino | 35 +++++----- tasmota/xdsp_04_ili9341.ino | 43 +++++++++--- 7 files changed, 123 insertions(+), 82 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c39ba0abf..d542934fa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,13 +6,12 @@ All notable changes to this project will be documented in this file. ## [9.2.0.2] ### Added - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) -- Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311) -- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) +- Command ``CTRange`` to specify the visible CT range the bulb is capable of +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` -- Replaced NRF24L01 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_NRF24_CS`` and ``GPIO_SPI_DC`` by ``GPIO_NRF24_DC`` ## [9.2.0.1] 20201229 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f7d6c073d..6f02fa36f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -58,8 +58,6 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.2.0.2 ### Added -- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) -- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) @@ -75,7 +73,6 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` - Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` -- Replaced NRF24L01 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_NRF24_CS`` and ``GPIO_SPI_DC`` by ``GPIO_NRF24_DC`` ### Changed - Logging from heap to stack freeing 700 bytes RAM diff --git a/tasmota/support.ino b/tasmota/support.ino index 81e826365..fcf21a014 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1479,7 +1479,8 @@ bool FlashPin(uint32_t pin) return (((pin > 5) && (pin < 9)) || (11 == pin)); } -uint32_t ValidPin(uint32_t pin, uint32_t gpio) { +uint32_t ValidPin(uint32_t pin, uint32_t gpio) +{ if (FlashPin(pin)) { return GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11 } @@ -1494,7 +1495,8 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio) { return gpio; } -bool ValidGPIO(uint32_t pin, uint32_t gpio) { +bool ValidGPIO(uint32_t pin, uint32_t gpio) +{ #ifdef ESP8266 #ifdef USE_ADC_VCC if (ADC0_PIN == pin) { return false; } // ADC0 = GPIO17 @@ -1503,17 +1505,6 @@ bool ValidGPIO(uint32_t pin, uint32_t gpio) { return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins } -bool ValidSpiGPIO(uint32_t gpio) { - // ESP8266: If SPI pin selected chk if it's not one of the three Hardware SPI pins (12..14) - bool result = true; // Not used and therefore valid - uint32_t pin; - if (PinUsed(gpio)) { - pin = Pin(gpio); - result = ((pin < 12) || (pin > 14)); - } - return result; -} - bool JsonTemplate(char* dataBuf) { // Old: {"NAME":"Shelly 2.5","GPIO":[56,0,17,0,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18} diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 325ad3b2e..58b79e905 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1599,20 +1599,26 @@ void GpioInit(void) TasmotaGlobal.soft_spi_enabled = (PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); #ifdef USE_SPI + uint32_t pin_cs = Pin(GPIO_SPI_CS); + uint32_t pin_dc = Pin(GPIO_SPI_DC); + if (PinUsed(GPIO_RC522_CS)) { + pin_cs = Pin(GPIO_RC522_CS); + } + if (PinUsed(GPIO_ILI9341_CS)) { + pin_cs = Pin(GPIO_ILI9341_CS); + if (PinUsed(GPIO_ILI9341_DC)) { + pin_dc = Pin(GPIO_ILI9341_DC); + } + } + #ifdef ESP8266 if (!TasmotaGlobal.soft_spi_enabled) { - bool valid_cs = (ValidSpiGPIO(GPIO_SPI_CS) && - ValidSpiGPIO(GPIO_RC522_CS) && - ValidSpiGPIO(GPIO_NRF24_CS) && - ValidSpiGPIO(GPIO_ILI9341_CS) - ); - bool valid_dc = (ValidSpiGPIO(GPIO_SPI_DC) && - ValidSpiGPIO(GPIO_NRF24_DC) && - ValidSpiGPIO(GPIO_ILI9341_DC) - ); - - // If SPI_CS and/or SPI_DC is used they must be valid - TasmotaGlobal.spi_enabled = (valid_cs && valid_dc); + // If SPI_CS is used it must be valid + TasmotaGlobal.spi_enabled = ((pin_cs < 99) && ((pin_cs > 14) || (pin_cs < 12))); + if (TasmotaGlobal.spi_enabled && (pin_dc < 99)) { + // If SPI_DC is used it must be valid + TasmotaGlobal.spi_enabled = ((pin_dc > 14) || (pin_dc < 12)); + } if (TasmotaGlobal.spi_enabled) { TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); SetPin(12, AGPIO(GPIO_SPI_MISO)); @@ -1625,26 +1631,57 @@ void GpioInit(void) } #endif // ESP8266 #ifdef ESP32 - if (PinUsed(GPIO_SPI_CS) || - PinUsed(GPIO_RC522_CS) || - PinUsed(GPIO_NRF24_CS) || - PinUsed(GPIO_ILI9341_CS) - ) { - TasmotaGlobal.spi_enabled = true; - if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); + if (pin_cs < 99) { +/* + // Do not do this as ESP32 can have SPI_CS everywhere + if ((15 == pin_cs) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI + TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); + SetPin(12, AGPIO(GPIO_SPI_MISO)); + TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); + SetPin(13, AGPIO(GPIO_SPI_MOSI)); + TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); + SetPin(14, AGPIO(GPIO_SPI_CLK)); } - else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); + else if ((5 == pin_cs) && (!GetPin(19) && !GetPin(23) && !GetPin(18))) { // VSPI + TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); + SetPin(19, AGPIO(GPIO_SPI_MISO)); + TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); + SetPin(23, AGPIO(GPIO_SPI_MOSI)); + TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); + SetPin(18, AGPIO(GPIO_SPI_CLK)); } - else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); - } else { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Failed as no CLK and MISO and/or MOSI GPIO defined")); - TasmotaGlobal.spi_enabled = false; + else if ((12 == Pin(GPIO_SPI_MISO)) || (13 == Pin(GPIO_SPI_MOSI)) || (14 == Pin(GPIO_SPI_CLK))) { // HSPI + TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); + SetPin(12, AGPIO(GPIO_SPI_MISO)); + TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); + SetPin(13, AGPIO(GPIO_SPI_MOSI)); + TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); + SetPin(14, AGPIO(GPIO_SPI_CLK)); + } + else if ((19 == Pin(GPIO_SPI_MISO)) || (23 == Pin(GPIO_SPI_MOSI)) || (18 == Pin(GPIO_SPI_CLK))) { // VSPI + TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); + SetPin(19, AGPIO(GPIO_SPI_MISO)); + TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); + SetPin(23, AGPIO(GPIO_SPI_MOSI)); + TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); + SetPin(18, AGPIO(GPIO_SPI_CLK)); + } + TasmotaGlobal.spi_enabled = (PinUsed(GPIO_SPI_CLK) && (PinUsed(GPIO_SPI_MOSI) || PinUsed(GPIO_SPI_MISO))); +*/ + TasmotaGlobal.spi_enabled = (pin_cs < 99); + if (TasmotaGlobal.spi_enabled) { + if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); + } + else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); + } + else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), + Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); + } } } #endif // ESP32 diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index 2f21ed0aa..c3bb7044b 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -46,11 +46,6 @@ #undef CODE_IMAGE_STR #define CODE_IMAGE_STR "odroid-go" -#undef MODULE -#define MODULE ODROID_GO // [Module] Select default module from tasmota_template.h -#undef FALLBACK_MODULE -#define FALLBACK_MODULE ODROID_GO // [Module2] Select default module on fast reboot where USER_MODULE is user template - #define USE_ODROID_GO // Add support for Odroid Go #define USE_ADC #define USE_SPI diff --git a/tasmota/xdrv_33_nrf24l01.ino b/tasmota/xdrv_33_nrf24l01.ino index 1b3c5b8c8..7c4d1b843 100644 --- a/tasmota/xdrv_33_nrf24l01.ino +++ b/tasmota/xdrv_33_nrf24l01.ino @@ -34,7 +34,7 @@ /*********************************************************************************************\ * NRF24l01(+) * -* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_NRF24_CS/GPIO_NRF24_DC +* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_SPI_CS/GPIO_SPI_DC \*********************************************************************************************/ #define XDRV_33 33 @@ -51,26 +51,28 @@ struct { RF24 NRF24radio; -bool NRF24initRadio() { - NRF24radio.begin(Pin(GPIO_NRF24_CS), Pin(GPIO_NRF24_DC)); +bool NRF24initRadio() +{ + NRF24radio.begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); NRF24radio.powerUp(); - if (NRF24radio.isChipConnected()) { - DEBUG_DRIVER_LOG(PSTR("NRF: Chip connected")); + if(NRF24radio.isChipConnected()){ + DEBUG_DRIVER_LOG(PSTR("NRF24 chip connected")); return true; } - DEBUG_DRIVER_LOG(PSTR("NRF: Chip NOT !!!! connected")); + DEBUG_DRIVER_LOG(PSTR("NRF24 chip NOT !!!! connected")); return false; } -bool NRF24Detect(void) { - if (PinUsed(GPIO_NRF24_CS) && PinUsed(GPIO_NRF24_DC)) { - if (NRF24initRadio()) { +bool NRF24Detect(void) +{ + if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { + if(NRF24initRadio()){ NRF24.chipType = 32; // SPACE - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF: Model 24L01 initialized")); - if (NRF24radio.isPVariant()) { + AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01 initialized")); + if(NRF24radio.isPVariant()){ NRF24.chipType = 43; // + - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF: Model 24L01+ detected")); + AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01+ detected")); } return true; } @@ -82,13 +84,12 @@ bool NRF24Detect(void) { * Interface \*********************************************************************************************/ -bool Xdrv33(uint8_t function) { +bool Xdrv33(uint8_t function) +{ bool result = false; - if (TasmotaGlobal.spi_enabled) { - if (FUNC_INIT == function) { - result = NRF24Detect(); - } + if (FUNC_INIT == function) { + result = NRF24Detect(); } return result; } diff --git a/tasmota/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino index 005f048eb..adabfe6b0 100644 --- a/tasmota/xdsp_04_ili9341.ino +++ b/tasmota/xdsp_04_ili9341.ino @@ -57,7 +57,8 @@ bool Ili9341Header(void) { return (tft_cols > 17); } -void Ili9341InitMode(void) { +void Ili9341InitMode(void) +{ tft->setRotation(Settings.display_rotate); // 0 tft->invertDisplay(0); tft->fillScreen(ILI9341_BLACK); @@ -77,7 +78,8 @@ void Ili9341InitMode(void) { } } -void Ili9341Init(uint8_t mode) { +void Ili9341Init(uint8_t mode) +{ switch(mode) { case DISPLAY_INIT_MODE: Ili9341InitMode(); @@ -93,11 +95,24 @@ void Ili9341Init(uint8_t mode) { } } -void Ili9341InitDriver(void) { - if (PinUsed(GPIO_ILI9341_CS) && PinUsed(GPIO_ILI9341_DC)) { +void Ili9341InitDriver(void) +{ + uint32_t pin_cs = Pin(GPIO_SPI_CS); + uint32_t pin_dc = Pin(GPIO_SPI_DC); + if (!Settings.display_model) { + if (PinUsed(GPIO_ILI9341_CS)) { + pin_cs = Pin(GPIO_ILI9341_CS); + if (PinUsed(GPIO_ILI9341_DC)) { + pin_dc = Pin(GPIO_ILI9341_DC); + } + Settings.display_model = XDSP_04; + } + // Legacy Settings.display_model = XDSP_04; + } + if (XDSP_04 == Settings.display_model) { if (Settings.display_width != ILI9341_TFTWIDTH) { Settings.display_width = ILI9341_TFTWIDTH; } @@ -105,7 +120,7 @@ void Ili9341InitDriver(void) { Settings.display_height = ILI9341_TFTHEIGHT; } - tft = new Adafruit_ILI9341(Pin(GPIO_ILI9341_CS), Pin(GPIO_ILI9341_DC)); + tft = new Adafruit_ILI9341(pin_cs, pin_dc); tft->begin(); #ifdef USE_DISPLAY_MODES1TO5 @@ -120,12 +135,14 @@ void Ili9341InitDriver(void) { } } -void Ili9341Clear(void) { +void Ili9341Clear(void) +{ tft->fillScreen(ILI9341_BLACK); tft->setCursor(0, 0); } -void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) { +void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) +{ uint16_t active_color = ILI9341_WHITE; tft->setTextSize(Settings.display_size); @@ -139,7 +156,8 @@ void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint tft->println(str); } -void Ili9341DisplayOnOff() { +void Ili9341DisplayOnOff() +{ // tft->showDisplay(disp_power); // tft->invertDisplay(disp_power); if (PinUsed(GPIO_BACKLIGHT)) { @@ -152,7 +170,8 @@ void Ili9341DisplayOnOff() { #ifdef USE_DISPLAY_MODES1TO5 -void Ili9341PrintLog(void) { +void Ili9341PrintLog(void) +{ disp_refresh--; if (!disp_refresh) { disp_refresh = Settings.display_refresh; @@ -198,7 +217,8 @@ void Ili9341PrintLog(void) { } } -void Ili9341Refresh(void) { // Every second +void Ili9341Refresh(void) // Every second +{ if (Settings.display_mode) { // Mode 0 is User text // 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20 // 24-04-2017 13:45 = 16 + 1 ('\0') = 17 @@ -243,7 +263,8 @@ void Ili9341Refresh(void) { // Every second * Interface \*********************************************************************************************/ -bool Xdsp04(uint8_t function) { +bool Xdsp04(uint8_t function) +{ bool result = false; if (TasmotaGlobal.spi_enabled) { From db7e0ff97adcc0460e76f698f0432dd7d8a39bc7 Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Wed, 30 Dec 2020 23:51:02 +0100 Subject: [PATCH 045/255] SSD1331: fixed hardware SPI --- tasmota/xdsp_14_SSD1331.ino | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index 031115beb..f2f15e9d5 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -32,6 +32,7 @@ #define SSD1331_WHITE 0xFFFF // 255, 255, 255 #include +#include extern uint8_t *buffer; extern uint8_t color_type; @@ -60,14 +61,14 @@ void SSD1331_InitDriver() { bg_color = SSD1331_BLACK; // init renderer - if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK)){ - ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_DC),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),OLED_RESET); + if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_DC) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_OLED_RESET)) { + ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_DC),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),Pin(GPIO_OLED_RESET)); + } else if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC) && PinUsed(GPIO_OLED_RESET)) { + ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_OLED_RESET)); + } else if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { + ssd1331 = new Adafruit_SSD1331(&SPI,Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); } else { - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK),OLED_RESET); - } else { - return; - } + return; } delay(100); From 3676ad3eb8548fe644e50d1fb0d2f81606debd14 Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Thu, 31 Dec 2020 09:06:21 +0100 Subject: [PATCH 046/255] Removed font setting in DisplayMode 1 The user can choose it using DisplayFont. --- tasmota/xdsp_14_SSD1331.ino | 1 - 1 file changed, 1 deletion(-) diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index f2f15e9d5..a34890b48 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -126,7 +126,6 @@ void SSD1331Time(void) char line[12]; renderer->clearDisplay(); - renderer->setTextSize(2); renderer->setCursor(0, 0); snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ] renderer->println(line); From 8f63663c1e3ec0dc4968adc9c635699acc81cb44 Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Thu, 31 Dec 2020 10:17:30 +0100 Subject: [PATCH 047/255] Improved hardware SPI. Removed unnecessary setTextSize in PrintLog. --- tasmota/xdsp_14_SSD1331.ino | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index a34890b48..ac6e3e994 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -63,10 +63,8 @@ void SSD1331_InitDriver() { // init renderer if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_DC) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_OLED_RESET)) { ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_DC),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),Pin(GPIO_OLED_RESET)); - } else if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC) && PinUsed(GPIO_OLED_RESET)) { - ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_OLED_RESET)); } else if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { - ssd1331 = new Adafruit_SSD1331(&SPI,Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); + ssd1331 = new Adafruit_SSD1331(&SPI,Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_OLED_RESET)); } else { return; } @@ -104,7 +102,6 @@ void SSD1331PrintLog(void) uint8_t last_row = Settings.display_rows -1; renderer->clearDisplay(); - renderer->setTextSize(Settings.display_size); renderer->setCursor(0,0); for (byte i = 0; i < last_row; i++) { strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); From 89e697fab64eb7e12ff678f26b1f92889eb657d8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 31 Dec 2020 11:47:37 +0100 Subject: [PATCH 048/255] Revert "Merge pull request #10318 from btsimonh/webtimeouts" This reverts commit c7ff3f39db49a5668839d63fe1eeb77f7e58f9d9, reversing changes made to 0703e5899b7d5251c4018c3706ae988798ec2f7b. --- tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h | 67 +++++++------ .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 42 ++++---- .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 54 +++++------ .../html_uncompressed/HTTP_SCRIPT_CONSOL.h | 97 +++++++++---------- .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 16 +-- .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 27 +++--- 6 files changed, 147 insertions(+), 156 deletions(-) diff --git a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h index 9138c4e8a..91e1fab76 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h @@ -2,39 +2,38 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_CONSOL_SIZE = 913; -const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x3D\xA1\x3A\x5E\xE3\xE1\xC6\x75\x16\x88\x7C\x38\xCE\xA2\x31\x47\x83\x02\xF8\x3A" - "\xDC\xE4\x11\xDD\x18\x77\x8F\x68\x4E\x90\x67\x56\x1F\x0F\xB3\xEC\xF0\x18\x4E\xFE" - "\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE0\x49\x9A\x62\x8E\xF1\xE2\x8F\x8C\x71\xDD\x3E" - "\xE8\xE4\x3E\xCE\xF1\xE0\xB4\xC1\xDD\x18\x7C\x3E\x1C\x87\x78\xF6\x90\x67\xC6\x38" - "\xEE\x9F\x61\x9C\x87\xD9\xDE\x3C\x16\x1F\x0F\xB3\xF4\x19\xC8\x7C\x3E\xCE\xD9\x3E" - "\x0F\x04\x64\x2C\xBE\x5A\x41\xE0\xD1\x99\xCF\xA8\xEE\x86\x74\x33\xB0\x85\xB3\xBC" - "\x78\x04\x28\xA7\xC3\xEC\xFB\x3C\x51\xD3\xC1\xFF\x02\x08\xAB\x06\x1F\x0E\x22\x37" - "\xA0\x1E\x3D\xC7\xC0\x46\xA2\x78\x3D\xDA\x60\xEE\x82\x34\xC3\xF0\xF9\xEE\x3B\xC7" - "\xB7\x4C\x1D\xD3\x61\xFC\x3E\x70\xB0\x82\x3B\xC7\xB4\xD8\x74\xB1\xD9\xFA\x3B\xA7" - "\x78\xF0\x7B\x8D\x87\xCE\x63\xE8\x8D\x84\x34\x82\x21\x55\x43\x0B\xEC\xD4\x2D\xFA" - "\x8E\xE9\xDE\x3C\x1B\x0E\x99\xDF\x76\x21\x97\xAA\xE9\x86\x2A\x2B\xF8\x79\x9F\x01" - "\x0F\x85\xF3\xBA\x08\x39\x51\xD3\xEE\xC4\x32\x2F\x55\xD3\x3E\x1F\x0E\x61\xFA\x3F" - "\x44\x6C\x3A\x7A\xAE\x85\xF8\xF8\x7C\x39\x4D\x90\x20\xF0\xFE\x6D\x3A\x84\x3C\x08" - "\x7C\x36\x1D\x3E\xFC\x33\x3B\xCC\xA9\x9B\x28\xE9\xE1\x81\x6D\x1D\xD3\xB0\xF7\x1C" - "\x87\x61\xDE\x3C\x16\x88\x7C\x10\xE9\xE1\x5A\x62\x8E\xE9\xDE\x3C\x69\x83\xBA\x08" - "\x92\x4F\x87\xC3\x8C\xEF\x1E\xD2\xA0\x45\xE1\x44\xF7\x1B\x41\x27\x05\x36\x9D\x02" - "\x7C\x3D\x42\x8F\xC0\x45\xC0\xCE\xD9\xF0\xDA\x78\x3D\xC0\xB9\xC3\xC8\x26\x71\xF4" - "\x15\x1F\x3C\xE8\x11\x39\x1D\x3A\x8F\xA1\x0E\xF1\xE0\xF7\x1E\xE3\xC1\xB0\xE9\x83" - "\x1F\x1D\xD3\xEC\x87\x89\x95\x1F\x67\x51\xF6\x1F\x8E\xD0\x67\x28\xF8\x7D\x9D\xB2" - "\xD1\x0E\xDE\x1D\x55\xF1\x6C\xEF\x1E\x0D\x87\x4F\x3E\x10\xEE\x9D\xE3\xC1\x80\x4A" - "\xC7\x4E\x53\x6D\x9D\xE3\xC1\xEE\x2F\xBA\x17\xFE\x46\x2C\x2F\x33\xC1\xEE\x1F\x08" - "\xEE\x84\x77\x8F\x01\x3A\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF1\xF0\xE3\x20\x45\xE6" - "\xC4\x51\xDD\x3B\xC7\xB4\x10\xF9\x6D\x3A\x58\x82\x13\x33\x7D\x44\x16\xFA\x9F\x3F" - "\x9D\xD3\xEC\xD1\x99\x09\x83\xFC\x7D\x9D\x40\x89\xC6\xFB\x04\x1E\x2F\x47\x02\x27" - "\x34\x67\x50\x67\xC6\x74\x34\x66\x44\x1E\x08\xCF\x1A\x60\xEE\x9C\xBF\x9F\x0F\x84" - "\x19\xFE\x3F\xC7\x31\x9F\x0F\x84\x19\xDE\x3D\xA3\x8E\x96\x2E\xB0\x3C\x1A\x30\x27" - "\x4C\xF8\x7D\xE1\x83\x07\xD9\xE0\xF7\x1C\xBF\x9F\x0F\x84\x19\xDA\x3B\xA7\x6C\xED" - "\x87\xC7\xE0\xA0\xC1\x0B\x8A\xE3\xF4\x7E\x8E\xE8\x7C\x7C\x04\x49\x67\x78\xEA\x1C" - "\x08\x5C\x71\x0A\x0C\xF7\x83\xE3\xAC\xE4\x3D\xF3\xFC\x7F\x8F\xB3\xEC\xEF\x1E\x78" - "\xCF\x87\xC2\x0C\xED\x1D\xD3\x8C\xFC\x3A\xCE\xB2\x0F\x81\x07\x10\x38\xC8\x14\xF0" - "\x83\x92\xCF\x87\xC2\x0C\xFD\x1F\xA3\xBA\x08\x99\x89\xF8\x72\x23\xF4\x7E\x88\x50" - "\x67\x41\x98\x30\xEE\x9D\xE3\xA8\x50\x67\x41\x7C\x08\x3C\x9C\x02\x16\x38\x77\x8E" - "\xA0\xF8\xF8\x71\x9D\xE3\xDC\x77\x8F\x07\xB8\x87\xC2\x3B\xA2\x8E\xF1\xE0\xF7\x1B"; +const size_t HTTP_SCRIPT_CONSOL_SIZE = 853; +const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x82\x30\x2F\x83\xAD\xCE\x41\x1D" + "\xD1\x87\x78\xF6\x99\xDF\xD0\x67\x56\x1F\x0F\xB3\xEC\xEA\xA3\xC0\x61\x3B\xF9\x56" + "\x8D\x78\x2E\x8E\xE8\x54\x77\x8F\x14\x7C\x63\x8E\xE9\xF7\x47\x21\xF6\x77\x8F\x05" + "\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7\x74\xFB\x0C\xE4\x3E\xCE" + "\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0\x78\x23\x21\x65\xF2\xD2" + "\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3\xC0\x21\x45\x3E\x1F\x67" + "\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD\x2A\x01\xF1\xEE\x3E\x02" + "\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE\x3D\xBA\x60\xEE\x9B\x0F" + "\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD\x3B\xC7\x83\xDC\x6C\x3E" + "\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F\xD4\x77\x4E\xF1\xE0\xD8" + "\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08\x7C\x28\x1D\xD0\x41\xCA" + "\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F" + "\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\x03\x69\xD4\x21\xE0\x43\xE1\xB0\xE9\xF7\xE1\x99" + "\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4\x3B\x0E\xF1\xE0\xB4\x43" + "\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44\x92\x7C\x3E\x1C\x67\x78" + "\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13\xE1\xEA\x14\x7E\x02\x2E" + "\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xDE\x1E\x4F\x71\xE0\xD8\x74\xC1\x8F\x8E\xE9\xF6" + "\x43\xC4\xCA\x8F\xB3\xA8\xFB\x0F\xC7\x68\x33\x94\x7C\x3E\xCE\xD9\x68\x87\x6F\x0E" + "\xAA\xF8\xB6\x77\x8F\x06\xC3\xA7\x9F\x08\x77\x4E\xF1\xE0\xF7\x05\x47\xCF\x3A\x04" + "\x4E\x4A\x4E\xA3\xE8\x43\xBC\x78\xFB\xA1\x7F\xE4\x62\xC2\xF3\x3C\x1E\xE1\xF0\x8E" + "\xE8\x47\x78\xF0\x67\x7F\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF0\x23\xF2\xF4\x28\xEE" + "\x9D\xE3\xDA\x08\x7C\xA2\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F\xCE\xE9\xF6" + "\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE2\xDD\x82\x0F\x12\xA3\x81\x13\x97\xB3\xA8" + "\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2\x0C\xFF\x1F" + "\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13\xA6\x7C\x3E" + "\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76\xC3\xE3\xF0" + "\x50\x60\x85\xC4\x31\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E\x04\x2E\x2E" + "\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C\x67\xC3\xE1" + "\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78\x41\xC9\x67" + "\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28\x33\xA0\xCC" + "\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x44\x01\x0B\x1C\x3B\xC7\x50\x7C\x7C" + "\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0"; #define HTTP_SCRIPT_CONSOL Decompress(HTTP_SCRIPT_CONSOL_COMPRESSED,HTTP_SCRIPT_CONSOL_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index d7a530b43..2f61ce116 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -2,26 +2,26 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 574; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x3D\xA1\x3A\x46\x28\xF0\x60\x5F\x07\x5B\x9C\x82\xB3\xBA\x30\xEF\x1E\xDB\x3E\x0C" - "\x3F\xC7\xF8\xFB\x3E\xCF\x01\x84\xEF\xE5\x5A\x35\xE0\xBA\x3B\xA6\x28\xEF\x02\x4C" - "\xD0\xA8\xEF\x1E\x34\xC1\xDD\x36\x1F\xC3\xE7\x0B\x08\x23\xBC\x7B\x4D\x87\x4B\x1D" - "\x9F\xA3\xBA\x77\x8F\x71\xB0\xF9\xCC\x7D\x11\xB0\x86\x90\x44\x2A\x2B\xA8\x61\x7D" - "\x9A\x85\xBF\x51\xDD\x3B\xC7\x83\x61\xD3\x3B\xEE\xC4\x32\xF5\x5D\x30\xC5\x5F\x0F" - "\x33\xE0\x21\xEA\xE7\x74\xEF\x1E\xDD\x30\x77\x4D\x87\x4F\xBB\x10\xC8\xBD\x57\x4C" - "\xF8\x7C\x39\x87\xE8\xFD\x11\xB0\xE9\xEA\xBA\x17\xE3\xE1\xF0\xE5\x36\x77\x8F\x69" - "\x19\xDF\xD7\x8F\x86\xC3\xA7\xDF\x86\x67\x79\x95\x33\x65\x1D\x3E\xC6\x05\x61\xB3" - "\xBA\x76\x1E\xDA\x3D\xC7\x60\xF1\xD4\x7B\x0F\x4A\xB1\xC1\x35\xEA\x32\x09\x9F\x0F" - "\xB1\xFD\x12\x85\x1E\x67\x23\x67\xD1\xF4\x7D\x9F\x87\xB0\xEF\x10\x23\x61\x5E\x04" - "\x2C\x2B\xE7\xE1\xE9\x42\x81\x26\xB8\xD0\x41\xAE\x76\x50\xA3\xF0\xF4\xA1\x01\x27" - "\x27\x39\x4C\x86\x1B\x0F\x03\xE2\xB6\x99\xD7\xE1\x96\x1B\x3C\xFB\x07\xFF\x63\x01" - "\x2B\x39\x60\x87\x8F\x08\x7E\x1E\x87\x65\x7C\x12\x6C\x86\x7B\x8E\xC1\xE3\xA8\xF6" - "\x1F\x47\xD1\xF6\x7E\x1E\x82\x69\x98\x21\xE7\x74\xCD\x94\x75\xD8\x5A\x3D\xC7\x98" - "\x6F\xA9\xFC\xF0\x63\x3A\x8E\xB1\xF7\xA3\xC2\xA8\xF3\x3D\x87\x78\xF0\xC7\x1D\xD3" - "\xEC\x23\x90\xFB\x3B\xC7\x42\xDE\xE7\xF2\x14\x54\x43\x48\x23\xE7\x81\x7B\x90\x10" - "\xA8\xF9\xE7\x40\x89\x3A\xCE\xA3\xE8\x43\xBC\x78\x3D\xC7\xB8\xF0\x6C\x3A\x60\xC7" - "\xC7\x74\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3" - "\xAA\xBE\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x30\x09\x78\xD1\xCA\x6D" - "\xB3\xBC\x78\x3D\xC7\xB8"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 524; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x69\x9D\xFD\x59\xF0\xFB\x3E\xCF\x1A" + "\x60\xEE\x85\x67\x4B\xF8\xF0\xB1\xAF\xAB\xC7\x40\x9F\x0F\x50\xA3\xE1\xF0\xE4\x3B" + "\xC7\xB4\xAC\xF8\x30\xF0\x18\x4E\xFE\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE3\xC1\xEE" + "\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE" + "\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3" + "\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xDA" + "\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F" + "\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x80\x7F\x1F\x0D\x87" + "\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B" + "\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C" + "\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2" + "\x85\x02\x4D\x71\xA0\x83\x5C\xEC\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36" + "\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E" + "\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC" + "\x3D\x04\xD3\x30\x43\xCE\xE9\x9B\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6" + "\x75\x1D\x63\xEF\x47\x85\x51\xE6\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77" + "\x8E\x85\xBD\xCF\xE4\x28\xA8\x86\x90\x47\xCF\x1E\x0F\x71\xEE\x3C\x1B\x0E\x98\x31" + "\xF1\xDD\x3E\xC8\x78\x99\x51\xF6\x75\x1F\x67\x43\xB4\x34\xF8\x72\x1F\x67\x6C\xAC" + "\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x02\xA3\xE7\x9D\x02\x27" + "\x23\x96\x75\x1F\x42\x1D\xE3\xC1\xEE"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index 1481a609c..bb52fbbcd 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -2,32 +2,32 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 844; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x09\xD2\xF9\x8F\x0A\x3E\x1C\x87\x51\x18\xA3\xC1\x81\x7C\x1D\x6E\x72\x0A\xCE\xE8" - "\xC3\xBC\x7B\x6C\xF8\x30\xFF\x1F\xE3\xEC\xFB\x3C\x06\x13\xBF\x95\x68\xD7\x82\xE8" - "\xEE\x98\xA3\xBC\x09\x33\x42\xA3\xBC\x78\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E" - "\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D" - "\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65" - "\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xD6\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F" - "\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3" - "\xE1\xCA\x6C\xEF\x1E\xD2\x33\xBF\xAF\x1F\x0D\x87\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66" - "\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63" - "\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F" - "\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2\x85\x02\x4D\x71\xA0\x83\x5C\xEC" - "\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C" - "\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9" - "\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC\x3D\x04\xD3\x30\x43\xCE\xE9\x9B" - "\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6\x75\x1D\x63\xEF\x47\x85\x51\xE6" - "\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77\x8E\x85\xBD\xCF\xE4\x28\xA8\x86" - "\x90\x47\xCF\x03\x01\xE4\x0B\xE6\x3C\x28\xEF\x1E\xD0\xA8\xF9\xE7\x40\x89\x5E\xCE" - "\xA3\xE8\x43\xBC\x78\x3D\xC7\xB8\xF7\x02\x2D\xE3\x61\xD3\x06\x3E\x3B\xA7\xD9\x0F" - "\x13\x2A\x2B\x3E\xCE\xA3\xEC\xE8\x76\x86\x9F\x0E\x43\xEC\xED\x95\x9D\x55\xF1\x6C" - "\xEF\x1E\x0D\x87\x4F\x3E\x10\xEE\x9D\xE3\xC1\x80\x4B\xC9\x0E\x53\x6D\x9D\xE3\xC1" - "\xEE\x3D\xC4\x08\x9C\xD3\x79\x99\xD9\xDD\x19\x7F\x3A\xB4\xCE\xFE\x77\x8F\x68\x56" - "\x77\x4F\xB3\xF5\xE3\x33\xE1\xF6\x76\xF4\xCE\xFE\x76\xCF\xB3\xF6\x7D\x9D\xB1\x97" - "\xF3\xBC\x78\x04\x6C\x37\x41\x23\x0D\x04\x1E\x7E\x4F\x2A\x01\xA7\x8A\x7C\xC7\x85" - "\x1F\x0E\x32\x04\x6C\x6C\x67\xCE\xE9\x83\xBC\x7B\x74\xC1\xDD\x30\x77\x8F\x68\x26" - "\x70\xBA\x09\x9C\x3F\x82\x87\x0C\xA0\x85\xA7\x9E\xE6\x17\x98\x2F\x64\x2A\x01\x87" - "\xAF\x9E\xE3"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 744; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x78\x23\x02\xF8\x3A\xDC\xE4\x15\x9D\xD1\x87\x78" + "\xF6\x99\xDF\xD5\x9F\x0F\xB3\xEC\xF1\xA6\x0E\xE8\x56\x74\xBF\x8F\x0B\x1A\xFA\xBC" + "\x74\x09\xF0\xF5\x0A\x3E\x1F\x0E\x43\xBC\x7B\x4A\xCF\x83\x0F\x01\x84\xEF\xE5\x5A" + "\x35\xE0\xBA\x3B\xA1\x51\xDE\x3C\x1E\xED\x30\x77\x4D\x87\xF0\xF9\xC2\xC2\x08\xEF" + "\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36\x10\xD2" + "\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8\x86\x5E" + "\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\xA0\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0\xE9\xF7" + "\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC\x7C\x3E" + "\x1C\xA6\xC8\x10\x78\x07\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\xD8" + "\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56\x38\x26\xBD\x46" + "\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0\xF6\x1D\xE2\x04" + "\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE\xCA\x14\x7E\x1E" + "\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32\xC3\x67\x9F\x60" + "\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D\x90\xCF\x71\xD8" + "\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99\xB2\x8E\xBB\x0B" + "\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E\x67\xB0\xEF\x1E" + "\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88\x69\x04\x7C\xF1" + "\xE0\xF7\x1E\xE3\xC6\x98\x47\x77\xE6\x3C\x28\xEF\x23\xDA\x6C\x3A\x60\xC7\xC7\x74" + "\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3\xAA\xBE" + "\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x0A\x8F\x9E\x74\x08\x9C\x93\xD9" + "\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x02\x27\x2E\x9E\x66\x76\x77\x46\x5F\xCE\xAD\x33" + "\xBF\x9D\xE3\xDA\x15\x9D\xD3\xEC\xFD\x78\xCC\xF8\x7D\x9D\xBD\x33\xBF\x9D\xB3\xEC" + "\xFD\x9F\x67\x6C\x65\xFC\xEF\x1E\x01\x1B\x0D\xD0\x48\xC3\x41\x0B\x9C\x40\x53\xC5" + "\x3E\x63\xC2\x8F\x87\x19\x02\x36\x36\x33\xE7\x74\xC1\xDE\x3D\xBA\x61\x1D\xD3\x07" + "\x79\x1E\xD0\x50\xDE\x81\x0B\x2F\x3D\xC9\x85\xE6\x8F\x68\x26\x73\xD0\x08\x79\x81" + "\xEE"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h index 0351e828e..51cfb66a3 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h @@ -1,54 +1,49 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = - "{" - "let sn=0,id=0,ft;" // Scroll position, Get most of weblog initially - "function l(p){" // Console log and command service - "let c,o='';" - "clearTimeout(lt);" - "clearTimeout(ft);" - "t=eb('t1');" - "if(p==1){" - "c=eb('c1');" // Console command id - "o='&c1='+encodeURIComponent(c.value);" - "c.value='';" - "t.scrollTop=99999;" - "sn=t.scrollTop;" - "}" - "if(t.scrollTop>=sn){" // User scrolled back so no updates - "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) - "x=new XMLHttpRequest();" - "x.onreadystatechange=function(){" - "if(x.readyState==4&&x.status==200){" - "let z,d;" - "d=x.responseText.split(/}1/);" // Field separator - "id=d.shift();" - "if(d.shift()==0){t.value='';}" - "z=d.shift();" - "if(z.length>0){t.value+=z;}" - "t.scrollTop=99999;" - "sn=t.scrollTop;" - "clearTimeout(ft);" - "lt=setTimeout(l,%d);" // webrefresh timer.... - "}" - "};" - "x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp)) - "x.send();" - "ft=setTimeout(l,20000);" // fail timeout, triggered 20s after asking for XHR - "}" - "return false;" + "var sn=0,id=0;" // Scroll position, Get most of weblog initially + "function l(p){" // Console log and command service + "var c,o='',t;" + "clearTimeout(lt);" + "t=eb('t1');" + "if(p==1){" + "c=eb('c1');" // Console command id + "o='&c1='+encodeURIComponent(c.value);" + "c.value='';" + "t.scrollTop=99999;" + "sn=t.scrollTop;" "}" - "wl(l);" // Load initial console text + "if(t.scrollTop>=sn){" // User scrolled back so no updates + "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) + "x=new XMLHttpRequest();" + "x.onreadystatechange=function(){" + "if(x.readyState==4&&x.status==200){" + "var z,d;" + "d=x.responseText.split(/}1/);" // Field separator + "id=d.shift();" + "if(d.shift()==0){t.value='';}" + "z=d.shift();" + "if(z.length>0){t.value+=z;}" + "t.scrollTop=99999;" + "sn=t.scrollTop;" + "}" + "};" + "x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp)) + "x.send();" + "}" + "lt=setTimeout(l,%d);" + "return false;" + "}" + "wl(l);" // Load initial console text - // Console command history - "let hc=[],cn=0;" // hc = History commands, cn = Number of history being shown - "function h(){" - // "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete - "eb('c1').addEventListener('keydown',function(e){" - "let b=eb('c1'),c=e.keyCode;" // c1 = Console command id - "if(38==c||40==c){b.autocomplete='off';}" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete - "38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp - "40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown - "13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history - "});" - "}" - "wl(h);" // Add console command key eventlistener after name has been synced with id (= wl(jd)) - "}"; + // Console command history + "var hc=[],cn=0;" // hc = History commands, cn = Number of history being shown + "function h(){" +// "if(!(navigator.maxTouchPoints||'ontouchstart'in document.documentElement)){eb('c1').autocomplete='off';}" // No touch so stop browser autocomplete + "eb('c1').addEventListener('keydown',function(e){" + "var b=eb('c1'),c=e.keyCode;" // c1 = Console command id + "if(38==c||40==c){b.autocomplete='off';}" // ArrowUp or ArrowDown must be a keyboard so stop browser autocomplete + "38==c?(++cn>hc.length&&(cn=hc.length),b.value=hc[cn-1]||''):" // ArrowUp + "40==c?(0>--cn&&(cn=0),b.value=hc[cn-1]||''):" // ArrowDown + "13==c&&(hc.length>19&&hc.pop(),hc.unshift(b.value),cn=0)" // Enter, 19 = Max number -1 of commands in history + "});" + "}" + "wl(h);"; // Add console command key eventlistener after name has been synced with id (= wl(jd)) diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index dd2cdc796..729bb54a5 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -1,9 +1,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = - "{let ft;" "function la(p){" - "a=p||'';" - "clearTimeout(ft);clearTimeout(lt);" - "if(x!=null){x.abort()}" // Abort if no response within 2 seconds (happens on restart 1) + "var a='';" + "if(la.arguments.length==1){" + "a=p;" + "clearTimeout(lt);" + "}" + "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" "if(x.readyState==4&&x.status==200){" @@ -14,11 +16,9 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>

hasArg("m") "x.send();" - "ft=setTimeout(la,20000);" // 20s failure timeout - "}}"; + "lt=setTimeout(la,%d);" // Settings.web_refresh + "}"; diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index ddb5e6941..2d76a8c91 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -1,8 +1,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = - "let rfsh=1,ft;" + "var rfsh=1;" "function la(p){" - "a=p||'';" - "clearTimeout(ft);clearTimeout(lt);" + "var a='';" + "if(la.arguments.length==1){" + "a=p;" + "clearTimeout(lt);" + "}" "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" @@ -14,16 +17,12 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>
hasArg("m") "x.send();" - "ft=setTimeout(la,20000);" // 20s failure timeout + "lt=setTimeout(la,%d);" // Settings.web_refresh "}" "}" "function seva(par,ivar){" @@ -35,13 +34,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = "rfsh=0;" "}" "function pr(f){" - "if(f){" - "clearTimeout(lt);clearTimeout(ft);" + "if (f) {" "lt=setTimeout(la,%d);" "rfsh=1;" - "}else{" - "clearTimeout(lt);clearTimeout(ft);" + "} else {" + "clearTimeout(lt);" "rfsh=0;" "}" - "}" - ; + "}"; From 6b2daa14d02c5e9689642c38824fc4390ab06724 Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Thu, 31 Dec 2020 11:36:35 +0000 Subject: [PATCH 049/255] Add mutex/semaphore for logging - protects new logging_buffer --- tasmota/support.ino | 105 ++++++++++++++++++++++++++++++++++++++++++++ tasmota/tasmota.ino | 1 + 2 files changed, 106 insertions(+) diff --git a/tasmota/support.ino b/tasmota/support.ino index fcf21a014..f12c6b007 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -111,6 +111,94 @@ String GetResetReason(void) } } + +/*********************************************************************************************\ + * ESP32 AutoMutex +\*********************************************************************************************/ + +////////////////////////////////////////// +// automutex. +// create a mute in your driver with: +// void *mutex = nullptr; +// TasAutoMutex::init(&mutex); +// +// then protect any function with +// TasAutoMutex m(mutex); +// - it will be automagically released when the function is over. +// - the same thread can take multiple times (recursive). +// - advanced options m.give() and m.take() allow you fine control within a function. +class TasAutoMutex { +#ifdef ESP32 + SemaphoreHandle_t mutex; +#endif + bool taken; + public: + TasAutoMutex(void * mutex, bool take=true); + ~TasAutoMutex(); + void give(); + void take(); + static void init(void ** ptr); +}; +////////////////////////////////////////// + +TasAutoMutex::TasAutoMutex(void * mutex, bool take){ +#ifdef ESP32 + if(mutex){ + if (take){ + xSemaphoreTakeRecursive(mutex, portMAX_DELAY); + this->taken = true; + } + this->mutex = (SemaphoreHandle_t ) mutex; + } else { + this->mutex = (SemaphoreHandle_t )nullptr; + } +#endif +} + +TasAutoMutex::~TasAutoMutex(){ +#ifdef ESP32 + if (this->mutex){ + if (this->taken){ + xSemaphoreGiveRecursive(this->mutex); + this->taken = false; + } + } +#endif +} + +void TasAutoMutex::init(void ** ptr){ +#ifdef ESP32 + SemaphoreHandle_t mutex = xSemaphoreCreateRecursiveMutex(); + (*ptr) = (void *) mutex; +#else + // needed, else we will initialis more than once in logging + (*ptr) = (void *) 1; +#endif +} + +void TasAutoMutex::give(){ +#ifdef ESP32 + if (this->mutex){ + if (this->taken){ + xSemaphoreGiveRecursive(this->mutex); + this->taken= false; + } + } +#endif +} +void TasAutoMutex::take(){ +#ifdef ESP32 + if (this->mutex){ + if (!this->taken){ + xSemaphoreTakeRecursive(this->mutex, portMAX_DELAY); + this->taken = true; + } + } +#endif +} + + + /*********************************************************************************************\ * Miscellaneous \*********************************************************************************************/ @@ -1958,6 +2046,10 @@ void SyslogAsync(bool refresh) { } bool NeedLogRefresh(uint32_t req_loglevel, uint32_t index) { + // this takes the mutex, and will be release when the class is destroyed - + // i.e. when the functon leaves You CAN call mutex.give() to leave early. + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + // Skip initial buffer fill if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - LOGSZ) { return false; } @@ -1973,6 +2065,10 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l if (TasmotaGlobal.uptime < 3) { return false; } // Allow time to setup correct log level if (!req_loglevel || (index == TasmotaGlobal.log_buffer_pointer)) { return false; } + // this takes the mutex, and will be release when the class is destroyed - + // i.e. when the functon leaves You CAN call mutex.give() to leave early. + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + if (!index) { // Dump all index = TasmotaGlobal.log_buffer_pointer +1; if (index > 255) { index = 1; } @@ -2011,9 +2107,18 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l } void AddLogData(uint32_t loglevel, const char* log_data) { + + if (!TasmotaGlobal.log_buffer_mutex){ + TasAutoMutex::init(&TasmotaGlobal.log_buffer_mutex); + } + char mxtime[14]; // "13:45:21.999 " snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d.%03d "), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcMillis()); + // this takes the mutex, and will be release when the class is destroyed - + // i.e. when the functon leaves You CAN call mutex.give() to leave early. + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + if ((loglevel <= TasmotaGlobal.seriallog_level) && (TasmotaGlobal.masterlog_level <= TasmotaGlobal.seriallog_level)) { Serial.printf("%s%s\r\n", mxtime, log_data); diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index b70bd4637..cf35a1fa7 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -171,6 +171,7 @@ struct { char mqtt_topic[TOPSZ]; // Composed MQTT topic char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer char log_buffer[LOG_BUFFER_SIZE]; // Web log buffer + void *log_buffer_mutex; // control, access to log buffer } TasmotaGlobal; #ifdef SUPPORT_IF_STATEMENT From 0c38aca915e2bf620d880e79892138dc232d0a4a Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Thu, 31 Dec 2020 12:31:22 +0000 Subject: [PATCH 050/255] MAC compatible httm webtimout changes --- tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h | 67 ++++++++++--------- .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 42 ++++++------ .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 53 +++++++-------- .../html_uncompressed/HTTP_SCRIPT_CONSOL.h | 10 ++- .../HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h | 14 ++-- .../HTTP_SCRIPT_ROOT_WEB_DISPLAY.h | 27 ++++---- 6 files changed, 110 insertions(+), 103 deletions(-) diff --git a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h index 91e1fab76..ba7f0677d 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_CONSOL.h @@ -2,38 +2,39 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_CONSOL_SIZE = 853; -const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x82\x30\x2F\x83\xAD\xCE\x41\x1D" - "\xD1\x87\x78\xF6\x99\xDF\xD0\x67\x56\x1F\x0F\xB3\xEC\xEA\xA3\xC0\x61\x3B\xF9\x56" - "\x8D\x78\x2E\x8E\xE8\x54\x77\x8F\x14\x7C\x63\x8E\xE9\xF7\x47\x21\xF6\x77\x8F\x05" - "\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7\x74\xFB\x0C\xE4\x3E\xCE" - "\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0\x78\x23\x21\x65\xF2\xD2" - "\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3\xC0\x21\x45\x3E\x1F\x67" - "\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD\x2A\x01\xF1\xEE\x3E\x02" - "\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE\x3D\xBA\x60\xEE\x9B\x0F" - "\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD\x3B\xC7\x83\xDC\x6C\x3E" - "\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F\xD4\x77\x4E\xF1\xE0\xD8" - "\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08\x7C\x28\x1D\xD0\x41\xCA" - "\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA\x23\x61\xD3\xD5\x74\x2F" - "\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\x03\x69\xD4\x21\xE0\x43\xE1\xB0\xE9\xF7\xE1\x99" - "\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4\x3B\x0E\xF1\xE0\xB4\x43" - "\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44\x92\x7C\x3E\x1C\x67\x78" - "\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13\xE1\xEA\x14\x7E\x02\x2E" - "\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xDE\x1E\x4F\x71\xE0\xD8\x74\xC1\x8F\x8E\xE9\xF6" - "\x43\xC4\xCA\x8F\xB3\xA8\xFB\x0F\xC7\x68\x33\x94\x7C\x3E\xCE\xD9\x68\x87\x6F\x0E" - "\xAA\xF8\xB6\x77\x8F\x06\xC3\xA7\x9F\x08\x77\x4E\xF1\xE0\xF7\x05\x47\xCF\x3A\x04" - "\x4E\x4A\x4E\xA3\xE8\x43\xBC\x78\xFB\xA1\x7F\xE4\x62\xC2\xF3\x3C\x1E\xE1\xF0\x8E" - "\xE8\x47\x78\xF0\x67\x7F\x42\x83\x3E\x1E\xF1\xEF\x9D\x41\xF0\x23\xF2\xF4\x28\xEE" - "\x9D\xE3\xDA\x08\x7C\xA2\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F\xCE\xE9\xF6" - "\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE2\xDD\x82\x0F\x12\xA3\x81\x13\x97\xB3\xA8" - "\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2\x0C\xFF\x1F" - "\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13\xA6\x7C\x3E" - "\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76\xC3\xE3\xF0" - "\x50\x60\x85\xC4\x31\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E\x04\x2E\x2E" - "\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C\x67\xC3\xE1" - "\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78\x41\xC9\x67" - "\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28\x33\xA0\xCC" - "\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x44\x01\x0B\x1C\x3B\xC7\x50\x7C\x7C" - "\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0"; +const size_t HTTP_SCRIPT_CONSOL_SIZE = 911; +const char HTTP_SCRIPT_CONSOL_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x71\xF0\xE3\x3A\x8B\x44\x3E\x1C\x67\x51\x18\xA3\xC1\x81\x7C\x1D\x6E" + "\x72\x08\xEE\x8C\x3B\xC7\xB4\xCE\xFE\x83\x3A\xB0\xF8\x7D\x9F\x67\x80\xC2\x77\xF2" + "\xAD\x1A\xF0\x5D\x1D\xD0\xA8\xEF\x02\x4C\xD3\x14\x77\x8F\x14\x7C\x63\x8E\xE9\xF7" + "\x47\x21\xF6\x77\x8F\x05\xA6\x0E\xE8\xC3\xE1\xF0\xE4\x3B\xC7\xB4\x83\x3E\x31\xC7" + "\x74\xFB\x0C\xE4\x3E\xCE\xF1\xE0\xB0\xF8\x7D\x9F\xA0\xCE\x43\xE1\xF6\x76\xC9\xF0" + "\x78\x23\x21\x65\xF2\xD2\x0F\x06\x8C\xCE\x7D\x47\x74\x33\xA1\x9D\x84\x2D\x9D\xE3" + "\xC0\x21\x45\x3E\x1F\x67\xD9\xE2\x8E\x9E\x0F\xF8\x10\x45\x58\x30\xF8\x71\x11\xBD" + "\x2A\x01\xF1\xEE\x3E\x02\x35\x13\xC1\xEE\xD3\x07\x74\x11\xA6\x1F\x87\xCF\x71\xDE" + "\x3D\xBA\x60\xEE\x9B\x0F\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF\xD1\xDD" + "\x3B\xC7\x83\xDC\x6C\x3E\x73\x1F\x44\x6C\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F" + "\xD4\x77\x4E\xF1\xE0\xD8\x74\xCE\xFB\xB1\x0C\xBD\x57\x4C\x31\x57\xC3\xCC\xF8\x08" + "\x7C\x2F\x9D\xD0\x41\xCA\x8E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F\xD1\xFA" + "\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x87\xF3\x69\xD4\x21\xE0\x43" + "\xE1\xB0\xE9\xF7\xE1\x99\xDE\x65\x4C\xD9\x47\x4F\x0C\x0B\x68\xEE\x9D\x87\xB8\xE4" + "\x3B\x0E\xF1\xE0\xB4\x43\xE0\x87\x4F\x0A\xD3\x14\x77\x4E\xF1\xE3\x4C\x1D\xD0\x44" + "\x92\x7C\x3E\x1C\x67\x78\xF6\x95\x02\x2F\x0A\x27\xB8\xDA\x09\x38\x29\xB4\xE8\x13" + "\xE1\xEA\x14\x7E\x02\x2E\x06\x76\xCF\x86\xD3\xC1\xEE\x05\xCE\x1E\x41\x33\x8F\xA0" + "\xA8\xF9\xE7\x40\x89\xC8\xE9\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x1E\x0D\x87\x4C\x18" + "\xF8\xEE\x9F\x64\x3C\x4C\xA8\xFB\x3A\x8F\xB0\xFC\x76\x83\x39\x47\xC3\xEC\xED\x96" + "\x88\x76\xF0\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x0C\x02\x56" + "\x3A\x72\x9B\x6C\xEF\x1E\x0F\x71\x7D\xD0\xBF\xF2\x31\x61\x79\x9E\x0F\x70\xF8\x47" + "\x74\x23\xBC\x78\x33\xBF\xA1\x41\x9F\x0F\x78\xF7\xCE\xA0\xF8\xF8\x71\x90\x22\xF3" + "\x62\x28\xEE\x9D\xE3\xDA\x08\x7C\xB6\x9D\x2C\x41\x09\x99\xBE\xA2\x0B\x7D\x4F\x9F" + "\xCE\xE9\xF6\x68\xCC\x84\xC1\xFE\x3E\xCE\xA0\x44\xE3\x7D\x82\x0F\x17\xA3\x81\x13" + "\x9A\x33\xA8\x33\xE3\x3A\x1A\x33\x22\x0F\x04\x67\x8D\x30\x77\x4E\x5F\xCF\x87\xC2" + "\x0C\xFF\x1F\xE3\x98\xCF\x87\xC2\x0C\xEF\x1E\xD1\xC7\x4B\x17\x58\x1E\x0D\x18\x13" + "\xA6\x7C\x3E\xF0\xC1\x83\xEC\xF0\x7B\x8E\x5F\xCF\x87\xC2\x0C\xED\x1D\xD3\xB6\x76" + "\xC3\xE3\xF0\x50\x60\x85\xC5\x71\xFA\x3F\x47\x74\x3E\x3E\x02\x24\xB3\xBC\x75\x0E" + "\x04\x2E\x38\x85\x06\x7B\xC1\xF1\xD6\x72\x1E\xF9\xFE\x3F\xC7\xD9\xF6\x77\x8F\x3C" + "\x67\xC3\xE1\x06\x76\x8E\xE9\xC6\x7E\x1D\x67\x59\x07\xC0\x83\x88\x1C\x64\x0A\x78" + "\x41\xC9\x67\xC3\xE1\x06\x7E\x8F\xD1\xDD\x04\x4C\xC4\xFC\x39\x11\xFA\x3F\x44\x28" + "\x33\xA0\xCC\x18\x77\x4E\xF1\xD4\x28\x33\xA0\xBE\x04\x1E\x4E\x01\x0B\x1C\x3B\xC7" + "\x50\x7C\x7C\x38\xCE\xF1\xEE\x3B\xC7\x83\xDC\x43\xE1\x1D\xD1\x47\x78\xF0"; #define HTTP_SCRIPT_CONSOL Decompress(HTTP_SCRIPT_CONSOL_COMPRESSED,HTTP_SCRIPT_CONSOL_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index 2f61ce116..862ecf0f6 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -2,26 +2,26 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 524; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x69\x9D\xFD\x59\xF0\xFB\x3E\xCF\x1A" - "\x60\xEE\x85\x67\x4B\xF8\xF0\xB1\xAF\xAB\xC7\x40\x9F\x0F\x50\xA3\xE1\xF0\xE4\x3B" - "\xC7\xB4\xAC\xF8\x30\xF0\x18\x4E\xFE\x55\xA3\x5E\x0B\xA3\xBA\x15\x1D\xE3\xC1\xEE" - "\xD3\x07\x74\xD8\x7F\x0F\x9C\x2C\x20\x8E\xF1\xED\x36\x1D\x2C\x76\x7E\x8E\xE9\xDE" - "\x3C\x1E\xE3\x61\xF3\x98\xFA\x23\x61\x0D\x20\x88\x55\x50\xC2\xFB\x35\x0B\x7E\xA3" - "\xBA\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65\xEA\xBA\x61\x8A\xBE\x1E\x67\xC0\x43\xDA" - "\x0E\xE9\xDE\x3D\xBA\x60\xEE\x9B\x0E\x9F\x76\x21\x91\x7A\xAE\x99\xF0\xF8\x73\x0F" - "\xD1\xFA\x23\x61\xD3\xD5\x74\x2F\xC7\xC3\xE1\xCA\x6C\x81\x07\x80\x7F\x1F\x0D\x87" - "\x4F\xBF\x0C\xCE\xF3\x2A\x2B\x66\xCA\x3A\x7D\x8C\x0A\xC3\x67\x74\xEC\x3D\xB4\x7B" - "\x8E\xC1\xE3\xA8\xF6\x1E\x95\x63\x82\x6B\xD4\x64\x13\x3E\x1F\x63\xFA\x25\x0A\x3C" - "\xCE\x46\xCF\xA3\xE8\xFB\x3F\x0F\x61\xDE\x20\x46\xC2\xBC\x08\x58\x57\xCF\xC3\xD2" - "\x85\x02\x4D\x71\xA0\x83\x5C\xEC\xA1\x47\xE1\xE9\x42\x02\x4E\x4E\x72\x99\x0C\x36" - "\x1E\x07\xC5\x6D\x33\xAF\xC3\x2C\x36\x79\xF6\x0F\xFE\xC6\x02\x56\x72\xC1\x0F\x1E" - "\x10\xFC\x3D\x0E\xCA\xF8\x24\xD9\x0C\xF7\x1D\x83\xC7\x51\xEC\x3E\x8F\xA3\xEC\xFC" - "\x3D\x04\xD3\x30\x43\xCE\xE9\x9B\x28\xEB\xB0\xB4\x7B\x8F\x30\xDF\x53\xF9\xE0\xC6" - "\x75\x1D\x63\xEF\x47\x85\x51\xE6\x7B\x0E\xF1\xE1\x8E\x3B\xA7\xD8\x47\x21\xF6\x77" - "\x8E\x85\xBD\xCF\xE4\x28\xA8\x86\x90\x47\xCF\x1E\x0F\x71\xEE\x3C\x1B\x0E\x98\x31" - "\xF1\xDD\x3E\xC8\x78\x99\x51\xF6\x75\x1F\x67\x43\xB4\x34\xF8\x72\x1F\x67\x6C\xAC" - "\xEA\xAF\x8B\x67\x78\xF0\x6C\x3A\x79\xF0\x87\x74\xEF\x1E\x02\xA3\xE7\x9D\x02\x27" - "\x23\x96\x75\x1F\x42\x1D\xE3\xC1\xEE"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 572; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xA3\x14\x78\x30\x2F\x83\xAD\xCE\x41\x59\xDD\x18\x77\x8F\x6D\x9F\x06\x1F" + "\xE3\xFC\x7D\x9F\x67\x80\xC2\x77\xF2\xAD\x1A\xF0\x5D\x1D\xD3\x14\x77\x81\x26\x68" + "\x54\x77\x8F\x1A\x60\xEE\x9B\x0F\xE1\xF3\x85\x84\x11\xDE\x3D\xA6\xC3\xA5\x8E\xCF" + "\xD1\xDD\x3B\xC7\xB8\xD8\x7C\xE6\x3E\x88\xD8\x43\x48\x22\x15\x54\x30\xBE\xCD\x42" + "\xDF\xA8\xEE\x9D\xE3\xC1\xB0\xE9\x9D\xF7\x62\x19\x7A\xAE\x98\x62\xAF\x87\x99\xF0" + "\x10\xF5\x73\xBA\x77\x8F\x6E\x98\x3B\xA6\xC3\xA7\xDD\x88\x64\x5E\xAB\xA6\x7C\x3E" + "\x1C\xC3\xF4\x7E\x88\xD8\x74\xF5\x5D\x0B\xF1\xF0\xF8\x72\x9B\x3B\xC7\xB4\x8C\xEF" + "\xEB\xC7\xC3\x61\xD3\xEF\xC3\x33\xBC\xCA\x99\xB2\x8E\x9F\x63\x02\xB0\xD9\xDD\x3B" + "\x0F\x6D\x1E\xE3\xB0\x78\xEA\x3D\x87\xA5\x58\xE0\x9A\xF5\x19\x04\xCF\x87\xD8\xFE" + "\x89\x42\x8F\x33\x91\xB3\xE8\xFA\x3E\xCF\xC3\xD8\x77\x88\x11\xB0\xAF\x02\x16\x15" + "\xF3\xF0\xF4\xA1\x40\x93\x5C\x68\x20\xD7\x3B\x28\x51\xF8\x7A\x50\x80\x93\x93\x9C" + "\xA6\x43\x0D\x87\x81\xF1\x5B\x4C\xEB\xF0\xCB\x0D\x9E\x7D\x83\xFF\xB1\x80\x95\x9C" + "\xB0\x43\xC7\x84\x3F\x0F\x43\xB2\xBE\x09\x36\x43\x3D\xC7\x60\xF1\xD4\x7B\x0F\xA3" + "\xE8\xFB\x3F\x0F\x41\x34\xCC\x10\xF3\xBA\x66\xCA\x3A\xEC\x2D\x1E\xE3\xCC\x37\xD4" + "\xFE\x78\x31\x9D\x47\x58\xFB\xD1\xE1\x54\x79\x9E\xC3\xBC\x78\x63\x8E\xE9\xF6\x11" + "\xC8\x7D\x9D\xE3\xA1\x6F\x73\xF9\x0A\x2A\x2B\x21\xA4\x11\xF3\xC0\xBD\xC8\x08\x54" + "\x7C\xF3\xA0\x44\x9D\x67\x51\xF4\x21\xDE\x3C\x1E\xE3\xDC\x78\x36\x1D\x30\x63\xE3" + "\xBA\x7D\x90\xF1\x32\xA3\xEC\xEA\x3E\xCE\x87\x68\x69\xF0\xE4\x3E\xCE\xD9\x59\xD5" + "\x5F\x16\xCE\xF1\xE0\xD8\x74\xF3\xE1\x0E\xE9\xDE\x3C\x18\x04\xBC\x68\xE5\x36\xD9" + "\xDE\x3C\x1E\xE3"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index bb52fbbcd..d211338a1 100644 --- a/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_compressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -2,32 +2,31 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_SCRIPT_ROOT_SIZE = 744; -const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x78\x23\x02\xF8\x3A\xDC\xE4\x15\x9D\xD1\x87\x78" - "\xF6\x99\xDF\xD5\x9F\x0F\xB3\xEC\xF1\xA6\x0E\xE8\x56\x74\xBF\x8F\x0B\x1A\xFA\xBC" - "\x74\x09\xF0\xF5\x0A\x3E\x1F\x0E\x43\xBC\x7B\x4A\xCF\x83\x0F\x01\x84\xEF\xE5\x5A" - "\x35\xE0\xBA\x3B\xA1\x51\xDE\x3C\x1E\xED\x30\x77\x4D\x87\xF0\xF9\xC2\xC2\x08\xEF" - "\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36\x10\xD2" - "\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8\x86\x5E" - "\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\xA0\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0\xE9\xF7" - "\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC\x7C\x3E" - "\x1C\xA6\xC8\x10\x78\x07\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6\x6C\xA3\xA7\xD8" - "\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56\x38\x26\xBD\x46" - "\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0\xF6\x1D\xE2\x04" - "\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE\xCA\x14\x7E\x1E" - "\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32\xC3\x67\x9F\x60" - "\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D\x90\xCF\x71\xD8" - "\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99\xB2\x8E\xBB\x0B" - "\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E\x67\xB0\xEF\x1E" - "\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88\x69\x04\x7C\xF1" - "\xE0\xF7\x1E\xE3\xC6\x98\x47\x77\xE6\x3C\x28\xEF\x23\xDA\x6C\x3A\x60\xC7\xC7\x74" - "\xFB\x21\xE2\x65\x47\xD9\xD4\x7D\x9D\x0E\xD0\xD3\xE1\xC8\x7D\x9D\xB2\xB3\xAA\xBE" - "\x2D\x9D\xE3\xC1\xB0\xE9\xE7\xC2\x1D\xD3\xBC\x78\x0A\x8F\x9E\x74\x08\x9C\x93\xD9" - "\xD4\x7D\x08\x77\x8F\x07\xB8\xF7\x02\x27\x2E\x9E\x66\x76\x77\x46\x5F\xCE\xAD\x33" - "\xBF\x9D\xE3\xDA\x15\x9D\xD3\xEC\xFD\x78\xCC\xF8\x7D\x9D\xBD\x33\xBF\x9D\xB3\xEC" - "\xFD\x9F\x67\x6C\x65\xFC\xEF\x1E\x01\x1B\x0D\xD0\x48\xC3\x41\x0B\x9C\x40\x53\xC5" - "\x3E\x63\xC2\x8F\x87\x19\x02\x36\x36\x33\xE7\x74\xC1\xDE\x3D\xBA\x61\x1D\xD3\x07" - "\x79\x1E\xD0\x50\xDE\x81\x0B\x2F\x3D\xC9\x85\xE6\x8F\x68\x26\x73\xD0\x08\x79\x81" - "\xEE"; +const size_t HTTP_SCRIPT_ROOT_SIZE = 844; +const char HTTP_SCRIPT_ROOT_COMPRESSED[] PROGMEM = "\x33\xBF\xAF\x98\xF0\xA3\xE1\xC8\x75\x11\x8A\x3C\x18\x17\xC1\xD6\xE7\x20\xAC\xEE" + "\x8C\x3B\xC7\xB6\xCF\x83\x0F\xF1\xFE\x3E\xCF\xB3\xC0\x61\x3B\xF9\x56\x8D\x78\x2E" + "\x8E\xE9\x8A\x3B\xC0\x93\x34\x2A\x2B\x3B\xC7\x8D\x30\x77\x4D\x87\xF0\xF9\xC2\xC2" + "\x08\xEF\x1E\xD3\x61\xD2\xC7\x67\xE8\xEE\x9D\xE3\xC1\xEE\x36\x1F\x39\x8F\xA2\x36" + "\x10\xD2\x08\x85\x55\x0C\x2F\xB3\x50\xB7\xEA\x3B\xA7\x78\xF0\x6C\x3A\x67\x7D\xD8" + "\x86\x5E\xAB\xA6\x18\xAB\xE1\xE6\x7C\x04\x3D\x60\xEE\x9D\xE3\xDB\xA6\x0E\xE9\xB0" + "\xE9\xF7\x62\x19\x17\xAA\xE9\x9F\x0F\x87\x30\xFD\x1F\xA2\x36\x1D\x3D\x57\x42\xFC" + "\x7C\x3E\x1C\xA6\xCE\xF1\xED\x23\x3B\xFA\xF1\xF0\xD8\x74\xFB\xF0\xCC\xEF\x32\xA6" + "\x6C\xA3\xA7\xD8\xC0\xAC\x36\x77\x4E\xC3\xDB\x47\xB8\xEC\x1E\x3A\x8F\x61\xE9\x56" + "\x38\x26\xBD\x46\x41\x33\xE1\xF6\x3F\xA2\x50\xA3\xCC\xE4\x6C\xFA\x3E\x8F\xB3\xF0" + "\xF6\x1D\xE2\x04\x6C\x2B\xC0\x85\x85\x7C\xFC\x3D\x28\x50\x24\xD7\x1A\x08\x35\xCE" + "\xCA\x14\x7E\x1E\x94\x20\x24\xE4\xE7\x29\x90\xC3\x61\xE0\x7C\x56\xD3\x3A\xFC\x32" + "\xC3\x67\x9F\x60\xFF\xEC\x60\x25\x67\x2C\x10\xF1\xE1\x0F\xC3\xD0\xEC\xAF\x82\x4D" + "\x90\xCF\x71\xD8\x3C\x75\x1E\xC3\xE8\xFA\x3E\xCF\xC3\xD0\x4D\x33\x04\x3C\xEE\x99" + "\xB2\x8E\xBB\x0B\x47\xB8\xF3\x0D\xF5\x3F\x9E\x0C\x67\x51\xD6\x3E\xF4\x78\x55\x1E" + "\x67\xB0\xEF\x1E\x18\xE3\xBA\x7D\x84\x72\x1F\x67\x78\xE8\x5B\xDC\xFE\x42\x8A\x88" + "\x69\x04\x7C\xF0\x30\x1E\x40\xBE\x63\xC2\x8E\xF1\xED\x0A\x8F\x9E\x74\x08\x95\xEC" + "\xEA\x3E\x84\x3B\xC7\x83\xDC\x7B\x8F\x70\x22\xDE\x36\x1D\x30\x63\xE3\xBA\x7D\x90" + "\xF1\x32\xA3\xEC\xEA\x3E\xCE\x87\x68\x69\xF0\xE4\x3E\xCE\xD9\x59\xD5\x5F\x16\xCE" + "\xF1\xE0\xD8\x74\xF3\xE1\x0E\xE9\xDE\x3C\x18\x04\xBC\x90\xE5\x36\xD9\xDE\x3C\x1E" + "\xE3\xDC\x40\x89\xCD\x37\x99\x9D\x9D\xD1\x97\xF3\xAB\x4C\xEF\xE7\x78\xF6\x85\x67" + "\x74\xFB\x3F\x5E\x33\x3E\x1F\x67\x6F\x4C\xEF\xE7\x6C\xFB\x3F\x67\xD9\xDB\x19\x7F" + "\x3B\xC7\x80\x46\xC3\x74\x12\x30\xD0\x41\xE7\xE4\xF0\x0A\x78\xA7\xCC\x78\x51\xF0" + "\xE3\x20\x46\xC6\xC6\x7C\xEE\x98\x3B\xC7\xB7\x4C\x1D\xD3\x07\x78\xF6\x82\x67\x0B" + "\xA0\x99\xC3\xF8\x28\x70\xCA\x08\x5A\x79\xEE\x61\x79\x82\xF6\x40\x08\x7A\xF9\xEE"; #define HTTP_SCRIPT_ROOT Decompress(HTTP_SCRIPT_ROOT_COMPRESSED,HTTP_SCRIPT_ROOT_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h index 51cfb66a3..451bc7a7f 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_CONSOL.h @@ -1,8 +1,9 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = - "var sn=0,id=0;" // Scroll position, Get most of weblog initially + "var sn=0,id=0,ft;" // Scroll position, Get most of weblog initially "function l(p){" // Console log and command service - "var c,o='',t;" + "var c,o='';" "clearTimeout(lt);" + "clearTimeout(ft);" "t=eb('t1');" "if(p==1){" "c=eb('c1');" // Console command id @@ -24,12 +25,14 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = "if(z.length>0){t.value+=z;}" "t.scrollTop=99999;" "sn=t.scrollTop;" + "clearTimeout(ft);" + "lt=setTimeout(l,%d);" // webrefresh timer.... "}" "};" "x.open('GET','cs?c2='+id+o,true);" // Related to Webserver->hasArg("c2") and WebGetArg("c2", stmp, sizeof(stmp)) "x.send();" + "ft=setTimeout(l,20000);" // fail timeout, triggered 20s after asking for XHR "}" - "lt=setTimeout(l,%d);" "return false;" "}" "wl(l);" // Load initial console text @@ -47,3 +50,4 @@ const char HTTP_SCRIPT_CONSOL[] PROGMEM = "});" "}" "wl(h);"; // Add console command key eventlistener after name has been synced with id (= wl(jd)) + diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h index 729bb54a5..41e519502 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_NO_WEB_DISPLAY.h @@ -1,11 +1,9 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = + "var ft;" "function la(p){" - "var a='';" - "if(la.arguments.length==1){" - "a=p;" - "clearTimeout(lt);" - "}" - "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) + "a=p||'';" + "clearTimeout(ft);clearTimeout(lt);" + "if(x!=null){x.abort()}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" "if(x.readyState==4&&x.status==200){" @@ -16,9 +14,11 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>
hasArg("m") "x.send();" - "lt=setTimeout(la,%d);" // Settings.web_refresh + "ft=setTimeout(la,20000);" // 20s failure timeout "}"; diff --git a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h index 2d76a8c91..5bd8a4ec7 100644 --- a/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h +++ b/tasmota/html_uncompressed/HTTP_SCRIPT_ROOT_WEB_DISPLAY.h @@ -1,11 +1,8 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = - "var rfsh=1;" + "var rfsh=1,ft;" "function la(p){" - "var a='';" - "if(la.arguments.length==1){" - "a=p;" - "clearTimeout(lt);" - "}" + "a=p||'';" + "clearTimeout(ft);clearTimeout(lt);" "if(x!=null){x.abort();}" // Abort if no response within 2 seconds (happens on restart 1) "x=new XMLHttpRequest();" "x.onreadystatechange=function(){" @@ -17,12 +14,16 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = ".replace(/{e}/g,\"\")" ".replace(/{c}/g,\"%%'>
hasArg("m") "x.send();" - "lt=setTimeout(la,%d);" // Settings.web_refresh + "ft=setTimeout(la,20000);" // 20s failure timeout "}" "}" "function seva(par,ivar){" @@ -34,11 +35,13 @@ const char HTTP_SCRIPT_ROOT[] PROGMEM = "rfsh=0;" "}" "function pr(f){" - "if (f) {" + "if(f){" + "clearTimeout(lt);clearTimeout(ft);" "lt=setTimeout(la,%d);" "rfsh=1;" - "} else {" - "clearTimeout(lt);" + "}else{" + "clearTimeout(lt);clearTimeout(ft);" "rfsh=0;" "}" - "}"; + "}" + ; From 1e579804dad9b00cfff9ec1e1c26b4ae9059df81 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 31 Dec 2020 14:19:50 +0100 Subject: [PATCH 051/255] universal file system inital commit --- tasmota/xdrv_98_filesystem.ino | 494 +++++++++++++++++++++++++++++++++ 1 file changed, 494 insertions(+) create mode 100644 tasmota/xdrv_98_filesystem.ino diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino new file mode 100644 index 000000000..5ea685109 --- /dev/null +++ b/tasmota/xdrv_98_filesystem.ino @@ -0,0 +1,494 @@ +/* + xdrv_98_filesystem.ino - unified file system for Tasmota + + Copyright (C) 2020 Gerhard Mutz and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/* +this driver adds universal file system support for +ESP8266 (sd card or littlfs on > 1 M devices with special linker file e.g. eagle.flash.4m2m.ld) +(makes no sense on 1M devices without sd card) +and +ESP32 (sd card or fatfile system) +the sd card chip select is the standard SPI_CS or when not found SDCARD_CS_PIN +initializes the FS System Pointer ufsp which can be used by all standard file system calls +the only specific call is ufs_fsinfo() which gets the total size (0) and free size (1) +a button is created in the setup section to show up the file directory to download and upload files +subdirectories are supported + +console calls : + +ufs fs info +ufstype get filesytem type 0=none 1=SD 2=Flashfile +ufssize total size in kB +ufsfree free size in kB + +driver enabled by + +#define USE_UFILESYS + +*/ + + +#ifdef USE_UFILESYS + +#define XDRV_98 98 + +#ifdef ESP8266 +#include +#include +#include +#include +#else +#include +#include "FFat.h" +#include "FS.h" +#include "SPIFFS.h" +#endif + +#define UFS_FILE_WRITE "w" +#define UFS_FILE_READ "r" + +// global file system pointer +FS *ufsp; +char ufs_path[48]; +File ufs_upload_file; + + +#ifndef SDCARD_CS_PIN +#define SDCARD_CS_PIN 4 +#endif + +// 0 = none, 1 = SD, 2 = Flash +// spiffs should be obsolete +uint8_t ufs_type; +#define UFS_TNONE 0 +#define UFS_TSDC 1 +#define UFS_TFAT 2 +#define UFS_TSPIFFS 3 + +#ifndef UFS_SDCS +#define UFS_SDCS 4 +#endif + +void UFSInit(void) { + ufs_type = 0; + // check for fs options, + // 1. check for SD card + // 2. check for littlefs or FAT + // 3. check for SPIFFS obsolete +// if (TasmotaGlobal.spi_enabled) { + if (1) { + int8_t cs; + if (!PinUsed(GPIO_SPI_CS)) { + cs = SDCARD_CS_PIN; + } else { + cs = Pin(GPIO_SPI_CS); + } + + if (SD.begin(cs)) { +#ifdef ESP8266 + ufsp = (FS*)&SD; +#else + ufsp = &SD; +#endif + ufs_type = 1; + return; + } + } + +// if no success with sd card try flash fs +#ifdef ESP8266 + ufsp = &LittleFS; + if (!fsp->begin()) { + return; + } +#else + ufsp = &FFat; + if (!FFat.begin(true)) { + return; + } +#endif + ufs_type = 2; + return; +} + +uint32_t ufs_fsinfo(uint32_t sel) { +uint32_t result = 0; + + switch (ufs_type) { + case UFS_TSDC: +#ifdef ESP32 + if (sel == 0) { + result = SD.totalBytes(); + } else { + result = (SD.totalBytes() - SD.usedBytes()); + } +#else + // currently no support on esp8266 +#endif + break; + case UFS_TFAT: +#ifdef ESP8266 + FSInfo64 fsinfo; + ufsp->info64(fsinfo); + if (sel == 0) { + result = fsinfo.totalBytes; + } else { + result = (fsinfo.totalBytes - fsinfo.usedBytes); + } +#else + if (sel == 0) { + result = FFat.totalBytes(); + } else { + result = FFat.freeBytes(); + } +#endif + break; + case UFS_TSPIFFS: + break; + } + return result / 10000; +} + +#if USE_LONG_FILE_NAMES>0 +#undef REJCMPL +#define REJCMPL 6 +#else +#undef REJCMPL +#define REJCMPL 8 +#endif + +uint8_t ufs_reject(char *name) { + + char *lcp = strrchr(name,'/'); + if (lcp) { + name = lcp + 1; + } + + while (*name=='/') name++; + if (*name=='_') return 1; + if (*name=='.') return 1; + + if (!strncasecmp(name, "SPOTLI~1", REJCMPL)) return 1; + if (!strncasecmp(name, "TRASHE~1", REJCMPL)) return 1; + if (!strncasecmp(name, "FSEVEN~1", REJCMPL)) return 1; + if (!strncasecmp(name, "SYSTEM~1", REJCMPL)) return 1; + if (!strncasecmp(name, "System Volume", 13)) return 1; + return 0; +} + +// format number with thousand marker +void UFS_form1000(uint32_t number, char *dp, char sc) { + char str[32]; + sprintf(str, "%d", number); + char *sp = str; + uint32_t inum = strlen(sp)/3; + uint32_t fnum = strlen(sp)%3; + if (!fnum) inum--; + for (uint32_t count=0; count<=inum; count++) { + if (fnum){ + memcpy(dp,sp,fnum); + dp+=fnum; + sp+=fnum; + fnum=0; + } else { + memcpy(dp,sp,3); + dp+=3; + sp+=3; + } + if (count!=inum) { + *dp++=sc; + } + } + *dp=0; +} + + +const char kUFSCommands[] PROGMEM = "UFS" "|" // Prefix + "|" "TYPE" "|" "SIZE" "|" "FREE"; + +void (* const kUFSCommand[])(void) PROGMEM = { + &UFS_info, &UFS_type, &UFS_size, &UFS_free}; + +void UFS_info(void) { + Response_P(PSTR("{\"UFS\":{\"TYPE\":%d,\"SIZE\":%d,\"FREE\":%d}}"),ufs_type,ufs_fsinfo(0),ufs_fsinfo(1)); +} +void UFS_type(void) { + ResponseCmndNumber(ufs_type); +} +void UFS_size(void) { + ResponseCmndNumber(ufs_fsinfo(0)); +} +void UFS_free(void) { + ResponseCmndNumber(ufs_fsinfo(1)); +} + +const char UFS_WEB_DIR[] PROGMEM = + "

"; +const char UFS_FILE_UPLOAD[] PROGMEM = D_SDCARD_DIR; +const char UFS_FORM_FILE_UPLOAD[] PROGMEM = +"
" +"
 %s" " "; +const char UFS_FORM_FILE_UPG[] PROGMEM = +"
" +"

" +"
"; +const char UFS_FORM_FILE_UPGc[] PROGMEM = +"
total size: %s kB - free: %s kB
"; +const char UFS_FORM_SDC_DIRa[] PROGMEM = +"
"; +const char UFS_FORM_SDC_DIRc[] PROGMEM = +"
"; +const char UFS_FORM_FILE_UPGb[] PROGMEM = +"
" +"
" +""; +const char UFS_FORM_SDC_DIRd[] PROGMEM = +"
%s
"; +const char UFS_FORM_SDC_DIRb[] PROGMEM = + "
%s     %s : %8d
"; +const char UFS_FORM_SDC_HREF[] PROGMEM = + "http://%s/ufsd?download=%s/%s"; + +void UFSdirectory(void) { + uint8_t depth = 0; + + strcpy(ufs_path, "/"); + if (!HttpCheckPriviledgedAccess()) { return; } + + if (Webserver->hasArg("download")) { + String stmp = Webserver->arg("download"); + char *cp = (char*)stmp.c_str(); + if (UFS_DownloadFile(cp)) { + // is directory + strcpy(ufs_path, cp); + } + } + + WSContentStart_P(UFS_FILE_UPLOAD); + WSContentSendStyle(); + WSContentSend_P(UFS_FORM_FILE_UPLOAD,D_SDCARD_DIR); + WSContentSend_P(UFS_FORM_FILE_UPG, D_SCRIPT_UPLOAD); + char ts[16]; + char fs[16]; + UFS_form1000(ufs_fsinfo(0), ts, '.'); + UFS_form1000(ufs_fsinfo(1), fs, '.'); + WSContentSend_P(UFS_FORM_FILE_UPGc, ts, fs); + WSContentSend_P(UFS_FORM_SDC_DIRa); + if (ufs_type) { + UFS_ListDir(ufs_path, depth); + } + WSContentSend_P(UFS_FORM_SDC_DIRc); + WSContentSend_P(UFS_FORM_FILE_UPGb); + WSContentSpaceButton(BUTTON_CONFIGURATION); + WSContentStop(); + Web.upload_error = 0; + +} + +void UFS_ListDir(char *path, uint8_t depth) { + char name[32]; + char npath[128]; + char format[12]; + sprintf(format, "%%-%ds", 24 - depth); + + File dir = ufsp->open(path, UFS_FILE_READ); + if (dir) { + dir.rewindDirectory(); + if (strlen(path)>1) { + snprintf_P(npath, sizeof(npath), PSTR("http://%s/ufsd?download=%s"), WiFi.localIP().toString().c_str(),path); + for (uint8_t cnt = strlen(npath) - 1; cnt>0; cnt--) { + if (npath[cnt]=='/') { + if (npath[cnt - 1]=='=') npath[cnt + 1] = 0; + else npath[cnt] = 0; + break; + } + } + WSContentSend_P(UFS_FORM_SDC_DIRd, npath,path, ".."); + } + char *ep; + while (true) { + File entry = dir.openNextFile(); + if (!entry) { + break; + } + // esp32 returns path here, shorten to filename + ep = (char*)entry.name(); + if (*ep=='/') ep++; + char *lcp = strrchr(ep,'/'); + if (lcp) { + ep = lcp + 1; + } + time_t tm = entry.getLastWrite(); + char tstr[24]; + strftime(tstr, 22, "%d-%m-%Y - %H:%M:%S ", localtime(&tm)); + + char *pp = path; + if (!*(pp + 1)) pp++; + char *cp = name; + // osx formatted disks contain a lot of stuff we dont want + if (ufs_reject((char*)ep)) goto fclose; + + for (uint8_t cnt = 0; cnt1) { + strcat(path, "/"); + } + strcat(path, ep); + UFS_ListDir(path, depth + 4); + path[plen] = 0; + } else { + snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp,ep); + WSContentSend_P(UFS_FORM_SDC_DIRb, npath, ep, name, tstr, entry.size()); + } + fclose: + entry.close(); + } + dir.close(); + } +} + +uint8_t UFS_DownloadFile(char *file) { + File download_file; + WiFiClient download_Client; + + if (!ufsp->exists(file)) { + AddLog_P(LOG_LEVEL_INFO, PSTR("file not found")); + return 0; + } + + download_file = ufsp->open(file, UFS_FILE_READ); + if (!download_file) { + AddLog_P(LOG_LEVEL_INFO, PSTR("could not open file")); + return 0; + } + + if (download_file.isDirectory()) { + download_file.close(); + return 1; + } + + uint32_t flen = download_file.size(); + + download_Client = Webserver->client(); + Webserver->setContentLength(flen); + + char attachment[100]; + char *cp; + for (uint8_t cnt = strlen(file); cnt>=0; cnt--) { + if (file[cnt]=='/') { + cp = &file[cnt + 1]; + break; + } + } + snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=%s"), cp); + Webserver->sendHeader(F("Content-Disposition"), attachment); + WSSend(200, CT_STREAM, ""); + + uint8_t buff[512]; + uint16_t bread; + + // transfer is about 150kb/s + uint8_t cnt = 0; + while (download_file.available()) { + bread = download_file.read(buff, sizeof(buff)); + uint16_t bw = download_Client.write((const char*)buff, bread); + if (!bw) break; + cnt++; + if (cnt>7) { + cnt = 0; + //if (glob_script_mem.script_loglevel & 0x80) { + // this indeed multitasks, but is slower 50 kB/s + // loop(); + //} + } + } + download_file.close(); + download_Client.stop(); + return 0; +} + +void UFS_Upload(void) { + HTTPUpload& upload = Webserver->upload(); + if (upload.status == UPLOAD_FILE_START) { + char npath[48]; + sprintf(npath, "%s/%s", ufs_path, upload.filename.c_str()); + ufsp->remove(npath); + ufs_upload_file = ufsp->open(npath, UFS_FILE_WRITE); + if (!ufs_upload_file) Web.upload_error = 1; + } else if(upload.status == UPLOAD_FILE_WRITE) { + if (ufs_upload_file) ufs_upload_file.write(upload.buf, upload.currentSize); + } else if(upload.status == UPLOAD_FILE_END) { + if (ufs_upload_file) ufs_upload_file.close(); + if (Web.upload_error) { + AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload error")); + } + } else { + Web.upload_error=1; + Webserver->send(500, "text/plain", "500: couldn't create file"); + } +} + +void UFSFileUploadSuccess(void) { + WSContentStart_P(PSTR(D_INFORMATION)); + WSContentSendStyle(); + WSContentSend_P(PSTR("
" D_UPLOAD " " D_SUCCESSFUL "
"), WebColor(COL_TEXT_SUCCESS)); + WSContentSend_P(PSTR("

")); + WSContentSend_P(PSTR("

"),"/ufsd",D_UPL_DONE); + WSContentStop(); +} + +#define D_UFSDIR "UFS directory" + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xdrv98(uint8_t function) { + bool result = false; + + switch (function) { + case FUNC_PRE_INIT: + UFSInit(); + break; + case FUNC_COMMAND: + result = DecodeCommand(kUFSCommands, kUFSCommand); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_ADD_BUTTON: + if (ufs_type) { + WSContentSend_PD(UFS_WEB_DIR,D_UFSDIR); + } + break; + case FUNC_WEB_ADD_HANDLER: + Webserver->on("/ufsd", UFSdirectory); + Webserver->on("/ufsu", HTTP_GET, UFSFileUploadSuccess); + Webserver->on("/ufsu", HTTP_POST,[]() { Webserver->sendHeader("Location","/ufsu");Webserver->send(303);}, UFS_Upload); + break; +#endif // USE_WEBSERVER + } + return result; +} +#endif // USE_UFILESYS From a8fbdcabd3a2a951877a2b32a57241d2604d2fd7 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 31 Dec 2020 15:07:08 +0100 Subject: [PATCH 052/255] Create esp32_partition_app1984k_ffat64k.csv --- esp32_partition_app1984k_ffat64k.csv | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 esp32_partition_app1984k_ffat64k.csv diff --git a/esp32_partition_app1984k_ffat64k.csv b/esp32_partition_app1984k_ffat64k.csv new file mode 100644 index 000000000..98ce760eb --- /dev/null +++ b/esp32_partition_app1984k_ffat64k.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x1F0000, +app1, app, ota_1, 0x200000, 0x1F0000, +ffat, data, fat, 0x3F0000,0x10000, From 58e6ec55f1a4b4390ee85efdaf0cc9ed78a4e5c9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 31 Dec 2020 16:17:30 +0100 Subject: [PATCH 053/255] Breaking change replacing SPI CS and SPI DC Breaking change replacing SPI CS and SPI DC by device specific CS and DC --- CHANGELOG.md | 15 ++- RELEASENOTES.md | 13 ++- tasmota/support.ino | 36 +++++- tasmota/support_tasmota.ino | 110 ++++++------------ tasmota/tasmota.h | 2 + tasmota/tasmota.ino | 4 +- tasmota/tasmota_configurations_ESP32.h | 5 + tasmota/tasmota_template.h | 18 +-- tasmota/xdrv_33_nrf24l01.ino | 33 +++--- tasmota/xdsp_04_ili9341.ino | 153 +++++++++++-------------- tasmota/xdsp_05_epaper_29.ino | 54 +++++---- tasmota/xdsp_06_epaper_42.ino | 63 +++++----- tasmota/xdsp_08_ILI9488.ino | 78 +++++-------- tasmota/xdsp_09_SSD1351.ino | 28 ++--- tasmota/xdsp_10_RA8876.ino | 44 ++----- tasmota/xdsp_12_ST7789.ino | 66 ++++------- tasmota/xsns_61_MI_NRF24.ino | 21 ++-- tasmota/xsns_80_mfrc522.ino | 2 +- 18 files changed, 325 insertions(+), 420 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d542934fa..3f1a34e5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,19 @@ All notable changes to this project will be documented in this file. ## [9.2.0.2] ### Added - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) -- Command ``CTRange`` to specify the visible CT range the bulb is capable of -- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels +- Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311) +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) ### Breaking Changed -- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` -- Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` +- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` +- Replaced NRF24L01 GPIO selection from ``SPI CS`` by ``NRF24 CS`` and ``SPI DC`` by ``NRF24 DC`` +- Replaced ILI9341 GPIO selection from ``SPI CS`` by ``ILI9341 CS`` and ``SPI DC`` by ``ILI9341 DC`` +- Replaced ST7789 GPIO selection from ``SPI CS`` by ``ST7789 CS`` and ``SPI DC`` by ``ST7789 DC`` +- Replaced ILI9488 GPIO selection from ``SPI CS`` by ``ILI9488_CS`` +- Replaced EPaper29 GPIO selection from ``SPI CS`` by ``EPaper29 CS`` +- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS`` +- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS`` +- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS`` ## [9.2.0.1] 20201229 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 6f02fa36f..83cfe63c7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -58,6 +58,8 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.2.0.2 ### Added +- Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) +- Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) @@ -71,8 +73,15 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630) ### Breaking Changed -- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_RC522_CS`` -- Replaced ILI9341 GPIO selection from ``GPIO_SPI_CS`` by ``GPIO_ILI9341_CS`` and ``GPIO_SPI_DC`` by ``GPIO_ILI9341_DC`` +- Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` +- Replaced NRF24L01 GPIO selection from ``SPI CS`` by ``NRF24 CS`` and ``SPI DC`` by ``NRF24 DC`` +- Replaced ILI9341 GPIO selection from ``SPI CS`` by ``ILI9341 CS`` and ``SPI DC`` by ``ILI9341 DC`` +- Replaced ST7789 GPIO selection from ``SPI CS`` by ``ST7789 CS`` and ``SPI DC`` by ``ST7789 DC`` +- Replaced ILI9488 GPIO selection from ``SPI CS`` by ``ILI9488_CS`` +- Replaced EPaper29 GPIO selection from ``SPI CS`` by ``EPaper29 CS`` +- Replaced EPaper42 GPIO selection from ``SPI CS`` by ``EPaper42 CS`` +- Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS`` +- Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS`` ### Changed - Logging from heap to stack freeing 700 bytes RAM diff --git a/tasmota/support.ino b/tasmota/support.ino index fcf21a014..215c8ea1d 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1479,8 +1479,7 @@ bool FlashPin(uint32_t pin) return (((pin > 5) && (pin < 9)) || (11 == pin)); } -uint32_t ValidPin(uint32_t pin, uint32_t gpio) -{ +uint32_t ValidPin(uint32_t pin, uint32_t gpio) { if (FlashPin(pin)) { return GPIO_NONE; // Disable flash pins GPIO6, GPIO7, GPIO8 and GPIO11 } @@ -1495,8 +1494,7 @@ uint32_t ValidPin(uint32_t pin, uint32_t gpio) return gpio; } -bool ValidGPIO(uint32_t pin, uint32_t gpio) -{ +bool ValidGPIO(uint32_t pin, uint32_t gpio) { #ifdef ESP8266 #ifdef USE_ADC_VCC if (ADC0_PIN == pin) { return false; } // ADC0 = GPIO17 @@ -1505,6 +1503,17 @@ bool ValidGPIO(uint32_t pin, uint32_t gpio) return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins } +bool ValidSpiGPIO(uint32_t gpio) { + // ESP8266: If SPI pin selected chk if it's not one of the three Hardware SPI pins (12..14) + bool result = true; // Not used and therefore valid + uint32_t pin; + if (PinUsed(gpio)) { + pin = Pin(gpio); + result = ((pin < 12) || (pin > 14)); + } + return result; +} + bool JsonTemplate(char* dataBuf) { // Old: {"NAME":"Shelly 2.5","GPIO":[56,0,17,0,21,83,0,0,6,82,5,22,156],"FLAG":2,"BASE":18} @@ -2106,6 +2115,25 @@ void AddLogBufferSize(uint32_t loglevel, uint8_t *buffer, uint32_t count, uint32 AddLogData(loglevel, log_data); } +void AddLogSpi(bool hardware, uint32_t clk, uint32_t mosi, uint32_t miso) { + // Needs optimization + uint32_t enabled = (hardware) ? TasmotaGlobal.spi_enabled : TasmotaGlobal.soft_spi_enabled; + switch(enabled) { + case SPI_MOSI: + AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK) and GPIO%02d(MOSI)"), + (hardware) ? PSTR("Hardware") : PSTR("Software"), clk, mosi); + break; + case SPI_MISO: + AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK) and GPIO%02d(MISO)"), + (hardware) ? PSTR("Hardware") : PSTR("Software"), clk, miso); + break; + case SPI_MOSI_MISO: + AddLog_P(LOG_LEVEL_INFO, PSTR("SPI: %s using GPIO%02d(CLK), GPIO%02d(MOSI) and GPIO%02d(MISO)"), + (hardware) ? PSTR("Hardware") : PSTR("Software"), clk, mosi, miso); + break; + } +} + /*********************************************************************************************\ * Uncompress static PROGMEM strings \*********************************************************************************************/ diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 58b79e905..b6178f4bc 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1596,29 +1596,33 @@ void GpioInit(void) if ((2 == Pin(GPIO_TXD)) || (H801 == TasmotaGlobal.module_type)) { Serial.set_tx(2); } #endif - TasmotaGlobal.soft_spi_enabled = (PinUsed(GPIO_SSPI_SCLK) && (PinUsed(GPIO_SSPI_MOSI) || PinUsed(GPIO_SSPI_MISO))); + uint32_t sspi_mosi = (PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_MOSI)) ? SPI_MOSI : SPI_NONE; + uint32_t sspi_miso = (PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_MISO)) ? SPI_MISO : SPI_NONE; + TasmotaGlobal.soft_spi_enabled = sspi_mosi + sspi_miso; + AddLogSpi(0, Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI), PinUsed(GPIO_SSPI_MISO)); #ifdef USE_SPI - uint32_t pin_cs = Pin(GPIO_SPI_CS); - uint32_t pin_dc = Pin(GPIO_SPI_DC); - if (PinUsed(GPIO_RC522_CS)) { - pin_cs = Pin(GPIO_RC522_CS); - } - if (PinUsed(GPIO_ILI9341_CS)) { - pin_cs = Pin(GPIO_ILI9341_CS); - if (PinUsed(GPIO_ILI9341_DC)) { - pin_dc = Pin(GPIO_ILI9341_DC); - } - } - #ifdef ESP8266 if (!TasmotaGlobal.soft_spi_enabled) { - // If SPI_CS is used it must be valid - TasmotaGlobal.spi_enabled = ((pin_cs < 99) && ((pin_cs > 14) || (pin_cs < 12))); - if (TasmotaGlobal.spi_enabled && (pin_dc < 99)) { - // If SPI_DC is used it must be valid - TasmotaGlobal.spi_enabled = ((pin_dc > 14) || (pin_dc < 12)); - } + bool valid_cs = (ValidSpiGPIO(GPIO_SPI_CS) && + ValidSpiGPIO(GPIO_RC522_CS) && + ValidSpiGPIO(GPIO_NRF24_CS) && + ValidSpiGPIO(GPIO_ILI9341_CS) && + ValidSpiGPIO(GPIO_EPAPER29_CS) && + ValidSpiGPIO(GPIO_EPAPER42_CS) && + ValidSpiGPIO(GPIO_ILI9488_CS) && + ValidSpiGPIO(GPIO_SSD1351_CS) && + ValidSpiGPIO(GPIO_RA8876_CS) && + ValidSpiGPIO(GPIO_ST7789_CS) + ); + bool valid_dc = (ValidSpiGPIO(GPIO_SPI_DC) && + ValidSpiGPIO(GPIO_NRF24_DC) && + ValidSpiGPIO(GPIO_ILI9341_DC) && + ValidSpiGPIO(GPIO_ST7789_DC) + ); + + // If SPI_CS and/or SPI_DC is used they must be valid + TasmotaGlobal.spi_enabled = (valid_cs && valid_dc) ? SPI_MOSI_MISO : SPI_NONE; if (TasmotaGlobal.spi_enabled) { TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); SetPin(12, AGPIO(GPIO_SPI_MISO)); @@ -1626,65 +1630,27 @@ void GpioInit(void) SetPin(13, AGPIO(GPIO_SPI_MOSI)); TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); SetPin(14, AGPIO(GPIO_SPI_CLK)); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK)")); } } #endif // ESP8266 #ifdef ESP32 - if (pin_cs < 99) { -/* - // Do not do this as ESP32 can have SPI_CS everywhere - if ((15 == pin_cs) && (!GetPin(12) && !GetPin(13) && !GetPin(14))) { // HSPI - TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); - SetPin(12, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); - SetPin(13, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); - SetPin(14, AGPIO(GPIO_SPI_CLK)); - } - else if ((5 == pin_cs) && (!GetPin(19) && !GetPin(23) && !GetPin(18))) { // VSPI - TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); - SetPin(19, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); - SetPin(23, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); - SetPin(18, AGPIO(GPIO_SPI_CLK)); - } - else if ((12 == Pin(GPIO_SPI_MISO)) || (13 == Pin(GPIO_SPI_MOSI)) || (14 == Pin(GPIO_SPI_CLK))) { // HSPI - TasmotaGlobal.my_module.io[12] = AGPIO(GPIO_SPI_MISO); - SetPin(12, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[13] = AGPIO(GPIO_SPI_MOSI); - SetPin(13, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[14] = AGPIO(GPIO_SPI_CLK); - SetPin(14, AGPIO(GPIO_SPI_CLK)); - } - else if ((19 == Pin(GPIO_SPI_MISO)) || (23 == Pin(GPIO_SPI_MOSI)) || (18 == Pin(GPIO_SPI_CLK))) { // VSPI - TasmotaGlobal.my_module.io[19] = AGPIO(GPIO_SPI_MISO); - SetPin(19, AGPIO(GPIO_SPI_MISO)); - TasmotaGlobal.my_module.io[23] = AGPIO(GPIO_SPI_MOSI); - SetPin(23, AGPIO(GPIO_SPI_MOSI)); - TasmotaGlobal.my_module.io[18] = AGPIO(GPIO_SPI_CLK); - SetPin(18, AGPIO(GPIO_SPI_CLK)); - } - TasmotaGlobal.spi_enabled = (PinUsed(GPIO_SPI_CLK) && (PinUsed(GPIO_SPI_MOSI) || PinUsed(GPIO_SPI_MISO))); -*/ - TasmotaGlobal.spi_enabled = (pin_cs < 99); - if (TasmotaGlobal.spi_enabled) { - if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO), GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); - } - else if (PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MOSI) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); - } - else if (PinUsed(GPIO_SPI_MISO) && PinUsed(GPIO_SPI_CLK)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SPI: Using GPIO%02d(MISO) and GPIO%02d(CLK)"), - Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK)); - } - } + if (PinUsed(GPIO_SPI_CS) || + PinUsed(GPIO_RC522_CS) || + PinUsed(GPIO_NRF24_CS) || + PinUsed(GPIO_ILI9341_CS) || + PinUsed(GPIO_EPAPER29_CS) || + PinUsed(GPIO_EPAPER42_CS) || + PinUsed(GPIO_ILI9488_CS) || + PinUsed(GPIO_SSD1351_CS) || + PinUsed(GPIO_RA8876_CS) || + PinUsed(GPIO_ST7789_CS) + ) { + uint32_t spi_mosi = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MOSI)) ? SPI_MOSI : SPI_NONE; + uint32_t spi_miso = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MISO)) ? SPI_MISO : SPI_NONE; + TasmotaGlobal.spi_enabled = spi_mosi + spi_miso; } #endif // ESP32 + AddLogSpi(1, Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_MISO)); #endif // USE_SPI for (uint32_t i = 0; i < ARRAY_SIZE(TasmotaGlobal.my_module.io); i++) { diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 759655956..20f150f69 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -313,6 +313,8 @@ enum SettingsTextIndex { SET_OTAURL, SET_SHD_PARAM, SET_MAX }; +enum SpiInterfaces { SPI_NONE, SPI_MOSI, SPI_MISO, SPI_MOSI_MISO }; + enum DevGroupMessageType { DGR_MSGTYP_FULL_STATUS, DGR_MSGTYP_PARTIAL_UPDATE, DGR_MSGTYP_UPDATE, DGR_MSGTYP_UPDATE_MORE_TO_COME, DGR_MSGTYP_UPDATE_DIRECT, DGR_MSGTYPE_UPDATE_COMMAND, DGR_MSGTYPFLAG_WITH_LOCAL = 128 }; enum DevGroupMessageFlag { DGR_FLAG_RESET = 1, DGR_FLAG_STATUS_REQUEST = 2, DGR_FLAG_FULL_STATUS = 4, DGR_FLAG_ACK = 8, DGR_FLAG_MORE_TO_COME = 16, DGR_FLAG_DIRECT = 32, DGR_FLAG_ANNOUNCEMENT = 64, DGR_FLAG_LOCAL = 128 }; diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index b70bd4637..183606909 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -119,8 +119,6 @@ struct { bool blinkstate; // LED state bool pwm_present; // Any PWM channel configured with SetOption15 0 bool i2c_enabled; // I2C configured - bool spi_enabled; // SPI configured - bool soft_spi_enabled; // Software SPI configured bool ntp_force_sync; // Force NTP sync bool is_8285; // Hardware device ESP8266EX (0) or ESP8285 (1) bool skip_light_fade; // Temporarily skip light fading @@ -128,6 +126,8 @@ struct { bool module_changed; // Indicate module changed since last restart StateBitfield global_state; // Global states (currently Wifi and Mqtt) (8 bits) + uint8_t spi_enabled; // SPI configured + uint8_t soft_spi_enabled; // Software SPI configured uint8_t blinks; // Number of LED blinks uint8_t restart_flag; // Tasmota restart flag uint8_t ota_state_flag; // OTA state flag diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index c3bb7044b..2f21ed0aa 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -46,6 +46,11 @@ #undef CODE_IMAGE_STR #define CODE_IMAGE_STR "odroid-go" +#undef MODULE +#define MODULE ODROID_GO // [Module] Select default module from tasmota_template.h +#undef FALLBACK_MODULE +#define FALLBACK_MODULE ODROID_GO // [Module2] Select default module on fast reboot where USER_MODULE is user template + #define USE_ODROID_GO // Add support for Odroid Go #define USE_ADC #define USE_SPI diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 46915f280..786eeed08 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -365,8 +365,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SPI_CS), // SPI Chip Select AGPIO(GPIO_SPI_DC), // SPI Data Direction #ifdef USE_NRF24 -// AGPIO(GPIO_NRF24_CS), -// AGPIO(GPIO_NRF24_DC), + AGPIO(GPIO_NRF24_CS), + AGPIO(GPIO_NRF24_DC), #endif #ifdef USE_RC522 AGPIO(GPIO_RC522_CS), // RC522 Rfid Chip Select @@ -386,23 +386,23 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SSPI_DC), // Software SPI Data or Command #ifdef USE_DISPLAY #ifdef USE_DISPLAY_ILI9488 -// AGPIO(GPIO_ILI9488_CS), + AGPIO(GPIO_ILI9488_CS), #endif // USE_DISPLAY_ILI9488 #ifdef USE_DISPLAY_EPAPER_29 -// AGPIO(GPIO_EPAPER29_CS), + AGPIO(GPIO_EPAPER29_CS), #endif // USE_DISPLAY_EPAPER_29 #ifdef USE_DISPLAY_EPAPER_42 -// AGPIO(GPIO_EPAPER42_CS), + AGPIO(GPIO_EPAPER42_CS), #endif // USE_DISPLAY_EPAPER_42 #ifdef USE_DISPLAY_SSD1351 -// AGPIO(GPIO_SSD1351_CS), + AGPIO(GPIO_SSD1351_CS), #endif // USE_DISPLAY_SSD1351 #ifdef USE_DISPLAY_RA8876 -// AGPIO(GPIO_RA8876_CS), + AGPIO(GPIO_RA8876_CS), #endif // USE_DISPLAY_RA8876 #ifdef USE_DISPLAY_ST7789 -// AGPIO(GPIO_ST7789_CS), -// AGPIO(GPIO_ST7789_DC), + AGPIO(GPIO_ST7789_CS), + AGPIO(GPIO_ST7789_DC), #endif //f USE_DISPLAY_ST7789 AGPIO(GPIO_BACKLIGHT), // Display backlight control AGPIO(GPIO_OLED_RESET), // OLED Display Reset diff --git a/tasmota/xdrv_33_nrf24l01.ino b/tasmota/xdrv_33_nrf24l01.ino index 7c4d1b843..b1e8d43c4 100644 --- a/tasmota/xdrv_33_nrf24l01.ino +++ b/tasmota/xdrv_33_nrf24l01.ino @@ -34,7 +34,7 @@ /*********************************************************************************************\ * NRF24l01(+) * -* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_SPI_CS/GPIO_SPI_DC +* Usage: 5 SPI-data-wires plus VVC/ground, use hardware SPI, select GPIO_NRF24_CS/GPIO_NRF24_DC \*********************************************************************************************/ #define XDRV_33 33 @@ -51,45 +51,40 @@ struct { RF24 NRF24radio; -bool NRF24initRadio() -{ - NRF24radio.begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); +bool NRF24initRadio() { + NRF24radio.begin(Pin(GPIO_NRF24_CS), Pin(GPIO_NRF24_DC)); NRF24radio.powerUp(); - if(NRF24radio.isChipConnected()){ - DEBUG_DRIVER_LOG(PSTR("NRF24 chip connected")); + if (NRF24radio.isChipConnected()) { + DEBUG_DRIVER_LOG(PSTR("NRF: Chip connected")); return true; } - DEBUG_DRIVER_LOG(PSTR("NRF24 chip NOT !!!! connected")); + DEBUG_DRIVER_LOG(PSTR("NRF: Chip NOT !!!! connected")); return false; } -bool NRF24Detect(void) -{ - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { - if(NRF24initRadio()){ +void NRF24Detect(void) { + if (PinUsed(GPIO_NRF24_CS) && PinUsed(GPIO_NRF24_DC) && TasmotaGlobal.spi_enabled) { + if (NRF24initRadio()) { NRF24.chipType = 32; // SPACE - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01 initialized")); - if(NRF24radio.isPVariant()){ + AddLog_P(LOG_LEVEL_INFO, PSTR("NRF: Model 24L01 initialized")); + if (NRF24radio.isPVariant()) { NRF24.chipType = 43; // + - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF24L01+ detected")); + AddLog_P(LOG_LEVEL_INFO, PSTR("NRF: Model 24L01+ detected")); } - return true; } } - return false; } /*********************************************************************************************\ * Interface \*********************************************************************************************/ -bool Xdrv33(uint8_t function) -{ +bool Xdrv33(uint8_t function) { bool result = false; if (FUNC_INIT == function) { - result = NRF24Detect(); + NRF24Detect(); } return result; } diff --git a/tasmota/xdsp_04_ili9341.ino b/tasmota/xdsp_04_ili9341.ino index adabfe6b0..50f19ac02 100644 --- a/tasmota/xdsp_04_ili9341.ino +++ b/tasmota/xdsp_04_ili9341.ino @@ -38,6 +38,7 @@ uint16_t tft_top = TFT_TOP; uint16_t tft_bottom = TFT_BOTTOM; uint16_t tft_scroll = TFT_TOP; uint16_t tft_cols = 0; +bool tft_init_done = false; /*********************************************************************************************/ @@ -57,8 +58,7 @@ bool Ili9341Header(void) { return (tft_cols > 17); } -void Ili9341InitMode(void) -{ +void Ili9341InitMode(void) { tft->setRotation(Settings.display_rotate); // 0 tft->invertDisplay(0); tft->fillScreen(ILI9341_BLACK); @@ -78,8 +78,7 @@ void Ili9341InitMode(void) } } -void Ili9341Init(uint8_t mode) -{ +void Ili9341Init(uint8_t mode) { switch(mode) { case DISPLAY_INIT_MODE: Ili9341InitMode(); @@ -95,24 +94,11 @@ void Ili9341Init(uint8_t mode) } } -void Ili9341InitDriver(void) -{ - uint32_t pin_cs = Pin(GPIO_SPI_CS); - uint32_t pin_dc = Pin(GPIO_SPI_DC); - if (!Settings.display_model) { - if (PinUsed(GPIO_ILI9341_CS)) { - pin_cs = Pin(GPIO_ILI9341_CS); - if (PinUsed(GPIO_ILI9341_DC)) { - pin_dc = Pin(GPIO_ILI9341_DC); - } - Settings.display_model = XDSP_04; - } +void Ili9341InitDriver(void) { + if (PinUsed(GPIO_ILI9341_CS) && PinUsed(GPIO_ILI9341_DC) && TasmotaGlobal.spi_enabled) { - // Legacy Settings.display_model = XDSP_04; - } - if (XDSP_04 == Settings.display_model) { if (Settings.display_width != ILI9341_TFTWIDTH) { Settings.display_width = ILI9341_TFTWIDTH; } @@ -120,7 +106,7 @@ void Ili9341InitDriver(void) Settings.display_height = ILI9341_TFTHEIGHT; } - tft = new Adafruit_ILI9341(pin_cs, pin_dc); + tft = new Adafruit_ILI9341(Pin(GPIO_ILI9341_CS), Pin(GPIO_ILI9341_DC)); tft->begin(); #ifdef USE_DISPLAY_MODES1TO5 @@ -131,18 +117,17 @@ void Ili9341InitDriver(void) Ili9341InitMode(); + tft_init_done = true; AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: ILI9341")); } } -void Ili9341Clear(void) -{ +void Ili9341Clear(void) { tft->fillScreen(ILI9341_BLACK); tft->setCursor(0, 0); } -void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) -{ +void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint8_t flag) { uint16_t active_color = ILI9341_WHITE; tft->setTextSize(Settings.display_size); @@ -156,8 +141,7 @@ void Ili9341DrawStringAt(uint16_t x, uint16_t y, char *str, uint16_t color, uint tft->println(str); } -void Ili9341DisplayOnOff() -{ +void Ili9341DisplayOnOff() { // tft->showDisplay(disp_power); // tft->invertDisplay(disp_power); if (PinUsed(GPIO_BACKLIGHT)) { @@ -170,8 +154,7 @@ void Ili9341DisplayOnOff() #ifdef USE_DISPLAY_MODES1TO5 -void Ili9341PrintLog(void) -{ +void Ili9341PrintLog(void) { disp_refresh--; if (!disp_refresh) { disp_refresh = Settings.display_refresh; @@ -217,8 +200,7 @@ void Ili9341PrintLog(void) } } -void Ili9341Refresh(void) // Every second -{ +void Ili9341Refresh(void) { // Every second if (Settings.display_mode) { // Mode 0 is User text // 24-04-2017 13:45:43 = 19 + 1 ('\0') = 20 // 24-04-2017 13:45 = 16 + 1 ('\0') = 17 @@ -263,73 +245,70 @@ void Ili9341Refresh(void) // Every second * Interface \*********************************************************************************************/ -bool Xdsp04(uint8_t function) -{ +bool Xdsp04(uint8_t function) { bool result = false; - if (TasmotaGlobal.spi_enabled) { - if (FUNC_DISPLAY_INIT_DRIVER == function) { - Ili9341InitDriver(); - } - else if (XDSP_04 == Settings.display_model) { + if (FUNC_DISPLAY_INIT_DRIVER == function) { + Ili9341InitDriver(); + } + else if (tft_init_done && (XDSP_04 == Settings.display_model)) { - if (!dsp_color) { dsp_color = ILI9341_WHITE; } + if (!dsp_color) { dsp_color = ILI9341_WHITE; } - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; - case FUNC_DISPLAY_INIT: - Ili9341Init(dsp_init); - break; - case FUNC_DISPLAY_POWER: - Ili9341DisplayOnOff(); - break; - case FUNC_DISPLAY_CLEAR: - Ili9341Clear(); - break; - case FUNC_DISPLAY_DRAW_HLINE: - tft->writeFastHLine(dsp_x, dsp_y, dsp_len, dsp_color); - break; - case FUNC_DISPLAY_DRAW_VLINE: - tft->writeFastVLine(dsp_x, dsp_y, dsp_len, dsp_color); - break; - case FUNC_DISPLAY_DRAW_LINE: - tft->writeLine(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; - case FUNC_DISPLAY_DRAW_CIRCLE: - tft->drawCircle(dsp_x, dsp_y, dsp_rad, dsp_color); - break; - case FUNC_DISPLAY_FILL_CIRCLE: - tft->fillCircle(dsp_x, dsp_y, dsp_rad, dsp_color); - break; - case FUNC_DISPLAY_DRAW_RECTANGLE: - tft->drawRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; - case FUNC_DISPLAY_FILL_RECTANGLE: - tft->fillRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); - break; + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; + case FUNC_DISPLAY_INIT: + Ili9341Init(dsp_init); + break; + case FUNC_DISPLAY_POWER: + Ili9341DisplayOnOff(); + break; + case FUNC_DISPLAY_CLEAR: + Ili9341Clear(); + break; + case FUNC_DISPLAY_DRAW_HLINE: + tft->writeFastHLine(dsp_x, dsp_y, dsp_len, dsp_color); + break; + case FUNC_DISPLAY_DRAW_VLINE: + tft->writeFastVLine(dsp_x, dsp_y, dsp_len, dsp_color); + break; + case FUNC_DISPLAY_DRAW_LINE: + tft->writeLine(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); + break; + case FUNC_DISPLAY_DRAW_CIRCLE: + tft->drawCircle(dsp_x, dsp_y, dsp_rad, dsp_color); + break; + case FUNC_DISPLAY_FILL_CIRCLE: + tft->fillCircle(dsp_x, dsp_y, dsp_rad, dsp_color); + break; + case FUNC_DISPLAY_DRAW_RECTANGLE: + tft->drawRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); + break; + case FUNC_DISPLAY_FILL_RECTANGLE: + tft->fillRect(dsp_x, dsp_y, dsp_x2, dsp_y2, dsp_color); + break; // case FUNC_DISPLAY_DRAW_FRAME: // oled->display(); // break; - case FUNC_DISPLAY_TEXT_SIZE: - tft->setTextSize(Settings.display_size); - break; - case FUNC_DISPLAY_FONT_SIZE: + case FUNC_DISPLAY_TEXT_SIZE: + tft->setTextSize(Settings.display_size); + break; + case FUNC_DISPLAY_FONT_SIZE: // tft->setTextSize(Settings.display_font); - break; - case FUNC_DISPLAY_DRAW_STRING: - Ili9341DrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag); - break; - case FUNC_DISPLAY_ROTATION: - tft->setRotation(Settings.display_rotate); - break; + break; + case FUNC_DISPLAY_DRAW_STRING: + Ili9341DrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag); + break; + case FUNC_DISPLAY_ROTATION: + tft->setRotation(Settings.display_rotate); + break; #ifdef USE_DISPLAY_MODES1TO5 - case FUNC_DISPLAY_EVERY_SECOND: - Ili9341Refresh(); - break; + case FUNC_DISPLAY_EVERY_SECOND: + Ili9341Refresh(); + break; #endif // USE_DISPLAY_MODES1TO5 - } } } return result; diff --git a/tasmota/xdsp_05_epaper_29.ino b/tasmota/xdsp_05_epaper_29.ino index 08fcbcf9b..5655f7a19 100644 --- a/tasmota/xdsp_05_epaper_29.ino +++ b/tasmota/xdsp_05_epaper_29.ino @@ -39,18 +39,18 @@ //unsigned char image[(EPD_HEIGHT * EPD_WIDTH) / 8]; extern uint8_t *buffer; uint16_t epd_scroll; +bool epd_init_done = false; Epd *epd; /*********************************************************************************************/ -void EpdInitDriver29() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_05; - } +void EpdInitDriver29(void) { + if (PinUsed(GPIO_EPAPER29_CS) && + ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { + + Settings.display_model = XDSP_05; - if (XDSP_05 == Settings.display_model) { if (Settings.display_width != EPD_WIDTH) { Settings.display_width = EPD_WIDTH; } @@ -64,19 +64,14 @@ void EpdInitDriver29() if (!buffer) return; // init renderer - epd = new Epd(EPD_WIDTH,EPD_HEIGHT); + epd = new Epd(EPD_WIDTH, EPD_HEIGHT); // whiten display with full update, takes 3 seconds - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MOSI)) { - epd->Begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK)); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("EPD: HardSPI CS %d, CLK %d, MOSI %d"),Pin(GPIO_SPI_CS), Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MOSI)); + if (TasmotaGlobal.soft_spi_enabled) { + epd->Begin(Pin(GPIO_EPAPER29_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK)); } - else if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_MOSI)) { - epd->Begin(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK)); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("EPD: SoftSPI CS %d, CLK %d, MOSI %d"),Pin(GPIO_SSPI_CS), Pin(GPIO_SSPI_SCLK), Pin(GPIO_SSPI_MOSI)); - } else { - free(buffer); - return; + else if (TasmotaGlobal.spi_enabled) { + epd->Begin(Pin(GPIO_EPAPER29_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } renderer = epd; @@ -95,6 +90,8 @@ void EpdInitDriver29() renderer->fillScreen(0); #endif + epd_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: E-Paper 2.9")); } } @@ -186,21 +183,22 @@ void EpdRefresh29(void) // Every second bool Xdsp05(uint8_t function) { bool result = false; - if (FUNC_DISPLAY_INIT_DRIVER == function) { - EpdInitDriver29(); - } - else if (XDSP_05 == Settings.display_model) { - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; + + if (FUNC_DISPLAY_INIT_DRIVER == function) { + EpdInitDriver29(); + } + else if (epd_init_done && (XDSP_05 == Settings.display_model)) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; #ifdef USE_DISPLAY_MODES1TO5 - case FUNC_DISPLAY_EVERY_SECOND: - EpdRefresh29(); - break; + case FUNC_DISPLAY_EVERY_SECOND: + EpdRefresh29(); + break; #endif // USE_DISPLAY_MODES1TO5 - } } + } return result; } diff --git a/tasmota/xdsp_06_epaper_42.ino b/tasmota/xdsp_06_epaper_42.ino index fee42db6c..4947d6667 100644 --- a/tasmota/xdsp_06_epaper_42.ino +++ b/tasmota/xdsp_06_epaper_42.ino @@ -35,19 +35,18 @@ #include extern uint8_t *buffer; +bool epd42_init_done = false; Epd42 *epd42; /*********************************************************************************************/ -void EpdInitDriver42() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_06; - } +void EpdInitDriver42() { + if (PinUsed(GPIO_EPAPER42_CS) && + ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { - if (XDSP_06 == Settings.display_model) { + Settings.display_model = XDSP_06; if (Settings.display_width != EPD_WIDTH42) { Settings.display_width = EPD_WIDTH42; @@ -62,23 +61,14 @@ void EpdInitDriver42() if (!buffer) return; // init renderer - epd42 = new Epd42(EPD_WIDTH42,EPD_HEIGHT42); + epd42 = new Epd42(EPD_WIDTH42, EPD_HEIGHT42); - #ifdef USE_SPI - if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK)) { - epd42->Begin(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK)); - } else { - free(buffer); - return; - } - #else - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - epd42->Begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK)); - } else { - free(buffer); - return; - } - #endif + if (TasmotaGlobal.soft_spi_enabled) { + epd42->Begin(Pin(GPIO_EPAPER42_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK)); + } + else if (TasmotaGlobal.spi_enabled) { + epd42->Begin(Pin(GPIO_EPAPER42_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); + } renderer = epd42; @@ -105,6 +95,8 @@ void EpdInitDriver42() renderer->fillScreen(0); #endif + epd42_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: E-Paper 4.2")); } } @@ -134,27 +126,24 @@ bool Xdsp06(uint8_t function) { bool result = false; - if (FUNC_DISPLAY_INIT_DRIVER == function) { - EpdInitDriver42(); - } - else if (XDSP_06 == Settings.display_model) { - - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; - + if (FUNC_DISPLAY_INIT_DRIVER == function) { + EpdInitDriver42(); + } + else if (epd42_init_done && (XDSP_06 == Settings.display_model)) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; #ifdef USE_DISPLAY_MODES1TO5 - case FUNC_DISPLAY_EVERY_SECOND: - EpdRefresh42(); - break; + case FUNC_DISPLAY_EVERY_SECOND: + EpdRefresh42(); + break; #endif // USE_DISPLAY_MODES1TO5 - } } + } return result; } - #endif // USE_DISPLAY_EPAPER42 #endif // USE_DISPLAY #endif // USE_SPI diff --git a/tasmota/xdsp_08_ILI9488.ino b/tasmota/xdsp_08_ILI9488.ino index af8ac03a1..a64c626bd 100644 --- a/tasmota/xdsp_08_ILI9488.ino +++ b/tasmota/xdsp_08_ILI9488.ino @@ -34,6 +34,7 @@ #include uint8_t ili9488_ctouch_counter = 0; +bool ili9488_init_done = false; // currently fixed #define BACKPLANE_PIN 2 @@ -45,13 +46,10 @@ extern const uint16_t picture[]; /*********************************************************************************************/ -void ILI9488_InitDriver() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_08; - } +void ILI9488_InitDriver(void) { + if (PinUsed(GPIO_ILI9488_CS) && (TasmotaGlobal.spi_enabled & SPI_MOSI)) { - if (XDSP_08 == Settings.display_model) { + Settings.display_model = XDSP_08; if (Settings.display_width != ILI9488_TFTWIDTH) { Settings.display_width = ILI9488_TFTWIDTH; @@ -61,44 +59,19 @@ void ILI9488_InitDriver() } // disable screen buffer - buffer=NULL; + buffer = NULL; // default colors fg_color = ILI9488_WHITE; bg_color = ILI9488_BLACK; - uint8_t bppin=BACKPLANE_PIN; - if (PinUsed(GPIO_BACKLIGHT)) { - bppin=Pin(GPIO_BACKLIGHT); + uint8_t bppin = BACKPLANE_PIN; + if (PinUsed(GPIO_BACKLIGHT)) { + bppin = Pin(GPIO_BACKLIGHT); } -#ifdef ESP8266 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 13 -#undef HW_SPI_MISO -#define HW_SPI_MISO 12 -#undef HW_SPI_CLK -#define HW_SPI_CLK 14 -#endif // ESP8266 -#ifdef ESP32 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 23 -#undef HW_SPI_MISO -#define HW_SPI_MISO 19 -#undef HW_SPI_CLK -#define HW_SPI_CLK 18 -#endif // ESP32 - // init renderer, must use hardware spi - if (PinUsed(GPIO_SSPI_CS) && (Pin(GPIO_SSPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SSPI_SCLK)==HW_SPI_CLK)) { - ili9488 = new ILI9488(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),bppin); - } else { - if (PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SPI_CLK)==HW_SPI_CLK)) { - ili9488 = new ILI9488(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK),bppin); - } else { - return; - } - } + ili9488 = new ILI9488(Pin(GPIO_ILI9488_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK), bppin); ili9488->begin(); renderer = ili9488; @@ -120,6 +93,9 @@ void ILI9488_InitDriver() #ifdef USE_FT5206 Touch_Init(Wire); #endif + + ili9488_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: ILI9488")); } } @@ -170,25 +146,23 @@ bool Xdsp08(uint8_t function) { bool result = false; - if (FUNC_DISPLAY_INIT_DRIVER == function) { - ILI9488_InitDriver(); - } - else if (XDSP_08 == Settings.display_model) { - - switch (function) { - case FUNC_DISPLAY_MODEL: - result = true; - break; - case FUNC_DISPLAY_EVERY_50_MSECOND: + if (FUNC_DISPLAY_INIT_DRIVER == function) { + ILI9488_InitDriver(); + } + else if (ili9488_init_done && (XDSP_08 == Settings.display_model)) { + switch (function) { + case FUNC_DISPLAY_MODEL: + result = true; + break; + case FUNC_DISPLAY_EVERY_50_MSECOND: #ifdef USE_TOUCH_BUTTONS - if (FT5206_found) { - ILI9488_CheckTouch(); - } + if (FT5206_found) { + ILI9488_CheckTouch(); + } #endif - break; - } + break; } - //} + } return result; } diff --git a/tasmota/xdsp_09_SSD1351.ino b/tasmota/xdsp_09_SSD1351.ino index 1b17bd08a..2e4337e9b 100644 --- a/tasmota/xdsp_09_SSD1351.ino +++ b/tasmota/xdsp_09_SSD1351.ino @@ -33,6 +33,7 @@ #include +bool ssd1351_init_done = false; extern uint8_t *buffer; extern uint8_t color_type; SSD1351 *ssd1351; @@ -40,11 +41,10 @@ SSD1351 *ssd1351; /*********************************************************************************************/ void SSD1351_InitDriver() { - if (!Settings.display_model) { - Settings.display_model = XDSP_09; - } + if (PinUsed(GPIO_SSD1351_CS) && + ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { - if (XDSP_09 == Settings.display_model) { + Settings.display_model = XDSP_09; if (Settings.display_width != SSD1351_WIDTH) { Settings.display_width = SSD1351_WIDTH; @@ -53,21 +53,18 @@ void SSD1351_InitDriver() { Settings.display_height = SSD1351_HEIGHT; } - buffer=0; + buffer = 0; // default colors fg_color = SSD1351_WHITE; bg_color = SSD1351_BLACK; // init renderer - if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK)){ - ssd1351 = new SSD1351(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK)); - } else { - if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_MOSI) && PinUsed(GPIO_SPI_CLK)) { - ssd1351 = new SSD1351(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_CLK)); - } else { - return; - } + if (TasmotaGlobal.soft_spi_enabled){ + ssd1351 = new SSD1351(Pin(GPIO_SSD1351_CS), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK)); + } + else if (TasmotaGlobal.spi_enabled) { + ssd1351 = new SSD1351(Pin(GPIO_SSD1351_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_CLK)); } delay(100); @@ -85,6 +82,9 @@ void SSD1351_InitDriver() { #endif color_type = COLOR_COLOR; + + ssd1351_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: SSD1351")); } } @@ -162,7 +162,7 @@ bool Xdsp09(uint8_t function) if (FUNC_DISPLAY_INIT_DRIVER == function) { SSD1351_InitDriver(); } - else if (XDSP_09 == Settings.display_model) { + else if (ssd1351_init_done && (XDSP_09 == Settings.display_model)) { switch (function) { case FUNC_DISPLAY_MODEL: result = true; diff --git a/tasmota/xdsp_10_RA8876.ino b/tasmota/xdsp_10_RA8876.ino index 7cc87c4df..9caf5678d 100644 --- a/tasmota/xdsp_10_RA8876.ino +++ b/tasmota/xdsp_10_RA8876.ino @@ -33,19 +33,17 @@ #include +bool ra8876_init_done = false; uint8_t ra8876_ctouch_counter = 0; extern uint8_t *buffer; extern uint8_t color_type; RA8876 *ra8876; /*********************************************************************************************/ -void RA8876_InitDriver() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_10; - } +void RA8876_InitDriver(void) { + if (PinUsed(GPIO_RA8876_CS) && (SPI_MOSI_MISO == TasmotaGlobal.spi_enabled)) { - if (XDSP_10 == Settings.display_model) { + Settings.display_model = XDSP_10; if (Settings.display_width != RA8876_TFTWIDTH) { Settings.display_width = RA8876_TFTWIDTH; @@ -53,39 +51,15 @@ void RA8876_InitDriver() if (Settings.display_height != RA8876_TFTHEIGHT) { Settings.display_height = RA8876_TFTHEIGHT; } - buffer=0; + + buffer = 0; // default colors fg_color = RA8876_WHITE; bg_color = RA8876_BLACK; -#ifdef ESP8266 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 13 -#undef HW_SPI_MISO -#define HW_SPI_MISO 12 -#undef HW_SPI_CLK -#define HW_SPI_CLK 14 -#endif // ESP8266 -#ifdef ESP32 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 23 -#undef HW_SPI_MISO -#define HW_SPI_MISO 19 -#undef HW_SPI_CLK -#define HW_SPI_CLK 18 -#endif // ESP32 - // init renderer, must use hardware spi - if (PinUsed(GPIO_SSPI_CS) && (Pin(GPIO_SSPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SSPI_MISO)==HW_SPI_MISO) && (Pin(GPIO_SSPI_SCLK)==HW_SPI_CLK)) { - ra8876 = new RA8876(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_MISO),Pin(GPIO_SSPI_SCLK),Pin(GPIO_BACKLIGHT)); - } else { - if (PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SPI_MISO)==HW_SPI_MISO) && (Pin(GPIO_SPI_CLK)==HW_SPI_CLK)) { - ra8876 = new RA8876(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_MOSI),Pin(GPIO_SPI_MISO),Pin(GPIO_SPI_CLK),Pin(GPIO_BACKLIGHT)); - } else { - return; - } - } + ra8876 = new RA8876(Pin(GPIO_RA8876_CS), Pin(GPIO_SPI_MOSI), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_CLK), Pin(GPIO_BACKLIGHT)); ra8876->begin(); renderer = ra8876; @@ -107,6 +81,8 @@ void RA8876_InitDriver() Touch_Init(Wire); #endif + ra8876_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: RA8876")); } } @@ -329,7 +305,7 @@ bool Xdsp10(uint8_t function) if (FUNC_DISPLAY_INIT_DRIVER == function) { RA8876_InitDriver(); } - else if (XDSP_10 == Settings.display_model) { + else if (ra8876_init_done && (XDSP_10 == Settings.display_model)) { switch (function) { case FUNC_DISPLAY_MODEL: result = true; diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index 1c9ec1aff..524ecc4d1 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -53,16 +53,15 @@ Arduino_ST7789 *st7789; #ifdef USE_FT5206 uint8_t st7789_ctouch_counter = 0; #endif // USE_FT5206 +bool st7789_init_done = false; /*********************************************************************************************/ -void ST7789_InitDriver() -{ - if (!Settings.display_model) { - Settings.display_model = XDSP_12; - } +void ST7789_InitDriver(void) { + if (PinUsed(GPIO_ST7789_CS) && PinUsed(GPIO_ST7789_DC) && + ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { - if (XDSP_12 == Settings.display_model) { + Settings.display_model = XDSP_12; if (!Settings.display_width) { Settings.display_width = 240; @@ -72,57 +71,30 @@ void ST7789_InitDriver() } // disable screen buffer - buffer=NULL; + buffer = NULL; // default colors fg_color = ST7789_WHITE; bg_color = ST7789_BLACK; - int8_t bppin=BACKPLANE_PIN; - if (PinUsed(GPIO_BACKLIGHT)) { - bppin=Pin(GPIO_BACKLIGHT); + int8_t bppin = BACKPLANE_PIN; + if (PinUsed(GPIO_BACKLIGHT)) { + bppin = Pin(GPIO_BACKLIGHT); } int8_t reset = -1; - if (PinUsed(GPIO_OLED_RESET)) { - reset=Pin(GPIO_OLED_RESET); + if (PinUsed(GPIO_OLED_RESET)) { + reset = Pin(GPIO_OLED_RESET); } - int8_t cs = -1; - if (PinUsed(GPIO_SSPI_CS)) { - cs=Pin(GPIO_SSPI_CS); - } else if (PinUsed(GPIO_SPI_CS)) { - cs=Pin(GPIO_SPI_CS); - } - -#ifdef ESP8266 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 13 -#undef HW_SPI_CLK -#define HW_SPI_CLK 14 -#endif // ESP8266 -#ifdef ESP32 -#undef HW_SPI_MOSI -#define HW_SPI_MOSI 23 -#undef HW_SPI_CLK -#define HW_SPI_CLK 18 -#endif // ESP32 - // init renderer, may use hardware spi - //if (PinUsed(GPIO_SPI_CS) && (Pin(GPIO_SPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SPI_CLK)==HW_SPI_CLK) && PinUsed(GPIO_SPI_DC)) { - if ((Pin(GPIO_SPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SPI_CLK)==HW_SPI_CLK) && PinUsed(GPIO_SPI_DC)) { - st7789 = new Arduino_ST7789(Pin(GPIO_SPI_DC), reset, cs, bppin); - } else { - if ((PinUsed(GPIO_SSPI_CS) || PinUsed(GPIO_OLED_RESET)) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_SSPI_DC)) { - if ((Pin(GPIO_SSPI_MOSI)==HW_SPI_MOSI) && (Pin(GPIO_SSPI_SCLK)==HW_SPI_CLK)) { - st7789 = new Arduino_ST7789(Pin(GPIO_SSPI_DC), reset, cs, bppin); - } else { - st7789 = new Arduino_ST7789(Pin(GPIO_SSPI_DC), reset, Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK), cs, bppin); - } - } else { - return; - } + if (TasmotaGlobal.soft_spi_enabled) { + st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK), Pin(GPIO_ST7789_CS), bppin); } + else if (TasmotaGlobal.spi_enabled) { + st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, Pin(GPIO_ST7789_CS), bppin); + } + st7789->init(Settings.display_width,Settings.display_height); renderer = st7789; renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); @@ -154,6 +126,8 @@ void ST7789_InitDriver() #endif // USE_FT5206 #endif // ESP32 + st7789_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: ST7789")); } } @@ -212,7 +186,7 @@ bool Xdsp12(uint8_t function) if (FUNC_DISPLAY_INIT_DRIVER == function) { ST7789_InitDriver(); } - else if (XDSP_12 == Settings.display_model) { + else if (st7789_init_done && (XDSP_12 == Settings.display_model)) { switch (function) { case FUNC_DISPLAY_MODEL: result = true; diff --git a/tasmota/xsns_61_MI_NRF24.ino b/tasmota/xsns_61_MI_NRF24.ino index 4c243d4dc..727aeb011 100644 --- a/tasmota/xsns_61_MI_NRF24.ino +++ b/tasmota/xsns_61_MI_NRF24.ino @@ -409,14 +409,18 @@ static union{ /********************************************************************************************/ -void MINRFinit(void){ - MINRFinitBLE(1); +void MINRFinit(void) { + if (PinUsed(GPIO_NRF24_CS) && PinUsed(GPIO_NRF24_DC) && TasmotaGlobal.spi_enabled) { + MINRFinitBLE(1); - MINRF.option.allwaysAggregate = 1; - // MINRF.option.ignoreBogusBattery = 1; // from advertisements - MINRF.option.noSummary = 0; - MINRF.option.minimalSummary = 0; - MINRF.option.directBridgeMode = 0; + MINRF.option.allwaysAggregate = 1; + // MINRF.option.ignoreBogusBattery = 1; // from advertisements + MINRF.option.noSummary = 0; + MINRF.option.minimalSummary = 0; + MINRF.option.directBridgeMode = 0; + + AddLog_P(LOG_LEVEL_INFO, PSTR("NRF: Started")); + } } /********************************************************************************************/ @@ -431,7 +435,7 @@ void MINRFinit(void){ bool MINRFinitBLE(uint8_t _mode) { if (MINRF.timer%1000 == 0){ // only re-init every 20 seconds - NRF24radio.begin(Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC)); + NRF24radio.begin(Pin(GPIO_NRF24_CS),Pin(GPIO_NRF24_DC)); NRF24radio.setAutoAck(false); NRF24radio.setDataRate(RF24_1MBPS); NRF24radio.disableCRC(); @@ -1958,7 +1962,6 @@ bool Xsns61(uint8_t function) switch (function) { case FUNC_INIT: MINRFinit(); - AddLog_P(LOG_LEVEL_INFO,PSTR("NRF: started")); break; case FUNC_EVERY_50_MSECOND: MINRF_EVERY_50_MSECOND(); diff --git a/tasmota/xsns_80_mfrc522.ino b/tasmota/xsns_80_mfrc522.ino index 899c77909..b62c1140f 100644 --- a/tasmota/xsns_80_mfrc522.ino +++ b/tasmota/xsns_80_mfrc522.ino @@ -98,7 +98,7 @@ void RC522ScanForTag(void) { } void RC522Init(void) { - if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST)) { + if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST) && TasmotaGlobal.spi_enabled) { Mfrc522 = new MFRC522(Pin(GPIO_RC522_CS), Pin(GPIO_RC522_RST)); SPI.begin(); Mfrc522->PCD_Init(); From 9c9d7e0eef35f786fab67cdfaf188c18c5949495 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 31 Dec 2020 16:41:58 +0100 Subject: [PATCH 054/255] spiffs --- tasmota/xdrv_98_filesystem.ino | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 5ea685109..3615ebbaa 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -105,7 +105,7 @@ void UFSInit(void) { #else ufsp = &SD; #endif - ufs_type = 1; + ufs_type = UFS_TSDC; return; } } @@ -119,10 +119,17 @@ void UFSInit(void) { #else ufsp = &FFat; if (!FFat.begin(true)) { + if (!SPIFFS.begin(true)) { + return; + } + ufsp = &SPIFFS; + ufs_type = UFS_TSPIFFS; return; } + + #endif - ufs_type = 2; + ufs_type = UFS_TFAT; return; } @@ -159,9 +166,14 @@ uint32_t result = 0; #endif break; case UFS_TSPIFFS: + if (sel == 0) { + result = SPIFFS.totalBytes(); + } else { + result = SPIFFS.totalBytes() - SPIFFS.usedBytes(); + } break; } - return result / 10000; + return result / 1000; } #if USE_LONG_FILE_NAMES>0 @@ -373,6 +385,10 @@ uint8_t UFS_DownloadFile(char *file) { File download_file; WiFiClient download_Client; + AddLog_P(LOG_LEVEL_INFO, PSTR("file not found %s"),file); + + if (*file == '/') file++; + if (!ufsp->exists(file)) { AddLog_P(LOG_LEVEL_INFO, PSTR("file not found")); return 0; From 0de64f33761b075cfd93c45d8b364375bb8350dd Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 31 Dec 2020 18:05:42 +0100 Subject: [PATCH 055/255] esp32 littlefs --- lib/libesp32/LITTLEFS/LICENSE | 339 ++ lib/libesp32/LITTLEFS/README.md | 104 + .../examples/LITTLEFS_PlatformIO/.gitignore | 4 + .../examples/LITTLEFS_PlatformIO/README.md | 68 + .../LITTLEFS_PlatformIO/data/file1.txt | 1 + .../data/testfolder/test2.txt | 1 + .../include/.placeholder.txt | 0 .../LITTLEFS_PlatformIO/lib/.placeholder.txt | 0 .../LITTLEFS_PlatformIO/littlefsbuilder.py | 2 + .../LITTLEFS_PlatformIO/partitions_custom.csv | 6 + .../LITTLEFS_PlatformIO/platformio.ini | 35 + .../examples/LITTLEFS_PlatformIO/src/main.cpp | 291 + .../examples/LITTLEFS_time/LITTLEFS_time.ino | 219 + .../examples/LittleFS_test/LittleFS_test.ino | 270 + lib/libesp32/LITTLEFS/library.json | 22 + lib/libesp32/LITTLEFS/library.properties | 9 + lib/libesp32/LITTLEFS/src/LICENSE | 7 + lib/libesp32/LITTLEFS/src/LICENSE.md | 24 + lib/libesp32/LITTLEFS/src/LITTLEFS.cpp | 105 + lib/libesp32/LITTLEFS/src/LITTLEFS.h | 38 + lib/libesp32/LITTLEFS/src/esp_littlefs.c | 1626 ++++++ lib/libesp32/LITTLEFS/src/esp_littlefs.h | 118 + lib/libesp32/LITTLEFS/src/lfs.c | 4918 +++++++++++++++++ lib/libesp32/LITTLEFS/src/lfs.h | 655 +++ lib/libesp32/LITTLEFS/src/lfs_util.c | 33 + lib/libesp32/LITTLEFS/src/lfs_util.h | 234 + lib/libesp32/LITTLEFS/src/littlefs_api.c | 58 + lib/libesp32/LITTLEFS/src/littlefs_api.h | 106 + tasmota/xdrv_98_filesystem.ino | 39 +- 29 files changed, 9320 insertions(+), 12 deletions(-) create mode 100755 lib/libesp32/LITTLEFS/LICENSE create mode 100755 lib/libesp32/LITTLEFS/README.md create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/.gitignore create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/README.md create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/file1.txt create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/littlefsbuilder.py create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/platformio.ini create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/src/main.cpp create mode 100755 lib/libesp32/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino create mode 100755 lib/libesp32/LITTLEFS/examples/LittleFS_test/LittleFS_test.ino create mode 100755 lib/libesp32/LITTLEFS/library.json create mode 100755 lib/libesp32/LITTLEFS/library.properties create mode 100755 lib/libesp32/LITTLEFS/src/LICENSE create mode 100755 lib/libesp32/LITTLEFS/src/LICENSE.md create mode 100755 lib/libesp32/LITTLEFS/src/LITTLEFS.cpp create mode 100755 lib/libesp32/LITTLEFS/src/LITTLEFS.h create mode 100755 lib/libesp32/LITTLEFS/src/esp_littlefs.c create mode 100755 lib/libesp32/LITTLEFS/src/esp_littlefs.h create mode 100755 lib/libesp32/LITTLEFS/src/lfs.c create mode 100755 lib/libesp32/LITTLEFS/src/lfs.h create mode 100755 lib/libesp32/LITTLEFS/src/lfs_util.c create mode 100755 lib/libesp32/LITTLEFS/src/lfs_util.h create mode 100755 lib/libesp32/LITTLEFS/src/littlefs_api.c create mode 100755 lib/libesp32/LITTLEFS/src/littlefs_api.h diff --git a/lib/libesp32/LITTLEFS/LICENSE b/lib/libesp32/LITTLEFS/LICENSE new file mode 100755 index 000000000..d159169d1 --- /dev/null +++ b/lib/libesp32/LITTLEFS/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/lib/libesp32/LITTLEFS/README.md b/lib/libesp32/LITTLEFS/README.md new file mode 100755 index 000000000..8c5cec1d6 --- /dev/null +++ b/lib/libesp32/LITTLEFS/README.md @@ -0,0 +1,104 @@ +# LittleFS_esp32 + +#### ***Notice: The Library is been integrated to [Arduino esp32 core idf-release/v4.2 branch](https://github.com/espressif/arduino-esp32/tree/idf-release/v4.2 ) for future major core release. On built-in library, #define tweaks below will be unavailable.*** + + +## LittleFS library for arduino-esp32 + +- A LittleFS wrapper for Arduino ESP32 of [littlefs-project](https://github.com/littlefs-project/littlefs) +- Based on [ESP-IDF port of joltwallet/esp_littlefs](https://github.com/joltwallet/esp_littlefs) , thank you Brian! +- As a reference, see [LillteFS library for ESP8266 core](https://github.com/esp8266/Arduino/tree/master/libraries/LittleFS) +- [PR](https://github.com/espressif/arduino-esp32/pull/4096) and [merge](https://github.com/espressif/arduino-esp32/pull/4483) at esp32 core development +- [PR](https://github.com/espressif/esp-idf/pull/5469) at esp-idf development +- The functionality is similar to SPIFFS + +### Installation + +- Use **Arduino Library Manager** +- Or download / use **git** to have latest repository of **LITTLEFS** added to Arduino IDE **/libraries** folder +(File > Preferences > Sketchbook location). +- See ``` #define CONFIG_LITTLEFS_FOR_IDF_3_2 ``` in **esp_littlefs.c**. +Now it is defined / undefined automatically by detecting the IDF version and core version. +When defined, the library works with old and new IDFs 3.2 - 4.x but file timestamp feature is removed. +See LITTLEFS_time example. +- See ``` #define CONFIG_LITTLEFS_SPIFFS_COMPAT ``` in **esp_littlefs.c**. +When set to 1, folders are recursively created or deleted if empty on creating/deleting a new file like SPIFFS. Default is 0. +- The other ``` #define CONFIG_LITTLEFS_xxxxx ``` are set to optimal default values. +Read [here](https://github.com/joltwallet/esp_littlefs/blob/master/Kconfig) and [here](https://github.com/littlefs-project//littlefs/blob/master/README.md) if you want to modify. +- For low-level default error reporting modifications, see the defines at beginning of the **lfs.c** here. + +### Usage + +- Use LITTLEFS [with identical methods as SPIFFS](https://diyprojects.io/esp32-get-started-spiff-library-read-write-modify-files/) plus mkdir() and rmdir() +- A quick startup based on your existing code you can re-define SPIFFS +``` +#define USE_LittleFS + +#include +#ifdef USE_LittleFS + #define SPIFFS LITTLEFS + #include +#else + #include +#endif + ``` + - Note, this may not work if your sketch uses other libraries that use SPIFFS themselves. + - See also [esp_partition.h](https://github.com/espressif/esp-idf/blob/master/components/spi_flash/include/esp_partition.h) . LITTLEFS re-uses same type and subtype as SPIFFS + +### Differences with SPIFFS + +- LittleFS has folders, you need to iterate files in folders unless you set ``` #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 ``` +- At root a "/folder" = "folder" +- Requires a label for mount point, NULL will not work. Recommended is to use default LITTLEFS.begin() +- maxOpenFiles parameter is unused, kept for compatibility +- LITTLEFS.mkdir(path) and LITTLEFS.rmdir(path) are available +- file.seek() behaves like on FFat see [more details](https://github.com/lorol/LITTLEFS/issues/11) +- file.write() and file.print() when partition space is ending may return different than really written bytes (on other FS is also inconsistent). +- Speed comparison based on **LittleFS_test.ino** sketch (for a file 1048576 bytes): + +|Filesystem|Read time [ms]|Write time [ms]| +|----|----|----| +|FAT|276|14493| +|LITTLEFS|446*|16387| +|SPIFFS|767|65622| + +*The read speed improved by changing ```#define CONFIG_LITTLEFS_CACHE_SIZE``` from 128 to 512 + + +### Arduino ESP32 LittleFS filesystem upload tool + +- Use (replace if exists) [arduino-esp32fs-plugin](https://github.com/me-no-dev/arduino-esp32fs-plugin/pull/23 ) with [this variant](https://github.com/lorol/arduino-esp32fs-plugin), which supports SPIFFS, LittleFS and FatFS +- Requires [mklittlefs executable](https://github.com/earlephilhower/mklittlefs) which is available [in releases section here](https://github.com/lorol/arduino-esp32fs-plugin ) or download the zipped binary [here](https://github.com/earlephilhower/mklittlefs/releases) or from **esp-quick-toolchain** releases [here](https://github.com/earlephilhower/esp-quick-toolchain/releases) +- Copy it to **/tools** folder of esp32 platform where **espota** and **esptool** (.py or.exe) tools are located +- Restart Arduino IDE. + +### PlatformIO + +- See [LITTLEFS_PlatformIO example here](https://github.com/lorol/LITTLEFS/tree/master/examples/LITTLEFS_PlatformIO) + ( based on notes below from [BlueAndi](https://github.com/BlueAndi) ) +- Add to _platformio.ini_: + `extra_scripts = replace_fs.py` + +- Add _replace_fs.py_ to project root directory (where platformio.ini is located): + + ```python + Import("env") + print("Replace MKSPIFFSTOOL with mklittlefs.exe") + env.Replace (MKSPIFFSTOOL = "mklittlefs.exe") + ``` + +- Add _mklittlefs.exe_ to project root directory as well. + +## Credits and license + +- This work is based on [littlefs-project](https://github.com/littlefs-project/littlefs) , [ESP-IDF port of joltwallet/esp_littlefs](https://github.com/joltwallet/esp_littlefs) , [Espressif Arduino core for the ESP32, the ESP-IDF - SPIFFS Library](https://github.com/espressif/arduino-esp32/tree/master/libraries/SPIFFS) +- Licensed under GPL v2 ([text](LICENSE)) + +## To Do + - [x] Submit to be added to Arduino Library Manager + - [x] Optional drop-in compatibility with SPIFFS' lack of folders, similar to esp8266' way - implemented as a choice by a #define + - [recursive folders auto creation](https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.cpp#L60) when a new file is created at non-existing path + - [recursive folders auto deletion](https://github.com/esp8266/Arduino/blob/master/libraries/LittleFS/src/LittleFS.h#L149) on "last file" deletion (SPIFFS cannot have "folder w/o file") + - review other differences: opendir(), rmdir(), unlink() + - [ ] Retire this library when released by esp32 Arduino core + - [ ] Cleanup examples diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/.gitignore b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/.gitignore new file mode 100755 index 000000000..87515a624 --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/.gitignore @@ -0,0 +1,4 @@ +.pio +.vscode +mklittlefs.exe +mklittlefs \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/README.md b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/README.md new file mode 100755 index 000000000..773445b6d --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/README.md @@ -0,0 +1,68 @@ +# How to run on PlatformIO IDE + +- Download and extract to this project root a **mklittlefs** executable for your OS [from a zipped binary here](https://github.com/earlephilhower/mklittlefs/releases) +- Open **LITTLEFS_PlatformIO** folder +- Run PlatformIO project task: **Upload Filesystem Image** +- Run PlatformIO project task: **Upload and Monitor** +- You will see a Serial output like: +``` +--- Miniterm on COM5 115200,8,N,1 --- +--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H --- +ets Jun 8 2016 00:22:57 + +rst:0x1 (POWERON_RESET),boot:0x13 (Snfigsip: 0, SPIWP:0xee +clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 +mode:DIO, clock div:2 +load:0x3fff0018,len:4 +load:0x3fff001c,len:1044 +load:0x40078000,len:10044 +load:0x40080400,len:5872 +entry 0x400806ac +Listing directory: / + FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 + DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 +Creating Dir: /mydir +Dir created +Writing file: /mydir/hello2.txt +- file written +Listing directory: / + FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 + DIR : /mydir LAST WRITE: 1970-01-01 00:00:00 +Listing directory: /mydir + FILE: /mydir/hello2.txt SIZE: 6 LAST WRITE: 1970-01-01 00:00:00 + DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 +Listing directory: /testfolder + FILE: /testfolder/test2.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 +Deleting file: /mydir/hello2.txt +- file deleted +Removing Dir: /mydir +Dir removed +Listing directory: / + FILE: /file1.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 + DIR : /testfolder LAST WRITE: 2020-10-06 15:10:33 +Listing directory: /testfolder + FILE: /testfolder/test2.txt SIZE: 3 LAST WRITE: 2020-10-06 15:10:33 +Writing file: /hello.txt +- file written +Appending to file: /hello.txt +- message appended +Reading file: /hello.txt +- read from file: +Hello World! +Renaming file /hello.txt to /foo.txt +- file renamed +Reading file: /foo.txt +- read from file: +Hello World! +Deleting file: /foo.txt +- file deleted +Testing file I/O with /test.txt +- writing................................................................ + - 1048576 bytes written in 12006 ms +- reading................................................................ +- 1048576 bytes read in 547 ms +Deleting file: /test.txt +- file deleted +Test complete +``` +- If you have a module with more than 4MB flash, you can uncomment **partitions_custom.csv** in **platformio.ini** and modify the csv file accordingly \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/file1.txt b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/file1.txt new file mode 100755 index 000000000..7c4a013e5 --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/file1.txt @@ -0,0 +1 @@ +aaa \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt new file mode 100755 index 000000000..01f02e32c --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/data/testfolder/test2.txt @@ -0,0 +1 @@ +bbb \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/include/.placeholder.txt new file mode 100755 index 000000000..e69de29bb diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/lib/.placeholder.txt new file mode 100755 index 000000000..e69de29bb diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/littlefsbuilder.py b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/littlefsbuilder.py new file mode 100755 index 000000000..93937e296 --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/littlefsbuilder.py @@ -0,0 +1,2 @@ +Import("env") +env.Replace( MKSPIFFSTOOL=env.get("PROJECT_DIR") + '/mklittlefs' ) \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv new file mode 100755 index 000000000..97846fa59 --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/partitions_custom.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +ota_0, app, ota_0, 0x10000, 0x1A0000, +ota_1, app, ota_1, , 0x1A0000, +otadata, data, ota, 0x350000, 0x2000, +nvs, data, nvs, , 0x6000, +data, data, spiffs, , 0xA8000, diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/platformio.ini b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/platformio.ini new file mode 100755 index 000000000..43e34ec0d --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/platformio.ini @@ -0,0 +1,35 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = esp32 + +[env] +framework = arduino + +[env:esp32] +platform = espressif32 +;platform = https://github.com/platformio/platform-espressif32.git +;board_build.mcu = esp32 +platform_packages = framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git + +build_flags = + ${env.build_flags} + -D=${PIOENV} + ;-D CONFIG_LITTLEFS_FOR_IDF_3_2 + +lib_deps = https://github.com/lorol/LITTLEFS.git + +board = esp32dev +;board_build.partitions = partitions_custom.csv +monitor_filters = esp32_exception_decoder +monitor_speed = 115200 + +extra_scripts = ./littlefsbuilder.py diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/src/main.cpp b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/src/main.cpp new file mode 100755 index 000000000..786f04380 --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_PlatformIO/src/main.cpp @@ -0,0 +1,291 @@ +#include +#include "FS.h" +#include + +#ifndef CONFIG_LITTLEFS_FOR_IDF_3_2 + #include +#endif + +/* You only need to format LITTLEFS the first time you run a + test or else use the LITTLEFS plugin to create a partition + https://github.com/lorol/arduino-esp32littlefs-plugin */ + +#define FORMAT_LITTLEFS_IF_FAILED true + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\r\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("- failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println(" - not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + +#ifdef CONFIG_LITTLEFS_FOR_IDF_3_2 + Serial.println(file.name()); +#else + Serial.print(file.name()); + time_t t= file.getLastWrite(); + struct tm * tmstruct = localtime(&t); + Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); +#endif + + if(levels){ + listDir(fs, file.name(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + +#ifdef CONFIG_LITTLEFS_FOR_IDF_3_2 + Serial.println(file.size()); +#else + Serial.print(file.size()); + time_t t= file.getLastWrite(); + struct tm * tmstruct = localtime(&t); + Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); +#endif + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\r\n", path); + + File file = fs.open(path); + if(!file || file.isDirectory()){ + Serial.println("- failed to open file for reading"); + return; + } + + Serial.println("- read from file:"); + while(file.available()){ + Serial.write(file.read()); + } + file.close(); +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\r\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("- file written"); + } else { + Serial.println("- write failed"); + } + file.close(); +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\r\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("- failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("- message appended"); + } else { + Serial.println("- append failed"); + } + file.close(); +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\r\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("- file renamed"); + } else { + Serial.println("- rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\r\n", path); + if(fs.remove(path)){ + Serial.println("- file deleted"); + } else { + Serial.println("- delete failed"); + } +} + +// SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 + +void writeFile2(fs::FS &fs, const char * path, const char * message){ + if(!fs.exists(path)){ + if (strchr(path, '/')) { + Serial.printf("Create missing folders of: %s\r\n", path); + char *pathStr = strdup(path); + if (pathStr) { + char *ptr = strchr(pathStr, '/'); + while (ptr) { + *ptr = 0; + fs.mkdir(pathStr); + *ptr = '/'; + ptr = strchr(ptr+1, '/'); + } + } + free(pathStr); + } + } + + Serial.printf("Writing file to: %s\r\n", path); + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("- file written"); + } else { + Serial.println("- write failed"); + } + file.close(); +} + +void deleteFile2(fs::FS &fs, const char * path){ + Serial.printf("Deleting file and empty folders on path: %s\r\n", path); + + if(fs.remove(path)){ + Serial.println("- file deleted"); + } else { + Serial.println("- delete failed"); + } + + char *pathStr = strdup(path); + if (pathStr) { + char *ptr = strrchr(pathStr, '/'); + if (ptr) { + Serial.printf("Removing all empty folders on path: %s\r\n", path); + } + while (ptr) { + *ptr = 0; + fs.rmdir(pathStr); + ptr = strrchr(pathStr, '/'); + } + free(pathStr); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + Serial.printf("Testing file I/O with %s\r\n", path); + + static uint8_t buf[512]; + size_t len = 0; + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + + size_t i; + Serial.print("- writing" ); + uint32_t start = millis(); + for(i=0; i<2048; i++){ + if ((i & 0x001F) == 0x001F){ + Serial.print("."); + } + file.write(buf, 512); + } + Serial.println(""); + uint32_t end = millis() - start; + Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end); + file.close(); + + file = fs.open(path); + start = millis(); + end = start; + i = 0; + if(file && !file.isDirectory()){ + len = file.size(); + size_t flen = len; + start = millis(); + Serial.print("- reading" ); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + if ((i++ & 0x001F) == 0x001F){ + Serial.print("."); + } + len -= toRead; + } + Serial.println(""); + end = millis() - start; + Serial.printf("- %u bytes read in %u ms\r\n", flen, end); + file.close(); + } else { + Serial.println("- failed to open file for reading"); + } +} + +void setup(){ + Serial.begin(115200); + if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)){ + Serial.println("LITTLEFS Mount Failed"); + return; + } + + listDir(LITTLEFS, "/", 0); + createDir(LITTLEFS, "/mydir"); + writeFile(LITTLEFS, "/mydir/hello2.txt", "Hello2"); + //writeFile(LITTLEFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3"); + writeFile2(LITTLEFS, "/mydir/newdir2/newdir3/hello3.txt", "Hello3"); + listDir(LITTLEFS, "/", 3); + deleteFile(LITTLEFS, "/mydir/hello2.txt"); + //deleteFile(LITTLEFS, "/mydir/newdir2/newdir3/hello3.txt"); + deleteFile2(LITTLEFS, "/mydir/newdir2/newdir3/hello3.txt"); + removeDir(LITTLEFS, "/mydir"); + listDir(LITTLEFS, "/", 3); + writeFile(LITTLEFS, "/hello.txt", "Hello "); + appendFile(LITTLEFS, "/hello.txt", "World!\r\n"); + readFile(LITTLEFS, "/hello.txt"); + renameFile(LITTLEFS, "/hello.txt", "/foo.txt"); + readFile(LITTLEFS, "/foo.txt"); + deleteFile(LITTLEFS, "/foo.txt"); + testFileIO(LITTLEFS, "/test.txt"); + deleteFile(LITTLEFS, "/test.txt"); + + Serial.println( "Test complete" ); +} + +void loop(){ + +} diff --git a/lib/libesp32/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino b/lib/libesp32/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino new file mode 100755 index 000000000..933cd4f3b --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino @@ -0,0 +1,219 @@ +#include "FS.h" +//#include "SPIFFS.h" +#include "LITTLEFS.h" +#include +#include + +#define SPIFFS LITTLEFS + +/* This examples uses "quick re-define" of SPIFFS to run + an existing sketch with LITTLEFS instead of SPIFFS + + To get time/date stamps by file.getLastWrite(), you need an + esp32 core on IDF 3.3 and comment a line in file esp_littlefs.c: + + //#define CONFIG_LITTLEFS_FOR_IDF_3_2 + + You only need to format LITTLEFS the first time you run a + test or else use the LITTLEFS plugin to create a partition + https://github.com/lorol/arduino-esp32littlefs-plugin */ + +#define FORMAT_LITTLEFS_IF_FAILED true + +const char* ssid = "yourssid"; +const char* password = "yourpass"; + +long timezone = 1; +byte daysavetime = 1; + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("Failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println("Not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.print (file.name()); + time_t t= file.getLastWrite(); + struct tm * tmstruct = localtime(&t); + Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); + if(levels){ + listDir(fs, file.name(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print(" SIZE: "); + Serial.print(file.size()); + time_t t= file.getLastWrite(); + struct tm * tmstruct = localtime(&t); + Serial.printf(" LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\n", path); + + File file = fs.open(path); + if(!file){ + Serial.println("Failed to open file for reading"); + return; + } + + Serial.print("Read from file: "); + while(file.available()){ + Serial.write(file.read()); + } + file.close(); +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("Failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("File written"); + } else { + Serial.println("Write failed"); + } + file.close(); +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("Failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("Message appended"); + } else { + Serial.println("Append failed"); + } + file.close(); +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("File renamed"); + } else { + Serial.println("Rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\n", path); + if(fs.remove(path)){ + Serial.println("File deleted"); + } else { + Serial.println("Delete failed"); + } +} + +void setup(){ + Serial.begin(115200); + // We start by connecting to a WiFi network + Serial.println(); + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println("WiFi connected"); + Serial.println("IP address: "); + Serial.println(WiFi.localIP()); + Serial.println("Contacting Time Server"); + configTime(3600*timezone, daysavetime*3600, "time.nist.gov", "0.pool.ntp.org", "1.pool.ntp.org"); + struct tm tmstruct ; + delay(2000); + tmstruct.tm_year = 0; + getLocalTime(&tmstruct, 5000); + Serial.printf("\nNow is : %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct.tm_year)+1900,( tmstruct.tm_mon)+1, tmstruct.tm_mday,tmstruct.tm_hour , tmstruct.tm_min, tmstruct.tm_sec); + Serial.println(""); + + if(!SPIFFS.begin(FORMAT_LITTLEFS_IF_FAILED)){ + Serial.println("LITTLEFS Mount Failed"); + return; + } + + Serial.println("----list 1----"); + listDir(SPIFFS, "/", 1); + + Serial.println("----remove old dir----"); + removeDir(SPIFFS, "/mydir"); + + Serial.println("----create a new dir----"); + createDir(SPIFFS, "/mydir"); + + Serial.println("----remove the new dir----"); + removeDir(SPIFFS, "/mydir"); + + Serial.println("----create the new again----"); + createDir(SPIFFS, "/mydir"); + + Serial.println("----create and work with file----"); + writeFile(SPIFFS, "/mydir/hello.txt", "Hello "); + appendFile(SPIFFS, "/mydir/hello.txt", "World!\n"); + + Serial.println("----list 2----"); + listDir(SPIFFS, "/", 1); + + Serial.println("----attempt to remove dir w/ file----"); + removeDir(SPIFFS, "/mydir"); + + Serial.println("----remove dir after deleting file----"); + deleteFile(SPIFFS, "/mydir/hello.txt"); + removeDir(SPIFFS, "/mydir"); + + Serial.println("----list 3----"); + listDir(SPIFFS, "/", 1); + + Serial.println( "Test complete" ); + +} + +void loop(){ + +} diff --git a/lib/libesp32/LITTLEFS/examples/LittleFS_test/LittleFS_test.ino b/lib/libesp32/LITTLEFS/examples/LittleFS_test/LittleFS_test.ino new file mode 100755 index 000000000..3abb8908e --- /dev/null +++ b/lib/libesp32/LITTLEFS/examples/LittleFS_test/LittleFS_test.ino @@ -0,0 +1,270 @@ +#include +#include "FS.h" +#include + +/* You only need to format LITTLEFS the first time you run a + test or else use the LITTLEFS plugin to create a partition + https://github.com/lorol/arduino-esp32littlefs-plugin */ + +#define FORMAT_LITTLEFS_IF_FAILED true + +void listDir(fs::FS &fs, const char * dirname, uint8_t levels){ + Serial.printf("Listing directory: %s\r\n", dirname); + + File root = fs.open(dirname); + if(!root){ + Serial.println("- failed to open directory"); + return; + } + if(!root.isDirectory()){ + Serial.println(" - not a directory"); + return; + } + + File file = root.openNextFile(); + while(file){ + if(file.isDirectory()){ + Serial.print(" DIR : "); + Serial.println(file.name()); + if(levels){ + listDir(fs, file.name(), levels -1); + } + } else { + Serial.print(" FILE: "); + Serial.print(file.name()); + Serial.print("\tSIZE: "); + Serial.println(file.size()); + } + file = root.openNextFile(); + } +} + +void createDir(fs::FS &fs, const char * path){ + Serial.printf("Creating Dir: %s\n", path); + if(fs.mkdir(path)){ + Serial.println("Dir created"); + } else { + Serial.println("mkdir failed"); + } +} + +void removeDir(fs::FS &fs, const char * path){ + Serial.printf("Removing Dir: %s\n", path); + if(fs.rmdir(path)){ + Serial.println("Dir removed"); + } else { + Serial.println("rmdir failed"); + } +} + +void readFile(fs::FS &fs, const char * path){ + Serial.printf("Reading file: %s\r\n", path); + + File file = fs.open(path); + if(!file || file.isDirectory()){ + Serial.println("- failed to open file for reading"); + return; + } + + Serial.println("- read from file:"); + while(file.available()){ + Serial.write(file.read()); + } + file.close(); +} + +void writeFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Writing file: %s\r\n", path); + + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("- file written"); + } else { + Serial.println("- write failed"); + } + file.close(); +} + +void appendFile(fs::FS &fs, const char * path, const char * message){ + Serial.printf("Appending to file: %s\r\n", path); + + File file = fs.open(path, FILE_APPEND); + if(!file){ + Serial.println("- failed to open file for appending"); + return; + } + if(file.print(message)){ + Serial.println("- message appended"); + } else { + Serial.println("- append failed"); + } + file.close(); +} + +void renameFile(fs::FS &fs, const char * path1, const char * path2){ + Serial.printf("Renaming file %s to %s\r\n", path1, path2); + if (fs.rename(path1, path2)) { + Serial.println("- file renamed"); + } else { + Serial.println("- rename failed"); + } +} + +void deleteFile(fs::FS &fs, const char * path){ + Serial.printf("Deleting file: %s\r\n", path); + if(fs.remove(path)){ + Serial.println("- file deleted"); + } else { + Serial.println("- delete failed"); + } +} + +// SPIFFS-like write and delete file, better use #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 + +void writeFile2(fs::FS &fs, const char * path, const char * message){ + if(!fs.exists(path)){ + if (strchr(path, '/')) { + Serial.printf("Create missing folders of: %s\r\n", path); + char *pathStr = strdup(path); + if (pathStr) { + char *ptr = strchr(pathStr, '/'); + while (ptr) { + *ptr = 0; + fs.mkdir(pathStr); + *ptr = '/'; + ptr = strchr(ptr+1, '/'); + } + } + free(pathStr); + } + } + + Serial.printf("Writing file to: %s\r\n", path); + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + if(file.print(message)){ + Serial.println("- file written"); + } else { + Serial.println("- write failed"); + } + file.close(); +} + +void deleteFile2(fs::FS &fs, const char * path){ + Serial.printf("Deleting file and empty folders on path: %s\r\n", path); + + if(fs.remove(path)){ + Serial.println("- file deleted"); + } else { + Serial.println("- delete failed"); + } + + char *pathStr = strdup(path); + if (pathStr) { + char *ptr = strrchr(pathStr, '/'); + if (ptr) { + Serial.printf("Removing all empty folders on path: %s\r\n", path); + } + while (ptr) { + *ptr = 0; + fs.rmdir(pathStr); + ptr = strrchr(pathStr, '/'); + } + free(pathStr); + } +} + +void testFileIO(fs::FS &fs, const char * path){ + Serial.printf("Testing file I/O with %s\r\n", path); + + static uint8_t buf[512]; + size_t len = 0; + File file = fs.open(path, FILE_WRITE); + if(!file){ + Serial.println("- failed to open file for writing"); + return; + } + + size_t i; + Serial.print("- writing" ); + uint32_t start = millis(); + for(i=0; i<2048; i++){ + if ((i & 0x001F) == 0x001F){ + Serial.print("."); + } + file.write(buf, 512); + } + Serial.println(""); + uint32_t end = millis() - start; + Serial.printf(" - %u bytes written in %u ms\r\n", 2048 * 512, end); + file.close(); + + file = fs.open(path); + start = millis(); + end = start; + i = 0; + if(file && !file.isDirectory()){ + len = file.size(); + size_t flen = len; + start = millis(); + Serial.print("- reading" ); + while(len){ + size_t toRead = len; + if(toRead > 512){ + toRead = 512; + } + file.read(buf, toRead); + if ((i++ & 0x001F) == 0x001F){ + Serial.print("."); + } + len -= toRead; + } + Serial.println(""); + end = millis() - start; + Serial.printf("- %u bytes read in %u ms\r\n", flen, end); + file.close(); + } else { + Serial.println("- failed to open file for reading"); + } +} + +void setup(){ + Serial.begin(115200); + if(!LITTLEFS.begin(FORMAT_LITTLEFS_IF_FAILED)){ + Serial.println("LITTLEFS Mount Failed"); + return; + } + Serial.println( "SPIFFS-like write file to new path and delete it w/folders" ); + writeFile2(LITTLEFS, "/new1/new2/new3/hello3.txt", "Hello3"); + listDir(LITTLEFS, "/", 3); + deleteFile2(LITTLEFS, "/new1/new2/new3/hello3.txt"); + + listDir(LITTLEFS, "/", 3); + createDir(LITTLEFS, "/mydir"); + writeFile(LITTLEFS, "/mydir/hello2.txt", "Hello2"); + listDir(LITTLEFS, "/", 1); + deleteFile(LITTLEFS, "/mydir/hello2.txt"); + removeDir(LITTLEFS, "/mydir"); + listDir(LITTLEFS, "/", 1); + writeFile(LITTLEFS, "/hello.txt", "Hello "); + appendFile(LITTLEFS, "/hello.txt", "World!\r\n"); + readFile(LITTLEFS, "/hello.txt"); + renameFile(LITTLEFS, "/hello.txt", "/foo.txt"); + readFile(LITTLEFS, "/foo.txt"); + deleteFile(LITTLEFS, "/foo.txt"); + testFileIO(LITTLEFS, "/test.txt"); + deleteFile(LITTLEFS, "/test.txt"); + + Serial.println( "Test complete" ); +} + +void loop(){ + +} diff --git a/lib/libesp32/LITTLEFS/library.json b/lib/libesp32/LITTLEFS/library.json new file mode 100755 index 000000000..8c5f76fc2 --- /dev/null +++ b/lib/libesp32/LITTLEFS/library.json @@ -0,0 +1,22 @@ +{ + "name":"LittleFS_esp32", + "description":"LittleFS for esp32", + "keywords":"littlefs, spiffs", + "authors": + { + "name": "lorol", + "maintainer": true + }, + "repository": + { + "type": "git", + "url": "https://github.com/lorol/LITTLEFS.git" + }, + "version": "1.0.5", + "license": "LGPL-2.0", + "frameworks": "arduino", + "platforms": "espressif32", + "build": { + "libCompatMode": 2 + } +} \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/library.properties b/lib/libesp32/LITTLEFS/library.properties new file mode 100755 index 000000000..262590f63 --- /dev/null +++ b/lib/libesp32/LITTLEFS/library.properties @@ -0,0 +1,9 @@ +name=LittleFS_esp32 +version=1.0.5 +author=lorol +maintainer=lorol +sentence=LittleFS for esp32 based on esp_littlefs IDF component. Use esp32 core-provided LITTLEFS library instead of this one when available in future core releases. +paragraph= For esp32 core 1.0.4 release, use #define CONFIG_LITTLEFS_FOR_IDF_3_2 and for more SPIFFS compatibility, set #define CONFIG_LITTLEFS_SPIFFS_COMPAT 1 +category=Data Storage +url=https://github.com/lorol/LITTLEFS +architectures=esp32 \ No newline at end of file diff --git a/lib/libesp32/LITTLEFS/src/LICENSE b/lib/libesp32/LITTLEFS/src/LICENSE new file mode 100755 index 000000000..54a9f1e0e --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/LICENSE @@ -0,0 +1,7 @@ +Copyright 2020 Brian Pugh + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/lib/libesp32/LITTLEFS/src/LICENSE.md b/lib/libesp32/LITTLEFS/src/LICENSE.md new file mode 100755 index 000000000..ed69bea47 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/LICENSE.md @@ -0,0 +1,24 @@ +Copyright (c) 2017, Arm Limited. All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. +- Neither the name of ARM nor the names of its contributors may be used to + endorse or promote products derived from this software without specific prior + written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/libesp32/LITTLEFS/src/LITTLEFS.cpp b/lib/libesp32/LITTLEFS/src/LITTLEFS.cpp new file mode 100755 index 000000000..a188d65f0 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/LITTLEFS.cpp @@ -0,0 +1,105 @@ +// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +static constexpr const char LFS_NAME[] = "spiffs"; + +#include "vfs_api.h" + +extern "C" { +#include +#include +#include +#include "esp_littlefs.h" +} + +#include "LITTLEFS.h" + +using namespace fs; + +LITTLEFSFS::LITTLEFSFS() : FS(FSImplPtr(new VFSImpl())) +{ + +} + +bool LITTLEFSFS::begin(bool formatOnFail, const char * basePath, uint8_t maxOpenFiles) +{ + if(esp_littlefs_mounted(LFS_NAME)){ + log_w("LITTLEFS Already Mounted!"); + return true; + } + + esp_vfs_littlefs_conf_t conf = { + .base_path = basePath, + .partition_label = LFS_NAME, + .format_if_mount_failed = false + }; + + esp_err_t err = esp_vfs_littlefs_register(&conf); + if(err == ESP_FAIL && formatOnFail){ + if(format()){ + err = esp_vfs_littlefs_register(&conf); + } + } + if(err != ESP_OK){ + log_e("Mounting LITTLEFS failed! Error: %d", err); + return false; + } + _impl->mountpoint(basePath); + return true; +} + +void LITTLEFSFS::end() +{ + if(esp_littlefs_mounted(LFS_NAME)){ + esp_err_t err = esp_vfs_littlefs_unregister(LFS_NAME); + if(err){ + log_e("Unmounting LITTLEFS failed! Error: %d", err); + return; + } + _impl->mountpoint(NULL); + } +} + +bool LITTLEFSFS::format() +{ + disableCore0WDT(); + esp_err_t err = esp_littlefs_format(LFS_NAME); + enableCore0WDT(); + if(err){ + log_e("Formatting LITTLEFS failed! Error: %d", err); + return false; + } + return true; +} + +size_t LITTLEFSFS::totalBytes() +{ + size_t total,used; + if(esp_littlefs_info(LFS_NAME, &total, &used)){ + return 0; + } + return total; +} + +size_t LITTLEFSFS::usedBytes() +{ + size_t total,used; + if(esp_littlefs_info(LFS_NAME, &total, &used)){ + return 0; + } + return used; +} + +LITTLEFSFS LITTLEFS; + diff --git a/lib/libesp32/LITTLEFS/src/LITTLEFS.h b/lib/libesp32/LITTLEFS/src/LITTLEFS.h new file mode 100755 index 000000000..fbd6f09e1 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/LITTLEFS.h @@ -0,0 +1,38 @@ +// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +#ifndef _LITTLEFS_H_ +#define _LITTLEFS_H_ + +#include "FS.h" + +namespace fs +{ + +class LITTLEFSFS : public FS +{ +public: + LITTLEFSFS(); + bool begin(bool formatOnFail=false, const char * basePath="/littlefs", uint8_t maxOpenFiles=5); + bool format(); + size_t totalBytes(); + size_t usedBytes(); + void end(); +}; + +} + +extern fs::LITTLEFSFS LITTLEFS; + + +#endif diff --git a/lib/libesp32/LITTLEFS/src/esp_littlefs.c b/lib/libesp32/LITTLEFS/src/esp_littlefs.c new file mode 100755 index 000000000..2b0c2e4cf --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/esp_littlefs.c @@ -0,0 +1,1626 @@ +/** + * @file esp_littlefs.c + * @brief Maps LittleFS <-> ESP_VFS + * @author Brian Pugh + * + * @note Modified and used by lorol for Arduino esp32 core + * + * Copyright 2020 Brian Pugh + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +//#define LOG_LOCAL_LEVEL 5 + +#if __has_include("esp_arduino_version.h") +#include "esp_arduino_version.h" +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2, 0, 0) +#warning("Use the built-in LITTLEFS library") +#endif +#else +//#warning("LITTLEFS: no esp_arduino_version.h file, likely 1.0.x") +#endif + +#if __has_include("esp_idf_version.h") +#include "esp_idf_version.h" +#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(3, 3, 0) +//#warning("IDF is 3.3 or later, LittleFS file timestamps are enabled") +#endif +#else +#define CONFIG_LITTLEFS_FOR_IDF_3_2 /* For old IDF 3.2 compatibility, core release 1.0.4 - no timestamps */ +//#warning("IDF < 3.3, no LittleFS file timestamps") +#endif + +//#define CONFIG_LITTLEFS_USE_ONLY_HASH +#define CONFIG_LITTLEFS_HUMAN_READABLE 0 /* Use 1 for verbose errors */ +#define CONFIG_LITTLEFS_SPIFFS_COMPAT 0 /* Use 1 for better drop-in replacement of SPIFFS */ +#define CONFIG_LITTLEFS_MAX_PARTITIONS 3 +#define CONFIG_LITTLEFS_PAGE_SIZE 256 +#define CONFIG_LITTLEFS_OBJ_NAME_LEN 64 +#define CONFIG_LITTLEFS_READ_SIZE 128 +#define CONFIG_LITTLEFS_WRITE_SIZE 128 +#define CONFIG_LITTLEFS_LOOKAHEAD_SIZE 128 +#define CONFIG_LITTLEFS_CACHE_SIZE 512 /* Old value was 128 */ +#define CONFIG_LITTLEFS_BLOCK_CYCLES 512 + +#ifdef CONFIG_LITTLEFS_FOR_IDF_3_2 + #define CONFIG_LITTLEFS_USE_MTIME 0 +#else + #define CONFIG_LITTLEFS_USE_MTIME 1 + #define CONFIG_LITTLEFS_MTIME_USE_SECONDS 1 +#endif + +#include "esp_log.h" +#include "esp_spi_flash.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include +#include +#include +#include +#include +#include + +#if __has_include("esp32/rom/spi_flash.h") +//#warning("LITTLEFS: IDF 4, spi_flash.h file location different from IDF 3") +#include "esp32/rom/spi_flash.h" +#else +//#warning("LITTLEFS: IDF 3") +#include "rom/spi_flash.h" +#endif + +#include "esp_system.h" + +#include "esp_littlefs.h" +#include "littlefs_api.h" + + +static const char TAG[] = "esp_littlefs"; + +#define CONFIG_LITTLEFS_BLOCK_SIZE 4096 /* ESP32 can only operate at 4kb */ + +/* File Descriptor Caching Params */ +#define CONFIG_LITTLEFS_FD_CACHE_REALLOC_FACTOR 2 /* Amount to resize FD cache by */ +#define CONFIG_LITTLEFS_FD_CACHE_MIN_SIZE 4 /* Minimum size of FD cache */ +#define CONFIG_LITTLEFS_FD_CACHE_HYST 4 /* When shrinking, leave this many trailing FD slots available */ + +/** + * @brief littlefs DIR structure + */ +typedef struct { + DIR dir; /*!< VFS DIR struct */ + lfs_dir_t d; /*!< littlefs DIR struct */ + struct dirent e; /*!< Last open dirent */ + long offset; /*!< Offset of the current dirent */ + char *path; /*!< Requested directory name */ +} vfs_littlefs_dir_t; + +static int vfs_littlefs_open(void* ctx, const char * path, int flags, int mode); +static ssize_t vfs_littlefs_write(void* ctx, int fd, const void * data, size_t size); +static ssize_t vfs_littlefs_read(void* ctx, int fd, void * dst, size_t size); +static int vfs_littlefs_close(void* ctx, int fd); +static off_t vfs_littlefs_lseek(void* ctx, int fd, off_t offset, int mode); +static int vfs_littlefs_stat(void* ctx, const char * path, struct stat * st); +static int vfs_littlefs_unlink(void* ctx, const char *path); +static int vfs_littlefs_rename(void* ctx, const char *src, const char *dst); +static DIR* vfs_littlefs_opendir(void* ctx, const char* name); +static int vfs_littlefs_closedir(void* ctx, DIR* pdir); +static struct dirent* vfs_littlefs_readdir(void* ctx, DIR* pdir); +static int vfs_littlefs_readdir_r(void* ctx, DIR* pdir, + struct dirent* entry, struct dirent** out_dirent); +static long vfs_littlefs_telldir(void* ctx, DIR* pdir); +static void vfs_littlefs_seekdir(void* ctx, DIR* pdir, long offset); +static int vfs_littlefs_mkdir(void* ctx, const char* name, mode_t mode); +static int vfs_littlefs_rmdir(void* ctx, const char* name); +static int vfs_littlefs_fsync(void* ctx, int fd); + +static esp_err_t esp_littlefs_init(const esp_vfs_littlefs_conf_t* conf); +static esp_err_t esp_littlefs_erase_partition(const char *partition_label); +static esp_err_t esp_littlefs_by_label(const char* label, int * index); +static esp_err_t esp_littlefs_get_empty(int *index); +static void esp_littlefs_free(esp_littlefs_t ** efs); +static void esp_littlefs_dir_free(vfs_littlefs_dir_t *dir); +static int esp_littlefs_flags_conv(int m); +#if CONFIG_LITTLEFS_USE_MTIME +static int vfs_littlefs_utime(void *ctx, const char *path, const struct utimbuf *times); +static void vfs_littlefs_update_mtime(esp_littlefs_t *efs, const char *path); +static int vfs_littlefs_update_mtime_value(esp_littlefs_t *efs, const char *path, time_t t); +static time_t vfs_littlefs_get_mtime(esp_littlefs_t *efs, const char *path); +#endif + +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH +/* The only way in LittleFS to get info is via a path (lfs_stat), so it cannot + * be done if the path isn't stored. */ +static int vfs_littlefs_fstat(void* ctx, int fd, struct stat * st); +#endif + +#if CONFIG_LITTLEFS_SPIFFS_COMPAT +static void mkdirs(esp_littlefs_t * efs, const char *dir); +static void rmdirs(esp_littlefs_t * efs, const char *dir); +#endif // CONFIG_LITTLEFS_SPIFFS_COMPAT + +static int sem_take(esp_littlefs_t *efs); +static int sem_give(esp_littlefs_t *efs); + +static SemaphoreHandle_t _efs_lock = NULL; +static esp_littlefs_t * _efs[CONFIG_LITTLEFS_MAX_PARTITIONS] = { 0 }; + +/******************** + * Helper Functions * + ********************/ +void esp_littlefs_free_fds(esp_littlefs_t * efs) { + /* Need to free all files that were opened */ + while (efs->file) { + vfs_littlefs_file_t * next = efs->file->next; + free(efs->file); + efs->file = next; + } + free(efs->cache); + efs->cache = 0; + efs->cache_size = efs->fd_count = 0; +} + + +/******************** + * Public Functions * + ********************/ + +bool esp_littlefs_mounted(const char* partition_label) { + int index; + esp_err_t err; + + err = esp_littlefs_by_label(partition_label, &index); + if(err != ESP_OK) return false; + return _efs[index]->cache_size > 0; +} + +esp_err_t esp_littlefs_info(const char* partition_label, size_t *total_bytes, size_t *used_bytes){ + int index; + esp_err_t err; + esp_littlefs_t *efs = NULL; + + err = esp_littlefs_by_label(partition_label, &index); + if(err != ESP_OK) return false; + efs = _efs[index]; + + if(total_bytes) *total_bytes = efs->cfg.block_size * efs->cfg.block_count; + if(used_bytes) *used_bytes = efs->cfg.block_size * lfs_fs_size(efs->fs); + + return ESP_OK; +} + +esp_err_t esp_vfs_littlefs_register(const esp_vfs_littlefs_conf_t * conf) +{ + assert(conf->base_path); + const esp_vfs_t vfs = { + .flags = ESP_VFS_FLAG_CONTEXT_PTR, + .write_p = &vfs_littlefs_write, + .lseek_p = &vfs_littlefs_lseek, + .read_p = &vfs_littlefs_read, + .open_p = &vfs_littlefs_open, + .close_p = &vfs_littlefs_close, +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + .fstat_p = &vfs_littlefs_fstat, +#else + .fstat_p = NULL, /* Not supported */ +#endif + .stat_p = &vfs_littlefs_stat, + .link_p = NULL, /* Not Supported */ + .unlink_p = &vfs_littlefs_unlink, + .rename_p = &vfs_littlefs_rename, + .opendir_p = &vfs_littlefs_opendir, + .closedir_p = &vfs_littlefs_closedir, + .readdir_p = &vfs_littlefs_readdir, + .readdir_r_p = &vfs_littlefs_readdir_r, + .seekdir_p = &vfs_littlefs_seekdir, + .telldir_p = &vfs_littlefs_telldir, + .mkdir_p = &vfs_littlefs_mkdir, + .rmdir_p = &vfs_littlefs_rmdir, + .fsync_p = &vfs_littlefs_fsync, +#ifndef CONFIG_LITTLEFS_FOR_IDF_3_2 +#if CONFIG_LITTLEFS_USE_MTIME + .utime_p = &vfs_littlefs_utime, +#else + .utime_p = NULL, +#endif // CONFIG_LITTLEFS_USE_MTIME +#endif //CONFIG_LITTLEFS_FOR_IDF_3_2 + }; + + esp_err_t err = esp_littlefs_init(conf); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to initialize LittleFS"); + return err; + } + + int index; + if (esp_littlefs_by_label(conf->partition_label, &index) != ESP_OK) { + ESP_LOGE(TAG, "Unable to find partition \"%s\"", conf->partition_label); + return ESP_ERR_NOT_FOUND; + } + + strlcat(_efs[index]->base_path, conf->base_path, ESP_VFS_PATH_MAX + 1); + err = esp_vfs_register(conf->base_path, &vfs, _efs[index]); + if (err != ESP_OK) { + esp_littlefs_free(&_efs[index]); + ESP_LOGE(TAG, "Failed to register Littlefs to \"%s\"", conf->base_path); + return err; + } + + ESP_LOGV(TAG, "Successfully registered LittleFS to \"%s\"", conf->base_path); + return ESP_OK; +} + +esp_err_t esp_vfs_littlefs_unregister(const char* partition_label) +{ + assert(partition_label); + int index; + if (esp_littlefs_by_label(partition_label, &index) != ESP_OK) { + ESP_LOGE(TAG, "Partition was never registered."); + return ESP_ERR_INVALID_STATE; + } + ESP_LOGV(TAG, "Unregistering \"%s\"", partition_label); + esp_err_t err = esp_vfs_unregister(_efs[index]->base_path); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to unregister \"%s\"", partition_label); + return err; + } + esp_littlefs_free(&_efs[index]); + _efs[index] = NULL; + return ESP_OK; +} + +esp_err_t esp_littlefs_format(const char* partition_label) { + assert( partition_label ); + + bool was_mounted = false; + bool efs_free = false; + int index = -1; + esp_err_t err; + esp_littlefs_t *efs = NULL; + + ESP_LOGV(TAG, "Formatting \"%s\"", partition_label); + + /* Get a context */ + err = esp_littlefs_by_label(partition_label, &index); + + if( err != ESP_OK ){ + /* Create a tmp context */ + ESP_LOGV(TAG, "Temporarily creating EFS context."); + efs_free = true; + const esp_vfs_littlefs_conf_t conf = { + /* base_name not necessary for initializing */ + .dont_mount = true, + .partition_label = partition_label, + }; + err = esp_littlefs_init(&conf); /* Internally MIGHT call esp_littlefs_format */ + if( err != ESP_OK ) { + ESP_LOGE(TAG, "Failed to initialize to format."); + goto exit; + } + + err = esp_littlefs_by_label(partition_label, &index); + if ( err != ESP_OK) { + ESP_LOGE(TAG, "Error obtaining context."); + goto exit; + } + } + + efs = _efs[index]; + assert( efs ); + + /* Unmount if mounted */ + if(efs->cache_size > 0){ + int res; + ESP_LOGV(TAG, "Partition was mounted. Unmounting..."); + was_mounted = true; + res = lfs_unmount(efs->fs); + if(res != LFS_ERR_OK){ + ESP_LOGE(TAG, "Failed to unmount."); + return ESP_FAIL; + } + esp_littlefs_free_fds(efs); + } + + /* Erase and Format */ + { + int res; + ESP_LOGV(TAG, "Formatting filesystem"); + esp_littlefs_erase_partition(partition_label); + res = lfs_format(efs->fs, &efs->cfg); + if( res != LFS_ERR_OK ) { + ESP_LOGE(TAG, "Failed to format filesystem"); + return ESP_FAIL; + } + } + + /* Mount filesystem */ + if( was_mounted ) { + int res; + /* Remount the partition */ + ESP_LOGV(TAG, "Remounting formatted partition"); + res = lfs_mount(efs->fs, &efs->cfg); + if( res != LFS_ERR_OK ) { + ESP_LOGE(TAG, "Failed to re-mount filesystem"); + return ESP_FAIL; + } + efs->cache_size = CONFIG_LITTLEFS_FD_CACHE_MIN_SIZE; // Initial size of cache; will resize ondemand + efs->cache = calloc(sizeof(*efs->cache), efs->cache_size); + } + ESP_LOGV(TAG, "Format Success!"); + + err = ESP_OK; + +exit: + if(efs_free && index>=0) esp_littlefs_free(&_efs[index]); + return err; +} + +#if CONFIG_LITTLEFS_HUMAN_READABLE +/** + * @brief converts an enumerated lfs error into a string. + * @param lfs_error The littlefs error. + */ +const char * esp_littlefs_errno(enum lfs_error lfs_errno) { + switch(lfs_errno){ + case LFS_ERR_OK: return "LFS_ERR_OK"; + case LFS_ERR_IO: return "LFS_ERR_IO"; + case LFS_ERR_CORRUPT: return "LFS_ERR_CORRUPT"; + case LFS_ERR_NOENT: return "LFS_ERR_NOENT"; + case LFS_ERR_EXIST: return "LFS_ERR_EXIST"; + case LFS_ERR_NOTDIR: return "LFS_ERR_NOTDIR"; + case LFS_ERR_ISDIR: return "LFS_ERR_ISDIR"; + case LFS_ERR_NOTEMPTY: return "LFS_ERR_NOTEMPTY"; + case LFS_ERR_BADF: return "LFS_ERR_BADF"; + case LFS_ERR_FBIG: return "LFS_ERR_FBIG"; + case LFS_ERR_INVAL: return "LFS_ERR_INVAL"; + case LFS_ERR_NOSPC: return "LFS_ERR_NOSPC"; + case LFS_ERR_NOMEM: return "LFS_ERR_NOMEM"; + case LFS_ERR_NOATTR: return "LFS_ERR_NOATTR"; + case LFS_ERR_NAMETOOLONG: return "LFS_ERR_NAMETOOLONG"; + default: return "LFS_ERR_UNDEFINED"; + } + return ""; +} +#else +#define esp_littlefs_errno(x) "" +#endif + +/******************** + * Static Functions * + ********************/ + +/*** Helpers ***/ + +/** + * @brief Free and clear a littlefs definition structure. + * @param efs Pointer to pointer to struct. Done this way so we can also zero + * out the pointer. + */ +static void esp_littlefs_free(esp_littlefs_t ** efs) +{ + esp_littlefs_t * e = *efs; + if (e == NULL) return; + *efs = NULL; + + if (e->fs) { + if(e->cache_size > 0) lfs_unmount(e->fs); + free(e->fs); + } + if(e->lock) vSemaphoreDelete(e->lock); + esp_littlefs_free_fds(e); + free(e); +} + +/** + * @brief Free a vfs_littlefs_dir_t struct. + */ +static void esp_littlefs_dir_free(vfs_littlefs_dir_t *dir){ + if(dir == NULL) return; + if(dir->path) free(dir->path); + free(dir); +} + +/** + * Get a mounted littlefs filesystem by label. + * @param[in] label + * @param[out] index index into _efs + * @return ESP_OK on success + */ +static esp_err_t esp_littlefs_by_label(const char* label, int * index){ + int i; + esp_littlefs_t * p; + + if(!label || !index) return ESP_ERR_INVALID_ARG; + + ESP_LOGV(TAG, "Searching for existing filesystem for partition \"%s\"", label); + + for (i = 0; i < CONFIG_LITTLEFS_MAX_PARTITIONS; i++) { + p = _efs[i]; + if (p) { + if (strncmp(label, p->partition->label, 17) == 0) { + *index = i; + ESP_LOGV(TAG, "Found existing filesystem \"%s\" at index %d", label, *index); + return ESP_OK; + } + } + } + + ESP_LOGV(TAG, "Existing filesystem \"%s\" not found", label); + return ESP_ERR_NOT_FOUND; +} + +/** + * @brief Get the index of an unallocated LittleFS slot. + * @param[out] index Indexd of free LittleFS slot + * @return ESP_OK on success + */ +static esp_err_t esp_littlefs_get_empty(int *index) { + assert(index); + for(uint8_t i=0; i < CONFIG_LITTLEFS_MAX_PARTITIONS; i++){ + if( _efs[i] == NULL ){ + *index = i; + return ESP_OK; + } + } + ESP_LOGE(TAG, "No more free partitions available."); + return ESP_FAIL; +} + +/** + * @brief erase a partition; make sure LittleFS is unmounted first. + * @param partition_label NULL-terminated string of partition to erase + * @return ESP_OK on success + */ +static esp_err_t esp_littlefs_erase_partition(const char *partition_label) { + ESP_LOGV(TAG, "Erasing partition..."); + + const esp_partition_t* partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, + partition_label); + if (!partition) { + ESP_LOGE(TAG, "partition \"%s\" could not be found", partition_label); + return ESP_ERR_NOT_FOUND; + } + + if( esp_partition_erase_range(partition, 0, partition->size) != ESP_OK ) { + ESP_LOGE(TAG, "Failed to erase partition"); + return ESP_FAIL; + } + + return ESP_OK; +} + +/** + * @brief Convert fcntl flags to littlefs flags + * @param m fcntl flags + * @return lfs flags + */ +static int esp_littlefs_flags_conv(int m) { + int lfs_flags = 0; + if (m == O_APPEND) {ESP_LOGV(TAG, "O_APPEND"); lfs_flags |= LFS_O_APPEND;} + if (m == O_RDONLY) {ESP_LOGV(TAG, "O_RDONLY"); lfs_flags |= LFS_O_RDONLY;} + if (m & O_WRONLY) {ESP_LOGV(TAG, "O_WRONLY"); lfs_flags |= LFS_O_WRONLY;} + if (m & O_RDWR) {ESP_LOGV(TAG, "O_RDWR"); lfs_flags |= LFS_O_RDWR;} + if (m & O_EXCL) {ESP_LOGV(TAG, "O_EXCL"); lfs_flags |= LFS_O_EXCL;} + if (m & O_CREAT) {ESP_LOGV(TAG, "O_CREAT"); lfs_flags |= LFS_O_CREAT;} + if (m & O_TRUNC) {ESP_LOGV(TAG, "O_TRUNC"); lfs_flags |= LFS_O_TRUNC;} + return lfs_flags; +} + +/** + * @brief Initialize and mount littlefs + * @param[in] conf Filesystem Configuration + * @return ESP_OK on success + */ +static esp_err_t esp_littlefs_init(const esp_vfs_littlefs_conf_t* conf) +{ + int index = -1; + esp_err_t err = ESP_FAIL; + const esp_partition_t* partition = NULL; + esp_littlefs_t * efs = NULL; + + if( _efs_lock == NULL ){ + static portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED; + portENTER_CRITICAL(&mux); + if( _efs_lock == NULL ){ + _efs_lock = xSemaphoreCreateMutex(); + assert(_efs_lock); + } + portEXIT_CRITICAL(&mux); + } + + xSemaphoreTake(_efs_lock, portMAX_DELAY); + + if (esp_littlefs_get_empty(&index) != ESP_OK) { + ESP_LOGE(TAG, "max mounted partitions reached"); + err = ESP_ERR_INVALID_STATE; + goto exit; + } + + /* Input and Environment Validation */ + if (esp_littlefs_by_label(conf->partition_label, &index) == ESP_OK) { + ESP_LOGE(TAG, "Partition already used"); + err = ESP_ERR_INVALID_STATE; + goto exit; + } + + { + uint32_t flash_page_size = g_rom_flashchip.page_size; + uint32_t log_page_size = CONFIG_LITTLEFS_PAGE_SIZE; + if (log_page_size % flash_page_size != 0) { + ESP_LOGE(TAG, "LITTLEFS_PAGE_SIZE is not multiple of flash chip page size (%d)", + flash_page_size); + err = ESP_ERR_INVALID_ARG; + goto exit; + } + } + + if ( NULL == conf->partition_label ) { + ESP_LOGE(TAG, "Partition label must be provided."); + err = ESP_ERR_INVALID_ARG; + goto exit; + } + + partition = esp_partition_find_first( + ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, + conf->partition_label); + + if (!partition) { + ESP_LOGE(TAG, "partition \"%s\" could not be found", conf->partition_label); + err = ESP_ERR_NOT_FOUND; + goto exit; + } + + /* Allocate Context */ + efs = calloc(1, sizeof(esp_littlefs_t)); + if (efs == NULL) { + ESP_LOGE(TAG, "esp_littlefs could not be malloced"); + err = ESP_ERR_NO_MEM; + goto exit; + } + efs->partition = partition; + + { /* LittleFS Configuration */ + efs->cfg.context = efs; + + // block device operations + efs->cfg.read = littlefs_api_read; + efs->cfg.prog = littlefs_api_prog; + efs->cfg.erase = littlefs_api_erase; + efs->cfg.sync = littlefs_api_sync; + + // block device configuration + efs->cfg.read_size = CONFIG_LITTLEFS_READ_SIZE; + efs->cfg.prog_size = CONFIG_LITTLEFS_WRITE_SIZE; + efs->cfg.block_size = CONFIG_LITTLEFS_BLOCK_SIZE;; + efs->cfg.block_count = efs->partition->size / efs->cfg.block_size; + efs->cfg.cache_size = CONFIG_LITTLEFS_CACHE_SIZE; + efs->cfg.lookahead_size = CONFIG_LITTLEFS_LOOKAHEAD_SIZE; + efs->cfg.block_cycles = CONFIG_LITTLEFS_BLOCK_CYCLES; + } + + efs->lock = xSemaphoreCreateRecursiveMutex(); + if (efs->lock == NULL) { + ESP_LOGE(TAG, "mutex lock could not be created"); + err = ESP_ERR_NO_MEM; + goto exit; + } + + efs->fs = calloc(1, sizeof(lfs_t)); + if (efs->fs == NULL) { + ESP_LOGE(TAG, "littlefs could not be malloced"); + err = ESP_ERR_NO_MEM; + goto exit; + } + + // Mount and Error Check + _efs[index] = efs; + if(!conf->dont_mount){ + int res = lfs_mount(efs->fs, &efs->cfg); + + if (conf->format_if_mount_failed && res != LFS_ERR_OK) { + esp_err_t err; + ESP_LOGW(TAG, "mount failed, %s (%i). formatting...", esp_littlefs_errno(res), res); + err = esp_littlefs_format(efs->partition->label); + if(err != ESP_OK) { + ESP_LOGE(TAG, "format failed"); + err = ESP_FAIL; + goto exit; + } + res = lfs_mount(efs->fs, &efs->cfg); + } + if (res != LFS_ERR_OK) { + ESP_LOGE(TAG, "mount failed, %s (%i)", esp_littlefs_errno(res), res); + err = ESP_FAIL; + goto exit; + } + efs->cache_size = 4; + efs->cache = calloc(sizeof(*efs->cache), efs->cache_size); + } + + err = ESP_OK; + +exit: + if(err != ESP_OK){ + if( index >= 0 ) { + esp_littlefs_free(&_efs[index]); + } + else{ + esp_littlefs_free(&efs); + } + } + xSemaphoreGive(_efs_lock); + return err; +} + +/** + * @brief + * @parameter efs file system context + */ +static inline int sem_take(esp_littlefs_t *efs) { + int res; +#if LOG_LOCAL_LEVEL >= 5 + ESP_LOGV(TAG, "------------------------ Sem Taking [%s]", pcTaskGetTaskName(NULL)); +#endif + res = xSemaphoreTakeRecursive(efs->lock, portMAX_DELAY); +#if LOG_LOCAL_LEVEL >= 5 + ESP_LOGV(TAG, "--------------------->>> Sem Taken [%s]", pcTaskGetTaskName(NULL)); +#endif + return res; +} + +/** + * @brief + * @parameter efs file system context + */ +static inline int sem_give(esp_littlefs_t *efs) { +#if LOG_LOCAL_LEVEL >= 5 + ESP_LOGV(TAG, "---------------------<<< Sem Give [%s]", pcTaskGetTaskName(NULL)); +#endif + return xSemaphoreGiveRecursive(efs->lock); +} + + +/* We are using a double allocation system here, which an array and a linked list. + The array contains the pointer to the file descriptor (the index in the array is what's returned to the user). + The linked list is used for file descriptors. + This means that position of nodes in the list must stay consistent: + - Allocation is obvious (append to the list from the head, and realloc the pointers array) + There is still a O(N) search in the cache for a free position to store + - Searching is a O(1) process (good) + - Deallocation is more tricky. That is, for example, + if you need to remove node 5 in a 12 nodes list, you'll have to: + 1) Mark the 5th position as freed (if it's the last position of the array realloc smaller) + 2) Walk the list until finding the pointer to the node O(N) and scrub the node so the chained list stays consistent + 3) Deallocate the node +*/ + +/** + * @brief Get a file descriptor + * @param[in,out] efs file system context + * @param[out] file pointer to a file that'll be filled with a file object + * @param[in] path_len the length of the filepath in bytes (including terminating zero byte) + * @return integer file descriptor. Returns -1 if a FD cannot be obtained. + * @warning This must be called with lock taken + */ +static int esp_littlefs_allocate_fd(esp_littlefs_t *efs, vfs_littlefs_file_t ** file +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + , const size_t path_len +#endif + ) +{ + int i = -1; + + assert( efs->fd_count < UINT16_MAX ); + assert( efs->cache_size < UINT16_MAX ); + + /* Make sure there is enough space in the cache to store new fd */ + if (efs->fd_count + 1 > efs->cache_size) { + uint16_t new_size = (uint16_t)MIN(UINT16_MAX, CONFIG_LITTLEFS_FD_CACHE_REALLOC_FACTOR * efs->cache_size); + /* Resize the cache */ + vfs_littlefs_file_t ** new_cache = realloc(efs->cache, new_size * sizeof(*efs->cache)); + if (!new_cache) { + ESP_LOGE(TAG, "Unable to allocate file cache"); + return -1; /* If it fails here, no harm is done to the filesystem, so it's safe */ + } + /* Zero out the new portions of the cache */ + memset(&new_cache[efs->cache_size], 0, (new_size - efs->cache_size) * sizeof(*efs->cache)); + efs->cache = new_cache; + efs->cache_size = new_size; + } + + + /* Allocate file descriptor here now */ +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + *file = calloc(1, sizeof(**file) + path_len); +#else + *file = calloc(1, sizeof(**file)); +#endif + + if (*file == NULL) { + /* If it fails here, the file system might have a larger cache, but it's harmless, no need to reverse it */ + ESP_LOGE(TAG, "Unable to allocate FD"); + return -1; + } + + /* Starting from here, nothing can fail anymore */ + +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + /* The trick here is to avoid dual allocation so the path pointer + should point to the next byte after it: + file => [ lfs_file | # | next | path | free_space ] + | /\ + |__/ + */ + (*file)->path = (char*)(*file) + sizeof(**file); +#endif + + /* Now find a free place in cache */ + for(i=0; i < efs->cache_size; i++) { + if (efs->cache[i] == NULL) { + efs->cache[i] = *file; + break; + } + } + /* Save file in the list */ + (*file)->next = efs->file; + efs->file = *file; + efs->fd_count++; + return i; +} + +/** + * @brief Release a file descriptor + * @param[in,out] efs file system context + * @param[in] fd File Descriptor to release + * @return 0 on success. -1 if a FD cannot be obtained. + * @warning This must be called with lock taken + */ +static int esp_littlefs_free_fd(esp_littlefs_t *efs, int fd){ + vfs_littlefs_file_t * file, * head; + + if((uint32_t)fd >= efs->cache_size) { + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return -1; + } + + /* Get the file descriptor to free it */ + file = efs->cache[fd]; + head = efs->file; + /* Search for file in SLL to remove it */ + if (file == head) { + /* Last file, can't fail */ + efs->file = efs->file->next; + } else { + while (head && head->next != file) { + head = head->next; + } + if (!head) { + ESP_LOGE(TAG, "Inconsistent list"); + return -1; + } + /* Transaction starts here and can't fail anymore */ + head->next = file->next; + } + efs->cache[fd] = NULL; + efs->fd_count--; + + ESP_LOGV(TAG, "Clearing FD"); + free(file); + +#if 0 + /* Realloc smaller if its possible + * * Find and realloc based on number of trailing NULL ptrs in cache + * * Leave some hysteris to prevent thrashing around resize points + * This is disabled for now because it adds unnecessary complexity + * and binary size increase that outweights its ebenfits. + */ + if(efs->cache_size > CONFIG_LITTLEFS_FD_CACHE_MIN_SIZE) { + uint16_t n_free; + uint16_t new_size = efs->cache_size / CONFIG_LITTLEFS_FD_CACHE_REALLOC_FACTOR; + + if(new_size >= CONFIG_LITTLEFS_FD_CACHE_MIN_SIZE) { + /* Count number of trailing NULL ptrs */ + for(n_free=0; n_free < efs->cache_size; n_free++) { + if(efs->cache[efs->cache_size - n_free - 1] != NULL) { + break; + } + } + + if(n_free >= (efs->cache_size - new_size)){ + new_size += CONFIG_LITTLEFS_FD_CACHE_HYST; + ESP_LOGV(TAG, "Reallocating cache %i -> %i", efs->cache_size, new_size); + vfs_littlefs_file_t ** new_cache; + new_cache = realloc(efs->cache, new_size * sizeof(*efs->cache)); + /* No harm on realloc failure, continue using the oversized cache */ + if(new_cache) { + efs->cache = new_cache; + efs->cache_size = new_size; + } + } + } + } +#endif + + return 0; +} + +/** + * @brief Compute the 32bit DJB2 hash of the given string. + * @param[in] path the path to hash + * @returns the hash for this path + */ +static uint32_t compute_hash(const char * path) { + uint32_t hash = 5381; + char c; + + while ((c = *path++)) + hash = ((hash << 5) + hash) + c; /* hash * 33 + c */ + return hash; +} + +/** + * @brief finds an open file descriptor by file name. + * @param[in,out] efs file system context + * @param[in] path File path to check. + * @returns integer file descriptor. Returns -1 if not found. + * @warning This must be called with lock taken + * @warning if CONFIG_LITTLEFS_USE_ONLY_HASH, there is a slim chance an + * erroneous FD may be returned on hash collision. + */ +static int esp_littlefs_get_fd_by_name(esp_littlefs_t *efs, const char *path){ + uint32_t hash = compute_hash(path); + + for(uint16_t i=0, j=0; i < efs->cache_size && j < efs->fd_count; i++){ + if (efs->cache[i]) { + ++j; + + if ( + efs->cache[i]->hash == hash // Faster than strcmp +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + && strcmp(path, efs->cache[i]->path) == 0 // May as well check incase of hash collision. Usually short-circuited. +#endif + ) { + ESP_LOGV(TAG, "Found \"%s\" at FD %d.", path, i); + return i; + } + } + } + ESP_LOGV(TAG, "Unable to get a find FD for \"%s\"", path); + return -1; +} + +/*** Filesystem Hooks ***/ + +static int vfs_littlefs_open(void* ctx, const char * path, int flags, int mode) { + /* Note: mode is currently unused */ + int fd=-1, lfs_flags, res; + esp_littlefs_t *efs = (esp_littlefs_t *)ctx; + vfs_littlefs_file_t *file = NULL; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + size_t path_len = strlen(path) + 1; // include NULL terminator +#endif + assert(path); + + ESP_LOGV(TAG, "Opening %s", path); + + /* Convert flags to lfs flags */ + lfs_flags = esp_littlefs_flags_conv(flags); + + /* Get a FD */ + sem_take(efs); + + fd = esp_littlefs_allocate_fd(efs, &file +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + , path_len +#endif + ); + + if(fd < 0) { + errno = -fd; + sem_give(efs); + ESP_LOGV(TAG, "Error obtaining FD"); + return LFS_ERR_INVAL; + } + +#if CONFIG_LITTLEFS_SPIFFS_COMPAT + /* Create all parent directories (if necessary) */ + ESP_LOGV(TAG, "LITTLEFS_SPIFFS_COMPAT attempting to create all directories for %s", path); + mkdirs(efs, path); +#endif // CONFIG_LITTLEFS_SPIFFS_COMPAT + + /* Open File */ + res = lfs_file_open(efs->fs, &file->file, path, lfs_flags); + + if( res < 0 ) { + errno = -res; + esp_littlefs_free_fd(efs, fd); + sem_give(efs); +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to open file %s. Error %s (%d)", + path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to open file. Error %s (%d)", + esp_littlefs_errno(res), res); +#endif + return LFS_ERR_INVAL; + } + + /* Sync after opening. If we are overwriting a file, this will free that + * file's blocks in storage, prevent OOS errors. + * See TEST_CASE: + * "Rewriting file frees space immediately (#7426)" + */ + res = lfs_file_sync(efs->fs, &file->file); + if(res < 0){ + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to sync at opening file \"%s\". Error %s (%d)", + file->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to sync at opening file %d. Error %d", fd, res); +#endif + } + + file->hash = compute_hash(path); +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + memcpy(file->path, path, path_len); +#endif + +#if CONFIG_LITTLEFS_USE_MTIME + if (lfs_flags != LFS_O_RDONLY) { + /* If this is being opened as not read-only */ + vfs_littlefs_update_mtime(efs, path); + } +#endif + + sem_give(efs); + ESP_LOGV(TAG, "Done opening %s", path); + return fd; +} + +static ssize_t vfs_littlefs_write(void* ctx, int fd, const void * data, size_t size) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + ssize_t res; + vfs_littlefs_file_t *file = NULL; + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_file_write(efs->fs, &file->file, data, size); + sem_give(efs); + + if(res < 0){ + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to write FD %d; path \"%s\". Error %s (%d)", + fd, file->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to write FD %d. Error %s (%d)", + fd, esp_littlefs_errno(res), res); +#endif + return res; + } + + return res; +} + +static ssize_t vfs_littlefs_read(void* ctx, int fd, void * dst, size_t size) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + ssize_t res; + vfs_littlefs_file_t *file = NULL; + + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_file_read(efs->fs, &file->file, dst, size); + sem_give(efs); + + if(res < 0){ + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to read file \"%s\". Error %s (%d)", + file->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to read FD %d. Error %s (%d)", + fd, esp_littlefs_errno(res), res); +#endif + return res; + } + + return res; +} + +static int vfs_littlefs_close(void* ctx, int fd) { + // TODO update mtime on close? SPIFFS doesn't do this + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + int res; + vfs_littlefs_file_t *file = NULL; + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_file_close(efs->fs, &file->file); + if(res < 0){ + errno = -res; + sem_give(efs); +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to close file \"%s\". Error %s (%d)", + file->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to close Fd %d. Error %s (%d)", + fd, esp_littlefs_errno(res), res); +#endif + return res; + } + esp_littlefs_free_fd(efs, fd); + sem_give(efs); + return res; +} + +static off_t vfs_littlefs_lseek(void* ctx, int fd, off_t offset, int mode) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + lfs_soff_t res; + vfs_littlefs_file_t *file = NULL; + int whence; + + switch (mode) { + case SEEK_SET: whence = LFS_SEEK_SET; break; + case SEEK_CUR: whence = LFS_SEEK_CUR; break; + case SEEK_END: whence = LFS_SEEK_END; break; + default: + ESP_LOGE(TAG, "Invalid mode"); + return -1; + } + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_file_seek(efs->fs, &file->file, offset, whence); + sem_give(efs); + + if(res < 0){ + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to seek file \"%s\" to offset %08x. Error %s (%d)", + file->path, (unsigned int)offset, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to seek FD %d to offset %08x. Error (%d)", + fd, (unsigned int)offset, res); +#endif + return res; + } + + return res; +} + +static int vfs_littlefs_fsync(void* ctx, int fd) +{ + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + ssize_t res; + vfs_littlefs_file_t *file = NULL; + + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD %d must be <%d.", fd, efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_file_sync(efs->fs, &file->file); + sem_give(efs); + + if(res < 0){ + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to sync file \"%s\". Error %s (%d)", + file->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to sync file %d. Error %d", fd, res); +#endif + return res; + } + + return res; +} + + +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH +static int vfs_littlefs_fstat(void* ctx, int fd, struct stat * st) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + struct lfs_info info; + int res; + vfs_littlefs_file_t *file = NULL; + + memset(st, 0, sizeof(struct stat)); + st->st_blksize = efs->cfg.block_size; + + sem_take(efs); + if((uint32_t)fd > efs->cache_size) { + sem_give(efs); + ESP_LOGE(TAG, "FD must be <%d.", efs->cache_size); + return LFS_ERR_BADF; + } + file = efs->cache[fd]; + res = lfs_stat(efs->fs, file->path, &info); + if (res < 0) { + errno = -res; + sem_give(efs); + ESP_LOGV(TAG, "Failed to stat file \"%s\". Error %s (%d)", + file->path, esp_littlefs_errno(res), res); + return res; + } + +#if CONFIG_LITTLEFS_USE_MTIME + st->st_mtime = vfs_littlefs_get_mtime(efs, file->path); +#endif + + sem_give(efs); + + st->st_size = info.size; + st->st_mode = ((info.type==LFS_TYPE_REG)?S_IFREG:S_IFDIR); + return 0; +} +#endif + +static int vfs_littlefs_stat(void* ctx, const char * path, struct stat * st) { + assert(path); + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + struct lfs_info info; + int res; + + memset(st, 0, sizeof(struct stat)); + st->st_blksize = efs->cfg.block_size; + + sem_take(efs); + res = lfs_stat(efs->fs, path, &info); + if (res < 0) { + errno = -res; + sem_give(efs); + /* Not strictly an error, since stat can be used to check + * if a file exists */ + ESP_LOGV(TAG, "Failed to stat path \"%s\". Error %s (%d)", + path, esp_littlefs_errno(res), res); + return res; + } +#if CONFIG_LITTLEFS_USE_MTIME + st->st_mtime = vfs_littlefs_get_mtime(efs, path); +#endif + sem_give(efs); + st->st_size = info.size; + st->st_mode = ((info.type==LFS_TYPE_REG)?S_IFREG:S_IFDIR); + return 0; +} + +static int vfs_littlefs_unlink(void* ctx, const char *path) { +#define fail_str_1 "Failed to unlink path \"%s\"." + assert(path); + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + struct lfs_info info; + int res; + + sem_take(efs); + res = lfs_stat(efs->fs, path, &info); + if (res < 0) { + errno = -res; + sem_give(efs); + ESP_LOGV(TAG, fail_str_1 " Error %s (%d)", + path, esp_littlefs_errno(res), res); + return res; + } + + if(esp_littlefs_get_fd_by_name(efs, path) >= 0) { + sem_give(efs); + ESP_LOGE(TAG, fail_str_1 " Has open FD.", path); + return -1; + } +/* commented for old core revisions compatibility */ +/* + if (info.type == LFS_TYPE_DIR) { + sem_give(efs); + ESP_LOGV(TAG, "Cannot unlink a directory."); + return LFS_ERR_ISDIR; + } +*/ + res = lfs_remove(efs->fs, path); + if (res < 0) { + errno = -res; + sem_give(efs); + ESP_LOGV(TAG, fail_str_1 " Error %s (%d)", + path, esp_littlefs_errno(res), res); + return res; + } + +#if CONFIG_LITTLEFS_SPIFFS_COMPAT + /* Attempt to delete all parent directories that are empty */ + rmdirs(efs, path); +#endif // CONFIG_LITTLEFS_SPIFFS_COMPAT + + sem_give(efs); + + return 0; +#undef fail_str_1 +} + +static int vfs_littlefs_rename(void* ctx, const char *src, const char *dst) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + int res; + + sem_take(efs); + + if(esp_littlefs_get_fd_by_name(efs, src) >= 0){ + sem_give(efs); + ESP_LOGE(TAG, "Cannot rename; src \"%s\" is open.", src); + return -1; + } + else if(esp_littlefs_get_fd_by_name(efs, dst) >= 0){ + sem_give(efs); + ESP_LOGE(TAG, "Cannot rename; dst \"%s\" is open.", dst); + return -1; + } + + res = lfs_rename(efs->fs, src, dst); + sem_give(efs); + if (res < 0) { + errno = -res; + ESP_LOGV(TAG, "Failed to rename \"%s\" -> \"%s\". Error %s (%d)", + src, dst, esp_littlefs_errno(res), res); + return res; + } + + return 0; +} + +static DIR* vfs_littlefs_opendir(void* ctx, const char* name) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + int res; + vfs_littlefs_dir_t *dir = NULL; + + dir = calloc(1, sizeof(vfs_littlefs_dir_t)); + if( dir == NULL ) { + ESP_LOGE(TAG, "dir struct could not be malloced"); + goto exit; + } + + dir->path = strdup(name); + if(dir->path == NULL){ + ESP_LOGE(TAG, "dir path name could not be malloced"); + goto exit; + } + + sem_take(efs); + res = lfs_dir_open(efs->fs, &dir->d, dir->path); + sem_give(efs); + if (res < 0) { + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to opendir \"%s\". Error %s (%d)", + dir->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to opendir \"%s\". Error %d", dir->path, res); +#endif + goto exit; + } + + return (DIR *)dir; + +exit: + esp_littlefs_dir_free(dir); + return NULL; +} + +static int vfs_littlefs_closedir(void* ctx, DIR* pdir) { + assert(pdir); + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + vfs_littlefs_dir_t * dir = (vfs_littlefs_dir_t *) pdir; + int res; + + sem_take(efs); + res = lfs_dir_close(efs->fs, &dir->d); + sem_give(efs); + if (res < 0) { + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to closedir \"%s\". Error %s (%d)", + dir->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to closedir \"%s\". Error %d", dir->path, res); +#endif + return res; + } + + esp_littlefs_dir_free(dir); + return 0; +} + +static struct dirent* vfs_littlefs_readdir(void* ctx, DIR* pdir) { + assert(pdir); + vfs_littlefs_dir_t * dir = (vfs_littlefs_dir_t *) pdir; + int res; + struct dirent* out_dirent; + + res = vfs_littlefs_readdir_r(ctx, pdir, &dir->e, &out_dirent); + if (res != 0) return NULL; + return out_dirent; +} + +static int vfs_littlefs_readdir_r(void* ctx, DIR* pdir, + struct dirent* entry, struct dirent** out_dirent) { + assert(pdir); + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + vfs_littlefs_dir_t * dir = (vfs_littlefs_dir_t *) pdir; + int res; + struct lfs_info info = { 0 }; + + sem_take(efs); + do{ /* Read until we get a real object name */ + res = lfs_dir_read(efs->fs, &dir->d, &info); + }while( res>0 && (strcmp(info.name, ".") == 0 || strcmp(info.name, "..") == 0)); + sem_give(efs); + if (res < 0) { + errno = -res; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to readdir \"%s\". Error %s (%d)", + dir->path, esp_littlefs_errno(res), res); +#else + ESP_LOGV(TAG, "Failed to readdir \"%s\". Error %d", dir->path, res); +#endif + return -1; + } + + if(info.type == LFS_TYPE_REG) { + ESP_LOGV(TAG, "readdir a file of size %d named \"%s\"", + info.size, info.name); + } + else { + ESP_LOGV(TAG, "readdir a dir named \"%s\"", info.name); + } + + if(res == 0) { + /* End of Objs */ + ESP_LOGV(TAG, "Reached the end of the directory."); + *out_dirent = NULL; + } + else { + entry->d_ino = 0; + entry->d_type = info.type == LFS_TYPE_REG ? DT_REG : DT_DIR; + strncpy(entry->d_name, info.name, sizeof(entry->d_name)); + *out_dirent = entry; + } + dir->offset++; + + return 0; +} + +static long vfs_littlefs_telldir(void* ctx, DIR* pdir) { + assert(pdir); + vfs_littlefs_dir_t * dir = (vfs_littlefs_dir_t *) pdir; + return dir->offset; +} + +static void vfs_littlefs_seekdir(void* ctx, DIR* pdir, long offset) { + assert(pdir); + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + vfs_littlefs_dir_t * dir = (vfs_littlefs_dir_t *) pdir; + int res; + + if (offset < dir->offset) { + /* close and re-open dir to rewind to beginning */ + sem_take(efs); + res = lfs_dir_rewind(efs->fs, &dir->d); + sem_give(efs); + if (res < 0) { + errno = -res; + ESP_LOGV(TAG, "Failed to rewind dir \"%s\". Error %s (%d)", + dir->path, esp_littlefs_errno(res), res); + return; + } + dir->offset = 0; + } + + while(dir->offset < offset){ + struct dirent *out_dirent; + res = vfs_littlefs_readdir_r(ctx, pdir, &dir->e, &out_dirent); + if( res != 0 ){ + ESP_LOGE(TAG, "Error readdir_r"); + return; + } + } +} + +static int vfs_littlefs_mkdir(void* ctx, const char* name, mode_t mode) { + /* Note: mode is currently unused */ + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + int res; + ESP_LOGV(TAG, "mkdir \"%s\"", name); + + sem_take(efs); + res = lfs_mkdir(efs->fs, name); + sem_give(efs); + if (res < 0) { + errno = -res; + ESP_LOGV(TAG, "Failed to mkdir \"%s\". Error %s (%d)", + name, esp_littlefs_errno(res), res); + return res; + } + return 0; +} + +static int vfs_littlefs_rmdir(void* ctx, const char* name) { + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + struct lfs_info info; + int res; + + /* Error Checking */ + sem_take(efs); + res = lfs_stat(efs->fs, name, &info); + if (res < 0) { + errno = -res; + sem_give(efs); + ESP_LOGV(TAG, "\"%s\" doesn't exist.", name); + return -1; + } + + if (info.type != LFS_TYPE_DIR) { + sem_give(efs); + ESP_LOGV(TAG, "\"%s\" is not a directory.", name); + return -1; + } + + /* Unlink the dir */ + res = lfs_remove(efs->fs, name); + sem_give(efs); + if ( res < 0) { + errno = -res; + ESP_LOGV(TAG, "Failed to unlink path \"%s\". Error %s (%d)", + name, esp_littlefs_errno(res), res); + return -1; + } + + return 0; +} + +#if CONFIG_LITTLEFS_USE_MTIME +/** + * Sets the mtime attr to t. + */ +static int vfs_littlefs_update_mtime_value(esp_littlefs_t *efs, const char *path, time_t t) +{ + int res; + res = lfs_setattr(efs->fs, path, LITTLEFS_ATTR_MTIME, + &t, sizeof(t)); + if( res < 0 ) { + errno = -res; + ESP_LOGV(TAG, "Failed to update mtime (%d)", res); + } + + return res; +} + +/** + * Sets the mtime attr to an appropriate value + */ +static void vfs_littlefs_update_mtime(esp_littlefs_t *efs, const char *path) +{ + vfs_littlefs_utime(efs, path, NULL); +} + + +static int vfs_littlefs_utime(void *ctx, const char *path, const struct utimbuf *times) +{ + esp_littlefs_t * efs = (esp_littlefs_t *)ctx; + time_t t; + + assert(path); + + if (times) { + t = times->modtime; + } else { +#if CONFIG_LITTLEFS_MTIME_USE_SECONDS + // use current time + t = time(NULL); +#elif CONFIG_LITTLEFS_MTIME_USE_NONCE + assert( sizeof(time_t) == 4 ); + t = vfs_littlefs_get_mtime(efs, path); + if( 0 == t ) t = esp_random(); + else t += 1; + + if( 0 == t ) t = 1; +#else +#error "Invalid MTIME configuration" +#endif + } + + int ret = vfs_littlefs_update_mtime_value(efs, path, t); + return ret; +} + +static time_t vfs_littlefs_get_mtime(esp_littlefs_t *efs, const char *path) +{ + time_t t = 0; + int size; + size = lfs_getattr(efs->fs, path, LITTLEFS_ATTR_MTIME, + &t, sizeof(t)); + if( size < 0 ) { + errno = -size; +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + ESP_LOGV(TAG, "Failed to get mtime attribute %s (%d)", + esp_littlefs_errno(size), size); +#else + ESP_LOGV(TAG, "Failed to get mtime attribute %d", size); +#endif + } + return t; +} +#endif //CONFIG_LITTLEFS_USE_MTIME + +#if CONFIG_LITTLEFS_SPIFFS_COMPAT +/** + * @brief Recursively make all parent directories for a file. + * @param[in] dir Path of directories to make up to. The last element + * of the path is assumed to be the file and IS NOT created. + * e.g. + * "foo/bar/baz" + * will create directories "foo" and "bar" + */ +static void mkdirs(esp_littlefs_t * efs, const char *dir) { + char tmp[CONFIG_LITTLEFS_OBJ_NAME_LEN]; + char *p = NULL; + + strlcpy(tmp, dir, sizeof(tmp)); + for(p = tmp + 1; *p; p++) { + if(*p == '/') { + *p = '\0'; + vfs_littlefs_mkdir((void*)efs, tmp, S_IRWXU); + *p = '/'; + } + } +} + +/** + * @brief Recursively attempt to delete all empty directories for a file. + * @param[in] dir Path of directories to delete. The last element of the path + * is assumed to be the file and IS NOT deleted. + * e.g. + * "foo/bar/baz" + * will attempt to delete directories (in order): + * 1. "foo/bar/baz" + * 2. "foo/bar" + * 3. "foo" + */ + +static void rmdirs(esp_littlefs_t * efs, const char *dir) { + char tmp[CONFIG_LITTLEFS_OBJ_NAME_LEN]; + char *p = NULL; + + strlcpy(tmp, dir, sizeof(tmp)); + for(p = tmp + strlen(tmp) - 1; p != tmp; p--) { + if(*p == '/') { + *p = '\0'; + vfs_littlefs_rmdir((void*)efs, tmp); + *p = '/'; + } + } +} + +#endif // CONFIG_LITTLEFS_SPIFFS_COMPAT diff --git a/lib/libesp32/LITTLEFS/src/esp_littlefs.h b/lib/libesp32/LITTLEFS/src/esp_littlefs.h new file mode 100755 index 000000000..549c967e6 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/esp_littlefs.h @@ -0,0 +1,118 @@ +#ifndef ESP_LITTLEFS_H__ +#define ESP_LITTLEFS_H__ + +#include +#include +#include +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "esp_err.h" +#include +#include +#include +#include +#include +#include +#include +#include "sdkconfig.h" + +#include "lfs.h" //#include "littlefs/lfs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Last Modified Time + * + * Use 't' for LITTLEFS_ATTR_MTIME to match example: + * https://github.com/ARMmbed/littlefs/issues/23#issuecomment-482293539 + * And to match other external tools such as: + * https://github.com/earlephilhower/mklittlefs + */ +#define LITTLEFS_ATTR_MTIME ((uint8_t) 't') + +/** + *Configuration structure for esp_vfs_littlefs_register. + */ +typedef struct { + const char *base_path; /**< Mounting point. */ + const char *partition_label; /**< Label of partition to use. */ + uint8_t format_if_mount_failed:1; /**< Format the file system if it fails to mount. */ + uint8_t dont_mount:1; /**< Don't attempt to mount or format. Overrides format_if_mount_failed */ +} esp_vfs_littlefs_conf_t; + +/** + * Register and mount littlefs to VFS with given path prefix. + * + * @param conf Pointer to esp_vfs_littlefs_conf_t configuration structure + * + * @return + * - ESP_OK if success + * - ESP_ERR_NO_MEM if objects could not be allocated + * - ESP_ERR_INVALID_STATE if already mounted or partition is encrypted + * - ESP_ERR_NOT_FOUND if partition for littlefs was not found + * - ESP_FAIL if mount or format fails + */ +esp_err_t esp_vfs_littlefs_register(const esp_vfs_littlefs_conf_t * conf); + +/** + * Unregister and unmount littlefs from VFS + * + * @param partition_label Label of the partition to unregister. + * + * @return + * - ESP_OK if successful + * - ESP_ERR_INVALID_STATE already unregistered + */ +esp_err_t esp_vfs_littlefs_unregister(const char* partition_label); + +/** + * Check if littlefs is mounted + * + * @param partition_label Label of the partition to check. + * + * @return + * - true if mounted + * - false if not mounted + */ +bool esp_littlefs_mounted(const char* partition_label); + +/** + * Format the littlefs partition + * + * @param partition_label Label of the partition to format. + * @return + * - ESP_OK if successful + * - ESP_FAIL on error + */ +esp_err_t esp_littlefs_format(const char* partition_label); + +/** + * Get information for littlefs + * + * @param partition_label Optional, label of the partition to get info for. + * @param[out] total_bytes Size of the file system + * @param[out] used_bytes Current used bytes in the file system + * + * @return + * - ESP_OK if success + * - ESP_ERR_INVALID_STATE if not mounted + */ +esp_err_t esp_littlefs_info(const char* partition_label, size_t *total_bytes, size_t *used_bytes); + +#if CONFIG_LITTLEFS_HUMAN_READABLE +/** + * @brief converts an enumerated lfs error into a string. + * @param lfs_errno The enumerated littlefs error. + */ +const char * esp_littlefs_errno(enum lfs_error lfs_errno); +#endif + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif diff --git a/lib/libesp32/LITTLEFS/src/lfs.c b/lib/libesp32/LITTLEFS/src/lfs.c new file mode 100755 index 000000000..a5bfb914e --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/lfs.c @@ -0,0 +1,4918 @@ +/* + * The little filesystem + * + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + * + * @note Modified and used by lorol for Arduino esp32 core tests + */ + +//#define LFS_NO_ERROR /* Change default error reporting level: LFS_NO_DEBUG, LFS_NO_WARN, LFS_NO_ERROR, LFS_YES_TRACE */ + +#include "lfs.h" +#include "lfs_util.h" + +#define LFS_BLOCK_NULL ((lfs_block_t)-1) +#define LFS_BLOCK_INLINE ((lfs_block_t)-2) + +/// Caching block device operations /// +static inline void lfs_cache_drop(lfs_t *lfs, lfs_cache_t *rcache) { + // do not zero, cheaper if cache is readonly or only going to be + // written with identical data (during relocates) + (void)lfs; + rcache->block = LFS_BLOCK_NULL; +} + +static inline void lfs_cache_zero(lfs_t *lfs, lfs_cache_t *pcache) { + // zero to avoid information leak + memset(pcache->buffer, 0xff, lfs->cfg->cache_size); + pcache->block = LFS_BLOCK_NULL; +} + +static int lfs_bd_read(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_block_t block, lfs_off_t off, + void *buffer, lfs_size_t size) { + uint8_t *data = buffer; + if (block >= lfs->cfg->block_count || + off+size > lfs->cfg->block_size) { + return LFS_ERR_CORRUPT; + } + + while (size > 0) { + lfs_size_t diff = size; + + if (pcache && block == pcache->block && + off < pcache->off + pcache->size) { + if (off >= pcache->off) { + // is already in pcache? + diff = lfs_min(diff, pcache->size - (off-pcache->off)); + memcpy(data, &pcache->buffer[off-pcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // pcache takes priority + diff = lfs_min(diff, pcache->off-off); + } + + if (block == rcache->block && + off < rcache->off + rcache->size) { + if (off >= rcache->off) { + // is already in rcache? + diff = lfs_min(diff, rcache->size - (off-rcache->off)); + memcpy(data, &rcache->buffer[off-rcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // rcache takes priority + diff = lfs_min(diff, rcache->off-off); + } + + if (size >= hint && off % lfs->cfg->read_size == 0 && + size >= lfs->cfg->read_size) { + // bypass cache? + diff = lfs_aligndown(diff, lfs->cfg->read_size); + int err = lfs->cfg->read(lfs->cfg, block, off, data, diff); + if (err) { + return err; + } + + data += diff; + off += diff; + size -= diff; + continue; + } + + // load to cache, first condition can no longer fail + LFS_ASSERT(block < lfs->cfg->block_count); + rcache->block = block; + rcache->off = lfs_aligndown(off, lfs->cfg->read_size); + rcache->size = lfs_min( + lfs_min( + lfs_alignup(off+hint, lfs->cfg->read_size), + lfs->cfg->block_size) + - rcache->off, + lfs->cfg->cache_size); + int err = lfs->cfg->read(lfs->cfg, rcache->block, + rcache->off, rcache->buffer, rcache->size); + LFS_ASSERT(err <= 0); + if (err) { + return err; + } + } + + return 0; +} + +enum { + LFS_CMP_EQ = 0, + LFS_CMP_LT = 1, + LFS_CMP_GT = 2, +}; + +static int lfs_bd_cmp(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_block_t block, lfs_off_t off, + const void *buffer, lfs_size_t size) { + const uint8_t *data = buffer; + + for (lfs_off_t i = 0; i < size; i++) { + uint8_t dat; + int err = lfs_bd_read(lfs, + pcache, rcache, hint-i, + block, off+i, &dat, 1); + if (err) { + return err; + } + + if (dat != data[i]) { + return (dat < data[i]) ? LFS_CMP_LT : LFS_CMP_GT; + } + } + + return LFS_CMP_EQ; +} + +static int lfs_bd_flush(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate) { + if (pcache->block != LFS_BLOCK_NULL && pcache->block != LFS_BLOCK_INLINE) { + LFS_ASSERT(pcache->block < lfs->cfg->block_count); + lfs_size_t diff = lfs_alignup(pcache->size, lfs->cfg->prog_size); + int err = lfs->cfg->prog(lfs->cfg, pcache->block, + pcache->off, pcache->buffer, diff); + LFS_ASSERT(err <= 0); + if (err) { + return err; + } + + if (validate) { + // check data on disk + lfs_cache_drop(lfs, rcache); + int res = lfs_bd_cmp(lfs, + NULL, rcache, diff, + pcache->block, pcache->off, pcache->buffer, diff); + if (res < 0) { + return res; + } + + if (res != LFS_CMP_EQ) { + return LFS_ERR_CORRUPT; + } + } + + lfs_cache_zero(lfs, pcache); + } + + return 0; +} + +static int lfs_bd_sync(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate) { + lfs_cache_drop(lfs, rcache); + + int err = lfs_bd_flush(lfs, pcache, rcache, validate); + if (err) { + return err; + } + + err = lfs->cfg->sync(lfs->cfg); + LFS_ASSERT(err <= 0); + return err; +} + +static int lfs_bd_prog(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate, + lfs_block_t block, lfs_off_t off, + const void *buffer, lfs_size_t size) { + const uint8_t *data = buffer; + LFS_ASSERT(block == LFS_BLOCK_INLINE || block < lfs->cfg->block_count); + LFS_ASSERT(off + size <= lfs->cfg->block_size); + + while (size > 0) { + if (block == pcache->block && + off >= pcache->off && + off < pcache->off + lfs->cfg->cache_size) { + // already fits in pcache? + lfs_size_t diff = lfs_min(size, + lfs->cfg->cache_size - (off-pcache->off)); + memcpy(&pcache->buffer[off-pcache->off], data, diff); + + data += diff; + off += diff; + size -= diff; + + pcache->size = lfs_max(pcache->size, off - pcache->off); + if (pcache->size == lfs->cfg->cache_size) { + // eagerly flush out pcache if we fill up + int err = lfs_bd_flush(lfs, pcache, rcache, validate); + if (err) { + return err; + } + } + + continue; + } + + // pcache must have been flushed, either by programming and + // entire block or manually flushing the pcache + LFS_ASSERT(pcache->block == LFS_BLOCK_NULL); + + // prepare pcache, first condition can no longer fail + pcache->block = block; + pcache->off = lfs_aligndown(off, lfs->cfg->prog_size); + pcache->size = 0; + } + + return 0; +} + +static int lfs_bd_erase(lfs_t *lfs, lfs_block_t block) { + LFS_ASSERT(block < lfs->cfg->block_count); + int err = lfs->cfg->erase(lfs->cfg, block); + LFS_ASSERT(err <= 0); + return err; +} + + +/// Small type-level utilities /// +// operations on block pairs +static inline void lfs_pair_swap(lfs_block_t pair[2]) { + lfs_block_t t = pair[0]; + pair[0] = pair[1]; + pair[1] = t; +} + +static inline bool lfs_pair_isnull(const lfs_block_t pair[2]) { + return pair[0] == LFS_BLOCK_NULL || pair[1] == LFS_BLOCK_NULL; +} + +static inline int lfs_pair_cmp( + const lfs_block_t paira[2], + const lfs_block_t pairb[2]) { + return !(paira[0] == pairb[0] || paira[1] == pairb[1] || + paira[0] == pairb[1] || paira[1] == pairb[0]); +} + +static inline bool lfs_pair_sync( + const lfs_block_t paira[2], + const lfs_block_t pairb[2]) { + return (paira[0] == pairb[0] && paira[1] == pairb[1]) || + (paira[0] == pairb[1] && paira[1] == pairb[0]); +} + +static inline void lfs_pair_fromle32(lfs_block_t pair[2]) { + pair[0] = lfs_fromle32(pair[0]); + pair[1] = lfs_fromle32(pair[1]); +} + +static inline void lfs_pair_tole32(lfs_block_t pair[2]) { + pair[0] = lfs_tole32(pair[0]); + pair[1] = lfs_tole32(pair[1]); +} + +// operations on 32-bit entry tags +typedef uint32_t lfs_tag_t; +typedef int32_t lfs_stag_t; + +#define LFS_MKTAG(type, id, size) \ + (((lfs_tag_t)(type) << 20) | ((lfs_tag_t)(id) << 10) | (lfs_tag_t)(size)) + +#define LFS_MKTAG_IF(cond, type, id, size) \ + ((cond) ? LFS_MKTAG(type, id, size) : LFS_MKTAG(LFS_FROM_NOOP, 0, 0)) + +#define LFS_MKTAG_IF_ELSE(cond, type1, id1, size1, type2, id2, size2) \ + ((cond) ? LFS_MKTAG(type1, id1, size1) : LFS_MKTAG(type2, id2, size2)) + +static inline bool lfs_tag_isvalid(lfs_tag_t tag) { + return !(tag & 0x80000000); +} + +static inline bool lfs_tag_isdelete(lfs_tag_t tag) { + return ((int32_t)(tag << 22) >> 22) == -1; +} + +static inline uint16_t lfs_tag_type1(lfs_tag_t tag) { + return (tag & 0x70000000) >> 20; +} + +static inline uint16_t lfs_tag_type3(lfs_tag_t tag) { + return (tag & 0x7ff00000) >> 20; +} + +static inline uint8_t lfs_tag_chunk(lfs_tag_t tag) { + return (tag & 0x0ff00000) >> 20; +} + +static inline int8_t lfs_tag_splice(lfs_tag_t tag) { + return (int8_t)lfs_tag_chunk(tag); +} + +static inline uint16_t lfs_tag_id(lfs_tag_t tag) { + return (tag & 0x000ffc00) >> 10; +} + +static inline lfs_size_t lfs_tag_size(lfs_tag_t tag) { + return tag & 0x000003ff; +} + +static inline lfs_size_t lfs_tag_dsize(lfs_tag_t tag) { + return sizeof(tag) + lfs_tag_size(tag + lfs_tag_isdelete(tag)); +} + +// operations on attributes in attribute lists +struct lfs_mattr { + lfs_tag_t tag; + const void *buffer; +}; + +struct lfs_diskoff { + lfs_block_t block; + lfs_off_t off; +}; + +#define LFS_MKATTRS(...) \ + (struct lfs_mattr[]){__VA_ARGS__}, \ + sizeof((struct lfs_mattr[]){__VA_ARGS__}) / sizeof(struct lfs_mattr) + +// operations on global state +static inline void lfs_gstate_xor(lfs_gstate_t *a, const lfs_gstate_t *b) { + for (int i = 0; i < 3; i++) { + ((uint32_t*)a)[i] ^= ((const uint32_t*)b)[i]; + } +} + +static inline bool lfs_gstate_iszero(const lfs_gstate_t *a) { + for (int i = 0; i < 3; i++) { + if (((uint32_t*)a)[i] != 0) { + return false; + } + } + return true; +} + +static inline bool lfs_gstate_hasorphans(const lfs_gstate_t *a) { + return lfs_tag_size(a->tag); +} + +static inline uint8_t lfs_gstate_getorphans(const lfs_gstate_t *a) { + return lfs_tag_size(a->tag); +} + +static inline bool lfs_gstate_hasmove(const lfs_gstate_t *a) { + return lfs_tag_type1(a->tag); +} + +static inline bool lfs_gstate_hasmovehere(const lfs_gstate_t *a, + const lfs_block_t *pair) { + return lfs_tag_type1(a->tag) && lfs_pair_cmp(a->pair, pair) == 0; +} + +static inline void lfs_gstate_fromle32(lfs_gstate_t *a) { + a->tag = lfs_fromle32(a->tag); + a->pair[0] = lfs_fromle32(a->pair[0]); + a->pair[1] = lfs_fromle32(a->pair[1]); +} + +static inline void lfs_gstate_tole32(lfs_gstate_t *a) { + a->tag = lfs_tole32(a->tag); + a->pair[0] = lfs_tole32(a->pair[0]); + a->pair[1] = lfs_tole32(a->pair[1]); +} + +// other endianness operations +static void lfs_ctz_fromle32(struct lfs_ctz *ctz) { + ctz->head = lfs_fromle32(ctz->head); + ctz->size = lfs_fromle32(ctz->size); +} + +static void lfs_ctz_tole32(struct lfs_ctz *ctz) { + ctz->head = lfs_tole32(ctz->head); + ctz->size = lfs_tole32(ctz->size); +} + +static inline void lfs_superblock_fromle32(lfs_superblock_t *superblock) { + superblock->version = lfs_fromle32(superblock->version); + superblock->block_size = lfs_fromle32(superblock->block_size); + superblock->block_count = lfs_fromle32(superblock->block_count); + superblock->name_max = lfs_fromle32(superblock->name_max); + superblock->file_max = lfs_fromle32(superblock->file_max); + superblock->attr_max = lfs_fromle32(superblock->attr_max); +} + +static inline void lfs_superblock_tole32(lfs_superblock_t *superblock) { + superblock->version = lfs_tole32(superblock->version); + superblock->block_size = lfs_tole32(superblock->block_size); + superblock->block_count = lfs_tole32(superblock->block_count); + superblock->name_max = lfs_tole32(superblock->name_max); + superblock->file_max = lfs_tole32(superblock->file_max); + superblock->attr_max = lfs_tole32(superblock->attr_max); +} + + +/// Internal operations predeclared here /// +static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount); +static int lfs_dir_compact(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t begin, uint16_t end); +static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file); +static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file); +static void lfs_fs_preporphans(lfs_t *lfs, int8_t orphans); +static void lfs_fs_prepmove(lfs_t *lfs, + uint16_t id, const lfs_block_t pair[2]); +static int lfs_fs_pred(lfs_t *lfs, const lfs_block_t dir[2], + lfs_mdir_t *pdir); +static lfs_stag_t lfs_fs_parent(lfs_t *lfs, const lfs_block_t dir[2], + lfs_mdir_t *parent); +static int lfs_fs_relocate(lfs_t *lfs, + const lfs_block_t oldpair[2], lfs_block_t newpair[2]); +int lfs_fs_traverseraw(lfs_t *lfs, + int (*cb)(void *data, lfs_block_t block), void *data, + bool includeorphans); +static int lfs_fs_forceconsistency(lfs_t *lfs); +static int lfs_deinit(lfs_t *lfs); +#ifdef LFS_MIGRATE +static int lfs1_traverse(lfs_t *lfs, + int (*cb)(void*, lfs_block_t), void *data); +#endif + +/// Block allocator /// +static int lfs_alloc_lookahead(void *p, lfs_block_t block) { + lfs_t *lfs = (lfs_t*)p; + lfs_block_t off = ((block - lfs->free.off) + + lfs->cfg->block_count) % lfs->cfg->block_count; + + if (off < lfs->free.size) { + lfs->free.buffer[off / 32] |= 1U << (off % 32); + } + + return 0; +} + +static void lfs_alloc_ack(lfs_t *lfs) { + lfs->free.ack = lfs->cfg->block_count; +} + +// Invalidate the lookahead buffer. This is done during mounting and +// failed traversals +static void lfs_alloc_reset(lfs_t *lfs) { + lfs->free.off = lfs->seed % lfs->cfg->block_count; //lfs->free.off = lfs->seed % lfs->cfg->block_size; + lfs->free.size = 0; + lfs->free.i = 0; + lfs_alloc_ack(lfs); +} + +static int lfs_alloc(lfs_t *lfs, lfs_block_t *block) { + while (true) { + while (lfs->free.i != lfs->free.size) { + lfs_block_t off = lfs->free.i; + lfs->free.i += 1; + lfs->free.ack -= 1; + + if (!(lfs->free.buffer[off / 32] & (1U << (off % 32)))) { + // found a free block + *block = (lfs->free.off + off) % lfs->cfg->block_count; + + // eagerly find next off so an alloc ack can + // discredit old lookahead blocks + while (lfs->free.i != lfs->free.size && + (lfs->free.buffer[lfs->free.i / 32] + & (1U << (lfs->free.i % 32)))) { + lfs->free.i += 1; + lfs->free.ack -= 1; + } + + return 0; + } + } + + // check if we have looked at all blocks since last ack + if (lfs->free.ack == 0) { + LFS_ERROR("No more free space %"PRIu32, + lfs->free.i + lfs->free.off); + return LFS_ERR_NOSPC; + } + + lfs->free.off = (lfs->free.off + lfs->free.size) + % lfs->cfg->block_count; + lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack); + lfs->free.i = 0; + + // find mask of free blocks from tree + memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size); + int err = lfs_fs_traverseraw(lfs, lfs_alloc_lookahead, lfs, true); + if (err) { + lfs_alloc_reset(lfs); + return err; + } + } +} + +/// Metadata pair and directory operations /// +static lfs_stag_t lfs_dir_getslice(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_tag_t gmask, lfs_tag_t gtag, + lfs_off_t goff, void *gbuffer, lfs_size_t gsize) { + lfs_off_t off = dir->off; + lfs_tag_t ntag = dir->etag; + lfs_stag_t gdiff = 0; + + if (lfs_gstate_hasmovehere(&lfs->gdisk, dir->pair) && + lfs_tag_id(gmask) != 0 && + lfs_tag_id(lfs->gdisk.tag) <= lfs_tag_id(gtag)) { + // synthetic moves + gdiff -= LFS_MKTAG(0, 1, 0); + } + + // iterate over dir block backwards (for faster lookups) + while (off >= sizeof(lfs_tag_t) + lfs_tag_dsize(ntag)) { + off -= lfs_tag_dsize(ntag); + lfs_tag_t tag = ntag; + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(ntag), + dir->pair[0], off, &ntag, sizeof(ntag)); + if (err) { + return err; + } + + ntag = (lfs_frombe32(ntag) ^ tag) & 0x7fffffff; + + if (lfs_tag_id(gmask) != 0 && + lfs_tag_type1(tag) == LFS_TYPE_SPLICE && + lfs_tag_id(tag) <= lfs_tag_id(gtag - gdiff)) { + if (tag == (LFS_MKTAG(LFS_TYPE_CREATE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & (gtag - gdiff)))) { + // found where we were created + return LFS_ERR_NOENT; + } + + // move around splices + gdiff += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + + if ((gmask & tag) == (gmask & (gtag - gdiff))) { + if (lfs_tag_isdelete(tag)) { + return LFS_ERR_NOENT; + } + + lfs_size_t diff = lfs_min(lfs_tag_size(tag), gsize); + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, diff, + dir->pair[0], off+sizeof(tag)+goff, gbuffer, diff); + if (err) { + return err; + } + + memset((uint8_t*)gbuffer + diff, 0, gsize - diff); + + return tag + gdiff; + } + } + + return LFS_ERR_NOENT; +} + +static lfs_stag_t lfs_dir_get(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_tag_t gmask, lfs_tag_t gtag, void *buffer) { + return lfs_dir_getslice(lfs, dir, + gmask, gtag, + 0, buffer, lfs_tag_size(gtag)); +} + +static int lfs_dir_getread(lfs_t *lfs, const lfs_mdir_t *dir, + const lfs_cache_t *pcache, lfs_cache_t *rcache, lfs_size_t hint, + lfs_tag_t gmask, lfs_tag_t gtag, + lfs_off_t off, void *buffer, lfs_size_t size) { + uint8_t *data = buffer; + if (off+size > lfs->cfg->block_size) { + return LFS_ERR_CORRUPT; + } + + while (size > 0) { + lfs_size_t diff = size; + + if (pcache && pcache->block == LFS_BLOCK_INLINE && + off < pcache->off + pcache->size) { + if (off >= pcache->off) { + // is already in pcache? + diff = lfs_min(diff, pcache->size - (off-pcache->off)); + memcpy(data, &pcache->buffer[off-pcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // pcache takes priority + diff = lfs_min(diff, pcache->off-off); + } + + if (rcache->block == LFS_BLOCK_INLINE && + off < rcache->off + rcache->size) { + if (off >= rcache->off) { + // is already in rcache? + diff = lfs_min(diff, rcache->size - (off-rcache->off)); + memcpy(data, &rcache->buffer[off-rcache->off], diff); + + data += diff; + off += diff; + size -= diff; + continue; + } + + // rcache takes priority + diff = lfs_min(diff, rcache->off-off); + } + + // load to cache, first condition can no longer fail + rcache->block = LFS_BLOCK_INLINE; + rcache->off = lfs_aligndown(off, lfs->cfg->read_size); + rcache->size = lfs_min(lfs_alignup(off+hint, lfs->cfg->read_size), + lfs->cfg->cache_size); + int err = lfs_dir_getslice(lfs, dir, gmask, gtag, + rcache->off, rcache->buffer, rcache->size); + if (err < 0) { + return err; + } + } + + return 0; +} + +static int lfs_dir_traverse_filter(void *p, + lfs_tag_t tag, const void *buffer) { + lfs_tag_t *filtertag = p; + (void)buffer; + + // which mask depends on unique bit in tag structure + uint32_t mask = (tag & LFS_MKTAG(0x100, 0, 0)) + ? LFS_MKTAG(0x7ff, 0x3ff, 0) + : LFS_MKTAG(0x700, 0x3ff, 0); + + // check for redundancy + if ((mask & tag) == (mask & *filtertag) || + lfs_tag_isdelete(*filtertag) || + (LFS_MKTAG(0x7ff, 0x3ff, 0) & tag) == ( + LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & *filtertag))) { + return true; + } + + // check if we need to adjust for created/deleted tags + if (lfs_tag_type1(tag) == LFS_TYPE_SPLICE && + lfs_tag_id(tag) <= lfs_tag_id(*filtertag)) { + *filtertag += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + + return false; +} + +static int lfs_dir_traverse(lfs_t *lfs, + const lfs_mdir_t *dir, lfs_off_t off, lfs_tag_t ptag, + const struct lfs_mattr *attrs, int attrcount, + lfs_tag_t tmask, lfs_tag_t ttag, + uint16_t begin, uint16_t end, int16_t diff, + int (*cb)(void *data, lfs_tag_t tag, const void *buffer), void *data) { + // iterate over directory and attrs + while (true) { + lfs_tag_t tag; + const void *buffer; + struct lfs_diskoff disk; + if (off+lfs_tag_dsize(ptag) < dir->off) { + off += lfs_tag_dsize(ptag); + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(tag), + dir->pair[0], off, &tag, sizeof(tag)); + if (err) { + return err; + } + + tag = (lfs_frombe32(tag) ^ ptag) | 0x80000000; + disk.block = dir->pair[0]; + disk.off = off+sizeof(lfs_tag_t); + buffer = &disk; + ptag = tag; + } else if (attrcount > 0) { + tag = attrs[0].tag; + buffer = attrs[0].buffer; + attrs += 1; + attrcount -= 1; + } else { + return 0; + } + + lfs_tag_t mask = LFS_MKTAG(0x7ff, 0, 0); + if ((mask & tmask & tag) != (mask & tmask & ttag)) { + continue; + } + + // do we need to filter? inlining the filtering logic here allows + // for some minor optimizations + if (lfs_tag_id(tmask) != 0) { + // scan for duplicates and update tag based on creates/deletes + int filter = lfs_dir_traverse(lfs, + dir, off, ptag, attrs, attrcount, + 0, 0, 0, 0, 0, + lfs_dir_traverse_filter, &tag); + if (filter < 0) { + return filter; + } + + if (filter) { + continue; + } + + // in filter range? + if (!(lfs_tag_id(tag) >= begin && lfs_tag_id(tag) < end)) { + continue; + } + } + + // handle special cases for mcu-side operations + if (lfs_tag_type3(tag) == LFS_FROM_NOOP) { + // do nothing + } else if (lfs_tag_type3(tag) == LFS_FROM_MOVE) { + uint16_t fromid = lfs_tag_size(tag); + uint16_t toid = lfs_tag_id(tag); + int err = lfs_dir_traverse(lfs, + buffer, 0, 0xffffffff, NULL, 0, + LFS_MKTAG(0x600, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, 0, 0), + fromid, fromid+1, toid-fromid+diff, + cb, data); + if (err) { + return err; + } + } else if (lfs_tag_type3(tag) == LFS_FROM_USERATTRS) { + for (unsigned i = 0; i < lfs_tag_size(tag); i++) { + const struct lfs_attr *a = buffer; + int err = cb(data, LFS_MKTAG(LFS_TYPE_USERATTR + a[i].type, + lfs_tag_id(tag) + diff, a[i].size), a[i].buffer); + if (err) { + return err; + } + } + } else { + int err = cb(data, tag + LFS_MKTAG(0, diff, 0), buffer); + if (err) { + return err; + } + } + } +} + +static lfs_stag_t lfs_dir_fetchmatch(lfs_t *lfs, + lfs_mdir_t *dir, const lfs_block_t pair[2], + lfs_tag_t fmask, lfs_tag_t ftag, uint16_t *id, + int (*cb)(void *data, lfs_tag_t tag, const void *buffer), void *data) { + // we can find tag very efficiently during a fetch, since we're already + // scanning the entire directory + lfs_stag_t besttag = -1; + + // if either block address is invalid we return LFS_ERR_CORRUPT here, + // otherwise later writes to the pair could fail + if (pair[0] >= lfs->cfg->block_count || pair[1] >= lfs->cfg->block_count) { + return LFS_ERR_CORRUPT; + } + + // find the block with the most recent revision + uint32_t revs[2] = {0, 0}; + int r = 0; + for (int i = 0; i < 2; i++) { + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(revs[i]), + pair[i], 0, &revs[i], sizeof(revs[i])); + revs[i] = lfs_fromle32(revs[i]); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + if (err != LFS_ERR_CORRUPT && + lfs_scmp(revs[i], revs[(i+1)%2]) > 0) { + r = i; + } + } + + dir->pair[0] = pair[(r+0)%2]; + dir->pair[1] = pair[(r+1)%2]; + dir->rev = revs[(r+0)%2]; + dir->off = 0; // nonzero = found some commits + + // now scan tags to fetch the actual dir and find possible match + for (int i = 0; i < 2; i++) { + lfs_off_t off = 0; + lfs_tag_t ptag = 0xffffffff; + + uint16_t tempcount = 0; + lfs_block_t temptail[2] = {LFS_BLOCK_NULL, LFS_BLOCK_NULL}; + bool tempsplit = false; + lfs_stag_t tempbesttag = besttag; + + dir->rev = lfs_tole32(dir->rev); + uint32_t crc = lfs_crc(0xffffffff, &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + + while (true) { + // extract next tag + lfs_tag_t tag; + off += lfs_tag_dsize(ptag); + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off, &tag, sizeof(tag)); + if (err) { + if (err == LFS_ERR_CORRUPT) { + // can't continue? + dir->erased = false; + break; + } + return err; + } + + crc = lfs_crc(crc, &tag, sizeof(tag)); + tag = lfs_frombe32(tag) ^ ptag; + + // next commit not yet programmed or we're not in valid range + if (!lfs_tag_isvalid(tag)) { + dir->erased = (lfs_tag_type1(ptag) == LFS_TYPE_CRC && + dir->off % lfs->cfg->prog_size == 0); + break; + } else if (off + lfs_tag_dsize(tag) > lfs->cfg->block_size) { + dir->erased = false; + break; + } + + ptag = tag; + + if (lfs_tag_type1(tag) == LFS_TYPE_CRC) { + // check the crc attr + uint32_t dcrc; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), &dcrc, sizeof(dcrc)); + if (err) { + if (err == LFS_ERR_CORRUPT) { + dir->erased = false; + break; + } + return err; + } + dcrc = lfs_fromle32(dcrc); + + if (crc != dcrc) { + dir->erased = false; + break; + } + + // reset the next bit if we need to + ptag ^= (lfs_tag_t)(lfs_tag_chunk(tag) & 1U) << 31; + + // toss our crc into the filesystem seed for + // pseudorandom numbers + lfs->seed ^= crc; + + // update with what's found so far + besttag = tempbesttag; + dir->off = off + lfs_tag_dsize(tag); + dir->etag = ptag; + dir->count = tempcount; + dir->tail[0] = temptail[0]; + dir->tail[1] = temptail[1]; + dir->split = tempsplit; + + // reset crc + crc = 0xffffffff; + continue; + } + + // crc the entry first, hopefully leaving it in the cache + for (lfs_off_t j = sizeof(tag); j < lfs_tag_dsize(tag); j++) { + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+j, &dat, 1); + if (err) { + if (err == LFS_ERR_CORRUPT) { + dir->erased = false; + break; + } + return err; + } + + crc = lfs_crc(crc, &dat, 1); + } + + // directory modification tags? + if (lfs_tag_type1(tag) == LFS_TYPE_NAME) { + // increase count of files if necessary + if (lfs_tag_id(tag) >= tempcount) { + tempcount = lfs_tag_id(tag) + 1; + } + } else if (lfs_tag_type1(tag) == LFS_TYPE_SPLICE) { + tempcount += lfs_tag_splice(tag); + + if (tag == (LFS_MKTAG(LFS_TYPE_DELETE, 0, 0) | + (LFS_MKTAG(0, 0x3ff, 0) & tempbesttag))) { + tempbesttag |= 0x80000000; + } else if (tempbesttag != -1 && + lfs_tag_id(tag) <= lfs_tag_id(tempbesttag)) { + tempbesttag += LFS_MKTAG(0, lfs_tag_splice(tag), 0); + } + } else if (lfs_tag_type1(tag) == LFS_TYPE_TAIL) { + tempsplit = (lfs_tag_chunk(tag) & 1); + + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, lfs->cfg->block_size, + dir->pair[0], off+sizeof(tag), &temptail, 8); + if (err) { + if (err == LFS_ERR_CORRUPT) { + dir->erased = false; + break; + } + } + lfs_pair_fromle32(temptail); + } + + // found a match for our fetcher? + if ((fmask & tag) == (fmask & ftag)) { + int res = cb(data, tag, &(struct lfs_diskoff){ + dir->pair[0], off+sizeof(tag)}); + if (res < 0) { + if (res == LFS_ERR_CORRUPT) { + dir->erased = false; + break; + } + return res; + } + + if (res == LFS_CMP_EQ) { + // found a match + tempbesttag = tag; + } else if ((LFS_MKTAG(0x7ff, 0x3ff, 0) & tag) == + (LFS_MKTAG(0x7ff, 0x3ff, 0) & tempbesttag)) { + // found an identical tag, but contents didn't match + // this must mean that our besttag has been overwritten + tempbesttag = -1; + } else if (res == LFS_CMP_GT && + lfs_tag_id(tag) <= lfs_tag_id(tempbesttag)) { + // found a greater match, keep track to keep things sorted + tempbesttag = tag | 0x80000000; + } + } + } + + // consider what we have good enough + if (dir->off > 0) { + // synthetic move + if (lfs_gstate_hasmovehere(&lfs->gdisk, dir->pair)) { + if (lfs_tag_id(lfs->gdisk.tag) == lfs_tag_id(besttag)) { + besttag |= 0x80000000; + } else if (besttag != -1 && + lfs_tag_id(lfs->gdisk.tag) < lfs_tag_id(besttag)) { + besttag -= LFS_MKTAG(0, 1, 0); + } + } + + // found tag? or found best id? + if (id) { + *id = lfs_min(lfs_tag_id(besttag), dir->count); + } + + if (lfs_tag_isvalid(besttag)) { + return besttag; + } else if (lfs_tag_id(besttag) < dir->count) { + return LFS_ERR_NOENT; + } else { + return 0; + } + } + + // failed, try the other block? + lfs_pair_swap(dir->pair); + dir->rev = revs[(r+1)%2]; + } + + LFS_ERROR("Corrupted dir pair at {0x%"PRIx32", 0x%"PRIx32"}", + dir->pair[0], dir->pair[1]); + return LFS_ERR_CORRUPT; +} + +static int lfs_dir_fetch(lfs_t *lfs, + lfs_mdir_t *dir, const lfs_block_t pair[2]) { + // note, mask=-1, tag=-1 can never match a tag since this + // pattern has the invalid bit set + return (int)lfs_dir_fetchmatch(lfs, dir, pair, + (lfs_tag_t)-1, (lfs_tag_t)-1, NULL, NULL, NULL); +} + +static int lfs_dir_getgstate(lfs_t *lfs, const lfs_mdir_t *dir, + lfs_gstate_t *gstate) { + lfs_gstate_t temp; + lfs_stag_t res = lfs_dir_get(lfs, dir, LFS_MKTAG(0x7ff, 0, 0), + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0, sizeof(temp)), &temp); + if (res < 0 && res != LFS_ERR_NOENT) { + return res; + } + + if (res != LFS_ERR_NOENT) { + // xor together to find resulting gstate + lfs_gstate_fromle32(&temp); + lfs_gstate_xor(gstate, &temp); + } + + return 0; +} + +static int lfs_dir_getinfo(lfs_t *lfs, lfs_mdir_t *dir, + uint16_t id, struct lfs_info *info) { + if (id == 0x3ff) { + // special case for root + strcpy(info->name, "/"); + info->type = LFS_TYPE_DIR; + return 0; + } + + lfs_stag_t tag = lfs_dir_get(lfs, dir, LFS_MKTAG(0x780, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, id, lfs->name_max+1), info->name); + if (tag < 0) { + return (int)tag; + } + + info->type = lfs_tag_type3(tag); + + struct lfs_ctz ctz; + tag = lfs_dir_get(lfs, dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, id, sizeof(ctz)), &ctz); + if (tag < 0) { + return (int)tag; + } + lfs_ctz_fromle32(&ctz); + + if (lfs_tag_type3(tag) == LFS_TYPE_CTZSTRUCT) { + info->size = ctz.size; + } else if (lfs_tag_type3(tag) == LFS_TYPE_INLINESTRUCT) { + info->size = lfs_tag_size(tag); + } + + return 0; +} + +struct lfs_dir_find_match { + lfs_t *lfs; + const void *name; + lfs_size_t size; +}; + +static int lfs_dir_find_match(void *data, + lfs_tag_t tag, const void *buffer) { + struct lfs_dir_find_match *name = data; + lfs_t *lfs = name->lfs; + const struct lfs_diskoff *disk = buffer; + + // compare with disk + lfs_size_t diff = lfs_min(name->size, lfs_tag_size(tag)); + int res = lfs_bd_cmp(lfs, + NULL, &lfs->rcache, diff, + disk->block, disk->off, name->name, diff); + if (res != LFS_CMP_EQ) { + return res; + } + + // only equal if our size is still the same + if (name->size != lfs_tag_size(tag)) { + return (name->size < lfs_tag_size(tag)) ? LFS_CMP_LT : LFS_CMP_GT; + } + + // found a match! + return LFS_CMP_EQ; +} + +static lfs_stag_t lfs_dir_find(lfs_t *lfs, lfs_mdir_t *dir, + const char **path, uint16_t *id) { + // we reduce path to a single name if we can find it + const char *name = *path; + if (id) { + *id = 0x3ff; + } + + // default to root dir + lfs_stag_t tag = LFS_MKTAG(LFS_TYPE_DIR, 0x3ff, 0); + dir->tail[0] = lfs->root[0]; + dir->tail[1] = lfs->root[1]; + + while (true) { +nextname: + // skip slashes + name += strspn(name, "/"); + lfs_size_t namelen = strcspn(name, "/"); + + // skip '.' and root '..' + if ((namelen == 1 && memcmp(name, ".", 1) == 0) || + (namelen == 2 && memcmp(name, "..", 2) == 0)) { + name += namelen; + goto nextname; + } + + // skip if matched by '..' in name + const char *suffix = name + namelen; + lfs_size_t sufflen; + int depth = 1; + while (true) { + suffix += strspn(suffix, "/"); + sufflen = strcspn(suffix, "/"); + if (sufflen == 0) { + break; + } + + if (sufflen == 2 && memcmp(suffix, "..", 2) == 0) { + depth -= 1; + if (depth == 0) { + name = suffix + sufflen; + goto nextname; + } + } else { + depth += 1; + } + + suffix += sufflen; + } + + // found path + if (name[0] == '\0') { + return tag; + } + + // update what we've found so far + *path = name; + + // only continue if we hit a directory + if (lfs_tag_type3(tag) != LFS_TYPE_DIR) { + return LFS_ERR_NOTDIR; + } + + // grab the entry data + if (lfs_tag_id(tag) != 0x3ff) { + lfs_stag_t res = lfs_dir_get(lfs, dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), dir->tail); + if (res < 0) { + return res; + } + lfs_pair_fromle32(dir->tail); + } + + // find entry matching name + while (true) { + tag = lfs_dir_fetchmatch(lfs, dir, dir->tail, + LFS_MKTAG(0x780, 0, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, namelen), + // are we last name? + (strchr(name, '/') == NULL) ? id : NULL, + lfs_dir_find_match, &(struct lfs_dir_find_match){ + lfs, name, namelen}); + if (tag < 0) { + return tag; + } + + if (tag) { + break; + } + + if (!dir->split) { + return LFS_ERR_NOENT; + } + } + + // to next name + name += namelen; + } +} + +// commit logic +struct lfs_commit { + lfs_block_t block; + lfs_off_t off; + lfs_tag_t ptag; + uint32_t crc; + + lfs_off_t begin; + lfs_off_t end; +}; + +static int lfs_dir_commitprog(lfs_t *lfs, struct lfs_commit *commit, + const void *buffer, lfs_size_t size) { + int err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, false, + commit->block, commit->off , + (const uint8_t*)buffer, size); + if (err) { + return err; + } + + commit->crc = lfs_crc(commit->crc, buffer, size); + commit->off += size; + return 0; +} + +static int lfs_dir_commitattr(lfs_t *lfs, struct lfs_commit *commit, + lfs_tag_t tag, const void *buffer) { + // check if we fit + lfs_size_t dsize = lfs_tag_dsize(tag); + if (commit->off + dsize > commit->end) { + return LFS_ERR_NOSPC; + } + + // write out tag + lfs_tag_t ntag = lfs_tobe32((tag & 0x7fffffff) ^ commit->ptag); + int err = lfs_dir_commitprog(lfs, commit, &ntag, sizeof(ntag)); + if (err) { + return err; + } + + if (!(tag & 0x80000000)) { + // from memory + err = lfs_dir_commitprog(lfs, commit, buffer, dsize-sizeof(tag)); + if (err) { + return err; + } + } else { + // from disk + const struct lfs_diskoff *disk = buffer; + for (lfs_off_t i = 0; i < dsize-sizeof(tag); i++) { + // rely on caching to make this efficient + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, dsize-sizeof(tag)-i, + disk->block, disk->off+i, &dat, 1); + if (err) { + return err; + } + + err = lfs_dir_commitprog(lfs, commit, &dat, 1); + if (err) { + return err; + } + } + } + + commit->ptag = tag & 0x7fffffff; + return 0; +} + +static int lfs_dir_commitcrc(lfs_t *lfs, struct lfs_commit *commit) { + const lfs_off_t off1 = commit->off; + const uint32_t crc1 = commit->crc; + // align to program units + const lfs_off_t end = lfs_alignup(off1 + 2*sizeof(uint32_t), + lfs->cfg->prog_size); + + // create crc tags to fill up remainder of commit, note that + // padding is not crced, which lets fetches skip padding but + // makes committing a bit more complicated + while (commit->off < end) { + lfs_off_t off = commit->off + sizeof(lfs_tag_t); + lfs_off_t noff = lfs_min(end - off, 0x3fe) + off; + if (noff < end) { + noff = lfs_min(noff, end - 2*sizeof(uint32_t)); + } + + // read erased state from next program unit + lfs_tag_t tag = 0xffffffff; + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(tag), + commit->block, noff, &tag, sizeof(tag)); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + // build crc tag + bool reset = ~lfs_frombe32(tag) >> 31; + tag = LFS_MKTAG(LFS_TYPE_CRC + reset, 0x3ff, noff - off); + + // write out crc + uint32_t footer[2]; + footer[0] = lfs_tobe32(tag ^ commit->ptag); + commit->crc = lfs_crc(commit->crc, &footer[0], sizeof(footer[0])); + footer[1] = lfs_tole32(commit->crc); + err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, false, + commit->block, commit->off, &footer, sizeof(footer)); + if (err) { + return err; + } + + commit->off += sizeof(tag)+lfs_tag_size(tag); + commit->ptag = tag ^ ((lfs_tag_t)reset << 31); + commit->crc = 0xffffffff; // reset crc for next "commit" + } + + // flush buffers + int err = lfs_bd_sync(lfs, &lfs->pcache, &lfs->rcache, false); + if (err) { + return err; + } + + // successful commit, check checksums to make sure + lfs_off_t off = commit->begin; + lfs_off_t noff = off1 + sizeof(uint32_t); + while (off < end) { + uint32_t crc = 0xffffffff; + for (lfs_off_t i = off; i < noff+sizeof(uint32_t); i++) { + // check against written crc, may catch blocks that + // become readonly and match our commit size exactly + if (i == off1 && crc != crc1) { + return LFS_ERR_CORRUPT; + } + + // leave it up to caching to make this efficient + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, noff+sizeof(uint32_t)-i, + commit->block, i, &dat, 1); + if (err) { + return err; + } + + crc = lfs_crc(crc, &dat, 1); + } + + // detected write error? + if (crc != 0) { + return LFS_ERR_CORRUPT; + } + + // skip padding + off = lfs_min(end - noff, 0x3fe) + noff; + if (off < end) { + off = lfs_min(off, end - 2*sizeof(uint32_t)); + } + noff = off + sizeof(uint32_t); + } + + return 0; +} + +static int lfs_dir_alloc(lfs_t *lfs, lfs_mdir_t *dir) { + // allocate pair of dir blocks (backwards, so we write block 1 first) + for (int i = 0; i < 2; i++) { + int err = lfs_alloc(lfs, &dir->pair[(i+1)%2]); + if (err) { + return err; + } + } + + // zero for reproducability in case initial block is unreadable + dir->rev = 0; + + // rather than clobbering one of the blocks we just pretend + // the revision may be valid + int err = lfs_bd_read(lfs, + NULL, &lfs->rcache, sizeof(dir->rev), + dir->pair[0], 0, &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + if (err && err != LFS_ERR_CORRUPT) { + return err; + } + + // make sure we don't immediately evict + dir->rev += dir->rev & 1; + + // set defaults + dir->off = sizeof(dir->rev); + dir->etag = 0xffffffff; + dir->count = 0; + dir->tail[0] = LFS_BLOCK_NULL; + dir->tail[1] = LFS_BLOCK_NULL; + dir->erased = false; + dir->split = false; + + // don't write out yet, let caller take care of that + return 0; +} + +static int lfs_dir_drop(lfs_t *lfs, lfs_mdir_t *dir, lfs_mdir_t *tail) { + // steal state + int err = lfs_dir_getgstate(lfs, tail, &lfs->gdelta); + if (err) { + return err; + } + + // steal tail + lfs_pair_tole32(tail->tail); + err = lfs_dir_commit(lfs, dir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_TAIL + tail->split, 0x3ff, 8), tail->tail})); + lfs_pair_fromle32(tail->tail); + if (err) { + return err; + } + + return 0; +} + +static int lfs_dir_split(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t split, uint16_t end) { + // create tail directory + lfs_alloc_ack(lfs); + lfs_mdir_t tail; + int err = lfs_dir_alloc(lfs, &tail); + if (err) { + return err; + } + + tail.split = dir->split; + tail.tail[0] = dir->tail[0]; + tail.tail[1] = dir->tail[1]; + + err = lfs_dir_compact(lfs, &tail, attrs, attrcount, source, split, end); + if (err) { + return err; + } + + dir->tail[0] = tail.pair[0]; + dir->tail[1] = tail.pair[1]; + dir->split = true; + + // update root if needed + if (lfs_pair_cmp(dir->pair, lfs->root) == 0 && split == 0) { + lfs->root[0] = tail.pair[0]; + lfs->root[1] = tail.pair[1]; + } + + return 0; +} + +static int lfs_dir_commit_size(void *p, lfs_tag_t tag, const void *buffer) { + lfs_size_t *size = p; + (void)buffer; + + *size += lfs_tag_dsize(tag); + return 0; +} + +struct lfs_dir_commit_commit { + lfs_t *lfs; + struct lfs_commit *commit; +}; + +static int lfs_dir_commit_commit(void *p, lfs_tag_t tag, const void *buffer) { + struct lfs_dir_commit_commit *commit = p; + return lfs_dir_commitattr(commit->lfs, commit->commit, tag, buffer); +} + +static int lfs_dir_compact(lfs_t *lfs, + lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount, + lfs_mdir_t *source, uint16_t begin, uint16_t end) { + // save some state in case block is bad + const lfs_block_t oldpair[2] = {dir->pair[0], dir->pair[1]}; + bool relocated = false; + bool tired = false; + + // should we split? + while (end - begin > 1) { + // find size + lfs_size_t size = 0; + int err = lfs_dir_traverse(lfs, + source, 0, 0xffffffff, attrs, attrcount, + LFS_MKTAG(0x400, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, 0), + begin, end, -begin, + lfs_dir_commit_size, &size); + if (err) { + return err; + } + + // space is complicated, we need room for tail, crc, gstate, + // cleanup delete, and we cap at half a block to give room + // for metadata updates. + if (end - begin < 0xff && + size <= lfs_min(lfs->cfg->block_size - 36, + lfs_alignup(lfs->cfg->block_size/2, + lfs->cfg->prog_size))) { + break; + } + + // can't fit, need to split, we should really be finding the + // largest size that fits with a small binary search, but right now + // it's not worth the code size + uint16_t split = (end - begin) / 2; + err = lfs_dir_split(lfs, dir, attrs, attrcount, + source, begin+split, end); + if (err) { + // if we fail to split, we may be able to overcompact, unless + // we're too big for even the full block, in which case our + // only option is to error + if (err == LFS_ERR_NOSPC && size <= lfs->cfg->block_size - 36) { + break; + } + return err; + } + + end = begin + split; + } + + // increment revision count + dir->rev += 1; + // If our revision count == n * block_cycles, we should force a relocation, + // this is how littlefs wear-levels at the metadata-pair level. Note that we + // actually use (block_cycles+1)|1, this is to avoid two corner cases: + // 1. block_cycles = 1, which would prevent relocations from terminating + // 2. block_cycles = 2n, which, due to aliasing, would only ever relocate + // one metadata block in the pair, effectively making this useless + if (lfs->cfg->block_cycles > 0 && + (dir->rev % ((lfs->cfg->block_cycles+1)|1) == 0)) { + if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { + // oh no! we're writing too much to the superblock, + // should we expand? + lfs_ssize_t res = lfs_fs_size(lfs); + if (res < 0) { + return res; + } + + // do we have extra space? littlefs can't reclaim this space + // by itself, so expand cautiously + if ((lfs_size_t)res < lfs->cfg->block_count/2) { + LFS_DEBUG("Expanding superblock at rev %"PRIu32, dir->rev); + int err = lfs_dir_split(lfs, dir, attrs, attrcount, + source, begin, end); + if (err && err != LFS_ERR_NOSPC) { + return err; + } + + // welp, we tried, if we ran out of space there's not much + // we can do, we'll error later if we've become frozen + if (!err) { + end = begin; + } + } +#ifdef LFS_MIGRATE + } else if (lfs->lfs1) { + // do not proactively relocate blocks during migrations, this + // can cause a number of failure states such: clobbering the + // v1 superblock if we relocate root, and invalidating directory + // pointers if we relocate the head of a directory. On top of + // this, relocations increase the overall complexity of + // lfs_migration, which is already a delicate operation. +#endif + } else { + // we're writing too much, time to relocate + tired = true; + goto relocate; + } + } + + // begin loop to commit compaction to blocks until a compact sticks + while (true) { + { + // setup commit state + struct lfs_commit commit = { + .block = dir->pair[1], + .off = 0, + .ptag = 0xffffffff, + .crc = 0xffffffff, + + .begin = 0, + .end = lfs->cfg->block_size - 8, + }; + + // erase block to write to + int err = lfs_bd_erase(lfs, dir->pair[1]); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // write out header + dir->rev = lfs_tole32(dir->rev); + err = lfs_dir_commitprog(lfs, &commit, + &dir->rev, sizeof(dir->rev)); + dir->rev = lfs_fromle32(dir->rev); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // traverse the directory, this time writing out all unique tags + err = lfs_dir_traverse(lfs, + source, 0, 0xffffffff, attrs, attrcount, + LFS_MKTAG(0x400, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_NAME, 0, 0), + begin, end, -begin, + lfs_dir_commit_commit, &(struct lfs_dir_commit_commit){ + lfs, &commit}); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // commit tail, which may be new after last size check + if (!lfs_pair_isnull(dir->tail)) { + lfs_pair_tole32(dir->tail); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_TAIL + dir->split, 0x3ff, 8), + dir->tail); + lfs_pair_fromle32(dir->tail); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // bring over gstate? + lfs_gstate_t delta = {0}; + if (!relocated) { + lfs_gstate_xor(&delta, &lfs->gdisk); + lfs_gstate_xor(&delta, &lfs->gstate); + } + lfs_gstate_xor(&delta, &lfs->gdelta); + delta.tag &= ~LFS_MKTAG(0, 0, 0x3ff); + + err = lfs_dir_getgstate(lfs, dir, &delta); + if (err) { + return err; + } + + if (!lfs_gstate_iszero(&delta)) { + lfs_gstate_tole32(&delta); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0x3ff, + sizeof(delta)), &delta); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // complete commit with crc + err = lfs_dir_commitcrc(lfs, &commit); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // successful compaction, swap dir pair to indicate most recent + LFS_ASSERT(commit.off % lfs->cfg->prog_size == 0); + lfs_pair_swap(dir->pair); + dir->count = end - begin; + dir->off = commit.off; + dir->etag = commit.ptag; + // update gstate + lfs->gdelta = (lfs_gstate_t){0}; + if (!relocated) { + lfs->gdisk = lfs->gstate; + } + } + break; + +relocate: + // commit was corrupted, drop caches and prepare to relocate block + relocated = true; + lfs_cache_drop(lfs, &lfs->pcache); + if (!tired) { + LFS_DEBUG("Bad block at 0x%"PRIx32, dir->pair[1]); + } + + // can't relocate superblock, filesystem is now frozen + if (lfs_pair_cmp(dir->pair, (const lfs_block_t[2]){0, 1}) == 0) { + LFS_WARN("Superblock 0x%"PRIx32" has become unwritable", + dir->pair[1]); + return LFS_ERR_NOSPC; + } + + // relocate half of pair + int err = lfs_alloc(lfs, &dir->pair[1]); + if (err && (err != LFS_ERR_NOSPC || !tired)) { + return err; + } + + tired = false; + continue; + } + + if (relocated) { + // update references if we relocated + LFS_DEBUG("Relocating {0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + oldpair[0], oldpair[1], dir->pair[0], dir->pair[1]); + int err = lfs_fs_relocate(lfs, oldpair, dir->pair); + if (err) { + return err; + } + } + + return 0; +} + +static int lfs_dir_commit(lfs_t *lfs, lfs_mdir_t *dir, + const struct lfs_mattr *attrs, int attrcount) { + // check for any inline files that aren't RAM backed and + // forcefully evict them, needed for filesystem consistency + for (lfs_file_t *f = (lfs_file_t*)lfs->mlist; f; f = f->next) { + if (dir != &f->m && lfs_pair_cmp(f->m.pair, dir->pair) == 0 && + f->type == LFS_TYPE_REG && (f->flags & LFS_F_INLINE) && + f->ctz.size > lfs->cfg->cache_size) { + int err = lfs_file_outline(lfs, f); + if (err) { + return err; + } + + err = lfs_file_flush(lfs, f); + if (err) { + return err; + } + } + } + + // calculate changes to the directory + lfs_mdir_t olddir = *dir; + bool hasdelete = false; + for (int i = 0; i < attrcount; i++) { + if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_CREATE) { + dir->count += 1; + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE) { + LFS_ASSERT(dir->count > 0); + dir->count -= 1; + hasdelete = true; + } else if (lfs_tag_type1(attrs[i].tag) == LFS_TYPE_TAIL) { + dir->tail[0] = ((lfs_block_t*)attrs[i].buffer)[0]; + dir->tail[1] = ((lfs_block_t*)attrs[i].buffer)[1]; + dir->split = (lfs_tag_chunk(attrs[i].tag) & 1); + lfs_pair_fromle32(dir->tail); + } + } + + // should we actually drop the directory block? + if (hasdelete && dir->count == 0) { + lfs_mdir_t pdir; + int err = lfs_fs_pred(lfs, dir->pair, &pdir); + if (err && err != LFS_ERR_NOENT) { + *dir = olddir; + return err; + } + + if (err != LFS_ERR_NOENT && pdir.split) { + err = lfs_dir_drop(lfs, &pdir, dir); + if (err) { + *dir = olddir; + return err; + } + } + } + + if (dir->erased || dir->count >= 0xff) { + // try to commit + struct lfs_commit commit = { + .block = dir->pair[0], + .off = dir->off, + .ptag = dir->etag, + .crc = 0xffffffff, + + .begin = dir->off, + .end = lfs->cfg->block_size - 8, + }; + + // traverse attrs that need to be written out + lfs_pair_tole32(dir->tail); + int err = lfs_dir_traverse(lfs, + dir, dir->off, dir->etag, attrs, attrcount, + 0, 0, 0, 0, 0, + lfs_dir_commit_commit, &(struct lfs_dir_commit_commit){ + lfs, &commit}); + lfs_pair_fromle32(dir->tail); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + *dir = olddir; + return err; + } + + // commit any global diffs if we have any + lfs_gstate_t delta = {0}; + lfs_gstate_xor(&delta, &lfs->gstate); + lfs_gstate_xor(&delta, &lfs->gdisk); + lfs_gstate_xor(&delta, &lfs->gdelta); + delta.tag &= ~LFS_MKTAG(0, 0, 0x3ff); + if (!lfs_gstate_iszero(&delta)) { + err = lfs_dir_getgstate(lfs, dir, &delta); + if (err) { + *dir = olddir; + return err; + } + + lfs_gstate_tole32(&delta); + err = lfs_dir_commitattr(lfs, &commit, + LFS_MKTAG(LFS_TYPE_MOVESTATE, 0x3ff, + sizeof(delta)), &delta); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + *dir = olddir; + return err; + } + } + + // finalize commit with the crc + err = lfs_dir_commitcrc(lfs, &commit); + if (err) { + if (err == LFS_ERR_NOSPC || err == LFS_ERR_CORRUPT) { + goto compact; + } + *dir = olddir; + return err; + } + + // successful commit, update dir + LFS_ASSERT(commit.off % lfs->cfg->prog_size == 0); + dir->off = commit.off; + dir->etag = commit.ptag; + // and update gstate + lfs->gdisk = lfs->gstate; + lfs->gdelta = (lfs_gstate_t){0}; + } else { +compact: + // fall back to compaction + lfs_cache_drop(lfs, &lfs->pcache); + + int err = lfs_dir_compact(lfs, dir, attrs, attrcount, + dir, 0, dir->count); + if (err) { + *dir = olddir; + return err; + } + } + + // this complicated bit of logic is for fixing up any active + // metadata-pairs that we may have affected + // + // note we have to make two passes since the mdir passed to + // lfs_dir_commit could also be in this list, and even then + // we need to copy the pair so they don't get clobbered if we refetch + // our mdir. + for (struct lfs_mlist *d = lfs->mlist; d; d = d->next) { + if (&d->m != dir && lfs_pair_cmp(d->m.pair, olddir.pair) == 0) { + d->m = *dir; + for (int i = 0; i < attrcount; i++) { + if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE && + d->id == lfs_tag_id(attrs[i].tag)) { + d->m.pair[0] = LFS_BLOCK_NULL; + d->m.pair[1] = LFS_BLOCK_NULL; + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_DELETE && + d->id > lfs_tag_id(attrs[i].tag)) { + d->id -= 1; + if (d->type == LFS_TYPE_DIR) { + ((lfs_dir_t*)d)->pos -= 1; + } + } else if (lfs_tag_type3(attrs[i].tag) == LFS_TYPE_CREATE && + d->id >= lfs_tag_id(attrs[i].tag)) { + d->id += 1; + if (d->type == LFS_TYPE_DIR) { + ((lfs_dir_t*)d)->pos += 1; + } + } + } + } + } + + for (struct lfs_mlist *d = lfs->mlist; d; d = d->next) { + if (lfs_pair_cmp(d->m.pair, olddir.pair) == 0) { + while (d->id >= d->m.count && d->m.split) { + // we split and id is on tail now + d->id -= d->m.count; + int err = lfs_dir_fetch(lfs, &d->m, d->m.tail); + if (err) { + return err; + } + } + } + } + + return 0; +} + + +/// Top level directory operations /// +int lfs_mkdir(lfs_t *lfs, const char *path) { + LFS_TRACE("lfs_mkdir(%p, \"%s\")", (void*)lfs, path); + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + + struct lfs_mlist cwd; + cwd.next = lfs->mlist; + uint16_t id; + err = lfs_dir_find(lfs, &cwd.m, &path, &id); + if (!(err == LFS_ERR_NOENT && id != 0x3ff)) { + LFS_TRACE("lfs_mkdir -> %d", (err < 0) ? err : LFS_ERR_EXIST); + return (err < 0) ? err : LFS_ERR_EXIST; + } + + // check that name fits + lfs_size_t nlen = strlen(path); + if (nlen > lfs->name_max) { + LFS_TRACE("lfs_mkdir -> %d", LFS_ERR_NAMETOOLONG); + return LFS_ERR_NAMETOOLONG; + } + + // build up new directory + lfs_alloc_ack(lfs); + lfs_mdir_t dir; + err = lfs_dir_alloc(lfs, &dir); + if (err) { + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + + // find end of list + lfs_mdir_t pred = cwd.m; + while (pred.split) { + err = lfs_dir_fetch(lfs, &pred, pred.tail); + if (err) { + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + } + + // setup dir + lfs_pair_tole32(pred.tail); + err = lfs_dir_commit(lfs, &dir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), pred.tail})); + lfs_pair_fromle32(pred.tail); + if (err) { + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + + // current block end of list? + if (cwd.m.split) { + // update tails, this creates a desync + lfs_fs_preporphans(lfs, +1); + + // it's possible our predecessor has to be relocated, and if + // our parent is our predecessor's predecessor, this could have + // caused our parent to go out of date, fortunately we can hook + // ourselves into littlefs to catch this + cwd.type = 0; + cwd.id = 0; + lfs->mlist = &cwd; + + lfs_pair_tole32(dir.pair); + err = lfs_dir_commit(lfs, &pred, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir.pair})); + lfs_pair_fromle32(dir.pair); + if (err) { + lfs->mlist = cwd.next; + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + + lfs->mlist = cwd.next; + lfs_fs_preporphans(lfs, -1); + } + + // now insert into our parent block + lfs_pair_tole32(dir.pair); + err = lfs_dir_commit(lfs, &cwd.m, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, id, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_DIR, id, nlen), path}, + {LFS_MKTAG(LFS_TYPE_DIRSTRUCT, id, 8), dir.pair}, + {LFS_MKTAG_IF(!cwd.m.split, + LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir.pair})); + lfs_pair_fromle32(dir.pair); + if (err) { + LFS_TRACE("lfs_mkdir -> %d", err); + return err; + } + + LFS_TRACE("lfs_mkdir -> %d", 0); + return 0; +} + +int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path) { + LFS_TRACE("lfs_dir_open(%p, %p, \"%s\")", (void*)lfs, (void*)dir, path); + lfs_stag_t tag = lfs_dir_find(lfs, &dir->m, &path, NULL); + if (tag < 0) { + LFS_TRACE("lfs_dir_open -> %"PRId32, tag); + return tag; + } + + if (lfs_tag_type3(tag) != LFS_TYPE_DIR) { + LFS_TRACE("lfs_dir_open -> %d", LFS_ERR_NOTDIR); + return LFS_ERR_NOTDIR; + } + + lfs_block_t pair[2]; + if (lfs_tag_id(tag) == 0x3ff) { + // handle root dir separately + pair[0] = lfs->root[0]; + pair[1] = lfs->root[1]; + } else { + // get dir pair from parent + lfs_stag_t res = lfs_dir_get(lfs, &dir->m, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), pair); + if (res < 0) { + LFS_TRACE("lfs_dir_open -> %"PRId32, res); + return res; + } + lfs_pair_fromle32(pair); + } + + // fetch first pair + int err = lfs_dir_fetch(lfs, &dir->m, pair); + if (err) { + LFS_TRACE("lfs_dir_open -> %d", err); + return err; + } + + // setup entry + dir->head[0] = dir->m.pair[0]; + dir->head[1] = dir->m.pair[1]; + dir->id = 0; + dir->pos = 0; + + // add to list of mdirs + dir->type = LFS_TYPE_DIR; + dir->next = (lfs_dir_t*)lfs->mlist; + lfs->mlist = (struct lfs_mlist*)dir; + + LFS_TRACE("lfs_dir_open -> %d", 0); + return 0; +} + +int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir) { + LFS_TRACE("lfs_dir_close(%p, %p)", (void*)lfs, (void*)dir); + // remove from list of mdirs + for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { + if (*p == (struct lfs_mlist*)dir) { + *p = (*p)->next; + break; + } + } + + LFS_TRACE("lfs_dir_close -> %d", 0); + return 0; +} + +int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info) { + LFS_TRACE("lfs_dir_read(%p, %p, %p)", + (void*)lfs, (void*)dir, (void*)info); + memset(info, 0, sizeof(*info)); + + // special offset for '.' and '..' + if (dir->pos == 0) { + info->type = LFS_TYPE_DIR; + strcpy(info->name, "."); + dir->pos += 1; + LFS_TRACE("lfs_dir_read -> %d", true); + return true; + } else if (dir->pos == 1) { + info->type = LFS_TYPE_DIR; + strcpy(info->name, ".."); + dir->pos += 1; + LFS_TRACE("lfs_dir_read -> %d", true); + return true; + } + + while (true) { + if (dir->id == dir->m.count) { + if (!dir->m.split) { + LFS_TRACE("lfs_dir_read -> %d", false); + return false; + } + + int err = lfs_dir_fetch(lfs, &dir->m, dir->m.tail); + if (err) { + LFS_TRACE("lfs_dir_read -> %d", err); + return err; + } + + dir->id = 0; + } + + int err = lfs_dir_getinfo(lfs, &dir->m, dir->id, info); + if (err && err != LFS_ERR_NOENT) { + LFS_TRACE("lfs_dir_read -> %d", err); + return err; + } + + dir->id += 1; + if (err != LFS_ERR_NOENT) { + break; + } + } + + dir->pos += 1; + LFS_TRACE("lfs_dir_read -> %d", true); + return true; +} + +int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off) { + LFS_TRACE("lfs_dir_seek(%p, %p, %"PRIu32")", + (void*)lfs, (void*)dir, off); + // simply walk from head dir + int err = lfs_dir_rewind(lfs, dir); + if (err) { + LFS_TRACE("lfs_dir_seek -> %d", err); + return err; + } + + // first two for ./.. + dir->pos = lfs_min(2, off); + off -= dir->pos; + + // skip superblock entry + dir->id = (off > 0 && lfs_pair_cmp(dir->head, lfs->root) == 0); + + while (off > 0) { + int diff = lfs_min(dir->m.count - dir->id, off); + dir->id += diff; + dir->pos += diff; + off -= diff; + + if (dir->id == dir->m.count) { + if (!dir->m.split) { + LFS_TRACE("lfs_dir_seek -> %d", LFS_ERR_INVAL); + return LFS_ERR_INVAL; + } + + err = lfs_dir_fetch(lfs, &dir->m, dir->m.tail); + if (err) { + LFS_TRACE("lfs_dir_seek -> %d", err); + return err; + } + + dir->id = 0; + } + } + + LFS_TRACE("lfs_dir_seek -> %d", 0); + return 0; +} + +lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir) { + LFS_TRACE("lfs_dir_tell(%p, %p)", (void*)lfs, (void*)dir); + (void)lfs; + LFS_TRACE("lfs_dir_tell -> %"PRId32, dir->pos); + return dir->pos; +} + +int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir) { + LFS_TRACE("lfs_dir_rewind(%p, %p)", (void*)lfs, (void*)dir); + // reload the head dir + int err = lfs_dir_fetch(lfs, &dir->m, dir->head); + if (err) { + LFS_TRACE("lfs_dir_rewind -> %d", err); + return err; + } + + dir->id = 0; + dir->pos = 0; + LFS_TRACE("lfs_dir_rewind -> %d", 0); + return 0; +} + + +/// File index list operations /// +static int lfs_ctz_index(lfs_t *lfs, lfs_off_t *off) { + lfs_off_t size = *off; + lfs_off_t b = lfs->cfg->block_size - 2*4; + lfs_off_t i = size / b; + if (i == 0) { + return 0; + } + + i = (size - 4*(lfs_popc(i-1)+2)) / b; + *off = size - b*i - 4*lfs_popc(i); + return i; +} + +static int lfs_ctz_find(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + lfs_size_t pos, lfs_block_t *block, lfs_off_t *off) { + if (size == 0) { + *block = LFS_BLOCK_NULL; + *off = 0; + return 0; + } + + lfs_off_t current = lfs_ctz_index(lfs, &(lfs_off_t){size-1}); + lfs_off_t target = lfs_ctz_index(lfs, &pos); + + while (current > target) { + lfs_size_t skip = lfs_min( + lfs_npw2(current-target+1) - 1, + lfs_ctz(current)); + + int err = lfs_bd_read(lfs, + pcache, rcache, sizeof(head), + head, 4*skip, &head, sizeof(head)); + head = lfs_fromle32(head); + if (err) { + return err; + } + + current -= 1 << skip; + } + + *block = head; + *off = pos; + return 0; +} + +static int lfs_ctz_extend(lfs_t *lfs, + lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + lfs_block_t *block, lfs_off_t *off) { + while (true) { + // go ahead and grab a block + lfs_block_t nblock; + int err = lfs_alloc(lfs, &nblock); + if (err) { + return err; + } + + { + err = lfs_bd_erase(lfs, nblock); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + if (size == 0) { + *block = nblock; + *off = 0; + return 0; + } + + lfs_size_t noff = size - 1; + lfs_off_t index = lfs_ctz_index(lfs, &noff); + noff = noff + 1; + + // just copy out the last block if it is incomplete + if (noff != lfs->cfg->block_size) { + for (lfs_off_t i = 0; i < noff; i++) { + uint8_t data; + err = lfs_bd_read(lfs, + NULL, rcache, noff-i, + head, i, &data, 1); + if (err) { + return err; + } + + err = lfs_bd_prog(lfs, + pcache, rcache, true, + nblock, i, &data, 1); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + *block = nblock; + *off = noff; + return 0; + } + + // append block + index += 1; + lfs_size_t skips = lfs_ctz(index) + 1; + lfs_block_t nhead = head; + for (lfs_off_t i = 0; i < skips; i++) { + nhead = lfs_tole32(nhead); + err = lfs_bd_prog(lfs, pcache, rcache, true, + nblock, 4*i, &nhead, 4); + nhead = lfs_fromle32(nhead); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + if (i != skips-1) { + err = lfs_bd_read(lfs, + NULL, rcache, sizeof(nhead), + nhead, 4*i, &nhead, sizeof(nhead)); + nhead = lfs_fromle32(nhead); + if (err) { + return err; + } + } + } + + *block = nblock; + *off = 4*skips; + return 0; + } + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, nblock); + + // just clear cache and try a new block + lfs_cache_drop(lfs, pcache); + } +} + +static int lfs_ctz_traverse(lfs_t *lfs, + const lfs_cache_t *pcache, lfs_cache_t *rcache, + lfs_block_t head, lfs_size_t size, + int (*cb)(void*, lfs_block_t), void *data) { + if (size == 0) { + return 0; + } + + lfs_off_t index = lfs_ctz_index(lfs, &(lfs_off_t){size-1}); + + while (true) { + int err = cb(data, head); + if (err) { + return err; + } + + if (index == 0) { + return 0; + } + + lfs_block_t heads[2]; + int count = 2 - (index & 1); + err = lfs_bd_read(lfs, + pcache, rcache, count*sizeof(head), + head, 0, &heads, count*sizeof(head)); + heads[0] = lfs_fromle32(heads[0]); + heads[1] = lfs_fromle32(heads[1]); + if (err) { + return err; + } + + for (int i = 0; i < count-1; i++) { + err = cb(data, heads[i]); + if (err) { + return err; + } + } + + head = heads[count-1]; + index -= count; + } +} + + +/// Top level file operations /// +int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags, + const struct lfs_file_config *cfg) { + LFS_TRACE("lfs_file_opencfg(%p, %p, \"%s\", %x, %p {" + ".buffer=%p, .attrs=%p, .attr_count=%"PRIu32"})", + (void*)lfs, (void*)file, path, flags, + (void*)cfg, cfg->buffer, (void*)cfg->attrs, cfg->attr_count); + + // deorphan if we haven't yet, needed at most once after poweron + if ((flags & 3) != LFS_O_RDONLY) { + int err = lfs_fs_forceconsistency(lfs); + if (err) { + LFS_TRACE("lfs_file_opencfg -> %d", err); + return err; + } + } + + // setup simple file details + int err; + file->cfg = cfg; + file->flags = flags | LFS_F_OPENED; + file->pos = 0; + file->off = 0; + file->cache.buffer = NULL; + + // allocate entry for file if it doesn't exist + lfs_stag_t tag = lfs_dir_find(lfs, &file->m, &path, &file->id); + if (tag < 0 && !(tag == LFS_ERR_NOENT && file->id != 0x3ff)) { + err = tag; + goto cleanup; + } + + // get id, add to list of mdirs to catch update changes + file->type = LFS_TYPE_REG; + file->next = (lfs_file_t*)lfs->mlist; + lfs->mlist = (struct lfs_mlist*)file; + + if (tag == LFS_ERR_NOENT) { + if (!(flags & LFS_O_CREAT)) { + err = LFS_ERR_NOENT; + goto cleanup; + } + + // check that name fits + lfs_size_t nlen = strlen(path); + if (nlen > lfs->name_max) { + err = LFS_ERR_NAMETOOLONG; + goto cleanup; + } + + // get next slot and create entry to remember name + err = lfs_dir_commit(lfs, &file->m, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, file->id, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_REG, file->id, nlen), path}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), NULL})); + if (err) { + err = LFS_ERR_NAMETOOLONG; + goto cleanup; + } + + tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, 0); + } else if (flags & LFS_O_EXCL) { + err = LFS_ERR_EXIST; + goto cleanup; + } else if (lfs_tag_type3(tag) != LFS_TYPE_REG) { + err = LFS_ERR_ISDIR; + goto cleanup; + } else if (flags & LFS_O_TRUNC) { + // truncate if requested + tag = LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0); + file->flags |= LFS_F_DIRTY; + } else { + // try to load what's on disk, if it's inlined we'll fix it later + tag = lfs_dir_get(lfs, &file->m, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, file->id, 8), &file->ctz); + if (tag < 0) { + err = tag; + goto cleanup; + } + lfs_ctz_fromle32(&file->ctz); + } + + // fetch attrs + for (unsigned i = 0; i < file->cfg->attr_count; i++) { + if ((file->flags & 3) != LFS_O_WRONLY) { + lfs_stag_t res = lfs_dir_get(lfs, &file->m, + LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_USERATTR + file->cfg->attrs[i].type, + file->id, file->cfg->attrs[i].size), + file->cfg->attrs[i].buffer); + if (res < 0 && res != LFS_ERR_NOENT) { + err = res; + goto cleanup; + } + } + + if ((file->flags & 3) != LFS_O_RDONLY) { + if (file->cfg->attrs[i].size > lfs->attr_max) { + err = LFS_ERR_NOSPC; + goto cleanup; + } + + file->flags |= LFS_F_DIRTY; + } + } + + // allocate buffer if needed + if (file->cfg->buffer) { + file->cache.buffer = file->cfg->buffer; + } else { + file->cache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!file->cache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // zero to avoid information leak + lfs_cache_zero(lfs, &file->cache); + + if (lfs_tag_type3(tag) == LFS_TYPE_INLINESTRUCT) { + // load inline files + file->ctz.head = LFS_BLOCK_INLINE; + file->ctz.size = lfs_tag_size(tag); + file->flags |= LFS_F_INLINE; + file->cache.block = file->ctz.head; + file->cache.off = 0; + file->cache.size = lfs->cfg->cache_size; + + // don't always read (may be new/trunc file) + if (file->ctz.size > 0) { + lfs_stag_t res = lfs_dir_get(lfs, &file->m, + LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, file->id, + lfs_min(file->cache.size, 0x3fe)), + file->cache.buffer); + if (res < 0) { + err = res; + goto cleanup; + } + } + } + + LFS_TRACE("lfs_file_opencfg -> %d", 0); + return 0; + +cleanup: + // clean up lingering resources + file->flags |= LFS_F_ERRED; + lfs_file_close(lfs, file); + LFS_TRACE("lfs_file_opencfg -> %d", err); + return err; +} + +int lfs_file_open(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags) { + LFS_TRACE("lfs_file_open(%p, %p, \"%s\", %x)", + (void*)lfs, (void*)file, path, flags); + static const struct lfs_file_config defaults = {0}; + int err = lfs_file_opencfg(lfs, file, path, flags, &defaults); + LFS_TRACE("lfs_file_open -> %d", err); + return err; +} + +int lfs_file_close(lfs_t *lfs, lfs_file_t *file) { + LFS_TRACE("lfs_file_close(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(file->flags & LFS_F_OPENED); + + int err = lfs_file_sync(lfs, file); + + // remove from list of mdirs + for (struct lfs_mlist **p = &lfs->mlist; *p; p = &(*p)->next) { + if (*p == (struct lfs_mlist*)file) { + *p = (*p)->next; + break; + } + } + + // clean up memory + if (!file->cfg->buffer) { + lfs_free(file->cache.buffer); + } + + file->flags &= ~LFS_F_OPENED; + LFS_TRACE("lfs_file_close -> %d", err); + return err; +} + +static int lfs_file_relocate(lfs_t *lfs, lfs_file_t *file) { + LFS_ASSERT(file->flags & LFS_F_OPENED); + + while (true) { + // just relocate what exists into new block + lfs_block_t nblock; + int err = lfs_alloc(lfs, &nblock); + if (err) { + return err; + } + + err = lfs_bd_erase(lfs, nblock); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + // either read from dirty cache or disk + for (lfs_off_t i = 0; i < file->off; i++) { + uint8_t data; + if (file->flags & LFS_F_INLINE) { + err = lfs_dir_getread(lfs, &file->m, + // note we evict inline files before they can be dirty + NULL, &file->cache, file->off-i, + LFS_MKTAG(0xfff, 0x1ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), + i, &data, 1); + if (err) { + return err; + } + } else { + err = lfs_bd_read(lfs, + &file->cache, &lfs->rcache, file->off-i, + file->block, i, &data, 1); + if (err) { + return err; + } + } + + err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, true, + nblock, i, &data, 1); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + } + + // copy over new state of file + memcpy(file->cache.buffer, lfs->pcache.buffer, lfs->cfg->cache_size); + file->cache.block = lfs->pcache.block; + file->cache.off = lfs->pcache.off; + file->cache.size = lfs->pcache.size; + lfs_cache_zero(lfs, &lfs->pcache); + + file->block = nblock; + file->flags |= LFS_F_WRITING; + return 0; + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, nblock); + + // just clear cache and try a new block + lfs_cache_drop(lfs, &lfs->pcache); + } +} + +static int lfs_file_outline(lfs_t *lfs, lfs_file_t *file) { + file->off = file->pos; + lfs_alloc_ack(lfs); + int err = lfs_file_relocate(lfs, file); + if (err) { + return err; + } + + file->flags &= ~LFS_F_INLINE; + return 0; +} + +static int lfs_file_flush(lfs_t *lfs, lfs_file_t *file) { + LFS_ASSERT(file->flags & LFS_F_OPENED); + + if (file->flags & LFS_F_READING) { + if (!(file->flags & LFS_F_INLINE)) { + lfs_cache_drop(lfs, &file->cache); + } + file->flags &= ~LFS_F_READING; + } + + if (file->flags & LFS_F_WRITING) { + lfs_off_t pos = file->pos; + + if (!(file->flags & LFS_F_INLINE)) { + // copy over anything after current branch + lfs_file_t orig = { + .ctz.head = file->ctz.head, + .ctz.size = file->ctz.size, + .flags = LFS_O_RDONLY | LFS_F_OPENED, + .pos = file->pos, + .cache = lfs->rcache, + }; + lfs_cache_drop(lfs, &lfs->rcache); + + while (file->pos < file->ctz.size) { + // copy over a byte at a time, leave it up to caching + // to make this efficient + uint8_t data; + lfs_ssize_t res = lfs_file_read(lfs, &orig, &data, 1); + if (res < 0) { + return res; + } + + res = lfs_file_write(lfs, file, &data, 1); + if (res < 0) { + return res; + } + + // keep our reference to the rcache in sync + if (lfs->rcache.block != LFS_BLOCK_NULL) { + lfs_cache_drop(lfs, &orig.cache); + lfs_cache_drop(lfs, &lfs->rcache); + } + } + + // write out what we have + while (true) { + int err = lfs_bd_flush(lfs, &file->cache, &lfs->rcache, true); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + return err; + } + + break; + +relocate: + LFS_DEBUG("Bad block at 0x%"PRIx32, file->block); + err = lfs_file_relocate(lfs, file); + if (err) { + return err; + } + } + } else { + file->pos = lfs_max(file->pos, file->ctz.size); + } + + // actual file updates + file->ctz.head = file->block; + file->ctz.size = file->pos; + file->flags &= ~LFS_F_WRITING; + file->flags |= LFS_F_DIRTY; + + file->pos = pos; + } + + return 0; +} + +int lfs_file_sync(lfs_t *lfs, lfs_file_t *file) { + LFS_TRACE("lfs_file_sync(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(file->flags & LFS_F_OPENED); + + if (file->flags & LFS_F_ERRED) { + // it's not safe to do anything if our file errored + LFS_TRACE("lfs_file_sync -> %d", 0); + return 0; + } + + int err = lfs_file_flush(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_sync -> %d", err); + return err; + } + + if ((file->flags & LFS_F_DIRTY) && + !lfs_pair_isnull(file->m.pair)) { + // update dir entry + uint16_t type; + const void *buffer; + lfs_size_t size; + struct lfs_ctz ctz; + if (file->flags & LFS_F_INLINE) { + // inline the whole file + type = LFS_TYPE_INLINESTRUCT; + buffer = file->cache.buffer; + size = file->ctz.size; + } else { + // update the ctz reference + type = LFS_TYPE_CTZSTRUCT; + // copy ctz so alloc will work during a relocate + ctz = file->ctz; + lfs_ctz_tole32(&ctz); + buffer = &ctz; + size = sizeof(ctz); + } + + // commit file data and attributes + err = lfs_dir_commit(lfs, &file->m, LFS_MKATTRS( + {LFS_MKTAG(type, file->id, size), buffer}, + {LFS_MKTAG(LFS_FROM_USERATTRS, file->id, + file->cfg->attr_count), file->cfg->attrs})); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_sync -> %d", err); + return err; + } + + file->flags &= ~LFS_F_DIRTY; + } + + LFS_TRACE("lfs_file_sync -> %d", 0); + return 0; +} + +lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size) { + LFS_TRACE("lfs_file_read(%p, %p, %p, %"PRIu32")", + (void*)lfs, (void*)file, buffer, size); + LFS_ASSERT(file->flags & LFS_F_OPENED); + LFS_ASSERT((file->flags & 3) != LFS_O_WRONLY); + + uint8_t *data = buffer; + lfs_size_t nsize = size; + + if (file->flags & LFS_F_WRITING) { + // flush out any writes + int err = lfs_file_flush(lfs, file); + if (err) { + LFS_TRACE("lfs_file_read -> %d", err); + return err; + } + } + + if (file->pos >= file->ctz.size) { + // eof if past end + LFS_TRACE("lfs_file_read -> %d", 0); + return 0; + } + + size = lfs_min(size, file->ctz.size - file->pos); + nsize = size; + + while (nsize > 0) { + // check if we need a new block + if (!(file->flags & LFS_F_READING) || + file->off == lfs->cfg->block_size) { + if (!(file->flags & LFS_F_INLINE)) { + int err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + file->pos, &file->block, &file->off); + if (err) { + LFS_TRACE("lfs_file_read -> %d", err); + return err; + } + } else { + file->block = LFS_BLOCK_INLINE; + file->off = file->pos; + } + + file->flags |= LFS_F_READING; + } + + // read as much as we can in current block + lfs_size_t diff = lfs_min(nsize, lfs->cfg->block_size - file->off); + if (file->flags & LFS_F_INLINE) { + int err = lfs_dir_getread(lfs, &file->m, + NULL, &file->cache, lfs->cfg->block_size, + LFS_MKTAG(0xfff, 0x1ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, file->id, 0), + file->off, data, diff); + if (err) { + LFS_TRACE("lfs_file_read -> %d", err); + return err; + } + } else { + int err = lfs_bd_read(lfs, + NULL, &file->cache, lfs->cfg->block_size, + file->block, file->off, data, diff); + if (err) { + LFS_TRACE("lfs_file_read -> %d", err); + return err; + } + } + + file->pos += diff; + file->off += diff; + data += diff; + nsize -= diff; + } + + LFS_TRACE("lfs_file_read -> %"PRId32, size); + return size; +} + +lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size) { + LFS_TRACE("lfs_file_write(%p, %p, %p, %"PRIu32")", + (void*)lfs, (void*)file, buffer, size); + LFS_ASSERT(file->flags & LFS_F_OPENED); + LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); + + const uint8_t *data = buffer; + lfs_size_t nsize = size; + + if (file->flags & LFS_F_READING) { + // drop any reads + int err = lfs_file_flush(lfs, file); + if (err) { + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + } + + if ((file->flags & LFS_O_APPEND) && file->pos < file->ctz.size) { + file->pos = file->ctz.size; + } + + if (file->pos + size > lfs->file_max) { + // Larger than file limit? + LFS_TRACE("lfs_file_write -> %d", LFS_ERR_FBIG); + return LFS_ERR_FBIG; + } + + if (!(file->flags & LFS_F_WRITING) && file->pos > file->ctz.size) { + // fill with zeros + lfs_off_t pos = file->pos; + file->pos = file->ctz.size; + + while (file->pos < pos) { + lfs_ssize_t res = lfs_file_write(lfs, file, &(uint8_t){0}, 1); + if (res < 0) { + LFS_TRACE("lfs_file_write -> %"PRId32, res); + return res; + } + } + } + + if ((file->flags & LFS_F_INLINE) && + lfs_max(file->pos+nsize, file->ctz.size) > + lfs_min(0x3fe, lfs_min( + lfs->cfg->cache_size, lfs->cfg->block_size/8))) { + // inline file doesn't fit anymore + int err = lfs_file_outline(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + } + + while (nsize > 0) { + // check if we need a new block + if (!(file->flags & LFS_F_WRITING) || + file->off == lfs->cfg->block_size) { + if (!(file->flags & LFS_F_INLINE)) { + if (!(file->flags & LFS_F_WRITING) && file->pos > 0) { + // find out which block we're extending from + int err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + file->pos-1, &file->block, &file->off); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + + // mark cache as dirty since we may have read data into it + lfs_cache_zero(lfs, &file->cache); + } + + // extend file with new blocks + lfs_alloc_ack(lfs); + int err = lfs_ctz_extend(lfs, &file->cache, &lfs->rcache, + file->block, file->pos, + &file->block, &file->off); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + } else { + file->block = LFS_BLOCK_INLINE; + file->off = file->pos; + } + + file->flags |= LFS_F_WRITING; + } + + // program as much as we can in current block + lfs_size_t diff = lfs_min(nsize, lfs->cfg->block_size - file->off); + while (true) { + int err = lfs_bd_prog(lfs, &file->cache, &lfs->rcache, true, + file->block, file->off, data, diff); + if (err) { + if (err == LFS_ERR_CORRUPT) { + goto relocate; + } + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + + break; +relocate: + err = lfs_file_relocate(lfs, file); + if (err) { + file->flags |= LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %d", err); + return err; + } + } + + file->pos += diff; + file->off += diff; + data += diff; + nsize -= diff; + + lfs_alloc_ack(lfs); + } + + file->flags &= ~LFS_F_ERRED; + LFS_TRACE("lfs_file_write -> %"PRId32, size); + return size; +} + +lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, + lfs_soff_t off, int whence) { + LFS_TRACE("lfs_file_seek(%p, %p, %"PRId32", %d)", + (void*)lfs, (void*)file, off, whence); + LFS_ASSERT(file->flags & LFS_F_OPENED); + + // write out everything beforehand, may be noop if rdonly + int err = lfs_file_flush(lfs, file); + if (err) { + LFS_TRACE("lfs_file_seek -> %d", err); + return err; + } + + // find new pos + lfs_off_t npos = file->pos; + if (whence == LFS_SEEK_SET) { + npos = off; + } else if (whence == LFS_SEEK_CUR) { + npos = file->pos + off; + } else if (whence == LFS_SEEK_END) { + npos = file->ctz.size + off; + } + + if (npos > lfs->file_max) { + // file position out of range + LFS_TRACE("lfs_file_seek -> %d", LFS_ERR_INVAL); + return LFS_ERR_INVAL; + } + + // update pos + file->pos = npos; + LFS_TRACE("lfs_file_seek -> %"PRId32, npos); + return npos; +} + +int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size) { + LFS_TRACE("lfs_file_truncate(%p, %p, %"PRIu32")", + (void*)lfs, (void*)file, size); + LFS_ASSERT(file->flags & LFS_F_OPENED); + LFS_ASSERT((file->flags & 3) != LFS_O_RDONLY); + + if (size > LFS_FILE_MAX) { + LFS_TRACE("lfs_file_truncate -> %d", LFS_ERR_INVAL); + return LFS_ERR_INVAL; + } + + lfs_off_t pos = file->pos; + lfs_off_t oldsize = lfs_file_size(lfs, file); + if (size < oldsize) { + // need to flush since directly changing metadata + int err = lfs_file_flush(lfs, file); + if (err) { + LFS_TRACE("lfs_file_truncate -> %d", err); + return err; + } + + // lookup new head in ctz skip list + err = lfs_ctz_find(lfs, NULL, &file->cache, + file->ctz.head, file->ctz.size, + size, &file->block, &file->off); + if (err) { + LFS_TRACE("lfs_file_truncate -> %d", err); + return err; + } + + file->ctz.head = file->block; + file->ctz.size = size; + file->flags |= LFS_F_DIRTY | LFS_F_READING; + } else if (size > oldsize) { + // flush+seek if not already at end + if (file->pos != oldsize) { + lfs_soff_t res = lfs_file_seek(lfs, file, 0, LFS_SEEK_END); + if (res < 0) { + LFS_TRACE("lfs_file_truncate -> %"PRId32, res); + return (int)res; + } + } + + // fill with zeros + while (file->pos < size) { + lfs_ssize_t res = lfs_file_write(lfs, file, &(uint8_t){0}, 1); + if (res < 0) { + LFS_TRACE("lfs_file_truncate -> %"PRId32, res); + return (int)res; + } + } + } + + // restore pos + lfs_soff_t res = lfs_file_seek(lfs, file, pos, LFS_SEEK_SET); + if (res < 0) { + LFS_TRACE("lfs_file_truncate -> %"PRId32, res); + return (int)res; + } + + LFS_TRACE("lfs_file_truncate -> %d", 0); + return 0; +} + +lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file) { + LFS_TRACE("lfs_file_tell(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(file->flags & LFS_F_OPENED); + (void)lfs; + LFS_TRACE("lfs_file_tell -> %"PRId32, file->pos); + return file->pos; +} + +int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file) { + LFS_TRACE("lfs_file_rewind(%p, %p)", (void*)lfs, (void*)file); + lfs_soff_t res = lfs_file_seek(lfs, file, 0, LFS_SEEK_SET); + if (res < 0) { + LFS_TRACE("lfs_file_rewind -> %"PRId32, res); + return (int)res; + } + + LFS_TRACE("lfs_file_rewind -> %d", 0); + return 0; +} + +lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file) { + LFS_TRACE("lfs_file_size(%p, %p)", (void*)lfs, (void*)file); + LFS_ASSERT(file->flags & LFS_F_OPENED); + (void)lfs; + if (file->flags & LFS_F_WRITING) { + LFS_TRACE("lfs_file_size -> %"PRId32, + lfs_max(file->pos, file->ctz.size)); + return lfs_max(file->pos, file->ctz.size); + } else { + LFS_TRACE("lfs_file_size -> %"PRId32, file->ctz.size); + return file->ctz.size; + } +} + + +/// General fs operations /// +int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info) { + LFS_TRACE("lfs_stat(%p, \"%s\", %p)", (void*)lfs, path, (void*)info); + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + LFS_TRACE("lfs_stat -> %"PRId32, tag); + return (int)tag; + } + + int err = lfs_dir_getinfo(lfs, &cwd, lfs_tag_id(tag), info); + LFS_TRACE("lfs_stat -> %d", err); + return err; +} + +int lfs_remove(lfs_t *lfs, const char *path) { + LFS_TRACE("lfs_remove(%p, \"%s\")", (void*)lfs, path); + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + LFS_TRACE("lfs_remove -> %d", err); + return err; + } + + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0 || lfs_tag_id(tag) == 0x3ff) { + LFS_TRACE("lfs_remove -> %"PRId32, (tag < 0) ? tag : LFS_ERR_INVAL); + return (tag < 0) ? (int)tag : LFS_ERR_INVAL; + } + + struct lfs_mlist dir; + dir.next = lfs->mlist; + if (lfs_tag_type3(tag) == LFS_TYPE_DIR) { + // must be empty before removal + lfs_block_t pair[2]; + lfs_stag_t res = lfs_dir_get(lfs, &cwd, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, lfs_tag_id(tag), 8), pair); + if (res < 0) { + LFS_TRACE("lfs_remove -> %"PRId32, res); + return (int)res; + } + lfs_pair_fromle32(pair); + + err = lfs_dir_fetch(lfs, &dir.m, pair); + if (err) { + LFS_TRACE("lfs_remove -> %d", err); + return err; + } + + if (dir.m.count > 0 || dir.m.split) { + LFS_TRACE("lfs_remove -> %d", LFS_ERR_NOTEMPTY); + return LFS_ERR_NOTEMPTY; + } + + // mark fs as orphaned + lfs_fs_preporphans(lfs, +1); + + // I know it's crazy but yes, dir can be changed by our parent's + // commit (if predecessor is child) + dir.type = 0; + dir.id = 0; + lfs->mlist = &dir; + } + + // delete the entry + err = lfs_dir_commit(lfs, &cwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(tag), 0), NULL})); + if (err) { + lfs->mlist = dir.next; + LFS_TRACE("lfs_remove -> %d", err); + return err; + } + + lfs->mlist = dir.next; + if (lfs_tag_type3(tag) == LFS_TYPE_DIR) { + // fix orphan + lfs_fs_preporphans(lfs, -1); + + err = lfs_fs_pred(lfs, dir.m.pair, &cwd); + if (err) { + LFS_TRACE("lfs_remove -> %d", err); + return err; + } + + err = lfs_dir_drop(lfs, &cwd, &dir.m); + if (err) { + LFS_TRACE("lfs_remove -> %d", err); + return err; + } + } + + LFS_TRACE("lfs_remove -> %d", 0); + return 0; +} + +int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath) { + LFS_TRACE("lfs_rename(%p, \"%s\", \"%s\")", (void*)lfs, oldpath, newpath); + + // deorphan if we haven't yet, needed at most once after poweron + int err = lfs_fs_forceconsistency(lfs); + if (err) { + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + + // find old entry + lfs_mdir_t oldcwd; + lfs_stag_t oldtag = lfs_dir_find(lfs, &oldcwd, &oldpath, NULL); + if (oldtag < 0 || lfs_tag_id(oldtag) == 0x3ff) { + LFS_TRACE("lfs_rename -> %"PRId32, + (oldtag < 0) ? oldtag : LFS_ERR_INVAL); + return (oldtag < 0) ? (int)oldtag : LFS_ERR_INVAL; + } + + // find new entry + lfs_mdir_t newcwd; + uint16_t newid; + lfs_stag_t prevtag = lfs_dir_find(lfs, &newcwd, &newpath, &newid); + if ((prevtag < 0 || lfs_tag_id(prevtag) == 0x3ff) && + !(prevtag == LFS_ERR_NOENT && newid != 0x3ff)) { + LFS_TRACE("lfs_rename -> %"PRId32, + (prevtag < 0) ? prevtag : LFS_ERR_INVAL); + return (prevtag < 0) ? (int)prevtag : LFS_ERR_INVAL; + } + + // if we're in the same pair there's a few special cases... + bool samepair = (lfs_pair_cmp(oldcwd.pair, newcwd.pair) == 0); + uint16_t newoldid = lfs_tag_id(oldtag); + + struct lfs_mlist prevdir; + prevdir.next = lfs->mlist; + if (prevtag == LFS_ERR_NOENT) { + // check that name fits + lfs_size_t nlen = strlen(newpath); + if (nlen > lfs->name_max) { + LFS_TRACE("lfs_rename -> %d", LFS_ERR_NAMETOOLONG); + return LFS_ERR_NAMETOOLONG; + } + + // there is a small chance we are being renamed in the same + // directory/ to an id less than our old id, the global update + // to handle this is a bit messy + if (samepair && newid <= newoldid) { + newoldid += 1; + } + } else if (lfs_tag_type3(prevtag) != lfs_tag_type3(oldtag)) { + LFS_TRACE("lfs_rename -> %d", LFS_ERR_ISDIR); + return LFS_ERR_ISDIR; + } else if (samepair && newid == newoldid) { + // we're renaming to ourselves?? + LFS_TRACE("lfs_rename -> %d", 0); + return 0; + } else if (lfs_tag_type3(prevtag) == LFS_TYPE_DIR) { + // must be empty before removal + lfs_block_t prevpair[2]; + lfs_stag_t res = lfs_dir_get(lfs, &newcwd, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, newid, 8), prevpair); + if (res < 0) { + LFS_TRACE("lfs_rename -> %"PRId32, res); + return (int)res; + } + lfs_pair_fromle32(prevpair); + + // must be empty before removal + err = lfs_dir_fetch(lfs, &prevdir.m, prevpair); + if (err) { + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + + if (prevdir.m.count > 0 || prevdir.m.split) { + LFS_TRACE("lfs_rename -> %d", LFS_ERR_NOTEMPTY); + return LFS_ERR_NOTEMPTY; + } + + // mark fs as orphaned + lfs_fs_preporphans(lfs, +1); + + // I know it's crazy but yes, dir can be changed by our parent's + // commit (if predecessor is child) + prevdir.type = 0; + prevdir.id = 0; + lfs->mlist = &prevdir; + } + + if (!samepair) { + lfs_fs_prepmove(lfs, newoldid, oldcwd.pair); + } + + // move over all attributes + err = lfs_dir_commit(lfs, &newcwd, LFS_MKATTRS( + {LFS_MKTAG_IF(prevtag != LFS_ERR_NOENT, + LFS_TYPE_DELETE, newid, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_CREATE, newid, 0), NULL}, + {LFS_MKTAG(lfs_tag_type3(oldtag), newid, strlen(newpath)), newpath}, + {LFS_MKTAG(LFS_FROM_MOVE, newid, lfs_tag_id(oldtag)), &oldcwd}, + {LFS_MKTAG_IF(samepair, + LFS_TYPE_DELETE, newoldid, 0), NULL})); + if (err) { + lfs->mlist = prevdir.next; + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + + // let commit clean up after move (if we're different! otherwise move + // logic already fixed it for us) + if (!samepair && lfs_gstate_hasmove(&lfs->gstate)) { + // prep gstate and delete move id + lfs_fs_prepmove(lfs, 0x3ff, NULL); + err = lfs_dir_commit(lfs, &oldcwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, lfs_tag_id(oldtag), 0), NULL})); + if (err) { + lfs->mlist = prevdir.next; + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + } + + lfs->mlist = prevdir.next; + if (prevtag != LFS_ERR_NOENT && lfs_tag_type3(prevtag) == LFS_TYPE_DIR) { + // fix orphan + lfs_fs_preporphans(lfs, -1); + + err = lfs_fs_pred(lfs, prevdir.m.pair, &newcwd); + if (err) { + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + + err = lfs_dir_drop(lfs, &newcwd, &prevdir.m); + if (err) { + LFS_TRACE("lfs_rename -> %d", err); + return err; + } + } + + LFS_TRACE("lfs_rename -> %d", 0); + return 0; +} + +lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, + uint8_t type, void *buffer, lfs_size_t size) { + LFS_TRACE("lfs_getattr(%p, \"%s\", %"PRIu8", %p, %"PRIu32")", + (void*)lfs, path, type, buffer, size); + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + LFS_TRACE("lfs_getattr -> %"PRId32, tag); + return tag; + } + + uint16_t id = lfs_tag_id(tag); + if (id == 0x3ff) { + // special case for root + id = 0; + int err = lfs_dir_fetch(lfs, &cwd, lfs->root); + if (err) { + LFS_TRACE("lfs_getattr -> %d", err); + return err; + } + } + + tag = lfs_dir_get(lfs, &cwd, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_USERATTR + type, + id, lfs_min(size, lfs->attr_max)), + buffer); + if (tag < 0) { + if (tag == LFS_ERR_NOENT) { + LFS_TRACE("lfs_getattr -> %d", LFS_ERR_NOATTR); + return LFS_ERR_NOATTR; + } + + LFS_TRACE("lfs_getattr -> %"PRId32, tag); + return tag; + } + + size = lfs_tag_size(tag); + LFS_TRACE("lfs_getattr -> %"PRId32, size); + return size; +} + +static int lfs_commitattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size) { + lfs_mdir_t cwd; + lfs_stag_t tag = lfs_dir_find(lfs, &cwd, &path, NULL); + if (tag < 0) { + return tag; + } + + uint16_t id = lfs_tag_id(tag); + if (id == 0x3ff) { + // special case for root + id = 0; + int err = lfs_dir_fetch(lfs, &cwd, lfs->root); + if (err) { + return err; + } + } + + return lfs_dir_commit(lfs, &cwd, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_USERATTR + type, id, size), buffer})); +} + +int lfs_setattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size) { + LFS_TRACE("lfs_setattr(%p, \"%s\", %"PRIu8", %p, %"PRIu32")", + (void*)lfs, path, type, buffer, size); + if (size > lfs->attr_max) { + LFS_TRACE("lfs_setattr -> %d", LFS_ERR_NOSPC); + return LFS_ERR_NOSPC; + } + + int err = lfs_commitattr(lfs, path, type, buffer, size); + LFS_TRACE("lfs_setattr -> %d", err); + return err; +} + +int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type) { + LFS_TRACE("lfs_removeattr(%p, \"%s\", %"PRIu8")", (void*)lfs, path, type); + int err = lfs_commitattr(lfs, path, type, NULL, 0x3ff); + LFS_TRACE("lfs_removeattr -> %d", err); + return err; +} + + +/// Filesystem operations /// +static int lfs_init(lfs_t *lfs, const struct lfs_config *cfg) { + lfs->cfg = cfg; + int err = 0; + + // validate that the lfs-cfg sizes were initiated properly before + // performing any arithmetic logics with them + LFS_ASSERT(lfs->cfg->read_size != 0); + LFS_ASSERT(lfs->cfg->prog_size != 0); + LFS_ASSERT(lfs->cfg->cache_size != 0); + + // check that block size is a multiple of cache size is a multiple + // of prog and read sizes + LFS_ASSERT(lfs->cfg->cache_size % lfs->cfg->read_size == 0); + LFS_ASSERT(lfs->cfg->cache_size % lfs->cfg->prog_size == 0); + LFS_ASSERT(lfs->cfg->block_size % lfs->cfg->cache_size == 0); + + // check that the block size is large enough to fit ctz pointers + LFS_ASSERT(4*lfs_npw2(0xffffffff / (lfs->cfg->block_size-2*4)) + <= lfs->cfg->block_size); + + // block_cycles = 0 is no longer supported. + // + // block_cycles is the number of erase cycles before littlefs evicts + // metadata logs as a part of wear leveling. Suggested values are in the + // range of 100-1000, or set block_cycles to -1 to disable block-level + // wear-leveling. + LFS_ASSERT(lfs->cfg->block_cycles != 0); + + + // setup read cache + if (lfs->cfg->read_buffer) { + lfs->rcache.buffer = lfs->cfg->read_buffer; + } else { + lfs->rcache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!lfs->rcache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // setup program cache + if (lfs->cfg->prog_buffer) { + lfs->pcache.buffer = lfs->cfg->prog_buffer; + } else { + lfs->pcache.buffer = lfs_malloc(lfs->cfg->cache_size); + if (!lfs->pcache.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // zero to avoid information leaks + lfs_cache_zero(lfs, &lfs->rcache); + lfs_cache_zero(lfs, &lfs->pcache); + + // setup lookahead, must be multiple of 64-bits, 32-bit aligned + LFS_ASSERT(lfs->cfg->lookahead_size > 0); + LFS_ASSERT(lfs->cfg->lookahead_size % 8 == 0 && + (uintptr_t)lfs->cfg->lookahead_buffer % 4 == 0); + if (lfs->cfg->lookahead_buffer) { + lfs->free.buffer = lfs->cfg->lookahead_buffer; + } else { + lfs->free.buffer = lfs_malloc(lfs->cfg->lookahead_size); + if (!lfs->free.buffer) { + err = LFS_ERR_NOMEM; + goto cleanup; + } + } + + // check that the size limits are sane + LFS_ASSERT(lfs->cfg->name_max <= LFS_NAME_MAX); + lfs->name_max = lfs->cfg->name_max; + if (!lfs->name_max) { + lfs->name_max = LFS_NAME_MAX; + } + + LFS_ASSERT(lfs->cfg->file_max <= LFS_FILE_MAX); + lfs->file_max = lfs->cfg->file_max; + if (!lfs->file_max) { + lfs->file_max = LFS_FILE_MAX; + } + + LFS_ASSERT(lfs->cfg->attr_max <= LFS_ATTR_MAX); + lfs->attr_max = lfs->cfg->attr_max; + if (!lfs->attr_max) { + lfs->attr_max = LFS_ATTR_MAX; + } + + // setup default state + lfs->root[0] = LFS_BLOCK_NULL; + lfs->root[1] = LFS_BLOCK_NULL; + lfs->mlist = NULL; + lfs->seed = 0; + lfs->gdisk = (lfs_gstate_t){0}; + lfs->gstate = (lfs_gstate_t){0}; + lfs->gdelta = (lfs_gstate_t){0}; +#ifdef LFS_MIGRATE + lfs->lfs1 = NULL; +#endif + + return 0; + +cleanup: + lfs_deinit(lfs); + return err; +} + +static int lfs_deinit(lfs_t *lfs) { + // free allocated memory + if (!lfs->cfg->read_buffer) { + lfs_free(lfs->rcache.buffer); + } + + if (!lfs->cfg->prog_buffer) { + lfs_free(lfs->pcache.buffer); + } + + if (!lfs->cfg->lookahead_buffer) { + lfs_free(lfs->free.buffer); + } + + return 0; +} + +int lfs_format(lfs_t *lfs, const struct lfs_config *cfg) { + LFS_TRACE("lfs_format(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + int err = 0; + { + err = lfs_init(lfs, cfg); + if (err) { + LFS_TRACE("lfs_format -> %d", err); + return err; + } + + // create free lookahead + memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size); + lfs->free.off = 0; + lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, + lfs->cfg->block_count); + lfs->free.i = 0; + lfs_alloc_ack(lfs); + + // create root dir + lfs_mdir_t root; + err = lfs_dir_alloc(lfs, &root); + if (err) { + goto cleanup; + } + + // write one superblock + lfs_superblock_t superblock = { + .version = LFS_DISK_VERSION, + .block_size = lfs->cfg->block_size, + .block_count = lfs->cfg->block_count, + .name_max = lfs->name_max, + .file_max = lfs->file_max, + .attr_max = lfs->attr_max, + }; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &root, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, 0, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), "littlefs"}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock})); + if (err) { + goto cleanup; + } + + // sanity check that fetch works + err = lfs_dir_fetch(lfs, &root, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + + // force compaction to prevent accidentally mounting any + // older version of littlefs that may live on disk + root.erased = false; + err = lfs_dir_commit(lfs, &root, NULL, 0); + if (err) { + goto cleanup; + } + } + +cleanup: + lfs_deinit(lfs); + LFS_TRACE("lfs_format -> %d", err); + return err; +} + +int lfs_mount(lfs_t *lfs, const struct lfs_config *cfg) { + LFS_TRACE("lfs_mount(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + int err = lfs_init(lfs, cfg); + if (err) { + LFS_TRACE("lfs_mount -> %d", err); + return err; + } + + // scan directory blocks for superblock and any global updates + lfs_mdir_t dir = {.tail = {0, 1}}; + lfs_block_t cycle = 0; + while (!lfs_pair_isnull(dir.tail)) { + if (cycle >= lfs->cfg->block_count/2) { + // loop detected + err = LFS_ERR_CORRUPT; + goto cleanup; + } + cycle += 1; + + // fetch next block in tail list + lfs_stag_t tag = lfs_dir_fetchmatch(lfs, &dir, dir.tail, + LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), + NULL, + lfs_dir_find_match, &(struct lfs_dir_find_match){ + lfs, "littlefs", 8}); + if (tag < 0) { + err = tag; + goto cleanup; + } + + // has superblock? + if (tag && !lfs_tag_isdelete(tag)) { + // update root + lfs->root[0] = dir.pair[0]; + lfs->root[1] = dir.pair[1]; + + // grab superblock + lfs_superblock_t superblock; + tag = lfs_dir_get(lfs, &dir, LFS_MKTAG(0x7ff, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock); + if (tag < 0) { + err = tag; + goto cleanup; + } + lfs_superblock_fromle32(&superblock); + + // check version + uint16_t major_version = (0xffff & (superblock.version >> 16)); + uint16_t minor_version = (0xffff & (superblock.version >> 0)); + if ((major_version != LFS_DISK_VERSION_MAJOR || + minor_version > LFS_DISK_VERSION_MINOR)) { + LFS_ERROR("Invalid version v%"PRIu16".%"PRIu16, + major_version, minor_version); + err = LFS_ERR_INVAL; + goto cleanup; + } + + // check superblock configuration + if (superblock.name_max) { + if (superblock.name_max > lfs->name_max) { + LFS_ERROR("Unsupported name_max (%"PRIu32" > %"PRIu32")", + superblock.name_max, lfs->name_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->name_max = superblock.name_max; + } + + if (superblock.file_max) { + if (superblock.file_max > lfs->file_max) { + LFS_ERROR("Unsupported file_max (%"PRIu32" > %"PRIu32")", + superblock.file_max, lfs->file_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->file_max = superblock.file_max; + } + + if (superblock.attr_max) { + if (superblock.attr_max > lfs->attr_max) { + LFS_ERROR("Unsupported attr_max (%"PRIu32" > %"PRIu32")", + superblock.attr_max, lfs->attr_max); + err = LFS_ERR_INVAL; + goto cleanup; + } + + lfs->attr_max = superblock.attr_max; + } + } + + // has gstate? + err = lfs_dir_getgstate(lfs, &dir, &lfs->gstate); + if (err) { + goto cleanup; + } + } + + // found superblock? + if (lfs_pair_isnull(lfs->root)) { + err = LFS_ERR_INVAL; + goto cleanup; + } + + // update littlefs with gstate + if (!lfs_gstate_iszero(&lfs->gstate)) { + LFS_DEBUG("Found pending gstate 0x%08"PRIx32"%08"PRIx32"%08"PRIx32, + lfs->gstate.tag, + lfs->gstate.pair[0], + lfs->gstate.pair[1]); + } + lfs->gstate.tag += !lfs_tag_isvalid(lfs->gstate.tag); + lfs->gdisk = lfs->gstate; + + // setup free lookahead + lfs_alloc_reset(lfs); + + LFS_TRACE("lfs_mount -> %d", 0); + return 0; + +cleanup: + lfs_unmount(lfs); + LFS_TRACE("lfs_mount -> %d", err); + return err; +} + +int lfs_unmount(lfs_t *lfs) { + LFS_TRACE("lfs_unmount(%p)", (void*)lfs); + int err = lfs_deinit(lfs); + LFS_TRACE("lfs_unmount -> %d", err); + return err; +} + + +/// Filesystem filesystem operations /// +int lfs_fs_traverseraw(lfs_t *lfs, + int (*cb)(void *data, lfs_block_t block), void *data, + bool includeorphans) { + // iterate over metadata pairs + lfs_mdir_t dir = {.tail = {0, 1}}; + +#ifdef LFS_MIGRATE + // also consider v1 blocks during migration + if (lfs->lfs1) { + int err = lfs1_traverse(lfs, cb, data); + if (err) { + return err; + } + + dir.tail[0] = lfs->root[0]; + dir.tail[1] = lfs->root[1]; + } +#endif + + lfs_block_t cycle = 0; + while (!lfs_pair_isnull(dir.tail)) { + if (cycle >= lfs->cfg->block_count/2) { + // loop detected + return LFS_ERR_CORRUPT; + } + cycle += 1; + + for (int i = 0; i < 2; i++) { + int err = cb(data, dir.tail[i]); + if (err) { + return err; + } + } + + // iterate through ids in directory + int err = lfs_dir_fetch(lfs, &dir, dir.tail); + if (err) { + return err; + } + + for (uint16_t id = 0; id < dir.count; id++) { + struct lfs_ctz ctz; + lfs_stag_t tag = lfs_dir_get(lfs, &dir, LFS_MKTAG(0x700, 0x3ff, 0), + LFS_MKTAG(LFS_TYPE_STRUCT, id, sizeof(ctz)), &ctz); + if (tag < 0) { + if (tag == LFS_ERR_NOENT) { + continue; + } + return tag; + } + lfs_ctz_fromle32(&ctz); + + if (lfs_tag_type3(tag) == LFS_TYPE_CTZSTRUCT) { + err = lfs_ctz_traverse(lfs, NULL, &lfs->rcache, + ctz.head, ctz.size, cb, data); + if (err) { + return err; + } + } else if (includeorphans && + lfs_tag_type3(tag) == LFS_TYPE_DIRSTRUCT) { + for (int i = 0; i < 2; i++) { + err = cb(data, (&ctz.head)[i]); + if (err) { + return err; + } + } + } + } + } + + // iterate over any open files + for (lfs_file_t *f = (lfs_file_t*)lfs->mlist; f; f = f->next) { + if (f->type != LFS_TYPE_REG) { + continue; + } + + if ((f->flags & LFS_F_DIRTY) && !(f->flags & LFS_F_INLINE)) { + int err = lfs_ctz_traverse(lfs, &f->cache, &lfs->rcache, + f->ctz.head, f->ctz.size, cb, data); + if (err) { + return err; + } + } + + if ((f->flags & LFS_F_WRITING) && !(f->flags & LFS_F_INLINE)) { + int err = lfs_ctz_traverse(lfs, &f->cache, &lfs->rcache, + f->block, f->pos, cb, data); + if (err) { + return err; + } + } + } + + return 0; +} + +int lfs_fs_traverse(lfs_t *lfs, + int (*cb)(void *data, lfs_block_t block), void *data) { + LFS_TRACE("lfs_fs_traverse(%p, %p, %p)", + (void*)lfs, (void*)(uintptr_t)cb, data); + int err = lfs_fs_traverseraw(lfs, cb, data, true); + LFS_TRACE("lfs_fs_traverse -> %d", 0); + return err; +} + +static int lfs_fs_pred(lfs_t *lfs, + const lfs_block_t pair[2], lfs_mdir_t *pdir) { + // iterate over all directory directory entries + pdir->tail[0] = 0; + pdir->tail[1] = 1; + lfs_block_t cycle = 0; + while (!lfs_pair_isnull(pdir->tail)) { + if (cycle >= lfs->cfg->block_count/2) { + // loop detected + return LFS_ERR_CORRUPT; + } + cycle += 1; + + if (lfs_pair_cmp(pdir->tail, pair) == 0) { + return 0; + } + + int err = lfs_dir_fetch(lfs, pdir, pdir->tail); + if (err) { + return err; + } + } + + return LFS_ERR_NOENT; +} + +struct lfs_fs_parent_match { + lfs_t *lfs; + const lfs_block_t pair[2]; +}; + +static int lfs_fs_parent_match(void *data, + lfs_tag_t tag, const void *buffer) { + struct lfs_fs_parent_match *find = data; + lfs_t *lfs = find->lfs; + const struct lfs_diskoff *disk = buffer; + (void)tag; + + lfs_block_t child[2]; + int err = lfs_bd_read(lfs, + &lfs->pcache, &lfs->rcache, lfs->cfg->block_size, + disk->block, disk->off, &child, sizeof(child)); + if (err) { + return err; + } + + lfs_pair_fromle32(child); + return (lfs_pair_cmp(child, find->pair) == 0) ? LFS_CMP_EQ : LFS_CMP_LT; +} + +static lfs_stag_t lfs_fs_parent(lfs_t *lfs, const lfs_block_t pair[2], + lfs_mdir_t *parent) { + // use fetchmatch with callback to find pairs + parent->tail[0] = 0; + parent->tail[1] = 1; + lfs_block_t cycle = 0; + while (!lfs_pair_isnull(parent->tail)) { + if (cycle >= lfs->cfg->block_count/2) { + // loop detected + return LFS_ERR_CORRUPT; + } + cycle += 1; + + lfs_stag_t tag = lfs_dir_fetchmatch(lfs, parent, parent->tail, + LFS_MKTAG(0x7ff, 0, 0x3ff), + LFS_MKTAG(LFS_TYPE_DIRSTRUCT, 0, 8), + NULL, + lfs_fs_parent_match, &(struct lfs_fs_parent_match){ + lfs, {pair[0], pair[1]}}); + if (tag && tag != LFS_ERR_NOENT) { + return tag; + } + } + + return LFS_ERR_NOENT; +} + +static int lfs_fs_relocate(lfs_t *lfs, + const lfs_block_t oldpair[2], lfs_block_t newpair[2]) { + // update internal root + if (lfs_pair_cmp(oldpair, lfs->root) == 0) { + lfs->root[0] = newpair[0]; + lfs->root[1] = newpair[1]; + } + + // update internally tracked dirs + for (struct lfs_mlist *d = lfs->mlist; d; d = d->next) { + if (lfs_pair_cmp(oldpair, d->m.pair) == 0) { + d->m.pair[0] = newpair[0]; + d->m.pair[1] = newpair[1]; + } + + if (d->type == LFS_TYPE_DIR && + lfs_pair_cmp(oldpair, ((lfs_dir_t*)d)->head) == 0) { + ((lfs_dir_t*)d)->head[0] = newpair[0]; + ((lfs_dir_t*)d)->head[1] = newpair[1]; + } + } + + // find parent + lfs_mdir_t parent; + lfs_stag_t tag = lfs_fs_parent(lfs, oldpair, &parent); + if (tag < 0 && tag != LFS_ERR_NOENT) { + return tag; + } + + if (tag != LFS_ERR_NOENT) { + // update disk, this creates a desync + lfs_fs_preporphans(lfs, +1); + + // fix pending move in this pair? this looks like an optimization but + // is in fact _required_ since relocating may outdate the move. + uint16_t moveid = 0x3ff; + if (lfs_gstate_hasmovehere(&lfs->gstate, parent.pair)) { + moveid = lfs_tag_id(lfs->gstate.tag); + LFS_DEBUG("Fixing move while relocating " + "{0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16"\n", + parent.pair[0], parent.pair[1], moveid); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + if (moveid < lfs_tag_id(tag)) { + tag -= LFS_MKTAG(0, 1, 0); + } + } + + lfs_pair_tole32(newpair); + int err = lfs_dir_commit(lfs, &parent, LFS_MKATTRS( + {LFS_MKTAG_IF(moveid != 0x3ff, + LFS_TYPE_DELETE, moveid, 0), NULL}, + {tag, newpair})); + lfs_pair_fromle32(newpair); + if (err) { + return err; + } + + // next step, clean up orphans + lfs_fs_preporphans(lfs, -1); + } + + // find pred + int err = lfs_fs_pred(lfs, oldpair, &parent); + if (err && err != LFS_ERR_NOENT) { + return err; + } + + // if we can't find dir, it must be new + if (err != LFS_ERR_NOENT) { + // fix pending move in this pair? this looks like an optimization but + // is in fact _required_ since relocating may outdate the move. + uint16_t moveid = 0x3ff; + if (lfs_gstate_hasmovehere(&lfs->gstate, parent.pair)) { + moveid = lfs_tag_id(lfs->gstate.tag); + LFS_DEBUG("Fixing move while relocating " + "{0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16"\n", + parent.pair[0], parent.pair[1], moveid); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + } + + // replace bad pair, either we clean up desync, or no desync occured + lfs_pair_tole32(newpair); + err = lfs_dir_commit(lfs, &parent, LFS_MKATTRS( + {LFS_MKTAG_IF(moveid != 0x3ff, + LFS_TYPE_DELETE, moveid, 0), NULL}, + {LFS_MKTAG(LFS_TYPE_TAIL + parent.split, 0x3ff, 8), newpair})); + lfs_pair_fromle32(newpair); + if (err) { + return err; + } + } + + return 0; +} + +static void lfs_fs_preporphans(lfs_t *lfs, int8_t orphans) { + LFS_ASSERT(lfs_tag_size(lfs->gstate.tag) > 0 || orphans >= 0); + lfs->gstate.tag += orphans; + lfs->gstate.tag = ((lfs->gstate.tag & ~LFS_MKTAG(0x800, 0, 0)) | + ((uint32_t)lfs_gstate_hasorphans(&lfs->gstate) << 31)); +} + +static void lfs_fs_prepmove(lfs_t *lfs, + uint16_t id, const lfs_block_t pair[2]) { + lfs->gstate.tag = ((lfs->gstate.tag & ~LFS_MKTAG(0x7ff, 0x3ff, 0)) | + ((id != 0x3ff) ? LFS_MKTAG(LFS_TYPE_DELETE, id, 0) : 0)); + lfs->gstate.pair[0] = (id != 0x3ff) ? pair[0] : 0; + lfs->gstate.pair[1] = (id != 0x3ff) ? pair[1] : 0; +} + +static int lfs_fs_demove(lfs_t *lfs) { + if (!lfs_gstate_hasmove(&lfs->gdisk)) { + return 0; + } + + // Fix bad moves + LFS_DEBUG("Fixing move {0x%"PRIx32", 0x%"PRIx32"} 0x%"PRIx16, + lfs->gdisk.pair[0], + lfs->gdisk.pair[1], + lfs_tag_id(lfs->gdisk.tag)); + + // fetch and delete the moved entry + lfs_mdir_t movedir; + int err = lfs_dir_fetch(lfs, &movedir, lfs->gdisk.pair); + if (err) { + return err; + } + + // prep gstate and delete move id + uint16_t moveid = lfs_tag_id(lfs->gdisk.tag); + lfs_fs_prepmove(lfs, 0x3ff, NULL); + err = lfs_dir_commit(lfs, &movedir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_DELETE, moveid, 0), NULL})); + if (err) { + return err; + } + + return 0; +} + +static int lfs_fs_deorphan(lfs_t *lfs) { + if (!lfs_gstate_hasorphans(&lfs->gstate)) { + return 0; + } + + // Fix any orphans + lfs_mdir_t pdir = {.split = true, .tail = {0, 1}}; + lfs_mdir_t dir; + + // iterate over all directory directory entries + while (!lfs_pair_isnull(pdir.tail)) { + int err = lfs_dir_fetch(lfs, &dir, pdir.tail); + if (err) { + return err; + } + + // check head blocks for orphans + if (!pdir.split) { + // check if we have a parent + lfs_mdir_t parent; + lfs_stag_t tag = lfs_fs_parent(lfs, pdir.tail, &parent); + if (tag < 0 && tag != LFS_ERR_NOENT) { + return tag; + } + + if (tag == LFS_ERR_NOENT) { + // we are an orphan + LFS_DEBUG("Fixing orphan {0x%"PRIx32", 0x%"PRIx32"}", + pdir.tail[0], pdir.tail[1]); + + err = lfs_dir_drop(lfs, &pdir, &dir); + if (err) { + return err; + } + + // refetch tail + continue; + } + + lfs_block_t pair[2]; + lfs_stag_t res = lfs_dir_get(lfs, &parent, + LFS_MKTAG(0x7ff, 0x3ff, 0), tag, pair); + if (res < 0) { + return res; + } + lfs_pair_fromle32(pair); + + if (!lfs_pair_sync(pair, pdir.tail)) { + // we have desynced + LFS_DEBUG("Fixing half-orphan {0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + pdir.tail[0], pdir.tail[1], pair[0], pair[1]); + + lfs_pair_tole32(pair); + err = lfs_dir_commit(lfs, &pdir, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), pair})); + lfs_pair_fromle32(pair); + if (err) { + return err; + } + + // refetch tail + continue; + } + } + + pdir = dir; + } + + // mark orphans as fixed + lfs_fs_preporphans(lfs, -lfs_gstate_getorphans(&lfs->gstate)); + return 0; +} + +static int lfs_fs_forceconsistency(lfs_t *lfs) { + int err = lfs_fs_demove(lfs); + if (err) { + return err; + } + + err = lfs_fs_deorphan(lfs); + if (err) { + return err; + } + + return 0; +} + +static int lfs_fs_size_count(void *p, lfs_block_t block) { + (void)block; + lfs_size_t *size = p; + *size += 1; + return 0; +} + +lfs_ssize_t lfs_fs_size(lfs_t *lfs) { + LFS_TRACE("lfs_fs_size(%p)", (void*)lfs); + lfs_size_t size = 0; + int err = lfs_fs_traverseraw(lfs, lfs_fs_size_count, &size, false); + if (err) { + LFS_TRACE("lfs_fs_size -> %d", err); + return err; + } + + LFS_TRACE("lfs_fs_size -> %d", err); + return size; +} + +#ifdef LFS_MIGRATE +////// Migration from littelfs v1 below this ////// + +/// Version info /// + +// Software library version +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS1_VERSION 0x00010007 +#define LFS1_VERSION_MAJOR (0xffff & (LFS1_VERSION >> 16)) +#define LFS1_VERSION_MINOR (0xffff & (LFS1_VERSION >> 0)) + +// Version of On-disk data structures +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS1_DISK_VERSION 0x00010001 +#define LFS1_DISK_VERSION_MAJOR (0xffff & (LFS1_DISK_VERSION >> 16)) +#define LFS1_DISK_VERSION_MINOR (0xffff & (LFS1_DISK_VERSION >> 0)) + + +/// v1 Definitions /// + +// File types +enum lfs1_type { + LFS1_TYPE_REG = 0x11, + LFS1_TYPE_DIR = 0x22, + LFS1_TYPE_SUPERBLOCK = 0x2e, +}; + +typedef struct lfs1 { + lfs_block_t root[2]; +} lfs1_t; + +typedef struct lfs1_entry { + lfs_off_t off; + + struct lfs1_disk_entry { + uint8_t type; + uint8_t elen; + uint8_t alen; + uint8_t nlen; + union { + struct { + lfs_block_t head; + lfs_size_t size; + } file; + lfs_block_t dir[2]; + } u; + } d; +} lfs1_entry_t; + +typedef struct lfs1_dir { + struct lfs1_dir *next; + lfs_block_t pair[2]; + lfs_off_t off; + + lfs_block_t head[2]; + lfs_off_t pos; + + struct lfs1_disk_dir { + uint32_t rev; + lfs_size_t size; + lfs_block_t tail[2]; + } d; +} lfs1_dir_t; + +typedef struct lfs1_superblock { + lfs_off_t off; + + struct lfs1_disk_superblock { + uint8_t type; + uint8_t elen; + uint8_t alen; + uint8_t nlen; + lfs_block_t root[2]; + uint32_t block_size; + uint32_t block_count; + uint32_t version; + char magic[8]; + } d; +} lfs1_superblock_t; + + +/// Low-level wrappers v1->v2 /// +static void lfs1_crc(uint32_t *crc, const void *buffer, size_t size) { + *crc = lfs_crc(*crc, buffer, size); +} + +static int lfs1_bd_read(lfs_t *lfs, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size) { + // if we ever do more than writes to alternating pairs, + // this may need to consider pcache + return lfs_bd_read(lfs, &lfs->pcache, &lfs->rcache, size, + block, off, buffer, size); +} + +static int lfs1_bd_crc(lfs_t *lfs, lfs_block_t block, + lfs_off_t off, lfs_size_t size, uint32_t *crc) { + for (lfs_off_t i = 0; i < size; i++) { + uint8_t c; + int err = lfs1_bd_read(lfs, block, off+i, &c, 1); + if (err) { + return err; + } + + lfs1_crc(crc, &c, 1); + } + + return 0; +} + + +/// Endian swapping functions /// +static void lfs1_dir_fromle32(struct lfs1_disk_dir *d) { + d->rev = lfs_fromle32(d->rev); + d->size = lfs_fromle32(d->size); + d->tail[0] = lfs_fromle32(d->tail[0]); + d->tail[1] = lfs_fromle32(d->tail[1]); +} + +static void lfs1_dir_tole32(struct lfs1_disk_dir *d) { + d->rev = lfs_tole32(d->rev); + d->size = lfs_tole32(d->size); + d->tail[0] = lfs_tole32(d->tail[0]); + d->tail[1] = lfs_tole32(d->tail[1]); +} + +static void lfs1_entry_fromle32(struct lfs1_disk_entry *d) { + d->u.dir[0] = lfs_fromle32(d->u.dir[0]); + d->u.dir[1] = lfs_fromle32(d->u.dir[1]); +} + +static void lfs1_entry_tole32(struct lfs1_disk_entry *d) { + d->u.dir[0] = lfs_tole32(d->u.dir[0]); + d->u.dir[1] = lfs_tole32(d->u.dir[1]); +} + +static void lfs1_superblock_fromle32(struct lfs1_disk_superblock *d) { + d->root[0] = lfs_fromle32(d->root[0]); + d->root[1] = lfs_fromle32(d->root[1]); + d->block_size = lfs_fromle32(d->block_size); + d->block_count = lfs_fromle32(d->block_count); + d->version = lfs_fromle32(d->version); +} + + +///// Metadata pair and directory operations /// +static inline lfs_size_t lfs1_entry_size(const lfs1_entry_t *entry) { + return 4 + entry->d.elen + entry->d.alen + entry->d.nlen; +} + +static int lfs1_dir_fetch(lfs_t *lfs, + lfs1_dir_t *dir, const lfs_block_t pair[2]) { + // copy out pair, otherwise may be aliasing dir + const lfs_block_t tpair[2] = {pair[0], pair[1]}; + bool valid = false; + + // check both blocks for the most recent revision + for (int i = 0; i < 2; i++) { + struct lfs1_disk_dir test; + int err = lfs1_bd_read(lfs, tpair[i], 0, &test, sizeof(test)); + lfs1_dir_fromle32(&test); + if (err) { + if (err == LFS_ERR_CORRUPT) { + continue; + } + return err; + } + + if (valid && lfs_scmp(test.rev, dir->d.rev) < 0) { + continue; + } + + if ((0x7fffffff & test.size) < sizeof(test)+4 || + (0x7fffffff & test.size) > lfs->cfg->block_size) { + continue; + } + + uint32_t crc = 0xffffffff; + lfs1_dir_tole32(&test); + lfs1_crc(&crc, &test, sizeof(test)); + lfs1_dir_fromle32(&test); + err = lfs1_bd_crc(lfs, tpair[i], sizeof(test), + (0x7fffffff & test.size) - sizeof(test), &crc); + if (err) { + if (err == LFS_ERR_CORRUPT) { + continue; + } + return err; + } + + if (crc != 0) { + continue; + } + + valid = true; + + // setup dir in case it's valid + dir->pair[0] = tpair[(i+0) % 2]; + dir->pair[1] = tpair[(i+1) % 2]; + dir->off = sizeof(dir->d); + dir->d = test; + } + + if (!valid) { + LFS_ERROR("Corrupted dir pair at {0x%"PRIx32", 0x%"PRIx32"}", + tpair[0], tpair[1]); + return LFS_ERR_CORRUPT; + } + + return 0; +} + +static int lfs1_dir_next(lfs_t *lfs, lfs1_dir_t *dir, lfs1_entry_t *entry) { + while (dir->off + sizeof(entry->d) > (0x7fffffff & dir->d.size)-4) { + if (!(0x80000000 & dir->d.size)) { + entry->off = dir->off; + return LFS_ERR_NOENT; + } + + int err = lfs1_dir_fetch(lfs, dir, dir->d.tail); + if (err) { + return err; + } + + dir->off = sizeof(dir->d); + dir->pos += sizeof(dir->d) + 4; + } + + int err = lfs1_bd_read(lfs, dir->pair[0], dir->off, + &entry->d, sizeof(entry->d)); + lfs1_entry_fromle32(&entry->d); + if (err) { + return err; + } + + entry->off = dir->off; + dir->off += lfs1_entry_size(entry); + dir->pos += lfs1_entry_size(entry); + return 0; +} + +/// littlefs v1 specific operations /// +int lfs1_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data) { + if (lfs_pair_isnull(lfs->lfs1->root)) { + return 0; + } + + // iterate over metadata pairs + lfs1_dir_t dir; + lfs1_entry_t entry; + lfs_block_t cwd[2] = {0, 1}; + + while (true) { + for (int i = 0; i < 2; i++) { + int err = cb(data, cwd[i]); + if (err) { + return err; + } + } + + int err = lfs1_dir_fetch(lfs, &dir, cwd); + if (err) { + return err; + } + + // iterate over contents + while (dir.off + sizeof(entry.d) <= (0x7fffffff & dir.d.size)-4) { + err = lfs1_bd_read(lfs, dir.pair[0], dir.off, + &entry.d, sizeof(entry.d)); + lfs1_entry_fromle32(&entry.d); + if (err) { + return err; + } + + dir.off += lfs1_entry_size(&entry); + if ((0x70 & entry.d.type) == (0x70 & LFS1_TYPE_REG)) { + err = lfs_ctz_traverse(lfs, NULL, &lfs->rcache, + entry.d.u.file.head, entry.d.u.file.size, cb, data); + if (err) { + return err; + } + } + } + + // we also need to check if we contain a threaded v2 directory + lfs_mdir_t dir2 = {.split=true, .tail={cwd[0], cwd[1]}}; + while (dir2.split) { + err = lfs_dir_fetch(lfs, &dir2, dir2.tail); + if (err) { + break; + } + + for (int i = 0; i < 2; i++) { + err = cb(data, dir2.pair[i]); + if (err) { + return err; + } + } + } + + cwd[0] = dir.d.tail[0]; + cwd[1] = dir.d.tail[1]; + + if (lfs_pair_isnull(cwd)) { + break; + } + } + + return 0; +} + +static int lfs1_moved(lfs_t *lfs, const void *e) { + if (lfs_pair_isnull(lfs->lfs1->root)) { + return 0; + } + + // skip superblock + lfs1_dir_t cwd; + int err = lfs1_dir_fetch(lfs, &cwd, (const lfs_block_t[2]){0, 1}); + if (err) { + return err; + } + + // iterate over all directory directory entries + lfs1_entry_t entry; + while (!lfs_pair_isnull(cwd.d.tail)) { + err = lfs1_dir_fetch(lfs, &cwd, cwd.d.tail); + if (err) { + return err; + } + + while (true) { + err = lfs1_dir_next(lfs, &cwd, &entry); + if (err && err != LFS_ERR_NOENT) { + return err; + } + + if (err == LFS_ERR_NOENT) { + break; + } + + if (!(0x80 & entry.d.type) && + memcmp(&entry.d.u, e, sizeof(entry.d.u)) == 0) { + return true; + } + } + } + + return false; +} + +/// Filesystem operations /// +static int lfs1_mount(lfs_t *lfs, struct lfs1 *lfs1, + const struct lfs_config *cfg) { + int err = 0; + { + err = lfs_init(lfs, cfg); + if (err) { + return err; + } + + lfs->lfs1 = lfs1; + lfs->lfs1->root[0] = LFS_BLOCK_NULL; + lfs->lfs1->root[1] = LFS_BLOCK_NULL; + + // setup free lookahead + lfs->free.off = 0; + lfs->free.size = 0; + lfs->free.i = 0; + lfs_alloc_ack(lfs); + + // load superblock + lfs1_dir_t dir; + lfs1_superblock_t superblock; + err = lfs1_dir_fetch(lfs, &dir, (const lfs_block_t[2]){0, 1}); + if (err && err != LFS_ERR_CORRUPT) { + goto cleanup; + } + + if (!err) { + err = lfs1_bd_read(lfs, dir.pair[0], sizeof(dir.d), + &superblock.d, sizeof(superblock.d)); + lfs1_superblock_fromle32(&superblock.d); + if (err) { + goto cleanup; + } + + lfs->lfs1->root[0] = superblock.d.root[0]; + lfs->lfs1->root[1] = superblock.d.root[1]; + } + + if (err || memcmp(superblock.d.magic, "littlefs", 8) != 0) { + LFS_ERROR("Invalid superblock at {0x%"PRIx32", 0x%"PRIx32"}", + 0, 1); + err = LFS_ERR_CORRUPT; + goto cleanup; + } + + uint16_t major_version = (0xffff & (superblock.d.version >> 16)); + uint16_t minor_version = (0xffff & (superblock.d.version >> 0)); + if ((major_version != LFS1_DISK_VERSION_MAJOR || + minor_version > LFS1_DISK_VERSION_MINOR)) { + LFS_ERROR("Invalid version v%d.%d", major_version, minor_version); + err = LFS_ERR_INVAL; + goto cleanup; + } + + return 0; + } + +cleanup: + lfs_deinit(lfs); + return err; +} + +static int lfs1_unmount(lfs_t *lfs) { + return lfs_deinit(lfs); +} + +/// v1 migration /// +int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg) { + LFS_TRACE("lfs_migrate(%p, %p {.context=%p, " + ".read=%p, .prog=%p, .erase=%p, .sync=%p, " + ".read_size=%"PRIu32", .prog_size=%"PRIu32", " + ".block_size=%"PRIu32", .block_count=%"PRIu32", " + ".block_cycles=%"PRIu32", .cache_size=%"PRIu32", " + ".lookahead_size=%"PRIu32", .read_buffer=%p, " + ".prog_buffer=%p, .lookahead_buffer=%p, " + ".name_max=%"PRIu32", .file_max=%"PRIu32", " + ".attr_max=%"PRIu32"})", + (void*)lfs, (void*)cfg, cfg->context, + (void*)(uintptr_t)cfg->read, (void*)(uintptr_t)cfg->prog, + (void*)(uintptr_t)cfg->erase, (void*)(uintptr_t)cfg->sync, + cfg->read_size, cfg->prog_size, cfg->block_size, cfg->block_count, + cfg->block_cycles, cfg->cache_size, cfg->lookahead_size, + cfg->read_buffer, cfg->prog_buffer, cfg->lookahead_buffer, + cfg->name_max, cfg->file_max, cfg->attr_max); + struct lfs1 lfs1; + int err = lfs1_mount(lfs, &lfs1, cfg); + if (err) { + LFS_TRACE("lfs_migrate -> %d", err); + return err; + } + + { + // iterate through each directory, copying over entries + // into new directory + lfs1_dir_t dir1; + lfs_mdir_t dir2; + dir1.d.tail[0] = lfs->lfs1->root[0]; + dir1.d.tail[1] = lfs->lfs1->root[1]; + while (!lfs_pair_isnull(dir1.d.tail)) { + // iterate old dir + err = lfs1_dir_fetch(lfs, &dir1, dir1.d.tail); + if (err) { + goto cleanup; + } + + // create new dir and bind as temporary pretend root + err = lfs_dir_alloc(lfs, &dir2); + if (err) { + goto cleanup; + } + + dir2.rev = dir1.d.rev; + dir1.head[0] = dir1.pair[0]; + dir1.head[1] = dir1.pair[1]; + lfs->root[0] = dir2.pair[0]; + lfs->root[1] = dir2.pair[1]; + + err = lfs_dir_commit(lfs, &dir2, NULL, 0); + if (err) { + goto cleanup; + } + + while (true) { + lfs1_entry_t entry1; + err = lfs1_dir_next(lfs, &dir1, &entry1); + if (err && err != LFS_ERR_NOENT) { + goto cleanup; + } + + if (err == LFS_ERR_NOENT) { + break; + } + + // check that entry has not been moved + if (entry1.d.type & 0x80) { + int moved = lfs1_moved(lfs, &entry1.d.u); + if (moved < 0) { + err = moved; + goto cleanup; + } + + if (moved) { + continue; + } + + entry1.d.type &= ~0x80; + } + + // also fetch name + char name[LFS_NAME_MAX+1]; + memset(name, 0, sizeof(name)); + err = lfs1_bd_read(lfs, dir1.pair[0], + entry1.off + 4+entry1.d.elen+entry1.d.alen, + name, entry1.d.nlen); + if (err) { + goto cleanup; + } + + bool isdir = (entry1.d.type == LFS1_TYPE_DIR); + + // create entry in new dir + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + uint16_t id; + err = lfs_dir_find(lfs, &dir2, &(const char*){name}, &id); + if (!(err == LFS_ERR_NOENT && id != 0x3ff)) { + err = (err < 0) ? err : LFS_ERR_EXIST; + goto cleanup; + } + + lfs1_entry_tole32(&entry1.d); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, id, 0)}, + {LFS_MKTAG_IF_ELSE(isdir, + LFS_TYPE_DIR, id, entry1.d.nlen, + LFS_TYPE_REG, id, entry1.d.nlen), + name}, + {LFS_MKTAG_IF_ELSE(isdir, + LFS_TYPE_DIRSTRUCT, id, sizeof(entry1.d.u), + LFS_TYPE_CTZSTRUCT, id, sizeof(entry1.d.u)), + &entry1.d.u})); + lfs1_entry_fromle32(&entry1.d); + if (err) { + goto cleanup; + } + } + + if (!lfs_pair_isnull(dir1.d.tail)) { + // find last block and update tail to thread into fs + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + while (dir2.split) { + err = lfs_dir_fetch(lfs, &dir2, dir2.tail); + if (err) { + goto cleanup; + } + } + + lfs_pair_tole32(dir2.pair); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_SOFTTAIL, 0x3ff, 8), dir1.d.tail})); + lfs_pair_fromle32(dir2.pair); + if (err) { + goto cleanup; + } + } + + // Copy over first block to thread into fs. Unfortunately + // if this fails there is not much we can do. + LFS_DEBUG("Migrating {0x%"PRIx32", 0x%"PRIx32"} " + "-> {0x%"PRIx32", 0x%"PRIx32"}", + lfs->root[0], lfs->root[1], dir1.head[0], dir1.head[1]); + + err = lfs_bd_erase(lfs, dir1.head[1]); + if (err) { + goto cleanup; + } + + err = lfs_dir_fetch(lfs, &dir2, lfs->root); + if (err) { + goto cleanup; + } + + for (lfs_off_t i = 0; i < dir2.off; i++) { + uint8_t dat; + err = lfs_bd_read(lfs, + NULL, &lfs->rcache, dir2.off, + dir2.pair[0], i, &dat, 1); + if (err) { + goto cleanup; + } + + err = lfs_bd_prog(lfs, + &lfs->pcache, &lfs->rcache, true, + dir1.head[1], i, &dat, 1); + if (err) { + goto cleanup; + } + } + + err = lfs_bd_flush(lfs, &lfs->pcache, &lfs->rcache, true); + if (err) { + goto cleanup; + } + } + + // Create new superblock. This marks a successful migration! + err = lfs1_dir_fetch(lfs, &dir1, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + + dir2.pair[0] = dir1.pair[0]; + dir2.pair[1] = dir1.pair[1]; + dir2.rev = dir1.d.rev; + dir2.off = sizeof(dir2.rev); + dir2.etag = 0xffffffff; + dir2.count = 0; + dir2.tail[0] = lfs->lfs1->root[0]; + dir2.tail[1] = lfs->lfs1->root[1]; + dir2.erased = false; + dir2.split = true; + + lfs_superblock_t superblock = { + .version = LFS_DISK_VERSION, + .block_size = lfs->cfg->block_size, + .block_count = lfs->cfg->block_count, + .name_max = lfs->name_max, + .file_max = lfs->file_max, + .attr_max = lfs->attr_max, + }; + + lfs_superblock_tole32(&superblock); + err = lfs_dir_commit(lfs, &dir2, LFS_MKATTRS( + {LFS_MKTAG(LFS_TYPE_CREATE, 0, 0)}, + {LFS_MKTAG(LFS_TYPE_SUPERBLOCK, 0, 8), "littlefs"}, + {LFS_MKTAG(LFS_TYPE_INLINESTRUCT, 0, sizeof(superblock)), + &superblock})); + if (err) { + goto cleanup; + } + + // sanity check that fetch works + err = lfs_dir_fetch(lfs, &dir2, (const lfs_block_t[2]){0, 1}); + if (err) { + goto cleanup; + } + + // force compaction to prevent accidentally mounting v1 + dir2.erased = false; + err = lfs_dir_commit(lfs, &dir2, NULL, 0); + if (err) { + goto cleanup; + } + } + +cleanup: + lfs1_unmount(lfs); + LFS_TRACE("lfs_migrate -> %d", err); + return err; +} + +#endif diff --git a/lib/libesp32/LITTLEFS/src/lfs.h b/lib/libesp32/LITTLEFS/src/lfs.h new file mode 100755 index 000000000..35bbbabfa --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/lfs.h @@ -0,0 +1,655 @@ +/* + * The little filesystem + * + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef LFS_H +#define LFS_H + +#include +#include + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/// Version info /// + +// Software library version +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS_VERSION 0x00020002 +#define LFS_VERSION_MAJOR (0xffff & (LFS_VERSION >> 16)) +#define LFS_VERSION_MINOR (0xffff & (LFS_VERSION >> 0)) + +// Version of On-disk data structures +// Major (top-nibble), incremented on backwards incompatible changes +// Minor (bottom-nibble), incremented on feature additions +#define LFS_DISK_VERSION 0x00020000 +#define LFS_DISK_VERSION_MAJOR (0xffff & (LFS_DISK_VERSION >> 16)) +#define LFS_DISK_VERSION_MINOR (0xffff & (LFS_DISK_VERSION >> 0)) + + +/// Definitions /// + +// Type definitions +typedef uint32_t lfs_size_t; +typedef uint32_t lfs_off_t; + +typedef int32_t lfs_ssize_t; +typedef int32_t lfs_soff_t; + +typedef uint32_t lfs_block_t; + +// Maximum name size in bytes, may be redefined to reduce the size of the +// info struct. Limited to <= 1022. Stored in superblock and must be +// respected by other littlefs drivers. +#ifndef LFS_NAME_MAX +#define LFS_NAME_MAX 255 +#endif + +// Maximum size of a file in bytes, may be redefined to limit to support other +// drivers. Limited on disk to <= 4294967296. However, above 2147483647 the +// functions lfs_file_seek, lfs_file_size, and lfs_file_tell will return +// incorrect values due to using signed integers. Stored in superblock and +// must be respected by other littlefs drivers. +#ifndef LFS_FILE_MAX +#define LFS_FILE_MAX 2147483647 +#endif + +// Maximum size of custom attributes in bytes, may be redefined, but there is +// no real benefit to using a smaller LFS_ATTR_MAX. Limited to <= 1022. +#ifndef LFS_ATTR_MAX +#define LFS_ATTR_MAX 1022 +#endif + +// Possible error codes, these are negative to allow +// valid positive return values +enum lfs_error { + LFS_ERR_OK = 0, // No error + LFS_ERR_IO = -5, // Error during device operation + LFS_ERR_CORRUPT = -84, // Corrupted + LFS_ERR_NOENT = -2, // No directory entry + LFS_ERR_EXIST = -17, // Entry already exists + LFS_ERR_NOTDIR = -20, // Entry is not a dir + LFS_ERR_ISDIR = -21, // Entry is a dir + LFS_ERR_NOTEMPTY = -39, // Dir is not empty + LFS_ERR_BADF = -9, // Bad file number + LFS_ERR_FBIG = -27, // File too large + LFS_ERR_INVAL = -22, // Invalid parameter + LFS_ERR_NOSPC = -28, // No space left on device + LFS_ERR_NOMEM = -12, // No more memory available + LFS_ERR_NOATTR = -61, // No data/attr available + LFS_ERR_NAMETOOLONG = -36, // File name too long +}; + +// File types +enum lfs_type { + // file types + LFS_TYPE_REG = 0x001, + LFS_TYPE_DIR = 0x002, + + // internally used types + LFS_TYPE_SPLICE = 0x400, + LFS_TYPE_NAME = 0x000, + LFS_TYPE_STRUCT = 0x200, + LFS_TYPE_USERATTR = 0x300, + LFS_TYPE_FROM = 0x100, + LFS_TYPE_TAIL = 0x600, + LFS_TYPE_GLOBALS = 0x700, + LFS_TYPE_CRC = 0x500, + + // internally used type specializations + LFS_TYPE_CREATE = 0x401, + LFS_TYPE_DELETE = 0x4ff, + LFS_TYPE_SUPERBLOCK = 0x0ff, + LFS_TYPE_DIRSTRUCT = 0x200, + LFS_TYPE_CTZSTRUCT = 0x202, + LFS_TYPE_INLINESTRUCT = 0x201, + LFS_TYPE_SOFTTAIL = 0x600, + LFS_TYPE_HARDTAIL = 0x601, + LFS_TYPE_MOVESTATE = 0x7ff, + + // internal chip sources + LFS_FROM_NOOP = 0x000, + LFS_FROM_MOVE = 0x101, + LFS_FROM_USERATTRS = 0x102, +}; + +// File open flags +enum lfs_open_flags { + // open flags + LFS_O_RDONLY = 1, // Open a file as read only + LFS_O_WRONLY = 2, // Open a file as write only + LFS_O_RDWR = 3, // Open a file as read and write + LFS_O_CREAT = 0x0100, // Create a file if it does not exist + LFS_O_EXCL = 0x0200, // Fail if a file already exists + LFS_O_TRUNC = 0x0400, // Truncate the existing file to zero size + LFS_O_APPEND = 0x0800, // Move to end of file on every write + + // internally used flags + LFS_F_DIRTY = 0x010000, // File does not match storage + LFS_F_WRITING = 0x020000, // File has been written since last flush + LFS_F_READING = 0x040000, // File has been read since last flush + LFS_F_ERRED = 0x080000, // An error occured during write + LFS_F_INLINE = 0x100000, // Currently inlined in directory entry + LFS_F_OPENED = 0x200000, // File has been opened +}; + +// File seek flags +enum lfs_whence_flags { + LFS_SEEK_SET = 0, // Seek relative to an absolute position + LFS_SEEK_CUR = 1, // Seek relative to the current file position + LFS_SEEK_END = 2, // Seek relative to the end of the file +}; + + +// Configuration provided during initialization of the littlefs +struct lfs_config { + // Opaque user provided context that can be used to pass + // information to the block device operations + void *context; + + // Read a region in a block. Negative error codes are propogated + // to the user. + int (*read)(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size); + + // Program a region in a block. The block must have previously + // been erased. Negative error codes are propogated to the user. + // May return LFS_ERR_CORRUPT if the block should be considered bad. + int (*prog)(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, const void *buffer, lfs_size_t size); + + // Erase a block. A block must be erased before being programmed. + // The state of an erased block is undefined. Negative error codes + // are propogated to the user. + // May return LFS_ERR_CORRUPT if the block should be considered bad. + int (*erase)(const struct lfs_config *c, lfs_block_t block); + + // Sync the state of the underlying block device. Negative error codes + // are propogated to the user. + int (*sync)(const struct lfs_config *c); + + // Minimum size of a block read. All read operations will be a + // multiple of this value. + lfs_size_t read_size; + + // Minimum size of a block program. All program operations will be a + // multiple of this value. + lfs_size_t prog_size; + + // Size of an erasable block. This does not impact ram consumption and + // may be larger than the physical erase size. However, non-inlined files + // take up at minimum one block. Must be a multiple of the read + // and program sizes. + lfs_size_t block_size; + + // Number of erasable blocks on the device. + lfs_size_t block_count; + + // Number of erase cycles before littlefs evicts metadata logs and moves + // the metadata to another block. Suggested values are in the + // range 100-1000, with large values having better performance at the cost + // of less consistent wear distribution. + // + // Set to -1 to disable block-level wear-leveling. + int32_t block_cycles; + + // Size of block caches. Each cache buffers a portion of a block in RAM. + // The littlefs needs a read cache, a program cache, and one additional + // cache per file. Larger caches can improve performance by storing more + // data and reducing the number of disk accesses. Must be a multiple of + // the read and program sizes, and a factor of the block size. + lfs_size_t cache_size; + + // Size of the lookahead buffer in bytes. A larger lookahead buffer + // increases the number of blocks found during an allocation pass. The + // lookahead buffer is stored as a compact bitmap, so each byte of RAM + // can track 8 blocks. Must be a multiple of 8. + lfs_size_t lookahead_size; + + // Optional statically allocated read buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *read_buffer; + + // Optional statically allocated program buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *prog_buffer; + + // Optional statically allocated lookahead buffer. Must be lookahead_size + // and aligned to a 32-bit boundary. By default lfs_malloc is used to + // allocate this buffer. + void *lookahead_buffer; + + // Optional upper limit on length of file names in bytes. No downside for + // larger names except the size of the info struct which is controlled by + // the LFS_NAME_MAX define. Defaults to LFS_NAME_MAX when zero. Stored in + // superblock and must be respected by other littlefs drivers. + lfs_size_t name_max; + + // Optional upper limit on files in bytes. No downside for larger files + // but must be <= LFS_FILE_MAX. Defaults to LFS_FILE_MAX when zero. Stored + // in superblock and must be respected by other littlefs drivers. + lfs_size_t file_max; + + // Optional upper limit on custom attributes in bytes. No downside for + // larger attributes size but must be <= LFS_ATTR_MAX. Defaults to + // LFS_ATTR_MAX when zero. + lfs_size_t attr_max; +}; + +// File info structure +struct lfs_info { + // Type of the file, either LFS_TYPE_REG or LFS_TYPE_DIR + uint8_t type; + + // Size of the file, only valid for REG files. Limited to 32-bits. + lfs_size_t size; + + // Name of the file stored as a null-terminated string. Limited to + // LFS_NAME_MAX+1, which can be changed by redefining LFS_NAME_MAX to + // reduce RAM. LFS_NAME_MAX is stored in superblock and must be + // respected by other littlefs drivers. + char name[LFS_NAME_MAX+1]; +}; + +// Custom attribute structure, used to describe custom attributes +// committed atomically during file writes. +struct lfs_attr { + // 8-bit type of attribute, provided by user and used to + // identify the attribute + uint8_t type; + + // Pointer to buffer containing the attribute + void *buffer; + + // Size of attribute in bytes, limited to LFS_ATTR_MAX + lfs_size_t size; +}; + +// Optional configuration provided during lfs_file_opencfg +struct lfs_file_config { + // Optional statically allocated file buffer. Must be cache_size. + // By default lfs_malloc is used to allocate this buffer. + void *buffer; + + // Optional list of custom attributes related to the file. If the file + // is opened with read access, these attributes will be read from disk + // during the open call. If the file is opened with write access, the + // attributes will be written to disk every file sync or close. This + // write occurs atomically with update to the file's contents. + // + // Custom attributes are uniquely identified by an 8-bit type and limited + // to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller + // than the buffer, it will be padded with zeros. If the stored attribute + // is larger, then it will be silently truncated. If the attribute is not + // found, it will be created implicitly. + struct lfs_attr *attrs; + + // Number of custom attributes in the list + lfs_size_t attr_count; +}; + + +/// internal littlefs data structures /// +typedef struct lfs_cache { + lfs_block_t block; + lfs_off_t off; + lfs_size_t size; + uint8_t *buffer; +} lfs_cache_t; + +typedef struct lfs_mdir { + lfs_block_t pair[2]; + uint32_t rev; + lfs_off_t off; + uint32_t etag; + uint16_t count; + bool erased; + bool split; + lfs_block_t tail[2]; +} lfs_mdir_t; + +// littlefs directory type +typedef struct lfs_dir { + struct lfs_dir *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + + lfs_off_t pos; + lfs_block_t head[2]; +} lfs_dir_t; + +// littlefs file type +typedef struct lfs_file { + struct lfs_file *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + + struct lfs_ctz { + lfs_block_t head; + lfs_size_t size; + } ctz; + + uint32_t flags; + lfs_off_t pos; + lfs_block_t block; + lfs_off_t off; + lfs_cache_t cache; + + const struct lfs_file_config *cfg; +} lfs_file_t; + +typedef struct lfs_superblock { + uint32_t version; + lfs_size_t block_size; + lfs_size_t block_count; + lfs_size_t name_max; + lfs_size_t file_max; + lfs_size_t attr_max; +} lfs_superblock_t; + +typedef struct lfs_gstate { + uint32_t tag; + lfs_block_t pair[2]; +} lfs_gstate_t; + +// The littlefs filesystem type +typedef struct lfs { + lfs_cache_t rcache; + lfs_cache_t pcache; + + lfs_block_t root[2]; + struct lfs_mlist { + struct lfs_mlist *next; + uint16_t id; + uint8_t type; + lfs_mdir_t m; + } *mlist; + uint32_t seed; + + lfs_gstate_t gstate; + lfs_gstate_t gdisk; + lfs_gstate_t gdelta; + + struct lfs_free { + lfs_block_t off; + lfs_block_t size; + lfs_block_t i; + lfs_block_t ack; + uint32_t *buffer; + } free; + + const struct lfs_config *cfg; + lfs_size_t name_max; + lfs_size_t file_max; + lfs_size_t attr_max; + +#ifdef LFS_MIGRATE + struct lfs1 *lfs1; +#endif +} lfs_t; + + +/// Filesystem functions /// + +// Format a block device with the littlefs +// +// Requires a littlefs object and config struct. This clobbers the littlefs +// object, and does not leave the filesystem mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_format(lfs_t *lfs, const struct lfs_config *config); + +// Mounts a littlefs +// +// Requires a littlefs object and config struct. Multiple filesystems +// may be mounted simultaneously with multiple littlefs objects. Both +// lfs and config must be allocated while mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_mount(lfs_t *lfs, const struct lfs_config *config); + +// Unmounts a littlefs +// +// Does nothing besides releasing any allocated resources. +// Returns a negative error code on failure. +int lfs_unmount(lfs_t *lfs); + +/// General operations /// + +// Removes a file or directory +// +// If removing a directory, the directory must be empty. +// Returns a negative error code on failure. +int lfs_remove(lfs_t *lfs, const char *path); + +// Rename or move a file or directory +// +// If the destination exists, it must match the source in type. +// If the destination is a directory, the directory must be empty. +// +// Returns a negative error code on failure. +int lfs_rename(lfs_t *lfs, const char *oldpath, const char *newpath); + +// Find info about a file or directory +// +// Fills out the info structure, based on the specified file or directory. +// Returns a negative error code on failure. +int lfs_stat(lfs_t *lfs, const char *path, struct lfs_info *info); + +// Get a custom attribute +// +// Custom attributes are uniquely identified by an 8-bit type and limited +// to LFS_ATTR_MAX bytes. When read, if the stored attribute is smaller than +// the buffer, it will be padded with zeros. If the stored attribute is larger, +// then it will be silently truncated. If no attribute is found, the error +// LFS_ERR_NOATTR is returned and the buffer is filled with zeros. +// +// Returns the size of the attribute, or a negative error code on failure. +// Note, the returned size is the size of the attribute on disk, irrespective +// of the size of the buffer. This can be used to dynamically allocate a buffer +// or check for existance. +lfs_ssize_t lfs_getattr(lfs_t *lfs, const char *path, + uint8_t type, void *buffer, lfs_size_t size); + +// Set custom attributes +// +// Custom attributes are uniquely identified by an 8-bit type and limited +// to LFS_ATTR_MAX bytes. If an attribute is not found, it will be +// implicitly created. +// +// Returns a negative error code on failure. +int lfs_setattr(lfs_t *lfs, const char *path, + uint8_t type, const void *buffer, lfs_size_t size); + +// Removes a custom attribute +// +// If an attribute is not found, nothing happens. +// +// Returns a negative error code on failure. +int lfs_removeattr(lfs_t *lfs, const char *path, uint8_t type); + + +/// File operations /// + +// Open a file +// +// The mode that the file is opened in is determined by the flags, which +// are values from the enum lfs_open_flags that are bitwise-ored together. +// +// Returns a negative error code on failure. +int lfs_file_open(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags); + +// Open a file with extra configuration +// +// The mode that the file is opened in is determined by the flags, which +// are values from the enum lfs_open_flags that are bitwise-ored together. +// +// The config struct provides additional config options per file as described +// above. The config struct must be allocated while the file is open, and the +// config struct must be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_file_opencfg(lfs_t *lfs, lfs_file_t *file, + const char *path, int flags, + const struct lfs_file_config *config); + +// Close a file +// +// Any pending writes are written out to storage as though +// sync had been called and releases any allocated resources. +// +// Returns a negative error code on failure. +int lfs_file_close(lfs_t *lfs, lfs_file_t *file); + +// Synchronize a file on storage +// +// Any pending writes are written out to storage. +// Returns a negative error code on failure. +int lfs_file_sync(lfs_t *lfs, lfs_file_t *file); + +// Read data from file +// +// Takes a buffer and size indicating where to store the read data. +// Returns the number of bytes read, or a negative error code on failure. +lfs_ssize_t lfs_file_read(lfs_t *lfs, lfs_file_t *file, + void *buffer, lfs_size_t size); + +// Write data to file +// +// Takes a buffer and size indicating the data to write. The file will not +// actually be updated on the storage until either sync or close is called. +// +// Returns the number of bytes written, or a negative error code on failure. +lfs_ssize_t lfs_file_write(lfs_t *lfs, lfs_file_t *file, + const void *buffer, lfs_size_t size); + +// Change the position of the file +// +// The change in position is determined by the offset and whence flag. +// Returns the new position of the file, or a negative error code on failure. +lfs_soff_t lfs_file_seek(lfs_t *lfs, lfs_file_t *file, + lfs_soff_t off, int whence); + +// Truncates the size of the file to the specified size +// +// Returns a negative error code on failure. +int lfs_file_truncate(lfs_t *lfs, lfs_file_t *file, lfs_off_t size); + +// Return the position of the file +// +// Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_CUR) +// Returns the position of the file, or a negative error code on failure. +lfs_soff_t lfs_file_tell(lfs_t *lfs, lfs_file_t *file); + +// Change the position of the file to the beginning of the file +// +// Equivalent to lfs_file_seek(lfs, file, 0, LFS_SEEK_SET) +// Returns a negative error code on failure. +int lfs_file_rewind(lfs_t *lfs, lfs_file_t *file); + +// Return the size of the file +// +// Similar to lfs_file_seek(lfs, file, 0, LFS_SEEK_END) +// Returns the size of the file, or a negative error code on failure. +lfs_soff_t lfs_file_size(lfs_t *lfs, lfs_file_t *file); + + +/// Directory operations /// + +// Create a directory +// +// Returns a negative error code on failure. +int lfs_mkdir(lfs_t *lfs, const char *path); + +// Open a directory +// +// Once open a directory can be used with read to iterate over files. +// Returns a negative error code on failure. +int lfs_dir_open(lfs_t *lfs, lfs_dir_t *dir, const char *path); + +// Close a directory +// +// Releases any allocated resources. +// Returns a negative error code on failure. +int lfs_dir_close(lfs_t *lfs, lfs_dir_t *dir); + +// Read an entry in the directory +// +// Fills out the info structure, based on the specified file or directory. +// Returns a positive value on success, 0 at the end of directory, +// or a negative error code on failure. +int lfs_dir_read(lfs_t *lfs, lfs_dir_t *dir, struct lfs_info *info); + +// Change the position of the directory +// +// The new off must be a value previous returned from tell and specifies +// an absolute offset in the directory seek. +// +// Returns a negative error code on failure. +int lfs_dir_seek(lfs_t *lfs, lfs_dir_t *dir, lfs_off_t off); + +// Return the position of the directory +// +// The returned offset is only meant to be consumed by seek and may not make +// sense, but does indicate the current position in the directory iteration. +// +// Returns the position of the directory, or a negative error code on failure. +lfs_soff_t lfs_dir_tell(lfs_t *lfs, lfs_dir_t *dir); + +// Change the position of the directory to the beginning of the directory +// +// Returns a negative error code on failure. +int lfs_dir_rewind(lfs_t *lfs, lfs_dir_t *dir); + + +/// Filesystem-level filesystem operations + +// Finds the current size of the filesystem +// +// Note: Result is best effort. If files share COW structures, the returned +// size may be larger than the filesystem actually is. +// +// Returns the number of allocated blocks, or a negative error code on failure. +lfs_ssize_t lfs_fs_size(lfs_t *lfs); + +// Traverse through all blocks in use by the filesystem +// +// The provided callback will be called with each block address that is +// currently in use by the filesystem. This can be used to determine which +// blocks are in use or how much of the storage is available. +// +// Returns a negative error code on failure. +int lfs_fs_traverse(lfs_t *lfs, int (*cb)(void*, lfs_block_t), void *data); + +#ifdef LFS_MIGRATE +// Attempts to migrate a previous version of littlefs +// +// Behaves similarly to the lfs_format function. Attempts to mount +// the previous version of littlefs and update the filesystem so it can be +// mounted with the current version of littlefs. +// +// Requires a littlefs object and config struct. This clobbers the littlefs +// object, and does not leave the filesystem mounted. The config struct must +// be zeroed for defaults and backwards compatibility. +// +// Returns a negative error code on failure. +int lfs_migrate(lfs_t *lfs, const struct lfs_config *cfg); +#endif + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/lib/libesp32/LITTLEFS/src/lfs_util.c b/lib/libesp32/LITTLEFS/src/lfs_util.c new file mode 100755 index 000000000..0b60e3b49 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/lfs_util.c @@ -0,0 +1,33 @@ +/* + * lfs util functions + * + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#include "lfs_util.h" + +// Only compile if user does not provide custom config +#ifndef LFS_CONFIG + + +// Software CRC implementation with small lookup table +uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size) { + static const uint32_t rtable[16] = { + 0x00000000, 0x1db71064, 0x3b6e20c8, 0x26d930ac, + 0x76dc4190, 0x6b6b51f4, 0x4db26158, 0x5005713c, + 0xedb88320, 0xf00f9344, 0xd6d6a3e8, 0xcb61b38c, + 0x9b64c2b0, 0x86d3d2d4, 0xa00ae278, 0xbdbdf21c, + }; + + const uint8_t *data = buffer; + + for (size_t i = 0; i < size; i++) { + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 0)) & 0xf]; + crc = (crc >> 4) ^ rtable[(crc ^ (data[i] >> 4)) & 0xf]; + } + + return crc; +} + + +#endif diff --git a/lib/libesp32/LITTLEFS/src/lfs_util.h b/lib/libesp32/LITTLEFS/src/lfs_util.h new file mode 100755 index 000000000..dbb4c5ba8 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/lfs_util.h @@ -0,0 +1,234 @@ +/* + * lfs utility functions + * + * Copyright (c) 2017, Arm Limited. All rights reserved. + * SPDX-License-Identifier: BSD-3-Clause + */ +#ifndef LFS_UTIL_H +#define LFS_UTIL_H + +// Users can override lfs_util.h with their own configuration by defining +// LFS_CONFIG as a header file to include (-DLFS_CONFIG=lfs_config.h). +// +// If LFS_CONFIG is used, none of the default utils will be emitted and must be +// provided by the config file. To start, I would suggest copying lfs_util.h +// and modifying as needed. +#ifdef LFS_CONFIG +#define LFS_STRINGIZE(x) LFS_STRINGIZE2(x) +#define LFS_STRINGIZE2(x) #x +#include LFS_STRINGIZE(LFS_CONFIG) +#else + +// System includes +#include +#include +#include +#include + +#ifndef LFS_NO_MALLOC +#include +#endif +#ifndef LFS_NO_ASSERT +#include +#endif +#if !defined(LFS_NO_DEBUG) || \ + !defined(LFS_NO_WARN) || \ + !defined(LFS_NO_ERROR) || \ + defined(LFS_YES_TRACE) +#include +#endif + +#ifdef __cplusplus +extern "C" +{ +#endif + + +// Macros, may be replaced by system specific wrappers. Arguments to these +// macros must not have side-effects as the macros can be removed for a smaller +// code footprint + +// Logging functions +#ifdef LFS_YES_TRACE +#define LFS_TRACE_(fmt, ...) \ + printf("%s:%d:trace: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_TRACE(...) LFS_TRACE_(__VA_ARGS__, "") +#else +#define LFS_TRACE(...) +#endif + +#ifndef LFS_NO_DEBUG +#define LFS_DEBUG_(fmt, ...) \ + printf("%s:%d:debug: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_DEBUG(...) LFS_DEBUG_(__VA_ARGS__, "") +#else +#define LFS_DEBUG(...) +#endif + +#ifndef LFS_NO_WARN +#define LFS_WARN_(fmt, ...) \ + printf("%s:%d:warn: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_WARN(...) LFS_WARN_(__VA_ARGS__, "") +#else +#define LFS_WARN(...) +#endif + +#ifndef LFS_NO_ERROR +#define LFS_ERROR_(fmt, ...) \ + printf("%s:%d:error: " fmt "%s\n", __FILE__, __LINE__, __VA_ARGS__) +#define LFS_ERROR(...) LFS_ERROR_(__VA_ARGS__, "") +#else +#define LFS_ERROR(...) +#endif + +// Runtime assertions +#ifndef LFS_NO_ASSERT +#define LFS_ASSERT(test) assert(test) +#else +#define LFS_ASSERT(test) +#endif + + +// Builtin functions, these may be replaced by more efficient +// toolchain-specific implementations. LFS_NO_INTRINSICS falls back to a more +// expensive basic C implementation for debugging purposes + +// Min/max functions for unsigned 32-bit numbers +static inline uint32_t lfs_max(uint32_t a, uint32_t b) { + return (a > b) ? a : b; +} + +static inline uint32_t lfs_min(uint32_t a, uint32_t b) { + return (a < b) ? a : b; +} + +// Align to nearest multiple of a size +static inline uint32_t lfs_aligndown(uint32_t a, uint32_t alignment) { + return a - (a % alignment); +} + +static inline uint32_t lfs_alignup(uint32_t a, uint32_t alignment) { + return lfs_aligndown(a + alignment-1, alignment); +} + +// Find the smallest power of 2 greater than or equal to a +static inline uint32_t lfs_npw2(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) + return 32 - __builtin_clz(a-1); +#else + uint32_t r = 0; + uint32_t s; + a -= 1; + s = (a > 0xffff) << 4; a >>= s; r |= s; + s = (a > 0xff ) << 3; a >>= s; r |= s; + s = (a > 0xf ) << 2; a >>= s; r |= s; + s = (a > 0x3 ) << 1; a >>= s; r |= s; + return (r | (a >> 1)) + 1; +#endif +} + +// Count the number of trailing binary zeros in a +// lfs_ctz(0) may be undefined +static inline uint32_t lfs_ctz(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && defined(__GNUC__) + return __builtin_ctz(a); +#else + return lfs_npw2((a & -a) + 1) - 1; +#endif +} + +// Count the number of binary ones in a +static inline uint32_t lfs_popc(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && (defined(__GNUC__) || defined(__CC_ARM)) + return __builtin_popcount(a); +#else + a = a - ((a >> 1) & 0x55555555); + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); + return (((a + (a >> 4)) & 0xf0f0f0f) * 0x1010101) >> 24; +#endif +} + +// Find the sequence comparison of a and b, this is the distance +// between a and b ignoring overflow +static inline int lfs_scmp(uint32_t a, uint32_t b) { + return (int)(unsigned)(a - b); +} + +// Convert between 32-bit little-endian and native order +static inline uint32_t lfs_fromle32(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) + return a; +#elif !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + return __builtin_bswap32(a); +#else + return (((uint8_t*)&a)[0] << 0) | + (((uint8_t*)&a)[1] << 8) | + (((uint8_t*)&a)[2] << 16) | + (((uint8_t*)&a)[3] << 24); +#endif +} + +static inline uint32_t lfs_tole32(uint32_t a) { + return lfs_fromle32(a); +} + +// Convert between 32-bit big-endian and native order +static inline uint32_t lfs_frombe32(uint32_t a) { +#if !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_LITTLE_ENDIAN ) && BYTE_ORDER == ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_LITTLE_ENDIAN ) && __BYTE_ORDER == __ORDER_LITTLE_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)) + return __builtin_bswap32(a); +#elif !defined(LFS_NO_INTRINSICS) && ( \ + (defined( BYTE_ORDER ) && defined( ORDER_BIG_ENDIAN ) && BYTE_ORDER == ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER ) && defined(__ORDER_BIG_ENDIAN ) && __BYTE_ORDER == __ORDER_BIG_ENDIAN ) || \ + (defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)) + return a; +#else + return (((uint8_t*)&a)[0] << 24) | + (((uint8_t*)&a)[1] << 16) | + (((uint8_t*)&a)[2] << 8) | + (((uint8_t*)&a)[3] << 0); +#endif +} + +static inline uint32_t lfs_tobe32(uint32_t a) { + return lfs_frombe32(a); +} + +// Calculate CRC-32 with polynomial = 0x04c11db7 +uint32_t lfs_crc(uint32_t crc, const void *buffer, size_t size); + +// Allocate memory, only used if buffers are not provided to littlefs +// Note, memory must be 64-bit aligned +static inline void *lfs_malloc(size_t size) { +#ifndef LFS_NO_MALLOC + return malloc(size); +#else + (void)size; + return NULL; +#endif +} + +// Deallocate memory, only used if buffers are not provided to littlefs +static inline void lfs_free(void *p) { +#ifndef LFS_NO_MALLOC + free(p); +#else + (void)p; +#endif +} + + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif +#endif diff --git a/lib/libesp32/LITTLEFS/src/littlefs_api.c b/lib/libesp32/LITTLEFS/src/littlefs_api.c new file mode 100755 index 000000000..4098487c6 --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/littlefs_api.c @@ -0,0 +1,58 @@ +/** + * @file littlefs_api.c + * @brief Maps the HAL of esp_partition <-> littlefs + * @author Brian Pugh + */ + +#define ESP_LOCAL_LOG_LEVEL ESP_LOG_INFO + +#include "esp_log.h" +#include "esp_partition.h" +#include "esp_vfs.h" +#include "lfs.h" +#include "esp_littlefs.h" +#include "littlefs_api.h" + +static const char TAG[] = "esp_littlefs_api"; + +int littlefs_api_read(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size) { + esp_littlefs_t * efs = c->context; + size_t part_off = (block * c->block_size) + off; + esp_err_t err = esp_partition_read(efs->partition, part_off, buffer, size); + if (err) { + ESP_LOGE(TAG, "failed to read addr %08x, size %08x, err %d", part_off, size, err); + return LFS_ERR_IO; + } + return 0; +} + +int littlefs_api_prog(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, const void *buffer, lfs_size_t size) { + esp_littlefs_t * efs = c->context; + size_t part_off = (block * c->block_size) + off; + esp_err_t err = esp_partition_write(efs->partition, part_off, buffer, size); + if (err) { + ESP_LOGE(TAG, "failed to write addr %08x, size %08x, err %d", part_off, size, err); + return LFS_ERR_IO; + } + return 0; +} + +int littlefs_api_erase(const struct lfs_config *c, lfs_block_t block) { + esp_littlefs_t * efs = c->context; + size_t part_off = block * c->block_size; + esp_err_t err = esp_partition_erase_range(efs->partition, part_off, c->block_size); + if (err) { + ESP_LOGE(TAG, "failed to erase addr %08x, size %08x, err %d", part_off, c->block_size, err); + return LFS_ERR_IO; + } + return 0; + +} + +int littlefs_api_sync(const struct lfs_config *c) { + /* Unnecessary for esp-idf */ + return 0; +} + diff --git a/lib/libesp32/LITTLEFS/src/littlefs_api.h b/lib/libesp32/LITTLEFS/src/littlefs_api.h new file mode 100755 index 000000000..c1b2adc9a --- /dev/null +++ b/lib/libesp32/LITTLEFS/src/littlefs_api.h @@ -0,0 +1,106 @@ +#ifndef ESP_LITTLEFS_API_H__ +#define ESP_LITTLEFS_API_H__ + +#include +#include +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/semphr.h" +#include "esp_vfs.h" +#include "esp_partition.h" +#include "lfs.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief a file descriptor + * That's also a singly linked list used for keeping tracks of all opened file descriptor + * + * Shortcomings/potential issues of 32-bit hash (when CONFIG_LITTLEFS_USE_ONLY_HASH) listed here: + * * unlink - If a different file is open that generates a hash collision, it will report an + * error that it cannot unlink an open file. + * * rename - If a different file is open that generates a hash collision with + * src or dst, it will report an error that it cannot rename an open file. + * Potential consequences: + * 1. A file cannot be deleted while a collision-geneating file is open. + * Worst-case, if the other file is always open during the lifecycle + * of your app, it's collision file cannot be deleted, which in the + * worst-case could cause storage-capacity issues. + * 2. Same as (1), but for renames + */ +typedef struct _vfs_littlefs_file_t { + lfs_file_t file; + uint32_t hash; + struct _vfs_littlefs_file_t * next; /*!< Pointer to next file in Singly Linked List */ +#ifndef CONFIG_LITTLEFS_USE_ONLY_HASH + char * path; +#endif +} vfs_littlefs_file_t; + +/** + * @brief littlefs definition structure + */ +typedef struct { + lfs_t *fs; /*!< Handle to the underlying littlefs */ + SemaphoreHandle_t lock; /*!< FS lock */ + const esp_partition_t* partition; /*!< The partition on which littlefs is located */ + char base_path[ESP_VFS_PATH_MAX+1]; /*!< Mount point */ + + struct lfs_config cfg; /*!< littlefs Mount configuration */ + + vfs_littlefs_file_t *file; /*!< Singly Linked List of files */ + + vfs_littlefs_file_t **cache; /*!< A cache of pointers to the opened files */ + uint16_t cache_size; /*!< The cache allocated size (in pointers) */ + uint16_t fd_count; /*!< The count of opened file descriptor used to speed up computation */ +} esp_littlefs_t; + +/** + * @brief Read a region in a block. + * + * Negative error codes are propogated to the user. + * + * @return errorcode. 0 on success. + */ +int littlefs_api_read(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, void *buffer, lfs_size_t size); + +/** + * @brief Program a region in a block. + * + * The block must have previously been erased. + * Negative error codes are propogated to the user. + * May return LFS_ERR_CORRUPT if the block should be considered bad. + * + * @return errorcode. 0 on success. + */ +int littlefs_api_prog(const struct lfs_config *c, lfs_block_t block, + lfs_off_t off, const void *buffer, lfs_size_t size); + +/** + * @brief Erase a block. + * + * A block must be erased before being programmed. + * The state of an erased block is undefined. + * Negative error codes are propogated to the user. + * May return LFS_ERR_CORRUPT if the block should be considered bad. + * @return errorcode. 0 on success. + */ +int littlefs_api_erase(const struct lfs_config *c, lfs_block_t block); + +/** + * @brief Sync the state of the underlying block device. + * + * Negative error codes are propogated to the user. + * + * @return errorcode. 0 on success. + */ +int littlefs_api_sync(const struct lfs_config *c); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 3615ebbaa..36984a992 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -53,6 +53,7 @@ driver enabled by #include #include #else +#include #include #include "FFat.h" #include "FS.h" @@ -78,7 +79,8 @@ uint8_t ufs_type; #define UFS_TNONE 0 #define UFS_TSDC 1 #define UFS_TFAT 2 -#define UFS_TSPIFFS 3 +#define UFS_TLFS 3 +#define UFS_TSPIFFS 4 #ifndef UFS_SDCS #define UFS_SDCS 4 @@ -113,21 +115,24 @@ void UFSInit(void) { // if no success with sd card try flash fs #ifdef ESP8266 ufsp = &LittleFS; - if (!fsp->begin()) { + if (!LittleFS.begin()) { return; } #else ufsp = &FFat; if (!FFat.begin(true)) { - if (!SPIFFS.begin(true)) { + ufsp = &LITTLEFS; + if (!LITTLEFS.begin(true)) { + ufsp = &SPIFFS; + if (!SPIFFS.begin(true)) { + return; + } + ufs_type = UFS_TSPIFFS; return; } - ufsp = &SPIFFS; - ufs_type = UFS_TSPIFFS; + ufs_type = UFS_TLFS; return; } - - #endif ufs_type = UFS_TFAT; return; @@ -145,10 +150,11 @@ uint32_t result = 0; result = (SD.totalBytes() - SD.usedBytes()); } #else - // currently no support on esp8266 + // currently no size support on esp8266 sdcard #endif break; - case UFS_TFAT: + + case UFS_TLFS: #ifdef ESP8266 FSInfo64 fsinfo; ufsp->info64(fsinfo); @@ -158,6 +164,16 @@ uint32_t result = 0; result = (fsinfo.totalBytes - fsinfo.usedBytes); } #else + if (sel == 0) { + result = LITTLEFS.totalBytes(); + } else { + result = LITTLEFS.totalBytes() - LITTLEFS.usedBytes(); + } +#endif + break; + + case UFS_TFAT: +#ifdef ESP32 if (sel == 0) { result = FFat.totalBytes(); } else { @@ -165,6 +181,7 @@ uint32_t result = 0; } #endif break; + case UFS_TSPIFFS: if (sel == 0) { result = SPIFFS.totalBytes(); @@ -385,9 +402,7 @@ uint8_t UFS_DownloadFile(char *file) { File download_file; WiFiClient download_Client; - AddLog_P(LOG_LEVEL_INFO, PSTR("file not found %s"),file); - - if (*file == '/') file++; + //AddLog_P(LOG_LEVEL_INFO, PSTR("file not found %s"),file); if (!ufsp->exists(file)) { AddLog_P(LOG_LEVEL_INFO, PSTR("file not found")); From 55d0f9991011ef0b98d5573aab2c107d3284ea93 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 31 Dec 2020 20:22:54 +0100 Subject: [PATCH 056/255] little fs is default --- esp32_partition_app1572k_spiffs983k.csv | 6 ++++++ esp32_partition_app1984k_spiffs12M.csv | 6 ++++++ tasmota/xdrv_98_filesystem.ino | 15 +++++++++------ 3 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 esp32_partition_app1572k_spiffs983k.csv create mode 100644 esp32_partition_app1984k_spiffs12M.csv diff --git a/esp32_partition_app1572k_spiffs983k.csv b/esp32_partition_app1572k_spiffs983k.csv new file mode 100644 index 000000000..12ea02fda --- /dev/null +++ b/esp32_partition_app1572k_spiffs983k.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x180000, +app1, app, ota_1, 0x190000, 0x180000, +spiffs, data, spiffs, 0x310000,0x0F0000, diff --git a/esp32_partition_app1984k_spiffs12M.csv b/esp32_partition_app1984k_spiffs12M.csv new file mode 100644 index 000000000..3ffb831ba --- /dev/null +++ b/esp32_partition_app1984k_spiffs12M.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x1F0000, +app1, app, ota_1, 0x200000, 0x1F0000, +spiffs, data, spiffs, 0x3F0000,0xC10000, diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 36984a992..78b79a2be 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -119,10 +119,13 @@ void UFSInit(void) { return; } #else - ufsp = &FFat; - if (!FFat.begin(true)) { - ufsp = &LITTLEFS; - if (!LITTLEFS.begin(true)) { + // try lfs first + ufsp = &LITTLEFS; + if (!LITTLEFS.begin(true)) { + // ffat is second + ufsp = &FFat; + if (!FFat.begin(true)) { + // spiffs is last ufsp = &SPIFFS; if (!SPIFFS.begin(true)) { return; @@ -130,11 +133,11 @@ void UFSInit(void) { ufs_type = UFS_TSPIFFS; return; } - ufs_type = UFS_TLFS; + ufs_type = UFS_TFAT; return; } #endif - ufs_type = UFS_TFAT; + ufs_type = UFS_TLFS; return; } From 08d65c69d50fcceb781f635b39d433e5ba71c03a Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Fri, 1 Jan 2021 01:37:08 +0100 Subject: [PATCH 057/255] show time and date in DiplayMode 3 and 5 --- tasmota/xdsp_14_SSD1331.ino | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index ac6e3e994..cae0c9aa2 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -28,8 +28,9 @@ #define USE_TINY_FONT #define SSD1331_BLACK 0x0000 // 0, 0, 0 -#define SSD1331_RED 0xF800 // 255, 0, 0 #define SSD1331_WHITE 0xFFFF // 255, 255, 255 +#define SSD1331_RED 0xF800 // 255, 0, 0 +#define SSD1331_BLUE 0x001F // 0, 0, 255 #include #include @@ -90,7 +91,7 @@ void SSD1331_InitDriver() { #ifdef USE_DISPLAY_MODES1TO5 -void SSD1331PrintLog(void) +void SSD1331PrintLog(bool withDateTime) { disp_refresh--; if (!disp_refresh) { @@ -103,6 +104,16 @@ void SSD1331PrintLog(void) renderer->clearDisplay(); renderer->setCursor(0,0); + + if (withDateTime) { + char line[17]; + snprintf_P(line, sizeof(line), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d %02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.hour, RtcTime.minute, RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [12:34 01-02-2018] + renderer->setTextColor(SSD1331_BLUE); + renderer->println(line); + renderer->setTextColor(fg_color); + last_row--; + } + for (byte i = 0; i < last_row; i++) { strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); renderer->println(disp_screen_buffer[i]); @@ -139,10 +150,12 @@ void SSD1331Refresh(void) // Every second SSD1331Time(); break; case 2: // Local - case 3: // Local case 4: // Mqtt - case 5: // Mqtt - SSD1331PrintLog(); + SSD1331PrintLog(false); + break; + case 3: // Local + Time + case 5: // Mqtt + Time + SSD1331PrintLog(true); break; } } From 96ecffe5710f2616e5cda50647508a80f2955694 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 06:43:50 +0100 Subject: [PATCH 058/255] reduce stack pressure, some fixes --- tasmota/xdrv_10_scripter.ino | 347 ++++++++++++++++++++++------------- 1 file changed, 217 insertions(+), 130 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 6f7351c7d..280e02f12 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -499,6 +499,17 @@ uint8_t fast_script=0; uint8_t glob_script=0; uint32_t script_lastmillis; +void Script_AddLog_P(uint32_t loglevel, PGM_P formatP, ...) { + char log_data[128]; + + va_list arg; + va_start(arg, formatP); + vsnprintf_P(log_data, sizeof(log_data), formatP, arg); + va_end(arg); + + AddLogData(loglevel, log_data); +} + void flt2char(float num, char *nbuff) { dtostrfd(num, glob_script_mem.script_dprec, nbuff); } @@ -578,7 +589,9 @@ float *Get_MFAddr(uint8_t index, uint16_t *len, uint16_t *ipos); int16_t Init_Scripter(void) { char *script; + int16_t err = 0; script = glob_script_mem.script_ram; + if (!*script) return -999; // scan lines for >DEF uint16_t lines = 0; @@ -586,15 +599,56 @@ char *script; uint16_t svars = 0; uint16_t vars = 0; char *lp = script; - char vnames[MAXVARS*10]; - char *vnames_p = vnames; + uint16_t imemsize = (MAXVARS*10) + 4; + uint8_t *imemptr = (uint8_t*)calloc(imemsize, 1); + if (!imemptr) { + return -7; + } + + //ClaimSerial(); + //SetSerialBaudrate(115200); + //Serial.printf("size %d\n",imemsize); + //Serial.printf("stack %d\n",GetStack()); // 2848 + // 2896 + //char vnames[MAXVARS*10]; + char *vnames = (char*)imemptr; + char *vnp[MAXVARS]; + float fvalues[MAXVARS]; + struct T_INDEX vtypes[MAXVARS]; + +/* + uint32_t imemp = (uint32_t)imemptr; + imemp += (MAXVARS*10); + imemp = (imemp & 0xfffc) + 4; + Serial.printf(">1 %x\n",imemp); + char *vnp[MAXVARS]; + + //char **vnp = (char**)imemp; + imemp += (sizeof(char*)*MAXVARS); + imemp = (imemp & 0xfffc) + 4; + Serial.printf(">2 %x\n",imemp); + + float fvalues[MAXVARS]; + //float *fvalues = (float*)imemp; + imemp += (sizeof(float*)*MAXVARS); + imemp = (imemp & 0xfffc) + 4; + Serial.printf(">3 %x\n",imemp); + + struct T_INDEX vtypes[MAXVARS]; + //struct T_INDEX *vtypes = (struct T_INDEX*)imemp; +*/ + + char *vnames_p = vnames; char **vnp_p = vnp; + char strings[MAXSVARS*SCRIPT_MAXSSIZE]; + char *snp[MAXSVARS]; + struct M_FILT mfilt[MAXFILT]; char *strings_p = strings; - char *snp[MAXSVARS]; + char **snp_p = snp; uint8_t numperm = 0; uint8_t numflt = 0; @@ -603,10 +657,6 @@ char *script; glob_script_mem.max_ssize = SCRIPT_SVARSIZE; glob_script_mem.scriptptr = 0; - if (!*script) return -999; - - float fvalues[MAXVARS]; - struct T_INDEX vtypes[MAXVARS]; char init = 0; while (1) { // check line @@ -674,6 +724,7 @@ char *script; vtypes[vars].index = numflt; numflt++; if (numflt>MAXFILT) { + if (imemptr) free(imemptr); return -6; } } else { @@ -699,6 +750,7 @@ char *script; if (!vtypes[vars].bits.is_filter) vtypes[vars].index = nvars; nvars++; if (nvars>MAXNVARS) { + if (imemptr) free(imemptr); return -1; } if (vtypes[vars].bits.is_filter) { @@ -731,11 +783,13 @@ char *script; vtypes[vars].index = svars; svars++; if (svars>MAXSVARS) { + if (imemptr) free(imemptr); return -2; } } vars++; if (vars>MAXVARS) { + if (imemptr) free(imemptr); return -3; } } @@ -786,6 +840,7 @@ char *script; uint8_t *script_mem; script_mem = (uint8_t*)calloc(script_mem_size, 1); if (!script_mem) { + if (imemptr) free(imemptr); return -4; } glob_script_mem.script_mem = script_mem; @@ -841,7 +896,6 @@ char *script; //memcpy(script_mem,strings,size); script_mem += size; - // now must recalc memory offsets uint16_t index = 0; #ifdef SCRIPT_LARGE_VNBUFF @@ -864,11 +918,13 @@ char *script; index++; if (index > MAXVNSIZ) { free(glob_script_mem.script_mem); + if (imemptr) free(imemptr); return -5; } } + // variables usage info - AddLog_P(LOG_LEVEL_INFO, PSTR("Script: nv=%d, tv=%d, vns=%d, ram=%d"), nvars, svars, index, glob_script_mem.script_mem_size); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("Script: nv=%d, tv=%d, vns=%d, ram=%d"), nvars, svars, index, glob_script_mem.script_mem_size); // copy string variables char *cp1 = glob_script_mem.glob_snp; @@ -940,7 +996,6 @@ char *script; } } - #ifdef USE_SCRIPT_FATFS if (!glob_script_mem.script_sd_found) { @@ -985,8 +1040,10 @@ char *script; } #endif //USE_SCRIPT_GLOBVARS - return 0; - + if (imemptr) { + free(imemptr); + } + return err; } #ifdef USE_SCRIPT_FATFS @@ -1072,10 +1129,10 @@ void Script_Init_UDP() { if (glob_script_mem.udp_flags.udp_connected) return; if (Script_PortUdp.beginMulticast(WiFi.localIP(), IPAddress(239,255,255,250), SCRIPT_UDP_PORT)) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP started")); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP started")); glob_script_mem.udp_flags.udp_connected = 1; } else { - AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP failed")); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP failed")); glob_script_mem.udp_flags.udp_connected = 0; } } @@ -1089,7 +1146,7 @@ void Script_PollUdp(void) { int32_t len = Script_PortUdp.read(packet_buffer, SCRIPT_UDP_BUFFER_SIZE - 1); packet_buffer[len] = 0; script_udp_remote_ip = Script_PortUdp.remoteIP(); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("UDP: Packet %s - %d - %s"), packet_buffer, len, script_udp_remote_ip.toString().c_str()); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("UDP: Packet %s - %d - %s"), packet_buffer, len, script_udp_remote_ip.toString().c_str()); char *lp=packet_buffer; if (!strncmp(lp,"=>", 2)) { lp += 2; @@ -1108,10 +1165,10 @@ void Script_PollUdp(void) { uint32_t index; uint32_t res = match_vars(vnam, &fp, &sp, &index); if (res == NUM_RES) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("num var found - %s - %d - %d"), vnam, res, index); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("num var found - %s - %d - %d"), vnam, res, index); *fp=CharToFloat(cp + 1); } else if (res == STR_RES) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("string var found - %s - %d - %d"), vnam, res, index); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("string var found - %s - %d - %d"), vnam, res, index); strlcpy(sp, cp + 1, SCRIPT_MAXSSIZE); } else { // error var not found @@ -1145,10 +1202,10 @@ void script_udp_sendvar(char *vname,float *fp,char *sp) { char flstr[16]; dtostrfd(*fp, 8, flstr); strcat(sbuf, flstr); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("num var updated - %s"), sbuf); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("num var updated - %s"), sbuf); } else { strcat(sbuf, sp); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("string var updated - %s"), sbuf); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("string var updated - %s"), sbuf); } Script_PortUdp.beginPacket(IPAddress(239, 255, 255, 250), SCRIPT_UDP_PORT); // Udp.print(String("RET UC: ") + String(recv_Packet)); @@ -1269,7 +1326,7 @@ void Set_MFVal(uint8_t index, uint16_t bind, float val) { if (val < 0 || val >= maxind) val = 0; mflp->index = val; } else { - if (bind > 1 && bind <= maxind) { + if (bind >= 1 && bind <= maxind) { mflp->rbuff[bind-1] = val; } } @@ -2053,7 +2110,7 @@ chknext: if (!glob_script_mem.file_flags[cnt].is_open) { if (mode==0) { #ifdef DEBUG_FS - AddLog_P(LOG_LEVEL_INFO, PSTR("open file for read %d"), cnt); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("open file for read %d"), cnt); #endif glob_script_mem.files[cnt] = fsp->open(str, FILE_READ); if (glob_script_mem.files[cnt].isDirectory()) { @@ -2067,12 +2124,12 @@ chknext: if (mode==1) { glob_script_mem.files[cnt] = fsp->open(str,FILE_WRITE); #ifdef DEBUG_FS - AddLog_P(LOG_LEVEL_INFO, PSTR("open file for write %d"), cnt); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("open file for write %d"), cnt); #endif } else { glob_script_mem.files[cnt] = fsp->open(str,FILE_APPEND); #ifdef DEBUG_FS - AddLog_P(LOG_LEVEL_INFO, PSTR("open file for append %d"), cnt); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("open file for append %d"), cnt); #endif } } @@ -2080,7 +2137,7 @@ chknext: fvar = cnt; glob_script_mem.file_flags[cnt].is_open = 1; } else { - AddLog_P(LOG_LEVEL_INFO, PSTR("file open failed")); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("file open failed")); } break; } @@ -2095,7 +2152,7 @@ chknext: uint8_t ind = fvar; if (ind>=SFS_MAX) ind = SFS_MAX - 1; #ifdef DEBUG_FS - AddLog_P(LOG_LEVEL_INFO, PSTR("closing file %d"), ind); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("closing file %d"), ind); #endif glob_script_mem.files[ind].close(); glob_script_mem.file_flags[ind].is_open = 0; @@ -2231,7 +2288,7 @@ chknext: } else { fvar = 0; } - //AddLog_P(LOG_LEVEL_INFO, PSTR("picture save: %d"), len); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("picture save: %d"), len); } else { fvar = 0; } @@ -3624,7 +3681,7 @@ void Replace_Cmd_Vars(char *srcbuf, uint32_t srcsize, char *dstbuf, uint32_t dst void toLog(const char *str) { if (!str) return; - AddLog_P(LOG_LEVEL_INFO, str); + Script_AddLog_P(LOG_LEVEL_INFO, str); } @@ -4332,7 +4389,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { } cmd[count] = *lp++; } - //AddLog_P(LOG_LEVEL_INFO, tmp); + //Script_AddLog_P(LOG_LEVEL_INFO, tmp); // replace vars in cmd char *tmp = cmdmem + SCRIPT_CMDMEM / 2; Replace_Cmd_Vars(cmd, 0, tmp, SCRIPT_CMDMEM / 2); @@ -4344,7 +4401,7 @@ int16_t Run_script_sub(const char *type, int8_t tlen, JsonParserObject *jo) { } else { if (!sflag) { tasm_cmd_activ = 1; - AddLog_P(glob_script_mem.script_loglevel&0x7f, PSTR("Script: performs \"%s\""), tmp); + Script_AddLog_P(glob_script_mem.script_loglevel&0x7f, PSTR("Script: performs \"%s\""), tmp); } else if (sflag==2) { // allow recursive call } else { @@ -4867,13 +4924,13 @@ uint8_t sc_state; // upload script and start immediately void script_upload_start(void) { - //AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: file upload execute")); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: file upload execute")); HTTPUpload& upload = Webserver->upload(); if (upload.status == UPLOAD_FILE_START) { - //AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload start")); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload start")); script_ex_ptr = (uint8_t*)glob_script_mem.script_ram; - //AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload file %s, %d"),upload.filename.c_str(),upload.totalSize); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload file %s, %d"),upload.filename.c_str(),upload.totalSize); if (strcmp(upload.filename.c_str(), "execute_script")) { Web.upload_error = 1; @@ -4891,7 +4948,7 @@ void script_upload_start(void) { bitWrite(Settings.rule_enabled, 0, 0); } else if(upload.status == UPLOAD_FILE_WRITE) { - //AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload write")); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload write")); uint32_t csiz = upload.currentSize; uint32_t tsiz = glob_script_mem.script_size - 1; if (uplsizeupload(); if (upload.status == UPLOAD_FILE_START) { char npath[48]; @@ -5103,7 +5160,7 @@ void script_upload(void) { } else if(upload.status == UPLOAD_FILE_END) { if (upload_file) upload_file.close(); if (Web.upload_error) { - AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload error")); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload error")); } } else { Web.upload_error=1; @@ -5116,13 +5173,13 @@ uint8_t DownloadFile(char *file) { WiFiClient download_Client; if (!fsp->exists(file)) { - AddLog_P(LOG_LEVEL_INFO,PSTR("file not found")); + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("file not found")); return 0; } download_file = fsp->open(file, FILE_READ); if (!download_file) { - AddLog_P(LOG_LEVEL_INFO,PSTR("could not open file")); + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("could not open file")); return 0; } @@ -5189,7 +5246,7 @@ void HandleScriptConfiguration(void) { if (!HttpCheckPriviledgedAccess()) { return; } - AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_CONFIGURE_SCRIPT)); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_CONFIGURE_SCRIPT)); #ifdef USE_SCRIPT_FATFS if (Webserver->hasArg("d1")) { @@ -5320,7 +5377,7 @@ void ScriptSaveSettings(void) { strlcpy(glob_script_mem.script_ram, str.c_str(), glob_script_mem.script_size); if (glob_script_mem.script_ram[0]!='>' && glob_script_mem.script_ram[1]!='D') { - AddLog_P(LOG_LEVEL_INFO, PSTR("script error: must start with >D")); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("script error: must start with >D")); bitWrite(Settings.rule_enabled, 0, 0); } @@ -5333,14 +5390,14 @@ void ScriptSaveSettings(void) { // uint32_t script_compress(char *dest, uint32_t size) { - //AddLog_P(LOG_LEVEL_INFO,PSTR("in string: %s len = %d"),glob_script_mem.script_ram,strlen(glob_script_mem.script_ram)); + //Script_AddLog_P(LOG_LEVEL_INFO,PSTR("in string: %s len = %d"),glob_script_mem.script_ram,strlen(glob_script_mem.script_ram)); uint32_t len_compressed = SCRIPT_COMPRESS(glob_script_mem.script_ram, strlen(glob_script_mem.script_ram), dest, size); if (len_compressed > 0) { dest[len_compressed] = 0; - AddLog_P(LOG_LEVEL_INFO,PSTR("script compressed to %d bytes = %d %%"),len_compressed,len_compressed * 100 / strlen(glob_script_mem.script_ram)); + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("script compressed to %d bytes = %d %%"),len_compressed,len_compressed * 100 / strlen(glob_script_mem.script_ram)); return 0; } else { - AddLog_P(LOG_LEVEL_INFO, PSTR("script compress error: %d"), len_compressed); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("script compress error: %d"), len_compressed); return 1; } } @@ -5367,7 +5424,7 @@ void SaveScriptEnd(void) { int16_t res = Init_Scripter(); if (res) { - AddLog_P(LOG_LEVEL_INFO, PSTR("script init error: %d"), res); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("script init error: %d"), res); return; } @@ -5693,7 +5750,7 @@ void Script_Check_Hue(String *response) { } *response += String(EncodeLightId(hue_devs + TasmotaGlobal.devices_present + 1))+"\":"; Script_HueStatus(response, hue_devs); - //AddLog_P(LOG_LEVEL_INFO, PSTR("Hue: %s - %d "),response->c_str(), hue_devs); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("Hue: %s - %d "),response->c_str(), hue_devs); } hue_devs++; @@ -5708,7 +5765,7 @@ void Script_Check_Hue(String *response) { } #if 0 if (response) { - AddLog_P(LOG_LEVEL_DEBUG, PSTR("Hue: %d"), hue_devs); + Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("Hue: %d"), hue_devs); toLog(">>>>"); toLog(response->c_str()); toLog(response->c_str()+LOGSZ); @@ -5853,7 +5910,7 @@ void Script_Handle_Hue(String *path) { } else { response = FPSTR(sHUE_ERROR_JSON); } - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_HTTP D_HUE " Result (%s)"), response.c_str()); + Script_AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_HTTP D_HUE " Result (%s)"), response.c_str()); WSSend(code, CT_JSON, response); if (resp) { Run_Scripter(">E", 2, 0); @@ -5867,7 +5924,7 @@ bool Script_SubCmd(void) { if (!bitRead(Settings.rule_enabled, 0)) return false; if (tasm_cmd_activ) return false; - //AddLog_P(LOG_LEVEL_INFO,PSTR(">> %s, %s, %d, %d "),XdrvMailbox.topic, XdrvMailbox.data, XdrvMailbox.payload, XdrvMailbox.index); + //Script_AddLog_P(LOG_LEVEL_INFO,PSTR(">> %s, %s, %d, %d "),XdrvMailbox.topic, XdrvMailbox.data, XdrvMailbox.payload, XdrvMailbox.index); char command[CMDSZ]; strlcpy(command, XdrvMailbox.topic, CMDSZ); @@ -5895,7 +5952,7 @@ bool Script_SubCmd(void) { } //toLog(cmdbuff); uint32_t res = Run_Scripter(cmdbuff, tlen + 1, 0); - //AddLog_P(LOG_LEVEL_INFO,">>%d",res); + //Script_AddLog_P(LOG_LEVEL_INFO,">>%d",res); if (res) { return false; } @@ -6026,10 +6083,87 @@ void dateTime(uint16_t* date, uint16_t* time) { #endif //USE_SCRIPT_FATFS -//#define DEBUG_MQTT_EVENT + #ifdef SUPPORT_MQTT_EVENT +//#define DEBUG_MQTT_EVENT + +uint32_t JsonParsePath(JsonParserObject *jobj, const char *spath, char delim, float *nres, char *sres, uint32_t slen) { + uint32_t res = 0; + const char *cp = spath; +#ifdef DEBUG_MQTT_EVENT +// Script_AddLog_P(LOG_LEVEL_INFO, PSTR("Script: parsing json key: %s from json: %s"), cp, jpath); +#endif + JsonParserObject obj = *jobj; + JsonParserObject lastobj = obj; + char selem[32]; + uint8_t aindex = 0; + String value = ""; + while (1) { + // read next element + for (uint32_t sp=0; sp%s=%d\n"), event_item.Event.c_str(), ep); - } else { - snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str()); - } + if (!strncmp(lkey.c_str(), "Epoch", 5)) { + uint32_t ep = atoi(value.c_str()) - (uint32_t)EPOCH_OFFSET; + snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=%d\n"), event_item.Event.c_str(), ep); + } else { + snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str()); + } #ifdef DEBUG_MQTT_EVENT - AddLog_P(LOG_LEVEL_INFO, PSTR("Script: setting script var %s"), sbuffer); + Script_AddLog_P(LOG_LEVEL_INFO, PSTR("Script: setting script var %s"), sbuffer); #endif - //toLog(sbuffer); - execute_script(sbuffer); + //toLog(sbuffer); + execute_script(sbuffer); + } } } } @@ -6221,7 +6308,7 @@ String ScriptSubscribe(const char *data, int data_len) } } } - //AddLog_P(LOG_LEVEL_DEBUG, PSTR("Script: Subscribe command with parameters: %s, %s, %s."), event_name.c_str(), topic.c_str(), key.c_str()); + //Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("Script: Subscribe command with parameters: %s, %s, %s."), event_name.c_str(), topic.c_str(), key.c_str()); //event_name.toUpperCase(); if (event_name.length() > 0 && topic.length() > 0) { //Search all subscriptions @@ -6242,7 +6329,7 @@ String ScriptSubscribe(const char *data, int data_len) topic.concat("/#"); } } - // AddLog_P(LOG_LEVEL_DEBUG, PSTR("Script: New topic: %s."), topic.c_str()); + // Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("Script: New topic: %s."), topic.c_str()); //MQTT Subscribe subscription_item.Event = event_name; subscription_item.Topic = topic.substring(0, topic.length() - 2); //Remove "/#" so easy to match @@ -6511,7 +6598,7 @@ void ScriptFullWebpage(void) { WSContentBegin(200, CT_HTML); ScriptWebShow('w'); WSContentEnd(); - Serial.printf("fwp update sv %s\n",stmp.c_str() ); + //Serial.printf("fwp update sv %s\n",stmp.c_str() ); return; //goto redraw; // } else { // Serial.printf("fwp update %s\n",stmp.c_str() ); @@ -6519,7 +6606,7 @@ void ScriptFullWebpage(void) { return; } else { - Serial.printf("fwp other %s\n",stmp.c_str() ); + //Serial.printf("fwp other %s\n",stmp.c_str() ); } WSContentBegin(200, CT_HTML); @@ -6547,7 +6634,7 @@ void Script_Check_HTML_Setvars(void) { if (Webserver->hasArg("sv")) { String stmp = Webserver->arg("sv"); - Serial.printf("fwp has arg dv %s\n", stmp.c_str()); + //Serial.printf("fwp has arg dv %s\n", stmp.c_str()); char cmdbuf[64]; memset(cmdbuf, 0, sizeof(cmdbuf)); char *cp = cmdbuf; @@ -7613,7 +7700,7 @@ bool Xdrv10(uint8_t function) if (len_decompressed>0) glob_script_mem.script_ram[len_decompressed] = 0; // indicates scripter use compression bitWrite(Settings.rule_once, 6, 1); - //AddLog_P(LOG_LEVEL_INFO, PSTR("decompressed script len %d"),len_decompressed); + //Script_AddLog_P(LOG_LEVEL_INFO, PSTR("decompressed script len %d"),len_decompressed); #else // USE_SCRIPT_COMPRESSION // indicates scripter does not use compression bitWrite(Settings.rule_once, 6, 0); @@ -7695,7 +7782,7 @@ bool Xdrv10(uint8_t function) #endif // ESP #endif // USE_SCRIPT_FATFS>=0 - AddLog_P(LOG_LEVEL_INFO,PSTR("FATFS mount OK!")); + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("FATFS mount OK!")); //fsp->dateTimeCallback(dateTime); glob_script_mem.script_sd_found = 1; @@ -7717,7 +7804,7 @@ bool Xdrv10(uint8_t function) glob_script_mem.flags = 1; } else { - AddLog_P(LOG_LEVEL_INFO,PSTR("FATFS mount failed!")); + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("FATFS mount failed!")); glob_script_mem.script_sd_found = 0; } #endif // USE_SCRIPT_FATFS From 3ee92fb4ba4068d2d6f7362165538a40ecfa2c0c Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 06:44:04 +0100 Subject: [PATCH 059/255] smaller log buffer --- tasmota/xsns_53_sml.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index cccfde736..d91facf37 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -824,7 +824,7 @@ void Dump2log(void) { int16_t index=0,hcnt=0; uint32_t d_lastms; uint8_t dchars[16]; - char log_data[LOGSZ]; // May be a lot smaller... + char log_data[128]; //if (!SML_SAVAILABLE) return; From f8067735e1982ad15823b66bb90b669788b53587 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 06:45:07 +0100 Subject: [PATCH 060/255] add in and batt current --- tasmota/xdrv_84_core2.ino | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/tasmota/xdrv_84_core2.ino b/tasmota/xdrv_84_core2.ino index 9bc18ad0c..f4075967f 100644 --- a/tasmota/xdrv_84_core2.ino +++ b/tasmota/xdrv_84_core2.ino @@ -55,6 +55,8 @@ struct CORE2_globs { struct CORE2_ADC { float vbus_v; float batt_v; + float vbus_c; + float batt_c; float temp; int16_t x; int16_t y; @@ -72,6 +74,8 @@ void CORE2_Module_Init(void) { I2cSetActiveFound(AXP_ADDR, "AXP192"); core2_globs.Axp.SetAdcState(true); + // motor voltage + core2_globs.Axp.SetLDOVoltage(3,2000); core2_globs.Mpu.Init(); I2cSetActiveFound(MPU6886_ADDRESS, "MPU6886"); @@ -91,13 +95,7 @@ void CORE2_Init(void) { TIME_T tmpTime; TasmotaGlobal.ntp_force_sync = true; //force to sync with ntp - // Rtc.utc_time = ReadFromDS3231(); //we read UTC TIME from DS3231 - // from this line, we just copy the function from "void RtcSecond()" at the support.ino ,line 2143 and above - // We need it to set rules etc. BreakTime(Rtc.utc_time, tmpTime); - if (Rtc.utc_time < START_VALID_TIME ) { - //ds3231ReadStatus = true; //if time in DS3231 is valid, do not update again - } Rtc.daylight_saving_time = RuleToTime(Settings.tflag[1], RtcTime.year); Rtc.standard_time = RuleToTime(Settings.tflag[0], RtcTime.year); AddLog_P(LOG_LEVEL_INFO, PSTR("Set time from BM8563 to RTC (" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"), @@ -119,7 +117,9 @@ void CORE2_audio_power(bool power) { #ifdef USE_WEBSERVER const char HTTP_CORE2[] PROGMEM = "{s}VBUS Voltage" "{m}%s V" "{e}" + "{s}VBUS Current" "{m}%s mA" "{e}" "{s}BATT Voltage" "{m}%s V" "{e}" + "{s}BATT Current" "{m}%s mA" "{e}" "{s}Chip Temperature" "{m}%s C" "{e}"; #ifdef USE_MPU6886 const char HTTP_CORE2_MPU[] PROGMEM = @@ -131,27 +131,31 @@ const char HTTP_CORE2_MPU[] PROGMEM = void CORE2_loop(uint32_t flg) { - Sync_RTOS_TIME(); + } void CORE2_WebShow(uint32_t json) { char vstring[32]; char bvstring[32]; + char cstring[32]; + char bcstring[32]; char tstring[32]; dtostrfd(core2_adc.vbus_v, 3, vstring); dtostrfd(core2_adc.batt_v, 3, bvstring); + dtostrfd(core2_adc.vbus_c, 1, cstring); + dtostrfd(core2_adc.batt_c, 1, bcstring); dtostrfd(core2_adc.temp, 2, tstring); if (json) { - ResponseAppend_P(PSTR(",\"CORE2\":{\"VBV\":%s,\"BV\":%s,\"CT\":%s"), vstring, bvstring, tstring); + ResponseAppend_P(PSTR(",\"CORE2\":{\"VBV\":%s,\"BV\":%s,\"VBC\":%s,\"BC\":%s,\"CT\":%s"), vstring, cstring, bvstring, bcstring, tstring); #ifdef USE_MPU6886 ResponseAppend_P(PSTR(",\"MPUX\":%d,\"MPUY\":%d,\"MPUZ\":%d"), core2_adc.x, core2_adc.y, core2_adc.z); #endif ResponseJsonEnd(); } else { - WSContentSend_PD(HTTP_CORE2, vstring, bvstring, tstring); + WSContentSend_PD(HTTP_CORE2, vstring, cstring, bvstring, bcstring, tstring); #ifdef USE_MPU6886 WSContentSend_PD(HTTP_CORE2_MPU, core2_adc.x, core2_adc.y, core2_adc.z); @@ -368,13 +372,17 @@ void CORE2_EverySecond(void) { CORE2_DoShutdown(); } } + + Sync_RTOS_TIME(); } } -// currents are not supported by hardware implementation void CORE2_GetADC(void) { core2_adc.vbus_v = core2_globs.Axp.GetVBusVoltage(); core2_adc.batt_v = core2_globs.Axp.GetBatVoltage(); + core2_adc.vbus_c = core2_globs.Axp.GetVinCurrent(); + core2_adc.batt_c = core2_globs.Axp.GetBatCurrent(); + core2_adc.temp = core2_globs.Axp.GetTempInAXP192(); #ifdef USE_MPU6886 float x; From 03a9d5b71f809ce1b14c0a8a470e51c44295ed63 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 08:41:36 +0100 Subject: [PATCH 061/255] Update xdrv_98_filesystem.ino --- tasmota/xdrv_98_filesystem.ino | 37 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 78b79a2be..90d36b51c 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -373,28 +373,28 @@ void UFS_ListDir(char *path, uint8_t depth) { if (!*(pp + 1)) pp++; char *cp = name; // osx formatted disks contain a lot of stuff we dont want - if (ufs_reject((char*)ep)) goto fclose; + if (!ufs_reject((char*)ep)) { - for (uint8_t cnt = 0; cnt1) { - strcat(path, "/"); + for (uint8_t cnt = 0; cnt1) { + strcat(path, "/"); + } + strcat(path, ep); + UFS_ListDir(path, depth + 4); + path[plen] = 0; + } else { snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp,ep); WSContentSend_P(UFS_FORM_SDC_DIRb, npath, ep, name, tstr, entry.size()); + } } - fclose: entry.close(); } dir.close(); @@ -405,8 +405,6 @@ uint8_t UFS_DownloadFile(char *file) { File download_file; WiFiClient download_Client; - //AddLog_P(LOG_LEVEL_INFO, PSTR("file not found %s"),file); - if (!ufsp->exists(file)) { AddLog_P(LOG_LEVEL_INFO, PSTR("file not found")); return 0; @@ -457,6 +455,7 @@ uint8_t UFS_DownloadFile(char *file) { // loop(); //} } + delay(0); } download_file.close(); download_Client.stop(); From f86bfbc298302f1860dac1dc99d75e0ddb18198b Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 11:08:48 +0100 Subject: [PATCH 062/255] sdcrad optional compile (saves 7k) #define USE_SDCARD --- tasmota/xdrv_98_filesystem.ino | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 90d36b51c..f8633aba2 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -50,11 +50,15 @@ driver enabled by #ifdef ESP8266 #include #include +#ifdef USE_SDCARD #include #include +#endif #else #include +#ifdef USE_SDCARD #include +#endif #include "FFat.h" #include "FS.h" #include "SPIFFS.h" @@ -92,6 +96,8 @@ void UFSInit(void) { // 1. check for SD card // 2. check for littlefs or FAT // 3. check for SPIFFS obsolete + +#ifdef USE_SDCARD // if (TasmotaGlobal.spi_enabled) { if (1) { int8_t cs; @@ -111,6 +117,7 @@ void UFSInit(void) { return; } } +#endif // if no success with sd card try flash fs #ifdef ESP8266 @@ -146,6 +153,7 @@ uint32_t result = 0; switch (ufs_type) { case UFS_TSDC: +#ifdef USE_SDCARD #ifdef ESP32 if (sel == 0) { result = SD.totalBytes(); @@ -154,6 +162,7 @@ uint32_t result = 0; } #else // currently no size support on esp8266 sdcard +#endif #endif break; From ef8f1bf8102b892c3421ae8f6d198549622ce455 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 11:15:48 +0100 Subject: [PATCH 063/255] remove spiffs (saves 27k!!!) leave ffat for backwards compatibility with old linker files --- tasmota/xdrv_98_filesystem.ino | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index f8633aba2..1d9da5d48 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -61,7 +61,6 @@ driver enabled by #endif #include "FFat.h" #include "FS.h" -#include "SPIFFS.h" #endif #define UFS_FILE_WRITE "w" @@ -84,7 +83,6 @@ uint8_t ufs_type; #define UFS_TSDC 1 #define UFS_TFAT 2 #define UFS_TLFS 3 -#define UFS_TSPIFFS 4 #ifndef UFS_SDCS #define UFS_SDCS 4 @@ -132,12 +130,6 @@ void UFSInit(void) { // ffat is second ufsp = &FFat; if (!FFat.begin(true)) { - // spiffs is last - ufsp = &SPIFFS; - if (!SPIFFS.begin(true)) { - return; - } - ufs_type = UFS_TSPIFFS; return; } ufs_type = UFS_TFAT; @@ -194,13 +186,6 @@ uint32_t result = 0; #endif break; - case UFS_TSPIFFS: - if (sel == 0) { - result = SPIFFS.totalBytes(); - } else { - result = SPIFFS.totalBytes() - SPIFFS.usedBytes(); - } - break; } return result / 1000; } From c61fb025db8df8c91ca0742c3602c4f1555c3c07 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 11:38:01 +0100 Subject: [PATCH 064/255] Update xdrv_98_filesystem.ino --- tasmota/xdrv_98_filesystem.ino | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 1d9da5d48..379d81931 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -84,16 +84,12 @@ uint8_t ufs_type; #define UFS_TFAT 2 #define UFS_TLFS 3 -#ifndef UFS_SDCS -#define UFS_SDCS 4 -#endif - void UFSInit(void) { ufs_type = 0; // check for fs options, // 1. check for SD card // 2. check for littlefs or FAT - // 3. check for SPIFFS obsolete + #ifdef USE_SDCARD // if (TasmotaGlobal.spi_enabled) { @@ -115,7 +111,7 @@ void UFSInit(void) { return; } } -#endif +#endif // USE_SDCARD // if no success with sd card try flash fs #ifdef ESP8266 @@ -135,7 +131,7 @@ void UFSInit(void) { ufs_type = UFS_TFAT; return; } -#endif +#endif // ESP8266 ufs_type = UFS_TLFS; return; } @@ -155,7 +151,7 @@ uint32_t result = 0; #else // currently no size support on esp8266 sdcard #endif -#endif +#endif //USE_SDCARD break; case UFS_TLFS: @@ -173,7 +169,7 @@ uint32_t result = 0; } else { result = LITTLEFS.totalBytes() - LITTLEFS.usedBytes(); } -#endif +#endif // ESP8266 break; case UFS_TFAT: @@ -183,7 +179,7 @@ uint32_t result = 0; } else { result = FFat.freeBytes(); } -#endif +#endif // ESP32 break; } @@ -473,7 +469,7 @@ void UFS_Upload(void) { } } else { Web.upload_error=1; - Webserver->send(500, "text/plain", "500: couldn't create file"); + WSSend(500, CT_PLAIN, F("500: couldn't create file")); } } From dcbb3f1e0ea2141641c5d4ed5ed8f6d793d26a68 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 13:44:04 +0100 Subject: [PATCH 065/255] Happy New Year --- tasmota/StackThunk_light.cpp | 2 +- tasmota/StackThunk_light.h | 2 +- tasmota/WiFiClientSecureLightBearSSL.cpp | 2 +- tasmota/WiFiClientSecureLightBearSSL.h | 2 +- tasmota/i18n.h | 2 +- tasmota/language/af_AF.h | 2 +- tasmota/language/bg_BG.h | 2 +- tasmota/language/cs_CZ.h | 2 +- tasmota/language/de_DE.h | 2 +- tasmota/language/el_GR.h | 2 +- tasmota/language/en_GB.h | 2 +- tasmota/language/es_ES.h | 2 +- tasmota/language/fr_FR.h | 2 +- tasmota/language/he_HE.h | 2 +- tasmota/language/hu_HU.h | 2 +- tasmota/language/it_IT.h | 2 +- tasmota/language/ko_KO.h | 2 +- tasmota/language/nl_NL.h | 2 +- tasmota/language/pl_PL.h | 2 +- tasmota/language/pt_BR.h | 2 +- tasmota/language/pt_PT.h | 2 +- tasmota/language/ro_RO.h | 2 +- tasmota/language/ru_RU.h | 2 +- tasmota/language/sk_SK.h | 2 +- tasmota/language/sv_SE.h | 2 +- tasmota/language/tr_TR.h | 2 +- tasmota/language/uk_UA.h | 2 +- tasmota/language/vi_VN.h | 2 +- tasmota/language/zh_CN.h | 2 +- tasmota/language/zh_TW.h | 2 +- tasmota/my_user_config.h | 2 +- tasmota/settings.h | 2 +- tasmota/settings.ino | 2 +- tasmota/support.ino | 2 +- tasmota/support_button.ino | 2 +- tasmota/support_command.ino | 2 +- tasmota/support_cores.ino | 2 +- tasmota/support_crash_recorder.ino | 2 +- tasmota/support_device_groups.ino | 2 +- tasmota/support_eeprom.ino | 2 +- tasmota/support_esp32.ino | 2 +- tasmota/support_esptool.ino | 2 +- tasmota/support_features.ino | 2 +- tasmota/support_filesystem.ino | 2 +- tasmota/support_flash_log.ino | 2 +- tasmota/support_float.ino | 2 +- tasmota/support_jpeg.ino | 2 +- tasmota/support_light_list.ino | 10 +++--- tasmota/support_network.ino | 2 +- tasmota/support_rotary.ino | 2 +- tasmota/support_rtc.ino | 2 +- tasmota/support_static_buffer.ino | 2 +- tasmota/support_statistics.ino | 2 +- tasmota/support_switch.ino | 2 +- tasmota/support_tasmota.ino | 2 +- tasmota/support_udp.ino | 2 +- tasmota/support_wifi.ino | 2 +- tasmota/tasmota.h | 2 +- tasmota/tasmota.ino | 2 +- tasmota/tasmota_ca.ino | 2 +- tasmota/tasmota_compat.h | 19 +++++++++++ tasmota/tasmota_configurations.h | 2 +- tasmota/tasmota_configurations_ESP32.h | 2 +- tasmota/tasmota_globals.h | 2 +- tasmota/tasmota_template.h | 2 +- tasmota/tasmota_template_legacy.h | 2 +- tasmota/tasmota_version.h | 2 +- tasmota/user_config_override_sample.h | 2 +- tasmota/xdrv_01_webserver.ino | 2 +- tasmota/xdrv_02_mqtt.ino | 2 +- tasmota/xdrv_03_energy.ino | 2 +- tasmota/xdrv_04_light.ino | 10 +++--- tasmota/xdrv_05_irremote.ino | 2 +- tasmota/xdrv_05_irremote_full.ino | 2 +- tasmota/xdrv_06_snfbridge.ino | 2 +- tasmota/xdrv_07_domoticz.ino | 2 +- tasmota/xdrv_08_serial_bridge.ino | 2 +- tasmota/xdrv_09_timers.ino | 2 +- tasmota/xdrv_10_rules.ino | 2 +- tasmota/xdrv_10_scripter.ino | 2 +- tasmota/xdrv_11_knx.ino | 4 +-- tasmota/xdrv_12_home_assistant.ino | 2 +- tasmota/xdrv_13_display.ino | 2 +- tasmota/xdrv_14_mp3.ino | 2 +- tasmota/xdrv_15_pca9685.ino | 2 +- tasmota/xdrv_16_tuyamcu.ino | 2 +- tasmota/xdrv_17_rcswitch.ino | 2 +- tasmota/xdrv_18_armtronix_dimmers.ino | 2 +- tasmota/xdrv_19_ps16dz_dimmer.ino | 2 +- tasmota/xdrv_20_hue.ino | 2 +- tasmota/xdrv_21_wemo.ino | 2 +- tasmota/xdrv_21_wemo_multi.ino | 2 +- tasmota/xdrv_22_sonoff_ifan.ino | 2 +- tasmota/xdrv_23_zigbee_0_constants.ino | 10 +++--- tasmota/xdrv_23_zigbee_1_headers.ino | 2 +- tasmota/xdrv_23_zigbee_1z_libs.ino | 24 +++++++------- tasmota/xdrv_23_zigbee_2_devices.ino | 20 ++++++------ tasmota/xdrv_23_zigbee_2a_devices_impl.ino | 2 +- tasmota/xdrv_23_zigbee_3_hue.ino | 2 +- tasmota/xdrv_23_zigbee_4_persistence.ino | 2 +- tasmota/xdrv_23_zigbee_4a_nano_fs.ino | 36 ++++++++++----------- tasmota/xdrv_23_zigbee_4b_eeprom.ino | 12 +++---- tasmota/xdrv_23_zigbee_5__constants.ino | 18 +++++------ tasmota/xdrv_23_zigbee_5_converters.ino | 4 +-- tasmota/xdrv_23_zigbee_6_commands.ino | 2 +- tasmota/xdrv_23_zigbee_7_0_statemachine.ino | 2 +- tasmota/xdrv_23_zigbee_7_5_map.ino | 2 +- tasmota/xdrv_23_zigbee_8_parsers.ino | 2 +- tasmota/xdrv_23_zigbee_9_serial.ino | 2 +- tasmota/xdrv_23_zigbee_9a_upload.ino | 2 +- tasmota/xdrv_23_zigbee_A_impl.ino | 6 ++-- tasmota/xdrv_24_buzzer.ino | 2 +- tasmota/xdrv_25_A4988_Stepper.ino | 2 +- tasmota/xdrv_26_ariluxrf.ino | 2 +- tasmota/xdrv_27_shutter.ino | 4 +-- tasmota/xdrv_28_pcf8574.ino | 2 +- tasmota/xdrv_29_deepsleep.ino | 2 +- tasmota/xdrv_30_exs_dimmer.ino | 2 +- tasmota/xdrv_31_tasmota_client.ino | 2 +- tasmota/xdrv_32_hotplug.ino | 2 +- tasmota/xdrv_33_nrf24l01.ino | 2 +- tasmota/xdrv_34_wemos_motor_v1.ino | 2 +- tasmota/xdrv_35_pwm_dimmer.ino | 6 ++-- tasmota/xdrv_36_keeloq.ino | 2 +- tasmota/xdrv_37_sonoff_d1.ino | 2 +- tasmota/xdrv_38_ping.ino | 2 +- tasmota/xdrv_39_thermostat.ino | 2 +- tasmota/xdrv_40_telegram.ino | 2 +- tasmota/xdrv_41_tcp_bridge.ino | 2 +- tasmota/xdrv_42_i2s_audio.ino | 2 +- tasmota/xdrv_43_mlx90640.ino | 2 +- tasmota/xdrv_44_miel_hvac.ino | 2 +- tasmota/xdrv_45_shelly_dimmer.ino | 2 +- tasmota/xdrv_46_ccloader.ino | 24 +++++++------- tasmota/xdrv_47_ftc532.ino | 2 +- tasmota/xdrv_80_odroidgo.ino | 2 +- tasmota/xdrv_81_webcam.ino | 2 +- tasmota/xdrv_82_ethernet.ino | 2 +- tasmota/xdrv_83_esp32watch.ino | 2 +- tasmota/xdrv_84_core2.ino | 2 +- tasmota/xdrv_99_debug.ino | 2 +- tasmota/xdrv_interface.ino | 2 +- tasmota/xdsp_01_lcd.ino | 2 +- tasmota/xdsp_02_ssd1306.ino | 2 +- tasmota/xdsp_03_matrix.ino | 2 +- tasmota/xdsp_04_ili9341.ino | 2 +- tasmota/xdsp_05_epaper_29.ino | 2 +- tasmota/xdsp_06_epaper_42.ino | 2 +- tasmota/xdsp_07_sh1106.ino | 2 +- tasmota/xdsp_08_ILI9488.ino | 2 +- tasmota/xdsp_09_SSD1351.ino | 2 +- tasmota/xdsp_10_RA8876.ino | 2 +- tasmota/xdsp_11_sevenseg.ino | 2 +- tasmota/xdsp_12_ST7789.ino | 2 +- tasmota/xdsp_13_ILI9341-2.ino | 2 +- tasmota/xdsp_interface.ino | 2 +- tasmota/xlgt_01_ws2812.ino | 2 +- tasmota/xlgt_02_my92x1.ino | 2 +- tasmota/xlgt_03_sm16716.ino | 4 +-- tasmota/xlgt_04_sm2135.ino | 2 +- tasmota/xlgt_05_sonoff_l1.ino | 2 +- tasmota/xlgt_06_electriq_moodl.ino | 2 +- tasmota/xlgt_interface.ino | 2 +- tasmota/xnrg_01_hlw8012.ino | 2 +- tasmota/xnrg_02_cse7766.ino | 2 +- tasmota/xnrg_03_pzem004t.ino | 2 +- tasmota/xnrg_04_mcp39f501.ino | 2 +- tasmota/xnrg_05_pzem_ac.ino | 2 +- tasmota/xnrg_06_pzem_dc.ino | 2 +- tasmota/xnrg_07_ade7953.ino | 2 +- tasmota/xnrg_08_sdm120.ino | 2 +- tasmota/xnrg_09_dds2382.ino | 2 +- tasmota/xnrg_10_sdm630.ino | 2 +- tasmota/xnrg_11_ddsu666.ino | 2 +- tasmota/xnrg_12_solaxX1.ino | 2 +- tasmota/xnrg_13_fif_le01mr.ino | 2 +- tasmota/xnrg_14_bl0940.ino | 2 +- tasmota/xnrg_15_teleinfo.ino | 2 +- tasmota/xnrg_16_iem3000.ino | 2 +- tasmota/xnrg_17_ornowe517.ino | 2 +- tasmota/xnrg_interface.ino | 2 +- tasmota/xsns_01_counter.ino | 2 +- tasmota/xsns_02_analog.ino | 2 +- tasmota/xsns_04_snfsc.ino | 2 +- tasmota/xsns_05_ds18x20.ino | 2 +- tasmota/xsns_05_ds18x20_esp32.ino | 2 +- tasmota/xsns_06_dht.ino | 2 +- tasmota/xsns_07_sht1x.ino | 2 +- tasmota/xsns_08_htu21.ino | 2 +- tasmota/xsns_09_bmp.ino | 2 +- tasmota/xsns_10_bh1750.ino | 2 +- tasmota/xsns_11_veml6070.ino | 2 +- tasmota/xsns_12_ads1115.ino | 2 +- tasmota/xsns_13_ina219.ino | 2 +- tasmota/xsns_14_sht3x.ino | 2 +- tasmota/xsns_15_mhz19.ino | 2 +- tasmota/xsns_16_tsl2561.ino | 2 +- tasmota/xsns_17_senseair.ino | 2 +- tasmota/xsns_18_pms5003.ino | 2 +- tasmota/xsns_19_mgs.ino | 2 +- tasmota/xsns_20_novasds.ino | 2 +- tasmota/xsns_21_sgp30.ino | 2 +- tasmota/xsns_22_sr04.ino | 2 +- tasmota/xsns_24_si1145.ino | 2 +- tasmota/xsns_26_lm75ad.ino | 2 +- tasmota/xsns_27_apds9960.ino | 2 +- tasmota/xsns_28_tm1638.ino | 2 +- tasmota/xsns_29_mcp230xx.ino | 2 +- tasmota/xsns_30_mpr121.ino | 2 +- tasmota/xsns_31_ccs811.ino | 2 +- tasmota/xsns_32_mpu6050.ino | 2 +- tasmota/xsns_33_ds3231.ino | 2 +- tasmota/xsns_34_hx711.ino | 2 +- tasmota/xsns_35_tx20.ino | 2 +- tasmota/xsns_36_mgc3130.ino | 4 +-- tasmota/xsns_37_rfsensor.ino | 2 +- tasmota/xsns_38_az7798.ino | 2 +- tasmota/xsns_39_max31855.ino | 2 +- tasmota/xsns_40_pn532.ino | 2 +- tasmota/xsns_41_max44009.ino | 2 +- tasmota/xsns_42_scd30.ino | 2 +- tasmota/xsns_43_hre.ino | 2 +- tasmota/xsns_44_sps30.ino | 2 +- tasmota/xsns_45_vl53l0x.ino | 2 +- tasmota/xsns_46_MLX90614.ino | 2 +- tasmota/xsns_47_max31865.ino | 2 +- tasmota/xsns_48_chirp.ino | 2 +- tasmota/xsns_50_paj7620.ino | 2 +- tasmota/xsns_51_rdm6300.ino | 2 +- tasmota/xsns_52_ibeacon.ino | 2 +- tasmota/xsns_53_sml.ino | 2 +- tasmota/xsns_54_ina226.ino | 2 +- tasmota/xsns_55_hih_series.ino | 2 +- tasmota/xsns_56_hpma.ino | 4 +-- tasmota/xsns_57_tsl2591.ino | 2 +- tasmota/xsns_58_dht12.ino | 2 +- tasmota/xsns_59_ds1624.ino | 2 +- tasmota/xsns_60_GPS.ino | 2 +- tasmota/xsns_61_MI_NRF24.ino | 2 +- tasmota/xsns_62_MI_ESP32.ino | 10 +++--- tasmota/xsns_62_MI_HM10.ino | 10 +++--- tasmota/xsns_63_aht1x.ino | 2 +- tasmota/xsns_64_hrxl.ino | 2 +- tasmota/xsns_65_hdc1080.ino | 2 +- tasmota/xsns_66_iAQ.ino | 2 +- tasmota/xsns_67_as3935.ino | 2 +- tasmota/xsns_68_windmeter.ino | 2 +- tasmota/xsns_69_opentherm.ino | 4 +-- tasmota/xsns_69_opentherm_protocol.ino | 2 +- tasmota/xsns_70_veml6075.ino | 2 +- tasmota/xsns_71_veml7700.ino | 2 +- tasmota/xsns_72_mcp9808.ino | 2 +- tasmota/xsns_73_hp303b.ino | 2 +- tasmota/xsns_74_lmt01.ino | 2 +- tasmota/xsns_75_prometheus.ino | 2 +- tasmota/xsns_76_dyp.ino | 2 +- tasmota/xsns_77_vl53l1x.ino | 2 +- tasmota/xsns_78_ezo.ino | 2 +- tasmota/xsns_78_ezoco2.ino | 2 +- tasmota/xsns_78_ezodo.ino | 4 +-- tasmota/xsns_78_ezoec.ino | 4 +-- tasmota/xsns_78_ezoflo.ino | 2 +- tasmota/xsns_78_ezohum.ino | 2 +- tasmota/xsns_78_ezoo2.ino | 4 +-- tasmota/xsns_78_ezoorp.ino | 4 +-- tasmota/xsns_78_ezoph.ino | 4 +-- tasmota/xsns_78_ezopmp.ino | 2 +- tasmota/xsns_78_ezoprs.ino | 4 +-- tasmota/xsns_78_ezorgb.ino | 2 +- tasmota/xsns_78_ezortd.ino | 4 +-- tasmota/xsns_78_xezo.ino | 2 +- tasmota/xsns_79_as608.ino | 2 +- tasmota/xsns_80_mfrc522.ino | 2 +- tasmota/xsns_interface.ino | 2 +- tasmota/xx2c_interface.ino | 2 +- 275 files changed, 392 insertions(+), 373 deletions(-) diff --git a/tasmota/StackThunk_light.cpp b/tasmota/StackThunk_light.cpp index 1e5fd445a..aea7ae438 100644 --- a/tasmota/StackThunk_light.cpp +++ b/tasmota/StackThunk_light.cpp @@ -7,7 +7,7 @@ between a secondary, user-allocated stack on the heap and the real stack. - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. + Copyright (C) 2021 Earle F. Philhower, III. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/tasmota/StackThunk_light.h b/tasmota/StackThunk_light.h index 164417000..9fa562655 100644 --- a/tasmota/StackThunk_light.h +++ b/tasmota/StackThunk_light.h @@ -7,7 +7,7 @@ between a secondary, user-allocated stack on the heap and the real stack. - Copyright (c) 2017 Earle F. Philhower, III. All rights reserved. + Copyright (C) 2021 Earle F. Philhower, III. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/tasmota/WiFiClientSecureLightBearSSL.cpp b/tasmota/WiFiClientSecureLightBearSSL.cpp index 7d9d51a35..f91d96cfc 100755 --- a/tasmota/WiFiClientSecureLightBearSSL.cpp +++ b/tasmota/WiFiClientSecureLightBearSSL.cpp @@ -3,7 +3,7 @@ - Mostly compatible with Arduino WiFi shield library and standard WiFiClient/ServerSecure (except for certificate handling). - Copyright (c) 2018 Earle F. Philhower, III + Copyright (C) 2021 Earle F. Philhower, III This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/tasmota/WiFiClientSecureLightBearSSL.h b/tasmota/WiFiClientSecureLightBearSSL.h index ed6ced416..f480a9d42 100755 --- a/tasmota/WiFiClientSecureLightBearSSL.h +++ b/tasmota/WiFiClientSecureLightBearSSL.h @@ -3,7 +3,7 @@ - Mostly compatible with Arduino WiFi shield library and standard WiFiClient/ServerSecure (except for certificate handling). - Copyright (c) 2018 Earle F. Philhower, III + Copyright (C) 2021 Earle F. Philhower, III This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 3fd70be4e..0d18f016a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -1,7 +1,7 @@ /* i18n.h - internationalization for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index ce3da91a0..bfd4177e3 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -1,7 +1,7 @@ /* af_AF.h - localization for Afrikaans - Afrikaans for Tasmota - Copyright (C) 2020 Christiaan Heerze + Copyright (C) 2021 Christiaan Heerze This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f91454097..f8e3c705c 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -1,7 +1,7 @@ /* bg-BG.h - localization for Bulgaria - Bulgarian for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index c4beb0341..983524bbf 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -1,7 +1,7 @@ /* cs-CZ.h - localization for Czech with diacritics - Czech for Tasmota - Copyright (C) 2020 Vladimír Synek + Copyright (C) 2021 Vladimír Synek This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index e8449f9e7..f1bad46a7 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -1,7 +1,7 @@ /* de-DE.h - localization for German - Germany for Tasmota - Copyright (C) 2020 VinceMasuka + Copyright (C) 2021 VinceMasuka This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 635aa5b27..5820512d6 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -1,7 +1,7 @@ /* el-GR.h - localization for Greek - Greece for Tasmota - Copyright (C) 2020 Theo Arends, translated by Nick Galfas + Copyright (C) 2021 Theo Arends, translated by Nick Galfas This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 20d0902a3..77a325d30 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -1,7 +1,7 @@ /* en-GB.h - localization for English - United Kingdom for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index ab84086ad..e04f2b256 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -1,7 +1,7 @@ /* es-ES.h - localization for Spanish - Spain for Tasmota - Copyright (C) 2020 Adrian Scillato + Copyright (C) 2021 Adrian Scillato This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 0255d49e2..65c14a58d 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -1,6 +1,6 @@ /* fr-FR.h - localization for French - France for Tasmota - Copyright (C) 2020 Olivier Francais + Copyright (C) 2021 Olivier Francais This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index d92bab299..6e9a6ef8e 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -1,7 +1,7 @@ /* he-HE.h - localization for Hebrew - Israel for Tasmota - Copyright (C) 2020 Yuval Mejahez + Copyright (C) 2021 Yuval Mejahez This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index ff6c40498..82fe0b4a4 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -1,7 +1,7 @@ /* hu-HU.h - localization for Hungarian in Hungary for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 74f6b1090..91ae9a830 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -1,7 +1,7 @@ /* it-IT.h - localization for Italian - Italy for Tasmota - Copyright (C) 2020 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 24.12.2020 + Copyright (C) 2021 Gennaro Tortone - some mods by Antonio Fragola - Updated by bovirus - rev. 24.12.2020 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 4da9f1303..6ab2f1421 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -1,7 +1,7 @@ /* ko-KO.h - localization for Korean - Korean for Tasmota - Copyright (C) 2020 Theo Arends (translated by NyaamZ) + Copyright (C) 2021 Theo Arends (translated by NyaamZ) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 0be25c2e4..682fbec90 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -1,7 +1,7 @@ /* nl-NL.h - localization for Dutch - Nederland for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index ad522652f..f5497d91d 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -1,7 +1,7 @@ /* pl-PL-d.h - localization for Polish with diacritics - Poland for Tasmota - Copyright (C) 2020 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala) + Copyright (C) 2021 Theo Arends (translated by roblad - Robert L., upgraded by R. Turala) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index fc50f160f..99d38f192 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -1,7 +1,7 @@ /* pt-BR.h - localization for Portuguese - Brazil for Tasmota - Copyright (C) 2020 Fabiano Bovo + Copyright (C) 2021 Fabiano Bovo This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 67e3b6e6b..5e7c74f36 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -1,7 +1,7 @@ /* pt-PT.h - localization for Portuguese - Portugal for Tasmota - Copyright (C) 2020 Paulo Paiva + Copyright (C) 2021 Paulo Paiva This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 6464e7af2..bb1a09185 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -1,7 +1,7 @@ /* ro-RO.h - localization for Romanian - Romania and Moldova for Tasmota - Copyright (C) 2020 Augustin Marti + Copyright (C) 2021 Augustin Marti This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index da5998e15..df1d5b50e 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -1,7 +1,7 @@ /* ru-RU.h - localization for Russian - Rissia for Tasmota - Copyright (C) 2020 Theo Arends / roman-vn + Copyright (C) 2021 Theo Arends / roman-vn This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index b162e992b..8f5490a19 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -1,7 +1,7 @@ /* sk-SK.h - localization for Slovak with diacritics - Slovak for Tasmota - Copyright (C) 2020 Vladimír Jendroľ + Copyright (C) 2021 Vladimír Jendroľ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index c15f911e4..6935fa102 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -1,7 +1,7 @@ /* sv-SE.h - localization for Swedish - Svenska for Tasmota - Copyright (C) 2020 Gunnar Norin + Copyright (C) 2021 Gunnar Norin This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index ac8e34ff0..01b73bc75 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -1,7 +1,7 @@ /* tr-TR.h - localization for Turkish - Turkey for Tasmota - Copyright (C) 2020 Ali Sait Teke and Theo Arends + Copyright (C) 2021 Ali Sait Teke and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index f3d455f72..11fbdac99 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -1,7 +1,7 @@ /* uk-UA.h - localization for Ukrainian - Ukraine for Tasmota - Copyright (C) 2020 Theo Arends / vadym-adik + Copyright (C) 2021 Theo Arends / vadym-adik This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index cf642b6dc..cc666ec82 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -1,7 +1,7 @@ /* vi-VN.h - localization for Vietnam for Tasmota - Copyright (C) 2020 translateb by Tâm.NT + Copyright (C) 2021 translateb by Tâm.NT This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 8b2eb080c..2e6baa64d 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -1,7 +1,7 @@ /* zh-CN.h - localization for Chinese (Simplified) - China for Tasmota - Copyright (C) 2020 Theo Arends (translated by killadm) + Copyright (C) 2021 Theo Arends (translated by killadm) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 6b79def35..2a2078266 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -1,7 +1,7 @@ /* zh-TW.h - localization for Chinese (Traditional) - Taiwan for Tasmota - Copyright (C) 2020 Theo Arends (translated by dannydu) + Copyright (C) 2021 Theo Arends (translated by dannydu) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index cc75735cf..59cef587c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1,7 +1,7 @@ /* my_user_config.h - user specific configuration for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/settings.h b/tasmota/settings.h index 72d0477ce..4842103b4 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -1,7 +1,7 @@ /* settings.h - setting variables for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 859960472..465789eb8 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1,7 +1,7 @@ /* settings.ino - user settings for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support.ino b/tasmota/support.ino index 215c8ea1d..3d8634e3e 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1,7 +1,7 @@ /* support.ino - support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_button.ino b/tasmota/support_button.ino index 749509b69..53fb218ba 100644 --- a/tasmota/support_button.ino +++ b/tasmota/support_button.ino @@ -1,7 +1,7 @@ /* support_button.ino - button support for Tasmota - Copyright (C) 2020 Federico Leoni and Theo Arends + Copyright (C) 2021 Federico Leoni and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index bc1121123..59d3f3e41 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -1,7 +1,7 @@ /* support_command.ino - command support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_cores.ino b/tasmota/support_cores.ino index 855768bbf..547b776dc 100644 --- a/tasmota/support_cores.ino +++ b/tasmota/support_cores.ino @@ -1,7 +1,7 @@ /* support_cores.ino - Arduino core support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_crash_recorder.ino b/tasmota/support_crash_recorder.ino index aa1d17a15..b9d81b53f 100644 --- a/tasmota/support_crash_recorder.ino +++ b/tasmota/support_crash_recorder.ino @@ -1,7 +1,7 @@ /* support_crash_recorder.ino - record the call stack in RTC in case of crash - Copyright (C) 2020 Stephan Hadinger, Theo Arends, + Copyright (C) 2021 Stephan Hadinger, Theo Arends, This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index becb20c5b..7e589e15e 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -1,7 +1,7 @@ /* support_device_groups.ino - device groups support for Tasmota - Copyright (C) 2020 Paul C Diem + Copyright (C) 2021 Paul C Diem Device group allow multiple devices to be in a group with power, light brightness, fade and speed settings and other module-specific settings diff --git a/tasmota/support_eeprom.ino b/tasmota/support_eeprom.ino index 467459354..10828fe16 100644 --- a/tasmota/support_eeprom.ino +++ b/tasmota/support_eeprom.ino @@ -1,7 +1,7 @@ /* support_eeprom.ino - eeprom support for Sonoff-Tasmota - Copyright (C) 2020 Theo Arends & Gerhard Mutz + Copyright (C) 2021 Theo Arends & Gerhard Mutz This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_esp32.ino b/tasmota/support_esp32.ino index 3018b9de8..275064204 100644 --- a/tasmota/support_esp32.ino +++ b/tasmota/support_esp32.ino @@ -1,7 +1,7 @@ /* support_esp32.ino - ESP32 specific code for Tasmota - Copyright (C) 2020 Theo Arends / Jörg Schüler-Maroldt + Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_esptool.ino b/tasmota/support_esptool.ino index efde513fc..f100a4706 100644 --- a/tasmota/support_esptool.ino +++ b/tasmota/support_esptool.ino @@ -1,7 +1,7 @@ /* support_esptool.ino - esptool support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 7a5d6cbcb..29ef7a15c 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -1,7 +1,7 @@ /* support_features.ino - feature support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_filesystem.ino b/tasmota/support_filesystem.ino index 94b69fea2..445c34ae4 100644 --- a/tasmota/support_filesystem.ino +++ b/tasmota/support_filesystem.ino @@ -1,7 +1,7 @@ /* support_filesystem.ino - Filesystem support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_flash_log.ino b/tasmota/support_flash_log.ino index a1bdd5012..58a8c2dc0 100644 --- a/tasmota/support_flash_log.ino +++ b/tasmota/support_flash_log.ino @@ -1,7 +1,7 @@ /* support_flash_log.ino - log to flash support for Sonoff-Tasmota - Copyright (C) 2020 Theo Arends & Christian Baars + Copyright (C) 2021 Theo Arends & Christian Baars This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_float.ino b/tasmota/support_float.ino index 1e2edc3f2..2bdf32ef2 100644 --- a/tasmota/support_float.ino +++ b/tasmota/support_float.ino @@ -1,7 +1,7 @@ /* support_float.ino - Small floating point support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_jpeg.ino b/tasmota/support_jpeg.ino index e9d0b2813..4669b9ad7 100644 --- a/tasmota/support_jpeg.ino +++ b/tasmota/support_jpeg.ino @@ -1,7 +1,7 @@ /* jpeg_utils.c - Version header file for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_light_list.ino b/tasmota/support_light_list.ino index 316f3f64e..eaaea1322 100644 --- a/tasmota/support_light_list.ino +++ b/tasmota/support_light_list.ino @@ -1,7 +1,7 @@ /* support_light_list.ino - Lightweight Linked List for simple objects - optimized for low code size and low memory - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,9 +18,9 @@ */ /*********************************************************************************************\ - * + * * private class for Linked List element - * + * \*********************************************************************************************/ template class LList; @@ -43,9 +43,9 @@ protected: }; /*********************************************************************************************\ - * + * * Lightweight Linked List - optimized for low code size - * + * \*********************************************************************************************/ template class LList { diff --git a/tasmota/support_network.ino b/tasmota/support_network.ino index f50705272..56ac7d799 100644 --- a/tasmota/support_network.ino +++ b/tasmota/support_network.ino @@ -1,7 +1,7 @@ /* support_network.ino - Network support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_rotary.ino b/tasmota/support_rotary.ino index f38d8fb9f..7470a0985 100644 --- a/tasmota/support_rotary.ino +++ b/tasmota/support_rotary.ino @@ -1,7 +1,7 @@ /* support_rotary.ino - rotary switch support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_rtc.ino b/tasmota/support_rtc.ino index 294303026..fc8a14042 100644 --- a/tasmota/support_rtc.ino +++ b/tasmota/support_rtc.ino @@ -1,7 +1,7 @@ /* support_rtc.ino - Real Time Clock support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_static_buffer.ino b/tasmota/support_static_buffer.ino index 9504ba3dd..2c3b8887c 100644 --- a/tasmota/support_static_buffer.ino +++ b/tasmota/support_static_buffer.ino @@ -1,7 +1,7 @@ /* support_buffer.ino - Static binary buffer for Zigbee on Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_statistics.ino b/tasmota/support_statistics.ino index 59318e575..e899ae604 100644 --- a/tasmota/support_statistics.ino +++ b/tasmota/support_statistics.ino @@ -1,7 +1,7 @@ /* support_statistics.ino - gather statistics for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_switch.ino b/tasmota/support_switch.ino index 36dc2bb39..3bf500b02 100644 --- a/tasmota/support_switch.ino +++ b/tasmota/support_switch.ino @@ -1,7 +1,7 @@ /* support_switch.ino - switch support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index b6178f4bc..dedb28f6d 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1,7 +1,7 @@ /* support_tasmota.ino - Core support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_udp.ino b/tasmota/support_udp.ino index f83788a59..7c13c86ba 100644 --- a/tasmota/support_udp.ino +++ b/tasmota/support_udp.ino @@ -1,7 +1,7 @@ /* support_udp.ino - Udp support for Tasmota - Copyright (C) 2020 Heiko Krupp and Theo Arends + Copyright (C) 2021 Heiko Krupp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/support_wifi.ino b/tasmota/support_wifi.ino index 6cba8a053..d70e9afd3 100644 --- a/tasmota/support_wifi.ino +++ b/tasmota/support_wifi.ino @@ -1,7 +1,7 @@ /* support_wifi.ino - wifi support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index 20f150f69..e01de2d3f 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -1,7 +1,7 @@ /* tasmota.h - Master header file for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 183606909..7dcc7e7ef 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -1,7 +1,7 @@ /* tasmota.ino - Tasmota firmware for iTead Sonoff, Wemos and NodeMCU hardware - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_ca.ino b/tasmota/tasmota_ca.ino index 990a0f970..97b79614b 100644 --- a/tasmota/tasmota_ca.ino +++ b/tasmota/tasmota_ca.ino @@ -1,7 +1,7 @@ /* tasmota_ca.ino - Certificate authorities for Tasmota, LetsEncrypt and AWS - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_compat.h b/tasmota/tasmota_compat.h index 598ca5619..4a75ec3a8 100644 --- a/tasmota/tasmota_compat.h +++ b/tasmota/tasmota_compat.h @@ -1,3 +1,22 @@ +/* + tasmota_compat.h - ESP32 support for Tasmota + + Copyright (C) 2021 Jörg Schüler-Maroldt and Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + #pragma once #ifdef ESP32 diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 6e4169e82..9a4e26e4d 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -1,7 +1,7 @@ /* tasmota_configurations.h - Configurations for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index 2f21ed0aa..3ce9881f6 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -1,7 +1,7 @@ /* tasmota_configurations_ESP32.h - ESP32 only Configurations for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index 7ef12bb8d..70a8e1745 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -1,7 +1,7 @@ /* tasmota_globals.h - Function prototypes and global configurations for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 786eeed08..714ca0f77 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -1,7 +1,7 @@ /* tasmota_template.h - template settings for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_template_legacy.h b/tasmota/tasmota_template_legacy.h index 153a6801b..4d5f2c507 100644 --- a/tasmota/tasmota_template_legacy.h +++ b/tasmota/tasmota_template_legacy.h @@ -1,7 +1,7 @@ /* tasmota_template_legacy.h - template settings for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 490f68bd8..c61d7dbaa 100644 --- a/tasmota/tasmota_version.h +++ b/tasmota/tasmota_version.h @@ -1,7 +1,7 @@ /* tasmota_version.h - Version header file for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/user_config_override_sample.h b/tasmota/user_config_override_sample.h index b04b979fe..d33e5fc75 100644 --- a/tasmota/user_config_override_sample.h +++ b/tasmota/user_config_override_sample.h @@ -1,7 +1,7 @@ /* user_config_override.h - user configuration overrides my_user_config.h for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index ba105332c..56389ea9a 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1,7 +1,7 @@ /* xdrv_01_webserver.ino - webserver for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino index a0bc0f494..81de886f4 100644 --- a/tasmota/xdrv_02_mqtt.ino +++ b/tasmota/xdrv_02_mqtt.ino @@ -1,7 +1,7 @@ /* xdrv_02_mqtt.ino - mqtt support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index 18c57b371..e7b52b9ab 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -1,7 +1,7 @@ /* xdrv_03_energy.ino - Energy sensor support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index f0b94bcec..5443a8a55 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -1,7 +1,7 @@ /* xdrv_04_light.ino - PWM, WS2812 and sonoff led support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -134,7 +134,7 @@ const char kLightCommands[] PROGMEM = "|" // No prefix D_CMND_WHITE "|" D_CMND_CHANNEL "|" D_CMND_HSBCOLOR "|" D_CMND_CTRANGE #ifdef USE_LIGHT_VIRTUAL_CT - "|" D_CMND_VIRTUALCT + "|" D_CMND_VIRTUALCT #endif // USE_LIGHT_VIRTUAL_CT #ifdef USE_LIGHT_PALETTE "|" D_CMND_PALETTE @@ -2385,7 +2385,7 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { } } #endif // ESP8266 - + // Now see if we need to mix RGB and White // Valid only for LST_RGBW, LST_RGBCW, SetOption105 1, and white is zero (see doc) if ((LST_RGBW <= Light.subtype) && (Settings.flag4.white_blend_mode) && (0 == cur_col_10[3]+cur_col_10[4])) { @@ -2400,7 +2400,7 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { white_bri10 = (white_bri10 > 1023) ? 1023 : white_bri10; // max 1023 rgbwwtable_applied_white = true; } - + #ifdef USE_LIGHT_VIRTUAL_CT // compute virtual CT, which is suppsed to be compatible with white_blend_mode if (Light.virtual_ct && (!white_free_cw) && (LST_RGBW <= Light.subtype)) { // any light with a white channel @@ -2444,7 +2444,7 @@ bool calcGammaBulbs(uint16_t cur_col_10[5]) { cur_col_10[3] = white_bri10; // simple case, we set the White level to the required brightness } else if ((LST_COLDWARM == Light.subtype) || (LST_RGBCW == Light.subtype)) { // if sum of both channels is > 255, then channels are probably uncorrelated - if (!white_free_cw) { + if (!white_free_cw) { // then we split the total energy among the cold and warm leds cur_col_10[cw0+1] = changeUIntScale(ct_10, 0, 1023, 0, white_bri10); cur_col_10[cw0] = white_bri10 - cur_col_10[cw0+1]; diff --git a/tasmota/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino index efa048465..44304c550 100644 --- a/tasmota/xdrv_05_irremote.ino +++ b/tasmota/xdrv_05_irremote.ino @@ -1,7 +1,7 @@ /* xdrv_05_irremote.ino - infra red support for Tasmota - Copyright (C) 2020 Heiko Krupp, Lazar Obradovic and Theo Arends + Copyright (C) 2021 Heiko Krupp, Lazar Obradovic and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_05_irremote_full.ino b/tasmota/xdrv_05_irremote_full.ino index 4bfd00da2..bed0e8199 100644 --- a/tasmota/xdrv_05_irremote_full.ino +++ b/tasmota/xdrv_05_irremote_full.ino @@ -1,7 +1,7 @@ /* xdrv_05_irremote_full.ino - complete integration of IRremoteESP8266 for Tasmota - Copyright (C) 2020 Heiko Krupp, Lazar Obradovic, Theo Arends, Stephan Hadinger + Copyright (C) 2021 Heiko Krupp, Lazar Obradovic, Theo Arends, Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_06_snfbridge.ino b/tasmota/xdrv_06_snfbridge.ino index 735913ed4..bb77d64c2 100644 --- a/tasmota/xdrv_06_snfbridge.ino +++ b/tasmota/xdrv_06_snfbridge.ino @@ -1,7 +1,7 @@ /* xdrv_06_snfbridge.ino - sonoff RF bridge 433 support for Tasmota - Copyright (C) 2020 Theo Arends and Erik Andrén Zachrisson (fw update) + Copyright (C) 2021 Theo Arends and Erik Andrén Zachrisson (fw update) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_07_domoticz.ino b/tasmota/xdrv_07_domoticz.ino index e43ed1ce4..82b769963 100644 --- a/tasmota/xdrv_07_domoticz.ino +++ b/tasmota/xdrv_07_domoticz.ino @@ -1,7 +1,7 @@ /* xdrv_07_domoticz.ino - domoticz support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_08_serial_bridge.ino b/tasmota/xdrv_08_serial_bridge.ino index 01e1cc5f0..eda328719 100644 --- a/tasmota/xdrv_08_serial_bridge.ino +++ b/tasmota/xdrv_08_serial_bridge.ino @@ -1,7 +1,7 @@ /* xdrv_08_serial_bridge.ino - serial bridge support for Tasmota - Copyright (C) 2020 Theo Arends and Dániel Zoltán Tolnai + Copyright (C) 2021 Theo Arends and Dániel Zoltán Tolnai This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_09_timers.ino b/tasmota/xdrv_09_timers.ino index 543da7d25..e2a66cfd0 100644 --- a/tasmota/xdrv_09_timers.ino +++ b/tasmota/xdrv_09_timers.ino @@ -1,7 +1,7 @@ /* xdrv_09_timers.ino - timer support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 9a91c9a38..8d8fefc13 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -1,7 +1,7 @@ /* xdrv_10_rules.ino - rule support for Tasmota - Copyright (C) 2020 ESP Easy Group and Theo Arends + Copyright (C) 2021 ESP Easy Group and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 6f7351c7d..d9a178e2b 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1,7 +1,7 @@ /* xdrv_10_scripter.ino - script support for Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_11_knx.ino b/tasmota/xdrv_11_knx.ino index 6aaf73715..0a8442e3b 100644 --- a/tasmota/xdrv_11_knx.ino +++ b/tasmota/xdrv_11_knx.ino @@ -1,7 +1,7 @@ /* xdrv_11_knx.ino - KNX IP Protocol support for Tasmota - Copyright (C) 2020 Adrian Scillato (https://github.com/ascillato) + Copyright (C) 2021 Adrian Scillato (https://github.com/ascillato) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -590,7 +590,7 @@ void KNX_CB_Action(message_t const &msg, void *arg) else if ((chan->type >= KNX_SLOT1) && (chan->type <= KNX_SLOT5)) // KNX RX SLOTs (write command) { if (!toggle_inhibit) { - char command[35]; //4294967295.00 13chars + 17 + char command[35]; //4294967295.00 13chars + 17 if (msg.data_len == 1) { // Command received snprintf_P(command, sizeof(command), PSTR("event KNXRX_CMND%d=%d"), ((chan->type) - KNX_SLOT1 + 1 ), msg.data[0]); diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index cd92e2e32..e61ec7938 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -1,7 +1,7 @@ /* xdrv_12_home_assistant.ino - home assistant support for Tasmota - Copyright (C) 2020 Erik Montnemery, Federico Leoni and Theo Arends + Copyright (C) 2021 Erik Montnemery, Federico Leoni and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 2fa7d95d8..00a2ac8a5 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -1,7 +1,7 @@ /* xdrv_13_display.ino - Display support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_14_mp3.ino b/tasmota/xdrv_14_mp3.ino index ed6beee63..b0af75e57 100644 --- a/tasmota/xdrv_14_mp3.ino +++ b/tasmota/xdrv_14_mp3.ino @@ -1,7 +1,7 @@ /* xdrv_14_mp3.ino - MP3 support for Tasmota - Copyright (C) 2020 gemu2015, mike2nl and Theo Arends + Copyright (C) 2021 gemu2015, mike2nl and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_15_pca9685.ino b/tasmota/xdrv_15_pca9685.ino index f57a10fd2..950a7df2b 100644 --- a/tasmota/xdrv_15_pca9685.ino +++ b/tasmota/xdrv_15_pca9685.ino @@ -1,7 +1,7 @@ /* xdrv_15_pca9685.ino - Support for I2C PCA9685 12bit 16 pin hardware PWM driver on Tasmota - Copyright (C) 2020 Andre Thomas and Theo Arends + Copyright (C) 2021 Andre Thomas and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index 51a0a9c5b..ba8766b98 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -1,7 +1,7 @@ /* xdrv_16_tuyamcu.ino - Tuya MCU support for Tasmota - Copyright (C) 2020 Federico Leoni, digiblur, Joel Stein and Theo Arends + Copyright (C) 2021 Federico Leoni, digiblur, Joel Stein and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_17_rcswitch.ino b/tasmota/xdrv_17_rcswitch.ino index 3930dd8cd..8877544df 100644 --- a/tasmota/xdrv_17_rcswitch.ino +++ b/tasmota/xdrv_17_rcswitch.ino @@ -1,7 +1,7 @@ /* xdrv_17_rcswitch.ino - RF transceiver using RcSwitch library for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_18_armtronix_dimmers.ino b/tasmota/xdrv_18_armtronix_dimmers.ino index a2fa782f5..14fba8c7b 100644 --- a/tasmota/xdrv_18_armtronix_dimmers.ino +++ b/tasmota/xdrv_18_armtronix_dimmers.ino @@ -1,7 +1,7 @@ /* xdrv_18_armtronix_dimmers.ino - Armtronix dimmers support for Tasmota - Copyright (C) 2020 wvdv2002 and Theo Arends + Copyright (C) 2021 wvdv2002 and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_19_ps16dz_dimmer.ino b/tasmota/xdrv_19_ps16dz_dimmer.ino index f3cb9ef5f..b44a6da1b 100644 --- a/tasmota/xdrv_19_ps16dz_dimmer.ino +++ b/tasmota/xdrv_19_ps16dz_dimmer.ino @@ -1,7 +1,7 @@ /* xdrv_19_ps16dz.dimmer.ino - PS_16_DZ dimmer support for Tasmota - Copyright (C) 2020 Joel Stein and Theo Arends + Copyright (C) 2021 Joel Stein and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_20_hue.ino b/tasmota/xdrv_20_hue.ino index e7289af7f..b0a18d16a 100644 --- a/tasmota/xdrv_20_hue.ino +++ b/tasmota/xdrv_20_hue.ino @@ -1,7 +1,7 @@ /* xdrv_20_hue.ino - Philips Hue support for Tasmota - Copyright (C) 2020 Heiko Krupp and Theo Arends + Copyright (C) 2021 Heiko Krupp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_21_wemo.ino b/tasmota/xdrv_21_wemo.ino index b63c89e89..96e937d21 100644 --- a/tasmota/xdrv_21_wemo.ino +++ b/tasmota/xdrv_21_wemo.ino @@ -1,7 +1,7 @@ /* xdrv_21_wemo.ino - wemo support for Tasmota - Copyright (C) 2020 Heiko Krupp and Theo Arends + Copyright (C) 2021 Heiko Krupp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_21_wemo_multi.ino b/tasmota/xdrv_21_wemo_multi.ino index 09c05b718..ec3fb7d42 100644 --- a/tasmota/xdrv_21_wemo_multi.ino +++ b/tasmota/xdrv_21_wemo_multi.ino @@ -1,7 +1,7 @@ /* xdrv_21_wemo_multi.ino - multiple wemo support for Tasmota - Copyright (C) 2020 Magic73, Heiko Krupp and Theo Arends + Copyright (C) 2021 Magic73, Heiko Krupp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_22_sonoff_ifan.ino b/tasmota/xdrv_22_sonoff_ifan.ino index 5ea74c792..4ee897020 100644 --- a/tasmota/xdrv_22_sonoff_ifan.ino +++ b/tasmota/xdrv_22_sonoff_ifan.ino @@ -1,7 +1,7 @@ /* xdrv_22_sonoff_ifan.ino - sonoff iFan02 and iFan03 support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_0_constants.ino b/tasmota/xdrv_23_zigbee_0_constants.ino index 50c9e4eee..f29c787c6 100644 --- a/tasmota/xdrv_23_zigbee_0_constants.ino +++ b/tasmota/xdrv_23_zigbee_0_constants.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_constants.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1165,11 +1165,11 @@ String getEmberStatus(uint8_t status) { 0x39, 0x3A, 0x3D, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x40, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x58, 0x59, 0x5A, 0x66, 0x69, 0x6A, 0x6C, - 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, - 0x80, 0x81, 0x82, 0x84, 0x85, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, + 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, + 0x80, 0x81, 0x82, 0x84, 0x85, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x94, 0x96, 0x98, 0x99, 0x9A, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, - 0x93, 0x95, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA8, - 0xB3, 0xB7, 0xB8, 0xBB, 0xBD, 0xA9, 0xAA, + 0x93, 0x95, 0xA1, 0xA3, 0xA4, 0xA5, 0xA6, 0xA8, + 0xB3, 0xB7, 0xB8, 0xBB, 0xBD, 0xA9, 0xAA, 0xB0, 0xB1, 0xB4, 0xB6, 0xB5, 0xBA }; char msg[32]; diff --git a/tasmota/xdrv_23_zigbee_1_headers.ino b/tasmota/xdrv_23_zigbee_1_headers.ino index 33ca5381e..3b9c73536 100644 --- a/tasmota/xdrv_23_zigbee_1_headers.ino +++ b/tasmota/xdrv_23_zigbee_1_headers.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_1_headers.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_1z_libs.ino b/tasmota/xdrv_23_zigbee_1z_libs.ino index 65ea266d2..4e018a21e 100644 --- a/tasmota/xdrv_23_zigbee_1z_libs.ino +++ b/tasmota/xdrv_23_zigbee_1z_libs.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_1z_libs.ino - zigbee support for Tasmota, JSON replacement libs - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,9 +45,9 @@ int strcmp_PP(const char *p1, const char *p2) { } /*********************************************************************************************\ - * + * * Variables for Rules from last Zigbee message received - * + * \*********************************************************************************************/ typedef struct Z_LastMessageVars { @@ -65,9 +65,9 @@ uint16_t Z_GetLastCluster(void) { return gZbLastMessage.cluster; } uint8_t Z_GetLastEndpoint(void) { return gZbLastMessage.endpoint; } /*********************************************************************************************\ - * + * * Class for single attribute - * + * \*********************************************************************************************/ enum class Za_type : uint8_t { @@ -126,7 +126,7 @@ public: attr_type(0xFF), attr_multiplier(1) {}; - + Z_attribute(const Z_attribute & rhs) { deepCopy(rhs); } @@ -213,9 +213,9 @@ protected: }; /*********************************************************************************************\ - * + * * Class for attribute ordered list - * + * \*********************************************************************************************/ @@ -309,9 +309,9 @@ Z_attribute & Z_attribute_list::addAttributePMEM(const char * name) { } /*********************************************************************************************\ - * + * * Implementation for Z_attribute - * + * \*********************************************************************************************/ // free any allocated memoruy for keys @@ -719,9 +719,9 @@ void Z_attribute::deepCopy(const Z_attribute & rhs) { } /*********************************************************************************************\ - * + * * Implementation for Z_attribute_list - * + * \*********************************************************************************************/ // add a cluster/attr_id attribute at the end of the list Z_attribute & Z_attribute_list::addAttribute(uint16_t cluster, uint16_t attr_id, uint8_t suffix) { diff --git a/tasmota/xdrv_23_zigbee_2_devices.ino b/tasmota/xdrv_23_zigbee_2_devices.ino index c319bb26f..e03e27d3d 100644 --- a/tasmota/xdrv_23_zigbee_2_devices.ino +++ b/tasmota/xdrv_23_zigbee_2_devices.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -235,7 +235,7 @@ public: inline void setCT(uint16_t _ct) { ct = _ct; } inline void setX(uint16_t _x) { x = _x; } inline void setY(uint16_t _y) { y = _y; } - + static const Z_Data_Type type = Z_Data_Type::Z_Light; // 12 bytes uint8_t colormode; // 0x00: Hue/Sat, 0x01: XY, 0x02: CT | 0xFF not set, default 0x01 @@ -248,7 +248,7 @@ public: /*********************************************************************************************\ * Device specific: PIR - * + * // List of occupancy time-outs: // 0xF = default (90 s) // 0x0 = no time-out @@ -274,7 +274,7 @@ public: inline uint8_t getOccupancy(void) const { return occupancy; } inline uint16_t getIlluminance(void) const { return illuminance; } - + inline void setOccupancy(uint8_t _occupancy) { occupancy = _occupancy; } inline void setIlluminance(uint16_t _illuminance) { illuminance = _illuminance; } @@ -429,7 +429,7 @@ public: } void convertZoneStatus(Z_attribute_list & attr_list, uint16_t val) const; - + // 4 bytes uint16_t zone_status; // last known state for sensor 1 & 2 uint16_t zone_type; // mapped to the Zigbee standard @@ -503,7 +503,7 @@ void Z_Data_Alarm::convertZoneStatus(Z_attribute_list & attr_list, uint16_t val) /*********************************************************************************************\ * Mode - * + * // List of modes // 0x1 = Tuya Zigbee mode // 0xF (default) = ZCL standard mode @@ -524,7 +524,7 @@ public: }; /*********************************************************************************************\ - * + * \*********************************************************************************************/ const uint8_t Z_Data_Type_len[] PROGMEM = { 0, // 0x00 Z_Data_Type::Z_Unknown @@ -556,9 +556,9 @@ size_t Z_Data::DataTypeToLength(Z_Data_Type t) { /*********************************************************************************************\ - * + * * Device specific Linked List - * + * \*********************************************************************************************/ class Z_Data_Set : public LList { public: @@ -886,7 +886,7 @@ public: Z_Device & isKnownLongAddrDevice(uint64_t longaddr) const; Z_Device & isKnownIndexDevice(uint32_t index) const; Z_Device & isKnownFriendlyNameDevice(const char * name) const; - + Z_Device & findShortAddr(uint16_t shortaddr); const Z_Device & findShortAddr(uint16_t shortaddr) const; Z_Device & findLongAddr(uint64_t longaddr); diff --git a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino index b54f2aff1..0a97a9938 100644 --- a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino +++ b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_2a_devices_impl.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_3_hue.ino b/tasmota/xdrv_23_zigbee_3_hue.ino index 2939e75b5..100faef9c 100644 --- a/tasmota/xdrv_23_zigbee_3_hue.ino +++ b/tasmota/xdrv_23_zigbee_3_hue.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_4_persistence.ino b/tasmota/xdrv_23_zigbee_4_persistence.ino index 91c516194..35d25922b 100644 --- a/tasmota/xdrv_23_zigbee_4_persistence.ino +++ b/tasmota/xdrv_23_zigbee_4_persistence.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_4a_nano_fs.ino b/tasmota/xdrv_23_zigbee_4a_nano_fs.ino index 2c9ea9ec7..007615c1b 100644 --- a/tasmota/xdrv_23_zigbee_4a_nano_fs.ino +++ b/tasmota/xdrv_23_zigbee_4a_nano_fs.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_4a_eeprom.ino - zigbee support for Tasmota - nano filesystem for EEPROM, with anti-weavering - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -93,9 +93,9 @@ // - only file size actually changes /*********************************************************************************************\ - * + * * Constants - * + * \*********************************************************************************************/ const size_t ZFS_BLOCK_SIZE = 256; const size_t ZFS_ENTRY_SIZE = 8; // each entry is 32 bytes @@ -124,7 +124,7 @@ public: blk_start(0), reserved(0) {} - + inline static bool validIdx(uint8_t blk_start) { return ((blk_start != 0x00) && (blk_start != 0x01) && (blk_start != 0xFF)); }; static uint16_t getAddress(uint8_t entry_idx); void read(uint8_t entry_idx); @@ -190,9 +190,9 @@ public: }; /*********************************************************************************************\ - * + * * Formatting implementations - * + * \*********************************************************************************************/ void ZFS_Dir_Block::format(void) { @@ -229,9 +229,9 @@ void ZFS_Map::format(void) { } /*********************************************************************************************\ - * + * * Writing a file - * + * \*********************************************************************************************/ class ZFS_Write_File { @@ -256,9 +256,9 @@ protected: /*********************************************************************************************\ - * + * * Check that the EEPROM is formatted - * + * \*********************************************************************************************/ // Main class for the Zigbee filesystem @@ -277,9 +277,9 @@ public: }; /*********************************************************************************************\ - * + * * Check that the EEPROM is formatted - * + * \*********************************************************************************************/ bool ZFS::findFileEntry(uint32_t name, ZFS_File_Entry & entry, uint8_t * _entry_idx) { @@ -317,9 +317,9 @@ void ZFS::erase(void) { } /*********************************************************************************************\ - * + * * Reading a file - * + * \*********************************************************************************************/ int32_t ZFS::readBytes(uint32_t name, void* buffer, size_t buffer_len, uint16_t read_start, uint16_t read_len) { if (!zigbee.eeprom_ready) { return -1; } @@ -349,9 +349,9 @@ int32_t ZFS::readBytes(uint32_t name, void* buffer, size_t buffer_len, uint16_t } /*********************************************************************************************\ - * + * * Check that the EEPROM is formatted - * + * \*********************************************************************************************/ void ZFS::initOrFormat(void) { @@ -386,7 +386,7 @@ void ZFS::initOrFormat(void) { format(); } delete dir; - + zigbee.eeprom_ready = true; } @@ -408,7 +408,7 @@ void ZFS::format(void) { zigbee.eeprom.writeBytes(0x0100, 256, (byte*) map); delete map; - // Dir + // Dir ZFS_Dir_Block * dir = new ZFS_Dir_Block(); dir->format(); zigbee.eeprom.writeBytes(0x0000, 256, (byte*) dir); diff --git a/tasmota/xdrv_23_zigbee_4b_eeprom.ino b/tasmota/xdrv_23_zigbee_4b_eeprom.ino index 360efb59d..88fa1e391 100644 --- a/tasmota/xdrv_23_zigbee_4b_eeprom.ino +++ b/tasmota/xdrv_23_zigbee_4b_eeprom.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_4a_eeprom.ino - zigbee support for Tasmota - saving configuration in I2C Eeprom of ZBBridge - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -107,9 +107,9 @@ int32_t hydrateSingleDevice(const class SBuffer & buf, size_t start, size_t len) } /*********************************************************************************************\ - * + * * Hydrate data from the EEPROM - * + * \*********************************************************************************************/ // Parse the entire blob // return true if ok @@ -200,9 +200,9 @@ class SBuffer hibernateDeviceData(const struct Z_Device & device, bool mqtt = fa } /*********************************************************************************************\ - * + * * Hibernate data to the EEPROM - * + * \*********************************************************************************************/ void hibernateAllData(void) { #ifdef USE_ZIGBEE_EZSP @@ -255,7 +255,7 @@ bool hibernateDevicesInEEPROM(void) { if (!zigbee.eeprom_ready) { return false; } ZFS_Write_File write_data(ZIGB_NAME2); - + // first prefix is number of devices uint8_t devices_size = zigbee_devices.devicesSize(); if (devices_size > 64) { devices_size = 64; } // arbitrarily limit to 64 devices in EEPROM instead of 32 in Flash diff --git a/tasmota/xdrv_23_zigbee_5__constants.ino b/tasmota/xdrv_23_zigbee_5__constants.ino index dd7e9234c..fdd161c50 100644 --- a/tasmota/xdrv_23_zigbee_5__constants.ino +++ b/tasmota/xdrv_23_zigbee_5__constants.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_5__constants.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -40,30 +40,30 @@ def clean(s): def strings_to_pmem(arg): #strings = arg.split("\n") strings = re.findall(pat, arg) - + # do some basic cleaning strings_cleaned = [ clean(x) for x in strings if clean(x) != ""] - + # remove duplicates strings_cleaned = list(dict.fromkeys(strings_cleaned)) - + out_s = "const char Z_strings[] PROGMEM = \n" out_i = "enum Z_offsets {\n" - + index = 0; # add a first empty string out_s += " \"\\x00\"\n" out_i += " Zo_ = " + str(index) + ",\n" index += 1 - + for s in strings_cleaned: out_s += " \"" + s + "\" \"\\x00\"\n" out_i += " Zo_" + s + " = " + str(index) + ",\n" index += len(s) + 1 # add one for null char - + out_s += " \"\\x00\";" out_i += "};" - + return ("", out_s, out_i) @@ -73,7 +73,7 @@ def strings_to_pmem(arg): DO NOT EDIT */ -const char Z_strings[] PROGMEM = +const char Z_strings[] PROGMEM = "\x00" "ZCLVersion" "\x00" "AppVersion" "\x00" diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 06c59ece8..8af9ee7fa 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_converters.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1624,7 +1624,7 @@ void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { void ZCLFrame::syntheticAnalogValue(Z_attribute_list &attr_list, class Z_attribute &attr) { const char * modelId_c = zigbee_devices.getModelId(_srcaddr); // null if unknown String modelId((char*) modelId_c); - + if (modelId.startsWith(F("lumi.sensor_cube"))) { attr.setKeyId(0x000C, 0xFF55); // change to AqaraRotate } diff --git a/tasmota/xdrv_23_zigbee_6_commands.ino b/tasmota/xdrv_23_zigbee_6_commands.ino index 63ea80869..89e3a6e65 100644 --- a/tasmota/xdrv_23_zigbee_6_commands.ino +++ b/tasmota/xdrv_23_zigbee_6_commands.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_converters.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_7_0_statemachine.ino b/tasmota/xdrv_23_zigbee_7_0_statemachine.ino index d314e86b4..7c00cfb42 100644 --- a/tasmota/xdrv_23_zigbee_7_0_statemachine.ino +++ b/tasmota/xdrv_23_zigbee_7_0_statemachine.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_7_5_map.ino b/tasmota/xdrv_23_zigbee_7_5_map.ino index 17c79d5e5..790720320 100644 --- a/tasmota/xdrv_23_zigbee_7_5_map.ino +++ b/tasmota/xdrv_23_zigbee_7_5_map.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_7_5_map.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index 32709c7dc..4fc3d4f1b 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_9_serial.ino b/tasmota/xdrv_23_zigbee_9_serial.ino index b3600c151..e2c5550a4 100644 --- a/tasmota/xdrv_23_zigbee_9_serial.ino +++ b/tasmota/xdrv_23_zigbee_9_serial.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_9_serial.ino - zigbee: serial communication with MCU - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_9a_upload.ino b/tasmota/xdrv_23_zigbee_9a_upload.ino index d3fff537d..b946848a3 100644 --- a/tasmota/xdrv_23_zigbee_9a_upload.ino +++ b/tasmota/xdrv_23_zigbee_9a_upload.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee_9a_upload.ino - zigbee: serial xmodem upload to MCU - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 61d8e2963..799274dd0 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -1,7 +1,7 @@ /* xdrv_23_zigbee.ino - zigbee support for Tasmota - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -2072,7 +2072,7 @@ void ZigbeeShow(bool json) WSContentSend_P(msg[ZB_WEB_LINE_END]); // Terminate current multi column table and open new table if (zigbee.permit_end_time) { // PermitJoin in progress - + WSContentSend_P(msg[ZB_WEB_PERMITJOIN_ACTIVE], D_ZIGBEE_PERMITJOIN_ACTIVE); } #endif @@ -2085,7 +2085,7 @@ void ZigbeeMapRefresh(void) { ZigbeeMapAllDevices(); } Webserver->sendHeader("Location","/zbm"); // Add a header to respond with a new location for the browser to go to the home page again - Webserver->send(302); + Webserver->send(302); } // Display a graphical representation of the Zigbee map using vis.js network diff --git a/tasmota/xdrv_24_buzzer.ino b/tasmota/xdrv_24_buzzer.ino index 8dcb949c9..e6665e21f 100644 --- a/tasmota/xdrv_24_buzzer.ino +++ b/tasmota/xdrv_24_buzzer.ino @@ -1,7 +1,7 @@ /* xdrv_24_Buzzer.ino - buzzer support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_25_A4988_Stepper.ino b/tasmota/xdrv_25_A4988_Stepper.ino index f70ed76f0..50e9997b1 100644 --- a/tasmota/xdrv_25_A4988_Stepper.ino +++ b/tasmota/xdrv_25_A4988_Stepper.ino @@ -2,7 +2,7 @@ /* xdrv_25_a4988_stepper.ino - A4988 StepMotorDriverCircuit- support for Tasmota - Copyright (C) 2020 Tim Leuscher and Theo Arends + Copyright (C) 2021 Tim Leuscher and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_26_ariluxrf.ino b/tasmota/xdrv_26_ariluxrf.ino index dc0010ac1..fca693c8d 100644 --- a/tasmota/xdrv_26_ariluxrf.ino +++ b/tasmota/xdrv_26_ariluxrf.ino @@ -1,7 +1,7 @@ /* xdrv_26_ariluxrf.ino - Arilux Rf support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index e46dbbca7..ed6e72c57 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -1,7 +1,7 @@ /* xdrv_27_Shutter[i].ino - Shutter/Blind support for Tasmota - Copyright (C) 2020 Stefan Bode + Copyright (C) 2021 Stefan Bode This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -984,7 +984,7 @@ void CmndShutterStop(void) AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Stop moving %d: dir: %d"), XdrvMailbox.index, Shutter[i].direction); Shutter[i].target_position = Shutter[i].real_position; - } + } if (XdrvMailbox.command) ResponseCmndDone(); } else { diff --git a/tasmota/xdrv_28_pcf8574.ino b/tasmota/xdrv_28_pcf8574.ino index f7939a815..58bb5239c 100644 --- a/tasmota/xdrv_28_pcf8574.ino +++ b/tasmota/xdrv_28_pcf8574.ino @@ -1,7 +1,7 @@ /* xdrv_28_pcf8574.ino - PCF8574 I2C support for Tasmota - Copyright (C) 2020 Stefan Bode + Copyright (C) 2021 Stefan Bode This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 43ad54c6b..3e28a9d31 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -1,7 +1,7 @@ /* xdrv_29_deepsleep.ino - DeepSleep support for Tasmota - Copyright (C) 2020 Stefan Bode + Copyright (C) 2021 Stefan Bode This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_30_exs_dimmer.ino b/tasmota/xdrv_30_exs_dimmer.ino index 84b051c68..b704d616d 100644 --- a/tasmota/xdrv_30_exs_dimmer.ino +++ b/tasmota/xdrv_30_exs_dimmer.ino @@ -1,7 +1,7 @@ /* xdrv_30_exs_dimmer.ino - ex-store dimmer support for Tasmota - Copyright (C) 2020 Andreas Schultz + Copyright (C) 2021 Andreas Schultz This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_31_tasmota_client.ino b/tasmota/xdrv_31_tasmota_client.ino index cac38cf01..bf4426b61 100644 --- a/tasmota/xdrv_31_tasmota_client.ino +++ b/tasmota/xdrv_31_tasmota_client.ino @@ -1,7 +1,7 @@ /* xdrv_31_tasmota_client.ino - Support for external microcontroller on serial - Copyright (C) 2020 Andre Thomas and Theo Arends + Copyright (C) 2021 Andre Thomas and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_32_hotplug.ino b/tasmota/xdrv_32_hotplug.ino index bfdafbd4b..e7dc4ac69 100644 --- a/tasmota/xdrv_32_hotplug.ino +++ b/tasmota/xdrv_32_hotplug.ino @@ -1,7 +1,7 @@ /* xdrv_32_hotplug.ino - HotPlug support for sensors - Copyright (C) 2020 Leonid Myravjev + Copyright (C) 2021 Leonid Myravjev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_33_nrf24l01.ino b/tasmota/xdrv_33_nrf24l01.ino index b1e8d43c4..e992c398b 100644 --- a/tasmota/xdrv_33_nrf24l01.ino +++ b/tasmota/xdrv_33_nrf24l01.ino @@ -1,7 +1,7 @@ /* xdrv_33_nrf24l01.ino - nrf24l01 support for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_34_wemos_motor_v1.ino b/tasmota/xdrv_34_wemos_motor_v1.ino index 9e6c0a967..cfd9de2d2 100644 --- a/tasmota/xdrv_34_wemos_motor_v1.ino +++ b/tasmota/xdrv_34_wemos_motor_v1.ino @@ -1,7 +1,7 @@ /* xdrv_34_wemos_motor_v1.ino - Support for I2C WEMOS motor shield (6612FNG) - Copyright (C) 2020 Denis Sborets and Theo Arends + Copyright (C) 2021 Denis Sborets and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_35_pwm_dimmer.ino b/tasmota/xdrv_35_pwm_dimmer.ino index c54d071f1..3bca88477 100644 --- a/tasmota/xdrv_35_pwm_dimmer.ino +++ b/tasmota/xdrv_35_pwm_dimmer.ino @@ -1,7 +1,7 @@ /* xdrv_35_pwm_dimmer.ino - PWM Dimmer Switch support for Tasmota - Copyright (C) 2020 Paul C Diem + Copyright (C) 2021 Paul C Diem This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -99,7 +99,7 @@ void PWMModulePreInit(void) // determine how long a button is held before a reset command is executed. If SetOption32 is // still 5, change it to 40 (the default). if (Settings.param[P_HOLD_TIME] == 5) Settings.param[P_HOLD_TIME] = 40; - + // Make sure the brightness level settings are sensible. if (!Settings.bri_power_on) Settings.bri_power_on = 128; if (!Settings.bri_preset_low) Settings.bri_preset_low = 10; @@ -286,7 +286,7 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) uint32_t now = millis(); // If the button was pressed and released but was not processed by support_button because the - // button interval had not elapsed, + // button interval had not elapsed, if (button_unprocessed[button_index]) { mqtt_trigger = 5; #ifdef USE_PWM_DIMMER_REMOTE diff --git a/tasmota/xdrv_36_keeloq.ino b/tasmota/xdrv_36_keeloq.ino index a1a392897..4a0f33a83 100644 --- a/tasmota/xdrv_36_keeloq.ino +++ b/tasmota/xdrv_36_keeloq.ino @@ -1,7 +1,7 @@ /* xdrv_36_keeloq.ino - Jarolift Keeloq shutter support for Tasmota - Copyright (C) 2020 he-so + Copyright (C) 2021 he-so This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_37_sonoff_d1.ino b/tasmota/xdrv_37_sonoff_d1.ino index 30b061775..5abefd452 100644 --- a/tasmota/xdrv_37_sonoff_d1.ino +++ b/tasmota/xdrv_37_sonoff_d1.ino @@ -1,7 +1,7 @@ /* xdrv_37_sonoff_d1.ino - sonoff D1 dimmer support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_38_ping.ino b/tasmota/xdrv_38_ping.ino index d4d5ea5d9..3f87a54bb 100644 --- a/tasmota/xdrv_38_ping.ino +++ b/tasmota/xdrv_38_ping.ino @@ -1,7 +1,7 @@ /* xdrv_38_ping.ino - support for ICMP Ping - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_39_thermostat.ino b/tasmota/xdrv_39_thermostat.ino index d8cd0f11c..455e45f13 100644 --- a/tasmota/xdrv_39_thermostat.ino +++ b/tasmota/xdrv_39_thermostat.ino @@ -1,7 +1,7 @@ /* xdrv_39_thermostat.ino - Thermostat controller for Tasmota - Copyright (C) 2020 Javier Arigita + Copyright (C) 2021 Javier Arigita This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index 628ae0782..a96842065 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -1,7 +1,7 @@ /* xdrv_40_telegram.ino - telegram for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_41_tcp_bridge.ino b/tasmota/xdrv_41_tcp_bridge.ino index 3bd1e045c..7533e7d6d 100644 --- a/tasmota/xdrv_41_tcp_bridge.ino +++ b/tasmota/xdrv_41_tcp_bridge.ino @@ -1,7 +1,7 @@ /* xdrv_41_tcp_bridge.ino - TCP to serial bridge - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_42_i2s_audio.ino b/tasmota/xdrv_42_i2s_audio.ino index 0bb02e652..1e468593b 100644 --- a/tasmota/xdrv_42_i2s_audio.ino +++ b/tasmota/xdrv_42_i2s_audio.ino @@ -1,7 +1,7 @@ /* xdrv_42_i2s_audio.ino - audio dac support for Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_43_mlx90640.ino b/tasmota/xdrv_43_mlx90640.ino index a95b0f1e0..18255c079 100644 --- a/tasmota/xdrv_43_mlx90640.ino +++ b/tasmota/xdrv_43_mlx90640.ino @@ -1,7 +1,7 @@ /* xdrv_43_mlx90640.ino - MLX90640 support for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_44_miel_hvac.ino b/tasmota/xdrv_44_miel_hvac.ino index aad4205bd..680d9d72f 100644 --- a/tasmota/xdrv_44_miel_hvac.ino +++ b/tasmota/xdrv_44_miel_hvac.ino @@ -1,7 +1,7 @@ /* xdrv_44_miel_hvac.ino - Mitsubishi Electric HVAC support for Tasmota - Copyright (C) 2020 David Gwynne + Copyright (C) 2021 David Gwynne This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_45_shelly_dimmer.ino b/tasmota/xdrv_45_shelly_dimmer.ino index b4785291e..0b44cde96 100644 --- a/tasmota/xdrv_45_shelly_dimmer.ino +++ b/tasmota/xdrv_45_shelly_dimmer.ino @@ -1,7 +1,7 @@ /* xdrv_45_shelly_dimmer.ino - shelly dimmer support for Tasmota - Copyright (C) 2020 James Turton + Copyright (C) 2021 James Turton This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xdrv_46_ccloader.ino b/tasmota/xdrv_46_ccloader.ino index 32901adc6..3675ca676 100644 --- a/tasmota/xdrv_46_ccloader.ino +++ b/tasmota/xdrv_46_ccloader.ino @@ -1,7 +1,7 @@ /* xdrv_46_ccloader.ino - CCLoader for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends based on CCLoader - Copyright (c) 2012-2014 RedBearLab @@ -25,14 +25,14 @@ 0.9.0.0 20191124 started - further development by Christian Baars forked - CCLoader - Copyright (c) 2012-2014 RedBearLab - + */ #ifdef USE_CCLOADER /*********************************************************************************************\ * CCLOader * -* Usage: +* Usage: \*********************************************************************************************/ #define XDRV_46 46 @@ -123,7 +123,7 @@ struct { bool init = false; } CCL; -const char CCLtype[] PROGMEM = "CCL"; +const char CCLtype[] PROGMEM = "CCL"; // Debug control pins & the indicate LED int CCL_RESET = 14; //GPIO14=D5 on NodeMCU/WeMos D1 Mini @@ -175,7 +175,7 @@ unsigned char CCLread_debug_byte(void) if(HIGH == digitalRead(CCL_DD)) { data |= 0x01; - } + } digitalWrite(CCL_DC, LOW); // DC low } return data; @@ -604,23 +604,23 @@ bool CLLFlashFirmware(uint8_t* data, uint32_t size) // Enable DMA (Disable DMA_PAUSE bit in debug configuration) debug_config = 0x22; CCLdebug_command(CCL_CMD_WR_CONFIG, &debug_config, 1); - - unsigned char rxBuf[512]; - uint32_t block = 0; + + unsigned char rxBuf[512]; + uint32_t block = 0; unsigned int addr = 0x0000; AddLog_P(LOG_LEVEL_INFO,PSTR("CCL: will flash ....")); AddLogBuffer(LOG_LEVEL_DEBUG,data,16); // quick check to compare with a hex editor while((block*512)4 && MGC_data.out.id != MGC3130_FW_VERSION){ AddLog_P(LOG_LEVEL_DEBUG,PSTR("MGC3130: missed a packet, mismatch: %u"), _mismatch - 1); AddLogBuffer(LOG_LEVEL_DEBUG,MGC_data.buffer,i); - } + } } _lastCounter = MGC_data.out.counter; success = true; diff --git a/tasmota/xsns_37_rfsensor.ino b/tasmota/xsns_37_rfsensor.ino index 7dd376b97..aee5f6641 100644 --- a/tasmota/xsns_37_rfsensor.ino +++ b/tasmota/xsns_37_rfsensor.ino @@ -1,7 +1,7 @@ /* xsns_37_rfsensor.ino - RF sensor receiver for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_38_az7798.ino b/tasmota/xsns_38_az7798.ino index 1b5ba7f5f..b063dc166 100644 --- a/tasmota/xsns_38_az7798.ino +++ b/tasmota/xsns_38_az7798.ino @@ -1,7 +1,7 @@ /* xsns_38_az7798.ino - AZ_Instrument 7798 CO2/temperature/humidity meter support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_39_max31855.ino b/tasmota/xsns_39_max31855.ino index a6e592c21..2a6304ce1 100644 --- a/tasmota/xsns_39_max31855.ino +++ b/tasmota/xsns_39_max31855.ino @@ -1,7 +1,7 @@ /* xsns_39_max31855.ino - MAX31855 thermocouple sensor support for Tasmota - Copyright (C) 2020 Markus Past + Copyright (C) 2021 Markus Past This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_40_pn532.ino b/tasmota/xsns_40_pn532.ino index fb6d31354..4e9bbdcc4 100644 --- a/tasmota/xsns_40_pn532.ino +++ b/tasmota/xsns_40_pn532.ino @@ -1,7 +1,7 @@ /* xsns_40_pn532.ino - Support for PN532 (HSU) NFC Tag Reader on Tasmota - Copyright (C) 2020 Andre Thomas and Theo Arends + Copyright (C) 2021 Andre Thomas and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_41_max44009.ino b/tasmota/xsns_41_max44009.ino index b07d37567..7eccb043e 100644 --- a/tasmota/xsns_41_max44009.ino +++ b/tasmota/xsns_41_max44009.ino @@ -1,7 +1,7 @@ /* xsns_41_max44009.ino - MAX44009 ambient light sensor support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_42_scd30.ino b/tasmota/xsns_42_scd30.ino index c208c3307..458e046aa 100644 --- a/tasmota/xsns_42_scd30.ino +++ b/tasmota/xsns_42_scd30.ino @@ -1,7 +1,7 @@ /* xsns_42_scd30.ino - SC30 CO2 sensor support for Tasmota - Copyright (C) 2020 Frogmore42 + Copyright (C) 2021 Frogmore42 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_43_hre.ino b/tasmota/xsns_43_hre.ino index f7240ec17..68299b066 100644 --- a/tasmota/xsns_43_hre.ino +++ b/tasmota/xsns_43_hre.ino @@ -1,7 +1,7 @@ /* xsns_43_hre.ino - Badger HR-E Water Meter Encoder interface - Copyright (C) 2020 Jon Little + Copyright (C) 2021 Jon Little This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_44_sps30.ino b/tasmota/xsns_44_sps30.ino index c9316ba4c..9dd73dbcf 100644 --- a/tasmota/xsns_44_sps30.ino +++ b/tasmota/xsns_44_sps30.ino @@ -1,7 +1,7 @@ /* xsns_44_sps30.ino - Sensirion SPS30 support for Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_45_vl53l0x.ino b/tasmota/xsns_45_vl53l0x.ino index 623dda9a0..54c49534c 100644 --- a/tasmota/xsns_45_vl53l0x.ino +++ b/tasmota/xsns_45_vl53l0x.ino @@ -1,7 +1,7 @@ /* xsns_45_vl53l0x.ino - VL53L0X time of flight sensor support for Tasmota - Copyright (C) 2020 Theo Arends and Gerhard Mutz + Copyright (C) 2021 Theo Arends and Gerhard Mutz This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_46_MLX90614.ino b/tasmota/xsns_46_MLX90614.ino index 54e27f359..8032cdf2f 100644 --- a/tasmota/xsns_46_MLX90614.ino +++ b/tasmota/xsns_46_MLX90614.ino @@ -1,7 +1,7 @@ /* xsns_46_MLX90614.ino - Support for MLX ir temperature sensor - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_47_max31865.ino b/tasmota/xsns_47_max31865.ino index 4c45af4fe..83bef5e9a 100644 --- a/tasmota/xsns_47_max31865.ino +++ b/tasmota/xsns_47_max31865.ino @@ -1,7 +1,7 @@ /* xsns_39_MAX31865.ino - MAX31865 thermocouple sensor support for Tasmota - Copyright (C) 2020 Alberto Lopez Siemens + Copyright (C) 2021 Alberto Lopez Siemens This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_48_chirp.ino b/tasmota/xsns_48_chirp.ino index ded5b30e6..1e92d6c79 100644 --- a/tasmota/xsns_48_chirp.ino +++ b/tasmota/xsns_48_chirp.ino @@ -1,7 +1,7 @@ /* xsns_48_chirp.ino - soil moisture sensor support for Tasmota - Copyright (C) 2020 Theo Arends & Christian Baars + Copyright (C) 2021 Theo Arends & Christian Baars This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_50_paj7620.ino b/tasmota/xsns_50_paj7620.ino index ad5ce5a2c..174febc7d 100644 --- a/tasmota/xsns_50_paj7620.ino +++ b/tasmota/xsns_50_paj7620.ino @@ -1,7 +1,7 @@ /* xsns_50_paj7620.ino - gesture sensor support for Tasmota - Copyright (C) 2020 Theo Arends & Christian Baars + Copyright (C) 2021 Theo Arends & Christian Baars This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_51_rdm6300.ino b/tasmota/xsns_51_rdm6300.ino index ebc9ab175..a277e7d65 100644 --- a/tasmota/xsns_51_rdm6300.ino +++ b/tasmota/xsns_51_rdm6300.ino @@ -1,7 +1,7 @@ /* xsns_51_rdm6300.ino - Support for RDM630(0) 125kHz NFC Tag Reader on Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_52_ibeacon.ino b/tasmota/xsns_52_ibeacon.ino index db5c5951e..731189827 100755 --- a/tasmota/xsns_52_ibeacon.ino +++ b/tasmota/xsns_52_ibeacon.ino @@ -1,7 +1,7 @@ /* xsns_52_ibeacon.ino - Support for HM17 BLE Module + ibeacon reader on Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index cccfde736..06fa2300e 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -4,7 +4,7 @@ Created by Gerhard Mutz on 07.10.11. adapted for Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_54_ina226.ino b/tasmota/xsns_54_ina226.ino index 49a6b5890..f89d799e9 100644 --- a/tasmota/xsns_54_ina226.ino +++ b/tasmota/xsns_54_ina226.ino @@ -1,7 +1,7 @@ /* xsns_54_ina226.ino - INA226 Current Sensor support for Tasmota - Copyright (C) 2020 Stephen Rodgers and Theo Arends + Copyright (C) 2021 Stephen Rodgers and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_55_hih_series.ino b/tasmota/xsns_55_hih_series.ino index 89278e432..d42ec8a4b 100644 --- a/tasmota/xsns_55_hih_series.ino +++ b/tasmota/xsns_55_hih_series.ino @@ -1,7 +1,7 @@ /* xsns_55_hih_series.ino - Honeywell HIH series temperature and humidity sensor support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_56_hpma.ino b/tasmota/xsns_56_hpma.ino index 576cf19d2..c400fba1e 100644 --- a/tasmota/xsns_56_hpma.ino +++ b/tasmota/xsns_56_hpma.ino @@ -1,8 +1,8 @@ /* xsns_56_hpma.ino - Honeywell HPMA115S0 particle concentration sensor support for Tasmota - Copyright (C) 2020 Theo Arends - Copyright (C) 2020 David Hunt + Copyright (C) 2021 Theo Arends + Copyright (C) 2021 David Hunt This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_57_tsl2591.ino b/tasmota/xsns_57_tsl2591.ino index 395b69b23..1ec7a6838 100644 --- a/tasmota/xsns_57_tsl2591.ino +++ b/tasmota/xsns_57_tsl2591.ino @@ -1,7 +1,7 @@ /* xsns_57_tsl2591.ino - TSL2591 light sensor support for Tasmota - Copyright (C) 2020 Markus Bösling and Theo Arends + Copyright (C) 2021 Markus Bösling and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_58_dht12.ino b/tasmota/xsns_58_dht12.ino index a772e3cea..4bab87bb3 100644 --- a/tasmota/xsns_58_dht12.ino +++ b/tasmota/xsns_58_dht12.ino @@ -1,7 +1,7 @@ /* xsns_58_dht12.ino - DHT12 I2C temperature and humidity sensor support for Tasmota - Copyright (C) 2020 Stefan Oskamp and Theo Arends + Copyright (C) 2021 Stefan Oskamp and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_59_ds1624.ino b/tasmota/xsns_59_ds1624.ino index 12189164e..ccc079f4c 100644 --- a/tasmota/xsns_59_ds1624.ino +++ b/tasmota/xsns_59_ds1624.ino @@ -1,7 +1,7 @@ /* xsns_59_ds1624.ino - Support for I2C DS1624 Temperature Sensor - Copyright (C) 2020 Leonid Myravjev + Copyright (C) 2021 Leonid Myravjev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_60_GPS.ino b/tasmota/xsns_60_GPS.ino index 63fc147f2..10e02efc2 100644 --- a/tasmota/xsns_60_GPS.ino +++ b/tasmota/xsns_60_GPS.ino @@ -1,7 +1,7 @@ /* xsns_60_GPS.ino - GPS UBLOX support for Tasmota - Copyright (C) 2020 Theo Arends, Christian Baars and Adrian Scillato + Copyright (C) 2021 Theo Arends, Christian Baars and Adrian Scillato This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_61_MI_NRF24.ino b/tasmota/xsns_61_MI_NRF24.ino index 727aeb011..8dff44920 100644 --- a/tasmota/xsns_61_MI_NRF24.ino +++ b/tasmota/xsns_61_MI_NRF24.ino @@ -1,7 +1,7 @@ /* xsns_61_MI_NRF24.ino - MI-BLE-sensors via nrf24l01 support for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_62_MI_ESP32.ino b/tasmota/xsns_62_MI_ESP32.ino index 44094140e..9e9c70dc5 100644 --- a/tasmota/xsns_62_MI_ESP32.ino +++ b/tasmota/xsns_62_MI_ESP32.ino @@ -1,7 +1,7 @@ /* xsns_62_MI_ESP32.ino - MI-BLE-sensors via ESP32 support for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1634,7 +1634,7 @@ bool MI32isInBlockList(uint8_t* MAC){ void MI32removeMIBLEsensor(uint8_t* MAC){ MIBLEsensors.erase( std::remove_if( MIBLEsensors.begin() , MIBLEsensors.end(), [MAC]( mi_sensor_t _sensor )->bool - { return (memcmp(_sensor.MAC,MAC,6) == 0); } + { return (memcmp(_sensor.MAC,MAC,6) == 0); } ), end( MIBLEsensors ) ); } /***********************************************************************\ @@ -1930,7 +1930,7 @@ void CmndMi32Block(void){ break; case 1: ResponseCmndIdxChar(PSTR("show block list")); - break; + break; } } else { @@ -1939,7 +1939,7 @@ void CmndMi32Block(void){ switch (XdrvMailbox.index) { case 0: MIBLEBlockList.erase( std::remove_if( begin( MIBLEBlockList ), end( MIBLEBlockList ), [_MACasBytes]( MAC_t& _entry )->bool - { return (memcmp(_entry.buf,_MACasBytes.buf,6) == 0); } + { return (memcmp(_entry.buf,_MACasBytes.buf,6) == 0); } ), end( MIBLEBlockList ) ); ResponseCmndIdxChar(PSTR("MAC not blocked anymore")); break; @@ -1956,7 +1956,7 @@ void CmndMi32Block(void){ MI32removeMIBLEsensor(_MACasBytes.buf); } // AddLog_P(LOG_LEVEL_INFO,PSTR("MI32: size of ilist: %u"), MIBLEBlockList.size()); - break; + break; } } MI32.mode.shallShowBlockList = 1; diff --git a/tasmota/xsns_62_MI_HM10.ino b/tasmota/xsns_62_MI_HM10.ino index da28d7306..af3ce56ca 100644 --- a/tasmota/xsns_62_MI_HM10.ino +++ b/tasmota/xsns_62_MI_HM10.ino @@ -1,7 +1,7 @@ /* xsns_62_MI_HM10.ino - MI-BLE-sensors via HM-10 support for Tasmota - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -1085,7 +1085,7 @@ bool HM10isInBlockList(uint8_t* MAC){ void HM10removeMIBLEsensor(uint8_t* MAC){ MIBLEsensors.erase( std::remove_if( MIBLEsensors.begin() , MIBLEsensors.end(), [MAC]( mi_sensor_t _sensor )->bool - { return (memcmp(_sensor.MAC,MAC,6) == 0); } + { return (memcmp(_sensor.MAC,MAC,6) == 0); } ), end( MIBLEsensors ) ); } /*********************************************************************************************\ @@ -1693,7 +1693,7 @@ void CmndHM10Block(void){ break; case 1: ResponseCmndIdxChar(PSTR("show block list")); - break; + break; } } else { @@ -1702,7 +1702,7 @@ void CmndHM10Block(void){ switch (XdrvMailbox.index) { case 0: MIBLEBlockList.erase( std::remove_if( begin( MIBLEBlockList ), end( MIBLEBlockList ), [_MACasBytes]( MAC_t& _entry )->bool - { return (memcmp(_entry.buf,_MACasBytes.buf,6) == 0); } + { return (memcmp(_entry.buf,_MACasBytes.buf,6) == 0); } ), end( MIBLEBlockList ) ); ResponseCmndIdxChar(PSTR("MAC not blocked anymore")); break; @@ -1719,7 +1719,7 @@ void CmndHM10Block(void){ HM10removeMIBLEsensor(_MACasBytes.buf); } // AddLog_P(LOG_LEVEL_INFO,PSTR("HM10: size of ilist: %u"), MIBLEBlockList.size()); - break; + break; } } HM10.mode.shallShowBlockList = 1; diff --git a/tasmota/xsns_63_aht1x.ino b/tasmota/xsns_63_aht1x.ino index cba95662a..88da71890 100644 --- a/tasmota/xsns_63_aht1x.ino +++ b/tasmota/xsns_63_aht1x.ino @@ -1,7 +1,7 @@ /* xsns_63_AHT1x.ino - AHT10 I2C temperature and humidity sensor support for Tasmota - Copyright (C) 2020 Martin Wagner + Copyright (C) 2021 Martin Wagner This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_64_hrxl.ino b/tasmota/xsns_64_hrxl.ino index 389197e1a..be78b49ec 100644 --- a/tasmota/xsns_64_hrxl.ino +++ b/tasmota/xsns_64_hrxl.ino @@ -1,7 +1,7 @@ /* xsns_64_hrxl.ino - MaxBotix HRXL serial interface - Copyright (C) 2020 Jon Little + Copyright (C) 2021 Jon Little This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_65_hdc1080.ino b/tasmota/xsns_65_hdc1080.ino index ac6a71be8..d20241ab8 100644 --- a/tasmota/xsns_65_hdc1080.ino +++ b/tasmota/xsns_65_hdc1080.ino @@ -1,7 +1,7 @@ /* xsns_65_hdc1080.ino - Texas Instruments HDC1080 temperature and humidity sensor support for Tasmota - Copyright (C) 2020 Luis Teixeira + Copyright (C) 2021 Luis Teixeira This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_66_iAQ.ino b/tasmota/xsns_66_iAQ.ino index 962480748..fc3dff2da 100644 --- a/tasmota/xsns_66_iAQ.ino +++ b/tasmota/xsns_66_iAQ.ino @@ -1,7 +1,7 @@ /* xsns_66_iAQ.ino - Support for iAQ-Core - Indoor Air Quality Sensor Module - Copyright (C) 2020 Christian Baars and Theo Arends + Copyright (C) 2021 Christian Baars and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_67_as3935.ino b/tasmota/xsns_67_as3935.ino index a625163b6..030581768 100644 --- a/tasmota/xsns_67_as3935.ino +++ b/tasmota/xsns_67_as3935.ino @@ -1,7 +1,7 @@ /* xsns_67_as3935.ino - AS3935 Franklin Lightning Sensor support for Tasmota - Copyright (C) 2020 Martin Wagner + Copyright (C) 2021 Martin Wagner This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/xsns_68_windmeter.ino index a5b2aa49e..6b552ee38 100644 --- a/tasmota/xsns_68_windmeter.ino +++ b/tasmota/xsns_68_windmeter.ino @@ -1,7 +1,7 @@ /* xsns_68_windmeter.ino - Analog wind sensor support for Tasmota - Copyright (C) 2020 Matteo Albinola + Copyright (C) 2021 Matteo Albinola (inspired by great works of Thomas Eckerstorfer, Norbert Richter, Maarten Damen and Theo Arends) This program is free software: you can redistribute it and/or modify diff --git a/tasmota/xsns_69_opentherm.ino b/tasmota/xsns_69_opentherm.ino index 41f3377b7..adcef07b0 100644 --- a/tasmota/xsns_69_opentherm.ino +++ b/tasmota/xsns_69_opentherm.ino @@ -1,7 +1,7 @@ /* xsns_69_opentherm.ino - OpenTherm protocol support for Tasmota - Copyright (C) 2020 Yuriy Sannikov + Copyright (C) 2021 Yuriy Sannikov This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ // Seconds before OT will make an attempt to connect to the boiler after connection error #define SNS_OT_DISCONNECT_COOLDOWN_SECONDS 4 -// Number of consecutive timeouts which are accepted before entering disconnect state +// Number of consecutive timeouts which are accepted before entering disconnect state #define SNS_OT_MAX_TIMEOUTS_BEFORE_DISCONNECT 3 // Count of the OpenThermSettingsFlags diff --git a/tasmota/xsns_69_opentherm_protocol.ino b/tasmota/xsns_69_opentherm_protocol.ino index 6311b818b..6158be9c7 100644 --- a/tasmota/xsns_69_opentherm_protocol.ino +++ b/tasmota/xsns_69_opentherm_protocol.ino @@ -1,7 +1,7 @@ /* xsns_69_opentherm_protocol.ino - OpenTherm protocol support for Tasmota - Copyright (C) 2020 Yuriy Sannikov + Copyright (C) 2021 Yuriy Sannikov This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_70_veml6075.ino b/tasmota/xsns_70_veml6075.ino index 4735d1140..449ec89ec 100644 --- a/tasmota/xsns_70_veml6075.ino +++ b/tasmota/xsns_70_veml6075.ino @@ -1,7 +1,7 @@ /* xsns_70_veml6075.ino - VEML6075 UVA/UVB/UVINDEX Sensor support for Tasmota - Copyright (C) 2020 Martin Wagner + Copyright (C) 2021 Martin Wagner This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_71_veml7700.ino b/tasmota/xsns_71_veml7700.ino index 655d52992..a4bf12905 100644 --- a/tasmota/xsns_71_veml7700.ino +++ b/tasmota/xsns_71_veml7700.ino @@ -1,7 +1,7 @@ /* xsns_71_VEML7700.ino - VEML7700 Ambient light intensity Sensor support for Tasmota - Copyright (C) 2020 Martin Wagner + Copyright (C) 2021 Martin Wagner This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_72_mcp9808.ino b/tasmota/xsns_72_mcp9808.ino index 587123d2c..98fc48066 100644 --- a/tasmota/xsns_72_mcp9808.ino +++ b/tasmota/xsns_72_mcp9808.ino @@ -1,7 +1,7 @@ /* xsns_72_mcp9808 - MCP9808 I2C temperature sensor support for Tasmota - Copyright (C) 2020 Martin Wagner and Theo Arends + Copyright (C) 2021 Martin Wagner and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_73_hp303b.ino b/tasmota/xsns_73_hp303b.ino index 30a14945c..50589e4d5 100644 --- a/tasmota/xsns_73_hp303b.ino +++ b/tasmota/xsns_73_hp303b.ino @@ -1,7 +1,7 @@ /* xsns_72_hp303b.ino - HP303B digital barometric air pressure sensor support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_74_lmt01.ino b/tasmota/xsns_74_lmt01.ino index 85d97a492..8c6cfdb92 100644 --- a/tasmota/xsns_74_lmt01.ino +++ b/tasmota/xsns_74_lmt01.ino @@ -1,7 +1,7 @@ /* xns_74_lmt01.ino - Support for single wire LMT01 Temperature Sensor - Copyright (C) 2020 Theo Arends, Justifiably + Copyright (C) 2021 Theo Arends, Justifiably This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/xsns_75_prometheus.ino index b6afd3f70..0dac5ed9f 100644 --- a/tasmota/xsns_75_prometheus.ino +++ b/tasmota/xsns_75_prometheus.ino @@ -1,7 +1,7 @@ /* xsns_75_prometheus.ino - Web based information for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_76_dyp.ino b/tasmota/xsns_76_dyp.ino index adfaef5bc..0c4506502 100644 --- a/tasmota/xsns_76_dyp.ino +++ b/tasmota/xsns_76_dyp.ino @@ -1,7 +1,7 @@ /* xsns_76_dyp.ino - DYP ME007 serial interface - Copyright (C) 2020 Janusz Kostorz + Copyright (C) 2021 Janusz Kostorz This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_77_vl53l1x.ino b/tasmota/xsns_77_vl53l1x.ino index 23be88a69..f245fda86 100644 --- a/tasmota/xsns_77_vl53l1x.ino +++ b/tasmota/xsns_77_vl53l1x.ino @@ -1,7 +1,7 @@ /* xsns_77_vl53l1x.ino - VL53L1X sensor support for Tasmota - Copyright (C) 2020 Theo Arends, Rui Marinho and Johann Obermeier + Copyright (C) 2021 Theo Arends, Rui Marinho and Johann Obermeier This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezo.ino b/tasmota/xsns_78_ezo.ino index b8ba523ea..a33ad9cdc 100644 --- a/tasmota/xsns_78_ezo.ino +++ b/tasmota/xsns_78_ezo.ino @@ -1,7 +1,7 @@ /* xsns_78_ezo.ino - EZO modules base class - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezoco2.ino b/tasmota/xsns_78_ezoco2.ino index a7fe76cc8..8d038308a 100644 --- a/tasmota/xsns_78_ezoco2.ino +++ b/tasmota/xsns_78_ezoco2.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoco2.ino - EZO CO2 I2C CO2 sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezodo.ino b/tasmota/xsns_78_ezodo.ino index a0dd6a36f..8a22bceb3 100644 --- a/tasmota/xsns_78_ezodo.ino +++ b/tasmota/xsns_78_ezodo.ino @@ -1,7 +1,7 @@ /* xsns_78_ezodo.ino - EZO DO I2C DO sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZODO : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_DO "\":%d}" ), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_DO, name, str); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_ezoec.ino b/tasmota/xsns_78_ezoec.ino index 1566e2907..e134e4da1 100644 --- a/tasmota/xsns_78_ezoec.ino +++ b/tasmota/xsns_78_ezoec.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoec.ino - EZO EC I2C EC sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZOEC : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_EC "\":%s}" ), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_EC, name, str); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_ezoflo.ino b/tasmota/xsns_78_ezoflo.ino index 31cb7c082..9b30238b9 100644 --- a/tasmota/xsns_78_ezoflo.ino +++ b/tasmota/xsns_78_ezoflo.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoflo.ino - EZO FLO I2C FLO sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezohum.ino b/tasmota/xsns_78_ezohum.ino index a403eeb56..04a2ce74f 100644 --- a/tasmota/xsns_78_ezohum.ino +++ b/tasmota/xsns_78_ezohum.ino @@ -1,7 +1,7 @@ /* xsns_78_ezohum.ino - EZO HUM I2C HUM sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezoo2.ino b/tasmota/xsns_78_ezoo2.ino index bc98fe00c..cafdeb813 100644 --- a/tasmota/xsns_78_ezoo2.ino +++ b/tasmota/xsns_78_ezoo2.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoo2.ino - EZO O2 I2C O2 sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZOO2 : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_O2 "\":%d}" ), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_O2, name, str); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_ezoorp.ino b/tasmota/xsns_78_ezoorp.ino index d9faa999c..09db9983c 100644 --- a/tasmota/xsns_78_ezoorp.ino +++ b/tasmota/xsns_78_ezoorp.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoorp.ino - EZO ORP I2C ORP sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZOORP : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_ORP "\":%s}" ), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_ORP, name, str); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_ezoph.ino b/tasmota/xsns_78_ezoph.ino index 77939d97a..c4e6a7425 100644 --- a/tasmota/xsns_78_ezoph.ino +++ b/tasmota/xsns_78_ezoph.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoph.ino - EZO pH I2C pH sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZOPH : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_PH "\":%s}" ), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_PH, name, str); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_ezopmp.ino b/tasmota/xsns_78_ezopmp.ino index cea7a9cf0..225c3285f 100644 --- a/tasmota/xsns_78_ezopmp.ino +++ b/tasmota/xsns_78_ezopmp.ino @@ -1,7 +1,7 @@ /* xsns_78_ezopmp.ino - EZO PMP I2C PMP sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezoprs.ino b/tasmota/xsns_78_ezoprs.ino index 9ad34ab0d..f80eba82e 100644 --- a/tasmota/xsns_78_ezoprs.ino +++ b/tasmota/xsns_78_ezoprs.ino @@ -1,7 +1,7 @@ /* xsns_78_ezoprs.ino - EZO PRS I2C PRS sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -47,7 +47,7 @@ struct EZOPRS : public EZOStruct { } ResponseJsonEnd(); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_PRESSURE, name, str, PressureUnit().c_str()); if (Settings.altitude != 0) { diff --git a/tasmota/xsns_78_ezorgb.ino b/tasmota/xsns_78_ezorgb.ino index 5bbb49d79..2bbab0d24 100644 --- a/tasmota/xsns_78_ezorgb.ino +++ b/tasmota/xsns_78_ezorgb.ino @@ -1,7 +1,7 @@ /* xsns_78_ezorgb.ino - EZO RGB I2C RGB sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_78_ezortd.ino b/tasmota/xsns_78_ezortd.ino index 1d564d095..cf731a346 100644 --- a/tasmota/xsns_78_ezortd.ino +++ b/tasmota/xsns_78_ezortd.ino @@ -1,7 +1,7 @@ /* xsns_78_ezortd.ino - EZO RTD I2C RTD sensor support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -41,7 +41,7 @@ struct EZORTD : public EZOStruct { if (json) { ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_TEMPERATURE "\":%s}"), name, str); } -#ifdef USE_WEBSERVER +#ifdef USE_WEBSERVER else { WSContentSend_PD(HTTP_SNS_TEMP, name, str, TempUnit()); #endif // USE_WEBSERVER diff --git a/tasmota/xsns_78_xezo.ino b/tasmota/xsns_78_xezo.ino index 2774c7a0c..60b3cd8e4 100644 --- a/tasmota/xsns_78_xezo.ino +++ b/tasmota/xsns_78_xezo.ino @@ -1,7 +1,7 @@ /* xsns_78_xezo.ino - EZO family I2C driver support for Tasmota - Copyright (C) 2020 Christopher Tremblay + Copyright (C) 2021 Christopher Tremblay This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_79_as608.ino b/tasmota/xsns_79_as608.ino index f4e7d3939..7bff7736c 100644 --- a/tasmota/xsns_79_as608.ino +++ b/tasmota/xsns_79_as608.ino @@ -1,7 +1,7 @@ /* xsns_79_as608.ino - AS608 and R503 fingerprint sensor support for Tasmota - Copyright (C) 2020 boaschti and Theo Arends + Copyright (C) 2021 boaschti and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_80_mfrc522.ino b/tasmota/xsns_80_mfrc522.ino index b62c1140f..9a9b19e21 100644 --- a/tasmota/xsns_80_mfrc522.ino +++ b/tasmota/xsns_80_mfrc522.ino @@ -1,7 +1,7 @@ /* xsns_80_mfrc522.ino - Support for MFRC522 (SPI) NFC Tag Reader on Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xsns_interface.ino b/tasmota/xsns_interface.ino index fd05ccc57..21918f22c 100644 --- a/tasmota/xsns_interface.ino +++ b/tasmota/xsns_interface.ino @@ -1,7 +1,7 @@ /* xsns_interface.ino - Sensor interface support for Tasmota - Copyright (C) 2020 Theo Arends inspired by ESPEasy + Copyright (C) 2021 Theo Arends inspired by ESPEasy This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tasmota/xx2c_interface.ino b/tasmota/xx2c_interface.ino index 5732fbaf9..fcbc17677 100644 --- a/tasmota/xx2c_interface.ino +++ b/tasmota/xx2c_interface.ino @@ -1,7 +1,7 @@ /* xx2c_interface.ino - I2c interface support for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From fc93b0547625777bc3e115cb260d1df38b0821c3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 13:57:04 +0100 Subject: [PATCH 066/255] Happy New Year --- .../TasmotaSerial-3.1.0/src/TasmotaSerial.cpp | 2 +- .../TasmotaSerial-3.1.0/src/TasmotaSerial.h | 2 +- lib/default/UdpListener/src/UdpListener.h | 2 +- .../src/UnishoxStrings.cpp | 2 +- .../src/UnishoxStrings.h | 22 +++++++++---------- .../jsmn-shadinger-1.0/src/JsonGenerator.cpp | 2 +- .../jsmn-shadinger-1.0/src/JsonGenerator.h | 2 +- .../jsmn-shadinger-1.0/src/JsonParser.cpp | 2 +- .../jsmn-shadinger-1.0/src/JsonParser.h | 4 ++-- .../TasmotaModbus-1.2.0/src/TasmotaModbus.cpp | 2 +- .../TasmotaModbus-1.2.0/src/TasmotaModbus.h | 2 +- .../ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp | 2 +- .../ESP32-to-ESP8266-compat/src/ESP8266WiFi.h | 2 +- tools/decode-status.py | 2 +- tools/serial-plotter.py | 3 +-- tools/templates/templates.py | 2 +- 16 files changed, 27 insertions(+), 28 deletions(-) diff --git a/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.cpp index d7ac0866e..1d0445351 100644 --- a/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.cpp +++ b/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.cpp @@ -1,7 +1,7 @@ /* TasmotaSerial.cpp - Implementation of software serial with hardware serial fallback for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.h b/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.h index bc5161d65..2a97741e3 100644 --- a/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.h +++ b/lib/default/TasmotaSerial-3.1.0/src/TasmotaSerial.h @@ -1,7 +1,7 @@ /* TasmotaSerial.h - Implementation of software serial with hardware serial fallback for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/UdpListener/src/UdpListener.h b/lib/default/UdpListener/src/UdpListener.h index b4f5af93b..57bce0dae 100644 --- a/lib/default/UdpListener/src/UdpListener.h +++ b/lib/default/UdpListener/src/UdpListener.h @@ -1,7 +1,7 @@ /* UdpListener.h - webserver for Tasmota - Copyright (C) 2020 Theo Arends & Stephan Hadinger + Copyright (C) 2021 Theo Arends & Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.cpp b/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.cpp index 223399e2f..22b8cbcc3 100644 --- a/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.cpp +++ b/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.cpp @@ -1,7 +1,7 @@ /* UnishoxStrings.c - support library for compressed strings in Flash - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.h b/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.h index 12de778d4..3ded62ffe 100644 --- a/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.h +++ b/lib/default/Unishox-1.0-shadinger/src/UnishoxStrings.h @@ -1,7 +1,7 @@ /* UnishoxStrings.c - support library for compressed strings in Flash - Copyright (C) 2020 Theo Arends and Stephan Hadinger + Copyright (C) 2021 Theo Arends and Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,18 +28,18 @@ /*******************************************************************************************/ /* * UnishoxStrings compressed literal strings - * + * * To be typically used for web UI to have multiple strings like JS, CSS, HTML * compressed in a single list of small strings. This is where Unishox shines. - * + * * Strings before compression are separated with NULL chars, which makes them ready to use * once you know the offset in the global array. - * + * * The list of string is marked by an empty stings, i.e. two consecutive NULL chars - * + * * To distinguish from uncompressed templates, and to indicate the global size * the compressed array is prefixed with NULL and the uncompressed size * 16 bytes. - * + * * Compressed format: * - Byte 00 : \00 - if non-null, then it is not compressed * - Byte 01 : - uncompressed size is * 16 bytes (always rounded up) @@ -54,22 +54,22 @@ * This class is initialzed with either a PMEM uncompressed list of strings * or a PMEM unishox-compressed list of strings; in this case RAM is allocated * to hold the uncompressed data, until the class gets out of scope. - * + * * To encode, use https://tasmota.hadinger.fr/util * and use the "Compress strings template with unishox" * past the C code for the strings, and copy/paste the result * (don't foget to rename the variable). - * + * * Input: * Each string must be terminated with an explicit NULL char "\0". The list is hence * terminated with a double-NULL. - * + * * Each string is then indexed as its byte offset in the whole template. * The offsets are computed at the same time as the compressed version. * You need to use the online compressor even if you don't use the comrpessed version. - * + * * Indexes are marked as C++ comments starting with "//=" - * + * * Example input: * con * // start of strings diff --git a/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.cpp b/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.cpp index 0bdd77768..b823c58d9 100644 --- a/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.cpp +++ b/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.cpp @@ -1,7 +1,7 @@ /* JsonGenerator.cpp - lightweight JSON parser - Copyright (C) 2020 Stephan Hadinger + Copyright (C) 2021 Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.h b/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.h index 589c60167..2f27b846b 100644 --- a/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.h +++ b/lib/default/jsmn-shadinger-1.0/src/JsonGenerator.h @@ -1,7 +1,7 @@ /* JsonGenerator.h - lightweight JSON generator - Copyright (C) 2020 Stephan Hadinger + Copyright (C) 2021 Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/jsmn-shadinger-1.0/src/JsonParser.cpp b/lib/default/jsmn-shadinger-1.0/src/JsonParser.cpp index 050505d07..73703d6ed 100644 --- a/lib/default/jsmn-shadinger-1.0/src/JsonParser.cpp +++ b/lib/default/jsmn-shadinger-1.0/src/JsonParser.cpp @@ -1,7 +1,7 @@ /* JsonParser.cpp - lightweight JSON parser - Copyright (C) 2020 Stephan Hadinger + Copyright (C) 2021 Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/default/jsmn-shadinger-1.0/src/JsonParser.h b/lib/default/jsmn-shadinger-1.0/src/JsonParser.h index 85d401407..a31f28c91 100644 --- a/lib/default/jsmn-shadinger-1.0/src/JsonParser.h +++ b/lib/default/jsmn-shadinger-1.0/src/JsonParser.h @@ -1,7 +1,7 @@ /* JsonParser.h - lightweight JSON parser - Copyright (C) 2020 Stephan Hadinger + Copyright (C) 2021 Stephan Hadinger This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -228,7 +228,7 @@ public: // destructor ~JsonParser(); - + // set the current buffer for attribute access (i.e. set the global) void setCurrent(void) { k_current_json_buffer = _json; } diff --git a/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp b/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp index 057001779..b1a8c48f8 100644 --- a/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp +++ b/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.cpp @@ -1,7 +1,7 @@ /* TasmotaModbus.cpp - Basic modbus wrapper for TasmotaSerial for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.h b/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.h index 4a5fbc7a8..22d4e12f3 100644 --- a/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.h +++ b/lib/lib_basic/TasmotaModbus-1.2.0/src/TasmotaModbus.h @@ -1,7 +1,7 @@ /* TasmotaModbus.h - Basic modbus wrapper for TasmotaSerial for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This library is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp index a72d95cb6..0e26883ba 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp @@ -1,7 +1,7 @@ /* WiFi compat with ESP32 - Copyright (C) 2020 Theo Arends / Jörg Schüler-Maroldt + Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h index df9f54273..9649f49f5 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h @@ -1,7 +1,7 @@ /* WiFi compat with ESP32 - Copyright (C) 2020 Theo Arends / Jörg Schüler-Maroldt + Copyright (C) 2021 Theo Arends / Jörg Schüler-Maroldt This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tools/decode-status.py b/tools/decode-status.py index 678cf5a73..aa2bfc4e1 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -3,7 +3,7 @@ """ decode-status.py - decode status for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/tools/serial-plotter.py b/tools/serial-plotter.py index 83ec6dba6..2e08e2c62 100644 --- a/tools/serial-plotter.py +++ b/tools/serial-plotter.py @@ -3,7 +3,7 @@ """ serial-plotter.py - for Tasmota - Copyright (C) 2020 Christian Baars + Copyright (C) 2021 Christian Baars This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -189,4 +189,3 @@ text_box.on_submit(submit) if ser.is_open==True: plt.show() - \ No newline at end of file diff --git a/tools/templates/templates.py b/tools/templates/templates.py index 5387ceaaa..5a6cea513 100644 --- a/tools/templates/templates.py +++ b/tools/templates/templates.py @@ -3,7 +3,7 @@ """ templates.py - template beautify TEMPLATES.md for Tasmota - Copyright (C) 2020 Theo Arends + Copyright (C) 2021 Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From 54c1a2d029ae8147acbb5498680264fa3658e85d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 15:05:58 +0100 Subject: [PATCH 067/255] Add support for SPI display driver for ST7789 TFT Add support for SPI display driver for ST7789 TFT by Gerhard Mutz (#9037) --- BUILDS.md | 7 ++++--- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/my_user_config.h | 3 ++- tasmota/support.ino | 7 +++---- tasmota/support_features.ino | 23 ++++++++++++++++------- tasmota/support_tasmota.ino | 31 ++++++++++++++++--------------- tasmota/tasmota_configurations.h | 7 ++++--- tasmota/xdsp_12_ST7789.ino | 11 ++++++++--- tools/decode-status.py | 4 ++-- 10 files changed, 57 insertions(+), 38 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index 5eb73cc99..34d386c62 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -201,9 +201,10 @@ | USE_DISPLAY_ILI9341 | - | - | - | - | - | - | x | | USE_DISPLAY_EPAPER_29 | - | - | - | - | - | - | x | | USE_DISPLAY_EPAPER_42 | - | - | - | - | - | - | x | -| USE_DISPLAY_ILI9488 | - | - | - | - | - | - | - | -| USE_DISPLAY_SSD1351 | - | - | - | - | - | - | - | -| USE_DISPLAY_RA8876 | - | - | - | - | - | - | - | +| USE_DISPLAY_ILI9488 | - | - | - | - | - | - | x | +| USE_DISPLAY_SSD1351 | - | - | - | - | - | - | x | +| USE_DISPLAY_RA8876 | - | - | - | - | - | - | x | +| USE_DISPLAY_ST7789 | - | - | - | - | - | - | x | ## Additional Features and Sensors on ESP32 diff --git a/CHANGELOG.md b/CHANGELOG.md index 3f1a34e5b..f2844aa8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ All notable changes to this project will be documented in this file. - Support for Afrikaans language translations by Christiaan Heerze - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` (#10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` (#10301) +- Support for SPI display driver for ST7789 TFT by Gerhard Mutz (#9037) ### Changed - Logging from heap to stack freeing 700 bytes RAM diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 83cfe63c7..539323f9d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -70,6 +70,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for Afrikaans language translations by Christiaan Heerze - Support for IR inverted leds using ``#define IR_SEND_INVERTED true`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) +- Support for SPI display driver for ST7789 TFT by Gerhard Mutz [#9037](https://github.com/arendst/Tasmota/issues/9037) - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630) ### Breaking Changed diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 59cef587c..63db85b25 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -626,8 +626,9 @@ // #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code) // #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display // #define USE_DISPLAY_ILI9488 // [DisplayModel 8] [I2cDriver38] (Touch) -// #define USE_DISPLAY_SSD1351 // [DisplayModel 9] +// #define USE_DISPLAY_SSD1351 // [DisplayModel 9] Enable SSD1351 module // #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch) +// #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module // #define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code) // #define USE_RC522_DATA_FUNCTION // Add support for reading data block content (+0k4 code) // #define USE_RC522_TYPE_INFORMATION // Add support for showing card type (+0k4 code) diff --git a/tasmota/support.ino b/tasmota/support.ino index 3d8634e3e..e9b6fe204 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1503,12 +1503,11 @@ bool ValidGPIO(uint32_t pin, uint32_t gpio) { return (GPIO_USER == ValidPin(pin, BGPIO(gpio))); // Only allow GPIO_USER pins } -bool ValidSpiGPIO(uint32_t gpio) { +bool ValidSpiPinUsed(uint32_t gpio) { // ESP8266: If SPI pin selected chk if it's not one of the three Hardware SPI pins (12..14) - bool result = true; // Not used and therefore valid - uint32_t pin; + bool result = false; if (PinUsed(gpio)) { - pin = Pin(gpio); + uint32_t pin = Pin(gpio); result = ((pin < 12) || (pin > 14)); } return result; diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 29ef7a15c..d86544aac 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -162,7 +162,7 @@ void ResponseAppendFeatures(void) feature2 |= 0x00000800; // xdsp_05_epaper.ino #endif #if defined(USE_I2C) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SH1106) - feature2 |= 0x00001000; // xdsp_06_sh1106.ino + feature2 |= 0x00001000; // xdsp_07_sh1106.ino #endif #ifdef USE_MP3_PLAYER feature2 |= 0x00002000; // xdrv_14_mp3.ino @@ -671,12 +671,21 @@ void ResponseAppendFeatures(void) #ifdef USE_FTC532 feature7 |= 0x00004000; // xdrv_47_ftc532.ino #endif -// feature7 |= 0x00008000; - -// feature7 |= 0x00010000; -// feature7 |= 0x00020000; -// feature7 |= 0x00040000; -// feature7 |= 0x00080000; +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_EPAPER_42) + feature7 |= 0x00008000; // xdsp_06_epaper_42.ino +#endif +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_ILI9488) + feature7 |= 0x00010000; // xdsp_08_ILI9488.ino +#endif +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SSD1351) + feature7 |= 0x00020000; // xdsp_09_SSD1351.ino +#endif +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_RA8876) + feature7 |= 0x00040000; // xdsp_10_RA8876.ino +#endif +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_ST7789) + feature7 |= 0x00080000; // xdsp_12_ST7789.ino +#endif // feature7 |= 0x00100000; // feature7 |= 0x00200000; diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index dedb28f6d..c76896f73 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1604,23 +1604,23 @@ void GpioInit(void) #ifdef USE_SPI #ifdef ESP8266 if (!TasmotaGlobal.soft_spi_enabled) { - bool valid_cs = (ValidSpiGPIO(GPIO_SPI_CS) && - ValidSpiGPIO(GPIO_RC522_CS) && - ValidSpiGPIO(GPIO_NRF24_CS) && - ValidSpiGPIO(GPIO_ILI9341_CS) && - ValidSpiGPIO(GPIO_EPAPER29_CS) && - ValidSpiGPIO(GPIO_EPAPER42_CS) && - ValidSpiGPIO(GPIO_ILI9488_CS) && - ValidSpiGPIO(GPIO_SSD1351_CS) && - ValidSpiGPIO(GPIO_RA8876_CS) && - ValidSpiGPIO(GPIO_ST7789_CS) + bool valid_cs = (ValidSpiPinUsed(GPIO_SPI_CS) || + ValidSpiPinUsed(GPIO_RC522_CS) || + ValidSpiPinUsed(GPIO_NRF24_CS) || + ValidSpiPinUsed(GPIO_ILI9341_CS) || + ValidSpiPinUsed(GPIO_EPAPER29_CS) || + ValidSpiPinUsed(GPIO_EPAPER42_CS) || + ValidSpiPinUsed(GPIO_ILI9488_CS) || + ValidSpiPinUsed(GPIO_SSD1351_CS) || + ValidSpiPinUsed(GPIO_RA8876_CS) || + ValidSpiPinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too + ValidSpiPinUsed(GPIO_ST7789_CS) ); - bool valid_dc = (ValidSpiGPIO(GPIO_SPI_DC) && - ValidSpiGPIO(GPIO_NRF24_DC) && - ValidSpiGPIO(GPIO_ILI9341_DC) && - ValidSpiGPIO(GPIO_ST7789_DC) + bool valid_dc = (ValidSpiPinUsed(GPIO_SPI_DC) || + ValidSpiPinUsed(GPIO_NRF24_DC) || + ValidSpiPinUsed(GPIO_ILI9341_DC) || + ValidSpiPinUsed(GPIO_ST7789_DC) ); - // If SPI_CS and/or SPI_DC is used they must be valid TasmotaGlobal.spi_enabled = (valid_cs && valid_dc) ? SPI_MOSI_MISO : SPI_NONE; if (TasmotaGlobal.spi_enabled) { @@ -1643,6 +1643,7 @@ void GpioInit(void) PinUsed(GPIO_ILI9488_CS) || PinUsed(GPIO_SSD1351_CS) || PinUsed(GPIO_RA8876_CS) || + PinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too PinUsed(GPIO_ST7789_CS) ) { uint32_t spi_mosi = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MOSI)) ? SPI_MOSI : SPI_NONE; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 9a4e26e4d..86078c8ab 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -306,9 +306,10 @@ #define USE_DISPLAY_ILI9341 // [DisplayModel 4] Enable ILI9341 Tft 480x320 display (+19k code) #define USE_DISPLAY_EPAPER_29 // [DisplayModel 5] Enable e-paper 2.9 inch display (+19k code) #define USE_DISPLAY_EPAPER_42 // [DisplayModel 6] Enable e-paper 4.2 inch display -// #define USE_DISPLAY_ILI9488 // [DisplayModel 8] -// #define USE_DISPLAY_SSD1351 // [DisplayModel 9] -// #define USE_DISPLAY_RA8876 // [DisplayModel 10] + #define USE_DISPLAY_ILI9488 // [DisplayModel 8] + #define USE_DISPLAY_SSD1351 // [DisplayModel 9] + #define USE_DISPLAY_RA8876 // [DisplayModel 10] + #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index 141080da1..624fd535c 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -58,7 +58,7 @@ bool st7789_init_done = false; /*********************************************************************************************/ void ST7789_InitDriver(void) { - if (PinUsed(GPIO_ST7789_CS) && PinUsed(GPIO_ST7789_DC) && + if (PinUsed(GPIO_ST7789_DC) && // This device does not need CS which breaks SPI bus usage ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { Settings.display_model = XDSP_12; @@ -87,12 +87,17 @@ void ST7789_InitDriver(void) { reset = Pin(GPIO_OLED_RESET); } + int8_t cs = -1; + if (PinUsed(GPIO_ST7789_CS)) { + reset = Pin(GPIO_ST7789_CS); + } + // init renderer, may use hardware spi if (TasmotaGlobal.soft_spi_enabled) { - st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK), Pin(GPIO_ST7789_CS), bppin); + st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK), cs, bppin); } else if (TasmotaGlobal.spi_enabled) { - st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, Pin(GPIO_ST7789_CS), bppin); + st7789 = new Arduino_ST7789(Pin(GPIO_ST7789_DC), reset, cs, bppin); } st7789->init(Settings.display_width,Settings.display_height); diff --git a/tools/decode-status.py b/tools/decode-status.py index aa2bfc4e1..c4c4309c0 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -239,8 +239,8 @@ a_features = [[ "USE_EZOORP","USE_EZORTD","USE_EZOHUM","USE_EZOEC", "USE_EZOCO2","USE_EZOO2","USE_EZOPRS","USE_EZOFLO", "USE_EZODO","USE_EZORGB","USE_EZOPMP","USE_AS608", - "USE_SHELLY_DIMMER","USE_RC522","USE_FTC532","", - "","","","", + "USE_SHELLY_DIMMER","USE_RC522","USE_FTC532","USE_DISPLAY_EPAPER_42", + "USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789", "","","","", "","","","", "","","","" From 46d7e9392e0cec81de9f6bec46433b390a3ef54a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 15:54:47 +0100 Subject: [PATCH 068/255] Fix ST7789 --- tasmota/xdsp_12_ST7789.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index 624fd535c..cdb9ad167 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -89,7 +89,7 @@ void ST7789_InitDriver(void) { int8_t cs = -1; if (PinUsed(GPIO_ST7789_CS)) { - reset = Pin(GPIO_ST7789_CS); + cs = Pin(GPIO_ST7789_CS); } // init renderer, may use hardware spi From ee1648d3e09b42febb0206203d6e0fb8d0c699e3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 16:05:06 +0100 Subject: [PATCH 069/255] Prep SSD1331 driver --- tasmota/language/af_AF.h | 2 ++ tasmota/language/bg_BG.h | 2 ++ tasmota/language/cs_CZ.h | 2 ++ tasmota/language/de_DE.h | 2 ++ tasmota/language/el_GR.h | 2 ++ tasmota/language/en_GB.h | 2 ++ tasmota/language/es_ES.h | 2 ++ tasmota/language/fr_FR.h | 2 ++ tasmota/language/he_HE.h | 2 ++ tasmota/language/hu_HU.h | 2 ++ tasmota/language/it_IT.h | 2 ++ tasmota/language/ko_KO.h | 2 ++ tasmota/language/nl_NL.h | 2 ++ tasmota/language/pl_PL.h | 2 ++ tasmota/language/pt_BR.h | 2 ++ tasmota/language/pt_PT.h | 2 ++ tasmota/language/ro_RO.h | 2 ++ tasmota/language/ru_RU.h | 2 ++ tasmota/language/sk_SK.h | 2 ++ tasmota/language/sv_SE.h | 2 ++ tasmota/language/tr_TR.h | 2 ++ tasmota/language/uk_UA.h | 2 ++ tasmota/language/vi_VN.h | 2 ++ tasmota/language/zh_CN.h | 2 ++ tasmota/language/zh_TW.h | 2 ++ tasmota/my_user_config.h | 1 + tasmota/support_features.ino | 5 ++-- tasmota/support_tasmota.ino | 9 ++++-- tasmota/tasmota_configurations.h | 1 + tasmota/tasmota_template.h | 8 ++++- tasmota/xdsp_09_SSD1351.ino | 15 ++++------ tasmota/xdsp_14_SSD1331.ino | 50 +++++++++++++++++--------------- tools/decode-status.py | 2 +- 33 files changed, 102 insertions(+), 39 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index bfd4177e3..4eab30241 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f8e3c705c..e9003a386 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -775,6 +775,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 983524bbf..159d00878 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index f1bad46a7..cdbc1f994 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 5820512d6..8e2e3f093 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 77a325d30..2d6a47f43 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index e04f2b256..31640385e 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 65c14a58d..7bb645751 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -772,6 +772,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 6e9a6ef8e..ab7ff6d77 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 82fe0b4a4..e2d335ce6 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 91ae9a830..9aa08db46 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 - CS" #define D_SENSOR_ST7789_CS "ST7789 - CS" #define D_SENSOR_ST7789_DC "ST7789 - DC" +#define D_SENSOR_SSD1331_CS "SSD1331 - CS" +#define D_SENSOR_SSD1331_DC "SSD1331 - DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 6ab2f1421..0d9f91af4 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 682fbec90..8087a8770 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index f5497d91d..5919b35b5 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 99d38f192..8069a265f 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 5e7c74f36..af9ee37a0 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index bb1a09185..bf23a7c8d 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index df1d5b50e..965f5f5d7 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 8f5490a19..20a691be6 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 6935fa102..18822f2b8 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 01b73bc75..f307a9e73 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 11fbdac99..2626572ae 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index cc666ec82..d8d9d5124 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 2e6baa64d..1895fc690 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 2a2078266..2f2ec544e 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -776,6 +776,8 @@ #define D_SENSOR_RA8876_CS "RA8876 CS" #define D_SENSOR_ST7789_CS "ST7789 CS" #define D_SENSOR_ST7789_DC "ST7789 DC" +#define D_SENSOR_SSD1331_CS "SSD1331 CS" +#define D_SENSOR_SSD1331_DC "SSD1331 DC" // Units #define D_UNIT_AMPERE "安培" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 63db85b25..fb9c30774 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -629,6 +629,7 @@ // #define USE_DISPLAY_SSD1351 // [DisplayModel 9] Enable SSD1351 module // #define USE_DISPLAY_RA8876 // [DisplayModel 10] [I2cDriver39] (Touch) // #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module +// #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module // #define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code) // #define USE_RC522_DATA_FUNCTION // Add support for reading data block content (+0k4 code) // #define USE_RC522_TYPE_INFORMATION // Add support for showing card type (+0k4 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index d86544aac..1def3db1c 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -686,8 +686,9 @@ void ResponseAppendFeatures(void) #if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_ST7789) feature7 |= 0x00080000; // xdsp_12_ST7789.ino #endif - -// feature7 |= 0x00100000; +#if defined(USE_SPI) && defined(USE_DISPLAY) && defined(USE_DISPLAY_SSD1331) + feature7 |= 0x00100000; // xdsp_14_SSD1331.ino +#endif // feature7 |= 0x00200000; // feature7 |= 0x00400000; // feature7 |= 0x00800000; diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index c76896f73..84bc2dd53 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1614,12 +1614,14 @@ void GpioInit(void) ValidSpiPinUsed(GPIO_SSD1351_CS) || ValidSpiPinUsed(GPIO_RA8876_CS) || ValidSpiPinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too - ValidSpiPinUsed(GPIO_ST7789_CS) + ValidSpiPinUsed(GPIO_ST7789_CS) || + ValidSpiPinUsed(GPIO_SSD1331_CS) ); bool valid_dc = (ValidSpiPinUsed(GPIO_SPI_DC) || ValidSpiPinUsed(GPIO_NRF24_DC) || ValidSpiPinUsed(GPIO_ILI9341_DC) || - ValidSpiPinUsed(GPIO_ST7789_DC) + ValidSpiPinUsed(GPIO_ST7789_DC) || + ValidSpiPinUsed(GPIO_SSD1331_DC) ); // If SPI_CS and/or SPI_DC is used they must be valid TasmotaGlobal.spi_enabled = (valid_cs && valid_dc) ? SPI_MOSI_MISO : SPI_NONE; @@ -1644,7 +1646,8 @@ void GpioInit(void) PinUsed(GPIO_SSD1351_CS) || PinUsed(GPIO_RA8876_CS) || PinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too - PinUsed(GPIO_ST7789_CS) + PinUsed(GPIO_ST7789_CS) || + PinUsed(GPIO_SSD1331_CS) ) { uint32_t spi_mosi = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MOSI)) ? SPI_MOSI : SPI_NONE; uint32_t spi_miso = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MISO)) ? SPI_MISO : SPI_NONE; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 86078c8ab..142045bab 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -310,6 +310,7 @@ #define USE_DISPLAY_SSD1351 // [DisplayModel 9] #define USE_DISPLAY_RA8876 // [DisplayModel 10] #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module +// #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 714ca0f77..874f5ab2f 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -141,6 +141,7 @@ enum UserSelectablePins { GPIO_SSD1351_CS, GPIO_RA8876_CS, GPIO_ST7789_CS, GPIO_ST7789_DC, + GPIO_SSD1331_CS, GPIO_SSD1331_DC, GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -302,6 +303,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SSD1351_CS "|" D_SENSOR_RA8876_CS "|" D_SENSOR_ST7789_CS "|" D_SENSOR_ST7789_DC "|" + D_SENSOR_SSD1331_CS "|" D_SENSOR_SSD1331_DC "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -403,7 +405,11 @@ const uint16_t kGpioNiceList[] PROGMEM = { #ifdef USE_DISPLAY_ST7789 AGPIO(GPIO_ST7789_CS), AGPIO(GPIO_ST7789_DC), -#endif //f USE_DISPLAY_ST7789 +#endif // USE_DISPLAY_ST7789 +#ifdef USE_DISPLAY_SSD1331 + AGPIO(GPIO_SSD1331_CS), + AGPIO(GPIO_SSD1331_DC), +#endif // USE_DISPLAY_SSD1331 AGPIO(GPIO_BACKLIGHT), // Display backlight control AGPIO(GPIO_OLED_RESET), // OLED Display Reset #endif diff --git a/tasmota/xdsp_09_SSD1351.ino b/tasmota/xdsp_09_SSD1351.ino index b0318b0ed..f3ad53b29 100644 --- a/tasmota/xdsp_09_SSD1351.ino +++ b/tasmota/xdsp_09_SSD1351.ino @@ -90,8 +90,7 @@ void SSD1351_InitDriver() { #ifdef USE_DISPLAY_MODES1TO5 -void SSD1351PrintLog(void) -{ +void SSD1351PrintLog(void) { disp_refresh--; if (!disp_refresh) { disp_refresh = Settings.display_refresh; @@ -119,8 +118,7 @@ void SSD1351PrintLog(void) } } -void SSD1351Time(void) -{ +void SSD1351Time(void) { char line[12]; renderer->clearDisplay(); @@ -133,8 +131,7 @@ void SSD1351Time(void) renderer->Updateframe(); } -void SSD1351Refresh(void) // Every second -{ +void SSD1351Refresh(void) { // Every second if (Settings.display_mode) { // Mode 0 is User text switch (Settings.display_mode) { case 1: // Time @@ -151,12 +148,12 @@ void SSD1351Refresh(void) // Every second } #endif // USE_DISPLAY_MODES1TO5 -/*********************************************************************************************/ + /*********************************************************************************************\ * Interface \*********************************************************************************************/ -bool Xdsp09(uint8_t function) -{ + +bool Xdsp09(uint8_t function) { bool result = false; if (FUNC_DISPLAY_INIT_DRIVER == function) { diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index cae0c9aa2..be5417426 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -1,7 +1,7 @@ /* xdsp_14_SSD1331.ino - Display SSD1331 support for Tasmota - Copyright (C) 2020 Jeroen Vermeulen, Gerhard Mutz and Theo Arends + Copyright (C) 2021 Jeroen Vermeulen, Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,6 +35,7 @@ #include #include +bool ssd1331_init_done = false; extern uint8_t *buffer; extern uint8_t color_type; Adafruit_SSD1331 *ssd1331; @@ -42,11 +43,10 @@ Adafruit_SSD1331 *ssd1331; /*********************************************************************************************/ void SSD1331_InitDriver() { - if (!Settings.display_model) { - Settings.display_model = XDSP_14; - } + if (PinUsed(GPIO_SSD1331_CS) && PinUsed(GPIO_SSD1331_DC) && + ((TasmotaGlobal.soft_spi_enabled & SPI_MOSI) || (TasmotaGlobal.spi_enabled & SPI_MOSI))) { - if (XDSP_14 == Settings.display_model) { + Settings.display_model = XDSP_14; if (Settings.display_width != Adafruit_SSD1331::TFTWIDTH) { Settings.display_width = Adafruit_SSD1331::TFTWIDTH; @@ -55,26 +55,30 @@ void SSD1331_InitDriver() { Settings.display_height = Adafruit_SSD1331::TFTHEIGHT; } - buffer=0; + buffer = 0; // default colors fg_color = SSD1331_WHITE; bg_color = SSD1331_BLACK; + int8_t reset = -1; + if (PinUsed(GPIO_OLED_RESET)) { + reset = Pin(GPIO_OLED_RESET); + } + // init renderer - if (PinUsed(GPIO_SSPI_CS) && PinUsed(GPIO_SSPI_DC) && PinUsed(GPIO_SSPI_MOSI) && PinUsed(GPIO_SSPI_SCLK) && PinUsed(GPIO_OLED_RESET)) { - ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSPI_CS),Pin(GPIO_SSPI_DC),Pin(GPIO_SSPI_MOSI),Pin(GPIO_SSPI_SCLK),Pin(GPIO_OLED_RESET)); - } else if (PinUsed(GPIO_SPI_CS) && PinUsed(GPIO_SPI_DC)) { - ssd1331 = new Adafruit_SSD1331(&SPI,Pin(GPIO_SPI_CS),Pin(GPIO_SPI_DC),Pin(GPIO_OLED_RESET)); - } else { - return; + if (TasmotaGlobal.soft_spi_enabled) { + ssd1331 = new Adafruit_SSD1331(Pin(GPIO_SSD1331_CS), Pin(GPIO_SSD1331_DC), Pin(GPIO_SSPI_MOSI), Pin(GPIO_SSPI_SCLK), reset); + } + else if (TasmotaGlobal.spi_enabled) { + ssd1331 = new Adafruit_SSD1331(&SPI, Pin(GPIO_SSD1331_CS), Pin(GPIO_SSD1331_DC), reset); } delay(100); ssd1331->begin(); renderer = ssd1331; // Rotation is currently broken, https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/issues/26 - renderer->DisplayInit(DISPLAY_INIT_MODE,Settings.display_size,Settings.display_rotate,Settings.display_font); + renderer->DisplayInit(DISPLAY_INIT_MODE, Settings.display_size, Settings.display_rotate, Settings.display_font); renderer->dim(Settings.display_dimmer); #ifdef SHOW_SPLASH @@ -86,13 +90,15 @@ void SSD1331_InitDriver() { #endif color_type = COLOR_COLOR; + + ssd1331_init_done = true; + AddLog_P(LOG_LEVEL_INFO, PSTR("DSP: SSD1331")); } } #ifdef USE_DISPLAY_MODES1TO5 -void SSD1331PrintLog(bool withDateTime) -{ +void SSD1331PrintLog(bool withDateTime) { disp_refresh--; if (!disp_refresh) { disp_refresh = Settings.display_refresh; @@ -129,8 +135,7 @@ void SSD1331PrintLog(bool withDateTime) } } -void SSD1331Time(void) -{ +void SSD1331Time(void) { char line[12]; renderer->clearDisplay(); @@ -142,8 +147,7 @@ void SSD1331Time(void) renderer->Updateframe(); } -void SSD1331Refresh(void) // Every second -{ +void SSD1331Refresh(void) { // Every second if (Settings.display_mode) { // Mode 0 is User text switch (Settings.display_mode) { case 1: // Time @@ -162,18 +166,18 @@ void SSD1331Refresh(void) // Every second } #endif // USE_DISPLAY_MODES1TO5 -/*********************************************************************************************/ + /*********************************************************************************************\ * Interface \*********************************************************************************************/ -bool Xdsp14(uint8_t function) -{ + +bool Xdsp14(uint8_t function) { bool result = false; if (FUNC_DISPLAY_INIT_DRIVER == function) { SSD1331_InitDriver(); } - else if (XDSP_14 == Settings.display_model) { + else if (ssd1331_init_done && (XDSP_14 == Settings.display_model)) { switch (function) { case FUNC_DISPLAY_MODEL: result = true; diff --git a/tools/decode-status.py b/tools/decode-status.py index c4c4309c0..ba5ead287 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -241,7 +241,7 @@ a_features = [[ "USE_EZODO","USE_EZORGB","USE_EZOPMP","USE_AS608", "USE_SHELLY_DIMMER","USE_RC522","USE_FTC532","USE_DISPLAY_EPAPER_42", "USE_DISPLAY_ILI9488","USE_DISPLAY_SSD1351","USE_DISPLAY_RA8876","USE_DISPLAY_ST7789", - "","","","", + "USE_DISPLAY_SSD1331","","","", "","","","", "","","","" ]] From 84334bc015dcfa84906783b35b5fe82d4a6006e9 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Fri, 1 Jan 2021 16:48:52 +0100 Subject: [PATCH 070/255] Update xdrv_98_filesystem.ino --- tasmota/xdrv_98_filesystem.ino | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 379d81931..932185c0c 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -22,7 +22,7 @@ this driver adds universal file system support for ESP8266 (sd card or littlfs on > 1 M devices with special linker file e.g. eagle.flash.4m2m.ld) (makes no sense on 1M devices without sd card) and -ESP32 (sd card or fatfile system) +ESP32 (sd card or little fs or sfatfile system) the sd card chip select is the standard SPI_CS or when not found SDCARD_CS_PIN initializes the FS System Pointer ufsp which can be used by all standard file system calls the only specific call is ufs_fsinfo() which gets the total size (0) and free size (1) @@ -76,7 +76,7 @@ File ufs_upload_file; #define SDCARD_CS_PIN 4 #endif -// 0 = none, 1 = SD, 2 = Flash +// 0 = none, 1 = SD, 2 = ffat, 3 = littlefs // spiffs should be obsolete uint8_t ufs_type; #define UFS_TNONE 0 @@ -94,10 +94,8 @@ void UFSInit(void) { #ifdef USE_SDCARD // if (TasmotaGlobal.spi_enabled) { if (1) { - int8_t cs; - if (!PinUsed(GPIO_SPI_CS)) { - cs = SDCARD_CS_PIN; - } else { + int8_t cs = SDCARD_CS_PIN; + if (PinUsed(GPIO_SPI_CS)) { cs = Pin(GPIO_SPI_CS); } @@ -138,6 +136,9 @@ void UFSInit(void) { uint32_t ufs_fsinfo(uint32_t sel) { uint32_t result = 0; +#ifdef ESP8266 +FSInfo64 fsinfo; +#endif switch (ufs_type) { case UFS_TSDC: @@ -149,14 +150,18 @@ uint32_t result = 0; result = (SD.totalBytes() - SD.usedBytes()); } #else - // currently no size support on esp8266 sdcard + ufsp->info64(fsinfo); + if (sel == 0) { + result = fsinfo.totalBytes; + } else { + result = (fsinfo.totalBytes - fsinfo.usedBytes); + } #endif #endif //USE_SDCARD break; case UFS_TLFS: #ifdef ESP8266 - FSInfo64 fsinfo; ufsp->info64(fsinfo); if (sel == 0) { result = fsinfo.totalBytes; From 628f17de8c91bade92edefe3b1b4d544e644710d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 17:04:36 +0100 Subject: [PATCH 071/255] Add TasAutoMutex --- tasmota/support.ino | 76 ++++++++++++++++++--------------------- tasmota/support_esp32.ino | 3 +- tasmota/tasmota.ino | 2 +- 3 files changed, 38 insertions(+), 43 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index a504b077d..7dd03d978 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -111,7 +111,7 @@ String GetResetReason(void) } } - +#ifdef ESP32 /*********************************************************************************************\ * ESP32 AutoMutex \*********************************************************************************************/ @@ -128,9 +128,7 @@ String GetResetReason(void) // - the same thread can take multiple times (recursive). // - advanced options m.give() and m.take() allow you fine control within a function. class TasAutoMutex { -#ifdef ESP32 SemaphoreHandle_t mutex; -#endif bool taken; public: TasAutoMutex(void * mutex, bool take=true); @@ -141,63 +139,53 @@ class TasAutoMutex { }; ////////////////////////////////////////// -TasAutoMutex::TasAutoMutex(void * mutex, bool take){ -#ifdef ESP32 - if(mutex){ - if (take){ +TasAutoMutex::TasAutoMutex(void * mutex, bool take) { + if (mutex) { + if (take) { xSemaphoreTakeRecursive(mutex, portMAX_DELAY); this->taken = true; } - this->mutex = (SemaphoreHandle_t ) mutex; + this->mutex = (SemaphoreHandle_t)mutex; } else { - this->mutex = (SemaphoreHandle_t )nullptr; + this->mutex = (SemaphoreHandle_t)nullptr; } -#endif } -TasAutoMutex::~TasAutoMutex(){ -#ifdef ESP32 - if (this->mutex){ - if (this->taken){ +TasAutoMutex::~TasAutoMutex() { + if (this->mutex) { + if (this->taken) { xSemaphoreGiveRecursive(this->mutex); this->taken = false; } } -#endif } -void TasAutoMutex::init(void ** ptr){ -#ifdef ESP32 +void TasAutoMutex::init(void ** ptr) { SemaphoreHandle_t mutex = xSemaphoreCreateRecursiveMutex(); (*ptr) = (void *) mutex; -#else - // needed, else we will initialis more than once in logging - (*ptr) = (void *) 1; -#endif + // needed, else for ESP8266 as we will initialis more than once in logging +// (*ptr) = (void *) 1; } -void TasAutoMutex::give(){ -#ifdef ESP32 - if (this->mutex){ - if (this->taken){ +void TasAutoMutex::give() { + if (this->mutex) { + if (this->taken) { xSemaphoreGiveRecursive(this->mutex); this->taken= false; } } -#endif } -void TasAutoMutex::take(){ -#ifdef ESP32 - if (this->mutex){ - if (!this->taken){ + +void TasAutoMutex::take() { + if (this->mutex) { + if (!this->taken) { xSemaphoreTakeRecursive(this->mutex, portMAX_DELAY); this->taken = true; } } -#endif } - +#endif // ESP32 /*********************************************************************************************\ * Miscellaneous @@ -2054,9 +2042,12 @@ void SyslogAsync(bool refresh) { } bool NeedLogRefresh(uint32_t req_loglevel, uint32_t index) { - // this takes the mutex, and will be release when the class is destroyed - + +#ifdef ESP32 + // this takes the mutex, and will be release when the class is destroyed - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); +#endif // ESP32 // Skip initial buffer fill if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - LOGSZ) { return false; } @@ -2073,9 +2064,11 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l if (TasmotaGlobal.uptime < 3) { return false; } // Allow time to setup correct log level if (!req_loglevel || (index == TasmotaGlobal.log_buffer_pointer)) { return false; } - // this takes the mutex, and will be release when the class is destroyed - +#ifdef ESP32 + // this takes the mutex, and will be release when the class is destroyed - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); +#endif // ESP32 if (!index) { // Dump all index = TasmotaGlobal.log_buffer_pointer +1; @@ -2116,17 +2109,18 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l void AddLogData(uint32_t loglevel, const char* log_data) { - if (!TasmotaGlobal.log_buffer_mutex){ +#ifdef ESP32 + if (!TasmotaGlobal.log_buffer_mutex) { TasAutoMutex::init(&TasmotaGlobal.log_buffer_mutex); } + // this takes the mutex, and will be release when the class is destroyed - + // i.e. when the functon leaves You CAN call mutex.give() to leave early. + TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); +#endif // ESP32 char mxtime[14]; // "13:45:21.999 " snprintf_P(mxtime, sizeof(mxtime), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d.%03d "), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcMillis()); - // this takes the mutex, and will be release when the class is destroyed - - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); - if ((loglevel <= TasmotaGlobal.seriallog_level) && (TasmotaGlobal.masterlog_level <= TasmotaGlobal.seriallog_level)) { Serial.printf("%s%s\r\n", mxtime, log_data); diff --git a/tasmota/support_esp32.ino b/tasmota/support_esp32.ino index 275064204..0554129e8 100644 --- a/tasmota/support_esp32.ino +++ b/tasmota/support_esp32.ino @@ -413,4 +413,5 @@ uint8_t* FlashDirectAccess(void) { */ return data; } -#endif // ESP32 + +#endif // ESP32 \ No newline at end of file diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index dd1bd9bf4..d8b95433e 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -89,6 +89,7 @@ struct { uint32_t log_buffer_pointer; // Index in log buffer uint32_t uptime; // Counting every second until 4294967295 = 130 year GpioOptionABits gpio_optiona; // GPIO Option_A flags + void *log_buffer_mutex; // Control access to log buffer power_t power; // Current copy of Settings.power power_t rel_inverted; // Relay inverted flag (1 = (0 = On, 1 = Off)) @@ -171,7 +172,6 @@ struct { char mqtt_topic[TOPSZ]; // Composed MQTT topic char mqtt_data[MESSZ]; // MQTT publish buffer and web page ajax buffer char log_buffer[LOG_BUFFER_SIZE]; // Web log buffer - void *log_buffer_mutex; // control, access to log buffer } TasmotaGlobal; #ifdef SUPPORT_IF_STATEMENT From 85dea8bbcc4753aa3e7a82b7ea9f5f6ee79d8090 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 1 Jan 2021 17:32:21 +0100 Subject: [PATCH 072/255] Move FT5206 lib from I2c to Display --- lib/{lib_i2c => lib_display}/FT5206_Library/.gitignore | 0 lib/{lib_i2c => lib_display}/FT5206_Library/LICENSE | 0 lib/{lib_i2c => lib_display}/FT5206_Library/README.md | 0 lib/{lib_i2c => lib_display}/FT5206_Library/keywords.txt | 0 lib/{lib_i2c => lib_display}/FT5206_Library/library.properties | 0 lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.cpp | 0 lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.h | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename lib/{lib_i2c => lib_display}/FT5206_Library/.gitignore (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/LICENSE (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/README.md (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/keywords.txt (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/library.properties (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.cpp (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.h (100%) diff --git a/lib/lib_i2c/FT5206_Library/.gitignore b/lib/lib_display/FT5206_Library/.gitignore similarity index 100% rename from lib/lib_i2c/FT5206_Library/.gitignore rename to lib/lib_display/FT5206_Library/.gitignore diff --git a/lib/lib_i2c/FT5206_Library/LICENSE b/lib/lib_display/FT5206_Library/LICENSE similarity index 100% rename from lib/lib_i2c/FT5206_Library/LICENSE rename to lib/lib_display/FT5206_Library/LICENSE diff --git a/lib/lib_i2c/FT5206_Library/README.md b/lib/lib_display/FT5206_Library/README.md similarity index 100% rename from lib/lib_i2c/FT5206_Library/README.md rename to lib/lib_display/FT5206_Library/README.md diff --git a/lib/lib_i2c/FT5206_Library/keywords.txt b/lib/lib_display/FT5206_Library/keywords.txt similarity index 100% rename from lib/lib_i2c/FT5206_Library/keywords.txt rename to lib/lib_display/FT5206_Library/keywords.txt diff --git a/lib/lib_i2c/FT5206_Library/library.properties b/lib/lib_display/FT5206_Library/library.properties similarity index 100% rename from lib/lib_i2c/FT5206_Library/library.properties rename to lib/lib_display/FT5206_Library/library.properties diff --git a/lib/lib_i2c/FT5206_Library/src/FT5206.cpp b/lib/lib_display/FT5206_Library/src/FT5206.cpp similarity index 100% rename from lib/lib_i2c/FT5206_Library/src/FT5206.cpp rename to lib/lib_display/FT5206_Library/src/FT5206.cpp diff --git a/lib/lib_i2c/FT5206_Library/src/FT5206.h b/lib/lib_display/FT5206_Library/src/FT5206.h similarity index 100% rename from lib/lib_i2c/FT5206_Library/src/FT5206.h rename to lib/lib_display/FT5206_Library/src/FT5206.h From 0747239d4c6bf702b8c258b845cd79e5c12d9f58 Mon Sep 17 00:00:00 2001 From: Christian Langanke Date: Fri, 1 Jan 2021 18:17:55 +0100 Subject: [PATCH 073/255] - for 7 segment displays - added support for FUNC_DISPLAY_DIM - added new FUNC_DISPLAY_BLINKRATE with new command DisplayBlinkrate Value is not being persistently stored, so no seting req. - added SevensegLog for DisplayMode 1..5 support, displaying the nth sensor value to nth atached 7-segment display. For that unsed display adresses before the first one being used may not be zero, but must be configured to unused addresses (e.g. 0xFF), otherwise driver init will fail. --- tasmota/xdrv_13_display.ino | 23 ++++++++++--- tasmota/xdsp_11_sevenseg.ino | 63 ++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 00a2ac8a5..6bdab9d03 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -63,6 +63,7 @@ const uint8_t DISPLAY_LOG_ROWS = 32; // Number of lines in display log #define D_CMND_DISP_TEXT "Text" #define D_CMND_DISP_WIDTH "Width" #define D_CMND_DISP_HEIGHT "Height" +#define D_CMND_DISP_BLINKRATE "Blinkrate" enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_EVERY_50_MSECOND, FUNC_DISPLAY_EVERY_SECOND, FUNC_DISPLAY_MODEL, FUNC_DISPLAY_MODE, FUNC_DISPLAY_POWER, @@ -70,19 +71,20 @@ enum XdspFunctions { FUNC_DISPLAY_INIT_DRIVER, FUNC_DISPLAY_INIT, FUNC_DISPLAY_E FUNC_DISPLAY_DRAW_HLINE, FUNC_DISPLAY_DRAW_VLINE, FUNC_DISPLAY_DRAW_LINE, FUNC_DISPLAY_DRAW_CIRCLE, FUNC_DISPLAY_FILL_CIRCLE, FUNC_DISPLAY_DRAW_RECTANGLE, FUNC_DISPLAY_FILL_RECTANGLE, - FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING }; + FUNC_DISPLAY_TEXT_SIZE, FUNC_DISPLAY_FONT_SIZE, FUNC_DISPLAY_ROTATION, FUNC_DISPLAY_DRAW_STRING, + FUNC_DISPLAY_DIM, FUNC_DISPLAY_BLINKRATE }; enum DisplayInitModes { DISPLAY_INIT_MODE, DISPLAY_INIT_PARTIAL, DISPLAY_INIT_FULL }; const char kDisplayCommands[] PROGMEM = D_PRFX_DISPLAY "|" // Prefix "|" D_CMND_DISP_MODEL "|" D_CMND_DISP_WIDTH "|" D_CMND_DISP_HEIGHT "|" D_CMND_DISP_MODE "|" D_CMND_DISP_REFRESH "|" D_CMND_DISP_DIMMER "|" D_CMND_DISP_COLS "|" D_CMND_DISP_ROWS "|" D_CMND_DISP_SIZE "|" D_CMND_DISP_FONT "|" - D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS ; + D_CMND_DISP_ROTATE "|" D_CMND_DISP_TEXT "|" D_CMND_DISP_ADDRESS "|" D_CMND_DISP_BLINKRATE ; void (* const DisplayCommand[])(void) PROGMEM = { &CmndDisplay, &CmndDisplayModel, &CmndDisplayWidth, &CmndDisplayHeight, &CmndDisplayMode, &CmndDisplayRefresh, &CmndDisplayDimmer, &CmndDisplayColumns, &CmndDisplayRows, &CmndDisplaySize, &CmndDisplayFont, - &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress }; + &CmndDisplayRotate, &CmndDisplayText, &CmndDisplayAddress, &CmndDisplayBlinkrate }; char *dsp_str; @@ -1410,11 +1412,24 @@ void CmndDisplayDimmer(void) else if (!Settings.display_dimmer && disp_power) { ExecuteCommandPower(disp_device, POWER_OFF, SRC_DISPLAY); } - if (renderer) renderer->dim(Settings.display_dimmer); + if (renderer) + renderer->dim(Settings.display_dimmer); + else + XdspCall(FUNC_DISPLAY_DIM); } ResponseCmndNumber(Settings.display_dimmer); } +void CmndDisplayBlinkrate(void) +{ + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) { + + if (!renderer) + XdspCall(FUNC_DISPLAY_BLINKRATE); + } + ResponseCmndNumber(XdrvMailbox.payload); +} + void CmndDisplaySize(void) { if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 4)) { diff --git a/tasmota/xdsp_11_sevenseg.ino b/tasmota/xdsp_11_sevenseg.ino index ea3db7e4a..b3bde3149 100644 --- a/tasmota/xdsp_11_sevenseg.ino +++ b/tasmota/xdsp_11_sevenseg.ino @@ -62,6 +62,61 @@ void SevensegWrite(void) } } +void SevensegLog(void) +{ + // get sensor data + ResponseClear(); + ResponseAppendTime(); + XsnsCall(FUNC_JSON_APPEND); + ResponseJsonEnd(); + + // display nth sensor value on nth display + // code adapted from xdrv_13_display.ino, DisplayAnalyzeJson() + uint8_t unit = 0; + int16_t valueDecimal = 0; + double valueFloat = 0; + uint8 fDigits = 0; + String jsonStr = TasmotaGlobal.mqtt_data; // Move from stack to heap to fix watchdogs (20180626) + JsonParser parser((char*)jsonStr.c_str()); + JsonParserObject object_root = parser.getRootObject(); + if (object_root) { + for (auto key_level1 : object_root) { + JsonParserToken token_level1 = key_level1.getValue(); + if (token_level1.isObject()) { + JsonParserObject object_level1 = token_level1.getObject(); + for (auto key_level2 : object_level1) { + const char* value_level2 = key_level2.getValue().getStr(nullptr); + if (value_level2 != nullptr) { + if ((unit < sevensegs) && (sevenseg[unit] != nullptr)) { + if (strchr( value_level2, '.') == NULL) { + sevenseg[unit]->print(atoi(value_level2), DEC); + } else { + sevenseg[unit]->printFloat(atof(value_level2), 1, DEC); + } + sevenseg[unit]->writeDisplay(); + unit++; + } + } + } + } + } + } +} + +void SevensegDim(void) +{ + for (uint32_t i = 0; i < sevensegs; i++) { + sevenseg[i]->setBrightness(Settings.display_dimmer); + } +} + +void SevensegBlinkrate( void) +{ + for (uint32_t i = 0; i < sevensegs; i++) { + sevenseg[i]->blinkRate(XdrvMailbox.payload); + } +} + void SevensegClear(void) { for (uint32_t i = 0; i < sevensegs; i++) { @@ -352,6 +407,7 @@ void SevensegRefresh(void) // Every second case 4: // Mqtt case 3: // Local case 5: { // Mqtt + SevensegLog(); break; } } @@ -396,6 +452,13 @@ bool Xdsp11(uint8_t function) case FUNC_DISPLAY_DRAW_STRING: SevensegDrawStringAt(dsp_x, dsp_y, dsp_str, dsp_color, dsp_flag); break; + case FUNC_DISPLAY_DIM: + SevensegDim(); + break; + case FUNC_DISPLAY_BLINKRATE: + SevensegBlinkrate(); + break; + } } return result; From 30a5355526c1a35fb41f2f9ad3fb25913b6cfd0f Mon Sep 17 00:00:00 2001 From: jaapgvk <40623760+jaapgvk@users.noreply.github.com> Date: Fri, 1 Jan 2021 20:47:03 +0100 Subject: [PATCH 074/255] Delete xsns_15_mhz19.ino --- tasmota/xsns_15_mhz19.ino | 396 -------------------------------------- 1 file changed, 396 deletions(-) delete mode 100644 tasmota/xsns_15_mhz19.ino diff --git a/tasmota/xsns_15_mhz19.ino b/tasmota/xsns_15_mhz19.ino deleted file mode 100644 index 0444bce64..000000000 --- a/tasmota/xsns_15_mhz19.ino +++ /dev/null @@ -1,396 +0,0 @@ -/* - xsns_15_mhz19.ino - MH-Z19(B) CO2 sensor support for Tasmota - - Copyright (C) 2021 Theo Arends - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#ifdef USE_MHZ19 -/*********************************************************************************************\ - * MH-Z19 - CO2 sensor - * - * Adapted from EspEasy plugin P049 by Dmitry (rel22 ___ inbox.ru) - * - * Hardware Serial will be selected if GPIO1 = [MHZ Rx] and GPIO3 = [MHZ Tx] - ********************************************************************************************** - * Filter usage - * - * Select filter usage on low stability readings -\*********************************************************************************************/ - -#define XSNS_15 15 - -enum MhzFilterOptions {MHZ19_FILTER_OFF, MHZ19_FILTER_OFF_ALLSAMPLES, MHZ19_FILTER_FAST, MHZ19_FILTER_MEDIUM, MHZ19_FILTER_SLOW}; - -#define MHZ19_FILTER_OPTION MHZ19_FILTER_FAST - -/*********************************************************************************************\ - * Source: http://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf - * - * Automatic Baseline Correction (ABC logic function) is enabled by default but may be disabled with command - * Sensor15 0 - * and enabled again with command - * Sensor15 1 - * - * ABC logic function refers to that sensor itself do zero point judgment and automatic calibration procedure - * intelligently after a continuous operation period. The automatic calibration cycle is every 24 hours after powered on. - * - * The zero point of automatic calibration is 400ppm. - * - * This function is usually suitable for indoor air quality monitor such as offices, schools and homes, - * not suitable for greenhouse, farm and refrigeratory where this function should be off. - * - * Please do zero calibration timely, such as manual or commend calibration. -\*********************************************************************************************/ - -#include - -#ifndef CO2_LOW -#define CO2_LOW 800 // Below this CO2 value show green light -#endif -#ifndef CO2_HIGH -#define CO2_HIGH 1200 // Above this CO2 value show red light -#endif - -#define MHZ19_READ_TIMEOUT 400 // Must be way less than 1000 but enough to read 9 bytes at 9600 bps -#define MHZ19_RETRY_COUNT 8 - -TasmotaSerial *MhzSerial; - -const char kMhzModels[] PROGMEM = "|B"; - -const char ABC_ENABLED[] = "ABC is Enabled"; -const char ABC_DISABLED[] = "ABC is Disabled"; - -enum MhzCommands { MHZ_CMND_READPPM, MHZ_CMND_ABCENABLE, MHZ_CMND_ABCDISABLE, MHZ_CMND_ZEROPOINT, MHZ_CMND_RESET, MHZ_CMND_RANGE_1000, MHZ_CMND_RANGE_2000, MHZ_CMND_RANGE_3000, MHZ_CMND_RANGE_5000 }; -const uint8_t kMhzCommands[][4] PROGMEM = { -// 2 3 6 7 - {0x86,0x00,0x00,0x00}, // mhz_cmnd_read_ppm - {0x79,0xA0,0x00,0x00}, // mhz_cmnd_abc_enable - {0x79,0x00,0x00,0x00}, // mhz_cmnd_abc_disable - {0x87,0x00,0x00,0x00}, // mhz_cmnd_zeropoint - {0x8D,0x00,0x00,0x00}, // mhz_cmnd_reset - {0x99,0x00,0x03,0xE8}, // mhz_cmnd_set_range_1000 - {0x99,0x00,0x07,0xD0}, // mhz_cmnd_set_range_2000 - {0x99,0x00,0x0B,0xB8}, // mhz_cmnd_set_range_3000 - {0x99,0x00,0x13,0x88}}; // mhz_cmnd_set_range_5000 - -uint8_t mhz_type = 1; -uint16_t mhz_last_ppm = 0; -uint8_t mhz_filter = MHZ19_FILTER_OPTION; -bool mhz_abc_must_apply = false; - -float mhz_temperature = 0; -uint8_t mhz_retry = MHZ19_RETRY_COUNT; -uint8_t mhz_received = 0; -uint8_t mhz_state = 0; - -/*********************************************************************************************/ - -uint8_t MhzCalculateChecksum(uint8_t *array) -{ - uint8_t checksum = 0; - for (uint32_t i = 1; i < 8; i++) { - checksum += array[i]; - } - checksum = 255 - checksum; - return (checksum +1); -} - -size_t MhzSendCmd(uint8_t command_id) -{ - uint8_t mhz_send[9] = { 0 }; - - mhz_send[0] = 0xFF; // Start byte, fixed - mhz_send[1] = 0x01; // Sensor number, 0x01 by default - memcpy_P(&mhz_send[2], kMhzCommands[command_id], sizeof(uint16_t)); -/* - mhz_send[4] = 0x00; - mhz_send[5] = 0x00; -*/ - memcpy_P(&mhz_send[6], kMhzCommands[command_id] + sizeof(uint16_t), sizeof(uint16_t)); - mhz_send[8] = MhzCalculateChecksum(mhz_send); - -// AddLog_P(LOG_LEVEL_DEBUG, PSTR("Final MhzCommand: %x %x %x %x %x %x %x %x %x"),mhz_send[0],mhz_send[1],mhz_send[2],mhz_send[3],mhz_send[4],mhz_send[5],mhz_send[6],mhz_send[7],mhz_send[8]); - - return MhzSerial->write(mhz_send, sizeof(mhz_send)); -} - -/*********************************************************************************************/ - -bool MhzCheckAndApplyFilter(uint16_t ppm, uint8_t s) -{ - if (1 == s) { - return false; // S==1 => "A" version sensor bootup, do not use values. - } - if (mhz_last_ppm < 400 || mhz_last_ppm > 5000) { - // Prevent unrealistic values during start-up with filtering enabled. - // Just assume the entered value is correct. - mhz_last_ppm = ppm; - return true; - } - int32_t difference = ppm - mhz_last_ppm; - if (s > 0 && s < 64 && mhz_filter != MHZ19_FILTER_OFF) { - // Not the "B" version of the sensor, S value is used. - // S==0 => "B" version, else "A" version - // The S value is an indication of the stability of the reading. - // S == 64 represents a stable reading and any lower value indicates (unusual) fast change. - // Now we increase the delay filter for low values of S and increase response time when the - // value is more stable. - // This will make the reading useful in more turbulent environments, - // where the sensor would report more rapid change of measured values. - difference *= s; - difference /= 64; - } - if (MHZ19_FILTER_OFF == mhz_filter) { - if (s != 0 && s != 64) { - return false; - } - } else { - difference >>= (mhz_filter -1); - } - mhz_last_ppm = static_cast(mhz_last_ppm + difference); - return true; -} - -void MhzEverySecond(void) -{ - mhz_state++; - if (8 == mhz_state) { // Every 8 sec start a MH-Z19 measuring cycle (which takes 1005 +5% ms) - mhz_state = 0; - - if (mhz_retry) { - mhz_retry--; - if (!mhz_retry) { - mhz_last_ppm = 0; - mhz_temperature = 0; - } - } - - MhzSerial->flush(); // Sync reception - MhzSendCmd(MHZ_CMND_READPPM); - mhz_received = 0; - } - - if ((mhz_state > 2) && !mhz_received) { // Start reading response after 3 seconds every second until received - uint8_t mhz_response[9]; - - unsigned long start = millis(); - uint8_t counter = 0; - while (((millis() - start) < MHZ19_READ_TIMEOUT) && (counter < 9)) { - if (MhzSerial->available() > 0) { - mhz_response[counter++] = MhzSerial->read(); - } else { - delay(5); - } - } - - AddLogBuffer(LOG_LEVEL_DEBUG_MORE, mhz_response, counter); - - if (counter < 9) { -// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 comms timeout")); - return; - } - - uint8_t crc = MhzCalculateChecksum(mhz_response); - if (mhz_response[8] != crc) { -// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 crc error")); - return; - } - if (0xFF != mhz_response[0] || 0x86 != mhz_response[1]) { -// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 bad response")); - return; - } - - mhz_received = 1; - - uint16_t u = (mhz_response[6] << 8) | mhz_response[7]; - if (15000 == u) { // During (and only ever at) sensor boot, 'u' is reported as 15000 - if (Settings.SensorBits1.mhz19b_abc_disable) { - // After bootup of the sensor the ABC will be enabled. - // Thus only actively disable after bootup. - mhz_abc_must_apply = true; - } - } else { - uint16_t ppm = (mhz_response[2] << 8) | mhz_response[3]; - mhz_temperature = ConvertTemp((float)mhz_response[4] - 40); - uint8_t s = mhz_response[5]; - mhz_type = (s) ? 1 : 2; - if (MhzCheckAndApplyFilter(ppm, s)) { - mhz_retry = MHZ19_RETRY_COUNT; -#ifdef USE_LIGHT - LightSetSignal(CO2_LOW, CO2_HIGH, mhz_last_ppm); -#endif // USE_LIGHT - - if (0 == s || 64 == s) { // Reading is stable. - if (mhz_abc_must_apply) { - mhz_abc_must_apply = false; - if (!Settings.SensorBits1.mhz19b_abc_disable) { - MhzSendCmd(MHZ_CMND_ABCENABLE); - } else { - MhzSendCmd(MHZ_CMND_ABCDISABLE); - } - } - } - - } - } - - } -} - -/*********************************************************************************************\ - * Command Sensor15 - * - * 0 - ABC Off - * 1 - ABC On (Default) - * 2 - Manual start = ABC Off - * 3 - (Not implemented) Optional filter settings - * 9 - Reset - * 1000 - Range - * 2000 - Range - * 3000 - Range - * 5000 - Range -\*********************************************************************************************/ - -#define D_JSON_RANGE_1000 "1000 ppm range" -#define D_JSON_RANGE_2000 "2000 ppm range" -#define D_JSON_RANGE_3000 "3000 ppm range" -#define D_JSON_RANGE_5000 "5000 ppm range" - -bool MhzCommandSensor(void) -{ - bool serviced = true; - - switch (XdrvMailbox.payload) { - case 0: - Settings.SensorBits1.mhz19b_abc_disable = true; - MhzSendCmd(MHZ_CMND_ABCDISABLE); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED); - break; - case 1: - Settings.SensorBits1.mhz19b_abc_disable = false; - MhzSendCmd(MHZ_CMND_ABCENABLE); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED); - break; - case 2: - MhzSendCmd(MHZ_CMND_ZEROPOINT); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_ZERO_POINT_CALIBRATION); - break; - case 9: - MhzSendCmd(MHZ_CMND_RESET); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RESET); - break; - case 1000: - MhzSendCmd(MHZ_CMND_RANGE_1000); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_1000); - break; - case 2000: - MhzSendCmd(MHZ_CMND_RANGE_2000); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_2000); - break; - case 3000: - MhzSendCmd(MHZ_CMND_RANGE_3000); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_3000); - break; - case 5000: - MhzSendCmd(MHZ_CMND_RANGE_5000); - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_5000); - break; - default: - if (!Settings.SensorBits1.mhz19b_abc_disable) { - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED); - } else { - Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED); - } - } - - return serviced; -} - -/*********************************************************************************************/ - -void MhzInit(void) -{ - mhz_type = 0; - if (PinUsed(GPIO_MHZ_RXD) && PinUsed(GPIO_MHZ_TXD)) { - MhzSerial = new TasmotaSerial(Pin(GPIO_MHZ_RXD), Pin(GPIO_MHZ_TXD), 1); - if (MhzSerial->begin(9600)) { - if (MhzSerial->hardwareSerial()) { ClaimSerial(); } - mhz_type = 1; - } - - } -} - -void MhzShow(bool json) -{ - char types[7] = "MHZ19B"; // MHZ19B for legacy reasons. Prefered is MHZ19 - char temperature[33]; - dtostrfd(mhz_temperature, Settings.flag2.temperature_resolution, temperature); - char model[3]; - GetTextIndexed(model, sizeof(model), mhz_type -1, kMhzModels); - - if (json) { - ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_MODEL "\":\"%s\",\"" D_JSON_CO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s}"), types, model, mhz_last_ppm, temperature); -#ifdef USE_DOMOTICZ - if (0 == TasmotaGlobal.tele_period) { - DomoticzSensor(DZ_AIRQUALITY, mhz_last_ppm); - DomoticzSensor(DZ_TEMP, temperature); - } -#endif // USE_DOMOTICZ -#ifdef USE_WEBSERVER - } else { - WSContentSend_PD(HTTP_SNS_CO2, types, mhz_last_ppm); - WSContentSend_PD(HTTP_SNS_TEMP, types, temperature, TempUnit()); -#endif // USE_WEBSERVER - } -} - -/*********************************************************************************************\ - * Interface -\*********************************************************************************************/ - -bool Xsns15(uint8_t function) -{ - bool result = false; - - if (mhz_type) { - switch (function) { - case FUNC_INIT: - MhzInit(); - break; - case FUNC_EVERY_SECOND: - MhzEverySecond(); - break; - case FUNC_COMMAND_SENSOR: - if (XSNS_15 == XdrvMailbox.index) { - result = MhzCommandSensor(); - } - break; - case FUNC_JSON_APPEND: - MhzShow(1); - break; -#ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: - MhzShow(0); - break; -#endif // USE_WEBSERVER - } - } - return result; -} - -#endif // USE_MHZ19 From 2b12e995d38befcf05eada03f69b15ffdf301a6b Mon Sep 17 00:00:00 2001 From: jaapgvk <40623760+jaapgvk@users.noreply.github.com> Date: Fri, 1 Jan 2021 20:47:29 +0100 Subject: [PATCH 075/255] Add files via upload --- tasmota/xsns_15_mhz19.ino | 402 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 402 insertions(+) create mode 100644 tasmota/xsns_15_mhz19.ino diff --git a/tasmota/xsns_15_mhz19.ino b/tasmota/xsns_15_mhz19.ino new file mode 100644 index 000000000..a2afb267f --- /dev/null +++ b/tasmota/xsns_15_mhz19.ino @@ -0,0 +1,402 @@ +/* + xsns_15_mhz19.ino - MH-Z19(B) CO2 sensor support for Tasmota + + Copyright (C) 2021 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_MHZ19 +/*********************************************************************************************\ + * MH-Z19 - CO2 sensor + * + * Adapted from EspEasy plugin P049 by Dmitry (rel22 ___ inbox.ru) + * + * Hardware Serial will be selected if GPIO1 = [MHZ Rx] and GPIO3 = [MHZ Tx] + ********************************************************************************************** + * Filter usage + * + * Select filter usage on low stability readings +\*********************************************************************************************/ + +#define XSNS_15 15 + +enum MhzFilterOptions {MHZ19_FILTER_OFF, MHZ19_FILTER_OFF_ALLSAMPLES, MHZ19_FILTER_FAST, MHZ19_FILTER_MEDIUM, MHZ19_FILTER_SLOW}; + +#define MHZ19_FILTER_OPTION MHZ19_FILTER_FAST + +/*********************************************************************************************\ + * Source: http://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf + * + * Automatic Baseline Correction (ABC logic function) is enabled by default but may be disabled with command + * Sensor15 0 + * and enabled again with command + * Sensor15 1 + * + * ABC logic function refers to that sensor itself do zero point judgment and automatic calibration procedure + * intelligently after a continuous operation period. The automatic calibration cycle is every 24 hours after powered on. + * + * The zero point of automatic calibration is 400ppm. + * + * This function is usually suitable for indoor air quality monitor such as offices, schools and homes, + * not suitable for greenhouse, farm and refrigeratory where this function should be off. + * + * Please do zero calibration timely, such as manual or commend calibration. +\*********************************************************************************************/ + +#include + +#ifndef CO2_LOW +#define CO2_LOW 800 // Below this CO2 value show green light +#endif +#ifndef CO2_HIGH +#define CO2_HIGH 1200 // Above this CO2 value show red light +#endif + +#define MHZ19_READ_TIMEOUT 400 // Must be way less than 1000 but enough to read 9 bytes at 9600 bps +#define MHZ19_RETRY_COUNT 8 + +TasmotaSerial *MhzSerial; + +const char kMhzModels[] PROGMEM = "|B"; + +const char ABC_ENABLED[] = "ABC is Enabled"; +const char ABC_DISABLED[] = "ABC is Disabled"; + +enum MhzCommands { MHZ_CMND_READPPM, MHZ_CMND_ABCENABLE, MHZ_CMND_ABCDISABLE, MHZ_CMND_ZEROPOINT, MHZ_CMND_RESET, MHZ_CMND_RANGE_1000, MHZ_CMND_RANGE_2000, MHZ_CMND_RANGE_3000, MHZ_CMND_RANGE_5000, MHZ_CMND_RANGE_10000 }; +const uint8_t kMhzCommands[][4] PROGMEM = { +// 2 3 6 7 + {0x86,0x00,0x00,0x00}, // mhz_cmnd_read_ppm + {0x79,0xA0,0x00,0x00}, // mhz_cmnd_abc_enable + {0x79,0x00,0x00,0x00}, // mhz_cmnd_abc_disable + {0x87,0x00,0x00,0x00}, // mhz_cmnd_zeropoint + {0x8D,0x00,0x00,0x00}, // mhz_cmnd_reset + {0x99,0x00,0x03,0xE8}, // mhz_cmnd_set_range_1000 + {0x99,0x00,0x07,0xD0}, // mhz_cmnd_set_range_2000 + {0x99,0x00,0x0B,0xB8}, // mhz_cmnd_set_range_3000 + {0x99,0x00,0x13,0x88}, // mhz_cmnd_set_range_5000 + {0x99,0x00,0x27,0x10}}; // mhz_cmnd_set_range_10000 + +uint8_t mhz_type = 1; +uint16_t mhz_last_ppm = 0; +uint8_t mhz_filter = MHZ19_FILTER_OPTION; +bool mhz_abc_must_apply = false; + +float mhz_temperature = 0; +uint8_t mhz_retry = MHZ19_RETRY_COUNT; +uint8_t mhz_received = 0; +uint8_t mhz_state = 0; + +/*********************************************************************************************/ + +uint8_t MhzCalculateChecksum(uint8_t *array) +{ + uint8_t checksum = 0; + for (uint32_t i = 1; i < 8; i++) { + checksum += array[i]; + } + checksum = 255 - checksum; + return (checksum +1); +} + +size_t MhzSendCmd(uint8_t command_id) +{ + uint8_t mhz_send[9] = { 0 }; + + mhz_send[0] = 0xFF; // Start byte, fixed + mhz_send[1] = 0x01; // Sensor number, 0x01 by default + memcpy_P(&mhz_send[2], kMhzCommands[command_id], sizeof(uint16_t)); +/* + mhz_send[4] = 0x00; + mhz_send[5] = 0x00; +*/ + memcpy_P(&mhz_send[6], kMhzCommands[command_id] + sizeof(uint16_t), sizeof(uint16_t)); + mhz_send[8] = MhzCalculateChecksum(mhz_send); + +// AddLog_P(LOG_LEVEL_DEBUG, PSTR("Final MhzCommand: %x %x %x %x %x %x %x %x %x"),mhz_send[0],mhz_send[1],mhz_send[2],mhz_send[3],mhz_send[4],mhz_send[5],mhz_send[6],mhz_send[7],mhz_send[8]); + + return MhzSerial->write(mhz_send, sizeof(mhz_send)); +} + +/*********************************************************************************************/ + +bool MhzCheckAndApplyFilter(uint16_t ppm, uint8_t s) +{ + if (1 == s) { + return false; // S==1 => "A" version sensor bootup, do not use values. + } + if (mhz_last_ppm < 400 || mhz_last_ppm > 10000) { + // Prevent unrealistic values during start-up with filtering enabled. + // Just assume the entered value is correct. + mhz_last_ppm = ppm; + return true; + } + int32_t difference = ppm - mhz_last_ppm; + if (s > 0 && s < 64 && mhz_filter != MHZ19_FILTER_OFF) { + // Not the "B" version of the sensor, S value is used. + // S==0 => "B" version, else "A" version + // The S value is an indication of the stability of the reading. + // S == 64 represents a stable reading and any lower value indicates (unusual) fast change. + // Now we increase the delay filter for low values of S and increase response time when the + // value is more stable. + // This will make the reading useful in more turbulent environments, + // where the sensor would report more rapid change of measured values. + difference *= s; + difference /= 64; + } + if (MHZ19_FILTER_OFF == mhz_filter) { + if (s != 0 && s != 64) { + return false; + } + } else { + difference >>= (mhz_filter -1); + } + mhz_last_ppm = static_cast(mhz_last_ppm + difference); + return true; +} + +void MhzEverySecond(void) +{ + mhz_state++; + if (8 == mhz_state) { // Every 8 sec start a MH-Z19 measuring cycle (which takes 1005 +5% ms) + mhz_state = 0; + + if (mhz_retry) { + mhz_retry--; + if (!mhz_retry) { + mhz_last_ppm = 0; + mhz_temperature = 0; + } + } + + MhzSerial->flush(); // Sync reception + MhzSendCmd(MHZ_CMND_READPPM); + mhz_received = 0; + } + + if ((mhz_state > 2) && !mhz_received) { // Start reading response after 3 seconds every second until received + uint8_t mhz_response[9]; + + unsigned long start = millis(); + uint8_t counter = 0; + while (((millis() - start) < MHZ19_READ_TIMEOUT) && (counter < 9)) { + if (MhzSerial->available() > 0) { + mhz_response[counter++] = MhzSerial->read(); + } else { + delay(5); + } + } + + AddLogBuffer(LOG_LEVEL_DEBUG_MORE, mhz_response, counter); + + if (counter < 9) { +// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 comms timeout")); + return; + } + + uint8_t crc = MhzCalculateChecksum(mhz_response); + if (mhz_response[8] != crc) { +// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 crc error")); + return; + } + if (0xFF != mhz_response[0] || 0x86 != mhz_response[1]) { +// AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "MH-Z19 bad response")); + return; + } + + mhz_received = 1; + + uint16_t u = (mhz_response[6] << 8) | mhz_response[7]; + if (15000 == u) { // During (and only ever at) sensor boot, 'u' is reported as 15000 + if (Settings.SensorBits1.mhz19b_abc_disable) { + // After bootup of the sensor the ABC will be enabled. + // Thus only actively disable after bootup. + mhz_abc_must_apply = true; + } + } else { + uint16_t ppm = (mhz_response[2] << 8) | mhz_response[3]; + mhz_temperature = ConvertTemp((float)mhz_response[4] - 40); + uint8_t s = mhz_response[5]; + mhz_type = (s) ? 1 : 2; + if (MhzCheckAndApplyFilter(ppm, s)) { + mhz_retry = MHZ19_RETRY_COUNT; +#ifdef USE_LIGHT + LightSetSignal(CO2_LOW, CO2_HIGH, mhz_last_ppm); +#endif // USE_LIGHT + + if (0 == s || 64 == s) { // Reading is stable. + if (mhz_abc_must_apply) { + mhz_abc_must_apply = false; + if (!Settings.SensorBits1.mhz19b_abc_disable) { + MhzSendCmd(MHZ_CMND_ABCENABLE); + } else { + MhzSendCmd(MHZ_CMND_ABCDISABLE); + } + } + } + + } + } + + } +} + +/*********************************************************************************************\ + * Command Sensor15 + * + * 0 - ABC Off + * 1 - ABC On (Default) + * 2 - Manual start = ABC Off + * 3 - (Not implemented) Optional filter settings + * 9 - Reset + * 1000 - Range + * 2000 - Range + * 3000 - Range + * 5000 - Range +\*********************************************************************************************/ + +#define D_JSON_RANGE_1000 "1000 ppm range" +#define D_JSON_RANGE_2000 "2000 ppm range" +#define D_JSON_RANGE_3000 "3000 ppm range" +#define D_JSON_RANGE_5000 "5000 ppm range" +#define D_JSON_RANGE_10000 "10000 ppm range" + +bool MhzCommandSensor(void) +{ + bool serviced = true; + + switch (XdrvMailbox.payload) { + case 0: + Settings.SensorBits1.mhz19b_abc_disable = true; + MhzSendCmd(MHZ_CMND_ABCDISABLE); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED); + break; + case 1: + Settings.SensorBits1.mhz19b_abc_disable = false; + MhzSendCmd(MHZ_CMND_ABCENABLE); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED); + break; + case 2: + MhzSendCmd(MHZ_CMND_ZEROPOINT); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_ZERO_POINT_CALIBRATION); + break; + case 9: + MhzSendCmd(MHZ_CMND_RESET); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RESET); + break; + case 1000: + MhzSendCmd(MHZ_CMND_RANGE_1000); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_1000); + break; + case 2000: + MhzSendCmd(MHZ_CMND_RANGE_2000); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_2000); + break; + case 3000: + MhzSendCmd(MHZ_CMND_RANGE_3000); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_3000); + break; + case 5000: + MhzSendCmd(MHZ_CMND_RANGE_5000); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_5000); + break; + case 10000: + MhzSendCmd(MHZ_CMND_RANGE_10000); + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, D_JSON_RANGE_10000); + break; + default: + if (!Settings.SensorBits1.mhz19b_abc_disable) { + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_ENABLED); + } else { + Response_P(S_JSON_SENSOR_INDEX_SVALUE, XSNS_15, ABC_DISABLED); + } + } + + return serviced; +} + +/*********************************************************************************************/ + +void MhzInit(void) +{ + mhz_type = 0; + if (PinUsed(GPIO_MHZ_RXD) && PinUsed(GPIO_MHZ_TXD)) { + MhzSerial = new TasmotaSerial(Pin(GPIO_MHZ_RXD), Pin(GPIO_MHZ_TXD), 1); + if (MhzSerial->begin(9600)) { + if (MhzSerial->hardwareSerial()) { ClaimSerial(); } + mhz_type = 1; + } + + } +} + +void MhzShow(bool json) +{ + char types[7] = "MHZ19B"; // MHZ19B for legacy reasons. Prefered is MHZ19 + char temperature[33]; + dtostrfd(mhz_temperature, Settings.flag2.temperature_resolution, temperature); + char model[3]; + GetTextIndexed(model, sizeof(model), mhz_type -1, kMhzModels); + + if (json) { + ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_MODEL "\":\"%s\",\"" D_JSON_CO2 "\":%d,\"" D_JSON_TEMPERATURE "\":%s}"), types, model, mhz_last_ppm, temperature); +#ifdef USE_DOMOTICZ + if (0 == TasmotaGlobal.tele_period) { + DomoticzSensor(DZ_AIRQUALITY, mhz_last_ppm); + DomoticzSensor(DZ_TEMP, temperature); + } +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_CO2, types, mhz_last_ppm); + WSContentSend_PD(HTTP_SNS_TEMP, types, temperature, TempUnit()); +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns15(uint8_t function) +{ + bool result = false; + + if (mhz_type) { + switch (function) { + case FUNC_INIT: + MhzInit(); + break; + case FUNC_EVERY_SECOND: + MhzEverySecond(); + break; + case FUNC_COMMAND_SENSOR: + if (XSNS_15 == XdrvMailbox.index) { + result = MhzCommandSensor(); + } + break; + case FUNC_JSON_APPEND: + MhzShow(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + MhzShow(0); + break; +#endif // USE_WEBSERVER + } + } + return result; +} + +#endif // USE_MHZ19 From ca09594c24fa36a71399f68b6302615006733e69 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Fri, 1 Jan 2021 21:13:22 +0100 Subject: [PATCH 076/255] RuleTimer0 applies to all RuleTimers --- tasmota/xdrv_10_rules.ino | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 8d8fefc13..0142b9a09 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -2123,21 +2123,29 @@ void CmndRule(void) void CmndRuleTimer(void) { - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_RULE_TIMERS)) { - if (XdrvMailbox.data_len > 0) { -#ifdef USE_EXPRESSION - float timer_set = evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len); - Rules.timer[XdrvMailbox.index -1] = (timer_set > 0) ? millis() + (1000 * timer_set) : 0; -#else - Rules.timer[XdrvMailbox.index -1] = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0; -#endif // USE_EXPRESSION - } - ResponseClear(); - for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) { - ResponseAppend_P(PSTR("%c\"T%d\":%d"), (i) ? ',' : '{', i +1, (Rules.timer[i]) ? (Rules.timer[i] - millis()) / 1000 : 0); - } - ResponseJsonEnd(); + if (XdrvMailbox.index > MAX_RULE_TIMERS) + return; + int i = XdrvMailbox.index, max_i = XdrvMailbox.index; + if (0 == i) { + i = 1; + max_i = MAX_RULE_TIMERS; } +#ifdef USE_EXPRESSION + float timer_set = evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len); + timer_set = (timer_set > 0) ? millis() + (1000 * timer_set) : 0; +#else + unsigned long timer_set = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0; +#endif // USE_EXPRESSION + if (XdrvMailbox.data_len > 0) { + for ( ; i <= max_i ; ++i ) { + Rules.timer[i -1] = timer_set; + } + } + ResponseClear(); + for (i = 0; i < MAX_RULE_TIMERS; i++) { + ResponseAppend_P(PSTR("%c\"T%d\":%d"), (i) ? ',' : '{', i +1, (Rules.timer[i]) ? (Rules.timer[i] - millis()) / 1000 : 0); + } + ResponseJsonEnd(); } void CmndEvent(void) From 9fdeac89249c6b2c9d0474f22785cb6c1789e5e8 Mon Sep 17 00:00:00 2001 From: Simon Hailes Date: Sat, 2 Jan 2021 09:02:11 +0000 Subject: [PATCH 077/255] update TasAutoMutex & use. Automatically initialise it. Add a name per instance. Add a default timeout of 40ticks - at which point it enters anyway and logs to serial the potential deadlock. --- tasmota/support.ino | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 7dd03d978..4845e8115 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -120,18 +120,23 @@ String GetResetReason(void) // automutex. // create a mute in your driver with: // void *mutex = nullptr; -// TasAutoMutex::init(&mutex); // // then protect any function with -// TasAutoMutex m(mutex); +// TasAutoMutex m(&mutex, "somename"); +// - mutex is automatically initialised if not already intialised. // - it will be automagically released when the function is over. // - the same thread can take multiple times (recursive). // - advanced options m.give() and m.take() allow you fine control within a function. +// - if take=false at creat, it will not be initially taken. +// - name is used in serial log of mutex deadlock. +// - maxWait in ticks is how long it will wait before failing in a deadlock scenario (and then emitting on serial) class TasAutoMutex { SemaphoreHandle_t mutex; bool taken; + int maxWait; + const char *name; public: - TasAutoMutex(void * mutex, bool take=true); + TasAutoMutex(void ** mutex, const char *name = "", int maxWait = 40, bool take=true); ~TasAutoMutex(); void give(); void take(); @@ -139,13 +144,20 @@ class TasAutoMutex { }; ////////////////////////////////////////// -TasAutoMutex::TasAutoMutex(void * mutex, bool take) { +TasAutoMutex::TasAutoMutex(void **mutex, const char *name, int maxWait, bool take) { if (mutex) { - if (take) { - xSemaphoreTakeRecursive(mutex, portMAX_DELAY); - this->taken = true; + if (!(*mutex)){ + TasAutoMutex::init(mutex); + } + this->mutex = (SemaphoreHandle_t)*mutex; + this->maxWait = maxWait; + this->name = name; + if (take) { + this->taken = xSemaphoreTakeRecursive(this->mutex, this->maxWait); + if (!this->taken){ + Serial.printf("\r\nMutexfail %s\r\n", this->name); + } } - this->mutex = (SemaphoreHandle_t)mutex; } else { this->mutex = (SemaphoreHandle_t)nullptr; } @@ -179,14 +191,17 @@ void TasAutoMutex::give() { void TasAutoMutex::take() { if (this->mutex) { if (!this->taken) { - xSemaphoreTakeRecursive(this->mutex, portMAX_DELAY); - this->taken = true; + this->taken = xSemaphoreTakeRecursive(this->mutex, this->maxWait); + if (!this->taken){ + Serial.printf("\r\nMutexfail %s\r\n", this->name); + } } } } #endif // ESP32 + /*********************************************************************************************\ * Miscellaneous \*********************************************************************************************/ @@ -2046,7 +2061,7 @@ bool NeedLogRefresh(uint32_t req_loglevel, uint32_t index) { #ifdef ESP32 // this takes the mutex, and will be release when the class is destroyed - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex); #endif // ESP32 // Skip initial buffer fill @@ -2067,7 +2082,7 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l #ifdef ESP32 // this takes the mutex, and will be release when the class is destroyed - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex); #endif // ESP32 if (!index) { // Dump all @@ -2110,12 +2125,9 @@ bool GetLog(uint32_t req_loglevel, uint32_t* index_p, char** entry_pp, size_t* l void AddLogData(uint32_t loglevel, const char* log_data) { #ifdef ESP32 - if (!TasmotaGlobal.log_buffer_mutex) { - TasAutoMutex::init(&TasmotaGlobal.log_buffer_mutex); - } // this takes the mutex, and will be release when the class is destroyed - // i.e. when the functon leaves You CAN call mutex.give() to leave early. - TasAutoMutex mutex(TasmotaGlobal.log_buffer_mutex); + TasAutoMutex mutex(&TasmotaGlobal.log_buffer_mutex); #endif // ESP32 char mxtime[14]; // "13:45:21.999 " From e1e413490e3b6806683dbeac2a7295769432e4f1 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sat, 2 Jan 2021 11:07:50 +0100 Subject: [PATCH 078/255] move ft5206 lib --- lib/{lib_i2c => lib_display}/FT5206_Library/.gitignore | 0 lib/{lib_i2c => lib_display}/FT5206_Library/LICENSE | 0 lib/{lib_i2c => lib_display}/FT5206_Library/README.md | 0 lib/{lib_i2c => lib_display}/FT5206_Library/keywords.txt | 0 lib/{lib_i2c => lib_display}/FT5206_Library/library.properties | 0 lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.cpp | 0 lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.h | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename lib/{lib_i2c => lib_display}/FT5206_Library/.gitignore (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/LICENSE (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/README.md (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/keywords.txt (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/library.properties (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.cpp (100%) rename lib/{lib_i2c => lib_display}/FT5206_Library/src/FT5206.h (100%) diff --git a/lib/lib_i2c/FT5206_Library/.gitignore b/lib/lib_display/FT5206_Library/.gitignore similarity index 100% rename from lib/lib_i2c/FT5206_Library/.gitignore rename to lib/lib_display/FT5206_Library/.gitignore diff --git a/lib/lib_i2c/FT5206_Library/LICENSE b/lib/lib_display/FT5206_Library/LICENSE similarity index 100% rename from lib/lib_i2c/FT5206_Library/LICENSE rename to lib/lib_display/FT5206_Library/LICENSE diff --git a/lib/lib_i2c/FT5206_Library/README.md b/lib/lib_display/FT5206_Library/README.md similarity index 100% rename from lib/lib_i2c/FT5206_Library/README.md rename to lib/lib_display/FT5206_Library/README.md diff --git a/lib/lib_i2c/FT5206_Library/keywords.txt b/lib/lib_display/FT5206_Library/keywords.txt similarity index 100% rename from lib/lib_i2c/FT5206_Library/keywords.txt rename to lib/lib_display/FT5206_Library/keywords.txt diff --git a/lib/lib_i2c/FT5206_Library/library.properties b/lib/lib_display/FT5206_Library/library.properties similarity index 100% rename from lib/lib_i2c/FT5206_Library/library.properties rename to lib/lib_display/FT5206_Library/library.properties diff --git a/lib/lib_i2c/FT5206_Library/src/FT5206.cpp b/lib/lib_display/FT5206_Library/src/FT5206.cpp similarity index 100% rename from lib/lib_i2c/FT5206_Library/src/FT5206.cpp rename to lib/lib_display/FT5206_Library/src/FT5206.cpp diff --git a/lib/lib_i2c/FT5206_Library/src/FT5206.h b/lib/lib_display/FT5206_Library/src/FT5206.h similarity index 100% rename from lib/lib_i2c/FT5206_Library/src/FT5206.h rename to lib/lib_display/FT5206_Library/src/FT5206.h From 78ce7b142d2d169927c6970dc32054ee116f8cf0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 12:23:30 +0100 Subject: [PATCH 079/255] Tune log string stack usage --- tasmota/xdrv_09_timers.ino | 2 +- tasmota/xdrv_99_debug.ino | 8 +++---- tasmota/xsns_36_mgc3130.ino | 48 +++++++++++++++++-------------------- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/tasmota/xdrv_09_timers.ino b/tasmota/xdrv_09_timers.ino index e2a66cfd0..c40045a31 100644 --- a/tasmota/xdrv_09_timers.ino +++ b/tasmota/xdrv_09_timers.ino @@ -880,7 +880,7 @@ void HandleTimerConfiguration(void) void TimerSaveSettings(void) { char tmp[MAX_TIMERS *12]; // Need space for MAX_TIMERS x 10 digit numbers separated by a comma - char message[LOGSZ]; + char message[32 + (MAX_TIMERS *11)]; // MQT: Timers 0,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000 Timer timer; Settings.flag3.timers_enable = Webserver->hasArg("e0"); // CMND_TIMERS diff --git a/tasmota/xdrv_99_debug.ino b/tasmota/xdrv_99_debug.ino index c4aeda6e6..46bfa441e 100644 --- a/tasmota/xdrv_99_debug.ino +++ b/tasmota/xdrv_99_debug.ino @@ -258,7 +258,7 @@ void DebugRtcDump(char* parms) maxrow = srow + mrow; } - char log_data[LOGSZ]; + char log_data[100]; // 020: C7 2B 2E AB 70 E8 09 AE C8 88 3D EA 7C FF 48 2F | +. p = | H/| for (row = srow; row < maxrow; row++) { idx = row * CFG_COLS; snprintf_P(log_data, sizeof(log_data), PSTR("%03X:"), idx); @@ -310,7 +310,7 @@ void DebugDump(uint32_t start, uint32_t size) { maxrow = srow + mrow; } - char log_data[LOGSZ]; + char log_data[150]; // 020: C7 2B 2E AB 70 E8 09 AE C8 88 3D EA 7C FF 48 2F 0E A7 D7 BF 02 0E D7 7D C9 6F B9 3A 1D 01 3F 28 | +. p = | H/ } o : ?(| for (row = srow; row < maxrow; row++) { idx = row * CFG_COLS; snprintf_P(log_data, sizeof(log_data), PSTR("%03X:"), idx); @@ -361,7 +361,7 @@ void DebugCfgDump(char* parms) maxrow = srow + mrow; } - char log_data[LOGSZ]; + char log_data[100]; // 020: 6D 75 73 31 3A 38 30 2F 61 70 69 2F 61 72 64 75 |mus1:80/api/ardu| for (row = srow; row < maxrow; row++) { idx = row * CFG_COLS; snprintf_P(log_data, sizeof(log_data), PSTR("%03X:"), idx); @@ -397,7 +397,7 @@ void DebugCfgPeek(char* parms) uint16_t data16 = (buffer[address +1] << 8) + buffer[address]; uint32_t data32 = (buffer[address +3] << 24) + (buffer[address +2] << 16) + data16; - char log_data[LOGSZ]; + char log_data[100]; // 000: 09 12 00 10 | | 0x09 (9), 0x1209 (4617), 0x10001209 (268440073) snprintf_P(log_data, sizeof(log_data), PSTR("%03X:"), address); for (uint32_t i = 0; i < 4; i++) { snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X"), log_data, buffer[address +i]); diff --git a/tasmota/xsns_36_mgc3130.ino b/tasmota/xsns_36_mgc3130.ino index 6ab7ed4d4..c68714419 100644 --- a/tasmota/xsns_36_mgc3130.ino +++ b/tasmota/xsns_36_mgc3130.ino @@ -238,7 +238,6 @@ void MGC3130_sendMessage(uint8_t data[], uint8_t length){ void MGC3130_handleGesture(){ - //char log[LOGSZ]; char edge[5]; if (MGC_data.out.gestureInfo.edgeFlick){ snprintf_P(edge, sizeof(edge), PSTR("ED_")); @@ -248,141 +247,138 @@ void MGC3130_handleGesture(){ } switch(MGC_data.out.gestureInfo.gestureCode){ case MGC3130_GESTURE_GARBAGE: - //snprintf_P(log, sizeof(log), PSTR("NONE")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("NONE")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("NONE")); break; case MGC3130_FLICK_WEST_EAST: - //snprintf_P(log, sizeof(log), PSTR("%sFL_WE"), edge); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("%sFL_WE"), edge); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("%sFL_WE"), edge); break; case MGC3130_FLICK_EAST_WEST: - //snprintf_P(log, sizeof(log), PSTR("%sFL_EW"), edge); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("%sFL_EW"), edge); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("%sFL_EW"), edge); break; case MGC3130_FLICK_SOUTH_NORTH: - //snprintf_P(log, sizeof(log), PSTR("%sFL_SN"), edge); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("%sFL_SN"), edge); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("%sFL_SN"), edge); break; case MGC3130_FLICK_NORTH_SOUTH: - //snprintf_P(log, sizeof(log), PSTR("%sFL_NS"), edge); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("%sFL_NS"), edge); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("%sFL_NS"), edge); break; case MGC3130_CIRCLE_CLOCKWISE: - //snprintf_P(log, sizeof(log), PSTR("CW")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("CW")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("CW")); break; case MGC3130_CIRCLE_CCLOCKWISE: - //snprintf_P(log, sizeof(log), PSTR("CCW")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("CCW")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("CCW")); break; } - //AddLog_P(LOG_LEVEL_DEBUG, log); } bool MGC3130_handleTouch(){ - //char log[LOGSZ]; bool success = false; // if we find a touch of higher order, we are done if (MGC_data.out.touchInfo.doubleTapCentre && !success){ - //snprintf_P(log, sizeof(log), PSTR("DTAP_CENTRE")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("DTAP_CENTRE")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("DT_C")); MGC3130_touchTimeout = 5; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.doubleTapEast && !success){ - //snprintf_P(log, sizeof(log), PSTR("DTAP_EAST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("DTAP_EAST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("DT_E")); MGC3130_touchTimeout = 5; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.doubleTapNorth && !success){ - //snprintf_P(log, sizeof(log), PSTR("DTAP_NORTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("DTAP_NORTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("DT_N")); MGC3130_touchTimeout = 5; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.doubleTapWest && !success){ - //snprintf_P(log, sizeof(log), PSTR("DTAP_WEST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("DTAP_WEST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("DT_W")); MGC3130_touchTimeout = 5; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.doubleTapSouth && !success){ - //snprintf_P(log, sizeof(log), PSTR("DTAP_SOUTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("DTAP_SOUTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("DT_S")); MGC3130_touchTimeout = 5; success = true; MGC3130_touchCounter = 1; } if (MGC_data.out.touchInfo.tapCentre && !success){ - //snprintf_P(log, sizeof(log), PSTR("TAP_CENTRE")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TAP_CENTRE")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TP_C")); MGC3130_touchTimeout = 2; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.tapEast && !success){ - //snprintf_P(log, sizeof(log), PSTR("TAP_EAST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TAP_EAST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TP_E")); MGC3130_touchTimeout = 2; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.tapNorth && !success){ - //snprintf_P(log, sizeof(log), PSTR("TAP_NORTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TAP_NORTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TP_N")); MGC3130_touchTimeout = 2; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.tapWest && !success){ - //snprintf_P(log, sizeof(log), PSTR("TAP_WEST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TAP_WEST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TP_W")); MGC3130_touchTimeout = 2; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.tapSouth && !success){ - //snprintf_P(log, sizeof(log), PSTR("TAP_SOUTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TAP_SOUTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TP_S")); MGC3130_touchTimeout = 2; success = true; MGC3130_touchCounter = 1; } else if (MGC_data.out.touchInfo.touchCentre && !success){ - //snprintf_P(log, sizeof(log), PSTR("TOUCH_CENTRE")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TOUCH_CENTRE")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TH_C")); success = true; MGC3130_touchCounter++; // This will reset to 0 after touching for approx. 1h and 50 minutes ;) } else if (MGC_data.out.touchInfo.touchEast && !success){ - //snprintf_P(log, sizeof(log), PSTR("TOUCH_EAST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TOUCH_EAST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TH_E")); success = true; MGC3130_touchCounter++; } else if (MGC_data.out.touchInfo.touchNorth && !success){ - //snprintf_P(log, sizeof(log), PSTR("TOUCH_NORTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TOUCH_NORTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TH_N")); success = true; MGC3130_touchCounter++; } else if (MGC_data.out.touchInfo.touchWest && !success){ - //snprintf_P(log, sizeof(log), PSTR("TOUCH_WEST")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TOUCH_WEST")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TH_W")); success = true; MGC3130_touchCounter++; } else if (MGC_data.out.touchInfo.touchSouth && !success){ - //snprintf_P(log, sizeof(log), PSTR("TOUCH_SOUTH")); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("TOUCH_SOUTH")); snprintf_P(MGC3130_currentGesture, sizeof(MGC3130_currentGesture), PSTR("TH_S")); success = true; MGC3130_touchCounter++; } - //AddLog_P(LOG_LEVEL_DEBUG, log); return success; } From cb45eb52019a9aa4c80740f3eabd6eacaa0fd50b Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Sat, 2 Jan 2021 13:26:18 +0100 Subject: [PATCH 080/255] fixes DisplayMode 1-5 support for ILI9342_2 driver --- tasmota/xdsp_13_ILI9341-2.ino | 84 ++++++++++++++++++++++++++++++++++- 1 file changed, 83 insertions(+), 1 deletion(-) diff --git a/tasmota/xdsp_13_ILI9341-2.ino b/tasmota/xdsp_13_ILI9341-2.ino index 48cd486f9..6095b5c53 100644 --- a/tasmota/xdsp_13_ILI9341-2.ino +++ b/tasmota/xdsp_13_ILI9341-2.ino @@ -95,8 +95,9 @@ void ILI9341_2_InitDriver() // Welcome text renderer->setTextFont(2); renderer->setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK); - renderer->DrawStringAt(30, 100, "ILI9341 TFT!", ILI9341_2_WHITE,0); + renderer->DrawStringAt(20, 140, "ILI9341 TFT!", ILI9341_2_RED,0); delay(1000); + renderer->clearDisplay(); #endif color_type = COLOR_COLOR; @@ -174,6 +175,77 @@ ili9342_ctouch_counter++; #endif // ESP32 +#ifdef USE_DISPLAY_MODES1TO5 + +void ILI9341_2_PrintLog(bool withDateTime) { + disp_refresh--; + if (!disp_refresh) { + disp_refresh = Settings.display_refresh; + if (!disp_screen_buffer_cols) { DisplayAllocScreenBuffer(); } + + char* txt = DisplayLogBuffer('\370'); + if (txt != NULL) { + uint8_t last_row = Settings.display_rows -1; + + renderer->clearDisplay(); /** TODO: Would be smoother without clear, like ILI9341_2_Time() does. **/ + renderer->setCursor(0,0); + + if (withDateTime) { + char line[21]; + snprintf_P(line, sizeof(line), PSTR("%02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d %02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.hour, RtcTime.minute, RtcTime.second, RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [12:34:56 31-12-2021] + renderer->setTextColor(ILI9341_2_BLUE); + renderer->println(line); + renderer->setTextColor(fg_color); + last_row--; + } + + for (byte i = 0; i < last_row; i++) { + strlcpy(disp_screen_buffer[i], disp_screen_buffer[i +1], disp_screen_buffer_cols); + renderer->println(disp_screen_buffer[i]); + } + strlcpy(disp_screen_buffer[last_row], txt, disp_screen_buffer_cols); + DisplayFillScreen(last_row); + + AddLog_P(LOG_LEVEL_DEBUG, PSTR(D_LOG_DEBUG "[%s]"), disp_screen_buffer[last_row]); + + renderer->println(disp_screen_buffer[last_row]); + renderer->Updateframe(); + } + } +} + +void ILI9341_2_Time(void) { + char line[12]; + /** TODO: DisplaySize is working, but renderer->println() does not respect DisplayFont **/ + snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ] + renderer->setCursor(60, 140); + renderer->println(line); + snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018] + renderer->setCursor(60, 160); + renderer->println(line); + renderer->Updateframe(); +} + +void ILI9341_2_Refresh(void) { // Every second + if (Settings.display_mode) { // Mode 0 is User text + switch (Settings.display_mode) { + case 1: // Time + ILI9341_2_Time(); + break; + case 2: // Local + case 4: // Mqtt + ILI9341_2_PrintLog(false); + break; + case 3: // Local + Time + case 5: // Mqtt + Time + ILI9341_2_PrintLog(true); + break; + } + } +} + +#endif // USE_DISPLAY_MODES1TO5 + /*********************************************************************************************/ /*********************************************************************************************\ * Interface @@ -190,6 +262,11 @@ bool Xdsp13(uint8_t function) case FUNC_DISPLAY_MODEL: result = true; break; + case FUNC_DISPLAY_TEXT_SIZE: + case FUNC_DISPLAY_FONT_SIZE: + case DISPLAY_INIT_MODE: + renderer->clearDisplay(); + break; #ifdef USE_FT5206 #ifdef USE_TOUCH_BUTTONS case FUNC_DISPLAY_EVERY_50_MSECOND: @@ -199,6 +276,11 @@ bool Xdsp13(uint8_t function) break; #endif // USE_TOUCH_BUTTONS #endif // USE_FT5206 +#ifdef USE_DISPLAY_MODES1TO5 + case FUNC_DISPLAY_EVERY_SECOND: + ILI9341_2_Refresh(); + break; +#endif // USE_DISPLAY_MODES1TO5 } } return result; From 708d231c9cd80aff0ba977ac5f8396494835d809 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 14:59:02 +0100 Subject: [PATCH 081/255] Reduce generic log buffer to 128 chars --- tasmota/support.ino | 33 ++++++++++++++++++++++++++------- tasmota/xdrv_02_mqtt.ino | 8 +++++--- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 4845e8115..78c7f93dc 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -147,7 +147,7 @@ class TasAutoMutex { TasAutoMutex::TasAutoMutex(void **mutex, const char *name, int maxWait, bool take) { if (mutex) { if (!(*mutex)){ - TasAutoMutex::init(mutex); + TasAutoMutex::init(mutex); } this->mutex = (SemaphoreHandle_t)*mutex; this->maxWait = maxWait; @@ -2172,12 +2172,22 @@ void AddLogData(uint32_t loglevel, const char* log_data) { void AddLog_P(uint32_t loglevel, PGM_P formatP, ...) { - char log_data[LOGSZ]; + char log_data[132]; va_list arg; va_start(arg, formatP); - vsnprintf_P(log_data, sizeof(log_data), formatP, arg); + uint32_t len = vsnprintf_P(log_data, 129, formatP, arg); va_end(arg); + if (len > 128) { strcat(log_data, "..."); } // Actual data is more + +#ifdef DEBUG_TASMOTA_CORE + // Profile max_len + static uint32_t max_len = 0; + if (len > max_len) { + max_len = len; + Serial.printf("PRF: AddLog_P %d\n", max_len); + } +#endif AddLogData(loglevel, log_data); } @@ -2188,9 +2198,18 @@ void AddLog_Debug(PGM_P formatP, ...) va_list arg; va_start(arg, formatP); - vsnprintf_P(log_data, sizeof(log_data), formatP, arg); + uint32_t len = vsnprintf_P(log_data, sizeof(log_data), formatP, arg); va_end(arg); +#ifdef DEBUG_TASMOTA_CORE + // Profile max_len + static uint32_t max_len = 0; + if (len > max_len) { + max_len = len; + Serial.printf("PRF: AddLog_Debug %d\n", max_len); + } +#endif + AddLogData(LOG_LEVEL_DEBUG, log_data); } @@ -2211,13 +2230,13 @@ void AddLogMissed(const char *sensor, uint32_t misses) } void AddLogBufferSize(uint32_t loglevel, uint8_t *buffer, uint32_t count, uint32_t size) { - char log_data[LOGSZ]; + char log_data[4 + (count * size * 3)]; snprintf_P(log_data, sizeof(log_data), PSTR("DMP:")); for (uint32_t i = 0; i < count; i++) { - if (1 == size) { // uint8_t + if (1 == size) { // uint8_t snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X"), log_data, *(buffer)); - } else { // uint16_t + } else { // uint16_t snprintf_P(log_data, sizeof(log_data), PSTR("%s %02X%02X"), log_data, *(buffer +1), *(buffer)); } buffer += size; diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino index 81de886f4..471d55ff4 100644 --- a/tasmota/xdrv_02_mqtt.ino +++ b/tasmota/xdrv_02_mqtt.ino @@ -218,11 +218,13 @@ bool MqttPublishLib(const char* topic, bool retained) { return result; } +#ifdef DEBUG_TASMOTA_CORE void MqttDumpData(char* topic, char* data, uint32_t data_len) { char dump_data[data_len +1]; memcpy(dump_data, data, sizeof(dump_data)); // Make another copy for removing optional control characters - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_MQTT D_DATA_SIZE " %d, \"%s %s\""), data_len, topic, RemoveControlCharacter(dump_data)); + DEBUG_CORE_LOG(PSTR(D_LOG_MQTT "Size %d, \"%s %s\""), data_len, topic, RemoveControlCharacter(dump_data)); } +#endif void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len) { #ifdef USE_DEBUG_DRIVER @@ -248,9 +250,9 @@ void MqttDataHandler(char* mqtt_topic, uint8_t* mqtt_data, unsigned int data_len char data[data_len +1]; memcpy(data, mqtt_data, sizeof(data)); -// AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_MQTT D_DATA_SIZE " %d, \"%s %s\""), data_len, topic, data); -// if (LOG_LEVEL_DEBUG_MORE <= TasmotaGlobal.seriallog_level) { Serial.println(data); } +#ifdef DEBUG_TASMOTA_CORE MqttDumpData(topic, data, data_len); // Use a function to save stack space used by dump_data +#endif // MQTT pre-processing XdrvMailbox.index = strlen(topic); From 827a1e7764f0ab92eab6dd8b4de85e6d5220b957 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 15:47:03 +0100 Subject: [PATCH 082/255] Refactor shutter logging --- tasmota/xdrv_27_shutter.ino | 81 +++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index ed6e72c57..cd54878d7 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -107,7 +107,7 @@ void ShutterLogPos(uint32_t i) { char stemp2[10]; dtostrfd((float)Shutter[i].time / STEPS_PER_SECOND, 2, stemp2); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shutter %d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d"), + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d"), i+1, Shutter[i].real_position, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction, Shutter[i].motordelay, stemp2, Shutter[i].pwm_velocity, Shutter[i].pwm_value); } @@ -144,7 +144,7 @@ void ShutterRtc50mS(void) case SHT_COUNTER: if (Shutter[i].accelerator) { - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: accelerator i=%d -> %d"),i, Shutter[i].accelerator); + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Accelerator i=%d -> %d"),i, Shutter[i].accelerator); ShutterUpdateVelocity(i); analogWriteFreq(Shutter[i].pwm_velocity); analogWrite(Pin(GPIO_PWM1, i), 50); @@ -173,15 +173,15 @@ int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) for (uint32_t k = 0; k < 5; k++) { if ((percent * 10) >= Settings.shuttercoeff[k][index]) { realpos = SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[k+1], 100); - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realposition TEMP1: %d, %d %%, coeff %d"), realpos, percent, Settings.shuttercoeff[k][index]); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Realposition TEMP1: %d, %d %%, coeff %d"), realpos, percent, Settings.shuttercoeff[k][index]); } else { - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Shutter[%d].open_max: %d"),index, Shutter[index].open_max); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Shutter[%d].open_max: %d"),index, Shutter[index].open_max); if (0 == k) { realpos = SHT_DIV_ROUND((int64_t)percent * Shutter[index].open_max * calibrate_pos[k+1], Settings.shuttercoeff[k][index]*10 ); - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realposition TEMP3: %d, %d %%, coeff %d"), realpos, percent, Settings.shuttercoeff[k][index]); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Realposition TEMP3: %d, %d %%, coeff %d"), realpos, percent, Settings.shuttercoeff[k][index]); } else { //uint32_t addon = ( percent*10 - Settings.shuttercoeff[k-1][index] ) * Shutter[index].open_max * (calibrate_pos[k+1] - calibrate_pos[k]) / (Settings.shuttercoeff[k][index] -Settings.shuttercoeff[k-1][index]) / 100; - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realposition TEMP2: %d, %d %%, coeff %d"), addon, (calibrate_pos[k+1] - calibrate_pos[k]), (Settings.shuttercoeff[k][index] -Settings.shuttercoeff[k-1][index])); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Realposition TEMP2: %d, %d %%, coeff %d"), addon, (calibrate_pos[k+1] - calibrate_pos[k]), (Settings.shuttercoeff[k][index] -Settings.shuttercoeff[k-1][index])); realpos += SHT_DIV_ROUND(((int64_t)percent*10 - Settings.shuttercoeff[k-1][index] ) * Shutter[index].open_max * (calibrate_pos[k+1] - calibrate_pos[k]), (Settings.shuttercoeff[k][index] - Settings.shuttercoeff[k-1][index])*100); } break; @@ -200,15 +200,15 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) for (uint32_t j = 0; j < 5; j++) { if (realpos >= Shutter[index].open_max * calibrate_pos[j+1] / 100) { realpercent = SHT_DIV_ROUND(Settings.shuttercoeff[j][index], 10); - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realpercent TEMP1: %d %%, %d, coeff %d"), realpercent, realpos, Shutter[index].open_max * calibrate_pos[j+1] / 100); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Realpercent TEMP1: %d %%, %d, coeff %d"), realpercent, realpos, Shutter[index].open_max * calibrate_pos[j+1] / 100); } else { - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Shutter[%d].open_max: %d"),index, Shutter[index].open_max); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Shutter[%d].open_max: %d"),index, Shutter[index].open_max); if (0 == j) { realpercent = SHT_DIV_ROUND(((int64_t)realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * Settings.shuttercoeff[j][index], calibrate_pos[j+1]/10*Shutter[index].open_max); } else { //uint16_t addon = ( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) * 10 * (Settings.shuttercoeff[j][index] - Settings.shuttercoeff[j-1][index]) / (calibrate_pos[j+1] - calibrate_pos[j])/Shutter[index].open_max; //uint16_t addon = ( realpercent*10 - Settings.shuttercoeff[j-1][index] ) * Shutter[index].open_max * (calibrate_pos[j+1] - calibrate_pos[j]) / (Settings.shuttercoeff[j][index] -Settings.shuttercoeff[j-1][index]) / 100; - //AddLog_P(LOG_LEVEL_ERROR, PSTR("Realpercent TEMP2: %d %%, delta %d, %d, coeff %d"), addon,( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) , (calibrate_pos[j+1] - calibrate_pos[j])* Shutter[index].open_max/100, (Settings.shuttercoeff[j][index] -Settings.shuttercoeff[j-1][index])); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Realpercent TEMP2: %d %%, delta %d, %d, coeff %d"), addon,( realpos - (Shutter[index].open_max * calibrate_pos[j] / 100) ) , (calibrate_pos[j+1] - calibrate_pos[j])* Shutter[index].open_max/100, (Settings.shuttercoeff[j][index] -Settings.shuttercoeff[j-1][index])); realpercent += SHT_DIV_ROUND(((int64_t)realpos - SHT_DIV_ROUND(Shutter[index].open_max * calibrate_pos[j], 100)) * (Settings.shuttercoeff[j][index] - Settings.shuttercoeff[j-1][index]), (calibrate_pos[j+1] - calibrate_pos[j])/10*Shutter[index].open_max) ; } break; @@ -251,10 +251,10 @@ void ShutterInit(void) if (Settings.shutter_mode == SHT_UNDEF) { bool relay_in_interlock = false; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: mode undef.. calculate...")); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Mode undef.. calculate...")); for (uint32_t j = 0; j < MAX_INTERLOCKS * Settings.flag.interlock; j++) { // CMND_INTERLOCK - Enable/disable interlock - //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Interlock state i=%d %d, flag %d, , shuttermask %d, maskedIL %d"),i, Settings.interlock[i], Settings.flag.interlock,ShutterGlobal.RelayShutterMask, Settings.interlock[i]&ShutterGlobal.RelayShutterMask); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Interlock state i=%d %d, flag %d, Shuttermask %d, MaskedIL %d"),i, Settings.interlock[i], Settings.flag.interlock,ShutterGlobal.RelayShutterMask, Settings.interlock[i]&ShutterGlobal.RelayShutterMask); if (Settings.interlock[j] && (Settings.interlock[j] & ShutterGlobal.RelayShutterMask)) { //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Relay in Interlock group")); relay_in_interlock = true; @@ -293,7 +293,7 @@ void ShutterInit(void) Settings.shuttercoeff[1][i] = Shutter[i].open_max/10 * (100 - Settings.shutter_set50percent[i] ) / 5000 ; Settings.shuttercoeff[0][i] = Shutter[i].open_max/100 - (Settings.shuttercoeff[1][i] * 10); Settings.shuttercoeff[2][i] = (int32_t)(Settings.shuttercoeff[0][i]*10 + 5 * Settings.shuttercoeff[1][i]) / 5; - //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT%d: Shutter[i].open_max %d, 50perc:%d, 0:%d, 1:%d 2:%d"), i, Shutter[i].open_max, Settings.shutter_set50percent[i], Settings.shuttercoeff[0][i],Settings.shuttercoeff[1][i],Settings.shuttercoeff[2][i]); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Shutter[i].open_max %d, 50perc:%d, 0:%d, 1:%d 2:%d"), i, Shutter[i].open_max, Settings.shutter_set50percent[i], Settings.shuttercoeff[0][i],Settings.shuttercoeff[1][i],Settings.shuttercoeff[2][i]); } ShutterGlobal.RelayShutterMask |= 3 << (Settings.shutter_startrelay[i] -1); @@ -313,8 +313,8 @@ void ShutterInit(void) } Shutter[i].close_velocity_max = ShutterGlobal.open_velocity_max*Shutter[i].open_time / Shutter[i].close_time; - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d Openvel %d, Closevel: %d"),i, ShutterGlobal.open_velocity_max, Shutter[i].close_velocity_max); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT%d: Init. Pos: %d,inverted %d, locked %d, end stop time enabled %d, webButtons inverted %d"), + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Openvel %d, Closevel: %d"),i, ShutterGlobal.open_velocity_max, Shutter[i].close_velocity_max); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Init. Pos %d, Inverted %d, Locked %d, End stop time enabled %d, webButtons inverted %d"), i+1, Shutter[i].real_position, (Settings.shutter_options[i]&1) ? 1 : 0, (Settings.shutter_options[i]&2) ? 1 : 0, (Settings.shutter_options[i]&4) ? 1 : 0, (Settings.shutter_options[i]&8) ? 1 : 0); @@ -338,7 +338,7 @@ void ShutterReportPosition(bool always, uint32_t index) n = index+1; } for (i; i < n; i++) { - //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shutter %d: Real Pos: %d"), i+1,Shutter[i].real_position); + //AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real Pos %d"), i+1,Shutter[i].real_position); uint32_t position = ShutterRealToPercentPosition(Shutter[i].real_position, i); if (Shutter[i].direction != 0) { TasmotaGlobal.rules_flag.shutter_moving = 1; @@ -352,7 +352,7 @@ void ShutterReportPosition(bool always, uint32_t index) if (always || (TasmotaGlobal.rules_flag.shutter_moving)) { MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_SHUTTER)); // RulesProcess() now re-entry protected } - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: TasmotaGlobal.rules_flag.shutter_moving: %d, moved %d"), TasmotaGlobal.rules_flag.shutter_moving, TasmotaGlobal.rules_flag.shutter_moved); + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: rules_flag.shutter_moving: %d, moved %d"), TasmotaGlobal.rules_flag.shutter_moving, TasmotaGlobal.rules_flag.shutter_moved); } void ShutterLimitRealAndTargetPositions(uint32_t i) { @@ -400,7 +400,7 @@ void ShutterDecellerateForStop(uint8_t i) int16_t missing_steps; Shutter[i].accelerator = -(ShutterGlobal.open_velocity_max / (Shutter[i].motordelay>4 ? (Shutter[i].motordelay*11)/10 : 4) ); while (Shutter[i].pwm_velocity > -2*Shutter[i].accelerator ) { - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: velocity: %ld, delta: %d"), Shutter[i].pwm_velocity, Shutter[i].accelerator ); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Velocity %ld, Delta %d"), Shutter[i].pwm_velocity, Shutter[i].accelerator ); //Shutter[i].pwm_velocity = tmax(Shutter[i].pwm_velocity-Shutter[i].accelerator , 0); // Control will be done in RTC Ticker. delay(50); @@ -408,7 +408,7 @@ void ShutterDecellerateForStop(uint8_t i) if (ShutterGlobal.position_mode == SHT_COUNTER){ missing_steps = ((Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND) - RtcSettings.pulse_counter[i]; //prepare for stop PWM - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d, counter %d, freq %d"), missing_steps, RtcSettings.pulse_counter[i] ,Shutter[i].pwm_velocity); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d, Counter %d, Freq %d"), missing_steps, RtcSettings.pulse_counter[i] ,Shutter[i].pwm_velocity); Shutter[i].accelerator = 0; Shutter[i].pwm_velocity = Shutter[i].pwm_velocity > 250 ? 250 : Shutter[i].pwm_velocity; analogWriteFreq(Shutter[i].pwm_velocity); @@ -420,7 +420,7 @@ void ShutterDecellerateForStop(uint8_t i) } analogWrite(Pin(GPIO_PWM1, i), 0); // removed with 8.3 because of reset caused by watchog Shutter[i].real_position = ShutterCalculatePosition(i); - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Real %d, pulsecount %d, start %d"), Shutter[i].real_position,RtcSettings.pulse_counter[i], Shutter[i].start_position); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Real %d, Pulsecount %d, Start %d"), Shutter[i].real_position,RtcSettings.pulse_counter[i], Shutter[i].start_position); } Shutter[i].direction = 0; @@ -481,9 +481,9 @@ void ShutterUpdatePosition(void) XdrvRulesProcess(); ShutterGlobal.start_reported = 1; } - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: time: %d, toBeAcc %d, current_stop_way %d,vel_cur %d, vel_max %d, act_vel_change %d, min_runtime_ms %d, act.pos %d, next_stop %d, target: %d, max_vel_change %d, dir: %d"),Shutter[i].time,toBeAcc,current_stop_way, - Shutter[i].pwm_velocity,velocity_max, Shutter[i].accelerator,min_runtime_ms,Shutter[i].real_position, next_possible_stop_position,Shutter[i].target_position,velocity_change_per_step_max,Shutter[i].direction); - + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d, toBA %d, cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, nStop %d, Trgt %d, mVelo %d, Dir %d"), + Shutter[i].time, toBeAcc, current_stop_way, Shutter[i].pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, Shutter[i].real_position, + next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction); if ( Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction || Shutter[i].pwm_velocity> (Settings.shutter_startrelay[i] -1)) & 3) && SRC_IGNORE != TasmotaGlobal.last_source && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; uint8 manual_relays_changed = ((ShutterGlobal.RelayCurrentMask >> (Settings.shutter_startrelay[i] -1)) & 3) && SRC_SHUTTER != TasmotaGlobal.last_source && SRC_PULSETIMER != TasmotaGlobal.last_source ; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d: source: %s, powerstate_local %ld, ShutterGlobal.RelayCurrentMask %d, manual change %d"), i+1, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Source %s, Powerstate %ld, RelayMask %d, ManualChange %d"), + i+1, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); if (manual_relays_changed) { //ShutterGlobal.skip_relay_change = true; ShutterLimitRealAndTargetPositions(i); @@ -613,7 +614,8 @@ void ShutterRelayChanged(void) if (Shutter[i].direction != 0 && powerstate_local) { Shutter[i].target_position = Shutter[i].real_position; powerstate_local = 0; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d: Switch OFF motor. Target: %ld, source: %s, powerstate_local %ld, ShutterGlobal.RelayCurrentMask %d, manual change %d"), i+1, Shutter[i].target_position, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Switch OFF motor. Target %ld, Source %s, Powerstate %ld, RelayMask %d, ManualChange %d"), + i+1, Shutter[i].target_position, GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource), powerstate_local,ShutterGlobal.RelayCurrentMask,manual_relays_changed); } break; default: @@ -635,7 +637,7 @@ void ShutterRelayChanged(void) ShutterStartInit(i, -1, 0); break; default: - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d: Switch OFF motor."),i); + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i); Shutter[i].target_position = Shutter[i].real_position; } break; @@ -648,7 +650,7 @@ void ShutterRelayChanged(void) ShutterStartInit(i, -1, 0); break; default: - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d: Switch OFF motor."),i); + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Switch OFF motor."),i); Shutter[i].target_position = Shutter[i].real_position; } break; @@ -656,7 +658,7 @@ void ShutterRelayChanged(void) switch (powerstate_local) { case 1: ShutterStartInit(i, Shutter[i].lastdirection*-1 , Shutter[i].lastdirection == 1 ? 0 : Shutter[i].open_max); - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d Garage. NewTarget %d"), i, Shutter[i].target_position); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Garage. NewTarget %d"), i, Shutter[i].target_position); break; default: Shutter[i].target_position = Shutter[i].real_position; @@ -664,7 +666,7 @@ void ShutterRelayChanged(void) } // switch (ShutterGlobal.position_mode) - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shutter %d: Target: %ld, powerstatelocal %d"), i+1, Shutter[i].target_position, powerstate_local); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Target %ld, Powerstatelocal %d"), i+1, Shutter[i].target_position, powerstate_local); } // if (manual_relays_changed) } // for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) } @@ -755,15 +757,16 @@ void ShutterButtonHandler(void) // check for simultaneous shutter button press uint32 min_shutterbutton_press_counter = -1; // -1 == max(uint32) for (uint32_t i = 0; i < MAX_KEYS; i++) { - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Settings.shutter_button[i] %ld, shutter_index %d, Button.press_counter[i] %d, min_shutterbutton_press_counter %d, i %d"), Settings.shutter_button[i], shutter_index, Button.press_counter[i] , min_shutterbutton_press_counter, i); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: ShutterButton[i] %ld, ShutterIndex %d, ButtonPressCounter[i] %d, minShutterButtonPressCounter %d, i %d"), + Settings.shutter_button[i], shutter_index, Button.press_counter[i] , min_shutterbutton_press_counter, i); if ((button_index != i) && (Settings.shutter_button[i] & (1<<31)) && ((Settings.shutter_button[i] & 0x03) == shutter_index) && (i != button_index) && (Button.press_counter[i] < min_shutterbutton_press_counter)) { min_shutterbutton_press_counter = Button.press_counter[i]; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: min_shutterbutton_press_counter %d"), min_shutterbutton_press_counter); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: minShutterButtonPressCounter %d"), min_shutterbutton_press_counter); } } if (min_shutterbutton_press_counter == Button.press_counter[button_index]) { // simultaneous shutter button press detected - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: simultanous presss deteced")); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Simultanous press detected")); press_index = Button.press_counter[button_index]; for (uint32_t i = 0; i < MAX_KEYS; i++) if ((Settings.shutter_button[i] & (1<<31)) && ((Settings.shutter_button[i] & 0x03) != shutter_index)) @@ -810,7 +813,7 @@ void ShutterButtonHandler(void) if (Settings.shutter_startrelay[shutter_index] && Settings.shutter_startrelay[shutter_index] <9) { uint8_t pos_press_index = (buttonState == SHT_PRESSED_HOLD) ? 3 : (press_index-1); if (pos_press_index>3) pos_press_index=3; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: shutter %d, button %d = %d (single=1, double=2, tripple=3, hold=4)"), shutter_index+1, button_index+1, pos_press_index+1); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Button %d = %d (single=1, double=2, tripple=3, hold=4)"), shutter_index+1, button_index+1, pos_press_index+1); XdrvMailbox.index = shutter_index +1; TasmotaGlobal.last_source = SRC_BUTTON; XdrvMailbox.data_len = 0; @@ -828,7 +831,7 @@ void ShutterButtonHandler(void) CmndShutterStop(); } else { XdrvMailbox.payload = position = (position-1)<<1; - //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: shutter %d -> %d"), shutter_index+1, position); + //AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d -> %d"), shutter_index+1, position); if (102 == position) { XdrvMailbox.payload = XdrvMailbox.index; CmndShutterToggle(); @@ -1398,7 +1401,7 @@ void CmndShutterPwmRange(void) } Settings.shutter_pwmrange[i][XdrvMailbox.index -1] = field; } - AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT%d: Init1. pwmmin %d, pwmmax %d"), XdrvMailbox.index , Settings.shutter_pwmrange[0][XdrvMailbox.index -1], Settings.shutter_pwmrange[1][XdrvMailbox.index -1]); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Init1. pwmmin %d, pwmmax %d"), XdrvMailbox.index , Settings.shutter_pwmrange[0][XdrvMailbox.index -1], Settings.shutter_pwmrange[1][XdrvMailbox.index -1]); ShutterInit(); ResponseCmndIdxChar(XdrvMailbox.data); } else { @@ -1431,7 +1434,7 @@ void CmndShutterCalibration(void) Settings.shutter_set50percent[XdrvMailbox.index -1] = 50; for (i = 0; i < 5; i++) { Settings.shuttercoeff[i][XdrvMailbox.index -1] = SHT_DIV_ROUND((uint32_t)messwerte[i] * 1000, messwerte[4]); - AddLog_P(LOG_LEVEL_DEBUG, PSTR("Settings.shuttercoeff: %d, i: %d, value: %d, messwert %d"), i,XdrvMailbox.index -1,Settings.shuttercoeff[i][XdrvMailbox.index -1], messwerte[i]); + AddLog_P(LOG_LEVEL_DEBUG, PSTR("SHT: Shuttercoeff %d, i %d, Value %d, MeasuredValue %d"), i,XdrvMailbox.index -1,Settings.shuttercoeff[i][XdrvMailbox.index -1], messwerte[i]); } ShutterInit(); ResponseCmndIdxChar(XdrvMailbox.data); @@ -1512,7 +1515,7 @@ bool Xdrv27(uint8_t function) char stemp1[10]; // extract the number of the relay that was switched and save for later in Update Position. ShutterGlobal.RelayCurrentMask = XdrvMailbox.index ^ ShutterGlobal.RelayOldMask; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Switched relay: %d by %s"), ShutterGlobal.RelayCurrentMask,GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource)); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Switched relay %d by %s"), ShutterGlobal.RelayCurrentMask,GetTextIndexed(stemp1, sizeof(stemp1), TasmotaGlobal.last_source, kCommandSource)); ShutterRelayChanged(); ShutterGlobal.RelayOldMask = XdrvMailbox.index; break; @@ -1525,10 +1528,10 @@ bool Xdrv27(uint8_t function) } ShutterGlobal.RelayCurrentMask >>= 1; } - //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: skip relay change: %d"),i+1); + //AddLog_P(LOG_LEVEL_ERROR, PSTR("SHT: Skip relay change %d"), i+1); result = true; ShutterGlobal.skip_relay_change = 0; - AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Skipping switch off relay %d"),i); + AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Skipping switch off relay %d"), i); ExecuteCommandPowerShutter(i+1, 0, SRC_SHUTTER); } break; From 0ab125853aebfeb21fbe7552bb098a567f3bfd26 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 16:06:05 +0100 Subject: [PATCH 083/255] Refactor DGR logging --- tasmota/support_device_groups.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/support_device_groups.ino b/tasmota/support_device_groups.ino index 7e589e15e..e5b00cba2 100644 --- a/tasmota/support_device_groups.ino +++ b/tasmota/support_device_groups.ino @@ -423,7 +423,7 @@ void SendReceiveDeviceGroupMessage(struct device_group * device_group, struct de write_log: *log_ptr++ = 0; - AddLog_P(LOG_LEVEL_DEBUG_MORE, log_buffer); + AddLogData(LOG_LEVEL_DEBUG_MORE, log_buffer); // If this is a received status request message, then if the requestor didn't just ack our // previous full status update, send a full status update. From 2a7f4179b1d4653387f190a6c2baf144d552886c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 2 Jan 2021 16:14:32 +0100 Subject: [PATCH 084/255] Odroid has 4Mb PSRAM --- platformio_tasmota_env32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index bad0b800a..1d64e6650 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -41,7 +41,7 @@ extends = env:tasmota32 board = odroid_esp32 board_build.f_cpu = 240000000L board_build.partitions = esp32_partition_app1984k_ffat12M.csv -build_flags = ${common32.build_flags} -DFIRMWARE_ODROID_GO +build_flags = ${common32.build_flags} -DBOARD_HAS_PSRAM=true -DFIRMWARE_ODROID_GO lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_i2c, lib/lib_rf, lib/lib_div, lib/lib_ssl, lib/lib_display [env:tasmota32-minimal] From 83b00e64f84dfce7a42fa0c397f5b3112033b1c4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 2 Jan 2021 16:16:07 +0100 Subject: [PATCH 085/255] add missing odroid go --- platformio_override_sample.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 3f76397af..eaaf59729 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -36,6 +36,7 @@ default_envs = ; tasmota32-ir ; tasmota32-ircustom ; tasmota32solo1 +; tasmota32-odroidgo [common] From 2b7d605696cdb9b90f06e6146e4f9d26072d88ad Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 16:20:15 +0100 Subject: [PATCH 086/255] Changed maximum chars in AddLog_P logging Changed maximum chars in AddLog_P logging reduced from 700 to 128 (LOGSZ) to enhance stability --- CHANGELOG.md | 3 +++ tasmota/support.ino | 14 +++++++------- tasmota/support_command.ino | 6 +++--- tasmota/tasmota.h | 3 ++- tasmota/xdrv_01_webserver.ino | 2 +- tasmota/xdrv_02_mqtt.ino | 2 +- tasmota/xdrv_10_scripter.ino | 4 ++-- tasmota/xdrv_12_home_assistant.ino | 2 +- tasmota/xdrv_16_tuyamcu.ino | 2 +- 9 files changed, 21 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f2844aa8d..649f15289 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,9 @@ All notable changes to this project will be documented in this file. - Replaced SSD1351 GPIO selection from ``SPI CS`` by ``SSD1351 CS`` - Replaced RA8876 GPIO selection from ``SPI CS`` by ``RA8876 CS`` +### Changed +- Maximum chars in AddLog_P logging reduced from 700 to 128 (LOGSZ) to enhance stability + ## [9.2.0.1] 20201229 ### Added - Milliseconds to console output (#10152) diff --git a/tasmota/support.ino b/tasmota/support.ino index 78c7f93dc..8138e39d9 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1321,7 +1321,7 @@ void DumpConvertTable(void) { ResponseAppend_P(PSTR(",")); } jsflg = true; - if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kGpioConvert) -1)) { + if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kGpioConvert) -1)) { ResponseJsonEndEnd(); MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; @@ -1336,7 +1336,7 @@ void DumpConvertTable(void) { ResponseAppend_P(PSTR(",")); } jsflg = true; - if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kAdcNiceList) -1)) { + if ((ResponseAppend_P(PSTR("\"%d\":\"%d\""), i, data) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(kAdcNiceList) -1)) { ResponseJsonEndEnd(); MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; @@ -2065,7 +2065,7 @@ bool NeedLogRefresh(uint32_t req_loglevel, uint32_t index) { #endif // ESP32 // Skip initial buffer fill - if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - LOGSZ) { return false; } + if (strlen(TasmotaGlobal.log_buffer) < LOG_BUFFER_SIZE - MAX_LOGSZ) { return false; } char* line; size_t len; @@ -2172,13 +2172,13 @@ void AddLogData(uint32_t loglevel, const char* log_data) { void AddLog_P(uint32_t loglevel, PGM_P formatP, ...) { - char log_data[132]; + char log_data[LOGSZ +4]; va_list arg; va_start(arg, formatP); - uint32_t len = vsnprintf_P(log_data, 129, formatP, arg); + uint32_t len = vsnprintf_P(log_data, LOGSZ +1, formatP, arg); va_end(arg); - if (len > 128) { strcat(log_data, "..."); } // Actual data is more + if (len > LOGSZ) { strcat(log_data, "..."); } // Actual data is more #ifdef DEBUG_TASMOTA_CORE // Profile max_len @@ -2194,7 +2194,7 @@ void AddLog_P(uint32_t loglevel, PGM_P formatP, ...) void AddLog_Debug(PGM_P formatP, ...) { - char log_data[LOGSZ]; + char log_data[MAX_LOGSZ]; va_list arg; va_start(arg, formatP); diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 59d3f3e41..047208824 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -1124,7 +1124,7 @@ void CmndModules(void) } jsflg = true; uint32_t j = i ? midx +1 : 0; - if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), j, AnyModuleName(midx).c_str()) > (LOGSZ - TOPSZ)) || (i == sizeof(kModuleNiceList))) { + if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), j, AnyModuleName(midx).c_str()) > (MAX_LOGSZ - TOPSZ)) || (i == sizeof(kModuleNiceList))) { ResponseJsonEndEnd(); MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; @@ -1192,7 +1192,7 @@ void CmndGpio(void) sensor_names = kSensorNamesFixed; } char stemp1[TOPSZ]; - if ((ResponseAppend_P(PSTR("\"" D_CMND_GPIO "%d\":{\"%d\":\"%s%s\"}"), i, sensor_type, GetTextIndexed(stemp1, sizeof(stemp1), sensor_name_idx, sensor_names), sindex) > (LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(Settings.my_gp.io) -1)) { + if ((ResponseAppend_P(PSTR("\"" D_CMND_GPIO "%d\":{\"%d\":\"%s%s\"}"), i, sensor_type, GetTextIndexed(stemp1, sizeof(stemp1), sensor_name_idx, sensor_names), sindex) > (MAX_LOGSZ - TOPSZ)) || (i == ARRAY_SIZE(Settings.my_gp.io) -1)) { ResponseJsonEnd(); MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg2 = true; @@ -1227,7 +1227,7 @@ void ShowGpios(const uint16_t *NiceList, uint32_t size, uint32_t offset, uint32_ } jsflg = true; char stemp1[TOPSZ]; - if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), ridx, GetTextIndexed(stemp1, sizeof(stemp1), midx, kSensorNames)) > (LOGSZ - TOPSZ)) || (i == size -1)) { + if ((ResponseAppend_P(PSTR("\"%d\":\"%s\""), ridx, GetTextIndexed(stemp1, sizeof(stemp1), midx, kSensorNames)) > (MAX_LOGSZ - TOPSZ)) || (i == size -1)) { ResponseJsonEndEnd(); MqttPublishPrefixTopic_P(RESULT_OR_STAT, XdrvMailbox.command); jsflg = false; diff --git a/tasmota/tasmota.h b/tasmota/tasmota.h index e01de2d3f..dddc43fc1 100644 --- a/tasmota/tasmota.h +++ b/tasmota/tasmota.h @@ -135,7 +135,8 @@ const uint16_t INPUT_BUFFER_SIZE = 520; // Max number of characters in seria const uint16_t FLOATSZ = 16; // Max number of characters in float result from dtostrfd (max 32) const uint16_t CMDSZ = 24; // Max number of characters in command const uint16_t TOPSZ = 151; // Max number of characters in topic string -const uint16_t LOGSZ = 700; // Max number of characters in log +const uint16_t LOGSZ = 128; // Max number of characters in AddLog_P log +const uint16_t MAX_LOGSZ = 700; // Max number of characters in log const uint16_t MIN_MESSZ = 1040; // Min number of characters in MQTT message (1200 - TOPSZ - 9 header bytes) const uint8_t SENSOR_MAX_MISS = 5; // Max number of missed sensor reads before deciding it's offline diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 56389ea9a..1fe064b08 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1927,7 +1927,7 @@ void OtherSaveSettings(void) char tmp[300]; // Needs to hold complete ESP32 template of minimal 230 chars char webindex[5]; char friendlyname[TOPSZ]; - char message[LOGSZ]; + char message[MAX_LOGSZ]; WebGetArg("dn", tmp, sizeof(tmp)); SettingsUpdateText(SET_DEVICENAME, (!strlen(tmp)) ? "" : (!strcmp(tmp,"1")) ? SettingsText(SET_FRIENDLYNAME1) : tmp); diff --git a/tasmota/xdrv_02_mqtt.ino b/tasmota/xdrv_02_mqtt.ino index 471d55ff4..d34b98b57 100644 --- a/tasmota/xdrv_02_mqtt.ino +++ b/tasmota/xdrv_02_mqtt.ino @@ -321,7 +321,7 @@ void MqttPublish(const char* topic, bool retained) { } } - char log_data[LOGSZ]; + char log_data[MAX_LOGSZ]; snprintf_P(log_data, sizeof(log_data), PSTR("%s%s = %s"), slog_type, (Settings.flag.mqtt_enabled) ? topic : strrchr(topic,'/')+1, TasmotaGlobal.mqtt_data); // SetOption3 - Enable MQTT if (strlen(log_data) >= (sizeof(log_data) - strlen(sretained) -1)) { log_data[sizeof(log_data) - strlen(sretained) -5] = '\0'; diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 93076f701..bf4b8887a 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -3696,7 +3696,7 @@ void toLogN(const char *cp, uint8_t len) { void toLogEOL(const char *s1,const char *str) { if (!str) return; uint8_t index = 0; - char log_data[LOGSZ]; + char log_data[MAX_LOGSZ]; char *cp = log_data; strcpy(cp, s1); cp += strlen(s1); @@ -5768,7 +5768,7 @@ void Script_Check_Hue(String *response) { Script_AddLog_P(LOG_LEVEL_DEBUG, PSTR("Hue: %d"), hue_devs); toLog(">>>>"); toLog(response->c_str()); - toLog(response->c_str()+LOGSZ); + toLog(response->c_str()+MAX_LOGSZ); } #endif } diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index e61ec7938..8ef33c91f 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -370,7 +370,7 @@ void TryResponseAppend_P(const char *format, ...) { AddLog_P(LOG_LEVEL_ERROR, PSTR("%s (%u/%u):"), kHAssError1, dlen, slen); va_start(args, format); - char log_data[LOGSZ]; + char log_data[MAX_LOGSZ]; vsnprintf_P(log_data, sizeof(log_data), format, args); AddLogData(LOG_LEVEL_ERROR, log_data); } diff --git a/tasmota/xdrv_16_tuyamcu.ino b/tasmota/xdrv_16_tuyamcu.ino index ba8766b98..278564047 100644 --- a/tasmota/xdrv_16_tuyamcu.ino +++ b/tasmota/xdrv_16_tuyamcu.ino @@ -404,7 +404,7 @@ void TuyaSendCmd(uint8_t cmd, uint8_t payload[] = nullptr, uint16_t payload_len TuyaSerial->write(cmd); // Tuya command TuyaSerial->write(payload_len >> 8); // following data length (Hi) TuyaSerial->write(payload_len & 0xFF); // following data length (Lo) - char log_data[LOGSZ]; + char log_data[MAX_LOGSZ]; snprintf_P(log_data, sizeof(log_data), PSTR("TYA: Send \"55aa00%02x%02x%02x"), cmd, payload_len >> 8, payload_len & 0xFF); for (uint32_t i = 0; i < payload_len; ++i) { TuyaSerial->write(payload[i]); From 5bb682b7e7b9f392a7b3482ee332c17c2e7f4474 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 2 Jan 2021 18:47:03 +0100 Subject: [PATCH 087/255] insure ruletimers always stops at 0 --- tasmota/xdrv_10_rules.ino | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 0142b9a09..2d0caed1d 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -974,9 +974,8 @@ void RulesEvery100ms(void) void RulesEverySecond(void) { + char json_event[120]; if (Settings.rule_enabled && !Rules.busy) { // Any rule enabled - char json_event[120]; - if (RtcTime.valid) { if ((TasmotaGlobal.uptime > 60) && (RtcTime.minute != Rules.last_minute)) { // Execute from one minute after restart every minute only once Rules.last_minute = RtcTime.minute; @@ -984,10 +983,12 @@ void RulesEverySecond(void) RulesProcessEvent(json_event); } } - for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) { - if (Rules.timer[i] != 0L) { // Timer active? - if (TimeReached(Rules.timer[i])) { // Timer finished? - Rules.timer[i] = 0L; // Turn off this timer + } + for (uint32_t i = 0; i < MAX_RULE_TIMERS; i++) { + if (Rules.timer[i] != 0L) { // Timer active? + if (TimeReached(Rules.timer[i])) { // Timer finished? + Rules.timer[i] = 0L; // Turn off this timer + if (Settings.rule_enabled && !Rules.busy) { // Any rule enabled snprintf_P(json_event, sizeof(json_event), PSTR("{\"Rules\":{\"Timer\":%d}}"), i +1); RulesProcessEvent(json_event); } From c9cce37c0a7be94196636130c3b5821980d96a3d Mon Sep 17 00:00:00 2001 From: Jimmy Wennlund Date: Sat, 2 Jan 2021 18:48:33 +0100 Subject: [PATCH 088/255] Add option to remove the device addr from json payload (#10355) * Add option to move ZbReceived from json into the subtopic of the MQTT message. This will make parsing simpler in homeassistant * Follow the setting naming conv. * Zigbee: Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic --- tasmota/settings.h | 4 ++-- tasmota/xdrv_23_zigbee_2a_devices_impl.ino | 27 +++++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 4842103b4..81a62c835 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -143,8 +143,8 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t mi32_enable : 1; // bit 1 (v9.1.0.1) - SetOption115 - (ESP32 BLE) Enable ESP32 MI32 BLE (1) uint32_t zb_disable_autoquery : 1; // bit 2 (v9.1.0.1) - SetOption116 - (Zigbee) Disable auto-query of zigbee lights and devices (1) uint32_t fade_fixed_duration : 1; // bit 3 (v9.1.0.2) - SetOption117 - (Light) run fading at fixed duration instead of fixed slew rate - uint32_t spare04 : 1; // bit 4 - uint32_t spare05 : 1; // bit 5 + uint32_t zb_received_as_subtopic : 1; // bit 4 (v9.2.0.3) - SetOption118 - (Zigbee) Move ZbReceived form JSON message and into the subtopic replacing "SENSOR" default + uint32_t zb_omit_json_addr : 1; // bit 5 (v9.2.0.3) - SetOption119 - (Zigbee) Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic uint32_t spare06 : 1; // bit 6 uint32_t spare07 : 1; // bit 7 uint32_t spare08 : 1; // bit 8 diff --git a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino index 0a97a9938..80a69441c 100644 --- a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino +++ b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino @@ -511,15 +511,19 @@ void Z_Device::jsonPublishAttrList(const char * json_prefix, const Z_attribute_l TasmotaGlobal.mqtt_data[0] = 0; // clear string // Do we prefix with `ZbReceived`? - if (!Settings.flag4.remove_zbreceived) { + if (!Settings.flag4.remove_zbreceived && !Settings.flag5.zb_received_as_subtopic) { Response_P(PSTR("{\"%s\":"), json_prefix); } // What key do we use, shortaddr or name? - if (use_fname) { - Response_P(PSTR("%s{\"%s\":{"), TasmotaGlobal.mqtt_data, friendlyName); - } else { - Response_P(PSTR("%s{\"0x%04X\":{"), TasmotaGlobal.mqtt_data, shortaddr); + if (!Settings.flag5.zb_omit_json_addr) { + if (use_fname) { + Response_P(PSTR("%s{\"%s\":"), TasmotaGlobal.mqtt_data, friendlyName); + } else { + Response_P(PSTR("%s{\"0x%04X\":"), TasmotaGlobal.mqtt_data, shortaddr); + } } + ResponseAppend_P(PSTR("{")); + // Add "Device":"0x...." ResponseAppend_P(PSTR("\"" D_JSON_ZIGBEE_DEVICE "\":\"0x%04X\","), shortaddr); // Add "Name":"xxx" if name is present @@ -527,9 +531,13 @@ void Z_Device::jsonPublishAttrList(const char * json_prefix, const Z_attribute_l ResponseAppend_P(PSTR("\"" D_JSON_ZIGBEE_NAME "\":\"%s\","), EscapeJSONString(friendlyName).c_str()); } // Add all other attributes - ResponseAppend_P(PSTR("%s}}"), attr_list.toString(false).c_str()); + ResponseAppend_P(PSTR("%s}"), attr_list.toString(false).c_str()); - if (!Settings.flag4.remove_zbreceived) { + if (!Settings.flag5.zb_omit_json_addr) { + ResponseAppend_P(PSTR("}")); + } + + if (!Settings.flag4.remove_zbreceived && !Settings.flag5.zb_received_as_subtopic) { ResponseAppend_P(PSTR("}")); } @@ -545,7 +553,10 @@ void Z_Device::jsonPublishAttrList(const char * json_prefix, const Z_attribute_l snprintf_P(subtopic, sizeof(subtopic), PSTR("%s/%04X"), TasmotaGlobal.mqtt_topic, shortaddr); } char stopic[TOPSZ]; - GetTopic_P(stopic, TELE, subtopic, D_RSLT_SENSOR); + if (Settings.flag5.zb_received_as_subtopic) + GetTopic_P(stopic, TELE, subtopic, json_prefix); + else + GetTopic_P(stopic, TELE, subtopic, D_RSLT_SENSOR); MqttPublish(stopic, Settings.flag.mqtt_sensor_retain); } else { MqttPublishPrefixTopic_P(TELE, PSTR(D_RSLT_SENSOR), Settings.flag.mqtt_sensor_retain); From d0b426b5050f50ee73a5c60e2daf1c0547c5c1c7 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 2 Jan 2021 19:26:24 +0100 Subject: [PATCH 089/255] Disable `USE_LIGHT`` light support for ZBBridge (saves 17.6kb) --- CHANGELOG.md | 1 + tasmota/tasmota_configurations.h | 2 +- tasmota/xdrv_01_webserver.ino | 2 +- tasmota/xdrv_04_light.ino | 313 +--------------------------- tasmota/xdrv_04_light_utils.ino | 335 ++++++++++++++++++++++++++++++ tasmota/xdrv_10_scripter.ino | 4 +- tasmota/xdrv_20_hue.ino | 20 +- tasmota/xdrv_23_zigbee_3_hue.ino | 2 +- tasmota/xdrv_23_zigbee_A_impl.ino | 4 +- 9 files changed, 362 insertions(+), 321 deletions(-) create mode 100644 tasmota/xdrv_04_light_utils.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index 649f15289..5bb01ac2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) - Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311) - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) +- Disable `USE_LIGHT`` light support for ZBBridge (saves 17.6kb) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 142045bab..87022257c 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -509,7 +509,7 @@ #undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code) // -- Optional light modules ---------------------- -//#undef USE_LIGHT // Enable Dimmer/Light support +#undef USE_LIGHT // Disable Dimmer/Light support #undef USE_LIGHT_VIRTUAL_CT // Disable support for Virtual White Color Temperature (SO106) #undef USE_WS2812 // Disable WS2812 Led string using library NeoPixelBus (+5k code, +1k mem, 232 iram) - Disable by // #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 1fe064b08..3d57bdc95 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -947,7 +947,7 @@ void HandleRoot(void) char scolor[8]; snprintf_P(scolor, sizeof(scolor), PSTR("#%02X%02X%02X"), dcolor, dcolor, dcolor); // Saturation start color from Black to White uint8_t red, green, blue; - LightHsToRgb(hue, 255, &red, &green, &blue); + HsToRgb(hue, 255, &red, &green, &blue); snprintf_P(stemp, sizeof(stemp), PSTR("#%02X%02X%02X"), red, green, blue); // Saturation end color WSContentSend_P(HTTP_MSG_SLIDER_GRADIENT, // Saturation diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 5443a8a55..90d94ffb7 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -196,83 +196,6 @@ const vct_pivot_t CT_PIVOTS_RGB PROGMEM = { 255, 255, 255, 0, 0 }; const vct_pivot_t CT_PIVOTS_CWW PROGMEM = { 0, 0, 0, 255, 0 }; const vct_pivot_t CT_PIVOTS_WWW PROGMEM = { 0, 0, 0, 0, 255 }; -// New version of Gamma correction compute -// Instead of a table, we do a multi-linear approximation, which is close enough -// At low levels, the slope is a bit higher than actual gamma, to make changes smoother -// Internal resolution is 10 bits. - -typedef struct gamma_table_t { - uint16_t to_src; - uint16_t to_gamma; -} gamma_table_t; - -const gamma_table_t gamma_table[] = { // don't put in PROGMEM for performance reasons - { 1, 1 }, - { 4, 1 }, - { 209, 13 }, - { 312, 41 }, - { 457, 106 }, - { 626, 261 }, - { 762, 450 }, - { 895, 703 }, - { 1023, 1023 }, - { 0xFFFF, 0xFFFF } // fail-safe if out of range -}; - -// simplified Gamma table for Fade, cheating a little at low brightness -const gamma_table_t gamma_table_fast[] = { - { 384, 192 }, - { 768, 576 }, - { 1023, 1023 }, - { 0xFFFF, 0xFFFF } // fail-safe if out of range -}; - -// For reference, below are the computed gamma tables, via ledGamma() -// for 8 bits output: -// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, -// 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, -// 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, -// 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, -// 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, -// 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, -// 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, -// 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, -// 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, -// 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 67, 68, 69, -// 71, 72, 73, 75, 76, 78, 79, 80, 82, 83, 85, 86, 87, 89, 90, 91, -// 93, 94, 95, 97, 98,100,101,102,104,105,107,108,109,111,112,114, -// 116,118,120,122,124,125,127,129,131,133,135,137,139,141,143,144, -// 146,148,150,152,154,156,158,160,162,164,166,168,170,171,173,175, -// 178,180,183,185,188,190,193,195,198,200,203,205,208,210,213,215, -// 218,220,223,225,228,230,233,235,238,240,243,245,248,250,253,255 -// -// and for 10 bits output: -// 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, -// 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, -// 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, -// 12, 12, 13, 13, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, -// 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, -// 45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72, -// 74, 76, 77, 79, 81, 83, 84, 86, 88, 90, 92, 93, 95, 97, 99, 101, -// 102, 104, 106, 110, 113, 117, 121, 124, 128, 132, 135, 139, 143, 146, 150, 154, -// 158, 162, 166, 169, 173, 177, 180, 184, 188, 191, 195, 199, 202, 206, 210, 213, -// 217, 221, 224, 228, 232, 235, 239, 243, 246, 250, 254, 257, 261, 267, 272, 278, -// 283, 289, 294, 300, 305, 311, 317, 322, 328, 333, 339, 344, 350, 356, 361, 367, -// 372, 378, 383, 389, 394, 400, 406, 411, 417, 422, 428, 433, 439, 444, 450, 458, -// 465, 473, 480, 488, 496, 503, 511, 518, 526, 534, 541, 549, 557, 564, 572, 579, -// 587, 595, 602, 610, 617, 627, 635, 642, 650, 657, 665, 673, 680, 688, 695, 703, -// 713, 723, 733, 743, 753, 763, 773, 783, 793, 803, 813, 823, 833, 843, 853, 863, -// 873, 883, 893, 903, 913, 923, 933, 943, 953, 963, 973, 983, 993,1003,1013,1023 -// -// Output for Dimmer 0..100 values -// 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, -// 10, 10, 11, 12, 12, 13, 15, 17, 21, 23, 26, 28, 31, 34, 37, -// 40, 43, 49, 52, 58, 61, 67, 70, 76, 79, 84, 90, 93, 99,102, -// 110,117,128,135,146,158,166,177,184,195,202,213,221,232,239, -// 250,261,272,289,300,317,328,344,356,372,389,400,417,428,444, -// 458,480,496,518,534,557,579,595,617,635,657,673,695,713,743, -// 773,793,823,843,873,893,923,943,973,993,1023 - struct LIGHT { uint32_t strip_timer_counter = 0; // Bars and Gradient power_t power = 0; // Power for each channel if SetOption68, or boolean if single light @@ -728,13 +651,6 @@ class LightStateClass { _r, _g, _b, _wc, _ww); #endif } - - // new version of RGB to HSB with only integer calculation - static void RgbToHsb(uint8_t r, uint8_t g, uint8_t b, uint16_t *r_hue, uint8_t *r_sat, uint8_t *r_bri); - static void HsToRgb(uint16_t hue, uint8_t sat, uint8_t *r_r, uint8_t *r_g, uint8_t *r_b); - static void RgbToXy(uint8_t i_r, uint8_t i_g, uint8_t i_b, float *r_x, float *r_y); - static void XyToRgb(float x, float y, uint8_t *rr, uint8_t *rg, uint8_t *rb); - }; @@ -742,167 +658,6 @@ class LightStateClass { * LightStateClass implementation \*********************************************************************************************/ -// new version with only integer computing -// brightness is not needed, it is controlled via Dimmer -void LightStateClass::RgbToHsb(uint8_t ir, uint8_t ig, uint8_t ib, uint16_t *r_hue, uint8_t *r_sat, uint8_t *r_bri) { - uint32_t r = ir; - uint32_t g = ig; - uint32_t b = ib; - uint32_t max = (r > g && r > b) ? r : (g > b) ? g : b; // 0..255 - uint32_t min = (r < g && r < b) ? r : (g < b) ? g : b; // 0..255 - uint32_t d = max - min; // 0..255 - - uint16_t hue = 0; // hue value in degrees ranges from 0 to 359 - uint8_t sat = 0; // 0..255 - uint8_t bri = max; // 0..255 - - if (d != 0) { - sat = changeUIntScale(d, 0, max, 0, 255); - if (r == max) { - hue = (g > b) ? changeUIntScale(g-b,0,d,0,60) : 360 - changeUIntScale(b-g,0,d,0,60); - } else if (g == max) { - hue = (b > r) ? 120 + changeUIntScale(b-r,0,d,0,60) : 120 - changeUIntScale(r-b,0,d,0,60); - } else { - hue = (r > g) ? 240 + changeUIntScale(r-g,0,d,0,60) : 240 - changeUIntScale(g-r,0,d,0,60); - } - hue = hue % 360; // 0..359 - } - - if (r_hue) *r_hue = hue; - if (r_sat) *r_sat = sat; - if (r_bri) *r_bri = bri; - //AddLog_P(LOG_LEVEL_DEBUG_MORE, "RgbToHsb rgb (%d %d %d) hsb (%d %d %d)", r, g, b, hue, sat, bri); -} - -void LightStateClass::HsToRgb(uint16_t hue, uint8_t sat, uint8_t *r_r, uint8_t *r_g, uint8_t *r_b) { - uint32_t r = 255; // default to white - uint32_t g = 255; - uint32_t b = 255; - // we take brightness at 100%, brightness should be set separately - hue = hue % 360; // normalize to 0..359 - - if (sat > 0) { - uint32_t i = hue / 60; // quadrant 0..5 - uint32_t f = hue % 60; // 0..59 - uint32_t q = 255 - changeUIntScale(f, 0, 60, 0, sat); // 0..59 - uint32_t p = 255 - sat; - uint32_t t = 255 - changeUIntScale(60 - f, 0, 60, 0, sat); - - switch (i) { - case 0: - //r = 255; - g = t; - b = p; - break; - case 1: - r = q; - //g = 255; - b = p; - break; - case 2: - r = p; - //g = 255; - b = t; - break; - case 3: - r = p; - g = q; - //b = 255; - break; - case 4: - r = t; - g = p; - //b = 255; - break; - default: - //r = 255; - g = p; - b = q; - break; - } - } - if (r_r) *r_r = r; - if (r_g) *r_g = g; - if (r_b) *r_b = b; -} - -#define POW FastPrecisePowf - -// -// Matrix 3x3 multiplied to a 3 vector, result in a 3 vector -// -void mat3x3(const float *mat33, const float *vec3, float *res3) { - for (uint32_t i = 0; i < 3; i++) { - const float * v = vec3; - *res3 = 0.0f; - for (uint32_t j = 0; j < 3; j++) { - *res3 += *mat33++ * *v++; - } - res3++; - } -} - -void LightStateClass::RgbToXy(uint8_t i_r, uint8_t i_g, uint8_t i_b, float *r_x, float *r_y) { - float x = 0.31271f; // default medium white - float y = 0.32902f; - - if (i_r + i_b + i_g > 0) { - float rgb[3] = { (float)i_r, (float)i_g, (float)i_b }; - // https://gist.github.com/popcorn245/30afa0f98eea1c2fd34d - // Gamma correction - for (uint32_t i = 0; i < 3; i++) { - rgb[i] = rgb[i] / 255.0f; - rgb[i] = (rgb[i] > 0.04045f) ? POW((rgb[i] + 0.055f) / (1.0f + 0.055f), 2.4f) : (rgb[i] / 12.92f); - } - - // conversion to X, Y, Z - // Y is also the Luminance - float XYZ[3]; - static const float XYZ_factors[] = { 0.649926f, 0.103455f, 0.197109f, - 0.234327f, 0.743075f, 0.022598f, - 0.000000f, 0.053077f, 1.035763f }; - mat3x3(XYZ_factors, rgb, XYZ); - - float XYZ_sum = XYZ[0] + XYZ[1] + XYZ[2]; - x = XYZ[0] / XYZ_sum; - y = XYZ[1] / XYZ_sum; - // we keep the raw gamut, one nice thing could be to convert to a narrower gamut - } - if (r_x) *r_x = x; - if (r_y) *r_y = y; -} - -void LightStateClass::XyToRgb(float x, float y, uint8_t *rr, uint8_t *rg, uint8_t *rb) -{ - float XYZ[3], rgb[3]; - x = (x > 0.99f ? 0.99f : (x < 0.01f ? 0.01f : x)); - y = (y > 0.99f ? 0.99f : (y < 0.01f ? 0.01f : y)); - float z = 1.0f - x - y; - XYZ[0] = x / y; - XYZ[1] = 1.0f; - XYZ[2] = z / y; - - static const float rgb_factors[] = { 3.2406f, -1.5372f, -0.4986f, - -0.9689f, 1.8758f, 0.0415f, - 0.0557f, -0.2040f, 1.0570f }; - mat3x3(rgb_factors, XYZ, rgb); - float max = (rgb[0] > rgb[1] && rgb[0] > rgb[2]) ? rgb[0] : (rgb[1] > rgb[2]) ? rgb[1] : rgb[2]; - - for (uint32_t i = 0; i < 3; i++) { - rgb[i] = rgb[i] / max; // normalize to max == 1.0 - rgb[i] = (rgb[i] <= 0.0031308f) ? 12.92f * rgb[i] : 1.055f * POW(rgb[i], (1.0f / 2.4f)) - 0.055f; // gamma - } - - int32_t irgb[3]; - for (uint32_t i = 0; i < 3; i++) { - irgb[i] = rgb[i] * 255.0f + 0.5f; - } - - if (rr) { *rr = (irgb[0] > 255 ? 255: (irgb[0] < 0 ? 0 : irgb[0])); } - if (rg) { *rg = (irgb[1] > 255 ? 255: (irgb[1] < 0 ? 0 : irgb[1])); } - if (rb) { *rb = (irgb[2] > 255 ? 255: (irgb[2] < 0 ? 0 : irgb[2])); } -} - class LightControllerClass { private: LightStateClass *_state; @@ -1167,18 +922,6 @@ public: LightStateClass light_state = LightStateClass(); LightControllerClass light_controller = LightControllerClass(light_state); -/*********************************************************************************************\ - * Change scales from 8 bits to 10 bits and vice versa -\*********************************************************************************************/ -// 8 to 10 to 8 is guaranteed to give the same result -uint16_t change8to10(uint8_t v) { - return changeUIntScale(v, 0, 255, 0, 1023); -} -// change from 10 bits to 8 bits, but any non-zero input will be non-zero -uint8_t change10to8(uint16_t v) { - return (0 == v) ? 0 : changeUIntScale(v, 4, 1023, 1, 255); -} - /*********************************************************************************************\ * CT (White Color Temperature) \*********************************************************************************************/ @@ -1241,54 +984,6 @@ void setAlexaCTRange(void) { // depending on SetOption82, full or limited CT } } -/*********************************************************************************************\ - * Gamma correction -\*********************************************************************************************/ -// Calculate the gamma corrected value for LEDS -uint16_t ledGamma_internal(uint16_t v, const struct gamma_table_t *gt_ptr) { - uint16_t from_src = 0; - uint16_t from_gamma = 0; - - for (const gamma_table_t *gt = gt_ptr; ; gt++) { - uint16_t to_src = gt->to_src; - uint16_t to_gamma = gt->to_gamma; - if (v <= to_src) { - return changeUIntScale(v, from_src, to_src, from_gamma, to_gamma); - } - from_src = to_src; - from_gamma = to_gamma; - } -} -// Calculate the reverse gamma value for LEDS -uint16_t ledGammaReverse_internal(uint16_t vg, const struct gamma_table_t *gt_ptr) { - uint16_t from_src = 0; - uint16_t from_gamma = 0; - - for (const gamma_table_t *gt = gt_ptr; ; gt++) { - uint16_t to_src = gt->to_src; - uint16_t to_gamma = gt->to_gamma; - if (vg <= to_gamma) { - return changeUIntScale(vg, from_gamma, to_gamma, from_src, to_src); - } - from_src = to_src; - from_gamma = to_gamma; - } -} - -// 10 bits in, 10 bits out -uint16_t ledGamma10_10(uint16_t v) { - return ledGamma_internal(v, gamma_table); -} -// 10 bits resolution, 8 bits in -uint16_t ledGamma10(uint8_t v) { - return ledGamma10_10(change8to10(v)); -} - -// Legacy function -uint8_t ledGamma(uint8_t v) { - return change10to8(ledGamma10(v)); -} - /********************************************************************************************/ void LightPwmOffset(uint32_t offset) @@ -1513,10 +1208,6 @@ void LightGetXY(float *X, float *Y) { light_state.getXY(X, Y); } -void LightHsToRgb(uint16_t hue, uint8_t sat, uint8_t *r_r, uint8_t *r_g, uint8_t *r_b) { - light_state.HsToRgb(hue, sat, r_r, r_g, r_b); -} - // If SetOption68 is set, get the brightness for a specific device uint8_t LightGetBri(uint8_t device) { uint8_t bri = 254; // default value if relay @@ -2120,14 +1811,14 @@ bool isChannelCT(uint32_t channel) { // Calculate the Gamma correction, if any, for fading, using the fast Gamma curve (10 bits in+out) uint16_t fadeGamma(uint32_t channel, uint16_t v) { if (isChannelGammaCorrected(channel)) { - return ledGamma_internal(v, gamma_table_fast); + return ledGammaFast(v); } else { return v; } } uint16_t fadeGammaReverse(uint32_t channel, uint16_t vg) { if (isChannelGammaCorrected(channel)) { - return ledGammaReverse_internal(vg, gamma_table_fast); + return leddGammaReverseFast(vg); } else { return vg; } diff --git a/tasmota/xdrv_04_light_utils.ino b/tasmota/xdrv_04_light_utils.ino new file mode 100644 index 000000000..8ab379d62 --- /dev/null +++ b/tasmota/xdrv_04_light_utils.ino @@ -0,0 +1,335 @@ +/* + xdrv_04_light_utils.ino - Converter functions for lights + + Copyright (C) 2020 Theo Arends + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// This file is compiled even if `USE_LIGHT` is not defined and provides +// general purpose converter fucntions + + +// New version of Gamma correction compute +// Instead of a table, we do a multi-linear approximation, which is close enough +// At low levels, the slope is a bit higher than actual gamma, to make changes smoother +// Internal resolution is 10 bits. + +typedef struct gamma_table_t { + uint16_t to_src; + uint16_t to_gamma; +} gamma_table_t; + +const gamma_table_t gamma_table[] = { // don't put in PROGMEM for performance reasons + { 1, 1 }, + { 4, 1 }, + { 209, 13 }, + { 312, 41 }, + { 457, 106 }, + { 626, 261 }, + { 762, 450 }, + { 895, 703 }, + { 1023, 1023 }, + { 0xFFFF, 0xFFFF } // fail-safe if out of range +}; + +// simplified Gamma table for Fade, cheating a little at low brightness +const gamma_table_t gamma_table_fast[] = { + { 384, 192 }, + { 768, 576 }, + { 1023, 1023 }, + { 0xFFFF, 0xFFFF } // fail-safe if out of range +}; + +// For reference, below are the computed gamma tables, via ledGamma() +// for 8 bits output: +// 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, +// 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, +// 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, +// 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 6, 6, 6, +// 6, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 10, 10, 10, 11, +// 11, 12, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 17, 18, +// 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, +// 25, 26, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 36, 37, 38, +// 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50, 51, 52, 53, +// 54, 55, 56, 57, 58, 59, 60, 61, 61, 62, 63, 64, 65, 67, 68, 69, +// 71, 72, 73, 75, 76, 78, 79, 80, 82, 83, 85, 86, 87, 89, 90, 91, +// 93, 94, 95, 97, 98,100,101,102,104,105,107,108,109,111,112,114, +// 116,118,120,122,124,125,127,129,131,133,135,137,139,141,143,144, +// 146,148,150,152,154,156,158,160,162,164,166,168,170,171,173,175, +// 178,180,183,185,188,190,193,195,198,200,203,205,208,210,213,215, +// 218,220,223,225,228,230,233,235,238,240,243,245,248,250,253,255 +// +// and for 10 bits output: +// 0, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, +// 5, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, +// 8, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 12, 12, +// 12, 12, 13, 13, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 25, +// 26, 27, 28, 29, 30, 31, 33, 34, 35, 36, 37, 38, 39, 40, 41, 43, +// 45, 47, 49, 50, 52, 54, 56, 58, 59, 61, 63, 65, 67, 68, 70, 72, +// 74, 76, 77, 79, 81, 83, 84, 86, 88, 90, 92, 93, 95, 97, 99, 101, +// 102, 104, 106, 110, 113, 117, 121, 124, 128, 132, 135, 139, 143, 146, 150, 154, +// 158, 162, 166, 169, 173, 177, 180, 184, 188, 191, 195, 199, 202, 206, 210, 213, +// 217, 221, 224, 228, 232, 235, 239, 243, 246, 250, 254, 257, 261, 267, 272, 278, +// 283, 289, 294, 300, 305, 311, 317, 322, 328, 333, 339, 344, 350, 356, 361, 367, +// 372, 378, 383, 389, 394, 400, 406, 411, 417, 422, 428, 433, 439, 444, 450, 458, +// 465, 473, 480, 488, 496, 503, 511, 518, 526, 534, 541, 549, 557, 564, 572, 579, +// 587, 595, 602, 610, 617, 627, 635, 642, 650, 657, 665, 673, 680, 688, 695, 703, +// 713, 723, 733, 743, 753, 763, 773, 783, 793, 803, 813, 823, 833, 843, 853, 863, +// 873, 883, 893, 903, 913, 923, 933, 943, 953, 963, 973, 983, 993,1003,1013,1023 +// +// Output for Dimmer 0..100 values +// 0, 1, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, +// 10, 10, 11, 12, 12, 13, 15, 17, 21, 23, 26, 28, 31, 34, 37, +// 40, 43, 49, 52, 58, 61, 67, 70, 76, 79, 84, 90, 93, 99,102, +// 110,117,128,135,146,158,166,177,184,195,202,213,221,232,239, +// 250,261,272,289,300,317,328,344,356,372,389,400,417,428,444, +// 458,480,496,518,534,557,579,595,617,635,657,673,695,713,743, +// 773,793,823,843,873,893,923,943,973,993,1023 + + +/*********************************************************************************************\ + * Color converters +\*********************************************************************************************/ + +// new version with only integer computing +// brightness is not needed, it is controlled via Dimmer +void RgbToHsb(uint8_t ir, uint8_t ig, uint8_t ib, uint16_t *r_hue, uint8_t *r_sat, uint8_t *r_bri) { + uint32_t r = ir; + uint32_t g = ig; + uint32_t b = ib; + uint32_t max = (r > g && r > b) ? r : (g > b) ? g : b; // 0..255 + uint32_t min = (r < g && r < b) ? r : (g < b) ? g : b; // 0..255 + uint32_t d = max - min; // 0..255 + + uint16_t hue = 0; // hue value in degrees ranges from 0 to 359 + uint8_t sat = 0; // 0..255 + uint8_t bri = max; // 0..255 + + if (d != 0) { + sat = changeUIntScale(d, 0, max, 0, 255); + if (r == max) { + hue = (g > b) ? changeUIntScale(g-b,0,d,0,60) : 360 - changeUIntScale(b-g,0,d,0,60); + } else if (g == max) { + hue = (b > r) ? 120 + changeUIntScale(b-r,0,d,0,60) : 120 - changeUIntScale(r-b,0,d,0,60); + } else { + hue = (r > g) ? 240 + changeUIntScale(r-g,0,d,0,60) : 240 - changeUIntScale(g-r,0,d,0,60); + } + hue = hue % 360; // 0..359 + } + + if (r_hue) *r_hue = hue; + if (r_sat) *r_sat = sat; + if (r_bri) *r_bri = bri; + //AddLog_P(LOG_LEVEL_DEBUG_MORE, "RgbToHsb rgb (%d %d %d) hsb (%d %d %d)", r, g, b, hue, sat, bri); +} + +void HsToRgb(uint16_t hue, uint8_t sat, uint8_t *r_r, uint8_t *r_g, uint8_t *r_b) { + uint32_t r = 255; // default to white + uint32_t g = 255; + uint32_t b = 255; + // we take brightness at 100%, brightness should be set separately + hue = hue % 360; // normalize to 0..359 + + if (sat > 0) { + uint32_t i = hue / 60; // quadrant 0..5 + uint32_t f = hue % 60; // 0..59 + uint32_t q = 255 - changeUIntScale(f, 0, 60, 0, sat); // 0..59 + uint32_t p = 255 - sat; + uint32_t t = 255 - changeUIntScale(60 - f, 0, 60, 0, sat); + + switch (i) { + case 0: + //r = 255; + g = t; + b = p; + break; + case 1: + r = q; + //g = 255; + b = p; + break; + case 2: + r = p; + //g = 255; + b = t; + break; + case 3: + r = p; + g = q; + //b = 255; + break; + case 4: + r = t; + g = p; + //b = 255; + break; + default: + //r = 255; + g = p; + b = q; + break; + } + } + if (r_r) *r_r = r; + if (r_g) *r_g = g; + if (r_b) *r_b = b; +} + +#define POW FastPrecisePowf + +// +// Matrix 3x3 multiplied to a 3 vector, result in a 3 vector +// +void mat3x3(const float *mat33, const float *vec3, float *res3) { + for (uint32_t i = 0; i < 3; i++) { + const float * v = vec3; + *res3 = 0.0f; + for (uint32_t j = 0; j < 3; j++) { + *res3 += *mat33++ * *v++; + } + res3++; + } +} + +void RgbToXy(uint8_t i_r, uint8_t i_g, uint8_t i_b, float *r_x, float *r_y) { + float x = 0.31271f; // default medium white + float y = 0.32902f; + + if (i_r + i_b + i_g > 0) { + float rgb[3] = { (float)i_r, (float)i_g, (float)i_b }; + // https://gist.github.com/popcorn245/30afa0f98eea1c2fd34d + // Gamma correction + for (uint32_t i = 0; i < 3; i++) { + rgb[i] = rgb[i] / 255.0f; + rgb[i] = (rgb[i] > 0.04045f) ? POW((rgb[i] + 0.055f) / (1.0f + 0.055f), 2.4f) : (rgb[i] / 12.92f); + } + + // conversion to X, Y, Z + // Y is also the Luminance + float XYZ[3]; + static const float XYZ_factors[] = { 0.649926f, 0.103455f, 0.197109f, + 0.234327f, 0.743075f, 0.022598f, + 0.000000f, 0.053077f, 1.035763f }; + mat3x3(XYZ_factors, rgb, XYZ); + + float XYZ_sum = XYZ[0] + XYZ[1] + XYZ[2]; + x = XYZ[0] / XYZ_sum; + y = XYZ[1] / XYZ_sum; + // we keep the raw gamut, one nice thing could be to convert to a narrower gamut + } + if (r_x) *r_x = x; + if (r_y) *r_y = y; +} + +void XyToRgb(float x, float y, uint8_t *rr, uint8_t *rg, uint8_t *rb) +{ + float XYZ[3], rgb[3]; + x = (x > 0.99f ? 0.99f : (x < 0.01f ? 0.01f : x)); + y = (y > 0.99f ? 0.99f : (y < 0.01f ? 0.01f : y)); + float z = 1.0f - x - y; + XYZ[0] = x / y; + XYZ[1] = 1.0f; + XYZ[2] = z / y; + + static const float rgb_factors[] = { 3.2406f, -1.5372f, -0.4986f, + -0.9689f, 1.8758f, 0.0415f, + 0.0557f, -0.2040f, 1.0570f }; + mat3x3(rgb_factors, XYZ, rgb); + float max = (rgb[0] > rgb[1] && rgb[0] > rgb[2]) ? rgb[0] : (rgb[1] > rgb[2]) ? rgb[1] : rgb[2]; + + for (uint32_t i = 0; i < 3; i++) { + rgb[i] = rgb[i] / max; // normalize to max == 1.0 + rgb[i] = (rgb[i] <= 0.0031308f) ? 12.92f * rgb[i] : 1.055f * POW(rgb[i], (1.0f / 2.4f)) - 0.055f; // gamma + } + + int32_t irgb[3]; + for (uint32_t i = 0; i < 3; i++) { + irgb[i] = rgb[i] * 255.0f + 0.5f; + } + + if (rr) { *rr = (irgb[0] > 255 ? 255: (irgb[0] < 0 ? 0 : irgb[0])); } + if (rg) { *rg = (irgb[1] > 255 ? 255: (irgb[1] < 0 ? 0 : irgb[1])); } + if (rb) { *rb = (irgb[2] > 255 ? 255: (irgb[2] < 0 ? 0 : irgb[2])); } +} + +/*********************************************************************************************\ + * Change scales from 8 bits to 10 bits and vice versa +\*********************************************************************************************/ +// 8 to 10 to 8 is guaranteed to give the same result +uint16_t change8to10(uint8_t v) { + return changeUIntScale(v, 0, 255, 0, 1023); +} +// change from 10 bits to 8 bits, but any non-zero input will be non-zero +uint8_t change10to8(uint16_t v) { + return (0 == v) ? 0 : changeUIntScale(v, 4, 1023, 1, 255); +} + +/*********************************************************************************************\ + * Gamma correction +\*********************************************************************************************/ +// Calculate the gamma corrected value for LEDS +uint16_t ledGamma_internal(uint16_t v, const struct gamma_table_t *gt_ptr) { + uint16_t from_src = 0; + uint16_t from_gamma = 0; + + for (const gamma_table_t *gt = gt_ptr; ; gt++) { + uint16_t to_src = gt->to_src; + uint16_t to_gamma = gt->to_gamma; + if (v <= to_src) { + return changeUIntScale(v, from_src, to_src, from_gamma, to_gamma); + } + from_src = to_src; + from_gamma = to_gamma; + } +} +// Calculate the reverse gamma value for LEDS +uint16_t ledGammaReverse_internal(uint16_t vg, const struct gamma_table_t *gt_ptr) { + uint16_t from_src = 0; + uint16_t from_gamma = 0; + + for (const gamma_table_t *gt = gt_ptr; ; gt++) { + uint16_t to_src = gt->to_src; + uint16_t to_gamma = gt->to_gamma; + if (vg <= to_gamma) { + return changeUIntScale(vg, from_gamma, to_gamma, from_src, to_src); + } + from_src = to_src; + from_gamma = to_gamma; + } +} + +// 10 bits in, 10 bits out +uint16_t ledGamma10_10(uint16_t v) { + return ledGamma_internal(v, gamma_table); +} + +// 10 bits resolution, 8 bits in +uint16_t ledGamma10(uint8_t v) { + return ledGamma10_10(change8to10(v)); +} + +// Legacy function +uint8_t ledGamma(uint8_t v) { + return change10to8(ledGamma10(v)); +} + +// Fast versions for Fading +uint16_t ledGammaFast(uint16_t v) { + return ledGamma_internal(v, gamma_table_fast); +} + +uint16_t leddGammaReverseFast(uint16_t vg) { + return ledGammaReverse_internal(vg, gamma_table_fast); +} \ No newline at end of file diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index bf4b8887a..44c4e2b21 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -5848,8 +5848,8 @@ void Script_Handle_Hue(String *path) { String x_str = tok_x.getStr(); String y_str = tok_y.getStr(); uint8_t rr,gg,bb; - LightStateClass::XyToRgb(x, y, &rr, &gg, &bb); - LightStateClass::RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); + XyToRgb(x, y, &rr, &gg, &bb); + RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); if (resp) { response += ","; } response += FPSTR(sHUE_LIGHT_RESPONSE_JSON); response.replace("{id", String(device)); diff --git a/tasmota/xdrv_20_hue.ino b/tasmota/xdrv_20_hue.ino index b0a18d16a..93252af12 100644 --- a/tasmota/xdrv_20_hue.ino +++ b/tasmota/xdrv_20_hue.ino @@ -17,7 +17,7 @@ along with this program. If not, see . */ -#if defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) && defined(USE_LIGHT) +#if defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) && (defined(USE_ZIGBEE) || defined(USE_LIGHT)) /*********************************************************************************************\ * Philips Hue bridge emulation * @@ -303,6 +303,7 @@ uint16_t prev_ct = 254; char prev_x_str[24] = "\0"; // store previously set xy by Alexa app char prev_y_str[24] = "\0"; +#ifdef USE_LIGHT uint8_t getLocalLightSubtype(uint8_t device) { if (TasmotaGlobal.light_type) { if (device >= Light.device) { @@ -422,6 +423,7 @@ void HueLightStatus2(uint8_t device, String *response) *response += buf; free(buf); } +#endif // USE_LIGHT // generate a unique lightId mixing local IP address and device number // it is limited to 32 devices. @@ -496,7 +498,9 @@ void HueGlobalConfig(String *path) { path->remove(0,1); // cut leading / to get response = F("{\"lights\":{"); bool appending = false; // do we need to add a comma to append +#ifdef USE_LIGHT CheckHue(&response, appending); +#endif // USE_LIGHT #ifdef USE_ZIGBEE ZigbeeCheckHue(&response, appending); #endif // USE_ZIGBEE @@ -515,6 +519,7 @@ void HueAuthentication(String *path) AddLog_P(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_HTTP D_HUE " Authentication Result (%s)"), response); } +#ifdef USE_LIGHT // refactored to remove code duplicates void CheckHue(String * response, bool &appending) { uint8_t maxhue = (TasmotaGlobal.devices_present > MAX_HUE_DEVICES) ? MAX_HUE_DEVICES : TasmotaGlobal.devices_present; @@ -621,8 +626,8 @@ void HueLightsCommand(uint8_t device, uint32_t device_id, String &response) { strlcpy(prev_x_str, tok_x.getStr(), sizeof(prev_x_str)); strlcpy(prev_y_str, tok_y.getStr(), sizeof(prev_y_str)); uint8_t rr,gg,bb; - LightStateClass::XyToRgb(x, y, &rr, &gg, &bb); - LightStateClass::RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); + XyToRgb(x, y, &rr, &gg, &bb); + RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); prev_hue = changeUIntScale(hue, 0, 360, 0, 65535); // calculate back prev_hue prev_sat = (sat > 254 ? 254 : sat); //AddLog_P(LOG_LEVEL_DEBUG_MORE, "XY RGB (%d %d %d) HS (%d %d)", rr,gg,bb,hue,sat); @@ -728,6 +733,7 @@ void HueLightsCommand(uint8_t device, uint32_t device_id, String &response) { } free(buf); } +#endif // USE_LIGHT void HueLights(String *path) { @@ -744,7 +750,9 @@ void HueLights(String *path) if (path->endsWith(F("/lights"))) { // Got /lights response = "{"; bool appending = false; +#ifdef USE_LIGHT CheckHue(&response, appending); +#endif // USE_LIGHT #ifdef USE_ZIGBEE ZigbeeCheckHue(&response, appending); #endif // USE_ZIGBEE @@ -771,9 +779,11 @@ void HueLights(String *path) return Script_Handle_Hue(path); } #endif +#ifdef USE_LIGHT if ((device >= 1) || (device <= maxhue)) { HueLightsCommand(device, device_id, response); } +#endif // USE_LIGHT } else if(path->indexOf(F("/lights/")) >= 0) { // Got /lights/ID @@ -797,12 +807,14 @@ void HueLights(String *path) } #endif +#ifdef USE_LIGHT if ((device < 1) || (device > maxhue)) { device = 1; } response += F("{\"state\":"); HueLightStatus1(device, &response); HueLightStatus2(device, &response); +#endif // USE_LIGHT } else { response = "{}"; @@ -835,7 +847,9 @@ void HueGroups(String *path) ZigbeeHueGroups(&response); #endif // USE_ZIGBEE response.replace("{l1", lights); +#ifdef USE_LIGHT HueLightStatus1(1, &response); +#endif // USE_LIGHT response += F("}"); } diff --git a/tasmota/xdrv_23_zigbee_3_hue.ino b/tasmota/xdrv_23_zigbee_3_hue.ino index 100faef9c..cc77d2314 100644 --- a/tasmota/xdrv_23_zigbee_3_hue.ino +++ b/tasmota/xdrv_23_zigbee_3_hue.ino @@ -18,7 +18,7 @@ */ #ifdef USE_ZIGBEE -#if defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) && defined(USE_LIGHT) +#if defined(USE_WEBSERVER) && defined(USE_EMULATION) && defined(USE_EMULATION_HUE) // Add global functions for Hue Emulation diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 799274dd0..9bdf84175 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -2048,11 +2048,11 @@ void ZigbeeShow(bool json) if (light.validHue() && light.validSat() && (channels >= 3)) { uint8_t r,g,b; uint8_t sat = changeUIntScale(light.getSat(), 0, 254, 0, 255); // scale to 0..255 - LightStateClass::HsToRgb(light.getHue(), sat, &r, &g, &b); + HsToRgb(light.getHue(), sat, &r, &g, &b); WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); } else if (light.validX() && light.validY() && (channels >= 3)) { uint8_t r,g,b; - LightStateClass::XyToRgb(light.getX() / 65535.0f, light.getY() / 65535.0f, &r, &g, &b); + XyToRgb(light.getX() / 65535.0f, light.getY() / 65535.0f, &r, &g, &b); WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); } } From 3d1db430bbc63020f2163bf6282a5aa39713bdaf Mon Sep 17 00:00:00 2001 From: Jeroen Vermeulen - MageHost Date: Sat, 2 Jan 2021 20:30:00 +0100 Subject: [PATCH 090/255] fixes compile error of SSD1331 with tasmota-display + improves layout of DisplayMode 1. --- .../Adafruit_SPITFT_Renderer.cpp | 119 +++++++++--------- .../Adafruit_SPITFT_Renderer.h | 23 ++-- .../Adafruit_SSD1331.cpp | 8 +- .../Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h | 2 +- tasmota/xdsp_14_SSD1331.ino | 6 +- 5 files changed, 85 insertions(+), 73 deletions(-) diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp index d49141a28..bf1d5cb1d 100644 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp @@ -1,5 +1,10 @@ +/* + * This class is basically the same as Adafruit_SPITFT. + * The only difference is: it extends Renderer which extends Adafruit_GFX. + * The original Adafruit_SPITFT class directly extends Adafruit_GFX. + */ /*! - * @file Adafruit_SPITFT.cpp + * @file Adafruit_SPITFT_Renderer.cpp * * @mainpage Adafruit SPI TFT Displays (and some others) * @@ -92,7 +97,7 @@ #endif // end USE_SPI_DMA -// Possible values for Adafruit_SPITFT.connection: +// Possible values for Adafruit_SPITFT_Renderer.connection: #define TFT_HARD_SPI 0 ///< Display interface = hardware SPI #define TFT_SOFT_SPI 1 ///< Display interface = software SPI #define TFT_PARALLEL 2 ///< Display interface = 8- or 16-bit parallel @@ -101,7 +106,7 @@ // CONSTRUCTORS ------------------------------------------------------------ /*! - @brief Adafruit_SPITFT constructor for software (bitbang) SPI. + @brief Adafruit_SPITFT_Renderer constructor for software (bitbang) SPI. @param w Display width in pixels at default rotation setting (0). @param h Display height in pixels at default rotation setting (0). @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). @@ -112,12 +117,12 @@ can be tied to MCU reset, default of -1 means unused). @param miso Arduino pin # for bitbang SPI MISO signal (optional, -1 default, many displays don't support SPI read). - @return Adafruit_SPITFT object. + @return Adafruit_SPITFT_Renderer object. @note Output pins are not initialized; application typically will need to call subclass' begin() function, which in turn calls this library's initSPI() function to initialize pins. */ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, +Adafruit_SPITFT_Renderer::Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t mosi, int8_t sck, int8_t rst, int8_t miso) : Renderer(w, h), connection(TFT_SOFT_SPI), _rst(rst), _cs(cs), _dc(dc) { swspi._sck = sck; @@ -223,7 +228,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, } /*! - @brief Adafruit_SPITFT constructor for hardware SPI using the board's + @brief Adafruit_SPITFT_Renderer constructor for hardware SPI using the board's default SPI peripheral. @param w Display width in pixels at default rotation setting (0). @param h Display height in pixels at default rotation setting (0). @@ -231,20 +236,20 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, @param dc Arduino pin # for data/command select (required). @param rst Arduino pin # for display reset (optional, display reset can be tied to MCU reset, default of -1 means unused). - @return Adafruit_SPITFT object. + @return Adafruit_SPITFT_Renderer object. @note Output pins are not initialized; application typically will need to call subclass' begin() function, which in turn calls this library's initSPI() function to initialize pins. */ #if defined(ESP8266) // See notes below -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, +Adafruit_SPITFT_Renderer::Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t rst) : Renderer(w, h), connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { hwspi._spi = &SPI; } #else // !ESP8266 -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, - int8_t dc, int8_t rst) : Adafruit_SPITFT(w, h, &SPI, cs, dc, rst) { +Adafruit_SPITFT_Renderer::Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, int8_t cs, + int8_t dc, int8_t rst) : Adafruit_SPITFT_Renderer(w, h, &SPI, cs, dc, rst) { // This just invokes the hardware SPI constructor below, // passing the default SPI device (&SPI). } @@ -258,7 +263,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, // but if there's any library out there that creates a 'virtual' SPIClass // peripheral and drives it with software bitbanging, that's not supported. /*! - @brief Adafruit_SPITFT constructor for hardware SPI using a specific + @brief Adafruit_SPITFT_Renderer constructor for hardware SPI using a specific SPI peripheral. @param w Display width in pixels at default rotation (0). @param h Display height in pixels at default rotation (0). @@ -267,7 +272,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, @param dc Arduino pin # for data/command select (required). @param rst Arduino pin # for display reset (optional, display reset can be tied to MCU reset, default of -1 means unused). - @return Adafruit_SPITFT object. + @return Adafruit_SPITFT_Renderer object. @note Output pins are not initialized in constructor; application typically will need to call subclass' begin() function, which in turn calls this library's initSPI() function to initialize @@ -279,7 +284,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, GPIO manually. Do this BEFORE calling the display-specific begin or init function. Unfortunate but unavoidable. */ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, +Adafruit_SPITFT_Renderer::Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, SPIClass *spiClass, int8_t cs, int8_t dc, int8_t rst) : Renderer(w, h), connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { hwspi._spi = spiClass; @@ -344,13 +349,13 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, #endif // end !ESP8266 /*! - @brief Adafruit_SPITFT constructor for parallel display connection. + @brief Adafruit_SPITFT_Renderer constructor for parallel display connection. @param w Display width in pixels at default rotation (0). @param h Display height in pixels at default rotation (0). @param busWidth If tft16 (enumeration in header file), is a 16-bit parallel connection, else 8-bit. 16-bit isn't fully implemented or tested yet so - applications should pass "tft8bitbus" for now...needed to + applications should pass "tft8bitbus_Renderer" for now...needed to stick a required enum argument in there to disambiguate this constructor from the soft-SPI case. Argument is ignored on 8-bit architectures (no 'wide' @@ -367,7 +372,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, @param rst Arduino pin # for display reset (optional, display reset can be tied to MCU reset, default of -1 means unused). @param rd Arduino pin # for read strobe (optional, -1 if unused). - @return Adafruit_SPITFT object. + @return Adafruit_SPITFT_Renderer object. @note Output pins are not initialized; application typically will need to call subclass' begin() function, which in turn calls this library's initSPI() function to initialize pins. @@ -375,13 +380,13 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, only SPI displays, parallel being a recent addition (but not wanting to break existing code). */ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, +Adafruit_SPITFT_Renderer::Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, tftBusWidth_Renderer busWidth, int8_t d0, int8_t wr, int8_t dc, int8_t cs, int8_t rst, int8_t rd) : Renderer(w, h), connection(TFT_PARALLEL), _rst(rst), _cs(cs), _dc(dc) { tft8._d0 = d0; tft8._wr = wr; tft8._rd = rd; - tft8.wide = (busWidth == tft16bitbus); + tft8.wide = (busWidth == tft16bitbus_Renderer); #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(CORE_TEENSY) @@ -523,7 +528,7 @@ Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, could probably be made private...quite a few class functions were generously put in the public section. */ -void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { +void Adafruit_SPITFT_Renderer::initSPI(uint32_t freq, uint8_t spiMode) { if(!freq) freq = DEFAULT_SPI_FREQ; // If no freq specified, use default @@ -893,7 +898,7 @@ void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { using hardware SPI and transactions are supported). Required for all display types; not an SPI-specific function. */ -void Adafruit_SPITFT::startWrite(void) { +void Adafruit_SPITFT_Renderer::startWrite(void) { SPI_BEGIN_TRANSACTION(); if(_cs >= 0) SPI_CS_LOW(); } @@ -904,7 +909,7 @@ void Adafruit_SPITFT::startWrite(void) { using hardware SPI and transactions are supported). Required for all display types; not an SPI-specific function. */ -void Adafruit_SPITFT::endWrite(void) { +void Adafruit_SPITFT_Renderer::endWrite(void) { if(_cs >= 0) SPI_CS_HIGH(); SPI_END_TRANSACTION(); } @@ -925,7 +930,7 @@ void Adafruit_SPITFT::endWrite(void) { @param y Vertical position (0 = top). @param color 16-bit pixel color in '565' RGB format. */ -void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { +void Adafruit_SPITFT_Renderer::writePixel(int16_t x, int16_t y, uint16_t color) { if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { setAddrWindow(x, y, 1, 1); SPI_WRITE16(color); @@ -960,7 +965,7 @@ void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { covered...this is really here only for SAMD DMA and much forethought on the application side. */ -void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, +void Adafruit_SPITFT_Renderer::writePixels(uint16_t *colors, uint32_t len, bool block, bool bigEndian) { if(!len) return; // Avoid 0-byte transfers @@ -1069,7 +1074,7 @@ void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, is not enabled, and is not needed if blocking writePixels() was used (as is the default case). */ -void Adafruit_SPITFT::dmaWait(void) { +void Adafruit_SPITFT_Renderer::dmaWait(void) { #if defined(USE_SPI_DMA) while(dma_busy); #if defined(__SAMD51__) || defined(_SAMD21_) @@ -1089,7 +1094,7 @@ void Adafruit_SPITFT::dmaWait(void) { @param color 16-bit pixel color in '565' RGB format. @param len Number of pixels to draw. */ -void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { +void Adafruit_SPITFT_Renderer::writeColor(uint16_t color, uint32_t len) { if(!len) return; // Avoid 0-byte transfers @@ -1342,7 +1347,7 @@ void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { optimize for the 'if' case, not the 'else' -- avoids branches and rejects clipped rectangles at the least-work possibility. */ -void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, +void Adafruit_SPITFT_Renderer::writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { if(w && h) { // Nonzero width and height? if(w < 0) { // If negative width... @@ -1384,7 +1389,7 @@ void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, negative = point of first corner). @param color 16-bit line color in '565' RGB format. */ -void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, +void inline Adafruit_SPITFT_Renderer::writeFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width if(w < 0) { // If negative width... @@ -1415,7 +1420,7 @@ void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, negative = above first point). @param color 16-bit line color in '565' RGB format. */ -void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, +void inline Adafruit_SPITFT_Renderer::writeFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height if(h < 0) { // If negative height... @@ -1454,7 +1459,7 @@ void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, @note This is a new function, no graphics primitives besides rects and horizontal/vertical lines are written to best use this yet. */ -inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, +inline void Adafruit_SPITFT_Renderer::writeFillRectPreclipped(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { setAddrWindow(x, y, w, h); writeColor(color, (uint32_t)w * h); @@ -1478,7 +1483,7 @@ inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, @param y Vertical position (0 = top). @param color 16-bit pixel color in '565' RGB format. */ -void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { +void Adafruit_SPITFT_Renderer::drawPixel(int16_t x, int16_t y, uint16_t color) { // Clip first... if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { // THEN set up transaction (if needed) and draw... @@ -1508,7 +1513,7 @@ void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { performed at all if the rectangle is rejected. It's really not that much code. */ -void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, +void Adafruit_SPITFT_Renderer::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) { if(w && h) { // Nonzero width and height? if(w < 0) { // If negative width... @@ -1556,7 +1561,7 @@ void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, writeFastHLine() to handle clipping and so forth) so that the transaction isn't performed at all if the line is rejected. */ -void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, +void Adafruit_SPITFT_Renderer::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) { if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width if(w < 0) { // If negative width... @@ -1592,7 +1597,7 @@ void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, writeFastVLine() to handle clipping and so forth) so that the transaction isn't performed at all if the line is rejected. */ -void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, +void Adafruit_SPITFT_Renderer::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) { if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height if(h < 0) { // If negative height... @@ -1620,7 +1625,7 @@ void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, any user code relies on it. Consider it DEPRECATED. @param color 16-bit pixel color in '565' RGB format. */ -void Adafruit_SPITFT::pushColor(uint16_t color) { +void Adafruit_SPITFT_Renderer::pushColor(uint16_t color) { startWrite(); SPI_WRITE16(color); endWrite(); @@ -1642,7 +1647,7 @@ void Adafruit_SPITFT::pushColor(uint16_t color) { @param w Width of bitmap in pixels. @param h Height of bitmap in pixels. */ -void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, +void Adafruit_SPITFT_Renderer::drawRGBBitmap(int16_t x, int16_t y, uint16_t *pcolors, int16_t w, int16_t h) { int16_t x2, y2; // Lower-right coord @@ -1685,7 +1690,7 @@ void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, Self-contained, no transaction setup required. @param i true = inverted display, false = normal display. */ -void Adafruit_SPITFT::invertDisplay(bool i) { +void Adafruit_SPITFT_Renderer::invertDisplay(bool i) { startWrite(); writeCommand(i ? invertOnCommand : invertOffCommand); endWrite(); @@ -1701,17 +1706,17 @@ void Adafruit_SPITFT::invertDisplay(bool i) { @param blue 8-bit blue brightnesss (0 = off, 255 = max). @return 'Packed' 16-bit color value (565 format). */ -uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) { +uint16_t Adafruit_SPITFT_Renderer::color565(uint8_t red, uint8_t green, uint8_t blue) { return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); } /*! - @brief Adafruit_SPITFT Send Command handles complete sending of commands and data + @brief Adafruit_SPITFT_Renderer Send Command handles complete sending of commands and data @param commandByte The Command Byte @param dataBytes A pointer to the Data bytes to send @param numDataBytes The number of bytes we should send */ -void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8_t numDataBytes) { +void Adafruit_SPITFT_Renderer::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8_t numDataBytes) { SPI_BEGIN_TRANSACTION(); if(_cs >= 0) SPI_CS_LOW(); @@ -1729,12 +1734,12 @@ void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8 } /*! - @brief Adafruit_SPITFT Send Command handles complete sending of commands and const data + @brief Adafruit_SPITFT_Renderer Send Command handles complete sending of commands and const data @param commandByte The Command Byte @param dataBytes A pointer to the Data bytes to send @param numDataBytes The number of bytes we should send */ -void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes) { +void Adafruit_SPITFT_Renderer::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes) { SPI_BEGIN_TRANSACTION(); if(_cs >= 0) SPI_CS_LOW(); @@ -1761,7 +1766,7 @@ void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, @return Unsigned 8-bit data read from display register. */ /**************************************************************************/ -uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { +uint8_t Adafruit_SPITFT_Renderer::readcommand8(uint8_t commandByte, uint8_t index) { uint8_t result; startWrite(); SPI_DC_LOW(); // Command mode @@ -1788,7 +1793,7 @@ uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { chip-select operation -- see startWrite() for a function that encapsulated both actions. */ -inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { +inline void Adafruit_SPITFT_Renderer::SPI_BEGIN_TRANSACTION(void) { if(connection == TFT_HARD_SPI) { #if defined(SPI_HAS_TRANSACTION) hwspi._spi->beginTransaction(hwspi.settings); @@ -1816,7 +1821,7 @@ inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { NOT include a chip-deselect operation -- see endWrite() for a function that encapsulated both actions. */ -inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { +inline void Adafruit_SPITFT_Renderer::SPI_END_TRANSACTION(void) { #if defined(SPI_HAS_TRANSACTION) if(connection == TFT_HARD_SPI) { hwspi._spi->endTransaction(); @@ -1833,7 +1838,7 @@ inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { This function is used even if display connection is parallel. @param b 8-bit value to write. */ -void Adafruit_SPITFT::spiWrite(uint8_t b) { +void Adafruit_SPITFT_Renderer::spiWrite(uint8_t b) { if(connection == TFT_HARD_SPI) { #if defined(__AVR__) AVR_WRITESPI(b); @@ -1869,7 +1874,7 @@ void Adafruit_SPITFT::spiWrite(uint8_t b) { function -- just use spiWrite(). @param cmd 8-bit command to write. */ -void Adafruit_SPITFT::writeCommand(uint8_t cmd) { +void Adafruit_SPITFT_Renderer::writeCommand(uint8_t cmd) { SPI_DC_LOW(); spiWrite(cmd); SPI_DC_HIGH(); @@ -1885,7 +1890,7 @@ void Adafruit_SPITFT::writeCommand(uint8_t cmd) { @return Unsigned 8-bit value read (always zero if USE_FAST_PINIO is not supported by the MCU architecture). */ -uint8_t Adafruit_SPITFT::spiRead(void) { +uint8_t Adafruit_SPITFT_Renderer::spiRead(void) { uint8_t b = 0; uint16_t w = 0; if(connection == TFT_HARD_SPI) { @@ -1943,7 +1948,7 @@ uint8_t Adafruit_SPITFT::spiRead(void) { /*! @brief Set the software (bitbang) SPI MOSI line HIGH. */ -inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { +inline void Adafruit_SPITFT_Renderer::SPI_MOSI_HIGH(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(KINETISK) @@ -1965,7 +1970,7 @@ inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { /*! @brief Set the software (bitbang) SPI MOSI line LOW. */ -inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { +inline void Adafruit_SPITFT_Renderer::SPI_MOSI_LOW(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(KINETISK) @@ -1987,7 +1992,7 @@ inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { /*! @brief Set the software (bitbang) SPI SCK line HIGH. */ -inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { +inline void Adafruit_SPITFT_Renderer::SPI_SCK_HIGH(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(KINETISK) @@ -2012,7 +2017,7 @@ inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { /*! @brief Set the software (bitbang) SPI SCK line LOW. */ -inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { +inline void Adafruit_SPITFT_Renderer::SPI_SCK_LOW(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(KINETISK) @@ -2038,7 +2043,7 @@ inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { @brief Read the state of the software (bitbang) SPI MISO line. @return true if HIGH, false if LOW. */ -inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { +inline bool Adafruit_SPITFT_Renderer::SPI_MISO_READ(void) { #if defined(USE_FAST_PINIO) #if defined(KINETISK) return *swspi.misoPort; @@ -2060,7 +2065,7 @@ inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { that. Again, staying compatible with outside code. @param w 16-bit value to write. */ -void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { +void Adafruit_SPITFT_Renderer::SPI_WRITE16(uint16_t w) { if(connection == TFT_HARD_SPI) { #if defined(__AVR__) AVR_WRITESPI(w >> 8); @@ -2107,7 +2112,7 @@ void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { Sorry about that. Again, staying compatible with outside code. @param l 32-bit value to write. */ -void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { +void Adafruit_SPITFT_Renderer::SPI_WRITE32(uint32_t l) { if(connection == TFT_HARD_SPI) { #if defined(__AVR__) AVR_WRITESPI(l >> 24); @@ -2162,7 +2167,7 @@ void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { @brief Set the WR line LOW, then HIGH. Used for parallel-connected interfaces when writing data. */ -inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { +inline void Adafruit_SPITFT_Renderer::TFT_WR_STROBE(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) #if defined(KINETISK) @@ -2186,7 +2191,7 @@ inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { @brief Set the RD line HIGH. Used for parallel-connected interfaces when reading data. */ -inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { +inline void Adafruit_SPITFT_Renderer::TFT_RD_HIGH(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) *tft8.rdPortSet = tft8.rdPinMask; @@ -2202,7 +2207,7 @@ inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { @brief Set the RD line LOW. Used for parallel-connected interfaces when reading data. */ -inline void Adafruit_SPITFT::TFT_RD_LOW(void) { +inline void Adafruit_SPITFT_Renderer::TFT_RD_LOW(void) { #if defined(USE_FAST_PINIO) #if defined(HAS_PORT_SET_CLR) *tft8.rdPortClr = tft8.rdPinMask; diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h index dcfc1646b..ce8f26d73 100644 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h @@ -1,5 +1,10 @@ +/* + * This class is basically the same as Adafruit_SPITFT. + * The only difference is: it extends Renderer which extends Adafruit_GFX. + * The original Adafruit_SPITFT class directly extends Adafruit_GFX. + */ /*! - * @file Adafruit_SPITFT.h + * @file Adafruit_SPITFT_Renderer.h * * Part of Adafruit's GFX graphics library. Originally this class was * written to handle a range of color TFT displays connected via SPI, @@ -17,8 +22,8 @@ * BSD license, all text here must be included in any redistribution. */ -#ifndef _ADAFRUIT_SPITFT_H_ -#define _ADAFRUIT_SPITFT_H_ +#ifndef _ADAFRUIT_SPITFT_RENDERER_H_ +#define _ADAFRUIT_SPITFT_RENDERER_H_ #if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all @@ -100,7 +105,7 @@ typedef volatile ADAGFX_PORT_t* PORTreg_t; ///< PORT register type // an enumerated type as the first argument: tft8 (for 8-bit parallel) or // tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested // and might never be, still needed that disambiguation from soft SPI. -enum tftBusWidth { tft8bitbus, tft16bitbus }; ///< For first arg to parallel constructor +enum tftBusWidth_Renderer { tft8bitbus_Renderer, tft16bitbus_Renderer }; ///< For first arg to parallel constructor // CLASS DEFINITION -------------------------------------------------------- @@ -117,7 +122,7 @@ enum tftBusWidth { tft8bitbus, tft16bitbus }; ///< For first arg to parallel con again to avoid breaking a lot of other code. If in doubt, read the comments. */ -class Adafruit_SPITFT : public Renderer { +class Adafruit_SPITFT_Renderer : public Renderer { public: @@ -128,7 +133,7 @@ class Adafruit_SPITFT : public Renderer { // (reset, miso). cs argument is required but can be -1 if unused -- // rather than moving it to the optional arguments, it was done this way // to avoid breaking existing code (-1 option was a later addition). - Adafruit_SPITFT(uint16_t w, uint16_t h, + Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t mosi, int8_t sck, int8_t rst = -1, int8_t miso = -1); @@ -137,14 +142,14 @@ class Adafruit_SPITFT : public Renderer { // optional reset pin. cs is required but can be -1 if unused -- rather // than moving it to the optional arguments, it was done this way to // avoid breaking existing code (-1 option was a later addition). - Adafruit_SPITFT(uint16_t w, uint16_t h, + Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, int8_t cs, int8_t dc, int8_t rst = -1); #if !defined(ESP8266) // See notes in .cpp // Hardware SPI constructor using an arbitrary SPI peripheral: expects // width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc) // and optional reset pin. cs is required but can be -1 if unused. - Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, SPIClass *spiClass, int8_t cs, int8_t dc, int8_t rst = -1); #endif // end !ESP8266 @@ -153,7 +158,7 @@ class Adafruit_SPITFT : public Renderer { // pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel // isn't even fully implemented but the 'wide' flag was added as a // required argument to avoid ambiguity with other constructors. - Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + Adafruit_SPITFT_Renderer(uint16_t w, uint16_t h, tftBusWidth_Renderer busWidth, int8_t d0, int8_t wr, int8_t dc, int8_t cs = -1, int8_t rst = -1, int8_t rd = -1); diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp index 78d9901d6..799d87a79 100644 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp @@ -146,7 +146,7 @@ void Adafruit_SSD1331::begin(uint32_t freq) { /**************************************************************************/ Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst) - : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, mosi, sclk, rst, -1) {} + : Adafruit_SPITFT_Renderer(TFTWIDTH, TFTHEIGHT, cs, dc, mosi, sclk, rst, -1) {} /**************************************************************************/ /*! @@ -157,7 +157,7 @@ Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, */ /**************************************************************************/ Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst) - : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, rst) {} + : Adafruit_SPITFT_Renderer(TFTWIDTH, TFTHEIGHT, cs, dc, rst) {} /**************************************************************************/ /*! @@ -173,9 +173,9 @@ Adafruit_SSD1331::Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, int8_t rst) : #if defined(ESP8266) - Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, cs, dc, rst) { + Adafruit_SPITFT_Renderer(TFTWIDTH, TFTWIDTH, cs, dc, rst) { #else - Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, spi, cs, dc, rst) { + Adafruit_SPITFT_Renderer(TFTWIDTH, TFTWIDTH, spi, cs, dc, rst) { #endif } diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h index 7d9bc85a0..e427615c3 100644 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h @@ -55,7 +55,7 @@ #define SSD1331_CMD_VCOMH 0xBE //!< Set Vcomh voltge /// Class to manage hardware interface with SSD1331 chipset -class Adafruit_SSD1331 : public Adafruit_SPITFT { +class Adafruit_SSD1331 : public Adafruit_SPITFT_Renderer { public: Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst); Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst); diff --git a/tasmota/xdsp_14_SSD1331.ino b/tasmota/xdsp_14_SSD1331.ino index be5417426..a7e48eae8 100644 --- a/tasmota/xdsp_14_SSD1331.ino +++ b/tasmota/xdsp_14_SSD1331.ino @@ -19,7 +19,7 @@ #ifdef USE_SPI #ifdef USE_DISPLAY -#ifdef USE_DISPLAY_SSD1331 +#ifdef USE_DISPLAY_SSD1331 // This driver eats 5.3 K flash #define XDSP_14 14 @@ -87,6 +87,7 @@ void SSD1331_InitDriver() { renderer->setTextFont(1); renderer->DrawStringAt(24, 27, "SSD1331", SSD1331_RED, 0); delay(1000); + renderer->clearDisplay(); #endif color_type = COLOR_COLOR; @@ -139,10 +140,11 @@ void SSD1331Time(void) { char line[12]; renderer->clearDisplay(); - renderer->setCursor(0, 0); snprintf_P(line, sizeof(line), PSTR(" %02d" D_HOUR_MINUTE_SEPARATOR "%02d" D_MINUTE_SECOND_SEPARATOR "%02d"), RtcTime.hour, RtcTime.minute, RtcTime.second); // [ 12:34:56 ] + renderer->setCursor(17, 20); renderer->println(line); snprintf_P(line, sizeof(line), PSTR("%02d" D_MONTH_DAY_SEPARATOR "%02d" D_YEAR_MONTH_SEPARATOR "%04d"), RtcTime.day_of_month, RtcTime.month, RtcTime.year); // [01-02-2018] + renderer->setCursor(17, 35); renderer->println(line); renderer->Updateframe(); } From 76ff052ec6be3d7e930786862e7dd3668fdd3774 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 2 Jan 2021 23:11:09 +0100 Subject: [PATCH 091/255] Quick Fix Display watchdogs --- .../Adafruit_SPITFT_Renderer.cpp | 2217 ----------------- .../Adafruit_SPITFT_Renderer.h | 520 ---- .../Adafruit_SSD1331.cpp | 190 -- .../Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h | 76 - .../Adafruit_SSD1331-1.2.0/README.md | 24 - .../Adafruit_SSD1331-1.2.0/library.properties | 10 - .../Adafruit_SSD1331-1.2.0/license.txt | 26 - 7 files changed, 3063 deletions(-) delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/README.md delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties delete mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp deleted file mode 100644 index d49141a28..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp +++ /dev/null @@ -1,2217 +0,0 @@ -/*! - * @file Adafruit_SPITFT.cpp - * - * @mainpage Adafruit SPI TFT Displays (and some others) - * - * @section intro_sec Introduction - * - * Part of Adafruit's GFX graphics library. Originally this class was - * written to handle a range of color TFT displays connected via SPI, - * but over time this library and some display-specific subclasses have - * mutated to include some color OLEDs as well as parallel-interfaced - * displays. The name's been kept for the sake of older code. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit and open-source hardware by purchasing - * products from Adafruit! - - * @section dependencies Dependencies - * - * This library depends on - * Adafruit_GFX being present on your system. Please make sure you have - * installed the latest version before using this library. - * - * @section author Author - * - * Written by Limor "ladyada" Fried for Adafruit Industries, - * with contributions from the open source community. - * - * @section license License - * - * BSD license, all text here must be included in any redistribution. - */ - -#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all - -#include "Adafruit_SPITFT_Renderer.h" - -#if defined(__AVR__) -#if defined(__AVR_XMEGA__) //only tested with __AVR_ATmega4809__ -#define AVR_WRITESPI(x) for(SPI0_DATA = (x); (!(SPI0_INTFLAGS & _BV(SPI_IF_bp))); ) -#else -#define AVR_WRITESPI(x) for(SPDR = (x); (!(SPSR & _BV(SPIF))); ) -#endif -#endif - -#if defined(PORT_IOBUS) -// On SAMD21, redefine digitalPinToPort() to use the slightly-faster -// PORT_IOBUS rather than PORT (not needed on SAMD51). -#undef digitalPinToPort -#define digitalPinToPort(P) (&(PORT_IOBUS->Group[g_APinDescription[P].ulPort])) -#endif // end PORT_IOBUS - -#if defined(USE_SPI_DMA) - #include - #include "wiring_private.h" // pinPeripheral() function - #include // memalign() function - #define tcNum 2 // Timer/Counter for parallel write strobe PWM - #define wrPeripheral PIO_CCL // Use CCL to invert write strobe - - // DMA transfer-in-progress indicator and callback - static volatile bool dma_busy = false; - static void dma_callback(Adafruit_ZeroDMA *dma) { - dma_busy = false; - } - - #if defined(__SAMD51__) - // Timer/counter info by index # - static const struct { - Tc *tc; // -> Timer/Counter base address - int gclk; // GCLK ID - int evu; // EVSYS user ID - } tcList[] = { - { TC0, TC0_GCLK_ID, EVSYS_ID_USER_TC0_EVU }, - { TC1, TC1_GCLK_ID, EVSYS_ID_USER_TC1_EVU }, - { TC2, TC2_GCLK_ID, EVSYS_ID_USER_TC2_EVU }, - { TC3, TC3_GCLK_ID, EVSYS_ID_USER_TC3_EVU }, - #if defined(TC4) - { TC4, TC4_GCLK_ID, EVSYS_ID_USER_TC4_EVU }, - #endif - #if defined(TC5) - { TC5, TC5_GCLK_ID, EVSYS_ID_USER_TC5_EVU }, - #endif - #if defined(TC6) - { TC6, TC6_GCLK_ID, EVSYS_ID_USER_TC6_EVU }, - #endif - #if defined(TC7) - { TC7, TC7_GCLK_ID, EVSYS_ID_USER_TC7_EVU } - #endif - }; - #define NUM_TIMERS (sizeof tcList / sizeof tcList[0]) ///< # timer/counters - #endif // end __SAMD51__ - -#endif // end USE_SPI_DMA - -// Possible values for Adafruit_SPITFT.connection: -#define TFT_HARD_SPI 0 ///< Display interface = hardware SPI -#define TFT_SOFT_SPI 1 ///< Display interface = software SPI -#define TFT_PARALLEL 2 ///< Display interface = 8- or 16-bit parallel - - -// CONSTRUCTORS ------------------------------------------------------------ - -/*! - @brief Adafruit_SPITFT constructor for software (bitbang) SPI. - @param w Display width in pixels at default rotation setting (0). - @param h Display height in pixels at default rotation setting (0). - @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). - @param dc Arduino pin # for data/command select (required). - @param mosi Arduino pin # for bitbang SPI MOSI signal (required). - @param sck Arduino pin # for bitbang SPI SCK signal (required). - @param rst Arduino pin # for display reset (optional, display reset - can be tied to MCU reset, default of -1 means unused). - @param miso Arduino pin # for bitbang SPI MISO signal (optional, - -1 default, many displays don't support SPI read). - @return Adafruit_SPITFT object. - @note Output pins are not initialized; application typically will - need to call subclass' begin() function, which in turn calls - this library's initSPI() function to initialize pins. -*/ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, - int8_t cs, int8_t dc, int8_t mosi, int8_t sck, int8_t rst, int8_t miso) : - Renderer(w, h), connection(TFT_SOFT_SPI), _rst(rst), _cs(cs), _dc(dc) { - swspi._sck = sck; - swspi._mosi = mosi; - swspi._miso = miso; -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(CORE_TEENSY) - #if !defined(KINETISK) - dcPinMask = digitalPinToBitMask(dc); - swspi.sckPinMask = digitalPinToBitMask(sck); - swspi.mosiPinMask = digitalPinToBitMask(mosi); - #endif - dcPortSet = portSetRegister(dc); - dcPortClr = portClearRegister(dc); - swspi.sckPortSet = portSetRegister(sck); - swspi.sckPortClr = portClearRegister(sck); - swspi.mosiPortSet = portSetRegister(mosi); - swspi.mosiPortClr = portClearRegister(mosi); - if(cs >= 0) { - #if !defined(KINETISK) - csPinMask = digitalPinToBitMask(cs); - #endif - csPortSet = portSetRegister(cs); - csPortClr = portClearRegister(cs); - } else { - #if !defined(KINETISK) - csPinMask = 0; - #endif - csPortSet = dcPortSet; - csPortClr = dcPortClr; - } - if(miso >= 0) { - swspi.misoPort = portInputRegister(miso); - #if !defined(KINETISK) - swspi.misoPinMask = digitalPinToBitMask(miso); - #endif - } else { - swspi.misoPort = portInputRegister(dc); - } - #else // !CORE_TEENSY - dcPinMask =digitalPinToBitMask(dc); - swspi.sckPinMask =digitalPinToBitMask(sck); - swspi.mosiPinMask=digitalPinToBitMask(mosi); - dcPortSet =&(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); - dcPortClr =&(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); - swspi.sckPortSet =&(PORT->Group[g_APinDescription[sck].ulPort].OUTSET.reg); - swspi.sckPortClr =&(PORT->Group[g_APinDescription[sck].ulPort].OUTCLR.reg); - swspi.mosiPortSet=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTSET.reg); - swspi.mosiPortClr=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTCLR.reg); - if(cs >= 0) { - csPinMask = digitalPinToBitMask(cs); - csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); - csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPortSet = dcPortSet; - csPortClr = dcPortClr; - csPinMask = 0; - } - if(miso >= 0) { - swspi.misoPinMask=digitalPinToBitMask(miso); - swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); - } else { - swspi.misoPinMask=0; - swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); - } - #endif // end !CORE_TEENSY - #else // !HAS_PORT_SET_CLR - dcPort =(PORTreg_t)portOutputRegister(digitalPinToPort(dc)); - dcPinMaskSet =digitalPinToBitMask(dc); - swspi.sckPort =(PORTreg_t)portOutputRegister(digitalPinToPort(sck)); - swspi.sckPinMaskSet =digitalPinToBitMask(sck); - swspi.mosiPort =(PORTreg_t)portOutputRegister(digitalPinToPort(mosi)); - swspi.mosiPinMaskSet=digitalPinToBitMask(mosi); - if(cs >= 0) { - csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); - csPinMaskSet = digitalPinToBitMask(cs); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPort = dcPort; - csPinMaskSet = 0; - } - if(miso >= 0) { - swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); - swspi.misoPinMask=digitalPinToBitMask(miso); - } else { - swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); - swspi.misoPinMask=0; - } - csPinMaskClr = ~csPinMaskSet; - dcPinMaskClr = ~dcPinMaskSet; - swspi.sckPinMaskClr = ~swspi.sckPinMaskSet; - swspi.mosiPinMaskClr = ~swspi.mosiPinMaskSet; - #endif // !end HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO -} - -/*! - @brief Adafruit_SPITFT constructor for hardware SPI using the board's - default SPI peripheral. - @param w Display width in pixels at default rotation setting (0). - @param h Display height in pixels at default rotation setting (0). - @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). - @param dc Arduino pin # for data/command select (required). - @param rst Arduino pin # for display reset (optional, display reset - can be tied to MCU reset, default of -1 means unused). - @return Adafruit_SPITFT object. - @note Output pins are not initialized; application typically will - need to call subclass' begin() function, which in turn calls - this library's initSPI() function to initialize pins. -*/ -#if defined(ESP8266) // See notes below -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, - int8_t dc, int8_t rst) : Renderer(w, h), - connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { - hwspi._spi = &SPI; -} -#else // !ESP8266 -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, - int8_t dc, int8_t rst) : Adafruit_SPITFT(w, h, &SPI, cs, dc, rst) { - // This just invokes the hardware SPI constructor below, - // passing the default SPI device (&SPI). -} -#endif // end !ESP8266 - -#if !defined(ESP8266) -// ESP8266 compiler freaks out at this constructor -- it can't disambiguate -// beteween the SPIClass pointer (argument #3) and a regular integer. -// Solution here it to just not offer this variant on the ESP8266. You can -// use the default hardware SPI peripheral, or you can use software SPI, -// but if there's any library out there that creates a 'virtual' SPIClass -// peripheral and drives it with software bitbanging, that's not supported. -/*! - @brief Adafruit_SPITFT constructor for hardware SPI using a specific - SPI peripheral. - @param w Display width in pixels at default rotation (0). - @param h Display height in pixels at default rotation (0). - @param spiClass Pointer to SPIClass type (e.g. &SPI or &SPI1). - @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). - @param dc Arduino pin # for data/command select (required). - @param rst Arduino pin # for display reset (optional, display reset - can be tied to MCU reset, default of -1 means unused). - @return Adafruit_SPITFT object. - @note Output pins are not initialized in constructor; application - typically will need to call subclass' begin() function, which - in turn calls this library's initSPI() function to initialize - pins. EXCEPT...if you have built your own SERCOM SPI peripheral - (calling the SPIClass constructor) rather than one of the - built-in SPI devices (e.g. &SPI, &SPI1 and so forth), you will - need to call the begin() function for your object as well as - pinPeripheral() for the MOSI, MISO and SCK pins to configure - GPIO manually. Do this BEFORE calling the display-specific - begin or init function. Unfortunate but unavoidable. -*/ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, - int8_t cs, int8_t dc, int8_t rst) : Renderer(w, h), - connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { - hwspi._spi = spiClass; -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(CORE_TEENSY) - #if !defined(KINETISK) - dcPinMask = digitalPinToBitMask(dc); - #endif - dcPortSet = portSetRegister(dc); - dcPortClr = portClearRegister(dc); - if(cs >= 0) { - #if !defined(KINETISK) - csPinMask = digitalPinToBitMask(cs); - #endif - csPortSet = portSetRegister(cs); - csPortClr = portClearRegister(cs); - } else { // see comments below - #if !defined(KINETISK) - csPinMask = 0; - #endif - csPortSet = dcPortSet; - csPortClr = dcPortClr; - } - #else // !CORE_TEENSY - dcPinMask = digitalPinToBitMask(dc); - dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); - dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); - if(cs >= 0) { - csPinMask = digitalPinToBitMask(cs); - csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); - csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPortSet = dcPortSet; - csPortClr = dcPortClr; - csPinMask = 0; - } - #endif // end !CORE_TEENSY - #else // !HAS_PORT_SET_CLR - dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); - dcPinMaskSet = digitalPinToBitMask(dc); - if(cs >= 0) { - csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); - csPinMaskSet = digitalPinToBitMask(cs); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPort = dcPort; - csPinMaskSet = 0; - } - csPinMaskClr = ~csPinMaskSet; - dcPinMaskClr = ~dcPinMaskSet; - #endif // end !HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO -} -#endif // end !ESP8266 - -/*! - @brief Adafruit_SPITFT constructor for parallel display connection. - @param w Display width in pixels at default rotation (0). - @param h Display height in pixels at default rotation (0). - @param busWidth If tft16 (enumeration in header file), is a 16-bit - parallel connection, else 8-bit. - 16-bit isn't fully implemented or tested yet so - applications should pass "tft8bitbus" for now...needed to - stick a required enum argument in there to - disambiguate this constructor from the soft-SPI case. - Argument is ignored on 8-bit architectures (no 'wide' - support there since PORTs are 8 bits anyway). - @param d0 Arduino pin # for data bit 0 (1+ are extrapolated). - The 8 (or 16) data bits MUST be contiguous and byte- - aligned (or word-aligned for wide interface) within - the same PORT register (might not correspond to - Arduino pin sequence). - @param wr Arduino pin # for write strobe (required). - @param dc Arduino pin # for data/command select (required). - @param cs Arduino pin # for chip-select (optional, -1 if unused, - tie CS low). - @param rst Arduino pin # for display reset (optional, display reset - can be tied to MCU reset, default of -1 means unused). - @param rd Arduino pin # for read strobe (optional, -1 if unused). - @return Adafruit_SPITFT object. - @note Output pins are not initialized; application typically will need - to call subclass' begin() function, which in turn calls this - library's initSPI() function to initialize pins. - Yes, the name is a misnomer...this library originally handled - only SPI displays, parallel being a recent addition (but not - wanting to break existing code). -*/ -Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, - int8_t d0, int8_t wr, int8_t dc, int8_t cs, int8_t rst, int8_t rd) : - Renderer(w, h), connection(TFT_PARALLEL), _rst(rst), _cs(cs), _dc(dc) { - tft8._d0 = d0; - tft8._wr = wr; - tft8._rd = rd; - tft8.wide = (busWidth == tft16bitbus); -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(CORE_TEENSY) - tft8.wrPortSet = portSetRegister(wr); - tft8.wrPortClr = portClearRegister(wr); - #if !defined(KINETISK) - dcPinMask = digitalPinToBitMask(dc); - #endif - dcPortSet = portSetRegister(dc); - dcPortClr = portClearRegister(dc); - if(cs >= 0) { - #if !defined(KINETISK) - csPinMask = digitalPinToBitMask(cs); - #endif - csPortSet = portSetRegister(cs); - csPortClr = portClearRegister(cs); - } else { // see comments below - #if !defined(KINETISK) - csPinMask = 0; - #endif - csPortSet = dcPortSet; - csPortClr = dcPortClr; - } - if(rd >= 0) { // if read-strobe pin specified... - #if defined(KINETISK) - tft8.rdPinMask = 1; - #else // !KINETISK - tft8.rdPinMask = digitalPinToBitMask(rd); - #endif - tft8.rdPortSet = portSetRegister(rd); - tft8.rdPortClr = portClearRegister(rd); - } else { - tft8.rdPinMask = 0; - tft8.rdPortSet = dcPortSet; - tft8.rdPortClr = dcPortClr; - } - // These are all uint8_t* pointers -- elsewhere they're recast - // as necessary if a 'wide' 16-bit interface is in use. - tft8.writePort = portOutputRegister(d0); - tft8.readPort = portInputRegister(d0); - tft8.dirSet = portModeRegister(d0); - tft8.dirClr = portModeRegister(d0); - #else // !CORE_TEENSY - tft8.wrPinMask = digitalPinToBitMask(wr); - tft8.wrPortSet = &(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg); - tft8.wrPortClr = &(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg); - dcPinMask = digitalPinToBitMask(dc); - dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); - dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); - if(cs >= 0) { - csPinMask = digitalPinToBitMask(cs); - csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); - csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPortSet = dcPortSet; - csPortClr = dcPortClr; - csPinMask = 0; - } - if(rd >= 0) { // if read-strobe pin specified... - tft8.rdPinMask =digitalPinToBitMask(rd); - tft8.rdPortSet =&(PORT->Group[g_APinDescription[rd].ulPort].OUTSET.reg); - tft8.rdPortClr =&(PORT->Group[g_APinDescription[rd].ulPort].OUTCLR.reg); - } else { - tft8.rdPinMask = 0; - tft8.rdPortSet = dcPortSet; - tft8.rdPortClr = dcPortClr; - } - // Get pointers to PORT write/read/dir bytes within 32-bit PORT - uint8_t dBit = g_APinDescription[d0].ulPin; // d0 bit # in PORT - PortGroup *p = (&(PORT->Group[g_APinDescription[d0].ulPort])); - uint8_t offset = dBit / 8; // d[7:0] byte # within PORT - if(tft8.wide) offset &= ~1; // d[15:8] byte # within PORT - // These are all uint8_t* pointers -- elsewhere they're recast - // as necessary if a 'wide' 16-bit interface is in use. - tft8.writePort = (volatile uint8_t *)&(p->OUT.reg) + offset; - tft8.readPort = (volatile uint8_t *)&(p->IN.reg) + offset; - tft8.dirSet = (volatile uint8_t *)&(p->DIRSET.reg) + offset; - tft8.dirClr = (volatile uint8_t *)&(p->DIRCLR.reg) + offset; - #endif // end !CORE_TEENSY - #else // !HAS_PORT_SET_CLR - tft8.wrPort = (PORTreg_t)portOutputRegister(digitalPinToPort(wr)); - tft8.wrPinMaskSet = digitalPinToBitMask(wr); - dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); - dcPinMaskSet = digitalPinToBitMask(dc); - if(cs >= 0) { - csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); - csPinMaskSet = digitalPinToBitMask(cs); - } else { - // No chip-select line defined; might be permanently tied to GND. - // Assign a valid GPIO register (though not used for CS), and an - // empty pin bitmask...the nonsense bit-twiddling might be faster - // than checking _cs and possibly branching. - csPort = dcPort; - csPinMaskSet = 0; - } - if(rd >= 0) { // if read-strobe pin specified... - tft8.rdPort =(PORTreg_t)portOutputRegister(digitalPinToPort(rd)); - tft8.rdPinMaskSet =digitalPinToBitMask(rd); - } else { - tft8.rdPort = dcPort; - tft8.rdPinMaskSet = 0; - } - csPinMaskClr = ~csPinMaskSet; - dcPinMaskClr = ~dcPinMaskSet; - tft8.wrPinMaskClr = ~tft8.wrPinMaskSet; - tft8.rdPinMaskClr = ~tft8.rdPinMaskSet; - tft8.writePort = (PORTreg_t)portOutputRegister(digitalPinToPort(d0)); - tft8.readPort = (PORTreg_t)portInputRegister(digitalPinToPort(d0)); - tft8.portDir = (PORTreg_t)portModeRegister(digitalPinToPort(d0)); - #endif // end !HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO -} - -// end constructors ------- - - -// CLASS MEMBER FUNCTIONS -------------------------------------------------- - -// begin() and setAddrWindow() MUST be declared by any subclass. - -/*! - @brief Configure microcontroller pins for TFT interfacing. Typically - called by a subclass' begin() function. - @param freq SPI frequency when using hardware SPI. If default (0) - is passed, will fall back on a device-specific value. - Value is ignored when using software SPI or parallel - connection. - @param spiMode SPI mode when using hardware SPI. MUST be one of the - values SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3 - defined in SPI.h. Do NOT attempt to pass '0' for - SPI_MODE0 and so forth...the values are NOT the same! - Use ONLY the defines! (Pity it's not an enum.) - @note Another anachronistically-named function; this is called even - when the display connection is parallel (not SPI). Also, this - could probably be made private...quite a few class functions - were generously put in the public section. -*/ -void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { - - if(!freq) freq = DEFAULT_SPI_FREQ; // If no freq specified, use default - - // Init basic control pins common to all connection types - if(_cs >= 0) { - pinMode(_cs, OUTPUT); - digitalWrite(_cs, HIGH); // Deselect - } - pinMode(_dc, OUTPUT); - digitalWrite(_dc, HIGH); // Data mode - - if(connection == TFT_HARD_SPI) { - -#if defined(SPI_HAS_TRANSACTION) - hwspi.settings = SPISettings(freq, MSBFIRST, spiMode); -#else - hwspi._freq = freq; // Save freq value for later -#endif - hwspi._mode = spiMode; // Save spiMode value for later - // Call hwspi._spi->begin() ONLY if this is among the 'established' - // SPI interfaces in variant.h. For DIY roll-your-own SERCOM SPIs, - // begin() and pinPeripheral() calls MUST be made in one's calling - // code, BEFORE the screen-specific begin/init function is called. - // Reason for this is that SPI::begin() makes its own calls to - // pinPeripheral() based on g_APinDescription[n].ulPinType, which - // on non-established SPI interface pins will always be PIO_DIGITAL - // or similar, while we need PIO_SERCOM or PIO_SERCOM_ALT...it's - // highly unique between devices and variants for each pin or - // SERCOM so we can't make those calls ourselves here. And the SPI - // device needs to be set up before calling this because it's - // immediately followed with initialization commands. Blargh. - if( -#if !defined(SPI_INTERFACES_COUNT) - 1 -#endif -#if SPI_INTERFACES_COUNT > 0 - (hwspi._spi == &SPI) -#endif -#if SPI_INTERFACES_COUNT > 1 - || (hwspi._spi == &SPI1) -#endif -#if SPI_INTERFACES_COUNT > 2 - || (hwspi._spi == &SPI2) -#endif -#if SPI_INTERFACES_COUNT > 3 - || (hwspi._spi == &SPI3) -#endif -#if SPI_INTERFACES_COUNT > 4 - || (hwspi._spi == &SPI4) -#endif -#if SPI_INTERFACES_COUNT > 5 - || (hwspi._spi == &SPI5) -#endif - ) { - hwspi._spi->begin(); - } - } else if(connection == TFT_SOFT_SPI) { - - pinMode(swspi._mosi, OUTPUT); - digitalWrite(swspi._mosi, LOW); - pinMode(swspi._sck, OUTPUT); - digitalWrite(swspi._sck, LOW); - if(swspi._miso >= 0) { - pinMode(swspi._miso, INPUT); - } - - } else { // TFT_PARALLEL - - // Initialize data pins. We were only passed d0, so scan - // the pin description list looking for the other pins. - // They'll be on the same PORT, and within the next 7 (or 15) bits - // (because we need to write to a contiguous PORT byte or word). -#if defined(__AVR__) - // PORT registers are 8 bits wide, so just need a register match... - for(uint8_t i=0; i= dBit ) && - (g_APinDescription[i].ulPin <= (uint32_t)lastBit)) { - pinMode(i, OUTPUT); - digitalWrite(i, LOW); - } - } - #endif // end !CORE_TEENSY -#endif - pinMode(tft8._wr, OUTPUT); - digitalWrite(tft8._wr, HIGH); - if(tft8._rd >= 0) { - pinMode(tft8._rd, OUTPUT); - digitalWrite(tft8._rd, HIGH); - } - } - - if(_rst >= 0) { - // Toggle _rst low to reset - pinMode(_rst, OUTPUT); - digitalWrite(_rst, HIGH); - delay(100); - digitalWrite(_rst, LOW); - delay(100); - digitalWrite(_rst, HIGH); - delay(200); - } - -#if defined(USE_SPI_DMA) - if(((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) && - (dma.allocate() == DMA_STATUS_OK)) { // Allocate channel - // The DMA library needs to alloc at least one valid descriptor, - // so we do that here. It's not used in the usual sense though, - // just before a transfer we copy descriptor[0] to this address. - if(dptr = dma.addDescriptor(NULL, NULL, 42, DMA_BEAT_SIZE_BYTE, - false, false)) { - // Alloc 2 scanlines worth of pixels on display's major axis, - // whichever that is, rounding each up to 2-pixel boundary. - int major = (WIDTH > HEIGHT) ? WIDTH : HEIGHT; - major += (major & 1); // -> next 2-pixel bound, if needed. - maxFillLen = major * 2; // 2 scanlines - // Note to future self: if you decide to make the pixel buffer - // much larger, remember that DMA transfer descriptors can't - // exceed 65,535 bytes (not 65,536), meaning 32,767 pixels max. - // Not that we have that kind of RAM to throw around right now. - if((pixelBuf[0] = - (uint16_t *)malloc(maxFillLen * sizeof(uint16_t)))) { - // Alloc OK. Get pointer to start of second scanline. - pixelBuf[1] = &pixelBuf[0][major]; - // Determine number of DMA descriptors needed to cover - // entire screen when entire 2-line pixelBuf is used - // (round up for fractional last descriptor). - int numDescriptors = (WIDTH * HEIGHT + (maxFillLen - 1)) / - maxFillLen; - // DMA descriptors MUST be 128-bit (16 byte) aligned. - // memalign() is considered obsolete but it's replacements - // (aligned_alloc() or posix_memalign()) are not currently - // available in the version of ARM GCC in use, but this - // is, so here we are. - if((descriptor = (DmacDescriptor *)memalign(16, - numDescriptors * sizeof(DmacDescriptor)))) { - int dmac_id; - volatile uint32_t *data_reg; - - if(connection == TFT_HARD_SPI) { - // THIS IS AN AFFRONT TO NATURE, but I don't know - // any "clean" way to get the sercom number from the - // the SPIClass pointer (e.g. &SPI or &SPI1), which - // is all we have to work with. SPIClass does contain - // a SERCOM pointer but it is a PRIVATE member! - // Doing an UNSPEAKABLY HORRIBLE THING here, directly - // accessing the first 32-bit value in the SPIClass - // structure, knowing that's (currently) where the - // SERCOM pointer lives, but this ENTIRELY DEPENDS on - // that structure not changing nor the compiler - // rearranging things. Oh the humanity! - - if(*(SERCOM **)hwspi._spi == &sercom0) { - dmac_id = SERCOM0_DMAC_ID_TX; - data_reg = &SERCOM0->SPI.DATA.reg; -#if defined SERCOM1 - } else if(*(SERCOM **)hwspi._spi == &sercom1) { - dmac_id = SERCOM1_DMAC_ID_TX; - data_reg = &SERCOM1->SPI.DATA.reg; -#endif -#if defined SERCOM2 - } else if(*(SERCOM **)hwspi._spi == &sercom2) { - dmac_id = SERCOM2_DMAC_ID_TX; - data_reg = &SERCOM2->SPI.DATA.reg; -#endif -#if defined SERCOM3 - } else if(*(SERCOM **)hwspi._spi == &sercom3) { - dmac_id = SERCOM3_DMAC_ID_TX; - data_reg = &SERCOM3->SPI.DATA.reg; -#endif -#if defined SERCOM4 - } else if(*(SERCOM **)hwspi._spi == &sercom4) { - dmac_id = SERCOM4_DMAC_ID_TX; - data_reg = &SERCOM4->SPI.DATA.reg; -#endif -#if defined SERCOM5 - } else if(*(SERCOM **)hwspi._spi == &sercom5) { - dmac_id = SERCOM5_DMAC_ID_TX; - data_reg = &SERCOM5->SPI.DATA.reg; -#endif -#if defined SERCOM6 - } else if(*(SERCOM **)hwspi._spi == &sercom6) { - dmac_id = SERCOM6_DMAC_ID_TX; - data_reg = &SERCOM6->SPI.DATA.reg; -#endif -#if defined SERCOM7 - } else if(*(SERCOM **)hwspi._spi == &sercom7) { - dmac_id = SERCOM7_DMAC_ID_TX; - data_reg = &SERCOM7->SPI.DATA.reg; -#endif - } - dma.setPriority(DMA_PRIORITY_3); - dma.setTrigger(dmac_id); - dma.setAction(DMA_TRIGGER_ACTON_BEAT); - - // Initialize descriptor list. - for(int d=0; dChannel[dmaChannel].CHEVCTRL.bit.EVOE = 1; - DMAC->Channel[dmaChannel].CHEVCTRL.bit.EVOMODE = 0; - - // CONFIGURE TIMER/COUNTER (for write strobe) - - Tc *timer = tcList[tcNum].tc; // -> Timer struct - int id = tcList[tcNum].gclk; // Timer GCLK ID - GCLK_PCHCTRL_Type pchctrl; - - // Set up timer clock source from GCLK - GCLK->PCHCTRL[id].bit.CHEN = 0; // Stop timer - while(GCLK->PCHCTRL[id].bit.CHEN); // Wait for it - pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; - pchctrl.bit.CHEN = 1; // Enable - GCLK->PCHCTRL[id].reg = pchctrl.reg; - while(!GCLK->PCHCTRL[id].bit.CHEN); // Wait for it - - // Disable timer/counter before configuring it - timer->COUNT8.CTRLA.bit.ENABLE = 0; - while(timer->COUNT8.SYNCBUSY.bit.STATUS); - - timer->COUNT8.WAVE.bit.WAVEGEN = 2; // NPWM - timer->COUNT8.CTRLA.bit.MODE = 1; // 8-bit - timer->COUNT8.CTRLA.bit.PRESCALER = 0; // 1:1 - while(timer->COUNT8.SYNCBUSY.bit.STATUS); - - timer->COUNT8.CTRLBCLR.bit.DIR = 1; // Count UP - while(timer->COUNT8.SYNCBUSY.bit.CTRLB); - timer->COUNT8.CTRLBSET.bit.ONESHOT = 1; // One-shot - while(timer->COUNT8.SYNCBUSY.bit.CTRLB); - timer->COUNT8.PER.reg = 6; // PWM top - while(timer->COUNT8.SYNCBUSY.bit.PER); - timer->COUNT8.CC[0].reg = 2; // Compare - while(timer->COUNT8.SYNCBUSY.bit.CC0); - // Enable async input events, - // event action = restart. - timer->COUNT8.EVCTRL.bit.TCEI = 1; - timer->COUNT8.EVCTRL.bit.EVACT = 1; - - // Enable timer - timer->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE; - while(timer->COUNT8.SYNCBUSY.bit.STATUS); - -#if(wrPeripheral == PIO_CCL) - // CONFIGURE CCL (inverts timer/counter output) - - MCLK->APBCMASK.bit.CCL_ = 1; // Enable CCL clock - CCL->CTRL.bit.ENABLE = 0; // Disable to config - CCL->CTRL.bit.SWRST = 1; // Reset CCL registers - CCL->LUTCTRL[tcNum].bit.ENABLE = 0; // Disable LUT - CCL->LUTCTRL[tcNum].bit.FILTSEL = 0; // No filter - CCL->LUTCTRL[tcNum].bit.INSEL0 = 6; // TC input - CCL->LUTCTRL[tcNum].bit.INSEL1 = 0; // MASK - CCL->LUTCTRL[tcNum].bit.INSEL2 = 0; // MASK - CCL->LUTCTRL[tcNum].bit.TRUTH = 1; // Invert in 0 - CCL->LUTCTRL[tcNum].bit.ENABLE = 1; // Enable LUT - CCL->CTRL.bit.ENABLE = 1; // Enable CCL -#endif - - // CONFIGURE EVENT SYSTEM - - // Set up event system clock source from GCLK... - // Disable EVSYS, wait for disable - GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN = 0; - while(GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); - pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; - pchctrl.bit.CHEN = 1; // Re-enable - GCLK->PCHCTRL[EVSYS_GCLK_ID_0].reg = pchctrl.reg; - // Wait for it, then enable EVSYS clock - while(!GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); - MCLK->APBBMASK.bit.EVSYS_ = 1; - - // Connect Timer EVU to ch 0 - EVSYS->USER[tcList[tcNum].evu].reg = 1; - // Datasheet recommends single write operation; - // reg instead of bit. Also datasheet: PATH bits - // must be zero when using async! - EVSYS_CHANNEL_Type ev; - ev.reg = 0; - ev.bit.PATH = 2; // Asynchronous - ev.bit.EVGEN = 0x22 + dmaChannel; // DMA channel 0+ - EVSYS->Channel[0].CHANNEL.reg = ev.reg; - - // Initialize descriptor list. - for(int d=0; d= 0) SPI_CS_LOW(); -} - -/*! - @brief Call after issuing command(s) or data to display. Performs - chip-deselect (if required) and ends an SPI transaction (if - using hardware SPI and transactions are supported). Required - for all display types; not an SPI-specific function. -*/ -void Adafruit_SPITFT::endWrite(void) { - if(_cs >= 0) SPI_CS_HIGH(); - SPI_END_TRANSACTION(); -} - - -// ------------------------------------------------------------------------- -// Lower-level graphics operations. These functions require a chip-select -// and/or SPI transaction around them (via startWrite(), endWrite() above). -// Higher-level graphics primitives might start a single transaction and -// then make multiple calls to these functions (e.g. circle or text -// rendering might make repeated lines or rects) before ending the -// transaction. It's more efficient than starting a transaction every time. - -/*! - @brief Draw a single pixel to the display at requested coordinates. - Not self-contained; should follow a startWrite() call. - @param x Horizontal position (0 = left). - @param y Vertical position (0 = top). - @param color 16-bit pixel color in '565' RGB format. -*/ -void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { - if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { - setAddrWindow(x, y, 1, 1); - SPI_WRITE16(color); - } -} - -/*! - @brief Issue a series of pixels from memory to the display. Not self- - contained; should follow startWrite() and setAddrWindow() calls. - @param colors Pointer to array of 16-bit pixel values in '565' RGB - format. - @param len Number of elements in 'colors' array. - @param block If true (default case if unspecified), function blocks - until DMA transfer is complete. This is simply IGNORED - if DMA is not enabled. If false, the function returns - immediately after the last DMA transfer is started, - and one should use the dmaWait() function before - doing ANY other display-related activities (or even - any SPI-related activities, if using an SPI display - that shares the bus with other devices). - @param bigEndian If using DMA, and if set true, bitmap in memory is in - big-endian order (most significant byte first). By - default this is false, as most microcontrollers seem - to be little-endian and 16-bit pixel values must be - byte-swapped before issuing to the display (which tend - to be big-endian when using SPI or 8-bit parallel). - If an application can optimize around this -- for - example, a bitmap in a uint16_t array having the byte - values already reordered big-endian, this can save - some processing time here, ESPECIALLY if using this - function's non-blocking DMA mode. Not all cases are - covered...this is really here only for SAMD DMA and - much forethought on the application side. -*/ -void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, - bool block, bool bigEndian) { - - if(!len) return; // Avoid 0-byte transfers - -#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... - if(connection == TFT_HARD_SPI) { - hwspi._spi->writePixels(colors, len * 2); - return; - } -#elif defined(USE_SPI_DMA) - if((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) { - int maxSpan = maxFillLen / 2; // One scanline max - uint8_t pixelBufIdx = 0; // Active pixel buffer number - #if defined(__SAMD51__) - if(connection == TFT_PARALLEL) { - // Switch WR pin to PWM or CCL - pinPeripheral(tft8._wr, wrPeripheral); - } - #endif // end __SAMD51__ - if(!bigEndian) { // Normal little-endian situation... - while(len) { - int count = (len < maxSpan) ? len : maxSpan; - - // Because TFT and SAMD endianisms are different, must swap - // bytes from the 'colors' array passed into a DMA working - // buffer. This can take place while the prior DMA transfer - // is in progress, hence the need for two pixelBufs. - for(int i=0; isetDataMode(hwspi._mode); - } else { - pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO - } - #endif // end __SAMD51__ || _SAMD21_ - } - return; - } -#endif // end USE_SPI_DMA - - // All other cases (bitbang SPI or non-DMA hard SPI or parallel), - // use a loop with the normal 16-bit data write function: - while(len--) { - SPI_WRITE16(*colors++); - } -} - -/*! - @brief Wait for the last DMA transfer in a prior non-blocking - writePixels() call to complete. This does nothing if DMA - is not enabled, and is not needed if blocking writePixels() - was used (as is the default case). -*/ -void Adafruit_SPITFT::dmaWait(void) { -#if defined(USE_SPI_DMA) - while(dma_busy); - #if defined(__SAMD51__) || defined(_SAMD21_) - if(connection == TFT_HARD_SPI) { - // See SAMD51/21 note in writeColor() - hwspi._spi->setDataMode(hwspi._mode); - } else { - pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO - } - #endif // end __SAMD51__ || _SAMD21_ -#endif -} - -/*! - @brief Issue a series of pixels, all the same color. Not self- - contained; should follow startWrite() and setAddrWindow() calls. - @param color 16-bit pixel color in '565' RGB format. - @param len Number of pixels to draw. -*/ -void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { - - if(!len) return; // Avoid 0-byte transfers - - uint8_t hi = color >> 8, lo = color; - -#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... - if(connection == TFT_HARD_SPI) { - #define SPI_MAX_PIXELS_AT_ONCE 32 - #define TMPBUF_LONGWORDS (SPI_MAX_PIXELS_AT_ONCE + 1) / 2 - #define TMPBUF_PIXELS (TMPBUF_LONGWORDS * 2) - static uint32_t temp[TMPBUF_LONGWORDS]; - uint32_t c32 = color * 0x00010001; - uint16_t bufLen = (len < TMPBUF_PIXELS) ? len : TMPBUF_PIXELS, - xferLen, fillLen; - // Fill temp buffer 32 bits at a time - fillLen = (bufLen + 1) / 2; // Round up to next 32-bit boundary - for(uint32_t t=0; t= 16)) { // Don't bother with DMA on short pixel runs - int i, d, numDescriptors; - if(hi == lo) { // If high & low bytes are same... - onePixelBuf = color; - // Can do this with a relatively short descriptor list, - // each transferring a max of 32,767 (not 32,768) pixels. - // This won't run off the end of the allocated descriptor list, - // since we're using much larger chunks per descriptor here. - numDescriptors = (len + 32766) / 32767; - for(d=0; d lastFillLen) { - int fillStart = lastFillLen / 2, - fillEnd = (((len < maxFillLen) ? - len : maxFillLen) + 1) / 2; - for(i=fillStart; isetDataMode(hwspi._mode); - } else { - pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO - } - #endif // end __SAMD51__ - return; - } - #endif // end USE_SPI_DMA -#endif // end !ESP32 - - // All other cases (non-DMA hard SPI, bitbang SPI, parallel)... - - if(connection == TFT_HARD_SPI) { -#if defined(ESP8266) - do { - uint32_t pixelsThisPass = len; - if(pixelsThisPass > 50000) pixelsThisPass = 50000; - len -= pixelsThisPass; - yield(); // Periodic yield() on long fills - while(pixelsThisPass--) { - hwspi._spi->write(hi); - hwspi._spi->write(lo); - } - } while(len); -#else // !ESP8266 - while(len--) { - #if defined(__AVR__) - AVR_WRITESPI(hi); - AVR_WRITESPI(lo); - #elif defined(ESP32) - hwspi._spi->write(hi); - hwspi._spi->write(lo); - #else - hwspi._spi->transfer(hi); - hwspi._spi->transfer(lo); - #endif - } -#endif // end !ESP8266 - } else if(connection == TFT_SOFT_SPI) { -#if defined(ESP8266) - do { - uint32_t pixelsThisPass = len; - if(pixelsThisPass > 20000) pixelsThisPass = 20000; - len -= pixelsThisPass; - yield(); // Periodic yield() on long fills - while(pixelsThisPass--) { - for(uint16_t bit=0, x=color; bit<16; bit++) { - if(x & 0x8000) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - SPI_SCK_LOW(); - x <<= 1; - } - } - } while(len); -#else // !ESP8266 - while(len--) { - #if defined(__AVR__) - for(uint8_t bit=0, x=hi; bit<8; bit++) { - if(x & 0x80) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - SPI_SCK_LOW(); - x <<= 1; - } - for(uint8_t bit=0, x=lo; bit<8; bit++) { - if(x & 0x80) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - SPI_SCK_LOW(); - x <<= 1; - } - #else // !__AVR__ - for(uint16_t bit=0, x=color; bit<16; bit++) { - if(x & 0x8000) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - x <<= 1; - SPI_SCK_LOW(); - } - #endif // end !__AVR__ - } -#endif // end !ESP8266 - } else { // PARALLEL - if(hi == lo) { -#if defined(__AVR__) - len *= 2; - *tft8.writePort = hi; - while(len--) { - TFT_WR_STROBE(); - } -#elif defined(USE_FAST_PINIO) - if(!tft8.wide) { - len *= 2; - *tft8.writePort = hi; - } else { - *(volatile uint16_t *)tft8.writePort = color; - } - while(len--) { - TFT_WR_STROBE(); - } -#endif - } else { - while(len--) { -#if defined(__AVR__) - *tft8.writePort = hi; - TFT_WR_STROBE(); - *tft8.writePort = lo; -#elif defined(USE_FAST_PINIO) - if(!tft8.wide) { - *tft8.writePort = hi; - TFT_WR_STROBE(); - *tft8.writePort = lo; - } else { - *(volatile uint16_t *)tft8.writePort = color; - } -#endif - TFT_WR_STROBE(); - } - } - } -} - -/*! - @brief Draw a filled rectangle to the display. Not self-contained; - should follow startWrite(). Typically used by higher-level - graphics primitives; user code shouldn't need to call this and - is likely to use the self-contained fillRect() instead. - writeFillRect() performs its own edge clipping and rejection; - see writeFillRectPreclipped() for a more 'raw' implementation. - @param x Horizontal position of first corner. - @param y Vertical position of first corner. - @param w Rectangle width in pixels (positive = right of first - corner, negative = left of first corner). - @param h Rectangle height in pixels (positive = below first - corner, negative = above first corner). - @param color 16-bit fill color in '565' RGB format. - @note Written in this deep-nested way because C by definition will - optimize for the 'if' case, not the 'else' -- avoids branches - and rejects clipped rectangles at the least-work possibility. -*/ -void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, - int16_t w, int16_t h, uint16_t color) { - if(w && h) { // Nonzero width and height? - if(w < 0) { // If negative width... - x += w + 1; // Move X to left edge - w = -w; // Use positive width - } - if(x < _width) { // Not off right - if(h < 0) { // If negative height... - y += h + 1; // Move Y to top edge - h = -h; // Use positive height - } - if(y < _height) { // Not off bottom - int16_t x2 = x + w - 1; - if(x2 >= 0) { // Not off left - int16_t y2 = y + h - 1; - if(y2 >= 0) { // Not off top - // Rectangle partly or fully overlaps screen - if(x < 0) { x = 0; w = x2 + 1; } // Clip left - if(y < 0) { y = 0; h = y2 + 1; } // Clip top - if(x2 >= _width) { w = _width - x; } // Clip right - if(y2 >= _height) { h = _height - y; } // Clip bottom - writeFillRectPreclipped(x, y, w, h, color); - } - } - } - } - } -} - -/*! - @brief Draw a horizontal line on the display. Performs edge clipping - and rejection. Not self-contained; should follow startWrite(). - Typically used by higher-level graphics primitives; user code - shouldn't need to call this and is likely to use the self- - contained drawFastHLine() instead. - @param x Horizontal position of first point. - @param y Vertical position of first point. - @param w Line width in pixels (positive = right of first point, - negative = point of first corner). - @param color 16-bit line color in '565' RGB format. -*/ -void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color) { - if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width - if(w < 0) { // If negative width... - x += w + 1; // Move X to left edge - w = -w; // Use positive width - } - if(x < _width) { // Not off right - int16_t x2 = x + w - 1; - if(x2 >= 0) { // Not off left - // Line partly or fully overlaps screen - if(x < 0) { x = 0; w = x2 + 1; } // Clip left - if(x2 >= _width) { w = _width - x; } // Clip right - writeFillRectPreclipped(x, y, w, 1, color); - } - } - } -} - -/*! - @brief Draw a vertical line on the display. Performs edge clipping and - rejection. Not self-contained; should follow startWrite(). - Typically used by higher-level graphics primitives; user code - shouldn't need to call this and is likely to use the self- - contained drawFastVLine() instead. - @param x Horizontal position of first point. - @param y Vertical position of first point. - @param h Line height in pixels (positive = below first point, - negative = above first point). - @param color 16-bit line color in '565' RGB format. -*/ -void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color) { - if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height - if(h < 0) { // If negative height... - y += h + 1; // Move Y to top edge - h = -h; // Use positive height - } - if(y < _height) { // Not off bottom - int16_t y2 = y + h - 1; - if(y2 >= 0) { // Not off top - // Line partly or fully overlaps screen - if(y < 0) { y = 0; h = y2 + 1; } // Clip top - if(y2 >= _height) { h = _height - y; } // Clip bottom - writeFillRectPreclipped(x, y, 1, h, color); - } - } - } -} - -/*! - @brief A lower-level version of writeFillRect(). This version requires - all inputs are in-bounds, that width and height are positive, - and no part extends offscreen. NO EDGE CLIPPING OR REJECTION IS - PERFORMED. If higher-level graphics primitives are written to - handle their own clipping earlier in the drawing process, this - can avoid unnecessary function calls and repeated clipping - operations in the lower-level functions. - @param x Horizontal position of first corner. MUST BE WITHIN - SCREEN BOUNDS. - @param y Vertical position of first corner. MUST BE WITHIN SCREEN - BOUNDS. - @param w Rectangle width in pixels. MUST BE POSITIVE AND NOT - EXTEND OFF SCREEN. - @param h Rectangle height in pixels. MUST BE POSITIVE AND NOT - EXTEND OFF SCREEN. - @param color 16-bit fill color in '565' RGB format. - @note This is a new function, no graphics primitives besides rects - and horizontal/vertical lines are written to best use this yet. -*/ -inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, - int16_t w, int16_t h, uint16_t color) { - setAddrWindow(x, y, w, h); - writeColor(color, (uint32_t)w * h); -} - - -// ------------------------------------------------------------------------- -// Ever-so-slightly higher-level graphics operations. Similar to the 'write' -// functions above, but these contain their own chip-select and SPI -// transactions as needed (via startWrite(), endWrite()). They're typically -// used solo -- as graphics primitives in themselves, not invoked by higher- -// level primitives (which should use the functions above for better -// performance). - -/*! - @brief Draw a single pixel to the display at requested coordinates. - Self-contained and provides its own transaction as needed - (see writePixel(x,y,color) for a lower-level variant). - Edge clipping is performed here. - @param x Horizontal position (0 = left). - @param y Vertical position (0 = top). - @param color 16-bit pixel color in '565' RGB format. -*/ -void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { - // Clip first... - if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { - // THEN set up transaction (if needed) and draw... - startWrite(); - setAddrWindow(x, y, 1, 1); - SPI_WRITE16(color); - endWrite(); - } -} - -/*! - @brief Draw a filled rectangle to the display. Self-contained and - provides its own transaction as needed (see writeFillRect() or - writeFillRectPreclipped() for lower-level variants). Edge - clipping and rejection is performed here. - @param x Horizontal position of first corner. - @param y Vertical position of first corner. - @param w Rectangle width in pixels (positive = right of first - corner, negative = left of first corner). - @param h Rectangle height in pixels (positive = below first - corner, negative = above first corner). - @param color 16-bit fill color in '565' RGB format. - @note This repeats the writeFillRect() function almost in its entirety, - with the addition of a transaction start/end. It's done this way - (rather than starting the transaction and calling writeFillRect() - to handle clipping and so forth) so that the transaction isn't - performed at all if the rectangle is rejected. It's really not - that much code. -*/ -void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color) { - if(w && h) { // Nonzero width and height? - if(w < 0) { // If negative width... - x += w + 1; // Move X to left edge - w = -w; // Use positive width - } - if(x < _width) { // Not off right - if(h < 0) { // If negative height... - y += h + 1; // Move Y to top edge - h = -h; // Use positive height - } - if(y < _height) { // Not off bottom - int16_t x2 = x + w - 1; - if(x2 >= 0) { // Not off left - int16_t y2 = y + h - 1; - if(y2 >= 0) { // Not off top - // Rectangle partly or fully overlaps screen - if(x < 0) { x = 0; w = x2 + 1; } // Clip left - if(y < 0) { y = 0; h = y2 + 1; } // Clip top - if(x2 >= _width) { w = _width - x; } // Clip right - if(y2 >= _height) { h = _height - y; } // Clip bottom - startWrite(); - writeFillRectPreclipped(x, y, w, h, color); - endWrite(); - } - } - } - } - } -} - -/*! - @brief Draw a horizontal line on the display. Self-contained and - provides its own transaction as needed (see writeFastHLine() for - a lower-level variant). Edge clipping and rejection is performed - here. - @param x Horizontal position of first point. - @param y Vertical position of first point. - @param w Line width in pixels (positive = right of first point, - negative = point of first corner). - @param color 16-bit line color in '565' RGB format. - @note This repeats the writeFastHLine() function almost in its - entirety, with the addition of a transaction start/end. It's - done this way (rather than starting the transaction and calling - writeFastHLine() to handle clipping and so forth) so that the - transaction isn't performed at all if the line is rejected. -*/ -void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color) { - if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width - if(w < 0) { // If negative width... - x += w + 1; // Move X to left edge - w = -w; // Use positive width - } - if(x < _width) { // Not off right - int16_t x2 = x + w - 1; - if(x2 >= 0) { // Not off left - // Line partly or fully overlaps screen - if(x < 0) { x = 0; w = x2 + 1; } // Clip left - if(x2 >= _width) { w = _width - x; } // Clip right - startWrite(); - writeFillRectPreclipped(x, y, w, 1, color); - endWrite(); - } - } - } -} - -/*! - @brief Draw a vertical line on the display. Self-contained and provides - its own transaction as needed (see writeFastHLine() for a lower- - level variant). Edge clipping and rejection is performed here. - @param x Horizontal position of first point. - @param y Vertical position of first point. - @param h Line height in pixels (positive = below first point, - negative = above first point). - @param color 16-bit line color in '565' RGB format. - @note This repeats the writeFastVLine() function almost in its - entirety, with the addition of a transaction start/end. It's - done this way (rather than starting the transaction and calling - writeFastVLine() to handle clipping and so forth) so that the - transaction isn't performed at all if the line is rejected. -*/ -void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color) { - if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height - if(h < 0) { // If negative height... - y += h + 1; // Move Y to top edge - h = -h; // Use positive height - } - if(y < _height) { // Not off bottom - int16_t y2 = y + h - 1; - if(y2 >= 0) { // Not off top - // Line partly or fully overlaps screen - if(y < 0) { y = 0; h = y2 + 1; } // Clip top - if(y2 >= _height) { h = _height - y; } // Clip bottom - startWrite(); - writeFillRectPreclipped(x, y, 1, h, color); - endWrite(); - } - } - } -} - -/*! - @brief Essentially writePixel() with a transaction around it. I don't - think this is in use by any of our code anymore (believe it was - for some older BMP-reading examples), but is kept here in case - any user code relies on it. Consider it DEPRECATED. - @param color 16-bit pixel color in '565' RGB format. -*/ -void Adafruit_SPITFT::pushColor(uint16_t color) { - startWrite(); - SPI_WRITE16(color); - endWrite(); -} - -/*! - @brief Draw a 16-bit image (565 RGB) at the specified (x,y) position. - For 16-bit display devices; no color reduction performed. - Adapted from https://github.com/PaulStoffregen/ILI9341_t3 - by Marc MERLIN. See examples/pictureEmbed to use this. - 5/6/2017: function name and arguments have changed for - compatibility with current GFX library and to avoid naming - problems in prior implementation. Formerly drawBitmap() with - arguments in different order. Handles its own transaction and - edge clipping/rejection. - @param x Top left corner horizontal coordinate. - @param y Top left corner vertical coordinate. - @param pcolors Pointer to 16-bit array of pixel values. - @param w Width of bitmap in pixels. - @param h Height of bitmap in pixels. -*/ -void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, - uint16_t *pcolors, int16_t w, int16_t h) { - - int16_t x2, y2; // Lower-right coord - if(( x >= _width ) || // Off-edge right - ( y >= _height) || // " top - ((x2 = (x+w-1)) < 0 ) || // " left - ((y2 = (y+h-1)) < 0) ) return; // " bottom - - int16_t bx1=0, by1=0, // Clipped top-left within bitmap - saveW=w; // Save original bitmap width value - if(x < 0) { // Clip left - w += x; - bx1 = -x; - x = 0; - } - if(y < 0) { // Clip top - h += y; - by1 = -y; - y = 0; - } - if(x2 >= _width ) w = _width - x; // Clip right - if(y2 >= _height) h = _height - y; // Clip bottom - - pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left - startWrite(); - setAddrWindow(x, y, w, h); // Clipped area - while(h--) { // For each (clipped) scanline... - writePixels(pcolors, w); // Push one (clipped) row - pcolors += saveW; // Advance pointer by one full (unclipped) line - } - endWrite(); -} - - -// ------------------------------------------------------------------------- -// Miscellaneous class member functions that don't draw anything. - -/*! - @brief Invert the colors of the display (if supported by hardware). - Self-contained, no transaction setup required. - @param i true = inverted display, false = normal display. -*/ -void Adafruit_SPITFT::invertDisplay(bool i) { - startWrite(); - writeCommand(i ? invertOnCommand : invertOffCommand); - endWrite(); -} - -/*! - @brief Given 8-bit red, green and blue values, return a 'packed' - 16-bit color value in '565' RGB format (5 bits red, 6 bits - green, 5 bits blue). This is just a mathematical operation, - no hardware is touched. - @param red 8-bit red brightnesss (0 = off, 255 = max). - @param green 8-bit green brightnesss (0 = off, 255 = max). - @param blue 8-bit blue brightnesss (0 = off, 255 = max). - @return 'Packed' 16-bit color value (565 format). -*/ -uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) { - return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); -} - -/*! - @brief Adafruit_SPITFT Send Command handles complete sending of commands and data - @param commandByte The Command Byte - @param dataBytes A pointer to the Data bytes to send - @param numDataBytes The number of bytes we should send - */ -void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8_t numDataBytes) { - SPI_BEGIN_TRANSACTION(); - if(_cs >= 0) SPI_CS_LOW(); - - SPI_DC_LOW(); // Command mode - spiWrite(commandByte); // Send the command byte - - SPI_DC_HIGH(); - for (int i=0; i= 0) SPI_CS_HIGH(); - SPI_END_TRANSACTION(); -} - -/*! - @brief Adafruit_SPITFT Send Command handles complete sending of commands and const data - @param commandByte The Command Byte - @param dataBytes A pointer to the Data bytes to send - @param numDataBytes The number of bytes we should send - */ -void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes) { - SPI_BEGIN_TRANSACTION(); - if(_cs >= 0) SPI_CS_LOW(); - - SPI_DC_LOW(); // Command mode - spiWrite(commandByte); // Send the command byte - - SPI_DC_HIGH(); - for (int i=0; i= 0) SPI_CS_HIGH(); - SPI_END_TRANSACTION(); -} - -/*! - @brief Read 8 bits of data from display configuration memory (not RAM). - This is highly undocumented/supported and should be avoided, - function is only included because some of the examples use it. - @param commandByte - The command register to read data from. - @param index - The byte index into the command to read from. - @return Unsigned 8-bit data read from display register. - */ -/**************************************************************************/ -uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { - uint8_t result; - startWrite(); - SPI_DC_LOW(); // Command mode - spiWrite(commandByte); - SPI_DC_HIGH(); // Data mode - do { - result = spiRead(); - } while(index--); // Discard bytes up to index'th - endWrite(); - return result; -} - -// ------------------------------------------------------------------------- -// Lowest-level hardware-interfacing functions. Many of these are inline and -// compile to different things based on #defines -- typically just a few -// instructions. Others, not so much, those are not inlined. - -/*! - @brief Start an SPI transaction if using the hardware SPI interface to - the display. If using an earlier version of the Arduino platform - (before the addition of SPI transactions), this instead attempts - to set up the SPI clock and mode. No action is taken if the - connection is not hardware SPI-based. This does NOT include a - chip-select operation -- see startWrite() for a function that - encapsulated both actions. -*/ -inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { - if(connection == TFT_HARD_SPI) { -#if defined(SPI_HAS_TRANSACTION) - hwspi._spi->beginTransaction(hwspi.settings); -#else // No transactions, configure SPI manually... - #if defined(__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1) - hwspi._spi->setClockDivider(SPI_CLOCK_DIV2); - #elif defined(__arm__) - hwspi._spi->setClockDivider(11); - #elif defined(ESP8266) || defined(ESP32) - hwspi._spi->setFrequency(hwspi._freq); - #elif defined(RASPI) || defined(ARDUINO_ARCH_STM32F1) - hwspi._spi->setClock(hwspi._freq); - #endif - hwspi._spi->setBitOrder(MSBFIRST); - hwspi._spi->setDataMode(hwspi._mode); -#endif // end !SPI_HAS_TRANSACTION - } -} - -/*! - @brief End an SPI transaction if using the hardware SPI interface to - the display. No action is taken if the connection is not - hardware SPI-based or if using an earlier version of the Arduino - platform (before the addition of SPI transactions). This does - NOT include a chip-deselect operation -- see endWrite() for a - function that encapsulated both actions. -*/ -inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { -#if defined(SPI_HAS_TRANSACTION) - if(connection == TFT_HARD_SPI) { - hwspi._spi->endTransaction(); - } -#endif -} - -/*! - @brief Issue a single 8-bit value to the display. Chip-select, - transaction and data/command selection must have been - previously set -- this ONLY issues the byte. This is another of - those functions in the library with a now-not-accurate name - that's being maintained for compatibility with outside code. - This function is used even if display connection is parallel. - @param b 8-bit value to write. -*/ -void Adafruit_SPITFT::spiWrite(uint8_t b) { - if(connection == TFT_HARD_SPI) { -#if defined(__AVR__) - AVR_WRITESPI(b); -#elif defined(ESP8266) || defined(ESP32) - hwspi._spi->write(b); -#else - hwspi._spi->transfer(b); -#endif - } else if(connection == TFT_SOFT_SPI) { - for(uint8_t bit=0; bit<8; bit++) { - if(b & 0x80) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - b <<= 1; - SPI_SCK_LOW(); - } - } else { // TFT_PARALLEL -#if defined(__AVR__) - *tft8.writePort = b; -#elif defined(USE_FAST_PINIO) - if(!tft8.wide) *tft8.writePort = b; - else *(volatile uint16_t *)tft8.writePort = b; -#endif - TFT_WR_STROBE(); - } -} - -/*! - @brief Write a single command byte to the display. Chip-select and - transaction must have been previously set -- this ONLY sets - the device to COMMAND mode, issues the byte and then restores - DATA mode. There is no corresponding explicit writeData() - function -- just use spiWrite(). - @param cmd 8-bit command to write. -*/ -void Adafruit_SPITFT::writeCommand(uint8_t cmd) { - SPI_DC_LOW(); - spiWrite(cmd); - SPI_DC_HIGH(); -} - -/*! - @brief Read a single 8-bit value from the display. Chip-select and - transaction must have been previously set -- this ONLY reads - the byte. This is another of those functions in the library - with a now-not-accurate name that's being maintained for - compatibility with outside code. This function is used even if - display connection is parallel. - @return Unsigned 8-bit value read (always zero if USE_FAST_PINIO is - not supported by the MCU architecture). -*/ -uint8_t Adafruit_SPITFT::spiRead(void) { - uint8_t b = 0; - uint16_t w = 0; - if(connection == TFT_HARD_SPI) { - return hwspi._spi->transfer((uint8_t)0); - } else if(connection == TFT_SOFT_SPI) { - if(swspi._miso >= 0) { - for(uint8_t i=0; i<8; i++) { - SPI_SCK_HIGH(); - b <<= 1; - if(SPI_MISO_READ()) b++; - SPI_SCK_LOW(); - } - } - return b; - } else { // TFT_PARALLEL - if(tft8._rd >= 0) { -#if defined(USE_FAST_PINIO) - TFT_RD_LOW(); // Read line LOW - #if defined(__AVR__) - *tft8.portDir = 0x00; // Set port to input state - w = *tft8.readPort; // Read value from port - *tft8.portDir = 0xFF; // Restore port to output - #else // !__AVR__ - if(!tft8.wide) { // 8-bit TFT connection - #if defined(HAS_PORT_SET_CLR) - *tft8.dirClr = 0xFF; // Set port to input state - w = *tft8.readPort; // Read value from port - *tft8.dirSet = 0xFF; // Restore port to output - #else // !HAS_PORT_SET_CLR - *tft8.portDir = 0x00; // Set port to input state - w = *tft8.readPort; // Read value from port - *tft8.portDir = 0xFF; // Restore port to output - #endif // end HAS_PORT_SET_CLR - } else { // 16-bit TFT connection - #if defined(HAS_PORT_SET_CLR) - *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state - w = *(volatile uint16_t *)tft8.readPort; // 16-bit read - *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state - #else // !HAS_PORT_SET_CLR - *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state - w = *(volatile uint16_t *)tft8.readPort; // 16-bit read - *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state - #endif // end !HAS_PORT_SET_CLR - } - TFT_RD_HIGH(); // Read line HIGH - #endif // end !__AVR__ -#else // !USE_FAST_PINIO - w = 0; // Parallel TFT is NOT SUPPORTED without USE_FAST_PINIO -#endif // end !USE_FAST_PINIO - } - return w; - } -} - -/*! - @brief Set the software (bitbang) SPI MOSI line HIGH. -*/ -inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *swspi.mosiPortSet = 1; - #else // !KINETISK - *swspi.mosiPortSet = swspi.mosiPinMask; - #endif - #else // !HAS_PORT_SET_CLR - *swspi.mosiPort |= swspi.mosiPinMaskSet; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(swspi._mosi, HIGH); - #if defined(ESP32) - for(volatile uint8_t i=0; i<1; i++); - #endif // end ESP32 -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Set the software (bitbang) SPI MOSI line LOW. -*/ -inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *swspi.mosiPortClr = 1; - #else // !KINETISK - *swspi.mosiPortClr = swspi.mosiPinMask; - #endif - #else // !HAS_PORT_SET_CLR - *swspi.mosiPort &= swspi.mosiPinMaskClr; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(swspi._mosi, LOW); - #if defined(ESP32) - for(volatile uint8_t i=0; i<1; i++); - #endif // end ESP32 -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Set the software (bitbang) SPI SCK line HIGH. -*/ -inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *swspi.sckPortSet = 1; - #else // !KINETISK - *swspi.sckPortSet = swspi.sckPinMask; - #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x - for(volatile uint8_t i=0; i<1; i++); - #endif - #endif - #else // !HAS_PORT_SET_CLR - *swspi.sckPort |= swspi.sckPinMaskSet; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(swspi._sck, HIGH); - #if defined(ESP32) - for(volatile uint8_t i=0; i<1; i++); - #endif // end ESP32 -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Set the software (bitbang) SPI SCK line LOW. -*/ -inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *swspi.sckPortClr = 1; - #else // !KINETISK - *swspi.sckPortClr = swspi.sckPinMask; - #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x - for(volatile uint8_t i=0; i<1; i++); - #endif - #endif - #else // !HAS_PORT_SET_CLR - *swspi.sckPort &= swspi.sckPinMaskClr; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(swspi._sck, LOW); - #if defined(ESP32) - for(volatile uint8_t i=0; i<1; i++); - #endif // end ESP32 -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Read the state of the software (bitbang) SPI MISO line. - @return true if HIGH, false if LOW. -*/ -inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { -#if defined(USE_FAST_PINIO) - #if defined(KINETISK) - return *swspi.misoPort; - #else // !KINETISK - return *swspi.misoPort & swspi.misoPinMask; - #endif // end !KINETISK -#else // !USE_FAST_PINIO - return digitalRead(swspi._miso); -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Issue a single 16-bit value to the display. Chip-select, - transaction and data/command selection must have been - previously set -- this ONLY issues the word. Despite the name, - this function is used even if display connection is parallel; - name was maintaned for backward compatibility. Naming is also - not consistent with the 8-bit version, spiWrite(). Sorry about - that. Again, staying compatible with outside code. - @param w 16-bit value to write. -*/ -void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { - if(connection == TFT_HARD_SPI) { -#if defined(__AVR__) - AVR_WRITESPI(w >> 8); - AVR_WRITESPI(w); -#elif defined(ESP8266) || defined(ESP32) - hwspi._spi->write16(w); -#else - hwspi._spi->transfer(w >> 8); - hwspi._spi->transfer(w); -#endif - } else if(connection == TFT_SOFT_SPI) { - for(uint8_t bit=0; bit<16; bit++) { - if(w & 0x8000) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - SPI_SCK_LOW(); - w <<= 1; - } - } else { // TFT_PARALLEL -#if defined(__AVR__) - *tft8.writePort = w >> 8; - TFT_WR_STROBE(); - *tft8.writePort = w; -#elif defined(USE_FAST_PINIO) - if(!tft8.wide) { - *tft8.writePort = w >> 8; - TFT_WR_STROBE(); - *tft8.writePort = w; - } else { - *(volatile uint16_t *)tft8.writePort = w; - } -#endif - TFT_WR_STROBE(); - } -} - -/*! - @brief Issue a single 32-bit value to the display. Chip-select, - transaction and data/command selection must have been - previously set -- this ONLY issues the longword. Despite the - name, this function is used even if display connection is - parallel; name was maintaned for backward compatibility. Naming - is also not consistent with the 8-bit version, spiWrite(). - Sorry about that. Again, staying compatible with outside code. - @param l 32-bit value to write. -*/ -void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { - if(connection == TFT_HARD_SPI) { -#if defined(__AVR__) - AVR_WRITESPI(l >> 24); - AVR_WRITESPI(l >> 16); - AVR_WRITESPI(l >> 8); - AVR_WRITESPI(l ); -#elif defined(ESP8266) || defined(ESP32) - hwspi._spi->write32(l); -#else - hwspi._spi->transfer(l >> 24); - hwspi._spi->transfer(l >> 16); - hwspi._spi->transfer(l >> 8); - hwspi._spi->transfer(l); -#endif - } else if(connection == TFT_SOFT_SPI) { - for(uint8_t bit=0; bit<32; bit++) { - if(l & 0x80000000) SPI_MOSI_HIGH(); - else SPI_MOSI_LOW(); - SPI_SCK_HIGH(); - SPI_SCK_LOW(); - l <<= 1; - } - } else { // TFT_PARALLEL -#if defined(__AVR__) - *tft8.writePort = l >> 24; - TFT_WR_STROBE(); - *tft8.writePort = l >> 16; - TFT_WR_STROBE(); - *tft8.writePort = l >> 8; - TFT_WR_STROBE(); - *tft8.writePort = l; -#elif defined(USE_FAST_PINIO) - if(!tft8.wide) { - *tft8.writePort = l >> 24; - TFT_WR_STROBE(); - *tft8.writePort = l >> 16; - TFT_WR_STROBE(); - *tft8.writePort = l >> 8; - TFT_WR_STROBE(); - *tft8.writePort = l; - } else { - *(volatile uint16_t *)tft8.writePort = l >> 16; - TFT_WR_STROBE(); - *(volatile uint16_t *)tft8.writePort = l; - } -#endif - TFT_WR_STROBE(); - } -} - -/*! - @brief Set the WR line LOW, then HIGH. Used for parallel-connected - interfaces when writing data. -*/ -inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *tft8.wrPortClr = 1; - *tft8.wrPortSet = 1; - #else // !KINETISK - *tft8.wrPortClr = tft8.wrPinMask; - *tft8.wrPortSet = tft8.wrPinMask; - #endif // end !KINETISK - #else // !HAS_PORT_SET_CLR - *tft8.wrPort &= tft8.wrPinMaskClr; - *tft8.wrPort |= tft8.wrPinMaskSet; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(tft8._wr, LOW); - digitalWrite(tft8._wr, HIGH); -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Set the RD line HIGH. Used for parallel-connected interfaces - when reading data. -*/ -inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - *tft8.rdPortSet = tft8.rdPinMask; - #else // !HAS_PORT_SET_CLR - *tft8.rdPort |= tft8.rdPinMaskSet; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(tft8._rd, HIGH); -#endif // end !USE_FAST_PINIO -} - -/*! - @brief Set the RD line LOW. Used for parallel-connected interfaces - when reading data. -*/ -inline void Adafruit_SPITFT::TFT_RD_LOW(void) { -#if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - *tft8.rdPortClr = tft8.rdPinMask; - #else // !HAS_PORT_SET_CLR - *tft8.rdPort &= tft8.rdPinMaskClr; - #endif // end !HAS_PORT_SET_CLR -#else // !USE_FAST_PINIO - digitalWrite(tft8._rd, LOW); -#endif // end !USE_FAST_PINIO -} - -#endif // end __AVR_ATtiny85__ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h deleted file mode 100644 index dcfc1646b..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h +++ /dev/null @@ -1,520 +0,0 @@ -/*! - * @file Adafruit_SPITFT.h - * - * Part of Adafruit's GFX graphics library. Originally this class was - * written to handle a range of color TFT displays connected via SPI, - * but over time this library and some display-specific subclasses have - * mutated to include some color OLEDs as well as parallel-interfaced - * displays. The name's been kept for the sake of older code. - * - * Adafruit invests time and resources providing this open source code, - * please support Adafruit and open-source hardware by purchasing - * products from Adafruit! - * - * Written by Limor "ladyada" Fried for Adafruit Industries, - * with contributions from the open source community. - * - * BSD license, all text here must be included in any redistribution. - */ - -#ifndef _ADAFRUIT_SPITFT_H_ -#define _ADAFRUIT_SPITFT_H_ - -#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all - -#include -#include "Adafruit_GFX.h" -#include "renderer.h" - -// HARDWARE CONFIG --------------------------------------------------------- - -#if defined(__AVR__) - typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit - #define USE_FAST_PINIO ///< Use direct PORT register access -#elif defined(ARDUINO_STM32_FEATHER) // WICED - typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED - typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit -#elif defined(__arm__) - #if defined(ARDUINO_ARCH_SAMD) - // Adafruit M0, M4 - typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit - #define USE_FAST_PINIO ///< Use direct PORT register access - #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers - #elif defined(CORE_TEENSY) - // PJRC Teensy 4.x - #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x - typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit - // PJRC Teensy 3.x - #else - typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit - #endif - #define USE_FAST_PINIO ///< Use direct PORT register access - #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers - #else - // Arduino Due? - typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit - // USE_FAST_PINIO not available here (yet)...Due has a totally different - // GPIO register set and will require some changes elsewhere (e.g. in - // constructors especially). - #endif -#else // !ARM - // Probably ESP8266 or ESP32. USE_FAST_PINIO is not available here (yet) - // but don't worry about it too much...the digitalWrite() implementation - // on these platforms is reasonably efficient and already RAM-resident, - // only gotcha then is no parallel connection support for now. - typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit -#endif // end !ARM -typedef volatile ADAGFX_PORT_t* PORTreg_t; ///< PORT register type - -#if defined(__AVR__) - #define DEFAULT_SPI_FREQ 8000000L ///< Hardware SPI default speed -#else - #define DEFAULT_SPI_FREQ 16000000L ///< Hardware SPI default speed -#endif - -#if defined(ADAFRUIT_PYPORTAL) || defined(ADAFRUIT_PYBADGE_M4_EXPRESS) || defined(ADAFRUIT_PYGAMER_M4_EXPRESS) - #define USE_SPI_DMA ///< Auto DMA if using PyPortal -#else - //#define USE_SPI_DMA ///< If set, use DMA if available -#endif -// Another "oops" name -- this now also handles parallel DMA. -// If DMA is enabled, Arduino sketch MUST #include -// Estimated RAM usage: -// 4 bytes/pixel on display major axis + 8 bytes/pixel on minor axis, -// e.g. 320x240 pixels = 320 * 4 + 240 * 8 = 3,200 bytes. - -#if !defined(ARDUINO_ARCH_SAMD) - #undef USE_SPI_DMA ///< DMA currently for SAMD chips only -#endif - -#if defined(USE_SPI_DMA) - #pragma message ("GFX DMA IS ENABLED. HIGHLY EXPERIMENTAL.") - #include -#endif - -// This is kind of a kludge. Needed a way to disambiguate the software SPI -// and parallel constructors via their argument lists. Originally tried a -// bool as the first argument to the parallel constructor (specifying 8-bit -// vs 16-bit interface) but the compiler regards this as equivalent to an -// integer and thus still ambiguous. SO...the parallel constructor requires -// an enumerated type as the first argument: tft8 (for 8-bit parallel) or -// tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested -// and might never be, still needed that disambiguation from soft SPI. -enum tftBusWidth { tft8bitbus, tft16bitbus }; ///< For first arg to parallel constructor - -// CLASS DEFINITION -------------------------------------------------------- - -/*! - @brief Adafruit_SPITFT is an intermediary class between Adafruit_GFX - and various hardware-specific subclasses for different displays. - It handles certain operations that are common to a range of - displays (address window, area fills, etc.). Originally these were - all color TFT displays interfaced via SPI, but it's since expanded - to include color OLEDs and parallel-interfaced TFTs. THE NAME HAS - BEEN KEPT TO AVOID BREAKING A LOT OF SUBCLASSES AND EXAMPLE CODE. - Many of the class member functions similarly live on with names - that don't necessarily accurately describe what they're doing, - again to avoid breaking a lot of other code. If in doubt, read - the comments. -*/ -class Adafruit_SPITFT : public Renderer { - - public: - - // CONSTRUCTORS -------------------------------------------------------- - - // Software SPI constructor: expects width & height (at default rotation - // setting 0), 4 signal pins (cs, dc, mosi, sclk), 2 optional pins - // (reset, miso). cs argument is required but can be -1 if unused -- - // rather than moving it to the optional arguments, it was done this way - // to avoid breaking existing code (-1 option was a later addition). - Adafruit_SPITFT(uint16_t w, uint16_t h, - int8_t cs, int8_t dc, int8_t mosi, int8_t sck, - int8_t rst = -1, int8_t miso = -1); - - // Hardware SPI constructor using the default SPI port: expects width & - // height (at default rotation setting 0), 2 signal pins (cs, dc), - // optional reset pin. cs is required but can be -1 if unused -- rather - // than moving it to the optional arguments, it was done this way to - // avoid breaking existing code (-1 option was a later addition). - Adafruit_SPITFT(uint16_t w, uint16_t h, - int8_t cs, int8_t dc, int8_t rst = -1); - -#if !defined(ESP8266) // See notes in .cpp - // Hardware SPI constructor using an arbitrary SPI peripheral: expects - // width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc) - // and optional reset pin. cs is required but can be -1 if unused. - Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, - int8_t cs, int8_t dc, int8_t rst = -1); -#endif // end !ESP8266 - - // Parallel constructor: expects width & height (rotation 0), flag - // indicating whether 16-bit (true) or 8-bit (false) interface, 3 signal - // pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel - // isn't even fully implemented but the 'wide' flag was added as a - // required argument to avoid ambiguity with other constructors. - Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, - int8_t d0, int8_t wr, int8_t dc, - int8_t cs = -1, int8_t rst = -1, int8_t rd = -1); - - // CLASS MEMBER FUNCTIONS ---------------------------------------------- - - // These first two functions MUST be declared by subclasses: - - /*! - @brief Display-specific initialization function. - @param freq SPI frequency, in hz (or 0 for default or unused). - */ - virtual void begin(uint32_t freq) = 0; - - /*! - @brief Set up the specific display hardware's "address window" - for subsequent pixel-pushing operations. - @param x Leftmost pixel of area to be drawn (MUST be within - display bounds at current rotation setting). - @param y Topmost pixel of area to be drawn (MUST be within - display bounds at current rotation setting). - @param w Width of area to be drawn, in pixels (MUST be >0 and, - added to x, within display bounds at current rotation). - @param h Height of area to be drawn, in pixels (MUST be >0 and, - added to x, within display bounds at current rotation). - */ - virtual void setAddrWindow( - uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0; - - // Remaining functions do not need to be declared in subclasses - // unless they wish to provide hardware-specific optimizations. - // Brief comments here...documented more thoroughly in .cpp file. - - // Subclass' begin() function invokes this to initialize hardware. - // freq=0 to use default SPI speed. spiMode must be one of the SPI_MODEn - // values defined in SPI.h, which are NOT the same as 0 for SPI_MODE0, - // 1 for SPI_MODE1, etc...use ONLY the SPI_MODEn defines! Only! - // Name is outdated (interface may be parallel) but for compatibility: - void initSPI(uint32_t freq = 0, uint8_t spiMode = SPI_MODE0); - // Chip select and/or hardware SPI transaction start as needed: - void startWrite(void); - // Chip deselect and/or hardware SPI transaction end as needed: - void endWrite(void); - void sendCommand(uint8_t commandByte, uint8_t *dataBytes = NULL, uint8_t numDataBytes = 0); - void sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes); - uint8_t readcommand8(uint8_t commandByte, uint8_t index = 0); - - // These functions require a chip-select and/or SPI transaction - // around them. Higher-level graphics primitives might start a - // single transaction and then make multiple calls to these functions - // (e.g. circle or text rendering might make repeated lines or rects) - // before ending the transaction. It's more efficient than starting a - // transaction every time. - void writePixel(int16_t x, int16_t y, uint16_t color); - void writePixels(uint16_t *colors, uint32_t len, - bool block=true, bool bigEndian=false); - void writeColor(uint16_t color, uint32_t len); - void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color); - void writeFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color); - void writeFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color); - // This is a new function, similar to writeFillRect() except that - // all arguments MUST be onscreen, sorted and clipped. If higher-level - // primitives can handle their own sorting/clipping, it avoids repeating - // such operations in the low-level code, making it potentially faster. - // CALLING THIS WITH UNCLIPPED OR NEGATIVE VALUES COULD BE DISASTROUS. - inline void writeFillRectPreclipped(int16_t x, int16_t y, - int16_t w, int16_t h, uint16_t color); - // Another new function, companion to the new non-blocking - // writePixels() variant. - void dmaWait(void); - - - // These functions are similar to the 'write' functions above, but with - // a chip-select and/or SPI transaction built-in. They're typically used - // solo -- that is, as graphics primitives in themselves, not invoked by - // higher-level primitives (which should use the functions above). - void drawPixel(int16_t x, int16_t y, uint16_t color); - void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, - uint16_t color); - void drawFastHLine(int16_t x, int16_t y, int16_t w, - uint16_t color); - void drawFastVLine(int16_t x, int16_t y, int16_t h, - uint16_t color); - // A single-pixel push encapsulated in a transaction. I don't think - // this is used anymore (BMP demos might've used it?) but is provided - // for backward compatibility, consider it deprecated: - void pushColor(uint16_t color); - - using Adafruit_GFX::drawRGBBitmap; // Check base class first - void drawRGBBitmap(int16_t x, int16_t y, - uint16_t *pcolors, int16_t w, int16_t h); - - void invertDisplay(bool i); - uint16_t color565(uint8_t r, uint8_t g, uint8_t b); - - // Despite parallel additions, function names kept for compatibility: - void spiWrite(uint8_t b); // Write single byte as DATA - void writeCommand(uint8_t cmd); // Write single byte as COMMAND - uint8_t spiRead(void); // Read single byte of data - - // Most of these low-level functions were formerly macros in - // Adafruit_SPITFT_Macros.h. Some have been made into inline functions - // to avoid macro mishaps. Despite the addition of code for a parallel - // display interface, the names have been kept for backward - // compatibility (some subclasses may be invoking these): - void SPI_WRITE16(uint16_t w); // Not inline - void SPI_WRITE32(uint32_t l); // Not inline - // Old code had both a spiWrite16() function and SPI_WRITE16 macro - // in addition to the SPI_WRITE32 macro. The latter two have been - // made into functions here, and spiWrite16() removed (use SPI_WRITE16() - // instead). It looks like most subclasses had gotten comfortable with - // SPI_WRITE16 and SPI_WRITE32 anyway so those names were kept rather - // than the less-obnoxious camelcase variants, oh well. - - // Placing these functions entirely in the class definition inlines - // them implicitly them while allowing their use in other code: - - /*! - @brief Set the chip-select line HIGH. Does NOT check whether CS pin - is set (>=0), that should be handled in calling function. - Despite function name, this is used even if the display - connection is parallel. - */ - void SPI_CS_HIGH(void) { - #if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *csPortSet = 1; - #else // !KINETISK - *csPortSet = csPinMask; - #endif // end !KINETISK - #else // !HAS_PORT_SET_CLR - *csPort |= csPinMaskSet; - #endif // end !HAS_PORT_SET_CLR - #else // !USE_FAST_PINIO - digitalWrite(_cs, HIGH); - #endif // end !USE_FAST_PINIO - } - - /*! - @brief Set the chip-select line LOW. Does NOT check whether CS pin - is set (>=0), that should be handled in calling function. - Despite function name, this is used even if the display - connection is parallel. - */ - void SPI_CS_LOW(void) { - #if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *csPortClr = 1; - #else // !KINETISK - *csPortClr = csPinMask; - #endif // end !KINETISK - #else // !HAS_PORT_SET_CLR - *csPort &= csPinMaskClr; - #endif // end !HAS_PORT_SET_CLR - #else // !USE_FAST_PINIO - digitalWrite(_cs, LOW); - #endif // end !USE_FAST_PINIO - } - - /*! - @brief Set the data/command line HIGH (data mode). - */ - void SPI_DC_HIGH(void) { - #if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *dcPortSet = 1; - #else // !KINETISK - *dcPortSet = dcPinMask; - #endif // end !KINETISK - #else // !HAS_PORT_SET_CLR - *dcPort |= dcPinMaskSet; - #endif // end !HAS_PORT_SET_CLR - #else // !USE_FAST_PINIO - digitalWrite(_dc, HIGH); - #endif // end !USE_FAST_PINIO - } - - /*! - @brief Set the data/command line LOW (command mode). - */ - void SPI_DC_LOW(void) { - #if defined(USE_FAST_PINIO) - #if defined(HAS_PORT_SET_CLR) - #if defined(KINETISK) - *dcPortClr = 1; - #else // !KINETISK - *dcPortClr = dcPinMask; - #endif // end !KINETISK - #else // !HAS_PORT_SET_CLR - *dcPort &= dcPinMaskClr; - #endif // end !HAS_PORT_SET_CLR - #else // !USE_FAST_PINIO - digitalWrite(_dc, LOW); - #endif // end !USE_FAST_PINIO - } - - protected: - - // A few more low-level member functions -- some may have previously - // been macros. Shouldn't have a need to access these externally, so - // they've been moved to the protected section. Additionally, they're - // declared inline here and the code is in the .cpp file, since outside - // code doesn't need to see these. - inline void SPI_MOSI_HIGH(void); - inline void SPI_MOSI_LOW(void); - inline void SPI_SCK_HIGH(void); - inline void SPI_SCK_LOW(void); - inline bool SPI_MISO_READ(void); - inline void SPI_BEGIN_TRANSACTION(void); - inline void SPI_END_TRANSACTION(void); - inline void TFT_WR_STROBE(void); // Parallel interface write strobe - inline void TFT_RD_HIGH(void); // Parallel interface read high - inline void TFT_RD_LOW(void); // Parallel interface read low - - // CLASS INSTANCE VARIABLES -------------------------------------------- - - // Here be dragons! There's a big union of three structures here -- - // one each for hardware SPI, software (bitbang) SPI, and parallel - // interfaces. This is to save some memory, since a display's connection - // will be only one of these. The order of some things is a little weird - // in an attempt to get values to align and pack better in RAM. - -#if defined(USE_FAST_PINIO) -#if defined(HAS_PORT_SET_CLR) - PORTreg_t csPortSet; ///< PORT register for chip select SET - PORTreg_t csPortClr; ///< PORT register for chip select CLEAR - PORTreg_t dcPortSet; ///< PORT register for data/command SET - PORTreg_t dcPortClr; ///< PORT register for data/command CLEAR -#else // !HAS_PORT_SET_CLR - PORTreg_t csPort; ///< PORT register for chip select - PORTreg_t dcPort; ///< PORT register for data/command -#endif // end HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO -#if defined(__cplusplus) && (__cplusplus >= 201100) - union { -#endif - struct { // Values specific to HARDWARE SPI: - SPIClass *_spi; ///< SPI class pointer -#if defined(SPI_HAS_TRANSACTION) - SPISettings settings; ///< SPI transaction settings -#else - uint32_t _freq; ///< SPI bitrate (if no SPI transactions) -#endif - uint32_t _mode; ///< SPI data mode (transactions or no) - } hwspi; ///< Hardware SPI values - struct { // Values specific to SOFTWARE SPI: -#if defined(USE_FAST_PINIO) - PORTreg_t misoPort; ///< PORT (PIN) register for MISO -#if defined(HAS_PORT_SET_CLR) - PORTreg_t mosiPortSet; ///< PORT register for MOSI SET - PORTreg_t mosiPortClr; ///< PORT register for MOSI CLEAR - PORTreg_t sckPortSet; ///< PORT register for SCK SET - PORTreg_t sckPortClr; ///< PORT register for SCK CLEAR - #if !defined(KINETISK) - ADAGFX_PORT_t mosiPinMask; ///< Bitmask for MOSI - ADAGFX_PORT_t sckPinMask; ///< Bitmask for SCK - #endif // end !KINETISK -#else // !HAS_PORT_SET_CLR - PORTreg_t mosiPort; ///< PORT register for MOSI - PORTreg_t sckPort; ///< PORT register for SCK - ADAGFX_PORT_t mosiPinMaskSet; ///< Bitmask for MOSI SET (OR) - ADAGFX_PORT_t mosiPinMaskClr; ///< Bitmask for MOSI CLEAR (AND) - ADAGFX_PORT_t sckPinMaskSet; ///< Bitmask for SCK SET (OR bitmask) - ADAGFX_PORT_t sckPinMaskClr; ///< Bitmask for SCK CLEAR (AND) -#endif // end HAS_PORT_SET_CLR - #if !defined(KINETISK) - ADAGFX_PORT_t misoPinMask; ///< Bitmask for MISO - #endif // end !KINETISK -#endif // end USE_FAST_PINIO - int8_t _mosi; ///< MOSI pin # - int8_t _miso; ///< MISO pin # - int8_t _sck; ///< SCK pin # - } swspi; ///< Software SPI values - struct { // Values specific to 8-bit parallel: -#if defined(USE_FAST_PINIO) - - #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x - volatile uint32_t *writePort; ///< PORT register for DATA WRITE - volatile uint32_t *readPort; ///< PORT (PIN) register for DATA READ - #else - volatile uint8_t *writePort; ///< PORT register for DATA WRITE - volatile uint8_t *readPort; ///< PORT (PIN) register for DATA READ - #endif -#if defined(HAS_PORT_SET_CLR) - // Port direction register pointers are always 8-bit regardless of - // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. - #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x - volatile uint32_t *dirSet; ///< PORT byte data direction SET - volatile uint32_t *dirClr; ///< PORT byte data direction CLEAR - #else - volatile uint8_t *dirSet; ///< PORT byte data direction SET - volatile uint8_t *dirClr; ///< PORT byte data direction CLEAR - #endif - PORTreg_t wrPortSet; ///< PORT register for write strobe SET - PORTreg_t wrPortClr; ///< PORT register for write strobe CLEAR - PORTreg_t rdPortSet; ///< PORT register for read strobe SET - PORTreg_t rdPortClr; ///< PORT register for read strobe CLEAR - #if !defined(KINETISK) - ADAGFX_PORT_t wrPinMask; ///< Bitmask for write strobe - #endif // end !KINETISK - ADAGFX_PORT_t rdPinMask; ///< Bitmask for read strobe -#else // !HAS_PORT_SET_CLR - // Port direction register pointer is always 8-bit regardless of - // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. - volatile uint8_t *portDir; ///< PORT direction register - PORTreg_t wrPort; ///< PORT register for write strobe - PORTreg_t rdPort; ///< PORT register for read strobe - ADAGFX_PORT_t wrPinMaskSet; ///< Bitmask for write strobe SET (OR) - ADAGFX_PORT_t wrPinMaskClr; ///< Bitmask for write strobe CLEAR (AND) - ADAGFX_PORT_t rdPinMaskSet; ///< Bitmask for read strobe SET (OR) - ADAGFX_PORT_t rdPinMaskClr; ///< Bitmask for read strobe CLEAR (AND) -#endif // end HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO - int8_t _d0; ///< Data pin 0 # - int8_t _wr; ///< Write strobe pin # - int8_t _rd; ///< Read strobe pin # (or -1) - bool wide = 0; ///< If true, is 16-bit interface - } tft8; ///< Parallel interface settings -#if defined(__cplusplus) && (__cplusplus >= 201100) - }; ///< Only one interface is active -#endif -#if defined(USE_SPI_DMA) // Used by hardware SPI and tft8 - Adafruit_ZeroDMA dma; ///< DMA instance - DmacDescriptor *dptr = NULL; ///< 1st descriptor - DmacDescriptor *descriptor = NULL; ///< Allocated descriptor list - uint16_t *pixelBuf[2]; ///< Working buffers - uint16_t maxFillLen; ///< Max pixels per DMA xfer - uint16_t lastFillColor = 0; ///< Last color used w/fill - uint32_t lastFillLen = 0; ///< # of pixels w/last fill - uint8_t onePixelBuf; ///< For hi==lo fill -#endif -#if defined(USE_FAST_PINIO) -#if defined(HAS_PORT_SET_CLR) - #if !defined(KINETISK) - ADAGFX_PORT_t csPinMask; ///< Bitmask for chip select - ADAGFX_PORT_t dcPinMask; ///< Bitmask for data/command - #endif // end !KINETISK -#else // !HAS_PORT_SET_CLR - ADAGFX_PORT_t csPinMaskSet; ///< Bitmask for chip select SET (OR) - ADAGFX_PORT_t csPinMaskClr; ///< Bitmask for chip select CLEAR (AND) - ADAGFX_PORT_t dcPinMaskSet; ///< Bitmask for data/command SET (OR) - ADAGFX_PORT_t dcPinMaskClr; ///< Bitmask for data/command CLEAR (AND) -#endif // end HAS_PORT_SET_CLR -#endif // end USE_FAST_PINIO - uint8_t connection; ///< TFT_HARD_SPI, TFT_SOFT_SPI, etc. - int8_t _rst; ///< Reset pin # (or -1) - int8_t _cs; ///< Chip select pin # (or -1) - int8_t _dc; ///< Data/command pin # - - int16_t _xstart = 0; ///< Internal framebuffer X offset - int16_t _ystart = 0; ///< Internal framebuffer Y offset - uint8_t invertOnCommand = 0; ///< Command to enable invert mode - uint8_t invertOffCommand = 0; ///< Command to disable invert mode - - uint32_t _freq = 0; ///< Dummy var to keep subclasses happy -}; - -#endif // end __AVR_ATtiny85__ -#endif // end _ADAFRUIT_SPITFT_H_ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp deleted file mode 100644 index 78d9901d6..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp +++ /dev/null @@ -1,190 +0,0 @@ -/*! - * @file Adafruit_SSD1331.cpp - * - * @mainpage Adafruit SSD1331 Arduino Library - * - * @section intro_sec Introduction - * - * This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip - * - * Pick one up today in the adafruit shop! - * ------> http://www.adafruit.com/products/684 - * - * These displays use SPI to communicate, 4 or 5 pins are required to - * interface - * Adafruit invests time and resources providing this open source code, - * please support Adafruit and open-source hardware by purchasing - * products from Adafruit! - * - * @section author Author - * - * Written by Limor Fried/Ladyada for Adafruit Industries. - * - * @section license License - * - * BSD license, all text above must be included in any redistribution - */ - -#include "Adafruit_SSD1331.h" -#include "pins_arduino.h" -#include "wiring_private.h" - -/***********************************/ - -/*! - @brief SPI displays set an address window rectangle for blitting pixels - @param x Top left corner x coordinate - @param y Top left corner x coordinate - @param w Width of window - @param h Height of window -*/ -void Adafruit_SSD1331::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, - uint16_t h) { - - uint8_t x1 = x; - uint8_t y1 = y; - if (x1 > 95) - x1 = 95; - if (y1 > 63) - y1 = 63; - - uint8_t x2 = (x + w - 1); - uint8_t y2 = (y + h - 1); - if (x2 > 95) - x2 = 95; - if (y2 > 63) - y2 = 63; - - if (x1 > x2) { - uint8_t t = x2; - x2 = x1; - x1 = t; - } - if (y1 > y2) { - uint8_t t = y2; - y2 = y1; - y1 = t; - } - - sendCommand(0x15); // Column addr set - sendCommand(x1); - sendCommand(x2); - - sendCommand(0x75); // Column addr set - sendCommand(y1); - sendCommand(y2); - - startWrite(); -} - -/**************************************************************************/ -/*! - @brief Initialize SSD1331 chip - Connects to the SSD1331 over SPI and sends initialization procedure commands - @param freq Desired SPI clock frequency -*/ -/**************************************************************************/ -void Adafruit_SSD1331::begin(uint32_t freq) { - initSPI(freq); - - // Initialization Sequence - sendCommand(SSD1331_CMD_DISPLAYOFF); // 0xAE - sendCommand(SSD1331_CMD_SETREMAP); // 0xA0 -#if defined SSD1331_COLORORDER_RGB - sendCommand(0x72); // RGB Color -#else - sendCommand(0x76); // BGR Color -#endif - sendCommand(SSD1331_CMD_STARTLINE); // 0xA1 - sendCommand(0x0); - sendCommand(SSD1331_CMD_DISPLAYOFFSET); // 0xA2 - sendCommand(0x0); - sendCommand(SSD1331_CMD_NORMALDISPLAY); // 0xA4 - sendCommand(SSD1331_CMD_SETMULTIPLEX); // 0xA8 - sendCommand(0x3F); // 0x3F 1/64 duty - sendCommand(SSD1331_CMD_SETMASTER); // 0xAD - sendCommand(0x8E); - sendCommand(SSD1331_CMD_POWERMODE); // 0xB0 - sendCommand(0x0B); - sendCommand(SSD1331_CMD_PRECHARGE); // 0xB1 - sendCommand(0x31); - sendCommand(SSD1331_CMD_CLOCKDIV); // 0xB3 - sendCommand(0xF0); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio - // (A[3:0]+1 = 1..16) - sendCommand(SSD1331_CMD_PRECHARGEA); // 0x8A - sendCommand(0x64); - sendCommand(SSD1331_CMD_PRECHARGEB); // 0x8B - sendCommand(0x78); - sendCommand(SSD1331_CMD_PRECHARGEC); // 0x8C - sendCommand(0x64); - sendCommand(SSD1331_CMD_PRECHARGELEVEL); // 0xBB - sendCommand(0x3A); - sendCommand(SSD1331_CMD_VCOMH); // 0xBE - sendCommand(0x3E); - sendCommand(SSD1331_CMD_MASTERCURRENT); // 0x87 - sendCommand(0x06); - sendCommand(SSD1331_CMD_CONTRASTA); // 0x81 - sendCommand(0x91); - sendCommand(SSD1331_CMD_CONTRASTB); // 0x82 - sendCommand(0x50); - sendCommand(SSD1331_CMD_CONTRASTC); // 0x83 - sendCommand(0x7D); - sendCommand(SSD1331_CMD_DISPLAYON); //--turn on oled panel - _width = TFTWIDTH; - _height = TFTHEIGHT; -} - -/**************************************************************************/ -/*! - @brief Instantiate Adafruit SSD1331 driver with software SPI - @param cs Chip select pin # - @param dc Data/Command pin # - @param mosi SPI MOSI pin # - @param sclk SPI Clock pin # - @param rst Reset pin # (optional, pass -1 if unused) -*/ -/**************************************************************************/ -Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, - int8_t sclk, int8_t rst) - : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, mosi, sclk, rst, -1) {} - -/**************************************************************************/ -/*! - @brief Instantiate Adafruit SSD1331 driver with hardware SPI - @param cs Chip select pin # - @param dc Data/Command pin # - @param rst Reset pin # (optional, pass -1 if unused) -*/ -/**************************************************************************/ -Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst) - : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, rst) {} - -/**************************************************************************/ -/*! - @brief Instantiate Adafruit SSD1331 driver with hardware SPI - @param spi Pointer to an existing SPIClass instance (e.g. &SPI, the - microcontroller's primary SPI bus). - @param cs Chip select pin # - @param dc Data/Command pin # - @param rst Reset pin # (optional, pass -1 if unused) -*/ -/**************************************************************************/ -Adafruit_SSD1331::Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, - int8_t rst) - : -#if defined(ESP8266) - Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, cs, dc, rst) { -#else - Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, spi, cs, dc, rst) { -#endif -} - -/**************************************************************************/ -/*! - @brief Change whether display is on or off - @param enable True if you want the display ON, false OFF -*/ -/**************************************************************************/ -void Adafruit_SSD1331::enableDisplay(boolean enable) { - sendCommand(enable ? SSD1331_CMD_DISPLAYON : SSD1331_CMD_DISPLAYOFF); -} diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h deleted file mode 100644 index 7d9bc85a0..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h +++ /dev/null @@ -1,76 +0,0 @@ -/*! - * @file Adafruit_SSD1331.h - */ - -#include "Arduino.h" -#include -// Tasmota change: use custom version of Adafruit_SPITFT which extends Renderer instead of Adafruit_GFX -#include -#include -#include - -/*! - * @brief Select one of these defines to set the pixel color order - */ -#define SSD1331_COLORORDER_RGB -// #define SSD1331_COLORORDER_BGR - -#if defined SSD1331_COLORORDER_RGB && defined SSD1331_COLORORDER_BGR -#error "RGB and BGR can not both be defined for SSD1331_COLORODER." -#endif - -// Timing Delays -#define SSD1331_DELAYS_HWFILL (3) //!< Fill delay -#define SSD1331_DELAYS_HWLINE (1) //!< Line delay - -// SSD1331 Commands -#define SSD1331_CMD_DRAWLINE 0x21 //!< Draw line -#define SSD1331_CMD_DRAWRECT 0x22 //!< Draw rectangle -#define SSD1331_CMD_FILL 0x26 //!< Fill enable/disable -#define SSD1331_CMD_SETCOLUMN 0x15 //!< Set column address -#define SSD1331_CMD_SETROW 0x75 //!< Set row adress -#define SSD1331_CMD_CONTRASTA 0x81 //!< Set contrast for color A -#define SSD1331_CMD_CONTRASTB 0x82 //!< Set contrast for color B -#define SSD1331_CMD_CONTRASTC 0x83 //!< Set contrast for color C -#define SSD1331_CMD_MASTERCURRENT 0x87 //!< Master current control -#define SSD1331_CMD_SETREMAP 0xA0 //!< Set re-map & data format -#define SSD1331_CMD_STARTLINE 0xA1 //!< Set display start line -#define SSD1331_CMD_DISPLAYOFFSET 0xA2 //!< Set display offset -#define SSD1331_CMD_NORMALDISPLAY 0xA4 //!< Set display to normal mode -#define SSD1331_CMD_DISPLAYALLON 0xA5 //!< Set entire display ON -#define SSD1331_CMD_DISPLAYALLOFF 0xA6 //!< Set entire display OFF -#define SSD1331_CMD_INVERTDISPLAY 0xA7 //!< Invert display -#define SSD1331_CMD_SETMULTIPLEX 0xA8 //!< Set multiplex ratio -#define SSD1331_CMD_SETMASTER 0xAD //!< Set master configuration -#define SSD1331_CMD_DISPLAYOFF 0xAE //!< Display OFF (sleep mode) -#define SSD1331_CMD_DISPLAYON 0xAF //!< Normal Brightness Display ON -#define SSD1331_CMD_POWERMODE 0xB0 //!< Power save mode -#define SSD1331_CMD_PRECHARGE 0xB1 //!< Phase 1 and 2 period adjustment -#define SSD1331_CMD_CLOCKDIV \ - 0xB3 //!< Set display clock divide ratio/oscillator frequency -#define SSD1331_CMD_PRECHARGEA 0x8A //!< Set second pre-charge speed for color A -#define SSD1331_CMD_PRECHARGEB 0x8B //!< Set second pre-charge speed for color B -#define SSD1331_CMD_PRECHARGEC 0x8C //!< Set second pre-charge speed for color C -#define SSD1331_CMD_PRECHARGELEVEL 0xBB //!< Set pre-charge voltage -#define SSD1331_CMD_VCOMH 0xBE //!< Set Vcomh voltge - -/// Class to manage hardware interface with SSD1331 chipset -class Adafruit_SSD1331 : public Adafruit_SPITFT { -public: - Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst); - Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst); - // 3-4 args using hardware SPI (must specify peripheral) (reset optional) - Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, int8_t rst = -1); - - // commands - void begin(uint32_t begin = 8000000); - - void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); - - void enableDisplay(boolean enable); - - static const int16_t TFTWIDTH = 96; ///< The width of the display - static const int16_t TFTHEIGHT = 64; ///< The height of the display - -private: -}; diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md b/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md deleted file mode 100644 index 24c404c59..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md +++ /dev/null @@ -1,24 +0,0 @@ -# Adafruit SSD1331 Arduino Library [![Build Status](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/html/index.html) -This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip - - Pick one up today in the adafruit shop! - ------> http://www.adafruit.com/products/684 - -These displays use SPI to communicate, 4 or 5 pins are required to -interface - -Adafruit invests time and resources providing this open source code, -please support Adafruit and open-source hardware by purchasing -products from Adafruit! - -Written by Limor Fried/Ladyada for Adafruit Industries. -BSD license, check license.txt for more information -All text above must be included in any redistribution - -To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_SSD1131. Check that the Adafruit_SSD1331 folder contains Adafruit_SSD1331.cpp and Adafruit_SSD1331.h - -Place the Adafruit_SSD1331 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. - -You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from -https://github.com/adafruit/Adafruit-GFX-Library -and download/install that library as well diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties b/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties deleted file mode 100644 index 931f1aa38..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties +++ /dev/null @@ -1,10 +0,0 @@ -name=Adafruit SSD1331 OLED Driver Library for Arduino -version=1.2.0 -author=Adafruit -maintainer=Adafruit -sentence=For 0.96" OLEDs in the Adafruit shop -paragraph=For 0.96" OLEDs in the Adafruit shop -category=Display -url=https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino -architectures=* -depends=Adafruit GFX Library diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt b/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt deleted file mode 100644 index f6a0f22b8..000000000 --- a/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt +++ /dev/null @@ -1,26 +0,0 @@ -Software License Agreement (BSD License) - -Copyright (c) 2012, Adafruit Industries -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: -1. Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. -2. Redistributions in binary form must reproduce the above copyright -notice, this list of conditions and the following disclaimer in the -documentation and/or other materials provided with the distribution. -3. Neither the name of the copyright holders nor the -names of its contributors may be used to endorse or promote products -derived from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 7797403f0b9b937098a0412c276c1c87fe2e968a Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 2 Jan 2021 23:38:13 +0100 Subject: [PATCH 092/255] add missing quotes around %s in JSON response --- tasmota/xsns_34_hx711.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_34_hx711.ino b/tasmota/xsns_34_hx711.ino index 28abcdd25..4f22d7cca 100644 --- a/tasmota/xsns_34_hx711.ino +++ b/tasmota/xsns_34_hx711.ino @@ -264,7 +264,7 @@ bool HxCommand(void) char item[33]; dtostrfd((float)Settings.weight_item / 10, 1, item); Response_P(PSTR("{\"Sensor34\":{\"" D_JSON_WEIGHT_REF "\":%d,\"" D_JSON_WEIGHT_CAL "\":%d,\"" D_JSON_WEIGHT_MAX "\":%d,\"" - D_JSON_WEIGHT_ITEM "\":%s,\"" D_JSON_WEIGHT_CHANGE "\":%s,\"" D_JSON_WEIGHT_DELTA "\":%d}}"), + D_JSON_WEIGHT_ITEM "\":%s,\"" D_JSON_WEIGHT_CHANGE "\":\"%s\",\"" D_JSON_WEIGHT_DELTA "\":%d}}"), Settings.weight_reference, Settings.weight_calibration, Settings.weight_max * 1000, item, GetStateText(Settings.SensorBits1.hx711_json_weight_change), Settings.weight_change); } From 7014e64fed7de0050cb098a052fa9fe914700f60 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 3 Jan 2021 08:08:03 +0100 Subject: [PATCH 093/255] st7789 support for LANBON_L8 --- .../Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp | 7 +++++-- tasmota/xdsp_12_ST7789.ino | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp index 74837242b..47312c50a 100644 --- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp +++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp @@ -96,8 +96,11 @@ Arduino_ST7789::Arduino_ST7789(int8_t dc, int8_t rst, int8_t cs, int8_t bp) void Arduino_ST7789::DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font) { setRotation(rot); - //invertDisplay(false); - invertDisplay(true); + if (_width==320 || _height==320) { + invertDisplay(false); + } else { + invertDisplay(true); + } //setTextWrap(false); // Allow text to run off edges //cp437(true); setTextFont(font&3); diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index cdb9ad167..80cf4d6e5 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -45,6 +45,10 @@ // currently fixed #define BACKPLANE_PIN 2 + #ifdef USE_LANBON_L8 + #undef BACKPLANE_PIN + #define BACKPLANE_PIN 5 + #endif // USE_LANBON_L8 extern uint8_t *buffer; extern uint8_t color_type; @@ -126,6 +130,12 @@ void ST7789_InitDriver(void) { // start digitizer with fixed adress and pins for esp32 #define SDA_2 23 #define SCL_2 32 + #ifdef USE_LANBON_L8 + #undef SDA_2 + #undef SCL_2 + #define SDA_2 4 + #define SCL_2 0 + #endif // USE_LANBON_L8 Wire1.begin(SDA_2, SCL_2, 400000); Touch_Init(Wire1); #endif // USE_FT5206 From 0d2d2d01f5a23b7a98fa4deb37ca2e7e9af73c94 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 3 Jan 2021 08:08:28 +0100 Subject: [PATCH 094/255] fix var name clash --- tasmota/xdrv_10_scripter.ino | 96 +++++++++--------------------------- 1 file changed, 22 insertions(+), 74 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 44c4e2b21..0c79e8f65 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1,7 +1,7 @@ /* xdrv_10_scripter.ino - script support for Tasmota - Copyright (C) 2021 Gerhard Mutz and Theo Arends + Copyright (C) 2020 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -209,51 +209,17 @@ void alt_eeprom_readBytes(uint32_t adr, uint32_t len, uint8_t *buf) { -#if defined(LITTLEFS_SCRIPT_SIZE) || (USE_SCRIPT_FATFS==-1) +#if USE_SCRIPT_FATFS==-1 #ifdef ESP32 #include "FS.h" -#ifdef LITTLEFS_SCRIPT_SIZE -#include "SPIFFS.h" -#else #include "FFat.h" -//#include -#endif #else #include #endif FS *fsp; #endif // LITTLEFS_SCRIPT_SIZE - -#ifdef LITTLEFS_SCRIPT_SIZE -void SaveFile(const char *name, const uint8_t *buf, uint32_t len) { - File file = fsp->open(name, "w"); - if (!file) return; - file.write(buf, len); - file.close(); -} - - -uint8_t fs_mounted=0; - -void LoadFile(const char *name, uint8_t *buf, uint32_t len) { - if (!fs_mounted) { -#ifdef ESP32 - if (!SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) { -#else - if (!fsp->begin()) { -#endif - //Serial.println("SPIFFS Mount Failed"); - return; - } - fs_mounted=1; - } - File file = fsp->open(name, "r"); - if (!file) return; - file.read(buf, len); - file.close(); -} -#endif // LITTLEFS_SCRIPT_SIZE +//extern FS *ufsp; // offsets epoch readings by 1.1.2019 00:00:00 to fit into float with second resolution #define EPOCH_OFFSET 1546300800 @@ -266,7 +232,10 @@ enum {SCRIPT_LOGLEVEL=1,SCRIPT_TELEPERIOD,SCRIPT_EVENT_HANDLED}; #if USE_SCRIPT_FATFS>=0 #include #include +#include + #ifdef ESP32 +#include "FFat.h" FS *fsp; #else SDClass *fsp; @@ -996,6 +965,10 @@ char *script; } } +// init file system +//#ifndef USE_UFILESYS +#if 1 + #ifdef USE_SCRIPT_FATFS if (!glob_script_mem.script_sd_found) { @@ -1024,6 +997,10 @@ char *script; } #endif +#else + fsp = ufsp; +#endif + #if SCRIPT_DEBUG>0 ClaimSerial(); SetSerialBaudrate(9600); @@ -1757,6 +1734,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, fvar = Get_MFilter(index); } } else { + if (ja) continue; fvar = glob_script_mem.fvars[index]; } if (nres) fvar = -fvar; @@ -5319,11 +5297,6 @@ void SaveScript(void) { } #endif // USE_SCRIPT_FATFS -#ifdef LITTLEFS_SCRIPT_SIZE - if (glob_script_mem.flags&1) { - SaveFile("/script.txt", (uint8_t*)glob_script_mem.script_ram, LITTLEFS_SCRIPT_SIZE); - } -#endif // LITTLEFS_SCRIPT_SIZE } void ScriptSaveSettings(void) { @@ -5848,8 +5821,8 @@ void Script_Handle_Hue(String *path) { String x_str = tok_x.getStr(); String y_str = tok_y.getStr(); uint8_t rr,gg,bb; - XyToRgb(x, y, &rr, &gg, &bb); - RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); + LightStateClass::XyToRgb(x, y, &rr, &gg, &bb); + LightStateClass::RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); if (resp) { response += ","; } response += FPSTR(sHUE_LIGHT_RESPONSE_JSON); response.replace("{id", String(device)); @@ -7679,7 +7652,8 @@ bool Xdrv10(uint8_t function) char *sprt; switch (function) { - case FUNC_PRE_INIT: + //case FUNC_PRE_INIT: + case FUNC_INIT: // set defaults to rules memory //bitWrite(Settings.rule_enabled,0,0); glob_script_mem.script_ram = Settings.rules[0]; @@ -7771,8 +7745,6 @@ bool Xdrv10(uint8_t function) #else // flash file system #ifdef ESP32 - //fsp = &SPIFFS; - //if (SPIFFS.begin(FORMAT_SPIFFS_IF_FAILED)) { fsp = &FFat; if (FFat.begin(true)) { #else @@ -7782,6 +7754,7 @@ bool Xdrv10(uint8_t function) #endif // ESP #endif // USE_SCRIPT_FATFS>=0 + Script_AddLog_P(LOG_LEVEL_INFO,PSTR("FATFS mount OK!")); //fsp->dateTimeCallback(dateTime); @@ -7810,31 +7783,6 @@ bool Xdrv10(uint8_t function) #endif // USE_SCRIPT_FATFS -#ifdef LITTLEFS_SCRIPT_SIZE - -#ifdef ESP32 - // spiffs on esp32 - fsp = &SPIFFS; - //esp32_part = esp_partition_find_first(ESP_PARTITION_TYPE_DATA,ESP_PARTITION_SUBTYPE_DATA_SPIFFS,NULL); - //Serial.printf("address %d - %d - %s\n",esp32_part->address,esp32_part->size, esp32_part->label); -#else - // lfs on esp8266 - fsp = &LittleFS; -#endif //ESP32 - char *script; - script = (char*)calloc(LITTLEFS_SCRIPT_SIZE + 4, 1); - if (!script) break; - LoadFile("/script.txt", (uint8_t*)script, LITTLEFS_SCRIPT_SIZE); - - glob_script_mem.script_ram = script; - glob_script_mem.script_size = LITTLEFS_SCRIPT_SIZE; - script[LITTLEFS_SCRIPT_SIZE-1] = 0; - // use rules storage for permanent vars - glob_script_mem.script_pram = (uint8_t*)Settings.rules[0]; - glob_script_mem.script_pram_size = MAX_SCRIPT_SIZE; - glob_script_mem.flags = 1; -#endif // LITTLEFS_SCRIPT_SIZE - // a valid script MUST start with >D if (glob_script_mem.script_ram[0]!='>' && glob_script_mem.script_ram[1]!='D') { // clr all @@ -7852,8 +7800,8 @@ bool Xdrv10(uint8_t function) } if (bitRead(Settings.rule_enabled, 0)) Init_Scripter(); - break; - case FUNC_INIT: + // break; + //case FUNC_INIT: if (bitRead(Settings.rule_enabled, 0)) { Run_Scripter(">B\n", 3, 0); fast_script = Run_Scripter(">F", -2, 0); From 9d4129501b41d676d604349498309826572c8e8c Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 3 Jan 2021 08:13:16 +0100 Subject: [PATCH 095/255] Update xdrv_10_scripter.ino --- tasmota/xdrv_10_scripter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 0c79e8f65..f8cb6baf6 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1,7 +1,7 @@ /* xdrv_10_scripter.ino - script support for Tasmota - Copyright (C) 2020 Gerhard Mutz and Theo Arends + Copyright (C) 2021 Gerhard Mutz and Theo Arends This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by From 2bc4c9ff036f615d0d16551b5554c593711e695b Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sun, 3 Jan 2021 08:17:24 +0100 Subject: [PATCH 096/255] Update xdrv_10_scripter.ino --- tasmota/xdrv_10_scripter.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index f8cb6baf6..fdcb7e0ba 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -5821,8 +5821,8 @@ void Script_Handle_Hue(String *path) { String x_str = tok_x.getStr(); String y_str = tok_y.getStr(); uint8_t rr,gg,bb; - LightStateClass::XyToRgb(x, y, &rr, &gg, &bb); - LightStateClass::RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); + XyToRgb(x, y, &rr, &gg, &bb); + RgbToHsb(rr, gg, bb, &hue, &sat, nullptr); if (resp) { response += ","; } response += FPSTR(sHUE_LIGHT_RESPONSE_JSON); response.replace("{id", String(device)); From be5d9f90a8f415b2a301ac63be68978fe8be3b77 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 3 Jan 2021 15:09:20 +0100 Subject: [PATCH 097/255] Zigbee replace qsort with insertion sort --- tasmota/xdrv_23_zigbee_5__constants.ino | 1524 +++++++++++------------ tasmota/xdrv_23_zigbee_A_impl.ino | 74 +- 2 files changed, 803 insertions(+), 795 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_5__constants.ino b/tasmota/xdrv_23_zigbee_5__constants.ino index fdd161c50..a5c223b2b 100644 --- a/tasmota/xdrv_23_zigbee_5__constants.ino +++ b/tasmota/xdrv_23_zigbee_5__constants.ino @@ -75,844 +75,844 @@ def strings_to_pmem(arg): const char Z_strings[] PROGMEM = "\x00" - "ZCLVersion" "\x00" - "AppVersion" "\x00" - "StackVersion" "\x00" - "HWVersion" "\x00" - "Manufacturer" "\x00" - "ModelId" "\x00" - "DateCode" "\x00" - "PowerSource" "\x00" - "GenericDeviceClass" "\x00" - "GenericDeviceType" "\x00" - "ProductCode" "\x00" - "ProductURL" "\x00" - "SWBuildID" "\x00" - "MainsVoltage" "\x00" - "MainsFrequency" "\x00" - "BatteryVoltage" "\x00" - "BatteryPercentage" "\x00" - "CurrentTemperature" "\x00" - "MinTempExperienced" "\x00" - "MaxTempExperienced" "\x00" - "OverTempTotalDwell" "\x00" - "IdentifyTime" "\x00" - "GroupNameSupport" "\x00" - "SceneCount" "\x00" - "CurrentScene" "\x00" - "CurrentGroup" "\x00" - "SceneValid" "\x00" - "Power" "\x00" - "StartUpOnOff" "\x00" - "SwitchType" "\x00" - "Dimmer" "\x00" - "DimmerOptions" "\x00" - "DimmerRemainingTime" "\x00" - "OnOffTransitionTime" "\x00" + "00" "\x00" + "00190200" "\x00" + "00xx0A00" "\x00" + "00xxxx000000000000" "\x00" + "01" "\x00" + "01190200" "\x00" + "01xx0A00" "\x00" + "01xxxx" "\x00" + "01xxxx000000000000" "\x00" + "01xxxx0A0000000000" "\x00" + "03xx0A00" "\x00" + "03xxxx000000000000" "\x00" + "03xxxx0A0000000000" "\x00" + "AccelerationTimeLift" "\x00" + "ActivePower" "\x00" + "ActuatorEnabled" "\x00" + "AddGroup" "\x00" + "AddScene" "\x00" "AlarmCount" "\x00" - "Time" "\x00" - "TimeStatus" "\x00" - "TimeZone" "\x00" - "DstStart" "\x00" - "DstEnd" "\x00" - "DstShift" "\x00" - "StandardTime" "\x00" - "LocalTime" "\x00" - "LastSetTime" "\x00" - "ValidUntilTime" "\x00" - "TimeEpoch" "\x00" - "LocationType" "\x00" - "LocationMethod" "\x00" - "LocationAge" "\x00" - "QualityMeasure" "\x00" - "NumberOfDevices" "\x00" + "AnalogApplicationType" "\x00" + "AnalogDescription" "\x00" + "AnalogEngineeringUnits" "\x00" + "AnalogInApplicationType" "\x00" "AnalogInDescription" "\x00" + "AnalogInEngineeringUnits" "\x00" "AnalogInMaxValue" "\x00" "AnalogInMinValue" "\x00" "AnalogInOutOfService" "\x00" - "AnalogValue" "\x00" "AnalogInReliability" "\x00" "AnalogInResolution" "\x00" "AnalogInStatusFlags" "\x00" - "AnalogInEngineeringUnits" "\x00" - "AnalogInApplicationType" "\x00" - "AqaraRotate" "\x00" - "Aqara_FF05" "\x00" + "AnalogOutApplicationType" "\x00" "AnalogOutDescription" "\x00" + "AnalogOutEngineeringUnits" "\x00" "AnalogOutMaxValue" "\x00" "AnalogOutMinValue" "\x00" + "AnalogOutOfService" "\x00" "AnalogOutOutOfService" "\x00" - "AnalogOutValue" "\x00" "AnalogOutReliability" "\x00" "AnalogOutRelinquishDefault" "\x00" "AnalogOutResolution" "\x00" "AnalogOutStatusFlags" "\x00" - "AnalogOutEngineeringUnits" "\x00" - "AnalogOutApplicationType" "\x00" - "AnalogDescription" "\x00" - "AnalogOutOfService" "\x00" + "AnalogOutValue" "\x00" "AnalogPriorityArray" "\x00" "AnalogReliability" "\x00" "AnalogRelinquishDefault" "\x00" "AnalogStatusFlags" "\x00" - "AnalogEngineeringUnits" "\x00" - "AnalogApplicationType" "\x00" + "AnalogValue" "\x00" + "AppVersion" "\x00" + "ApparentPower" "\x00" + "AqaraAccelerometer" "\x00" + "AqaraRotate" "\x00" + "AqaraVibration505" "\x00" + "AqaraVibrationMode" "\x00" + "AqaraVibrationsOrAngle" "\x00" + "Aqara_FF05" "\x00" + "ArrowClick" "\x00" + "ArrowHold" "\x00" + "ArrowRelease" "\x00" + "AvailablePower" "\x00" + "BatteryPercentage" "\x00" + "BatteryVoltage" "\x00" + "BinaryActiveText" "\x00" + "BinaryApplicationType" "\x00" + "BinaryDescription" "\x00" "BinaryInActiveText" "\x00" + "BinaryInApplicationType" "\x00" "BinaryInDescription" "\x00" "BinaryInInactiveText" "\x00" "BinaryInOutOfService" "\x00" "BinaryInPolarity" "\x00" - "BinaryInValue" "\x00" "BinaryInReliability" "\x00" "BinaryInStatusFlags" "\x00" - "BinaryInApplicationType" "\x00" + "BinaryInValue" "\x00" + "BinaryInactiveText" "\x00" + "BinaryMinimumOffTime" "\x00" + "BinaryMinimumOnTime" "\x00" "BinaryOutActiveText" "\x00" + "BinaryOutApplicationType" "\x00" "BinaryOutDescription" "\x00" "BinaryOutInactiveText" "\x00" "BinaryOutMinimumOffTime" "\x00" "BinaryOutMinimumOnTime" "\x00" + "BinaryOutOfService" "\x00" "BinaryOutOutOfService" "\x00" "BinaryOutPolarity" "\x00" - "BinaryOutValue" "\x00" "BinaryOutReliability" "\x00" "BinaryOutRelinquishDefault" "\x00" "BinaryOutStatusFlags" "\x00" - "BinaryOutApplicationType" "\x00" - "BinaryActiveText" "\x00" - "BinaryDescription" "\x00" - "BinaryInactiveText" "\x00" - "BinaryMinimumOffTime" "\x00" - "BinaryMinimumOnTime" "\x00" - "BinaryOutOfService" "\x00" - "BinaryValue" "\x00" + "BinaryOutValue" "\x00" "BinaryReliability" "\x00" "BinaryRelinquishDefault" "\x00" "BinaryStatusFlags" "\x00" - "BinaryApplicationType" "\x00" + "BinaryValue" "\x00" + "CIE" "\x00" + "CO" "\x00" + "CT" "\x00" + "CheckinInterval" "\x00" + "CheckinIntervalMin" "\x00" + "ClosedLimit" "\x00" + "Color" "\x00" + "ColorMode" "\x00" + "ColorMove" "\x00" + "ColorPointBIntensity" "\x00" + "ColorPointBX" "\x00" + "ColorPointBY" "\x00" + "ColorPointGIntensity" "\x00" + "ColorPointGX" "\x00" + "ColorPointGY" "\x00" + "ColorPointRIntensity" "\x00" + "ColorPointRX" "\x00" + "ColorPointRY" "\x00" + "ColorStep" "\x00" + "ColorTempMove" "\x00" + "ColorTempMoveDown" "\x00" + "ColorTempMoveStop" "\x00" + "ColorTempMoveUp" "\x00" + "ColorTempStep" "\x00" + "ColorTempStepDown" "\x00" + "ColorTempStepUp" "\x00" + "CompanyName" "\x00" + "CompensationText" "\x00" + "ConfigStatus" "\x00" + "Contact" "\x00" + "ControlSequenceOfOperation" "\x00" + "CurrentGroup" "\x00" + "CurrentPositionLift" "\x00" + "CurrentPositionLiftPercentage" "\x00" + "CurrentPositionTilt" "\x00" + "CurrentPositionTiltPercentage" "\x00" + "CurrentScene" "\x00" + "CurrentTemperature" "\x00" + "CurrentTemperatureSetPoint" "\x00" + "CustomerName" "\x00" + "DataQualityID" "\x00" + "DateCode" "\x00" + "DecelerationTimeLift" "\x00" + "Dimmer" "\x00" + "DimmerDown" "\x00" + "DimmerMove" "\x00" + "DimmerOptions" "\x00" + "DimmerRemainingTime" "\x00" + "DimmerStep" "\x00" + "DimmerStepDown" "\x00" + "DimmerStepUp" "\x00" + "DimmerStop" "\x00" + "DimmerUp" "\x00" + "DoorClosedEvents" "\x00" + "DoorOpenEvents" "\x00" + "DoorState" "\x00" + "DriftCompensation" "\x00" + "DstEnd" "\x00" + "DstShift" "\x00" + "DstStart" "\x00" + "EnergyFormatting" "\x00" + "EnergyRemote" "\x00" + "EnergyTotal" "\x00" + "EurotronicErrors" "\x00" + "EurotronicHostFlags" "\x00" + "FastPollTimeout" "\x00" + "FastPollTimeoutMax" "\x00" + "Fire" "\x00" + "FlowMaxMeasuredValue" "\x00" + "FlowMinMeasuredValue" "\x00" + "FlowRate" "\x00" + "FlowTolerance" "\x00" + "GenericDeviceClass" "\x00" + "GenericDeviceType" "\x00" + "GetAllGroups" "\x00" + "GetGroup" "\x00" + "GetSceneMembership" "\x00" + "GlassBreak" "\x00" + "GroupNameSupport" "\x00" + "HWVersion" "\x00" + "Hue" "\x00" + "HueMove" "\x00" + "HueSat" "\x00" + "HueStep" "\x00" + "HueStepDown" "\x00" + "HueStepUp" "\x00" + "Humidity" "\x00" + "HumidityMaxMeasuredValue" "\x00" + "HumidityMinMeasuredValue" "\x00" + "HumidityTolerance" "\x00" + "Identify" "\x00" + "IdentifyQuery" "\x00" + "IdentifyTime" "\x00" + "Illuminance" "\x00" + "IlluminanceLevelStatus" "\x00" + "IlluminanceLightSensorType" "\x00" + "IlluminanceMaxMeasuredValue" "\x00" + "IlluminanceMinMeasuredValue" "\x00" + "IlluminanceTargetLevel" "\x00" + "IlluminanceTolerance" "\x00" + "InstalledClosedLimitLift" "\x00" + "InstalledClosedLimitTilt" "\x00" + "InstalledOpenLimitLift" "\x00" + "InstalledOpenLimitTilt" "\x00" + "IntermediateSetpointsLift" "\x00" + "IntermediateSetpointsTilt" "\x00" + "LastMessageLQI" "\x00" + "LastMessageRSSI" "\x00" + "LastSetTime" "\x00" + "LocalTemperature" "\x00" + "LocalTemperatureCalibration" "\x00" + "LocalTime" "\x00" + "LocationAge" "\x00" + "LocationMethod" "\x00" + "LocationType" "\x00" + "LockState" "\x00" + "LockType" "\x00" + "LongPollInterval" "\x00" + "LongPollIntervalMin" "\x00" + "MainsFrequency" "\x00" + "MainsVoltage" "\x00" + "Manufacturer" "\x00" + "MaxTempExperienced" "\x00" + "MeterTypeID" "\x00" + "MinTempExperienced" "\x00" + "Mode" "\x00" + "Model" "\x00" + "ModelId" "\x00" + "MotorStepSize" "\x00" + "Movement" "\x00" + "MultiApplicationType" "\x00" + "MultiDescription" "\x00" + "MultiInApplicationType" "\x00" "MultiInDescription" "\x00" "MultiInNumberOfStates" "\x00" "MultiInOutOfService" "\x00" - "MultiInValue" "\x00" "MultiInReliability" "\x00" "MultiInStatusFlags" "\x00" - "MultiInApplicationType" "\x00" + "MultiInValue" "\x00" + "MultiNumberOfStates" "\x00" + "MultiOutApplicationType" "\x00" "MultiOutDescription" "\x00" "MultiOutNumberOfStates" "\x00" + "MultiOutOfService" "\x00" "MultiOutOutOfService" "\x00" - "MultiOutValue" "\x00" "MultiOutReliability" "\x00" "MultiOutRelinquishDefault" "\x00" "MultiOutStatusFlags" "\x00" - "MultiOutApplicationType" "\x00" - "MultiDescription" "\x00" - "MultiNumberOfStates" "\x00" - "MultiOutOfService" "\x00" - "MultiValue" "\x00" + "MultiOutValue" "\x00" "MultiReliability" "\x00" "MultiRelinquishDefault" "\x00" "MultiStatusFlags" "\x00" - "MultiApplicationType" "\x00" - "TotalProfileNum" "\x00" + "MultiValue" "\x00" "MultipleScheduling" "\x00" - "EnergyFormatting" "\x00" - "EnergyRemote" "\x00" - "ScheduleMode" "\x00" - "CheckinInterval" "\x00" - "LongPollInterval" "\x00" - "ShortPollInterval" "\x00" - "FastPollTimeout" "\x00" - "CheckinIntervalMin" "\x00" - "LongPollIntervalMin" "\x00" - "FastPollTimeoutMax" "\x00" - "PhysicalClosedLimit" "\x00" - "MotorStepSize" "\x00" - "Status" "\x00" - "ClosedLimit" "\x00" - "Mode" "\x00" - "LockState" "\x00" - "LockType" "\x00" - "ActuatorEnabled" "\x00" - "DoorState" "\x00" - "DoorOpenEvents" "\x00" - "DoorClosedEvents" "\x00" - "OpenPeriod" "\x00" - "AqaraVibrationMode" "\x00" - "AqaraVibrationsOrAngle" "\x00" - "AqaraVibration505" "\x00" - "AqaraAccelerometer" "\x00" - "WindowCoveringType" "\x00" - "PhysicalClosedLimitLift" "\x00" - "PhysicalClosedLimitTilt" "\x00" - "CurrentPositionLift" "\x00" - "CurrentPositionTilt" "\x00" + "NumberOfDevices" "\x00" + "NumberOfPrimaries" "\x00" + "NumberOfResets" "\x00" "NumberofActuationsLift" "\x00" "NumberofActuationsTilt" "\x00" - "ConfigStatus" "\x00" - "CurrentPositionLiftPercentage" "\x00" - "CurrentPositionTiltPercentage" "\x00" - "InstalledOpenLimitLift" "\x00" - "InstalledClosedLimitLift" "\x00" - "InstalledOpenLimitTilt" "\x00" - "InstalledClosedLimitTilt" "\x00" - "VelocityLift" "\x00" - "AccelerationTimeLift" "\x00" - "DecelerationTimeLift" "\x00" - "IntermediateSetpointsLift" "\x00" - "IntermediateSetpointsTilt" "\x00" - "LocalTemperature" "\x00" - "OutdoorTemperature" "\x00" - "PICoolingDemand" "\x00" - "PIHeatingDemand" "\x00" - "LocalTemperatureCalibration" "\x00" - "OccupiedCoolingSetpoint" "\x00" - "OccupiedHeatingSetpoint" "\x00" - "UnoccupiedCoolingSetpoint" "\x00" - "UnoccupiedHeatingSetpoint" "\x00" - "RemoteSensing" "\x00" - "ControlSequenceOfOperation" "\x00" - "SystemMode" "\x00" - "TRVMode" "\x00" - "ValvePosition" "\x00" - "EurotronicErrors" "\x00" - "CurrentTemperatureSetPoint" "\x00" - "EurotronicHostFlags" "\x00" - "TRVMirrorDisplay" "\x00" - "TRVBoost" "\x00" - "TRVWindowOpen" "\x00" - "TRVChildProtection" "\x00" - "ThSetpoint" "\x00" - "TempTarget" "\x00" - "Hue" "\x00" - "Sat" "\x00" - "RemainingTime" "\x00" - "X" "\x00" - "Y" "\x00" - "DriftCompensation" "\x00" - "CompensationText" "\x00" - "CT" "\x00" - "ColorMode" "\x00" - "NumberOfPrimaries" "\x00" - "Primary1X" "\x00" - "Primary1Y" "\x00" - "Primary1Intensity" "\x00" - "Primary2X" "\x00" - "Primary2Y" "\x00" - "Primary2Intensity" "\x00" - "Primary3X" "\x00" - "Primary3Y" "\x00" - "Primary3Intensity" "\x00" - "WhitePointX" "\x00" - "WhitePointY" "\x00" - "ColorPointRX" "\x00" - "ColorPointRY" "\x00" - "ColorPointRIntensity" "\x00" - "ColorPointGX" "\x00" - "ColorPointGY" "\x00" - "ColorPointGIntensity" "\x00" - "ColorPointBX" "\x00" - "ColorPointBY" "\x00" - "ColorPointBIntensity" "\x00" - "Illuminance" "\x00" - "IlluminanceMinMeasuredValue" "\x00" - "IlluminanceMaxMeasuredValue" "\x00" - "IlluminanceTolerance" "\x00" - "IlluminanceLightSensorType" "\x00" - "IlluminanceLevelStatus" "\x00" - "IlluminanceTargetLevel" "\x00" - "Temperature" "\x00" - "TemperatureMinMeasuredValue" "\x00" - "TemperatureMaxMeasuredValue" "\x00" - "TemperatureTolerance" "\x00" - "Pressure" "\x00" - "PressureMinMeasuredValue" "\x00" - "PressureMaxMeasuredValue" "\x00" - "PressureTolerance" "\x00" - "PressureScaledValue" "\x00" - "PressureMinScaledValue" "\x00" - "PressureMaxScaledValue" "\x00" - "PressureScaledTolerance" "\x00" - "PressureScale" "\x00" - "SeaPressure" "\x00" - "FlowRate" "\x00" - "FlowMinMeasuredValue" "\x00" - "FlowMaxMeasuredValue" "\x00" - "FlowTolerance" "\x00" - "Humidity" "\x00" - "HumidityMinMeasuredValue" "\x00" - "HumidityMaxMeasuredValue" "\x00" - "HumidityTolerance" "\x00" "Occupancy" "\x00" "OccupancySensorType" "\x00" - "ZoneState" "\x00" - "ZoneType" "\x00" - "ZoneStatus" "\x00" - "CIE" "\x00" - "Contact" "\x00" - "Fire" "\x00" - "Water" "\x00" - "CO" "\x00" - "PersonalAlarm" "\x00" - "Movement" "\x00" - "Panic" "\x00" - "GlassBreak" "\x00" - "EnergyTotal" "\x00" - "CompanyName" "\x00" - "MeterTypeID" "\x00" - "DataQualityID" "\x00" - "CustomerName" "\x00" - "Model" "\x00" - "PartNumber" "\x00" - "ProductRevision" "\x00" - "SoftwareRevision" "\x00" - "UtilityName" "\x00" + "OccupiedCoolingSetpoint" "\x00" + "OccupiedHeatingSetpoint" "\x00" + "OnOffTransitionTime" "\x00" + "OpenPeriod" "\x00" + "OppleMode" "\x00" + "OutdoorTemperature" "\x00" + "OverTempTotalDwell" "\x00" + "PICoolingDemand" "\x00" + "PIHeatingDemand" "\x00" "POD" "\x00" - "AvailablePower" "\x00" - "PowerThreshold" "\x00" - "RMSVoltage" "\x00" - "RMSCurrent" "\x00" - "ActivePower" "\x00" - "ReactivePower" "\x00" - "ApparentPower" "\x00" - "NumberOfResets" "\x00" + "Panic" "\x00" + "PartNumber" "\x00" "PersistentMemoryWrites" "\x00" - "LastMessageLQI" "\x00" - "LastMessageRSSI" "\x00" - "TuyaScheduleWorkdays" "\x00" - "TuyaScheduleHolidays" "\x00" + "PersonalAlarm" "\x00" + "PhysicalClosedLimit" "\x00" + "PhysicalClosedLimitLift" "\x00" + "PhysicalClosedLimitTilt" "\x00" + "Power" "\x00" "Power2" "\x00" "Power3" "\x00" "Power4" "\x00" - "TuyaChildLock" "\x00" - "TuyaWindowDetection" "\x00" - "TuyaValveDetection" "\x00" - "TuyaAutoLock" "\x00" - "TuyaTempTarget" "\x00" - "TuyaBattery" "\x00" - "TuyaMinTemp" "\x00" - "TuyaMaxTemp" "\x00" - "TuyaBoostTime" "\x00" - "TuyaComfortTemp" "\x00" - "TuyaEcoTemp" "\x00" - "TuyaValvePosition" "\x00" - "TuyaAwayTemp" "\x00" - "TuyaAwayDays" "\x00" - "TuyaPreset" "\x00" - "TuyaFanMode" "\x00" - "TuyaForceMode" "\x00" - "TuyaWeekSelect" "\x00" - "OppleMode" "\x00" - "TerncyDuration" "\x00" - "TerncyRotate" "\x00" - "Identify" "\x00" - "xxxx" "\x00" - "IdentifyQuery" "\x00" - "AddGroup" "\x00" - "xxxx00" "\x00" - "ViewGroup" "\x00" - "GetGroup" "\x00" - "01xxxx" "\x00" - "GetAllGroups" "\x00" - "00" "\x00" - "RemoveGroup" "\x00" - "RemoveAllGroups" "\x00" - "ViewScene" "\x00" - "xxxxyy" "\x00" - "RemoveScene" "\x00" - "RemoveAllScenes" "\x00" - "RecallScene" "\x00" - "GetSceneMembership" "\x00" "PowerOffEffect" "\x00" - "xxyy" "\x00" "PowerOnRecall" "\x00" "PowerOnTimer" "\x00" - "xxyyyyzzzz" "\x00" - "xx0A00" "\x00" - "DimmerUp" "\x00" - "00190200" "\x00" - "DimmerDown" "\x00" - "01190200" "\x00" - "DimmerStop" "\x00" + "PowerSource" "\x00" + "PowerThreshold" "\x00" + "Pressure" "\x00" + "PressureMaxMeasuredValue" "\x00" + "PressureMaxScaledValue" "\x00" + "PressureMinMeasuredValue" "\x00" + "PressureMinScaledValue" "\x00" + "PressureScale" "\x00" + "PressureScaledTolerance" "\x00" + "PressureScaledValue" "\x00" + "PressureTolerance" "\x00" + "Primary1Intensity" "\x00" + "Primary1X" "\x00" + "Primary1Y" "\x00" + "Primary2Intensity" "\x00" + "Primary2X" "\x00" + "Primary2Y" "\x00" + "Primary3Intensity" "\x00" + "Primary3X" "\x00" + "Primary3Y" "\x00" + "ProductCode" "\x00" + "ProductRevision" "\x00" + "ProductURL" "\x00" + "QualityMeasure" "\x00" + "RMSCurrent" "\x00" + "RMSVoltage" "\x00" + "ReactivePower" "\x00" + "RecallScene" "\x00" + "RemainingTime" "\x00" + "RemoteSensing" "\x00" + "RemoveAllGroups" "\x00" + "RemoveAllScenes" "\x00" + "RemoveGroup" "\x00" + "RemoveScene" "\x00" "ResetAlarm" "\x00" - "xxyyyy" "\x00" "ResetAllAlarms" "\x00" - "xx000A00" "\x00" - "HueSat" "\x00" - "xxyy0A00" "\x00" - "Color" "\x00" - "xxxxyyyy0A00" "\x00" - "xxxx0A00" "\x00" - "ShutterOpen" "\x00" - "ShutterClose" "\x00" - "ShutterStop" "\x00" - "ShutterLift" "\x00" - "xx" "\x00" - "ShutterTilt" "\x00" - "Shutter" "\x00" - "DimmerMove" "\x00" - "xx0A" "\x00" - "DimmerStepUp" "\x00" - "00xx0A00" "\x00" - "DimmerStepDown" "\x00" - "01xx0A00" "\x00" - "DimmerStep" "\x00" - "xx190A00" "\x00" - "01" "\x00" - "HueMove" "\x00" - "xx19" "\x00" - "HueStepUp" "\x00" - "HueStepDown" "\x00" - "03xx0A00" "\x00" - "HueStep" "\x00" + "SWBuildID" "\x00" + "Sat" "\x00" "SatMove" "\x00" "SatStep" "\x00" - "xx190A" "\x00" - "ColorMove" "\x00" - "xxxxyyyy" "\x00" - "ColorStep" "\x00" - "ColorTempMoveUp" "\x00" - "01xxxx000000000000" "\x00" - "ColorTempMoveDown" "\x00" - "03xxxx000000000000" "\x00" - "ColorTempMoveStop" "\x00" - "00xxxx000000000000" "\x00" - "ColorTempMove" "\x00" - "xxyyyy000000000000" "\x00" - "ColorTempStepUp" "\x00" - "01xxxx0A0000000000" "\x00" - "ColorTempStepDown" "\x00" - "03xxxx0A0000000000" "\x00" - "ColorTempStep" "\x00" - "xxyyyy0A0000000000" "\x00" - "ArrowClick" "\x00" - "ArrowHold" "\x00" - "ArrowRelease" "\x00" - "ZoneStatusChange" "\x00" - "xxxxyyzz" "\x00" - "xxyyzzzz" "\x00" - "AddScene" "\x00" - "xxyyyyzz" "\x00" + "SceneCount" "\x00" + "SceneValid" "\x00" + "ScheduleMode" "\x00" + "SeaPressure" "\x00" + "ShortPollInterval" "\x00" + "Shutter" "\x00" + "ShutterClose" "\x00" + "ShutterLift" "\x00" + "ShutterOpen" "\x00" + "ShutterStop" "\x00" + "ShutterTilt" "\x00" + "SoftwareRevision" "\x00" + "StackVersion" "\x00" + "StandardTime" "\x00" + "StartUpOnOff" "\x00" + "Status" "\x00" "StoreScene" "\x00" + "SwitchType" "\x00" + "SystemMode" "\x00" + "TRVBoost" "\x00" + "TRVChildProtection" "\x00" + "TRVMirrorDisplay" "\x00" + "TRVMode" "\x00" + "TRVWindowOpen" "\x00" + "TempTarget" "\x00" + "Temperature" "\x00" + "TemperatureMaxMeasuredValue" "\x00" + "TemperatureMinMeasuredValue" "\x00" + "TemperatureTolerance" "\x00" + "TerncyDuration" "\x00" + "TerncyRotate" "\x00" + "ThSetpoint" "\x00" + "Time" "\x00" + "TimeEpoch" "\x00" + "TimeStatus" "\x00" + "TimeZone" "\x00" + "TotalProfileNum" "\x00" + "TuyaAutoLock" "\x00" + "TuyaAwayDays" "\x00" + "TuyaAwayTemp" "\x00" + "TuyaBattery" "\x00" + "TuyaBoostTime" "\x00" + "TuyaChildLock" "\x00" + "TuyaComfortTemp" "\x00" + "TuyaEcoTemp" "\x00" + "TuyaFanMode" "\x00" + "TuyaForceMode" "\x00" + "TuyaMaxTemp" "\x00" + "TuyaMinTemp" "\x00" + "TuyaPreset" "\x00" + "TuyaScheduleHolidays" "\x00" + "TuyaScheduleWorkdays" "\x00" + "TuyaTempTarget" "\x00" + "TuyaValveDetection" "\x00" + "TuyaValvePosition" "\x00" + "TuyaWeekSelect" "\x00" + "TuyaWindowDetection" "\x00" + "UnoccupiedCoolingSetpoint" "\x00" + "UnoccupiedHeatingSetpoint" "\x00" + "UtilityName" "\x00" + "ValidUntilTime" "\x00" + "ValvePosition" "\x00" + "VelocityLift" "\x00" + "ViewGroup" "\x00" + "ViewScene" "\x00" + "Water" "\x00" + "WhitePointX" "\x00" + "WhitePointY" "\x00" + "WindowCoveringType" "\x00" + "X" "\x00" + "Y" "\x00" + "ZCLVersion" "\x00" + "ZoneState" "\x00" + "ZoneStatus" "\x00" + "ZoneStatusChange" "\x00" + "ZoneType" "\x00" + "xx" "\x00" + "xx000A00" "\x00" + "xx0A" "\x00" + "xx0A00" "\x00" + "xx19" "\x00" + "xx190A" "\x00" + "xx190A00" "\x00" + "xxxx" "\x00" + "xxxx00" "\x00" + "xxxx0A00" "\x00" + "xxxxyy" "\x00" + "xxxxyyyy" "\x00" + "xxxxyyyy0A00" "\x00" + "xxxxyyzz" "\x00" + "xxyy" "\x00" + "xxyy0A00" "\x00" + "xxyyyy" "\x00" + "xxyyyy000000000000" "\x00" + "xxyyyy0A0000000000" "\x00" + "xxyyyyzz" "\x00" + "xxyyyyzzzz" "\x00" + "xxyyzzzz" "\x00" ; enum Z_offsets { Zo_ = 0, - Zo_ZCLVersion = 1, - Zo_AppVersion = 12, - Zo_StackVersion = 23, - Zo_HWVersion = 36, - Zo_Manufacturer = 46, - Zo_ModelId = 59, - Zo_DateCode = 67, - Zo_PowerSource = 76, - Zo_GenericDeviceClass = 88, - Zo_GenericDeviceType = 107, - Zo_ProductCode = 125, - Zo_ProductURL = 137, - Zo_SWBuildID = 148, - Zo_MainsVoltage = 158, - Zo_MainsFrequency = 171, - Zo_BatteryVoltage = 186, - Zo_BatteryPercentage = 201, - Zo_CurrentTemperature = 219, - Zo_MinTempExperienced = 238, - Zo_MaxTempExperienced = 257, - Zo_OverTempTotalDwell = 276, - Zo_IdentifyTime = 295, - Zo_GroupNameSupport = 308, - Zo_SceneCount = 325, - Zo_CurrentScene = 336, - Zo_CurrentGroup = 349, - Zo_SceneValid = 362, - Zo_Power = 373, - Zo_StartUpOnOff = 379, - Zo_SwitchType = 392, - Zo_Dimmer = 403, - Zo_DimmerOptions = 410, - Zo_DimmerRemainingTime = 424, - Zo_OnOffTransitionTime = 444, - Zo_AlarmCount = 464, - Zo_Time = 475, - Zo_TimeStatus = 480, - Zo_TimeZone = 491, - Zo_DstStart = 500, - Zo_DstEnd = 509, - Zo_DstShift = 516, - Zo_StandardTime = 525, - Zo_LocalTime = 538, - Zo_LastSetTime = 548, - Zo_ValidUntilTime = 560, - Zo_TimeEpoch = 575, - Zo_LocationType = 585, - Zo_LocationMethod = 598, - Zo_LocationAge = 613, - Zo_QualityMeasure = 625, - Zo_NumberOfDevices = 640, - Zo_AnalogInDescription = 656, - Zo_AnalogInMaxValue = 676, - Zo_AnalogInMinValue = 693, - Zo_AnalogInOutOfService = 710, - Zo_AnalogValue = 731, - Zo_AnalogInReliability = 743, - Zo_AnalogInResolution = 763, - Zo_AnalogInStatusFlags = 782, - Zo_AnalogInEngineeringUnits = 802, - Zo_AnalogInApplicationType = 827, - Zo_AqaraRotate = 851, - Zo_Aqara_FF05 = 863, - Zo_AnalogOutDescription = 874, - Zo_AnalogOutMaxValue = 895, - Zo_AnalogOutMinValue = 913, - Zo_AnalogOutOutOfService = 931, - Zo_AnalogOutValue = 953, - Zo_AnalogOutReliability = 968, - Zo_AnalogOutRelinquishDefault = 989, - Zo_AnalogOutResolution = 1016, - Zo_AnalogOutStatusFlags = 1036, - Zo_AnalogOutEngineeringUnits = 1057, - Zo_AnalogOutApplicationType = 1083, - Zo_AnalogDescription = 1108, - Zo_AnalogOutOfService = 1126, - Zo_AnalogPriorityArray = 1145, - Zo_AnalogReliability = 1165, - Zo_AnalogRelinquishDefault = 1183, - Zo_AnalogStatusFlags = 1207, - Zo_AnalogEngineeringUnits = 1225, - Zo_AnalogApplicationType = 1248, - Zo_BinaryInActiveText = 1270, - Zo_BinaryInDescription = 1289, - Zo_BinaryInInactiveText = 1309, - Zo_BinaryInOutOfService = 1330, - Zo_BinaryInPolarity = 1351, - Zo_BinaryInValue = 1368, - Zo_BinaryInReliability = 1382, - Zo_BinaryInStatusFlags = 1402, - Zo_BinaryInApplicationType = 1422, - Zo_BinaryOutActiveText = 1446, - Zo_BinaryOutDescription = 1466, - Zo_BinaryOutInactiveText = 1487, - Zo_BinaryOutMinimumOffTime = 1509, - Zo_BinaryOutMinimumOnTime = 1533, - Zo_BinaryOutOutOfService = 1556, - Zo_BinaryOutPolarity = 1578, - Zo_BinaryOutValue = 1596, - Zo_BinaryOutReliability = 1611, - Zo_BinaryOutRelinquishDefault = 1632, - Zo_BinaryOutStatusFlags = 1659, - Zo_BinaryOutApplicationType = 1680, - Zo_BinaryActiveText = 1705, - Zo_BinaryDescription = 1722, - Zo_BinaryInactiveText = 1740, - Zo_BinaryMinimumOffTime = 1759, - Zo_BinaryMinimumOnTime = 1780, - Zo_BinaryOutOfService = 1800, - Zo_BinaryValue = 1819, - Zo_BinaryReliability = 1831, - Zo_BinaryRelinquishDefault = 1849, - Zo_BinaryStatusFlags = 1873, - Zo_BinaryApplicationType = 1891, - Zo_MultiInDescription = 1913, - Zo_MultiInNumberOfStates = 1932, - Zo_MultiInOutOfService = 1954, - Zo_MultiInValue = 1974, - Zo_MultiInReliability = 1987, - Zo_MultiInStatusFlags = 2006, - Zo_MultiInApplicationType = 2025, - Zo_MultiOutDescription = 2048, - Zo_MultiOutNumberOfStates = 2068, - Zo_MultiOutOutOfService = 2091, - Zo_MultiOutValue = 2112, - Zo_MultiOutReliability = 2126, - Zo_MultiOutRelinquishDefault = 2146, - Zo_MultiOutStatusFlags = 2172, - Zo_MultiOutApplicationType = 2192, - Zo_MultiDescription = 2216, - Zo_MultiNumberOfStates = 2233, - Zo_MultiOutOfService = 2253, - Zo_MultiValue = 2271, - Zo_MultiReliability = 2282, - Zo_MultiRelinquishDefault = 2299, - Zo_MultiStatusFlags = 2322, - Zo_MultiApplicationType = 2339, - Zo_TotalProfileNum = 2360, - Zo_MultipleScheduling = 2376, - Zo_EnergyFormatting = 2395, - Zo_EnergyRemote = 2412, - Zo_ScheduleMode = 2425, - Zo_CheckinInterval = 2438, - Zo_LongPollInterval = 2454, - Zo_ShortPollInterval = 2471, - Zo_FastPollTimeout = 2489, - Zo_CheckinIntervalMin = 2505, - Zo_LongPollIntervalMin = 2524, - Zo_FastPollTimeoutMax = 2544, - Zo_PhysicalClosedLimit = 2563, - Zo_MotorStepSize = 2583, - Zo_Status = 2597, - Zo_ClosedLimit = 2604, - Zo_Mode = 2616, - Zo_LockState = 2621, - Zo_LockType = 2631, - Zo_ActuatorEnabled = 2640, - Zo_DoorState = 2656, - Zo_DoorOpenEvents = 2666, - Zo_DoorClosedEvents = 2681, - Zo_OpenPeriod = 2698, - Zo_AqaraVibrationMode = 2709, - Zo_AqaraVibrationsOrAngle = 2728, - Zo_AqaraVibration505 = 2751, - Zo_AqaraAccelerometer = 2769, - Zo_WindowCoveringType = 2788, - Zo_PhysicalClosedLimitLift = 2807, - Zo_PhysicalClosedLimitTilt = 2831, - Zo_CurrentPositionLift = 2855, - Zo_CurrentPositionTilt = 2875, - Zo_NumberofActuationsLift = 2895, - Zo_NumberofActuationsTilt = 2918, - Zo_ConfigStatus = 2941, - Zo_CurrentPositionLiftPercentage = 2954, - Zo_CurrentPositionTiltPercentage = 2984, - Zo_InstalledOpenLimitLift = 3014, - Zo_InstalledClosedLimitLift = 3037, - Zo_InstalledOpenLimitTilt = 3062, - Zo_InstalledClosedLimitTilt = 3085, - Zo_VelocityLift = 3110, - Zo_AccelerationTimeLift = 3123, - Zo_DecelerationTimeLift = 3144, - Zo_IntermediateSetpointsLift = 3165, - Zo_IntermediateSetpointsTilt = 3191, - Zo_LocalTemperature = 3217, - Zo_OutdoorTemperature = 3234, - Zo_PICoolingDemand = 3253, - Zo_PIHeatingDemand = 3269, - Zo_LocalTemperatureCalibration = 3285, - Zo_OccupiedCoolingSetpoint = 3313, - Zo_OccupiedHeatingSetpoint = 3337, - Zo_UnoccupiedCoolingSetpoint = 3361, - Zo_UnoccupiedHeatingSetpoint = 3387, - Zo_RemoteSensing = 3413, - Zo_ControlSequenceOfOperation = 3427, - Zo_SystemMode = 3454, - Zo_TRVMode = 3465, - Zo_ValvePosition = 3473, - Zo_EurotronicErrors = 3487, - Zo_CurrentTemperatureSetPoint = 3504, - Zo_EurotronicHostFlags = 3531, - Zo_TRVMirrorDisplay = 3551, - Zo_TRVBoost = 3568, - Zo_TRVWindowOpen = 3577, - Zo_TRVChildProtection = 3591, - Zo_ThSetpoint = 3610, - Zo_TempTarget = 3621, - Zo_Hue = 3632, - Zo_Sat = 3636, - Zo_RemainingTime = 3640, - Zo_X = 3654, - Zo_Y = 3656, - Zo_DriftCompensation = 3658, - Zo_CompensationText = 3676, - Zo_CT = 3693, - Zo_ColorMode = 3696, - Zo_NumberOfPrimaries = 3706, - Zo_Primary1X = 3724, - Zo_Primary1Y = 3734, - Zo_Primary1Intensity = 3744, - Zo_Primary2X = 3762, - Zo_Primary2Y = 3772, - Zo_Primary2Intensity = 3782, - Zo_Primary3X = 3800, - Zo_Primary3Y = 3810, - Zo_Primary3Intensity = 3820, - Zo_WhitePointX = 3838, - Zo_WhitePointY = 3850, - Zo_ColorPointRX = 3862, - Zo_ColorPointRY = 3875, - Zo_ColorPointRIntensity = 3888, - Zo_ColorPointGX = 3909, - Zo_ColorPointGY = 3922, - Zo_ColorPointGIntensity = 3935, - Zo_ColorPointBX = 3956, - Zo_ColorPointBY = 3969, - Zo_ColorPointBIntensity = 3982, - Zo_Illuminance = 4003, - Zo_IlluminanceMinMeasuredValue = 4015, - Zo_IlluminanceMaxMeasuredValue = 4043, - Zo_IlluminanceTolerance = 4071, - Zo_IlluminanceLightSensorType = 4092, - Zo_IlluminanceLevelStatus = 4119, - Zo_IlluminanceTargetLevel = 4142, - Zo_Temperature = 4165, - Zo_TemperatureMinMeasuredValue = 4177, - Zo_TemperatureMaxMeasuredValue = 4205, - Zo_TemperatureTolerance = 4233, - Zo_Pressure = 4254, - Zo_PressureMinMeasuredValue = 4263, - Zo_PressureMaxMeasuredValue = 4288, - Zo_PressureTolerance = 4313, - Zo_PressureScaledValue = 4331, - Zo_PressureMinScaledValue = 4351, - Zo_PressureMaxScaledValue = 4374, - Zo_PressureScaledTolerance = 4397, - Zo_PressureScale = 4421, - Zo_SeaPressure = 4435, - Zo_FlowRate = 4447, - Zo_FlowMinMeasuredValue = 4456, - Zo_FlowMaxMeasuredValue = 4477, - Zo_FlowTolerance = 4498, - Zo_Humidity = 4512, - Zo_HumidityMinMeasuredValue = 4521, - Zo_HumidityMaxMeasuredValue = 4546, - Zo_HumidityTolerance = 4571, - Zo_Occupancy = 4589, - Zo_OccupancySensorType = 4599, - Zo_ZoneState = 4619, - Zo_ZoneType = 4629, - Zo_ZoneStatus = 4638, - Zo_CIE = 4649, - Zo_Contact = 4653, - Zo_Fire = 4661, - Zo_Water = 4666, - Zo_CO = 4672, - Zo_PersonalAlarm = 4675, - Zo_Movement = 4689, - Zo_Panic = 4698, - Zo_GlassBreak = 4704, - Zo_EnergyTotal = 4715, - Zo_CompanyName = 4727, - Zo_MeterTypeID = 4739, - Zo_DataQualityID = 4751, - Zo_CustomerName = 4765, - Zo_Model = 4778, - Zo_PartNumber = 4784, - Zo_ProductRevision = 4795, - Zo_SoftwareRevision = 4811, - Zo_UtilityName = 4828, - Zo_POD = 4840, - Zo_AvailablePower = 4844, - Zo_PowerThreshold = 4859, - Zo_RMSVoltage = 4874, - Zo_RMSCurrent = 4885, - Zo_ActivePower = 4896, - Zo_ReactivePower = 4908, - Zo_ApparentPower = 4922, - Zo_NumberOfResets = 4936, - Zo_PersistentMemoryWrites = 4951, - Zo_LastMessageLQI = 4974, - Zo_LastMessageRSSI = 4989, - Zo_TuyaScheduleWorkdays = 5005, - Zo_TuyaScheduleHolidays = 5026, - Zo_Power2 = 5047, - Zo_Power3 = 5054, - Zo_Power4 = 5061, - Zo_TuyaChildLock = 5068, - Zo_TuyaWindowDetection = 5082, - Zo_TuyaValveDetection = 5102, - Zo_TuyaAutoLock = 5121, - Zo_TuyaTempTarget = 5134, - Zo_TuyaBattery = 5149, - Zo_TuyaMinTemp = 5161, - Zo_TuyaMaxTemp = 5173, - Zo_TuyaBoostTime = 5185, - Zo_TuyaComfortTemp = 5199, - Zo_TuyaEcoTemp = 5215, - Zo_TuyaValvePosition = 5227, - Zo_TuyaAwayTemp = 5245, - Zo_TuyaAwayDays = 5258, - Zo_TuyaPreset = 5271, - Zo_TuyaFanMode = 5282, - Zo_TuyaForceMode = 5294, - Zo_TuyaWeekSelect = 5308, - Zo_OppleMode = 5323, - Zo_TerncyDuration = 5333, - Zo_TerncyRotate = 5348, - Zo_Identify = 5361, - Zo_xxxx = 5370, - Zo_IdentifyQuery = 5375, - Zo_AddGroup = 5389, - Zo_xxxx00 = 5398, - Zo_ViewGroup = 5405, - Zo_GetGroup = 5415, - Zo_01xxxx = 5424, - Zo_GetAllGroups = 5431, - Zo_00 = 5444, - Zo_RemoveGroup = 5447, - Zo_RemoveAllGroups = 5459, - Zo_ViewScene = 5475, - Zo_xxxxyy = 5485, - Zo_RemoveScene = 5492, - Zo_RemoveAllScenes = 5504, - Zo_RecallScene = 5520, - Zo_GetSceneMembership = 5532, - Zo_PowerOffEffect = 5551, - Zo_xxyy = 5566, - Zo_PowerOnRecall = 5571, - Zo_PowerOnTimer = 5585, - Zo_xxyyyyzzzz = 5598, - Zo_xx0A00 = 5609, - Zo_DimmerUp = 5616, - Zo_00190200 = 5625, - Zo_DimmerDown = 5634, - Zo_01190200 = 5645, - Zo_DimmerStop = 5654, - Zo_ResetAlarm = 5665, - Zo_xxyyyy = 5676, - Zo_ResetAllAlarms = 5683, - Zo_xx000A00 = 5698, - Zo_HueSat = 5707, - Zo_xxyy0A00 = 5714, - Zo_Color = 5723, - Zo_xxxxyyyy0A00 = 5729, - Zo_xxxx0A00 = 5742, - Zo_ShutterOpen = 5751, - Zo_ShutterClose = 5763, - Zo_ShutterStop = 5776, - Zo_ShutterLift = 5788, - Zo_xx = 5800, - Zo_ShutterTilt = 5803, - Zo_Shutter = 5815, - Zo_DimmerMove = 5823, - Zo_xx0A = 5834, - Zo_DimmerStepUp = 5839, - Zo_00xx0A00 = 5852, - Zo_DimmerStepDown = 5861, - Zo_01xx0A00 = 5876, - Zo_DimmerStep = 5885, - Zo_xx190A00 = 5896, - Zo_01 = 5905, - Zo_HueMove = 5908, - Zo_xx19 = 5916, - Zo_HueStepUp = 5921, - Zo_HueStepDown = 5931, - Zo_03xx0A00 = 5943, - Zo_HueStep = 5952, - Zo_SatMove = 5960, - Zo_SatStep = 5968, - Zo_xx190A = 5976, - Zo_ColorMove = 5983, - Zo_xxxxyyyy = 5993, - Zo_ColorStep = 6002, - Zo_ColorTempMoveUp = 6012, - Zo_01xxxx000000000000 = 6028, - Zo_ColorTempMoveDown = 6047, - Zo_03xxxx000000000000 = 6065, - Zo_ColorTempMoveStop = 6084, - Zo_00xxxx000000000000 = 6102, - Zo_ColorTempMove = 6121, - Zo_xxyyyy000000000000 = 6135, - Zo_ColorTempStepUp = 6154, - Zo_01xxxx0A0000000000 = 6170, - Zo_ColorTempStepDown = 6189, - Zo_03xxxx0A0000000000 = 6207, - Zo_ColorTempStep = 6226, - Zo_xxyyyy0A0000000000 = 6240, - Zo_ArrowClick = 6259, - Zo_ArrowHold = 6270, - Zo_ArrowRelease = 6280, - Zo_ZoneStatusChange = 6293, - Zo_xxxxyyzz = 6310, - Zo_xxyyzzzz = 6319, - Zo_AddScene = 6328, - Zo_xxyyyyzz = 6337, - Zo_StoreScene = 6346, + Zo_00 = 1, + Zo_00190200 = 4, + Zo_00xx0A00 = 13, + Zo_00xxxx000000000000 = 22, + Zo_01 = 41, + Zo_01190200 = 44, + Zo_01xx0A00 = 53, + Zo_01xxxx = 62, + Zo_01xxxx000000000000 = 69, + Zo_01xxxx0A0000000000 = 88, + Zo_03xx0A00 = 107, + Zo_03xxxx000000000000 = 116, + Zo_03xxxx0A0000000000 = 135, + Zo_AccelerationTimeLift = 154, + Zo_ActivePower = 175, + Zo_ActuatorEnabled = 187, + Zo_AddGroup = 203, + Zo_AddScene = 212, + Zo_AlarmCount = 221, + Zo_AnalogApplicationType = 232, + Zo_AnalogDescription = 254, + Zo_AnalogEngineeringUnits = 272, + Zo_AnalogInApplicationType = 295, + Zo_AnalogInDescription = 319, + Zo_AnalogInEngineeringUnits = 339, + Zo_AnalogInMaxValue = 364, + Zo_AnalogInMinValue = 381, + Zo_AnalogInOutOfService = 398, + Zo_AnalogInReliability = 419, + Zo_AnalogInResolution = 439, + Zo_AnalogInStatusFlags = 458, + Zo_AnalogOutApplicationType = 478, + Zo_AnalogOutDescription = 503, + Zo_AnalogOutEngineeringUnits = 524, + Zo_AnalogOutMaxValue = 550, + Zo_AnalogOutMinValue = 568, + Zo_AnalogOutOfService = 586, + Zo_AnalogOutOutOfService = 605, + Zo_AnalogOutReliability = 627, + Zo_AnalogOutRelinquishDefault = 648, + Zo_AnalogOutResolution = 675, + Zo_AnalogOutStatusFlags = 695, + Zo_AnalogOutValue = 716, + Zo_AnalogPriorityArray = 731, + Zo_AnalogReliability = 751, + Zo_AnalogRelinquishDefault = 769, + Zo_AnalogStatusFlags = 793, + Zo_AnalogValue = 811, + Zo_AppVersion = 823, + Zo_ApparentPower = 834, + Zo_AqaraAccelerometer = 848, + Zo_AqaraRotate = 867, + Zo_AqaraVibration505 = 879, + Zo_AqaraVibrationMode = 897, + Zo_AqaraVibrationsOrAngle = 916, + Zo_Aqara_FF05 = 939, + Zo_ArrowClick = 950, + Zo_ArrowHold = 961, + Zo_ArrowRelease = 971, + Zo_AvailablePower = 984, + Zo_BatteryPercentage = 999, + Zo_BatteryVoltage = 1017, + Zo_BinaryActiveText = 1032, + Zo_BinaryApplicationType = 1049, + Zo_BinaryDescription = 1071, + Zo_BinaryInActiveText = 1089, + Zo_BinaryInApplicationType = 1108, + Zo_BinaryInDescription = 1132, + Zo_BinaryInInactiveText = 1152, + Zo_BinaryInOutOfService = 1173, + Zo_BinaryInPolarity = 1194, + Zo_BinaryInReliability = 1211, + Zo_BinaryInStatusFlags = 1231, + Zo_BinaryInValue = 1251, + Zo_BinaryInactiveText = 1265, + Zo_BinaryMinimumOffTime = 1284, + Zo_BinaryMinimumOnTime = 1305, + Zo_BinaryOutActiveText = 1325, + Zo_BinaryOutApplicationType = 1345, + Zo_BinaryOutDescription = 1370, + Zo_BinaryOutInactiveText = 1391, + Zo_BinaryOutMinimumOffTime = 1413, + Zo_BinaryOutMinimumOnTime = 1437, + Zo_BinaryOutOfService = 1460, + Zo_BinaryOutOutOfService = 1479, + Zo_BinaryOutPolarity = 1501, + Zo_BinaryOutReliability = 1519, + Zo_BinaryOutRelinquishDefault = 1540, + Zo_BinaryOutStatusFlags = 1567, + Zo_BinaryOutValue = 1588, + Zo_BinaryReliability = 1603, + Zo_BinaryRelinquishDefault = 1621, + Zo_BinaryStatusFlags = 1645, + Zo_BinaryValue = 1663, + Zo_CIE = 1675, + Zo_CO = 1679, + Zo_CT = 1682, + Zo_CheckinInterval = 1685, + Zo_CheckinIntervalMin = 1701, + Zo_ClosedLimit = 1720, + Zo_Color = 1732, + Zo_ColorMode = 1738, + Zo_ColorMove = 1748, + Zo_ColorPointBIntensity = 1758, + Zo_ColorPointBX = 1779, + Zo_ColorPointBY = 1792, + Zo_ColorPointGIntensity = 1805, + Zo_ColorPointGX = 1826, + Zo_ColorPointGY = 1839, + Zo_ColorPointRIntensity = 1852, + Zo_ColorPointRX = 1873, + Zo_ColorPointRY = 1886, + Zo_ColorStep = 1899, + Zo_ColorTempMove = 1909, + Zo_ColorTempMoveDown = 1923, + Zo_ColorTempMoveStop = 1941, + Zo_ColorTempMoveUp = 1959, + Zo_ColorTempStep = 1975, + Zo_ColorTempStepDown = 1989, + Zo_ColorTempStepUp = 2007, + Zo_CompanyName = 2023, + Zo_CompensationText = 2035, + Zo_ConfigStatus = 2052, + Zo_Contact = 2065, + Zo_ControlSequenceOfOperation = 2073, + Zo_CurrentGroup = 2100, + Zo_CurrentPositionLift = 2113, + Zo_CurrentPositionLiftPercentage = 2133, + Zo_CurrentPositionTilt = 2163, + Zo_CurrentPositionTiltPercentage = 2183, + Zo_CurrentScene = 2213, + Zo_CurrentTemperature = 2226, + Zo_CurrentTemperatureSetPoint = 2245, + Zo_CustomerName = 2272, + Zo_DataQualityID = 2285, + Zo_DateCode = 2299, + Zo_DecelerationTimeLift = 2308, + Zo_Dimmer = 2329, + Zo_DimmerDown = 2336, + Zo_DimmerMove = 2347, + Zo_DimmerOptions = 2358, + Zo_DimmerRemainingTime = 2372, + Zo_DimmerStep = 2392, + Zo_DimmerStepDown = 2403, + Zo_DimmerStepUp = 2418, + Zo_DimmerStop = 2431, + Zo_DimmerUp = 2442, + Zo_DoorClosedEvents = 2451, + Zo_DoorOpenEvents = 2468, + Zo_DoorState = 2483, + Zo_DriftCompensation = 2493, + Zo_DstEnd = 2511, + Zo_DstShift = 2518, + Zo_DstStart = 2527, + Zo_EnergyFormatting = 2536, + Zo_EnergyRemote = 2553, + Zo_EnergyTotal = 2566, + Zo_EurotronicErrors = 2578, + Zo_EurotronicHostFlags = 2595, + Zo_FastPollTimeout = 2615, + Zo_FastPollTimeoutMax = 2631, + Zo_Fire = 2650, + Zo_FlowMaxMeasuredValue = 2655, + Zo_FlowMinMeasuredValue = 2676, + Zo_FlowRate = 2697, + Zo_FlowTolerance = 2706, + Zo_GenericDeviceClass = 2720, + Zo_GenericDeviceType = 2739, + Zo_GetAllGroups = 2757, + Zo_GetGroup = 2770, + Zo_GetSceneMembership = 2779, + Zo_GlassBreak = 2798, + Zo_GroupNameSupport = 2809, + Zo_HWVersion = 2826, + Zo_Hue = 2836, + Zo_HueMove = 2840, + Zo_HueSat = 2848, + Zo_HueStep = 2855, + Zo_HueStepDown = 2863, + Zo_HueStepUp = 2875, + Zo_Humidity = 2885, + Zo_HumidityMaxMeasuredValue = 2894, + Zo_HumidityMinMeasuredValue = 2919, + Zo_HumidityTolerance = 2944, + Zo_Identify = 2962, + Zo_IdentifyQuery = 2971, + Zo_IdentifyTime = 2985, + Zo_Illuminance = 2998, + Zo_IlluminanceLevelStatus = 3010, + Zo_IlluminanceLightSensorType = 3033, + Zo_IlluminanceMaxMeasuredValue = 3060, + Zo_IlluminanceMinMeasuredValue = 3088, + Zo_IlluminanceTargetLevel = 3116, + Zo_IlluminanceTolerance = 3139, + Zo_InstalledClosedLimitLift = 3160, + Zo_InstalledClosedLimitTilt = 3185, + Zo_InstalledOpenLimitLift = 3210, + Zo_InstalledOpenLimitTilt = 3233, + Zo_IntermediateSetpointsLift = 3256, + Zo_IntermediateSetpointsTilt = 3282, + Zo_LastMessageLQI = 3308, + Zo_LastMessageRSSI = 3323, + Zo_LastSetTime = 3339, + Zo_LocalTemperature = 3351, + Zo_LocalTemperatureCalibration = 3368, + Zo_LocalTime = 3396, + Zo_LocationAge = 3406, + Zo_LocationMethod = 3418, + Zo_LocationType = 3433, + Zo_LockState = 3446, + Zo_LockType = 3456, + Zo_LongPollInterval = 3465, + Zo_LongPollIntervalMin = 3482, + Zo_MainsFrequency = 3502, + Zo_MainsVoltage = 3517, + Zo_Manufacturer = 3530, + Zo_MaxTempExperienced = 3543, + Zo_MeterTypeID = 3562, + Zo_MinTempExperienced = 3574, + Zo_Mode = 3593, + Zo_Model = 3598, + Zo_ModelId = 3604, + Zo_MotorStepSize = 3612, + Zo_Movement = 3626, + Zo_MultiApplicationType = 3635, + Zo_MultiDescription = 3656, + Zo_MultiInApplicationType = 3673, + Zo_MultiInDescription = 3696, + Zo_MultiInNumberOfStates = 3715, + Zo_MultiInOutOfService = 3737, + Zo_MultiInReliability = 3757, + Zo_MultiInStatusFlags = 3776, + Zo_MultiInValue = 3795, + Zo_MultiNumberOfStates = 3808, + Zo_MultiOutApplicationType = 3828, + Zo_MultiOutDescription = 3852, + Zo_MultiOutNumberOfStates = 3872, + Zo_MultiOutOfService = 3895, + Zo_MultiOutOutOfService = 3913, + Zo_MultiOutReliability = 3934, + Zo_MultiOutRelinquishDefault = 3954, + Zo_MultiOutStatusFlags = 3980, + Zo_MultiOutValue = 4000, + Zo_MultiReliability = 4014, + Zo_MultiRelinquishDefault = 4031, + Zo_MultiStatusFlags = 4054, + Zo_MultiValue = 4071, + Zo_MultipleScheduling = 4082, + Zo_NumberOfDevices = 4101, + Zo_NumberOfPrimaries = 4117, + Zo_NumberOfResets = 4135, + Zo_NumberofActuationsLift = 4150, + Zo_NumberofActuationsTilt = 4173, + Zo_Occupancy = 4196, + Zo_OccupancySensorType = 4206, + Zo_OccupiedCoolingSetpoint = 4226, + Zo_OccupiedHeatingSetpoint = 4250, + Zo_OnOffTransitionTime = 4274, + Zo_OpenPeriod = 4294, + Zo_OppleMode = 4305, + Zo_OutdoorTemperature = 4315, + Zo_OverTempTotalDwell = 4334, + Zo_PICoolingDemand = 4353, + Zo_PIHeatingDemand = 4369, + Zo_POD = 4385, + Zo_Panic = 4389, + Zo_PartNumber = 4395, + Zo_PersistentMemoryWrites = 4406, + Zo_PersonalAlarm = 4429, + Zo_PhysicalClosedLimit = 4443, + Zo_PhysicalClosedLimitLift = 4463, + Zo_PhysicalClosedLimitTilt = 4487, + Zo_Power = 4511, + Zo_Power2 = 4517, + Zo_Power3 = 4524, + Zo_Power4 = 4531, + Zo_PowerOffEffect = 4538, + Zo_PowerOnRecall = 4553, + Zo_PowerOnTimer = 4567, + Zo_PowerSource = 4580, + Zo_PowerThreshold = 4592, + Zo_Pressure = 4607, + Zo_PressureMaxMeasuredValue = 4616, + Zo_PressureMaxScaledValue = 4641, + Zo_PressureMinMeasuredValue = 4664, + Zo_PressureMinScaledValue = 4689, + Zo_PressureScale = 4712, + Zo_PressureScaledTolerance = 4726, + Zo_PressureScaledValue = 4750, + Zo_PressureTolerance = 4770, + Zo_Primary1Intensity = 4788, + Zo_Primary1X = 4806, + Zo_Primary1Y = 4816, + Zo_Primary2Intensity = 4826, + Zo_Primary2X = 4844, + Zo_Primary2Y = 4854, + Zo_Primary3Intensity = 4864, + Zo_Primary3X = 4882, + Zo_Primary3Y = 4892, + Zo_ProductCode = 4902, + Zo_ProductRevision = 4914, + Zo_ProductURL = 4930, + Zo_QualityMeasure = 4941, + Zo_RMSCurrent = 4956, + Zo_RMSVoltage = 4967, + Zo_ReactivePower = 4978, + Zo_RecallScene = 4992, + Zo_RemainingTime = 5004, + Zo_RemoteSensing = 5018, + Zo_RemoveAllGroups = 5032, + Zo_RemoveAllScenes = 5048, + Zo_RemoveGroup = 5064, + Zo_RemoveScene = 5076, + Zo_ResetAlarm = 5088, + Zo_ResetAllAlarms = 5099, + Zo_SWBuildID = 5114, + Zo_Sat = 5124, + Zo_SatMove = 5128, + Zo_SatStep = 5136, + Zo_SceneCount = 5144, + Zo_SceneValid = 5155, + Zo_ScheduleMode = 5166, + Zo_SeaPressure = 5179, + Zo_ShortPollInterval = 5191, + Zo_Shutter = 5209, + Zo_ShutterClose = 5217, + Zo_ShutterLift = 5230, + Zo_ShutterOpen = 5242, + Zo_ShutterStop = 5254, + Zo_ShutterTilt = 5266, + Zo_SoftwareRevision = 5278, + Zo_StackVersion = 5295, + Zo_StandardTime = 5308, + Zo_StartUpOnOff = 5321, + Zo_Status = 5334, + Zo_StoreScene = 5341, + Zo_SwitchType = 5352, + Zo_SystemMode = 5363, + Zo_TRVBoost = 5374, + Zo_TRVChildProtection = 5383, + Zo_TRVMirrorDisplay = 5402, + Zo_TRVMode = 5419, + Zo_TRVWindowOpen = 5427, + Zo_TempTarget = 5441, + Zo_Temperature = 5452, + Zo_TemperatureMaxMeasuredValue = 5464, + Zo_TemperatureMinMeasuredValue = 5492, + Zo_TemperatureTolerance = 5520, + Zo_TerncyDuration = 5541, + Zo_TerncyRotate = 5556, + Zo_ThSetpoint = 5569, + Zo_Time = 5580, + Zo_TimeEpoch = 5585, + Zo_TimeStatus = 5595, + Zo_TimeZone = 5606, + Zo_TotalProfileNum = 5615, + Zo_TuyaAutoLock = 5631, + Zo_TuyaAwayDays = 5644, + Zo_TuyaAwayTemp = 5657, + Zo_TuyaBattery = 5670, + Zo_TuyaBoostTime = 5682, + Zo_TuyaChildLock = 5696, + Zo_TuyaComfortTemp = 5710, + Zo_TuyaEcoTemp = 5726, + Zo_TuyaFanMode = 5738, + Zo_TuyaForceMode = 5750, + Zo_TuyaMaxTemp = 5764, + Zo_TuyaMinTemp = 5776, + Zo_TuyaPreset = 5788, + Zo_TuyaScheduleHolidays = 5799, + Zo_TuyaScheduleWorkdays = 5820, + Zo_TuyaTempTarget = 5841, + Zo_TuyaValveDetection = 5856, + Zo_TuyaValvePosition = 5875, + Zo_TuyaWeekSelect = 5893, + Zo_TuyaWindowDetection = 5908, + Zo_UnoccupiedCoolingSetpoint = 5928, + Zo_UnoccupiedHeatingSetpoint = 5954, + Zo_UtilityName = 5980, + Zo_ValidUntilTime = 5992, + Zo_ValvePosition = 6007, + Zo_VelocityLift = 6021, + Zo_ViewGroup = 6034, + Zo_ViewScene = 6044, + Zo_Water = 6054, + Zo_WhitePointX = 6060, + Zo_WhitePointY = 6072, + Zo_WindowCoveringType = 6084, + Zo_X = 6103, + Zo_Y = 6105, + Zo_ZCLVersion = 6107, + Zo_ZoneState = 6118, + Zo_ZoneStatus = 6128, + Zo_ZoneStatusChange = 6139, + Zo_ZoneType = 6156, + Zo_xx = 6165, + Zo_xx000A00 = 6168, + Zo_xx0A = 6177, + Zo_xx0A00 = 6182, + Zo_xx19 = 6189, + Zo_xx190A = 6194, + Zo_xx190A00 = 6201, + Zo_xxxx = 6210, + Zo_xxxx00 = 6215, + Zo_xxxx0A00 = 6222, + Zo_xxxxyy = 6231, + Zo_xxxxyyyy = 6238, + Zo_xxxxyyyy0A00 = 6247, + Zo_xxxxyyzz = 6260, + Zo_xxyy = 6269, + Zo_xxyy0A00 = 6274, + Zo_xxyyyy = 6283, + Zo_xxyyyy000000000000 = 6290, + Zo_xxyyyy0A0000000000 = 6309, + Zo_xxyyyyzz = 6328, + Zo_xxyyyyzzzz = 6337, + Zo_xxyyzzzz = 6348, }; diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 9bdf84175..35ae1b827 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -1856,24 +1856,23 @@ const char ZB_WEB[] PROGMEM = "\x00\x66\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\ // ++++++++++++++++++++ DO NOT EDIT ABOVE ++++++++++++++++++++ // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -extern "C" { - // comparator function used to sort Zigbee devices by alphabetical order (if friendlyname) - // then by shortaddr if they don't have friendlyname - int device_cmp(const void * a, const void * b) { - const Z_Device &dev_a = zigbee_devices.devicesAt(*(uint8_t*)a); - const Z_Device &dev_b = zigbee_devices.devicesAt(*(uint8_t*)b); - const char * fn_a = dev_a.friendlyName; - const char * fn_b = dev_b.friendlyName; +// comparator function used to sort Zigbee devices by alphabetical order (if friendlyname) +// then by shortaddr if they don't have friendlyname +int device_cmp(uint8_t a, uint8_t b) { + const Z_Device &dev_a = zigbee_devices.devicesAt(a); + const Z_Device &dev_b = zigbee_devices.devicesAt(b); + const char * fn_a = dev_a.friendlyName; + const char * fn_b = dev_b.friendlyName; - if (fn_a && fn_b) { - return strcasecmp(fn_a, fn_b); - } else if (!fn_a && !fn_b) { - return (int32_t)dev_a.shortaddr - (int32_t)dev_b.shortaddr; - } else { - if (fn_a) return -1; - else return 1; - } + if (fn_a && fn_b) { + return strcasecmp(fn_a, fn_b); + } else if (!fn_a && !fn_b) { + return (int32_t)dev_a.shortaddr - (int32_t)dev_b.shortaddr; + } else { + if (fn_a) return -1; + else return 1; } +} // Convert seconds to a string representing days, hours or minutes present in the n-value. @@ -1884,24 +1883,23 @@ extern "C" { // - char for unit (d for day, h for hour, m for minute) // - the hex color to be used to display the text // - uint32_t convert_seconds_to_dhm(uint32_t seconds, char *unit, uint8_t *color){ - static uint32_t conversions[3] = {24 * 3600, 3600, 60}; - static char units[3] = { 'd', 'h', 'm'}; // day, hour, minute - uint8_t color_text_8 = WebColor(COL_TEXT) & 0xFF; // color of text on 8 bits - uint8_t color_back_8 = WebColor(COL_BACKGROUND) & 0xFF; // color of background on 8 bits - uint8_t colors[3] = { (uint8_t) changeUIntScale(6, 0, 16, color_back_8, color_text_8), // 6/16 of text - (uint8_t) changeUIntScale(10, 0, 16, color_back_8, color_text_8), // 10/16 of text color - color_text_8}; - for(int i = 0; i < 3; ++i) { - *color = colors[i]; - *unit = units[i]; - if (seconds > conversions[i]) { // always pass even if 00m - return seconds / conversions[i]; - } +uint32_t convert_seconds_to_dhm(uint32_t seconds, char *unit, uint8_t *color){ + static uint32_t conversions[3] = {24 * 3600, 3600, 60}; + static char units[3] = { 'd', 'h', 'm'}; // day, hour, minute + uint8_t color_text_8 = WebColor(COL_TEXT) & 0xFF; // color of text on 8 bits + uint8_t color_back_8 = WebColor(COL_BACKGROUND) & 0xFF; // color of background on 8 bits + uint8_t colors[3] = { (uint8_t) changeUIntScale(6, 0, 16, color_back_8, color_text_8), // 6/16 of text + (uint8_t) changeUIntScale(10, 0, 16, color_back_8, color_text_8), // 10/16 of text color + color_text_8}; + for(int i = 0; i < 3; ++i) { + *color = colors[i]; + *unit = units[i]; + if (seconds > conversions[i]) { // always pass even if 00m + return seconds / conversions[i]; } - return 0; } -} // extern "C" + return 0; +} const char HTTP_BTN_ZB_BUTTONS[] PROGMEM = "" @@ -1927,7 +1925,17 @@ void ZigbeeShow(bool json) for (uint32_t i = 0; i < zigbee_num; i++) { sorted_idx[i] = i; } - qsort(sorted_idx, zigbee_num, sizeof(sorted_idx[0]), device_cmp); + + // insertion sort + for (uint32_t i = 1; i < zigbee_num; i++) { + uint8_t key = sorted_idx[i]; + uint8_t j = i; + while ((j > 0) && (device_cmp(sorted_idx[j - 1], key) > 0)) { + sorted_idx[j] = sorted_idx[j - 1]; + j--; + } + sorted_idx[j] = key; + } uint32_t now = Rtc.utc_time; From 7b5184c89b1f3e7af140a372589add3d135f30fa Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 3 Jan 2021 15:28:52 +0100 Subject: [PATCH 098/255] Optimize sleepdelay Optimize sleepdelay (#10379) --- tasmota/tasmota.ino | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index d8b95433e..84c2252b1 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -368,7 +368,11 @@ void BacklogLoop(void) { void SleepDelay(uint32_t mseconds) { if (mseconds) { for (uint32_t wait = 0; wait < mseconds; wait++) { + // ESP8266 does an optimistic_yield(1000) in Serial.available() + // ESP32 does not so needs delay here +#ifdef ESP32 delay(1); +#endif if (Serial.available()) { break; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun } } else { @@ -383,7 +387,6 @@ void loop(void) { XsnsCall(FUNC_LOOP); OsWatchLoop(); - ButtonLoop(); SwitchLoop(); #ifdef USE_DEVICE_GROUPS @@ -391,7 +394,7 @@ void loop(void) { #endif // USE_DEVICE_GROUPS BacklogLoop(); - static uint32_t state_50msecond = 0; // State 50msecond timer + static uint32_t state_50msecond = 0; // State 50msecond timer if (TimeReached(state_50msecond)) { SetNextTimeInterval(state_50msecond, 50); #ifdef ROTARY_V1 @@ -401,7 +404,7 @@ void loop(void) { XsnsCall(FUNC_EVERY_50_MSECOND); } - static uint32_t state_100msecond = 0; // State 100msecond timer + static uint32_t state_100msecond = 0; // State 100msecond timer if (TimeReached(state_100msecond)) { SetNextTimeInterval(state_100msecond, 100); Every100mSeconds(); @@ -409,7 +412,7 @@ void loop(void) { XsnsCall(FUNC_EVERY_100_MSECOND); } - static uint32_t state_250msecond = 0; // State 250msecond timer + static uint32_t state_250msecond = 0; // State 250msecond timer if (TimeReached(state_250msecond)) { SetNextTimeInterval(state_250msecond, 250); Every250mSeconds(); @@ -417,7 +420,7 @@ void loop(void) { XsnsCall(FUNC_EVERY_250_MSECOND); } - static uint32_t state_second = 0; // State second timer + static uint32_t state_second = 0; // State second timer if (TimeReached(state_second)) { SetNextTimeInterval(state_second, 1000); PerformEverySecond(); @@ -435,7 +438,7 @@ void loop(void) { if (Settings.flag3.sleep_normal) { // SetOption60 - Enable normal sleep instead of dynamic sleep // yield(); // yield == delay(0), delay contains yield, auto yield in loop - SleepDelay(TasmotaGlobal.sleep); // https://github.com/esp8266/Arduino/issues/2021 + SleepDelay(TasmotaGlobal.sleep); // https://github.com/esp8266/Arduino/issues/2021 } else { if (my_activity < (uint32_t)TasmotaGlobal.sleep) { SleepDelay((uint32_t)TasmotaGlobal.sleep - my_activity); // Provide time for background tasks like wifi From f9403c8489b7de69f99c7618e0082f53ac12b513 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 3 Jan 2021 16:30:45 +0100 Subject: [PATCH 099/255] Optimize sleepdelay Optimize sleepdelay (#10379) --- tasmota/tasmota.ino | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 84c2252b1..79e648200 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -367,13 +367,19 @@ void BacklogLoop(void) { void SleepDelay(uint32_t mseconds) { if (mseconds) { - for (uint32_t wait = 0; wait < mseconds; wait++) { - // ESP8266 does an optimistic_yield(1000) in Serial.available() - // ESP32 does not so needs delay here -#ifdef ESP32 - delay(1); + uint32_t wait = millis() + mseconds; + while (!TimeReached(wait)) { +#ifdef ESP8266 + if ((wait - millis()) > 10) { // ESP8266 does an optimistic_yield(10000) in Serial.available() #endif - if (Serial.available()) { break; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun + if (Serial.available()) { return; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun +#ifdef ESP8266 + } else { +#endif + delay(1); +#ifdef ESP8266 + } +#endif // ESP8266 } } else { delay(0); From 61c518d8138247076757dc1dc0aa02497c29ec83 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 3 Jan 2021 16:36:34 +0100 Subject: [PATCH 100/255] Zigbee fix display `Devices allowed to join` when zero device --- tasmota/xdrv_23_zigbee_A_impl.ino | 291 +++++++++++++++--------------- 1 file changed, 146 insertions(+), 145 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 35ae1b827..e5ca3d36c 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -1914,170 +1914,171 @@ void ZigbeeShow(bool json) } else { UnishoxStrings msg(ZB_WEB); uint32_t zigbee_num = zigbee_devices.devicesSize(); - if (!zigbee_num) { return; } - if (zigbee_num > 255) { zigbee_num = 255; } + if (zigbee_num > 0) { + if (zigbee_num > 255) { zigbee_num = 255; } - WSContentSend_P(msg[ZB_WEB_CSS], WebColor(COL_TEXT)); - // WSContentSend_compressed(ZB_WEB, 0); + WSContentSend_P(msg[ZB_WEB_CSS], WebColor(COL_TEXT)); + // WSContentSend_compressed(ZB_WEB, 0); - // sort elements by name, then by id - uint8_t sorted_idx[zigbee_num]; - for (uint32_t i = 0; i < zigbee_num; i++) { - sorted_idx[i] = i; - } - - // insertion sort - for (uint32_t i = 1; i < zigbee_num; i++) { - uint8_t key = sorted_idx[i]; - uint8_t j = i; - while ((j > 0) && (device_cmp(sorted_idx[j - 1], key) > 0)) { - sorted_idx[j] = sorted_idx[j - 1]; - j--; - } - sorted_idx[j] = key; - } - - uint32_t now = Rtc.utc_time; - - for (uint32_t i = 0; i < zigbee_num; i++) { - const Z_Device &device = zigbee_devices.devicesAt(sorted_idx[i]); - uint16_t shortaddr = device.shortaddr; - char *name = (char*) device.friendlyName; - - char sdevice[33]; - if (nullptr == name) { - snprintf_P(sdevice, sizeof(sdevice), PSTR(D_DEVICE " 0x%04X"), shortaddr); - name = sdevice; + // sort elements by name, then by id + uint8_t sorted_idx[zigbee_num]; + for (uint32_t i = 0; i < zigbee_num; i++) { + sorted_idx[i] = i; } - char sbatt[64]; - snprintf_P(sbatt, sizeof(sbatt), PSTR(" ")); - if (device.validBatteryPercent()) { - snprintf_P(sbatt, sizeof(sbatt), - msg[ZB_WEB_BATTERY], - device.batterypercent, changeUIntScale(device.batterypercent, 0, 100, 0, 14) - ); - } - - uint32_t num_bars = 0; - - char slqi[4]; - slqi[0] = '-'; - slqi[1] = '\0'; - if (device.validLqi()){ - num_bars = changeUIntScale(device.lqi, 0, 254, 0, 4); - snprintf_P(slqi, sizeof(slqi), PSTR("%d"), device.lqi); - } - - WSContentSend_PD(msg[ZB_WEB_STATUS_LINE], - shortaddr, - device.modelId ? device.modelId : "", - device.manufacturerId ? device.manufacturerId : "", - name, sbatt, slqi); - - if(device.validLqi()) { - for(uint32_t j = 0; j < 4; ++j) { - WSContentSend_PD(PSTR(""), j, (num_bars < j) ? PSTR(" o30") : PSTR("")); - } - } - char dhm[48]; - snprintf_P(dhm, sizeof(dhm), PSTR(" ")); - if (device.validLastSeen()) { - char unit; - uint8_t color; - uint16_t val = convert_seconds_to_dhm(now - device.last_seen, &unit, &color); - if (val < 100) { - snprintf_P(dhm, sizeof(dhm), msg[ZB_WEB_LAST_SEEN], - color, color, color, val, unit); + // insertion sort + for (uint32_t i = 1; i < zigbee_num; i++) { + uint8_t key = sorted_idx[i]; + uint8_t j = i; + while ((j > 0) && (device_cmp(sorted_idx[j - 1], key) > 0)) { + sorted_idx[j] = sorted_idx[j - 1]; + j--; } + sorted_idx[j] = key; } - WSContentSend_PD(msg[ZB_WEB_END_STATUS], dhm ); + uint32_t now = Rtc.utc_time; - // Sensors - const Z_Data_Thermo & thermo = device.data.find(); + for (uint32_t i = 0; i < zigbee_num; i++) { + const Z_Device &device = zigbee_devices.devicesAt(sorted_idx[i]); + uint16_t shortaddr = device.shortaddr; + char *name = (char*) device.friendlyName; - if (&thermo != nullptr) { - bool validTemp = thermo.validTemperature(); - bool validTempTarget = thermo.validTempTarget(); - bool validThSetpoint = thermo.validThSetpoint(); - bool validHumidity = thermo.validHumidity(); - bool validPressure = thermo.validPressure(); + char sdevice[33]; + if (nullptr == name) { + snprintf_P(sdevice, sizeof(sdevice), PSTR(D_DEVICE " 0x%04X"), shortaddr); + name = sdevice; + } - if (validTemp || validTempTarget || validThSetpoint || validHumidity || validPressure) { + char sbatt[64]; + snprintf_P(sbatt, sizeof(sbatt), PSTR(" ")); + if (device.validBatteryPercent()) { + snprintf_P(sbatt, sizeof(sbatt), + msg[ZB_WEB_BATTERY], + device.batterypercent, changeUIntScale(device.batterypercent, 0, 100, 0, 14) + ); + } + + uint32_t num_bars = 0; + + char slqi[4]; + slqi[0] = '-'; + slqi[1] = '\0'; + if (device.validLqi()){ + num_bars = changeUIntScale(device.lqi, 0, 254, 0, 4); + snprintf_P(slqi, sizeof(slqi), PSTR("%d"), device.lqi); + } + + WSContentSend_PD(msg[ZB_WEB_STATUS_LINE], + shortaddr, + device.modelId ? device.modelId : "", + device.manufacturerId ? device.manufacturerId : "", + name, sbatt, slqi); + + if(device.validLqi()) { + for(uint32_t j = 0; j < 4; ++j) { + WSContentSend_PD(PSTR(""), j, (num_bars < j) ? PSTR(" o30") : PSTR("")); + } + } + char dhm[48]; + snprintf_P(dhm, sizeof(dhm), PSTR(" ")); + if (device.validLastSeen()) { + char unit; + uint8_t color; + uint16_t val = convert_seconds_to_dhm(now - device.last_seen, &unit, &color); + if (val < 100) { + snprintf_P(dhm, sizeof(dhm), msg[ZB_WEB_LAST_SEEN], + color, color, color, val, unit); + } + } + + WSContentSend_PD(msg[ZB_WEB_END_STATUS], dhm ); + + // Sensors + const Z_Data_Thermo & thermo = device.data.find(); + + if (&thermo != nullptr) { + bool validTemp = thermo.validTemperature(); + bool validTempTarget = thermo.validTempTarget(); + bool validThSetpoint = thermo.validThSetpoint(); + bool validHumidity = thermo.validHumidity(); + bool validPressure = thermo.validPressure(); + + if (validTemp || validTempTarget || validThSetpoint || validHumidity || validPressure) { + WSContentSend_P(msg[ZB_WEB_LINE_START]); + if (validTemp) { + char buf[12]; + dtostrf(thermo.getTemperature() / 100.0f, 3, 1, buf); + WSContentSend_PD(PSTR(" ☀️ %s°C"), buf); + } + if (validTempTarget) { + char buf[12]; + dtostrf(thermo.getTempTarget() / 100.0f, 3, 1, buf); + WSContentSend_PD(PSTR(" 🎯 %s°C"), buf); + } + if (validThSetpoint) { + WSContentSend_PD(PSTR(" ⚙️ %d%%"), thermo.getThSetpoint()); + } + if (validHumidity) { + WSContentSend_P(PSTR(" 💧 %d%%"), (uint16_t)(thermo.getHumidity() / 100.0f + 0.5f)); + } + if (validPressure) { + WSContentSend_P(PSTR(" ⛅ %d hPa"), thermo.getPressure()); + } + + WSContentSend_P(PSTR("{e}")); + } + } + + // Light, switches and plugs + const Z_Data_OnOff & onoff = device.data.find(); + bool onoff_display = (&onoff != nullptr) ? onoff.validPower() : false; + const Z_Data_Light & light = device.data.find(); + bool light_display = (&light != nullptr) ? light.validDimmer() : false; + const Z_Data_Plug & plug = device.data.find(); + bool plug_voltage = (&plug != nullptr) ? plug.validMainsVoltage() : false; + bool plug_power = (&plug != nullptr) ? plug.validMainsPower() : false; + if (onoff_display || light_display || plug_voltage || plug_power) { + int8_t channels = device.getLightChannels(); + if (channels < 0) { channels = 5; } // if number of channel is unknown, display all known attributes WSContentSend_P(msg[ZB_WEB_LINE_START]); - if (validTemp) { - char buf[12]; - dtostrf(thermo.getTemperature() / 100.0f, 3, 1, buf); - WSContentSend_PD(PSTR(" ☀️ %s°C"), buf); + if (onoff_display) { + WSContentSend_P(PSTR(" %s"), onoff.getPower() ? PSTR(D_ON) : PSTR(D_OFF)); } - if (validTempTarget) { - char buf[12]; - dtostrf(thermo.getTempTarget() / 100.0f, 3, 1, buf); - WSContentSend_PD(PSTR(" 🎯 %s°C"), buf); + if (&light != nullptr) { + if (light.validDimmer() && (channels >= 1)) { + WSContentSend_P(PSTR(" 🔅 %d%%"), changeUIntScale(light.getDimmer(),0,254,0,100)); + } + if (light.validCT() && ((channels == 2) || (channels == 5))) { + uint32_t ct_k = (((1000000 / light.getCT()) + 25) / 50) * 50; + WSContentSend_P(msg[ZB_WEB_LIGHT_CT], light.getCT(), ct_k); + } + if (light.validHue() && light.validSat() && (channels >= 3)) { + uint8_t r,g,b; + uint8_t sat = changeUIntScale(light.getSat(), 0, 254, 0, 255); // scale to 0..255 + HsToRgb(light.getHue(), sat, &r, &g, &b); + WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); + } else if (light.validX() && light.validY() && (channels >= 3)) { + uint8_t r,g,b; + XyToRgb(light.getX() / 65535.0f, light.getY() / 65535.0f, &r, &g, &b); + WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); + } } - if (validThSetpoint) { - WSContentSend_PD(PSTR(" ⚙️ %d%%"), thermo.getThSetpoint()); + if (plug_voltage || plug_power) { + WSContentSend_P(PSTR(" ⚡ ")); + if (plug_voltage) { + WSContentSend_P(PSTR(" %dV"), plug.getMainsVoltage()); + } + if (plug_power) { + WSContentSend_P(PSTR(" %dW"), plug.getMainsPower()); + } } - if (validHumidity) { - WSContentSend_P(PSTR(" 💧 %d%%"), (uint16_t)(thermo.getHumidity() / 100.0f + 0.5f)); - } - if (validPressure) { - WSContentSend_P(PSTR(" ⛅ %d hPa"), thermo.getPressure()); - } - WSContentSend_P(PSTR("{e}")); } } - // Light, switches and plugs - const Z_Data_OnOff & onoff = device.data.find(); - bool onoff_display = (&onoff != nullptr) ? onoff.validPower() : false; - const Z_Data_Light & light = device.data.find(); - bool light_display = (&light != nullptr) ? light.validDimmer() : false; - const Z_Data_Plug & plug = device.data.find(); - bool plug_voltage = (&plug != nullptr) ? plug.validMainsVoltage() : false; - bool plug_power = (&plug != nullptr) ? plug.validMainsPower() : false; - if (onoff_display || light_display || plug_voltage || plug_power) { - int8_t channels = device.getLightChannels(); - if (channels < 0) { channels = 5; } // if number of channel is unknown, display all known attributes - WSContentSend_P(msg[ZB_WEB_LINE_START]); - if (onoff_display) { - WSContentSend_P(PSTR(" %s"), onoff.getPower() ? PSTR(D_ON) : PSTR(D_OFF)); - } - if (&light != nullptr) { - if (light.validDimmer() && (channels >= 1)) { - WSContentSend_P(PSTR(" 🔅 %d%%"), changeUIntScale(light.getDimmer(),0,254,0,100)); - } - if (light.validCT() && ((channels == 2) || (channels == 5))) { - uint32_t ct_k = (((1000000 / light.getCT()) + 25) / 50) * 50; - WSContentSend_P(msg[ZB_WEB_LIGHT_CT], light.getCT(), ct_k); - } - if (light.validHue() && light.validSat() && (channels >= 3)) { - uint8_t r,g,b; - uint8_t sat = changeUIntScale(light.getSat(), 0, 254, 0, 255); // scale to 0..255 - HsToRgb(light.getHue(), sat, &r, &g, &b); - WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); - } else if (light.validX() && light.validY() && (channels >= 3)) { - uint8_t r,g,b; - XyToRgb(light.getX() / 65535.0f, light.getY() / 65535.0f, &r, &g, &b); - WSContentSend_P(msg[ZB_WEB_COLOR_RGB], r,g,b,r,g,b); - } - } - if (plug_voltage || plug_power) { - WSContentSend_P(PSTR(" ⚡ ")); - if (plug_voltage) { - WSContentSend_P(PSTR(" %dV"), plug.getMainsVoltage()); - } - if (plug_power) { - WSContentSend_P(PSTR(" %dW"), plug.getMainsPower()); - } - } - WSContentSend_P(PSTR("{e}")); - } + WSContentSend_P(msg[ZB_WEB_LINE_END]); // Terminate current multi column table and open new table } - - WSContentSend_P(msg[ZB_WEB_LINE_END]); // Terminate current multi column table and open new table if (zigbee.permit_end_time) { // PermitJoin in progress From d028e5c847530b45422b948b3ae37a6e5fbde4d2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 3 Jan 2021 17:04:14 +0100 Subject: [PATCH 101/255] Update changelog --- CHANGELOG.md | 4 +++- RELEASENOTES.md | 3 +++ tasmota/settings.h | 2 +- tools/decode-status.py | 8 +++++--- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb01ac2a..6637b3a12 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ All notable changes to this project will be documented in this file. - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin (#8630) - Command ``CTRange`` to specify the visible CT range the bulb is capable of (#10311) - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) -- Disable `USE_LIGHT`` light support for ZBBridge (saves 17.6kb) +- Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default (#10353) +- Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic (#10355) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` @@ -23,6 +24,7 @@ All notable changes to this project will be documented in this file. ### Changed - Maximum chars in AddLog_P logging reduced from 700 to 128 (LOGSZ) to enhance stability +- Disabled ``USE_LIGHT`` light support for ZBBridge saving 17.6kB (#10374) ## [9.2.0.1] 20201229 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 539323f9d..63b7466c3 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -60,6 +60,8 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ### Added - Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) +- Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default [#10353](https://github.com/arendst/Tasmota/issues/10353) +- Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic [#10355](https://github.com/arendst/Tasmota/issues/10355) - Milliseconds to console output [#10152](https://github.com/arendst/Tasmota/issues/10152) - Gpio ``Option_a1`` enabling PWM2 high impedance if powered off as used by Wyze bulbs [#10196](https://github.com/arendst/Tasmota/issues/10196) - BSSID and Signal Strength Indicator to GUI wifi scan result [#10253](https://github.com/arendst/Tasmota/issues/10253) @@ -86,6 +88,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ### Changed - Logging from heap to stack freeing 700 bytes RAM +- Disabled ``USE_LIGHT`` light support for ZBBridge saving 17.6kB (#10374) ### Fixed - Redesign syslog and mqttlog using log buffer [#10164](https://github.com/arendst/Tasmota/issues/10164) diff --git a/tasmota/settings.h b/tasmota/settings.h index 81a62c835..32d8b8871 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -143,7 +143,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t mi32_enable : 1; // bit 1 (v9.1.0.1) - SetOption115 - (ESP32 BLE) Enable ESP32 MI32 BLE (1) uint32_t zb_disable_autoquery : 1; // bit 2 (v9.1.0.1) - SetOption116 - (Zigbee) Disable auto-query of zigbee lights and devices (1) uint32_t fade_fixed_duration : 1; // bit 3 (v9.1.0.2) - SetOption117 - (Light) run fading at fixed duration instead of fixed slew rate - uint32_t zb_received_as_subtopic : 1; // bit 4 (v9.2.0.3) - SetOption118 - (Zigbee) Move ZbReceived form JSON message and into the subtopic replacing "SENSOR" default + uint32_t zb_received_as_subtopic : 1; // bit 4 (v9.2.0.3) - SetOption118 - (Zigbee) Move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default uint32_t zb_omit_json_addr : 1; // bit 5 (v9.2.0.3) - SetOption119 - (Zigbee) Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic uint32_t spare06 : 1; // bit 6 uint32_t spare07 : 1; // bit 7 diff --git a/tools/decode-status.py b/tools/decode-status.py index ba5ead287..3e940d8ff 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -171,8 +171,10 @@ a_setoption = [[ "(Switch) Detach Switches from relays and enable MQTT action state for all the SwitchModes (1)", "(ESP32 BLE) Enable ESP32 MI32 BLE (1)", "(Zigbee) Disable auto-query of zigbee lights and devices (1)", - "", - "","","","", + "(Light) run fading at fixed duration instead of fixed slew rate", + "(Zigbee) Move ZbReceived from JSON message and into the subtopic replacing SENSOR default", + "(Zigbee) Remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic", + "","", "","","","", "","","","", "","","","", @@ -271,7 +273,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v20201222 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v20210103 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 619e4bbfb5791491befa66e55961812048df2087 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 3 Jan 2021 17:31:44 +0100 Subject: [PATCH 102/255] Add command ``RuleTimer0`` to access all RuleTimers at once Add command ``RuleTimer0`` to access all RuleTimers at once (#10352) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xdrv_10_rules.ino | 9 +++++---- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6637b3a12..8b34c9ca0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels (#10311) - Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default (#10353) - Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic (#10355) +- Command ``RuleTimer0`` to access all RuleTimers at once (#10352) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 63b7466c3..814272bdf 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -59,6 +59,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota ## Changelog v9.2.0.2 ### Added - Command ``CTRange`` to specify the visible CT range the bulb is capable of [#10311](https://github.com/arendst/Tasmota/issues/10311) +- Command ``RuleTimer0`` to access all RuleTimers at once [#10352](https://github.com/arendst/Tasmota/issues/10352) - Command ``VirtualCT`` to simulate or fine tune CT bulbs with 3,4,5 channels [#10311](https://github.com/arendst/Tasmota/issues/10311) - Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default [#10353](https://github.com/arendst/Tasmota/issues/10353) - Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic [#10355](https://github.com/arendst/Tasmota/issues/10355) diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 2d0caed1d..637a3b963 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -2124,9 +2124,10 @@ void CmndRule(void) void CmndRuleTimer(void) { - if (XdrvMailbox.index > MAX_RULE_TIMERS) - return; - int i = XdrvMailbox.index, max_i = XdrvMailbox.index; + if (XdrvMailbox.index > MAX_RULE_TIMERS) { return; } + + uint32_t i = XdrvMailbox.index; + uint32_t max_i = XdrvMailbox.index; if (0 == i) { i = 1; max_i = MAX_RULE_TIMERS; @@ -2135,7 +2136,7 @@ void CmndRuleTimer(void) float timer_set = evaluateExpression(XdrvMailbox.data, XdrvMailbox.data_len); timer_set = (timer_set > 0) ? millis() + (1000 * timer_set) : 0; #else - unsigned long timer_set = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0; + uint32_t timer_set = (XdrvMailbox.payload > 0) ? millis() + (1000 * XdrvMailbox.payload) : 0; #endif // USE_EXPRESSION if (XdrvMailbox.data_len > 0) { for ( ; i <= max_i ; ++i ) { From d8fbbdd5c9babc334b04debcbf1da737e62f9245 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 3 Jan 2021 18:41:03 +0100 Subject: [PATCH 103/255] Zugbee fix possible crash on Web UI --- tasmota/xdrv_23_zigbee_A_impl.ino | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index e5ca3d36c..7c17b5d31 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -1768,8 +1768,7 @@ const char ZB_WEB_U[] PROGMEM = "\0" // +++++++++++++++++++++++++++++++++++++++++++++++++++++++ //=ZB_WEB_LINE_END - "
" // Close LQI - "%s{e}" // dhm (Last Seen) + "{t}

" "\0" ; // end of list @@ -1794,7 +1793,7 @@ enum { ZB_WEB_LINE_END=1608, }; -// Compressed from 1625 to 1111, -31.6% +// Compressed from 1627 to 1118, -31.3% const char ZB_WEB[] PROGMEM = "\x00\x66\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\x3D\x3D\x46\x41\x33\xF0\xE8\x6D" "\xA1\x15\x08\x79\xF6\x51\xDD\x3C\xCC\x6F\xFD\x47\x58\x62\xB4\x21\x0E\xF1\xED\x1F" "\xD1\x28\x51\xE6\x72\x99\x0C\x36\x1E\x0C\x67\x51\xD7\xED\x36\xB3\xCC\xE7\x99\xF4" @@ -1850,7 +1849,7 @@ const char ZB_WEB[] PROGMEM = "\x00\x66\x3D\x0E\xCA\xB1\xC1\x33\xF0\xF6\xD1\xEE\ "\x30\xF6\x1F\x87\xE8\xF2\x59\xEF\x9E\x0A\x70\xBE\x08\x5D\x15\xA0\x42\xE0\x6C\x83" "\x2A\x2B\x47\xD0\x87\xB0\xFC\x3D\x3C\x36\xC2\x08\xFC\x3F\x47\x91\xC5\xF5\xF3\xC1" "\xDC\x3D\x0E\xC2\x04\x19\x87\xD0\x84\x68\x08\x5D\x16\xC9\xC2\xF8\x21\x74\x18\x4E" - "\xCA\x10\xFC\x3E\xBC\x7B\x59\xEE\x04\xC9\xB3\x85\xF3"; + "\xCA\x10\xFC\x3E\xBC\x7B\x59\xEE\x9C\x2F\x82\x3F\x4E\x90\x10\x79\x23\x9C\x2F\x9B"; // ++++++++++++++++++++^^^^^^^^^^^^^^^^^^^++++++++++++++++++++ // ++++++++++++++++++++ DO NOT EDIT ABOVE ++++++++++++++++++++ From 8eafc7d474b632b1c137f72f2ba2752c20329533 Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 4 Jan 2021 10:29:12 +0100 Subject: [PATCH 104/255] as taken from https://github.com/colinl/Sonoff-Tasmota/tree/pid_branch --- lib/default/ProcessControl/PID.cpp | 193 ++++++++++++ lib/default/ProcessControl/PID.h | 90 ++++++ lib/default/ProcessControl/Timeprop.cpp | 94 ++++++ lib/default/ProcessControl/Timeprop.h | 85 ++++++ tasmota/xdrv_91_timeprop.ino | 225 ++++++++++++++ tasmota/xdrv_92_pid.ino | 385 ++++++++++++++++++++++++ 6 files changed, 1072 insertions(+) create mode 100644 lib/default/ProcessControl/PID.cpp create mode 100644 lib/default/ProcessControl/PID.h create mode 100644 lib/default/ProcessControl/Timeprop.cpp create mode 100644 lib/default/ProcessControl/Timeprop.h create mode 100644 tasmota/xdrv_91_timeprop.ino create mode 100644 tasmota/xdrv_92_pid.ino diff --git a/lib/default/ProcessControl/PID.cpp b/lib/default/ProcessControl/PID.cpp new file mode 100644 index 000000000..0a8e35356 --- /dev/null +++ b/lib/default/ProcessControl/PID.cpp @@ -0,0 +1,193 @@ +/** + * Copyright 2018 Colin Law + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * See Timeprop.h for Usage + * + **/ + + +#include "PID.h" + +PID::PID() { + m_initialised = 0; + m_last_sample_time = 0; + m_last_pv_update_time = 0; + m_last_power = 0.0; +} + +void PID::initialise( double setpoint, double prop_band, double t_integral, double t_derivative, + double integral_default, int max_interval, double smooth_factor, unsigned char mode_auto, double manual_op ) { + + m_setpoint = setpoint; + m_prop_band = prop_band; + m_t_integral = t_integral; + m_t_derivative = t_derivative; + m_integral_default = integral_default; + m_max_interval = max_interval; + m_smooth_factor= smooth_factor; + m_mode_auto= mode_auto; + m_manual_op = manual_op; + + m_initialised = 1; + +} + + +/* called regularly to calculate and return new power value */ +double PID::tick( unsigned long nowSecs ) { + double power; + double factor; + if (m_initialised && m_last_pv_update_time) { + // we have been initialised and have been given a pv value + // check whether too long has elapsed since pv was last updated + if (m_max_interval > 0 && nowSecs - m_last_pv_update_time > m_max_interval) { + // yes, too long has elapsed since last PV update so go to fallback power + power = m_manual_op; + } else { + // is this the first time through here? + if (m_last_sample_time) { + // not first time + unsigned long delta_t = nowSecs - m_last_sample_time; // seconds + if (delta_t <= 0 || delta_t > m_max_interval) { + // too long since last sample so leave integral as is and set deriv to zero + m_derivative = 0; + } else { + if (m_smooth_factor > 0) { + // A derivative smoothing factor has been supplied + // smoothing time constant is td/factor but with a min of delta_t to stop overflows + int ts = m_t_derivative/m_smooth_factor > delta_t ? m_t_derivative/m_smooth_factor : delta_t; + factor = 1.0/(ts/delta_t); + } else { + // no integral smoothing so factor is 1, this makes smoothed_value the previous pv + factor = 1.0; + } + double delta_v = (m_pv - m_smoothed_value) * factor; + m_smoothed_value = m_smoothed_value + delta_v; + m_derivative = m_t_derivative * delta_v/delta_t; + // lock the integral if abs(previous integral + error) > prop_band/2 + // as this means that P + I is outside the linear region so power will be 0 or full + // also lock if control is disabled + double error = m_pv - m_setpoint; + double pbo2 = m_prop_band/2.0; + double epi = error + m_integral; + if (epi < 0.0) epi = -epi; // abs value of error + m_integral + if (epi < pbo2 && m_mode_auto) { + if (m_t_integral <= 0) { + // t_integral is zero (or silly), set integral to one end or the other + // or half way if exactly on sp + if (error > 0.0) { + m_integral = pbo2; + } else if (error < 0) { + m_integral = -pbo2; + } else { + m_integral = 0.0; + } + } else { + m_integral = m_integral + error * delta_t/m_t_integral; + } + } + // clamp to +- 0.5 prop band widths so that it cannot push the zero power point outside the pb + // do this here rather than when integral is updated to allow for the fact that the pb may change dynamically + if ( m_integral < -pbo2 ) { + m_integral = -pbo2; + } else if (m_integral > pbo2) { + m_integral = pbo2; + } + } + + } else { + // first time through, initialise context data + m_smoothed_value = m_pv; + // setup the integral term so that the power out would be integral_default if pv=setpoint + m_integral = (0.5 - m_integral_default)*m_prop_band; + m_derivative = 0.0; + } + + double proportional = m_pv - m_setpoint; + if (m_prop_band == 0) { + // prop band is zero so drop back to on/off control with zero hysteresis + if (proportional > 0.0) { + power = 0.0; + } else if (proportional < 0.0) { + power = 1.0; + } else { + // exactly on sp so leave power as it was last time round + power = m_last_power; + } + } + else { + power = -1.0/m_prop_band * (proportional + m_integral + m_derivative) + 0.5; + } + // set power to disabled value if the loop is not enabled + if (!m_mode_auto) { + power = m_manual_op; + } + m_last_sample_time = nowSecs; + } + } else { + // not yet initialised or no pv value yet so set power to disabled value + power = m_manual_op; + } + if (power < 0.0) { + power = 0.0; + } else if (power > 1.0) { + power = 1.0; + } + m_last_power = power; + return power; +} + +// call to pass in new process value +void PID::setPv( double pv, unsigned long nowSecs ){ + m_pv = pv; + m_last_pv_update_time = nowSecs; +} + +// methods to modify configuration data +void PID::setSp( double setpoint ) { + m_setpoint = setpoint; +} + +void PID::setPb( double prop_band ) { + m_prop_band = prop_band; +} + +void PID::setTi( double t_integral ) { + m_t_integral = t_integral; +} + +void PID::setTd( double t_derivative ) { + m_t_derivative = t_derivative; +} + +void PID::setInitialInt( double integral_default ) { + m_integral_default = integral_default; +} + +void PID::setDSmooth( double smooth_factor ) { + m_smooth_factor = smooth_factor; +} + +void PID::setAuto( unsigned char mode_auto ) { + m_mode_auto = mode_auto; +} + +void PID::setManualPower( double manual_op ) { + m_manual_op = manual_op; +} + +void PID::setMaxInterval( int max_interval ) { + m_max_interval = max_interval; +} diff --git a/lib/default/ProcessControl/PID.h b/lib/default/ProcessControl/PID.h new file mode 100644 index 000000000..3409da4a2 --- /dev/null +++ b/lib/default/ProcessControl/PID.h @@ -0,0 +1,90 @@ +/** + * Copyright 2018 Colin Law + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + + /** + * A PID control class + * + * Github repository https://github.com/colinl/process-control.git + * + * Given ... + * + * Usage: + * First call initialise(), see below for parameters then + * ... + * The functions require a parameter nowSecs which is a representation of the + * current time in seconds. The absolute value of this is immaterial, it is + * used for relative timing only. + * + **/ + + +#ifndef PID_h +#define PID_h + +class PID { +public: + + PID(); + + /* + Initialiser given + + current time in seconds + */ + void initialise( double setpoint, double prop_band, double t_integral, double t_derivative, + double integral_default, int max_interval, double smooth_factor, unsigned char mode_auto, double manual_op ); + + + /* called regularly to calculate and return new power value */ + double tick(unsigned long nowSecs); + + // call to pass in new process value + void setPv( double pv, unsigned long nowSecs ); + + // methods to modify configuration data + void setSp( double setpoint ); + void setPb( double prop_band ); + void setTi( double t_integral ); + void setTd( double t_derivative ); + void setInitialInt( double integral_default ); + void setDSmooth( double smooth_factor ); + void setAuto( unsigned char mode_auto ); + void setManualPower( double manual_op ); + void setMaxInterval( int max_interval ); + +private: + double m_pv; + double m_setpoint; + double m_prop_band; + double m_t_integral; + double m_t_derivative; + double m_integral_default; + double m_smooth_factor; + unsigned char m_mode_auto; + double m_manual_op; + int m_max_interval; + double m_last_power; + + + unsigned char m_initialised; + unsigned long m_last_pv_update_time; // the time of last pv update secs + unsigned long m_last_sample_time; // the time of the last tick() run + double m_smoothed_value; + double m_integral; + double m_derivative ; +}; + +#endif // Timeprop_h diff --git a/lib/default/ProcessControl/Timeprop.cpp b/lib/default/ProcessControl/Timeprop.cpp new file mode 100644 index 000000000..c4d5e9eb8 --- /dev/null +++ b/lib/default/ProcessControl/Timeprop.cpp @@ -0,0 +1,94 @@ +/** + * Copyright 2018 Colin Law + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * See Timeprop.h for Usage + * + **/ + + +#include "Timeprop.h" + +void Timeprop::initialise( int cycleTime, int deadTime, unsigned char invert, float fallbackPower, int maxUpdateInterval, + unsigned long nowSecs) { + m_cycleTime = cycleTime; + m_deadTime = deadTime; + m_invert = invert; + m_fallbackPower = fallbackPower; + m_maxUpdateInterval = maxUpdateInterval; + + m_dtoc = (float)deadTime/cycleTime; + m_opState = 0; + setPower(m_fallbackPower, nowSecs); +} + +/* set current power required 0:1, given power and current time in seconds */ +void Timeprop::setPower( float power, unsigned long nowSecs ) { + if (power < 0.0) { + power = 0.0; + } else if (power >= 1.0) { + power = 1.0; + } + m_power = power; + m_lastPowerUpdateTime = nowSecs; +}; + +/* called regularly to provide new output value */ +/* returns new o/p state 0, 1 */ +int Timeprop::tick( unsigned long nowSecs) { + int newState; + float wave; + float direction; + float effectivePower; + + // check whether too long has elapsed since power was last updated + if (m_maxUpdateInterval > 0 && nowSecs - m_lastPowerUpdateTime > m_maxUpdateInterval) { + // yes, go to fallback power + setPower(m_fallbackPower, nowSecs); + } + + wave = (nowSecs % m_cycleTime)/(float)m_cycleTime; + // determine direction of travel and convert to triangular wave + if (wave < 0.5) { + direction = 1; // on the way up + wave = wave*2; + } else { + direction = -1; // on the way down + wave = (1 - wave)*2; + } + // if a dead_time has been supplied for this o/p then adjust power accordingly + if (m_deadTime > 0 && m_power > 0.0 && m_power < 1.0) { + effectivePower = (1.0-2.0*m_dtoc)*m_power + m_dtoc; + } else { + effectivePower = m_power; + } + // cope with end cases in case values outside 0..1 + if (effectivePower <= 0.0) { + newState = 0; // no heat + } else if (effectivePower >= 1.0) { + newState = 1; // full heat + } else { + // only allow power to come on on the way down and off on the way up, to reduce short pulses + if (effectivePower >= wave && direction == -1) { + newState = 1; + } else if (effectivePower <= wave && direction == 1) { + newState = 0; + } else { + // otherwise leave it as it is + newState = m_opState; + } + } + m_opState = newState; + return m_invert ? (1-m_opState) : m_opState; +} diff --git a/lib/default/ProcessControl/Timeprop.h b/lib/default/ProcessControl/Timeprop.h new file mode 100644 index 000000000..c6df45be0 --- /dev/null +++ b/lib/default/ProcessControl/Timeprop.h @@ -0,0 +1,85 @@ +/** + * Copyright 2018 Colin Law + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + **/ + + /** + * A class to generate a time proportioned digital output from a linear input + * + * Github repository https://github.com/colinl/process-control.git + * + * Given a required power value in the range 0.0 to 1.0 this class generates + * a time proportioned 0/1 output (representing OFF/ON) which averages to the + * required power value. The cycle time is configurable. If, for example, this + * is set to 10 minutes and the power input is 0.2 then the output will be on + * for two minutes in every ten minutes. + * + * A value for actuator dead time may be provided. If you have a device that + * takes a significant time to open/close then set this to the average of the + * open and close times. The algorithim will then adjust the output timing + * accordingly to ensure that the output is not switched more rapidly than + * the actuator can cope with. + * + * A facility to invert the output is provided which can be useful when used in + * refrigeration processes and similar. + * + * Usage: + * First call initialise(), see below for parameters then call setPower() to + * specify the current power required. + * Then regularly call tick() to determine the output state required. + * setPower may be called as often as required to change the power required. + * The functions require a parameter nowSecs which is a representation of the + * current time in seconds. The absolute value of this is immaterial, it is + * used for relative timing only. + * + **/ + + +#ifndef Timeprop_h +#define Timeprop_h + +class Timeprop { +public: + /* + Initialiser given + cycleTime seconds + actuator deadTime seconds + whether to invert the output + fallback power value if updates are not received within time below + max number of seconds to allow between power updates before falling back to default power (0 to disable) + current time in seconds + */ + void initialise( int cycleTime, int deadTime, unsigned char invert, float fallbackPower, int maxUpdateInterval, + unsigned long nowSecs); + + /* set current power required 0:1, given power and current time in seconds */ + void setPower( float power, unsigned long nowSecs ); + + /* called regularly to provide new output value */ + /* returns new o/p state 0, 1 */ + int tick(unsigned long nowSecs); + +private: + int m_cycleTime; // cycle time seconds, float to force float calcs + int m_deadTime; // actuator action time seconds + unsigned char m_invert; // whether to invert the output + float m_dtoc; // deadTime/m_cycleTime + int m_opState; // current output state (before invert) + float m_power; // required power 0:1 + float m_fallbackPower; // falls back to this if updates not received with max allowed timezone + int m_maxUpdateInterval; // max time between updates + unsigned long m_lastPowerUpdateTime; // the time of last power update secs +}; + +#endif // Timeprop_h diff --git a/tasmota/xdrv_91_timeprop.ino b/tasmota/xdrv_91_timeprop.ino new file mode 100644 index 000000000..ba3f0af4b --- /dev/null +++ b/tasmota/xdrv_91_timeprop.ino @@ -0,0 +1,225 @@ +/* + xdrv_91_timeprop.ino - Timeprop support for Sonoff-Tasmota + Copyright (C) 2018 Colin Law and Thomas Herrmann + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * Code to drive one or more relays in a time proportioned manner give a + * required power value. + * + * Given required power values in the range 0.0 to 1.0 the relays will be + * driven on/off in such that the average power suppled will represent + * the required power. + * The cycle time is configurable. If, for example, the + * period is set to 10 minutes and the power input is 0.2 then the output will + * be on for two minutes in every ten minutes. + * + * A value for actuator dead time may be provided. If you have a device that + * takes a significant time to open/close then set this to the average of the + * open and close times. The algorithim will then adjust the output timing + * accordingly to ensure that the output is not switched more rapidly than + * the actuator can cope with. + * + * A facility to invert the output is provided which can be useful when used in + * refrigeration processes and similar. + * + * In the case where only one relay is being driven the power value is set by + * writing the value to the mqtt topic cmnd/timeprop_setpower_0. If more than + * one relay is being driven (as might be the case for a heat/cool application + * where one relay drives the heater and the other the cooler) then the power + * for the second relay is written to topic cmnd/timeprop_setpower_1 and so on. + * + * To cope with the problem of temporary wifi failure etc a + * TIMEPROP_MAX_UPDATE_INTERVALS value is available. This can be set to the max + * expected time between power updates and if this time is exceeded then the + * power will fallback to a given safe value until a new value is provided. Set + * the interval to 0 to disable this feature. + * + * Usage: + * Place this file in the sonoff folder. + * Clone the library https://github.com/colinl/process-control.git from Github + * into a subfolder of lib. + * In user_config.h or user_config_override.h for a single relay, include + * code as follows: + + #define USE_TIMEPROP // include the timeprop feature (+1.2k) + // for single output + #define TIMEPROP_NUM_OUTPUTS 1 // how many outputs to control (with separate alogorithm for each) + #define TIMEPROP_CYCLETIMES 60 // cycle time seconds + #define TIMEPROP_DEADTIMES 0 // actuator action time seconds + #define TIMEPROP_OPINVERTS false // whether to invert the output + #define TIMEPROP_FALLBACK_POWERS 0 // falls back to this if too long betwen power updates + #define TIMEPROP_MAX_UPDATE_INTERVALS 120 // max no secs that are allowed between power updates (0 to disable) + #define TIMEPROP_RELAYS 1 // which relay to control 1:8 + + * or for two relays: + #define USE_TIMEPROP // include the timeprop feature (+1.2k) + // for single output + #define TIMEPROP_NUM_OUTPUTS 2 // how many outputs to control (with separate alogorithm for each) + #define TIMEPROP_CYCLETIMES 60, 10 // cycle time seconds + #define TIMEPROP_DEADTIMES 0, 0 // actuator action time seconds + #define TIMEPROP_OPINVERTS false, false // whether to invert the output + #define TIMEPROP_FALLBACK_POWERS 0, 0 // falls back to this if too long betwen power updates + #define TIMEPROP_MAX_UPDATE_INTERVALS 120, 120 // max no secs that are allowed between power updates (0 to disable) + #define TIMEPROP_RELAYS 1, 2 // which relay to control 1:8 + + * Publish values between 0 and 1 to the topic(s) described above + * +**/ + + +#ifdef USE_TIMEPROP + +# include "Timeprop.h" + +#define D_CMND_TIMEPROP "timeprop_" +#define D_CMND_TIMEPROP_SETPOWER "setpower_" // add index no on end (0:8) and data is power 0:1 + +enum TimepropCommands { CMND_TIMEPROP_SETPOWER }; +const char kTimepropCommands[] PROGMEM = D_CMND_TIMEPROP_SETPOWER; + +static Timeprop timeprops[TIMEPROP_NUM_OUTPUTS]; +static int relayNos[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_RELAYS}; +static long currentRelayStates = 0; // current actual relay states. Bit 0 first relay + +static long timeprop_current_time_secs = 0; // a counter that counts seconds since initialisation + +/* call this from elsewhere if required to set the power value for one of the timeprop instances */ +/* index specifies which one, 0 up */ +void Timeprop_Set_Power( int index, float power ) +{ + if (index >= 0 && index < TIMEPROP_NUM_OUTPUTS) + { + timeprops[index].setPower( power, timeprop_current_time_secs); + } +} + +void Timeprop_Init() +{ + snprintf_P(log_data, sizeof(log_data), "Timeprop Init"); + AddLog(LOG_LEVEL_INFO); + int cycleTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_CYCLETIMES}; + int deadTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_DEADTIMES}; + int opInverts[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_OPINVERTS}; + int fallbacks[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_FALLBACK_POWERS}; + int maxIntervals[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_MAX_UPDATE_INTERVALS}; + + for (int i=0; i= 0 ? XdrvMailbox.topic : ""), + (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : "")); + + AddLog(LOG_LEVEL_INFO); + */ + if (0 == strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_TIMEPROP), ua_prefix_len)) { + // command starts with timeprop_ + int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + ua_prefix_len, kTimepropCommands); + if (CMND_TIMEPROP_SETPOWER == command_code) { + /* + snprintf_P(log_data, sizeof(log_data), "Timeprop command timeprop_setpower: " + "index: %d data_len: %d payload: %d topic: %s data: %s", + XdrvMailbox.index, + XdrvMailbox.data_len, + XdrvMailbox.payload, + (XdrvMailbox.payload >= 0 ? XdrvMailbox.topic : ""), + (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : "")); + AddLog(LOG_LEVEL_INFO); + */ + if (XdrvMailbox.index >=0 && XdrvMailbox.index < TIMEPROP_NUM_OUTPUTS) { + timeprops[XdrvMailbox.index].setPower( atof(XdrvMailbox.data), timeprop_current_time_secs ); + } + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_TIMEPROP D_CMND_TIMEPROP_SETPOWER "%d\":\"%s\"}"), + XdrvMailbox.index, XdrvMailbox.data); + } + else { + serviced = false; + } + } else { + serviced = false; + } + return serviced; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +#define XDRV_91 91 + +boolean Xdrv91(byte function) +//boolean XDRV_91(byte function) +{ + boolean result = false; + + switch (function) { + case FUNC_INIT: + Timeprop_Init(); + break; + case FUNC_EVERY_SECOND: + Timeprop_Every_Second(); + break; + case FUNC_COMMAND: + result = Timeprop_Command(); + break; + case FUNC_SET_POWER: + Timeprop_Xdrv_Power(); + break; + } + return result; +} + +#endif // USE_TIMEPROP diff --git a/tasmota/xdrv_92_pid.ino b/tasmota/xdrv_92_pid.ino new file mode 100644 index 000000000..e05f824e5 --- /dev/null +++ b/tasmota/xdrv_92_pid.ino @@ -0,0 +1,385 @@ +/* + xdrv_92_pid.ino - PID algorithm plugin for Sonoff-Tasmota + Copyright (C) 2018 Colin Law and Thomas Herrmann + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * Code to + * + * Usage: + * Place this file in the sonoff folder. + * Clone the library https://github.com/colinl/process-control.git from Github + * into a subfolder of lib. + * If you want to use a time proportioned relay output with this then also get + * xdrv_91_timeprop.ino + * In user_config.h or user_config_override.h include code as follows: + + #define USE_PID // include the pid feature (+4.3k) + #define PID_SETPOINT 19.5 // Setpoint value. This is the process value that the process is + // aiming for. + // May be adjusted via MQTT using cmnd pid_sp + + #define PID_PROPBAND 5 // Proportional band in process units (eg degrees). This controls + // the gain of the loop and is the range of process value over which + // the power output will go from 0 to full power. The units are that + // of the process and setpoint, so for example in a heating + // application it might be set to 1.5 degrees. + // May be adjusted via MQTT using cmnd pid_pb + + #define PID_INTEGRAL_TIME 1800 // Integral time seconds. This is a setting for the integral time, + // in seconds. It represents the time constant of the integration + // effect. The larger the value the slower the integral effect will be. + // Obviously the slower the process is the larger this should be. For + // example for a domestic room heated by convection radiators a setting + // of one hour might be appropriate (in seconds). To disable the + // integral effect set this to a large number. + // May be adjusted via MQTT using cmnd pid_ti + + #define PID_DERIVATIVE_TIME 15 // Derivative time seconds. This is a setting for the derivative time, + // in seconds. It represents the time constant of the derivative effect. + // The larger the value the greater will be the derivative effect. + // Typically this will be set to somewhat less than 25% of the integral + // setting, once the integral has been adjusted to the optimum value. To + // disable the derivative effect set this to 0. When initially tuning a + // loop it is often sensible to start with derivative zero and wind it in + // once other parameters have been setup. + // May be adjusted via MQTT using cmnd pid_td + + #define PID_INITIAL_INT 0.5 // Initial integral value (0:1). This is an initial value which is used + // to preset the integrated error value when the flow is deployed in + // order to assist in homing in on the setpoint the first time. It should + // be set to an estimate of what the power requirement might be in order + // to maintain the process at the setpoint. For example for a domestic + // room heating application it might be set to 0.2 indicating that 20% of + // the available power might be required to maintain the setpoint. The + // value is of no consequence apart from device restart. + + #define PID_MAX_INTERVAL 300 // This is the maximum time in seconds that is expected between samples. + // It is provided to cope with unusual situations such as a faulty sensor + // that might prevent the node from being supplied with a process value. + // If no new process value is received for this time then the power is set + // to the value defined for PID_MANUAL_POWER. + // May be adjusted via MQTT using cmnd pid_max_interval + + #define PID_DERIV_SMOOTH_FACTOR 3 // In situations where the process sensor has limited resolution (such as + // the DS18B20), the use of deriviative can be problematic as when the + // process is changing only slowly the steps in the value cause spikes in + // the derivative. To reduce the effect of these this parameter can be + // set to apply a filter to the derivative term. I have found that with + // the DS18B20 that a value of 3 here can be beneficial, providing + // effectively a low pass filter on the derivative at 1/3 of the derivative + // time. This feature may also be useful if the process value is particularly + // noisy. The smaller the value the greater the filtering effect but the + // more it will reduce the effectiveness of the derivative. A value of zero + // disables this feature. + // May be adjusted via MQTT using cmnd pid_d_smooth + + #define PID_AUTO 1 // Auto mode 1 or 0 (for manual). This can be used to enable or disable + // the control (1=enable, auto mode, 0=disabled, manual mode). When in + // manual mode the output is set the value definded for PID_MANUAL_POWER + // May be adjusted via MQTT using cmnd pid_auto + + #define PID_MANUAL_POWER 0 // Power output when in manual mode or fallback mode if too long elapses + // between process values + // May be adjusted via MQTT using cmnd pid_manual_power + + #define PID_UPDATE_SECS 0 // How often to run the pid algorithm (integer secs) or 0 to run the algorithm + // each time a new pv value is received, for most applictions specify 0. + // Otherwise set this to a time + // that is short compared to the response of the process. For example, + // something like 15 seconds may well be appropriate for a domestic room + // heating application. + // May be adjusted via MQTT using cmnd pid_update_secs + + #define PID_USE_TIMPROP 1 // To use an internal relay for a time proportioned output to drive the + // process, set this to indicate which timeprop output to use. For a device + // with just one relay then this will be 1. + // It is then also necessary to define USE_TIMEPROP and set the output up as + // explained in xdrv_91_timeprop.ino + // To disable this feature leave this undefined (undefined, not defined to nothing). + + #define PID_USE_LOCAL_SENSOR // if defined then the local sensor will be used for pv. Leave undefined if + // this is not required. The rate that the sensor is read is defined by TELE_PERIOD + // If not using the sensor then you can supply process values via MQTT using + // cmnd pid_pv + + //#define PID_SHUTTER 1 // if using the PID to control a 3-way valve, create Tasmota Shutter and define the + // number of the shutter here. Otherwise leave this commented out + + * Help with using the PID algorithm and with loop tuning can be found at + * http://blog.clanlaw.org.uk/2018/01/09/PID-tuning-with-node-red-contrib-pid.html + * This is directed towards using the algorithm in the node-red node node-red-contrib-pid but the algorithm here is based on + * the code there and the tuning techique described there should work just the same. + + * +**/ + + +#ifdef USE_PID + +#include "PID.h" + +#define D_CMND_PID "pid_" + +#define D_CMND_PID_SETPV "pv" +#define D_CMND_PID_SETSETPOINT "sp" +#define D_CMND_PID_SETPROPBAND "pb" +#define D_CMND_PID_SETINTEGRAL_TIME "ti" +#define D_CMND_PID_SETDERIVATIVE_TIME "td" +#define D_CMND_PID_SETINITIAL_INT "initint" +#define D_CMND_PID_SETDERIV_SMOOTH_FACTOR "d_smooth" +#define D_CMND_PID_SETAUTO "auto" +#define D_CMND_PID_SETMANUAL_POWER "manual_power" +#define D_CMND_PID_SETMAX_INTERVAL "max_interval" +#define D_CMND_PID_SETUPDATE_SECS "update_secs" + +enum PIDCommands { CMND_PID_SETPV, CMND_PID_SETSETPOINT, CMND_PID_SETPROPBAND, CMND_PID_SETINTEGRAL_TIME, + CMND_PID_SETDERIVATIVE_TIME, CMND_PID_SETINITIAL_INT, CMND_PID_SETDERIV_SMOOTH_FACTOR, CMND_PID_SETAUTO, + CMND_PID_SETMANUAL_POWER, CMND_PID_SETMAX_INTERVAL, CMND_PID_SETUPDATE_SECS }; +const char kPIDCommands[] PROGMEM = D_CMND_PID_SETPV "|" D_CMND_PID_SETSETPOINT "|" D_CMND_PID_SETPROPBAND "|" + D_CMND_PID_SETINTEGRAL_TIME "|" D_CMND_PID_SETDERIVATIVE_TIME "|" D_CMND_PID_SETINITIAL_INT "|" D_CMND_PID_SETDERIV_SMOOTH_FACTOR "|" + D_CMND_PID_SETAUTO "|" D_CMND_PID_SETMANUAL_POWER "|" D_CMND_PID_SETMAX_INTERVAL "|" D_CMND_PID_SETUPDATE_SECS; + +static PID pid; +static int update_secs = PID_UPDATE_SECS <= 0 ? 0 : PID_UPDATE_SECS; // how often (secs) the pid alogorithm is run +static int max_interval = PID_MAX_INTERVAL; +static unsigned long last_pv_update_secs = 0; +static boolean run_pid_now = false; // tells PID_Every_Second to run the pid algorithm + +static long pid_current_time_secs = 0; // a counter that counts seconds since initialisation + +void PID_Init() +{ + snprintf_P(log_data, sizeof(log_data), "PID Init"); + AddLog(LOG_LEVEL_INFO); + pid.initialise( PID_SETPOINT, PID_PROPBAND, PID_INTEGRAL_TIME, PID_DERIVATIVE_TIME, PID_INITIAL_INT, + PID_MAX_INTERVAL, PID_DERIV_SMOOTH_FACTOR, PID_AUTO, PID_MANUAL_POWER ); +} + +void PID_Every_Second() { + static int sec_counter = 0; + pid_current_time_secs++; // increment time + // run the pid algorithm if run_pid_now is true or if the right number of seconds has passed or if too long has + // elapsed since last pv update. If too long has elapsed the the algorithm will deal with that. + if (run_pid_now || pid_current_time_secs - last_pv_update_secs > max_interval || (update_secs != 0 && sec_counter++ % update_secs == 0)) { + run_pid(); + run_pid_now = false; + } +} + +void PID_Show_Sensor() { + // Called each time new sensor data available, data in mqtt data in same format + // as published in tele/SENSOR + // Update period is specified in TELE_PERIOD + // e.g. "{"Time":"2018-03-13T16:48:05","DS18B20":{"Temperature":22.0},"TempUnit":"C"}" + snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor: mqtt_data: %s", mqtt_data); + AddLog(LOG_LEVEL_INFO); + StaticJsonBuffer<400> jsonBuffer; + // force mqtt_data to read only to stop parse from overwriting it + JsonObject& data_json = jsonBuffer.parseObject((const char*)mqtt_data); + if (data_json.success()) { + const char* value = data_json["DS18B20"]["Temperature"]; + // check that something was found and it contains a number + if (value != NULL && strlen(value) > 0 && (isdigit(value[0]) || (value[0] == '-' && isdigit(value[1])) ) ) { + snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor: Temperature: %s", value); + AddLog(LOG_LEVEL_INFO); + // pass the value to the pid alogorithm to use as current pv + last_pv_update_secs = pid_current_time_secs; + pid.setPv(atof(value), last_pv_update_secs); + // also trigger running the pid algorithm if we have been told to run it each pv sample + if (update_secs == 0) { + // this runs it at the next second + run_pid_now = true; + } + } else { + snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor - no temperature found"); + AddLog(LOG_LEVEL_INFO); + } + } else { + // parse failed + snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor - json parse failed"); + AddLog(LOG_LEVEL_INFO); + } +} + + +/* struct XDRVMAILBOX { */ +/* uint16_t valid; */ +/* uint16_t index; */ +/* uint16_t data_len; */ +/* int16_t payload; */ +/* char *topic; */ +/* char *data; */ +/* } XdrvMailbox; */ + +boolean PID_Command() +{ + char command [CMDSZ]; + boolean serviced = true; + uint8_t ua_prefix_len = strlen(D_CMND_PID); // to detect prefix of command + + snprintf_P(log_data, sizeof(log_data), "Command called: " + "index: %d data_len: %d payload: %d topic: %s data: %s", + XdrvMailbox.index, + XdrvMailbox.data_len, + XdrvMailbox.payload, + (XdrvMailbox.payload >= 0 ? XdrvMailbox.topic : ""), + (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : "")); + AddLog(LOG_LEVEL_INFO); + + if (0 == strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_PID), ua_prefix_len)) { + // command starts with pid_ + int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic + ua_prefix_len, kPIDCommands); + serviced = true; + switch (command_code) { + case CMND_PID_SETPV: + snprintf_P(log_data, sizeof(log_data), "PID command setpv"); + AddLog(LOG_LEVEL_INFO); + last_pv_update_secs = pid_current_time_secs; + pid.setPv(atof(XdrvMailbox.data), last_pv_update_secs); + // also trigger running the pid algorithm if we have been told to run it each pv sample + if (update_secs == 0) { + // this runs it at the next second + run_pid_now = true; + } + break; + + case CMND_PID_SETSETPOINT: + snprintf_P(log_data, sizeof(log_data), "PID command setsetpoint"); + AddLog(LOG_LEVEL_INFO); + pid.setSp(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETPROPBAND: + snprintf_P(log_data, sizeof(log_data), "PID command propband"); + AddLog(LOG_LEVEL_INFO); + pid.setPb(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETINTEGRAL_TIME: + snprintf_P(log_data, sizeof(log_data), "PID command Ti"); + AddLog(LOG_LEVEL_INFO); + pid.setTi(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETDERIVATIVE_TIME: + snprintf_P(log_data, sizeof(log_data), "PID command Td"); + AddLog(LOG_LEVEL_INFO); + pid.setTd(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETINITIAL_INT: + snprintf_P(log_data, sizeof(log_data), "PID command initial int"); + AddLog(LOG_LEVEL_INFO); + pid.setInitialInt(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETDERIV_SMOOTH_FACTOR: + snprintf_P(log_data, sizeof(log_data), "PID command deriv smooth"); + AddLog(LOG_LEVEL_INFO); + pid.setDSmooth(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETAUTO: + snprintf_P(log_data, sizeof(log_data), "PID command auto"); + AddLog(LOG_LEVEL_INFO); + pid.setAuto(atoi(XdrvMailbox.data)); + break; + + case CMND_PID_SETMANUAL_POWER: + snprintf_P(log_data, sizeof(log_data), "PID command manual power"); + AddLog(LOG_LEVEL_INFO); + pid.setManualPower(atof(XdrvMailbox.data)); + break; + + case CMND_PID_SETMAX_INTERVAL: + snprintf_P(log_data, sizeof(log_data), "PID command set max interval"); + AddLog(LOG_LEVEL_INFO); + max_interval = atoi(XdrvMailbox.data); + pid.setMaxInterval(max_interval); + break; + + case CMND_PID_SETUPDATE_SECS: + snprintf_P(log_data, sizeof(log_data), "PID command set update secs"); + AddLog(LOG_LEVEL_INFO); + update_secs = atoi(XdrvMailbox.data) ; + if (update_secs < 0) update_secs = 0; + break; + + default: + serviced = false; + } + + if (serviced) { + // set mqtt RESULT + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\"}"), XdrvMailbox.topic, XdrvMailbox.data); + } + + } else { + serviced = false; + } + return serviced; +} + +static void run_pid() +{ + double power = pid.tick(pid_current_time_secs); + char buf[10]; + dtostrfd(power, 3, buf); + snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\"}"), "power", buf); + MqttPublishPrefixTopic_P(TELE, "PID", false); + +#if defined PID_SHUTTER + // send output as a position from 0-100 to defined shutter + int pos = power * 100; + ShutterSetPosition(PID_SHUTTER, pos); +#endif //PID_SHUTTER + +#if defined PID_USE_TIMPROP + // send power to appropriate timeprop output + Timeprop_Set_Power( PID_USE_TIMPROP-1, power ); +#endif // PID_USE_TIMPROP +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +#define XDRV_92 92 + +boolean Xdrv92(byte function) +//boolean XDRV_92(byte function) +{ + boolean result = false; + + switch (function) { + case FUNC_INIT: + PID_Init(); + break; + case FUNC_EVERY_SECOND: + PID_Every_Second(); + break; + case FUNC_SHOW_SENSOR: + // only use this if the pid loop is to use the local sensor for pv + #if defined PID_USE_LOCAL_SENSOR + PID_Show_Sensor(); + #endif // PID_USE_LOCAL_SENSOR + break; + case FUNC_COMMAND: + result = PID_Command(); + break; + } + return result; +} + +#endif // USE_TIMEPROP From 3f9960719aaf7d20f3a1e1f63f7fc53084ddfa8a Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 4 Jan 2021 10:42:06 +0100 Subject: [PATCH 105/255] log_data => TasmotaGlobal.log_data; mqtt_data => TasmotaGlobal.mqtt_data --- tasmota/xdrv_91_timeprop.ino | 4 ++-- tasmota/xdrv_92_pid.ino | 38 ++++++++++++++++++------------------ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/tasmota/xdrv_91_timeprop.ino b/tasmota/xdrv_91_timeprop.ino index ba3f0af4b..c9c4454fa 100644 --- a/tasmota/xdrv_91_timeprop.ino +++ b/tasmota/xdrv_91_timeprop.ino @@ -106,7 +106,7 @@ void Timeprop_Set_Power( int index, float power ) void Timeprop_Init() { - snprintf_P(log_data, sizeof(log_data), "Timeprop Init"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "Timeprop Init"); AddLog(LOG_LEVEL_INFO); int cycleTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_CYCLETIMES}; int deadTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_DEADTIMES}; @@ -182,7 +182,7 @@ boolean Timeprop_Command() if (XdrvMailbox.index >=0 && XdrvMailbox.index < TIMEPROP_NUM_OUTPUTS) { timeprops[XdrvMailbox.index].setPower( atof(XdrvMailbox.data), timeprop_current_time_secs ); } - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"" D_CMND_TIMEPROP D_CMND_TIMEPROP_SETPOWER "%d\":\"%s\"}"), + snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"" D_CMND_TIMEPROP D_CMND_TIMEPROP_SETPOWER "%d\":\"%s\"}"), XdrvMailbox.index, XdrvMailbox.data); } else { diff --git a/tasmota/xdrv_92_pid.ino b/tasmota/xdrv_92_pid.ino index e05f824e5..2ef51cc09 100644 --- a/tasmota/xdrv_92_pid.ino +++ b/tasmota/xdrv_92_pid.ino @@ -160,7 +160,7 @@ static long pid_current_time_secs = 0; // a counter that counts seconds since i void PID_Init() { - snprintf_P(log_data, sizeof(log_data), "PID Init"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID Init"); AddLog(LOG_LEVEL_INFO); pid.initialise( PID_SETPOINT, PID_PROPBAND, PID_INTEGRAL_TIME, PID_DERIVATIVE_TIME, PID_INITIAL_INT, PID_MAX_INTERVAL, PID_DERIV_SMOOTH_FACTOR, PID_AUTO, PID_MANUAL_POWER ); @@ -182,7 +182,7 @@ void PID_Show_Sensor() { // as published in tele/SENSOR // Update period is specified in TELE_PERIOD // e.g. "{"Time":"2018-03-13T16:48:05","DS18B20":{"Temperature":22.0},"TempUnit":"C"}" - snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor: mqtt_data: %s", mqtt_data); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor: mqtt_data: %s", TasmotaGlobal.mqtt_data); AddLog(LOG_LEVEL_INFO); StaticJsonBuffer<400> jsonBuffer; // force mqtt_data to read only to stop parse from overwriting it @@ -191,7 +191,7 @@ void PID_Show_Sensor() { const char* value = data_json["DS18B20"]["Temperature"]; // check that something was found and it contains a number if (value != NULL && strlen(value) > 0 && (isdigit(value[0]) || (value[0] == '-' && isdigit(value[1])) ) ) { - snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor: Temperature: %s", value); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor: Temperature: %s", value); AddLog(LOG_LEVEL_INFO); // pass the value to the pid alogorithm to use as current pv last_pv_update_secs = pid_current_time_secs; @@ -202,12 +202,12 @@ void PID_Show_Sensor() { run_pid_now = true; } } else { - snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor - no temperature found"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor - no temperature found"); AddLog(LOG_LEVEL_INFO); } } else { // parse failed - snprintf_P(log_data, sizeof(log_data), "PID_Show_Sensor - json parse failed"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor - json parse failed"); AddLog(LOG_LEVEL_INFO); } } @@ -228,7 +228,7 @@ boolean PID_Command() boolean serviced = true; uint8_t ua_prefix_len = strlen(D_CMND_PID); // to detect prefix of command - snprintf_P(log_data, sizeof(log_data), "Command called: " + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "Command called: " "index: %d data_len: %d payload: %d topic: %s data: %s", XdrvMailbox.index, XdrvMailbox.data_len, @@ -243,7 +243,7 @@ boolean PID_Command() serviced = true; switch (command_code) { case CMND_PID_SETPV: - snprintf_P(log_data, sizeof(log_data), "PID command setpv"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command setpv"); AddLog(LOG_LEVEL_INFO); last_pv_update_secs = pid_current_time_secs; pid.setPv(atof(XdrvMailbox.data), last_pv_update_secs); @@ -255,62 +255,62 @@ boolean PID_Command() break; case CMND_PID_SETSETPOINT: - snprintf_P(log_data, sizeof(log_data), "PID command setsetpoint"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command setsetpoint"); AddLog(LOG_LEVEL_INFO); pid.setSp(atof(XdrvMailbox.data)); break; case CMND_PID_SETPROPBAND: - snprintf_P(log_data, sizeof(log_data), "PID command propband"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command propband"); AddLog(LOG_LEVEL_INFO); pid.setPb(atof(XdrvMailbox.data)); break; case CMND_PID_SETINTEGRAL_TIME: - snprintf_P(log_data, sizeof(log_data), "PID command Ti"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command Ti"); AddLog(LOG_LEVEL_INFO); pid.setTi(atof(XdrvMailbox.data)); break; case CMND_PID_SETDERIVATIVE_TIME: - snprintf_P(log_data, sizeof(log_data), "PID command Td"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command Td"); AddLog(LOG_LEVEL_INFO); pid.setTd(atof(XdrvMailbox.data)); break; case CMND_PID_SETINITIAL_INT: - snprintf_P(log_data, sizeof(log_data), "PID command initial int"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command initial int"); AddLog(LOG_LEVEL_INFO); pid.setInitialInt(atof(XdrvMailbox.data)); break; case CMND_PID_SETDERIV_SMOOTH_FACTOR: - snprintf_P(log_data, sizeof(log_data), "PID command deriv smooth"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command deriv smooth"); AddLog(LOG_LEVEL_INFO); pid.setDSmooth(atof(XdrvMailbox.data)); break; case CMND_PID_SETAUTO: - snprintf_P(log_data, sizeof(log_data), "PID command auto"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command auto"); AddLog(LOG_LEVEL_INFO); pid.setAuto(atoi(XdrvMailbox.data)); break; case CMND_PID_SETMANUAL_POWER: - snprintf_P(log_data, sizeof(log_data), "PID command manual power"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command manual power"); AddLog(LOG_LEVEL_INFO); pid.setManualPower(atof(XdrvMailbox.data)); break; case CMND_PID_SETMAX_INTERVAL: - snprintf_P(log_data, sizeof(log_data), "PID command set max interval"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command set max interval"); AddLog(LOG_LEVEL_INFO); max_interval = atoi(XdrvMailbox.data); pid.setMaxInterval(max_interval); break; case CMND_PID_SETUPDATE_SECS: - snprintf_P(log_data, sizeof(log_data), "PID command set update secs"); + snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command set update secs"); AddLog(LOG_LEVEL_INFO); update_secs = atoi(XdrvMailbox.data) ; if (update_secs < 0) update_secs = 0; @@ -322,7 +322,7 @@ boolean PID_Command() if (serviced) { // set mqtt RESULT - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\"}"), XdrvMailbox.topic, XdrvMailbox.data); + snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"%s\":\"%s\"}"), XdrvMailbox.topic, XdrvMailbox.data); } } else { @@ -336,7 +336,7 @@ static void run_pid() double power = pid.tick(pid_current_time_secs); char buf[10]; dtostrfd(power, 3, buf); - snprintf_P(mqtt_data, sizeof(mqtt_data), PSTR("{\"%s\":\"%s\"}"), "power", buf); + snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"%s\":\"%s\"}"), "power", buf); MqttPublishPrefixTopic_P(TELE, "PID", false); #if defined PID_SHUTTER From 66b85b6ddf5705cc6f609fa91164d463abe7812c Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 4 Jan 2021 11:11:05 +0100 Subject: [PATCH 106/255] move to AddLog_P --- tasmota/xdrv_91_timeprop.ino | 3 +- tasmota/xdrv_92_pid.ino | 53 ++++++++++++------------------------ 2 files changed, 19 insertions(+), 37 deletions(-) diff --git a/tasmota/xdrv_91_timeprop.ino b/tasmota/xdrv_91_timeprop.ino index c9c4454fa..b9dc0f154 100644 --- a/tasmota/xdrv_91_timeprop.ino +++ b/tasmota/xdrv_91_timeprop.ino @@ -106,8 +106,7 @@ void Timeprop_Set_Power( int index, float power ) void Timeprop_Init() { - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "Timeprop Init"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("Timeprop Init")); int cycleTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_CYCLETIMES}; int deadTimes[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_DEADTIMES}; int opInverts[TIMEPROP_NUM_OUTPUTS] = {TIMEPROP_OPINVERTS}; diff --git a/tasmota/xdrv_92_pid.ino b/tasmota/xdrv_92_pid.ino index 2ef51cc09..1a3f7b59b 100644 --- a/tasmota/xdrv_92_pid.ino +++ b/tasmota/xdrv_92_pid.ino @@ -160,8 +160,7 @@ static long pid_current_time_secs = 0; // a counter that counts seconds since i void PID_Init() { - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID Init"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID Init")); pid.initialise( PID_SETPOINT, PID_PROPBAND, PID_INTEGRAL_TIME, PID_DERIVATIVE_TIME, PID_INITIAL_INT, PID_MAX_INTERVAL, PID_DERIV_SMOOTH_FACTOR, PID_AUTO, PID_MANUAL_POWER ); } @@ -182,8 +181,7 @@ void PID_Show_Sensor() { // as published in tele/SENSOR // Update period is specified in TELE_PERIOD // e.g. "{"Time":"2018-03-13T16:48:05","DS18B20":{"Temperature":22.0},"TempUnit":"C"}" - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor: mqtt_data: %s", TasmotaGlobal.mqtt_data); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor: mqtt_data: %s"), TasmotaGlobal.mqtt_data); StaticJsonBuffer<400> jsonBuffer; // force mqtt_data to read only to stop parse from overwriting it JsonObject& data_json = jsonBuffer.parseObject((const char*)mqtt_data); @@ -191,8 +189,7 @@ void PID_Show_Sensor() { const char* value = data_json["DS18B20"]["Temperature"]; // check that something was found and it contains a number if (value != NULL && strlen(value) > 0 && (isdigit(value[0]) || (value[0] == '-' && isdigit(value[1])) ) ) { - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor: Temperature: %s", value); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor: Temperature: %s"), value); // pass the value to the pid alogorithm to use as current pv last_pv_update_secs = pid_current_time_secs; pid.setPv(atof(value), last_pv_update_secs); @@ -202,13 +199,11 @@ void PID_Show_Sensor() { run_pid_now = true; } } else { - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor - no temperature found"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor - no temperature found")); } } else { // parse failed - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID_Show_Sensor - json parse failed"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor - json parse failed")); } } @@ -228,14 +223,13 @@ boolean PID_Command() boolean serviced = true; uint8_t ua_prefix_len = strlen(D_CMND_PID); // to detect prefix of command - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "Command called: " - "index: %d data_len: %d payload: %d topic: %s data: %s", + AddLog_P(LOG_LEVEL_INFO, PSTR("Command called: " + "index: %d data_len: %d payload: %d topic: %s data: %s"), XdrvMailbox.index, XdrvMailbox.data_len, XdrvMailbox.payload, (XdrvMailbox.payload >= 0 ? XdrvMailbox.topic : ""), (XdrvMailbox.data_len >= 0 ? XdrvMailbox.data : "")); - AddLog(LOG_LEVEL_INFO); if (0 == strncasecmp_P(XdrvMailbox.topic, PSTR(D_CMND_PID), ua_prefix_len)) { // command starts with pid_ @@ -243,8 +237,7 @@ boolean PID_Command() serviced = true; switch (command_code) { case CMND_PID_SETPV: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command setpv"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command setpv")); last_pv_update_secs = pid_current_time_secs; pid.setPv(atof(XdrvMailbox.data), last_pv_update_secs); // also trigger running the pid algorithm if we have been told to run it each pv sample @@ -255,63 +248,53 @@ boolean PID_Command() break; case CMND_PID_SETSETPOINT: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command setsetpoint"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command setsetpoint")); pid.setSp(atof(XdrvMailbox.data)); break; case CMND_PID_SETPROPBAND: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command propband"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command propband")); pid.setPb(atof(XdrvMailbox.data)); break; case CMND_PID_SETINTEGRAL_TIME: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command Ti"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command Ti")); pid.setTi(atof(XdrvMailbox.data)); break; case CMND_PID_SETDERIVATIVE_TIME: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command Td"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command Td")); pid.setTd(atof(XdrvMailbox.data)); break; case CMND_PID_SETINITIAL_INT: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command initial int"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command initial int")); pid.setInitialInt(atof(XdrvMailbox.data)); break; case CMND_PID_SETDERIV_SMOOTH_FACTOR: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command deriv smooth"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command deriv smooth")); pid.setDSmooth(atof(XdrvMailbox.data)); break; case CMND_PID_SETAUTO: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command auto"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command auto")); pid.setAuto(atoi(XdrvMailbox.data)); break; case CMND_PID_SETMANUAL_POWER: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command manual power"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command manual power")); pid.setManualPower(atof(XdrvMailbox.data)); break; case CMND_PID_SETMAX_INTERVAL: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command set max interval"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command set max interval")); max_interval = atoi(XdrvMailbox.data); pid.setMaxInterval(max_interval); break; case CMND_PID_SETUPDATE_SECS: - snprintf_P(TasmotaGlobal.log_data, sizeof(TasmotaGlobal.log_data), "PID command set update secs"); - AddLog(LOG_LEVEL_INFO); + AddLog_P(LOG_LEVEL_INFO, PSTR("PID command set update secs")); update_secs = atoi(XdrvMailbox.data) ; if (update_secs < 0) update_secs = 0; break; From d1ef1c3255247d317c193f3ea6be3fcd830433cc Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 12:31:05 +0100 Subject: [PATCH 107/255] Optimize sleepdelay after profiling --- tasmota/tasmota.ino | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 79e648200..a4c39681a 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -369,17 +369,8 @@ void SleepDelay(uint32_t mseconds) { if (mseconds) { uint32_t wait = millis() + mseconds; while (!TimeReached(wait)) { -#ifdef ESP8266 - if ((wait - millis()) > 10) { // ESP8266 does an optimistic_yield(10000) in Serial.available() -#endif - if (Serial.available()) { return; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun -#ifdef ESP8266 - } else { -#endif - delay(1); -#ifdef ESP8266 - } -#endif // ESP8266 + if (Serial.available()) { return; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun + delay(1); } } else { delay(0); From 5c92c5a9a98c94a1f73f86d82bb13c927a7f1c54 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 12:47:00 +0100 Subject: [PATCH 108/255] Optimize sleepdelay --- tasmota/tasmota.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index a4c39681a..8eb7303fb 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -368,8 +368,7 @@ void BacklogLoop(void) { void SleepDelay(uint32_t mseconds) { if (mseconds) { uint32_t wait = millis() + mseconds; - while (!TimeReached(wait)) { - if (Serial.available()) { return; } // We need to service serial buffer ASAP as otherwise we get uart buffer overrun + while (!TimeReached(wait) && !Serial.available()) { // We need to service serial buffer ASAP as otherwise we get uart buffer overrun delay(1); } } else { From e551e6c0545e8edfc7359c0cf4adf9644ada9a0a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 14:18:47 +0100 Subject: [PATCH 109/255] Prep SSD1331 fix --- .../Adafruit_SPITFT_Renderer.cpp | 2217 +++++++++++++++++ .../Adafruit_SPITFT_Renderer.h | 520 ++++ .../Adafruit_SSD1331.cpp | 190 ++ .../Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h | 76 + .../Adafruit_SSD1331-1.2.0/README.md | 24 + .../Adafruit_SSD1331-1.2.0/library.properties | 10 + .../Adafruit_SSD1331-1.2.0/license.txt | 26 + 7 files changed, 3063 insertions(+) create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/README.md create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties create mode 100644 lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp new file mode 100644 index 000000000..d49141a28 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.cpp @@ -0,0 +1,2217 @@ +/*! + * @file Adafruit_SPITFT.cpp + * + * @mainpage Adafruit SPI TFT Displays (and some others) + * + * @section intro_sec Introduction + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + + * @section dependencies Dependencies + * + * This library depends on + * Adafruit_GFX being present on your system. Please make sure you have + * installed the latest version before using this library. + * + * @section author Author + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * @section license License + * + * BSD license, all text here must be included in any redistribution. + */ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include "Adafruit_SPITFT_Renderer.h" + +#if defined(__AVR__) +#if defined(__AVR_XMEGA__) //only tested with __AVR_ATmega4809__ +#define AVR_WRITESPI(x) for(SPI0_DATA = (x); (!(SPI0_INTFLAGS & _BV(SPI_IF_bp))); ) +#else +#define AVR_WRITESPI(x) for(SPDR = (x); (!(SPSR & _BV(SPIF))); ) +#endif +#endif + +#if defined(PORT_IOBUS) +// On SAMD21, redefine digitalPinToPort() to use the slightly-faster +// PORT_IOBUS rather than PORT (not needed on SAMD51). +#undef digitalPinToPort +#define digitalPinToPort(P) (&(PORT_IOBUS->Group[g_APinDescription[P].ulPort])) +#endif // end PORT_IOBUS + +#if defined(USE_SPI_DMA) + #include + #include "wiring_private.h" // pinPeripheral() function + #include // memalign() function + #define tcNum 2 // Timer/Counter for parallel write strobe PWM + #define wrPeripheral PIO_CCL // Use CCL to invert write strobe + + // DMA transfer-in-progress indicator and callback + static volatile bool dma_busy = false; + static void dma_callback(Adafruit_ZeroDMA *dma) { + dma_busy = false; + } + + #if defined(__SAMD51__) + // Timer/counter info by index # + static const struct { + Tc *tc; // -> Timer/Counter base address + int gclk; // GCLK ID + int evu; // EVSYS user ID + } tcList[] = { + { TC0, TC0_GCLK_ID, EVSYS_ID_USER_TC0_EVU }, + { TC1, TC1_GCLK_ID, EVSYS_ID_USER_TC1_EVU }, + { TC2, TC2_GCLK_ID, EVSYS_ID_USER_TC2_EVU }, + { TC3, TC3_GCLK_ID, EVSYS_ID_USER_TC3_EVU }, + #if defined(TC4) + { TC4, TC4_GCLK_ID, EVSYS_ID_USER_TC4_EVU }, + #endif + #if defined(TC5) + { TC5, TC5_GCLK_ID, EVSYS_ID_USER_TC5_EVU }, + #endif + #if defined(TC6) + { TC6, TC6_GCLK_ID, EVSYS_ID_USER_TC6_EVU }, + #endif + #if defined(TC7) + { TC7, TC7_GCLK_ID, EVSYS_ID_USER_TC7_EVU } + #endif + }; + #define NUM_TIMERS (sizeof tcList / sizeof tcList[0]) ///< # timer/counters + #endif // end __SAMD51__ + +#endif // end USE_SPI_DMA + +// Possible values for Adafruit_SPITFT.connection: +#define TFT_HARD_SPI 0 ///< Display interface = hardware SPI +#define TFT_SOFT_SPI 1 ///< Display interface = software SPI +#define TFT_PARALLEL 2 ///< Display interface = 8- or 16-bit parallel + + +// CONSTRUCTORS ------------------------------------------------------------ + +/*! + @brief Adafruit_SPITFT constructor for software (bitbang) SPI. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param mosi Arduino pin # for bitbang SPI MOSI signal (required). + @param sck Arduino pin # for bitbang SPI SCK signal (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param miso Arduino pin # for bitbang SPI MISO signal (optional, + -1 default, many displays don't support SPI read). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t mosi, int8_t sck, int8_t rst, int8_t miso) : + Renderer(w, h), connection(TFT_SOFT_SPI), _rst(rst), _cs(cs), _dc(dc) { + swspi._sck = sck; + swspi._mosi = mosi; + swspi._miso = miso; +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + swspi.sckPinMask = digitalPinToBitMask(sck); + swspi.mosiPinMask = digitalPinToBitMask(mosi); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + swspi.sckPortSet = portSetRegister(sck); + swspi.sckPortClr = portClearRegister(sck); + swspi.mosiPortSet = portSetRegister(mosi); + swspi.mosiPortClr = portClearRegister(mosi); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if(miso >= 0) { + swspi.misoPort = portInputRegister(miso); + #if !defined(KINETISK) + swspi.misoPinMask = digitalPinToBitMask(miso); + #endif + } else { + swspi.misoPort = portInputRegister(dc); + } + #else // !CORE_TEENSY + dcPinMask =digitalPinToBitMask(dc); + swspi.sckPinMask =digitalPinToBitMask(sck); + swspi.mosiPinMask=digitalPinToBitMask(mosi); + dcPortSet =&(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr =&(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + swspi.sckPortSet =&(PORT->Group[g_APinDescription[sck].ulPort].OUTSET.reg); + swspi.sckPortClr =&(PORT->Group[g_APinDescription[sck].ulPort].OUTCLR.reg); + swspi.mosiPortSet=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTSET.reg); + swspi.mosiPortClr=&(PORT->Group[g_APinDescription[mosi].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if(miso >= 0) { + swspi.misoPinMask=digitalPinToBitMask(miso); + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); + } else { + swspi.misoPinMask=0; + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); + } + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + dcPort =(PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet =digitalPinToBitMask(dc); + swspi.sckPort =(PORTreg_t)portOutputRegister(digitalPinToPort(sck)); + swspi.sckPinMaskSet =digitalPinToBitMask(sck); + swspi.mosiPort =(PORTreg_t)portOutputRegister(digitalPinToPort(mosi)); + swspi.mosiPinMaskSet=digitalPinToBitMask(mosi); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if(miso >= 0) { + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(miso)); + swspi.misoPinMask=digitalPinToBitMask(miso); + } else { + swspi.misoPort =(PORTreg_t)portInputRegister(digitalPinToPort(dc)); + swspi.misoPinMask=0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + swspi.sckPinMaskClr = ~swspi.sckPinMaskSet; + swspi.mosiPinMaskClr = ~swspi.mosiPinMaskSet; + #endif // !end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using the board's + default SPI peripheral. + @param w Display width in pixels at default rotation setting (0). + @param h Display height in pixels at default rotation setting (0). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will + need to call subclass' begin() function, which in turn calls + this library's initSPI() function to initialize pins. +*/ +#if defined(ESP8266) // See notes below +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, + int8_t dc, int8_t rst) : Renderer(w, h), + connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { + hwspi._spi = &SPI; +} +#else // !ESP8266 +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, int8_t cs, + int8_t dc, int8_t rst) : Adafruit_SPITFT(w, h, &SPI, cs, dc, rst) { + // This just invokes the hardware SPI constructor below, + // passing the default SPI device (&SPI). +} +#endif // end !ESP8266 + +#if !defined(ESP8266) +// ESP8266 compiler freaks out at this constructor -- it can't disambiguate +// beteween the SPIClass pointer (argument #3) and a regular integer. +// Solution here it to just not offer this variant on the ESP8266. You can +// use the default hardware SPI peripheral, or you can use software SPI, +// but if there's any library out there that creates a 'virtual' SPIClass +// peripheral and drives it with software bitbanging, that's not supported. +/*! + @brief Adafruit_SPITFT constructor for hardware SPI using a specific + SPI peripheral. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param spiClass Pointer to SPIClass type (e.g. &SPI or &SPI1). + @param cs Arduino pin # for chip-select (-1 if unused, tie CS low). + @param dc Arduino pin # for data/command select (required). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized in constructor; application + typically will need to call subclass' begin() function, which + in turn calls this library's initSPI() function to initialize + pins. EXCEPT...if you have built your own SERCOM SPI peripheral + (calling the SPIClass constructor) rather than one of the + built-in SPI devices (e.g. &SPI, &SPI1 and so forth), you will + need to call the begin() function for your object as well as + pinPeripheral() for the MOSI, MISO and SCK pins to configure + GPIO manually. Do this BEFORE calling the display-specific + begin or init function. Unfortunate but unavoidable. +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + int8_t cs, int8_t dc, int8_t rst) : Renderer(w, h), + connection(TFT_HARD_SPI), _rst(rst), _cs(cs), _dc(dc) { + hwspi._spi = spiClass; +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + #else // !CORE_TEENSY + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} +#endif // end !ESP8266 + +/*! + @brief Adafruit_SPITFT constructor for parallel display connection. + @param w Display width in pixels at default rotation (0). + @param h Display height in pixels at default rotation (0). + @param busWidth If tft16 (enumeration in header file), is a 16-bit + parallel connection, else 8-bit. + 16-bit isn't fully implemented or tested yet so + applications should pass "tft8bitbus" for now...needed to + stick a required enum argument in there to + disambiguate this constructor from the soft-SPI case. + Argument is ignored on 8-bit architectures (no 'wide' + support there since PORTs are 8 bits anyway). + @param d0 Arduino pin # for data bit 0 (1+ are extrapolated). + The 8 (or 16) data bits MUST be contiguous and byte- + aligned (or word-aligned for wide interface) within + the same PORT register (might not correspond to + Arduino pin sequence). + @param wr Arduino pin # for write strobe (required). + @param dc Arduino pin # for data/command select (required). + @param cs Arduino pin # for chip-select (optional, -1 if unused, + tie CS low). + @param rst Arduino pin # for display reset (optional, display reset + can be tied to MCU reset, default of -1 means unused). + @param rd Arduino pin # for read strobe (optional, -1 if unused). + @return Adafruit_SPITFT object. + @note Output pins are not initialized; application typically will need + to call subclass' begin() function, which in turn calls this + library's initSPI() function to initialize pins. + Yes, the name is a misnomer...this library originally handled + only SPI displays, parallel being a recent addition (but not + wanting to break existing code). +*/ +Adafruit_SPITFT::Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + int8_t d0, int8_t wr, int8_t dc, int8_t cs, int8_t rst, int8_t rd) : + Renderer(w, h), connection(TFT_PARALLEL), _rst(rst), _cs(cs), _dc(dc) { + tft8._d0 = d0; + tft8._wr = wr; + tft8._rd = rd; + tft8.wide = (busWidth == tft16bitbus); +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(CORE_TEENSY) + tft8.wrPortSet = portSetRegister(wr); + tft8.wrPortClr = portClearRegister(wr); + #if !defined(KINETISK) + dcPinMask = digitalPinToBitMask(dc); + #endif + dcPortSet = portSetRegister(dc); + dcPortClr = portClearRegister(dc); + if(cs >= 0) { + #if !defined(KINETISK) + csPinMask = digitalPinToBitMask(cs); + #endif + csPortSet = portSetRegister(cs); + csPortClr = portClearRegister(cs); + } else { // see comments below + #if !defined(KINETISK) + csPinMask = 0; + #endif + csPortSet = dcPortSet; + csPortClr = dcPortClr; + } + if(rd >= 0) { // if read-strobe pin specified... + #if defined(KINETISK) + tft8.rdPinMask = 1; + #else // !KINETISK + tft8.rdPinMask = digitalPinToBitMask(rd); + #endif + tft8.rdPortSet = portSetRegister(rd); + tft8.rdPortClr = portClearRegister(rd); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = portOutputRegister(d0); + tft8.readPort = portInputRegister(d0); + tft8.dirSet = portModeRegister(d0); + tft8.dirClr = portModeRegister(d0); + #else // !CORE_TEENSY + tft8.wrPinMask = digitalPinToBitMask(wr); + tft8.wrPortSet = &(PORT->Group[g_APinDescription[wr].ulPort].OUTSET.reg); + tft8.wrPortClr = &(PORT->Group[g_APinDescription[wr].ulPort].OUTCLR.reg); + dcPinMask = digitalPinToBitMask(dc); + dcPortSet = &(PORT->Group[g_APinDescription[dc].ulPort].OUTSET.reg); + dcPortClr = &(PORT->Group[g_APinDescription[dc].ulPort].OUTCLR.reg); + if(cs >= 0) { + csPinMask = digitalPinToBitMask(cs); + csPortSet = &(PORT->Group[g_APinDescription[cs].ulPort].OUTSET.reg); + csPortClr = &(PORT->Group[g_APinDescription[cs].ulPort].OUTCLR.reg); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPortSet = dcPortSet; + csPortClr = dcPortClr; + csPinMask = 0; + } + if(rd >= 0) { // if read-strobe pin specified... + tft8.rdPinMask =digitalPinToBitMask(rd); + tft8.rdPortSet =&(PORT->Group[g_APinDescription[rd].ulPort].OUTSET.reg); + tft8.rdPortClr =&(PORT->Group[g_APinDescription[rd].ulPort].OUTCLR.reg); + } else { + tft8.rdPinMask = 0; + tft8.rdPortSet = dcPortSet; + tft8.rdPortClr = dcPortClr; + } + // Get pointers to PORT write/read/dir bytes within 32-bit PORT + uint8_t dBit = g_APinDescription[d0].ulPin; // d0 bit # in PORT + PortGroup *p = (&(PORT->Group[g_APinDescription[d0].ulPort])); + uint8_t offset = dBit / 8; // d[7:0] byte # within PORT + if(tft8.wide) offset &= ~1; // d[15:8] byte # within PORT + // These are all uint8_t* pointers -- elsewhere they're recast + // as necessary if a 'wide' 16-bit interface is in use. + tft8.writePort = (volatile uint8_t *)&(p->OUT.reg) + offset; + tft8.readPort = (volatile uint8_t *)&(p->IN.reg) + offset; + tft8.dirSet = (volatile uint8_t *)&(p->DIRSET.reg) + offset; + tft8.dirClr = (volatile uint8_t *)&(p->DIRCLR.reg) + offset; + #endif // end !CORE_TEENSY + #else // !HAS_PORT_SET_CLR + tft8.wrPort = (PORTreg_t)portOutputRegister(digitalPinToPort(wr)); + tft8.wrPinMaskSet = digitalPinToBitMask(wr); + dcPort = (PORTreg_t)portOutputRegister(digitalPinToPort(dc)); + dcPinMaskSet = digitalPinToBitMask(dc); + if(cs >= 0) { + csPort = (PORTreg_t)portOutputRegister(digitalPinToPort(cs)); + csPinMaskSet = digitalPinToBitMask(cs); + } else { + // No chip-select line defined; might be permanently tied to GND. + // Assign a valid GPIO register (though not used for CS), and an + // empty pin bitmask...the nonsense bit-twiddling might be faster + // than checking _cs and possibly branching. + csPort = dcPort; + csPinMaskSet = 0; + } + if(rd >= 0) { // if read-strobe pin specified... + tft8.rdPort =(PORTreg_t)portOutputRegister(digitalPinToPort(rd)); + tft8.rdPinMaskSet =digitalPinToBitMask(rd); + } else { + tft8.rdPort = dcPort; + tft8.rdPinMaskSet = 0; + } + csPinMaskClr = ~csPinMaskSet; + dcPinMaskClr = ~dcPinMaskSet; + tft8.wrPinMaskClr = ~tft8.wrPinMaskSet; + tft8.rdPinMaskClr = ~tft8.rdPinMaskSet; + tft8.writePort = (PORTreg_t)portOutputRegister(digitalPinToPort(d0)); + tft8.readPort = (PORTreg_t)portInputRegister(digitalPinToPort(d0)); + tft8.portDir = (PORTreg_t)portModeRegister(digitalPinToPort(d0)); + #endif // end !HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +} + +// end constructors ------- + + +// CLASS MEMBER FUNCTIONS -------------------------------------------------- + +// begin() and setAddrWindow() MUST be declared by any subclass. + +/*! + @brief Configure microcontroller pins for TFT interfacing. Typically + called by a subclass' begin() function. + @param freq SPI frequency when using hardware SPI. If default (0) + is passed, will fall back on a device-specific value. + Value is ignored when using software SPI or parallel + connection. + @param spiMode SPI mode when using hardware SPI. MUST be one of the + values SPI_MODE0, SPI_MODE1, SPI_MODE2 or SPI_MODE3 + defined in SPI.h. Do NOT attempt to pass '0' for + SPI_MODE0 and so forth...the values are NOT the same! + Use ONLY the defines! (Pity it's not an enum.) + @note Another anachronistically-named function; this is called even + when the display connection is parallel (not SPI). Also, this + could probably be made private...quite a few class functions + were generously put in the public section. +*/ +void Adafruit_SPITFT::initSPI(uint32_t freq, uint8_t spiMode) { + + if(!freq) freq = DEFAULT_SPI_FREQ; // If no freq specified, use default + + // Init basic control pins common to all connection types + if(_cs >= 0) { + pinMode(_cs, OUTPUT); + digitalWrite(_cs, HIGH); // Deselect + } + pinMode(_dc, OUTPUT); + digitalWrite(_dc, HIGH); // Data mode + + if(connection == TFT_HARD_SPI) { + +#if defined(SPI_HAS_TRANSACTION) + hwspi.settings = SPISettings(freq, MSBFIRST, spiMode); +#else + hwspi._freq = freq; // Save freq value for later +#endif + hwspi._mode = spiMode; // Save spiMode value for later + // Call hwspi._spi->begin() ONLY if this is among the 'established' + // SPI interfaces in variant.h. For DIY roll-your-own SERCOM SPIs, + // begin() and pinPeripheral() calls MUST be made in one's calling + // code, BEFORE the screen-specific begin/init function is called. + // Reason for this is that SPI::begin() makes its own calls to + // pinPeripheral() based on g_APinDescription[n].ulPinType, which + // on non-established SPI interface pins will always be PIO_DIGITAL + // or similar, while we need PIO_SERCOM or PIO_SERCOM_ALT...it's + // highly unique between devices and variants for each pin or + // SERCOM so we can't make those calls ourselves here. And the SPI + // device needs to be set up before calling this because it's + // immediately followed with initialization commands. Blargh. + if( +#if !defined(SPI_INTERFACES_COUNT) + 1 +#endif +#if SPI_INTERFACES_COUNT > 0 + (hwspi._spi == &SPI) +#endif +#if SPI_INTERFACES_COUNT > 1 + || (hwspi._spi == &SPI1) +#endif +#if SPI_INTERFACES_COUNT > 2 + || (hwspi._spi == &SPI2) +#endif +#if SPI_INTERFACES_COUNT > 3 + || (hwspi._spi == &SPI3) +#endif +#if SPI_INTERFACES_COUNT > 4 + || (hwspi._spi == &SPI4) +#endif +#if SPI_INTERFACES_COUNT > 5 + || (hwspi._spi == &SPI5) +#endif + ) { + hwspi._spi->begin(); + } + } else if(connection == TFT_SOFT_SPI) { + + pinMode(swspi._mosi, OUTPUT); + digitalWrite(swspi._mosi, LOW); + pinMode(swspi._sck, OUTPUT); + digitalWrite(swspi._sck, LOW); + if(swspi._miso >= 0) { + pinMode(swspi._miso, INPUT); + } + + } else { // TFT_PARALLEL + + // Initialize data pins. We were only passed d0, so scan + // the pin description list looking for the other pins. + // They'll be on the same PORT, and within the next 7 (or 15) bits + // (because we need to write to a contiguous PORT byte or word). +#if defined(__AVR__) + // PORT registers are 8 bits wide, so just need a register match... + for(uint8_t i=0; i= dBit ) && + (g_APinDescription[i].ulPin <= (uint32_t)lastBit)) { + pinMode(i, OUTPUT); + digitalWrite(i, LOW); + } + } + #endif // end !CORE_TEENSY +#endif + pinMode(tft8._wr, OUTPUT); + digitalWrite(tft8._wr, HIGH); + if(tft8._rd >= 0) { + pinMode(tft8._rd, OUTPUT); + digitalWrite(tft8._rd, HIGH); + } + } + + if(_rst >= 0) { + // Toggle _rst low to reset + pinMode(_rst, OUTPUT); + digitalWrite(_rst, HIGH); + delay(100); + digitalWrite(_rst, LOW); + delay(100); + digitalWrite(_rst, HIGH); + delay(200); + } + +#if defined(USE_SPI_DMA) + if(((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) && + (dma.allocate() == DMA_STATUS_OK)) { // Allocate channel + // The DMA library needs to alloc at least one valid descriptor, + // so we do that here. It's not used in the usual sense though, + // just before a transfer we copy descriptor[0] to this address. + if(dptr = dma.addDescriptor(NULL, NULL, 42, DMA_BEAT_SIZE_BYTE, + false, false)) { + // Alloc 2 scanlines worth of pixels on display's major axis, + // whichever that is, rounding each up to 2-pixel boundary. + int major = (WIDTH > HEIGHT) ? WIDTH : HEIGHT; + major += (major & 1); // -> next 2-pixel bound, if needed. + maxFillLen = major * 2; // 2 scanlines + // Note to future self: if you decide to make the pixel buffer + // much larger, remember that DMA transfer descriptors can't + // exceed 65,535 bytes (not 65,536), meaning 32,767 pixels max. + // Not that we have that kind of RAM to throw around right now. + if((pixelBuf[0] = + (uint16_t *)malloc(maxFillLen * sizeof(uint16_t)))) { + // Alloc OK. Get pointer to start of second scanline. + pixelBuf[1] = &pixelBuf[0][major]; + // Determine number of DMA descriptors needed to cover + // entire screen when entire 2-line pixelBuf is used + // (round up for fractional last descriptor). + int numDescriptors = (WIDTH * HEIGHT + (maxFillLen - 1)) / + maxFillLen; + // DMA descriptors MUST be 128-bit (16 byte) aligned. + // memalign() is considered obsolete but it's replacements + // (aligned_alloc() or posix_memalign()) are not currently + // available in the version of ARM GCC in use, but this + // is, so here we are. + if((descriptor = (DmacDescriptor *)memalign(16, + numDescriptors * sizeof(DmacDescriptor)))) { + int dmac_id; + volatile uint32_t *data_reg; + + if(connection == TFT_HARD_SPI) { + // THIS IS AN AFFRONT TO NATURE, but I don't know + // any "clean" way to get the sercom number from the + // the SPIClass pointer (e.g. &SPI or &SPI1), which + // is all we have to work with. SPIClass does contain + // a SERCOM pointer but it is a PRIVATE member! + // Doing an UNSPEAKABLY HORRIBLE THING here, directly + // accessing the first 32-bit value in the SPIClass + // structure, knowing that's (currently) where the + // SERCOM pointer lives, but this ENTIRELY DEPENDS on + // that structure not changing nor the compiler + // rearranging things. Oh the humanity! + + if(*(SERCOM **)hwspi._spi == &sercom0) { + dmac_id = SERCOM0_DMAC_ID_TX; + data_reg = &SERCOM0->SPI.DATA.reg; +#if defined SERCOM1 + } else if(*(SERCOM **)hwspi._spi == &sercom1) { + dmac_id = SERCOM1_DMAC_ID_TX; + data_reg = &SERCOM1->SPI.DATA.reg; +#endif +#if defined SERCOM2 + } else if(*(SERCOM **)hwspi._spi == &sercom2) { + dmac_id = SERCOM2_DMAC_ID_TX; + data_reg = &SERCOM2->SPI.DATA.reg; +#endif +#if defined SERCOM3 + } else if(*(SERCOM **)hwspi._spi == &sercom3) { + dmac_id = SERCOM3_DMAC_ID_TX; + data_reg = &SERCOM3->SPI.DATA.reg; +#endif +#if defined SERCOM4 + } else if(*(SERCOM **)hwspi._spi == &sercom4) { + dmac_id = SERCOM4_DMAC_ID_TX; + data_reg = &SERCOM4->SPI.DATA.reg; +#endif +#if defined SERCOM5 + } else if(*(SERCOM **)hwspi._spi == &sercom5) { + dmac_id = SERCOM5_DMAC_ID_TX; + data_reg = &SERCOM5->SPI.DATA.reg; +#endif +#if defined SERCOM6 + } else if(*(SERCOM **)hwspi._spi == &sercom6) { + dmac_id = SERCOM6_DMAC_ID_TX; + data_reg = &SERCOM6->SPI.DATA.reg; +#endif +#if defined SERCOM7 + } else if(*(SERCOM **)hwspi._spi == &sercom7) { + dmac_id = SERCOM7_DMAC_ID_TX; + data_reg = &SERCOM7->SPI.DATA.reg; +#endif + } + dma.setPriority(DMA_PRIORITY_3); + dma.setTrigger(dmac_id); + dma.setAction(DMA_TRIGGER_ACTON_BEAT); + + // Initialize descriptor list. + for(int d=0; dChannel[dmaChannel].CHEVCTRL.bit.EVOE = 1; + DMAC->Channel[dmaChannel].CHEVCTRL.bit.EVOMODE = 0; + + // CONFIGURE TIMER/COUNTER (for write strobe) + + Tc *timer = tcList[tcNum].tc; // -> Timer struct + int id = tcList[tcNum].gclk; // Timer GCLK ID + GCLK_PCHCTRL_Type pchctrl; + + // Set up timer clock source from GCLK + GCLK->PCHCTRL[id].bit.CHEN = 0; // Stop timer + while(GCLK->PCHCTRL[id].bit.CHEN); // Wait for it + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Enable + GCLK->PCHCTRL[id].reg = pchctrl.reg; + while(!GCLK->PCHCTRL[id].bit.CHEN); // Wait for it + + // Disable timer/counter before configuring it + timer->COUNT8.CTRLA.bit.ENABLE = 0; + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + + timer->COUNT8.WAVE.bit.WAVEGEN = 2; // NPWM + timer->COUNT8.CTRLA.bit.MODE = 1; // 8-bit + timer->COUNT8.CTRLA.bit.PRESCALER = 0; // 1:1 + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + + timer->COUNT8.CTRLBCLR.bit.DIR = 1; // Count UP + while(timer->COUNT8.SYNCBUSY.bit.CTRLB); + timer->COUNT8.CTRLBSET.bit.ONESHOT = 1; // One-shot + while(timer->COUNT8.SYNCBUSY.bit.CTRLB); + timer->COUNT8.PER.reg = 6; // PWM top + while(timer->COUNT8.SYNCBUSY.bit.PER); + timer->COUNT8.CC[0].reg = 2; // Compare + while(timer->COUNT8.SYNCBUSY.bit.CC0); + // Enable async input events, + // event action = restart. + timer->COUNT8.EVCTRL.bit.TCEI = 1; + timer->COUNT8.EVCTRL.bit.EVACT = 1; + + // Enable timer + timer->COUNT8.CTRLA.reg |= TC_CTRLA_ENABLE; + while(timer->COUNT8.SYNCBUSY.bit.STATUS); + +#if(wrPeripheral == PIO_CCL) + // CONFIGURE CCL (inverts timer/counter output) + + MCLK->APBCMASK.bit.CCL_ = 1; // Enable CCL clock + CCL->CTRL.bit.ENABLE = 0; // Disable to config + CCL->CTRL.bit.SWRST = 1; // Reset CCL registers + CCL->LUTCTRL[tcNum].bit.ENABLE = 0; // Disable LUT + CCL->LUTCTRL[tcNum].bit.FILTSEL = 0; // No filter + CCL->LUTCTRL[tcNum].bit.INSEL0 = 6; // TC input + CCL->LUTCTRL[tcNum].bit.INSEL1 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.INSEL2 = 0; // MASK + CCL->LUTCTRL[tcNum].bit.TRUTH = 1; // Invert in 0 + CCL->LUTCTRL[tcNum].bit.ENABLE = 1; // Enable LUT + CCL->CTRL.bit.ENABLE = 1; // Enable CCL +#endif + + // CONFIGURE EVENT SYSTEM + + // Set up event system clock source from GCLK... + // Disable EVSYS, wait for disable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN = 0; + while(GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); + pchctrl.bit.GEN = GCLK_PCHCTRL_GEN_GCLK0_Val; + pchctrl.bit.CHEN = 1; // Re-enable + GCLK->PCHCTRL[EVSYS_GCLK_ID_0].reg = pchctrl.reg; + // Wait for it, then enable EVSYS clock + while(!GCLK->PCHCTRL[EVSYS_GCLK_ID_0].bit.CHEN); + MCLK->APBBMASK.bit.EVSYS_ = 1; + + // Connect Timer EVU to ch 0 + EVSYS->USER[tcList[tcNum].evu].reg = 1; + // Datasheet recommends single write operation; + // reg instead of bit. Also datasheet: PATH bits + // must be zero when using async! + EVSYS_CHANNEL_Type ev; + ev.reg = 0; + ev.bit.PATH = 2; // Asynchronous + ev.bit.EVGEN = 0x22 + dmaChannel; // DMA channel 0+ + EVSYS->Channel[0].CHANNEL.reg = ev.reg; + + // Initialize descriptor list. + for(int d=0; d= 0) SPI_CS_LOW(); +} + +/*! + @brief Call after issuing command(s) or data to display. Performs + chip-deselect (if required) and ends an SPI transaction (if + using hardware SPI and transactions are supported). Required + for all display types; not an SPI-specific function. +*/ +void Adafruit_SPITFT::endWrite(void) { + if(_cs >= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + + +// ------------------------------------------------------------------------- +// Lower-level graphics operations. These functions require a chip-select +// and/or SPI transaction around them (via startWrite(), endWrite() above). +// Higher-level graphics primitives might start a single transaction and +// then make multiple calls to these functions (e.g. circle or text +// rendering might make repeated lines or rects) before ending the +// transaction. It's more efficient than starting a transaction every time. + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Not self-contained; should follow a startWrite() call. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::writePixel(int16_t x, int16_t y, uint16_t color) { + if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + } +} + +/*! + @brief Issue a series of pixels from memory to the display. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param colors Pointer to array of 16-bit pixel values in '565' RGB + format. + @param len Number of elements in 'colors' array. + @param block If true (default case if unspecified), function blocks + until DMA transfer is complete. This is simply IGNORED + if DMA is not enabled. If false, the function returns + immediately after the last DMA transfer is started, + and one should use the dmaWait() function before + doing ANY other display-related activities (or even + any SPI-related activities, if using an SPI display + that shares the bus with other devices). + @param bigEndian If using DMA, and if set true, bitmap in memory is in + big-endian order (most significant byte first). By + default this is false, as most microcontrollers seem + to be little-endian and 16-bit pixel values must be + byte-swapped before issuing to the display (which tend + to be big-endian when using SPI or 8-bit parallel). + If an application can optimize around this -- for + example, a bitmap in a uint16_t array having the byte + values already reordered big-endian, this can save + some processing time here, ESPECIALLY if using this + function's non-blocking DMA mode. Not all cases are + covered...this is really here only for SAMD DMA and + much forethought on the application side. +*/ +void Adafruit_SPITFT::writePixels(uint16_t *colors, uint32_t len, + bool block, bool bigEndian) { + + if(!len) return; // Avoid 0-byte transfers + +#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... + if(connection == TFT_HARD_SPI) { + hwspi._spi->writePixels(colors, len * 2); + return; + } +#elif defined(USE_SPI_DMA) + if((connection == TFT_HARD_SPI) || (connection == TFT_PARALLEL)) { + int maxSpan = maxFillLen / 2; // One scanline max + uint8_t pixelBufIdx = 0; // Active pixel buffer number + #if defined(__SAMD51__) + if(connection == TFT_PARALLEL) { + // Switch WR pin to PWM or CCL + pinPeripheral(tft8._wr, wrPeripheral); + } + #endif // end __SAMD51__ + if(!bigEndian) { // Normal little-endian situation... + while(len) { + int count = (len < maxSpan) ? len : maxSpan; + + // Because TFT and SAMD endianisms are different, must swap + // bytes from the 'colors' array passed into a DMA working + // buffer. This can take place while the prior DMA transfer + // is in progress, hence the need for two pixelBufs. + for(int i=0; isetDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ || _SAMD21_ + } + return; + } +#endif // end USE_SPI_DMA + + // All other cases (bitbang SPI or non-DMA hard SPI or parallel), + // use a loop with the normal 16-bit data write function: + while(len--) { + SPI_WRITE16(*colors++); + } +} + +/*! + @brief Wait for the last DMA transfer in a prior non-blocking + writePixels() call to complete. This does nothing if DMA + is not enabled, and is not needed if blocking writePixels() + was used (as is the default case). +*/ +void Adafruit_SPITFT::dmaWait(void) { +#if defined(USE_SPI_DMA) + while(dma_busy); + #if defined(__SAMD51__) || defined(_SAMD21_) + if(connection == TFT_HARD_SPI) { + // See SAMD51/21 note in writeColor() + hwspi._spi->setDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ || _SAMD21_ +#endif +} + +/*! + @brief Issue a series of pixels, all the same color. Not self- + contained; should follow startWrite() and setAddrWindow() calls. + @param color 16-bit pixel color in '565' RGB format. + @param len Number of pixels to draw. +*/ +void Adafruit_SPITFT::writeColor(uint16_t color, uint32_t len) { + + if(!len) return; // Avoid 0-byte transfers + + uint8_t hi = color >> 8, lo = color; + +#if defined(ESP32) // ESP32 has a special SPI pixel-writing function... + if(connection == TFT_HARD_SPI) { + #define SPI_MAX_PIXELS_AT_ONCE 32 + #define TMPBUF_LONGWORDS (SPI_MAX_PIXELS_AT_ONCE + 1) / 2 + #define TMPBUF_PIXELS (TMPBUF_LONGWORDS * 2) + static uint32_t temp[TMPBUF_LONGWORDS]; + uint32_t c32 = color * 0x00010001; + uint16_t bufLen = (len < TMPBUF_PIXELS) ? len : TMPBUF_PIXELS, + xferLen, fillLen; + // Fill temp buffer 32 bits at a time + fillLen = (bufLen + 1) / 2; // Round up to next 32-bit boundary + for(uint32_t t=0; t= 16)) { // Don't bother with DMA on short pixel runs + int i, d, numDescriptors; + if(hi == lo) { // If high & low bytes are same... + onePixelBuf = color; + // Can do this with a relatively short descriptor list, + // each transferring a max of 32,767 (not 32,768) pixels. + // This won't run off the end of the allocated descriptor list, + // since we're using much larger chunks per descriptor here. + numDescriptors = (len + 32766) / 32767; + for(d=0; d lastFillLen) { + int fillStart = lastFillLen / 2, + fillEnd = (((len < maxFillLen) ? + len : maxFillLen) + 1) / 2; + for(i=fillStart; isetDataMode(hwspi._mode); + } else { + pinPeripheral(tft8._wr, PIO_OUTPUT); // Switch WR back to GPIO + } + #endif // end __SAMD51__ + return; + } + #endif // end USE_SPI_DMA +#endif // end !ESP32 + + // All other cases (non-DMA hard SPI, bitbang SPI, parallel)... + + if(connection == TFT_HARD_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if(pixelsThisPass > 50000) pixelsThisPass = 50000; + len -= pixelsThisPass; + yield(); // Periodic yield() on long fills + while(pixelsThisPass--) { + hwspi._spi->write(hi); + hwspi._spi->write(lo); + } + } while(len); +#else // !ESP8266 + while(len--) { + #if defined(__AVR__) + AVR_WRITESPI(hi); + AVR_WRITESPI(lo); + #elif defined(ESP32) + hwspi._spi->write(hi); + hwspi._spi->write(lo); + #else + hwspi._spi->transfer(hi); + hwspi._spi->transfer(lo); + #endif + } +#endif // end !ESP8266 + } else if(connection == TFT_SOFT_SPI) { +#if defined(ESP8266) + do { + uint32_t pixelsThisPass = len; + if(pixelsThisPass > 20000) pixelsThisPass = 20000; + len -= pixelsThisPass; + yield(); // Periodic yield() on long fills + while(pixelsThisPass--) { + for(uint16_t bit=0, x=color; bit<16; bit++) { + if(x & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + } + } while(len); +#else // !ESP8266 + while(len--) { + #if defined(__AVR__) + for(uint8_t bit=0, x=hi; bit<8; bit++) { + if(x & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + for(uint8_t bit=0, x=lo; bit<8; bit++) { + if(x & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + x <<= 1; + } + #else // !__AVR__ + for(uint16_t bit=0, x=color; bit<16; bit++) { + if(x & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + x <<= 1; + SPI_SCK_LOW(); + } + #endif // end !__AVR__ + } +#endif // end !ESP8266 + } else { // PARALLEL + if(hi == lo) { +#if defined(__AVR__) + len *= 2; + *tft8.writePort = hi; + while(len--) { + TFT_WR_STROBE(); + } +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + len *= 2; + *tft8.writePort = hi; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } + while(len--) { + TFT_WR_STROBE(); + } +#endif + } else { + while(len--) { +#if defined(__AVR__) + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = hi; + TFT_WR_STROBE(); + *tft8.writePort = lo; + } else { + *(volatile uint16_t *)tft8.writePort = color; + } +#endif + TFT_WR_STROBE(); + } + } + } +} + +/*! + @brief Draw a filled rectangle to the display. Not self-contained; + should follow startWrite(). Typically used by higher-level + graphics primitives; user code shouldn't need to call this and + is likely to use the self-contained fillRect() instead. + writeFillRect() performs its own edge clipping and rejection; + see writeFillRectPreclipped() for a more 'raw' implementation. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note Written in this deep-nested way because C by definition will + optimize for the 'if' case, not the 'else' -- avoids branches + and rejects clipped rectangles at the least-work possibility. +*/ +void Adafruit_SPITFT::writeFillRect(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color) { + if(w && h) { // Nonzero width and height? + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(x2 >= _width) { w = _width - x; } // Clip right + if(y2 >= _height) { h = _height - y; } // Clip bottom + writeFillRectPreclipped(x, y, w, h, color); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Performs edge clipping + and rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastHLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(x2 >= _width) { w = _width - x; } // Clip right + writeFillRectPreclipped(x, y, w, 1, color); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Performs edge clipping and + rejection. Not self-contained; should follow startWrite(). + Typically used by higher-level graphics primitives; user code + shouldn't need to call this and is likely to use the self- + contained drawFastVLine() instead. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. +*/ +void inline Adafruit_SPITFT::writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(y2 >= _height) { h = _height - y; } // Clip bottom + writeFillRectPreclipped(x, y, 1, h, color); + } + } + } +} + +/*! + @brief A lower-level version of writeFillRect(). This version requires + all inputs are in-bounds, that width and height are positive, + and no part extends offscreen. NO EDGE CLIPPING OR REJECTION IS + PERFORMED. If higher-level graphics primitives are written to + handle their own clipping earlier in the drawing process, this + can avoid unnecessary function calls and repeated clipping + operations in the lower-level functions. + @param x Horizontal position of first corner. MUST BE WITHIN + SCREEN BOUNDS. + @param y Vertical position of first corner. MUST BE WITHIN SCREEN + BOUNDS. + @param w Rectangle width in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param h Rectangle height in pixels. MUST BE POSITIVE AND NOT + EXTEND OFF SCREEN. + @param color 16-bit fill color in '565' RGB format. + @note This is a new function, no graphics primitives besides rects + and horizontal/vertical lines are written to best use this yet. +*/ +inline void Adafruit_SPITFT::writeFillRectPreclipped(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color) { + setAddrWindow(x, y, w, h); + writeColor(color, (uint32_t)w * h); +} + + +// ------------------------------------------------------------------------- +// Ever-so-slightly higher-level graphics operations. Similar to the 'write' +// functions above, but these contain their own chip-select and SPI +// transactions as needed (via startWrite(), endWrite()). They're typically +// used solo -- as graphics primitives in themselves, not invoked by higher- +// level primitives (which should use the functions above for better +// performance). + +/*! + @brief Draw a single pixel to the display at requested coordinates. + Self-contained and provides its own transaction as needed + (see writePixel(x,y,color) for a lower-level variant). + Edge clipping is performed here. + @param x Horizontal position (0 = left). + @param y Vertical position (0 = top). + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::drawPixel(int16_t x, int16_t y, uint16_t color) { + // Clip first... + if((x >= 0) && (x < _width) && (y >= 0) && (y < _height)) { + // THEN set up transaction (if needed) and draw... + startWrite(); + setAddrWindow(x, y, 1, 1); + SPI_WRITE16(color); + endWrite(); + } +} + +/*! + @brief Draw a filled rectangle to the display. Self-contained and + provides its own transaction as needed (see writeFillRect() or + writeFillRectPreclipped() for lower-level variants). Edge + clipping and rejection is performed here. + @param x Horizontal position of first corner. + @param y Vertical position of first corner. + @param w Rectangle width in pixels (positive = right of first + corner, negative = left of first corner). + @param h Rectangle height in pixels (positive = below first + corner, negative = above first corner). + @param color 16-bit fill color in '565' RGB format. + @note This repeats the writeFillRect() function almost in its entirety, + with the addition of a transaction start/end. It's done this way + (rather than starting the transaction and calling writeFillRect() + to handle clipping and so forth) so that the transaction isn't + performed at all if the rectangle is rejected. It's really not + that much code. +*/ +void Adafruit_SPITFT::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color) { + if(w && h) { // Nonzero width and height? + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Rectangle partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(x2 >= _width) { w = _width - x; } // Clip right + if(y2 >= _height) { h = _height - y; } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, w, h, color); + endWrite(); + } + } + } + } + } +} + +/*! + @brief Draw a horizontal line on the display. Self-contained and + provides its own transaction as needed (see writeFastHLine() for + a lower-level variant). Edge clipping and rejection is performed + here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param w Line width in pixels (positive = right of first point, + negative = point of first corner). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastHLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastHLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color) { + if((y >= 0) && (y < _height) && w) { // Y on screen, nonzero width + if(w < 0) { // If negative width... + x += w + 1; // Move X to left edge + w = -w; // Use positive width + } + if(x < _width) { // Not off right + int16_t x2 = x + w - 1; + if(x2 >= 0) { // Not off left + // Line partly or fully overlaps screen + if(x < 0) { x = 0; w = x2 + 1; } // Clip left + if(x2 >= _width) { w = _width - x; } // Clip right + startWrite(); + writeFillRectPreclipped(x, y, w, 1, color); + endWrite(); + } + } + } +} + +/*! + @brief Draw a vertical line on the display. Self-contained and provides + its own transaction as needed (see writeFastHLine() for a lower- + level variant). Edge clipping and rejection is performed here. + @param x Horizontal position of first point. + @param y Vertical position of first point. + @param h Line height in pixels (positive = below first point, + negative = above first point). + @param color 16-bit line color in '565' RGB format. + @note This repeats the writeFastVLine() function almost in its + entirety, with the addition of a transaction start/end. It's + done this way (rather than starting the transaction and calling + writeFastVLine() to handle clipping and so forth) so that the + transaction isn't performed at all if the line is rejected. +*/ +void Adafruit_SPITFT::drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color) { + if((x >= 0) && (x < _width) && h) { // X on screen, nonzero height + if(h < 0) { // If negative height... + y += h + 1; // Move Y to top edge + h = -h; // Use positive height + } + if(y < _height) { // Not off bottom + int16_t y2 = y + h - 1; + if(y2 >= 0) { // Not off top + // Line partly or fully overlaps screen + if(y < 0) { y = 0; h = y2 + 1; } // Clip top + if(y2 >= _height) { h = _height - y; } // Clip bottom + startWrite(); + writeFillRectPreclipped(x, y, 1, h, color); + endWrite(); + } + } + } +} + +/*! + @brief Essentially writePixel() with a transaction around it. I don't + think this is in use by any of our code anymore (believe it was + for some older BMP-reading examples), but is kept here in case + any user code relies on it. Consider it DEPRECATED. + @param color 16-bit pixel color in '565' RGB format. +*/ +void Adafruit_SPITFT::pushColor(uint16_t color) { + startWrite(); + SPI_WRITE16(color); + endWrite(); +} + +/*! + @brief Draw a 16-bit image (565 RGB) at the specified (x,y) position. + For 16-bit display devices; no color reduction performed. + Adapted from https://github.com/PaulStoffregen/ILI9341_t3 + by Marc MERLIN. See examples/pictureEmbed to use this. + 5/6/2017: function name and arguments have changed for + compatibility with current GFX library and to avoid naming + problems in prior implementation. Formerly drawBitmap() with + arguments in different order. Handles its own transaction and + edge clipping/rejection. + @param x Top left corner horizontal coordinate. + @param y Top left corner vertical coordinate. + @param pcolors Pointer to 16-bit array of pixel values. + @param w Width of bitmap in pixels. + @param h Height of bitmap in pixels. +*/ +void Adafruit_SPITFT::drawRGBBitmap(int16_t x, int16_t y, + uint16_t *pcolors, int16_t w, int16_t h) { + + int16_t x2, y2; // Lower-right coord + if(( x >= _width ) || // Off-edge right + ( y >= _height) || // " top + ((x2 = (x+w-1)) < 0 ) || // " left + ((y2 = (y+h-1)) < 0) ) return; // " bottom + + int16_t bx1=0, by1=0, // Clipped top-left within bitmap + saveW=w; // Save original bitmap width value + if(x < 0) { // Clip left + w += x; + bx1 = -x; + x = 0; + } + if(y < 0) { // Clip top + h += y; + by1 = -y; + y = 0; + } + if(x2 >= _width ) w = _width - x; // Clip right + if(y2 >= _height) h = _height - y; // Clip bottom + + pcolors += by1 * saveW + bx1; // Offset bitmap ptr to clipped top-left + startWrite(); + setAddrWindow(x, y, w, h); // Clipped area + while(h--) { // For each (clipped) scanline... + writePixels(pcolors, w); // Push one (clipped) row + pcolors += saveW; // Advance pointer by one full (unclipped) line + } + endWrite(); +} + + +// ------------------------------------------------------------------------- +// Miscellaneous class member functions that don't draw anything. + +/*! + @brief Invert the colors of the display (if supported by hardware). + Self-contained, no transaction setup required. + @param i true = inverted display, false = normal display. +*/ +void Adafruit_SPITFT::invertDisplay(bool i) { + startWrite(); + writeCommand(i ? invertOnCommand : invertOffCommand); + endWrite(); +} + +/*! + @brief Given 8-bit red, green and blue values, return a 'packed' + 16-bit color value in '565' RGB format (5 bits red, 6 bits + green, 5 bits blue). This is just a mathematical operation, + no hardware is touched. + @param red 8-bit red brightnesss (0 = off, 255 = max). + @param green 8-bit green brightnesss (0 = off, 255 = max). + @param blue 8-bit blue brightnesss (0 = off, 255 = max). + @return 'Packed' 16-bit color value (565 format). +*/ +uint16_t Adafruit_SPITFT::color565(uint8_t red, uint8_t green, uint8_t blue) { + return ((red & 0xF8) << 8) | ((green & 0xFC) << 3) | (blue >> 3); +} + +/*! + @brief Adafruit_SPITFT Send Command handles complete sending of commands and data + @param commandByte The Command Byte + @param dataBytes A pointer to the Data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, uint8_t *dataBytes, uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if(_cs >= 0) SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i=0; i= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Adafruit_SPITFT Send Command handles complete sending of commands and const data + @param commandByte The Command Byte + @param dataBytes A pointer to the Data bytes to send + @param numDataBytes The number of bytes we should send + */ +void Adafruit_SPITFT::sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes) { + SPI_BEGIN_TRANSACTION(); + if(_cs >= 0) SPI_CS_LOW(); + + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); // Send the command byte + + SPI_DC_HIGH(); + for (int i=0; i= 0) SPI_CS_HIGH(); + SPI_END_TRANSACTION(); +} + +/*! + @brief Read 8 bits of data from display configuration memory (not RAM). + This is highly undocumented/supported and should be avoided, + function is only included because some of the examples use it. + @param commandByte + The command register to read data from. + @param index + The byte index into the command to read from. + @return Unsigned 8-bit data read from display register. + */ +/**************************************************************************/ +uint8_t Adafruit_SPITFT::readcommand8(uint8_t commandByte, uint8_t index) { + uint8_t result; + startWrite(); + SPI_DC_LOW(); // Command mode + spiWrite(commandByte); + SPI_DC_HIGH(); // Data mode + do { + result = spiRead(); + } while(index--); // Discard bytes up to index'th + endWrite(); + return result; +} + +// ------------------------------------------------------------------------- +// Lowest-level hardware-interfacing functions. Many of these are inline and +// compile to different things based on #defines -- typically just a few +// instructions. Others, not so much, those are not inlined. + +/*! + @brief Start an SPI transaction if using the hardware SPI interface to + the display. If using an earlier version of the Arduino platform + (before the addition of SPI transactions), this instead attempts + to set up the SPI clock and mode. No action is taken if the + connection is not hardware SPI-based. This does NOT include a + chip-select operation -- see startWrite() for a function that + encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_BEGIN_TRANSACTION(void) { + if(connection == TFT_HARD_SPI) { +#if defined(SPI_HAS_TRANSACTION) + hwspi._spi->beginTransaction(hwspi.settings); +#else // No transactions, configure SPI manually... + #if defined(__AVR__) || defined(TEENSYDUINO) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClockDivider(SPI_CLOCK_DIV2); + #elif defined(__arm__) + hwspi._spi->setClockDivider(11); + #elif defined(ESP8266) || defined(ESP32) + hwspi._spi->setFrequency(hwspi._freq); + #elif defined(RASPI) || defined(ARDUINO_ARCH_STM32F1) + hwspi._spi->setClock(hwspi._freq); + #endif + hwspi._spi->setBitOrder(MSBFIRST); + hwspi._spi->setDataMode(hwspi._mode); +#endif // end !SPI_HAS_TRANSACTION + } +} + +/*! + @brief End an SPI transaction if using the hardware SPI interface to + the display. No action is taken if the connection is not + hardware SPI-based or if using an earlier version of the Arduino + platform (before the addition of SPI transactions). This does + NOT include a chip-deselect operation -- see endWrite() for a + function that encapsulated both actions. +*/ +inline void Adafruit_SPITFT::SPI_END_TRANSACTION(void) { +#if defined(SPI_HAS_TRANSACTION) + if(connection == TFT_HARD_SPI) { + hwspi._spi->endTransaction(); + } +#endif +} + +/*! + @brief Issue a single 8-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the byte. This is another of + those functions in the library with a now-not-accurate name + that's being maintained for compatibility with outside code. + This function is used even if display connection is parallel. + @param b 8-bit value to write. +*/ +void Adafruit_SPITFT::spiWrite(uint8_t b) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(b); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write(b); +#else + hwspi._spi->transfer(b); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<8; bit++) { + if(b & 0x80) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + b <<= 1; + SPI_SCK_LOW(); + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = b; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) *tft8.writePort = b; + else *(volatile uint16_t *)tft8.writePort = b; +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Write a single command byte to the display. Chip-select and + transaction must have been previously set -- this ONLY sets + the device to COMMAND mode, issues the byte and then restores + DATA mode. There is no corresponding explicit writeData() + function -- just use spiWrite(). + @param cmd 8-bit command to write. +*/ +void Adafruit_SPITFT::writeCommand(uint8_t cmd) { + SPI_DC_LOW(); + spiWrite(cmd); + SPI_DC_HIGH(); +} + +/*! + @brief Read a single 8-bit value from the display. Chip-select and + transaction must have been previously set -- this ONLY reads + the byte. This is another of those functions in the library + with a now-not-accurate name that's being maintained for + compatibility with outside code. This function is used even if + display connection is parallel. + @return Unsigned 8-bit value read (always zero if USE_FAST_PINIO is + not supported by the MCU architecture). +*/ +uint8_t Adafruit_SPITFT::spiRead(void) { + uint8_t b = 0; + uint16_t w = 0; + if(connection == TFT_HARD_SPI) { + return hwspi._spi->transfer((uint8_t)0); + } else if(connection == TFT_SOFT_SPI) { + if(swspi._miso >= 0) { + for(uint8_t i=0; i<8; i++) { + SPI_SCK_HIGH(); + b <<= 1; + if(SPI_MISO_READ()) b++; + SPI_SCK_LOW(); + } + } + return b; + } else { // TFT_PARALLEL + if(tft8._rd >= 0) { +#if defined(USE_FAST_PINIO) + TFT_RD_LOW(); // Read line LOW + #if defined(__AVR__) + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output + #else // !__AVR__ + if(!tft8.wide) { // 8-bit TFT connection + #if defined(HAS_PORT_SET_CLR) + *tft8.dirClr = 0xFF; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.dirSet = 0xFF; // Restore port to output + #else // !HAS_PORT_SET_CLR + *tft8.portDir = 0x00; // Set port to input state + w = *tft8.readPort; // Read value from port + *tft8.portDir = 0xFF; // Restore port to output + #endif // end HAS_PORT_SET_CLR + } else { // 16-bit TFT connection + #if defined(HAS_PORT_SET_CLR) + *(volatile uint16_t *)tft8.dirClr = 0xFFFF; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.dirSet = 0xFFFF; // Output state + #else // !HAS_PORT_SET_CLR + *(volatile uint16_t *)tft8.portDir = 0x0000; // Input state + w = *(volatile uint16_t *)tft8.readPort; // 16-bit read + *(volatile uint16_t *)tft8.portDir = 0xFFFF; // Output state + #endif // end !HAS_PORT_SET_CLR + } + TFT_RD_HIGH(); // Read line HIGH + #endif // end !__AVR__ +#else // !USE_FAST_PINIO + w = 0; // Parallel TFT is NOT SUPPORTED without USE_FAST_PINIO +#endif // end !USE_FAST_PINIO + } + return w; + } +} + +/*! + @brief Set the software (bitbang) SPI MOSI line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.mosiPortSet = 1; + #else // !KINETISK + *swspi.mosiPortSet = swspi.mosiPinMask; + #endif + #else // !HAS_PORT_SET_CLR + *swspi.mosiPort |= swspi.mosiPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, HIGH); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI MOSI line LOW. +*/ +inline void Adafruit_SPITFT::SPI_MOSI_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.mosiPortClr = 1; + #else // !KINETISK + *swspi.mosiPortClr = swspi.mosiPinMask; + #endif + #else // !HAS_PORT_SET_CLR + *swspi.mosiPort &= swspi.mosiPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._mosi, LOW); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line HIGH. +*/ +inline void Adafruit_SPITFT::SPI_SCK_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.sckPortSet = 1; + #else // !KINETISK + *swspi.sckPortSet = swspi.sckPinMask; + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + for(volatile uint8_t i=0; i<1; i++); + #endif + #endif + #else // !HAS_PORT_SET_CLR + *swspi.sckPort |= swspi.sckPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, HIGH); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the software (bitbang) SPI SCK line LOW. +*/ +inline void Adafruit_SPITFT::SPI_SCK_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *swspi.sckPortClr = 1; + #else // !KINETISK + *swspi.sckPortClr = swspi.sckPinMask; + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + for(volatile uint8_t i=0; i<1; i++); + #endif + #endif + #else // !HAS_PORT_SET_CLR + *swspi.sckPort &= swspi.sckPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(swspi._sck, LOW); + #if defined(ESP32) + for(volatile uint8_t i=0; i<1; i++); + #endif // end ESP32 +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Read the state of the software (bitbang) SPI MISO line. + @return true if HIGH, false if LOW. +*/ +inline bool Adafruit_SPITFT::SPI_MISO_READ(void) { +#if defined(USE_FAST_PINIO) + #if defined(KINETISK) + return *swspi.misoPort; + #else // !KINETISK + return *swspi.misoPort & swspi.misoPinMask; + #endif // end !KINETISK +#else // !USE_FAST_PINIO + return digitalRead(swspi._miso); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Issue a single 16-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the word. Despite the name, + this function is used even if display connection is parallel; + name was maintaned for backward compatibility. Naming is also + not consistent with the 8-bit version, spiWrite(). Sorry about + that. Again, staying compatible with outside code. + @param w 16-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE16(uint16_t w) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(w >> 8); + AVR_WRITESPI(w); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write16(w); +#else + hwspi._spi->transfer(w >> 8); + hwspi._spi->transfer(w); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<16; bit++) { + if(w & 0x8000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + w <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = w >> 8; + TFT_WR_STROBE(); + *tft8.writePort = w; + } else { + *(volatile uint16_t *)tft8.writePort = w; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Issue a single 32-bit value to the display. Chip-select, + transaction and data/command selection must have been + previously set -- this ONLY issues the longword. Despite the + name, this function is used even if display connection is + parallel; name was maintaned for backward compatibility. Naming + is also not consistent with the 8-bit version, spiWrite(). + Sorry about that. Again, staying compatible with outside code. + @param l 32-bit value to write. +*/ +void Adafruit_SPITFT::SPI_WRITE32(uint32_t l) { + if(connection == TFT_HARD_SPI) { +#if defined(__AVR__) + AVR_WRITESPI(l >> 24); + AVR_WRITESPI(l >> 16); + AVR_WRITESPI(l >> 8); + AVR_WRITESPI(l ); +#elif defined(ESP8266) || defined(ESP32) + hwspi._spi->write32(l); +#else + hwspi._spi->transfer(l >> 24); + hwspi._spi->transfer(l >> 16); + hwspi._spi->transfer(l >> 8); + hwspi._spi->transfer(l); +#endif + } else if(connection == TFT_SOFT_SPI) { + for(uint8_t bit=0; bit<32; bit++) { + if(l & 0x80000000) SPI_MOSI_HIGH(); + else SPI_MOSI_LOW(); + SPI_SCK_HIGH(); + SPI_SCK_LOW(); + l <<= 1; + } + } else { // TFT_PARALLEL +#if defined(__AVR__) + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; +#elif defined(USE_FAST_PINIO) + if(!tft8.wide) { + *tft8.writePort = l >> 24; + TFT_WR_STROBE(); + *tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *tft8.writePort = l >> 8; + TFT_WR_STROBE(); + *tft8.writePort = l; + } else { + *(volatile uint16_t *)tft8.writePort = l >> 16; + TFT_WR_STROBE(); + *(volatile uint16_t *)tft8.writePort = l; + } +#endif + TFT_WR_STROBE(); + } +} + +/*! + @brief Set the WR line LOW, then HIGH. Used for parallel-connected + interfaces when writing data. +*/ +inline void Adafruit_SPITFT::TFT_WR_STROBE(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *tft8.wrPortClr = 1; + *tft8.wrPortSet = 1; + #else // !KINETISK + *tft8.wrPortClr = tft8.wrPinMask; + *tft8.wrPortSet = tft8.wrPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *tft8.wrPort &= tft8.wrPinMaskClr; + *tft8.wrPort |= tft8.wrPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._wr, LOW); + digitalWrite(tft8._wr, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line HIGH. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_HIGH(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + *tft8.rdPortSet = tft8.rdPinMask; + #else // !HAS_PORT_SET_CLR + *tft8.rdPort |= tft8.rdPinMaskSet; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, HIGH); +#endif // end !USE_FAST_PINIO +} + +/*! + @brief Set the RD line LOW. Used for parallel-connected interfaces + when reading data. +*/ +inline void Adafruit_SPITFT::TFT_RD_LOW(void) { +#if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + *tft8.rdPortClr = tft8.rdPinMask; + #else // !HAS_PORT_SET_CLR + *tft8.rdPort &= tft8.rdPinMaskClr; + #endif // end !HAS_PORT_SET_CLR +#else // !USE_FAST_PINIO + digitalWrite(tft8._rd, LOW); +#endif // end !USE_FAST_PINIO +} + +#endif // end __AVR_ATtiny85__ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h new file mode 100644 index 000000000..dcfc1646b --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SPITFT_Renderer.h @@ -0,0 +1,520 @@ +/*! + * @file Adafruit_SPITFT.h + * + * Part of Adafruit's GFX graphics library. Originally this class was + * written to handle a range of color TFT displays connected via SPI, + * but over time this library and some display-specific subclasses have + * mutated to include some color OLEDs as well as parallel-interfaced + * displays. The name's been kept for the sake of older code. + * + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * Written by Limor "ladyada" Fried for Adafruit Industries, + * with contributions from the open source community. + * + * BSD license, all text here must be included in any redistribution. + */ + +#ifndef _ADAFRUIT_SPITFT_H_ +#define _ADAFRUIT_SPITFT_H_ + +#if !defined(__AVR_ATtiny85__) // Not for ATtiny, at all + +#include +#include "Adafruit_GFX.h" +#include "renderer.h" + +// HARDWARE CONFIG --------------------------------------------------------- + +#if defined(__AVR__) + typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit + #define USE_FAST_PINIO ///< Use direct PORT register access +#elif defined(ARDUINO_STM32_FEATHER) // WICED + typedef class HardwareSPI SPIClass; ///< SPI is a bit odd on WICED + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#elif defined(__arm__) + #if defined(ARDUINO_ARCH_SAMD) + // Adafruit M0, M4 + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + #define USE_FAST_PINIO ///< Use direct PORT register access + #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers + #elif defined(CORE_TEENSY) + // PJRC Teensy 4.x + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + // PJRC Teensy 3.x + #else + typedef uint8_t ADAGFX_PORT_t; ///< PORT values are 8-bit + #endif + #define USE_FAST_PINIO ///< Use direct PORT register access + #define HAS_PORT_SET_CLR ///< PORTs have set & clear registers + #else + // Arduino Due? + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit + // USE_FAST_PINIO not available here (yet)...Due has a totally different + // GPIO register set and will require some changes elsewhere (e.g. in + // constructors especially). + #endif +#else // !ARM + // Probably ESP8266 or ESP32. USE_FAST_PINIO is not available here (yet) + // but don't worry about it too much...the digitalWrite() implementation + // on these platforms is reasonably efficient and already RAM-resident, + // only gotcha then is no parallel connection support for now. + typedef uint32_t ADAGFX_PORT_t; ///< PORT values are 32-bit +#endif // end !ARM +typedef volatile ADAGFX_PORT_t* PORTreg_t; ///< PORT register type + +#if defined(__AVR__) + #define DEFAULT_SPI_FREQ 8000000L ///< Hardware SPI default speed +#else + #define DEFAULT_SPI_FREQ 16000000L ///< Hardware SPI default speed +#endif + +#if defined(ADAFRUIT_PYPORTAL) || defined(ADAFRUIT_PYBADGE_M4_EXPRESS) || defined(ADAFRUIT_PYGAMER_M4_EXPRESS) + #define USE_SPI_DMA ///< Auto DMA if using PyPortal +#else + //#define USE_SPI_DMA ///< If set, use DMA if available +#endif +// Another "oops" name -- this now also handles parallel DMA. +// If DMA is enabled, Arduino sketch MUST #include +// Estimated RAM usage: +// 4 bytes/pixel on display major axis + 8 bytes/pixel on minor axis, +// e.g. 320x240 pixels = 320 * 4 + 240 * 8 = 3,200 bytes. + +#if !defined(ARDUINO_ARCH_SAMD) + #undef USE_SPI_DMA ///< DMA currently for SAMD chips only +#endif + +#if defined(USE_SPI_DMA) + #pragma message ("GFX DMA IS ENABLED. HIGHLY EXPERIMENTAL.") + #include +#endif + +// This is kind of a kludge. Needed a way to disambiguate the software SPI +// and parallel constructors via their argument lists. Originally tried a +// bool as the first argument to the parallel constructor (specifying 8-bit +// vs 16-bit interface) but the compiler regards this as equivalent to an +// integer and thus still ambiguous. SO...the parallel constructor requires +// an enumerated type as the first argument: tft8 (for 8-bit parallel) or +// tft16 (for 16-bit)...even though 16-bit isn't fully implemented or tested +// and might never be, still needed that disambiguation from soft SPI. +enum tftBusWidth { tft8bitbus, tft16bitbus }; ///< For first arg to parallel constructor + +// CLASS DEFINITION -------------------------------------------------------- + +/*! + @brief Adafruit_SPITFT is an intermediary class between Adafruit_GFX + and various hardware-specific subclasses for different displays. + It handles certain operations that are common to a range of + displays (address window, area fills, etc.). Originally these were + all color TFT displays interfaced via SPI, but it's since expanded + to include color OLEDs and parallel-interfaced TFTs. THE NAME HAS + BEEN KEPT TO AVOID BREAKING A LOT OF SUBCLASSES AND EXAMPLE CODE. + Many of the class member functions similarly live on with names + that don't necessarily accurately describe what they're doing, + again to avoid breaking a lot of other code. If in doubt, read + the comments. +*/ +class Adafruit_SPITFT : public Renderer { + + public: + + // CONSTRUCTORS -------------------------------------------------------- + + // Software SPI constructor: expects width & height (at default rotation + // setting 0), 4 signal pins (cs, dc, mosi, sclk), 2 optional pins + // (reset, miso). cs argument is required but can be -1 if unused -- + // rather than moving it to the optional arguments, it was done this way + // to avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t mosi, int8_t sck, + int8_t rst = -1, int8_t miso = -1); + + // Hardware SPI constructor using the default SPI port: expects width & + // height (at default rotation setting 0), 2 signal pins (cs, dc), + // optional reset pin. cs is required but can be -1 if unused -- rather + // than moving it to the optional arguments, it was done this way to + // avoid breaking existing code (-1 option was a later addition). + Adafruit_SPITFT(uint16_t w, uint16_t h, + int8_t cs, int8_t dc, int8_t rst = -1); + +#if !defined(ESP8266) // See notes in .cpp + // Hardware SPI constructor using an arbitrary SPI peripheral: expects + // width & height (rotation 0), SPIClass pointer, 2 signal pins (cs, dc) + // and optional reset pin. cs is required but can be -1 if unused. + Adafruit_SPITFT(uint16_t w, uint16_t h, SPIClass *spiClass, + int8_t cs, int8_t dc, int8_t rst = -1); +#endif // end !ESP8266 + + // Parallel constructor: expects width & height (rotation 0), flag + // indicating whether 16-bit (true) or 8-bit (false) interface, 3 signal + // pins (d0, wr, dc), 3 optional pins (cs, rst, rd). 16-bit parallel + // isn't even fully implemented but the 'wide' flag was added as a + // required argument to avoid ambiguity with other constructors. + Adafruit_SPITFT(uint16_t w, uint16_t h, tftBusWidth busWidth, + int8_t d0, int8_t wr, int8_t dc, + int8_t cs = -1, int8_t rst = -1, int8_t rd = -1); + + // CLASS MEMBER FUNCTIONS ---------------------------------------------- + + // These first two functions MUST be declared by subclasses: + + /*! + @brief Display-specific initialization function. + @param freq SPI frequency, in hz (or 0 for default or unused). + */ + virtual void begin(uint32_t freq) = 0; + + /*! + @brief Set up the specific display hardware's "address window" + for subsequent pixel-pushing operations. + @param x Leftmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param y Topmost pixel of area to be drawn (MUST be within + display bounds at current rotation setting). + @param w Width of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + @param h Height of area to be drawn, in pixels (MUST be >0 and, + added to x, within display bounds at current rotation). + */ + virtual void setAddrWindow( + uint16_t x, uint16_t y, uint16_t w, uint16_t h) = 0; + + // Remaining functions do not need to be declared in subclasses + // unless they wish to provide hardware-specific optimizations. + // Brief comments here...documented more thoroughly in .cpp file. + + // Subclass' begin() function invokes this to initialize hardware. + // freq=0 to use default SPI speed. spiMode must be one of the SPI_MODEn + // values defined in SPI.h, which are NOT the same as 0 for SPI_MODE0, + // 1 for SPI_MODE1, etc...use ONLY the SPI_MODEn defines! Only! + // Name is outdated (interface may be parallel) but for compatibility: + void initSPI(uint32_t freq = 0, uint8_t spiMode = SPI_MODE0); + // Chip select and/or hardware SPI transaction start as needed: + void startWrite(void); + // Chip deselect and/or hardware SPI transaction end as needed: + void endWrite(void); + void sendCommand(uint8_t commandByte, uint8_t *dataBytes = NULL, uint8_t numDataBytes = 0); + void sendCommand(uint8_t commandByte, const uint8_t *dataBytes, uint8_t numDataBytes); + uint8_t readcommand8(uint8_t commandByte, uint8_t index = 0); + + // These functions require a chip-select and/or SPI transaction + // around them. Higher-level graphics primitives might start a + // single transaction and then make multiple calls to these functions + // (e.g. circle or text rendering might make repeated lines or rects) + // before ending the transaction. It's more efficient than starting a + // transaction every time. + void writePixel(int16_t x, int16_t y, uint16_t color); + void writePixels(uint16_t *colors, uint32_t len, + bool block=true, bool bigEndian=false); + void writeColor(uint16_t color, uint32_t len); + void writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + void writeFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color); + void writeFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color); + // This is a new function, similar to writeFillRect() except that + // all arguments MUST be onscreen, sorted and clipped. If higher-level + // primitives can handle their own sorting/clipping, it avoids repeating + // such operations in the low-level code, making it potentially faster. + // CALLING THIS WITH UNCLIPPED OR NEGATIVE VALUES COULD BE DISASTROUS. + inline void writeFillRectPreclipped(int16_t x, int16_t y, + int16_t w, int16_t h, uint16_t color); + // Another new function, companion to the new non-blocking + // writePixels() variant. + void dmaWait(void); + + + // These functions are similar to the 'write' functions above, but with + // a chip-select and/or SPI transaction built-in. They're typically used + // solo -- that is, as graphics primitives in themselves, not invoked by + // higher-level primitives (which should use the functions above). + void drawPixel(int16_t x, int16_t y, uint16_t color); + void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, + uint16_t color); + void drawFastHLine(int16_t x, int16_t y, int16_t w, + uint16_t color); + void drawFastVLine(int16_t x, int16_t y, int16_t h, + uint16_t color); + // A single-pixel push encapsulated in a transaction. I don't think + // this is used anymore (BMP demos might've used it?) but is provided + // for backward compatibility, consider it deprecated: + void pushColor(uint16_t color); + + using Adafruit_GFX::drawRGBBitmap; // Check base class first + void drawRGBBitmap(int16_t x, int16_t y, + uint16_t *pcolors, int16_t w, int16_t h); + + void invertDisplay(bool i); + uint16_t color565(uint8_t r, uint8_t g, uint8_t b); + + // Despite parallel additions, function names kept for compatibility: + void spiWrite(uint8_t b); // Write single byte as DATA + void writeCommand(uint8_t cmd); // Write single byte as COMMAND + uint8_t spiRead(void); // Read single byte of data + + // Most of these low-level functions were formerly macros in + // Adafruit_SPITFT_Macros.h. Some have been made into inline functions + // to avoid macro mishaps. Despite the addition of code for a parallel + // display interface, the names have been kept for backward + // compatibility (some subclasses may be invoking these): + void SPI_WRITE16(uint16_t w); // Not inline + void SPI_WRITE32(uint32_t l); // Not inline + // Old code had both a spiWrite16() function and SPI_WRITE16 macro + // in addition to the SPI_WRITE32 macro. The latter two have been + // made into functions here, and spiWrite16() removed (use SPI_WRITE16() + // instead). It looks like most subclasses had gotten comfortable with + // SPI_WRITE16 and SPI_WRITE32 anyway so those names were kept rather + // than the less-obnoxious camelcase variants, oh well. + + // Placing these functions entirely in the class definition inlines + // them implicitly them while allowing their use in other code: + + /*! + @brief Set the chip-select line HIGH. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_HIGH(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *csPortSet = 1; + #else // !KINETISK + *csPortSet = csPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *csPort |= csPinMaskSet; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_cs, HIGH); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the chip-select line LOW. Does NOT check whether CS pin + is set (>=0), that should be handled in calling function. + Despite function name, this is used even if the display + connection is parallel. + */ + void SPI_CS_LOW(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *csPortClr = 1; + #else // !KINETISK + *csPortClr = csPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *csPort &= csPinMaskClr; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_cs, LOW); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line HIGH (data mode). + */ + void SPI_DC_HIGH(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *dcPortSet = 1; + #else // !KINETISK + *dcPortSet = dcPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *dcPort |= dcPinMaskSet; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_dc, HIGH); + #endif // end !USE_FAST_PINIO + } + + /*! + @brief Set the data/command line LOW (command mode). + */ + void SPI_DC_LOW(void) { + #if defined(USE_FAST_PINIO) + #if defined(HAS_PORT_SET_CLR) + #if defined(KINETISK) + *dcPortClr = 1; + #else // !KINETISK + *dcPortClr = dcPinMask; + #endif // end !KINETISK + #else // !HAS_PORT_SET_CLR + *dcPort &= dcPinMaskClr; + #endif // end !HAS_PORT_SET_CLR + #else // !USE_FAST_PINIO + digitalWrite(_dc, LOW); + #endif // end !USE_FAST_PINIO + } + + protected: + + // A few more low-level member functions -- some may have previously + // been macros. Shouldn't have a need to access these externally, so + // they've been moved to the protected section. Additionally, they're + // declared inline here and the code is in the .cpp file, since outside + // code doesn't need to see these. + inline void SPI_MOSI_HIGH(void); + inline void SPI_MOSI_LOW(void); + inline void SPI_SCK_HIGH(void); + inline void SPI_SCK_LOW(void); + inline bool SPI_MISO_READ(void); + inline void SPI_BEGIN_TRANSACTION(void); + inline void SPI_END_TRANSACTION(void); + inline void TFT_WR_STROBE(void); // Parallel interface write strobe + inline void TFT_RD_HIGH(void); // Parallel interface read high + inline void TFT_RD_LOW(void); // Parallel interface read low + + // CLASS INSTANCE VARIABLES -------------------------------------------- + + // Here be dragons! There's a big union of three structures here -- + // one each for hardware SPI, software (bitbang) SPI, and parallel + // interfaces. This is to save some memory, since a display's connection + // will be only one of these. The order of some things is a little weird + // in an attempt to get values to align and pack better in RAM. + +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + PORTreg_t csPortSet; ///< PORT register for chip select SET + PORTreg_t csPortClr; ///< PORT register for chip select CLEAR + PORTreg_t dcPortSet; ///< PORT register for data/command SET + PORTreg_t dcPortClr; ///< PORT register for data/command CLEAR +#else // !HAS_PORT_SET_CLR + PORTreg_t csPort; ///< PORT register for chip select + PORTreg_t dcPort; ///< PORT register for data/command +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO +#if defined(__cplusplus) && (__cplusplus >= 201100) + union { +#endif + struct { // Values specific to HARDWARE SPI: + SPIClass *_spi; ///< SPI class pointer +#if defined(SPI_HAS_TRANSACTION) + SPISettings settings; ///< SPI transaction settings +#else + uint32_t _freq; ///< SPI bitrate (if no SPI transactions) +#endif + uint32_t _mode; ///< SPI data mode (transactions or no) + } hwspi; ///< Hardware SPI values + struct { // Values specific to SOFTWARE SPI: +#if defined(USE_FAST_PINIO) + PORTreg_t misoPort; ///< PORT (PIN) register for MISO +#if defined(HAS_PORT_SET_CLR) + PORTreg_t mosiPortSet; ///< PORT register for MOSI SET + PORTreg_t mosiPortClr; ///< PORT register for MOSI CLEAR + PORTreg_t sckPortSet; ///< PORT register for SCK SET + PORTreg_t sckPortClr; ///< PORT register for SCK CLEAR + #if !defined(KINETISK) + ADAGFX_PORT_t mosiPinMask; ///< Bitmask for MOSI + ADAGFX_PORT_t sckPinMask; ///< Bitmask for SCK + #endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + PORTreg_t mosiPort; ///< PORT register for MOSI + PORTreg_t sckPort; ///< PORT register for SCK + ADAGFX_PORT_t mosiPinMaskSet; ///< Bitmask for MOSI SET (OR) + ADAGFX_PORT_t mosiPinMaskClr; ///< Bitmask for MOSI CLEAR (AND) + ADAGFX_PORT_t sckPinMaskSet; ///< Bitmask for SCK SET (OR bitmask) + ADAGFX_PORT_t sckPinMaskClr; ///< Bitmask for SCK CLEAR (AND) +#endif // end HAS_PORT_SET_CLR + #if !defined(KINETISK) + ADAGFX_PORT_t misoPinMask; ///< Bitmask for MISO + #endif // end !KINETISK +#endif // end USE_FAST_PINIO + int8_t _mosi; ///< MOSI pin # + int8_t _miso; ///< MISO pin # + int8_t _sck; ///< SCK pin # + } swspi; ///< Software SPI values + struct { // Values specific to 8-bit parallel: +#if defined(USE_FAST_PINIO) + + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *writePort; ///< PORT register for DATA WRITE + volatile uint32_t *readPort; ///< PORT (PIN) register for DATA READ + #else + volatile uint8_t *writePort; ///< PORT register for DATA WRITE + volatile uint8_t *readPort; ///< PORT (PIN) register for DATA READ + #endif +#if defined(HAS_PORT_SET_CLR) + // Port direction register pointers are always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. + #if defined(__IMXRT1052__) || defined(__IMXRT1062__) // Teensy 4.x + volatile uint32_t *dirSet; ///< PORT byte data direction SET + volatile uint32_t *dirClr; ///< PORT byte data direction CLEAR + #else + volatile uint8_t *dirSet; ///< PORT byte data direction SET + volatile uint8_t *dirClr; ///< PORT byte data direction CLEAR + #endif + PORTreg_t wrPortSet; ///< PORT register for write strobe SET + PORTreg_t wrPortClr; ///< PORT register for write strobe CLEAR + PORTreg_t rdPortSet; ///< PORT register for read strobe SET + PORTreg_t rdPortClr; ///< PORT register for read strobe CLEAR + #if !defined(KINETISK) + ADAGFX_PORT_t wrPinMask; ///< Bitmask for write strobe + #endif // end !KINETISK + ADAGFX_PORT_t rdPinMask; ///< Bitmask for read strobe +#else // !HAS_PORT_SET_CLR + // Port direction register pointer is always 8-bit regardless of + // PORTreg_t -- even if 32-bit port, we modify a byte-aligned 8 bits. + volatile uint8_t *portDir; ///< PORT direction register + PORTreg_t wrPort; ///< PORT register for write strobe + PORTreg_t rdPort; ///< PORT register for read strobe + ADAGFX_PORT_t wrPinMaskSet; ///< Bitmask for write strobe SET (OR) + ADAGFX_PORT_t wrPinMaskClr; ///< Bitmask for write strobe CLEAR (AND) + ADAGFX_PORT_t rdPinMaskSet; ///< Bitmask for read strobe SET (OR) + ADAGFX_PORT_t rdPinMaskClr; ///< Bitmask for read strobe CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + int8_t _d0; ///< Data pin 0 # + int8_t _wr; ///< Write strobe pin # + int8_t _rd; ///< Read strobe pin # (or -1) + bool wide = 0; ///< If true, is 16-bit interface + } tft8; ///< Parallel interface settings +#if defined(__cplusplus) && (__cplusplus >= 201100) + }; ///< Only one interface is active +#endif +#if defined(USE_SPI_DMA) // Used by hardware SPI and tft8 + Adafruit_ZeroDMA dma; ///< DMA instance + DmacDescriptor *dptr = NULL; ///< 1st descriptor + DmacDescriptor *descriptor = NULL; ///< Allocated descriptor list + uint16_t *pixelBuf[2]; ///< Working buffers + uint16_t maxFillLen; ///< Max pixels per DMA xfer + uint16_t lastFillColor = 0; ///< Last color used w/fill + uint32_t lastFillLen = 0; ///< # of pixels w/last fill + uint8_t onePixelBuf; ///< For hi==lo fill +#endif +#if defined(USE_FAST_PINIO) +#if defined(HAS_PORT_SET_CLR) + #if !defined(KINETISK) + ADAGFX_PORT_t csPinMask; ///< Bitmask for chip select + ADAGFX_PORT_t dcPinMask; ///< Bitmask for data/command + #endif // end !KINETISK +#else // !HAS_PORT_SET_CLR + ADAGFX_PORT_t csPinMaskSet; ///< Bitmask for chip select SET (OR) + ADAGFX_PORT_t csPinMaskClr; ///< Bitmask for chip select CLEAR (AND) + ADAGFX_PORT_t dcPinMaskSet; ///< Bitmask for data/command SET (OR) + ADAGFX_PORT_t dcPinMaskClr; ///< Bitmask for data/command CLEAR (AND) +#endif // end HAS_PORT_SET_CLR +#endif // end USE_FAST_PINIO + uint8_t connection; ///< TFT_HARD_SPI, TFT_SOFT_SPI, etc. + int8_t _rst; ///< Reset pin # (or -1) + int8_t _cs; ///< Chip select pin # (or -1) + int8_t _dc; ///< Data/command pin # + + int16_t _xstart = 0; ///< Internal framebuffer X offset + int16_t _ystart = 0; ///< Internal framebuffer Y offset + uint8_t invertOnCommand = 0; ///< Command to enable invert mode + uint8_t invertOffCommand = 0; ///< Command to disable invert mode + + uint32_t _freq = 0; ///< Dummy var to keep subclasses happy +}; + +#endif // end __AVR_ATtiny85__ +#endif // end _ADAFRUIT_SPITFT_H_ diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp new file mode 100644 index 000000000..78d9901d6 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.cpp @@ -0,0 +1,190 @@ +/*! + * @file Adafruit_SSD1331.cpp + * + * @mainpage Adafruit SSD1331 Arduino Library + * + * @section intro_sec Introduction + * + * This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip + * + * Pick one up today in the adafruit shop! + * ------> http://www.adafruit.com/products/684 + * + * These displays use SPI to communicate, 4 or 5 pins are required to + * interface + * Adafruit invests time and resources providing this open source code, + * please support Adafruit and open-source hardware by purchasing + * products from Adafruit! + * + * @section author Author + * + * Written by Limor Fried/Ladyada for Adafruit Industries. + * + * @section license License + * + * BSD license, all text above must be included in any redistribution + */ + +#include "Adafruit_SSD1331.h" +#include "pins_arduino.h" +#include "wiring_private.h" + +/***********************************/ + +/*! + @brief SPI displays set an address window rectangle for blitting pixels + @param x Top left corner x coordinate + @param y Top left corner x coordinate + @param w Width of window + @param h Height of window +*/ +void Adafruit_SSD1331::setAddrWindow(uint16_t x, uint16_t y, uint16_t w, + uint16_t h) { + + uint8_t x1 = x; + uint8_t y1 = y; + if (x1 > 95) + x1 = 95; + if (y1 > 63) + y1 = 63; + + uint8_t x2 = (x + w - 1); + uint8_t y2 = (y + h - 1); + if (x2 > 95) + x2 = 95; + if (y2 > 63) + y2 = 63; + + if (x1 > x2) { + uint8_t t = x2; + x2 = x1; + x1 = t; + } + if (y1 > y2) { + uint8_t t = y2; + y2 = y1; + y1 = t; + } + + sendCommand(0x15); // Column addr set + sendCommand(x1); + sendCommand(x2); + + sendCommand(0x75); // Column addr set + sendCommand(y1); + sendCommand(y2); + + startWrite(); +} + +/**************************************************************************/ +/*! + @brief Initialize SSD1331 chip + Connects to the SSD1331 over SPI and sends initialization procedure commands + @param freq Desired SPI clock frequency +*/ +/**************************************************************************/ +void Adafruit_SSD1331::begin(uint32_t freq) { + initSPI(freq); + + // Initialization Sequence + sendCommand(SSD1331_CMD_DISPLAYOFF); // 0xAE + sendCommand(SSD1331_CMD_SETREMAP); // 0xA0 +#if defined SSD1331_COLORORDER_RGB + sendCommand(0x72); // RGB Color +#else + sendCommand(0x76); // BGR Color +#endif + sendCommand(SSD1331_CMD_STARTLINE); // 0xA1 + sendCommand(0x0); + sendCommand(SSD1331_CMD_DISPLAYOFFSET); // 0xA2 + sendCommand(0x0); + sendCommand(SSD1331_CMD_NORMALDISPLAY); // 0xA4 + sendCommand(SSD1331_CMD_SETMULTIPLEX); // 0xA8 + sendCommand(0x3F); // 0x3F 1/64 duty + sendCommand(SSD1331_CMD_SETMASTER); // 0xAD + sendCommand(0x8E); + sendCommand(SSD1331_CMD_POWERMODE); // 0xB0 + sendCommand(0x0B); + sendCommand(SSD1331_CMD_PRECHARGE); // 0xB1 + sendCommand(0x31); + sendCommand(SSD1331_CMD_CLOCKDIV); // 0xB3 + sendCommand(0xF0); // 7:4 = Oscillator Frequency, 3:0 = CLK Div Ratio + // (A[3:0]+1 = 1..16) + sendCommand(SSD1331_CMD_PRECHARGEA); // 0x8A + sendCommand(0x64); + sendCommand(SSD1331_CMD_PRECHARGEB); // 0x8B + sendCommand(0x78); + sendCommand(SSD1331_CMD_PRECHARGEC); // 0x8C + sendCommand(0x64); + sendCommand(SSD1331_CMD_PRECHARGELEVEL); // 0xBB + sendCommand(0x3A); + sendCommand(SSD1331_CMD_VCOMH); // 0xBE + sendCommand(0x3E); + sendCommand(SSD1331_CMD_MASTERCURRENT); // 0x87 + sendCommand(0x06); + sendCommand(SSD1331_CMD_CONTRASTA); // 0x81 + sendCommand(0x91); + sendCommand(SSD1331_CMD_CONTRASTB); // 0x82 + sendCommand(0x50); + sendCommand(SSD1331_CMD_CONTRASTC); // 0x83 + sendCommand(0x7D); + sendCommand(SSD1331_CMD_DISPLAYON); //--turn on oled panel + _width = TFTWIDTH; + _height = TFTHEIGHT; +} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with software SPI + @param cs Chip select pin # + @param dc Data/Command pin # + @param mosi SPI MOSI pin # + @param sclk SPI Clock pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, + int8_t sclk, int8_t rst) + : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, mosi, sclk, rst, -1) {} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with hardware SPI + @param cs Chip select pin # + @param dc Data/Command pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst) + : Adafruit_SPITFT(TFTWIDTH, TFTHEIGHT, cs, dc, rst) {} + +/**************************************************************************/ +/*! + @brief Instantiate Adafruit SSD1331 driver with hardware SPI + @param spi Pointer to an existing SPIClass instance (e.g. &SPI, the + microcontroller's primary SPI bus). + @param cs Chip select pin # + @param dc Data/Command pin # + @param rst Reset pin # (optional, pass -1 if unused) +*/ +/**************************************************************************/ +Adafruit_SSD1331::Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, + int8_t rst) + : +#if defined(ESP8266) + Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, cs, dc, rst) { +#else + Adafruit_SPITFT(TFTWIDTH, TFTWIDTH, spi, cs, dc, rst) { +#endif +} + +/**************************************************************************/ +/*! + @brief Change whether display is on or off + @param enable True if you want the display ON, false OFF +*/ +/**************************************************************************/ +void Adafruit_SSD1331::enableDisplay(boolean enable) { + sendCommand(enable ? SSD1331_CMD_DISPLAYON : SSD1331_CMD_DISPLAYOFF); +} diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h new file mode 100644 index 000000000..7d9bc85a0 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/Adafruit_SSD1331.h @@ -0,0 +1,76 @@ +/*! + * @file Adafruit_SSD1331.h + */ + +#include "Arduino.h" +#include +// Tasmota change: use custom version of Adafruit_SPITFT which extends Renderer instead of Adafruit_GFX +#include +#include +#include + +/*! + * @brief Select one of these defines to set the pixel color order + */ +#define SSD1331_COLORORDER_RGB +// #define SSD1331_COLORORDER_BGR + +#if defined SSD1331_COLORORDER_RGB && defined SSD1331_COLORORDER_BGR +#error "RGB and BGR can not both be defined for SSD1331_COLORODER." +#endif + +// Timing Delays +#define SSD1331_DELAYS_HWFILL (3) //!< Fill delay +#define SSD1331_DELAYS_HWLINE (1) //!< Line delay + +// SSD1331 Commands +#define SSD1331_CMD_DRAWLINE 0x21 //!< Draw line +#define SSD1331_CMD_DRAWRECT 0x22 //!< Draw rectangle +#define SSD1331_CMD_FILL 0x26 //!< Fill enable/disable +#define SSD1331_CMD_SETCOLUMN 0x15 //!< Set column address +#define SSD1331_CMD_SETROW 0x75 //!< Set row adress +#define SSD1331_CMD_CONTRASTA 0x81 //!< Set contrast for color A +#define SSD1331_CMD_CONTRASTB 0x82 //!< Set contrast for color B +#define SSD1331_CMD_CONTRASTC 0x83 //!< Set contrast for color C +#define SSD1331_CMD_MASTERCURRENT 0x87 //!< Master current control +#define SSD1331_CMD_SETREMAP 0xA0 //!< Set re-map & data format +#define SSD1331_CMD_STARTLINE 0xA1 //!< Set display start line +#define SSD1331_CMD_DISPLAYOFFSET 0xA2 //!< Set display offset +#define SSD1331_CMD_NORMALDISPLAY 0xA4 //!< Set display to normal mode +#define SSD1331_CMD_DISPLAYALLON 0xA5 //!< Set entire display ON +#define SSD1331_CMD_DISPLAYALLOFF 0xA6 //!< Set entire display OFF +#define SSD1331_CMD_INVERTDISPLAY 0xA7 //!< Invert display +#define SSD1331_CMD_SETMULTIPLEX 0xA8 //!< Set multiplex ratio +#define SSD1331_CMD_SETMASTER 0xAD //!< Set master configuration +#define SSD1331_CMD_DISPLAYOFF 0xAE //!< Display OFF (sleep mode) +#define SSD1331_CMD_DISPLAYON 0xAF //!< Normal Brightness Display ON +#define SSD1331_CMD_POWERMODE 0xB0 //!< Power save mode +#define SSD1331_CMD_PRECHARGE 0xB1 //!< Phase 1 and 2 period adjustment +#define SSD1331_CMD_CLOCKDIV \ + 0xB3 //!< Set display clock divide ratio/oscillator frequency +#define SSD1331_CMD_PRECHARGEA 0x8A //!< Set second pre-charge speed for color A +#define SSD1331_CMD_PRECHARGEB 0x8B //!< Set second pre-charge speed for color B +#define SSD1331_CMD_PRECHARGEC 0x8C //!< Set second pre-charge speed for color C +#define SSD1331_CMD_PRECHARGELEVEL 0xBB //!< Set pre-charge voltage +#define SSD1331_CMD_VCOMH 0xBE //!< Set Vcomh voltge + +/// Class to manage hardware interface with SSD1331 chipset +class Adafruit_SSD1331 : public Adafruit_SPITFT { +public: + Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk, int8_t rst); + Adafruit_SSD1331(int8_t cs, int8_t dc, int8_t rst); + // 3-4 args using hardware SPI (must specify peripheral) (reset optional) + Adafruit_SSD1331(SPIClass *spi, int8_t cs, int8_t dc, int8_t rst = -1); + + // commands + void begin(uint32_t begin = 8000000); + + void setAddrWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h); + + void enableDisplay(boolean enable); + + static const int16_t TFTWIDTH = 96; ///< The width of the display + static const int16_t TFTHEIGHT = 64; ///< The height of the display + +private: +}; diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md b/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md new file mode 100644 index 000000000..24c404c59 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/README.md @@ -0,0 +1,24 @@ +# Adafruit SSD1331 Arduino Library [![Build Status](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/workflows/Arduino%20Library%20CI/badge.svg)](https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/actions)[![Documentation](https://github.com/adafruit/ci-arduino/blob/master/assets/doxygen_badge.svg)](http://adafruit.github.io/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino/html/index.html) +This is a library for the 0.96" 16-bit Color OLED with SSD1331 driver chip + + Pick one up today in the adafruit shop! + ------> http://www.adafruit.com/products/684 + +These displays use SPI to communicate, 4 or 5 pins are required to +interface + +Adafruit invests time and resources providing this open source code, +please support Adafruit and open-source hardware by purchasing +products from Adafruit! + +Written by Limor Fried/Ladyada for Adafruit Industries. +BSD license, check license.txt for more information +All text above must be included in any redistribution + +To download. click the DOWNLOADS button in the top right corner, rename the uncompressed folder Adafruit_SSD1131. Check that the Adafruit_SSD1331 folder contains Adafruit_SSD1331.cpp and Adafruit_SSD1331.h + +Place the Adafruit_SSD1331 library folder your /libraries/ folder. You may need to create the libraries subfolder if its your first library. Restart the IDE. + +You will also have to download the Adafruit GFX Graphics core which does all the circles, text, rectangles, etc. You can get it from +https://github.com/adafruit/Adafruit-GFX-Library +and download/install that library as well diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties b/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties new file mode 100644 index 000000000..931f1aa38 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/library.properties @@ -0,0 +1,10 @@ +name=Adafruit SSD1331 OLED Driver Library for Arduino +version=1.2.0 +author=Adafruit +maintainer=Adafruit +sentence=For 0.96" OLEDs in the Adafruit shop +paragraph=For 0.96" OLEDs in the Adafruit shop +category=Display +url=https://github.com/adafruit/Adafruit-SSD1331-OLED-Driver-Library-for-Arduino +architectures=* +depends=Adafruit GFX Library diff --git a/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt b/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt new file mode 100644 index 000000000..f6a0f22b8 --- /dev/null +++ b/lib/lib_display/Adafruit_SSD1331-1.2.0/license.txt @@ -0,0 +1,26 @@ +Software License Agreement (BSD License) + +Copyright (c) 2012, Adafruit Industries +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. +3. Neither the name of the copyright holders nor the +names of its contributors may be used to endorse or promote products +derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From fb2c10cb97ca7644d9962b057dc9b0084bbb027f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 14:26:27 +0100 Subject: [PATCH 110/255] Add SPI display driver SSD1331 Color oled Add SPI display driver SSD1331 Color oled by Jeroen Vermeulen (#10376) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_configurations.h | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b34c9ca0..1836bee70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``SetOption118 1`` to move ZbReceived from JSON message and into the subtopic replacing "SENSOR" default (#10353) - Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic (#10355) - Command ``RuleTimer0`` to access all RuleTimers at once (#10352) +- SPI display driver SSD1331 Color oled by Jeroen Vermeulen (#10376) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 814272bdf..01f4cc1fc 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -75,6 +75,7 @@ The attached binaries can also be downloaded from http://ota.tasmota.com/tasmota - Support for disabling 38kHz IR modulation using ``#define IR_SEND_USE_MODULATION false`` [#10301](https://github.com/arendst/Tasmota/issues/10301) - Support for SPI display driver for ST7789 TFT by Gerhard Mutz [#9037](https://github.com/arendst/Tasmota/issues/9037) - Basic support for ESP32 Odroid Go 16MB binary tasmota32-odroidgo.bin [#8630](https://github.com/arendst/Tasmota/issues/8630) +- SPI display driver SSD1331 Color oled by Jeroen Vermeulen [#10376](https://github.com/arendst/Tasmota/issues/10376) ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 87022257c..5dcce7502 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -310,7 +310,7 @@ #define USE_DISPLAY_SSD1351 // [DisplayModel 9] #define USE_DISPLAY_RA8876 // [DisplayModel 10] #define USE_DISPLAY_ST7789 // [DisplayModel 12] Enable ST7789 module -// #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module + #define USE_DISPLAY_SSD1331 // [DisplayModel 14] Enable SSD1331 module #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code From 24cbad3257d3d26826766fd587f81fe9fa9d2453 Mon Sep 17 00:00:00 2001 From: Vic Date: Mon, 4 Jan 2021 14:57:32 +0100 Subject: [PATCH 111/255] more diagnostics --- tasmota/.xdrv_47_ftc532.ino.kate-swp | Bin 0 -> 710 bytes tasmota/xdrv_47_ftc532.ino | 99 ++++++++++++++++----------- 2 files changed, 58 insertions(+), 41 deletions(-) create mode 100644 tasmota/.xdrv_47_ftc532.ino.kate-swp diff --git a/tasmota/.xdrv_47_ftc532.ino.kate-swp b/tasmota/.xdrv_47_ftc532.ino.kate-swp new file mode 100644 index 0000000000000000000000000000000000000000..46ab3cc1996b17b4471ee761f28e803930b1f42e GIT binary patch literal 710 zcmZ9}J4*vW5C`zx_zGx@im&)$F~)R~J2i#cNZ5$@Bzq`UN5B&f!eMbi?X2?|Y%Kj6 zehO1D(@2@8_M>XXok;mRH6g_OZ|~Kse7v9B^nQ}J zueE+Y3XyuY(lA?I(Kz6mUo}#>r*#$UZPs1s@2z%@qxUT@fyVw0kZ8Vgw)41~)R@|nE_(}rk1q(JjFnk{TI>^8&wW?!4ztiGbnVDb?q@X4~9 zk;vS0MGlVGBk%)z6wWRW6UX4}^5AjU>7RfV_vgulX3*H*^+OXJ2Rh`n1=Kd!i|`eD x3BF)2!`JK*e9m5hHG35f*lR=U>#%dy4RTI72{oL+%h<=j-@A_i_a9?V{{fF>QeprA literal 0 HcmV?d00001 diff --git a/tasmota/xdrv_47_ftc532.ino b/tasmota/xdrv_47_ftc532.ino index 5c076faa4..e88a80312 100644 --- a/tasmota/xdrv_47_ftc532.ino +++ b/tasmota/xdrv_47_ftc532.ino @@ -54,105 +54,122 @@ #define XDRV_47 47 #define FTC532_KEYS_MAX 8 +#define FTC532_RETRY 8 // number of reads before discarding #define FTC532_STATE_WAITING false #define FTC532_STATE_READING true // Rising edge timing in microseconds #define FTC532_BIT 377 +#define FTC532_NOISE (FTC532_BIT * 3 / 2) #define FTC532_SHORT (FTC532_BIT * 2) #define FTC532_LONG (FTC532_BIT * 4) #define FTC532_IDLE (FTC532_BIT * 10) #define FTC532_MAX (FTC532_BIT * 58) +#define DEBUG_FTC532 //@@@@@@@@@@@@@@@@ + struct FTC532 { volatile uint32_t rxtime; // ISR timer memory - volatile uint16_t sample = 0xF0F0; // buffer for bit-coded time samples + volatile uint16_t tsmp = 0xF0F0; // buffer for bit-coded time samples + volatile uint16_t sample = 0xF0F0; // complete samples volatile uint16_t rxbit; // ISR bit counter uint8_t keys = 0; // bitmap of active keys uint8_t old_keys = 0; // previously active keys volatile bool state; // ISR state - bool present = false; -#ifdef DEBUG_TASMOTA_DRIVER - volatile uint16_t errors; // error counter - volatile bool valid; // did we ever receive valid data? -#endif // DEBUG_TASMOTA_DRIVER + bool present = false; // driver active +#ifdef DEBUG_FTC532 + volatile uint16_t errors = 0; // inv. key error counter + volatile uint16_t frame = 0; // frame error counter + volatile uint16_t noise = 0; // noise detection counter + volatile bool valid = 0; // did we ever receive valid data? +#endif // DEBUG_FTC532 } Ftc532; const char ftc532_json[] PROGMEM = "\"FTC532\":{\"KEYS\":\""; -void ICACHE_RAM_ATTR ftc532_ISR(void) { // Hardware interrupt routine, triggers on rising edge +void ICACHE_RAM_ATTR ftc532_ISR(void) { // Hardware interrupt routine, triggers on rising edge uint32_t time = micros(); uint32_t time_diff = time - Ftc532.rxtime; Ftc532.rxtime = time; if (Ftc532.state == FTC532_STATE_WAITING) { - if (time_diff > FTC532_LONG + FTC532_SHORT) { // new frame + if (time_diff > FTC532_LONG + FTC532_SHORT) { // new frame Ftc532.rxbit = 0; Ftc532.state = FTC532_STATE_READING; } return; } // FTC532_STATE_READING starts here if (time_diff > FTC532_LONG + FTC532_BIT) { -#ifdef DEBUG_TASMOTA_DRIVER - ++Ftc532.errors; // frame error -#endif // DEBUG_TASMOTA_DRIVER +#ifdef DEBUG_FTC532 + ++Ftc532.frame; // frame error +#endif // DEBUG_FTC532 Ftc532.state = FTC532_STATE_WAITING; return; } if (time_diff > FTC532_SHORT + FTC532_BIT) { - Ftc532.sample |= (1 << Ftc532.rxbit); // LONG + Ftc532.tsmp |= (1 << Ftc532.rxbit); // LONG + } else if (time_diff < FTC532_NOISE) { // noise detector +#ifdef DEBUG_FTC532 + ++Ftc532.noise; +#endif // DEBUG_FTC532 + Ftc532.state = FTC532_STATE_WAITING; + return; } else { - Ftc532.sample &= ~(1 << Ftc532.rxbit); // SHORT + Ftc532.tsmp &= ~(1 << Ftc532.rxbit); // SHORT } ++Ftc532.rxbit; - if (Ftc532.rxbit == FTC532_KEYS_MAX * 2) { // frame complete + if (Ftc532.rxbit == FTC532_KEYS_MAX * 2) { // frame complete + Ftc532.sample = Ftc532.tsmp; // copy frame Ftc532.rxbit = 0; -#ifdef DEBUG_TASMOTA_DRIVER - Ftc532.valid = true; -#endif // DEBUG_TASMOTA_DRIVER Ftc532.state = FTC532_STATE_WAITING; +#ifdef DEBUG_FTC532 + Ftc532.valid = true; +#endif // DEBUG_FTC532 } } -void ftc532_init(void) { // Initialize +void ftc532_init(void) { // Initialize if (!PinUsed(GPIO_FTC532)) { return; } -#ifdef DEBUG_TASMOTA_DRIVER - Ftc532.errors = 0; - Ftc532.valid = false; -#endif // DEBUG_TASMOTA_DRIVER Ftc532.state = FTC532_STATE_WAITING; - Ftc532.rxtime = micros(); pinMode(Pin(GPIO_FTC532), INPUT_PULLUP); + Ftc532.rxtime = micros(); attachInterrupt(Pin(GPIO_FTC532), ftc532_ISR, RISING); Ftc532.present = true; } -void ftc532_update(void) { // Usually called every 50 ms -#ifdef DEBUG_TASMOTA_DRIVER -// WARNING: Reduce callback frequency if this code is enabled -// if ((Ftc532.sample & 0xF) != ((~Ftc532.sample >> 4) & 0xF) || ((Ftc532.sample >> 8) & 0xF) != ((~Ftc532.sample >> 12) & 0xF)) { -// AddLog_P(LOG_LEVEL_DEBUG, PSTR("FTC: inverted sample does not match %x %x %x %x"), -// Ftc532.sample & 0xF, (~Ftc532.sample >> 4) & 0xF, (Ftc532.sample >> 8) & 0xF, (~Ftc532.sample >> 12) & 0xF); -// } -#endif // DEBUG_TASMOTA_DRIVER - Ftc532.keys = (Ftc532.sample & 0xF) | ((Ftc532.sample >> 4) & 0xF0); - if (Ftc532.keys != Ftc532.old_keys) { -#ifdef DEBUG_TASMOTA_DRIVER - AddLog_P(LOG_LEVEL_DEBUG, PSTR("FTC: SAM=%04X KEY=%02X OLD=%02X ERR=%u OK=%u TIME=%lu Pin=%u"), - Ftc532.sample, Ftc532.keys, Ftc532.old_keys, Ftc532.errors, Ftc532.valid, Ftc532.rxtime, Pin(GPIO_FTC532)); -#endif // DEBUG_TASMOTA_DRIVER - ftc532_publish(); - Ftc532.old_keys = Ftc532.keys; +void ftc532_update(void) { // Usually called every 50 ms + uint16_t smp; + uint16_t i; + + while (i++ < FTC532_RETRY) { // fix 'ghost' keys from bad hardware + smp = Ftc532.sample; + if ((smp & 0xF0F0) != ((~smp & 0x0F0F) << 4)) { // inverted keys don't match + ++Ftc532.errors; +#ifdef DEBUG_FTC532 + AddLog_P(LOG_LEVEL_DEBUG, PSTR("FTC: SAM=%04X"), smp); +#endif // DEBUG_FTC532 + } else { + Ftc532.keys = (smp & 0xF) | ((smp >> 4) & 0xF0); + if (Ftc532.keys != Ftc532.old_keys) { +#ifdef DEBUG_FTC532 + AddLog_P(LOG_LEVEL_DEBUG, PSTR("FTC: SAM=%04X KEY=%02X OLD=%02X ERR=%u NOI=%u FRM=%u OK=%u TIME=%lu Pin=%u"), + Ftc532.sample, Ftc532.keys, Ftc532.old_keys, Ftc532.errors, Ftc532.noise, Ftc532.frame, Ftc532.valid, Ftc532.rxtime, Pin(GPIO_FTC532)); +#endif // DEBUG_FTC532 + ftc532_publish(); + Ftc532.old_keys = Ftc532.keys; + } + break; + } } } void ftc532_show() { - ResponseAppend_P(PSTR(",%s%02X\"}"), ftc532_json, Ftc532.keys); // Hex keys need JSON quotes + ResponseAppend_P(PSTR(",%s%02X\"}"), ftc532_json, Ftc532.keys); } void ftc532_publish(void) { - Response_P(PSTR("{%s%02X\"}}"), ftc532_json, Ftc532.keys); // Hex keys need JSON quotes + Response_P(PSTR("{%s%02X\"}}"), ftc532_json, Ftc532.keys); MqttPublishTeleSensor(); } From 928f6f94477dab4777f236e189641ed48482f010 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 15:03:56 +0100 Subject: [PATCH 112/255] Prep SPI SDCard support --- tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + tasmota/tasmota_template.h | 15 +++++++++------ 26 files changed, 34 insertions(+), 6 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 4eab30241..476726bfb 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index e9003a386..51a355887 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -777,6 +777,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 159d00878..571cdc769 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index cdbc1f994..e05128033 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 8e2e3f093..cfe86a0bb 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 2d6a47f43..fa8ab091d 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 31640385e..716048851 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 7bb645751..61e494c29 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -774,6 +774,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index ab7ff6d77..c69b67765 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index e2d335ce6..71271e34e 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 9aa08db46..04e295d97 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 - DC" #define D_SENSOR_SSD1331_CS "SSD1331 - CS" #define D_SENSOR_SSD1331_DC "SSD1331 - DC" +#define D_SENSOR_SDCARD_CS "SDCard - CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 0d9f91af4..d535c6f38 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 8087a8770..d7f11bd99 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 5919b35b5..b5fac0432 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 8069a265f..feb940b36 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index af9ee37a0..31d3b4a27 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index bf23a7c8d..0b8d26d20 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 965f5f5d7..7191969b7 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 20a691be6..787d841cb 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 18822f2b8..db6e9fc48 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index f307a9e73..5014afcd6 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 2626572ae..b027a95ac 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "А" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index d8d9d5124..0fb6cd6a4 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 1895fc690..05ca75c7b 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "安" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 2f2ec544e..384103e01 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -778,6 +778,7 @@ #define D_SENSOR_ST7789_DC "ST7789 DC" #define D_SENSOR_SSD1331_CS "SSD1331 CS" #define D_SENSOR_SSD1331_DC "SSD1331 DC" +#define D_SENSOR_SDCARD_CS "SDCard CS" // Units #define D_UNIT_AMPERE "安培" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 874f5ab2f..8e8de6142 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -142,6 +142,7 @@ enum UserSelectablePins { GPIO_RA8876_CS, GPIO_ST7789_CS, GPIO_ST7789_DC, GPIO_SSD1331_CS, GPIO_SSD1331_DC, + GPIO_SDCARD_CS, GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -304,6 +305,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_RA8876_CS "|" D_SENSOR_ST7789_CS "|" D_SENSOR_ST7789_DC "|" D_SENSOR_SSD1331_CS "|" D_SENSOR_SSD1331_DC "|" + D_SENSOR_SDCARD_CS "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -374,12 +376,9 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_RC522_CS), // RC522 Rfid Chip Select AGPIO(GPIO_RC522_RST), // RC522 Rfid Reset #endif -#ifdef USE_DISPLAY -#ifdef USE_DISPLAY_ILI9341 - AGPIO(GPIO_ILI9341_CS), - AGPIO(GPIO_ILI9341_DC), -#endif // USE_DISPLAY_ILI9341 -#endif // USE_DISPLAY +#ifdef USE_SDCARD + AGPIO(GPIO_SDCARD_CS), +#endif // USE_SDCARD #endif // USE_SPI AGPIO(GPIO_SSPI_MISO), // Software SPI Master Input Client Output AGPIO(GPIO_SSPI_MOSI), // Software SPI Master Output Client Input @@ -387,6 +386,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SSPI_CS), // Software SPI Chip Select AGPIO(GPIO_SSPI_DC), // Software SPI Data or Command #ifdef USE_DISPLAY +#ifdef USE_DISPLAY_ILI9341 + AGPIO(GPIO_ILI9341_CS), + AGPIO(GPIO_ILI9341_DC), +#endif // USE_DISPLAY_ILI9341 #ifdef USE_DISPLAY_ILI9488 AGPIO(GPIO_ILI9488_CS), #endif // USE_DISPLAY_ILI9488 From 0a882f53baa301229fc3c7379102c772c7eaea06 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 15:52:32 +0100 Subject: [PATCH 113/255] Update xdrv_98_filesystem.ino --- tasmota/xdrv_98_filesystem.ino | 338 +++++++++++++++++---------------- 1 file changed, 174 insertions(+), 164 deletions(-) diff --git a/tasmota/xdrv_98_filesystem.ino b/tasmota/xdrv_98_filesystem.ino index 932185c0c..1fadd6427 100644 --- a/tasmota/xdrv_98_filesystem.ino +++ b/tasmota/xdrv_98_filesystem.ino @@ -17,17 +17,19 @@ along with this program. If not, see . */ -/* -this driver adds universal file system support for -ESP8266 (sd card or littlfs on > 1 M devices with special linker file e.g. eagle.flash.4m2m.ld) -(makes no sense on 1M devices without sd card) -and -ESP32 (sd card or little fs or sfatfile system) -the sd card chip select is the standard SPI_CS or when not found SDCARD_CS_PIN -initializes the FS System Pointer ufsp which can be used by all standard file system calls -the only specific call is ufs_fsinfo() which gets the total size (0) and free size (1) -a button is created in the setup section to show up the file directory to download and upload files -subdirectories are supported +#ifdef USE_UFILESYS +/*********************************************************************************************\ +This driver adds universal file system support for ESP8266 (sd card or littlfs on > 1 M devices +with special linker file e.g. eagle.flash.4m2m.ld) (makes no sense on 1M devices without sd card) +and ESP32 (sd card or little fs or sfatfile system). + +The sd card chip select is the standard SDCARD_CS or when not found SDCARD_CS_PIN and initializes +the FS System Pointer ufsp which can be used by all standard file system calls. + +The only specific call is ufs_fsinfo() which gets the total size (0) and free size (1). + +A button is created in the setup section to show up the file directory to download and upload files +subdirectories are supported. console calls : @@ -36,16 +38,14 @@ ufstype get filesytem type 0=none 1=SD 2=Flashfile ufssize total size in kB ufsfree free size in kB -driver enabled by +The driver enabled by #define USE_UFILESYS +\*********************************************************************************************/ -#define USE_UFILESYS +#define XDRV_98 98 -*/ - - -#ifdef USE_UFILESYS - -#define XDRV_98 98 +#ifndef SDCARD_CS_PIN +#define SDCARD_CS_PIN 4 +#endif #ifdef ESP8266 #include @@ -53,15 +53,17 @@ driver enabled by #ifdef USE_SDCARD #include #include -#endif -#else +#endif // USE_SDCARD +#endif // ESP8266 + +#ifdef ESP32 #include #ifdef USE_SDCARD #include -#endif +#endif // USE_SDCARD #include "FFat.h" #include "FS.h" -#endif +#endif // ESP32 #define UFS_FILE_WRITE "w" #define UFS_FILE_READ "r" @@ -71,11 +73,6 @@ FS *ufsp; char ufs_path[48]; File ufs_upload_file; - -#ifndef SDCARD_CS_PIN -#define SDCARD_CS_PIN 4 -#endif - // 0 = none, 1 = SD, 2 = ffat, 3 = littlefs // spiffs should be obsolete uint8_t ufs_type; @@ -92,19 +89,20 @@ void UFSInit(void) { #ifdef USE_SDCARD -// if (TasmotaGlobal.spi_enabled) { - if (1) { + if (TasmotaGlobal.spi_enabled) { +// if (1) { int8_t cs = SDCARD_CS_PIN; - if (PinUsed(GPIO_SPI_CS)) { - cs = Pin(GPIO_SPI_CS); + if (PinUsed(GPIO_SDCARD_CS)) { + cs = Pin(GPIO_SDCARD_CS); } if (SD.begin(cs)) { #ifdef ESP8266 ufsp = (FS*)&SD; -#else +#endif // ESP8266 +#ifdef ESP32 ufsp = &SD; -#endif +#endif // ESP32 ufs_type = UFS_TSDC; return; } @@ -117,7 +115,8 @@ void UFSInit(void) { if (!LittleFS.begin()) { return; } -#else +#endif // ESP8266 +#ifdef ESP32 // try lfs first ufsp = &LITTLEFS; if (!LITTLEFS.begin(true)) { @@ -129,33 +128,35 @@ void UFSInit(void) { ufs_type = UFS_TFAT; return; } -#endif // ESP8266 +#endif // ESP32 ufs_type = UFS_TLFS; return; } uint32_t ufs_fsinfo(uint32_t sel) { -uint32_t result = 0; + uint32_t result = 0; + #ifdef ESP8266 -FSInfo64 fsinfo; -#endif + FSInfo64 fsinfo; +#endif // ESP8266 switch (ufs_type) { case UFS_TSDC: #ifdef USE_SDCARD -#ifdef ESP32 - if (sel == 0) { - result = SD.totalBytes(); - } else { - result = (SD.totalBytes() - SD.usedBytes()); - } -#else +#ifdef ESP8266 ufsp->info64(fsinfo); if (sel == 0) { result = fsinfo.totalBytes; } else { result = (fsinfo.totalBytes - fsinfo.usedBytes); } +#endif // ESP8266 +#ifdef ESP32 + if (sel == 0) { + result = SD.totalBytes(); + } else { + result = (SD.totalBytes() - SD.usedBytes()); + } #endif #endif //USE_SDCARD break; @@ -168,13 +169,14 @@ FSInfo64 fsinfo; } else { result = (fsinfo.totalBytes - fsinfo.usedBytes); } -#else +#endif // ESP8266 +#ifdef ESP32 if (sel == 0) { result = LITTLEFS.totalBytes(); } else { result = LITTLEFS.totalBytes() - LITTLEFS.usedBytes(); } -#endif // ESP8266 +#endif // ESP32 break; case UFS_TFAT: @@ -200,21 +202,20 @@ FSInfo64 fsinfo; #endif uint8_t ufs_reject(char *name) { - char *lcp = strrchr(name,'/'); if (lcp) { name = lcp + 1; } - while (*name=='/') name++; - if (*name=='_') return 1; - if (*name=='.') return 1; + while (*name=='/') { name++; } + if (*name=='_') { return 1; } + if (*name=='.') { return 1; } - if (!strncasecmp(name, "SPOTLI~1", REJCMPL)) return 1; - if (!strncasecmp(name, "TRASHE~1", REJCMPL)) return 1; - if (!strncasecmp(name, "FSEVEN~1", REJCMPL)) return 1; - if (!strncasecmp(name, "SYSTEM~1", REJCMPL)) return 1; - if (!strncasecmp(name, "System Volume", 13)) return 1; + if (!strncasecmp(name, "SPOTLI~1", REJCMPL)) { return 1; } + if (!strncasecmp(name, "TRASHE~1", REJCMPL)) { return 1; } + if (!strncasecmp(name, "FSEVEN~1", REJCMPL)) { return 1; } + if (!strncasecmp(name, "SYSTEM~1", REJCMPL)) { return 1; } + if (!strncasecmp(name, "System Volume", 13)) { return 1; } return 0; } @@ -225,35 +226,35 @@ void UFS_form1000(uint32_t number, char *dp, char sc) { char *sp = str; uint32_t inum = strlen(sp)/3; uint32_t fnum = strlen(sp)%3; - if (!fnum) inum--; - for (uint32_t count=0; count<=inum; count++) { - if (fnum){ - memcpy(dp,sp,fnum); - dp+=fnum; - sp+=fnum; - fnum=0; + if (!fnum) { inum--; } + for (uint32_t count = 0; count <= inum; count++) { + if (fnum) { + memcpy(dp, sp, fnum); + dp += fnum; + sp += fnum; + fnum = 0; } else { - memcpy(dp,sp,3); - dp+=3; - sp+=3; + memcpy(dp, sp, 3); + dp += 3; + sp += 3; } - if (count!=inum) { - *dp++=sc; + if (count != inum) { + *dp++ = sc; } } - *dp=0; + *dp = 0; } - -const char kUFSCommands[] PROGMEM = "UFS" "|" // Prefix - "|" "TYPE" "|" "SIZE" "|" "FREE"; +const char kUFSCommands[] PROGMEM = "Ufs" "|" // Prefix + "|" "Type" "|" "Size" "|" "Free"; void (* const kUFSCommand[])(void) PROGMEM = { &UFS_info, &UFS_type, &UFS_size, &UFS_free}; void UFS_info(void) { - Response_P(PSTR("{\"UFS\":{\"TYPE\":%d,\"SIZE\":%d,\"FREE\":%d}}"),ufs_type,ufs_fsinfo(0),ufs_fsinfo(1)); + Response_P(PSTR("{\"Ufs\":{\"Type\":%d,\"Size\":%d,\"Free\":%d}}"), ufs_type, ufs_fsinfo(0), ufs_fsinfo(1)); } + void UFS_type(void) { ResponseCmndNumber(ufs_type); } @@ -268,28 +269,28 @@ const char UFS_WEB_DIR[] PROGMEM = "

"; const char UFS_FILE_UPLOAD[] PROGMEM = D_SDCARD_DIR; const char UFS_FORM_FILE_UPLOAD[] PROGMEM = -"
" -"
 %s" " "; + "
" + "
 %s" " "; const char UFS_FORM_FILE_UPG[] PROGMEM = -"
" -"

" -"
"; + "
" + "

" + "
"; const char UFS_FORM_FILE_UPGc[] PROGMEM = -"
total size: %s kB - free: %s kB
"; + "
total size: %s kB - free: %s kB
"; const char UFS_FORM_SDC_DIRa[] PROGMEM = -"
"; + "
"; const char UFS_FORM_SDC_DIRc[] PROGMEM = -"
"; + "
"; const char UFS_FORM_FILE_UPGb[] PROGMEM = -"
" -"
" -""; + "
" + "
" + ""; const char UFS_FORM_SDC_DIRd[] PROGMEM = -"
%s
"; + "
%s
"; const char UFS_FORM_SDC_DIRb[] PROGMEM = - "
%s     %s : %8d
"; + "
%s     %s : %8d
"; const char UFS_FORM_SDC_HREF[] PROGMEM = - "http://%s/ufsd?download=%s/%s"; + "http://%s/ufsd?download=%s/%s"; void UFSdirectory(void) { uint8_t depth = 0; @@ -324,7 +325,6 @@ void UFSdirectory(void) { WSContentSpaceButton(BUTTON_CONFIGURATION); WSContentStop(); Web.upload_error = 0; - } void UFS_ListDir(char *path, uint8_t depth) { @@ -337,15 +337,18 @@ void UFS_ListDir(char *path, uint8_t depth) { if (dir) { dir.rewindDirectory(); if (strlen(path)>1) { - snprintf_P(npath, sizeof(npath), PSTR("http://%s/ufsd?download=%s"), WiFi.localIP().toString().c_str(),path); - for (uint8_t cnt = strlen(npath) - 1; cnt>0; cnt--) { - if (npath[cnt]=='/') { - if (npath[cnt - 1]=='=') npath[cnt + 1] = 0; - else npath[cnt] = 0; + snprintf_P(npath, sizeof(npath), PSTR("http://%s/ufsd?download=%s"), WiFi.localIP().toString().c_str(), path); + for (uint32_t cnt = strlen(npath) - 1; cnt > 0; cnt--) { + if (npath[cnt] == '/') { + if (npath[cnt - 1] == '=') { + npath[cnt + 1] = 0; + } else { + npath[cnt] = 0; + } break; } } - WSContentSend_P(UFS_FORM_SDC_DIRd, npath,path, ".."); + WSContentSend_P(UFS_FORM_SDC_DIRd, npath, path, ".."); } char *ep; while (true) { @@ -355,17 +358,17 @@ void UFS_ListDir(char *path, uint8_t depth) { } // esp32 returns path here, shorten to filename ep = (char*)entry.name(); - if (*ep=='/') ep++; + if (*ep == '/') { ep++; } char *lcp = strrchr(ep,'/'); if (lcp) { ep = lcp + 1; } time_t tm = entry.getLastWrite(); char tstr[24]; - strftime(tstr, 22, "%d-%m-%Y - %H:%M:%S ", localtime(&tm)); + strftime(tstr, 22, "%d-%m-%Y - %H:%M:%S ", localtime(&tm)); // Theo note to me. Isn't strftime expensive? SHould use ISO Date/Time char *pp = path; - if (!*(pp + 1)) pp++; + if (!*(pp + 1)) { pp++; } char *cp = name; // osx formatted disks contain a lot of stuff we dont want if (!ufs_reject((char*)ep)) { @@ -376,17 +379,17 @@ void UFS_ListDir(char *path, uint8_t depth) { sprintf(cp, format, ep); if (entry.isDirectory()) { - snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp,ep); - WSContentSend_P(UFS_FORM_SDC_DIRd, npath,ep,name); + snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp, ep); + WSContentSend_P(UFS_FORM_SDC_DIRd, npath, ep, name); uint8_t plen = strlen(path); - if (plen>1) { + if (plen > 1) { strcat(path, "/"); } strcat(path, ep); UFS_ListDir(path, depth + 4); path[plen] = 0; } else { - snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp,ep); + snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, WiFi.localIP().toString().c_str(), pp, ep); WSContentSend_P(UFS_FORM_SDC_DIRb, npath, ep, name, tstr, entry.size()); } } @@ -400,61 +403,61 @@ uint8_t UFS_DownloadFile(char *file) { File download_file; WiFiClient download_Client; - if (!ufsp->exists(file)) { - AddLog_P(LOG_LEVEL_INFO, PSTR("file not found")); - return 0; - } - - download_file = ufsp->open(file, UFS_FILE_READ); - if (!download_file) { - AddLog_P(LOG_LEVEL_INFO, PSTR("could not open file")); - return 0; - } - - if (download_file.isDirectory()) { - download_file.close(); - return 1; - } - - uint32_t flen = download_file.size(); - - download_Client = Webserver->client(); - Webserver->setContentLength(flen); - - char attachment[100]; - char *cp; - for (uint8_t cnt = strlen(file); cnt>=0; cnt--) { - if (file[cnt]=='/') { - cp = &file[cnt + 1]; - break; - } - } - snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=%s"), cp); - Webserver->sendHeader(F("Content-Disposition"), attachment); - WSSend(200, CT_STREAM, ""); - - uint8_t buff[512]; - uint16_t bread; - - // transfer is about 150kb/s - uint8_t cnt = 0; - while (download_file.available()) { - bread = download_file.read(buff, sizeof(buff)); - uint16_t bw = download_Client.write((const char*)buff, bread); - if (!bw) break; - cnt++; - if (cnt>7) { - cnt = 0; - //if (glob_script_mem.script_loglevel & 0x80) { - // this indeed multitasks, but is slower 50 kB/s - // loop(); - //} - } - delay(0); - } - download_file.close(); - download_Client.stop(); + if (!ufsp->exists(file)) { + AddLog_P(LOG_LEVEL_INFO, PSTR("UFS: File not found")); return 0; + } + + download_file = ufsp->open(file, UFS_FILE_READ); + if (!download_file) { + AddLog_P(LOG_LEVEL_INFO, PSTR("UFS: Could not open file")); + return 0; + } + + if (download_file.isDirectory()) { + download_file.close(); + return 1; + } + + uint32_t flen = download_file.size(); + + download_Client = Webserver->client(); + Webserver->setContentLength(flen); + + char attachment[100]; + char *cp; + for (uint32_t cnt = strlen(file); cnt >= 0; cnt--) { + if (file[cnt] == '/') { + cp = &file[cnt + 1]; + break; + } + } + snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=%s"), cp); + Webserver->sendHeader(F("Content-Disposition"), attachment); + WSSend(200, CT_STREAM, ""); + + uint8_t buff[512]; + uint32_t bread; + + // transfer is about 150kb/s + uint32_t cnt = 0; + while (download_file.available()) { + bread = download_file.read(buff, sizeof(buff)); + uint32_t bw = download_Client.write((const char*)buff, bread); + if (!bw) { break; } + cnt++; + if (cnt > 7) { + cnt = 0; + //if (glob_script_mem.script_loglevel & 0x80) { + // this indeed multitasks, but is slower 50 kB/s + // loop(); + //} + } + delay(0); + } + download_file.close(); + download_Client.stop(); + return 0; } void UFS_Upload(void) { @@ -464,16 +467,20 @@ void UFS_Upload(void) { sprintf(npath, "%s/%s", ufs_path, upload.filename.c_str()); ufsp->remove(npath); ufs_upload_file = ufsp->open(npath, UFS_FILE_WRITE); - if (!ufs_upload_file) Web.upload_error = 1; - } else if(upload.status == UPLOAD_FILE_WRITE) { - if (ufs_upload_file) ufs_upload_file.write(upload.buf, upload.currentSize); - } else if(upload.status == UPLOAD_FILE_END) { - if (ufs_upload_file) ufs_upload_file.close(); + if (!ufs_upload_file) { Web.upload_error = 1; } + } + else if (upload.status == UPLOAD_FILE_WRITE) { + if (ufs_upload_file) { + ufs_upload_file.write(upload.buf, upload.currentSize); + } + } + else if (upload.status == UPLOAD_FILE_END) { + if (ufs_upload_file) { ufs_upload_file.close(); } if (Web.upload_error) { AddLog_P(LOG_LEVEL_INFO, PSTR("HTP: upload error")); } } else { - Web.upload_error=1; + Web.upload_error = 1; WSSend(500, CT_PLAIN, F("500: couldn't create file")); } } @@ -484,7 +491,7 @@ void UFSFileUploadSuccess(void) { WSContentSend_P(PSTR("
" D_UPLOAD " " D_SUCCESSFUL "
"), WebColor(COL_TEXT_SUCCESS)); WSContentSend_P(PSTR("

")); - WSContentSend_P(PSTR("

"),"/ufsd",D_UPL_DONE); + WSContentSend_P(PSTR("

"), "/ufsd", D_UPL_DONE); WSContentStop(); } @@ -513,7 +520,10 @@ bool Xdrv98(uint8_t function) { case FUNC_WEB_ADD_HANDLER: Webserver->on("/ufsd", UFSdirectory); Webserver->on("/ufsu", HTTP_GET, UFSFileUploadSuccess); - Webserver->on("/ufsu", HTTP_POST,[]() { Webserver->sendHeader("Location","/ufsu");Webserver->send(303);}, UFS_Upload); + Webserver->on("/ufsu", HTTP_POST,[]() { + Webserver->sendHeader("Location","/ufsu"); + Webserver->send(303); + }, UFS_Upload); break; #endif // USE_WEBSERVER } From aa943fc696802ecb5946f78f0f5ecce0641dd365 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 16:10:22 +0100 Subject: [PATCH 114/255] Add ESP32 RTOS timesync --- tasmota/support_rtc.ino | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tasmota/support_rtc.ino b/tasmota/support_rtc.ino index fc8a14042..9884b337f 100644 --- a/tasmota/support_rtc.ino +++ b/tasmota/support_rtc.ino @@ -400,6 +400,15 @@ void RtcSecond(void) } else { TasmotaGlobal.rules_flag.time_set = 1; } + +#ifdef ESP32 + // Sync RTOS time to be used by SD Card time stamps + struct timeval tv; + tv.tv_sec = Rtc.local_time; + tv.tv_usec = 0; + settimeofday(&tv, nullptr); +#endif // ESP32 + } else { Rtc.utc_time++; // Increment every second } From a2ea85d6a1f9c51a8d06fb0624cba8f533ec33aa Mon Sep 17 00:00:00 2001 From: Marcus Date: Mon, 4 Jan 2021 16:19:23 +0100 Subject: [PATCH 115/255] rewrite the interface to values from mqtt_data --- tasmota/xdrv_92_pid.ino | 48 +++++++++++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/tasmota/xdrv_92_pid.ino b/tasmota/xdrv_92_pid.ino index 1a3f7b59b..a3a10b0ce 100644 --- a/tasmota/xdrv_92_pid.ino +++ b/tasmota/xdrv_92_pid.ino @@ -182,17 +182,43 @@ void PID_Show_Sensor() { // Update period is specified in TELE_PERIOD // e.g. "{"Time":"2018-03-13T16:48:05","DS18B20":{"Temperature":22.0},"TempUnit":"C"}" AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor: mqtt_data: %s"), TasmotaGlobal.mqtt_data); - StaticJsonBuffer<400> jsonBuffer; - // force mqtt_data to read only to stop parse from overwriting it - JsonObject& data_json = jsonBuffer.parseObject((const char*)mqtt_data); - if (data_json.success()) { - const char* value = data_json["DS18B20"]["Temperature"]; + AddLog_P(LOG_LEVEL_INFO, PSTR("length of MQTT MEssage: %d"), sizeof(TasmotaGlobal.mqtt_data)); + + // I need a copy of the mqtt buffer, because otherwise the actual + // message will be truncated after this call: + // JsonParser parser( (char*)TasmotaGlobal.mqtt_data); + char mqtt_buf[sizeof(TasmotaGlobal.mqtt_data)]; + strncpy (mqtt_buf, TasmotaGlobal.mqtt_data, 300); + + JsonParser parser( (char*)mqtt_buf); + JsonParserObject root = parser.getRootObject(); + if (!root) { + AddLog_P(LOG_LEVEL_ERROR, PSTR("Invalid JSON in PID processing: %s"), mqtt_buf); + } + + // Check if there is a named entry in the json: + JsonParserToken ds18b20_entry = root[PSTR("DS18B20")]; + if (ds18b20_entry) { + // create a new object for the DS18B20 branch: + JsonParserObject ds18b20_obj = root[PSTR("DS18B20")].getObject(); + if (ds18b20_obj) { + float ds18b20_temperature = 666; // use a temperature outside the range as a default + JsonParserToken ds18b20_temperature_token = ds18b20_obj[PSTR("Temperature")]; + if (ds18b20_temperature_token) { + ds18b20_temperature = ds18b20_obj.getFloat(PSTR("Temperature"), 665); + + char the_value[10]; + dtostrfd(ds18b20_temperature, 3, the_value); + AddLog_P(LOG_LEVEL_INFO, PSTR("the_value: %s"), the_value); + } else { + AddLog_P(LOG_LEVEL_ERROR, PSTR("No Temperature found in DS18B20")); + } // check that something was found and it contains a number - if (value != NULL && strlen(value) > 0 && (isdigit(value[0]) || (value[0] == '-' && isdigit(value[1])) ) ) { - AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor: Temperature: %s"), value); + if (ds18b20_temperature < 130) { // maximal range of DS18B20 is 125 + AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor: Temperature: %f"), ds18b20_temperature); // pass the value to the pid alogorithm to use as current pv last_pv_update_secs = pid_current_time_secs; - pid.setPv(atof(value), last_pv_update_secs); + pid.setPv(ds18b20_temperature, last_pv_update_secs); // also trigger running the pid algorithm if we have been told to run it each pv sample if (update_secs == 0) { // this runs it at the next second @@ -201,7 +227,10 @@ void PID_Show_Sensor() { } else { AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor - no temperature found")); } - } else { + } else {// if no ds18b20_obj found + AddLog_P(LOG_LEVEL_ERROR, PSTR("Invalid JSON in PID processing...")); + } + } else { // no ds18b20 key found // parse failed AddLog_P(LOG_LEVEL_INFO, PSTR("PID_Show_Sensor - json parse failed")); } @@ -321,6 +350,7 @@ static void run_pid() dtostrfd(power, 3, buf); snprintf_P(TasmotaGlobal.mqtt_data, sizeof(TasmotaGlobal.mqtt_data), PSTR("{\"%s\":\"%s\"}"), "power", buf); MqttPublishPrefixTopic_P(TELE, "PID", false); + AddLog_P (LOG_LEVEL_INFO, PSTR("power: %s"), buf); #if defined PID_SHUTTER // send output as a position from 0-100 to defined shutter From 448daed0d10cdfdfe0b175880f145ff58d0fbad7 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 4 Jan 2021 16:29:34 +0100 Subject: [PATCH 116/255] picture buttons part 1 --- .../Adafruit_GFX.cpp | 24 +++++++----- .../ILI9341-gemu-1.0/ILI9341_2.cpp | 6 +++ lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h | 26 +------------ .../JaretBurkett_ILI9488-gemu-1.0/ILI9488.cpp | 32 +++++++++++++--- .../JaretBurkett_ILI9488-gemu-1.0/ILI9488.h | 1 + .../src/renderer.cpp | 38 +++++++++++++------ .../src/renderer.h | 1 + 7 files changed, 77 insertions(+), 51 deletions(-) diff --git a/lib/lib_display/Adafruit-GFX-Library-1.5.6-gemu-1.0/Adafruit_GFX.cpp b/lib/lib_display/Adafruit-GFX-Library-1.5.6-gemu-1.0/Adafruit_GFX.cpp index 8741e6247..a40702660 100644 --- a/lib/lib_display/Adafruit-GFX-Library-1.5.6-gemu-1.0/Adafruit_GFX.cpp +++ b/lib/lib_display/Adafruit-GFX-Library-1.5.6-gemu-1.0/Adafruit_GFX.cpp @@ -1579,6 +1579,8 @@ void Adafruit_GFX_Button::initButtonUL( strncpy(_label, label, 9); } +void draw_picture(char *path, uint32_t xp, uint32_t yp, uint32_t xs, uint32_t ys, bool inverted); + /**************************************************************************/ /*! @brief Draw the button on the screen @@ -1598,16 +1600,20 @@ void Adafruit_GFX_Button::drawButton(boolean inverted) { text = _fillcolor; } - uint8_t r = min(_w, _h) / 4; // Corner radius - _gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill); - _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline); - - _gfx->setCursor(_x1 + (_w/2) - (strlen(_label) * 3 * _textsize_x), - _y1 + (_h/2) - (4 * _textsize_y)); - _gfx->setTextColor(text); - _gfx->setTextSize(_textsize_x, _textsize_y); - _gfx->print(_label); + if (_label[0]=='/') { + // picture path + draw_picture(_label, _x1, _y1, _w, _h, inverted); + _gfx->drawRect(_x1, _y1, _w, _h, text); + } else { + uint8_t r = min(_w, _h) / 4; // Corner radius + _gfx->fillRoundRect(_x1, _y1, _w, _h, r, fill); + _gfx->drawRoundRect(_x1, _y1, _w, _h, r, outline); + _gfx->setCursor(_x1 + (_w/2) - (strlen(_label) * 3 * _textsize_x), _y1 + (_h/2) - (4 * _textsize_y)); + _gfx->setTextColor(text); + _gfx->setTextSize(_textsize_x, _textsize_y); + _gfx->print(_label); + } } /**************************************************************************/ diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp index a4391f10e..d590cdc14 100644 --- a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp @@ -545,6 +545,12 @@ void ILI9341_2::DisplayOnff(int8_t on) { } } +void ILI9341_2::invertDisplay(boolean i) { + ILI9341_2_CS_LOW + writecmd(i ? ILI9341_2_INVOFF : ILI9341_2_INVON); + ILI9341_2_CS_HIGH +} + void ili9342_dimm(uint8_t dim); // dimmer 0-100 diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h index 27ff00e5d..a4608e6ba 100644 --- a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h +++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.h @@ -119,30 +119,6 @@ class ILI9341_2 : public Renderer { ILI9341_2(int8_t cs, int8_t res, int8_t dc, int8_t bp); void init(uint16_t width, uint16_t height); - /* - void begin(void); - void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font); - void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); - void setScrollArea(uint16_t topFixedArea, uint16_t bottomFixedArea); - void scroll(uint16_t pixels); - void pushColor(uint16_t color); - void pushColors(uint16_t *data, uint8_t len, boolean first); - //void drawImage(const uint8_t* img, uint16_t x, uint16_t y, uint16_t w, uint16_t h); - void fillScreen(uint16_t color); - void drawPixel(int16_t x, int16_t y, uint16_t color); - void drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color); - void drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color); - void fillRect(int16_t x, int16_t y, int16_t w, int16_t h,uint16_t color); - void setRotation(uint8_t r); - void invertDisplay(boolean i); - uint16_t color565(uint8_t r, uint8_t g, uint8_t b); - void DisplayOnff(int8_t on); - void writecommand(uint8_t c); - void writedata(uint8_t d); - void write16BitColor(uint16_t color); - void commandList(uint8_t *addr); - void hw_spi_init(); - void dim(uint8_t contrast);*/ uint16_t GetColorFromIndex(uint8_t index); private: @@ -161,7 +137,7 @@ class ILI9341_2 : public Renderer { void fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color); void dim(uint8_t dim); void pushColors(uint16_t *data, uint8_t len, boolean first); - + void invertDisplay(boolean i); void spiwrite(uint8_t c); void spiwrite16(uint16_t c); void spiwrite32(uint32_t c); diff --git a/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.cpp b/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.cpp index 357000a69..61dea05c1 100644 --- a/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.cpp +++ b/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.cpp @@ -503,6 +503,16 @@ void ILI9488::scroll(uint16_t pixels){ }*/ void ILI9488::setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + if (!x0 && !y0 && !x1 && !y1) { + x0=0; + y0=0; + x1=_width; + y1=_height; + } + setAddrWindow_int(x0, y0, x1-1, y1-1); +} + +void ILI9488::setAddrWindow_int(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { uint8_t flag=0; if (!x0 && !y0 && !x1 && !y1) { @@ -594,6 +604,7 @@ void ILI9488::pushColor(uint16_t color) { ILI9488_STOP } +#if 1 void ILI9488::pushColors(uint16_t *data, uint8_t len, boolean first) { uint16_t color; uint8_t buff[len*3+1]; @@ -616,6 +627,17 @@ void ILI9488::pushColors(uint16_t *data, uint8_t len, boolean first) { ILI9488_STOP } +#else + +void ILI9488::pushColors(uint16_t *data, uint8_t len, boolean first) { + uint16_t color; + + while (len--) { + write16BitColor(*data++); + } + ILI9488_STOP +} +#endif void ILI9488::write16BitColor(uint16_t color){ // #if (__STM32F1__) @@ -688,7 +710,7 @@ void ILI9488::drawPixel(int16_t x, int16_t y, uint16_t color) { if((x < 0) ||(x >= _width) || (y < 0) || (y >= _height)) return; - setAddrWindow(x,y,x+1,y+1); + setAddrWindow_int(x,y,x+1,y+1); write16BitColor(color); ILI9488_STOP } @@ -702,7 +724,7 @@ void ILI9488::drawFastVLine(int16_t x, int16_t y, int16_t h, if((y+h-1) >= _height) h = _height-y; - setAddrWindow(x, y, x, y+h-1); + setAddrWindow_int(x, y, x, y+h-1); uint8_t r = (color & 0xF800) >> 11; uint8_t g = (color & 0x07E0) >> 5; @@ -770,7 +792,7 @@ void ILI9488::drawFastHLine(int16_t x, int16_t y, int16_t w, if((x >= _width) || (y >= _height)) return; if((x+w-1) >= _width) w = _width-x; - setAddrWindow(x, y, x+w-1, y); + setAddrWindow_int(x, y, x+w-1, y); uint8_t r = (color & 0xF800) >> 11; uint8_t g = (color & 0x07E0) >> 5; @@ -905,7 +927,7 @@ void ILI9488::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t colo if((x + w - 1) >= _width) w = _width - x; if((y + h - 1) >= _height) h = _height - y; - setAddrWindow(x, y, x+w-1, y+h-1); + setAddrWindow_int(x, y, x+w-1, y+h-1); //ILI9488_START uint8_t r = (color & 0xF800) >> 11; @@ -1050,7 +1072,7 @@ void ILI9488::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t colo if((x + w - 1) >= _width) w = _width - x; if((y + h - 1) >= _height) h = _height - y; - setAddrWindow(x, y, x+w-1, y+h-1); + setAddrWindow_int(x, y, x+w-1, y+h-1); uint8_t r = (color & 0xF800) >> 11; uint8_t g = (color & 0x07E0) >> 5; diff --git a/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.h b/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.h index 5fd2e39e5..50557822e 100644 --- a/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.h +++ b/lib/lib_display/JaretBurkett_ILI9488-gemu-1.0/ILI9488.h @@ -136,6 +136,7 @@ class ILI9488 : public Renderer { void begin(void); void DisplayInit(int8_t p,int8_t size,int8_t rot,int8_t font); + void setAddrWindow_int(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); void setScrollArea(uint16_t topFixedArea, uint16_t bottomFixedArea); void scroll(uint16_t pixels); diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp b/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp index a8f0f9e57..1b78aaa9a 100644 --- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp +++ b/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.cpp @@ -32,6 +32,10 @@ //#define USE_GFX_FONTS #define USE_TINY_FONT +#ifdef ESP32 +#define USE_ICON_FONT +#endif + uint8_t wr_redir=0; uint8_t *buffer; @@ -223,27 +227,32 @@ void Renderer::setTextFont(uint8_t f) { break; case 7: selected_font = &RAFont; + break; default: - font=0; + selected_font = &Font12; + break; } #else #ifdef USE_EPD_FONTS - if (1 == font) { + switch (font) { selected_font = &Font12; - } else { - #ifdef USE_TINY_FONT - if (2 == font) { - selected_font = &Font24; - } else { - selected_font = &Font8; - } - #else + break; + case 2: selected_font = &Font24; - #endif + break; + case 3: +#ifdef USE_TINY_FONT + selected_font = &Font8; +#else + selected_font = &Font24; +#endif + break; + default: + selected_font = &Font12; + break; } #endif #endif - } @@ -513,6 +522,9 @@ void Renderer::setDrawMode(uint8_t mode) { drawmode=mode; } +void Renderer::invertDisplay(boolean i) { +} + void VButton::xdrawButton(bool inverted) { wr_redir=1; drawButton(inverted); @@ -520,4 +532,6 @@ void VButton::xdrawButton(bool inverted) { } + + /* END OF FILE */ diff --git a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h b/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h index 27ff56efe..0685b9bb1 100644 --- a/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h +++ b/lib/lib_display/esp-epaper-29-ws-20171230-gemu-1.1/src/renderer.h @@ -35,6 +35,7 @@ public: virtual void dim(uint8_t contrast); virtual void pushColors(uint16_t *data, uint8_t len, boolean first); virtual void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); + virtual void invertDisplay(boolean i); void setDrawMode(uint8_t mode); uint8_t drawmode; virtual void FastString(uint16_t x,uint16_t y,uint16_t tcolor, const char* str); From 5d8b10141a8d9b48ec35788752e1d07b11754e57 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 4 Jan 2021 16:34:44 +0100 Subject: [PATCH 117/255] picture buttons part 2 --- tasmota/support_jpeg.ino | 22 ++++++++- tasmota/xdrv_13_display.ino | 88 +++++++++++++++++++++++------------ tasmota/xdsp_05_epaper_29.ino | 1 + tasmota/xdsp_12_ST7789.ino | 12 ++--- tasmota/xdsp_13_ILI9341-2.ino | 5 +- 5 files changed, 83 insertions(+), 45 deletions(-) diff --git a/tasmota/support_jpeg.ino b/tasmota/support_jpeg.ino index 4669b9ad7..2ebce0e4c 100644 --- a/tasmota/support_jpeg.ino +++ b/tasmota/support_jpeg.ino @@ -29,9 +29,27 @@ uint8_t red, grn, blu; uint16_t b , g, r; for (uint32_t cnt=0; cnt> 3) & 0x1f; + g = ((grn >> 2) & 0x3f) << 5; + r = ((red >> 3) & 0x1f) << 11; + *out++ = (r | g | b); + } + +} + +void rgb888_to_565i(uint8_t *in, uint16_t *out, uint32_t len) { +uint8_t red, grn, blu; +uint16_t b , g, r; + + for (uint32_t cnt=0; cnt> 3) & 0x1f; g = ((grn >> 2) & 0x3f) << 5; r = ((red >> 3) & 0x1f) << 11; diff --git a/tasmota/xdrv_13_display.ino b/tasmota/xdrv_13_display.ino index 6bdab9d03..3a1abe6d2 100644 --- a/tasmota/xdrv_13_display.ino +++ b/tasmota/xdrv_13_display.ino @@ -503,7 +503,7 @@ void DisplayText(void) if (ep) { *ep=0; ep++; - Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos); + Draw_RGB_Bitmap(cp,disp_xpos,disp_ypos, false); cp=ep; } } @@ -1423,7 +1423,7 @@ void CmndDisplayDimmer(void) void CmndDisplayBlinkrate(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 3)) { - + if (!renderer) XdspCall(FUNC_DISPLAY_BLINKRATE); } @@ -1540,20 +1540,39 @@ void CmndDisplayRows(void) /*********************************************************************************************\ * optional drivers \*********************************************************************************************/ + +#ifdef USE_TOUCH_BUTTONS +// very limited path size, so, add .jpg +void draw_picture(char *path, uint32_t xp, uint32_t yp, uint32_t xs, uint32_t ys, bool inverted) { +char ppath[16]; + strcpy(ppath, path); + uint8_t plen = strlen(path) -1; + if (ppath[plen]=='1') { + // index mode + if (inverted) { + ppath[plen] = '2'; + } + inverted = false; + } + strcat(ppath, ".jpg"); + Draw_RGB_Bitmap(ppath, xp, yp, inverted); +} +#endif + + #ifdef ESP32 #ifdef JPEG_PICTS #include "img_converters.h" #include "esp_jpg_decode.h" bool jpg2rgb888(const uint8_t *src, size_t src_len, uint8_t * out, jpg_scale_t scale); char get_jpeg_size(unsigned char* data, unsigned int data_size, unsigned short *width, unsigned short *height); -void rgb888_to_565(uint8_t *in, uint16_t *out, uint32_t len); #endif // JPEG_PICTS #endif // ESP32 -#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) +#if defined(USE_SCRIPT_FATFS) && defined(USE_SCRIPT) && defined(USE_DISPLAY) extern FS *fsp; #define XBUFF_LEN 128 -void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) { +void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp, bool inverted ) { if (!renderer) return; File fp; char *ending = strrchr(file,'.'); @@ -1602,34 +1621,41 @@ void Draw_RGB_Bitmap(char *file,uint16_t xp, uint16_t yp) { // jpeg files on ESP32 with more memory #ifdef ESP32 #ifdef JPEG_PICTS - if (psramFound()) { - fp=fsp->open(file,FILE_READ); - if (!fp) return; - uint32_t size = fp.size(); - uint8_t *mem = (uint8_t *)heap_caps_malloc(size+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (mem) { - uint8_t res=fp.read(mem, size); - if (res) { - uint16_t xsize; - uint16_t ysize; - if (mem[0]==0xff && mem[1]==0xd8) { - get_jpeg_size(mem, size, &xsize, &ysize); - //Serial.printf(" x,y %d - %d\n",xsize, ysize ); - if (xsize && ysize) { - uint8_t *out_buf = (uint8_t *)heap_caps_malloc((xsize*ysize*3)+4, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); - if (out_buf) { + fp=fsp->open(file,FILE_READ); + if (!fp) return; + uint32_t size = fp.size(); + uint8_t *mem = (uint8_t *)special_malloc(size+4); + if (mem) { + uint8_t res=fp.read(mem, size); + if (res) { + uint16_t xsize; + uint16_t ysize; + if (mem[0]==0xff && mem[1]==0xd8) { + get_jpeg_size(mem, size, &xsize, &ysize); + //Serial.printf(" x,y,fs %d - %d - %d\n",xsize, ysize, size ); + if (xsize && ysize) { + uint8_t *out_buf = (uint8_t *)special_malloc((xsize*ysize*3)+4); + if (out_buf) { + uint16_t *pixb = (uint16_t *)special_malloc((xsize*2)+4); + if (pixb) { uint8_t *ob=out_buf; - jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE); - uint16_t pixels=xsize*ysize/XBUFF_LEN; - renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize); - for(int32_t j=0; jpushColors(rbuff,XBUFF_LEN,true); - OsWatchLoop(); + if (jpg2rgb888(mem, size, out_buf, (jpg_scale_t)JPG_SCALE_NONE)) { + renderer->setAddrWindow(xp,yp,xp+xsize,yp+ysize); + for(int32_t j=0; jpushColors(pixb, xsize, true); + OsWatchLoop(); + } + renderer->setAddrWindow(0,0,0,0); } - renderer->setAddrWindow(0,0,0,0); + free(out_buf); + free(pixb); + } else { free(out_buf); } } diff --git a/tasmota/xdsp_05_epaper_29.ino b/tasmota/xdsp_05_epaper_29.ino index a607bd937..d9c35435f 100644 --- a/tasmota/xdsp_05_epaper_29.ino +++ b/tasmota/xdsp_05_epaper_29.ino @@ -83,6 +83,7 @@ void EpdInitDriver29(void) { #ifdef SHOW_SPLASH // Welcome text + delay(100); renderer->setTextFont(1); renderer->DrawStringAt(50, 50, "Waveshare E-Paper Display!", COLORED,0); renderer->Updateframe(); diff --git a/tasmota/xdsp_12_ST7789.ino b/tasmota/xdsp_12_ST7789.ino index 80cf4d6e5..be3a40da9 100644 --- a/tasmota/xdsp_12_ST7789.ino +++ b/tasmota/xdsp_12_ST7789.ino @@ -112,14 +112,8 @@ void ST7789_InitDriver(void) { #ifdef SHOW_SPLASH // Welcome text renderer->setTextColor(ST7789_WHITE,ST7789_BLACK); - int fontSize = 2; renderer->setTextFont(2); - if (Settings.display_width<240) { - fontSize = 1; - } - renderer->setTextFont(fontSize); - int fontHeight = 12 * fontSize; - renderer->DrawStringAt(30, (Settings.display_height-fontHeight)/2, "ST7789 TFT!", ST7789_WHITE,0); + renderer->DrawStringAt(30, (Settings.display_height-12)/2, "ST7789 TFT!", ST7789_WHITE,0); delay(1000); #endif @@ -131,8 +125,8 @@ void ST7789_InitDriver(void) { #define SDA_2 23 #define SCL_2 32 #ifdef USE_LANBON_L8 - #undef SDA_2 - #undef SCL_2 + #undef SDA_2 + #undef SCL_2 #define SDA_2 4 #define SCL_2 0 #endif // USE_LANBON_L8 diff --git a/tasmota/xdsp_13_ILI9341-2.ino b/tasmota/xdsp_13_ILI9341-2.ino index 6095b5c53..cb0e4616e 100644 --- a/tasmota/xdsp_13_ILI9341-2.ino +++ b/tasmota/xdsp_13_ILI9341-2.ino @@ -94,10 +94,9 @@ void ILI9341_2_InitDriver() #ifdef SHOW_SPLASH // Welcome text renderer->setTextFont(2); - renderer->setTextColor(ILI9341_2_WHITE,ILI9341_2_BLACK); - renderer->DrawStringAt(20, 140, "ILI9341 TFT!", ILI9341_2_RED,0); + renderer->setTextColor(ILI9341_2_WHITE, ILI9341_2_BLACK); + renderer->DrawStringAt(30, (Settings.display_height/2)-12, "ILI9341 TFT!", ILI9341_2_WHITE, 0); delay(1000); - renderer->clearDisplay(); #endif color_type = COLOR_COLOR; From 1d572ea304a97fcff7b68a80f8f3605037b72c6f Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Mon, 4 Jan 2021 16:39:00 +0100 Subject: [PATCH 118/255] special malloc --- tasmota/support_esp32.ino | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tasmota/support_esp32.ino b/tasmota/support_esp32.ino index 0554129e8..79821806b 100644 --- a/tasmota/support_esp32.ino +++ b/tasmota/support_esp32.ino @@ -86,6 +86,11 @@ uint32_t FlashWriteMaxSector(void) { uint8_t* FlashDirectAccess(void) { return (uint8_t*)(0x40200000 + (FlashWriteStartSector() * SPI_FLASH_SEC_SIZE)); } + +void *special_malloc(uint32_t size) { + return malloc(size); +} + #endif /*********************************************************************************************\ @@ -414,4 +419,13 @@ uint8_t* FlashDirectAccess(void) { return data; } -#endif // ESP32 \ No newline at end of file + +void *special_malloc(uint32_t size) { + if (psramFound()) { + return heap_caps_malloc(size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + } else { + return malloc(size); + } +} + +#endif // ESP32 From 97da3c7034a5464df3daa359fdf58437764910d1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 4 Jan 2021 16:45:46 +0100 Subject: [PATCH 119/255] Add SDCard detection --- tasmota/support_tasmota.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 84bc2dd53..d58447337 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1615,7 +1615,8 @@ void GpioInit(void) ValidSpiPinUsed(GPIO_RA8876_CS) || ValidSpiPinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too ValidSpiPinUsed(GPIO_ST7789_CS) || - ValidSpiPinUsed(GPIO_SSD1331_CS) + ValidSpiPinUsed(GPIO_SSD1331_CS) || + ValidSpiPinUsed(GPIO_SDCARD_CS) ); bool valid_dc = (ValidSpiPinUsed(GPIO_SPI_DC) || ValidSpiPinUsed(GPIO_NRF24_DC) || @@ -1647,7 +1648,8 @@ void GpioInit(void) PinUsed(GPIO_RA8876_CS) || PinUsed(GPIO_ST7789_DC) || // ST7789 CS may be omitted so chk DC too PinUsed(GPIO_ST7789_CS) || - PinUsed(GPIO_SSD1331_CS) + PinUsed(GPIO_SSD1331_CS) || + PinUsed(GPIO_SDCARD_CS) ) { uint32_t spi_mosi = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MOSI)) ? SPI_MOSI : SPI_NONE; uint32_t spi_miso = (PinUsed(GPIO_SPI_CLK) && PinUsed(GPIO_SPI_MISO)) ? SPI_MISO : SPI_NONE; From 8acb06515c982b2e675fe299cab00c044a84e25b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 4 Jan 2021 18:43:58 +0100 Subject: [PATCH 120/255] IRremoteESP8266 library from v2.7.13 to v2.7.14 --- CHANGELOG.md | 1 + .../html/classIRNeoclimaAc__coll__graph.map | 4 - .../html/classIRNeoclimaAc__coll__graph.md5 | 1 - .../html/classIRNeoclimaAc__coll__graph.png | Bin 3405 -> 0 bytes .../html/classIRSamsungAc__coll__graph.map | 4 - .../html/classIRSamsungAc__coll__graph.md5 | 1 - .../html/classIRSamsungAc__coll__graph.png | Bin 3730 -> 0 bytes .../html/classIRSanyoAc__coll__graph.map | 4 - .../html/classIRSanyoAc__coll__graph.md5 | 1 - .../html/classIRSanyoAc__coll__graph.png | Bin 3485 -> 0 bytes .../html/classIRSharpAc__coll__graph.map | 4 - .../html/classIRSharpAc__coll__graph.md5 | 1 - .../html/classIRSharpAc__coll__graph.png | Bin 3360 -> 0 bytes .../docs/doxygen/html/search/all_10.js | 27 - .../docs/doxygen/html/search/all_15.js | 14 - .../docs/doxygen/html/search/all_17.js | 12 - .../docs/doxygen/html/search/all_1a.js | 7 - .../docs/doxygen/html/search/all_1b.js | 4 - .../docs/doxygen/html/search/all_4.js | 135 - .../docs/doxygen/html/search/all_5.js | 39 - .../docs/doxygen/html/search/all_8.js | 34 - .../docs/doxygen/html/search/all_9.js | 198 - .../docs/doxygen/html/search/all_c.js | 19 - .../docs/doxygen/html/search/all_d.js | 50 - .../docs/doxygen/html/search/classes_0.js | 6 - .../docs/doxygen/html/search/classes_1.js | 7 - .../docs/doxygen/html/search/classes_2.js | 13 - .../docs/doxygen/html/search/classes_3.js | 4 - .../docs/doxygen/html/search/classes_4.js | 5 - .../docs/doxygen/html/search/classes_5.js | 8 - .../docs/doxygen/html/search/classes_6.js | 56 - .../docs/doxygen/html/search/classes_7.js | 4 - .../docs/doxygen/html/search/classes_8.js | 4 - .../docs/doxygen/html/search/classes_9.js | 11 - .../docs/doxygen/html/search/classes_a.js | 4 - .../docs/doxygen/html/search/classes_b.js | 4 - .../docs/doxygen/html/search/classes_c.js | 4 - .../docs/doxygen/html/search/enums_5.js | 4 - .../docs/doxygen/html/search/enums_7.js | 6 - .../docs/doxygen/html/search/files_0.js | 7 - .../docs/doxygen/html/search/files_1.js | 8 - .../docs/doxygen/html/search/files_2.js | 4 - .../docs/doxygen/html/search/files_3.js | 115 - .../docs/doxygen/html/search/files_4.js | 4 - .../docs/doxygen/html/search/files_5.js | 4 - .../docs/doxygen/html/search/files_6.js | 4 - .../docs/doxygen/html/search/functions_0.js | 21 - .../docs/doxygen/html/search/functions_1.js | 15 - .../docs/doxygen/html/search/functions_15.js | 4 - .../docs/doxygen/html/search/functions_17.js | 4 - .../docs/doxygen/html/search/functions_4.js | 103 - .../docs/doxygen/html/search/functions_a.js | 4 - .../docs/doxygen/html/search/functions_b.js | 7 - .../docs/doxygen/html/search/functions_d.js | 4 - .../docs/doxygen/html/search/functions_f.js | 4 - .../docs/doxygen/html/search/namespaces_0.js | 5 - .../docs/doxygen/html/search/namespaces_1.js | 4 - .../docs/doxygen/html/search/pages_0.js | 4 - .../docs/doxygen/html/search/pages_1.js | 5 - .../docs/doxygen/html/search/pages_2.js | 4 - .../docs/doxygen/html/search/variables_1.js | 6 - .../docs/doxygen/html/search/variables_11.js | 38 - .../docs/doxygen/html/search/variables_13.js | 9 - .../docs/doxygen/html/search/variables_14.js | 8 - .../docs/doxygen/html/search/variables_15.js | 8 - .../docs/doxygen/html/search/variables_2.js | 12 - .../docs/doxygen/html/search/variables_4.js | 13 - .../docs/doxygen/html/search/variables_5.js | 6 - .../docs/doxygen/html/search/variables_7.js | 8 - .../docs/doxygen/html/search/variables_8.js | 9 - .../docs/doxygen/html/search/variables_a.js | 9 - .../docs/doxygen/html/search/variables_b.js | 11 - .../docs/doxygen/html/search/variables_e.js | 20 - .../.github/CONTRIBUTING.md | 0 .../.github/Contributors.md | 0 .../.github/issue_template.md | 0 .../.gitignore | 0 .../.gitmodules | 0 .../.style.yapf | 0 .../.travis.yml | 0 .../CPPLINT.cfg | 0 .../Doxyfile | 0 .../LICENSE.txt | 0 .../README.md | 4 +- .../README_de.md | 4 +- .../README_fr.md | 4 +- .../ReleaseNotes.md | 25 + .../SupportedProtocols.md | 8 +- .../docs/README.md | 0 .../docs/README_de.md | 0 .../docs/README_fr.md | 0 .../docs/_config.yml | 0 .../docs/doxygen/html/IRac_8cpp.html | 0 .../docs/doxygen/html/IRac_8h.html | 0 .../docs/doxygen/html/IRac_8h_source.html | 342 +- .../docs/doxygen/html/IRrecv_8cpp.html | 119 + .../docs/doxygen/html/IRrecv_8h.html | 0 .../docs/doxygen/html/IRrecv_8h_source.html | 78 +- .../docs/doxygen/html/IRremoteESP8266_8h.html | 0 .../html/IRremoteESP8266_8h_source.html | 2 +- .../docs/doxygen/html/IRsend_8cpp.html | 0 .../docs/doxygen/html/IRsend_8h.html | 0 .../docs/doxygen/html/IRsend_8h_source.html | 28 +- .../docs/doxygen/html/IRtext_8cpp.html | 0 .../docs/doxygen/html/IRtext_8h.html | 0 .../docs/doxygen/html/IRtext_8h_source.html | 2 +- .../docs/doxygen/html/IRtimer_8cpp.html | 0 .../docs/doxygen/html/IRtimer_8h.html | 0 .../docs/doxygen/html/IRtimer_8h_source.html | 0 .../docs/doxygen/html/IRutils_8cpp.html | 6 +- .../docs/doxygen/html/IRutils_8h.html | 6 +- .../docs/doxygen/html/IRutils_8h_source.html | 131 +- .../docs/doxygen/html/README_8md.html | 0 .../docs/doxygen/html/annotated.html | 62 +- .../docs/doxygen/html/bc_s.png | Bin .../docs/doxygen/html/bdwn.png | Bin .../html/classIRAirwellAc-members.html | 0 .../docs/doxygen/html/classIRAirwellAc.html | 0 .../html/classIRAirwellAc__coll__graph.map | 0 .../html/classIRAirwellAc__coll__graph.md5 | 0 .../html/classIRAirwellAc__coll__graph.png | Bin .../doxygen/html/classIRAmcorAc-members.html | 0 .../docs/doxygen/html/classIRAmcorAc.html | 0 .../html/classIRAmcorAc__coll__graph.map | 0 .../html/classIRAmcorAc__coll__graph.md5 | 0 .../html/classIRAmcorAc__coll__graph.png | Bin .../doxygen/html/classIRArgoAC-members.html | 0 .../docs/doxygen/html/classIRArgoAC.html | 0 .../html/classIRArgoAC__coll__graph.map | 0 .../html/classIRArgoAC__coll__graph.md5 | 0 .../html/classIRArgoAC__coll__graph.png | Bin .../html/classIRCarrierAc64-members.html | 0 .../docs/doxygen/html/classIRCarrierAc64.html | 0 .../html/classIRCarrierAc64__coll__graph.map | 0 .../html/classIRCarrierAc64__coll__graph.md5 | 0 .../html/classIRCarrierAc64__coll__graph.png | Bin .../doxygen/html/classIRCoolixAC-members.html | 0 .../docs/doxygen/html/classIRCoolixAC.html | 0 .../html/classIRCoolixAC__coll__graph.map | 0 .../html/classIRCoolixAC__coll__graph.md5 | 0 .../html/classIRCoolixAC__coll__graph.png | Bin .../doxygen/html/classIRCoronaAc-members.html | 0 .../docs/doxygen/html/classIRCoronaAc.html | 0 .../html/classIRCoronaAc__coll__graph.map | 0 .../html/classIRCoronaAc__coll__graph.md5 | 0 .../html/classIRCoronaAc__coll__graph.png | Bin .../html/classIRDaikin128-members.html | 0 .../docs/doxygen/html/classIRDaikin128.html | 0 .../html/classIRDaikin128__coll__graph.map | 0 .../html/classIRDaikin128__coll__graph.md5 | 0 .../html/classIRDaikin128__coll__graph.png | Bin .../html/classIRDaikin152-members.html | 0 .../docs/doxygen/html/classIRDaikin152.html | 0 .../html/classIRDaikin152__coll__graph.map | 0 .../html/classIRDaikin152__coll__graph.md5 | 0 .../html/classIRDaikin152__coll__graph.png | Bin .../html/classIRDaikin160-members.html | 0 .../docs/doxygen/html/classIRDaikin160.html | 0 .../html/classIRDaikin160__coll__graph.map | 0 .../html/classIRDaikin160__coll__graph.md5 | 0 .../html/classIRDaikin160__coll__graph.png | Bin .../html/classIRDaikin176-members.html | 0 .../docs/doxygen/html/classIRDaikin176.html | 0 .../html/classIRDaikin176__coll__graph.map | 0 .../html/classIRDaikin176__coll__graph.md5 | 0 .../html/classIRDaikin176__coll__graph.png | Bin .../doxygen/html/classIRDaikin2-members.html | 0 .../docs/doxygen/html/classIRDaikin2.html | 0 .../html/classIRDaikin216-members.html | 0 .../docs/doxygen/html/classIRDaikin216.html | 0 .../html/classIRDaikin216__coll__graph.map | 0 .../html/classIRDaikin216__coll__graph.md5 | 0 .../html/classIRDaikin216__coll__graph.png | Bin .../html/classIRDaikin2__coll__graph.map | 0 .../html/classIRDaikin2__coll__graph.md5 | 0 .../html/classIRDaikin2__coll__graph.png | Bin .../doxygen/html/classIRDaikin64-members.html | 0 .../docs/doxygen/html/classIRDaikin64.html | 0 .../html/classIRDaikin64__coll__graph.map | 0 .../html/classIRDaikin64__coll__graph.md5 | 0 .../html/classIRDaikin64__coll__graph.png | Bin .../html/classIRDaikinESP-members.html | 0 .../docs/doxygen/html/classIRDaikinESP.html | 0 .../html/classIRDaikinESP__coll__graph.map | 0 .../html/classIRDaikinESP__coll__graph.md5 | 0 .../html/classIRDaikinESP__coll__graph.png | Bin .../html/classIRDelonghiAc-members.html | 0 .../docs/doxygen/html/classIRDelonghiAc.html | 0 .../html/classIRDelonghiAc__coll__graph.map | 0 .../html/classIRDelonghiAc__coll__graph.md5 | 0 .../html/classIRDelonghiAc__coll__graph.png | Bin .../html/classIRElectraAc-members.html | 0 .../docs/doxygen/html/classIRElectraAc.html | 0 .../html/classIRElectraAc__coll__graph.map | 0 .../html/classIRElectraAc__coll__graph.md5 | 0 .../html/classIRElectraAc__coll__graph.png | Bin .../html/classIRFujitsuAC-members.html | 0 .../docs/doxygen/html/classIRFujitsuAC.html | 0 .../html/classIRFujitsuAC__coll__graph.map | 0 .../html/classIRFujitsuAC__coll__graph.md5 | 0 .../html/classIRFujitsuAC__coll__graph.png | Bin .../html/classIRGoodweatherAc-members.html | 0 .../doxygen/html/classIRGoodweatherAc.html | 0 .../classIRGoodweatherAc__coll__graph.map | 0 .../classIRGoodweatherAc__coll__graph.md5 | 0 .../classIRGoodweatherAc__coll__graph.png | Bin .../doxygen/html/classIRGreeAC-members.html | 0 .../docs/doxygen/html/classIRGreeAC.html | 0 .../html/classIRGreeAC__coll__graph.map | 0 .../html/classIRGreeAC__coll__graph.md5 | 0 .../html/classIRGreeAC__coll__graph.png | Bin .../doxygen/html/classIRHaierAC-members.html | 0 .../docs/doxygen/html/classIRHaierAC.html | 0 .../html/classIRHaierACYRW02-members.html | 0 .../doxygen/html/classIRHaierACYRW02.html | 0 .../html/classIRHaierACYRW02__coll__graph.map | 0 .../html/classIRHaierACYRW02__coll__graph.md5 | 0 .../html/classIRHaierACYRW02__coll__graph.png | Bin .../html/classIRHaierAC__coll__graph.map | 0 .../html/classIRHaierAC__coll__graph.md5 | 0 .../html/classIRHaierAC__coll__graph.png | Bin .../html/classIRHitachiAc-members.html | 0 .../docs/doxygen/html/classIRHitachiAc.html | 0 .../html/classIRHitachiAc1-members.html | 0 .../docs/doxygen/html/classIRHitachiAc1.html | 0 .../html/classIRHitachiAc1__coll__graph.map | 0 .../html/classIRHitachiAc1__coll__graph.md5 | 0 .../html/classIRHitachiAc1__coll__graph.png | Bin .../html/classIRHitachiAc3-members.html | 0 .../docs/doxygen/html/classIRHitachiAc3.html | 0 .../html/classIRHitachiAc344-members.html | 0 .../doxygen/html/classIRHitachiAc344.html | 0 .../html/classIRHitachiAc344__coll__graph.map | 0 .../html/classIRHitachiAc344__coll__graph.md5 | 0 .../html/classIRHitachiAc344__coll__graph.png | Bin .../classIRHitachiAc344__inherit__graph.map | 0 .../classIRHitachiAc344__inherit__graph.md5 | 0 .../classIRHitachiAc344__inherit__graph.png | Bin .../html/classIRHitachiAc3__coll__graph.map | 0 .../html/classIRHitachiAc3__coll__graph.md5 | 0 .../html/classIRHitachiAc3__coll__graph.png | Bin .../html/classIRHitachiAc424-members.html | 0 .../doxygen/html/classIRHitachiAc424.html | 0 .../html/classIRHitachiAc424__coll__graph.map | 0 .../html/classIRHitachiAc424__coll__graph.md5 | 0 .../html/classIRHitachiAc424__coll__graph.png | Bin .../classIRHitachiAc424__inherit__graph.map | 0 .../classIRHitachiAc424__inherit__graph.md5 | 0 .../classIRHitachiAc424__inherit__graph.png | Bin .../html/classIRHitachiAc__coll__graph.map | 0 .../html/classIRHitachiAc__coll__graph.md5 | 0 .../html/classIRHitachiAc__coll__graph.png | Bin .../html/classIRKelvinatorAC-members.html | 0 .../doxygen/html/classIRKelvinatorAC.html | 0 .../html/classIRKelvinatorAC__coll__graph.map | 0 .../html/classIRKelvinatorAC__coll__graph.md5 | 0 .../html/classIRKelvinatorAC__coll__graph.png | Bin .../doxygen/html/classIRLgAc-members.html | 0 .../docs/doxygen/html/classIRLgAc.html | 0 .../doxygen/html/classIRLgAc__coll__graph.map | 0 .../doxygen/html/classIRLgAc__coll__graph.md5 | 0 .../doxygen/html/classIRLgAc__coll__graph.png | Bin .../doxygen/html/classIRMideaAC-members.html | 0 .../docs/doxygen/html/classIRMideaAC.html | 0 .../html/classIRMideaAC__coll__graph.map | 0 .../html/classIRMideaAC__coll__graph.md5 | 0 .../html/classIRMideaAC__coll__graph.png | Bin .../html/classIRMitsubishi112-members.html | 0 .../doxygen/html/classIRMitsubishi112.html | 0 .../classIRMitsubishi112__coll__graph.map | 0 .../classIRMitsubishi112__coll__graph.md5 | 0 .../classIRMitsubishi112__coll__graph.png | Bin .../html/classIRMitsubishi136-members.html | 0 .../doxygen/html/classIRMitsubishi136.html | 0 .../classIRMitsubishi136__coll__graph.map | 0 .../classIRMitsubishi136__coll__graph.md5 | 0 .../classIRMitsubishi136__coll__graph.png | Bin .../html/classIRMitsubishiAC-members.html | 0 .../doxygen/html/classIRMitsubishiAC.html | 0 .../html/classIRMitsubishiAC__coll__graph.map | 0 .../html/classIRMitsubishiAC__coll__graph.md5 | 0 .../html/classIRMitsubishiAC__coll__graph.png | Bin .../classIRMitsubishiHeavy152Ac-members.html | 0 .../html/classIRMitsubishiHeavy152Ac.html | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.map | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.md5 | 0 ...assIRMitsubishiHeavy152Ac__coll__graph.png | Bin .../classIRMitsubishiHeavy88Ac-members.html | 0 .../html/classIRMitsubishiHeavy88Ac.html | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.map | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.md5 | 0 ...lassIRMitsubishiHeavy88Ac__coll__graph.png | Bin .../html/classIRNeoclimaAc-members.html | 64 +- .../docs/doxygen/html/classIRNeoclimaAc.html | 326 +- .../html/classIRNeoclimaAc__coll__graph.map | 5 + .../html/classIRNeoclimaAc__coll__graph.md5 | 1 + .../html/classIRNeoclimaAc__coll__graph.png | Bin 0 -> 6475 bytes .../html/classIRPanasonicAc-members.html | 0 .../docs/doxygen/html/classIRPanasonicAc.html | 0 .../html/classIRPanasonicAc32-members.html | 108 + .../doxygen/html/classIRPanasonicAc32.html | 986 ++++ .../classIRPanasonicAc32__coll__graph.map | 5 + .../classIRPanasonicAc32__coll__graph.md5 | 1 + .../classIRPanasonicAc32__coll__graph.png | Bin 0 -> 7290 bytes .../html/classIRPanasonicAc__coll__graph.map | 0 .../html/classIRPanasonicAc__coll__graph.md5 | 0 .../html/classIRPanasonicAc__coll__graph.png | Bin .../html/classIRSamsungAc-members.html | 56 +- .../docs/doxygen/html/classIRSamsungAc.html | 256 +- .../html/classIRSamsungAc__coll__graph.map | 5 + .../html/classIRSamsungAc__coll__graph.md5 | 1 + .../html/classIRSamsungAc__coll__graph.png | Bin 0 -> 7008 bytes .../doxygen/html/classIRSanyoAc-members.html | 50 +- .../docs/doxygen/html/classIRSanyoAc.html | 328 +- .../html/classIRSanyoAc__coll__graph.map | 5 + .../html/classIRSanyoAc__coll__graph.md5 | 1 + .../html/classIRSanyoAc__coll__graph.png | Bin 0 -> 6451 bytes .../doxygen/html/classIRSharpAc-members.html | 82 +- .../docs/doxygen/html/classIRSharpAc.html | 322 +- .../html/classIRSharpAc__coll__graph.map | 5 + .../html/classIRSharpAc__coll__graph.md5 | 1 + .../html/classIRSharpAc__coll__graph.png | Bin 0 -> 6284 bytes .../doxygen/html/classIRTcl112Ac-members.html | 0 .../docs/doxygen/html/classIRTcl112Ac.html | 0 .../html/classIRTcl112Ac__coll__graph.map | 0 .../html/classIRTcl112Ac__coll__graph.md5 | 0 .../html/classIRTcl112Ac__coll__graph.png | Bin .../html/classIRTechnibelAc-members.html | 0 .../docs/doxygen/html/classIRTechnibelAc.html | 0 .../html/classIRTechnibelAc__coll__graph.map | 0 .../html/classIRTechnibelAc__coll__graph.md5 | 0 .../html/classIRTechnibelAc__coll__graph.png | Bin .../doxygen/html/classIRTecoAc-members.html | 0 .../docs/doxygen/html/classIRTecoAc.html | 0 .../html/classIRTecoAc__coll__graph.map | 0 .../html/classIRTecoAc__coll__graph.md5 | 0 .../html/classIRTecoAc__coll__graph.png | Bin .../html/classIRToshibaAC-members.html | 0 .../docs/doxygen/html/classIRToshibaAC.html | 0 .../html/classIRToshibaAC__coll__graph.map | 0 .../html/classIRToshibaAC__coll__graph.md5 | 0 .../html/classIRToshibaAC__coll__graph.png | Bin .../html/classIRTranscoldAc-members.html | 0 .../docs/doxygen/html/classIRTranscoldAc.html | 0 .../html/classIRTranscoldAc__coll__graph.map | 0 .../html/classIRTranscoldAc__coll__graph.md5 | 0 .../html/classIRTranscoldAc__coll__graph.png | Bin .../html/classIRTrotecESP-members.html | 0 .../docs/doxygen/html/classIRTrotecESP.html | 0 .../html/classIRTrotecESP__coll__graph.map | 0 .../html/classIRTrotecESP__coll__graph.md5 | 0 .../html/classIRTrotecESP__coll__graph.png | Bin .../doxygen/html/classIRVestelAc-members.html | 0 .../docs/doxygen/html/classIRVestelAc.html | 0 .../html/classIRVestelAc__coll__graph.map | 0 .../html/classIRVestelAc__coll__graph.md5 | 0 .../html/classIRVestelAc__coll__graph.png | Bin .../doxygen/html/classIRVoltas-members.html | 0 .../docs/doxygen/html/classIRVoltas.html | 0 .../html/classIRVoltas__coll__graph.map | 0 .../html/classIRVoltas__coll__graph.md5 | 0 .../html/classIRVoltas__coll__graph.png | Bin .../html/classIRWhirlpoolAc-members.html | 0 .../docs/doxygen/html/classIRWhirlpoolAc.html | 0 .../html/classIRWhirlpoolAc__coll__graph.map | 0 .../html/classIRWhirlpoolAc__coll__graph.md5 | 0 .../html/classIRWhirlpoolAc__coll__graph.png | Bin .../docs/doxygen/html/classIRac-members.html | 47 +- .../docs/doxygen/html/classIRac.html | 83 + .../doxygen/html/classIRac__coll__graph.map | 0 .../doxygen/html/classIRac__coll__graph.md5 | 0 .../doxygen/html/classIRac__coll__graph.png | Bin .../doxygen/html/classIRrecv-members.html | 0 .../docs/doxygen/html/classIRrecv.html | 8 +- .../doxygen/html/classIRrecv__coll__graph.map | 0 .../doxygen/html/classIRrecv__coll__graph.md5 | 0 .../doxygen/html/classIRrecv__coll__graph.png | Bin .../doxygen/html/classIRsend-members.html | 0 .../docs/doxygen/html/classIRsend.html | 4 +- .../doxygen/html/classIRtimer-members.html | 0 .../docs/doxygen/html/classIRtimer.html | 0 .../doxygen/html/classTimerMs-members.html | 0 .../docs/doxygen/html/classTimerMs.html | 0 .../html/classdecode__results-members.html | 0 .../doxygen/html/classdecode__results.html | 32 +- .../docs/doxygen/html/classes.html | 156 +- .../docs/doxygen/html/closed.png | Bin .../docs/doxygen/html/de-CH_8h.html | 0 .../docs/doxygen/html/de-CH_8h_source.html | 0 .../docs/doxygen/html/de-DE_8h.html | 0 .../docs/doxygen/html/de-DE_8h_source.html | 0 .../docs/doxygen/html/defaults_8h.html | 0 .../docs/doxygen/html/defaults_8h_source.html | 0 .../docs/doxygen/html/deprecated.html | 0 .../dir_49e56c817e5e54854c35e136979f97ca.html | 0 .../dir_68267d1309a1af8e8297ef4c3efbcdba.html | 0 .../dir_84fe998d1eb06414cc389ad334e77e63.html | 0 .../docs/doxygen/html/doc.png | Bin .../docs/doxygen/html/doxygen.css | 0 .../docs/doxygen/html/doxygen.png | Bin .../docs/doxygen/html/doxygen__index_8md.html | 0 .../docs/doxygen/html/dynsections.js | 0 .../docs/doxygen/html/en-AU_8h.html | 0 .../docs/doxygen/html/en-AU_8h_source.html | 0 .../docs/doxygen/html/en-IE_8h.html | 0 .../docs/doxygen/html/en-IE_8h_source.html | 0 .../docs/doxygen/html/en-UK_8h.html | 0 .../docs/doxygen/html/en-UK_8h_source.html | 0 .../docs/doxygen/html/en-US_8h.html | 0 .../docs/doxygen/html/en-US_8h_source.html | 0 .../docs/doxygen/html/es-ES_8h.html | 0 .../docs/doxygen/html/es-ES_8h_source.html | 0 .../docs/doxygen/html/files.html | 0 .../docs/doxygen/html/folderclosed.png | Bin .../docs/doxygen/html/folderopen.png | Bin .../docs/doxygen/html/fr-FR_8h.html | 0 .../docs/doxygen/html/fr-FR_8h_source.html | 0 .../docs/doxygen/html/functions.html | 67 +- .../docs/doxygen/html/functions_a.html | 3 + .../docs/doxygen/html/functions_b.html | 7 + .../docs/doxygen/html/functions_c.html | 14 + .../docs/doxygen/html/functions_d.html | 3 + .../docs/doxygen/html/functions_e.html | 2 + .../docs/doxygen/html/functions_f.html | 11 + .../docs/doxygen/html/functions_func.html | 6 +- .../docs/doxygen/html/functions_func_a.html | 0 .../docs/doxygen/html/functions_func_b.html | 1 + .../docs/doxygen/html/functions_func_c.html | 4 + .../docs/doxygen/html/functions_func_d.html | 0 .../docs/doxygen/html/functions_func_e.html | 0 .../docs/doxygen/html/functions_func_f.html | 0 .../docs/doxygen/html/functions_func_g.html | 119 +- .../docs/doxygen/html/functions_func_h.html | 0 .../docs/doxygen/html/functions_func_i.html | 5 +- .../docs/doxygen/html/functions_func_k.html | 0 .../docs/doxygen/html/functions_func_l.html | 0 .../docs/doxygen/html/functions_func_m.html | 0 .../docs/doxygen/html/functions_func_n.html | 0 .../docs/doxygen/html/functions_func_o.html | 0 .../docs/doxygen/html/functions_func_p.html | 3 + .../docs/doxygen/html/functions_func_r.html | 0 .../docs/doxygen/html/functions_func_s.html | 9 + .../docs/doxygen/html/functions_func_t.html | 25 +- .../docs/doxygen/html/functions_func_u.html | 0 .../docs/doxygen/html/functions_func_v.html | 0 .../docs/doxygen/html/functions_func_w.html | 0 .../docs/doxygen/html/functions_func_~.html | 0 .../docs/doxygen/html/functions_g.html | 119 +- .../docs/doxygen/html/functions_h.html | 3 + .../docs/doxygen/html/functions_i.html | 12 +- .../docs/doxygen/html/functions_k.html | 0 .../docs/doxygen/html/functions_l.html | 1 + .../docs/doxygen/html/functions_m.html | 6 + .../docs/doxygen/html/functions_n.html | 0 .../docs/doxygen/html/functions_o.html | 4 + .../docs/doxygen/html/functions_p.html | 24 + .../docs/doxygen/html/functions_q.html | 6 + .../docs/doxygen/html/functions_r.html | 11 +- .../docs/doxygen/html/functions_rela.html | 0 .../docs/doxygen/html/functions_s.html | 30 +- .../docs/doxygen/html/functions_t.html | 36 +- .../docs/doxygen/html/functions_u.html | 3 + .../docs/doxygen/html/functions_v.html | 0 .../docs/doxygen/html/functions_vars.html | 59 + .../docs/doxygen/html/functions_vars_a.html | 3 + .../docs/doxygen/html/functions_vars_b.html | 6 + .../docs/doxygen/html/functions_vars_c.html | 10 + .../docs/doxygen/html/functions_vars_d.html | 3 + .../docs/doxygen/html/functions_vars_e.html | 2 + .../docs/doxygen/html/functions_vars_f.html | 11 + .../docs/doxygen/html/functions_vars_h.html | 3 + .../docs/doxygen/html/functions_vars_i.html | 5 + .../docs/doxygen/html/functions_vars_l.html | 1 + .../docs/doxygen/html/functions_vars_m.html | 6 + .../docs/doxygen/html/functions_vars_n.html | 0 .../docs/doxygen/html/functions_vars_o.html | 4 + .../docs/doxygen/html/functions_vars_p.html | 21 + .../docs/doxygen/html/functions_vars_q.html | 6 + .../docs/doxygen/html/functions_vars_r.html | 11 +- .../docs/doxygen/html/functions_vars_s.html | 19 + .../docs/doxygen/html/functions_vars_t.html | 11 + .../docs/doxygen/html/functions_vars_u.html | 3 + .../docs/doxygen/html/functions_vars_v.html | 0 .../docs/doxygen/html/functions_vars_w.html | 0 .../docs/doxygen/html/functions_vars_x.html | 0 .../docs/doxygen/html/functions_vars_z.html | 0 .../docs/doxygen/html/functions_w.html | 0 .../docs/doxygen/html/functions_x.html | 0 .../docs/doxygen/html/functions_z.html | 0 .../docs/doxygen/html/functions_~.html | 0 .../docs/doxygen/html/globals.html | 0 .../docs/doxygen/html/globals_a.html | 0 .../docs/doxygen/html/globals_c.html | 0 .../docs/doxygen/html/globals_d.html | 0 .../docs/doxygen/html/globals_e.html | 0 .../docs/doxygen/html/globals_enum.html | 0 .../docs/doxygen/html/globals_eval.html | 0 .../docs/doxygen/html/globals_f.html | 0 .../docs/doxygen/html/globals_func.html | 0 .../docs/doxygen/html/globals_g.html | 0 .../docs/doxygen/html/globals_h.html | 3 + .../docs/doxygen/html/globals_i.html | 13 +- .../docs/doxygen/html/globals_j.html | 0 .../docs/doxygen/html/globals_k.html | 427 +- .../docs/doxygen/html/globals_l.html | 0 .../docs/doxygen/html/globals_m.html | 0 .../docs/doxygen/html/globals_n.html | 0 .../docs/doxygen/html/globals_p.html | 0 .../docs/doxygen/html/globals_r.html | 0 .../docs/doxygen/html/globals_s.html | 0 .../docs/doxygen/html/globals_t.html | 0 .../docs/doxygen/html/globals_type.html | 3 + .../docs/doxygen/html/globals_u.html | 0 .../docs/doxygen/html/globals_v.html | 0 .../docs/doxygen/html/globals_vars.html | 0 .../docs/doxygen/html/globals_vars_i.html | 0 .../docs/doxygen/html/globals_vars_k.html | 443 +- .../docs/doxygen/html/globals_w.html | 0 .../docs/doxygen/html/globals_x.html | 0 .../docs/doxygen/html/globals_y.html | 0 .../docs/doxygen/html/globals_z.html | 0 .../docs/doxygen/html/graph_legend.html | 0 .../docs/doxygen/html/graph_legend.md5 | 0 .../docs/doxygen/html/graph_legend.png | Bin .../docs/doxygen/html/hierarchy.html | 64 +- .../docs/doxygen/html/i18n_8h.html | 0 .../docs/doxygen/html/i18n_8h_source.html | 0 .../docs/doxygen/html/index.html | 0 .../docs/doxygen/html/inherit_graph_0.map | 0 .../docs/doxygen/html/inherit_graph_0.md5 | 0 .../docs/doxygen/html/inherit_graph_0.png | Bin .../docs/doxygen/html/inherit_graph_1.map | 0 .../docs/doxygen/html/inherit_graph_1.md5 | 0 .../docs/doxygen/html/inherit_graph_1.png | Bin .../docs/doxygen/html/inherit_graph_10.map | 0 .../docs/doxygen/html/inherit_graph_10.md5 | 0 .../docs/doxygen/html/inherit_graph_10.png | Bin .../docs/doxygen/html/inherit_graph_11.map | 0 .../docs/doxygen/html/inherit_graph_11.md5 | 0 .../docs/doxygen/html/inherit_graph_11.png | Bin .../docs/doxygen/html/inherit_graph_12.map | 0 .../docs/doxygen/html/inherit_graph_12.md5 | 0 .../docs/doxygen/html/inherit_graph_12.png | Bin .../docs/doxygen/html/inherit_graph_13.map | 0 .../docs/doxygen/html/inherit_graph_13.md5 | 0 .../docs/doxygen/html/inherit_graph_13.png | Bin .../docs/doxygen/html/inherit_graph_14.map | 0 .../docs/doxygen/html/inherit_graph_14.md5 | 0 .../docs/doxygen/html/inherit_graph_14.png | Bin .../docs/doxygen/html/inherit_graph_15.map | 0 .../docs/doxygen/html/inherit_graph_15.md5 | 0 .../docs/doxygen/html/inherit_graph_15.png | Bin .../docs/doxygen/html/inherit_graph_16.map | 0 .../docs/doxygen/html/inherit_graph_16.md5 | 0 .../docs/doxygen/html/inherit_graph_16.png | Bin .../docs/doxygen/html/inherit_graph_17.map | 0 .../docs/doxygen/html/inherit_graph_17.md5 | 0 .../docs/doxygen/html/inherit_graph_17.png | Bin .../docs/doxygen/html/inherit_graph_18.map | 0 .../docs/doxygen/html/inherit_graph_18.md5 | 0 .../docs/doxygen/html/inherit_graph_18.png | Bin .../docs/doxygen/html/inherit_graph_19.map | 0 .../docs/doxygen/html/inherit_graph_19.md5 | 0 .../docs/doxygen/html/inherit_graph_19.png | Bin .../docs/doxygen/html/inherit_graph_2.map | 0 .../docs/doxygen/html/inherit_graph_2.md5 | 0 .../docs/doxygen/html/inherit_graph_2.png | Bin .../docs/doxygen/html/inherit_graph_20.map | 0 .../docs/doxygen/html/inherit_graph_20.md5 | 0 .../docs/doxygen/html/inherit_graph_20.png | Bin .../docs/doxygen/html/inherit_graph_21.map | 0 .../docs/doxygen/html/inherit_graph_21.md5 | 0 .../docs/doxygen/html/inherit_graph_21.png | Bin .../docs/doxygen/html/inherit_graph_22.map | 0 .../docs/doxygen/html/inherit_graph_22.md5 | 0 .../docs/doxygen/html/inherit_graph_22.png | Bin .../docs/doxygen/html/inherit_graph_23.map | 0 .../docs/doxygen/html/inherit_graph_23.md5 | 0 .../docs/doxygen/html/inherit_graph_23.png | Bin .../docs/doxygen/html/inherit_graph_24.map | 0 .../docs/doxygen/html/inherit_graph_24.md5 | 0 .../docs/doxygen/html/inherit_graph_24.png | Bin .../docs/doxygen/html/inherit_graph_25.map | 0 .../docs/doxygen/html/inherit_graph_25.md5 | 0 .../docs/doxygen/html/inherit_graph_25.png | Bin .../docs/doxygen/html/inherit_graph_26.map | 0 .../docs/doxygen/html/inherit_graph_26.md5 | 0 .../docs/doxygen/html/inherit_graph_26.png | Bin .../docs/doxygen/html/inherit_graph_27.map | 0 .../docs/doxygen/html/inherit_graph_27.md5 | 0 .../docs/doxygen/html/inherit_graph_27.png | Bin .../docs/doxygen/html/inherit_graph_28.map | 0 .../docs/doxygen/html/inherit_graph_28.md5 | 0 .../docs/doxygen/html/inherit_graph_28.png | Bin .../docs/doxygen/html/inherit_graph_29.map | 0 .../docs/doxygen/html/inherit_graph_29.md5 | 0 .../docs/doxygen/html/inherit_graph_29.png | Bin .../docs/doxygen/html/inherit_graph_3.map | 0 .../docs/doxygen/html/inherit_graph_3.md5 | 0 .../docs/doxygen/html/inherit_graph_3.png | Bin .../docs/doxygen/html/inherit_graph_30.map | 0 .../docs/doxygen/html/inherit_graph_30.md5 | 0 .../docs/doxygen/html/inherit_graph_30.png | Bin .../docs/doxygen/html/inherit_graph_31.map | 0 .../docs/doxygen/html/inherit_graph_31.md5 | 0 .../docs/doxygen/html/inherit_graph_31.png | Bin .../docs/doxygen/html/inherit_graph_32.map | 0 .../docs/doxygen/html/inherit_graph_32.md5 | 0 .../docs/doxygen/html/inherit_graph_32.png | Bin .../docs/doxygen/html/inherit_graph_33.map | 0 .../docs/doxygen/html/inherit_graph_33.md5 | 0 .../docs/doxygen/html/inherit_graph_33.png | Bin .../docs/doxygen/html/inherit_graph_34.map | 0 .../docs/doxygen/html/inherit_graph_34.md5 | 0 .../docs/doxygen/html/inherit_graph_34.png | Bin .../docs/doxygen/html/inherit_graph_35.map | 0 .../docs/doxygen/html/inherit_graph_35.md5 | 0 .../docs/doxygen/html/inherit_graph_35.png | Bin .../docs/doxygen/html/inherit_graph_36.map | 0 .../docs/doxygen/html/inherit_graph_36.md5 | 0 .../docs/doxygen/html/inherit_graph_36.png | Bin .../docs/doxygen/html/inherit_graph_37.map | 0 .../docs/doxygen/html/inherit_graph_37.md5 | 0 .../docs/doxygen/html/inherit_graph_37.png | Bin .../docs/doxygen/html/inherit_graph_38.map | 0 .../docs/doxygen/html/inherit_graph_38.md5 | 0 .../docs/doxygen/html/inherit_graph_38.png | Bin .../docs/doxygen/html/inherit_graph_39.map | 0 .../docs/doxygen/html/inherit_graph_39.md5 | 0 .../docs/doxygen/html/inherit_graph_39.png | Bin .../docs/doxygen/html/inherit_graph_4.map | 0 .../docs/doxygen/html/inherit_graph_4.md5 | 0 .../docs/doxygen/html/inherit_graph_4.png | Bin .../docs/doxygen/html/inherit_graph_40.map | 0 .../docs/doxygen/html/inherit_graph_40.md5 | 0 .../docs/doxygen/html/inherit_graph_40.png | Bin .../docs/doxygen/html/inherit_graph_41.map | 0 .../docs/doxygen/html/inherit_graph_41.md5 | 0 .../docs/doxygen/html/inherit_graph_41.png | Bin .../docs/doxygen/html/inherit_graph_42.map | 0 .../docs/doxygen/html/inherit_graph_42.md5 | 0 .../docs/doxygen/html/inherit_graph_42.png | Bin .../docs/doxygen/html/inherit_graph_43.map | 0 .../docs/doxygen/html/inherit_graph_43.md5 | 0 .../docs/doxygen/html/inherit_graph_43.png | Bin .../docs/doxygen/html/inherit_graph_44.map | 0 .../docs/doxygen/html/inherit_graph_44.md5 | 0 .../docs/doxygen/html/inherit_graph_44.png | Bin .../docs/doxygen/html/inherit_graph_45.map | 0 .../docs/doxygen/html/inherit_graph_45.md5 | 0 .../docs/doxygen/html/inherit_graph_45.png | Bin .../docs/doxygen/html/inherit_graph_46.map | 0 .../docs/doxygen/html/inherit_graph_46.md5 | 0 .../docs/doxygen/html/inherit_graph_46.png | Bin .../docs/doxygen/html/inherit_graph_47.map | 0 .../docs/doxygen/html/inherit_graph_47.md5 | 0 .../docs/doxygen/html/inherit_graph_47.png | Bin .../docs/doxygen/html/inherit_graph_48.map | 0 .../docs/doxygen/html/inherit_graph_48.md5 | 0 .../docs/doxygen/html/inherit_graph_48.png | Bin .../docs/doxygen/html/inherit_graph_49.map | 0 .../docs/doxygen/html/inherit_graph_49.md5 | 0 .../docs/doxygen/html/inherit_graph_49.png | Bin .../docs/doxygen/html/inherit_graph_5.map | 0 .../docs/doxygen/html/inherit_graph_5.md5 | 0 .../docs/doxygen/html/inherit_graph_5.png | Bin .../docs/doxygen/html/inherit_graph_50.map | 0 .../docs/doxygen/html/inherit_graph_50.md5 | 0 .../docs/doxygen/html/inherit_graph_50.png | Bin .../docs/doxygen/html/inherit_graph_51.map | 0 .../docs/doxygen/html/inherit_graph_51.md5 | 0 .../docs/doxygen/html/inherit_graph_51.png | Bin .../docs/doxygen/html/inherit_graph_52.map | 0 .../docs/doxygen/html/inherit_graph_52.md5 | 0 .../docs/doxygen/html/inherit_graph_52.png | Bin .../docs/doxygen/html/inherit_graph_53.map | 0 .../docs/doxygen/html/inherit_graph_53.md5 | 0 .../docs/doxygen/html/inherit_graph_53.png | Bin .../docs/doxygen/html/inherit_graph_54.map | 0 .../docs/doxygen/html/inherit_graph_54.md5 | 0 .../docs/doxygen/html/inherit_graph_54.png | Bin .../docs/doxygen/html/inherit_graph_55.map | 0 .../docs/doxygen/html/inherit_graph_55.md5 | 0 .../docs/doxygen/html/inherit_graph_55.png | Bin .../docs/doxygen/html/inherit_graph_56.map | 0 .../docs/doxygen/html/inherit_graph_56.md5 | 0 .../docs/doxygen/html/inherit_graph_56.png | Bin .../docs/doxygen/html/inherit_graph_57.map | 0 .../docs/doxygen/html/inherit_graph_57.md5 | 0 .../docs/doxygen/html/inherit_graph_57.png | Bin .../docs/doxygen/html/inherit_graph_58.map | 0 .../docs/doxygen/html/inherit_graph_58.md5 | 0 .../docs/doxygen/html/inherit_graph_58.png | Bin .../docs/doxygen/html/inherit_graph_59.map | 0 .../docs/doxygen/html/inherit_graph_59.md5 | 0 .../docs/doxygen/html/inherit_graph_59.png | Bin .../docs/doxygen/html/inherit_graph_6.map | 0 .../docs/doxygen/html/inherit_graph_6.md5 | 0 .../docs/doxygen/html/inherit_graph_6.png | Bin .../docs/doxygen/html/inherit_graph_60.map | 0 .../docs/doxygen/html/inherit_graph_60.md5 | 0 .../docs/doxygen/html/inherit_graph_60.png | Bin .../docs/doxygen/html/inherit_graph_61.map | 3 + .../docs/doxygen/html/inherit_graph_61.md5 | 1 + .../docs/doxygen/html/inherit_graph_61.png | Bin 0 -> 1882 bytes .../docs/doxygen/html/inherit_graph_62.map} | 0 .../docs/doxygen/html/inherit_graph_62.md5} | 0 .../docs/doxygen/html/inherit_graph_62.png} | Bin .../docs/doxygen/html/inherit_graph_63.map} | 0 .../docs/doxygen/html/inherit_graph_63.md5} | 0 .../docs/doxygen/html/inherit_graph_63.png} | Bin .../docs/doxygen/html/inherit_graph_64.map} | 0 .../docs/doxygen/html/inherit_graph_64.md5} | 0 .../docs/doxygen/html/inherit_graph_64.png} | Bin .../docs/doxygen/html/inherit_graph_65.map} | 0 .../docs/doxygen/html/inherit_graph_65.md5} | 0 .../docs/doxygen/html/inherit_graph_65.png} | Bin .../docs/doxygen/html/inherit_graph_66.map} | 0 .../docs/doxygen/html/inherit_graph_66.md5} | 0 .../docs/doxygen/html/inherit_graph_66.png} | Bin .../docs/doxygen/html/inherit_graph_67.map} | 0 .../docs/doxygen/html/inherit_graph_67.md5} | 0 .../docs/doxygen/html/inherit_graph_67.png} | Bin .../docs/doxygen/html/inherit_graph_68.map} | 0 .../docs/doxygen/html/inherit_graph_68.md5} | 0 .../docs/doxygen/html/inherit_graph_68.png} | Bin .../docs/doxygen/html/inherit_graph_69.map} | 0 .../docs/doxygen/html/inherit_graph_69.md5} | 0 .../docs/doxygen/html/inherit_graph_69.png} | Bin .../docs/doxygen/html/inherit_graph_7.map | 0 .../docs/doxygen/html/inherit_graph_7.md5 | 0 .../docs/doxygen/html/inherit_graph_7.png | Bin .../docs/doxygen/html/inherit_graph_70.map} | 0 .../docs/doxygen/html/inherit_graph_70.md5} | 0 .../docs/doxygen/html/inherit_graph_70.png} | Bin .../docs/doxygen/html/inherit_graph_71.map} | 0 .../docs/doxygen/html/inherit_graph_71.md5} | 0 .../docs/doxygen/html/inherit_graph_71.png} | Bin .../docs/doxygen/html/inherit_graph_72.map} | 0 .../docs/doxygen/html/inherit_graph_72.md5} | 0 .../docs/doxygen/html/inherit_graph_72.png} | Bin .../docs/doxygen/html/inherit_graph_73.map} | 0 .../docs/doxygen/html/inherit_graph_73.md5} | 0 .../docs/doxygen/html/inherit_graph_73.png} | Bin .../docs/doxygen/html/inherit_graph_74.map} | 0 .../docs/doxygen/html/inherit_graph_74.md5} | 0 .../docs/doxygen/html/inherit_graph_74.png} | Bin .../docs/doxygen/html/inherit_graph_75.map} | 0 .../docs/doxygen/html/inherit_graph_75.md5} | 0 .../docs/doxygen/html/inherit_graph_75.png} | Bin .../docs/doxygen/html/inherit_graph_76.map} | 0 .../docs/doxygen/html/inherit_graph_76.md5} | 0 .../docs/doxygen/html/inherit_graph_76.png} | Bin .../docs/doxygen/html/inherit_graph_77.map} | 0 .../docs/doxygen/html/inherit_graph_77.md5} | 0 .../docs/doxygen/html/inherit_graph_77.png} | Bin .../docs/doxygen/html/inherit_graph_78.map} | 0 .../docs/doxygen/html/inherit_graph_78.md5} | 0 .../docs/doxygen/html/inherit_graph_78.png} | Bin .../docs/doxygen/html/inherit_graph_79.map} | 0 .../docs/doxygen/html/inherit_graph_79.md5} | 0 .../docs/doxygen/html/inherit_graph_79.png} | Bin .../docs/doxygen/html/inherit_graph_8.map | 0 .../docs/doxygen/html/inherit_graph_8.md5 | 0 .../docs/doxygen/html/inherit_graph_8.png | Bin .../docs/doxygen/html/inherit_graph_80.map} | 0 .../docs/doxygen/html/inherit_graph_80.md5} | 0 .../docs/doxygen/html/inherit_graph_80.png} | Bin .../docs/doxygen/html/inherit_graph_81.map} | 0 .../docs/doxygen/html/inherit_graph_81.md5} | 0 .../docs/doxygen/html/inherit_graph_81.png} | Bin .../docs/doxygen/html/inherit_graph_82.map} | 0 .../docs/doxygen/html/inherit_graph_82.md5} | 0 .../docs/doxygen/html/inherit_graph_82.png} | Bin .../docs/doxygen/html/inherit_graph_83.map} | 0 .../docs/doxygen/html/inherit_graph_83.md5} | 0 .../docs/doxygen/html/inherit_graph_83.png} | Bin .../docs/doxygen/html/inherit_graph_84.map} | 0 .../docs/doxygen/html/inherit_graph_84.md5} | 0 .../docs/doxygen/html/inherit_graph_84.png} | Bin .../docs/doxygen/html/inherit_graph_85.map} | 0 .../docs/doxygen/html/inherit_graph_85.md5} | 0 .../docs/doxygen/html/inherit_graph_85.png} | Bin .../docs/doxygen/html/inherit_graph_86.map} | 0 .../docs/doxygen/html/inherit_graph_86.md5} | 0 .../docs/doxygen/html/inherit_graph_86.png} | Bin .../docs/doxygen/html/inherit_graph_87.map} | 0 .../docs/doxygen/html/inherit_graph_87.md5} | 0 .../docs/doxygen/html/inherit_graph_87.png} | Bin .../docs/doxygen/html/inherit_graph_88.map | 3 + .../docs/doxygen/html/inherit_graph_88.md5 | 1 + .../docs/doxygen/html/inherit_graph_88.png | Bin 0 -> 1434 bytes .../docs/doxygen/html/inherit_graph_89.map | 3 + .../docs/doxygen/html/inherit_graph_89.md5 | 1 + .../docs/doxygen/html/inherit_graph_89.png | Bin 0 -> 1936 bytes .../docs/doxygen/html/inherit_graph_9.map | 0 .../docs/doxygen/html/inherit_graph_9.md5 | 0 .../docs/doxygen/html/inherit_graph_9.png | Bin .../docs/doxygen/html/inherit_graph_90.map | 3 + .../docs/doxygen/html/inherit_graph_90.md5 | 1 + .../docs/doxygen/html/inherit_graph_90.png | Bin 0 -> 1790 bytes .../docs/doxygen/html/inherit_graph_91.map | 3 + .../docs/doxygen/html/inherit_graph_91.md5 | 1 + .../docs/doxygen/html/inherit_graph_91.png | Bin 0 -> 1449 bytes .../docs/doxygen/html/inherit_graph_92.map | 3 + .../docs/doxygen/html/inherit_graph_92.md5 | 1 + .../docs/doxygen/html/inherit_graph_92.png | Bin 0 -> 1530 bytes .../docs/doxygen/html/inherit_graph_93.map} | 0 .../docs/doxygen/html/inherit_graph_93.md5} | 0 .../docs/doxygen/html/inherit_graph_93.png} | Bin .../docs/doxygen/html/inherit_graph_94.map} | 0 .../docs/doxygen/html/inherit_graph_94.md5} | 0 .../docs/doxygen/html/inherit_graph_94.png} | Bin .../docs/doxygen/html/inherit_graph_95.map} | 0 .../docs/doxygen/html/inherit_graph_95.md5} | 0 .../docs/doxygen/html/inherit_graph_95.png} | Bin .../docs/doxygen/html/inherits.html | 88 +- .../docs/doxygen/html/ir__Airwell_8cpp.html | 0 .../docs/doxygen/html/ir__Airwell_8h.html | 0 .../doxygen/html/ir__Airwell_8h_source.html | 0 .../docs/doxygen/html/ir__Aiwa_8cpp.html | 0 .../docs/doxygen/html/ir__Amcor_8cpp.html | 0 .../docs/doxygen/html/ir__Amcor_8h.html | 0 .../doxygen/html/ir__Amcor_8h_source.html | 0 .../docs/doxygen/html/ir__Argo_8cpp.html | 0 .../docs/doxygen/html/ir__Argo_8h.html | 0 .../docs/doxygen/html/ir__Argo_8h_source.html | 0 .../docs/doxygen/html/ir__Carrier_8cpp.html | 0 .../docs/doxygen/html/ir__Carrier_8h.html | 0 .../doxygen/html/ir__Carrier_8h_source.html | 0 .../docs/doxygen/html/ir__Coolix_8cpp.html | 0 .../docs/doxygen/html/ir__Coolix_8h.html | 0 .../doxygen/html/ir__Coolix_8h_source.html | 0 .../docs/doxygen/html/ir__Corona_8cpp.html | 0 .../docs/doxygen/html/ir__Corona_8h.html | 0 .../doxygen/html/ir__Corona_8h_source.html | 0 .../docs/doxygen/html/ir__Daikin_8cpp.html | 0 .../docs/doxygen/html/ir__Daikin_8h.html | 0 .../doxygen/html/ir__Daikin_8h_source.html | 0 .../docs/doxygen/html/ir__Delonghi_8cpp.html | 0 .../docs/doxygen/html/ir__Delonghi_8h.html | 0 .../doxygen/html/ir__Delonghi_8h_source.html | 0 .../docs/doxygen/html/ir__Denon_8cpp.html | 0 .../docs/doxygen/html/ir__Dish_8cpp.html | 0 .../docs/doxygen/html/ir__Doshisha_8cpp.html | 0 .../docs/doxygen/html/ir__Electra_8cpp.html | 0 .../docs/doxygen/html/ir__Electra_8h.html | 0 .../doxygen/html/ir__Electra_8h_source.html | 0 .../doxygen/html/ir__EliteScreens_8cpp.html | 0 .../docs/doxygen/html/ir__Epson_8cpp.html | 0 .../docs/doxygen/html/ir__Fujitsu_8cpp.html | 0 .../docs/doxygen/html/ir__Fujitsu_8h.html | 0 .../doxygen/html/ir__Fujitsu_8h_source.html | 0 .../docs/doxygen/html/ir__GICable_8cpp.html | 0 .../doxygen/html/ir__GlobalCache_8cpp.html | 0 .../doxygen/html/ir__Goodweather_8cpp.html | 0 .../docs/doxygen/html/ir__Goodweather_8h.html | 0 .../html/ir__Goodweather_8h_source.html | 0 .../docs/doxygen/html/ir__Gree_8cpp.html | 0 .../docs/doxygen/html/ir__Gree_8h.html | 0 .../docs/doxygen/html/ir__Gree_8h_source.html | 488 +- .../docs/doxygen/html/ir__Haier_8cpp.html | 0 .../docs/doxygen/html/ir__Haier_8h.html | 0 .../doxygen/html/ir__Haier_8h_source.html | 0 .../docs/doxygen/html/ir__Hitachi_8cpp.html | 0 .../docs/doxygen/html/ir__Hitachi_8h.html | 0 .../doxygen/html/ir__Hitachi_8h_source.html | 0 .../docs/doxygen/html/ir__Inax_8cpp.html | 0 .../docs/doxygen/html/ir__JVC_8cpp.html | 0 .../doxygen/html/ir__Kelvinator_8cpp.html | 0 .../docs/doxygen/html/ir__Kelvinator_8h.html | 0 .../html/ir__Kelvinator_8h_source.html | 387 +- .../docs/doxygen/html/ir__LG_8cpp.html | 0 .../docs/doxygen/html/ir__LG_8h.html | 0 .../docs/doxygen/html/ir__LG_8h_source.html | 0 .../docs/doxygen/html/ir__Lasertag_8cpp.html | 4 +- .../docs/doxygen/html/ir__Lego_8cpp.html | 0 .../docs/doxygen/html/ir__Lutron_8cpp.html | 0 .../docs/doxygen/html/ir__MWM_8cpp.html | 0 .../docs/doxygen/html/ir__Magiquest_8cpp.html | 0 .../docs/doxygen/html/ir__Magiquest_8h.html | 0 .../doxygen/html/ir__Magiquest_8h_source.html | 0 .../docs/doxygen/html/ir__Metz_8cpp.html | 0 .../docs/doxygen/html/ir__Midea_8cpp.html | 0 .../docs/doxygen/html/ir__Midea_8h.html | 4 +- .../doxygen/html/ir__Midea_8h_source.html | 524 +- .../docs/doxygen/html/ir__Mirage_8cpp.html | 0 .../html/ir__MitsubishiHeavy_8cpp.html | 0 .../doxygen/html/ir__MitsubishiHeavy_8h.html | 0 .../html/ir__MitsubishiHeavy_8h_source.html | 0 .../doxygen/html/ir__Mitsubishi_8cpp.html | 0 .../docs/doxygen/html/ir__Mitsubishi_8h.html | 0 .../html/ir__Mitsubishi_8h_source.html | 0 .../doxygen/html/ir__Multibrackets_8cpp.html | 0 .../docs/doxygen/html/ir__NEC_8cpp.html | 0 .../docs/doxygen/html/ir__NEC_8h.html | 0 .../docs/doxygen/html/ir__NEC_8h_source.html | 0 .../docs/doxygen/html/ir__Neoclima_8cpp.html | 0 .../docs/doxygen/html/ir__Neoclima_8h.html | 363 +- .../doxygen/html/ir__Neoclima_8h_source.html | 519 +- .../docs/doxygen/html/ir__Nikai_8cpp.html | 0 .../docs/doxygen/html/ir__Panasonic_8cpp.html | 0 .../docs/doxygen/html/ir__Panasonic_8h.html | 217 + .../doxygen/html/ir__Panasonic_8h_source.html | 134 +- .../docs/doxygen/html/ir__Pioneer_8cpp.html | 0 .../docs/doxygen/html/ir__Pronto_8cpp.html | 0 .../docs/doxygen/html/ir__RC5__RC6_8cpp.html | 0 .../docs/doxygen/html/ir__RCMM_8cpp.html | 0 .../docs/doxygen/html/ir__Samsung_8cpp.html | 0 .../docs/doxygen/html/ir__Samsung_8h.html | 307 +- .../doxygen/html/ir__Samsung_8h_source.html | 467 +- .../docs/doxygen/html/ir__Sanyo_8cpp.html | 12 +- .../docs/doxygen/html/ir__Sanyo_8h.html | 421 +- .../doxygen/html/ir__Sanyo_8h_source.html | 411 +- .../docs/doxygen/html/ir__Sharp_8cpp.html | 0 .../docs/doxygen/html/ir__Sharp_8h.html | 355 +- .../doxygen/html/ir__Sharp_8h_source.html | 563 +- .../docs/doxygen/html/ir__Sherwood_8cpp.html | 0 .../docs/doxygen/html/ir__Sony_8cpp.html | 0 .../docs/doxygen/html/ir__Symphony_8cpp.html | 0 .../docs/doxygen/html/ir__Tcl_8cpp.html | 0 .../docs/doxygen/html/ir__Tcl_8h.html | 0 .../docs/doxygen/html/ir__Tcl_8h_source.html | 0 .../docs/doxygen/html/ir__Technibel_8cpp.html | 0 .../docs/doxygen/html/ir__Technibel_8h.html | 0 .../doxygen/html/ir__Technibel_8h_source.html | 0 .../docs/doxygen/html/ir__Teco_8cpp.html | 0 .../docs/doxygen/html/ir__Teco_8h.html | 0 .../docs/doxygen/html/ir__Teco_8h_source.html | 0 .../docs/doxygen/html/ir__Toshiba_8cpp.html | 0 .../docs/doxygen/html/ir__Toshiba_8h.html | 0 .../doxygen/html/ir__Toshiba_8h_source.html | 0 .../docs/doxygen/html/ir__Transcold_8cpp.html | 0 .../docs/doxygen/html/ir__Transcold_8h.html | 0 .../doxygen/html/ir__Transcold_8h_source.html | 0 .../docs/doxygen/html/ir__Trotec_8cpp.html | 0 .../docs/doxygen/html/ir__Trotec_8h.html | 0 .../doxygen/html/ir__Trotec_8h_source.html | 0 .../docs/doxygen/html/ir__Vestel_8cpp.html | 0 .../docs/doxygen/html/ir__Vestel_8h.html | 0 .../doxygen/html/ir__Vestel_8h_source.html | 0 .../docs/doxygen/html/ir__Voltas_8cpp.html | 0 .../docs/doxygen/html/ir__Voltas_8h.html | 0 .../doxygen/html/ir__Voltas_8h_source.html | 0 .../docs/doxygen/html/ir__Whirlpool_8cpp.html | 0 .../docs/doxygen/html/ir__Whirlpool_8h.html | 0 .../doxygen/html/ir__Whirlpool_8h_source.html | 0 .../docs/doxygen/html/ir__Whynter_8cpp.html | 0 .../docs/doxygen/html/ir__Zepeal_8cpp.html | 0 .../docs/doxygen/html/it-IT_8h.html | 0 .../docs/doxygen/html/it-IT_8h_source.html | 0 .../docs/doxygen/html/jquery.js | 0 .../doxygen/html/md_src_locale_README.html | 0 .../docs/doxygen/html/menu.js | 0 .../docs/doxygen/html/menudata.js | 3 +- .../docs/doxygen/html/namespaceIRAcUtils.html | 0 .../docs/doxygen/html/namespace__IRrecv.html} | 38 +- .../docs/doxygen/html/namespaceirutils.html | 19 +- .../docs/doxygen/html/namespacemembers.html | 19 +- .../doxygen/html/namespacemembers_enum.html | 0 .../doxygen/html/namespacemembers_func.html | 2 +- .../doxygen/html/namespacemembers_vars.html | 83 + .../docs/doxygen/html/namespaces.html | 7 +- .../docs/doxygen/html/namespacestdAc.html | 0 .../docs/doxygen/html/nav_f.png | Bin .../docs/doxygen/html/nav_g.png | Bin .../docs/doxygen/html/nav_h.png | Bin .../docs/doxygen/html/open.png | Bin .../docs/doxygen/html/pages.html | 0 .../docs/doxygen/html/pt-BR_8h.html | 0 .../docs/doxygen/html/pt-BR_8h_source.html | 0 .../docs/doxygen/html/search/all_0.html | 0 .../docs/doxygen/html/search/all_0.js | 50 +- .../docs/doxygen/html/search/all_1.html | 0 .../docs/doxygen/html/search/all_1.js | 4 +- .../docs/doxygen/html/search/all_10.html | 0 .../docs/doxygen/html/search/all_10.js | 36 + .../docs/doxygen/html/search/all_11.html | 0 .../docs/doxygen/html/search/all_11.js | 4 +- .../docs/doxygen/html/search/all_12.html | 0 .../docs/doxygen/html/search/all_12.js | 53 +- .../docs/doxygen/html/search/all_13.html | 0 .../docs/doxygen/html/search/all_13.js | 570 +- .../docs/doxygen/html/search/all_14.html | 0 .../docs/doxygen/html/search/all_14.js | 77 +- .../docs/doxygen/html/search/all_15.html | 0 .../docs/doxygen/html/search/all_15.js | 15 + .../docs/doxygen/html/search/all_16.html | 0 .../docs/doxygen/html/search/all_16.js | 24 +- .../docs/doxygen/html/search/all_17.html | 0 .../docs/doxygen/html/search/all_17.js | 12 + .../docs/doxygen/html/search/all_18.html | 0 .../docs/doxygen/html/search/all_18.js | 4 +- .../docs/doxygen/html/search/all_19.html | 0 .../docs/doxygen/html/search/all_19.js | 4 +- .../docs/doxygen/html/search/all_1a.html | 0 .../docs/doxygen/html/search/all_1a.js | 7 + .../docs/doxygen/html/search/all_1b.html | 0 .../docs/doxygen/html/search/all_1b.js | 4 + .../docs/doxygen/html/search/all_2.html | 0 .../docs/doxygen/html/search/all_2.js | 15 +- .../docs/doxygen/html/search/all_3.html | 0 .../docs/doxygen/html/search/all_3.js | 115 +- .../docs/doxygen/html/search/all_4.html | 0 .../docs/doxygen/html/search/all_4.js | 136 + .../docs/doxygen/html/search/all_5.html | 0 .../docs/doxygen/html/search/all_5.js | 39 + .../docs/doxygen/html/search/all_6.html | 0 .../docs/doxygen/html/search/all_6.js | 38 +- .../docs/doxygen/html/search/all_7.html | 0 .../docs/doxygen/html/search/all_7.js | 250 +- .../docs/doxygen/html/search/all_8.html | 0 .../docs/doxygen/html/search/all_8.js | 36 + .../docs/doxygen/html/search/all_9.html | 0 .../docs/doxygen/html/search/all_9.js | 198 + .../docs/doxygen/html/search/all_a.html | 0 .../docs/doxygen/html/search/all_a.js | 2 +- .../docs/doxygen/html/search/all_b.html | 0 .../docs/doxygen/html/search/all_b.js | 4589 ++++++++--------- .../docs/doxygen/html/search/all_c.html | 0 .../docs/doxygen/html/search/all_c.js | 19 + .../docs/doxygen/html/search/all_d.html | 0 .../docs/doxygen/html/search/all_d.js | 51 + .../docs/doxygen/html/search/all_e.html | 0 .../docs/doxygen/html/search/all_e.js | 13 +- .../docs/doxygen/html/search/all_f.html | 0 .../docs/doxygen/html/search/all_f.js | 63 +- .../docs/doxygen/html/search/classes_0.html | 0 .../docs/doxygen/html/search/classes_0.js | 6 + .../docs/doxygen/html/search/classes_1.html | 0 .../docs/doxygen/html/search/classes_1.js | 7 + .../docs/doxygen/html/search/classes_2.html | 0 .../docs/doxygen/html/search/classes_2.js | 13 + .../docs/doxygen/html/search/classes_3.html | 0 .../docs/doxygen/html/search/classes_3.js | 4 + .../docs/doxygen/html/search/classes_4.html | 0 .../docs/doxygen/html/search/classes_4.js | 5 + .../docs/doxygen/html/search/classes_5.html | 0 .../docs/doxygen/html/search/classes_5.js | 8 + .../docs/doxygen/html/search/classes_6.html | 0 .../docs/doxygen/html/search/classes_6.js | 57 + .../docs/doxygen/html/search/classes_7.html | 0 .../docs/doxygen/html/search/classes_7.js | 4 + .../docs/doxygen/html/search/classes_8.html | 0 .../docs/doxygen/html/search/classes_8.js | 4 + .../docs/doxygen/html/search/classes_9.html | 0 .../docs/doxygen/html/search/classes_9.js | 11 + .../docs/doxygen/html/search/classes_a.html | 0 .../docs/doxygen/html/search/classes_a.js | 4 + .../docs/doxygen/html/search/classes_b.html | 0 .../docs/doxygen/html/search/classes_b.js | 4 + .../docs/doxygen/html/search/classes_c.html | 0 .../docs/doxygen/html/search/classes_c.js | 7 + .../docs/doxygen/html/search/classes_d.html | 30 + .../docs/doxygen/html/search/classes_d.js | 4 + .../docs/doxygen/html/search/classes_e.html | 30 + .../docs/doxygen/html/search/classes_e.js | 4 + .../docs/doxygen/html/search/close.png | Bin .../docs/doxygen/html/search/enums_0.html | 0 .../docs/doxygen/html/search/enums_0.js | 2 +- .../docs/doxygen/html/search/enums_1.html | 0 .../docs/doxygen/html/search/enums_1.js | 4 +- .../docs/doxygen/html/search/enums_2.html | 0 .../docs/doxygen/html/search/enums_2.js | 2 +- .../docs/doxygen/html/search/enums_3.html | 0 .../docs/doxygen/html/search/enums_3.js | 2 +- .../docs/doxygen/html/search/enums_4.html | 0 .../docs/doxygen/html/search/enums_4.js | 2 +- .../docs/doxygen/html/search/enums_5.html | 0 .../docs/doxygen/html/search/enums_5.js | 4 + .../docs/doxygen/html/search/enums_6.html | 0 .../docs/doxygen/html/search/enums_6.js | 2 +- .../docs/doxygen/html/search/enums_7.html | 0 .../docs/doxygen/html/search/enums_7.js | 6 + .../docs/doxygen/html/search/enums_8.html | 0 .../docs/doxygen/html/search/enums_8.js | 2 +- .../docs/doxygen/html/search/enums_9.html | 0 .../docs/doxygen/html/search/enums_9.js | 2 +- .../doxygen/html/search/enumvalues_0.html | 0 .../docs/doxygen/html/search/enumvalues_0.js | 24 +- .../doxygen/html/search/enumvalues_1.html | 0 .../docs/doxygen/html/search/enumvalues_1.js | 10 +- .../doxygen/html/search/enumvalues_10.html | 0 .../docs/doxygen/html/search/enumvalues_10.js | 12 +- .../doxygen/html/search/enumvalues_11.html | 0 .../docs/doxygen/html/search/enumvalues_11.js | 4 +- .../doxygen/html/search/enumvalues_12.html | 0 .../docs/doxygen/html/search/enumvalues_12.js | 4 +- .../doxygen/html/search/enumvalues_13.html | 0 .../docs/doxygen/html/search/enumvalues_13.js | 4 +- .../doxygen/html/search/enumvalues_14.html | 0 .../docs/doxygen/html/search/enumvalues_14.js | 4 +- .../doxygen/html/search/enumvalues_15.html | 0 .../docs/doxygen/html/search/enumvalues_15.js | 2 +- .../doxygen/html/search/enumvalues_2.html | 0 .../docs/doxygen/html/search/enumvalues_2.js | 28 +- .../doxygen/html/search/enumvalues_3.html | 0 .../docs/doxygen/html/search/enumvalues_3.js | 6 +- .../doxygen/html/search/enumvalues_4.html | 0 .../docs/doxygen/html/search/enumvalues_4.js | 2 +- .../doxygen/html/search/enumvalues_5.html | 0 .../docs/doxygen/html/search/enumvalues_5.js | 10 +- .../doxygen/html/search/enumvalues_6.html | 0 .../docs/doxygen/html/search/enumvalues_6.js | 16 +- .../doxygen/html/search/enumvalues_7.html | 0 .../docs/doxygen/html/search/enumvalues_7.js | 2 +- .../doxygen/html/search/enumvalues_8.html | 0 .../docs/doxygen/html/search/enumvalues_8.js | 2 +- .../doxygen/html/search/enumvalues_9.html | 0 .../docs/doxygen/html/search/enumvalues_9.js | 68 +- .../doxygen/html/search/enumvalues_a.html | 0 .../docs/doxygen/html/search/enumvalues_a.js | 10 +- .../doxygen/html/search/enumvalues_b.html | 0 .../docs/doxygen/html/search/enumvalues_b.js | 28 +- .../doxygen/html/search/enumvalues_c.html | 0 .../docs/doxygen/html/search/enumvalues_c.js | 8 +- .../doxygen/html/search/enumvalues_d.html | 0 .../docs/doxygen/html/search/enumvalues_d.js | 10 +- .../doxygen/html/search/enumvalues_e.html | 0 .../docs/doxygen/html/search/enumvalues_e.js | 14 +- .../doxygen/html/search/enumvalues_f.html | 0 .../docs/doxygen/html/search/enumvalues_f.js | 24 +- .../docs/doxygen/html/search/files_0.html | 0 .../docs/doxygen/html/search/files_0.js | 7 + .../docs/doxygen/html/search/files_1.html | 0 .../docs/doxygen/html/search/files_1.js | 8 + .../docs/doxygen/html/search/files_2.html | 0 .../docs/doxygen/html/search/files_2.js | 4 + .../docs/doxygen/html/search/files_3.html | 0 .../docs/doxygen/html/search/files_3.js | 115 + .../docs/doxygen/html/search/files_4.html | 0 .../docs/doxygen/html/search/files_4.js | 4 + .../docs/doxygen/html/search/files_5.html | 0 .../docs/doxygen/html/search/files_5.js | 4 + .../docs/doxygen/html/search/files_6.html | 0 .../docs/doxygen/html/search/files_6.js | 4 + .../docs/doxygen/html/search/functions_0.html | 0 .../docs/doxygen/html/search/functions_0.js | 20 + .../docs/doxygen/html/search/functions_1.html | 0 .../docs/doxygen/html/search/functions_1.js | 15 + .../doxygen/html/search/functions_10.html | 0 .../docs/doxygen/html/search/functions_10.js | 20 +- .../doxygen/html/search/functions_11.html | 0 .../docs/doxygen/html/search/functions_11.js | 466 +- .../doxygen/html/search/functions_12.html | 0 .../docs/doxygen/html/search/functions_12.js | 42 +- .../doxygen/html/search/functions_13.html | 0 .../docs/doxygen/html/search/functions_13.js | 8 +- .../doxygen/html/search/functions_14.html | 0 .../docs/doxygen/html/search/functions_14.js | 8 +- .../doxygen/html/search/functions_15.html | 0 .../docs/doxygen/html/search/functions_15.js | 4 + .../doxygen/html/search/functions_16.html | 0 .../docs/doxygen/html/search/functions_16.js | 2 +- .../doxygen/html/search/functions_17.html | 0 .../docs/doxygen/html/search/functions_17.js | 4 + .../docs/doxygen/html/search/functions_2.html | 0 .../docs/doxygen/html/search/functions_2.js | 10 +- .../docs/doxygen/html/search/functions_3.html | 0 .../docs/doxygen/html/search/functions_3.js | 66 +- .../docs/doxygen/html/search/functions_4.html | 0 .../docs/doxygen/html/search/functions_4.js | 103 + .../docs/doxygen/html/search/functions_5.html | 0 .../docs/doxygen/html/search/functions_5.js | 48 +- .../docs/doxygen/html/search/functions_6.html | 0 .../docs/doxygen/html/search/functions_6.js | 10 +- .../docs/doxygen/html/search/functions_7.html | 0 .../docs/doxygen/html/search/functions_7.js | 238 +- .../docs/doxygen/html/search/functions_8.html | 0 .../docs/doxygen/html/search/functions_8.js | 24 +- .../docs/doxygen/html/search/functions_9.html | 0 .../docs/doxygen/html/search/functions_9.js | 143 +- .../docs/doxygen/html/search/functions_a.html | 0 .../docs/doxygen/html/search/functions_a.js | 4 + .../docs/doxygen/html/search/functions_b.html | 0 .../docs/doxygen/html/search/functions_b.js | 7 + .../docs/doxygen/html/search/functions_c.html | 0 .../docs/doxygen/html/search/functions_c.js | 44 +- .../docs/doxygen/html/search/functions_d.html | 0 .../docs/doxygen/html/search/functions_d.js | 4 + .../docs/doxygen/html/search/functions_e.html | 0 .../docs/doxygen/html/search/functions_e.js | 6 +- .../docs/doxygen/html/search/functions_f.html | 0 .../docs/doxygen/html/search/functions_f.js | 5 + .../docs/doxygen/html/search/mag_sel.png | Bin .../doxygen/html/search/namespaces_0.html | 0 .../docs/doxygen/html/search/namespaces_0.js | 4 + .../doxygen/html/search/namespaces_1.html | 0 .../docs/doxygen/html/search/namespaces_1.js | 5 + .../doxygen/html/search/namespaces_2.html | 30 + .../docs/doxygen/html/search/namespaces_2.js | 4 + .../docs/doxygen/html/search/nomatches.html | 0 .../docs/doxygen/html/search/pages_0.html | 0 .../docs/doxygen/html/search/pages_0.js | 4 + .../docs/doxygen/html/search/pages_1.html | 0 .../docs/doxygen/html/search/pages_1.js | 5 + .../docs/doxygen/html/search/pages_2.html | 0 .../docs/doxygen/html/search/pages_2.js | 4 + .../docs/doxygen/html/search/related_0.html | 0 .../docs/doxygen/html/search/related_0.js | 2 +- .../docs/doxygen/html/search/search.css | 0 .../docs/doxygen/html/search/search.js | 0 .../docs/doxygen/html/search/search_l.png | Bin .../docs/doxygen/html/search/search_m.png | Bin .../docs/doxygen/html/search/search_r.png | Bin .../docs/doxygen/html/search/searchdata.js | 6 +- .../docs/doxygen/html/search/typedefs_0.html | 0 .../docs/doxygen/html/search/typedefs_0.js | 4 + .../docs/doxygen/html/search/typedefs_1.html | 30 + .../docs/doxygen/html/search/typedefs_1.js} | 2 +- .../docs/doxygen/html/search/variables_0.html | 0 .../docs/doxygen/html/search/variables_0.js | 138 +- .../docs/doxygen/html/search/variables_1.html | 0 .../docs/doxygen/html/search/variables_1.js | 7 + .../doxygen/html/search/variables_10.html | 0 .../docs/doxygen/html/search/variables_10.js | 19 +- .../doxygen/html/search/variables_11.html | 0 .../docs/doxygen/html/search/variables_11.js | 39 + .../doxygen/html/search/variables_12.html | 0 .../docs/doxygen/html/search/variables_12.js | 27 +- .../doxygen/html/search/variables_13.html | 0 .../docs/doxygen/html/search/variables_13.js | 10 + .../doxygen/html/search/variables_14.html | 0 .../docs/doxygen/html/search/variables_14.js | 8 + .../doxygen/html/search/variables_15.html | 0 .../docs/doxygen/html/search/variables_15.js | 8 + .../doxygen/html/search/variables_16.html | 0 .../docs/doxygen/html/search/variables_16.js | 2 +- .../doxygen/html/search/variables_17.html | 0 .../docs/doxygen/html/search/variables_17.js | 4 +- .../docs/doxygen/html/search/variables_2.html | 0 .../docs/doxygen/html/search/variables_2.js | 13 + .../docs/doxygen/html/search/variables_3.html | 0 .../docs/doxygen/html/search/variables_3.js | 35 +- .../docs/doxygen/html/search/variables_4.html | 0 .../docs/doxygen/html/search/variables_4.js | 14 + .../docs/doxygen/html/search/variables_5.html | 0 .../docs/doxygen/html/search/variables_5.js | 6 + .../docs/doxygen/html/search/variables_6.html | 0 .../docs/doxygen/html/search/variables_6.js | 20 +- .../docs/doxygen/html/search/variables_7.html | 0 .../docs/doxygen/html/search/variables_7.js | 9 + .../docs/doxygen/html/search/variables_8.html | 0 .../docs/doxygen/html/search/variables_8.js | 8 + .../docs/doxygen/html/search/variables_9.html | 0 .../docs/doxygen/html/search/variables_9.js | 4529 ++++++++-------- .../docs/doxygen/html/search/variables_a.html | 0 .../docs/doxygen/html/search/variables_a.js | 9 + .../docs/doxygen/html/search/variables_b.html | 0 .../docs/doxygen/html/search/variables_b.js | 12 + .../docs/doxygen/html/search/variables_c.html | 0 .../docs/doxygen/html/search/variables_c.js | 4 +- .../docs/doxygen/html/search/variables_d.html | 0 .../docs/doxygen/html/search/variables_d.js | 55 +- .../docs/doxygen/html/search/variables_e.html | 0 .../docs/doxygen/html/search/variables_e.js | 27 + .../docs/doxygen/html/search/variables_f.html | 0 .../docs/doxygen/html/search/variables_f.js | 4 +- .../docs/doxygen/html/splitbar.png | Bin .../html/structCoronaSection-members.html | 0 .../doxygen/html/structCoronaSection.html | 0 .../html/structirparams__t-members.html | 0 .../docs/doxygen/html/structirparams__t.html | 0 .../html/structmatch__result__t-members.html | 0 .../doxygen/html/structmatch__result__t.html | 0 .../html/structstdAc_1_1state__t-members.html | 0 .../doxygen/html/structstdAc_1_1state__t.html | 0 .../docs/doxygen/html/sync_off.png | Bin .../docs/doxygen/html/sync_on.png | Bin .../docs/doxygen/html/tab_a.png | Bin .../docs/doxygen/html/tab_b.png | Bin .../docs/doxygen/html/tab_h.png | Bin .../docs/doxygen/html/tab_s.png | Bin .../docs/doxygen/html/tabs.css | 0 .../docs/doxygen/html/todo.html | 20 +- .../html/unionAirwellProtocol-members.html | 0 .../doxygen/html/unionAirwellProtocol.html | 0 .../html/unionAmcorProtocol-members.html | 0 .../docs/doxygen/html/unionAmcorProtocol.html | 0 .../html/unionArgoProtocol-members.html | 0 .../docs/doxygen/html/unionArgoProtocol.html | 0 .../html/unionCarrierProtocol-members.html | 0 .../doxygen/html/unionCarrierProtocol.html | 0 .../html/unionCoolixProtocol-members.html | 0 .../doxygen/html/unionCoolixProtocol.html | 0 .../html/unionCoronaProtocol-members.html | 0 .../doxygen/html/unionCoronaProtocol.html | 0 .../html/unionCoronaProtocol__coll__graph.map | 0 .../html/unionCoronaProtocol__coll__graph.md5 | 0 .../html/unionCoronaProtocol__coll__graph.png | Bin .../html/unionDaikin128Protocol-members.html | 0 .../doxygen/html/unionDaikin128Protocol.html | 0 .../html/unionDaikin152Protocol-members.html | 0 .../doxygen/html/unionDaikin152Protocol.html | 0 .../html/unionDaikin160Protocol-members.html | 0 .../doxygen/html/unionDaikin160Protocol.html | 0 .../html/unionDaikin176Protocol-members.html | 0 .../doxygen/html/unionDaikin176Protocol.html | 0 .../html/unionDaikin216Protocol-members.html | 0 .../doxygen/html/unionDaikin216Protocol.html | 0 .../html/unionDaikin2Protocol-members.html | 0 .../doxygen/html/unionDaikin2Protocol.html | 0 .../html/unionDaikin64Protocol-members.html | 0 .../doxygen/html/unionDaikin64Protocol.html | 0 .../html/unionDaikinESPProtocol-members.html | 0 .../doxygen/html/unionDaikinESPProtocol.html | 0 .../html/unionDelonghiProtocol-members.html | 0 .../doxygen/html/unionDelonghiProtocol.html | 0 .../html/unionElectraProtocol-members.html | 0 .../doxygen/html/unionElectraProtocol.html | 0 .../unionGoodweatherProtocol-members.html | 0 .../html/unionGoodweatherProtocol.html | 0 .../html/unionGreeProtocol-members.html | 0 .../docs/doxygen/html/unionGreeProtocol.html | 0 .../html/unionHaierProtocol-members.html | 0 .../docs/doxygen/html/unionHaierProtocol.html | 0 .../html/unionHaierYRW02Protocol-members.html | 0 .../doxygen/html/unionHaierYRW02Protocol.html | 0 .../html/unionHitachi1Protocol-members.html | 0 .../doxygen/html/unionHitachi1Protocol.html | 0 .../html/unionHitachi424Protocol-members.html | 0 .../doxygen/html/unionHitachi424Protocol.html | 0 .../html/unionHitachiProtocol-members.html | 0 .../doxygen/html/unionHitachiProtocol.html | 0 .../html/unionKelvinatorProtocol-members.html | 0 .../doxygen/html/unionKelvinatorProtocol.html | 0 .../doxygen/html/unionLGProtocol-members.html | 0 .../docs/doxygen/html/unionLGProtocol.html | 0 .../html/unionMideaProtocol-members.html | 0 .../docs/doxygen/html/unionMideaProtocol.html | 9 + .../unionMitsubishi112Protocol-members.html | 0 .../html/unionMitsubishi112Protocol.html | 0 .../unionMitsubishi136Protocol-members.html | 0 .../html/unionMitsubishi136Protocol.html | 0 .../unionMitsubishi144Protocol-members.html | 0 .../html/unionMitsubishi144Protocol.html | 0 .../unionMitsubishi152Protocol-members.html | 0 .../html/unionMitsubishi152Protocol.html | 0 .../unionMitsubishi88Protocol-members.html | 0 .../html/unionMitsubishi88Protocol.html | 0 .../html/unionNeoclimaProtocol-members.html | 110 + .../doxygen/html/unionNeoclimaProtocol.html | 610 +++ .../unionPanasonicAc32Protocol-members.html | 90 + .../html/unionPanasonicAc32Protocol.html | 293 ++ .../html/unionSamsungProtocol-members.html | 117 + .../doxygen/html/unionSamsungProtocol.html | 751 +++ .../html/unionSanyoProtocol-members.html | 102 + .../docs/doxygen/html/unionSanyoProtocol.html | 485 ++ .../html/unionSharpProtocol-members.html | 106 + .../docs/doxygen/html/unionSharpProtocol.html | 546 ++ .../html/unionVoltasProtocol-members.html | 0 .../doxygen/html/unionVoltasProtocol.html | 126 +- .../doxygen/html/unionmagiquest-members.html | 0 .../docs/doxygen/html/unionmagiquest.html | 0 .../docs/doxygen/html/zh-CN_8h.html | 0 .../docs/doxygen/html/zh-CN_8h_source.html | 0 .../docs/doxygen_index.md | 0 .../examples/BlynkIrRemote/BlynkIrRemote.ino | 0 .../examples/BlynkIrRemote/platformio.ini | 0 .../CommonAcControl/CommonAcControl.ino | 0 .../examples/CommonAcControl/platformio.ini | 0 .../ControlSamsungAC/ControlSamsungAC.ino | 0 .../examples/ControlSamsungAC/platformio.ini | 0 .../DumbIRRepeater/DumbIRRepeater.ino | 0 .../examples/DumbIRRepeater/platformio.ini | 0 .../examples/IRGCSendDemo/IRGCSendDemo.ino | 0 .../examples/IRGCSendDemo/platformio.ini | 0 .../examples/IRGCTCPServer/IRGCTCPServer.ino | 0 .../examples/IRGCTCPServer/platformio.ini | 0 .../examples/IRMQTTServer/IRMQTTServer.h | 1 + .../examples/IRMQTTServer/IRMQTTServer.ino | 16 +- .../examples/IRMQTTServer/platformio.ini | 0 .../examples/IRServer/IRServer.ino | 0 .../examples/IRServer/platformio.ini | 0 .../examples/IRrecvDemo/IRrecvDemo.ino | 0 .../examples/IRrecvDemo/platformio.ini | 0 .../examples/IRrecvDump/IRrecvDump.ino | 0 .../examples/IRrecvDump/platformio.ini | 0 .../examples/IRrecvDumpV2/IRrecvDumpV2.ino | 0 .../examples/IRrecvDumpV2/platformio.ini | 0 .../examples/IRrecvDumpV3/BaseOTA.h | 0 .../examples/IRrecvDumpV3/IRrecvDumpV3.ino | 0 .../examples/IRrecvDumpV3/platformio.ini | 0 .../examples/IRsendDemo/IRsendDemo.ino | 0 .../examples/IRsendDemo/platformio.ini | 0 .../IRsendProntoDemo/IRsendProntoDemo.ino | 0 .../examples/IRsendProntoDemo/platformio.ini | 0 .../JVCPanasonicSendDemo.ino | 0 .../JVCPanasonicSendDemo/platformio.ini | 0 .../examples/LGACSend/LGACSend.ino | 0 .../examples/LGACSend/platformio.ini | 0 .../SmartIRRepeater/SmartIRRepeater.ino | 0 .../examples/SmartIRRepeater/platformio.ini | 0 .../examples/TurnOnArgoAC/TurnOnArgoAC.ino | 0 .../examples/TurnOnArgoAC/platformio.ini | 0 .../TurnOnDaikinAC/TurnOnDaikinAC.ino | 0 .../examples/TurnOnDaikinAC/platformio.ini | 0 .../TurnOnFujitsuAC/TurnOnFujitsuAC.ino | 0 .../examples/TurnOnFujitsuAC/platformio.ini | 0 .../examples/TurnOnGreeAC/TurnOnGreeAC.ino | 0 .../examples/TurnOnGreeAC/platformio.ini | 0 .../TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino | 0 .../TurnOnKelvinatorAC/platformio.ini | 0 .../TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino | 0 .../TurnOnMitsubishiAC/platformio.ini | 0 .../TurnOnMitsubishiHeavyAc.ino | 0 .../TurnOnMitsubishiHeavyAc/platformio.ini | 0 .../TurnOnPanasonicAC/TurnOnPanasonicAC.ino | 0 .../examples/TurnOnPanasonicAC/platformio.ini | 0 .../TurnOnToshibaAC/TurnOnToshibaAC.ino | 0 .../examples/TurnOnToshibaAC/platformio.ini | 0 .../TurnOnTrotecAC/TurnOnTrotecAC.ino | 0 .../examples/TurnOnTrotecAC/platformio.ini | 0 .../examples/Web-AC-control/README.md | 0 .../examples/Web-AC-control/Web-AC-control.h | 0 .../Web-AC-control/Web-AC-control.ino | 0 .../examples/Web-AC-control/data/favicon.ico | Bin .../Web-AC-control/data/level_1_off.svg | 0 .../Web-AC-control/data/level_1_on.svg | 0 .../Web-AC-control/data/level_2_off.svg | 0 .../Web-AC-control/data/level_2_on.svg | 0 .../Web-AC-control/data/level_3_off.svg | 0 .../Web-AC-control/data/level_3_on.svg | 0 .../Web-AC-control/data/level_4_off.svg | 0 .../Web-AC-control/data/level_4_on.svg | 0 .../examples/Web-AC-control/data/ui.html | 0 .../examples/Web-AC-control/data/ui.js | 0 .../examples/Web-AC-control/platformio.ini | 0 .../examples/Web-AC-control/printscreen.png | Bin .../keywords.txt | 101 +- .../library.json | 2 +- .../library.properties | 2 +- .../platformio.ini | 0 .../pylintrc | 0 .../src/CPPLINT.cfg | 0 .../src/IRac.cpp | 73 + .../src/IRac.h | 6 + .../src/IRrecv.cpp | 198 +- .../src/IRrecv.h | 0 .../src/IRremoteESP8266.h | 2 +- .../src/IRsend.cpp | 0 .../src/IRsend.h | 0 .../src/IRtext.cpp | 0 .../src/IRtext.h | 0 .../src/IRtimer.cpp | 0 .../src/IRtimer.h | 0 .../src/IRutils.cpp | 15 +- .../src/IRutils.h | 3 +- .../src/i18n.h | 0 .../src/ir_Airwell.cpp | 0 .../src/ir_Airwell.h | 0 .../src/ir_Aiwa.cpp | 0 .../src/ir_Amcor.cpp | 0 .../src/ir_Amcor.h | 0 .../src/ir_Argo.cpp | 0 .../src/ir_Argo.h | 0 .../src/ir_Carrier.cpp | 0 .../src/ir_Carrier.h | 0 .../src/ir_Coolix.cpp | 0 .../src/ir_Coolix.h | 0 .../src/ir_Corona.cpp | 0 .../src/ir_Corona.h | 0 .../src/ir_Daikin.cpp | 0 .../src/ir_Daikin.h | 0 .../src/ir_Delonghi.cpp | 0 .../src/ir_Delonghi.h | 0 .../src/ir_Denon.cpp | 0 .../src/ir_Dish.cpp | 0 .../src/ir_Doshisha.cpp | 0 .../src/ir_Electra.cpp | 0 .../src/ir_Electra.h | 0 .../src/ir_EliteScreens.cpp | 8 + .../src/ir_Epson.cpp | 0 .../src/ir_Fujitsu.cpp | 0 .../src/ir_Fujitsu.h | 0 .../src/ir_GICable.cpp | 0 .../src/ir_GlobalCache.cpp | 0 .../src/ir_Goodweather.cpp | 0 .../src/ir_Goodweather.h | 0 .../src/ir_Gree.cpp | 0 .../src/ir_Gree.h | 2 + .../src/ir_Haier.cpp | 0 .../src/ir_Haier.h | 0 .../src/ir_Hitachi.cpp | 0 .../src/ir_Hitachi.h | 0 .../src/ir_Inax.cpp | 0 .../src/ir_JVC.cpp | 0 .../src/ir_Kelvinator.cpp | 0 .../src/ir_Kelvinator.h | 1 + .../src/ir_LG.cpp | 0 .../src/ir_LG.h | 0 .../src/ir_Lasertag.cpp | 2 +- .../src/ir_Lego.cpp | 0 .../src/ir_Lutron.cpp | 0 .../src/ir_MWM.cpp | 0 .../src/ir_Magiquest.cpp | 0 .../src/ir_Magiquest.h | 0 .../src/ir_Metz.cpp | 0 .../src/ir_Midea.cpp | 0 .../src/ir_Midea.h | 21 +- .../src/ir_Mirage.cpp | 0 .../src/ir_Mitsubishi.cpp | 0 .../src/ir_Mitsubishi.h | 0 .../src/ir_MitsubishiHeavy.cpp | 0 .../src/ir_MitsubishiHeavy.h | 0 .../src/ir_Multibrackets.cpp | 0 .../src/ir_NEC.cpp | 0 .../src/ir_NEC.h | 0 .../src/ir_Neoclima.cpp | 215 +- .../src/ir_Neoclima.h | 126 +- .../src/ir_Nikai.cpp | 0 .../src/ir_Panasonic.cpp | 338 +- .../src/ir_Panasonic.h | 89 +- .../src/ir_Pioneer.cpp | 0 .../src/ir_Pronto.cpp | 0 .../src/ir_RC5_RC6.cpp | 0 .../src/ir_RCMM.cpp | 0 .../src/ir_Samsung.cpp | 205 +- .../src/ir_Samsung.h | 135 +- .../src/ir_Sanyo.cpp | 138 +- .../src/ir_Sanyo.h | 110 +- .../src/ir_Sharp.cpp | 214 +- .../src/ir_Sharp.h | 124 +- .../src/ir_Sherwood.cpp | 0 .../src/ir_Sony.cpp | 0 .../src/ir_Symphony.cpp | 0 .../src/ir_Tcl.cpp | 0 .../src/ir_Tcl.h | 0 .../src/ir_Technibel.cpp | 0 .../src/ir_Technibel.h | 0 .../src/ir_Teco.cpp | 0 .../src/ir_Teco.h | 0 .../src/ir_Toshiba.cpp | 0 .../src/ir_Toshiba.h | 0 .../src/ir_Transcold.cpp | 0 .../src/ir_Transcold.h | 0 .../src/ir_Trotec.cpp | 0 .../src/ir_Trotec.h | 0 .../src/ir_Vestel.cpp | 0 .../src/ir_Vestel.h | 0 .../src/ir_Voltas.cpp | 0 .../src/ir_Voltas.h | 0 .../src/ir_Whirlpool.cpp | 0 .../src/ir_Whirlpool.h | 0 .../src/ir_Whynter.cpp | 0 .../src/ir_Zepeal.cpp | 0 .../src/locale/README.md | 0 .../src/locale/de-CH.h | 0 .../src/locale/de-DE.h | 0 .../src/locale/defaults.h | 0 .../src/locale/en-AU.h | 0 .../src/locale/en-IE.h | 0 .../src/locale/en-UK.h | 0 .../src/locale/en-US.h | 0 .../src/locale/es-ES.h | 0 .../src/locale/fr-FR.h | 0 .../src/locale/it-IT.h | 0 .../src/locale/pt-BR.h | 0 .../src/locale/zh-CN.h | 0 .../test/IRac_test.cpp | 28 +- .../test/IRrecv_test.cpp | 0 .../test/IRrecv_test.h | 0 .../test/IRsend_test.cpp | 0 .../test/IRsend_test.h | 0 .../test/IRutils_test.cpp | 0 .../test/Makefile | 0 .../test/ir_Airwell_test.cpp | 0 .../test/ir_Aiwa_test.cpp | 0 .../test/ir_Amcor_test.cpp | 0 .../test/ir_Argo_test.cpp | 0 .../test/ir_Carrier_test.cpp | 0 .../test/ir_Coolix_test.cpp | 0 .../test/ir_Corona_test.cpp | 0 .../test/ir_Daikin_test.cpp | 0 .../test/ir_Delonghi_test.cpp | 0 .../test/ir_Denon_test.cpp | 0 .../test/ir_Dish_test.cpp | 0 .../test/ir_Doshisha_test.cpp | 0 .../test/ir_Electra_test.cpp | 0 .../test/ir_EliteScreens_test.cpp | 0 .../test/ir_Epson_test.cpp | 0 .../test/ir_Fujitsu_test.cpp | 0 .../test/ir_GICable_test.cpp | 0 .../test/ir_GlobalCache_test.cpp | 0 .../test/ir_Goodweather_test.cpp | 0 .../test/ir_Gree_test.cpp | 0 .../test/ir_Haier_test.cpp | 0 .../test/ir_Hitachi_test.cpp | 0 .../test/ir_Inax_test.cpp | 0 .../test/ir_JVC_test.cpp | 0 .../test/ir_Kelvinator_test.cpp | 0 .../test/ir_LG_test.cpp | 0 .../test/ir_Lasertag_test.cpp | 0 .../test/ir_Lego_test.cpp | 0 .../test/ir_Lutron_test.cpp | 0 .../test/ir_MWM_test.cpp | 0 .../test/ir_Magiquest_test.cpp | 0 .../test/ir_Metz_test.cpp | 0 .../test/ir_Midea_test.cpp | 36 + .../test/ir_Mirage_test.cpp | 0 .../test/ir_MitsubishiHeavy_test.cpp | 0 .../test/ir_Mitsubishi_test.cpp | 0 .../test/ir_Multibrackets_test.cpp | 0 .../test/ir_NEC_test.cpp | 0 .../test/ir_Neoclima_test.cpp | 0 .../test/ir_Nikai_test.cpp | 0 .../test/ir_Panasonic_test.cpp | 565 +- .../test/ir_Pioneer_test.cpp | 0 .../test/ir_Pronto_test.cpp | 0 .../test/ir_RC5_RC6_test.cpp | 0 .../test/ir_RCMM_test.cpp | 0 .../test/ir_Samsung_test.cpp | 0 .../test/ir_Sanyo_test.cpp | 6 +- .../test/ir_Sharp_test.cpp | 0 .../test/ir_Sherwood_test.cpp | 0 .../test/ir_Sony_test.cpp | 0 .../test/ir_Symphony_test.cpp | 0 .../test/ir_Tcl_test.cpp | 0 .../test/ir_Technibel_test.cpp | 0 .../test/ir_Teco_test.cpp | 0 .../test/ir_Toshiba_test.cpp | 0 .../test/ir_Transcold_test.cpp | 0 .../test/ir_Trotec_test.cpp | 0 .../test/ir_Vestel_test.cpp | 0 .../test/ir_Voltas_test.cpp | 0 .../test/ir_Whirlpool_test.cpp | 0 .../test/ir_Whynter_test.cpp | 0 .../test/ir_Zepeal_test.cpp | 0 .../tools/Makefile | 0 .../tools/RawToGlobalCache.sh | 0 .../tools/auto_analyse_raw_data.py | 0 .../tools/auto_analyse_raw_data_test.py | 0 .../tools/gc_decode.cpp | 0 .../tools/generate_irtext_h.sh | 0 .../tools/mkkeywords | 0 .../tools/mode2_decode.cpp | 0 .../tools/raw_to_pronto_code.py | 0 .../tools/raw_to_pronto_code_test.py | 0 .../tools/scrape_supported_devices.py | 0 1639 files changed, 18048 insertions(+), 13683 deletions(-) delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.map delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.md5 delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.png delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_10.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_15.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_17.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_1a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_1b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_8.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_9.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_c.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/all_d.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_3.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_6.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_8.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_9.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/classes_c.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/enums_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/enums_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_3.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/files_6.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_15.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_17.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_d.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/functions_f.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/namespaces_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/namespaces_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/pages_0.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/pages_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/pages_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_1.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_11.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_13.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_14.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_15.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_2.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_4.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_5.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_7.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_8.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_a.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_b.js delete mode 100644 lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/search/variables_e.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.github/CONTRIBUTING.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.github/Contributors.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.github/issue_template.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.gitignore (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.gitmodules (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.style.yapf (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/.travis.yml (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/CPPLINT.cfg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/Doxyfile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/LICENSE.txt (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/README.md (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/README_de.md (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/README_fr.md (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/ReleaseNotes.md (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/SupportedProtocols.md (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/README_de.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/README_fr.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/_config.yml (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRac_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRac_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRac_8h_source.html (94%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRrecv_8cpp.html rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRrecv_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRrecv_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRremoteESP8266_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRremoteESP8266_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRsend_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRsend_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRsend_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtext_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtext_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtext_8h_source.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtimer_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtimer_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRtimer_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRutils_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRutils_8h.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/IRutils_8h_source.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/README_8md.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/annotated.html (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/bc_s.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/bdwn.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAirwellAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAirwellAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAirwellAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAirwellAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAmcorAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAmcorAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAmcorAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRAmcorAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRArgoAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRArgoAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRArgoAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRArgoAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRArgoAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCarrierAc64-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCarrierAc64.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCarrierAc64__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCarrierAc64__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoolixAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoolixAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoolixAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoolixAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoronaAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoronaAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoronaAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRCoronaAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin128-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin128.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin128__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin128__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin128__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin152-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin152.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin152__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin152__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin152__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin160-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin160.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin160__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin160__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin160__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin176-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin176.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin176__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin176__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin176__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin2-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin216-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin216.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin216__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin216__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin216__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin2__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin2__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin2__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin64-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin64.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin64__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin64__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikin64__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikinESP-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikinESP.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikinESP__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDaikinESP__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDelonghiAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDelonghiAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDelonghiAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRDelonghiAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRElectraAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRElectraAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRElectraAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRElectraAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRElectraAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRFujitsuAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRFujitsuAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRFujitsuAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRFujitsuAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGoodweatherAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGoodweatherAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGreeAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGreeAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGreeAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGreeAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRGreeAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierACYRW02-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierACYRW02.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHaierAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc1-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc1__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc1__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc3-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc3__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc3__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRHitachiAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRKelvinatorAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRKelvinatorAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRLgAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRLgAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRLgAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRLgAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRLgAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMideaAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMideaAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMideaAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMideaAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMideaAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi112-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi112.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi112__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi112__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi136-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi136.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi136__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishi136__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRNeoclimaAc-members.html (67%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRNeoclimaAc.html (85%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRPanasonicAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRPanasonicAc.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRPanasonicAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRPanasonicAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRPanasonicAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSamsungAc-members.html (68%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSamsungAc.html (88%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSanyoAc-members.html (66%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSanyoAc.html (83%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSharpAc-members.html (65%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRSharpAc.html (86%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTcl112Ac-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTcl112Ac.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTcl112Ac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTcl112Ac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTechnibelAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTechnibelAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTechnibelAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTechnibelAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTecoAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTecoAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTecoAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTecoAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTecoAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRToshibaAC-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRToshibaAC.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRToshibaAC__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRToshibaAC__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTranscoldAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTranscoldAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTranscoldAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTranscoldAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTrotecESP-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTrotecESP.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTrotecESP__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRTrotecESP__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVestelAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVestelAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVestelAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVestelAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVestelAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVoltas-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVoltas.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVoltas__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVoltas__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRVoltas__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRWhirlpoolAc-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRWhirlpoolAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRac-members.html (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRac.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRac__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRac__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRac__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRrecv-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRrecv.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRrecv__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRrecv__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRrecv__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRsend-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRsend.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRtimer-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classIRtimer.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classTimerMs-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classTimerMs.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classdecode__results-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classdecode__results.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/classes.html (88%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/closed.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/de-CH_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/de-CH_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/de-DE_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/de-DE_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/defaults_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/defaults_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/deprecated.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/dir_49e56c817e5e54854c35e136979f97ca.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/dir_68267d1309a1af8e8297ef4c3efbcdba.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/dir_84fe998d1eb06414cc389ad334e77e63.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/doc.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/doxygen.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/doxygen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/doxygen__index_8md.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/dynsections.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-AU_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-AU_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-IE_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-IE_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-UK_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-UK_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-US_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/en-US_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/es-ES_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/es-ES_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/files.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/folderclosed.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/folderopen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/fr-FR_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/fr-FR_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_a.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_b.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_c.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_d.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_e.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_f.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_b.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_c.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_g.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_i.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_k.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_l.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_m.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_o.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_p.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_r.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_s.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_t.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_u.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_func_~.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_g.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_h.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_i.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_k.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_l.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_m.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_o.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_p.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_q.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_r.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_rela.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_s.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_t.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_u.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_a.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_b.html (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_c.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_d.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_e.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_f.html (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_h.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_i.html (91%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_l.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_m.html (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_o.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_p.html (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_q.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_r.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_s.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_t.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_u.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_vars_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/functions_~.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_enum.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_eval.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_func.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_g.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_h.html (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_i.html (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_j.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_k.html (95%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_l.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_m.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_n.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_p.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_r.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_s.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_type.html (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_u.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_v.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_vars.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_vars_i.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_vars_k.html (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_w.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_x.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_y.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/globals_z.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/graph_legend.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/graph_legend.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/graph_legend.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/hierarchy.html (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/i18n_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/i18n_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/index.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_0.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_0.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_0.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_1.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_1.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_1.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_10.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_10.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_10.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_11.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_11.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_11.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_12.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_12.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_12.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_13.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_13.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_13.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_14.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_14.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_14.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_15.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_15.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_15.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_16.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_16.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_16.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_17.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_17.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_17.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_18.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_18.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_18.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_19.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_19.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_19.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_2.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_2.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_2.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_20.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_20.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_20.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_21.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_21.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_21.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_22.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_22.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_22.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_23.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_23.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_23.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_24.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_24.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_24.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_25.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_25.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_25.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_26.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_26.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_26.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_27.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_27.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_27.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_28.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_28.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_28.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_29.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_29.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_29.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_3.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_3.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_3.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_30.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_30.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_30.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_31.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_31.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_31.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_32.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_32.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_32.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_33.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_33.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_33.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_34.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_34.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_34.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_35.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_35.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_35.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_36.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_36.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_36.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_37.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_37.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_37.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_38.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_38.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_38.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_39.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_39.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_39.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_4.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_4.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_4.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_40.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_40.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_40.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_41.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_41.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_41.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_42.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_42.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_42.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_43.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_43.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_43.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_44.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_44.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_44.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_45.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_45.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_45.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_46.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_46.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_46.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_47.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_47.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_47.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_48.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_48.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_48.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_49.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_49.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_49.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_5.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_5.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_5.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_50.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_50.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_50.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_51.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_51.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_51.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_52.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_52.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_52.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_53.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_53.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_53.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_54.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_54.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_54.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_55.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_55.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_55.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_56.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_56.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_56.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_57.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_57.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_57.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_58.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_58.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_58.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_59.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_59.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_59.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_6.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_6.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_6.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_60.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_60.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_60.png (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.png rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_7.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_7.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_7.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_8.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_8.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_8.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.png} (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.png rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_9.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_9.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherit_graph_9.png (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.png create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.map create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.md5 create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.png rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_87.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_93.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_87.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_93.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_87.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_93.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_88.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_88.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_88.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_94.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_89.map => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.map} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_89.md5 => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.md5} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_89.png => IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_95.png} (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/inherits.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Airwell_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Airwell_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Airwell_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Aiwa_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Amcor_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Amcor_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Amcor_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Argo_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Argo_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Argo_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Carrier_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Carrier_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Carrier_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Coolix_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Coolix_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Coolix_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Corona_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Corona_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Corona_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Daikin_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Daikin_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Daikin_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Delonghi_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Delonghi_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Delonghi_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Denon_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Dish_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Doshisha_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Electra_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Electra_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Electra_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__EliteScreens_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Epson_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Fujitsu_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Fujitsu_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Fujitsu_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__GICable_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__GlobalCache_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Goodweather_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Goodweather_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Goodweather_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Gree_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Gree_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Gree_8h_source.html (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Haier_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Haier_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Haier_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Hitachi_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Hitachi_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Hitachi_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Inax_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__JVC_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Kelvinator_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Kelvinator_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Kelvinator_8h_source.html (82%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__LG_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__LG_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__LG_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Lasertag_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Lego_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Lutron_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__MWM_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Magiquest_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Magiquest_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Magiquest_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Metz_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Midea_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Midea_8h.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Midea_8h_source.html (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Mirage_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__MitsubishiHeavy_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Mitsubishi_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Mitsubishi_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Mitsubishi_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Multibrackets_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__NEC_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__NEC_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__NEC_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Neoclima_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Neoclima_8h.html (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Neoclima_8h_source.html (56%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Nikai_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Panasonic_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Panasonic_8h.html (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Panasonic_8h_source.html (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Pioneer_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Pronto_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__RC5__RC6_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__RCMM_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Samsung_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Samsung_8h.html (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Samsung_8h_source.html (55%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sanyo_8cpp.html (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sanyo_8h.html (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sanyo_8h_source.html (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sharp_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sharp_8h.html (67%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sharp_8h_source.html (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sherwood_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Sony_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Symphony_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Tcl_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Tcl_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Tcl_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Technibel_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Technibel_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Technibel_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Teco_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Teco_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Teco_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Toshiba_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Toshiba_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Toshiba_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Transcold_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Transcold_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Transcold_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Trotec_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Trotec_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Trotec_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Vestel_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Vestel_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Vestel_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Voltas_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Voltas_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Voltas_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Whirlpool_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Whirlpool_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Whirlpool_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Whynter_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/ir__Zepeal_8cpp.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/it-IT_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/it-IT_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/jquery.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/md_src_locale_README.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/menu.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/menudata.js (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespaceIRAcUtils.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/IRrecv_8cpp.html => IRremoteESP8266-2.7.14/docs/doxygen/html/namespace__IRrecv.html} (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespaceirutils.html (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespacemembers.html (90%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespacemembers_enum.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespacemembers_func.html (98%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/namespacemembers_vars.html rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespaces.html (77%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/namespacestdAc.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/nav_f.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/nav_g.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/nav_h.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/open.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/pages.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/pt-BR_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/pt-BR_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_0.js (81%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_1.js (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_10.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_10.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_11.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_12.js (65%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_13.js (67%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_14.js (68%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_15.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_15.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_16.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_16.js (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_17.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_17.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_18.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_18.js (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_19.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_19.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_1a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1a.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_1b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_1b.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_2.js (68%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_3.js (72%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_6.js (67%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_7.js (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_8.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_8.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_9.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_9.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_a.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_b.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_c.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_c.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_d.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/all_d.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_e.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/all_f.js (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_3.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_3.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_6.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_6.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_8.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_8.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_9.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_9.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_b.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/classes_c.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_c.js create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_d.js create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/classes_e.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/close.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_0.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_1.js (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_2.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_3.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_4.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_4.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_6.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/enums_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_8.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enums_9.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_0.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_1.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_1.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_10.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_11.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_12.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_13.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_14.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_15.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_15.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_2.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_3.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_4.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_4.js (64%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_5.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_5.js (59%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_6.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_7.js (61%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_8.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_9.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_a.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_a.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_b.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_b.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_c.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_d.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_e.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/enumvalues_f.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_3.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_3.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/files_6.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/files_6.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_10.js (75%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_11.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_11.js (71%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_12.js (68%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_13.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_13.js (63%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_14.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_14.js (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_15.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_15.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_16.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_16.js (82%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_17.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_17.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_2.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_2.js (67%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_3.js (75%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_5.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_5.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_6.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_7.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_7.js (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_8.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_8.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_9.js (54%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_b.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_c.js (58%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_d.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_d.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_e.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_e.js (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/functions_f.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/functions_f.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/mag_sel.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/namespaces_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/namespaces_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_1.js create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/namespaces_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/nomatches.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/pages_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_0.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/pages_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/pages_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/pages_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/related_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/related_0.js (57%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/search.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/search.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/search_l.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/search_m.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/search_r.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/searchdata.js (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/typedefs_0.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/typedefs_0.js create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/typedefs_1.html rename lib/lib_basic/{IRremoteESP8266-2.7.13/docs/doxygen/html/search/typedefs_0.js => IRremoteESP8266-2.7.14/docs/doxygen/html/search/typedefs_1.js} (53%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_0.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_0.js (71%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_1.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_1.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_10.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_10.js (64%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_11.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_11.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_12.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_12.js (65%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_13.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_13.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_14.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_14.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_15.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_15.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_16.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_16.js (72%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_17.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_17.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_2.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_2.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_3.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_3.js (51%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_4.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_4.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_5.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_5.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_6.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_6.js (70%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_7.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_7.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_8.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_8.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_9.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_9.js (52%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_a.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_a.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_b.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_b.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_c.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_c.js (62%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_d.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_d.js (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_e.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/search/variables_e.js rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_f.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/search/variables_f.js (60%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/splitbar.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structCoronaSection-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structCoronaSection.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structirparams__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structirparams__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structmatch__result__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structmatch__result__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structstdAc_1_1state__t-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/structstdAc_1_1state__t.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/sync_off.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/sync_on.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/tab_a.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/tab_b.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/tab_h.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/tab_s.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/tabs.css (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/todo.html (89%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionAirwellProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionAirwellProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionAmcorProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionAmcorProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionArgoProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionArgoProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCarrierProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCarrierProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoolixProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoolixProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoronaProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoronaProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoronaProtocol__coll__graph.map (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoronaProtocol__coll__graph.md5 (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionCoronaProtocol__coll__graph.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin128Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin128Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin152Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin152Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin160Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin160Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin176Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin176Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin216Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin216Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin2Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin2Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin64Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikin64Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikinESPProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDaikinESPProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDelonghiProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionDelonghiProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionElectraProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionElectraProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionGoodweatherProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionGoodweatherProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionGreeProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionGreeProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHaierProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHaierProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHaierYRW02Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHaierYRW02Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachi1Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachi1Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachi424Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachi424Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachiProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionHitachiProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionKelvinatorProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionKelvinatorProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionLGProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionLGProtocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMideaProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMideaProtocol.html (93%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi112Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi112Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi136Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi136Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi144Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi144Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi152Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi152Protocol.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi88Protocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionMitsubishi88Protocol.html (100%) create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionNeoclimaProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionNeoclimaProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionPanasonicAc32Protocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionPanasonicAc32Protocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSamsungProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSamsungProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSanyoProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSanyoProtocol.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSharpProtocol-members.html create mode 100644 lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/unionSharpProtocol.html rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionVoltasProtocol-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionVoltasProtocol.html (85%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionmagiquest-members.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/unionmagiquest.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/zh-CN_8h.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen/html/zh-CN_8h_source.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/docs/doxygen_index.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/BlynkIrRemote/BlynkIrRemote.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/BlynkIrRemote/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/CommonAcControl/CommonAcControl.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/CommonAcControl/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/ControlSamsungAC/ControlSamsungAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/ControlSamsungAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/DumbIRRepeater/DumbIRRepeater.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/DumbIRRepeater/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRGCSendDemo/IRGCSendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRGCSendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRGCTCPServer/IRGCTCPServer.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRGCTCPServer/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRMQTTServer/IRMQTTServer.h (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRMQTTServer/IRMQTTServer.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRMQTTServer/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRServer/IRServer.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRServer/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDemo/IRrecvDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDump/IRrecvDump.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDump/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDumpV2/IRrecvDumpV2.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDumpV2/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDumpV3/BaseOTA.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDumpV3/IRrecvDumpV3.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRrecvDumpV3/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRsendDemo/IRsendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRsendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRsendProntoDemo/IRsendProntoDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/IRsendProntoDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/JVCPanasonicSendDemo/JVCPanasonicSendDemo.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/JVCPanasonicSendDemo/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/LGACSend/LGACSend.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/LGACSend/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/SmartIRRepeater/SmartIRRepeater.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/SmartIRRepeater/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnArgoAC/TurnOnArgoAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnArgoAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnDaikinAC/TurnOnDaikinAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnDaikinAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnFujitsuAC/TurnOnFujitsuAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnFujitsuAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnGreeAC/TurnOnGreeAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnGreeAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnKelvinatorAC/TurnOnKelvinatorAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnKelvinatorAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnMitsubishiAC/TurnOnMitsubishiAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnMitsubishiAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnMitsubishiHeavyAc/TurnOnMitsubishiHeavyAc.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnMitsubishiHeavyAc/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnPanasonicAC/TurnOnPanasonicAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnPanasonicAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnToshibaAC/TurnOnToshibaAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnToshibaAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnTrotecAC/TurnOnTrotecAC.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/TurnOnTrotecAC/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/Web-AC-control.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/Web-AC-control.ino (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/favicon.ico (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_1_off.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_1_on.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_2_off.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_2_on.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_3_off.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_3_on.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_4_off.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/level_4_on.svg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/ui.html (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/data/ui.js (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/examples/Web-AC-control/printscreen.png (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/keywords.txt (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/library.json (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/library.properties (96%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/platformio.ini (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/pylintrc (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/CPPLINT.cfg (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRac.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRac.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRrecv.cpp (92%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRrecv.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRremoteESP8266.h (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRsend.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRsend.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRtext.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRtext.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRtimer.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRtimer.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRutils.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/IRutils.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/i18n.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Airwell.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Airwell.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Aiwa.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Amcor.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Amcor.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Argo.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Argo.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Carrier.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Carrier.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Coolix.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Coolix.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Corona.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Corona.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Daikin.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Daikin.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Delonghi.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Delonghi.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Denon.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Dish.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Doshisha.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Electra.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Electra.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_EliteScreens.cpp (94%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Epson.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Fujitsu.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Fujitsu.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_GICable.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_GlobalCache.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Goodweather.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Goodweather.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Gree.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Gree.h (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Haier.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Haier.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Hitachi.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Hitachi.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Inax.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_JVC.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Kelvinator.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Kelvinator.h (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_LG.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_LG.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Lasertag.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Lego.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Lutron.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_MWM.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Magiquest.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Magiquest.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Metz.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Midea.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Midea.h (87%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Mirage.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Mitsubishi.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Mitsubishi.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_MitsubishiHeavy.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_MitsubishiHeavy.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Multibrackets.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_NEC.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_NEC.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Neoclima.cpp (77%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Neoclima.h (69%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Nikai.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Panasonic.cpp (78%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Panasonic.h (70%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Pioneer.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Pronto.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_RC5_RC6.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_RCMM.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Samsung.cpp (83%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Samsung.h (71%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sanyo.cpp (86%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sanyo.h (65%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sharp.cpp (84%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sharp.h (74%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sherwood.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Sony.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Symphony.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Tcl.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Tcl.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Technibel.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Technibel.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Teco.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Teco.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Toshiba.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Toshiba.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Transcold.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Transcold.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Trotec.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Trotec.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Vestel.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Vestel.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Voltas.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Voltas.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Whirlpool.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Whirlpool.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Whynter.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/ir_Zepeal.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/README.md (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/de-CH.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/de-DE.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/defaults.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/en-AU.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/en-IE.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/en-UK.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/en-US.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/es-ES.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/fr-FR.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/it-IT.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/pt-BR.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/src/locale/zh-CN.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRac_test.cpp (98%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRrecv_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRrecv_test.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRsend_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRsend_test.h (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/IRutils_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/Makefile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Airwell_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Aiwa_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Amcor_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Argo_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Carrier_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Coolix_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Corona_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Daikin_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Delonghi_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Denon_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Dish_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Doshisha_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Electra_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_EliteScreens_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Epson_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Fujitsu_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_GICable_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_GlobalCache_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Goodweather_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Gree_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Haier_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Hitachi_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Inax_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_JVC_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Kelvinator_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_LG_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Lasertag_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Lego_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Lutron_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_MWM_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Magiquest_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Metz_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Midea_test.cpp (97%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Mirage_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_MitsubishiHeavy_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Mitsubishi_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Multibrackets_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_NEC_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Neoclima_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Nikai_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Panasonic_test.cpp (80%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Pioneer_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Pronto_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_RC5_RC6_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_RCMM_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Samsung_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Sanyo_test.cpp (99%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Sharp_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Sherwood_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Sony_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Symphony_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Tcl_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Technibel_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Teco_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Toshiba_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Transcold_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Trotec_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Vestel_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Voltas_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Whirlpool_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Whynter_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/test/ir_Zepeal_test.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/Makefile (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/RawToGlobalCache.sh (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/auto_analyse_raw_data.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/auto_analyse_raw_data_test.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/gc_decode.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/generate_irtext_h.sh (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/mkkeywords (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/mode2_decode.cpp (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/raw_to_pronto_code.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/raw_to_pronto_code_test.py (100%) rename lib/lib_basic/{IRremoteESP8266-2.7.13 => IRremoteESP8266-2.7.14}/tools/scrape_supported_devices.py (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1836bee70..b5176046c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. - Command ``SetOption119 1`` to remove the device addr from json payload, can be used with zb_topic_fname where the addr is already known from the topic (#10355) - Command ``RuleTimer0`` to access all RuleTimers at once (#10352) - SPI display driver SSD1331 Color oled by Jeroen Vermeulen (#10376) +- IRremoteESP8266 library from v2.7.13 to v2.7.14 ### Breaking Changed - Replaced MFRC522 13.56MHz rfid card reader GPIO selection from ``SPI CS`` by ``RC522 CS`` diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map deleted file mode 100644 index 57358d833..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 deleted file mode 100644 index fe697a810..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -1e6ee18f808b645d10f6652b3a78aca2 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png deleted file mode 100644 index 9515ee73a64712d49d10e556d7f305e6ba48bf2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3405 zcmZu!cQhRB8Xt9cwUA)-nh2sLL|r7TPLzmlk*HsY5~BA`5G{xvEkunF5}j3}C3@M7 zs2{t!AXs;DzjNOD}SreL7}0DxLU9ccir0pJ-7B?o8W zxKdhhA%Co;h6FDE90jdqsbD0r2J*h4PYyoUUz>iKqp!XDA&RwSg{W_4g{zHD5=JfwCyp-Y$g$`U!y&R}elGHa2B$PM znVq}4%^um8>RSJ8PKz?jPRQU$Q_g{gq|Mq_+-dFwE+x_&<+j!f&z&I>i-?4k zQSs&6$#ffZqy5~Ke#@A`a+Oy{MJ2M}$X&^*fgiiVXHr*vX>M@Ps^;Q}1IhuH73 zyTk0^;UV-|CXuAi-ObAj9Y#jEdvT17XDW2r>!-|*!Qq@~mBhrvLOyHak1Ja|Hnb0X@NV>3|b4 z5sRjf=I84?+}uR=^;y`pdDnIo4Gq}u-@jj_q=ZRf15!EZv>rU@eaS37HaiBKkIBwvJ;i^*_O=@9>Rutb z=jZQ#>cy8DtA71z(Ale3wEJkd)$VF|csMDb|9-N#zCIP;$`G;qIkdI82?f4kvB6ju zo`{5xI&tRfZdFE<%@&DXTT`93cZdLD5)yqQqo|e^L_~D-a@8kHSNX#-0I;;Q1OO{5 zD?-;O2E#F3ZK>?-Epw1d27~bEPcw9_m|Yv z(sJKkkipH=gdF=6_mlfuhJxvj=In)?&7=VzKR+HRDL5L9Zt^|g3%WQm4%qF4Y~XM`{rymFzH3zE zBwy{t&o3_O0!}@OOH1Dt6_NP0a`Yu}swpWEzf@h8-=d(P=t{Yv^(s9*l0XQ0XDCQd zPY)d%Ebm^6B>Y(!#dAy$$q=^skNN z#%E?S`S|+U9Bodj>*z$**B=BRcyC($2{E;SFl>U&wr7?t7YnP&SJV+4tj92@av2xV>3 zvE0e!%}9U69%=RhB_9Vo7Y?_BD1N%rv9!P~o9H1MF-?Uz+Rk)JyVsl#%V*peVR36% z$1EN-pm;qUsELu+McyuOFr;j?sv=HDvlzETycYrBD^au>UAfT4%(+<;ajA#EN5Mwf4pBd_R*qM(PRV*qda4GS!r@ zU!W0~wR>he{#J!wSeQZXWwiYq7Lg?gDjb@|M$=mDkCGh^;4Oc5MN-ziz?%t~H&StM zaLjyi&3Cze#DH*};JtVDE511J46T8`#>}kI=!zW?jgE+*<>ch_INZ>`BP**pk|(dl z#?C&F%&QjDY0U+K;JTDl23CQaJG7^#hc;bPr5e?$i3z?8yvo9&3Bvp`h(I8$%+x)x z_3_E1XJDWc6%~CfnGNHP5VHK7cKybUWUUO52@Tr(<9sOHl2;c{KS~ zL+0J5Q^i}SPYtl<-#8`8MdiB6pynEzLlL@kjVTiugV{H6+^Xbv^#l+S!;nHJg>w&3 z9)gbo&Tiek`>5q!6_9QzJFMp$@tx{_%1@!FU(p$BkT7EtL!9nCBy!6&hCR&j|HooD z><+q_CptcR4*nl5;et-A^xjW8K6}Q<%h)+Kous3*ktPw#7VG8vYt~_DechpX{}*hT zA~FofoDz*)euDgYlDXk-at1QD_XcUx@-<>7er_ z^zXw%Pk#Eia_G}<&WoQJ+}+*7CK?<@Il%CE=XfRS23~}K01SNW$?1AN9ULC5t8f}I zYW#vS78zF4PGGUGpEa{Vq|hq4{pcX->Fs@dNw^4`ayiPnIWjV$uCCqz+EIZ)IW5zP z0}p$ac2sY#>crF(X0QJa6BUSAGzcm&1mflC!8-5Fn-B~J1BBc%uC@kU&C%5r0w9q{ zu3NV#LCgX`D=LXy?nOa!GqbX?vPq*e^Br;V+fRC5x_jB#+H#4ABqptbmZNH7!Zea2 zLsDV@b9HsCG_5BG{Z>^)h3wEz9@N`CjQ`G_%seQwV{>y9iOWCm_=K4mla{?+Rz{h{ zxw*L?OG}}kVZv+LehYs7{8>mLW1t6NS{Xzm#gcHc*T>oE&IX#W@F3`RuU@~7%9Zo( zvd%o=Yz_MTci9FWkM2!i)kmRdf`fzU85w_0rJ8aE9@0fcMd_KD#ktHk7Phx@g8pz$ z04LCd`2_^-o0>BJvGx6xfwRQ+@^YA|sp-j5G^dy=2C=fX_O`4HBImu`)95lkwy^LL ztY5qjD+`OBv2k>gB7q5Vg##HF*oyWydi2OS=)1W@-L}gV~ z^8NjNu8bk!L5VkYa%Q6K=le~^J6l`fVDo{)ES^*US1wQFRAMi;Ty zL-MKn`}fq#`GEl#2vJ7M_o=C=Dw62#=qpclFs&PZ|J|9u`XrSx-*=60bldvS@}|7_VvtgQPfI1bZTXPb;zVWNPeoy zJi4}4tf{G~;KPTMoo_Jicje`s+lyc5XlXlkrZJdA%P%kP^QCt7_4QTUrreiXSX^Wu z7#NtTcetXergn3IPhOt==;-KNpZcX89QDB#rm3k}VD#Qbg2jF9D>I16$F{bl&)2?o zg1u|4`?6{q<>mg6C>=BNfcIWJT(s9AKQIbR;)#zB)8yo&qmxserd)z5FO(Z>Rl|#l zcnK%VR}2jecUN6pTmWlsRzOKf2_!f;Dmm({Nkn5~W5rk!-c?oQ)-Fs>!$n&UuU1>N zKdWmiC;&iP=pP;J1Mykw^qmisBWYP#VnE@1R~gLLda~k?x~^{Da+2b+WS*?vqB_S~(=yJHXci+!XcB;lI38d{G$%=UoPjBT;DSIP5m8ZZ zD=G#zZzpBP=%G-FD=W4y{3m)r#na=b_gPIh7MiLreDuEp{g0AvOTP{(TYtmcINX#h z$x_NP-i3UaV3G(Qv|e}n&mIWCaJ&$A+vS9FN+~w=P2#nW;QtYzq4EG(tz;ecFPxZV A2><{9 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.map deleted file mode 100644 index 7b65cd5e6..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 deleted file mode 100644 index c11ced0ba..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -383f10b4ef1888fea2358fde261598f6 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc__coll__graph.png deleted file mode 100644 index 9ce17f8b0db4b36a22dca1acb89858aca964d6ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3730 zcmZ9Pc{o(>`^QHM5-k)VCXqdR$(G6>WH%W5mVF3e?4+_ZgBXJhLqea7CHodpWMm6t zU$XD}zJH&tPrvK?y?)oZ&bhDi$2re^?)%*D*ZYak(om+OVWELQAap8^VLBlCfHR1i z5?p^~AoW0?v{F-sK~DZ0XR~D=9Wc|I{=q8-qVqorLNNRi?WH zOFc*Runn?d!B}7cYh&&>QkPY$Mzz^-NWN) zj%F!mMa1Uj^NO5BcbK9g$%x>qp%3|Fb2d#Cgh?+g9i10S8R)3L5@Z#Vw>^)@Z-hLBk`?-aSa`w|oyoshs} zl#7drx#TiZ%{O&$a8P9b>*kBlP&Y5Hte}(Q>r(EpW?>;AZZ57fc6N6D0RjDGt^`>O zk|#RXCbaHrBZl>ty~G(x%2Us_=Hc}8^tVy(SX8y87%1cU*BRlevH0JUNGtkB@_!`*qof@0%=+o!MFY#l^*@_I4gl&QLZP zucm?NAaqQ`7r&jzQhiC^P5aAG=%_PW3?nNm>)WIxzNv*R-?7@%m(iNrQ&1VNCy?>B6d9zW zfsM_Fa5UOkH)(sdkBy{0Guhdx^GHDfQR>XBlyMp2>guYatD7X_Eff+GQhl^NcnCfd zVp1E(7JNTo|1py*4u?Bj`vDy)cT*UsO-@eU>>n9n53a0~ra6D!?fG+O+{(m6SAXl$ zr9ZtXudFQeT+q)mt!gYq4u06|=+L^rCjEVHW9Hn23%0wfW7lXYtE;OE3JTJQL|P75 z(Jcvy&GaoF6iUn3Sk1xVA8c0df=niot<_q9`9TgjHYVnQySo@29o=;~U+mfQj4=d4 z`_aLUC<~^WOtutDTHV~_5)?%Lqnqsxx zy_bg`=J&>7v0MrQgYDM0nJs#V2$0PElS28kE;D;G9@)4nADfft_A`fq4ZaUn{|`DeJiUW}g1%FHC0 zJ{6yjswG<1l~aj(I78d6eYwxwPQ&$%MD+uH0H=zx7*>E2^cg z)s?4uqYd1gQ&a8C7D%-Qe#tV|`?b2Iq)xQXrj1Si!@tam^>EQgPrf$dJe!?E5%O94 z*@j+xg+eS{!{Zva_cR%6bxA6ruMded;>ujm$hUX`Jmf43R4#!6HDv$cv;>@ z>tC9cT#ocYNt-9Vi7aP&qXja4>c5hnH?G zhzW??Ic`nxJ;k3#*8ZoK$5l(LEBBUxX{|CDb0XMLZxniLzq4FeRWf}2oU;%VuGDoXItr#4D2Hg$lg0j`u(5Apx+W%q z>O)3GM$NjKa^z{>V_7$+xYDZBHwHh$8Lu${SM z!Q*fQ1hx~tVx9nI_nmOZ1(@4#3BC5vTO#Z)i2f(I#a=uviy9|5wy?b>@@lyMs;KIQ z4@r7oD|~;Cqzd~ly#79OMY8*24S@*Ot8)4mM1OhoZ-|T|eqWnpbiKpK$QTLT-8Sy4@)p+C)&~8_E~=lSr{=haTD>vRh?)2r za=MT_IJbf79~hu#XK(vMw}mZ~pPw!QLCQ5QGXyxu%gciR-qByX#v8AusyYtdVlTns zyEWfX?lytiXqC*|E6P$&ZcKX^y1P_1+A;ThbDsR>`*)a-X(i0pSDG?36RqU z`2N};`MJ3{J$?Pod~v5d7=QMgxB`Xv$K21yq>> zQ?>GChuyV$jj}i2{Kw#+v13u4g~ebga&mG~OIP-YT=LDP$ZP6Cyp+0_Bh)HOA48<)~5D=T}gjI@4&=iCGQf3wca%nU4)<%_wQf~hOVZjrUfrmq>hY4qiwzhQ}hiC ztOGNs3x_NE_(&-#Do##KiTZ6j1CjzyW4pgO*V>FrNXY1#yC&t%1+lcW#7ldszAMNr zF2>^V*XbD;*4EeSNu-FFm>Ars!pUjr+^VSX@EbxxQJ+5X_vD+m1OMW)*1+_+0JR!4 zH9r0bc*51RWNG(FYBijo<#46v?!ke_`lQPCV!y(}hZH-@a=UbsOlGKb1e;N={=T!d zb!cubvM8^$u~BKCb9;F>S@8|yXP*t*PdPbjfZR84zE|JSJFck7is+eNSl|;7_%D#gu(Yh}(v&}HT9f5Z88LM#F`8~mQPbAG zOm&gn*^`xuii-P5VsKTJjE|2G`1cF__uQ?ltoq7ap*$M+8+Y$AX8h{QGX##c@!cJ# zzG@$F3JQvrR5{~)o`RARdNY{Cs8Vkc57gSQ*w#8y^eG1Jg83hWD1>;zj69}*h{Mq9t zPq-u`uwe6n6GYrpmyxw@qygr8<5xvty|ug+S=L#&8qu`EQ=$hX)^zB|MeGP$J_Ij4#lvkwVPsM zg^EURfYUp05*tqGF^kilq1A@WOCcye#$FBPM^G42EU{t?=GG6PoF~6IbJ6LGV3P?^ MQPhCtJ+gT5ACE<600000 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.map deleted file mode 100644 index c97e33523..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 deleted file mode 100644 index e2e3cbfec..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -f6001a30fa104f98434d740081ebee62 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc__coll__graph.png deleted file mode 100644 index 8e567d014b79f7a0f85ce7b815d63bd3060996a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3485 zcmZvf2Q*x3zs3th?@Avu5_JckTU_e|dh-j@H#yyH3SMMMOk&9j>md53a7@8%jwI zeyQ&8{{|OwyT@wEM3;X)d02E3xKkgltY{dJwVjR9W%9l3wf;_Yo8^3|lb0&&c4+(> z6v3H3bXQ!MiHw@m0iyP@X8icP3#TdK%O<3luCd);+9Nt42p_tSpdM02GvaD%`W#7Q zoo|xTn5^)1NG*J)eHp9-m1|$hlG}1YIu7srI+_a3{o&YlIyX1+A%c#CY${Kpftac% zpOR0E5$EudJ8h_%!4@hYu{|f7;RuN9mr}U$6c5%@wHH1Q;X*2JL z|BPcOnK?O!H}GYr6=jA3h5}6S@$sajq`T|r+>B1>>t4GcQ)g!ZB}z6nwt%Hb7Ih7c zg7WgAS)|!bW*$>6aC14Li9T7QyQ=L%z%BH2yJ7F=&(8k-XjU<#$5IE`-HM8exX+&r zp9cqfdV1a#6-{*cQVCyIR8(x;AGjA087cB?R+3LEqib)ax9A`vgN>VqhZXkhra`gh z(%RU29t}q5!VqfxoHq&=X+uMr;OuY>4ZHR6qJudqO?7pfp)?UgW8=ik z%)yKEQ#GI5I3?MpDL6k}CI(LOTr2ApNG!a_}5opLZmXl1$k zH4&o8i;U>Og9lF+?d_g>YMmX_WUax;vFr>E`3*>NnFLXKsNUqW_v90nscDwDVS z>z5-K4+sdTcE$@NCMDH0G_+OK({RaaT3E0%@M+!x1y)#i$6#mrt?pHkI&^U@1_K9~ zeuXzB3vMvc3@q!nL#1_O>yak0#@L8Hy78apuoVwG^kLn}?x%v(_s)XHqRKufjvZ&S z+atvbYQ+~0^Nh>7XJ%&V;;4O(8r|#XvtDPP5bssBPjK&sBGc!X4Mrwu1B*N98}}`* z@sC4gr5$B4V&_9{@$i}$Z__7=40+4b>&(qE<);Wf6z`?7C@Zs{i8R3Z zRF1+d<)*@{7B=xlB_%`dq8OE8FlMw0%U30PAxv3UR59ziE`l*Cel!_2=eo0WqT>dk zzT|+F(jktAgXRj#$yyKuS({8c-Gl`vau-!{vunl)3xu*!YdZ3h)1vJ93=3rKKwY14 zHTd`WvSq~&OQbtfGMWV;oR$+$Q5lv_Cmw0bQ4^%->ZP3gf9{K-|r_uNiy#H zkC!(|)vCr3)iRcU8_+VZyud=7WtcMDD@KF{^s5KlceZz^=fYxSH`#?~X10?Plox~o z4$}9|>+uLD`_=_WPwbDj#~jz^B%7z=3IqAN1(2J>@@YZ;no17=!8*f=4MNPCyT)RH z?CJjR^pvqqnxxk4zlpZ@_#JhK@SeL`cEhzUuTdFD8d7mqN4Hi_h`^vDi<`%y{&st* z*XOnG-ze$7lhvdpoS`?@`L(ZvdCM;q!pPWFtd$vXvW{kz@e|AqK1%;a#w)g7#>}IB zahd#jQ=y*C2svH%bUB<>{_W(ID_0`XXtbpFYV6wj`i-{Bi>P5NPMtd z&feYIO9-*B11FW!Xk`#Ex>WmKP*CtHCZ@wi*kf(n_zvjF5|AYynb7MR zll;@?q`U?}gaw;u#ePQI1v!`wDW23e@JN!1IT}w{zc?2y3&oq6w*?)3fCjY$!?m>~ za`PW`IU|;xaLz#lC&hm{yt4-vPBGQs&c!a_YO^!jv?|f-BPS>!ky22={psSwg`1n3Q16z>I74D{ zesU-&DY<)b`osJ8uI=*5ij>dV+tMLcMkUI44w;@XvTJ?){UQxg?UaqmC=?1%O1IQd z|7OhUDzehLZ5SxNr@w#i*jU2bw{)UnVntqH$y-q9yXtCTuu-Xi-CLnpsf)9pBN+Du z`N?v#N6N~ik5lh|>*We1y~WQT^<*&R5c8-EFN!*H-PqV5a(epowwzoxs8g^M;Zv{- zVDkCEyOb1Bzb#X%=X)vujHl;IL;wc_ED9DK9j&aQQe)ps^K2fv&62En-_*o}#X97e zS0FhCp2SDIxV#+J&;X;Lxw$xA^mw*eeAgvtrokOuQu2y{Uwe1jrAp7#w68yj|Mc5k zK|zP({cq3rx><%YVQ*q%sUzry(#4`c;SUT96t*@sHAO^3>@J4Wl3-aX+}zx@=2}w! zWWd^5M^#m|?Zn&L8~B*s$;p(pH77vflOjh42VFfqMI@5X%*;$P0~!r@7-$+lGbfyG zqxOcA7X)f|*JB>_Lk=|1-q8_x(EGo)raxYT!C>`nGpZm~ckkYPetG`u%5}rCbV*O{ z*UUo8U{B}c0L=g}z4P-qj=8}pDJjfs?ChQ%9)Gf($iBI=Q=FIgqOVUq4;C}s{hGxL z8zf#?S*afzmzYS;#*S)x^_f6WS5YC$&(A0NL%|8O&SOObA88K9k(?)>CVrosEN^XT zIye-1{tOFmcgTMYXby+N^NWfi0p&aw+le_t&pbbG%wN9B%w#VuEqz$!A{BBbnF(`8 zejm;zB_s3P_iiM-_4TB%2h&*z5me4+M2qL4>Tty=UsC0*zD{Ouqc4!%fO>$$p$7S-!m!r zviYOM(%RaZPbWtc*bFHtsfeg3dzYEh%Y)tBhgDzRPplW7;qiE)#+DYIh+7H@x#y?9 z3=9qL2)TbcF8<0aCnqNYp+>ZY1Xo8Pbz}Q{(*X3ZUcGu#HsEbe4ks|6gho#umivgj zj~|ndj{Lm5y-O=9p6q|^_wn_;9ns$3e^o|C=DuZfR|1b(>@%3ObOx|eA*b6g(3^$Z zv~mY@#Kgp{hm#gi35kM<^*^;fQLNR8$0v`E>*tvqw9!K#uTCe_+54Xoa9vYg%io ztX0VIlVa`c7&Myyo^iR&=46GSY4r>Lh2Ye5F-Nw!RRbNlNb?H5zy4D93Ji9gZ)K&R zpvXb(NEw%#{wp&xlQHWaXyd07#n($lK;+3P)mvBWwoQQ0`FTy Na20LkN+p}H{{l6C&FcUF diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.map deleted file mode 100644 index bd52394a1..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.map +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.md5 deleted file mode 100644 index 4e92a3fe3..000000000 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.md5 +++ /dev/null @@ -1 +0,0 @@ -a87b7a535dbb4358d51525a2278a117d \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc__coll__graph.png deleted file mode 100644 index 397be3abbff42fdcb1c2c648081cee364eaea847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3360 zcmZWs2{cr1{~xjosW61Hq-2mivXpiF$R37lld)tg%h*X{2~i9o`;sMO8B4}i)*8#0 z$}%y=F5B3*i2wEe-*evgocG@I+~=I<-1FS;^ZkC7?~OGw&|zWXVFH0bEV@ul6JT}& zMmPf<@cezC905#pa6KJO(COKo*II%GfzA)>YTh>s$Xd$|HR6~*`K(4ScliyuEb=z^ z9rQ}QDXe!R&ukW~8ds!_B?mRaeI+-AYy)+MZH z-lV&%_s14qvwKPVG^~PI+Y@S^+_?y1UNJuWM122XwR5iXe)CZVDKsF5wEiUW0yPKs z*IEpc=GHl#)a&dYAhAXW-L8Xavq`L6d=(Awy{>K;)GdDCeT5r#G*(iqbBe-Y17!gq_Zz4LA1odI*H1CZ9#` z<)5Mmn6>ql&CSh#z`*?BCydO@vmH^)IPdWA@X6498+CQ{r%0sJuR2#=ZAPx~42SYxhJztCSTkVw8u=~Yb0vX;AN8NZ`HtH7$4*QUVdV1YbybIHjm># z98Pz}&|X_!S)s4Ddp@+Xi~1k~mG+qFUv70C9v;sBu>>_R=y8;$np#_Xpsh{kHu~}U zwQJAk`_g>=?6`t%iHT7?_4l{n5uNQxm|Y$&&r%Dwg|(NLmv8MC>7qfufB(+IVtI6Q zdR6;ELqZ^}%^E!-j=M86GwN1WJRBSxs}oJ8hc+cYHh&nZJ)7xb1QO4{#MI#;J2O8Y zm7UGU!otEJ@JC-Mo6<18y|Izk+M12UD$OgPzSt*)USV|qhx564`E>z-h@U^rKH9Yp z=4-@QwuhQ&Uru^7buUmPavgOPHOV9Vp@?(pptj zRrzoZ-PPS~Y-jiSi~TiGQP<0R-Y#QVkmtkY7LR3l4!8Ow1OF_Q5T4XWMn`+^ll(Cr zg%UxXEiJ>!BSFEZzt*< z@(=e1oWY~C7bAq#0k-)^R!|JK*O*CE=Z}o* zfVu(S)De7}@9_QU+G2197#`fYAv92p;NarA#K)&{vF1Eu`)T02dA1hAjzo*!(sqqj zyoFz?gKoP=bjGHd@p~>1*-q2w)$2xBdy~JCPy~dm&*r-L^XS^Y3Bb|}RD4DKKJ&uI zoM(OU;qACxd33!-?M;)uTYYZS%{k8fQLv|NdEGd67^f@3&vvbN!BMPZXH>iqQuQs4 z9mem9;AU;uQLf+gisY6!Elfx(mRO-hI25HmY^Y+tPmZq8J{PUwPkC?j4{Xiiqp5!} z-!qNgC?e!$U$c*OlnL&`ouOAwygR|65AOYi302DZFR1mJ;BF0gbcDp4V@Y>dIASRM z(b2xOR)cnhO$FyX3F~kQXUcqOt^13(+;=rsPRV5Q!^lYo=#6rBJD~;2xWBVGuM2;a zi*}mBKK8XpPqf6N;=41_B;&(1D<6e{)Y0@mrKY*H#S&#lC0=nmt(0huf#cJ=sTIe& z#%?ii*Ex#cRkzaGe--2Zr7sfDrXnw_zpNj@49T)jL|5{~z5kYMI|5e!tELB(Q2z5h zbZ~+$EFvPJ=>2=x-BToXc`W{sJ#=|J*n9;oi8H zhfGu2bu>!?UD^rZ*49ZCz;q{kjyQ64EWiKg@Q_hKLE+izm=u9T5+BUIdqYG&{aPZw z$}J@&B~4@FBq$VWgwxT~d^t2^}p#0a%c-8yFN6H{1I)yT3_qMbU|45e4*rN}Q33l`k7oBQN zOiWS&uRNe2uEaLDQyCf>&U;xupvZ|>qZDR)g#RdIvt}E_5Zy&oRI>B(u1VOnRS55Y zC@-I#3|{BkL7vDoSyWX=i0qr-D>CiNzqOjd6uy|FgLTPC<*K&};b^F&+wx-r$niJ| zcYL_Lm}>qj!PMQoVwakas;K>ZqQK9-JpKPILYm*!njn>aiNCx0xXNCL^;eZez3C_F0@kLndyN(WZw=QX6?8#E( z=BG@*_Gvkq=pB{WE95bN(<*lGB*)suOyNhXq)Pr?`x1dSfqna!t?g~EdME;X`SRsA zSy{?O*zaUa&&7XZW&meZ1E-B)<*P-4<)a30CQJC2EtTz_Bqe1PmDu=r(*?sEWya^N zttu1>1!CRs$~h-cyUf(aX23Z&R9jbzflkc-UQD+W2f(Qc}{~;^Ow~YqeSzf}p&|ucEm(AgI2+8$m@yZZ0k^ z5H&S50|Ucv)5Z@U;^f>$o>C?hDNT#~fFGqw>+0%W=HesrczAal z2Mrw^03mf(S5Zbr#-fsvOJML<;2fo;rJqTpY=y}Hln#HOCUF69zI5e4X|L8@PRX_d z!PL~$fZ$-Uz65QdyZ)4->gqQQ4e~EgC|Layj!QQT>UQ$$j#bJr81&V!1F8h=&N|m0 zprI%A0RaKk!TX+rIVyd-D+;G~h!N-L19pck4o{BOGt|OW%gV}jRHLc`x1E5ZDTW-} zUT;5DrDx@x`kEvZy1Y(q&rKDxNY2dEgF+cVKx!a%ZCMo+kcELv9XMQ2Ts%B9==O~p zF{Pz9dtP6~&veIs8yHx_3<3^>!{Nqi5zO4&-1?dF31onPU5TUNo$%T{3aPIpaNDxl zo+>x&k0@{fL4s6>j~YD2ds0MA$Ld@!#dC@aN=PKyg&n@fE4`JliL0uT+}qnzK0V&9 ztE(Ft8{3zOKq8UK2U92rtTys-Z{jYDlb!ubC!5-@nDvsQ1FIlM7IPA zfDmAXgzw)wfY`=bgB4z@oqY11D%Q_X4+&8o@^MuR*toXdy3cRj=-EvsU;V9kE_mqy z!}s7RCMG5TStS58fG&Y*rzz_``B=AAKU=Au91iK26J@j!o9 zT3OjWIGA{}-X88kk4U#XmM$HB0&7N!%gM>DjyJ9sBY1gvEn5PlJUu;AQc@<6*#iRu z?h~Jq($m3bIZYDMu>`;%VoLU6o=ktu807tzbZ32L=Ea2c_AD;vDGn%~@<868bGQe}rPGc9rP@OTe28d+Jq zKyQ|z8v4g$bd*Spy+Ey_qXP)~T>OD6i|1quccr-=5-E>y##1c9jt@5b-^s-TX8}k`tadne7rAOr z!ut98`kuMZN>#gR(PL@LKPqz>85z31zB_!1nzit5rh>x4BNAF0Jt>eZpln^PIwyJw z5Hql8hB89G + Last generated: Sun 03 Jan 2021 09:04:41 +0000 ---> # IR Protocols supported by this library | Protocol | Brand | Model | A/C Model | Detailed A/C Support | @@ -25,12 +25,14 @@ | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[AUX](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | KFR-35GW/BpNFW=3 A/C
YKR-T/011 remote | | Yes | | [Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.cpp) | **[Electra](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Electra.h)** | Classic INV 17 / AXW12DCS A/C
YKR-M/003E remote | | Yes | | [EliteScreens](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EliteScreens.cpp) | **Elite Screens** | CineTension2 / CineTension3 series
Home2 / Home3 series
Spectrum series
VMAX Plus4 series
VMAX2 / VMAX2 Plus series
ZSP-IR-B / ZSP-IR-W remote | | - | +| [EliteScreens](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_EliteScreens.cpp) | **Lumene Screens** | Embassy | | - | | [Epson](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Epson.cpp) | **Epson** | EN-TW9100W Projector | | - | | [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AGTV14LAC A/C (ARRAH2E)
AR-DB1 remote (ARDB1)
AR-DL10 remote (ARDB1)
AR-RAC1E remote (ARRAH2E)
AR-RAE1E remote (ARRAH2E)
AR-RAH2E remote (ARRAH2E)
AR-REB1E remote (ARREB1E)
AR-RY4 remote (ARRY4)
AST9RSGCW A/C (ARDB1)
ASTB09LBC A/C (ARRY4)
ASU30C1 A/C (ARDB1)
ASYG30LFCA A/C (ARRAH2E)
ASYG7LMCA A/C (ARREB1E) | ARDB1
ARJW2
ARRAH2E
ARREB1E
ARRY4 | Yes | | [Fujitsu](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.cpp) | **[Fujitsu General](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Fujitsu.h)** | AOHG09LLC A/C (ARRAH2E)
AR-JW2 remote (ARJW2)
AR-RCE1E remote (ARRAH2E)
ASHG09LLCA A/C (ARRAH2E) | ARDB1
ARJW2
ARRAH2E
ARREB1E
ARRY4 | Yes | | [GICable](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GICable.cpp) | **G.I. Cable** | XRC-200 remote | | - | | [GlobalCache](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_GlobalCache.cpp) | **Global Cache** | Control Tower IR DB | | - | | [Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.cpp) | **[Goodweather](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Goodweather.h)** | ZH/JT-03 remote | | Yes | +| [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Amana](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | PBC093G00CC A/C
YX1FF remote | YAW1F
YBOFB | Yes | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[EKOKAI](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | A/C | YAW1F
YBOFB | Yes | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | YAA1FBF remote
YB1F2F remote | YAW1F
YBOFB | Yes | | [Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Gree.h)** | YBOFB remote
YBOFB2 remote | YAW1F
YBOFB | Yes | @@ -42,7 +44,7 @@ | [JVC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_JVC.cpp) | **JVC** | PTU94023B remote | | - | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAPOF3 remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | KSV26CRC A/C
KSV26HRC A/C
KSV35CRC A/C
KSV35HRC A/C
KSV53HRC A/C
KSV62HRC A/C
KSV70CRC A/C
KSV70HRC A/C
KSV80HRC A/C
YALIF Remote | | Yes | -| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YB1FA remote | | Yes | +| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | A5VEY A/C
YB1FA remote | | Yes | | [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[General Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711AR2853M A/C Remote
AG1BH09AW101 Split A/C | | Yes | | [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711A20083V remote (LG)
AKB74395308 remote (LG2)
AKB75215403 remote (LG2)
S4-W12JA3AA A/C (LG2) | | Yes | | [Lasertag](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Lasertag.cpp) | **Lasertag** | Phaser emitters | | - | @@ -57,7 +59,7 @@ | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Keystone](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG57H4(B)BGEF remote (MIDEA) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | FS40-7AR Stand Fan (MIDEA24) | | Yes | | [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[MrCool](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG57A6/BGEFU1 remote (MIDEA) | | Yes | -| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Pioneer System](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
RYBO12GMFILCAD A/C (12K BTU) (MIDEA) | | Yes | +| [Midea](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.cpp) | **[Pioneer System](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Midea.h)** | RG66B6(B)/BGEFU1 remote (MIDEA)
RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
UB018GMFILCFHD A/C (12K BTU) (MIDEA)
WS012GMFI22HLD A/C (12K BTU) (MIDEA)
WS018GMFI22HLD A/C (12K BTU) (MIDEA) | | Yes | | [Mirage](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mirage.cpp) | **Mirage** | VLU series A/C | | - | | [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | HC3000 Projector (MITSUBISHI2)
KM14A 0179213 remote
MS-GK24VA A/C
TV (MITSUBISHI) | | Yes | | [Mitsubishi](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.cpp) | **[Mitsubishi Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Mitsubishi.h)** | 001CP T7WE10714 remote (MITSUBISHI136)
KPOA remote (MITSUBISHI112)
MSH-A24WV A/C (MITSUBISHI112)
MUH-A24WV A/C (MITSUBISHI112)
PEAD-RP71JAA Ducted A/C (MITSUBISHI136) | | Yes | diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/README.md b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/README.md rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/README.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/README_de.md b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_de.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/README_de.md rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_de.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/README_fr.md b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_fr.md similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/README_fr.md rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/README_fr.md diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/_config.yml b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/_config.yml similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/_config.yml rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/_config.yml diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html similarity index 94% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html index bb7c6a469..051b58a17 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/IRac_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/IRac_8h_source.html @@ -424,215 +424,221 @@ $(function() {
354  const bool quiet, const bool turbo, const bool filter,
355  const int16_t clock = -1);
356 #endif // SEND_PANASONIC_AC
-
357 #if SEND_SAMSUNG_AC
-
358  void samsung(IRSamsungAc *ac,
-
359  const bool on, const stdAc::opmode_t mode, const float degrees,
-
360  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
361  const bool quiet, const bool turbo, const bool light,
-
362  const bool filter, const bool clean,
-
363  const bool beep, const bool prevpower = true,
-
364  const bool forcepower = true);
-
365 #endif // SEND_SAMSUNG_AC
-
366 #if SEND_SANYO_AC
-
367  void sanyo(IRSanyoAc *ac,
-
368  const bool on, const stdAc::opmode_t mode, const float degrees,
-
369  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
370  const bool beep, const int16_t sleep = -1);
-
371 #endif // SEND_SANYO_AC
-
372 #if SEND_SHARP_AC
-
373  void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model,
-
374  const bool on, const bool prev_power, const stdAc::opmode_t mode,
-
375  const float degrees, const stdAc::fanspeed_t fan,
-
376  const stdAc::swingv_t swingv, const bool turbo, const bool light,
-
377  const bool filter, const bool clean);
-
378 #endif // SEND_SHARP_AC
-
379 #if SEND_TCL112AC
-
380  void tcl112(IRTcl112Ac *ac,
-
381  const bool on, const stdAc::opmode_t mode, const float degrees,
-
382  const stdAc::fanspeed_t fan,
-
383  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
-
384  const bool turbo, const bool light, const bool econo,
-
385  const bool filter);
-
386 #endif // SEND_TCL112AC
-
387 #if SEND_TECHNIBEL_AC
-
388  void technibel(IRTechnibelAc *ac,
-
389  const bool on, const stdAc::opmode_t mode, const bool celsius,
-
390  const float degrees, const stdAc::fanspeed_t fan,
-
391  const stdAc::swingv_t swingv, const int16_t sleep = -1);
-
392 #endif // SEND_TECHNIBEL_AC
-
393 #if SEND_TECO
-
394  void teco(IRTecoAc *ac,
-
395  const bool on, const stdAc::opmode_t mode, const float degrees,
-
396  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
397  const bool light, const int16_t sleep = -1);
-
398 #endif // SEND_TECO
-
399 #if SEND_TOSHIBA_AC
-
400  void toshiba(IRToshibaAC *ac,
-
401  const bool on, const stdAc::opmode_t mode, const float degrees,
-
402  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
403  const bool turbo, const bool econo);
-
404 #endif // SEND_TOSHIBA_AC
-
405 #if SEND_TROTEC
-
406  void trotec(IRTrotecESP *ac,
-
407  const bool on, const stdAc::opmode_t mode, const float degrees,
-
408  const stdAc::fanspeed_t fan, const int16_t sleep = -1);
-
409 #endif // SEND_TROTEC
-
410 #if SEND_VESTEL_AC
-
411  void vestel(IRVestelAc *ac,
-
412  const bool on, const stdAc::opmode_t mode, const float degrees,
-
413  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
414  const bool turbo, const bool filter,
-
415  const int16_t sleep = -1, const int16_t clock = -1,
-
416  const bool sendNormal = true);
-
417 #endif // SEND_VESTEL_AC
-
418 #if SEND_VOLTAS
-
419  void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model,
-
420  const bool on, const stdAc::opmode_t mode,
-
421  const float degrees, const stdAc::fanspeed_t fan,
-
422  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
-
423  const bool turbo, const bool econo, const bool light,
-
424  const int16_t sleep = -1);
-
425 #endif // SEND_VOLTAS
-
426 #if SEND_WHIRLPOOL_AC
- -
428  const bool on, const stdAc::opmode_t mode, const float degrees,
-
429  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
-
430  const bool turbo, const bool light,
-
431  const int16_t sleep = -1, const int16_t clock = -1);
-
432 #endif // SEND_WHIRLPOOL_AC
-
433 #if SEND_TRANSCOLD
-
434  void transcold(IRTranscoldAc *ac,
-
435  const bool on, const stdAc::opmode_t mode, const float degrees,
-
436  const stdAc::fanspeed_t fan,
-
437  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh);
-
438 #endif // SEND_TRANSCOLD
-
439 static stdAc::state_t cleanState(const stdAc::state_t state);
-
440 static stdAc::state_t handleToggles(const stdAc::state_t desired,
-
441  const stdAc::state_t *prev = NULL);
-
442 }; // IRac class
-
443 
-
445 namespace IRAcUtils {
-
446  String resultAcToString(const decode_results * const results);
-
447  bool decodeToState(const decode_results *decode, stdAc::state_t *result,
-
448  const stdAc::state_t *prev = NULL);
-
449 } // namespace IRAcUtils
-
450 #endif // IRAC_H_
+
357 #if SEND_PANASONIC_AC32
+
358  void panasonic32(IRPanasonicAc32 *ac,
+
359  const bool on, const stdAc::opmode_t mode,
+
360  const float degrees, const stdAc::fanspeed_t fan,
+
361  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh);
+
362 #endif // SEND_PANASONIC_AC32
+
363 #if SEND_SAMSUNG_AC
+
364  void samsung(IRSamsungAc *ac,
+
365  const bool on, const stdAc::opmode_t mode, const float degrees,
+
366  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
367  const bool quiet, const bool turbo, const bool light,
+
368  const bool filter, const bool clean,
+
369  const bool beep, const bool prevpower = true,
+
370  const bool forcepower = true);
+
371 #endif // SEND_SAMSUNG_AC
+
372 #if SEND_SANYO_AC
+
373  void sanyo(IRSanyoAc *ac,
+
374  const bool on, const stdAc::opmode_t mode, const float degrees,
+
375  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
376  const bool beep, const int16_t sleep = -1);
+
377 #endif // SEND_SANYO_AC
+
378 #if SEND_SHARP_AC
+
379  void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model,
+
380  const bool on, const bool prev_power, const stdAc::opmode_t mode,
+
381  const float degrees, const stdAc::fanspeed_t fan,
+
382  const stdAc::swingv_t swingv, const bool turbo, const bool light,
+
383  const bool filter, const bool clean);
+
384 #endif // SEND_SHARP_AC
+
385 #if SEND_TCL112AC
+
386  void tcl112(IRTcl112Ac *ac,
+
387  const bool on, const stdAc::opmode_t mode, const float degrees,
+
388  const stdAc::fanspeed_t fan,
+
389  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
+
390  const bool turbo, const bool light, const bool econo,
+
391  const bool filter);
+
392 #endif // SEND_TCL112AC
+
393 #if SEND_TECHNIBEL_AC
+
394  void technibel(IRTechnibelAc *ac,
+
395  const bool on, const stdAc::opmode_t mode, const bool celsius,
+
396  const float degrees, const stdAc::fanspeed_t fan,
+
397  const stdAc::swingv_t swingv, const int16_t sleep = -1);
+
398 #endif // SEND_TECHNIBEL_AC
+
399 #if SEND_TECO
+
400  void teco(IRTecoAc *ac,
+
401  const bool on, const stdAc::opmode_t mode, const float degrees,
+
402  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
403  const bool light, const int16_t sleep = -1);
+
404 #endif // SEND_TECO
+
405 #if SEND_TOSHIBA_AC
+
406  void toshiba(IRToshibaAC *ac,
+
407  const bool on, const stdAc::opmode_t mode, const float degrees,
+
408  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
409  const bool turbo, const bool econo);
+
410 #endif // SEND_TOSHIBA_AC
+
411 #if SEND_TROTEC
+
412  void trotec(IRTrotecESP *ac,
+
413  const bool on, const stdAc::opmode_t mode, const float degrees,
+
414  const stdAc::fanspeed_t fan, const int16_t sleep = -1);
+
415 #endif // SEND_TROTEC
+
416 #if SEND_VESTEL_AC
+
417  void vestel(IRVestelAc *ac,
+
418  const bool on, const stdAc::opmode_t mode, const float degrees,
+
419  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
420  const bool turbo, const bool filter,
+
421  const int16_t sleep = -1, const int16_t clock = -1,
+
422  const bool sendNormal = true);
+
423 #endif // SEND_VESTEL_AC
+
424 #if SEND_VOLTAS
+
425  void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model,
+
426  const bool on, const stdAc::opmode_t mode,
+
427  const float degrees, const stdAc::fanspeed_t fan,
+
428  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh,
+
429  const bool turbo, const bool econo, const bool light,
+
430  const int16_t sleep = -1);
+
431 #endif // SEND_VOLTAS
+
432 #if SEND_WHIRLPOOL_AC
+ +
434  const bool on, const stdAc::opmode_t mode, const float degrees,
+
435  const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv,
+
436  const bool turbo, const bool light,
+
437  const int16_t sleep = -1, const int16_t clock = -1);
+
438 #endif // SEND_WHIRLPOOL_AC
+
439 #if SEND_TRANSCOLD
+
440  void transcold(IRTranscoldAc *ac,
+
441  const bool on, const stdAc::opmode_t mode, const float degrees,
+
442  const stdAc::fanspeed_t fan,
+
443  const stdAc::swingv_t swingv, const stdAc::swingh_t swingh);
+
444 #endif // SEND_TRANSCOLD
+
445 static stdAc::state_t cleanState(const stdAc::state_t state);
+
446 static stdAc::state_t handleToggles(const stdAc::state_t desired,
+
447  const stdAc::state_t *prev = NULL);
+
448 }; // IRac class
+
449 
+
451 namespace IRAcUtils {
+
452  String resultAcToString(const decode_results * const results);
+
453  bool decodeToState(const decode_results *decode, stdAc::state_t *result,
+
454  const stdAc::state_t *prev = NULL);
+
455 } // namespace IRAcUtils
+
456 #endif // IRAC_H_
Class for handling detailed Panasonic A/C messages.
Definition: ir_Panasonic.h:100
-
void airwell(IRAirwellAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send an Airwell A/C message with the supplied settings.
Definition: IRac.cpp:299
+
void airwell(IRAirwellAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send an Airwell A/C message with the supplied settings.
Definition: IRac.cpp:302
Support for Kelvinator A/C protocols.
-
Class for handling detailed Samsung A/C messages.
Definition: ir_Samsung.h:97
-
void hitachi(IRHitachiAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi A/C message with the supplied settings.
Definition: IRac.cpp:1070
+
Class for handling detailed Samsung A/C messages.
Definition: ir_Samsung.h:130
+
void hitachi(IRHitachiAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi A/C message with the supplied settings.
Definition: IRac.cpp:1073
Class for handling detailed Toshiba A/C messages.
Definition: ir_Toshiba.h:100
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:771
stdAc::state_t getStatePrev(void)
Get the previous internal A/C climate state that should have already been sent to the device....
Definition: IRac.cpp:133
stdAc::state_t getState(void)
Get the current internal A/C climate state.
Definition: IRac.cpp:128
Class for handling detailed Mitsubishi Heavy 152-bit A/C messages.
Definition: ir_MitsubishiHeavy.h:184
-
static stdAc::swingh_t strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2791
-
void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Sharp A/C message with the supplied settings.
Definition: IRac.cpp:1688
-
void hitachi344(IRHitachiAc344 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi 344-bit A/C message with the supplied settings.
Definition: IRac.cpp:1146
+
static stdAc::swingh_t strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2842
+
void sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Sharp A/C message with the supplied settings.
Definition: IRac.cpp:1725
+
void hitachi344(IRHitachiAc344 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Hitachi 344-bit A/C message with the supplied settings.
Definition: IRac.cpp:1149
Support for Electra A/C protocols.
-
void markAsSent(void)
Update the previous state to the current one.
Definition: IRac.cpp:2654
+
void markAsSent(void)
Update the previous state to the current one.
Definition: IRac.cpp:2705
swingv_t
Common A/C settings for Vertical Swing.
Definition: IRsend.h:70
Airwell "Manchester code" based protocol. Some other Airwell products use the COOLIX protocol.
-
void daikin2(IRDaikin2 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool econo, const bool filter, const bool clean, const bool beep, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin2 A/C message with the supplied settings.
Definition: IRac.cpp:688
+
void daikin2(IRDaikin2 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool econo, const bool filter, const bool clean, const bool beep, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin2 A/C message with the supplied settings.
Definition: IRac.cpp:691
Support for Trotec protocols.
-
void sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1644
+
void sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1681
Class for handling detailed Daikin 280-bit A/C messages.
Definition: ir_Daikin.h:651
-
void lg(IRLgAc *ac, const lg_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send a LG A/C message with the supplied settings.
Definition: IRac.cpp:1252
+
void lg(IRLgAc *ac, const lg_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send a LG A/C message with the supplied settings.
Definition: IRac.cpp:1255
Class for handling detailed Delonghi A/C messages.
Definition: ir_Delonghi.h:73
Class for handling detailed Corona A/C messages.
Definition: ir_Corona.h:107
-
void kelvinator(IRKelvinatorAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Kelvinator A/C message with the supplied settings.
Definition: IRac.cpp:1218
+
void kelvinator(IRKelvinatorAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean)
Send a Kelvinator A/C message with the supplied settings.
Definition: IRac.cpp:1221
Class for handling detailed Daikin 312-bit A/C messages.
Definition: ir_Daikin.h:733
Support for Neoclima protocols. Analysis by crankyoldgit & AndreyShpilevoy.
Class for handling detailed Daikin 128-bit A/C messages.
Definition: ir_Daikin.h:994
fanspeed_t
Common A/C settings for Fan Speeds.
Definition: IRsend.h:58
Support for Sharp protocols.
-
static String fanspeedToString(const stdAc::fanspeed_t speed)
Convert the supplied fan speed enum into the appropriate String.
Definition: IRac.cpp:2941
+
static String fanspeedToString(const stdAc::fanspeed_t speed)
Convert the supplied fan speed enum into the appropriate String.
Definition: IRac.cpp:2992
whirlpool_ac_remote_model_t
Whirlpool A/C model numbers.
Definition: IRsend.h:164
Carrier A/C.
-
void whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)
Send a Whirlpool A/C message with the supplied settings.
Definition: IRac.cpp:1999
+
void whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)
Send a Whirlpool A/C message with the supplied settings.
Definition: IRac.cpp:2036
Results returned from the decoder.
Definition: IRrecv.h:92
-
void daikin64(IRDaikin64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:757
-
void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Voltas A/C message with the supplied settings.
Definition: IRac.cpp:1958
-
void tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)
Send a TCL 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1741
-
void transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Transcold A/C message with the supplied settings.
Definition: IRac.cpp:2036
-
bool sendAc(void)
Send an A/C message based soley on our internal state.
Definition: IRac.cpp:2660
-
static bool cmpStates(const stdAc::state_t a, const stdAc::state_t b)
Compare two AirCon states.
Definition: IRac.cpp:2671
+
void daikin64(IRDaikin64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:760
+
void voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Voltas A/C message with the supplied settings.
Definition: IRac.cpp:1995
+
void tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)
Send a TCL 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1778
+
void transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Transcold A/C message with the supplied settings.
Definition: IRac.cpp:2073
+
bool sendAc(void)
Send an A/C message based soley on our internal state.
Definition: IRac.cpp:2711
+
static bool cmpStates(const stdAc::state_t a, const stdAc::state_t b)
Compare two AirCon states.
Definition: IRac.cpp:2722
Support for Midea protocols. Midea added by crankyoldgit & bwze.
Support for Daikin A/C protocols.
gree_ac_remote_model_t
Gree A/C model numbers.
Definition: IRsend.h:129
Class for handling detailed Daikin 64-bit A/C messages.
Definition: ir_Daikin.h:1124
Support for Coolix A/C protocols.
-
void vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)
Send a Vestel A/C message with the supplied settings.
Definition: IRac.cpp:1916
+
void vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)
Send a Vestel A/C message with the supplied settings.
Definition: IRac.cpp:1953
Class for handling detailed Hitachi 53-byte/424-bit A/C messages.
Definition: ir_Hitachi.h:371
-
void daikin(IRDaikinESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool clean)
Send a Daikin A/C message with the supplied settings.
Definition: IRac.cpp:524
+
void daikin(IRDaikinESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool clean)
Send a Daikin A/C message with the supplied settings.
Definition: IRac.cpp:527
IRac(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
Class constructor.
Definition: IRac.cpp:54
Class for handling detailed Daikin 216-bit A/C messages.
Definition: ir_Daikin.h:829
Class for handling detailed Voltas A/C messages.
Definition: ir_Voltas.h:90
hitachi_ac1_remote_model_t
HITACHI_AC1 A/C model numbers.
Definition: IRsend.h:135
-
void samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)
Send a Samsung A/C message with the supplied settings.
Definition: IRac.cpp:1603
-
void daikin128(IRDaikin128 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool econo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 128-bit A/C message with the supplied settings.
Definition: IRac.cpp:564
+
void samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)
Send a Samsung A/C message with the supplied settings.
Definition: IRac.cpp:1640
+
void daikin128(IRDaikin128 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool econo, const int16_t sleep=-1, const int16_t clock=-1)
Send a Daikin 128-bit A/C message with the supplied settings.
Definition: IRac.cpp:567
Class for handling detailed Hitachi 224-bit A/C messages.
Definition: ir_Hitachi.h:246
const int8_t kGpioUnused
A placeholder for not using an actual GPIO.
Definition: IRac.h:45
-
Common functions for use with all A/Cs supported by the IRac class.
Definition: IRac.cpp:3010
-
Class for handling detailed Sanyo A/C messages.
Definition: ir_Sanyo.h:98
-
void haier(IRHaierAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool filter, const int16_t sleep=-1, const int16_t clock=-1)
Send a Haier A/C message with the supplied settings.
Definition: IRac.cpp:1001
+
Common functions for use with all A/Cs supported by the IRac class.
Definition: IRac.cpp:3061
+
Class for handling detailed Sanyo A/C messages.
Definition: ir_Sanyo.h:106
+
void haier(IRHaierAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool filter, const int16_t sleep=-1, const int16_t clock=-1)
Send a Haier A/C message with the supplied settings.
Definition: IRac.cpp:1004
Class for handling detailed Whirlpool A/C messages.
Definition: ir_Whirlpool.h:91
Class for handling detailed Hitachi 344-bit A/C messages.
Definition: ir_Hitachi.h:459
-
static String boolToString(const bool value)
Convert the supplied boolean into the appropriate String.
Definition: IRac.cpp:2912
+
static String boolToString(const bool value)
Convert the supplied boolean into the appropriate String.
Definition: IRac.cpp:2963
stdAc::state_t next
The state we want the device to be in after we send.
Definition: IRac.h:97
std::string String
Definition: IRremoteESP8266.h:1178
Class for handling detailed Mitsubishi 144-bit A/C messages.
Definition: ir_Mitsubishi.h:221
-
void trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)
Send a Trotec A/C message with the supplied settings.
Definition: IRac.cpp:1879
-
static int16_t strToModel(const char *str, const int16_t def=-1)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2831
+
void trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)
Send a Trotec A/C message with the supplied settings.
Definition: IRac.cpp:1916
+
static int16_t strToModel(const char *str, const int16_t def=-1)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2882
Class for handling detailed Amcor A/C messages.
Definition: ir_Amcor.h:90
Class for handling detailed Mitsubishi 122-bit A/C messages.
Definition: ir_Mitsubishi.h:339
Class for handling detailed TCL A/C messages.
Definition: ir_Tcl.h:63
-
void daikin176(IRDaikin176 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingh_t swingh)
Send a Daikin 176-bit A/C message with the supplied settings.
Definition: IRac.cpp:656
+
void daikin176(IRDaikin176 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingh_t swingh)
Send a Daikin 176-bit A/C message with the supplied settings.
Definition: IRac.cpp:659
Class for handling detailed Electra A/C messages.
Definition: ir_Electra.h:98
Support for TCL protocols.
-
bool hasStateChanged(void)
Check if the internal state has changed from what was previously sent.
Definition: IRac.cpp:2683
-
void haierYrwo2(IRHaierACYRW02 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1)
Send a Haier YRWO2 A/C message with the supplied settings.
Definition: IRac.cpp:1038
-
void daikin216(IRDaikin216 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo)
Send a Daikin 216-bit A/C message with the supplied settings.
Definition: IRac.cpp:727
+
bool hasStateChanged(void)
Check if the internal state has changed from what was previously sent.
Definition: IRac.cpp:2734
+
void haierYrwo2(IRHaierACYRW02 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1)
Send a Haier YRWO2 A/C message with the supplied settings.
Definition: IRac.cpp:1041
+
void daikin216(IRDaikin216 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo)
Send a Daikin 216-bit A/C message with the supplied settings.
Definition: IRac.cpp:730
Support for Transcold A/C protocols.
Support for Hitachi A/C protocols.
Support for Panasonic protocols.
-
static stdAc::state_t handleToggles(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)
Create a new state base on desired & previous states but handle any state changes for options that ne...
Definition: IRac.cpp:2085
+
static stdAc::state_t handleToggles(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)
Create a new state base on desired & previous states but handle any state changes for options that ne...
Definition: IRac.cpp:2122
Class for handling detailed Mitsubishi 136-bit A/C messages.
Definition: ir_Mitsubishi.h:285
panasonic_ac_remote_model_t
Panasonic A/C model numbers.
Definition: IRsend.h:141
swingh_t
Common A/C settings for Horizontal Swing.
Definition: IRsend.h:83
-
void mitsubishi112(IRMitsubishi112 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet)
Send a Mitsubishi 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1362
-
bool decodeToState(const decode_results *decode, stdAc::state_t *result, const stdAc::state_t *prev)
Convert a valid IR A/C remote message that we understand enough into a Common A/C state.
Definition: IRac.cpp:3369
+
void mitsubishi112(IRMitsubishi112 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet)
Send a Mitsubishi 112-bit A/C message with the supplied settings.
Definition: IRac.cpp:1365
+
bool decodeToState(const decode_results *decode, stdAc::state_t *result, const stdAc::state_t *prev)
Convert a valid IR A/C remote message that we understand enough into a Common A/C state.
Definition: IRac.cpp:3430
Class for handling detailed Hitachi 104-bit A/C messages.
Definition: ir_Hitachi.h:303
-
void hitachi424(IRHitachiAc424 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Hitachi 424-bit A/C message with the supplied settings.
Definition: IRac.cpp:1180
+
void hitachi424(IRHitachiAc424 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Hitachi 424-bit A/C message with the supplied settings.
Definition: IRac.cpp:1183
Support for Samsung protocols. Samsung originally added from https://github.com/shirriff/Arduino-IRre...
-
String resultAcToString(const decode_results *const result)
Display the human readable state of an A/C message if we can.
Definition: IRac.cpp:3016
-
void daikin152(IRDaikin152 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool econo)
Send a Daikin 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:601
+
String resultAcToString(const decode_results *const result)
Display the human readable state of an A/C message if we can.
Definition: IRac.cpp:3067
+
void daikin152(IRDaikin152 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool econo)
Send a Daikin 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:604
fujitsu_ac_remote_model_t
Fujitsu A/C model numbers.
Definition: IRsend.h:120
Support for Gree A/C protocols.
Class for handling detailed Carrier 64 bit A/C messages.
Definition: ir_Carrier.h:84
-
Class for handling detailed Midea A/C messages.
Definition: ir_Midea.h:138
-
Class for handling detailed Kelvinator A/C messages.
Definition: ir_Kelvinator.h:120
+
Class for handling detailed Midea A/C messages.
Definition: ir_Midea.h:151
+
Class for handling detailed Kelvinator A/C messages.
Definition: ir_Kelvinator.h:121
bool _inverted
IR LED is lit when GPIO is LOW (true) or HIGH (false)?
Definition: IRac.h:103
Class for handling detailed Fujitsu A/C messages.
Definition: ir_Fujitsu.h:113
Support for Mitsubishi Heavy Industry protocols. Code to emulate Mitsubishi Heavy Industries A/C IR r...
Class for handling detailed Coolix A/C messages.
Definition: ir_Coolix.h:112
-
void midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Midea A/C message with the supplied settings.
Definition: IRac.cpp:1289
-
void panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool filter, const int16_t clock=-1)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1559
-
static String swingvToString(const stdAc::swingv_t swingv)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:2963
+
void midea(IRMideaAC *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)
Send a Midea A/C message with the supplied settings.
Definition: IRac.cpp:1292
+
void panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool filter, const int16_t clock=-1)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1562
+
static String swingvToString(const stdAc::swingv_t swingv)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3014
Support for Mitsubishi protocols. Mitsubishi (TV) decoding added from https://github....
A universal/common/generic interface for controling supported A/Cs.
Definition: IRac.h:49
Support for Teco protocols.
-
void gree(IRGreeAC *ac, const gree_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Gree A/C message with the supplied settings.
Definition: IRac.cpp:963
+
void gree(IRGreeAC *ac, const gree_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Gree A/C message with the supplied settings.
Definition: IRac.cpp:966
Delonghi A/C.
-
void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool lighttoggle, const bool clean)
Send an Electra A/C message with the supplied settings.
Definition: IRac.cpp:814
-
static stdAc::state_t cleanState(const stdAc::state_t state)
Create a new state base on the provided state that has been suitably fixed.
Definition: IRac.cpp:2072
+
void electra(IRElectraAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool lighttoggle, const bool clean)
Send an Electra A/C message with the supplied settings.
Definition: IRac.cpp:817
+
static stdAc::state_t cleanState(const stdAc::state_t state)
Create a new state base on the provided state that has been suitably fixed.
Definition: IRac.cpp:2109
Support for Argo Ulisse 13 DCI Mobile Split ACs.
-
void mitsubishi(IRMitsubishiAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const int16_t clock=-1)
Send a Mitsubishi A/C message with the supplied settings.
Definition: IRac.cpp:1327
-
void amcor(IRAmcorAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send an Amcor A/C message with the supplied settings.
Definition: IRac.cpp:327
+
void mitsubishi(IRMitsubishiAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const int16_t clock=-1)
Send a Mitsubishi A/C message with the supplied settings.
Definition: IRac.cpp:1330
+
void amcor(IRAmcorAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan)
Send an Amcor A/C message with the supplied settings.
Definition: IRac.cpp:330
Class for handling detailed Technibel A/C messages.
Definition: ir_Technibel.h:108
Class for handling detailed Airwell A/C messages.
Definition: ir_Airwell.h:60
Support for Voltas A/C protocol.
@@ -640,63 +646,65 @@ $(function() {
Class for handling detailed LG A/C messages.
Definition: ir_LG.h:67
Support for Fujitsu A/C protocols. Fujitsu A/C support added by Jonny Graham.
Class for handling detailed Haier A/C messages.
Definition: ir_Haier.h:244
-
void neoclima(IRNeoclimaAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const bool filter, const int16_t sleep=-1)
Send a Neoclima A/C message with the supplied settings.
Definition: IRac.cpp:1518
+
void neoclima(IRNeoclimaAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const bool filter, const int16_t sleep=-1)
Send a Neoclima A/C message with the supplied settings.
Definition: IRac.cpp:1521
Class for handling detailed Daikin 160-bit A/C messages.
Definition: ir_Daikin.h:885
-
static String opmodeToString(const stdAc::opmode_t mode)
Convert the supplied operation mode into the appropriate String.
Definition: IRac.cpp:2919
-
Class for handling detailed Sharp A/C messages.
Definition: ir_Sharp.h:113
-
void toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1843
+
static String opmodeToString(const stdAc::opmode_t mode)
Convert the supplied operation mode into the appropriate String.
Definition: IRac.cpp:2970
+
Class for handling detailed Sharp A/C messages.
Definition: ir_Sharp.h:131
+
void toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)
Send a Toshiba A/C message with the supplied settings.
Definition: IRac.cpp:1880
Support for Goodweather compatible HVAC protocols.
-
void argo(IRArgoAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const int16_t sleep=-1)
Send an Argo A/C message with the supplied settings.
Definition: IRac.cpp:359
+
void argo(IRArgoAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const int16_t sleep=-1)
Send an Argo A/C message with the supplied settings.
Definition: IRac.cpp:362
lg_ac_remote_model_t
LG A/C model numbers.
Definition: IRsend.h:170
-
void mitsubishi136(IRMitsubishi136 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet)
Send a Mitsubishi 136-bit A/C message with the supplied settings.
Definition: IRac.cpp:1398
+
void mitsubishi136(IRMitsubishi136 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet)
Send a Mitsubishi 136-bit A/C message with the supplied settings.
Definition: IRac.cpp:1401
bool _modulation
Is frequency modulation to be used?
Definition: IRac.h:104
-
void teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)
Send a Teco A/C message with the supplied settings.
Definition: IRac.cpp:1810
-
static stdAc::opmode_t strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2689
+
void teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)
Send a Teco A/C message with the supplied settings.
Definition: IRac.cpp:1847
+
static stdAc::opmode_t strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2740
Support for Sanyo protocols. Sanyo LC7461 support originally by marcosamarinho Sanyo SA 8650B origina...
-
void hitachi1(IRHitachiAc1 *ac, const hitachi_ac1_remote_model_t model, const bool on, const bool power_toggle, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool swing_toggle, const int16_t sleep=-1)
Send a Hitachi1 A/C message with the supplied settings.
Definition: IRac.cpp:1107
+
void hitachi1(IRHitachiAc1 *ac, const hitachi_ac1_remote_model_t model, const bool on, const bool power_toggle, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool swing_toggle, const int16_t sleep=-1)
Send a Hitachi1 A/C message with the supplied settings.
Definition: IRac.cpp:1110
Class for handling detailed Transcold A/C messages.
Definition: ir_Transcold.h:111
+
void panasonic32(IRPanasonicAc32 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)
Send a Panasonic A/C message with the supplied settings.
Definition: IRac.cpp:1598
Support for Whirlpool protocols. Decoding help from: @redmusicxd, @josh929800, @raducostea.
-
static bool strToBool(const char *str, const bool def=false)
Convert the supplied str into the appropriate boolean value.
Definition: IRac.cpp:2894
-
void mitsubishiHeavy88(IRMitsubishiHeavy88Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool clean)
Send a Mitsubishi Heavy 88-bit A/C message with the supplied settings.
Definition: IRac.cpp:1433
-
static stdAc::swingv_t strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2750
+
static bool strToBool(const char *str, const bool def=false)
Convert the supplied str into the appropriate boolean value.
Definition: IRac.cpp:2945
+
void mitsubishiHeavy88(IRMitsubishiHeavy88Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool clean)
Send a Mitsubishi Heavy 88-bit A/C message with the supplied settings.
Definition: IRac.cpp:1436
+
static stdAc::swingv_t strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2801
Class for handling detailed Vestel A/C messages.
Definition: ir_Vestel.h:116
+
Class for handling detailed Panasonic 32bit A/C messages.
Definition: ir_Panasonic.h:219
Class for handling detailed Trotec A/C messages.
Definition: ir_Trotec.h:76
Class for handling detailed Teco A/C messages.
Definition: ir_Teco.h:107
-
static String swinghToString(const stdAc::swingh_t swingh)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:2987
-
void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Fujitsu A/C message with the supplied settings.
Definition: IRac.cpp:857
+
static String swinghToString(const stdAc::swingh_t swingh)
Convert the supplied enum into the appropriate String.
Definition: IRac.cpp:3038
+
void fujitsu(IRFujitsuAC *ac, const fujitsu_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Fujitsu A/C message with the supplied settings.
Definition: IRac.cpp:860
Support for Technibel protocol.
-
void delonghiac(IRDelonghiAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const bool turbo, const int16_t sleep=-1)
Send a Delonghi A/C message with the supplied settings.
Definition: IRac.cpp:787
+
void delonghiac(IRDelonghiAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const bool turbo, const int16_t sleep=-1)
Send a Delonghi A/C message with the supplied settings.
Definition: IRac.cpp:790
stdAc::state_t _prev
The state we expect the device to currently be in.
Definition: IRac.h:105
Class for handling detailed Haier ACYRW02 A/C messages.
Definition: ir_Haier.h:314
-
void daikin160(IRDaikin160 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Daikin 160-bit A/C message with the supplied settings.
Definition: IRac.cpp:634
-
void corona(IRCoronaAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool econo)
Send a Corona A/C message with the supplied settings.
Definition: IRac.cpp:489
+
void daikin160(IRDaikin160 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv)
Send a Daikin 160-bit A/C message with the supplied settings.
Definition: IRac.cpp:637
+
void corona(IRCoronaAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool econo)
Send a Corona A/C message with the supplied settings.
Definition: IRac.cpp:492
static void initState(stdAc::state_t *state, const decode_type_t vendor, const int16_t model, const bool power, const stdAc::opmode_t mode, const float degrees, const bool celsius, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool light, const bool filter, const bool clean, const bool beep, const int16_t sleep, const int16_t clock)
Initialise the given state with the supplied settings.
Definition: IRac.cpp:85
-
void mitsubishiHeavy152(IRMitsubishiHeavy152Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Mitsubishi Heavy 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:1474
+
void mitsubishiHeavy152(IRMitsubishiHeavy152Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool filter, const bool clean, const int16_t sleep=-1)
Send a Mitsubishi Heavy 152-bit A/C message with the supplied settings.
Definition: IRac.cpp:1477
Support for Haier A/C protocols. The specifics of reverse engineering the protocols details:
Class for handling detailed Mitsubishi Heavy 88-bit A/C messages.
Definition: ir_MitsubishiHeavy.h:271
-
Class for handling detailed Gree A/C messages.
Definition: ir_Gree.h:131
-
void coolix(IRCoolixAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Coolix A/C message with the supplied settings.
Definition: IRac.cpp:428
-
static stdAc::fanspeed_t strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2719
+
Class for handling detailed Gree A/C messages.
Definition: ir_Gree.h:133
+
void coolix(IRCoolixAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool clean, const int16_t sleep=-1)
Send a Coolix A/C message with the supplied settings.
Definition: IRac.cpp:431
+
static stdAc::fanspeed_t strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)
Convert the supplied str into the appropriate enum.
Definition: IRac.cpp:2770
Support for Toshiba protocols.
-
void goodweather(IRGoodweatherAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1)
Send a Goodweather A/C message with the supplied settings.
Definition: IRac.cpp:921
+
void goodweather(IRGoodweatherAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1)
Send a Goodweather A/C message with the supplied settings.
Definition: IRac.cpp:924
Structure to hold a common A/C state.
Definition: IRsend.h:97
Class for handling detailed Goodweather A/C messages.
Definition: ir_Goodweather.h:100
Support for Vestel protocols. Vestel added by Erdem U. Altinyurt.
Class for handling detailed Argo A/C messages.
Definition: ir_Argo.h:127
-
Class for handling detailed Neoclima A/C messages.
Definition: ir_Neoclima.h:94
+
Class for handling detailed Neoclima A/C messages.
Definition: ir_Neoclima.h:120
static bool isProtocolSupported(const decode_type_t protocol)
Is the given protocol supported by the IRac class?
Definition: IRac.cpp:138
Class for handling detailed Daikin 176-bit A/C messages.
Definition: ir_Daikin.h:937
Amcor A/C protocol.
uint16_t _pin
The GPIO to use to transmit messages from.
Definition: IRac.h:102
-
void technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Technibel A/C message with the supplied settings.
Definition: IRac.cpp:1777
+
void technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Technibel A/C message with the supplied settings.
Definition: IRac.cpp:1814
voltas_ac_remote_model_t
Voltas A/C model numbers.
Definition: IRsend.h:158
sharp_ac_remote_model_t
Sharp A/C model numbers.
Definition: IRsend.h:152
Support for LG protocols.
-
void carrier64(IRCarrierAc64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Carrier 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:391
+
void carrier64(IRCarrierAc64 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)
Send a Carrier 64-bit A/C message with the supplied settings.
Definition: IRac.cpp:394
opmode_t
Common A/C settings for A/C operating modes.
Definition: IRsend.h:46
String addTempToString(const uint16_t degrees, const bool celsius, const bool precomma)
Create a String of human output for a given temperature. e.g. "Temp: 25C".
Definition: IRutils.cpp:593
decode_type_t
Enumerator for defining and numbering of supported IR protocol.
Definition: IRremoteESP8266.h:771
String addDayToString(const uint8_t day_of_week, const int8_t offset, const bool precomma)
Create a String of the 3-letter day of the week from a numerical day of the week. e....
Definition: IRutils.cpp:632
uint16_t * resultToRawArray(const decode_results *const decode)
Convert a decode_results into an array suitable for sendRaw().
Definition: IRutils.cpp:354
-
void setBits(uint8_t *const dst, const uint8_t offset, const uint8_t nbits, const uint8_t data)
Alter an uint8_t value by overwriting an arbitrary given number of bits.
Definition: IRutils.cpp:889
+
String addFanToString(const uint8_t speed, const uint8_t high, const uint8_t low, const uint8_t automatic, const uint8_t quiet, const uint8_t medium, const uint8_t maximum)
Create a String of human output for the given fan speed. e.g. "Fan: 0 (Auto)".
Definition: IRutils.cpp:659
+
void setBits(uint8_t *const dst, const uint8_t offset, const uint8_t nbits, const uint8_t data)
Alter an uint8_t value by overwriting an arbitrary given number of bits.
Definition: IRutils.cpp:892
String resultToSourceCode(const decode_results *const results)
Return a String containing the key values of a decode_results structure in a C/C++ code style format.
Definition: IRutils.cpp:196
Results returned from the decoder.
Definition: IRrecv.h:92
uint16_t getCorrectedRawLength(const decode_results *const results)
Return the corrected length of a 'raw' format array structure after over-large values are converted i...
Definition: IRutils.cpp:182
String addModelToString(const decode_type_t protocol, const int16_t model, const bool precomma)
Create a String of human output for a given protocol model number. e.g. "Model: JKE".
Definition: IRutils.cpp:578
uint16_t countBits(const uint8_t *const start, const uint16_t length, const bool ones=true, const uint16_t init=0)
Count the number of bits of a certain type in an array.
Definition: IRutils.cpp:405
-
String msToString(uint32_t const msecs)
Convert a nr. of milliSeconds into a Human-readable string. e.g. "1 Day 6 Hours 34 Minutes 17 Seconds...
Definition: IRutils.cpp:708
-
uint8_t lowLevelSanityCheck(void)
Perform a low level bit manipulation sanity check for the given cpu architecture and the compiler ope...
Definition: IRutils.cpp:978
+
String msToString(uint32_t const msecs)
Convert a nr. of milliSeconds into a Human-readable string. e.g. "1 Day 6 Hours 34 Minutes 17 Seconds...
Definition: IRutils.cpp:711
+
uint8_t lowLevelSanityCheck(void)
Perform a low level bit manipulation sanity check for the given cpu architecture and the compiler ope...
Definition: IRutils.cpp:981
String addModeToString(const uint8_t mode, const uint8_t automatic, const uint8_t cool, const uint8_t heat, const uint8_t dry, const uint8_t fan)
Create a String of human output for the given operating mode. e.g. "Mode: 1 (Cool)".
Definition: IRutils.cpp:609
String resultToHumanReadableBasic(const decode_results *const results)
Dump out the decode_results structure into a human readable format.
Definition: IRutils.cpp:327
String resultToTimingInfo(const decode_results *const results)
Dump out the decode_results structure.
Definition: IRutils.cpp:277
@@ -202,32 +204,31 @@ $(function() {
String modelToStr(const decode_type_t protocol, const int16_t model)
Generate the model string for a given Protocol/Model pair.
Definition: IRutils.cpp:501
const uint8_t kLowNibble
Definition: IRutils.h:18
-
uint8_t uint8ToBcd(const uint8_t integer)
Convert an Integer into a byte of Binary Coded Decimal(BCD).
Definition: IRutils.cpp:794
+
uint8_t uint8ToBcd(const uint8_t integer)
Convert an Integer into a byte of Binary Coded Decimal(BCD).
Definition: IRutils.cpp:797
decode_type_t strToDecodeType(const char *str)
Convert a C-style string to a decode_type_t.
Definition: IRutils.cpp:83
-
bool checkInvertedBytePairs(const uint8_t *const ptr, const uint16_t length)
Check an array to see if every second byte of a pair is a bit inverted/flipped copy of the first/prev...
Definition: IRutils.cpp:956
+
bool checkInvertedBytePairs(const uint8_t *const ptr, const uint16_t length)
Check an array to see if every second byte of a pair is a bit inverted/flipped copy of the first/prev...
Definition: IRutils.cpp:959
const uint8_t kHighNibble
Definition: IRutils.h:19
-
uint8_t sumNibbles(const uint8_t *const start, const uint16_t length, const uint8_t init)
Sum all the nibbles together in a series of bytes.
Definition: IRutils.cpp:759
+
uint8_t sumNibbles(const uint8_t *const start, const uint16_t length, const uint8_t init)
Sum all the nibbles together in a series of bytes.
Definition: IRutils.cpp:762
String uint64ToString(uint64_t input, uint8_t base=10)
Convert a uint64_t (unsigned long long) to a string. Arduino String/toInt/Serial.print() can't handle...
Definition: IRutils.cpp:44
float celsiusToFahrenheit(const float deg)
Convert degrees Celsius to degrees Fahrenheit.
Definition: IRutils.cpp:453
String addIntToString(const uint16_t value, const String label, const bool precomma)
Create a String with a colon separated labeled Integer suitable for Humans. e.g. "Foo: 23".
Definition: IRutils.cpp:492
uint8_t xorBytes(const uint8_t *const start, const uint16_t length, const uint8_t init=0)
Calculate a rolling XOR of all the bytes of an array.
Definition: IRutils.cpp:391
const uint8_t kModeBitsSize
Definition: IRutils.h:20
-
bool getBit(const uint64_t data, const uint8_t position, const uint8_t size)
Return the value of positionth bit of an Integer.
Definition: IRutils.cpp:804
+
bool getBit(const uint64_t data, const uint8_t position, const uint8_t size)
Return the value of positionth bit of an Integer.
Definition: IRutils.cpp:807
float fahrenheitToCelsius(const float deg)
Convert degrees Fahrenheit to degrees Celsius.
Definition: IRutils.cpp:456
uint8_t sumBytes(const uint8_t *const start, const uint16_t length, const uint8_t init=0)
Sum all the bytes of an array and return the least significant 8-bits of the result.
Definition: IRutils.cpp:378
String typeToString(const decode_type_t protocol, const bool isRepeat=false)
Convert a protocol type (enum etc) to a human readable string.
Definition: IRutils.cpp:105
-
String addFanToString(const uint8_t speed, const uint8_t high, const uint8_t low, const uint8_t automatic, const uint8_t quiet, const uint8_t medium)
Create a String of human output for the given fan speed. e.g. "Fan: 0 (Auto)".
Definition: IRutils.cpp:658
String resultToHexidecimal(const decode_results *const result)
Convert the decode_results structure's value/state to simple hexadecimal.
Definition: IRutils.cpp:307
String addBoolToString(const bool value, const String label, const bool precomma)
Create a String with a colon separated flag suitable for Humans. e.g. "Power: On".
Definition: IRutils.cpp:480
-
String minsToString(const uint16_t mins)
Convert a nr. of minutes into a 24h clock format Human-readable string. e.g. "23:59".
Definition: IRutils.cpp:744
-
uint8_t * invertBytePairs(uint8_t *ptr, const uint16_t length)
Create byte pairs where the second byte of the pair is a bit inverted/flipped copy of the first/previ...
Definition: IRutils.cpp:941
-
uint8_t bcdToUint8(const uint8_t bcd)
Convert a byte of Binary Coded Decimal(BCD) into an Integer.
Definition: IRutils.cpp:786
+
String minsToString(const uint16_t mins)
Convert a nr. of minutes into a 24h clock format Human-readable string. e.g. "23:59".
Definition: IRutils.cpp:747
+
uint8_t * invertBytePairs(uint8_t *ptr, const uint16_t length)
Create byte pairs where the second byte of the pair is a bit inverted/flipped copy of the first/previ...
Definition: IRutils.cpp:944
+
uint8_t bcdToUint8(const uint8_t bcd)
Convert a byte of Binary Coded Decimal(BCD) into an Integer.
Definition: IRutils.cpp:789
Namespace for covering common functions & procedures for advancd protocol handlers.
Definition: IRutils.cpp:458
uint64_t reverseBits(uint64_t input, uint16_t nbits)
Reverse the order of the requested least significant nr. of bits.
Definition: IRutils.cpp:24
-
String htmlEscape(const String unescaped)
Escape any special HTML (unsafe) characters in a string. e.g. anti-XSS.
Definition: IRutils.cpp:676
+
String htmlEscape(const String unescaped)
Escape any special HTML (unsafe) characters in a string. e.g. anti-XSS.
Definition: IRutils.cpp:679
bool hasACState(const decode_type_t protocol)
Does the given protocol use a complex state as part of the decode?
Definition: IRutils.cpp:130
-
uint64_t setBit(const uint64_t data, const uint8_t position, const bool on, const uint8_t size)
Return the value of an Integer with the positionth bit changed.
Definition: IRutils.cpp:824
+
uint64_t setBit(const uint64_t data, const uint8_t position, const bool on, const uint8_t size)
Return the value of an Integer with the positionth bit changed.
Definition: IRutils.cpp:827
void serialPrintUint64(uint64_t input, uint8_t base=10)
Print a uint64_t/unsigned long long to the Serial port Serial.print() can't handle printing long long...
Definition: IRutils.cpp:75
String addLabeledString(const String value, const String label, const bool precomma)
Create a String with a colon separated "label: value" pair suitable for Humans.
Definition: IRutils.cpp:465
uint64_t invertBits(const uint64_t data, const uint16_t nbits)
Invert/Flip the bits in an Integer.
Definition: IRutils.cpp:442
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/README_8md.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/README_8md.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/README_8md.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/README_8md.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/annotated.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html similarity index 80% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/annotated.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html index b3a5847f7..a92687ec7 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/annotated.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/annotated.html @@ -131,34 +131,40 @@ $(function() {  CIRMitsubishiHeavy88AcClass for handling detailed Mitsubishi Heavy 88-bit A/C messages  CIRNeoclimaAcClass for handling detailed Neoclima A/C messages  CIRPanasonicAcClass for handling detailed Panasonic A/C messages - Cirparams_tInformation for the interrupt handler - CIRrecvClass for receiving IR messages - CIRSamsungAcClass for handling detailed Samsung A/C messages - CIRSanyoAcClass for handling detailed Sanyo A/C messages - CIRsendClass for sending all basic IR protocols - CIRSharpAcClass for handling detailed Sharp A/C messages - CIRTcl112AcClass for handling detailed TCL A/C messages - CIRTechnibelAcClass for handling detailed Technibel A/C messages - CIRTecoAcClass for handling detailed Teco A/C messages - CIRtimerThis class offers a simple counter in micro-seconds since instantiated - CIRToshibaACClass for handling detailed Toshiba A/C messages - CIRTranscoldAcClass for handling detailed Transcold A/C messages - CIRTrotecESPClass for handling detailed Trotec A/C messages - CIRVestelAcClass for handling detailed Vestel A/C messages - CIRVoltasClass for handling detailed Voltas A/C messages - CIRWhirlpoolAcClass for handling detailed Whirlpool A/C messages - CKelvinatorProtocolNative representation of a Kelvinator A/C message - CLGProtocolNative representation of a LG A/C message - CmagiquestMagiQuest packet is both Wand ID and magnitude of swish and flick - Cmatch_result_tResults from a data match - CMideaProtocolNative representation of a Midea A/C message - CMitsubishi112ProtocolNative representation of a Mitsubishi 112-bit A/C message - CMitsubishi136ProtocolNative representation of a Mitsubishi 136-bit A/C message - CMitsubishi144ProtocolNative representation of a Mitsubishi 144-bit A/C message - CMitsubishi152ProtocolNative representation of a Mitsubishi Heavy 152-bit A/C message - CMitsubishi88ProtocolNative representation of a Mitsubishi Heavy 88-bit A/C message - CTimerMsThis class offers a simple counter in milli-seconds since instantiated - CVoltasProtocolNative representation of a Voltas A/C message + CIRPanasonicAc32Class for handling detailed Panasonic 32bit A/C messages + Cirparams_tInformation for the interrupt handler + CIRrecvClass for receiving IR messages + CIRSamsungAcClass for handling detailed Samsung A/C messages + CIRSanyoAcClass for handling detailed Sanyo A/C messages + CIRsendClass for sending all basic IR protocols + CIRSharpAcClass for handling detailed Sharp A/C messages + CIRTcl112AcClass for handling detailed TCL A/C messages + CIRTechnibelAcClass for handling detailed Technibel A/C messages + CIRTecoAcClass for handling detailed Teco A/C messages + CIRtimerThis class offers a simple counter in micro-seconds since instantiated + CIRToshibaACClass for handling detailed Toshiba A/C messages + CIRTranscoldAcClass for handling detailed Transcold A/C messages + CIRTrotecESPClass for handling detailed Trotec A/C messages + CIRVestelAcClass for handling detailed Vestel A/C messages + CIRVoltasClass for handling detailed Voltas A/C messages + CIRWhirlpoolAcClass for handling detailed Whirlpool A/C messages + CKelvinatorProtocolNative representation of a Kelvinator A/C message + CLGProtocolNative representation of a LG A/C message + CmagiquestMagiQuest packet is both Wand ID and magnitude of swish and flick + Cmatch_result_tResults from a data match + CMideaProtocolNative representation of a Midea A/C message + CMitsubishi112ProtocolNative representation of a Mitsubishi 112-bit A/C message + CMitsubishi136ProtocolNative representation of a Mitsubishi 136-bit A/C message + CMitsubishi144ProtocolNative representation of a Mitsubishi 144-bit A/C message + CMitsubishi152ProtocolNative representation of a Mitsubishi Heavy 152-bit A/C message + CMitsubishi88ProtocolNative representation of a Mitsubishi Heavy 88-bit A/C message + CNeoclimaProtocolNative representation of a Neoclima A/C message + CPanasonicAc32ProtocolNative representation of a Panasonic 32-bit A/C message + CSamsungProtocolNative representation of a Samsung A/C message + CSanyoProtocolNative representation of a Sanyo A/C message + CSharpProtocolNative representation of a Sharp A/C message + CTimerMsThis class offers a simple counter in milli-seconds since instantiated + CVoltasProtocolNative representation of a Voltas A/C message
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/bc_s.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/bc_s.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/bc_s.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/bc_s.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/bdwn.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/bdwn.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/bdwn.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/bdwn.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAirwellAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAirwellAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRAmcorAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRAmcorAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRArgoAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRArgoAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCarrierAc64__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCarrierAc64__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoolixAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoolixAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRCoronaAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRCoronaAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin128__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin128__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin152__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin152__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin160__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin160__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin176__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin176__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin216__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin216__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin2__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin2__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikin64__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikin64__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDaikinESP__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDaikinESP__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRDelonghiAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRDelonghiAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRElectraAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRElectraAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRFujitsuAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRFujitsuAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGoodweatherAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRGreeAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRGreeAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierACYRW02__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHaierAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHaierAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc1__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc1__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc344__inherit__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc3__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc3__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc424__inherit__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRHitachiAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRHitachiAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRKelvinatorAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRLgAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRLgAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMideaAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMideaAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi112__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi112__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishi136__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishi136__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy152Ac__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRMitsubishiHeavy88Ac__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc-members.html similarity index 67% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc-members.html index 620331bac..bae33a328 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc-members.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc-members.html @@ -68,36 +68,36 @@ $(function() {

This is the complete list of members for IRNeoclimaAc, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -117,10 +117,10 @@ $(function() { - + - +
_irsendIRNeoclimaAcprivate
begin(void)IRNeoclimaAc
calcChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)IRNeoclimaAcstatic
calibrate(void)IRNeoclimaAcinline
checksum(const uint16_t length=kNeoclimaStateLength)IRNeoclimaAcprivate
convertFan(const stdAc::fanspeed_t speed)IRNeoclimaAc
convertMode(const stdAc::opmode_t mode)IRNeoclimaAc
get8CHeat(void)IRNeoclimaAc
getButton(void)IRNeoclimaAc
getEcono(void)IRNeoclimaAc
getEye(void)IRNeoclimaAc
getFan(void)IRNeoclimaAc
getFollow(void)IRNeoclimaAc
getFresh(void)IRNeoclimaAc
getHold(void)IRNeoclimaAc
getIon(void)IRNeoclimaAc
getLight(void)IRNeoclimaAc
getMode(void)IRNeoclimaAc
getPower(void)IRNeoclimaAc
getRaw(void)IRNeoclimaAc
getSleep(void)IRNeoclimaAc
getSwingH(void)IRNeoclimaAc
getSwingV(void)IRNeoclimaAc
getTemp(void)IRNeoclimaAc
getTempUnits(void)IRNeoclimaAc
getTurbo(void)IRNeoclimaAc
IRNeoclimaAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRNeoclimaAcexplicit
off(void)IRNeoclimaAc
on(void)IRNeoclimaAc
remote_stateIRNeoclimaAcprivate
_IRNeoclimaAcprivate
_irsendIRNeoclimaAcprivate
begin(void)IRNeoclimaAc
calcChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)IRNeoclimaAcstatic
calibrate(void)IRNeoclimaAcinline
checksum(const uint16_t length=kNeoclimaStateLength)IRNeoclimaAcprivate
convertFan(const stdAc::fanspeed_t speed)IRNeoclimaAcstatic
convertMode(const stdAc::opmode_t mode)IRNeoclimaAcstatic
get8CHeat(void) constIRNeoclimaAc
getButton(void) constIRNeoclimaAc
getEcono(void) constIRNeoclimaAc
getEye(void) constIRNeoclimaAc
getFan(void) constIRNeoclimaAc
getFollow(void) constIRNeoclimaAc
getFresh(void) constIRNeoclimaAc
getHold(void) constIRNeoclimaAc
getIon(void) constIRNeoclimaAc
getLight(void) constIRNeoclimaAc
getMode(void) constIRNeoclimaAc
getPower(void) constIRNeoclimaAc
getRaw(void)IRNeoclimaAc
getSleep(void) constIRNeoclimaAc
getSwingH(void) constIRNeoclimaAc
getSwingV(void) constIRNeoclimaAc
getTemp(void) constIRNeoclimaAc
getTempUnits(void) constIRNeoclimaAc
getTurbo(void) constIRNeoclimaAc
IRNeoclimaAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRNeoclimaAcexplicit
off(void)IRNeoclimaAc
on(void)IRNeoclimaAc
send(const uint16_t repeat=kNeoclimaMinRepeat)IRNeoclimaAc
set8CHeat(const bool on)IRNeoclimaAc
setButton(const uint8_t button)IRNeoclimaAc
setTemp(const uint8_t temp, const bool celsius=true)IRNeoclimaAc
setTurbo(const bool on)IRNeoclimaAc
stateReset(void)IRNeoclimaAc
toCommon(void)IRNeoclimaAc
toCommon(void) constIRNeoclimaAc
toCommonFanSpeed(const uint8_t speed)IRNeoclimaAcstatic
toCommonMode(const uint8_t mode)IRNeoclimaAcstatic
toString(void)IRNeoclimaAc
toString(void) constIRNeoclimaAc
validChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)IRNeoclimaAcstatic
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc.html similarity index 85% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc.html index 92e8f1fda..3fb9dc099 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRNeoclimaAc.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc.html @@ -81,8 +81,9 @@ Collaboration diagram for IRNeoclimaAc:
Collaboration graph
- - + + +
[legend]
@@ -106,9 +107,9 @@ Public Member Functions - - - + + + @@ -118,117 +119,111 @@ Public Member Functions - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - - - - - - - - - - + + + + + +
void setButton (const uint8_t button)
 Set the Button/Command pressed setting of the A/C. More...
 
uint8_t getButton (void)
 Get the Button/Command setting of the A/C. More...
 
uint8_t getButton (void) const
 Get the Button/Command setting of the A/C. More...
 
void on (void)
 Set the requested power state of the A/C to on. More...
 
void setPower (const bool on)
 Change the power setting. More...
 
bool getPower (void)
 Get the value of the current power setting. More...
 
bool getPower (void) const
 Get the value of the current power setting. More...
 
void setMode (const uint8_t mode)
 Set the operating mode of the A/C. More...
 
uint8_t getMode (void)
 Get the operating mode setting of the A/C. More...
 
uint8_t getMode (void) const
 Get the operating mode setting of the A/C. More...
 
void setTemp (const uint8_t temp, const bool celsius=true)
 Set the temperature. More...
 
uint8_t getTemp (void)
 Get the current temperature setting. More...
 
uint8_t getTemp (void) const
 Get the current temperature setting. More...
 
void setFan (const uint8_t speed)
 Set the speed of the fan. More...
 
uint8_t getFan (void)
 Get the current fan speed setting. More...
 
uint8_t getFan (void) const
 Get the current fan speed setting. More...
 
void setSwingV (const bool on)
 Set the vertical swing setting of the A/C. More...
 
bool getSwingV (void)
 Get the vertical swing setting of the A/C. More...
 
bool getSwingV (void) const
 Get the vertical swing setting of the A/C. More...
 
void setSwingH (const bool on)
 Set the horizontal swing setting of the A/C. More...
 
bool getSwingH (void)
 Get the horizontal swing (Air Flow) setting of the A/C. More...
 
bool getSwingH (void) const
 Get the horizontal swing (Air Flow) setting of the A/C. More...
 
void setSleep (const bool on)
 Set the Sleep setting of the A/C. More...
 
bool getSleep (void)
 Get the Sleep setting of the A/C. More...
 
bool getSleep (void) const
 Get the Sleep setting of the A/C. More...
 
void setTurbo (const bool on)
 Set the Turbo setting of the A/C. More...
 
bool getTurbo (void)
 Get the Turbo setting of the A/C. More...
 
bool getTurbo (void) const
 Get the Turbo setting of the A/C. More...
 
void setEcono (const bool on)
 Set the Economy (Energy Saver) setting of the A/C. More...
 
bool getEcono (void)
 Get the Economy (Energy Saver) setting of the A/C. More...
 
bool getEcono (void) const
 Get the Economy (Energy Saver) setting of the A/C. More...
 
void setFresh (const bool on)
 Set the Fresh (air) setting of the A/C. More...
 
bool getFresh (void)
 Get the Fresh (air) setting of the A/C. More...
 
bool getFresh (void) const
 Get the Fresh (air) setting of the A/C. More...
 
void setHold (const bool on)
 Set the Hold setting of the A/C. More...
 
bool getHold (void)
 Get the Hold setting of the A/C. More...
 
bool getHold (void) const
 Get the Hold setting of the A/C. More...
 
void setIon (const bool on)
 Set the Ion (filter) setting of the A/C. More...
 
bool getIon (void)
 Get the Ion (filter) setting of the A/C. More...
 
bool getIon (void) const
 Get the Ion (filter) setting of the A/C. More...
 
void setLight (const bool on)
 Set the Light(LED display) setting of the A/C. More...
 
bool getLight (void)
 Get the Light (LED display) setting of the A/C. More...
 
bool getLight (void) const
 Get the Light (LED display) setting of the A/C. More...
 
void set8CHeat (const bool on)
 Set the 8°C Heat setting of the A/C. More...
 
bool get8CHeat (void)
 Get the 8°C Heat setting of the A/C. More...
 
bool get8CHeat (void) const
 Get the 8°C Heat setting of the A/C. More...
 
void setEye (const bool on)
 Set the Eye (Sensor) setting of the A/C. More...
 
bool getEye (void)
 Get the Eye (Sensor) setting of the A/C. More...
 
bool getTempUnits (void)
 Is the A/C unit using Fahrenheit or Celsius for temperature units. More...
 
bool getFollow (void)
 Get the Follow Me setting of the A/C. More...
 
bool getEye (void) const
 Get the Eye (Sensor) setting of the A/C. More...
 
bool getTempUnits (void) const
 Is the A/C unit using Fahrenheit or Celsius for temperature units. More...
 
bool getFollow (void) const
 Get the Follow Me setting of the A/C. More...
 
uint8_t * getRaw (void)
 Get a PTR to the internal state/code for this protocol. More...
 
void setRaw (const uint8_t new_code[], const uint16_t length=kNeoclimaStateLength)
 Set the internal state from a valid code for this protocol. More...
 
String toString (void)
 Convert the current internal state into a human readable string. More...
 
uint8_t convertMode (const stdAc::opmode_t mode)
 Convert a stdAc::opmode_t enum into its native mode. More...
 
uint8_t convertFan (const stdAc::fanspeed_t speed)
 Convert a stdAc::fanspeed_t enum into it's native speed. More...
 
stdAc::state_t toCommon (void)
 Convert the current internal state into its stdAc::state_t equivalent. More...
 
String toString (void) const
 Convert the current internal state into a human readable string. More...
 
stdAc::state_t toCommon (void) const
 Convert the current internal state into its stdAc::state_t equivalent. More...
 
@@ -238,6 +233,12 @@ Static Public Member Functions + + + + + + @@ -256,9 +257,8 @@ Private Attributes - - - + +

Static Public Member Functions

static uint8_t calcChecksum (const uint8_t state[], const uint16_t length=kNeoclimaStateLength)
 Calculate the checksum for a given state. More...
 
static uint8_t convertMode (const stdAc::opmode_t mode)
 Convert a stdAc::opmode_t enum into its native mode. More...
 
static uint8_t convertFan (const stdAc::fanspeed_t speed)
 Convert a stdAc::fanspeed_t enum into it's native speed. More...
 
static stdAc::opmode_t toCommonMode (const uint8_t mode)
 Convert a native mode into its stdAc equivalent. More...
 
IRsend _irsend
 Instance of the IR send class. More...
 
uint8_t remote_state [kNeoclimaStateLength]
 State of the remote in code. More...
 
NeoclimaProtocol _
 

Detailed Description

Class for handling detailed Neoclima A/C messages.

@@ -451,6 +451,9 @@ Private Attributes
+ + + + + +
@@ -460,6 +463,11 @@ Private Attributes
uint8_t IRNeoclimaAc::convertFan
+
+static

Convert a stdAc::fanspeed_t enum into it's native speed.

@@ -478,6 +486,9 @@ Private Attributes
+ + + + + +
@@ -487,6 +498,11 @@ Private Attributes
uint8_t IRNeoclimaAc::convertMode
+
+static

Convert a stdAc::opmode_t enum into its native mode.

@@ -500,8 +516,8 @@ Private Attributes
- -

◆ get8CHeat()

+ +

◆ get8CHeat()

@@ -511,7 +527,7 @@ Private Attributes ( void  ) - + const
@@ -521,8 +537,8 @@ Private Attributes
- -

◆ getButton()

+ +

◆ getButton()

@@ -532,7 +548,7 @@ Private Attributes ( void  ) - + const
@@ -542,8 +558,8 @@ Private Attributes
- -

◆ getEcono()

+ +

◆ getEcono()

@@ -553,7 +569,7 @@ Private Attributes ( void  ) - + const
@@ -563,8 +579,8 @@ Private Attributes
- -

◆ getEye()

+ +

◆ getEye()

@@ -574,7 +590,7 @@ Private Attributes ( void  ) - + const
@@ -584,8 +600,8 @@ Private Attributes
- -

◆ getFan()

+ +

◆ getFan()

@@ -595,7 +611,7 @@ Private Attributes ( void  ) - + const
@@ -605,8 +621,8 @@ Private Attributes
- -

◆ getFollow()

+ +

◆ getFollow()

@@ -616,7 +632,7 @@ Private Attributes ( void  ) - + const
@@ -626,8 +642,8 @@ Private Attributes
- -

◆ getFresh()

+ +

◆ getFresh()

@@ -637,7 +653,7 @@ Private Attributes ( void  ) - + const
@@ -647,8 +663,8 @@ Private Attributes
- -

◆ getHold()

+ +

◆ getHold()

@@ -658,7 +674,7 @@ Private Attributes ( void  ) - + const
@@ -668,8 +684,8 @@ Private Attributes
- -

◆ getIon()

+ +

◆ getIon()

@@ -679,7 +695,7 @@ Private Attributes ( void  ) - + const
@@ -689,8 +705,8 @@ Private Attributes
- -

◆ getLight()

+ +

◆ getLight()

@@ -700,7 +716,7 @@ Private Attributes ( void  ) - + const
@@ -710,8 +726,8 @@ Private Attributes
- -

◆ getMode()

+ +

◆ getMode()

@@ -721,7 +737,7 @@ Private Attributes ( void  ) - + const
@@ -731,8 +747,8 @@ Private Attributes
- -

◆ getPower()

+ +

◆ getPower()

@@ -742,7 +758,7 @@ Private Attributes ( void  ) - + const
@@ -773,8 +789,8 @@ Private Attributes
- -

◆ getSleep()

+ +

◆ getSleep()

@@ -784,7 +800,7 @@ Private Attributes ( void  ) - + const
@@ -794,8 +810,8 @@ Private Attributes
- -

◆ getSwingH()

+ +

◆ getSwingH()

@@ -805,7 +821,7 @@ Private Attributes ( void  ) - + const
@@ -815,8 +831,8 @@ Private Attributes
- -

◆ getSwingV()

+ +

◆ getSwingV()

@@ -826,7 +842,7 @@ Private Attributes ( void  ) - + const
@@ -836,8 +852,8 @@ Private Attributes
- -

◆ getTemp()

+ +

◆ getTemp()

@@ -847,19 +863,19 @@ Private Attributes ( void  ) - + const

Get the current temperature setting.

Returns
The current setting for temp. in degrees.
-
Note
The units of the temperature (F/C) is determined by getTempUnits().
+
Note
The units of the temperature (F/C) is determined by getTempUnits().
- -

◆ getTempUnits()

+ +

◆ getTempUnits()

@@ -869,7 +885,7 @@ Private Attributes ( void  ) - + const
@@ -879,8 +895,8 @@ Private Attributes
- -

◆ getTurbo()

+ +

◆ getTurbo()

@@ -890,7 +906,7 @@ Private Attributes ( void  ) - + const
@@ -1451,8 +1467,8 @@ Private Attributes
- -

◆ toCommon()

+ +

◆ toCommon()

@@ -1462,7 +1478,7 @@ Private Attributes ( void  ) - + const
@@ -1542,8 +1558,8 @@ Private Attributes
- -

◆ toString()

+ +

◆ toString()

@@ -1553,7 +1569,7 @@ Private Attributes ( void  ) - + const
@@ -1610,6 +1626,28 @@ Private Attributes

Member Data Documentation

+ +

◆ _

+ +
+
+ + + + + +
+ + + + +
NeoclimaProtocol IRNeoclimaAc::_
+
+private
+
+ +
+

◆ _irsend

@@ -1632,30 +1670,6 @@ Private Attributes

Instance of the IR send class.

-
-
- -

◆ remote_state

- -
-
- - - - - -
- - - - -
uint8_t IRNeoclimaAc::remote_state[kNeoclimaStateLength]
-
-private
-
- -

State of the remote in code.

-

The documentation for this class was generated from the following files:
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map new file mode 100644 index 000000000..a8676504a --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 new file mode 100644 index 000000000..ad1215eec --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.md5 @@ -0,0 +1 @@ +517a172da896e5faddd77763fd613da1 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRNeoclimaAc__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..997fe24ff0cb23254b0d18e95a2317c3a5525f05 GIT binary patch literal 6475 zcmZ8m1yq#V+D1Hrq^JnerGPX@w@P<6Bi$)ELkb*`Mn;+e$&naRLaC#abc2X=3_X$q z2+Y5^|GI14dzl5ZX3fXm-`?-LpZa2Sw3Nw+X^HXh@W@nE6!gG52Kr z$&-~+e9v5|hliXd-HKkswq?Lc!8S#Zwoc=|SlTsu@LDR;L+Kj^M z#!UX7mN4-XDPCsIxlgyyhtiiLmWIf!fY@_C-Vm)+)+h>RGz>(N(IV9z8fT z3q|N{h9%^+2}R@J?L;CueL#TpWoE>}U}ahHHLIHMunhX(S}4 z7oeMO^n7`BKHdKFQAttJBS_%Vt#ZB~jpW??y}hkZc4jzZzkT*WYjjMb%$2RIn9WdWUn2>9)(2?Dn^IEl6%-Z{ z-M;=uV*9MwI0HW#r`zPn7EKA02h}_s1<T`wEoop~w@5R|6jdY+uWo4!B_EZ9#L%SAs>~e8&;WXR8+m5@$ z2+}5$2;IGV7i_FjA&Y=O@{b=TTid9z@y)=M1hFRQVM*!!^Wj_>(^@;CjyGf-gM$eu z^Tzr5L@*S)ghZxeUI>+PJyyhDACE9sfYHGyFiS$cj#p=GhKT`#5yE889#N2;&mKm0R@9(!g zKibsD79Bhq&J}jP=l=5(i-<_-TysGA`N&5;@X>m$FSWC?Q%6rv4=qfF>HuA-XJF8Y zT?iX)TnJV7_ZJ;6(R`YkC+be?IFw_JnQyhTvl~HbGu^v?pN?Ur(z4m4*`F5*g_1rL z2uJ3^Vqb=y{axoce6ZWNP#c8xsN4z1a7qh6zcBt-e2!(#51Na#hNVCcnZ5SLFC-d!f9g^kVVJ4}3OJf^Ji zN`)KKRe5h?V(vb_JqlL6KV|Mo#6k;+c6N5gr=X#sDcMI4A?}Aa1)tS^@9Vo4uA-`1 z`t;4!<)66Y?dj=165`?}Ete;=CBrc>G0$}=b@lXYXio;74!@PV+|)jvIz$A_--WYl z3YBAb-77wRRB1UHQ~x$NsJXhfmYGIFN9UT=mM=LEaikOTaP!S+`$9&!du+lcKsr6?dYiN z?Jby@nOSlc1cPPGOG!!H)PX>>w6w_0P*ZNfIy%YqWzJ7y3#!4k8C5|NAXQ>?(<71t zLqpy3^SN3G$;>`!Fz7$1hFvhqkC_<}=T>N7V8(o-^Ed%DH8m*4O!dLRt8p~Iu+ioK zPYX*+UCO^VHa5)M+ZLc`21>>J7t!Q7($EzCwo`n5e*W>mu&}W4KX0~7(n~7R|CmDb zO)slwIyxeon#9M(#!gRHk~BNm*x1g{a=6}7edKL2GW+kzEbmiO?@~~ND;4HfS5vS= z&2S3|)qY(&J3G@gGjs80VUv-W4?7b86{Gy^L z0E^FGycq1}jl9Q8RUp@a*jCbIRX(bZ=>C z>Gbq;5rffIQ21+D21_r8yLhUos95o`Jr^89lVb8l92S(OYjpG-Sjtp|>39)T)Ib@J ziHT__SH|@`#i0~xR3aQ(ux2TV-bs;WfKo;_1gP!I??_jNTIEMW{i zwZ8ftEjRI{Y-U6P7XS^FuzPbfvccj2Fs|`2Ihmq- zA|KSLOetSEl+JmY1Owu*|? zSdr>6q{LIxBcQ9+0jr{@3jihE62BNW3FvhF-M^XC?m#U?t#>u`QEJM6lDpm0Z=7L? zZm}@W%dF(&ksR+|bon~aF$QFhXE@?mG(0DV9uPr=C~meQ#B+l%F}!cJ;m02%EA+Tm z`RA$1`Q6_`xx|e@4`eo~(2}j}Y5uc(l9B;6Td%STjdfjN63!N#aj!jN?!XWfC$WWt zE4uyVmAlnOB;55XxGhQCxjsQG;@e7{4^_&T(^e7$NZW|@(@dRhLo*R zQ7D7u?r-9$2!g1)#9@54f1>i5s`cmRk6*JcMr&7k{azC;Yv@Cs)oe`X8y}U*7Dm4k=#4KPv8B&*1u9TeXs*t$DdiCoZiYWIrJ;gY=(tx zB-5%+_Ld*|d_%q1m2K;$eYU1~lMs#ce#8#n60&6|e(c&SsnR|cnM7MNg=ik7St!UbikN_ipNSHd1){(QmIa+)Rz5NoxTqZcEDUAPi% zzu09G@<3qvUO1@hgdCjT8MXdciJRste5PZhGdQ35Bxhj^<~ic-{y@y-2iArdExLxo zz2w+tj>oUEg4XoiGstU!e69S^EUZIzW4_gL^TM}zov7@ABn~Q@4p(>jI2jHfN^D@D z3y@;l+yfWW2HnDO%ofyCg=|#R=<5g*w>q2)EPJ+pD{hS>V|8OVAKH@d#D)AdO`hnq zv*p24=tS8P)EwcaZhN;(8xkJ=)!h~G(s}0ry@iNEMOc)qt}G{SLCGD_JlV?lg%eJh zJgicUzDr0x7wzxO$NWa7YH>e`q-0AYaZQf=#HTX(g(U+j^O@NVBoz;81I9+|4T3DL z`WX@J@R{_I8l~@XhEx-*DbuQsNj+7TI(R{jWcf9(NnhUYT=5A}y%I?0cH9n?PqVv) zpNMLTikwOm%x)I2YGXRl$}-n>_tFXc7#D|Pa}zXEIQWK|GGa_}reRu0_)u+5UGhcy zxD!Lf5QBq1GgRG%(U+huTIwh+d$UP{c=7&-`b&#;!DE`gEQyVfCB1YVoj9(`^?hkD zTfU){+C@PBDa(vnovU)X+V)^L5bL|vzHs}Kt}p6^bEwEH$CW~(H>0#{;|tXOithF_IkbVq8sm z*`b(j&+tUX;lTYtx|!P952+TX1<5%@Hg7Iwn524)YD{M=%AFamPIJheLg+_ey$dj2 z&4)`ps9U}`RJxnYWW3pcM3tTSq&-w^>0Z3W zzox8J#$;TNd$TXB`EX`A&omYL+YPlK5XRU79g`nXQf|cJ$CbGS6~z6w*yqy0|8=DK z6)c;PaTuXZg6D4%kTUb}4J{wm7v}{~zVg?X1r6%PpjJNZLhC%CyuJ3%;=`~uv*bj~ ziU(EetdgEyO4s@^Gv`q0>Z+8)QLvF{cOb>5a~XblBt-xt1D2x42vYFKSTwI9Zj@QY zB1P34Cwi2-X}j(9$nGGE)M7EZypb(NFq10iXcZAX2w23fH{~%YohT`A1q~i^eP8^x zZVWpgFD@=GyL#aqiq6iZZxa$806L-_62P z(9%l0o+JEvGUp2*k@h5@2?Q(+ny0!u*}#0(jCK_{jBN3n%#{KVE+1L|KS#2_Y4Dmi zRC_HwCnh1;94#aSUhFSILioFPH^Qr`JW)_P2ZyoNpa48+85zwE1Ojn`lb>I?YPxXJ zWw4v@)~z|8mRN%4HaERJ9QiTlr{V8Z<>Lb! zn0(=Aa$cS`Fm@QIL}+Lz@JK0nd7f&EM@L70Vn1K94PgznYWbjF``)yjZ*fCHjt%wn z^-C)&yR8I(%1j(}>RedJ(=Aj2Qiqfe(xPH&N&_q*kPLzbMn+}xZ{CnI#5Ole0jcrHbvjYRbt*YIIlO!uwV(scj>2@MCDENb zJ>%nWU?hdW_&GVW*v{9dr-5o}YPX4rSwRwcbfFy7?m23QN+iqtEj2(wTY(u@>+->-+jUtjehT_X8~pb#7z7W&EPc zLt4em)cE;dhU}HZy)vHM#yR>iLsj0q4Ml`;*AVsuTJh+=Vh;@n$z3J!_Q!dB%Y=ua z-G*Xh4dl;i1u|Qx^bBnlch{p9i+2XsQ3o}T2!=I}9h&kdwx@Q~8_deJR4glz5kj;I zQSJ95aXsxz_$g&zu?Cwx8q0SJKR>9(v>o= zhAr~?_YMf7HzM;N2WsnWUdH9>`BD%r-gq(DGoU18UR|}1^{mj9rc8Br* z(ZAaCKhYmVHZJT=?*eMy(<=MP;juq@^g}X=y|mY#ATlBZSz9u^UBErL$tNCNit$JT zro?XXpVy!(Ck+DX&xVxk$~2Q2UYypPiW698&MUVKJ=^FX=Mkz}7Y5E1q(u(f0tT9X zL6GqFi#2|L%maX7u+E!f#SP^7il8I@N8^Ub4`zwPwFY5-N|J8gV22w&wi8khaM|x| zb{b`!55maQ4YRPYL`6kWP*HUs4$BP#JaS1TA|hHk+8lT2C@d%d652DZ33K$7kV)Xx z>URgzsrA9^>kAgYMh@0WZ(e;mT}Aabd9SEwXsj~fP6^qR6YW6I0IX<+X5skeDe$F& zwC(|7q~;XQt34NFmEs?MO@A5cyzN!gth0t`Nn2iB?aUCg4a8kyRkgJ_1O!He`FMEZ z3zd^4R(g{3_4K|~TX$s01c`zGq_n=mw9Y~B)vAg<4}Z&Ve6TO;-~J{k zDk@rBTkGPkYPpW4el)n#0iPE2=8aI;Rj__X8bBua`}a`=oPkiNpiSrP&_A;aSt7v_ zep{3t9v&?h2mKnk(wXt`q;wXV~AzykvYbXcKhV91p4VW$&y z`_R&|m)+ZXb-oSqi>XRW_26ZZA|K29+)?{U5^-yoeM}v!~v5#kohzkc&9Otg8>4R2fheQvRIfTyL`I8LN5cG z;F<62R3K-N>~yVa?S6feP(1jwdPX_`Gd~Ct%j(8P$D@tWote5Gw_ttSG#;cOJ0_7q zN(0>z29^m}vTJy_YRVVHZ@~4{`fX2{tq>Cvi~H|91ldDpPY)qT0wBTribpURkdUmd zuOD>WkrVKom;Tx4nS?}g0PDK8+6%X6g{6WhFp)`a2yF9nd3ijLumQLDOFw9##R{y!ge3&mkaoT;gedsw%ajK}@XsnLTg-3hippmbvOU5AS+k}BN zH8*F^OG!$ChPCrQ-2$>lO*$O3`)@#sKYs@D<>2rTM45ldS54nsTv~el)#@K7;a6t|_WF9};~;-BZ3~v@Pvb2F zg%y{QsHk;a}?Nu5wisCqojg8qg zvpT`KE-fu>Mrs=vP=ZiQbl3d`5EC>YpC~s%v2t)k_w}jqSv1LmGtiGxc73D;g+eXX$%EE$|x=}@}}J75!|#Y z7nuAT8ISqoy}SfAH#dP`6AKy`o2x%x{o5R!n3|fp0|p%0Z)hK`AiUCxhYwAo+oDmhS3@#P+VswMuUJHXk%z`*ZUEt-$8{|mMM8z+Eg1^;4FL(#G13GI2`)=h(H!LLS* z`R{njfdB^dd2G;#PJOgV1s(eDM+`E|{Aa2u#Fug-kKca0G^R)bPe<@n6}1#9pIb%z EAASuK^8f$< literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRPanasonicAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRPanasonicAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRPanasonicAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRPanasonicAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32-members.html new file mode 100644 index 000000000..c749fd871 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32-members.html @@ -0,0 +1,108 @@ + + + + + + + +IRremoteESP8266: Member List + + + + + + + + + +
    +
    + + + + + + +
    +
    IRremoteESP8266 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +
    IRPanasonicAc32 Member List
    +
    +
    + +

    This is the complete list of members for IRPanasonicAc32, including all inherited members.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    _IRPanasonicAc32private
    _irsendIRPanasonicAc32private
    begin(void)IRPanasonicAc32
    calibrate(void)IRPanasonicAc32inline
    convertFan(const stdAc::fanspeed_t speed)IRPanasonicAc32static
    convertMode(const stdAc::opmode_t mode)IRPanasonicAc32static
    convertSwingV(const stdAc::swingv_t position)IRPanasonicAc32static
    getFan(void) constIRPanasonicAc32
    getMode(void) constIRPanasonicAc32
    getPowerToggle(void) constIRPanasonicAc32
    getRaw(void) constIRPanasonicAc32
    getSwingHorizontal(void) constIRPanasonicAc32
    getSwingVertical(void) constIRPanasonicAc32
    getTemp(void) constIRPanasonicAc32
    IRPanasonicAc32(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRPanasonicAc32explicit
    send(const uint16_t repeat=kPanasonicAcDefaultRepeat)IRPanasonicAc32
    setFan(const uint8_t fan)IRPanasonicAc32
    setMode(const uint8_t mode)IRPanasonicAc32
    setPowerToggle(const bool on)IRPanasonicAc32
    setRaw(const uint32_t state)IRPanasonicAc32
    setSwingHorizontal(const bool on)IRPanasonicAc32
    setSwingVertical(const uint8_t pos)IRPanasonicAc32
    setTemp(const uint8_t temp)IRPanasonicAc32
    stateReset(void)IRPanasonicAc32
    toCommon(const stdAc::state_t *prev=NULL) constIRPanasonicAc32
    toCommonFanSpeed(const uint8_t speed)IRPanasonicAc32static
    toCommonMode(const uint8_t mode)IRPanasonicAc32static
    toCommonSwingV(const uint8_t pos)IRPanasonicAc32static
    toString(void) constIRPanasonicAc32
    + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32.html new file mode 100644 index 000000000..613456222 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32.html @@ -0,0 +1,986 @@ + + + + + + + +IRremoteESP8266: IRPanasonicAc32 Class Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    IRremoteESP8266 +
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    + +
    + +

    Class for handling detailed Panasonic 32bit A/C messages. + More...

    + +

    #include <ir_Panasonic.h>

    +
    +Collaboration diagram for IRPanasonicAc32:
    +
    +
    Collaboration graph
    + + + + + +
    [legend]
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    +Public Member Functions

     IRPanasonicAc32 (const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
     Class constructor. More...
     
    void stateReset (void)
     Reset the state of the remote to a known good state/sequence. More...
     
    void send (const uint16_t repeat=kPanasonicAcDefaultRepeat)
     Send the current internal state as IR messages. More...
     
    int8_t calibrate (void)
     Run the calibration to calculate uSec timing offsets for this platform. More...
     
    void begin (void)
     Set up hardware to be able to send a message. More...
     
    void setPowerToggle (const bool on)
     Set the Power Toggle setting of the A/C. More...
     
    bool getPowerToggle (void) const
     Get the Power Toggle setting of the A/C. More...
     
    void setTemp (const uint8_t temp)
     Set the desired temperature. More...
     
    uint8_t getTemp (void) const
     Get the current desired temperature setting. More...
     
    void setFan (const uint8_t fan)
     Set the speed of the fan. More...
     
    uint8_t getFan (void) const
     Get the current fan speed setting. More...
     
    void setMode (const uint8_t mode)
     Set the operating mode of the A/C. More...
     
    uint8_t getMode (void) const
     Get the operating mode setting of the A/C. More...
     
    void setRaw (const uint32_t state)
     Set the internal state from a valid code for this protocol. More...
     
    uint32_t getRaw (void) const
     Get a copy of the internal state/code for this protocol. More...
     
    void setSwingVertical (const uint8_t pos)
     Control the vertical swing setting. More...
     
    uint8_t getSwingVertical (void) const
     Get the current vertical swing setting. More...
     
    void setSwingHorizontal (const bool on)
     Control the horizontal swing setting. More...
     
    bool getSwingHorizontal (void) const
     Get the current horizontal swing setting. More...
     
    stdAc::state_t toCommon (const stdAc::state_t *prev=NULL) const
     Convert the current internal state into its stdAc::state_t equivalent. More...
     
    String toString (void) const
     Convert the current internal state into a human readable string. More...
     
    + + + + + + + + + + + + + + + + + + + +

    +Static Public Member Functions

    static uint8_t convertMode (const stdAc::opmode_t mode)
     Convert a stdAc::opmode_t enum into its native mode. More...
     
    static uint8_t convertFan (const stdAc::fanspeed_t speed)
     Convert a stdAc::fanspeed_t enum into it's native speed. More...
     
    static uint8_t convertSwingV (const stdAc::swingv_t position)
     Convert a standard A/C vertical swing into its native setting. More...
     
    static stdAc::opmode_t toCommonMode (const uint8_t mode)
     Convert a native mode into its stdAc equivalent. More...
     
    static stdAc::fanspeed_t toCommonFanSpeed (const uint8_t speed)
     Convert a native fan speed into its stdAc equivalent. More...
     
    static stdAc::swingv_t toCommonSwingV (const uint8_t pos)
     Convert a native vertical swing postion to it's common equivalent. More...
     
    + + + + + + + +

    +Private Attributes

    IRsend _irsend
     Instance of the IR send class. More...
     
    PanasonicAc32Protocol _
     The state in code form. More...
     
    +

    Detailed Description

    +

    Class for handling detailed Panasonic 32bit A/C messages.

    +

    Constructor & Destructor Documentation

    + +

    ◆ IRPanasonicAc32()

    + +
    +
    + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + +
    IRPanasonicAc32::IRPanasonicAc32 (const uint16_t pin,
    const bool inverted = false,
    const bool use_modulation = true 
    )
    +
    +explicit
    +
    + +

    Class constructor.

    +
    Parameters
    + + + + +
    [in]pinGPIO to be used when sending.
    [in]invertedIs the output signal to be inverted?
    [in]use_modulationIs frequency modulation to be used?
    +
    +
    + +
    +
    +

    Member Function Documentation

    + +

    ◆ begin()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::begin (void )
    +
    + +

    Set up hardware to be able to send a message.

    + +
    +
    + +

    ◆ calibrate()

    + +
    +
    + + + + + +
    + + + + + + + + +
    int8_t IRPanasonicAc32::calibrate (void )
    +
    +inline
    +
    + +

    Run the calibration to calculate uSec timing offsets for this platform.

    +
    Returns
    The uSec timing offset needed per modulation of the IR Led.
    +
    Note
    This will produce a 65ms IR signal pulse at 38kHz. Only ever needs to be run once per object instantiation, if at all.
    + +
    +
    + +

    ◆ convertFan()

    + +
    +
    + + + + + +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::convertFan (const stdAc::fanspeed_t speed)
    +
    +static
    +
    + +

    Convert a stdAc::fanspeed_t enum into it's native speed.

    +
    Parameters
    + + +
    [in]speedThe enum to be converted.
    +
    +
    +
    Returns
    The native equivalent of the enum.
    + +
    +
    + +

    ◆ convertMode()

    + +
    +
    + + + + + +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::convertMode (const stdAc::opmode_t mode)
    +
    +static
    +
    + +

    Convert a stdAc::opmode_t enum into its native mode.

    +
    Parameters
    + + +
    [in]modeThe enum to be converted.
    +
    +
    +
    Returns
    The native equivalent of the enum.
    + +
    +
    + +

    ◆ convertSwingV()

    + +
    +
    + + + + + +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::convertSwingV (const stdAc::swingv_t position)
    +
    +static
    +
    + +

    Convert a standard A/C vertical swing into its native setting.

    +
    Parameters
    + + +
    [in]positionA stdAc::swingv_t position to convert.
    +
    +
    +
    Returns
    The equivalent native horizontal swing position.
    + +
    +
    + +

    ◆ getFan()

    + +
    +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::getFan (void ) const
    +
    + +

    Get the current fan speed setting.

    +
    Returns
    The current fan speed.
    + +
    +
    + +

    ◆ getMode()

    + +
    +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::getMode (void ) const
    +
    + +

    Get the operating mode setting of the A/C.

    +
    Returns
    The current operating mode setting.
    + +
    +
    + +

    ◆ getPowerToggle()

    + +
    +
    + + + + + + + + +
    bool IRPanasonicAc32::getPowerToggle (void ) const
    +
    + +

    Get the Power Toggle setting of the A/C.

    +
    Returns
    true, the setting is on. false, the setting is off.
    + +
    +
    + +

    ◆ getRaw()

    + +
    +
    + + + + + + + + +
    uint32_t IRPanasonicAc32::getRaw (void ) const
    +
    + +

    Get a copy of the internal state/code for this protocol.

    +
    Returns
    The code for this protocol based on the current internal state.
    + +
    +
    + +

    ◆ getSwingHorizontal()

    + +
    +
    + + + + + + + + +
    bool IRPanasonicAc32::getSwingHorizontal (void ) const
    +
    + +

    Get the current horizontal swing setting.

    +
    Returns
    The current position it is set to.
    + +
    +
    + +

    ◆ getSwingVertical()

    + +
    +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::getSwingVertical (void ) const
    +
    + +

    Get the current vertical swing setting.

    +
    Returns
    The current position it is set to.
    + +
    +
    + +

    ◆ getTemp()

    + +
    +
    + + + + + + + + +
    uint8_t IRPanasonicAc32::getTemp (void ) const
    +
    + +

    Get the current desired temperature setting.

    +
    Returns
    The current setting for temp. in degrees celsius.
    + +
    +
    + +

    ◆ send()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::send (const uint16_t repeat = kPanasonicAcDefaultRepeat)
    +
    + +

    Send the current internal state as IR messages.

    +
    Parameters
    + + +
    [in]repeatNr. of times the message will be repeated.
    +
    +
    + +
    +
    + +

    ◆ setFan()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setFan (const uint8_t speed)
    +
    + +

    Set the speed of the fan.

    +
    Parameters
    + + +
    [in]speedThe desired setting.
    +
    +
    + +
    +
    + +

    ◆ setMode()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setMode (const uint8_t mode)
    +
    + +

    Set the operating mode of the A/C.

    +
    Parameters
    + + +
    [in]modeThe desired operating mode.
    +
    +
    +
    Note
    If we get an unexpected mode, default to AUTO.
    + +
    +
    + +

    ◆ setPowerToggle()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setPowerToggle (const bool on)
    +
    + +

    Set the Power Toggle setting of the A/C.

    +
    Parameters
    + + +
    [in]ontrue, the setting is on. false, the setting is off.
    +
    +
    + +
    +
    + +

    ◆ setRaw()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setRaw (const uint32_t state)
    +
    + +

    Set the internal state from a valid code for this protocol.

    +
    Parameters
    + + +
    [in]stateA valid code for this protocol.
    +
    +
    + +
    +
    + +

    ◆ setSwingHorizontal()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setSwingHorizontal (const bool on)
    +
    + +

    Control the horizontal swing setting.

    +
    Parameters
    + + +
    [in]ontrue, the setting is on. false, the setting is off.
    +
    +
    + +
    +
    + +

    ◆ setSwingVertical()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setSwingVertical (const uint8_t pos)
    +
    + +

    Control the vertical swing setting.

    +
    Parameters
    + + +
    [in]posThe position to set the vertical swing to.
    +
    +
    + +
    +
    + +

    ◆ setTemp()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::setTemp (const uint8_t degrees)
    +
    + +

    Set the desired temperature.

    +
    Parameters
    + + +
    [in]degreesThe temperature in degrees celsius.
    +
    +
    + +
    +
    + +

    ◆ stateReset()

    + +
    +
    + + + + + + + + +
    void IRPanasonicAc32::stateReset (void )
    +
    + +

    Reset the state of the remote to a known good state/sequence.

    + +
    +
    + +

    ◆ toCommon()

    + +
    +
    + + + + + + + + +
    stdAc::state_t IRPanasonicAc32::toCommon (const stdAc::state_tprev = NULL) const
    +
    + +

    Convert the current internal state into its stdAc::state_t equivalent.

    +
    Parameters
    + + +
    [in]prevPtr to the previous state if required.
    +
    +
    +
    Returns
    The stdAc equivalent of the native settings.
    + +
    +
    + +

    ◆ toCommonFanSpeed()

    + +
    +
    + + + + + +
    + + + + + + + + +
    stdAc::fanspeed_t IRPanasonicAc32::toCommonFanSpeed (const uint8_t spd)
    +
    +static
    +
    + +

    Convert a native fan speed into its stdAc equivalent.

    +
    Parameters
    + + +
    [in]spdThe native setting to be converted.
    +
    +
    +
    Returns
    The stdAc equivalent of the native setting.
    + +
    +
    + +

    ◆ toCommonMode()

    + +
    +
    + + + + + +
    + + + + + + + + +
    stdAc::opmode_t IRPanasonicAc32::toCommonMode (const uint8_t mode)
    +
    +static
    +
    + +

    Convert a native mode into its stdAc equivalent.

    +
    Parameters
    + + +
    [in]modeThe native setting to be converted.
    +
    +
    +
    Returns
    The stdAc equivalent of the native setting.
    + +
    +
    + +

    ◆ toCommonSwingV()

    + +
    +
    + + + + + +
    + + + + + + + + +
    stdAc::swingv_t IRPanasonicAc32::toCommonSwingV (const uint8_t pos)
    +
    +static
    +
    + +

    Convert a native vertical swing postion to it's common equivalent.

    +
    Parameters
    + + +
    [in]posA native position to convert.
    +
    +
    +
    Returns
    The common vertical swing position.
    + +
    +
    + +

    ◆ toString()

    + +
    +
    + + + + + + + + +
    String IRPanasonicAc32::toString (void ) const
    +
    + +

    Convert the current internal state into a human readable string.

    +
    Returns
    A human readable string.
    + +
    +
    +

    Member Data Documentation

    + +

    ◆ _

    + +
    +
    + + + + + +
    + + + + +
    PanasonicAc32Protocol IRPanasonicAc32::_
    +
    +private
    +
    + +

    The state in code form.

    + +
    +
    + +

    ◆ _irsend

    + +
    +
    + + + + + +
    + + + + +
    IRsend IRPanasonicAc32::_irsend
    +
    +private
    +
    + +

    Instance of the IR send class.

    + +
    +
    +
    The documentation for this class was generated from the following files: +
    + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.map new file mode 100644 index 000000000..4eb627bca --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.md5 new file mode 100644 index 000000000..6b690dd06 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.md5 @@ -0,0 +1 @@ +6a8392d4410e2fd36aa5d55e0aa4f27a \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRPanasonicAc32__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..f2793c0a59d26bad84a49fc4cb45f9ad603d758a GIT binary patch literal 7290 zcma)>WmJ^W+wKPoL`ew&0TB>{0i+w0M!KaH=@98=q@<;!89JmTh7OVL7#itr8HTQR z^PcnJtoQ$ZIK!G@)|zML+56u2zVGY$?OK zN#P0j_rOR_S^{!&`_n2a%Z_f}C8FuF{@)?(W=0yDnr1R$ z*VfkNDoRG{`1{<&BqSytGv7soioHO1hF^8WC23_5MW?4fH}F1NC2wX9@y%qMoSYo0 zcd@Oqo*H>tXn9f)QQX)l?1zcBHd*#5SFzWeK{4gST3;egNN`Zl8xG85x6cDFqf57h8(7D;SxWMh0y|Y=)X)Fp-NL z&aCOzIWK2uAL8LjW4-tEhZBa0WVCL=Q5f+AfU!Ajm{>xWhQK10W ztQgsJw4VIsv!3elT}k9D`)!%kM9FF}L+S!*wKqk?D`{!TC|40)kVZ{F(865WAZBUF zgo#JBGGp6J4}}&fg~(`}la=$JTFlYkg!_ z4d93Vw6-1`A9oB7M@2^BtE#G^4=>Q0txN5pWZafSxVX6JjbT3!o2_*-V`F?mLSH|> zyN&KgFIZVi^6M=K!37Oh$1{4(-tgtlh$rClOvaz;OrBm|Aa?2JYA?1Zs?V3Ur%k7( zri6}0)oSYMMrs|*Qr*_bP=|*&1}DXVJd%=<{(*tZ+uNZrF;CbU{@tOcr$0Z##C`UA zYAP{8x3v(X( zt7q$J>-GChoaPjNceXPnL$Mw|ZkwA+wVA0J;}-#6SVeClFE^E7Vk$%raG#kEC5(@C zo*Pl<#*jvjjHrrS{u3vX%z)ioL-gt#gU=4vE8GrEQ7F{u#r(~{c(Lvg`|aw1g?J|H z{)1VoWT?VS>2^?xc}TWHaPJEH)ps16oQWb{0?1qiWbfPjD$VUIX4)TpGSo=OYkV-TiX zh2)MzPP55sTWVQZS@iZq1g-S6RBR1CWA zlyzECPJj(KoTrqgvp(OQm*(9QLd?v_$oOGvG~em_V3p0x#zZOg@bEAe4IkK{$~Pb! z(&AOpS%lR=!NCMB33_?#pE`p6{rgAWeD^#)CnpDtzSP^>$SCs{0zte!0Ix4D9vxN3 z2tuPBuegdenV&s-hVI3@cP~hzP;+w~JRZHt&dGTgE=3E8ijB=lgPs2Sh!K>MlJell zY9w3M2t08@EEwOkwY5EM@H{GGg+htg8qv|es;fy86BDah>fMhl*-d(guJ)b6XW;4) zrB=!GbaYs6=;-M;^WdT|1IW_WSmA?WkKbQ0jIPd)#IR^U9^ZS;YS`r2*)W1cN=}sM zgCq;U7Yq9PS8q5+j#NcQ$5OcgUra(;dV4;t(c`4V>G61xHf;(V9w3!9tW;=AaSzM@ zJRXEAHG5x4I679gusaWV?|=Kbdo{hXE(3P!LmV8F&5;~)gboDc{8XJ2b7|8# z)78bv`jlB3y@&|a*X(RMh>(yFnxV3l5m;T)|-VvKX=T>l_zXx?^^x5upQc!6y_Hy?611zQW;@A({A8RNgaQLWpn* zWiwCx87Mb5v4ewyr>7^{#$|s_Uvx0iNh>}jB`h&fyLiT?^&1W-!$uYs!I_MXJCjj` zTBU?fo_tak`W;5bIkf4h*XSObAs)zK+=c&6PRVSqs%cU0n|gIvqQsLG;Q|E2#FAoScPMzQhm`O@ByO&+F40J(FmmpY#nwPI z9i5QsYF?(;5D;~Ld~Sn`jEtj_K_oIJIy#!1p$Uv4IomeZzCwnSl+GFc6c*ta(1goZOb+tUbU4Gj&wT6@XnBB?BlbWj;__R=CE z@N|mf{QdoB);1jlGBY!4zATD`pLBqEp#yoH+O_f+vG?}&pn5ftKYkE-4M1!gk4Ts` zix#?~XwkbfCsmVzHh#J@P2G_PD*2Yzuf}gDO5x%0G*i2T*3Qw<`1YAFFW0tR&nZ@&vi>s^cHFnDh?4KUQv+8G7R{ltXT_+wacdCI(wO@C6 zdHIyX7|UU;kA{IEu&qsk1p0pHaU)l8^72H6I3|>Zg&%CbsHmuL62l3e?eSuY)<8V7 z_RrlzdA{$yTC!w=4_jJVs#$C;EV_THWTC0=PmtJ} zns$KF>3YykYUk{1I+XsFh?v-JrHi1bsECo3)wDf?7$nhs7z}o`h(I8Y^iS?@QKwB9 zc!ZZWUy~zrif=}9n-Zqa&1I}Vsa-qVk+i)y-jz?}$QiHL-0kk~#Nt||B_@)jdHGUG zMCy$tv86|IkK78qEJqTQE}D)^frL;tI_%}6U^-c;n1KH&ToB%r?Z>+_$(#}Os&?ZT zk8TKwC~RUX)8gX3<>i^hRO;)i!CVxRU!*TtV?wXLP`2x6-JnztYmQi(l3i}9zD)#u zk7?Wbnq?%BCo7ioGs&2;-|nQ;lk9lQ)T8-yhPo=)?WBm?jdl0TDX$)8TVIage#JIY z?uO=f)VO0N%H2xhvFP4hoR5qqp9;6qNbwYf_tqcc-?=l7UQ8_;$W@dp$kj-rEwg{! z>fulOlc7 zx=0AxwU5mI&Bi?ejHFW3l)xUT_f%5&5Mml$?96sjt?H~$-xa~EmJc1yEF}EdM_ebo zAi)@(DAqUmLRHyw#xC1jsUai9A{jEI=;ynw8#D|7$@^(7C%$X2j~?o8C1O!a$5 zKQwDkC2R~A-MiY6k4aH4)HIydFvY&kVEx%=EBdOTadp3b!Gbt`$tcxB3vZc3-ewU z5UHDDTat#Z$-XOy37CG|i))I7Q73Q=61Qf~j5$>1(YPsguwf)}zy29QS$*NjhRntT zn6*HU*a#sb(^LGtmY=Il35m>%rU+=D*x&(WGB1Dr+i7{4vb_(A6EwJtrre>yzIU+E z@Xdi%+Y6)5v!-=_O;7Lhvpd5@HJ#V0;ar%?eZNm=+;(N;#&fR=+{3otFB=#1$iFSS zm;9Z?anlwLvHwfv<=To_cwH7h4;-qjabcFuq4m#g@}XS4jU8WER_`&D@b<(1jLZt28IW%>lyaU^ z&u%Py>fg|q#d7VyAyTe?KeQTwo2#f&Af0@6dXn1^n$u?6X9RwrulQP*LC%3`iu-Dw z?=1hJ&T?R8bSFPcOHQNP?czrDdTvnZISkSsEO29&{y@6qCI^?tJRV!amese1F`Eqb z$)S@*gE1V0<>89;@x+FGP0f0_C+Gn*tSmGi85K5^i)*umJiy}#d%x9R%c6bhVOEll zw3sL{EM6G8l&HhqeA7&7OklBV=_RJ4JGT3g0oxENy$da+XQz)PbH%m)uyKdYZOVgU zs07!BPS%nf1@rk|>qmK{x`Vd^kM{aIdAL-vsz&be={)i$W1JRIwMlv8W#CZD7;=Ii z{q9A3B5|%_o&r9IHy>HQk7rM)F^xs9G0hpCS zXlnT^TnS1)UMLC6i`TF5Jv=;sitYGMcY|tgZ@)DbySw4QF@Tl{e8i}^?ZHwz5GdG~ zn3(S9jg}Ta%%ek24i2n`w>`wipwXRxlyt%sepj`LrEO#`EO72PHp0?e>GOq-ovc#c zSa5;8epVI#hu@Gg&~>l&F)%Rx^!F=V{%gg{EGT%V*Wjx1{{8!){pK5kAF;8)z!Zf7 z53wCjE$ZEXg^NoP92}ha>z8r^s)sq#cD_lhaBOSl5QQRSP)a2NzURe@7h=F8VZ--M zydP8W$jhhjsTiA>+^XmElYKTwR7?!g+^eV|!=|z-d;Bd)w5fBR7$E^c#*HvLy9$tz zAr9*Uvn0t$NlcKa)YOu++%d}lKR-Y3v#(zvWxzjO0V(2%5mZ^pl`(97?|FH7Ir5ET%|LGcL!pfR*4XtWu=~lyvjSP)1N?R0>A~_V zw$hu2XWri4kI6Xv`5o3GLG~FLy?8_dHUDNHYXgVUxh!@dm{8m%3M0os1hiiq9qIV^ zo-!~nyr89>YVs0vc6Nq%UZ1U_ccx+%7Cz|d>py(-=u<}+*?VoWW2ZQFc6K6C(&hDa zX&D(T;0T)wg$jF|P)&5QN(Pb6q)lF&0hP;=Lf39e)&huDX&&s;^*?kRio~2wgN>+} zNA$JQ_Ph_8mV$E{$uJER)3>B9Y8dkBI915#U~0d+Rz=E#WWItiwvUX5u}96m8Yo)W zh&H~uZ`Ix1eXgYT*{eT+z4gZ{-lP>?ojNdlDl0Z{>MGQw0Y857xxo}_jG6agBbsC0WaFJZ5ZW8)R0B~4!L zXGB>>2l9l!$s;ySV{0jnfaj}OaL{YVs>g0`ESOAo_NiXH_&;hWkmo=2QFbt*irLU9 z_6}S#l_!Q=iX{5wk1q@4f-i60X?t&tSTPu^XX1*M7B^!%<( zb;a5Ku;rMod3&F=jZgjJwr81VTjc9JCW!)YK_;2H7T!nEHD*PeC&H^bu&;EpVql*w z@OSxOEK*%ozJ&jJ}Th!^jj+ zP@31Thrs%>{05dx0q*NBB>h5Gl{WG}v~zi6C2fUiztMb? zSFWPCrJv4f9uLmJv{mV?1xw*~KsN(iHwbyJt-T0|^ zBPb%mtT&EDujUH|LZ^QyL;UP8?ItWdT*1%bhkU92UKA+SQGm+)Ta7p5aNc>ZS@iy` zs_F=3{8ZT|% zz_#fu*ZUe!9}p&vva+&NlYf9m)dz0;r#fGdw*rEt)T#%w9e0`0VlUtyG{kc#>PHf@WbQtI_HAmiJU$M zezs+9ZZ6$vFo`>~>{I9MtRVm*O#S+JSM>Un7Bt{{4<2xM99tI^7h{})TLY+Lw)eMI z9xf0Ix-t1Db*)RlOwqjn53++VgZ76;&Uu~aUk!?ghyXv2PfBXmxAsH+r#@*k3S|#W zQ(z_|K$5NL3DtA%k05YGX#gNV>CXXAA@q>=xe4wwzTYD`atB98^gKLqtG)3R4(p0U zlKGq>EG*#&s|i9fvf$=sQNZJ1*N186VyF%Z+YdH23hL@afFZ;(Yn6MR*=v^QSq#`YYzGNiiR0px`Wc4-Ivx7_>p2`vY_tE;PJ zup94hkI7WGYdShRk&PZMepNoBsLEdPr82E40A!#EJz-{Mrt;Wf2W!yP+gn)H2Vd&%>wC@1+u70a z0N_868107FC{hRq2M5U1b&!M|?d|uqw6y;G`NQXiG7hi8(dK>Q?96k!GQi{tfR&q^ znj#=1%w)Uc=H{l?yPxYJPLJ+XF_V$l9HsPhEYy<=ZeEj@& z=na*o)1^nMYHGE1%O@8f_W-CR-xU-P*n(A+m){w>!5Amr-`g7i`1$N~IpP%*+BP^C z0q(H`8Z8*Qsi|pAZSCgF@xOnN=L`&(q@?lg6Z-n5rY`|yV%4wvYZnGmYbr@7-;bUQ$9xh?o$Di@A{=^ga*&Ofab5nlrQy>Fq# zk3j4Tz?%l{oAl0me}fAPnL$eJ>{#pR!)|yQ03n5d^Mlcaruy1iAYN+Rj|!Te&(isS z0L9Gnc*@Mx!(%%y4FLX)4Rc>#->tAxMHM1FJw4a+&Ac;IFPp5AQl4)0XNdJwc>vhY zx0xIfq2zb*9Pw-yHIyqLC@7dKpZEvN=x0H}#X}RYh*&fL)3*Ql<7)`Jik+N%?>C`g zc$u%37Zeim0-QS(6fijoP!bapZ#WA4ot@pBt>@iuJfQ;V02J9R3FHJy_i9c?9Eeg5 z^P%T+ZtIjlpE16A^%1a{+oPZ~@AHT0QUn-SSXj^5*`ol(6
    pak1dGHX~_Mdd9Z zdH^r;2?`<+R$36i<|Z3Gcmafrlg!33pYWjLRY-X414h<#eQpKRp_TqXe}6csfvb;6 zZ=BuLxzpv<6`6=9A1SNeYjfeF_LEH{X1G-Ac4@OBI88}SO@(Tg-vcD|(tF}CklMS; zVNe*9h|7Zrm@(jIF0=cRp(M9b-N0j)yQilIoCX*J(hJqC3d6Yj;BQq!Z7sjo#jy#% zR=_Jvke90FKNWW80w|7-jt(HG&a0DoB|x}HNJxOThis is the complete list of members for IRSamsungAc, including all inherited members.

    - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -112,10 +112,10 @@ $(function() { - + - +
    _forcepowerIRSamsungAcprivate
    _irsendIRSamsungAcprivate
    _lastsentpowerstateIRSamsungAcprivate
    begin(void)IRSamsungAc
    calcChecksum(const uint8_t state[], const uint16_t length=kSamsungAcStateLength)IRSamsungAcstatic
    calibrate(void)IRSamsungAcinline
    checksum(const uint16_t length=kSamsungAcStateLength)IRSamsungAcprivate
    convertFan(const stdAc::fanspeed_t speed)IRSamsungAc
    convertMode(const stdAc::opmode_t mode)IRSamsungAc
    getBeep(void)IRSamsungAc
    getBreeze(void)IRSamsungAc
    getClean(void)IRSamsungAc
    getDisplay(void)IRSamsungAc
    getFan(void)IRSamsungAc
    getIon(void)IRSamsungAc
    getMode(void)IRSamsungAc
    getPower(void)IRSamsungAc
    getPowerful(void)IRSamsungAc
    getQuiet(void)IRSamsungAc
    getRaw(void)IRSamsungAc
    getSwing(void)IRSamsungAc
    getTemp(void)IRSamsungAc
    IRSamsungAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSamsungAcexplicit
    off(void)IRSamsungAc
    on(void)IRSamsungAc
    remote_stateIRSamsungAcprivate
    _IRSamsungAcprivate
    _forcepowerIRSamsungAcprivate
    _irsendIRSamsungAcprivate
    _lastsentpowerstateIRSamsungAcprivate
    begin(void)IRSamsungAc
    calcChecksum(const uint8_t state[], const uint16_t length=kSamsungAcStateLength)IRSamsungAcstatic
    calibrate(void)IRSamsungAcinline
    checksum(const uint16_t length=kSamsungAcStateLength)IRSamsungAcprivate
    convertFan(const stdAc::fanspeed_t speed)IRSamsungAcstatic
    convertMode(const stdAc::opmode_t mode)IRSamsungAcstatic
    getBeep(void) constIRSamsungAc
    getBreeze(void) constIRSamsungAc
    getClean(void) constIRSamsungAc
    getDisplay(void) constIRSamsungAc
    getFan(void) constIRSamsungAc
    getIon(void) constIRSamsungAc
    getMode(void) constIRSamsungAc
    getPower(void) constIRSamsungAc
    getPowerful(void) constIRSamsungAc
    getQuiet(void) constIRSamsungAc
    getRaw(void)IRSamsungAc
    getSwing(void) constIRSamsungAc
    getTemp(void) constIRSamsungAc
    IRSamsungAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSamsungAcexplicit
    off(void)IRSamsungAc
    on(void)IRSamsungAc
    send(const uint16_t repeat=kSamsungAcDefaultRepeat, const bool calcchecksum=true)IRSamsungAc
    sendExtended(const uint16_t repeat=kSamsungAcDefaultRepeat, const bool calcchecksum=true)IRSamsungAc
    sendOff(const uint16_t repeat=kSamsungAcDefaultRepeat)IRSamsungAc
    setSwing(const bool on)IRSamsungAc
    setTemp(const uint8_t temp)IRSamsungAc
    stateReset(const bool forcepower=true, const bool initialPower=true)IRSamsungAc
    toCommon(void)IRSamsungAc
    toCommon(void) constIRSamsungAc
    toCommonFanSpeed(const uint8_t speed)IRSamsungAcstatic
    toCommonMode(const uint8_t mode)IRSamsungAcstatic
    toString(void)IRSamsungAc
    toString(void) constIRSamsungAc
    validChecksum(const uint8_t state[], const uint16_t length=kSamsungAcStateLength)IRSamsungAcstatic
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc.html similarity index 88% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc.html index fa7aa3745..5c2cdc782 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSamsungAc.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc.html @@ -81,8 +81,9 @@ Collaboration diagram for IRSamsungAc:
Collaboration graph
- - + + +
[legend]
@@ -121,93 +122,87 @@ Public Member Functions - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - + + + + + +
void setPower (const bool on)
 Change the power setting. More...
 
bool getPower (void)
 Get the value of the current power setting. More...
 
bool getPower (void) const
 Get the value of the current power setting. More...
 
void setTemp (const uint8_t temp)
 Set the temperature. More...
 
uint8_t getTemp (void)
 Get the current temperature setting. More...
 
uint8_t getTemp (void) const
 Get the current temperature setting. More...
 
void setFan (const uint8_t speed)
 Set the speed of the fan. More...
 
uint8_t getFan (void)
 Get the current fan speed setting. More...
 
uint8_t getFan (void) const
 Get the current fan speed setting. More...
 
void setMode (const uint8_t mode)
 Set the operating mode of the A/C. More...
 
uint8_t getMode (void)
 Get the operating mode setting of the A/C. More...
 
uint8_t getMode (void) const
 Get the operating mode setting of the A/C. More...
 
void setSwing (const bool on)
 Set the vertical swing setting of the A/C. More...
 
bool getSwing (void)
 Get the vertical swing setting of the A/C. More...
 
bool getSwing (void) const
 Get the vertical swing setting of the A/C. More...
 
void setBeep (const bool on)
 Set the Beep setting of the A/C. More...
 
bool getBeep (void)
 Get the Beep setting of the A/C. More...
 
bool getBeep (void) const
 Get the Beep setting of the A/C. More...
 
void setClean (const bool on)
 Set the Clean setting of the A/C. More...
 
bool getClean (void)
 Get the Clean setting of the A/C. More...
 
bool getClean (void) const
 Get the Clean setting of the A/C. More...
 
void setQuiet (const bool on)
 Set the Quiet setting of the A/C. More...
 
bool getQuiet (void)
 Get the Quiet setting of the A/C. More...
 
bool getQuiet (void) const
 Get the Quiet setting of the A/C. More...
 
void setPowerful (const bool on)
 Set the Powerful (Turbo) setting of the A/C. More...
 
bool getPowerful (void)
 Get the Powerful (Turbo) setting of the A/C. More...
 
bool getPowerful (void) const
 Get the Powerful (Turbo) setting of the A/C. More...
 
void setBreeze (const bool on)
 Closes the vanes over the fan outlet, to stop direct wind. Aka. WindFree. More...
 
bool getBreeze (void)
 Are the vanes closed over the fan outlet, to stop direct wind? Aka. WindFree. More...
 
bool getBreeze (void) const
 Are the vanes closed over the fan outlet, to stop direct wind? Aka. WindFree. More...
 
void setDisplay (const bool on)
 Set the Display (Light/LED) setting of the A/C. More...
 
bool getDisplay (void)
 Get the Display (Light/LED) setting of the A/C. More...
 
bool getDisplay (void) const
 Get the Display (Light/LED) setting of the A/C. More...
 
void setIon (const bool on)
 Set the Ion (Filter) setting of the A/C. More...
 
bool getIon (void)
 Get the Ion (Filter) setting of the A/C. More...
 
bool getIon (void) const
 Get the Ion (Filter) setting of the A/C. More...
 
uint8_t * getRaw (void)
 Get a PTR to the internal state/code for this protocol. More...
 
void setRaw (const uint8_t new_code[], const uint16_t length=kSamsungAcStateLength)
 Set the internal state from a valid code for this protocol. More...
 
uint8_t convertMode (const stdAc::opmode_t mode)
 Convert a stdAc::opmode_t enum into its native mode. More...
 
uint8_t convertFan (const stdAc::fanspeed_t speed)
 Convert a stdAc::fanspeed_t enum into it's native speed. More...
 
stdAc::state_t toCommon (void)
 Convert the current internal state into its stdAc::state_t equivalent. More...
 
String toString (void)
 Convert the current internal state into a human readable string. More...
 
stdAc::state_t toCommon (void) const
 Convert the current internal state into its stdAc::state_t equivalent. More...
 
String toString (void) const
 Convert the current internal state into a human readable string. More...
 
@@ -217,6 +212,12 @@ Static Public Member Functions + + + + + + @@ -235,9 +236,8 @@ Private Attributes - - - + + @@ -435,6 +435,9 @@ Private Attributes
+

Static Public Member Functions

static uint8_t calcChecksum (const uint8_t state[], const uint16_t length=kSamsungAcStateLength)
 Calculate the checksum for a given state. More...
 
static uint8_t convertMode (const stdAc::opmode_t mode)
 Convert a stdAc::opmode_t enum into its native mode. More...
 
static uint8_t convertFan (const stdAc::fanspeed_t speed)
 Convert a stdAc::fanspeed_t enum into it's native speed. More...
 
static stdAc::opmode_t toCommonMode (const uint8_t mode)
 Convert a native mode into its stdAc equivalent. More...
 
IRsend _irsend
 Instance of the IR send class. More...
 
uint8_t remote_state [kSamsungAcExtendedStateLength]
 State in code form. More...
 
SamsungProtocol _
 
bool _forcepower
 Hack to know when we need to send a special power mesg. More...
 
+ + + + +
@@ -444,6 +447,11 @@ Private Attributes
uint8_t IRSamsungAc::convertFan
+
+static

Convert a stdAc::fanspeed_t enum into it's native speed.

@@ -462,6 +470,9 @@ Private Attributes
+ + + + + +
@@ -471,6 +482,11 @@ Private Attributes
uint8_t IRSamsungAc::convertMode
+
+static

Convert a stdAc::opmode_t enum into its native mode.

@@ -484,8 +500,8 @@ Private Attributes
- -

◆ getBeep()

+ +

◆ getBeep()

@@ -495,7 +511,7 @@ Private Attributes ( void  ) - + const
@@ -505,8 +521,8 @@ Private Attributes
- -

◆ getBreeze()

+ +

◆ getBreeze()

@@ -516,7 +532,7 @@ Private Attributes ( void  ) - + const
@@ -527,8 +543,8 @@ Private Attributes
- -

◆ getClean()

+ +

◆ getClean()

@@ -538,7 +554,7 @@ Private Attributes ( void  ) - + const
@@ -548,8 +564,8 @@ Private Attributes
- -

◆ getDisplay()

+ +

◆ getDisplay()

@@ -559,7 +575,7 @@ Private Attributes ( void  ) - + const
@@ -569,8 +585,8 @@ Private Attributes
- -

◆ getFan()

+ +

◆ getFan()

@@ -580,7 +596,7 @@ Private Attributes ( void  ) - + const
@@ -590,8 +606,8 @@ Private Attributes
- -

◆ getIon()

+ +

◆ getIon()

@@ -601,7 +617,7 @@ Private Attributes ( void  ) - + const
@@ -611,8 +627,8 @@ Private Attributes
- -

◆ getMode()

+ +

◆ getMode()

@@ -622,7 +638,7 @@ Private Attributes ( void  ) - + const
@@ -632,8 +648,8 @@ Private Attributes
- -

◆ getPower()

+ +

◆ getPower()

@@ -643,7 +659,7 @@ Private Attributes ( void  ) - + const
@@ -653,8 +669,8 @@ Private Attributes
- -

◆ getPowerful()

+ +

◆ getPowerful()

@@ -664,7 +680,7 @@ Private Attributes ( void  ) - + const
@@ -674,8 +690,8 @@ Private Attributes
- -

◆ getQuiet()

+ +

◆ getQuiet()

@@ -685,7 +701,7 @@ Private Attributes ( void  ) - + const
@@ -716,8 +732,8 @@ Private Attributes
- -

◆ getSwing()

+ +

◆ getSwing()

@@ -727,19 +743,19 @@ Private Attributes ( void  ) - + const

Get the vertical swing setting of the A/C.

Returns
true, the setting is on. false, the setting is off.
-
Todo:
(Hollako) Explain why sometimes the LSB of remote_state[9] is a 1. e.g. 0xAE or 0XAF for swing move.
+
Todo:
(Hollako) Explain why sometimes the LSB of remote_state[9] is a 1. e.g. 0xAE or 0XAF for swing move.
- -

◆ getTemp()

+ +

◆ getTemp()

@@ -749,7 +765,7 @@ Private Attributes ( void  ) - + const
@@ -1250,7 +1266,7 @@ Private Attributes -
Todo:
(Hollako) Explain why sometimes the LSB of remote_state[9] is a 1. e.g. 0xAE or 0XAF for swing move.
+
Todo:
(Hollako) Explain why sometimes the LSB of remote_state[9] is a 1. e.g. 0xAE or 0XAF for swing move.
@@ -1317,8 +1333,8 @@ Private Attributes
- -

◆ toCommon()

+ +

◆ toCommon()

@@ -1328,7 +1344,7 @@ Private Attributes ( void  ) - + const
@@ -1408,8 +1424,8 @@ Private Attributes
- -

◆ toString()

+ +

◆ toString()

@@ -1419,7 +1435,7 @@ Private Attributes ( void  ) - + const
@@ -1476,6 +1492,28 @@ Private Attributes

Member Data Documentation

+ +

◆ _

+ +
+
+ + + + + +
+ + + + +
SamsungProtocol IRSamsungAc::_
+
+private
+
+ +
+

◆ _forcepower

@@ -1544,30 +1582,6 @@ Private Attributes
-
- - -

◆ remote_state

- -
-
- - - - - -
- - - - -
uint8_t IRSamsungAc::remote_state[kSamsungAcExtendedStateLength]
-
-private
-
- -

State in code form.

-

The documentation for this class was generated from the following files:
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.map new file mode 100644 index 000000000..8d4aabf8c --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 new file mode 100644 index 000000000..0132e2b98 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.md5 @@ -0,0 +1 @@ +83b0e47ec039fa39ca0df95e295c598a \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSamsungAc__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..2ba7e73a621a70f517a2431e519aaf1ccf51a429 GIT binary patch literal 7008 zcmaKx1yEGs+Q&fz=~7BcNeSstmN2LlSQMm7xCOeDJEgn3yT6xv zzx&OdJ9oZe*qzyP=A3t*^F06e|Nm{kTbK+1?n7KOG&BOJtfUfn-va*#Y%K7Ku^`n7 z-mnbhWF*mUZvT=|84+k`)MQY}m+xKTx29aR-ydC{?u}46n@|=IzxS6C2+^|Xb7Ir3 z*#0d1UOP`M?<{lk1Y>Dg<>Q%!hK0os{VNbbz7e%ePeFCEm$=4Ca_GjU@-llswN5^&5Q&mI+gu zJG;B3kW9FEcnW3m|2T;SI*v!dMNCTS9TbFTJzk>Ugt8r+4^sfUyq{P%lQ=Fz9mL7 z{p>f}Jw7&RM>1bt2iAka@i;8Y-??+AZ_V-a{M>$Xlvg!hH>A265*ivRdUJU|86ut5 zGhS-BcYG|JJw!@OT)#G$5yc0G!;iNnGCX=ZI$j}}0)v90j>);SWj}m)9f3obSJfcqDG_;Uw~kj5XBO{?67 zSwbSI?rO`nqM~AUeZ52CdXFeiyYf!`7o7XgoYo)oiXPx2nffyn=|4e+(JS1J*u%ra zUEJLV(-o-G72>4L&COBkWmurPU;O+Sp`@n0i7M$cSv!>YSPYDedxwWj?d<`{$&UsG z2c!0@j}qeJX}rC?BWsHdTL~lb)lwpco14G(BtVK?_6$hx->>w#a?5p{Uswn?j_v4p z>+3Ty zGk@HjeaXkiw>nO&q>6t>d*2A{^O^gM(AV1TFgW;cdFY4*_T* z1fIv)Srm^%GFX;so`FI+am{phD@<3z^Y@?g^DAR5{`$p`h8oIN<5*J5(+)>}&cPuE zd-Dc~UYVTyf^DV_fe0}NqZz@-$Y`t)y@W)Py0!#U75Vu1#K*;Db0R=fzqtyc;O_Vo z|KrDRd5HUQ4u0ErE*&H|`|9#?Q6Wxfs2b+xR)yaNg+fb*>%_N?wx_go>%2S@W@fg6 zX(6g~5N9i&b%6(uTAP~wx?j)Ske7>Nbaal7Ylen}sdeo9h1(oOfVMW)baE=q8QF+B z10NwHB8*@3bapCtoNP^~WlIdT((c>EK|{@_CMQo%>TVR2lt{mR{VM-MAfT`BEg_vK z_M|9tky^ek7o^W%sLLk%$Fu&sBVx{Rq!&c3s8Mlq6OweDi{Rn9w z&cWQZr+3uU)Y2v!8(+I7#l{Atr7`R3>UNaC5=7XHohr2wN=gJcIXQRt_RQ_3qPK^6 zt-ZX&|NQyGsaq4XzHTww-OSPlm0 zaAziIch}C|-oCA?%Lp`eFeR@y5Lk@9T2J?$_~$8?ywzH?L_|bDtztx+*d=Z*`I(uS zbM)#GPft(XN=G!GJ%7$?Im{W&rPBd)V|x@XDk@4TXz@TfU4E|ND_&$&)W`WIoL8@2 zWoBkpSZaxji;M0x-ItVB;x?B@TalS=V)W3*nE%$i-<1x z`*#WswLGKwrhwHWH?SqQulA=<4=sN}#{f$<0GnWm`Jk_$<#2)Zgpi{MEgFYvPBN%4 zc#vSd4<~iyni1fvErU0#>U1#`quJ1O@XL7 zZjDEgFiOwP&o>;d4aV{r;|d809a(U&uweQ8`4kpL^z!A)FJHgLdVPIphc;=kHI34; z8B7nUY~-n4envc`G-dv1y=-K#%mge86@2^UcnR6!DmQYimA*7L-njgc+IsE zRJIib_p9^k3#yXpeqNsz#0oEAS)g70@>PX4rKRpDE@+0F1ad5~cx`4jUayHk3$q;VZBLpPzabw(hJ^3oYuy3gZINnL-SR}V1cl+w_eH2x@ z*p!DN%$6-!g^%qbZ+6us9bk_C{eb8i!&U?Mj#lTXR1^WWZ z!Yrt$7lL|s<1k=hSKXK=UT&ngSk7yrGC+W zI4mUKYi{qz%B(fJ#PFL{#M4bu$}^)1(8{bisR~9TBCn*Fn#=Q6nx@tGE_brmWXVa< z@kH0-(=eGiA32A`MY_|AO|ew&Uj@p4JWC9SpV57>3|BkrwA3A4)l#*ehHa>Knk?@5 z6PitEWnHHpEjJX`F%E0uX;*J_(Y}cwX$8TAYd%Jm`0qdSk?g<8NnF4rJ%KiqT^LT; zt=TcnkVl~w3&AhG51o*Yca!kDI#9~0;74v201?I?V!Bj(XyZxaVpQUQS_d-fM?ft!xzg74I$pb9 z9!wIp`s$x)4Ymrg?MK@-dypAa^vfZqSafdpS7P+j-(q515I%g2g=yB(HCWI0+9*v4 zxjXB>F~S_~o*s2}rf#ws^pPrV(h-}6f0i9L$=Kn9J8tDb)nj};;;M1W$kq5co>j32 z+34q09NCQOJh-WFpG=VYPfdIdgeMYdvhZaV-!m*Y-0p$`2z}y!E7~d zlkOkQ(NDE1JkI#?>#jxm`};d;{+pMk47s6wGFjuw-}#-JRap3YK>-hoVq%VH`v>6n zN5{vJ@$vH7+BCNb5ju>Xd7hp(19T#heqMtN!)<=(k5lK)S4 zty^Riu>YKyS!&p#bU&8g)MBW+t1A-yIRv5=tE!{(bmPd)_1-5vdU&|Z2eA74 z`zI$Se~OHJu-qMIS~My(fSWt;-wjMv9L1pRbWLoYPBouF6SlUtb_}o@z)1aRN%yMW z0PX<9Ne>SXY+PIhPR=f)!l0m8%$GV%Qo9!RsLVjTYOXj4end9A@czN^E2EF&PALCW zmGDi&k!Oc*L}F#~*avS7G)a#{ZMuA{LG1_X*|y*Ex1zVv9Ch@gjycD{(0|G>3QUEx z^Sp|*jD$C;`22=BvZ^k|^Bo($&XUhceYC^ty$jh*y6oK)Vy2k?iN!_N^CF7IrD620%K?8-untkxH z>alsV0C3ieE%&w6y z3my@S*oe?wR9i-rPWWm%%QU0=cSl^7YwC z1(_`5ZE!1^i~#wO$D%f4%If(3=1}th+Cbn=moFlZF15Pyq}1&)O+= zTYgEA2?Hd+e4A$*s*+CoUQXRDYU+TG9roN{Xy}u)mUTnh4_KYol^tAdjx9RGv%%U@ z$azyeHV#g&I+Yz~h!}fSWc8PiuE2)XeO$ue*r{?vO9Dxb_~#D0yStAV7+#%ufWU!fWo2dO;9v-% z13sOodR9bKR5Nh=&*0lMDk>^~IPsYeFo6$DqMgjxlRWluZiN=aB79nrzmszU)CO`B z_`y{CzF)rFt-airOLSXj1Hvn9Vewmuj*RRp&>DJ=U34&#UwnP{$4rxAdFL+_qm66N z*Es-rY6m0SMGGrtC@bmq4+$Xvc%$Z^2a=kaI=i){@a`Q6*cc4<=9^2bC&xZ#gO|}>4>bX?1!0J&zk)X4v&ki za++s$$t|LOMD#2S4BiP4`25C3XO2ekZCC|dDo3k4lu;(sZnf|6?DF=h`wptr8xwD| z)RKa`X7|p;$&PJb)$LVodE(||Wdz7_g^p`Vi!)qPx-~Amnz_+{gGP?%x`&|LPlkWf zQ&7m5nLUY)juyQ-9BgWB9eJWx<;Vt*%`G-tT{Ww6Tx$S%zAu?_=na!Ke*u7ZSOgE7 zcIO&hcTgwlV0*NO2inn47>1;>I(i zs6R#KV7HOT(A2aQKwCC|R76E-?%lgLIW@I5luZHdi>9uw{=wWl0EH489v%i=yWfDv zEnt?=5=tvKlBWZ(^jtpTiUVZaTh0gY5I~5nplv}q{slPo?e`X3*9C`CQ<;`>(%z*= ze+0E+XJcdwQH zU`67FDr9+i<~{go0D*jttN!YKyg8TlU3Wf2csf}ojE+Xs6(x!6z(C5jC=QvNbk3 ziY9z=i@ytti>2*ySpcPotp!S+*;|d@&wGqkeVJdCno@I&UUl)=najHS$Q^- zQNmyh43|2hYHqGC4mZalsQ68uK&=f8Q)=!#;o{0Wu}?@y0FMW(RWdd@A|j>cyK(GP zHT$&;Ym^dRqPOw_MCSoHIUnNM z1CaLaQp=GiPoFY#afJdHOXs>s0v^dXW2#)$pr|OamEI&)A)&H&yth0TxZrOI2?{DI zWYQ_&K%+hgOxGanGhhj)%W<|~&=!}L3T>vU+_)#YyF(%307T~$Ac4qz zz(z4<*VZ&rbWgUYKubMlX2t||>HK)Bvm=TFs;HPzQWAN3>H>bt7|%RX#RIOi4^Wn@ z%*@%1{JNI0u~^VGB(${Msn7^YVH=vgy}gcA>uTq%7$NJ2`L*ZlU;r1V;4^86o9hsZ zI?x7yt^E4+3!9LTMMx<6yRI7!1Oh?3h2&5u4nR)EKxOaVy(?gL7DWEE;R6p35MrQD zoxo?K7Zep4fWAHiCQ_AFPEOA4coPbIDjFU+XZ^%P+;fLzo{#gAT-p^cdK1N{OQ$U! zZ?}wM|NQy$!Gj0>at9CBMhgu&b*f6BH}nv*zDEWI24KnB5vAq~g$9q_nArm|3?^!J z=O5+|IC@4Np1w)_EMHm8pY3O7XM3Qgx6%h>3kMrJ^T?Kd?pSgFR{@qkQf$`G;NbUD z6I|wBzZ(5}DgwXZG_8JQq!n?L9XjbF`zsSqGK6j6#p$0s-sThis is the complete list of members for IRSanyoAc, including all inherited members.

    - + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + @@ -106,11 +104,11 @@ $(function() { - + - +
    _getTemp(uint8_t *ptr)IRSanyoAcprivate
    _IRSanyoAcprivate
    _irsendIRSanyoAcprivate
    _setTemp(uint8_t *ptr, const uint8_t degrees)IRSanyoAcprivate
    begin(void)IRSanyoAc
    calcChecksum(const uint8_t state[], const uint16_t length=kSanyoAcStateLength)IRSanyoAcprivatestatic
    calibrate(void)IRSanyoAcinline
    checksum(void)IRSanyoAcprivate
    convertFan(const stdAc::fanspeed_t speed)IRSanyoAc
    convertMode(const stdAc::opmode_t mode)IRSanyoAc
    convertSwingV(const stdAc::swingv_t position)IRSanyoAc
    getBeep(void)IRSanyoAc
    getFan(void)IRSanyoAc
    getMode(void)IRSanyoAc
    getOffTimer(void)IRSanyoAc
    getPower(void)IRSanyoAc
    getRaw(void)IRSanyoAc
    getSensor(void)IRSanyoAc
    getSensorTemp(void)IRSanyoAc
    getSleep(void)IRSanyoAc
    getSwingV(void)IRSanyoAc
    getTemp(void)IRSanyoAc
    IRSanyoAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSanyoAcexplicit
    off(void)IRSanyoAc
    on(void)IRSanyoAc
    remote_stateIRSanyoAcprivate
    begin(void)IRSanyoAc
    calcChecksum(const uint8_t state[], const uint16_t length=kSanyoAcStateLength)IRSanyoAcprivatestatic
    calibrate(void)IRSanyoAcinline
    checksum(void)IRSanyoAcprivate
    convertFan(const stdAc::fanspeed_t speed)IRSanyoAcstatic
    convertMode(const stdAc::opmode_t mode)IRSanyoAcstatic
    convertSwingV(const stdAc::swingv_t position)IRSanyoAcstatic
    getBeep(void) constIRSanyoAc
    getFan(void) constIRSanyoAc
    getMode(void) constIRSanyoAc
    getOffTimer(void) constIRSanyoAc
    getPower(void) constIRSanyoAc
    getRaw(void)IRSanyoAc
    getSensor(void) constIRSanyoAc
    getSensorTemp(void) constIRSanyoAc
    getSleep(void) constIRSanyoAc
    getSwingV(void) constIRSanyoAc
    getTemp(void) constIRSanyoAc
    IRSanyoAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSanyoAcexplicit
    off(void)IRSanyoAc
    on(void)IRSanyoAc
    send(const uint16_t repeat=kNoRepeat)IRSanyoAc
    setBeep(const bool on)IRSanyoAc
    setFan(const uint8_t speed)IRSanyoAc
    setSwingV(const uint8_t setting)IRSanyoAc
    setTemp(const uint8_t degrees)IRSanyoAc
    stateReset(void)IRSanyoAc
    toCommon(void)IRSanyoAc
    toCommon(void) constIRSanyoAc
    toCommonFanSpeed(const uint8_t speed)IRSanyoAcstatic
    toCommonMode(const uint8_t mode)IRSanyoAcstatic
    toCommonSwingV(const uint8_t setting)IRSanyoAcstatic
    toString(void)IRSanyoAc
    toString(void) constIRSanyoAc
    validChecksum(const uint8_t state[], const uint16_t length=kSanyoAcStateLength)IRSanyoAcstatic
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc.html similarity index 83% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc.html index 3ef1fb10b..2535429b6 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSanyoAc.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc.html @@ -82,8 +82,9 @@ Collaboration diagram for IRSanyoAc:
    Collaboration graph
    - - + + +
    [legend]
    @@ -113,90 +114,90 @@ Public Member Functions - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - - - - - - - + + + + + +
    void setPower (const bool on)
     Change the power setting. More...
     
    bool getPower (void)
     Get the value of the current power setting. More...
     
    bool getPower (void) const
     Get the value of the current power setting. More...
     
    void setTemp (const uint8_t degrees)
     Set the desired temperature. More...
     
    uint8_t getTemp (void)
     Get the current desired temperature setting. More...
     
    uint8_t getTemp (void) const
     Get the current desired temperature setting. More...
     
    void setSensorTemp (const uint8_t degrees)
     Set the sensor temperature. More...
     
    uint8_t getSensorTemp (void)
     Get the current sensor temperature setting. More...
     
    uint8_t getSensorTemp (void) const
     Get the current sensor temperature setting. More...
     
    void setFan (const uint8_t speed)
     Set the speed of the fan. More...
     
    uint8_t getFan (void)
     Get the current fan speed setting. More...
     
    uint8_t getFan (void) const
     Get the current fan speed setting. More...
     
    void setMode (const uint8_t mode)
     Set the operating mode of the A/C. More...
     
    uint8_t getMode (void)
     Get the operating mode setting of the A/C. More...
     
    uint8_t getMode (void) const
     Get the operating mode setting of the A/C. More...
     
    void setSleep (const bool on)
     Set the Sleep (Night Setback) setting of the A/C. More...
     
    bool getSleep (void)
     Get the Sleep (Night Setback) setting of the A/C. More...
     
    bool getSleep (void) const
     Get the Sleep (Night Setback) setting of the A/C. More...
     
    void setSensor (const bool location)
     Set the Sensor Location setting of the A/C. i.e. Where the ambient temperature is measured. More...
     
    bool getSensor (void)
     Get the Sensor Location setting of the A/C. i.e. Where the ambient temperature is measured. More...
     
    bool getSensor (void) const
     Get the Sensor Location setting of the A/C. i.e. Where the ambient temperature is measured. More...
     
    void setBeep (const bool on)
     Set the Beep setting of the A/C. More...
     
    bool getBeep (void)
     Get the Beep setting of the A/C. More...
     
    bool getBeep (void) const
     Get the Beep setting of the A/C. More...
     
    void setSwingV (const uint8_t setting)
     Set the vertical swing setting of the A/C. More...
     
    uint8_t getSwingV (void)
     Get the vertical swing setting of the A/C. More...
     
    uint8_t getSwingV (void) const
     Get the vertical swing setting of the A/C. More...
     
    void setRaw (const uint8_t newState[])
     Set the internal state from a valid code for this protocol. More...
     
    uint8_t * getRaw (void)
     Get a PTR to the internal state/code for this protocol with all integrity checks passing. More...
     
    uint16_t getOffTimer (void)
     Get the nr of minutes the Off Timer is set to. More...
     
    uint16_t getOffTimer (void) const
     Get the nr of minutes the Off Timer is set to. More...
     
    void setOffTimer (const uint16_t mins)
     Set the nr of minutes for the Off Timer. More...
     
    uint8_t convertMode (const stdAc::opmode_t mode)
     Convert a stdAc::opmode_t enum into its native mode. More...
     
    uint8_t convertFan (const stdAc::fanspeed_t speed)
     Convert a stdAc::fanspeed_t enum into it's native speed. More...
     
    uint8_t convertSwingV (const stdAc::swingv_t position)
     Convert a stdAc::swingv_t enum into it's native setting. More...
     
    stdAc::state_t toCommon (void)
     Convert the current internal state into its stdAc::state_t equivalent. More...
     
    String toString (void)
     Convert the current internal state into a human readable string. More...
     
    stdAc::state_t toCommon (void) const
     Convert the current internal state into its stdAc::state_t equivalent. More...
     
    String toString (void) const
     Convert the current internal state into a human readable string. More...
     
    + + + + + + + + + @@ -212,12 +213,6 @@ Private Member Functions - - - - - -

    Static Public Member Functions

    static bool validChecksum (const uint8_t state[], const uint16_t length=kSanyoAcStateLength)
     Verify the checksum is valid for a given state. More...
     
    static uint8_t convertMode (const stdAc::opmode_t mode)
     Convert a stdAc::opmode_t enum into its native mode. More...
     
    static uint8_t convertFan (const stdAc::fanspeed_t speed)
     Convert a stdAc::fanspeed_t enum into it's native speed. More...
     
    static uint8_t convertSwingV (const stdAc::swingv_t position)
     Convert a stdAc::swingv_t enum into it's native setting. More...
     
    static stdAc::opmode_t toCommonMode (const uint8_t mode)
     Convert a native mode into its stdAc equivalent. More...
     
    void checksum (void)
     Calculate & set the checksum for the current internal state of the remote. More...
     
    void _setTemp (uint8_t *ptr, const uint8_t degrees)
     Set the temperature at a given location. More...
     
    uint8_t _getTemp (uint8_t *ptr)
     Get the temperature from a given location. More...
     
    @@ -230,9 +225,8 @@ Private Attributes - - - + +

    Static Private Member Functions

    IRsend _irsend
     Instance of the IR send class. More...
     
    uint8_t remote_state [kSanyoAcStateLength]
     The state in IR code form. More...
     
    SanyoProtocol _
     

    Detailed Description

    Class for handling detailed Sanyo A/C messages.

    @@ -290,86 +284,6 @@ Private Attributes

    Member Function Documentation

    - -

    ◆ _getTemp()

    - -
    -
    - - - - - -
    - - - - - - - - -
    uint8_t IRSanyoAc::_getTemp (uint8_t * ptr)
    -
    -private
    -
    - -

    Get the temperature from a given location.

    -
    Parameters
    - - -
    [in]ptrA pointer to a temperature byte.
    -
    -
    -
    Returns
    The current setting for temp. in degrees celsius.
    - -
    -
    - -

    ◆ _setTemp()

    - -
    -
    - - - - - -
    - - - - - - - - - - - - - - - - - - -
    void IRSanyoAc::_setTemp (uint8_t * ptr,
    const uint8_t degrees 
    )
    -
    -private
    -
    - -

    Set the temperature at a given location.

    -
    Parameters
    - - - -
    [out]ptrA pointer to a temperature byte.
    [in]degreesThe temperature in degrees celsius.
    -
    -
    - -
    -

    ◆ begin()

    @@ -499,6 +413,9 @@ Private Attributes
    + + + + + +
    @@ -508,6 +425,11 @@ Private Attributes
    uint8_t IRSanyoAc::convertFan
    +
    +static

    Convert a stdAc::fanspeed_t enum into it's native speed.

    @@ -526,6 +448,9 @@ Private Attributes
    + + + + + +
    @@ -535,6 +460,11 @@ Private Attributes
    uint8_t IRSanyoAc::convertMode
    +
    +static

    Convert a stdAc::opmode_t enum into its native mode.

    @@ -553,6 +483,9 @@ Private Attributes
    + + + + + +
    @@ -562,6 +495,11 @@ Private Attributes
    uint8_t IRSanyoAc::convertSwingV
    +
    +static

    Convert a stdAc::swingv_t enum into it's native setting.

    @@ -575,8 +513,8 @@ Private Attributes
    - -

    ◆ getBeep()

    + +

    ◆ getBeep()

    @@ -586,7 +524,7 @@ Private Attributes ( void  ) - + const
    @@ -596,8 +534,8 @@ Private Attributes
    - -

    ◆ getFan()

    + +

    ◆ getFan()

    @@ -607,7 +545,7 @@ Private Attributes ( void  ) - + const
    @@ -617,8 +555,8 @@ Private Attributes
    - -

    ◆ getMode()

    + +

    ◆ getMode()

    @@ -628,7 +566,7 @@ Private Attributes ( void  ) - + const
    @@ -638,8 +576,8 @@ Private Attributes
    - -

    ◆ getOffTimer()

    + +

    ◆ getOffTimer()

    @@ -649,7 +587,7 @@ Private Attributes ( void  ) - + const
    @@ -660,8 +598,8 @@ Private Attributes
    - -

    ◆ getPower()

    + +

    ◆ getPower()

    @@ -671,7 +609,7 @@ Private Attributes ( void  ) - + const
    @@ -702,8 +640,8 @@ Private Attributes
    - -

    ◆ getSensor()

    + +

    ◆ getSensor()

    @@ -713,7 +651,7 @@ Private Attributes ( void  ) - + const
    @@ -723,8 +661,8 @@ Private Attributes
    - -

    ◆ getSensorTemp()

    + +

    ◆ getSensorTemp()

    @@ -734,7 +672,7 @@ Private Attributes ( void  ) - + const
    @@ -744,8 +682,8 @@ Private Attributes
    - -

    ◆ getSleep()

    + +

    ◆ getSleep()

    @@ -755,7 +693,7 @@ Private Attributes ( void  ) - + const
    @@ -765,8 +703,8 @@ Private Attributes
    - -

    ◆ getSwingV()

    + +

    ◆ getSwingV()

    @@ -776,7 +714,7 @@ Private Attributes ( void  ) - + const
    @@ -786,8 +724,8 @@ Private Attributes
    - -

    ◆ getTemp()

    + +

    ◆ getTemp()

    @@ -797,7 +735,7 @@ Private Attributes ( void  ) - + const
    @@ -1182,8 +1120,8 @@ Private Attributes
    - -

    ◆ toCommon()

    + +

    ◆ toCommon()

    @@ -1193,7 +1131,7 @@ Private Attributes ( void  ) - + const
    @@ -1308,8 +1246,8 @@ Private Attributes
    - -

    ◆ toString()

    + +

    ◆ toString()

    @@ -1319,7 +1257,7 @@ Private Attributes ( void  ) - + const
    @@ -1376,6 +1314,28 @@ Private Attributes

    Member Data Documentation

    + +

    ◆ _

    + +
    +
    + + + + + +
    + + + + +
    SanyoProtocol IRSanyoAc::_
    +
    +private
    +
    + +
    +

    ◆ _irsend

    @@ -1398,30 +1358,6 @@ Private Attributes

    Instance of the IR send class.

    -
    -
    - -

    ◆ remote_state

    - -
    -
    - - - - - -
    - - - - -
    uint8_t IRSanyoAc::remote_state[kSanyoAcStateLength]
    -
    -private
    -
    - -

    The state in IR code form.

    -

    The documentation for this class was generated from the following files:
      diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.map new file mode 100644 index 000000000..0cd6d5d70 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 new file mode 100644 index 000000000..9aa487400 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.md5 @@ -0,0 +1 @@ +a9064796ca7898bebfdffdaa4553bbd5 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSanyoAc__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..fe6882cd8f6bc682c763c0ccb091f43415947188 GIT binary patch literal 6451 zcmZWu1ys~uw*>_S1f)b7$$`IgHzMWGA%b*wcc(}R3P=nHh;)N6fOL1Lz)%j|-7u8z z@_p~UZ>{&3#T^!N*YDnY?m2t!vnNVTMIH}_0tXEZ4G;QCMgzQ0f!`pk2Vjg9#%%;| z4@?#1WzhcKy}mXVB%+~_Z9rwDUVDGpMf&J#S=_cAj{XSl`v-&mUR7l5pc02vwq}|} zK1*u79J8=WB5#OEvcOga74e|`2i5`@)i9jUWe_@C_PdAMx&QZ&#=-afXJ1P@nn(8^ z_wdqvEu`WYJPvI3ZmzfT$=r9_L(Lt3SJ3#LUN+wY~oUkD@D$-!3h$6hGcL!Tg`$ z1mhgJSktqeX%EBa(V^d1boBJbDvTs=QKLZu@>0T#X9^J--f6Z_(} zK4PO~5W($xVr}o>ARKVXXJcbC1mlgc7)*wVl!}zMp2J|U3lxgmb4Tas=tzk=8EQQz zTT@%hOizDLR{i4kYJXyLzxA&K_?eoT;xg|eP|1=g8+p#o&IA_YVS+1c62?raLRsHZh@h%`PueK1ck z#T&Jna(HmiHZl@N$RJngwQuMFTUanAk(DYKTU=h2c6aBKY-QNAoZahuEV%-9Q=w^P zYD&MhwzhRPIyktzS&-G!-5u_TY&hJh9(6?>tv**3GYNO_XdsJ-hz^*Lblb z9G6l6S5#EA)_&S`j3>)?i?s!{Mj3dVJ`Zjw>;ayw29p`EiEk-H8o7wjoHG& zq7M1KG0!J7DJA8&{UI%wdV72O!a;C7N!xI7`J-fhW#uQYIiHBBDIJfDg9B$GVq#&} z6)X_rlRaem&!1`^E@dSWTx*4mQ`3k$!Ch~RaY;q#DB(}qMTA{!^0z^p^<e7)P)3=A|yHh3r-LO}MS(Q|WG&7D~*1fZj%o1Sh>#5#_>N2BN9D4%m59&HE3 zfrX82a=6q@hWh}`-`_tnHr8VA&yS0%D_*l6+>tNB_g}cW@}TYQ?QQjchr!72(us*l zmVLgvTlQvtU;rmLIvNLrpt7o}hmR>;fC>-KW8H6bc&LGCG=`fgwkQJk~)p_^F|H$nI>NrjAY@z#}d}K?oxwn65JM z=MR;Wlat3yrnq16ak<}q^SK%crl6o;9IfO?xk2LwqAXoxer!zhrnSi8_D>lC3Wc^0 z4VAW^->7UgQl@zkHhS(30FbJ8-z1_9IEfb#XJmYLb9L^v)P)Tynq0)4Wp#Dc+s7w+ zY?FnBQm5#u#GH$<@kdOchsmGX0OW;!}Le~?ThPoAiQVk_1v zc?E^iJ$v>7`QD(xJsVshBO@aLF|ph1Y12W+BQ~R!FW~TL>zRHk8FM-EkKf}{E6B)T zfMDbn6dW(ba1xP_$eiyX_Y0MkS*!id_r8exy}9{XKOvHtnThf6;azeCULVRUC@APO z`||sp?flBc6C5)&;u}rlk2yMWMU?6F=6sZh4hy?4B_$;!A_73D6a2FZ4#%`r?Ep_y zR#PM3;NTbn^FfW9+1O0yHY_bIv9PmuPfn%)wC(8Zgxl-JxOjQ3pSS)McWS*6XlZHj z_VxYldun_4d;oQEb#;P+DVz{CHe5eHzqKJ)=f&Z&Q)4CoId>82&WOj_jjEG?uT1Rh z6k7vt4vvpIk;sf#O2Ij;Mn|o+CZFS}Iw#sUZ{BRNER`Wp7t0@i{Jp&*7j|V7_dQui zcWN;Kh?54-Ru|0tjO>3V?>9m5P+0e+g+*RHh@FhReQA-j4X^d46n>Ed(aQsX#>N&F z-S4o8m8ezHCpYj?G?X^#9t!4)LWq@$moJ^0$HmN_sweO<5-a^@uzk~G zi_)W)oZNWU3l6Bq6E~~j@f$tH=yUeAMwyK`IXStvx3{&Syxkl^nfdFInzo3fD|z>f z@s_o2tQ@iZz-Lx=@?Hm@aUXishMN$6)<;4?tM&OFcStsNL`+1ads^#=^C*LfHz0Y@ zZY(K9;xemdb{ppHaV<}AzmQ_n``_|C&0;7*%tl9;<4R9$ zs<9EsQGAnYBW7#{tel0e0XF<0=+caqa6(@A3TO26)A)DU1ChVf&J%~KB9tmA;nNsy zC#ZcN9r4f)X4=!JlaKl;pC>2y3*4%F{11z1)ENkR8jeLoQw5I#-R&I&?#>`3N@8%6 z70XS5Vew%UiuW~0jQf9RYVzW9(0GAkJ#H@|3M7BjAw|9wH~`WLHV3dTPz7R<8G_c zWz}^r`9ABRWMK18rl7LPzaxKQ^=259(3VH~ZoDSa1x)*sC@XQAY1Ql2X+8!#E5x ze6B~u$!fbOyOpHW3*GkYcI`vLJ)~g}I0`vB+sM5 zBfkAXjsE6qitxzR3(_N&pFZ1s{3QN(SF5LdJAAOheuKLs4;0Y9gb`- zDW4d!^cJOfAfxV`4J&-(yP{Y&^D{#f4bzq?=jRXfokgv?`2CE_uJD_HX}^6f-Mvad z6|gF-BR$h?sLlBUjfCv`&&2Odwk-yUV@FbO1}ns>##{TgznFEtASKcUR~n)`A^OfchwT)O`qvhmZ6S>>ZqHda@yv%(O_Ls@kemU<7paKeFOcz~{}{Fn)Gsg6!J~+eY(4$1Xm$B92FC=|GL$xG2XR4HAhhc8@2HiPhxiY zjxqQYh1tu#*S}8;8vb^kIO6_2u`ZJ@1>X;2491EZfQ-4O9YmSfwG?%7|G0QUp89sn z+t|`eGvar-`xHjl41^BvBKA2%+tP)px%llsQ&o%*km95q`hArqot4$qW`oJ>O#p5$ zE-sAC%sM~ONecyB)-?Fr*s!Xrs{=}3Tv&JkBsySTj{(13_#~j(uDQ8P!)9NXg9Ry% zKu=GB_V)Iv+1ar=CnL|DDVM?2>Q+`Jn|TYGOfODS1hsF9b>O!!-f^<-k%AzS#vm_s ztYu`%Qv!l#Zz>GSTK48!Tb(^To&e2C%+Jri)Dixuqod>H^}6I=!Y5Cj&`U@dHXRK- z-#W_9&ZcK!c?BpJuq(Y`Aj*QYRTMi<)vSdOAEa&-(_=f`7c#GnxT5BI$ z>Q$wf!*-IF#wMkvE^7hOrK6`u4sdVnTm$F_?-78uXp1kb{TWa*6RTI}`j3ho;o)>;p`MXd`eS8CE)M!{Qe-{|+3HXO?-#wOgLxBd9Y|B?MT zyVoo(?eqTTX3_0F=xFTi*+5s;JwKmC&THwsHbjn=keG<>?Byk|PC_CJ6xoO8+U1`T z622ubE-ih#b+XX%BXpFN#RQZD8nAKL{`U5)wZ2@~v(s1Hw?WRGBW0S^HCn|bopJPY zeWGfOy$!5_V$}RVyM6jZ@Ij6tUC_yL<7c+HmDTdFOd{~9P1{2;K~&WZ3}V}jzkd66FXvZeK>-8^ zJB!PcP5mbCc%VR3GR2_Q)+}0Dbu{k|Pfu5YoMYzUNw~iDKk*emULS4U6tT?sJd+iY zzz0wxT>Nq)M@UGBfP~~-P7VV%H@7{q;fdbt%)?{*KlSl*&3?q-lbD!C)t1AiU=bZ% zU4f$O`g$P+MMdy*CLy6z&}p%!Gay5oXzwWf!d7k3q+bgiLHQY`j9@ z)r{Bl_^&_kEKkydn>GFNr2cuR9h9ftv152Xt|hU7=&y=gM!Bh;8(8pNs?w$8w!-%O;`6csEWay8iIJyd-1kajx zxi=0KB^SGCR5+Zkxpwd>(r+U(bMaut$_r~w^7GgRQATsM4biCeL6oBdKDzqepD|4d zp>dKGc%<@)+Go)`;mLZ>?qIkkrMFyTaLzBAderRUAnQ@pWIlbw=4@5M_&;o=9$QZN zPb6m*=+E4QN4W{=hu?KSgN#=0+yoh)0rx4{IoD*FPoqCkJ;>pg&M{&CjY^?IHxRn zO*(OKaYU2qk${bu>BDGLTzez(zGV%%rOm`XrzLjf!qIO;!YejIneKQrxPo}ati$UJ zxI$t%L-@>d(Bnz9ioxp202@uTYo~Zyi|p2C$1J5vOP&oTu#RqiiH@P#@M1WtH~!|! z)*>Wdg=&KvPkUO_U3?$yGi}STYV%gu=%(Bn6DFTo;_5A79@Ug+B~H={R2M(z*O{>k zN_^?@1O1U5>eU=Vlq&+}qmzO8T$G3yFLda{63P9zZWdgeS-@qJ7tjXq1 z7jQ7$oq-Q!NoGMZy*tJi-K~$X&UlHLl@<;bJFmBm{+bS@ayOyY((n4FZM^GAo-NuMIPQsF$F_$O%CLe3osM&Ykhs{#)kDvX=&hbt(MizEdi^> z10n3PgyHGw*>v(-ab;y?92Jbl!pUj1I*O!8VrK;E`gqi5IaW}}c>&D`FiM66 zK9x`#@E=A;GDPn>5a1igVzoySGJwsk{`ujy^}W$+zXu?+BhuEX_9S__!LP|8yNvD8t+i1I3;jKfVGs$Z%5kuk+z_+k{}omFX$2PZV(Ls`D#f;%eUfUoZzM= zv6kCQJ428%O-)UeaQGe6wue2mtCq@(6Ycx;37eQ1Yz^w-0x+8!*ij)7G`?6FE5SnmC3W@(wfckScjlL~_^ZfzBp@9*v5zX%MJP*G9YK{lp<{mFeGQ!f|+ z%_gtyIE$;R>(5R1`X4{|X9W@+RcP8N78VxT!1eVH4Xsp>EdXR^UkI)=HmNd2y9HiG@Z9MS16FLgvb ztGv9t=o>Te=P$9&_K<_XaTWHzsJuJ}`sM8|b3;ReDIZ1uz(B*8G6RwsW*iHmX90Rd z`Wwpa>?QFT% zpL&AL+ub5n3TIv9{+1nO>VIb)4mIGeh((>}YqZu?d0o#)p1iPTPI2t%Gi#t0*Q&nbB zz{}biFH*`BgNgf{9RRc-l$4azH!!%fK^2qPOing_UGF*tnE@eDXRyxjQ7lxYz^pA8 z-S+80gKP|`324Qgg0A!|N4`W=SM!2%JhYXkyMOQAR+1GckG7Ee)6IT@Xpf$9boKT| z_#Ceh0G1O-)lyPS*HkpL*9D^YKFUshJrbr#UeXXKCBnmBy)PDk0~#ak^K-O8-Ig ze?j_xhTW|g%c9kqM5LVCu4SqO2geAQuOYs>hQ$mmix+#C$cWbux`BTWu={mE+Fu!= c%13`ql(tIbvTfzTw;*UxSrwV`m&T$01wdTzumAu6 literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc-members.html similarity index 65% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc-members.html index 6ba3041bb..bfab4bb48 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc-members.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc-members.html @@ -68,42 +68,42 @@ $(function() {

      This is the complete list of members for IRSharpAc, including all inherited members.

      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -113,7 +113,7 @@ $(function() { - + @@ -121,10 +121,10 @@ $(function() { - - - - + + + +
      _fanIRSharpAcprivate
      _getEconoToggle(void)IRSharpAcprivate
      _irsendIRSharpAcprivate
      _modeIRSharpAcprivate
      _modelIRSharpAcprivate
      _setEconoToggle(const bool on)IRSharpAcprivate
      _tempIRSharpAcprivate
      begin(void)IRSharpAc
      calcChecksum(uint8_t state[], const uint16_t length=kSharpAcStateLength)IRSharpAcprivatestatic
      calibrate(void)IRSharpAcinline
      checksum(void)IRSharpAcprivate
      clearPowerSpecial(void)IRSharpAcprivate
      convertFan(const stdAc::fanspeed_t speed)IRSharpAcstatic
      convertMode(const stdAc::opmode_t mode)IRSharpAcstatic
      getClean(void)IRSharpAc
      getEconoToggle(void)IRSharpAc
      getFan(void)IRSharpAc
      getIon(void)IRSharpAc
      getLightToggle(void)IRSharpAc
      getMode(void)IRSharpAc
      getModel(const bool raw=false)IRSharpAc
      getPower(void)IRSharpAc
      getPowerSpecial(void)IRSharpAcprivate
      getRaw(void)IRSharpAc
      getSpecial(void)IRSharpAc
      getSwingToggle(void)IRSharpAc
      getTemp(void)IRSharpAc
      getTimerEnabled(void)IRSharpAc
      getTimerTime(void)IRSharpAc
      getTimerType(void)IRSharpAc
      getTurbo(void)IRSharpAc
      IRSharpAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSharpAcexplicit
      isPowerSpecial(void)IRSharpAc
      off(void)IRSharpAc
      on(void)IRSharpAc
      remoteIRSharpAcprivate
      _IRSharpAcprivate
      _fanIRSharpAcprivate
      _getEconoToggle(void) constIRSharpAcprivate
      _irsendIRSharpAcprivate
      _modeIRSharpAcprivate
      _modelIRSharpAcprivate
      _setEconoToggle(const bool on)IRSharpAcprivate
      _tempIRSharpAcprivate
      begin(void)IRSharpAc
      calcChecksum(uint8_t state[], const uint16_t length=kSharpAcStateLength)IRSharpAcprivatestatic
      calibrate(void)IRSharpAcinline
      checksum(void)IRSharpAcprivate
      clearPowerSpecial(void)IRSharpAcprivate
      convertFan(const stdAc::fanspeed_t speed)IRSharpAcstatic
      convertMode(const stdAc::opmode_t mode)IRSharpAcstatic
      getClean(void) constIRSharpAc
      getEconoToggle(void) constIRSharpAc
      getFan(void) constIRSharpAc
      getIon(void) constIRSharpAc
      getLightToggle(void) constIRSharpAc
      getMode(void) constIRSharpAc
      getModel(const bool raw=false) constIRSharpAc
      getPower(void) constIRSharpAc
      getPowerSpecial(void) constIRSharpAcprivate
      getRaw(void)IRSharpAc
      getSpecial(void) constIRSharpAc
      getSwingToggle(void) constIRSharpAc
      getTemp(void) constIRSharpAc
      getTimerEnabled(void) constIRSharpAc
      getTimerTime(void) constIRSharpAc
      getTimerType(void) constIRSharpAc
      getTurbo(void) constIRSharpAc
      IRSharpAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)IRSharpAcexplicit
      isPowerSpecial(void) constIRSharpAc
      off(void)IRSharpAc
      on(void)IRSharpAc
      send(const uint16_t repeat=kSharpAcDefaultRepeat)IRSharpAc
      setClean(const bool on)IRSharpAc
      setEconoToggle(const bool on)IRSharpAc
      setMode(const uint8_t mode, const bool save=true)IRSharpAc
      setModel(const sharp_ac_remote_model_t model)IRSharpAc
      setPower(const bool on, const bool prev_on=true)IRSharpAc
      setPowerSpecial(const uint8_t value)IRSharpAcprivate
      setPowerSpecial(const uint8_t value)IRSharpAcinlineprivate
      setRaw(const uint8_t new_code[], const uint16_t length=kSharpAcStateLength)IRSharpAc
      setSpecial(const uint8_t mode)IRSharpAc
      setSwingToggle(const bool on)IRSharpAc
      setTimer(bool enable, bool timer_type, uint16_t mins)IRSharpAc
      setTurbo(const bool on)IRSharpAc
      stateReset(void)IRSharpAcprivate
      toCommon(void)IRSharpAc
      toCommonFanSpeed(const uint8_t speed)IRSharpAc
      toCommonMode(const uint8_t mode)IRSharpAc
      toString(void)IRSharpAc
      toCommon(void) constIRSharpAc
      toCommonFanSpeed(const uint8_t speed) constIRSharpAc
      toCommonMode(const uint8_t mode) constIRSharpAc
      toString(void) constIRSharpAc
      validChecksum(uint8_t state[], const uint16_t length=kSharpAcStateLength)IRSharpAcstatic
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc.html similarity index 86% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc.html index f2750e51c..5b9236a68 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRSharpAc.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc.html @@ -82,8 +82,9 @@ Collaboration diagram for IRSharpAc:
    Collaboration graph
    - - + + +
    [legend]
    @@ -104,9 +105,9 @@ Public Member Functions - - - + + + @@ -116,81 +117,81 @@ Public Member Functions - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + - - - - - - + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - - - - - - - - - + + + + + + + + + - - - + + + @@ -200,18 +201,18 @@ Public Member Functions - - - - - - - - - - - - + + + + + + + + + + + +
    void setModel (const sharp_ac_remote_model_t model)
     Set the model of the A/C to emulate. More...
     
    sharp_ac_remote_model_t getModel (const bool raw=false)
     Get/Detect the model of the A/C. More...
     
    sharp_ac_remote_model_t getModel (const bool raw=false) const
     Get/Detect the model of the A/C. More...
     
    void on (void)
     Set the requested power state of the A/C to on. More...
     
    void setPower (const bool on, const bool prev_on=true)
     Change the power setting, including the previous power state. More...
     
    bool getPower (void)
     Get the value of the current power setting. More...
     
    bool isPowerSpecial (void)
     Is one of the special power states in use? More...
     
    bool getPower (void) const
     Get the value of the current power setting. More...
     
    bool isPowerSpecial (void) const
     Is one of the special power states in use? More...
     
    void setTemp (const uint8_t temp, const bool save=true)
     Set the temperature. More...
     
    uint8_t getTemp (void)
     Get the current temperature setting. More...
     
    uint8_t getTemp (void) const
     Get the current temperature setting. More...
     
    void setFan (const uint8_t fan, const bool save=true)
     Set the speed of the fan. More...
     
    uint8_t getFan (void)
     Get the current fan speed setting. More...
     
    uint8_t getFan (void) const
     Get the current fan speed setting. More...
     
    void setMode (const uint8_t mode, const bool save=true)
     Set the operating mode of the A/C. More...
     
    uint8_t getMode (void)
     Get the operating mode setting of the A/C. More...
     
    uint8_t getMode (void) const
     Get the operating mode setting of the A/C. More...
     
    void setSpecial (const uint8_t mode)
     Set the value of the Special (button/command?) setting. More...
     
    uint8_t getSpecial (void)
     Get the value of the Special (button/command?) setting. More...
     
    bool getTurbo (void)
     Get the Turbo setting of the A/C. More...
     
    uint8_t getSpecial (void) const
     Get the value of the Special (button/command?) setting. More...
     
    bool getTurbo (void) const
     Get the Turbo setting of the A/C. More...
     
    void setTurbo (const bool on)
     Set the Turbo setting of the A/C. More...
     
    bool getSwingToggle (void)
     Get the (vertical) Swing Toggle setting of the A/C. More...
     
    bool getSwingToggle (void) const
     Get the (vertical) Swing Toggle setting of the A/C. More...
     
    void setSwingToggle (const bool on)
     Set the (vertical) Swing Toggle setting of the A/C. More...
     
    bool getIon (void)
     Get the Ion (Filter) setting of the A/C. More...
     
    bool getIon (void) const
     Get the Ion (Filter) setting of the A/C. More...
     
    void setIon (const bool on)
     Set the Ion (Filter) setting of the A/C. More...
     
    bool getEconoToggle (void)
     Get the Economical mode toggle setting of the A/C. More...
     
    bool getEconoToggle (void) const
     Get the Economical mode toggle setting of the A/C. More...
     
    void setEconoToggle (const bool on)
     Set the Economical mode toggle setting of the A/C. More...
     
    bool getLightToggle (void)
     Get the Light toggle setting of the A/C. More...
     
    bool getLightToggle (void) const
     Get the Light toggle setting of the A/C. More...
     
    void setLightToggle (const bool on)
     Set the Light mode toggle setting of the A/C. More...
     
    uint16_t getTimerTime (void)
     Get how long the timer is set for, in minutes. More...
     
    bool getTimerEnabled (void)
     Is the Timer enabled? More...
     
    bool getTimerType (void)
     Get the current timer type. More...
     
    uint16_t getTimerTime (void) const
     Get how long the timer is set for, in minutes. More...
     
    bool getTimerEnabled (void) const
     Is the Timer enabled? More...
     
    bool getTimerType (void) const
     Get the current timer type. More...
     
    void setTimer (bool enable, bool timer_type, uint16_t mins)
     Set or cancel the timer function. More...
     
    bool getClean (void)
     Get the Clean setting of the A/C. More...
     
    bool getClean (void) const
     Get the Clean setting of the A/C. More...
     
    void setClean (const bool on)
     Set the Economical mode toggle setting of the A/C. More...
     
    void setRaw (const uint8_t new_code[], const uint16_t length=kSharpAcStateLength)
     Set the internal state from a valid code for this protocol. More...
     
    stdAc::opmode_t toCommonMode (const uint8_t mode)
     Convert a native mode into its stdAc equivalent. More...
     
    stdAc::fanspeed_t toCommonFanSpeed (const uint8_t speed)
     Convert a native fan speed into its stdAc equivalent. More...
     
    stdAc::state_t toCommon (void)
     Convert the current internal state into its stdAc::state_t equivalent. More...
     
    String toString (void)
     Convert the current internal state into a human readable string. More...
     
    stdAc::opmode_t toCommonMode (const uint8_t mode) const
     Convert a native mode into its stdAc equivalent. More...
     
    stdAc::fanspeed_t toCommonFanSpeed (const uint8_t speed) const
     Convert a native fan speed into its stdAc equivalent. More...
     
    stdAc::state_t toCommon (void) const
     Convert the current internal state into its stdAc::state_t equivalent. More...
     
    String toString (void) const
     Convert the current internal state into a human readable string. More...
     
    @@ -236,15 +237,15 @@ Private Member Functions - - - + + + - - - + + + @@ -260,9 +261,8 @@ Private Attributes - - - + + @@ -332,8 +332,8 @@ Private Attributes

    Member Function Documentation

    - -

    ◆ _getEconoToggle()

    + +

    ◆ _getEconoToggle()

    @@ -346,7 +346,7 @@ Private Attributes
    - +

    Static Public Member Functions

    void setPowerSpecial (const uint8_t value)
     Set the value of the Power Special setting without any checks. More...
     
    uint8_t getPowerSpecial (void)
     Get the value of the Power Special setting. More...
     
    uint8_t getPowerSpecial (void) const
     Get the value of the Power Special setting. More...
     
    void clearPowerSpecial (void)
     Clear the "special"/non-normal bits in the power section. e.g. for normal/common command modes. More...
     
    bool _getEconoToggle (void)
     Get the Economical mode toggle setting of the A/C. More...
     
    bool _getEconoToggle (void) const
     Get the Economical mode toggle setting of the A/C. More...
     
    void _setEconoToggle (const bool on)
     Set the Economical mode toggle setting of the A/C. More...
     
    IRsend _irsend
     Instance of the IR send class. More...
     
    uint8_t remote [kSharpAcStateLength]
     State of the remote in IR code form. More...
     
    SharpProtocol _
     
    uint8_t _temp
     Saved copy of the desired temp. More...
     
    ( void  ) const
    @@ -620,8 +620,8 @@ Private Attributes - -

    ◆ getClean()

    + +

    ◆ getClean()

    @@ -631,7 +631,7 @@ Private Attributes ( void  ) - + const
    @@ -641,8 +641,8 @@ Private Attributes
    - -

    ◆ getEconoToggle()

    + +

    ◆ getEconoToggle()

    @@ -652,7 +652,7 @@ Private Attributes ( void  ) - + const
    @@ -663,8 +663,8 @@ Private Attributes
    - -

    ◆ getFan()

    + +

    ◆ getFan()

    @@ -674,7 +674,7 @@ Private Attributes ( void  ) - + const
    @@ -684,8 +684,8 @@ Private Attributes
    - -

    ◆ getIon()

    + +

    ◆ getIon()

    @@ -695,7 +695,7 @@ Private Attributes ( void  ) - + const
    @@ -705,8 +705,8 @@ Private Attributes
    - -

    ◆ getLightToggle()

    + +

    ◆ getLightToggle()

    @@ -716,7 +716,7 @@ Private Attributes ( void  ) - + const
    @@ -727,8 +727,8 @@ Private Attributes
    - -

    ◆ getMode()

    + +

    ◆ getMode()

    @@ -738,7 +738,7 @@ Private Attributes ( void  ) - + const
    @@ -748,8 +748,8 @@ Private Attributes
    - -

    ◆ getModel()

    + +

    ◆ getModel()

    @@ -759,7 +759,7 @@ Private Attributes ( const bool  raw = false) - + const
    @@ -775,8 +775,8 @@ Private Attributes
    - -

    ◆ getPower()

    + +

    ◆ getPower()

    @@ -786,7 +786,7 @@ Private Attributes ( void  ) - + const
    @@ -796,8 +796,8 @@ Private Attributes
    - -

    ◆ getPowerSpecial()

    + +

    ◆ getPowerSpecial()

    @@ -810,7 +810,7 @@ Private Attributes ( void  ) - + const @@ -846,8 +846,8 @@ Private Attributes
    - -

    ◆ getSpecial()

    + +

    ◆ getSpecial()

    @@ -857,7 +857,7 @@ Private Attributes ( void  ) - + const
    @@ -867,8 +867,8 @@ Private Attributes
    - -

    ◆ getSwingToggle()

    + +

    ◆ getSwingToggle()

    @@ -878,7 +878,7 @@ Private Attributes ( void  ) - + const
    @@ -888,8 +888,8 @@ Private Attributes
    - -

    ◆ getTemp()

    + +

    ◆ getTemp()

    @@ -899,7 +899,7 @@ Private Attributes ( void  ) - + const
    @@ -909,8 +909,8 @@ Private Attributes
    - -

    ◆ getTimerEnabled()

    + +

    ◆ getTimerEnabled()

    @@ -920,7 +920,7 @@ Private Attributes ( void  ) - + const
    @@ -930,8 +930,8 @@ Private Attributes
    - -

    ◆ getTimerTime()

    + +

    ◆ getTimerTime()

    @@ -941,7 +941,7 @@ Private Attributes ( void  ) - + const
    @@ -951,8 +951,8 @@ Private Attributes
    - -

    ◆ getTimerType()

    + +

    ◆ getTimerType()

    @@ -962,7 +962,7 @@ Private Attributes ( void  ) - + const
    @@ -972,8 +972,8 @@ Private Attributes
    - -

    ◆ getTurbo()

    + +

    ◆ getTurbo()

    @@ -983,7 +983,7 @@ Private Attributes ( void  ) - + const
    @@ -993,8 +993,8 @@ Private Attributes
    - -

    ◆ isPowerSpecial()

    + +

    ◆ isPowerSpecial()

    @@ -1004,7 +1004,7 @@ Private Attributes ( void  ) - + const
    @@ -1345,7 +1345,7 @@ Private Attributes -private +inlineprivate
    @@ -1586,8 +1586,8 @@ Private Attributes
    - -

    ◆ toCommon()

    + +

    ◆ toCommon()

    @@ -1597,7 +1597,7 @@ Private Attributes ( void  ) - + const
    @@ -1607,8 +1607,8 @@ Private Attributes
    - -

    ◆ toCommonFanSpeed()

    + +

    ◆ toCommonFanSpeed()

    @@ -1618,7 +1618,7 @@ Private Attributes ( const uint8_t  speed) - + const
    @@ -1634,8 +1634,8 @@ Private Attributes
    - -

    ◆ toCommonMode()

    + +

    ◆ toCommonMode()

    @@ -1645,7 +1645,7 @@ Private Attributes ( const uint8_t  mode) - + const
    @@ -1661,8 +1661,8 @@ Private Attributes
    - -

    ◆ toString()

    + +

    ◆ toString()

    @@ -1672,7 +1672,7 @@ Private Attributes ( void  ) - + const
    @@ -1729,6 +1729,28 @@ Private Attributes

    Member Data Documentation

    + +

    ◆ _

    + +
    +
    + + + + + +
    + + + + +
    SharpProtocol IRSharpAc::_
    +
    +private
    +
    + +
    +

    ◆ _fan

    @@ -1847,30 +1869,6 @@ Private Attributes

    Saved copy of the desired temp.

    - - - -

    ◆ remote

    - -
    -
    - - - - - -
    - - - - -
    uint8_t IRSharpAc::remote[kSharpAcStateLength]
    -
    -private
    -
    - -

    State of the remote in IR code form.

    -

    The documentation for this class was generated from the following files:
      diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.map new file mode 100644 index 000000000..9a1753861 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.map @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.md5 new file mode 100644 index 000000000..ced8dbcb5 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.md5 @@ -0,0 +1 @@ +8249c101b5624a55ee679f9dbf489484 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRSharpAc__coll__graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e68aa4144b1adbb85187127a58347f9ebb521351 GIT binary patch literal 6284 zcmZX32RzmP|L>8$Np=dEDG@?s&&b{#`-EeY?7dGUWOK4PMsaXLvK-B!Up36IJO(n7$^fw?72$_nqJQTbRgI~n;Yhd+h4<`XH z*DTbOyx=Y>2Ihze15ofKzjFpO1F(fFv2c9$?UIGUO`cl zWF*1clzw%ACNE!duEo@pH_TcxJBdbJotw+v0z8B23WGY4M)pPRB!x<9gV10Ct9T6U z9D7U8@mceTSnTVZ4fCtGRbL-wo6Sbt`I^v9TH`*d>Oh~E^=cv;r=sI3gsrG9LFIwU z4dnkU6;1APQ0UF>6uugTM-=&A15X43k3BF$jR8k)iHV7ypfy9H_9p>DqdL~s)?32{ za3PpBMaA5l6((p2nV6`osaXv>OY|JxJ1Q(k*IRcd^XQWma?(Aqi5?!Ix_R^7c>TNL z)g9KjA~qFsf&W=}?iIPYyFV||y+uRwTl^M=gp}0k?0B!5{6i-(F|qmH%5db+@V!LU zM0(^s6`_Dbm-EAR8CZjUk#3J9qw8q!-Juh(x=tSxwlRsV@IP?cInB&uY-wrfw-el58$*`7sDb%EVNftN zWq$ecWy2os#o^)M^u|VCf9|ufI(PIBx5b~?WfhL#2yIZ6Vf)k5Q^Q&p)*AR3H8}l5 zo%eM|v1UWf5*YHi*QM7!&J}6P#yMLcQO?|-{SMs7g@qt=LZ|?(f@pNKp_EZ_h=g*&u ziistpr+39NNu)c7{LzG!Bs)#k^CQj!5|PL{*IC7q?#U9zo7B`)a@s~loz;%xhFGr> zg>k}w{W04|rVXjDMoRg;)(j!i=ZBUwj|^Woo89H&iln-)sI9HtKRvqnY3Bzm{9|EZ zL^k3)4RLXTx3ae8H*dKL5qA77udPk_3inC&x;e9_Ta5sOnq7T*t`oU7QHR{!^#ENl zTH_3V)5WDa!OF@iJ0x&a8b-#zZeeN3V@kNtq+bGi*V-z-6VPbNXKZ5fV|ft$YA7iw z=>a4mE6WjOBS`;N@dG~}3nk^n(sn&bpE-!y}jMDbFeYV4SBAu z?V>d<*G5yd~jDCcb{1($&?KW{}x`jlbM&UX?X;{sgY8%T}O~!9FoLso><~RN`5XpHKYs zBO0B7KHKi*yF!`5YjRWWI@PUPY`9NGgVO?OX=zs|!M+Jqm$R;}4x-}>tL*hk9CcIb zr(`fJI`fN*)XdC%r$;;d^f8dbqoZ=LGd6vhDlRUMk?b0OhKh6`;OvCc>+6ovhgB67 zv!IQvtgKR3N9?N>F0!(+2p;nBwVOSjURkl{$Ad3e#@JFrW8={Y{z6k#^~T$`Z=+dc zQ2dr{pAi>9I|80nWV#eG{wqaj7kBq(`A{k_Yt3e#4Z}6jnDQxJllmc_K>s=lnN!Ln zRRy$WmZ;zELpb70Xnnk&p{$6~3^MQj^{tdmVUMbTsMO+M0b}*`{qE zMa#;h3?Cn#ewnET3`UA6KmxA;b78XljGPBx6Yr4C;EhlPSPxs0Y4>&l8 zke%`Y0g`%pdNkcdy2bR?&Vgf-c_XV^TU-21U-urspintCH-Tqiq(v2dO3c2Y#l>8_ zrVVze?W=wbBPI5?sR{AEtNF0r5!a7kGqyU!~xo+3ckGAbhgi+prG&xRuu`3x>lm4 z60<+M3A&4uo7=KCT}X1L=ZTMx4<$W)BtR!nM2D${J0cV zcdgVR^w)#_@?7Z4QUmRF2!;rNHHWFG=|Lk8 zV7A)2x&e#b1=Zh+o*xXknA8aD^?b~nTMT`U})@yM2cW|X}&fwtSo>cxfDe#~%T&|?ZD z;|D6xRCO*Ds9~1Dx#}+-nTykkl4o|%Ih1PREq3I8EYQ#*==oK5wJZ)UVdtrdR9C^w z=L!l?2F4ROL6Rq4`AxGK|E+e|s*l}xeX#liuL*UhH-i;qELBsCLq|uo?xE`?&sQjR z@Y&chDjn>(hUi!wEYJkUobR++9njyTsd;X(jKsg&ifbK{qHR0I3?5>D z&qr$JiqPisZ5H;&Z16?w%cAQ#$P=-?f^7und^TV92f+*Wf?{lC)(uH)ht%+Tx&xHJ zV{JY5_t*VTPz(lrLgDLC0@*CxJStPb0kN-nqht_PM~1y54pV+z}i{ z;6dv3y;(uyLX_zzVk%2`GShd#5q<-~Jv&joa52}~7GK%(Ix2;bpsW)8GrPgpb$r%? zc`cZ7dQ4%XXk&;?sR&>C*Z2;vDS2(B=jYTQ2L<7#K)sG79w}GHO>L!@Mbas;v=uwO zx5CPny6&IxUGv2w)6?zOEbP1vX=76lapcST z-l)SJ)MQ+3{!D1RjLu(4h;VVa)~8UJ+^Am5R)p4tXZBj4MT!5OyZfL6@qhWix(;&HqzRMJZ~ZzN_UX{M@Db7KMy0 zqjCD4ciErxK&T4T5($@0{P;Lc_dl1Xh0ezaApM9_DD$|`j ztLH3ghFL+gPU_=X7Ok|?y>$lsp2^7>Hu_cNc?u^7B0A0RZ~+G<#ftuW$l?QpcWYH6 zArY-LC(Id;7|_M~m3?jT$CI~tnVR~jXDh48^Ns8hRIEo-e+;^ce~G=7i}xSK&5RE9 z-n_4Lk*pDyux{V@EXiXNToi1d+lP}KM-`a;A^tfn#YW!-+|2AQz+&tE9NAhdw&LX= zyZ-+t#8dbmfT;c6c5YjoE3gQ4WZXMvs2-U#Izopqkl9_b?ScnDjj$n0f;UQ zPIUEZ1UZv<#P@KDD8SIJ=cm3i)6;jsTWnq3-3m}>Vk*C7nD0?XhcXpCJ=d;Z<3ld4 zo6e1U$xD;in#c4p3&$Sfmm;O`ArH@Oz{R&i|h>+5?@NJ#H0 z5fRDLTeofv(L0}~-7M!i3{@WUG)h=cDXv=jcvCK-a?+rcLzW|SW@(S86jS{XR_l^` zRApL53(U!%-Q_`{E*ooW;-^-&wi)O? zgXGR>qyGUeO}C8;IV!$kP(E8lBA3eSfPJ9GQ+?vCmXeE-JW5Q~FU7sQk)>&Sj{o^H zE`~uwzEWA{de`w%3PBoV|g)lKT%S^ z{)K~w<>KZB!u5ShilsnW|FVa?y!>O=Kk}Cb6L^~TI2H~8fyBtjNWazng99|;;#@sV z;B83Am0dq6Ag#T5?o)S(TVaIrY*D_~C@3g^7v0+3Ws{ah0n(mbSh)7B-g9+n-~&-^ zZmwMwtUxoX3-~Hm4~J2O5TFg-zkffyxv6DnNH;JrfSX_}BH#7{{GB?XqmtNS1s$I0 zLmOXe<)2-XMQyR-=0L3<~lks^$~J&7tW!7x*e6J zYHpifiFvwFWN$vAs&VpEBymbaJ1GAbZbp)hfau(reXMhYhh>q=2;i#t?z_E$BrFpV zt!bs_LyEbcf&gA7KAV1tta9&UXK%~+5@RBN4k5yYJE_`bV7$my+YKrq z{LL|ceYfo%a)np?AMDO(p%-HiAEwijP(v@|%-ME&c~gEG!{orE83j;*nH90y+&mon zCMsQDUVTFZv_wmE7hUR6y?WL3C zxCZMAvJRaUGLKpN+nOj1+f&!RcNXH;>c+*RX;j#g*f`a_F8){G@bBnhW3U%`zq30D z+c*Yv7UoJ{pvi?}R({)kuV1VfmGYY|9Y<*twE9O!!T-V$Fbr}9HO_;iN{;!?_OM0K4 z_ugoO@1;202W~7pE^ZGM|I1h~!?IX{#ppgKA1iAxEj(ZVXD+#$-ix|1ybpfjR!mlK-pj|6W4awNO1MDSrp1Fe}S{6~A|74d0k5^omA2E0$BIAQjFc z6T}EnQc?o;?v98P<4@_6Pj%7FW@htUNtt5qVE{k<_SZTOw`P}zF)13=GhXn3t$(ru z_wRsNJ3T*Ws__)%NuSV}v>7UVzBXPH=lu03Y!T%j`y+}Li9$J{Wc>FXGPAOPmex{M zRyG3y*7NgE(6H5ZAxD2fVB6-ijVj z;H|*TZf$R0xhpD~3i6DoFGfa2>eo-qI3374Ej7XVfK*IbUEK=!TZjYxYnBRFH*gOMg&KabB4!YA`sjbKak@LG6PWF^ai`0!KW%x*C;{!C-D~ zzPmndFxH0bu{zik24ri|^`6rh>lJf&=yO@o&7cE`9ij%1wt(adXy0N`@tyr~=L!&& zf~y9vNd4xCjUA3FuiGQQHz8yggdOg3b4P(vKny)*A(b%4m|Ag=LCtys9}SW4-e3cP zTkf-P*rN((ymS}^i>8wkuYFazW|sIQ{Dbm=I@sTtnVDwLKAnAi3**jBC7yR^X=zP; zX8sZPSo)Us#CD}*XJr`k$nf*)r6s$|0)t9`jU!e3FmIA-&p?-nMC!~|rKHfxUH96U z=md4_0|{>rf+gT@a2?5L?lU5Fc4`pv*e@-pQ7E(PF@f+iA~Nz%6yMjJ;^N4b7P-sZ zuoKC_$;(?%S^1tx!Ye)_quVl0O5Zu~_U+r(SzSCme>67-1Jj$t^P*btVKRtT+*gJ; zySlo-)aB&lyhdjSrGpHSV0v}+Re8YErx3qJ=0?*veM~;ct1b<6Pmj8)nwpBbIvXeF z@)U!DJ>}RLHY(x1(ihNkpfeOe;sW9chl$z*Fm#rJ^uW;1{6w5Tk(HI*!wrLnnDUt= z1EJniS6BWx>EnllMC5azPxq3^C@5?}mb_4b*!+6J3liANW(I0)$Z%?E3N_W}Ut!r! z4kkEF!kZVPUt$45E*#u2O#VXFK>`Qu_ZY>(4fOvt?E$+wJ(Um%`{F>YFzmnB*!( z%HT3D!u#0-Go+H(q#pf0P};+6H=5*@$R^ZrL8L0^`UCwdDhT|00ivRyDPJmQ7V=-0 C%!9@N literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTcl112Ac__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTcl112Ac__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTechnibelAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTechnibelAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTecoAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTecoAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRToshibaAC__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRToshibaAC__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTranscoldAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTranscoldAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRTrotecESP__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRTrotecESP__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVestelAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVestelAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRVoltas__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRVoltas__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc-members.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc-members.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRWhirlpoolAc__coll__graph.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRac-members.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRac-members.html similarity index 78% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRac-members.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRac-members.html index 89ff20bb1..b1ba87cc0 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/classIRac-members.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/classIRac-members.html @@ -122,29 +122,30 @@ $(function() { nextIRac opmodeToString(const stdAc::opmode_t mode)IRacstatic panasonic(IRPanasonicAc *ac, const panasonic_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool filter, const int16_t clock=-1)IRacprivate - samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)IRacprivate - sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)IRacprivate - sendAc(void)IRac - sendAc(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)IRac - sendAc(const decode_type_t vendor, const int16_t model, const bool power, const stdAc::opmode_t mode, const float degrees, const bool celsius, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool light, const bool filter, const bool clean, const bool beep, const int16_t sleep=-1, const int16_t clock=-1)IRac - sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)IRacprivate - strToBool(const char *str, const bool def=false)IRacstatic - strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)IRacstatic - strToModel(const char *str, const int16_t def=-1)IRacstatic - strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)IRacstatic - strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)IRacstatic - strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)IRacstatic - swinghToString(const stdAc::swingh_t swingh)IRacstatic - swingvToString(const stdAc::swingv_t swingv)IRacstatic - tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)IRacprivate - technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)IRacprivate - teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)IRacprivate - toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)IRacprivate - transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)IRacprivate - trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)IRacprivate - vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)IRacprivate - voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)IRacprivate - whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)IRacprivate + panasonic32(IRPanasonicAc32 *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)IRacprivate + samsung(IRSamsungAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool quiet, const bool turbo, const bool light, const bool filter, const bool clean, const bool beep, const bool prevpower=true, const bool forcepower=true)IRacprivate + sanyo(IRSanyoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool beep, const int16_t sleep=-1)IRacprivate + sendAc(void)IRac + sendAc(const stdAc::state_t desired, const stdAc::state_t *prev=NULL)IRac + sendAc(const decode_type_t vendor, const int16_t model, const bool power, const stdAc::opmode_t mode, const float degrees, const bool celsius, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool quiet, const bool turbo, const bool econo, const bool light, const bool filter, const bool clean, const bool beep, const int16_t sleep=-1, const int16_t clock=-1)IRac + sharp(IRSharpAc *ac, const sharp_ac_remote_model_t model, const bool on, const bool prev_power, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const bool filter, const bool clean)IRacprivate + strToBool(const char *str, const bool def=false)IRacstatic + strToFanspeed(const char *str, const stdAc::fanspeed_t def=stdAc::fanspeed_t::kAuto)IRacstatic + strToModel(const char *str, const int16_t def=-1)IRacstatic + strToOpmode(const char *str, const stdAc::opmode_t def=stdAc::opmode_t::kAuto)IRacstatic + strToSwingH(const char *str, const stdAc::swingh_t def=stdAc::swingh_t::kOff)IRacstatic + strToSwingV(const char *str, const stdAc::swingv_t def=stdAc::swingv_t::kOff)IRacstatic + swinghToString(const stdAc::swingh_t swingh)IRacstatic + swingvToString(const stdAc::swingv_t swingv)IRacstatic + tcl112(IRTcl112Ac *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool light, const bool econo, const bool filter)IRacprivate + technibel(IRTechnibelAc *ac, const bool on, const stdAc::opmode_t mode, const bool celsius, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const int16_t sleep=-1)IRacprivate + teco(IRTecoAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool light, const int16_t sleep=-1)IRacprivate + toshiba(IRToshibaAC *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool econo)IRacprivate + transcold(IRTranscoldAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh)IRacprivate + trotec(IRTrotecESP *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const int16_t sleep=-1)IRacprivate + vestel(IRVestelAc *ac, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool filter, const int16_t sleep=-1, const int16_t clock=-1, const bool sendNormal=true)IRacprivate + voltas(IRVoltas *ac, const voltas_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const stdAc::swingh_t swingh, const bool turbo, const bool econo, const bool light, const int16_t sleep=-1)IRacprivate + whirlpool(IRWhirlpoolAc *ac, const whirlpool_ac_remote_model_t model, const bool on, const stdAc::opmode_t mode, const float degrees, const stdAc::fanspeed_t fan, const stdAc::swingv_t swingv, const bool turbo, const bool light, const int16_t sleep=-1, const int16_t clock=-1)IRacprivate
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_i.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_i.html similarity index 95% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_i.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_i.html index 0840ec5d1..6df743e6d 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_i.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_i.html @@ -73,6 +73,11 @@ $(function() {
  • initState() : IRac
  • +
  • Ion +: NeoclimaProtocol +, SamsungProtocol +, SharpProtocol +
  • IonFilter : KelvinatorProtocol
  • @@ -188,6 +193,9 @@ $(function() {
  • IRPanasonicAc() : IRPanasonicAc
  • +
  • IRPanasonicAc32() +: IRPanasonicAc32 +
  • irparams_save : IRrecv
  • @@ -195,7 +203,7 @@ $(function() { : IRsend
  • IRrecv() -: IRrecv +: IRrecv
  • IRSamsungAc() : IRSamsungAc @@ -262,7 +270,7 @@ $(function() { , IRWhirlpoolAc
  • isPowerSpecial() -: IRSharpAc +: IRSharpAc
  • isProtocolSupported() : IRac diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_k.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_k.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_k.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_k.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_l.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_l.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_l.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_l.html index 230684899..5e1952dac 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_l.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_l.html @@ -84,6 +84,7 @@ $(function() { , GoodweatherProtocol , GreeProtocol , KelvinatorProtocol +, NeoclimaProtocol
  • light : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_m.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_m.html similarity index 93% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_m.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_m.html index 2fcda950e..6467a5d30 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_m.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_m.html @@ -160,6 +160,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
  • mode : stdAc::state_t @@ -172,6 +177,7 @@ $(function() {
  • Model : Hitachi1Protocol +, SharpProtocol
  • model : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_n.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_n.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_n.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_n.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_o.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_o.html similarity index 98% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_o.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_o.html index 53df78384..c0884b6f0 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_o.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_o.html @@ -111,6 +111,9 @@ $(function() { : Daikin128Protocol , Daikin64Protocol
  • +
  • OffHour +: SanyoProtocol +
  • OffHours : Daikin128Protocol , Daikin64Protocol @@ -137,6 +140,7 @@ $(function() { , DelonghiProtocol , HaierProtocol , MideaProtocol +, SanyoProtocol
  • OffTimer12Hr : VoltasProtocol diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_p.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_p.html similarity index 89% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_p.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_p.html index 25c9c56ad..3a94ab9ae 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_p.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_p.html @@ -69,6 +69,7 @@ $(function() { , Daikin2Protocol , Hitachi1Protocol , Mitsubishi136Protocol +, SharpProtocol
  • pad0 : Daikin152Protocol @@ -80,6 +81,7 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, SamsungProtocol
  • pad1 : Daikin152Protocol @@ -91,6 +93,7 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, SamsungProtocol
  • pad2 : Daikin152Protocol @@ -109,6 +112,9 @@ $(function() {
  • panasonic() : IRac
  • +
  • panasonic32() +: IRac +
  • periodOffset : IRsend
  • @@ -141,6 +147,8 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, SanyoProtocol
  • power : stdAc::state_t @@ -148,9 +156,15 @@ $(function() {
  • Power : VoltasProtocol
  • +
  • Power1 +: SamsungProtocol +
  • Power2 : Daikin2Protocol
  • +
  • Power6 +: SamsungProtocol +
  • PowerButton : CoronaProtocol
  • @@ -164,9 +178,19 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol +
  • Powerful10 +: SamsungProtocol +
  • +
  • Powerful8 +: SamsungProtocol +
  • +
  • PowerSpecial +: SharpProtocol +
  • PowerToggle : AirwellProtocol , Hitachi1Protocol +, PanasonicAc32Protocol
  • Prefix : HaierProtocol diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_q.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_q.html similarity index 93% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_q.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_q.html index 9d0d45280..c2d2ca34d 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_q.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_q.html @@ -73,6 +73,12 @@ $(function() {
  • quiet : stdAc::state_t
  • +
  • Quiet1 +: SamsungProtocol +
  • +
  • Quiet5 +: SamsungProtocol +
diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_r.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_r.html similarity index 94% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_r.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_r.html index 0a89e9136..33f68cdc8 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_r.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_r.html @@ -93,6 +93,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • rawbuf @@ -113,18 +118,12 @@ $(function() {
  • recvpin : irparams_t
  • -
  • remote -: IRSharpAc -
  • remote_state : GreeProtocol , HaierProtocol , IRFujitsuAC , IRHitachiAc3 -, IRNeoclimaAc , IRPanasonicAc -, IRSamsungAc -, IRSanyoAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_rela.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_rela.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_rela.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_rela.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_s.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_s.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_s.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_s.html index d40a77cd3..aa2206aef 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_s.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_s.html @@ -118,6 +118,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -445,10 +446,12 @@ $(function() {
  • Sensor : Daikin152Protocol , DaikinESPProtocol +, SanyoProtocol
  • SensorTemp : CoolixProtocol , MideaProtocol +, SanyoProtocol
  • set3D() : IRMitsubishiHeavy152Ac @@ -581,6 +584,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -702,6 +706,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -858,6 +863,7 @@ $(function() { , IRDaikin128 , IRDaikin64 , IRHitachiAc1 +, IRPanasonicAc32 , IRWhirlpoolAc
  • setPurify() @@ -912,6 +918,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -922,7 +929,7 @@ $(function() { , IRToshibaAC , IRTranscoldAc , IRTrotecESP -, IRVestelAc +, IRVestelAc , IRVoltas , IRWhirlpoolAc
  • @@ -1024,6 +1031,7 @@ $(function() { , IRKelvinatorAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac +, IRPanasonicAc32 , IRPanasonicAc , IRTcl112Ac @@ -1055,6 +1063,7 @@ $(function() { , IRKelvinatorAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac +, IRPanasonicAc32 , IRPanasonicAc , IRTcl112Ac @@ -1101,6 +1110,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -1228,6 +1238,8 @@ $(function() { , HaierYRW02Protocol , Hitachi1Protocol , MideaProtocol +, NeoclimaProtocol +, SanyoProtocol
  • sleep : stdAc::state_t @@ -1244,6 +1256,9 @@ $(function() {
  • space() : IRsend
  • +
  • Special +: SharpProtocol +
  • start : IRtimer , TimerMs @@ -1290,6 +1305,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc @@ -1351,6 +1367,9 @@ $(function() { , MideaProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, NeoclimaProtocol +, SanyoProtocol +, SharpProtocol
  • Sum1 : Daikin128Protocol @@ -1360,6 +1379,7 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • Sum2 : Daikin128Protocol @@ -1369,6 +1389,7 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • Sum3 : DaikinESPProtocol @@ -1378,6 +1399,8 @@ $(function() { , GreeProtocol , HaierProtocol , HaierYRW02Protocol +, SamsungProtocol +, SharpProtocol
  • SwingAuto : GreeProtocol @@ -1398,6 +1421,8 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol
  • swingh : stdAc::state_t @@ -1440,6 +1465,9 @@ $(function() { , Mitsubishi112Protocol , Mitsubishi136Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SanyoProtocol
  • swingv : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_t.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_t.html similarity index 92% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_t.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_t.html index 0073b1706..dbb81297e 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_t.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_t.html @@ -105,6 +105,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • TempExtraDegreeF @@ -133,12 +138,14 @@ $(function() {
  • TimerEnabled : GreeProtocol +, SharpProtocol
  • TimerHalfHr : GreeProtocol
  • TimerHours : GreeProtocol +, SharpProtocol
  • TimerMs() : TimerMs @@ -146,6 +153,9 @@ $(function() {
  • TimerTensHr : GreeProtocol
  • +
  • TimerType +: SharpProtocol +
  • toCommon() : IRAirwellAc , IRAmcorAc @@ -180,11 +190,12 @@ $(function() { , IRMitsubishiAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac -, IRNeoclimaAc +, IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc -, IRSamsungAc -, IRSanyoAc -, IRSharpAc +, IRSamsungAc +, IRSanyoAc +, IRSharpAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc @@ -225,10 +236,11 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc -, IRSharpAc +, IRSharpAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc @@ -268,10 +280,11 @@ $(function() { , IRMitsubishiAC , IRMitsubishiHeavy152Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc -, IRSharpAc +, IRSharpAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc @@ -306,6 +319,7 @@ $(function() { , IRMitsubishiAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac +, IRPanasonicAc32 , IRPanasonicAc , IRSanyoAc
  • @@ -358,11 +372,12 @@ $(function() { , IRMitsubishiAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac -, IRNeoclimaAc +, IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc -, IRSamsungAc -, IRSanyoAc -, IRSharpAc +, IRSamsungAc +, IRSanyoAc +, IRSharpAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc @@ -385,6 +400,7 @@ $(function() { , GreeProtocol , HaierYRW02Protocol , KelvinatorProtocol +, NeoclimaProtocol
  • turbo : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_u.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_u.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_u.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_u.html index 88b9697d3..dee723cd1 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_u.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_u.html @@ -85,6 +85,9 @@ $(function() {
  • used : match_result_t
  • +
  • UseFah +: NeoclimaProtocol +
  • UseFahrenheit : GreeProtocol
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_v.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_v.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_v.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_v.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars.html similarity index 87% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars.html index 9c3192c5a..67f3c0ae2 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars.html @@ -96,6 +96,11 @@ $(function() { , IRMitsubishiAC , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac +, IRNeoclimaAc +, IRPanasonicAc32 +, IRSamsungAc +, IRSanyoAc +, IRSharpAc , IRVoltas
  • __pad0__ @@ -130,6 +135,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad10__ @@ -140,6 +150,9 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SharpProtocol
  • __pad11__ : ArgoProtocol @@ -149,6 +162,7 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, SamsungProtocol
  • __pad12__ : ArgoProtocol @@ -158,30 +172,35 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, SamsungProtocol
  • __pad13__ : ArgoProtocol , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • __pad14__ : ArgoProtocol , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • __pad15__ : ArgoProtocol , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • __pad16__ : ArgoProtocol , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • __pad17__ : Daikin2Protocol @@ -225,6 +244,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad20__ @@ -271,6 +295,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad3__ @@ -299,6 +328,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad4__ @@ -326,6 +360,10 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad5__ @@ -348,6 +386,10 @@ $(function() { , Mitsubishi112Protocol , Mitsubishi144Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad6__ @@ -367,6 +409,10 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • __pad7__ @@ -381,6 +427,10 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
  • __pad8__ : AmcorProtocol @@ -392,6 +442,10 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
  • __pad9__ : ArgoProtocol @@ -401,6 +455,10 @@ $(function() { , HaierYRW02Protocol , KelvinatorProtocol , Mitsubishi152Protocol +, NeoclimaProtocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
  • _clean : IRFujitsuAC @@ -470,6 +528,7 @@ $(function() { , IRMitsubishiHeavy152Ac , IRMitsubishiHeavy88Ac , IRNeoclimaAc +, IRPanasonicAc32 , IRPanasonicAc , IRSamsungAc , IRSanyoAc diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_a.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_a.html similarity index 96% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_a.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_a.html index 41826cf6f..5b9140e97 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_a.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_a.html @@ -64,6 +64,9 @@ $(function() {  

    - a -

      +
    • A705 +: SharpProtocol +
    • address : decode_results
    • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_b.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_b.html similarity index 90% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_b.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_b.html index bfc649750..9cf291f62 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_b.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_b.html @@ -72,6 +72,8 @@ $(function() {
    • Beep : Daikin2Protocol +, SamsungProtocol +, SanyoProtocol
    • beep : stdAc::state_t @@ -85,12 +87,16 @@ $(function() {
    • Boost : DelonghiProtocol
    • +
    • Breeze +: SamsungProtocol +
    • bufsize : irparams_t
    • Button : HaierYRW02Protocol , Hitachi424Protocol +, NeoclimaProtocol
    • byte : magiquest diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_c.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_c.html similarity index 92% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_c.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_c.html index 750dc0ef8..e1763e40f 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_c.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_c.html @@ -70,6 +70,9 @@ $(function() {
    • celsius : stdAc::state_t
    • +
    • CHeat +: NeoclimaProtocol +
    • Checksum : VoltasProtocol
    • @@ -78,10 +81,17 @@ $(function() { , ElectraProtocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, SharpProtocol
    • clean : stdAc::state_t
    • +
    • Clean10 +: SamsungProtocol +
    • +
    • Clean11 +: SamsungProtocol +
    • cleanFlag : IRCoolixAC
    • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_d.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_d.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_d.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_d.html index 4be6c5d87..d1df0efc5 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_d.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_d.html @@ -91,6 +91,9 @@ $(function() {
    • disableSensor : MideaProtocol
    • +
    • Display +: SamsungProtocol +
    • DisplayTemp : GreeProtocol
    • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_e.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_e.html similarity index 94% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_e.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_e.html index fbfbe37b6..77ac4dfeb 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_e.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_e.html @@ -70,6 +70,7 @@ $(function() { , Daikin152Protocol , Daikin2Protocol , DaikinESPProtocol +, NeoclimaProtocol
    • econo : stdAc::state_t @@ -79,6 +80,7 @@ $(function() {
    • Eye : Daikin2Protocol +, NeoclimaProtocol
    • EyeAuto : Daikin2Protocol diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_f.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_f.html similarity index 90% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_f.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_f.html index 51f23e706..7f87b8d7b 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_f.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_f.html @@ -99,6 +99,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
    • FanAuto : Mitsubishi144Protocol @@ -121,6 +126,12 @@ $(function() {
    • flap_mode : IRArgoAC
    • +
    • Follow +: NeoclimaProtocol +
    • +
    • Fresh +: NeoclimaProtocol +
    • FreshAir : Daikin2Protocol
    • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_h.html similarity index 96% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_h.html index 34b29ebe3..d1931952b 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_h.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_h.html @@ -80,6 +80,9 @@ $(function() {
    • heat_mode : IRArgoAC
    • +
    • Hold +: NeoclimaProtocol +
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_i.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_i.html similarity index 91% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_i.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_i.html index 53632cba7..cbdfd1ba1 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_i.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_i.html @@ -70,6 +70,11 @@ $(function() {
  • IFeel : GreeProtocol
  • +
  • Ion +: NeoclimaProtocol +, SamsungProtocol +, SharpProtocol +
  • IonFilter : KelvinatorProtocol
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_l.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_l.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_l.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_l.html index 1e218e1ab..36b55b61e 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_l.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_l.html @@ -75,6 +75,7 @@ $(function() { , GoodweatherProtocol , GreeProtocol , KelvinatorProtocol +, NeoclimaProtocol
  • light : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_m.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_m.html similarity index 92% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_m.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_m.html index 10cb07d68..238c657f5 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_m.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_m.html @@ -103,6 +103,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol
  • mode : stdAc::state_t @@ -115,6 +120,7 @@ $(function() {
  • Model : Hitachi1Protocol +, SharpProtocol
  • model : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_n.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_n.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_n.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_n.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_o.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_o.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_o.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_o.html index 2f41eac1f..537e89804 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_o.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_o.html @@ -68,6 +68,9 @@ $(function() { : Daikin128Protocol , Daikin64Protocol
  • +
  • OffHour +: SanyoProtocol +
  • OffHours : Daikin128Protocol , Daikin64Protocol @@ -94,6 +97,7 @@ $(function() { , DelonghiProtocol , HaierProtocol , MideaProtocol +, SanyoProtocol
  • OffTimer12Hr : VoltasProtocol diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_p.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_p.html similarity index 90% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_p.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_p.html index ab11bbe54..c51b187b1 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_p.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_p.html @@ -69,6 +69,7 @@ $(function() { , Daikin2Protocol , Hitachi1Protocol , Mitsubishi136Protocol +, SharpProtocol
  • pad0 : Daikin152Protocol @@ -80,6 +81,7 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, SamsungProtocol
  • pad1 : Daikin152Protocol @@ -91,6 +93,7 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, SamsungProtocol
  • pad2 : Daikin152Protocol @@ -138,6 +141,8 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, SanyoProtocol
  • power : stdAc::state_t @@ -145,9 +150,15 @@ $(function() {
  • Power : VoltasProtocol
  • +
  • Power1 +: SamsungProtocol +
  • Power2 : Daikin2Protocol
  • +
  • Power6 +: SamsungProtocol +
  • PowerButton : CoronaProtocol
  • @@ -161,9 +172,19 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol +
  • Powerful10 +: SamsungProtocol +
  • +
  • Powerful8 +: SamsungProtocol +
  • +
  • PowerSpecial +: SharpProtocol +
  • PowerToggle : AirwellProtocol , Hitachi1Protocol +, PanasonicAc32Protocol
  • Prefix : HaierProtocol diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_q.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_q.html similarity index 93% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_q.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_q.html index 72be4c2a5..3456d9de9 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_q.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_q.html @@ -73,6 +73,12 @@ $(function() {
  • quiet : stdAc::state_t
  • +
  • Quiet1 +: SamsungProtocol +
  • +
  • Quiet5 +: SamsungProtocol +
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_r.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_r.html similarity index 94% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_r.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_r.html index 1e1240a83..284db9104 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_r.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_r.html @@ -93,6 +93,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • rawbuf @@ -109,18 +114,12 @@ $(function() {
  • recvpin : irparams_t
  • -
  • remote -: IRSharpAc -
  • remote_state : GreeProtocol , HaierProtocol , IRFujitsuAC , IRHitachiAc3 -, IRNeoclimaAc , IRPanasonicAc -, IRSamsungAc -, IRSanyoAc , IRTcl112Ac , IRTechnibelAc , IRTecoAc diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_s.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_s.html similarity index 89% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_s.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_s.html index b901f1b2c..2c61af9cc 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_s.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_s.html @@ -79,10 +79,12 @@ $(function() {
  • Sensor : Daikin152Protocol , DaikinESPProtocol +, SanyoProtocol
  • SensorTemp : CoolixProtocol , MideaProtocol +, SanyoProtocol
  • Sig : Mitsubishi152Protocol @@ -105,6 +107,8 @@ $(function() { , HaierYRW02Protocol , Hitachi1Protocol , MideaProtocol +, NeoclimaProtocol +, SanyoProtocol
  • sleep : stdAc::state_t @@ -118,6 +122,9 @@ $(function() {
  • SleepTimer : Daikin2Protocol
  • +
  • Special +: SharpProtocol +
  • start : IRtimer , TimerMs @@ -151,6 +158,9 @@ $(function() { , MideaProtocol , Mitsubishi112Protocol , Mitsubishi144Protocol +, NeoclimaProtocol +, SanyoProtocol +, SharpProtocol
  • Sum1 : Daikin128Protocol @@ -160,6 +170,7 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • Sum2 : Daikin128Protocol @@ -169,6 +180,7 @@ $(function() { , Daikin2Protocol , DaikinESPProtocol , KelvinatorProtocol +, SamsungProtocol
  • Sum3 : DaikinESPProtocol @@ -178,6 +190,8 @@ $(function() { , GreeProtocol , HaierProtocol , HaierYRW02Protocol +, SamsungProtocol +, SharpProtocol
  • SwingAuto : GreeProtocol @@ -198,6 +212,8 @@ $(function() { , KelvinatorProtocol , Mitsubishi112Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol
  • swingh : stdAc::state_t @@ -237,6 +253,9 @@ $(function() { , Mitsubishi112Protocol , Mitsubishi136Protocol , Mitsubishi152Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SanyoProtocol
  • swingv : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_t.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_t.html similarity index 89% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_t.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_t.html index 6c6f30e63..13ff8b493 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_t.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_t.html @@ -96,6 +96,11 @@ $(function() { , Mitsubishi144Protocol , Mitsubishi152Protocol , Mitsubishi88Protocol +, NeoclimaProtocol +, PanasonicAc32Protocol +, SamsungProtocol +, SanyoProtocol +, SharpProtocol , VoltasProtocol
  • TempExtraDegreeF @@ -118,22 +123,28 @@ $(function() {
  • TimerEnabled : GreeProtocol +, SharpProtocol
  • TimerHalfHr : GreeProtocol
  • TimerHours : GreeProtocol +, SharpProtocol
  • TimerTensHr : GreeProtocol
  • +
  • TimerType +: SharpProtocol +
  • Turbo : ElectraProtocol , GoodweatherProtocol , GreeProtocol , HaierYRW02Protocol , KelvinatorProtocol +, NeoclimaProtocol
  • turbo : stdAc::state_t diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_u.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_u.html similarity index 96% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_u.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_u.html index 3d71e3cf6..001192f63 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_u.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_u.html @@ -79,6 +79,9 @@ $(function() {
  • used : match_result_t
  • +
  • UseFah +: NeoclimaProtocol +
  • UseFahrenheit : GreeProtocol
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_v.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_v.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_v.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_v.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_w.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_w.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_w.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_w.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_x.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_x.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_x.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_x.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_z.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_z.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_vars_z.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_vars_z.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_w.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_w.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_w.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_w.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_x.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_x.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_x.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_x.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_z.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_z.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_z.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_z.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_~.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_~.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/functions_~.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/functions_~.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_a.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_a.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_a.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_a.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_c.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_c.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_c.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_c.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_d.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_d.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_d.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_d.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_e.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_e.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_e.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_e.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_enum.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_enum.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_enum.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_enum.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_eval.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_eval.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_eval.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_eval.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_f.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_f.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_f.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_f.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_func.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_func.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_func.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_func.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_g.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_g.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_g.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_g.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_h.html similarity index 97% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_h.html index fb077717b..317031034 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_h.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_h.html @@ -95,6 +95,9 @@ $(function() {
  • HITACHI_AC424 : IRremoteESP8266.h
  • +
  • hw_timer_t +: IRrecv.cpp +
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_i.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_i.html similarity index 87% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_i.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_i.html index 4a0b8d8b6..4ab24d5e7 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_i.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_i.html @@ -68,17 +68,8 @@ $(function() { : IRremoteESP8266.h
  • invertBits() -: IRutils.cpp -, IRutils.h -
  • -
  • irparams -: IRrecv.cpp -
  • -
  • irparams_save -: IRrecv.cpp -
  • -
  • irremote_mux -: IRrecv.cpp +: IRutils.h +, IRutils.cpp
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_j.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_j.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_j.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_j.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_k.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_k.html similarity index 95% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_k.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_k.html index e8a519f06..69a39d6a0 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_k.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_k.html @@ -4061,16 +4061,16 @@ $(function() { : IRutils.h
  • kModelStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kModeStr : IRtext.cpp , IRtext.h
  • kMouldStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kMoveStr : IRtext.cpp @@ -4179,9 +4179,6 @@ $(function() {
  • kNecZeroSpaceTicks : ir_NEC.h
  • -
  • kNeoclima8CHeatOffset -: ir_Neoclima.h -
  • kNeoclimaAuto : ir_Neoclima.h
  • @@ -4224,15 +4221,9 @@ $(function() {
  • kNeoclimaButtonMode : ir_Neoclima.h
  • -
  • kNeoclimaButtonOffset -: ir_Neoclima.h -
  • kNeoclimaButtonPower : ir_Neoclima.h
  • -
  • kNeoclimaButtonSize -: ir_Neoclima.h -
  • kNeoclimaButtonSleep : ir_Neoclima.h
  • @@ -4257,12 +4248,6 @@ $(function() {
  • kNeoclimaDry : ir_Neoclima.h
  • -
  • kNeoclimaEconoOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaEyeOffset -: ir_Neoclima.h -
  • kNeoclimaFan : ir_Neoclima.h
  • @@ -4278,18 +4263,9 @@ $(function() {
  • kNeoclimaFanMed : ir_Neoclima.h
  • -
  • kNeoclimaFanOffest -: ir_Neoclima.h -
  • -
  • kNeoclimaFanSize -: ir_Neoclima.h -
  • kNeoclimaFollowMe : ir_Neoclima.h
  • -
  • kNeoclimaFreshOffset -: ir_Neoclima.h -
  • kNeoclimaHdrMark : ir_Neoclima.cpp
  • @@ -4299,15 +4275,6 @@ $(function() {
  • kNeoclimaHeat : ir_Neoclima.h
  • -
  • kNeoclimaHoldOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaIonOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaLightOffset -: ir_Neoclima.h -
  • kNeoclimaMaxTempC : ir_Neoclima.h
  • @@ -4326,48 +4293,18 @@ $(function() {
  • kNeoclimaMinTempF : ir_Neoclima.h
  • -
  • kNeoclimaModeOffset -: ir_Neoclima.h -
  • kNeoclimaOneSpace : ir_Neoclima.cpp
  • -
  • kNeoclimaPowerOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaSleepOffset -: ir_Neoclima.h -
  • kNeoclimaStateLength : IRremoteESP8266.h
  • -
  • kNeoclimaSwingHOffset -: ir_Neoclima.h -
  • kNeoclimaSwingVOff : ir_Neoclima.h
  • -
  • kNeoclimaSwingVOffset -: ir_Neoclima.h -
  • kNeoclimaSwingVOn : ir_Neoclima.h
  • -
  • kNeoclimaSwingVSize -: ir_Neoclima.h -
  • -
  • kNeoclimaTempOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaTempSize -: ir_Neoclima.h -
  • -
  • kNeoclimaTurboOffset -: ir_Neoclima.h -
  • -
  • kNeoclimaUseFahrenheitOffset -: ir_Neoclima.h -
  • kNeoclimaZeroSpace : ir_Neoclima.cpp
  • @@ -4375,8 +4312,8 @@ $(function() { : IRutils.h
  • kNightStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kNikaiBitMark : ir_Nikai.cpp @@ -4432,29 +4369,32 @@ $(function() { , IRtext.h
  • kOffStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kOffTimerStr : IRtext.cpp , IRtext.h
  • kOnStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kOnTimerStr : IRtext.cpp , IRtext.h
  • kOutsideQuietStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kOutsideStr : IRtext.cpp , IRtext.h
  • +
  • kPanasonicAc32Auto +: ir_Panasonic.h +
  • kPanasonicAc32BitMark : ir_Panasonic.cpp
  • @@ -4464,12 +4404,45 @@ $(function() {
  • kPanasonicAc32BlocksPerSection : ir_Panasonic.cpp
  • +
  • kPanasonicAc32Cool +: ir_Panasonic.h +
  • +
  • kPanasonicAc32Dry +: ir_Panasonic.h +
  • +
  • kPanasonicAc32Fan +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanAuto +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanHigh +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanLow +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanMax +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanMed +: ir_Panasonic.h +
  • +
  • kPanasonicAc32FanMin +: ir_Panasonic.h +
  • kPanasonicAc32HdrMark : ir_Panasonic.cpp
  • kPanasonicAc32HdrSpace : ir_Panasonic.cpp
  • +
  • kPanasonicAc32Heat +: ir_Panasonic.h +
  • +
  • kPanasonicAc32KnownGood +: ir_Panasonic.h +
  • kPanasonicAc32OneSpace : ir_Panasonic.cpp
  • @@ -4479,6 +4452,9 @@ $(function() {
  • kPanasonicAc32Sections : ir_Panasonic.cpp
  • +
  • kPanasonicAc32SwingVAuto +: ir_Panasonic.h +
  • kPanasonicAc32ZeroSpace : ir_Panasonic.cpp
  • @@ -4727,20 +4703,20 @@ $(function() { , IRtext.h
  • kPowerfulStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kPowerStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kPowerToggleStr : IRtext.h , IRtext.cpp
  • kPreviousPowerStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kProntoDataOffset : ir_Pronto.cpp @@ -4768,12 +4744,12 @@ $(function() { , IRtext.h
  • kPurifyStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kQuietStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kRawBuf : IRrecv.h @@ -4960,12 +4936,12 @@ $(function() { , IRtext.cpp
  • kRightMaxStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kRightStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kRoomStr : IRtext.cpp @@ -4995,39 +4971,21 @@ $(function() {
  • kSamsungAcAutoTemp : ir_Samsung.h
  • -
  • kSamsungAcBeepOffset -: ir_Samsung.h -
  • kSamsungAcBitMark : ir_Samsung.cpp
  • kSamsungAcBits : IRremoteESP8266.h
  • -
  • kSamsungAcBreezeOffset -: ir_Samsung.h -
  • kSamsungAcBreezeOn : ir_Samsung.h
  • -
  • kSamsungAcBreezeSize -: ir_Samsung.h -
  • -
  • kSamsungAcClean10Offset -: ir_Samsung.h -
  • -
  • kSamsungAcClean11Offset -: ir_Samsung.h -
  • kSamsungAcCool : ir_Samsung.h
  • kSamsungAcDefaultRepeat : IRremoteESP8266.h
  • -
  • kSamsungAcDisplayOffset -: ir_Samsung.h -
  • kSamsungAcDry : ir_Samsung.h
  • @@ -5055,12 +5013,6 @@ $(function() {
  • kSamsungAcFanMed : ir_Samsung.h
  • -
  • kSamsungAcFanOffest -: ir_Samsung.h -
  • -
  • kSamsungAcFanSize -: ir_Samsung.h -
  • kSamsungAcFanTurbo : ir_Samsung.h
  • @@ -5073,51 +5025,24 @@ $(function() {
  • kSamsungAcHeat : ir_Samsung.h
  • -
  • kSamsungAcIonOffset -: ir_Samsung.h -
  • kSamsungAcMaxTemp : ir_Samsung.h
  • kSamsungAcMinTemp : ir_Samsung.h
  • -
  • kSamsungAcModeOffset -: ir_Samsung.h -
  • kSamsungAcOneSpace : ir_Samsung.cpp
  • -
  • kSamsungAcPower1Offset -: ir_Samsung.h -
  • -
  • kSamsungAcPower6Offset -: ir_Samsung.h -
  • -
  • kSamsungAcPower6Size -: ir_Samsung.h -
  • -
  • kSamsungAcPowerful10Offset -: ir_Samsung.h -
  • kSamsungAcPowerful10On : ir_Samsung.h
  • -
  • kSamsungAcPowerful10Size -: ir_Samsung.h -
  • kSamsungAcPowerfulMask8 : ir_Samsung.h
  • kSamsungAcPowerSection : ir_Samsung.h
  • -
  • kSamsungAcQuiet1Offset -: ir_Samsung.h -
  • -
  • kSamsungAcQuiet5Offset -: ir_Samsung.h -
  • kSamsungAcSectionGap : ir_Samsung.cpp
  • @@ -5139,12 +5064,6 @@ $(function() {
  • kSamsungAcSwingMove : ir_Samsung.h
  • -
  • kSamsungAcSwingOffset -: ir_Samsung.h -
  • -
  • kSamsungAcSwingSize -: ir_Samsung.h -
  • kSamsungAcSwingStop : ir_Samsung.h
  • @@ -5208,9 +5127,6 @@ $(function() {
  • kSanyoAcAuto : ir_Sanyo.h
  • -
  • kSanyoAcBeepBit -: ir_Sanyo.h -
  • kSanyoAcBitMark : ir_Sanyo.cpp
  • @@ -5235,12 +5151,6 @@ $(function() {
  • kSanyoAcFanMedium : ir_Sanyo.h
  • -
  • kSanyoAcFanOffset -: ir_Sanyo.h -
  • -
  • kSanyoAcFanSize -: ir_Sanyo.h -
  • kSanyoAcFreq : ir_Sanyo.cpp
  • @@ -5259,57 +5169,15 @@ $(function() {
  • kSanyoAcHourMax : ir_Sanyo.h
  • -
  • kSanyoAcModeByte -: ir_Sanyo.h -
  • -
  • kSanyoAcModeOffset -: ir_Sanyo.h -
  • -
  • kSanyoAcModeSize -: ir_Sanyo.h -
  • -
  • kSanyoAcOffHourByte -: ir_Sanyo.h -
  • -
  • kSanyoAcOffHourOffset -: ir_Sanyo.h -
  • -
  • kSanyoAcOffHourSize -: ir_Sanyo.h -
  • -
  • kSanyoAcOffTimerEnableBit -: ir_Sanyo.h -
  • kSanyoAcOneSpace : ir_Sanyo.cpp
  • -
  • kSanyoAcPowerByte -: ir_Sanyo.h -
  • kSanyoAcPowerOff : ir_Sanyo.h
  • -
  • kSanyoAcPowerOffset -: ir_Sanyo.h -
  • kSanyoAcPowerOn : ir_Sanyo.h
  • -
  • kSanyoAcPowerSize -: ir_Sanyo.h -
  • -
  • kSanyoAcSensorBit -: ir_Sanyo.h -
  • -
  • kSanyoAcSensorByte -: ir_Sanyo.h -
  • -
  • kSanyoAcSleepBit -: ir_Sanyo.h -
  • -
  • kSanyoAcSleepByte -: ir_Sanyo.h -
  • kSanyoAcStateLength : IRremoteESP8266.h
  • @@ -5331,18 +5199,9 @@ $(function() {
  • kSanyoAcSwingVLowest : ir_Sanyo.h
  • -
  • kSanyoAcSwingVOffset -: ir_Sanyo.h -
  • -
  • kSanyoAcSwingVSize -: ir_Sanyo.h -
  • kSanyoAcSwingVUpperMiddle : ir_Sanyo.h
  • -
  • kSanyoAcTempByte -: ir_Sanyo.h -
  • kSanyoAcTempDelta : ir_Sanyo.h
  • @@ -5352,12 +5211,6 @@ $(function() {
  • kSanyoAcTempMin : ir_Sanyo.h
  • -
  • kSanyoAcTempOffset -: ir_Sanyo.h -
  • -
  • kSanyoAcTempSize -: ir_Sanyo.h -
  • kSanyoAcZeroSpace : ir_Sanyo.cpp
  • @@ -5423,73 +5276,37 @@ $(function() { , IRtext.h
  • kSecondsStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSecondStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSensorStr : IRtext.cpp , IRtext.h
  • kSensorTempStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSetStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSharpAcAuto : ir_Sharp.h
  • -
  • kSharpAcBitCleanOffset -: ir_Sharp.h -
  • -
  • kSharpAcBitIonOffset -: ir_Sharp.h -
  • kSharpAcBitMark : ir_Sharp.h
  • kSharpAcBits : IRremoteESP8266.h
  • -
  • kSharpAcBitTimerEnabled -: ir_Sharp.h -
  • -
  • kSharpAcBitTimerType -: ir_Sharp.h -
  • -
  • kSharpAcByteClean -: ir_Sharp.h -
  • -
  • kSharpAcByteFan -: ir_Sharp.h -
  • -
  • kSharpAcByteIon -: ir_Sharp.h -
  • -
  • kSharpAcByteMode -: ir_Sharp.h -
  • -
  • kSharpAcBytePowerSpecial -: ir_Sharp.h -
  • -
  • kSharpAcByteSpecial -: ir_Sharp.h -
  • -
  • kSharpAcByteSwing -: ir_Sharp.h -
  • kSharpAcByteTemp : ir_Sharp.h
  • -
  • kSharpAcByteTimer -: ir_Sharp.h -
  • kSharpAcCool : ir_Sharp.h
  • @@ -5523,12 +5340,6 @@ $(function() {
  • kSharpAcFanMin : ir_Sharp.h
  • -
  • kSharpAcFanOffset -: ir_Sharp.h -
  • -
  • kSharpAcFanSize -: ir_Sharp.h -
  • kSharpAcGap : ir_Sharp.h
  • @@ -5547,12 +5358,6 @@ $(function() {
  • kSharpAcMinTemp : ir_Sharp.h
  • -
  • kSharpAcModelBit -: ir_Sharp.h -
  • -
  • kSharpAcModeSize -: ir_Sharp.h -
  • kSharpAcOffTimerType : ir_Sharp.h
  • @@ -5574,15 +5379,9 @@ $(function() {
  • kSharpAcPowerSetSpecialOff : ir_Sharp.h
  • -
  • kSharpAcPowerSetSpecialOffset -: ir_Sharp.h -
  • kSharpAcPowerSetSpecialOn : ir_Sharp.h
  • -
  • kSharpAcPowerSpecialSize -: ir_Sharp.h -
  • kSharpAcPowerTimerSetting : ir_Sharp.h
  • @@ -5616,12 +5415,6 @@ $(function() {
  • kSharpAcSwingNoToggle : ir_Sharp.h
  • -
  • kSharpAcSwingOffset -: ir_Sharp.h -
  • -
  • kSharpAcSwingSize -: ir_Sharp.h -
  • kSharpAcSwingToggle : ir_Sharp.h
  • @@ -5631,12 +5424,6 @@ $(function() {
  • kSharpAcTimerHoursOff : ir_Sharp.h
  • -
  • kSharpAcTimerHoursOffset -: ir_Sharp.h -
  • -
  • kSharpAcTimerHoursSize -: ir_Sharp.h -
  • kSharpAcTimerIncrement : ir_Sharp.h
  • @@ -5702,12 +5489,12 @@ $(function() { : IRremoteESP8266.h
  • kSleepStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kSleepTimerStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSlowStr : IRtext.cpp @@ -5800,8 +5587,8 @@ $(function() { : IRrecv.h
  • kStepStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kStopState : IRrecv.h @@ -5811,24 +5598,24 @@ $(function() { , IRtext.cpp
  • kSuperStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSwingHStr : IRtext.h , IRtext.cpp
  • kSwingStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSwingVModeStr : IRtext.cpp , IRtext.h
  • kSwingVStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kSwingVToggleStr : ir_Midea.h @@ -6212,8 +5999,8 @@ $(function() { , IRtext.cpp
  • kTempStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kTempUpStr : IRtext.h @@ -6242,8 +6029,8 @@ $(function() { : IRrecv.h
  • kTopStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kToshibaAcAuto : ir_Toshiba.h @@ -6589,8 +6376,8 @@ $(function() { , IRtext.h
  • kTurboStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kTurboToggleStr : IRtext.cpp @@ -6601,19 +6388,19 @@ $(function() { , IRtext.h
  • kUnknownStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kUnknownThreshold : IRrecv.h
  • kUpperStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kUpStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kUseDefTol : IRrecv.h @@ -6839,8 +6626,8 @@ $(function() { , IRtext.h
  • kWeeklyTimerStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kWhirlpoolAcAltTempOffset : ir_Whirlpool.h @@ -7080,20 +6867,20 @@ $(function() { : ir_Whynter.cpp
  • kWideStr -: IRtext.h -, IRtext.cpp +: IRtext.cpp +, IRtext.h
  • kWifiStr : IRtext.cpp , IRtext.h
  • kXFanStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kYesStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • kZepealBits : IRremoteESP8266.h @@ -7147,8 +6934,8 @@ $(function() { : ir_Zepeal.cpp
  • kZoneFollowStr -: IRtext.cpp -, IRtext.h +: IRtext.h +, IRtext.cpp
  • diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_l.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_l.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_l.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_l.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_m.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_m.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_m.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_m.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_n.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_n.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_n.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_n.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_p.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_p.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_p.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_p.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_r.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_r.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_r.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_r.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_s.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_s.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_s.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_s.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_t.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_t.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_t.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_t.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_type.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_type.html similarity index 96% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_type.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_type.html index 5f3e05a75..ce5fb8cc9 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/globals_type.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/globals_type.html @@ -62,6 +62,9 @@ $(function() {
     
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/i18n_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/i18n_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/i18n_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/i18n_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/i18n_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/i18n_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/i18n_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/i18n_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/index.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/index.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/index.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/index.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_0.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_0.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_1.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_1.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_10.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_10.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_11.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_11.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_12.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_12.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_13.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_13.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_14.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_14.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_15.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_15.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_16.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_16.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_17.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_17.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_18.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_18.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_19.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_19.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_2.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_2.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_20.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_20.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_21.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_21.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_22.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_22.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_23.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_23.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_24.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_24.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_25.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_25.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_26.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_26.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_27.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_27.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_28.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_28.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_29.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_29.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_3.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_3.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_30.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_30.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_31.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_31.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_32.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_32.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_33.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_33.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_34.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_34.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_35.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_35.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_36.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_36.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_37.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_37.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_38.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_38.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_39.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_39.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_4.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_4.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_40.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_40.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_41.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_41.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_42.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_42.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_43.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_43.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_44.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_44.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_45.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_45.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_46.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_46.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_47.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_47.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_48.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_48.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_49.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_49.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_5.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_5.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_50.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_50.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_51.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_51.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_52.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_52.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_53.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_53.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_54.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_54.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_55.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_55.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_56.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_56.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_57.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_57.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_58.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_58.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_59.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_59.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_6.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_6.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_60.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_60.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.map new file mode 100644 index 000000000..8234a7463 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.map @@ -0,0 +1,3 @@ + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.md5 new file mode 100644 index 000000000..fb2602ca0 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.md5 @@ -0,0 +1 @@ +a933b42bdde6be117985126166b7d49e \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_61.png new file mode 100644 index 0000000000000000000000000000000000000000..1c2d7082b418d96f9a2f6b56e6828ec922732ec8 GIT binary patch literal 1882 zcmV-g2c`IlP)(MdZj5TDFMSUsH>~8% z;NV~c2L~e~BLjnjgKS)_RwFq%8G(U;h=_>5sZ*z5u~@ts!ySuubBz=gk=$9E3z7!T$aGF)}i;SS9_F*zI=I)YRbk@#Cnfs`5(v;K2hNK71Ix zy}jt_>caT=IF1}S!p2KVN^tJnIT(#bw6?aQy}ca;1qFYs_C-H!`TF`IKR+J~!$7Om z&YQ#M^KtX$P5k`%6B>;Msi~=87zWFhErUoTLP<#pX8&^}K0Y27FJ6RHDg~dNJt1mLql=&=uwP~jd?uw+|!oD zVu4&Phe#wsP*4y~oH&7BzkadtSFc_{C=}xU{rfN&3{F2VclxrjG8{a35CVY!QBhII z&CNw;XD6#|Yiq;4efz-Y^AQ&phrGNzym|9x;V;cY7Tr8ns}=X|-2=lgNJvQVNYmWh z3_=K|rl#=x`ExvZ@&pYH4GuYVb#=IL;|7L@hmoC~4Vg^F8pNIc%a<=GDk?&KeLa5s z_<`HEZ#(pzo}Lb~*^Hi^9&~ng!e}%?CX;zQ_FQB#8M?c>@$%(M7z_qTBoe4pDmGqK zRfRKW&Va|`AwNGKj~+epNAYsefL8ym?ytKE{6 zltkomxkDQOyYP5C(%jtaQe!roNnv3j2?z)v!^6W){Z~{}kc^BBw!LZ7CQ?>b#@a;nLHYM>(;HLy1JSW zLP%d<9|1smdwb`tYjALoL`FuE$;nAV2qB}Rqa-{$oLH?^kMx8PQd?Wg?q{)B>~bGe zR#p0|O4)kdP4e^Qu*=000vc69C{=FA|B+(9nSM=g%V{ zApto#Ie7p6J%Il{*IT}PIijPZ*}m7UTgS#c8GAP0zI}s_j}O+aT|4hSs;Q}g(P#vZ z#{-PfJTfOG^vhy?Y0#REosJL|Cm>L`FtpdU_iD{rzmNPNxF^L`Ft>z3tJ_ z(XiQU(ChV1F}vLkg+hT(pFV*Q!Y*xXZS1Mboqje9!yqgy48_I8=0Duh}HaKV!6BD7;YN6F?-Rf;N8`9I$(bLm| z-@kvOudff6FJH!*HER$X8w&uqaNzD)~#E}%*+Iz&&S!bXL0DzA&iq@<)EC@2W!<>gQ+mGJlX2LLoS zHp1WEA7Zf>5{U#65fNU`zs#n-z8)JlZbVX25@KRv(ACw2y?ghfs;UYpDJf3*JRT2H zsg%8Kccu67@qtVx!^x8;AruO+efxG;EEcF#Dy&$s0^{T3C@n2Te}6yLuV2s3sjXbO zlJmCAg(1Z8Heu!wJfSaDP~g@N^z8`>cc^(NoT28SaE6+P!Wn8F3TLQ!D4e0@p>W3K zt2aueaw+Se{G(_z8kaGb=5h6|4uvv<(+o3(;vsZ~nZg}v9tvluc_^Hr=Am%rKiW2- U7kwyhA^-pY07*qoM6N<$f-PZlw*UYD literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_61.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_62.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_62.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_63.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_63.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_64.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_64.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_65.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_65.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_66.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_66.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_67.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_67.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_68.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_68.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_69.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_7.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_7.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_69.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_70.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_70.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_71.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_71.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_72.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_72.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_73.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_73.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_74.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_74.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_75.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_75.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_76.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_76.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_77.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_77.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_78.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_78.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_79.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_8.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_8.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_79.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_80.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_80.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_81.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_81.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_82.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_82.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_83.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_83.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_84.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_84.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_85.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_85.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_86.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.map similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.map rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.map diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.md5 similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.md5 rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.md5 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.png similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/inherit_graph_86.png rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_87.png diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.map new file mode 100644 index 000000000..c4d102c45 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.map @@ -0,0 +1,3 @@ + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.md5 new file mode 100644 index 000000000..d7cc2880d --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.md5 @@ -0,0 +1 @@ +50d913fa42aa3a270fa531be27c6d9e7 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_88.png new file mode 100644 index 0000000000000000000000000000000000000000..a70fc3a2739164d0464ed19f7432e428018aa291 GIT binary patch literal 1434 zcmV;L1!ek)P)B;0nocwxV#+j4)< z4!`$v^`7TE=Q-bJ-}9dH?jNKm3Sj67{UDo8|55Ye`TrQ1E}58DS62rieD&&8EFzQ1?%utdJ5_(+ za5!$=x|NesNI8U%!{J=GaA9t4F0I35GTDO%4|1X;CuBJDjvYJJ*Vh+`L~^TUAJAwt z6h--bK7t?`8yo$8|3NFtoD9uVtJT3^aD04x_pVSVq|sH{U^1CboH$WfSlHRw8I49!nnIy~5Hc7Hi9|9uIJo<3FD{pBG#WQIH|OW)QCXc% zclq*V4u@m2*%C@^X=!n}TsLptgb>Q*@^m{&mYfY4n#W?X3Px z91dq~Z4H%06O^K;WKvO^$h;J32|G$rGrqgj008WEdweAG)h2|{WHOmdCZEq23wpg? z0Dw>^MC$@3lNk&KmzI`DlFZA?6N|+tO)8ZF07#NtT3TWU0E6-0%av9~DQadzw(s+dMx)JULlX`FAQFih8ynSX^`}pte*XOV=FJQ@hK5us6_?A^YPHv{T}!t@GO7Lj{V!j>JaXg+T5YD)QL^N$h`+z>alwK)5I_zW zESLian@3}?c{B!_M`N&gGzObTW3YKNCc#ht9zTA(|2i-kkifj==H~s^fyn?!;s58+ o7W~YkG1xpBgUzEc*gP8Z8@#@5aAH{cQUCw|07*qoM6N<$g4{Z?WdHyG literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.map new file mode 100644 index 000000000..533a66ce3 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.map @@ -0,0 +1,3 @@ + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.md5 new file mode 100644 index 000000000..0df68f458 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.md5 @@ -0,0 +1 @@ +c46308bc905d013a43886037b1dfc5ef \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_89.png new file mode 100644 index 0000000000000000000000000000000000000000..2bb74dcfd61a445b7a8cd0230f3b6c715baed5e3 GIT binary patch literal 1936 zcmV;B2XFX^P)id;ECD^c`~N>32vG?;`% zP?FN)ixu@ku_(%{7iDUi2<8m&g_UJ6^o=Vr%n?D(Os7*Lqsh`rx9j)f|M#HI&9j<4 z9PSSccFuKw@B6;4`@5U7vj>id2n>e!s9*A@XTV@A7R=lX(ZbBl5G~By4AJ5}_e6Vp zJFZ>3_9y1TVEi=o_4N+t9CmJ#$%F?F9{iRGF&Mwfz`%f0zdG#P)6DluU@-nRv|24x zD%HF(cFoNYEzH~u(ZbBl5G~ByjK7BX_;{3;mwT)~W^NaFy4Z~0i$~0zmX-#NpzNKug9T7huqQ>78ZizI8;|xyQMQ4jo80`KZ1gS5EK*yl}d%d z!9hOW+S-b=v^4np`y(_o6i1I9#n{*wA76|$h>eX!RaMn5_3Z-Sg?;<>p}V^q9UUF8TCK>;%;e*R zg@rhI@+3?q6P`YOing{k96NSwRv&B)=0J0(tE;1VPP-&EHI?%7^ZDbiU%wK^an#t@ zNIQ1yAOOU19LeQ!Dkvx*yWP&WRVWm6?%X*_PEIC2KR=3!ilQe^p78O7^d%)FB$vx+ z*|KGnkdQzf9UXjZWMqW0va%>BD2RfCgDE>Zn?^@R1&n#Kqe$_7eHFr}}6Nm_t zlapv@Xu!RD_fT6~JF87~bu}(sx`g53VPt1#L#}#Q>dw_!RY8H zu3Wh?tM81A3|K4{bar;)<;#~anM_ct)q=;Ki(0M5t5>h^@Zm%B_Vz-lR6?iI@$u5q zQXD^i91@8Hxw*NxbLWm*`f1E&GpeepuxHO6r*&;@ZN=uzo1Mnzh`$DcocCIB=rFfi{}GxhJ^zo+HPms3|)mqWXro*n`~y}iBsIfKDK z0LW}M3mSXoPSV%cM*yh1yL;Yw4Gs=cSXdbS`0;~?h(3M#L?Iy|G(J8qNKZsmSy{>N zl+n@APHS-E#tjM#3?!q`$e&wi4HOCm6&4n{RUf5NNtKnAf;Fyk6f)jlyK|S6lz`(n zgoK3P`Sa&!Y;45p)vHloUyqoW7)Yg3a2$vH{Co@y49wC72M6=deSLia0231v0N_#| z5fOpf+FG1GeHyW`vB=5E!Ryzr0sQYfGTz?akjv$K-|N<`<6}a`p2>#~AK>NXg|%zf z&YOQlMFmVI6C@G|IF7@rRjXh&n^9L+CrA$f2M!#7-EN23Y(_#t0=948j`8vFS#56K zyorK>0z7;6%%Lx5YcNfCcsT!DXnkg~kj7PxKQrF1;_)|>R;v|yy&fqkDHs_UK~`24 z&YwSzp`jtz?RFFw7h`H_N>HCd^t*QLLUVI7Uc7jLl#~=CCMIHhd>mn6VVIhlLVtfh z-_~d}0sz9o!rabJE|fq%F)y7A%sP}=AM|C zfZc9~zrQ~u5()HrJ&KEqJ*IDIX@N$gfzfEh8?ElewKscz8H=?%au-oE*G;`xX|91!ZMrXliOgb8|BQV8ezDvowi`i7*%p zFc=Ij^){Og85tSq?Ciw1Z{N_@*M|!iE?~`?HCVrXJpkbB*|WHP`!?Fz+OTosMz`lb z7a{eL$zf$$(g*2{m^z?cNVNuO3m&oI*&QW63J z0+61bj+HA{qPVyiTCEmRsT2TES62tAREp^6XegCRgocK?egAnTH8nNZv}qGkQ&SNc z8HtXL4kRZhqqMXX>FMbX?IjWkQc_a*+k(#YUS3{MtJOGiC&aJTCFH5DnfsMKcb?d`1{#DK0ZI43$So~&YU@e$B!Sw*Vh;E@$rH*&T{|oVUm+y+qj<(YfD6B}U%xZN3o|!Ev@mlsL<=)FL$ok+GeiqBH$${Ab2CJX)4z7m zYPG*}9t_4$(ca$fH0IRY&i)I6!T48j_=J+d5DDxPN``o0=4OZ%W^RUPVdiFtmj3{T W+LUsTh%7+>0000 + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.md5 new file mode 100644 index 000000000..8ff77f63b --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.md5 @@ -0,0 +1 @@ +b1b834fb334b5d9cab86238a149def7d \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_90.png new file mode 100644 index 0000000000000000000000000000000000000000..e72427254a141eadec3edf0acb3218ad9ccea2ae GIT binary patch literal 1790 zcmV-K~!jg?VDXp(p?}^VXO@28nJpP5B_-FdUr*seJhSv8mCS~QhW78@PovSORH|4ke(~bPqT5<@_Uze% zVHk#CWHNc%wr$U!KTqoNqN1W3H*WkMYe|zzW)g{nL?T(OR;SacQmHOoy0qxFeg{gW z5<=+lcmx7LO-+s0>s@L`DUx(%|jMx$Xc7&$pPM~)nc#bQWy<;oQ{n@uDVOG`_w zRx2tp7>p-Ro}jVY?Zz-H5D1{27cN{7i9{3%W#h(;j~_oq8jr^#kw_>MNLx&E1{rVLE zAeYMr1_l}%8!-$kDJcN}%qjx_eEarIsZ_GrY$}y{^ytxWIGjM7Ixr4{!SG9ECb3v- z!-fs}_U$v7Op!=rrXU)PTCG+dk9Yg_ZB!{NEM&1*uV25OoSbZIY$TJ(hYuhA^5x6W z&`@4pp3!K85PtaZAuB8E<;$0mNW^3^ojiFGT}!9adwYA)*yVBo0Q`PG>d9m>Efz~S z9ByrGrO{}ySPVkAefxH~T<-OH?RNXtty=*A6B82vX!rcN;<|lgVT60KcjYfm&=$-3!yKOex zbVv}wzP`ShnFWKv=H_NHnf&?lXVeG%Nq`XA?REgb$B!S;^zGZX0Dw=QKEal>e{kp3yDO+Fifdb zy4~*SOV+Geg9gi&FJG}@1(8Uco<<@O005iKzH{f!sZ*zlii(<=n%=y5Gp`LAjfMsU z0s#OJi9|de4~axty?QmOb2yxMeS3R5hGA>huC-V!-QC@}xw)v$WHQmf<#J_aX0li; zH0AMlsQAnC&LtZe8CkY$8JEjlhgq?29=&??N+c4Mm6d(}{v7~7AP`Wf0DyT<4Rks^6bemmU=D{P z{!z5fLZOh^Y!-<`({&8P&|uxVb2#v$@bEAy0st~H{=HFi$yhAb)YKGOSo4Y( zcu!^}>C8MHPjz*5Utgc!?+*rp9UUDbBO}Gd#gRxP7K`QN-W&y-0zGdi7q?AS52TFvEhnM|fmr_<~8m6eq&7VGlm%k}m36beP9QXM#OAgQ+H z<>f0^t`v*KR4P@g)f$aP5{U!=P^;BGpN~$bOQq6<^fVX@fk1%EH*cc)>C>klK72?Z5YV}CF4?VHw>E9sR8>{Q;cx~91}Z8l z5{OeLesf#k86;ik>FJ?TsY~tRzcTX-GRya8X^p{P$jr>#y?eLA;b>`Tk;~;v?P&4& z+dglstgP(n>RP{ky;Ld{i9{NWW~m)5K7ZRfTeWIcXJ_Y9yZF8QZR_m+0G?U;foGO} z;F+Z#vz$SUM&qCNfio9wx0}IW#8+m?tgf!^Px--F5Hgu8eu_c-_h;z_zMrKZcxLGb go>}^VXO@2a1KKkspE2LBH~;_u07*qoM6N<$f=SJ9LI3~& literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.map new file mode 100644 index 000000000..5f72a83ce --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.map @@ -0,0 +1,3 @@ + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.md5 new file mode 100644 index 000000000..3f5947724 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.md5 @@ -0,0 +1 @@ +1cd8b2819fa996d3eee012c4f24f4015 \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_91.png new file mode 100644 index 0000000000000000000000000000000000000000..d1b63c50d8bbf79cdd627e534fcc00c51ec71d95 GIT binary patch literal 1449 zcmV;a1y=frP)|=>95Z60KNbirg27;8EA>UaSj1o!E4|i~wQx=Bh4bvi0e}9M z`b+EQg>^r#&Ut*E=YH>(bMLucg$N-)lXe(X3pl0FzEcD3J2lY0Qv)-4Vzb$vK7C4+ zl)szu@^XX05SjjKy}RA+nVFfiOZxk<+wC@+Ejq$HoMf?B(xvCL(Ae1cM})q=Qv>Zg zHPF6O1MT~D=SN>RK9=z{={X)q_(yeLI@$` za5&elU3>TLT~g&&uU;J+8~cBxB~2>6t5hmBo4vBK;&QnR2E&slPflD`JoI`!LdfIs zNTt&H`g)(wm$pNnEJ^$B^?ElpHhOw`^7HdK98Pt0_5A!i{;0054noLaFoZ&3Z*Onp z4RdK}>7z%F6bc1F5SK4se*OA20KjN878Mmm+B%(1CX>0fwFLn1`Fyu;-{x|;xw*OR z?d{*cfB!=RK@fd?ef#_S_{&IXY3aj<53gUp&f#z-CnsZ;H#avgFE8J@a|c3LR#uka zC_jGu(ChU=p)e~e>)yS4fk5CWl9C2RF*P;yN8~W!aJZnL;O5PnHk&ON3?5Dhg+ePU zD-wz1<;#~iQc_aF=kpy7M<5XB?d|1qx#4hle}A7Khz}n=;GCYGp4!@4Jg%y$QmIrP zkH_V5$>nmDN`>P!H8ps>BZLBh0EEzLwc`F4E?ih#TnvRm3Cg8Xso89f=!}Px+~0XT-th3S z)9L*7?OSVWYhz>M+qZ8402Yho%9Sf@HXA~y*Xv1=jFfP>Ts&a0SO9=vFbDwX>gt-A znc3alwOA}nCR43e0|4A^HHSK?pBiyy$Q^tX6AoZZ3}V`FuP` zTpl4_+UDlwnKNg^V)0RuQ?M?=v7RFdg3#%70)b$0anbAbwzRZ7e*Ac6XD1vE4-O87 zLZQUvg@uJOnQUxq%xE-rbaZ57WB>pzUAhzsg;31?pLV-lp-@Cx zK?w06K{TxVdw#!vbaZrcb5kah z1%ttGIGmZ8dG_pCyWKuGICzw9U0q%M{ryWzOP!saI3f~>Dl02>I^E9Bj@#|-?(SA9 zm3eu2N0gVKJTEWrOs`(OI;NzUB<(wo$Gd<3 zeqUdoSS;rA`6iReY&PGxaYG;w^!N9-w6qWeVK5kO-MV#@ZW@h-!C=Vca(wY(rlzLY zY<6*Ru~aJM@p$9o<4GxuSN`C^gN20!7K??SXX2&3c=4jBsHmoEqT00000NkvXXu0mjf D5vtI` literal 0 HcmV?d00001 diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.map b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.map new file mode 100644 index 000000000..a44385de0 --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.map @@ -0,0 +1,3 @@ + + + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.md5 b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.md5 new file mode 100644 index 000000000..6d52458cf --- /dev/null +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.md5 @@ -0,0 +1 @@ +af127f8efd7b9214f504e0a64933888e \ No newline at end of file diff --git a/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.png b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/inherit_graph_92.png new file mode 100644 index 0000000000000000000000000000000000000000..cd719b8bcf48a8bfceb8eb3a7219b5bd1226963b GIT binary patch literal 1530 zcmVeZ{c zsD&dVgM))feMwh#AP~UayLVTlAddWqqL|jdq$~S7sm=_}>c`{pps}$r{#R61R^rBu8?wdYSGIzX#q76l-=d+R0a~pV8jS|EwY7Nm z?3o;)|CmFE4uLTS#u(IUHFoXVg^`hwWyRdFV+U^DyeUtCIY1V(Z8jTJDitOtC*k+| z(bm?6&dyFbLN5!4!vP{fFc^f@YDIm0Jwl;SuFJ|9%Qky%ZVo=559iLELrF;q)M_;j z9z2NQ;o*dNZ{EB?b#*laLBN(RTkz=7BWbLzt`3YbeMOB&(8w@jvqgciHQlEK7AUDF;rGo0>Cdd0Py9@7dRXal$Mr4qtW2Z znKOt)B3Wr=hkjyUV1QC|rzIYb)8@^a>Bx~I6_#YHDi8;c!SXB9RC&#%O40C~eGr`}UE|W}{#*NPfScs;a8UX0u5#tX3=a_Vy;! zoJmt(Ur)Pt@1|F;UeUtB0=Zl+x_|$ER@#b+3Ua&MS$jeBOaDB}Hk*h@6h*Sz?PM~U zXzkjyv~%Z9x_9rMG;TJV>B^NWQhR=Wo&b<2iYepu^z=|;V`GBe>2xN{F`LcQ-rk1nC&<;#}@fIfcwNJPnIXVQH5 z@PPo()YMecF=mrbZnI@svvoQhu3fu^si`S^{`?syPoBiFW5@9H=~HQrR;!gh7Zel# z0HV<-fdBrQEiW&JN~Hp03=W3_q9`Wh(ChU{d5uP6Qu{|;PfrgRV<;{z#`yR+hK7bv zSXh`cW*`tiettd-27}aRGMS{YRAkc3%*xOnj*W@l#+kH^v7-Hli*mN1VomZY7Yo=#}LfBzmOB_&e(`v&dn*RL2G z8$)$NuBqM@PTkB-A=G-B`Gy|CNun4O(PAP_)nYb$DNYf)5G1OO;1D#D8w zFQgMOlSZ%Cqpq$F&CSht{rWY+;V|58Hy%8AkX1gpS+?0aoepQuo<&zz7s|@Ypx5i+ zcDvEr+lvDS4rJ6D3kxm#LV(9zL>;^JcT_xEFXco-Wt zZ204285kIVN~OZ~?b~6sTA|bFaO>7BY5e^8^LY61Aqol#q}_NXO - + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Airwell_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Airwell_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Aiwa_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Aiwa_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Aiwa_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Aiwa_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Amcor_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Amcor_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Argo_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Argo_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Carrier_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Carrier_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Coolix_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Coolix_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Corona_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Corona_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Daikin_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Daikin_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Delonghi_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Delonghi_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Denon_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Denon_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Denon_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Denon_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Dish_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Dish_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Dish_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Dish_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Doshisha_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Doshisha_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Doshisha_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Doshisha_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Electra_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Electra_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__EliteScreens_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__EliteScreens_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__EliteScreens_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__EliteScreens_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Epson_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Epson_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Epson_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Epson_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Fujitsu_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Fujitsu_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__GICable_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__GICable_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__GICable_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__GICable_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__GlobalCache_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__GlobalCache_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__GlobalCache_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__GlobalCache_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Goodweather_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Goodweather_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8h_source.html similarity index 83% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8h_source.html index 05719cc38..2a68e331c 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Gree_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Gree_8h_source.html @@ -81,312 +81,314 @@ $(function() {
    13 // Brand: Green, Model: YBOFB2 remote
    14 // Brand: Gree, Model: YAA1FBF remote
    15 // Brand: Gree, Model: YB1F2F remote
    -
    16 
    -
    17 #ifndef IR_GREE_H_
    -
    18 #define IR_GREE_H_
    -
    19 
    -
    20 #define __STDC_LIMIT_MACROS
    -
    21 #include <stdint.h>
    -
    22 #ifndef UNIT_TEST
    -
    23 #include <Arduino.h>
    -
    24 #endif
    -
    25 #include "IRremoteESP8266.h"
    -
    26 #include "IRsend.h"
    -
    27 #ifdef UNIT_TEST
    -
    28 #include "IRsend_test.h"
    -
    29 #endif
    -
    30 
    - - -
    34  struct {
    -
    35  // Byte 0
    -
    36  uint8_t Mode :3;
    -
    37  uint8_t Power :1;
    -
    38  uint8_t Fan :2;
    -
    39  uint8_t SwingAuto :1;
    -
    40  uint8_t Sleep :1;
    -
    41  // Byte 1
    -
    42  uint8_t Temp :4;
    -
    43  uint8_t TimerHalfHr :1;
    -
    44  uint8_t TimerTensHr :2;
    -
    45  uint8_t TimerEnabled:1;
    -
    46  // Byte 2
    -
    47  uint8_t TimerHours:4;
    -
    48  uint8_t Turbo :1;
    -
    49  uint8_t Light :1;
    -
    50  uint8_t ModelA :1; // model==YAW1F
    -
    51  uint8_t Xfan :1;
    -
    52  // Byte 3
    -
    53  uint8_t :2;
    -
    54  uint8_t TempExtraDegreeF:1;
    -
    55  uint8_t UseFahrenheit :1;
    -
    56  uint8_t unknown1 :4; // value=0b0101
    -
    57  // Byte 4
    -
    58  uint8_t Swing:4;
    -
    59  uint8_t :0;
    -
    60  // Byte 5
    -
    61  uint8_t DisplayTemp :2;
    -
    62  uint8_t IFeel :1;
    -
    63  uint8_t unknown2 :3; // value = 0b100
    -
    64  uint8_t WiFi :1;
    -
    65  uint8_t :0;
    -
    66  // Byte 6
    -
    67  uint8_t :8;
    -
    68  // Byte 7
    -
    69  uint8_t :4;
    -
    70  uint8_t Sum:4;
    -
    71  };
    -
    72 };
    -
    73 
    -
    74 // Constants
    +
    16 // Brand: Amana, Model: PBC093G00CC A/C
    +
    17 // Brand: Amana, Model: YX1FF remote
    +
    18 
    +
    19 #ifndef IR_GREE_H_
    +
    20 #define IR_GREE_H_
    +
    21 
    +
    22 #define __STDC_LIMIT_MACROS
    +
    23 #include <stdint.h>
    +
    24 #ifndef UNIT_TEST
    +
    25 #include <Arduino.h>
    +
    26 #endif
    +
    27 #include "IRremoteESP8266.h"
    +
    28 #include "IRsend.h"
    +
    29 #ifdef UNIT_TEST
    +
    30 #include "IRsend_test.h"
    +
    31 #endif
    +
    32 
    + + +
    36  struct {
    +
    37  // Byte 0
    +
    38  uint8_t Mode :3;
    +
    39  uint8_t Power :1;
    +
    40  uint8_t Fan :2;
    +
    41  uint8_t SwingAuto :1;
    +
    42  uint8_t Sleep :1;
    +
    43  // Byte 1
    +
    44  uint8_t Temp :4;
    +
    45  uint8_t TimerHalfHr :1;
    +
    46  uint8_t TimerTensHr :2;
    +
    47  uint8_t TimerEnabled:1;
    +
    48  // Byte 2
    +
    49  uint8_t TimerHours:4;
    +
    50  uint8_t Turbo :1;
    +
    51  uint8_t Light :1;
    +
    52  uint8_t ModelA :1; // model==YAW1F
    +
    53  uint8_t Xfan :1;
    +
    54  // Byte 3
    +
    55  uint8_t :2;
    +
    56  uint8_t TempExtraDegreeF:1;
    +
    57  uint8_t UseFahrenheit :1;
    +
    58  uint8_t unknown1 :4; // value=0b0101
    +
    59  // Byte 4
    +
    60  uint8_t Swing:4;
    +
    61  uint8_t :0;
    +
    62  // Byte 5
    +
    63  uint8_t DisplayTemp :2;
    +
    64  uint8_t IFeel :1;
    +
    65  uint8_t unknown2 :3; // value = 0b100
    +
    66  uint8_t WiFi :1;
    +
    67  uint8_t :0;
    +
    68  // Byte 6
    +
    69  uint8_t :8;
    +
    70  // Byte 7
    +
    71  uint8_t :4;
    +
    72  uint8_t Sum:4;
    +
    73  };
    +
    74 };
    75 
    -
    76 const uint8_t kGreeAuto = 0;
    -
    77 const uint8_t kGreeCool = 1;
    -
    78 const uint8_t kGreeDry = 2;
    -
    79 const uint8_t kGreeFan = 3;
    -
    80 const uint8_t kGreeHeat = 4;
    -
    81 
    -
    82 const uint8_t kGreeFanAuto = 0;
    -
    83 const uint8_t kGreeFanMin = 1;
    -
    84 const uint8_t kGreeFanMed = 2;
    -
    85 const uint8_t kGreeFanMax = 3;
    -
    86 
    -
    87 const uint8_t kGreeMinTempC = 16; // Celsius
    -
    88 const uint8_t kGreeMaxTempC = 30; // Celsius
    -
    89 const uint8_t kGreeMinTempF = 61; // Fahrenheit
    -
    90 const uint8_t kGreeMaxTempF = 86; // Fahrenheit
    -
    91 const uint16_t kGreeTimerMax = 24 * 60;
    -
    92 
    -
    93 const uint8_t kGreeSwingLastPos = 0b0000;
    -
    94 const uint8_t kGreeSwingAuto = 0b0001;
    -
    95 const uint8_t kGreeSwingUp = 0b0010;
    -
    96 const uint8_t kGreeSwingMiddleUp = 0b0011;
    -
    97 const uint8_t kGreeSwingMiddle = 0b0100;
    -
    98 const uint8_t kGreeSwingMiddleDown = 0b0101;
    -
    99 const uint8_t kGreeSwingDown = 0b0110;
    -
    100 const uint8_t kGreeSwingDownAuto = 0b0111;
    -
    101 const uint8_t kGreeSwingMiddleAuto = 0b1001;
    -
    102 const uint8_t kGreeSwingUpAuto = 0b1011;
    -
    103 
    -
    104 const uint8_t kGreeDisplayTempOff = 0b00; // 0
    -
    105 const uint8_t kGreeDisplayTempSet = 0b01; // 1
    -
    106 const uint8_t kGreeDisplayTempInside = 0b10; // 2
    -
    107 const uint8_t kGreeDisplayTempOutside = 0b11; // 3
    -
    108 
    -
    109 // Legacy defines.
    -
    110 #define GREE_AUTO kGreeAuto
    -
    111 #define GREE_COOL kGreeCool
    -
    112 #define GREE_DRY kGreeDry
    -
    113 #define GREE_FAN kGreeFan
    -
    114 #define GREE_HEAT kGreeHeat
    -
    115 #define GREE_MIN_TEMP kGreeMinTempC
    -
    116 #define GREE_MAX_TEMP kGreeMaxTempC
    -
    117 #define GREE_FAN_MAX kGreeFanMax
    -
    118 #define GREE_SWING_LAST_POS kGreeSwingLastPos
    -
    119 #define GREE_SWING_AUTO kGreeSwingAuto
    -
    120 #define GREE_SWING_UP kGreeSwingUp
    -
    121 #define GREE_SWING_MIDDLE_UP kGreeSwingMiddleUp
    -
    122 #define GREE_SWING_MIDDLE kGreeSwingMiddle
    -
    123 #define GREE_SWING_MIDDLE_DOWN kGreeSwingMiddleDown
    -
    124 #define GREE_SWING_DOWN kGreeSwingDown
    -
    125 #define GREE_SWING_DOWN_AUTO kGreeSwingDownAuto
    -
    126 #define GREE_SWING_MIDDLE_AUTO kGreeSwingMiddleAuto
    -
    127 #define GREE_SWING_UP_AUTO kGreeSwingUpAuto
    -
    128 
    -
    129 // Classes
    -
    131 class IRGreeAC {
    -
    132  public:
    -
    133  explicit IRGreeAC(
    -
    134  const uint16_t pin,
    - -
    136  const bool inverted = false, const bool use_modulation = true);
    -
    137  void stateReset(void);
    -
    138 #if SEND_GREE
    -
    139  void send(const uint16_t repeat = kGreeDefaultRepeat);
    -
    144  int8_t calibrate(void) { return _irsend.calibrate(); }
    -
    145 #endif // SEND_GREE
    -
    146  void begin(void);
    -
    147  void on(void);
    -
    148  void off(void);
    -
    149  void setModel(const gree_ac_remote_model_t model);
    -
    150  gree_ac_remote_model_t getModel(void) const;
    -
    151  void setPower(const bool on);
    -
    152  bool getPower(void) const;
    -
    153  void setTemp(const uint8_t temp, const bool fahrenheit = false);
    -
    154  uint8_t getTemp(void) const;
    -
    155  void setUseFahrenheit(const bool on);
    -
    156  bool getUseFahrenheit(void) const;
    -
    157  void setFan(const uint8_t speed);
    -
    158  uint8_t getFan(void) const;
    -
    159  void setMode(const uint8_t new_mode);
    -
    160  uint8_t getMode(void) const;
    -
    161  void setLight(const bool on);
    -
    162  bool getLight(void) const;
    -
    163  void setXFan(const bool on);
    -
    164  bool getXFan(void) const;
    -
    165  void setSleep(const bool on);
    -
    166  bool getSleep(void) const;
    -
    167  void setTurbo(const bool on);
    -
    168  bool getTurbo(void) const;
    -
    169  void setIFeel(const bool on);
    -
    170  bool getIFeel(void) const;
    -
    171  void setWiFi(const bool on);
    -
    172  bool getWiFi(void) const;
    -
    173  void setSwingVertical(const bool automatic, const uint8_t position);
    -
    174  bool getSwingVerticalAuto(void) const;
    -
    175  uint8_t getSwingVerticalPosition(void) const;
    -
    176  uint16_t getTimer(void) const;
    -
    177  void setTimer(const uint16_t minutes);
    -
    178  void setDisplayTempSource(const uint8_t mode);
    -
    179  uint8_t getDisplayTempSource(void) const;
    -
    180  static uint8_t convertMode(const stdAc::opmode_t mode);
    -
    181  static uint8_t convertFan(const stdAc::fanspeed_t speed);
    -
    182  static uint8_t convertSwingV(const stdAc::swingv_t swingv);
    -
    183  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    -
    184  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    -
    185  static stdAc::swingv_t toCommonSwingV(const uint8_t pos);
    -
    186  stdAc::state_t toCommon(void);
    -
    187  uint8_t* getRaw(void);
    -
    188  void setRaw(const uint8_t new_code[]);
    -
    189  static bool validChecksum(const uint8_t state[],
    -
    190  const uint16_t length = kGreeStateLength);
    -
    191  String toString(void);
    -
    192 #ifndef UNIT_TEST
    -
    193 
    -
    194  private:
    - -
    196 #else // UNIT_TEST
    -
    197  IRsendTest _irsend;
    -
    199 #endif // UNIT_TEST
    - - -
    203  void checksum(const uint16_t length = kGreeStateLength);
    -
    204  void fixup(void);
    -
    205  void setTimerEnabled(const bool on);
    -
    206  bool getTimerEnabled(void) const;
    -
    207 };
    -
    208 
    -
    209 #endif // IR_GREE_H_
    +
    76 // Constants
    +
    77 
    +
    78 const uint8_t kGreeAuto = 0;
    +
    79 const uint8_t kGreeCool = 1;
    +
    80 const uint8_t kGreeDry = 2;
    +
    81 const uint8_t kGreeFan = 3;
    +
    82 const uint8_t kGreeHeat = 4;
    +
    83 
    +
    84 const uint8_t kGreeFanAuto = 0;
    +
    85 const uint8_t kGreeFanMin = 1;
    +
    86 const uint8_t kGreeFanMed = 2;
    +
    87 const uint8_t kGreeFanMax = 3;
    +
    88 
    +
    89 const uint8_t kGreeMinTempC = 16; // Celsius
    +
    90 const uint8_t kGreeMaxTempC = 30; // Celsius
    +
    91 const uint8_t kGreeMinTempF = 61; // Fahrenheit
    +
    92 const uint8_t kGreeMaxTempF = 86; // Fahrenheit
    +
    93 const uint16_t kGreeTimerMax = 24 * 60;
    +
    94 
    +
    95 const uint8_t kGreeSwingLastPos = 0b0000;
    +
    96 const uint8_t kGreeSwingAuto = 0b0001;
    +
    97 const uint8_t kGreeSwingUp = 0b0010;
    +
    98 const uint8_t kGreeSwingMiddleUp = 0b0011;
    +
    99 const uint8_t kGreeSwingMiddle = 0b0100;
    +
    100 const uint8_t kGreeSwingMiddleDown = 0b0101;
    +
    101 const uint8_t kGreeSwingDown = 0b0110;
    +
    102 const uint8_t kGreeSwingDownAuto = 0b0111;
    +
    103 const uint8_t kGreeSwingMiddleAuto = 0b1001;
    +
    104 const uint8_t kGreeSwingUpAuto = 0b1011;
    +
    105 
    +
    106 const uint8_t kGreeDisplayTempOff = 0b00; // 0
    +
    107 const uint8_t kGreeDisplayTempSet = 0b01; // 1
    +
    108 const uint8_t kGreeDisplayTempInside = 0b10; // 2
    +
    109 const uint8_t kGreeDisplayTempOutside = 0b11; // 3
    +
    110 
    +
    111 // Legacy defines.
    +
    112 #define GREE_AUTO kGreeAuto
    +
    113 #define GREE_COOL kGreeCool
    +
    114 #define GREE_DRY kGreeDry
    +
    115 #define GREE_FAN kGreeFan
    +
    116 #define GREE_HEAT kGreeHeat
    +
    117 #define GREE_MIN_TEMP kGreeMinTempC
    +
    118 #define GREE_MAX_TEMP kGreeMaxTempC
    +
    119 #define GREE_FAN_MAX kGreeFanMax
    +
    120 #define GREE_SWING_LAST_POS kGreeSwingLastPos
    +
    121 #define GREE_SWING_AUTO kGreeSwingAuto
    +
    122 #define GREE_SWING_UP kGreeSwingUp
    +
    123 #define GREE_SWING_MIDDLE_UP kGreeSwingMiddleUp
    +
    124 #define GREE_SWING_MIDDLE kGreeSwingMiddle
    +
    125 #define GREE_SWING_MIDDLE_DOWN kGreeSwingMiddleDown
    +
    126 #define GREE_SWING_DOWN kGreeSwingDown
    +
    127 #define GREE_SWING_DOWN_AUTO kGreeSwingDownAuto
    +
    128 #define GREE_SWING_MIDDLE_AUTO kGreeSwingMiddleAuto
    +
    129 #define GREE_SWING_UP_AUTO kGreeSwingUpAuto
    +
    130 
    +
    131 // Classes
    +
    133 class IRGreeAC {
    +
    134  public:
    +
    135  explicit IRGreeAC(
    +
    136  const uint16_t pin,
    + +
    138  const bool inverted = false, const bool use_modulation = true);
    +
    139  void stateReset(void);
    +
    140 #if SEND_GREE
    +
    141  void send(const uint16_t repeat = kGreeDefaultRepeat);
    +
    146  int8_t calibrate(void) { return _irsend.calibrate(); }
    +
    147 #endif // SEND_GREE
    +
    148  void begin(void);
    +
    149  void on(void);
    +
    150  void off(void);
    +
    151  void setModel(const gree_ac_remote_model_t model);
    +
    152  gree_ac_remote_model_t getModel(void) const;
    +
    153  void setPower(const bool on);
    +
    154  bool getPower(void) const;
    +
    155  void setTemp(const uint8_t temp, const bool fahrenheit = false);
    +
    156  uint8_t getTemp(void) const;
    +
    157  void setUseFahrenheit(const bool on);
    +
    158  bool getUseFahrenheit(void) const;
    +
    159  void setFan(const uint8_t speed);
    +
    160  uint8_t getFan(void) const;
    +
    161  void setMode(const uint8_t new_mode);
    +
    162  uint8_t getMode(void) const;
    +
    163  void setLight(const bool on);
    +
    164  bool getLight(void) const;
    +
    165  void setXFan(const bool on);
    +
    166  bool getXFan(void) const;
    +
    167  void setSleep(const bool on);
    +
    168  bool getSleep(void) const;
    +
    169  void setTurbo(const bool on);
    +
    170  bool getTurbo(void) const;
    +
    171  void setIFeel(const bool on);
    +
    172  bool getIFeel(void) const;
    +
    173  void setWiFi(const bool on);
    +
    174  bool getWiFi(void) const;
    +
    175  void setSwingVertical(const bool automatic, const uint8_t position);
    +
    176  bool getSwingVerticalAuto(void) const;
    +
    177  uint8_t getSwingVerticalPosition(void) const;
    +
    178  uint16_t getTimer(void) const;
    +
    179  void setTimer(const uint16_t minutes);
    +
    180  void setDisplayTempSource(const uint8_t mode);
    +
    181  uint8_t getDisplayTempSource(void) const;
    +
    182  static uint8_t convertMode(const stdAc::opmode_t mode);
    +
    183  static uint8_t convertFan(const stdAc::fanspeed_t speed);
    +
    184  static uint8_t convertSwingV(const stdAc::swingv_t swingv);
    +
    185  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    +
    186  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    +
    187  static stdAc::swingv_t toCommonSwingV(const uint8_t pos);
    +
    188  stdAc::state_t toCommon(void);
    +
    189  uint8_t* getRaw(void);
    +
    190  void setRaw(const uint8_t new_code[]);
    +
    191  static bool validChecksum(const uint8_t state[],
    +
    192  const uint16_t length = kGreeStateLength);
    +
    193  String toString(void);
    +
    194 #ifndef UNIT_TEST
    +
    195 
    +
    196  private:
    + +
    198 #else // UNIT_TEST
    +
    199  IRsendTest _irsend;
    +
    201 #endif // UNIT_TEST
    + + +
    205  void checksum(const uint16_t length = kGreeStateLength);
    +
    206  void fixup(void);
    +
    207  void setTimerEnabled(const bool on);
    +
    208  bool getTimerEnabled(void) const;
    +
    209 };
    +
    210 
    +
    211 #endif // IR_GREE_H_
    void setSwingVertical(const bool automatic, const uint8_t position)
    Set the Vertical Swing mode of the A/C.
    Definition: ir_Gree.cpp:386
    -
    uint8_t ModelA
    Definition: ir_Gree.h:50
    -
    uint8_t Temp
    Definition: ir_Gree.h:42
    -
    uint8_t Mode
    Definition: ir_Gree.h:36
    -
    GreeProtocol _
    Definition: ir_Gree.h:201
    +
    uint8_t ModelA
    Definition: ir_Gree.h:52
    +
    uint8_t Temp
    Definition: ir_Gree.h:44
    +
    uint8_t Mode
    Definition: ir_Gree.h:38
    +
    GreeProtocol _
    Definition: ir_Gree.h:203
    uint8_t getMode(void) const
    Get the operating mode setting of the A/C.
    Definition: ir_Gree.cpp:307
    bool getWiFi(void) const
    Get the Wifi (enabled) setting of the A/C.
    Definition: ir_Gree.cpp:343
    const uint16_t kGreeStateLength
    Definition: IRremoteESP8266.h:952
    -
    const uint8_t kGreeSwingUp
    Definition: ir_Gree.h:95
    +
    const uint8_t kGreeSwingUp
    Definition: ir_Gree.h:97
    swingv_t
    Common A/C settings for Vertical Swing.
    Definition: IRsend.h:70
    static bool validChecksum(const uint8_t state[], const uint16_t length=kGreeStateLength)
    Verify the checksum is valid for a given state.
    Definition: ir_Gree.cpp:176
    String toString(void)
    Convert the current internal state into a human readable string.
    Definition: ir_Gree.cpp:595
    void off(void)
    Change the power setting to Off.
    Definition: ir_Gree.cpp:200
    -
    const uint8_t kGreeFan
    Definition: ir_Gree.h:79
    +
    const uint8_t kGreeFan
    Definition: ir_Gree.h:81
    void setXFan(const bool on)
    Set the XFan (Mould) setting of the A/C.
    Definition: ir_Gree.cpp:349
    static stdAc::opmode_t toCommonMode(const uint8_t mode)
    Convert a native mode into its stdAc equivalent.
    Definition: ir_Gree.cpp:528
    bool getIFeel(void) const
    Get the IFeel setting of the A/C.
    Definition: ir_Gree.cpp:331
    fanspeed_t
    Common A/C settings for Fan Speeds.
    Definition: IRsend.h:58
    bool getLight(void) const
    Get the Light (LED) setting of the A/C.
    Definition: ir_Gree.cpp:319
    -
    uint8_t SwingAuto
    Definition: ir_Gree.h:39
    -
    uint8_t TempExtraDegreeF
    Definition: ir_Gree.h:54
    +
    uint8_t SwingAuto
    Definition: ir_Gree.h:41
    +
    uint8_t TempExtraDegreeF
    Definition: ir_Gree.h:56
    static uint8_t convertMode(const stdAc::opmode_t mode)
    Convert a stdAc::opmode_t enum into its native mode.
    Definition: ir_Gree.cpp:487
    -
    const uint8_t kGreeDry
    Definition: ir_Gree.h:78
    -
    uint8_t unknown1
    Definition: ir_Gree.h:56
    -
    const uint8_t kGreeFanMax
    Definition: ir_Gree.h:85
    -
    const uint8_t kGreeMaxTempF
    Definition: ir_Gree.h:90
    +
    const uint8_t kGreeDry
    Definition: ir_Gree.h:80
    +
    uint8_t unknown1
    Definition: ir_Gree.h:58
    +
    const uint8_t kGreeFanMax
    Definition: ir_Gree.h:87
    +
    const uint8_t kGreeMaxTempF
    Definition: ir_Gree.h:92
    uint16_t getTimer(void) const
    Get the timer time value from the A/C.
    Definition: ir_Gree.cpp:440
    void setMode(const uint8_t new_mode)
    Set the operating mode of the A/C.
    Definition: ir_Gree.cpp:289
    -
    uint8_t Fan
    Definition: ir_Gree.h:38
    +
    uint8_t Fan
    Definition: ir_Gree.h:40
    stdAc::state_t toCommon(void)
    Convert the current internal state into its stdAc::state_t equivalent.
    Definition: ir_Gree.cpp:566
    -
    uint8_t WiFi
    Definition: ir_Gree.h:64
    +
    uint8_t WiFi
    Definition: ir_Gree.h:66
    gree_ac_remote_model_t
    Gree A/C model numbers.
    Definition: IRsend.h:129
    void send(const uint16_t repeat=kGreeDefaultRepeat)
    Send the current internal state as an IR message.
    Definition: ir_Gree.cpp:140
    -
    const uint8_t kGreeSwingUpAuto
    Definition: ir_Gree.h:102
    -
    const uint8_t kGreeDisplayTempOutside
    Definition: ir_Gree.h:107
    +
    const uint8_t kGreeSwingUpAuto
    Definition: ir_Gree.h:104
    +
    const uint8_t kGreeDisplayTempOutside
    Definition: ir_Gree.h:109
    void fixup(void)
    Fix up the internal state so it is correct.
    Definition: ir_Gree.cpp:129
    -
    uint8_t remote_state[kGreeStateLength]
    The state in native IR code form.
    Definition: ir_Gree.h:33
    -
    const uint8_t kGreeSwingDownAuto
    Definition: ir_Gree.h:100
    +
    uint8_t remote_state[kGreeStateLength]
    The state in native IR code form.
    Definition: ir_Gree.h:35
    +
    const uint8_t kGreeSwingDownAuto
    Definition: ir_Gree.h:102
    void setPower(const bool on)
    Change the power setting.
    Definition: ir_Gree.cpp:205
    void setTimerEnabled(const bool on)
    Set the timer enable setting of the A/C.
    Definition: ir_Gree.cpp:428
    uint8_t * getRaw(void)
    Get a PTR to the internal state/code for this protocol.
    Definition: ir_Gree.cpp:147
    Class for sending all basic IR protocols.
    Definition: IRsend.h:182
    -
    uint8_t Turbo
    Definition: ir_Gree.h:48
    +
    uint8_t Turbo
    Definition: ir_Gree.h:50
    int8_t calibrate(uint16_t hz=38000U)
    Calculate & set any offsets to account for execution times during sending.
    Definition: IRsend.cpp:207
    -
    uint8_t Swing
    Definition: ir_Gree.h:58
    +
    uint8_t Swing
    Definition: ir_Gree.h:60
    std::string String
    Definition: IRremoteESP8266.h:1178
    -
    const uint8_t kGreeDisplayTempSet
    Definition: ir_Gree.h:105
    -
    uint8_t TimerHours
    Definition: ir_Gree.h:47
    -
    uint8_t TimerHalfHr
    Definition: ir_Gree.h:43
    -
    const uint8_t kGreeSwingMiddleDown
    Definition: ir_Gree.h:98
    +
    const uint8_t kGreeDisplayTempSet
    Definition: ir_Gree.h:107
    +
    uint8_t TimerHours
    Definition: ir_Gree.h:49
    +
    uint8_t TimerHalfHr
    Definition: ir_Gree.h:45
    +
    const uint8_t kGreeSwingMiddleDown
    Definition: ir_Gree.h:100
    IRGreeAC(const uint16_t pin, const gree_ac_remote_model_t model=gree_ac_remote_model_t::YAW1F, const bool inverted=false, const bool use_modulation=true)
    Class constructor.
    Definition: ir_Gree.cpp:110
    -
    uint8_t Sum
    Definition: ir_Gree.h:70
    -
    const uint8_t kGreeFanMed
    Definition: ir_Gree.h:84
    +
    uint8_t Sum
    Definition: ir_Gree.h:72
    +
    const uint8_t kGreeFanMed
    Definition: ir_Gree.h:86
    -
    const uint8_t kGreeSwingMiddleAuto
    Definition: ir_Gree.h:101
    +
    const uint8_t kGreeSwingMiddleAuto
    Definition: ir_Gree.h:103
    static uint8_t convertFan(const stdAc::fanspeed_t speed)
    Convert a stdAc::fanspeed_t enum into it's native speed.
    Definition: ir_Gree.cpp:500
    -
    const uint8_t kGreeHeat
    Definition: ir_Gree.h:80
    +
    const uint8_t kGreeHeat
    Definition: ir_Gree.h:82
    void setSleep(const bool on)
    Set the Sleep setting of the A/C.
    Definition: ir_Gree.cpp:361
    void begin(void)
    Set up hardware to be able to send a message.
    Definition: ir_Gree.cpp:135
    -
    const uint16_t kGreeTimerMax
    Definition: ir_Gree.h:91
    +
    const uint16_t kGreeTimerMax
    Definition: ir_Gree.h:93
    @ YAW1F
    Definition: IRsend.h:130
    -
    const uint8_t kGreeMaxTempC
    Definition: ir_Gree.h:88
    -
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Gree.h:144
    -
    uint8_t Sleep
    Definition: ir_Gree.h:40
    -
    const uint8_t kGreeMinTempF
    Definition: ir_Gree.h:89
    -
    const uint8_t kGreeDisplayTempOff
    Definition: ir_Gree.h:104
    +
    const uint8_t kGreeMaxTempC
    Definition: ir_Gree.h:90
    +
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Gree.h:146
    +
    uint8_t Sleep
    Definition: ir_Gree.h:42
    +
    const uint8_t kGreeMinTempF
    Definition: ir_Gree.h:91
    +
    const uint8_t kGreeDisplayTempOff
    Definition: ir_Gree.h:106
    void setFan(const uint8_t speed)
    Set the speed of the fan.
    Definition: ir_Gree.cpp:274
    void setUseFahrenheit(const bool on)
    Set the default temperature units to use.
    Definition: ir_Gree.cpp:222
    static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
    Convert a native fan speed into its stdAc equivalent.
    Definition: ir_Gree.cpp:541
    -
    uint8_t unknown2
    Definition: ir_Gree.h:63
    +
    uint8_t unknown2
    Definition: ir_Gree.h:65
    bool getTurbo(void) const
    Get the Turbo setting of the A/C.
    Definition: ir_Gree.cpp:379
    -
    uint8_t TimerTensHr
    Definition: ir_Gree.h:44
    +
    uint8_t TimerTensHr
    Definition: ir_Gree.h:46
    bool getPower(void) const
    Get the value of the current power setting.
    Definition: ir_Gree.cpp:214
    bool getXFan(void) const
    Get the XFan (Mould) setting of the A/C.
    Definition: ir_Gree.cpp:355
    void checksum(const uint16_t length=kGreeStateLength)
    Calculate and set the checksum values for the internal state.
    Definition: ir_Gree.cpp:167
    -
    uint8_t Xfan
    Definition: ir_Gree.h:51
    -
    uint8_t Light
    Definition: ir_Gree.h:49
    +
    uint8_t Xfan
    Definition: ir_Gree.h:53
    +
    uint8_t Light
    Definition: ir_Gree.h:51
    void setTimer(const uint16_t minutes)
    Set the A/C's timer to turn off in X many minutes.
    Definition: ir_Gree.cpp:450
    void setModel(const gree_ac_remote_model_t model)
    Set the model of the A/C to emulate.
    Definition: ir_Gree.cpp:184
    gree_ac_remote_model_t getModel(void) const
    Get/Detect the model of the A/C.
    Definition: ir_Gree.cpp:194
    -
    const uint8_t kGreeAuto
    Definition: ir_Gree.h:76
    +
    const uint8_t kGreeAuto
    Definition: ir_Gree.h:78
    void setWiFi(const bool on)
    Set the Wifi (enabled) setting of the A/C.
    Definition: ir_Gree.cpp:337
    uint8_t getFan(void) const
    Get the current fan speed setting.
    Definition: ir_Gree.cpp:283
    static uint8_t convertSwingV(const stdAc::swingv_t swingv)
    Convert a stdAc::swingv_t enum into it's native setting.
    Definition: ir_Gree.cpp:514
    bool getUseFahrenheit(void) const
    Get the default temperature units in use.
    Definition: ir_Gree.cpp:228
    void setIFeel(const bool on)
    Set the IFeel setting of the A/C.
    Definition: ir_Gree.cpp:325
    -
    const uint8_t kGreeSwingMiddleUp
    Definition: ir_Gree.h:96
    +
    const uint8_t kGreeSwingMiddleUp
    Definition: ir_Gree.h:98
    uint8_t getTemp(void) const
    Get the set temperature.
    Definition: ir_Gree.cpp:261
    -
    uint8_t IFeel
    Definition: ir_Gree.h:62
    -
    const uint8_t kGreeFanMin
    Definition: ir_Gree.h:83
    -
    const uint8_t kGreeCool
    Definition: ir_Gree.h:77
    +
    uint8_t IFeel
    Definition: ir_Gree.h:64
    +
    const uint8_t kGreeFanMin
    Definition: ir_Gree.h:85
    +
    const uint8_t kGreeCool
    Definition: ir_Gree.h:79
    uint8_t getSwingVerticalPosition(void) const
    Get the Vertical Swing position setting of the A/C.
    Definition: ir_Gree.cpp:422
    -
    const uint8_t kGreeSwingMiddle
    Definition: ir_Gree.h:97
    -
    Native representation of a Gree A/C message.
    Definition: ir_Gree.h:32
    -
    const uint8_t kGreeSwingLastPos
    Definition: ir_Gree.h:93
    +
    const uint8_t kGreeSwingMiddle
    Definition: ir_Gree.h:99
    +
    Native representation of a Gree A/C message.
    Definition: ir_Gree.h:34
    +
    const uint8_t kGreeSwingLastPos
    Definition: ir_Gree.h:95
    void setTemp(const uint8_t temp, const bool fahrenheit=false)
    Set the temp. in degrees.
    Definition: ir_Gree.cpp:238
    bool getTimerEnabled(void) const
    Get the timer enabled setting of the A/C.
    Definition: ir_Gree.cpp:434
    -
    gree_ac_remote_model_t _model
    Definition: ir_Gree.h:202
    +
    gree_ac_remote_model_t _model
    Definition: ir_Gree.h:204
    bool getSwingVerticalAuto(void) const
    Get the Vertical Swing Automatic mode setting of the A/C.
    Definition: ir_Gree.cpp:416
    void setTurbo(const bool on)
    Set the Turbo setting of the A/C.
    Definition: ir_Gree.cpp:373
    -
    const uint8_t kGreeSwingDown
    Definition: ir_Gree.h:99
    +
    const uint8_t kGreeSwingDown
    Definition: ir_Gree.h:101
    static stdAc::swingv_t toCommonSwingV(const uint8_t pos)
    Convert a stdAc::swingv_t enum into it's native setting.
    Definition: ir_Gree.cpp:553
    -
    const uint8_t kGreeFanAuto
    Definition: ir_Gree.h:82
    -
    uint8_t Power
    Definition: ir_Gree.h:37
    +
    const uint8_t kGreeFanAuto
    Definition: ir_Gree.h:84
    +
    uint8_t Power
    Definition: ir_Gree.h:39
    bool getSleep(void) const
    Get the Sleep setting of the A/C.
    Definition: ir_Gree.cpp:367
    -
    uint8_t TimerEnabled
    Definition: ir_Gree.h:45
    -
    const uint8_t kGreeMinTempC
    Definition: ir_Gree.h:87
    +
    uint8_t TimerEnabled
    Definition: ir_Gree.h:47
    +
    const uint8_t kGreeMinTempC
    Definition: ir_Gree.h:89
    uint8_t getDisplayTempSource(void) const
    Get the temperature display mode. i.e. Internal, External temperature sensing.
    Definition: ir_Gree.cpp:480
    void setDisplayTempSource(const uint8_t mode)
    Set temperature display mode. i.e. Internal, External temperature sensing.
    Definition: ir_Gree.cpp:473
    -
    uint8_t UseFahrenheit
    Definition: ir_Gree.h:55
    -
    const uint8_t kGreeSwingAuto
    Definition: ir_Gree.h:94
    -
    Class for handling detailed Gree A/C messages.
    Definition: ir_Gree.h:131
    -
    uint8_t DisplayTemp
    Definition: ir_Gree.h:61
    -
    const uint8_t kGreeDisplayTempInside
    Definition: ir_Gree.h:106
    +
    uint8_t UseFahrenheit
    Definition: ir_Gree.h:57
    +
    const uint8_t kGreeSwingAuto
    Definition: ir_Gree.h:96
    +
    Class for handling detailed Gree A/C messages.
    Definition: ir_Gree.h:133
    +
    uint8_t DisplayTemp
    Definition: ir_Gree.h:63
    +
    const uint8_t kGreeDisplayTempInside
    Definition: ir_Gree.h:108
    void stateReset(void)
    Reset the internal state to a fixed known good state.
    Definition: ir_Gree.cpp:118
    Structure to hold a common A/C state.
    Definition: IRsend.h:97
    void setRaw(const uint8_t new_code[])
    Set the internal state from a valid code for this protocol.
    Definition: ir_Gree.cpp:154
    -
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Gree.h:195
    +
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Gree.h:197
    void on(void)
    Change the power setting to On.
    Definition: ir_Gree.cpp:197
    void setLight(const bool on)
    Set the Light (LED) setting of the A/C.
    Definition: ir_Gree.cpp:313
    const uint16_t kGreeDefaultRepeat
    Definition: IRremoteESP8266.h:954
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Haier_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Haier_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Hitachi_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Hitachi_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Inax_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Inax_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Inax_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Inax_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__JVC_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__JVC_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__JVC_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__JVC_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8h_source.html similarity index 82% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8h_source.html index 86ce2067a..49f19b536 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Kelvinator_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Kelvinator_8h_source.html @@ -84,190 +84,191 @@ $(function() {
    15 // Brand: Kelvinator, Model: KSV80HRC A/C
    16 // Brand: Green, Model: YAPOF3 remote
    17 // Brand: Sharp, Model: YB1FA remote
    -
    18 
    -
    19 #ifndef IR_KELVINATOR_H_
    -
    20 #define IR_KELVINATOR_H_
    -
    21 
    -
    22 #define __STDC_LIMIT_MACROS
    -
    23 #include <stdint.h>
    -
    24 #ifndef UNIT_TEST
    -
    25 #include <Arduino.h>
    -
    26 #endif
    -
    27 #include "IRremoteESP8266.h"
    -
    28 #include "IRsend.h"
    -
    29 #ifdef UNIT_TEST
    -
    30 #include "IRsend_test.h"
    -
    31 #endif
    -
    32 
    - - -
    36  struct {
    -
    37  // Byte 0
    -
    38  uint8_t Mode :3;
    -
    39  uint8_t Power :1;
    -
    40  uint8_t BasicFan :2;
    -
    41  uint8_t VentSwing :1;
    -
    42  uint8_t :1; // Sleep Modes 1 & 3 (1 = On, 0 = Off)
    -
    43  // Byte 1
    -
    44  uint8_t Temp :4; // Degrees C.
    -
    45  uint8_t :4;
    -
    46  // Byte 2
    -
    47  uint8_t :4;
    -
    48  uint8_t Turbo :1;
    -
    49  uint8_t Light :1;
    -
    50  uint8_t IonFilter :1;
    -
    51  uint8_t XFan :1;
    -
    52  // Byte 3
    -
    53  uint8_t :4;
    -
    54  uint8_t :2; // (possibly timer related) (Typically 0b01)
    -
    55  uint8_t :2; // End of command block (B01)
    -
    56  // (B010 marker and a gap of 20ms)
    -
    57  // Byte 4
    -
    58  uint8_t SwingV :1;
    -
    59  uint8_t :3;
    -
    60  uint8_t SwingH :1;
    -
    61  uint8_t :3;
    -
    62  // Byte 5~6
    -
    63  uint8_t pad0[2]; // Timer related. Typically 0 except when timer in use.
    -
    64  // Byte 7
    -
    65  uint8_t :4; // (Used in Timer mode)
    -
    66  uint8_t Sum1 :4; // checksum of the previous bytes (0-6)
    -
    67  // (gap of 40ms)
    -
    68  // (header mark and space)
    -
    69  // Byte 8~10
    -
    70  uint8_t pad1[3]; // Repeat of byte 0~2
    -
    71  // Byte 11
    -
    72  uint8_t :4;
    -
    73  uint8_t :2; // (possibly timer related) (Typically 0b11)
    -
    74  uint8_t :2; // End of command block (B01)
    -
    75  // (B010 marker and a gap of 20ms)
    -
    76  // Byte 12
    -
    77  uint8_t :1; // Sleep mode 2 (1 = On, 0=Off)
    -
    78  uint8_t :6; // (Used in Sleep Mode 3, Typically 0b000000)
    -
    79  uint8_t Quiet :1;
    -
    80  // Byte 13
    -
    81  uint8_t :8; // (Sleep Mode 3 related, Typically 0x00)
    -
    82  // Byte 14
    -
    83  uint8_t :4; // (Sleep Mode 3 related, Typically 0b0000)
    -
    84  uint8_t Fan :3;
    -
    85  // Byte 15
    -
    86  uint8_t :4;
    -
    87  uint8_t Sum2 :4; // checksum of the previous bytes (8-14)
    -
    88  };
    -
    89 };
    -
    90 
    -
    91 // Constants
    -
    92 const uint8_t kKelvinatorAuto = 0; // (temp = 25C)
    -
    93 const uint8_t kKelvinatorCool = 1;
    -
    94 const uint8_t kKelvinatorDry = 2; // (temp = 25C, but not shown)
    -
    95 const uint8_t kKelvinatorFan = 3;
    -
    96 const uint8_t kKelvinatorHeat = 4;
    -
    97 const uint8_t kKelvinatorBasicFanMax = 3;
    -
    98 const uint8_t kKelvinatorFanAuto = 0;
    -
    99 const uint8_t kKelvinatorFanMin = 1;
    -
    100 const uint8_t kKelvinatorFanMax = 5;
    -
    101 const uint8_t kKelvinatorMinTemp = 16; // 16C
    -
    102 const uint8_t kKelvinatorMaxTemp = 30; // 30C
    -
    103 const uint8_t kKelvinatorAutoTemp = 25; // 25C
    -
    104 
    -
    105 // Legacy defines (Deprecated)
    -
    106 #define KELVINATOR_MIN_TEMP kKelvinatorMinTemp
    -
    107 #define KELVINATOR_MAX_TEMP kKelvinatorMaxTemp
    -
    108 #define KELVINATOR_HEAT kKelvinatorHeat
    -
    109 #define KELVINATOR_FAN_MAX kKelvinatorFanMax
    -
    110 #define KELVINATOR_FAN_AUTO kKelvinatorFanAuto
    -
    111 #define KELVINATOR_FAN kKelvinatorFan
    -
    112 #define KELVINATOR_DRY kKelvinatorDry
    -
    113 #define KELVINATOR_COOL kKelvinatorCool
    -
    114 #define KELVINATOR_BASIC_FAN_MAX kKelvinatorBasicFanMax
    -
    115 #define KELVINATOR_AUTO_TEMP kKelvinatorAutoTemp
    -
    116 #define KELVINATOR_AUTO kKelvinatorAuto
    -
    117 
    -
    118 // Classes
    - -
    121  public:
    -
    122  explicit IRKelvinatorAC(const uint16_t pin, const bool inverted = false,
    -
    123  const bool use_modulation = true);
    -
    124  void stateReset(void);
    -
    125 #if SEND_KELVINATOR
    -
    126  void send(const uint16_t repeat = kKelvinatorDefaultRepeat);
    -
    131  int8_t calibrate(void) { return _irsend.calibrate(); }
    -
    132 #endif // SEND_KELVINATOR
    -
    133  void begin(void);
    -
    134  void on(void);
    -
    135  void off(void);
    -
    136  void setPower(const bool on);
    -
    137  bool getPower(void) const;
    -
    138  void setTemp(const uint8_t degrees);
    -
    139  uint8_t getTemp(void) const;
    -
    140  void setFan(const uint8_t speed);
    -
    141  uint8_t getFan(void) const;
    -
    142  void setMode(const uint8_t mode);
    -
    143  uint8_t getMode(void) const;
    -
    144  void setSwingVertical(const bool on);
    -
    145  bool getSwingVertical(void) const;
    -
    146  void setSwingHorizontal(const bool on);
    -
    147  bool getSwingHorizontal(void) const;
    -
    148  void setQuiet(const bool on);
    -
    149  bool getQuiet(void) const;
    -
    150  void setIonFilter(const bool on);
    -
    151  bool getIonFilter(void) const;
    -
    152  void setLight(const bool on);
    -
    153  bool getLight(void) const;
    -
    154  void setXFan(const bool on);
    -
    155  bool getXFan(void) const;
    -
    156  void setTurbo(const bool on);
    -
    157  bool getTurbo(void) const;
    -
    158  uint8_t* getRaw(void);
    -
    159  void setRaw(const uint8_t new_code[]);
    -
    160  static uint8_t calcBlockChecksum(
    -
    161  const uint8_t* block, const uint16_t length = kKelvinatorStateLength / 2);
    -
    162  static bool validChecksum(const uint8_t state[],
    -
    163  const uint16_t length = kKelvinatorStateLength);
    -
    164  static uint8_t convertMode(const stdAc::opmode_t mode);
    -
    165  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    -
    166  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    -
    167  stdAc::state_t toCommon(void) const;
    -
    168  String toString(void) const;
    -
    169 #ifndef UNIT_TEST
    -
    170 
    -
    171  private:
    - -
    173 #else // UNIT_TEST
    -
    174  IRsendTest _irsend;
    -
    176 #endif // UNIT_TEST
    - -
    179  void checksum(void);
    -
    180  void fixup(void);
    -
    181 };
    -
    182 
    -
    183 #endif // IR_KELVINATOR_H_
    +
    18 // Brand: Sharp, Model: A5VEY A/C
    +
    19 
    +
    20 #ifndef IR_KELVINATOR_H_
    +
    21 #define IR_KELVINATOR_H_
    +
    22 
    +
    23 #define __STDC_LIMIT_MACROS
    +
    24 #include <stdint.h>
    +
    25 #ifndef UNIT_TEST
    +
    26 #include <Arduino.h>
    +
    27 #endif
    +
    28 #include "IRremoteESP8266.h"
    +
    29 #include "IRsend.h"
    +
    30 #ifdef UNIT_TEST
    +
    31 #include "IRsend_test.h"
    +
    32 #endif
    +
    33 
    + + +
    37  struct {
    +
    38  // Byte 0
    +
    39  uint8_t Mode :3;
    +
    40  uint8_t Power :1;
    +
    41  uint8_t BasicFan :2;
    +
    42  uint8_t VentSwing :1;
    +
    43  uint8_t :1; // Sleep Modes 1 & 3 (1 = On, 0 = Off)
    +
    44  // Byte 1
    +
    45  uint8_t Temp :4; // Degrees C.
    +
    46  uint8_t :4;
    +
    47  // Byte 2
    +
    48  uint8_t :4;
    +
    49  uint8_t Turbo :1;
    +
    50  uint8_t Light :1;
    +
    51  uint8_t IonFilter :1;
    +
    52  uint8_t XFan :1;
    +
    53  // Byte 3
    +
    54  uint8_t :4;
    +
    55  uint8_t :2; // (possibly timer related) (Typically 0b01)
    +
    56  uint8_t :2; // End of command block (B01)
    +
    57  // (B010 marker and a gap of 20ms)
    +
    58  // Byte 4
    +
    59  uint8_t SwingV :1;
    +
    60  uint8_t :3;
    +
    61  uint8_t SwingH :1;
    +
    62  uint8_t :3;
    +
    63  // Byte 5~6
    +
    64  uint8_t pad0[2]; // Timer related. Typically 0 except when timer in use.
    +
    65  // Byte 7
    +
    66  uint8_t :4; // (Used in Timer mode)
    +
    67  uint8_t Sum1 :4; // checksum of the previous bytes (0-6)
    +
    68  // (gap of 40ms)
    +
    69  // (header mark and space)
    +
    70  // Byte 8~10
    +
    71  uint8_t pad1[3]; // Repeat of byte 0~2
    +
    72  // Byte 11
    +
    73  uint8_t :4;
    +
    74  uint8_t :2; // (possibly timer related) (Typically 0b11)
    +
    75  uint8_t :2; // End of command block (B01)
    +
    76  // (B010 marker and a gap of 20ms)
    +
    77  // Byte 12
    +
    78  uint8_t :1; // Sleep mode 2 (1 = On, 0=Off)
    +
    79  uint8_t :6; // (Used in Sleep Mode 3, Typically 0b000000)
    +
    80  uint8_t Quiet :1;
    +
    81  // Byte 13
    +
    82  uint8_t :8; // (Sleep Mode 3 related, Typically 0x00)
    +
    83  // Byte 14
    +
    84  uint8_t :4; // (Sleep Mode 3 related, Typically 0b0000)
    +
    85  uint8_t Fan :3;
    +
    86  // Byte 15
    +
    87  uint8_t :4;
    +
    88  uint8_t Sum2 :4; // checksum of the previous bytes (8-14)
    +
    89  };
    +
    90 };
    +
    91 
    +
    92 // Constants
    +
    93 const uint8_t kKelvinatorAuto = 0; // (temp = 25C)
    +
    94 const uint8_t kKelvinatorCool = 1;
    +
    95 const uint8_t kKelvinatorDry = 2; // (temp = 25C, but not shown)
    +
    96 const uint8_t kKelvinatorFan = 3;
    +
    97 const uint8_t kKelvinatorHeat = 4;
    +
    98 const uint8_t kKelvinatorBasicFanMax = 3;
    +
    99 const uint8_t kKelvinatorFanAuto = 0;
    +
    100 const uint8_t kKelvinatorFanMin = 1;
    +
    101 const uint8_t kKelvinatorFanMax = 5;
    +
    102 const uint8_t kKelvinatorMinTemp = 16; // 16C
    +
    103 const uint8_t kKelvinatorMaxTemp = 30; // 30C
    +
    104 const uint8_t kKelvinatorAutoTemp = 25; // 25C
    +
    105 
    +
    106 // Legacy defines (Deprecated)
    +
    107 #define KELVINATOR_MIN_TEMP kKelvinatorMinTemp
    +
    108 #define KELVINATOR_MAX_TEMP kKelvinatorMaxTemp
    +
    109 #define KELVINATOR_HEAT kKelvinatorHeat
    +
    110 #define KELVINATOR_FAN_MAX kKelvinatorFanMax
    +
    111 #define KELVINATOR_FAN_AUTO kKelvinatorFanAuto
    +
    112 #define KELVINATOR_FAN kKelvinatorFan
    +
    113 #define KELVINATOR_DRY kKelvinatorDry
    +
    114 #define KELVINATOR_COOL kKelvinatorCool
    +
    115 #define KELVINATOR_BASIC_FAN_MAX kKelvinatorBasicFanMax
    +
    116 #define KELVINATOR_AUTO_TEMP kKelvinatorAutoTemp
    +
    117 #define KELVINATOR_AUTO kKelvinatorAuto
    +
    118 
    +
    119 // Classes
    + +
    122  public:
    +
    123  explicit IRKelvinatorAC(const uint16_t pin, const bool inverted = false,
    +
    124  const bool use_modulation = true);
    +
    125  void stateReset(void);
    +
    126 #if SEND_KELVINATOR
    +
    127  void send(const uint16_t repeat = kKelvinatorDefaultRepeat);
    +
    132  int8_t calibrate(void) { return _irsend.calibrate(); }
    +
    133 #endif // SEND_KELVINATOR
    +
    134  void begin(void);
    +
    135  void on(void);
    +
    136  void off(void);
    +
    137  void setPower(const bool on);
    +
    138  bool getPower(void) const;
    +
    139  void setTemp(const uint8_t degrees);
    +
    140  uint8_t getTemp(void) const;
    +
    141  void setFan(const uint8_t speed);
    +
    142  uint8_t getFan(void) const;
    +
    143  void setMode(const uint8_t mode);
    +
    144  uint8_t getMode(void) const;
    +
    145  void setSwingVertical(const bool on);
    +
    146  bool getSwingVertical(void) const;
    +
    147  void setSwingHorizontal(const bool on);
    +
    148  bool getSwingHorizontal(void) const;
    +
    149  void setQuiet(const bool on);
    +
    150  bool getQuiet(void) const;
    +
    151  void setIonFilter(const bool on);
    +
    152  bool getIonFilter(void) const;
    +
    153  void setLight(const bool on);
    +
    154  bool getLight(void) const;
    +
    155  void setXFan(const bool on);
    +
    156  bool getXFan(void) const;
    +
    157  void setTurbo(const bool on);
    +
    158  bool getTurbo(void) const;
    +
    159  uint8_t* getRaw(void);
    +
    160  void setRaw(const uint8_t new_code[]);
    +
    161  static uint8_t calcBlockChecksum(
    +
    162  const uint8_t* block, const uint16_t length = kKelvinatorStateLength / 2);
    +
    163  static bool validChecksum(const uint8_t state[],
    +
    164  const uint16_t length = kKelvinatorStateLength);
    +
    165  static uint8_t convertMode(const stdAc::opmode_t mode);
    +
    166  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    +
    167  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    +
    168  stdAc::state_t toCommon(void) const;
    +
    169  String toString(void) const;
    +
    170 #ifndef UNIT_TEST
    +
    171 
    +
    172  private:
    + +
    174 #else // UNIT_TEST
    +
    175  IRsendTest _irsend;
    +
    177 #endif // UNIT_TEST
    + +
    180  void checksum(void);
    +
    181  void fixup(void);
    +
    182 };
    +
    183 
    +
    184 #endif // IR_KELVINATOR_H_
    void setSwingHorizontal(const bool on)
    Control the current horizontal swing setting.
    Definition: ir_Kelvinator.cpp:292
    void stateReset(void)
    Reset the internals of the object to a known good state.
    Definition: ir_Kelvinator.cpp:114
    void setTurbo(const bool on)
    Control the current Turbo setting.
    Definition: ir_Kelvinator.cpp:358
    -
    const uint8_t kKelvinatorFanAuto
    Definition: ir_Kelvinator.h:98
    +
    const uint8_t kKelvinatorFanAuto
    Definition: ir_Kelvinator.h:99
    void on(void)
    Set the internal state to have the power on.
    Definition: ir_Kelvinator.cpp:196
    -
    const uint8_t kKelvinatorFanMax
    Definition: ir_Kelvinator.h:100
    -
    const uint8_t kKelvinatorCool
    Definition: ir_Kelvinator.h:93
    +
    const uint8_t kKelvinatorFanMax
    Definition: ir_Kelvinator.h:101
    +
    const uint8_t kKelvinatorCool
    Definition: ir_Kelvinator.h:94
    fanspeed_t
    Common A/C settings for Fan Speeds.
    Definition: IRsend.h:58
    void setLight(const bool on)
    Control the current Light setting. i.e. The LED display on the A/C unit that shows the basic settings...
    Definition: ir_Kelvinator.cpp:330
    -
    uint8_t IonFilter
    Definition: ir_Kelvinator.h:50
    -
    uint8_t SwingV
    Definition: ir_Kelvinator.h:58
    -
    uint8_t pad0[2]
    Definition: ir_Kelvinator.h:63
    +
    uint8_t IonFilter
    Definition: ir_Kelvinator.h:51
    +
    uint8_t SwingV
    Definition: ir_Kelvinator.h:59
    +
    uint8_t pad0[2]
    Definition: ir_Kelvinator.h:64
    static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
    Convert a native fan speed to it's stdAc::fanspeed_t equivalent.
    Definition: ir_Kelvinator.cpp:397
    -
    const uint8_t kKelvinatorAutoTemp
    Definition: ir_Kelvinator.h:103
    -
    uint8_t VentSwing
    Definition: ir_Kelvinator.h:41
    +
    const uint8_t kKelvinatorAutoTemp
    Definition: ir_Kelvinator.h:104
    +
    uint8_t VentSwing
    Definition: ir_Kelvinator.h:42
    uint8_t * getRaw(void)
    Get the raw state of the object, suitable to be sent with the appropriate IRsend object method.
    Definition: ir_Kelvinator.cpp:146
    bool getLight(void) const
    Is the Light (Display) setting on?
    Definition: ir_Kelvinator.cpp:336
    -
    uint8_t XFan
    Definition: ir_Kelvinator.h:51
    +
    uint8_t XFan
    Definition: ir_Kelvinator.h:52
    void setIonFilter(const bool on)
    Control the current Ion Filter setting.
    Definition: ir_Kelvinator.cpp:317
    uint8_t getTemp(void) const
    Get the current temperature setting.
    Definition: ir_Kelvinator.cpp:223
    void setFan(const uint8_t speed)
    Set the speed of the fan.
    Definition: ir_Kelvinator.cpp:229
    Class for sending all basic IR protocols.
    Definition: IRsend.h:182
    -
    const uint8_t kKelvinatorMinTemp
    Definition: ir_Kelvinator.h:101
    -
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Kelvinator.h:131
    +
    const uint8_t kKelvinatorMinTemp
    Definition: ir_Kelvinator.h:102
    +
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Kelvinator.h:132
    int8_t calibrate(uint16_t hz=38000U)
    Calculate & set any offsets to account for execution times during sending.
    Definition: IRsend.cpp:207
    std::string String
    Definition: IRremoteESP8266.h:1178
    bool getSwingHorizontal(void) const
    Is the horizontal swing setting on?
    Definition: ir_Kelvinator.cpp:299
    @@ -277,54 +278,54 @@ $(function() {
    void setRaw(const uint8_t new_code[])
    Set the raw state of the object.
    Definition: ir_Kelvinator.cpp:153
    void begin(void)
    Set up hardware to be able to send a message.
    Definition: ir_Kelvinator.cpp:121
    static uint8_t calcBlockChecksum(const uint8_t *block, const uint16_t length=kKelvinatorStateLength/2)
    Calculate the checksum for a given block of state.
    Definition: ir_Kelvinator.cpp:162
    -
    uint8_t Power
    Definition: ir_Kelvinator.h:39
    +
    uint8_t Power
    Definition: ir_Kelvinator.h:40
    -
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Kelvinator.h:172
    -
    uint8_t Light
    Definition: ir_Kelvinator.h:49
    -
    uint8_t raw[kKelvinatorStateLength]
    The state in IR code form.
    Definition: ir_Kelvinator.h:35
    +
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Kelvinator.h:173
    +
    uint8_t Light
    Definition: ir_Kelvinator.h:50
    +
    uint8_t raw[kKelvinatorStateLength]
    The state in IR code form.
    Definition: ir_Kelvinator.h:36
    bool getPower(void) const
    Get the power setting from the internal state.
    Definition: ir_Kelvinator.cpp:209
    static bool validChecksum(const uint8_t state[], const uint16_t length=kKelvinatorStateLength)
    Verify the checksum is valid for a given state.
    Definition: ir_Kelvinator.cpp:184
    -
    Class for handling detailed Kelvinator A/C messages.
    Definition: ir_Kelvinator.h:120
    -
    const uint8_t kKelvinatorMaxTemp
    Definition: ir_Kelvinator.h:102
    +
    Class for handling detailed Kelvinator A/C messages.
    Definition: ir_Kelvinator.h:121
    +
    const uint8_t kKelvinatorMaxTemp
    Definition: ir_Kelvinator.h:103
    bool getSwingVertical(void) const
    Is the vertical swing setting on?
    Definition: ir_Kelvinator.cpp:286
    -
    uint8_t Mode
    Definition: ir_Kelvinator.h:38
    -
    uint8_t Sum1
    Definition: ir_Kelvinator.h:66
    +
    uint8_t Mode
    Definition: ir_Kelvinator.h:39
    +
    uint8_t Sum1
    Definition: ir_Kelvinator.h:67
    void checksum(void)
    Calculate the checksum for the internal state.
    Definition: ir_Kelvinator.cpp:175
    void fixup(void)
    Fix up any odd conditions for the current state.
    Definition: ir_Kelvinator.cpp:124
    -
    uint8_t pad1[3]
    Definition: ir_Kelvinator.h:70
    +
    uint8_t pad1[3]
    Definition: ir_Kelvinator.h:71
    const uint16_t kKelvinatorStateLength
    Definition: IRremoteESP8266.h:979
    stdAc::state_t toCommon(void) const
    Convert the internal A/C object state to it's stdAc::state_t equivalent.
    Definition: ir_Kelvinator.cpp:403
    void setQuiet(const bool on)
    Control the current Quiet setting.
    Definition: ir_Kelvinator.cpp:305
    void setXFan(const bool on)
    Control the current XFan setting. This setting will cause the unit blow air after power off to dry ou...
    Definition: ir_Kelvinator.cpp:345
    -
    uint8_t SwingH
    Definition: ir_Kelvinator.h:60
    -
    const uint8_t kKelvinatorFan
    Definition: ir_Kelvinator.h:95
    +
    uint8_t SwingH
    Definition: ir_Kelvinator.h:61
    +
    const uint8_t kKelvinatorFan
    Definition: ir_Kelvinator.h:96
    String toString(void) const
    Convert the internal settings into a human readable string.
    Definition: ir_Kelvinator.cpp:429
    void setTemp(const uint8_t degrees)
    Set the temperature setting.
    Definition: ir_Kelvinator.cpp:215
    -
    uint8_t Sum2
    Definition: ir_Kelvinator.h:87
    -
    const uint8_t kKelvinatorBasicFanMax
    Definition: ir_Kelvinator.h:97
    -
    const uint8_t kKelvinatorFanMin
    Definition: ir_Kelvinator.h:99
    +
    uint8_t Sum2
    Definition: ir_Kelvinator.h:88
    +
    const uint8_t kKelvinatorBasicFanMax
    Definition: ir_Kelvinator.h:98
    +
    const uint8_t kKelvinatorFanMin
    Definition: ir_Kelvinator.h:100
    bool getTurbo(void) const
    Is the Turbo setting on?
    Definition: ir_Kelvinator.cpp:364
    -
    KelvinatorProtocol _
    Definition: ir_Kelvinator.h:178
    +
    KelvinatorProtocol _
    Definition: ir_Kelvinator.h:179
    uint8_t getMode(void) const
    Get the current operation mode setting.
    Definition: ir_Kelvinator.cpp:251
    -
    uint8_t BasicFan
    Definition: ir_Kelvinator.h:40
    -
    const uint8_t kKelvinatorHeat
    Definition: ir_Kelvinator.h:96
    +
    uint8_t BasicFan
    Definition: ir_Kelvinator.h:41
    +
    const uint8_t kKelvinatorHeat
    Definition: ir_Kelvinator.h:97
    bool getQuiet(void) const
    Is the Quiet setting on?
    Definition: ir_Kelvinator.cpp:311
    IRKelvinatorAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
    Class constructor.
    Definition: ir_Kelvinator.cpp:109
    void off(void)
    Set the internal state to have the power off.
    Definition: ir_Kelvinator.cpp:199
    const uint16_t kKelvinatorDefaultRepeat
    Definition: IRremoteESP8266.h:981
    void setSwingVertical(const bool on)
    Control the current vertical swing setting.
    Definition: ir_Kelvinator.cpp:279
    uint8_t getFan(void) const
    Get the current fan speed setting.
    Definition: ir_Kelvinator.cpp:245
    -
    const uint8_t kKelvinatorDry
    Definition: ir_Kelvinator.h:94
    -
    uint8_t Quiet
    Definition: ir_Kelvinator.h:79
    +
    const uint8_t kKelvinatorDry
    Definition: ir_Kelvinator.h:95
    +
    uint8_t Quiet
    Definition: ir_Kelvinator.h:80
    bool getXFan(void) const
    Is the XFan setting on?
    Definition: ir_Kelvinator.cpp:351
    -
    Native representation of a Kelvinator A/C message.
    Definition: ir_Kelvinator.h:34
    +
    Native representation of a Kelvinator A/C message.
    Definition: ir_Kelvinator.h:35
    bool getIonFilter(void) const
    Is the Ion Filter setting on?
    Definition: ir_Kelvinator.cpp:323
    static stdAc::opmode_t toCommonMode(const uint8_t mode)
    Convert a native mode to it's stdAc::opmode_t equivalent.
    Definition: ir_Kelvinator.cpp:384
    Structure to hold a common A/C state.
    Definition: IRsend.h:97
    -
    uint8_t Turbo
    Definition: ir_Kelvinator.h:48
    -
    uint8_t Temp
    Definition: ir_Kelvinator.h:44
    -
    uint8_t Fan
    Definition: ir_Kelvinator.h:84
    -
    const uint8_t kKelvinatorAuto
    Definition: ir_Kelvinator.h:92
    +
    uint8_t Turbo
    Definition: ir_Kelvinator.h:49
    +
    uint8_t Temp
    Definition: ir_Kelvinator.h:45
    +
    uint8_t Fan
    Definition: ir_Kelvinator.h:85
    +
    const uint8_t kKelvinatorAuto
    Definition: ir_Kelvinator.h:93
    static uint8_t convertMode(const stdAc::opmode_t mode)
    Convert a standard A/C mode (stdAc::opmode_t) into it a native mode.
    Definition: ir_Kelvinator.cpp:371
    opmode_t
    Common A/C settings for A/C operating modes.
    Definition: IRsend.h:46
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__LG_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__LG_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lasertag_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lasertag_8cpp.html similarity index 99% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lasertag_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lasertag_8cpp.html index 568c1faa2..75211b610 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lasertag_8cpp.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lasertag_8cpp.html @@ -87,7 +87,7 @@ Variables   const uint16_t kLasertagExcess = 0   -const uint16_t kLasertagDelta = 150 +const uint16_t kLasertagDelta = 165   const int16_t kSpace = 1   @@ -105,7 +105,7 @@ Variables
    - +
    const uint16_t kLasertagDelta = 150const uint16_t kLasertagDelta = 165
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lego_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lego_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lego_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lego_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lutron_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lutron_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Lutron_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Lutron_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MWM_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MWM_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MWM_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MWM_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Magiquest_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Magiquest_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Metz_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Metz_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Metz_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Metz_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h.html similarity index 99% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h.html index d5c6c5109..9a8f24801 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h.html @@ -159,7 +159,9 @@ Variables

    Detailed Description

    Variable Documentation

    ◆ kMideaACAuto

    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h_source.html similarity index 80% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h_source.html index 97fc5645f..399c78c8b 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Midea_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Midea_8h_source.html @@ -71,333 +71,335 @@ $(function() {
    Go to the documentation of this file.
    1 // Copyright 2017 David Conran
    2 
    -
    7 
    -
    8 // Supports:
    -
    9 // Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
    -
    10 // Brand: Pioneer System, Model: RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
    -
    11 // Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA)
    -
    12 // Brand: Kaysun, Model: Casual CF A/C (MIDEA)
    -
    13 // Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA)
    -
    14 // Brand: MrCool, Model: RG57A6/BGEFU1 remote (MIDEA)
    -
    15 // Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24)
    -
    16 // Brand: Danby, Model: DAC080BGUWDB (MIDEA)
    -
    17 // Brand: Danby, Model: DAC100BGUWDB (MIDEA)
    -
    18 // Brand: Danby, Model: DAC120BGUWDB (MIDEA)
    -
    19 // Brand: Danby, Model: R09C/BCGE remote (MIDEA)
    -
    20 
    -
    21 #ifndef IR_MIDEA_H_
    -
    22 #define IR_MIDEA_H_
    -
    23 
    -
    24 #define __STDC_LIMIT_MACROS
    -
    25 #include <stdint.h>
    -
    26 #ifdef ARDUINO
    -
    27 #include <Arduino.h>
    -
    28 #endif
    -
    29 #include "IRremoteESP8266.h"
    -
    30 #include "IRsend.h"
    -
    31 #ifdef UNIT_TEST
    -
    32 #include "IRsend_test.h"
    +
    8 
    +
    9 // Supports:
    +
    10 // Brand: Pioneer System, Model: RYBO12GMFILCAD A/C (12K BTU) (MIDEA)
    +
    11 // Brand: Pioneer System, Model: RUBO18GMFILCAD A/C (18K BTU) (MIDEA)
    +
    12 // Brand: Pioneer System, Model: WS012GMFI22HLD A/C (12K BTU) (MIDEA)
    +
    13 // Brand: Pioneer System, Model: WS018GMFI22HLD A/C (12K BTU) (MIDEA)
    +
    14 // Brand: Pioneer System, Model: UB018GMFILCFHD A/C (12K BTU) (MIDEA)
    +
    15 // Brand: Pioneer System, Model: RG66B6(B)/BGEFU1 remote (MIDEA)
    +
    16 // Brand: Comfee, Model: MPD1-12CRN7 A/C (MIDEA)
    +
    17 // Brand: Kaysun, Model: Casual CF A/C (MIDEA)
    +
    18 // Brand: Keystone, Model: RG57H4(B)BGEF remote (MIDEA)
    +
    19 // Brand: MrCool, Model: RG57A6/BGEFU1 remote (MIDEA)
    +
    20 // Brand: Midea, Model: FS40-7AR Stand Fan (MIDEA24)
    +
    21 // Brand: Danby, Model: DAC080BGUWDB (MIDEA)
    +
    22 // Brand: Danby, Model: DAC100BGUWDB (MIDEA)
    +
    23 // Brand: Danby, Model: DAC120BGUWDB (MIDEA)
    +
    24 // Brand: Danby, Model: R09C/BCGE remote (MIDEA)
    +
    25 
    +
    26 #ifndef IR_MIDEA_H_
    +
    27 #define IR_MIDEA_H_
    +
    28 
    +
    29 #define __STDC_LIMIT_MACROS
    +
    30 #include <stdint.h>
    +
    31 #ifdef ARDUINO
    +
    32 #include <Arduino.h>
    33 #endif
    -
    34 
    -
    35 // Compile-time model specific overrides.
    -
    36 // Uncomment one of these if you have such a devices to better match your A/C.
    -
    37 // It changes some of the special commands/settings.
    -
    38 //
    -
    39 // #define DANBY_DAC true
    -
    40 // #define KAYSUN_AC true
    -
    41 
    - -
    44  uint64_t remote_state;
    -
    45  // only use 48bits
    -
    46  struct {
    -
    47  // Byte 0
    -
    48  uint8_t Sum;
    -
    49  // Byte 1 (value=0xFF when not in use.)
    -
    50  // This byte gets dual usage as Sensor Temp and On Timer
    -
    51  // Depending on "Type" below.
    -
    52  // When in "OnTimer", the nr of half hours is stored with mask 0b01111110
    -
    53  // i.e.
    -
    54  // uint8_t :1;
    -
    55  // uint8_t OnTimerHalfHours:6;
    -
    56  // uint8_t :1;
    -
    57  uint8_t SensorTemp:7;
    -
    58  uint8_t disableSensor:1;
    -
    59  // Byte 2 (value=0xFF when not in use.)
    -
    60  uint8_t :1; // 0b1
    -
    61  uint8_t OffTimer:6;
    -
    62  uint8_t BeepDisable:1;
    -
    63  // Byte 3
    -
    64  uint8_t Temp:5;
    -
    65  uint8_t useFahrenheit:1;
    -
    66  uint8_t :0;
    -
    67  // Byte 4
    -
    68  uint8_t Mode:3;
    -
    69  uint8_t Fan:2;
    -
    70  uint8_t :1;
    -
    71  uint8_t Sleep:1;
    -
    72  uint8_t Power:1;
    -
    73  // Byte 5
    -
    74  uint8_t Type:3;
    -
    75  uint8_t Header:5;
    -
    76  };
    -
    77 };
    -
    78 
    -
    79 // Constants
    -
    80 const uint8_t kMideaACMinTempF = 62;
    -
    81 const uint8_t kMideaACMaxTempF = 86;
    -
    82 const uint8_t kMideaACMinTempC = 17;
    -
    83 const uint8_t kMideaACMaxTempC = 30;
    -
    84 const uint8_t kMideaACMinSensorTempC = 0;
    -
    85 const uint8_t kMideaACMaxSensorTempC = 37;
    -
    86 const uint8_t kMideaACMinSensorTempF = 32;
    -
    87 const uint8_t kMideaACMaxSensorTempF = 99;
    -
    88 const uint8_t kMideaACSensorTempOnTimerOff = 0b1111111;
    -
    89 const uint8_t kMideaACTimerOff = 0b111111;
    -
    90 const uint8_t kMideaACCool = 0; // 0b000
    -
    91 const uint8_t kMideaACDry = 1; // 0b001
    -
    92 const uint8_t kMideaACAuto = 2; // 0b010
    -
    93 const uint8_t kMideaACHeat = 3; // 0b011
    -
    94 const uint8_t kMideaACFan = 4; // 0b100
    -
    95 const uint8_t kMideaACFanAuto = 0; // 0b00
    -
    96 const uint8_t kMideaACFanLow = 1; // 0b01
    -
    97 const uint8_t kMideaACFanMed = 2; // 0b10
    -
    98 const uint8_t kMideaACFanHigh = 3; // 0b11
    -
    99 #if KAYSUN_AC
    -
    100  // For Kaysun AC units, Toggle SwingV is 0xA202FFFFFF7E
    -
    101  const uint64_t kMideaACToggleSwingV = 0xA202FFFFFF7E;
    -
    102  const uint64_t kMideaACSwingVStep = 0xA201FFFFFF7C;
    -
    103 #else // KAYSUN_AC
    -
    104  const uint64_t kMideaACToggleSwingV = 0xA201FFFFFF7C;
    -
    105 #endif // KAYSUN_AC
    -
    106 #if DANBY_DAC
    -
    107  // For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV
    -
    108  // const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C;
    - -
    110 #endif // DANBY_DAC
    -
    111 const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E;
    -
    112 const uint64_t kMideaACToggleLight = 0xA208FFFFFF75;
    -
    113 const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74;
    -
    114 const uint8_t kMideaACTypeCommand = 0b001;
    -
    115 const uint8_t kMideaACTypeSpecial = 0b010;
    -
    116 const uint8_t kMideaACTypeFollow = 0b100;
    -
    117 
    -
    118 // Legacy defines. (Deprecated)
    -
    119 #define MIDEA_AC_COOL kMideaACCool
    -
    120 #define MIDEA_AC_DRY kMideaACDry
    -
    121 #define MIDEA_AC_AUTO kMideaACAuto
    -
    122 #define MIDEA_AC_HEAT kMideaACHeat
    -
    123 #define MIDEA_AC_FAN kMideaACFan
    -
    124 #define MIDEA_AC_FAN_AUTO kMideaACFanAuto
    -
    125 #define MIDEA_AC_FAN_LOW kMideaACFanLow
    -
    126 #define MIDEA_AC_FAN_MED kMideaACFanMed
    -
    127 #define MIDEA_AC_FAN_HI kMideaACFanHigh
    -
    128 #define MIDEA_AC_POWER kMideaACPower
    -
    129 #define MIDEA_AC_SLEEP kMideaACSleep
    -
    130 #define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
    -
    131 #define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
    -
    132 #define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
    -
    133 #define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
    -
    134 
    -
    135 // Classes
    -
    138 class IRMideaAC {
    -
    139  public:
    -
    140  explicit IRMideaAC(const uint16_t pin, const bool inverted = false,
    -
    141  const bool use_modulation = true);
    -
    142  void stateReset(void);
    -
    143 #if SEND_MIDEA
    -
    144  void send(const uint16_t repeat = kMideaMinRepeat);
    -
    149  int8_t calibrate(void) { return _irsend.calibrate(); }
    -
    150 #endif // SEND_MIDEA
    -
    151  void begin(void);
    -
    152  void on(void);
    -
    153  void off(void);
    -
    154  void setPower(const bool on);
    -
    155  bool getPower(void) const;
    -
    156  bool getUseCelsius(void) const;
    -
    157  void setUseCelsius(const bool celsius);
    -
    158  void setTemp(const uint8_t temp, const bool useCelsius = false);
    -
    159  uint8_t getTemp(const bool useCelsius = false) const;
    -
    160  void setSensorTemp(const uint8_t temp, const bool useCelsius = false);
    -
    161  uint8_t getSensorTemp(const bool useCelsius = false) const;
    -
    162  void setEnableSensorTemp(const bool on);
    -
    163  bool getEnableSensorTemp(void) const;
    -
    164  void setFan(const uint8_t fan);
    -
    165  uint8_t getFan(void) const;
    -
    166  void setMode(const uint8_t mode);
    -
    167  uint8_t getMode(void) const;
    -
    168  void setRaw(const uint64_t newState);
    -
    169  uint64_t getRaw(void);
    -
    170  static bool validChecksum(const uint64_t state);
    -
    171  void setSleep(const bool on);
    -
    172  bool getSleep(void) const;
    -
    173  bool isSwingVToggle(void) const;
    -
    174  void setSwingVToggle(const bool on);
    -
    175  bool getSwingVToggle(void);
    -
    176  #if KAYSUN_AC
    -
    177  bool isSwingVStep(void) const;
    -
    178  void setSwingVStep(const bool on);
    -
    179  bool getSwingVStep(void);
    -
    180  #endif // KAYSUN_AC
    -
    181  bool isEconoToggle(void) const;
    -
    182  void setEconoToggle(const bool on);
    -
    183  bool getEconoToggle(void);
    -
    184  bool isTurboToggle(void) const;
    -
    185  void setTurboToggle(const bool on);
    -
    186  bool getTurboToggle(void);
    -
    187  bool isLightToggle(void) const;
    -
    188  void setLightToggle(const bool on);
    -
    189  bool getLightToggle(void);
    -
    190  uint8_t getType(void) const;
    -
    191  bool isOnTimerEnabled(void) const;
    -
    192  uint16_t getOnTimer(void) const;
    -
    193  void setOnTimer(const uint16_t mins);
    -
    194  bool isOffTimerEnabled(void) const;
    -
    195  uint16_t getOffTimer(void) const;
    -
    196  void setOffTimer(const uint16_t mins);
    -
    197  static uint8_t convertMode(const stdAc::opmode_t mode);
    -
    198  static uint8_t convertFan(const stdAc::fanspeed_t speed);
    -
    199  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    -
    200  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    -
    201  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
    -
    202  String toString(void);
    -
    203 #ifndef UNIT_TEST
    -
    204 
    -
    205  private:
    - -
    207 #else // UNIT_TEST
    -
    208  IRsendTest _irsend;
    -
    210 #endif // UNIT_TEST
    - - -
    214  #if KAYSUN_AC
    - -
    216  #endif // KAYSUN_AC
    - - - -
    220  void checksum(void);
    -
    221  static uint8_t calcChecksum(const uint64_t state);
    -
    222  void setType(const uint8_t type);
    -
    223 };
    -
    224 
    -
    225 #endif // IR_MIDEA_H_
    +
    34 #include "IRremoteESP8266.h"
    +
    35 #include "IRsend.h"
    +
    36 #ifdef UNIT_TEST
    +
    37 #include "IRsend_test.h"
    +
    38 #endif
    +
    39 
    +
    44 //
    +
    45 // #define DANBY_DAC true
    +
    46 // #define KAYSUN_AC true
    +
    47 
    +
    52 
    + +
    55  uint64_t remote_state;
    +
    56  // only use 48bits
    +
    57  struct {
    +
    58  // Byte 0
    +
    59  uint8_t Sum;
    +
    60  // Byte 1 (value=0xFF when not in use.)
    +
    61  // This byte gets dual usage as Sensor Temp and On Timer
    +
    62  // Depending on "Type" below.
    +
    63  // When in "OnTimer", the nr of half hours is stored with mask 0b01111110
    +
    64  // i.e.
    +
    65  // uint8_t :1;
    +
    66  // uint8_t OnTimerHalfHours:6;
    +
    67  // uint8_t :1;
    +
    68  uint8_t SensorTemp:7;
    +
    69  uint8_t disableSensor:1;
    +
    70  // Byte 2 (value=0xFF when not in use.)
    +
    71  uint8_t :1; // 0b1
    +
    72  uint8_t OffTimer:6;
    +
    73  uint8_t BeepDisable:1;
    +
    74  // Byte 3
    +
    75  uint8_t Temp:5;
    +
    76  uint8_t useFahrenheit:1;
    +
    77  uint8_t :0;
    +
    78  // Byte 4
    +
    79  uint8_t Mode:3;
    +
    80  uint8_t Fan:2;
    +
    83  uint8_t :1;
    +
    84  uint8_t Sleep:1;
    +
    85  uint8_t Power:1;
    +
    86  // Byte 5
    +
    87  uint8_t Type:3;
    +
    88  uint8_t Header:5;
    +
    89  };
    +
    90 };
    +
    91 
    +
    92 // Constants
    +
    93 const uint8_t kMideaACMinTempF = 62;
    +
    94 const uint8_t kMideaACMaxTempF = 86;
    +
    95 const uint8_t kMideaACMinTempC = 17;
    +
    96 const uint8_t kMideaACMaxTempC = 30;
    +
    97 const uint8_t kMideaACMinSensorTempC = 0;
    +
    98 const uint8_t kMideaACMaxSensorTempC = 37;
    +
    99 const uint8_t kMideaACMinSensorTempF = 32;
    +
    100 const uint8_t kMideaACMaxSensorTempF = 99;
    +
    101 const uint8_t kMideaACSensorTempOnTimerOff = 0b1111111;
    +
    102 const uint8_t kMideaACTimerOff = 0b111111;
    +
    103 const uint8_t kMideaACCool = 0; // 0b000
    +
    104 const uint8_t kMideaACDry = 1; // 0b001
    +
    105 const uint8_t kMideaACAuto = 2; // 0b010
    +
    106 const uint8_t kMideaACHeat = 3; // 0b011
    +
    107 const uint8_t kMideaACFan = 4; // 0b100
    +
    108 const uint8_t kMideaACFanAuto = 0; // 0b00
    +
    109 const uint8_t kMideaACFanLow = 1; // 0b01
    +
    110 const uint8_t kMideaACFanMed = 2; // 0b10
    +
    111 const uint8_t kMideaACFanHigh = 3; // 0b11
    +
    112 #if KAYSUN_AC
    +
    113  // For Kaysun AC units, Toggle SwingV is 0xA202FFFFFF7E
    +
    114  const uint64_t kMideaACToggleSwingV = 0xA202FFFFFF7E;
    +
    115  const uint64_t kMideaACSwingVStep = 0xA201FFFFFF7C;
    +
    116 #else // KAYSUN_AC
    +
    117  const uint64_t kMideaACToggleSwingV = 0xA201FFFFFF7C;
    +
    118 #endif // KAYSUN_AC
    +
    119 #if DANBY_DAC
    +
    120  // For Danby DAC unit, the Ionizer toggle is the same as ToggleSwingV
    +
    121  // const uint64_t kMideaACToggleIonizer = 0xA201FFFFFF7C;
    + +
    123 #endif // DANBY_DAC
    +
    124 const uint64_t kMideaACToggleEcono = 0xA202FFFFFF7E;
    +
    125 const uint64_t kMideaACToggleLight = 0xA208FFFFFF75;
    +
    126 const uint64_t kMideaACToggleTurbo = 0xA209FFFFFF74;
    +
    127 const uint8_t kMideaACTypeCommand = 0b001;
    +
    128 const uint8_t kMideaACTypeSpecial = 0b010;
    +
    129 const uint8_t kMideaACTypeFollow = 0b100;
    +
    130 
    +
    131 // Legacy defines. (Deprecated)
    +
    132 #define MIDEA_AC_COOL kMideaACCool
    +
    133 #define MIDEA_AC_DRY kMideaACDry
    +
    134 #define MIDEA_AC_AUTO kMideaACAuto
    +
    135 #define MIDEA_AC_HEAT kMideaACHeat
    +
    136 #define MIDEA_AC_FAN kMideaACFan
    +
    137 #define MIDEA_AC_FAN_AUTO kMideaACFanAuto
    +
    138 #define MIDEA_AC_FAN_LOW kMideaACFanLow
    +
    139 #define MIDEA_AC_FAN_MED kMideaACFanMed
    +
    140 #define MIDEA_AC_FAN_HI kMideaACFanHigh
    +
    141 #define MIDEA_AC_POWER kMideaACPower
    +
    142 #define MIDEA_AC_SLEEP kMideaACSleep
    +
    143 #define MIDEA_AC_MIN_TEMP_F kMideaACMinTempF
    +
    144 #define MIDEA_AC_MAX_TEMP_F kMideaACMaxTempF
    +
    145 #define MIDEA_AC_MIN_TEMP_C kMideaACMinTempC
    +
    146 #define MIDEA_AC_MAX_TEMP_C kMideaACMaxTempC
    +
    147 
    +
    148 // Classes
    +
    151 class IRMideaAC {
    +
    152  public:
    +
    153  explicit IRMideaAC(const uint16_t pin, const bool inverted = false,
    +
    154  const bool use_modulation = true);
    +
    155  void stateReset(void);
    +
    156 #if SEND_MIDEA
    +
    157  void send(const uint16_t repeat = kMideaMinRepeat);
    +
    162  int8_t calibrate(void) { return _irsend.calibrate(); }
    +
    163 #endif // SEND_MIDEA
    +
    164  void begin(void);
    +
    165  void on(void);
    +
    166  void off(void);
    +
    167  void setPower(const bool on);
    +
    168  bool getPower(void) const;
    +
    169  bool getUseCelsius(void) const;
    +
    170  void setUseCelsius(const bool celsius);
    +
    171  void setTemp(const uint8_t temp, const bool useCelsius = false);
    +
    172  uint8_t getTemp(const bool useCelsius = false) const;
    +
    173  void setSensorTemp(const uint8_t temp, const bool useCelsius = false);
    +
    174  uint8_t getSensorTemp(const bool useCelsius = false) const;
    +
    175  void setEnableSensorTemp(const bool on);
    +
    176  bool getEnableSensorTemp(void) const;
    +
    177  void setFan(const uint8_t fan);
    +
    178  uint8_t getFan(void) const;
    +
    179  void setMode(const uint8_t mode);
    +
    180  uint8_t getMode(void) const;
    +
    181  void setRaw(const uint64_t newState);
    +
    182  uint64_t getRaw(void);
    +
    183  static bool validChecksum(const uint64_t state);
    +
    184  void setSleep(const bool on);
    +
    185  bool getSleep(void) const;
    +
    186  bool isSwingVToggle(void) const;
    +
    187  void setSwingVToggle(const bool on);
    +
    188  bool getSwingVToggle(void);
    +
    189  #if KAYSUN_AC
    +
    190  bool isSwingVStep(void) const;
    +
    191  void setSwingVStep(const bool on);
    +
    192  bool getSwingVStep(void);
    +
    193  #endif // KAYSUN_AC
    +
    194  bool isEconoToggle(void) const;
    +
    195  void setEconoToggle(const bool on);
    +
    196  bool getEconoToggle(void);
    +
    197  bool isTurboToggle(void) const;
    +
    198  void setTurboToggle(const bool on);
    +
    199  bool getTurboToggle(void);
    +
    200  bool isLightToggle(void) const;
    +
    201  void setLightToggle(const bool on);
    +
    202  bool getLightToggle(void);
    +
    203  uint8_t getType(void) const;
    +
    204  bool isOnTimerEnabled(void) const;
    +
    205  uint16_t getOnTimer(void) const;
    +
    206  void setOnTimer(const uint16_t mins);
    +
    207  bool isOffTimerEnabled(void) const;
    +
    208  uint16_t getOffTimer(void) const;
    +
    209  void setOffTimer(const uint16_t mins);
    +
    210  static uint8_t convertMode(const stdAc::opmode_t mode);
    +
    211  static uint8_t convertFan(const stdAc::fanspeed_t speed);
    +
    212  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    +
    213  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    +
    214  stdAc::state_t toCommon(const stdAc::state_t *prev = NULL);
    +
    215  String toString(void);
    +
    216 #ifndef UNIT_TEST
    +
    217 
    +
    218  private:
    + +
    220 #else // UNIT_TEST
    +
    221  IRsendTest _irsend;
    +
    223 #endif // UNIT_TEST
    + + +
    227  #if KAYSUN_AC
    + +
    229  #endif // KAYSUN_AC
    + + + +
    233  void checksum(void);
    +
    234  static uint8_t calcChecksum(const uint64_t state);
    +
    235  void setType(const uint8_t type);
    +
    236 };
    +
    237 
    +
    238 #endif // IR_MIDEA_H_
    void setOnTimer(const uint16_t mins)
    Set the value of the On Timer.
    Definition: ir_Midea.cpp:481
    uint8_t getType(void) const
    Get the message type setting of the A/C message.
    Definition: ir_Midea.cpp:443
    -
    uint8_t Sum
    Definition: ir_Midea.h:48
    -
    const uint8_t kMideaACMinTempF
    Fahrenheit.
    Definition: ir_Midea.h:80
    +
    uint8_t Sum
    Definition: ir_Midea.h:59
    +
    const uint8_t kMideaACMinTempF
    Fahrenheit.
    Definition: ir_Midea.h:93
    void begin(void)
    Set up hardware to be able to send a message.
    Definition: ir_Midea.cpp:113
    static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
    Convert a native fan speed into its stdAc equivalent.
    Definition: ir_Midea.cpp:556
    void setSleep(const bool on)
    Set the Sleep setting of the A/C.
    Definition: ir_Midea.cpp:313
    void on(void)
    Set the requested power state of the A/C to on.
    Definition: ir_Midea.cpp:153
    void setUseCelsius(const bool celsius)
    Set the A/C unit to use Celsius natively.
    Definition: ir_Midea.cpp:178
    const uint16_t kMideaMinRepeat
    Definition: IRremoteESP8266.h:994
    -
    bool _EconoToggle
    Definition: ir_Midea.h:217
    -
    MideaProtocol _
    Definition: ir_Midea.h:212
    +
    bool _EconoToggle
    Definition: ir_Midea.h:230
    +
    MideaProtocol _
    Definition: ir_Midea.h:225
    void setTemp(const uint8_t temp, const bool useCelsius=false)
    Set the temperature.
    Definition: ir_Midea.cpp:189
    bool getPower(void) const
    Get the value of the current power setting.
    Definition: ir_Midea.cpp:166
    -
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Midea.h:149
    +
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Midea.h:162
    bool isOffTimerEnabled(void) const
    Is the OffTimer enabled?
    Definition: ir_Midea.cpp:492
    -
    bool _TurboToggle
    Definition: ir_Midea.h:218
    -
    uint8_t Type
    Normal, Special, or FollowMe message type.
    Definition: ir_Midea.h:74
    -
    const uint8_t kMideaACMaxSensorTempF
    Fahrenheit (Guess only!)
    Definition: ir_Midea.h:87
    -
    const uint8_t kMideaACTypeFollow
    Message type.
    Definition: ir_Midea.h:116
    +
    bool _TurboToggle
    Definition: ir_Midea.h:231
    +
    uint8_t Type
    Normal, Special, or FollowMe message type.
    Definition: ir_Midea.h:87
    +
    const uint8_t kMideaACMaxSensorTempF
    Fahrenheit (Guess only!)
    Definition: ir_Midea.h:100
    +
    const uint8_t kMideaACTypeFollow
    Message type.
    Definition: ir_Midea.h:129
    void setEconoToggle(const bool on)
    Set the A/C to toggle the Econo (energy saver) mode for the next send.
    Definition: ir_Midea.cpp:364
    fanspeed_t
    Common A/C settings for Fan Speeds.
    Definition: IRsend.h:58
    -
    uint8_t Header
    Typically 0b10100.
    Definition: ir_Midea.h:75
    -
    bool _SwingVToggle
    Definition: ir_Midea.h:213
    -
    const uint8_t kMideaACAuto
    Definition: ir_Midea.h:92
    +
    uint8_t Header
    Typically 0b10100.
    Definition: ir_Midea.h:88
    +
    bool _SwingVToggle
    Definition: ir_Midea.h:226
    +
    const uint8_t kMideaACAuto
    Definition: ir_Midea.h:105
    void checksum(void)
    Calculate & set the checksum for the current internal state of the remote.
    Definition: ir_Midea.cpp:436
    IRMideaAC(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
    Class constructor.
    Definition: ir_Midea.cpp:95
    -
    const uint8_t kMideaACFan
    Definition: ir_Midea.h:94
    +
    const uint8_t kMideaACFan
    Definition: ir_Midea.h:107
    bool isOnTimerEnabled(void) const
    Is the OnTimer enabled?
    Definition: ir_Midea.cpp:463
    void send(const uint16_t repeat=kMideaMinRepeat)
    Send the current internal state as an IR message.
    Definition: ir_Midea.cpp:118
    -
    uint8_t useFahrenheit
    Definition: ir_Midea.h:65
    -
    const uint8_t kMideaACTypeSpecial
    Message type.
    Definition: ir_Midea.h:115
    +
    uint8_t useFahrenheit
    Definition: ir_Midea.h:76
    +
    const uint8_t kMideaACTypeSpecial
    Message type.
    Definition: ir_Midea.h:128
    void setType(const uint8_t type)
    Set the message type setting of the A/C message.
    Definition: ir_Midea.cpp:447
    void setTurboToggle(const bool on)
    Set the A/C to toggle the Turbo mode for the next send.
    Definition: ir_Midea.cpp:381
    -
    const uint8_t kMideaACMaxTempF
    Fahrenheit.
    Definition: ir_Midea.h:81
    +
    const uint8_t kMideaACMaxTempF
    Fahrenheit.
    Definition: ir_Midea.h:94
    bool getLightToggle(void)
    Definition: ir_Midea.cpp:408
    uint16_t getOffTimer(void) const
    Get the value of the OffTimer is currently set to.
    Definition: ir_Midea.cpp:498
    Class for sending all basic IR protocols.
    Definition: IRsend.h:182
    -
    uint8_t Power
    Definition: ir_Midea.h:72
    -
    const uint8_t kMideaACTimerOff
    Definition: ir_Midea.h:89
    +
    uint8_t Power
    Definition: ir_Midea.h:85
    +
    const uint8_t kMideaACTimerOff
    Definition: ir_Midea.h:102
    int8_t calibrate(uint16_t hz=38000U)
    Calculate & set any offsets to account for execution times during sending.
    Definition: IRsend.cpp:207
    -
    uint8_t SensorTemp
    Degrees or OnTimer.
    Definition: ir_Midea.h:57
    +
    uint8_t SensorTemp
    Degrees or OnTimer.
    Definition: ir_Midea.h:68
    void setSwingVToggle(const bool on)
    Set the A/C to toggle the vertical swing toggle for the next send.
    Definition: ir_Midea.cpp:326
    bool isSwingVToggle(void) const
    Is the current state a vertical swing toggle message?
    Definition: ir_Midea.cpp:331
    bool isLightToggle(void) const
    Is the current state a Light (LED) toggle message?
    Definition: ir_Midea.cpp:402
    bool getEnableSensorTemp(void) const
    Is the remote temperature sensor enabled?
    Definition: ir_Midea.cpp:275
    -
    const uint8_t kMideaACMaxSensorTempC
    Celsius.
    Definition: ir_Midea.h:85
    +
    const uint8_t kMideaACMaxSensorTempC
    Celsius.
    Definition: ir_Midea.h:98
    std::string String
    Definition: IRremoteESP8266.h:1178
    -
    kSwingVToggleStr
    Definition: ir_Midea.h:109
    +
    kSwingVToggleStr
    Definition: ir_Midea.h:122
    bool getSwingVToggle(void)
    Definition: ir_Midea.cpp:338
    -
    uint8_t Fan
    Definition: ir_Midea.h:69
    -
    uint8_t Mode
    Definition: ir_Midea.h:68
    +
    uint8_t Fan
    Definition: ir_Midea.h:80
    +
    uint8_t Mode
    Definition: ir_Midea.h:79
    uint8_t getFan(void) const
    Get the current fan speed setting.
    Definition: ir_Midea.cpp:285
    -
    const uint64_t kMideaACToggleTurbo
    Definition: ir_Midea.h:113
    +
    const uint64_t kMideaACToggleTurbo
    Definition: ir_Midea.h:126
    void off(void)
    Set the requested power state of the A/C to off.
    Definition: ir_Midea.cpp:156
    bool getTurboToggle(void)
    Definition: ir_Midea.cpp:391
    void setOffTimer(const uint16_t mins)
    Set the value of the Off Timer.
    Definition: ir_Midea.cpp:505
    -
    const uint8_t kMideaACHeat
    Definition: ir_Midea.h:93
    -
    uint8_t OffTimer
    Nr of Half hours. Off is 0b111111.
    Definition: ir_Midea.h:61
    -
    const uint64_t kMideaACSwingVStep
    Definition: ir_Midea.h:102
    +
    const uint8_t kMideaACHeat
    Definition: ir_Midea.h:106
    +
    uint8_t OffTimer
    Nr of Half hours. Off is 0b111111.
    Definition: ir_Midea.h:72
    +
    const uint64_t kMideaACSwingVStep
    Definition: ir_Midea.h:115
    bool isSwingVStep(void) const
    Is the current state a step vertical swing message?
    Definition: ir_Midea.cpp:350
    void setLightToggle(const bool on)
    Set the A/C to toggle the Light (LED) mode for the next send.
    Definition: ir_Midea.cpp:398
    bool getUseCelsius(void) const
    Is the device currently using Celsius or the Fahrenheit temp scale?
    Definition: ir_Midea.cpp:172
    uint16_t getOnTimer(void) const
    Get the value of the OnTimer is currently set to.
    Definition: ir_Midea.cpp:470
    static stdAc::opmode_t toCommonMode(const uint8_t mode)
    Convert a native mode into its stdAc equivalent.
    Definition: ir_Midea.cpp:543
    -
    const uint8_t kMideaACFanAuto
    Definition: ir_Midea.h:95
    -
    const uint64_t kMideaACToggleSwingV
    Definition: ir_Midea.h:101
    -
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Midea.h:206
    -
    uint64_t remote_state
    The state in native IR code form.
    Definition: ir_Midea.h:44
    -
    Class for handling detailed Midea A/C messages.
    Definition: ir_Midea.h:138
    -
    const uint8_t kMideaACMinSensorTempC
    Celsius.
    Definition: ir_Midea.h:84
    +
    const uint8_t kMideaACFanAuto
    Definition: ir_Midea.h:108
    +
    const uint64_t kMideaACToggleSwingV
    Definition: ir_Midea.h:114
    +
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Midea.h:219
    +
    uint64_t remote_state
    The state in native IR code form.
    Definition: ir_Midea.h:55
    +
    Class for handling detailed Midea A/C messages.
    Definition: ir_Midea.h:151
    +
    const uint8_t kMideaACMinSensorTempC
    Celsius.
    Definition: ir_Midea.h:97
    void setRaw(const uint64_t newState)
    Set the internal state from a valid code for this protocol.
    Definition: ir_Midea.cpp:150
    uint8_t getSensorTemp(const bool useCelsius=false) const
    Get the current Sensor temperature setting.
    Definition: ir_Midea.cpp:248
    void setMode(const uint8_t mode)
    Set the operating mode of the A/C.
    Definition: ir_Midea.cpp:297
    static uint8_t calcChecksum(const uint64_t state)
    Calculate the checksum for a given state.
    Definition: ir_Midea.cpp:416
    const PROGMEM char * kIonStr
    "Ion"
    Definition: IRtext.cpp:55
    bool getSleep(void) const
    Get the Sleep setting of the A/C.
    Definition: ir_Midea.cpp:319
    -
    const uint8_t kMideaACSensorTempOnTimerOff
    Definition: ir_Midea.h:88
    +
    const uint8_t kMideaACSensorTempOnTimerOff
    Definition: ir_Midea.h:101
    uint8_t getMode(void) const
    Get the operating mode setting of the A/C.
    Definition: ir_Midea.cpp:291
    -
    const uint64_t kMideaACToggleEcono
    Definition: ir_Midea.h:111
    +
    const uint64_t kMideaACToggleEcono
    Definition: ir_Midea.h:124
    static uint8_t convertFan(const stdAc::fanspeed_t speed)
    Convert a stdAc::fanspeed_t enum into it's native speed.
    Definition: ir_Midea.cpp:529
    -
    uint8_t Sleep
    Definition: ir_Midea.h:71
    -
    const uint8_t kMideaACFanMed
    Definition: ir_Midea.h:97
    -
    uint8_t disableSensor
    Definition: ir_Midea.h:58
    +
    uint8_t Sleep
    Definition: ir_Midea.h:84
    +
    const uint8_t kMideaACFanMed
    Definition: ir_Midea.h:110
    +
    uint8_t disableSensor
    Definition: ir_Midea.h:69
    uint64_t getRaw(void)
    Get a copy of the internal state/code for this protocol.
    Definition: ir_Midea.cpp:143
    -
    const uint8_t kMideaACMinTempC
    Celsius.
    Definition: ir_Midea.h:82
    +
    const uint8_t kMideaACMinTempC
    Celsius.
    Definition: ir_Midea.h:95
    void setSwingVStep(const bool on)
    Set the A/C to step the vertical swing for the next send.
    Definition: ir_Midea.cpp:346
    bool getSwingVStep(void)
    Definition: ir_Midea.cpp:356
    static uint8_t convertMode(const stdAc::opmode_t mode)
    Convert a stdAc::opmode_t enum into its native mode.
    Definition: ir_Midea.cpp:516
    -
    const uint64_t kMideaACToggleLight
    Definition: ir_Midea.h:112
    -
    const uint8_t kMideaACFanHigh
    Definition: ir_Midea.h:98
    +
    const uint64_t kMideaACToggleLight
    Definition: ir_Midea.h:125
    +
    const uint8_t kMideaACFanHigh
    Definition: ir_Midea.h:111
    bool getEconoToggle(void)
    Definition: ir_Midea.cpp:374
    -
    const uint8_t kMideaACMaxTempC
    Celsius.
    Definition: ir_Midea.h:83
    +
    const uint8_t kMideaACMaxTempC
    Celsius.
    Definition: ir_Midea.h:96
    void setEnableSensorTemp(const bool on)
    Enable the remote's Sensor temperature.
    Definition: ir_Midea.cpp:262
    stdAc::state_t toCommon(const stdAc::state_t *prev=NULL)
    Convert the current internal state into its stdAc::state_t equivalent.
    Definition: ir_Midea.cpp:568
    void setSensorTemp(const uint8_t temp, const bool useCelsius=false)
    Set the Sensor temperature.
    Definition: ir_Midea.cpp:225
    -
    const uint8_t kMideaACDry
    Definition: ir_Midea.h:91
    +
    const uint8_t kMideaACDry
    Definition: ir_Midea.h:104
    bool isTurboToggle(void) const
    Is the current state a Turbo toggle message?
    Definition: ir_Midea.cpp:385
    String toString(void)
    Convert the current internal state into a human readable string.
    Definition: ir_Midea.cpp:605
    static bool validChecksum(const uint64_t state)
    Verify the checksum is valid for a given state.
    Definition: ir_Midea.cpp:431
    -
    const uint8_t kMideaACMinSensorTempF
    Fahrenheit.
    Definition: ir_Midea.h:86
    -
    bool _LightToggle
    Definition: ir_Midea.h:219
    -
    const uint8_t kMideaACCool
    Definition: ir_Midea.h:90
    -
    Native representation of a Midea A/C message.
    Definition: ir_Midea.h:43
    +
    const uint8_t kMideaACMinSensorTempF
    Fahrenheit.
    Definition: ir_Midea.h:99
    +
    bool _LightToggle
    Definition: ir_Midea.h:232
    +
    const uint8_t kMideaACCool
    Definition: ir_Midea.h:103
    +
    Native representation of a Midea A/C message.
    Definition: ir_Midea.h:54
    void setPower(const bool on)
    Change the power setting.
    Definition: ir_Midea.cpp:160
    -
    uint8_t BeepDisable
    0 = no beep in follow me messages, 1 = beep.
    Definition: ir_Midea.h:62
    +
    uint8_t BeepDisable
    0 = no beep in follow me messages, 1 = beep.
    Definition: ir_Midea.h:73
    void stateReset(void)
    Reset the state of the remote to a known good state/sequence.
    Definition: ir_Midea.cpp:100
    Structure to hold a common A/C state.
    Definition: IRsend.h:97
    -
    const uint8_t kMideaACFanLow
    Definition: ir_Midea.h:96
    -
    bool _SwingVStep
    Definition: ir_Midea.h:215
    +
    const uint8_t kMideaACFanLow
    Definition: ir_Midea.h:109
    +
    bool _SwingVStep
    Definition: ir_Midea.h:228
    uint8_t getTemp(const bool useCelsius=false) const
    Get the current temperature setting.
    Definition: ir_Midea.cpp:210
    -
    uint8_t Temp
    Definition: ir_Midea.h:64
    +
    uint8_t Temp
    Definition: ir_Midea.h:75
    void setFan(const uint8_t fan)
    Set the speed of the fan.
    Definition: ir_Midea.cpp:279
    -
    const uint8_t kMideaACTypeCommand
    Message type.
    Definition: ir_Midea.h:114
    +
    const uint8_t kMideaACTypeCommand
    Message type.
    Definition: ir_Midea.h:127
    bool isEconoToggle(void) const
    Is the current state an Econo (energy saver) toggle message?
    Definition: ir_Midea.cpp:368
    opmode_t
    Common A/C settings for A/C operating modes.
    Definition: IRsend.h:46
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mirage_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mirage_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mirage_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mirage_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__MitsubishiHeavy_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Mitsubishi_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Mitsubishi_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Multibrackets_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Multibrackets_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Multibrackets_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Multibrackets_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8h.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8h.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8h_source.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__NEC_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__NEC_8h_source.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8cpp.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8cpp.html similarity index 100% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8cpp.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8cpp.html diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h.html similarity index 62% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h.html index 0a463de87..85a11028c 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h.html @@ -80,40 +80,15 @@ $(function() { + + +

    Classes

    union  NeoclimaProtocol
     Native representation of a Neoclima A/C message. More...
     
    class  IRNeoclimaAc
     Class for handling detailed Neoclima A/C messages. More...
     
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -150,24 +125,10 @@ Variables - - - - - - - - - - - - - - @@ -176,14 +137,8 @@ Variables - - - - - - @@ -192,8 +147,6 @@ Variables - - @@ -211,20 +164,6 @@ Variables
    https://drive.google.com/file/d/1kjYk4zS9NQcMQhFkak-L4mp4UuaAIesW/view

    Variable Documentation

    - -

    ◆ kNeoclima8CHeatOffset

    - -
    -
    -

    Variables

    const uint8_t kNeoclima8CHeatOffset = 1
     
    const uint8_t kNeoclimaIonOffset = 2
     
    const uint8_t kNeoclimaLightOffset = 0
     Mask 0b0000000x. More...
     
    const uint8_t kNeoclimaHoldOffset = 2
     Mask 0b00000x00. More...
     
    const uint8_t kNeoclimaTurboOffset = 3
     Mask 0b0000x000. More...
     
    const uint8_t kNeoclimaEconoOffset = 4
     Mask 0b000x0000. More...
     
    const uint8_t kNeoclimaEyeOffset = 6
     Mask 0b0x000000. More...
     
    const uint8_t kNeoclimaFreshOffset = 7
     Mask 0bx0000000. More...
     
    const uint8_t kNeoclimaButtonOffset = 0
     Mask 0b000xxxxx. More...
     
    const uint8_t kNeoclimaButtonSize = 5
     Mask 0b000xxxxx. More...
     
    const uint8_t kNeoclimaButtonPower = 0x00
     
    const uint8_t kNeoclimaButtonMode = 0x01
     
    const uint8_t kNeoclimaButtonTempUnit = 0x1E
     
    const uint8_t kNeoclimaSleepOffset = 0
     
    const uint8_t kNeoclimaPowerOffset = 1
     
    const uint8_t kNeoclimaSwingVOffset = 2
     
    const uint8_t kNeoclimaSwingVSize = 2
     
    const uint8_t kNeoclimaSwingVOn = 0b01
     
    const uint8_t kNeoclimaSwingVOff = 0b10
     
    const uint8_t kNeoclimaSwingHOffset = 4
     
    const uint8_t kNeoclimaFanOffest = 5
     
    const uint8_t kNeoclimaFanSize = 2
     
    const uint8_t kNeoclimaFanAuto = 0b00
     
    const uint8_t kNeoclimaFanHigh = 0b01
     
    const uint8_t kNeoclimaFanLow = 0b11
     
    const uint8_t kNeoclimaUseFahrenheitOffset = 7
     
    const uint8_t kNeoclimaFollowMe = 0x5D
     
    const uint8_t kNeoclimaTempOffset = 0
     
    const uint8_t kNeoclimaTempSize = 5
     
    const uint8_t kNeoclimaMinTempC = 16
     
    const uint8_t kNeoclimaMaxTempC = 32
     
    const uint8_t kNeoclimaMaxTempF = 90
     
    const uint8_t kNeoclimaModeOffset = 5
     
    const uint8_t kNeoclimaAuto = 0b000
     
    const uint8_t kNeoclimaCool = 0b001
    - - - -
    const uint8_t kNeoclima8CHeatOffset = 1
    -
    - -
    -

    ◆ kNeoclimaAuto

    @@ -391,22 +330,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaButtonOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaButtonOffset = 0
    -
    - -

    Mask 0b000xxxxx.

    -
    @@ -421,22 +344,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaButtonSize

    - -
    -
    - - - - -
    const uint8_t kNeoclimaButtonSize = 5
    -
    - -

    Mask 0b000xxxxx.

    -
    @@ -549,38 +456,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaEconoOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaEconoOffset = 4
    -
    - -

    Mask 0b000x0000.

    - -
    -
    - -

    ◆ kNeoclimaEyeOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaEyeOffset = 6
    -
    - -

    Mask 0b0x000000.

    -
    @@ -651,34 +526,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaFanOffest

    - -
    -
    - - - - -
    const uint8_t kNeoclimaFanOffest = 5
    -
    - -
    -
    - -

    ◆ kNeoclimaFanSize

    - -
    -
    - - - - -
    const uint8_t kNeoclimaFanSize = 2
    -
    -
    @@ -693,22 +540,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaFreshOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaFreshOffset = 7
    -
    - -

    Mask 0bx0000000.

    -
    @@ -723,52 +554,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaHoldOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaHoldOffset = 2
    -
    - -

    Mask 0b00000x00.

    - -
    -
    - -

    ◆ kNeoclimaIonOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaIonOffset = 2
    -
    - -
    -
    - -

    ◆ kNeoclimaLightOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaLightOffset = 0
    -
    - -

    Mask 0b0000000x.

    -
    @@ -825,62 +610,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaModeOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaModeOffset = 5
    -
    - -
    -
    - -

    ◆ kNeoclimaPowerOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaPowerOffset = 1
    -
    - -
    -
    - -

    ◆ kNeoclimaSleepOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaSleepOffset = 0
    -
    - -
    -
    - -

    ◆ kNeoclimaSwingHOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaSwingHOffset = 4
    -
    -
    @@ -895,20 +624,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaSwingVOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaSwingVOffset = 2
    -
    -
    @@ -923,78 +638,6 @@ Variables
    -
    - - -

    ◆ kNeoclimaSwingVSize

    - -
    -
    - - - - -
    const uint8_t kNeoclimaSwingVSize = 2
    -
    - -
    -
    - -

    ◆ kNeoclimaTempOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaTempOffset = 0
    -
    - -
    -
    - -

    ◆ kNeoclimaTempSize

    - -
    -
    - - - - -
    const uint8_t kNeoclimaTempSize = 5
    -
    - -
    -
    - -

    ◆ kNeoclimaTurboOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaTurboOffset = 3
    -
    - -

    Mask 0b0000x000.

    - -
    -
    - -

    ◆ kNeoclimaUseFahrenheitOffset

    - -
    -
    - - - - -
    const uint8_t kNeoclimaUseFahrenheitOffset = 7
    -
    -
    diff --git a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h_source.html b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h_source.html similarity index 56% rename from lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h_source.html rename to lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h_source.html index acc3688c5..a0e99c037 100644 --- a/lib/lib_basic/IRremoteESP8266-2.7.13/docs/doxygen/html/ir__Neoclima_8h_source.html +++ b/lib/lib_basic/IRremoteESP8266-2.7.14/docs/doxygen/html/ir__Neoclima_8h_source.html @@ -92,263 +92,288 @@ $(function() {
    26 #include "IRsend_test.h"
    27 #endif
    28 
    -
    29 // Constants
    -
    30 // state[1]
    -
    31 const uint8_t kNeoclima8CHeatOffset = 1;
    -
    32 const uint8_t kNeoclimaIonOffset = 2;
    -
    33 // state[3]
    -
    34 const uint8_t kNeoclimaLightOffset = 0;
    -
    35 const uint8_t kNeoclimaHoldOffset = 2;
    -
    36 const uint8_t kNeoclimaTurboOffset = 3;
    -
    37 const uint8_t kNeoclimaEconoOffset = 4;
    -
    38 const uint8_t kNeoclimaEyeOffset = 6;
    -
    39 // state[5]
    -
    40 const uint8_t kNeoclimaFreshOffset = 7;
    -
    41 const uint8_t kNeoclimaButtonOffset = 0;
    -
    42 const uint8_t kNeoclimaButtonSize = 5;
    -
    43 const uint8_t kNeoclimaButtonPower = 0x00;
    -
    44 const uint8_t kNeoclimaButtonMode = 0x01;
    -
    45 const uint8_t kNeoclimaButtonTempUp = 0x02;
    -
    46 const uint8_t kNeoclimaButtonTempDown = 0x03;
    -
    47 const uint8_t kNeoclimaButtonSwing = 0x04;
    -
    48 const uint8_t kNeoclimaButtonFanSpeed = 0x05;
    -
    49 const uint8_t kNeoclimaButtonAirFlow = 0x07;
    -
    50 const uint8_t kNeoclimaButtonHold = 0x08;
    -
    51 const uint8_t kNeoclimaButtonSleep = 0x09;
    -
    52 const uint8_t kNeoclimaButtonTurbo = 0x0A;
    -
    53 const uint8_t kNeoclimaButtonLight = 0x0B;
    -
    54 const uint8_t kNeoclimaButtonEcono = 0x0D;
    -
    55 const uint8_t kNeoclimaButtonEye = 0x0E;
    -
    56 const uint8_t kNeoclimaButtonFollow = 0x13;
    -
    57 const uint8_t kNeoclimaButtonIon = 0x14;
    -
    58 const uint8_t kNeoclimaButtonFresh = 0x15;
    -
    59 const uint8_t kNeoclimaButton8CHeat = 0x1D;
    -
    60 const uint8_t kNeoclimaButtonTempUnit = 0x1E;
    -
    61 // state[7]
    -
    62 const uint8_t kNeoclimaSleepOffset = 0; // Mask 0b0000000x
    -
    63 const uint8_t kNeoclimaPowerOffset = 1; // Mask 0b000000x0
    -
    64 const uint8_t kNeoclimaSwingVOffset = 2; // Mask 0b0000xx00
    -
    65 const uint8_t kNeoclimaSwingVSize = 2; // Bits
    -
    66 const uint8_t kNeoclimaSwingVOn = 0b01;
    -
    67 const uint8_t kNeoclimaSwingVOff = 0b10;
    -
    68 const uint8_t kNeoclimaSwingHOffset = 4; // Mask 0b000x0000
    -
    69 const uint8_t kNeoclimaFanOffest = 5; // Mask 0b0xx00000
    -
    70 const uint8_t kNeoclimaFanSize = 2; // Bits
    -
    71 const uint8_t kNeoclimaFanAuto = 0b00;
    -
    72 const uint8_t kNeoclimaFanHigh = 0b01;
    -
    73 const uint8_t kNeoclimaFanMed = 0b10;
    -
    74 const uint8_t kNeoclimaFanLow = 0b11;
    -
    75 const uint8_t kNeoclimaUseFahrenheitOffset = 7; // Mask 0bx0000000
    -
    76 // state[8]
    -
    77 const uint8_t kNeoclimaFollowMe = 0x5D; // Also 0x5F
    -
    78 // state[9]
    -
    79 const uint8_t kNeoclimaTempOffset = 0; // Mask 0b000xxxxx
    -
    80 const uint8_t kNeoclimaTempSize = 5; // Bits
    -
    81 const uint8_t kNeoclimaMinTempC = 16; // 16C
    -
    82 const uint8_t kNeoclimaMaxTempC = 32; // 32C
    -
    83 const uint8_t kNeoclimaMinTempF = 61; // 61F
    -
    84 const uint8_t kNeoclimaMaxTempF = 90; // 90F
    -
    85 const uint8_t kNeoclimaModeOffset = 5; // Mask 0bxxx00000
    -
    86 const uint8_t kNeoclimaAuto = 0b000;
    -
    87 const uint8_t kNeoclimaCool = 0b001;
    -
    88 const uint8_t kNeoclimaDry = 0b010;
    -
    89 const uint8_t kNeoclimaFan = 0b011;
    -
    90 const uint8_t kNeoclimaHeat = 0b100;
    -
    91 
    -
    92 // Classes
    -
    94 class IRNeoclimaAc {
    -
    95  public:
    -
    96  explicit IRNeoclimaAc(const uint16_t pin, const bool inverted = false,
    -
    97  const bool use_modulation = true);
    -
    98  void stateReset(void);
    -
    99 #if SEND_NEOCLIMA
    -
    100  void send(const uint16_t repeat = kNeoclimaMinRepeat);
    -
    105  int8_t calibrate(void) { return _irsend.calibrate(); }
    -
    106 #endif // SEND_NEOCLIMA
    -
    107  void begin(void);
    -
    108  void setButton(const uint8_t button);
    -
    109  uint8_t getButton(void);
    -
    110  void on(void);
    -
    111  void off(void);
    -
    112  void setPower(const bool on);
    -
    113  bool getPower(void);
    -
    114  void setMode(const uint8_t mode);
    -
    115  uint8_t getMode(void);
    -
    116  void setTemp(const uint8_t temp, const bool celsius = true);
    -
    117  uint8_t getTemp(void);
    -
    118  void setFan(const uint8_t speed);
    -
    119  uint8_t getFan(void);
    -
    120  void setSwingV(const bool on);
    -
    121  bool getSwingV(void);
    -
    122  void setSwingH(const bool on);
    -
    123  bool getSwingH(void);
    -
    124  void setSleep(const bool on);
    -
    125  bool getSleep(void);
    -
    126  void setTurbo(const bool on);
    -
    127  bool getTurbo(void);
    -
    128  void setEcono(const bool on);
    -
    129  bool getEcono(void);
    -
    130  void setFresh(const bool on);
    -
    131  bool getFresh(void);
    -
    132  void setHold(const bool on);
    -
    133  bool getHold(void);
    -
    134  void setIon(const bool on);
    -
    135  bool getIon(void);
    -
    136  void setLight(const bool on);
    -
    137  bool getLight(void);
    -
    138  void set8CHeat(const bool on);
    -
    139  bool get8CHeat(void);
    -
    140  void setEye(const bool on);
    -
    141  bool getEye(void);
    -
    142  bool getTempUnits(void);
    -
    143  // DISABLED: See TODO in ir_Neoclima.cpp
    -
    144  // void setFollow(const bool on);
    -
    145  bool getFollow(void);
    -
    146  uint8_t* getRaw(void);
    -
    147  void setRaw(const uint8_t new_code[],
    -
    148  const uint16_t length = kNeoclimaStateLength);
    -
    149  static bool validChecksum(const uint8_t state[],
    -
    150  const uint16_t length = kNeoclimaStateLength);
    -
    151  static uint8_t calcChecksum(const uint8_t state[],
    -
    152  const uint16_t length = kNeoclimaStateLength);
    -
    153  String toString(void);
    -
    154  uint8_t convertMode(const stdAc::opmode_t mode);
    -
    155  uint8_t convertFan(const stdAc::fanspeed_t speed);
    -
    156  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    -
    157  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    -
    158  stdAc::state_t toCommon(void);
    -
    159 #ifndef UNIT_TEST
    -
    160 
    -
    161  private:
    - -
    163 #else // UNIT_TEST
    -
    164  IRsendTest _irsend;
    -
    166 #endif // UNIT_TEST
    - -
    169  void checksum(const uint16_t length = kNeoclimaStateLength);
    -
    170 };
    -
    171 
    -
    172 #endif // IR_NEOCLIMA_H_
    + + +
    32  struct {
    +
    33  // Byte 0
    +
    34  uint8_t :8;
    +
    35  // Byte 1
    +
    36  uint8_t :1;
    +
    37  uint8_t CHeat :1;
    +
    38  uint8_t Ion :1;
    +
    39  uint8_t :5;
    +
    40  // Byte 2
    +
    41  uint8_t :8;
    +
    42  // Byte 3
    +
    43  uint8_t Light :1;
    +
    44  uint8_t :1;
    +
    45  uint8_t Hold :1;
    +
    46  uint8_t Turbo :1;
    +
    47  uint8_t Econo :1;
    +
    48  uint8_t :1;
    +
    49  uint8_t Eye :1;
    +
    50  uint8_t :1;
    +
    51  // Byte 4
    +
    52  uint8_t :8;
    +
    53  // Byte 5
    +
    54  uint8_t Button :5;
    +
    55  uint8_t :2;
    +
    56  uint8_t Fresh :1;
    +
    57  // Byte 6
    +
    58  uint8_t :8;
    +
    59  // Byte 7
    +
    60  uint8_t Sleep :1;
    +
    61  uint8_t Power :1;
    +
    62  uint8_t SwingV :2;
    +
    63  uint8_t SwingH :1;
    +
    64  uint8_t Fan :2;
    +
    65  uint8_t UseFah :1;
    +
    66  // Byte 8
    +
    67  uint8_t Follow :8;
    +
    68  // Byte 9
    +
    69  uint8_t Temp :5;
    +
    70  uint8_t Mode :3;
    +
    71  // Byte 10
    +
    72  uint8_t :8;
    +
    73  // Byte 11
    +
    74  uint8_t Sum :8;
    +
    75  };
    +
    76 };
    +
    77 
    +
    78 // Constants
    +
    79 
    +
    80 const uint8_t kNeoclimaButtonPower = 0x00;
    +
    81 const uint8_t kNeoclimaButtonMode = 0x01;
    +
    82 const uint8_t kNeoclimaButtonTempUp = 0x02;
    +
    83 const uint8_t kNeoclimaButtonTempDown = 0x03;
    +
    84 const uint8_t kNeoclimaButtonSwing = 0x04;
    +
    85 const uint8_t kNeoclimaButtonFanSpeed = 0x05;
    +
    86 const uint8_t kNeoclimaButtonAirFlow = 0x07;
    +
    87 const uint8_t kNeoclimaButtonHold = 0x08;
    +
    88 const uint8_t kNeoclimaButtonSleep = 0x09;
    +
    89 const uint8_t kNeoclimaButtonTurbo = 0x0A;
    +
    90 const uint8_t kNeoclimaButtonLight = 0x0B;
    +
    91 const uint8_t kNeoclimaButtonEcono = 0x0D;
    +
    92 const uint8_t kNeoclimaButtonEye = 0x0E;
    +
    93 const uint8_t kNeoclimaButtonFollow = 0x13;
    +
    94 const uint8_t kNeoclimaButtonIon = 0x14;
    +
    95 const uint8_t kNeoclimaButtonFresh = 0x15;
    +
    96 const uint8_t kNeoclimaButton8CHeat = 0x1D;
    +
    97 const uint8_t kNeoclimaButtonTempUnit = 0x1E;
    +
    98 
    +
    99 const uint8_t kNeoclimaSwingVOn = 0b01;
    +
    100 const uint8_t kNeoclimaSwingVOff = 0b10;
    +
    101 const uint8_t kNeoclimaFanAuto = 0b00;
    +
    102 const uint8_t kNeoclimaFanHigh = 0b01;
    +
    103 const uint8_t kNeoclimaFanMed = 0b10;
    +
    104 const uint8_t kNeoclimaFanLow = 0b11;
    +
    105 
    +
    106 const uint8_t kNeoclimaFollowMe = 0x5D; // Also 0x5F
    +
    107 
    +
    108 const uint8_t kNeoclimaMinTempC = 16; // 16C
    +
    109 const uint8_t kNeoclimaMaxTempC = 32; // 32C
    +
    110 const uint8_t kNeoclimaMinTempF = 61; // 61F
    +
    111 const uint8_t kNeoclimaMaxTempF = 90; // 90F
    +
    112 const uint8_t kNeoclimaAuto = 0b000;
    +
    113 const uint8_t kNeoclimaCool = 0b001;
    +
    114 const uint8_t kNeoclimaDry = 0b010;
    +
    115 const uint8_t kNeoclimaFan = 0b011;
    +
    116 const uint8_t kNeoclimaHeat = 0b100;
    +
    117 
    +
    118 // Classes
    + +
    121  public:
    +
    122  explicit IRNeoclimaAc(const uint16_t pin, const bool inverted = false,
    +
    123  const bool use_modulation = true);
    +
    124  void stateReset(void);
    +
    125 #if SEND_NEOCLIMA
    +
    126  void send(const uint16_t repeat = kNeoclimaMinRepeat);
    +
    131  int8_t calibrate(void) { return _irsend.calibrate(); }
    +
    132 #endif // SEND_NEOCLIMA
    +
    133  void begin(void);
    +
    134  void setButton(const uint8_t button);
    +
    135  uint8_t getButton(void) const;
    +
    136  void on(void);
    +
    137  void off(void);
    +
    138  void setPower(const bool on);
    +
    139  bool getPower(void) const;
    +
    140  void setMode(const uint8_t mode);
    +
    141  uint8_t getMode(void) const;
    +
    142  void setTemp(const uint8_t temp, const bool celsius = true);
    +
    143  uint8_t getTemp(void) const;
    +
    144  void setFan(const uint8_t speed);
    +
    145  uint8_t getFan(void) const;
    +
    146  void setSwingV(const bool on);
    +
    147  bool getSwingV(void) const;
    +
    148  void setSwingH(const bool on);
    +
    149  bool getSwingH(void) const;
    +
    150  void setSleep(const bool on);
    +
    151  bool getSleep(void) const;
    +
    152  void setTurbo(const bool on);
    +
    153  bool getTurbo(void) const;
    +
    154  void setEcono(const bool on);
    +
    155  bool getEcono(void) const;
    +
    156  void setFresh(const bool on);
    +
    157  bool getFresh(void) const;
    +
    158  void setHold(const bool on);
    +
    159  bool getHold(void) const;
    +
    160  void setIon(const bool on);
    +
    161  bool getIon(void) const;
    +
    162  void setLight(const bool on);
    +
    163  bool getLight(void) const;
    +
    164  void set8CHeat(const bool on);
    +
    165  bool get8CHeat(void) const;
    +
    166  void setEye(const bool on);
    +
    167  bool getEye(void) const;
    +
    168  bool getTempUnits(void) const;
    +
    169  // DISABLED: See TODO in ir_Neoclima.cpp
    +
    170  // void setFollow(const bool on);
    +
    171  bool getFollow(void) const;
    +
    172  uint8_t* getRaw(void);
    +
    173  void setRaw(const uint8_t new_code[],
    +
    174  const uint16_t length = kNeoclimaStateLength);
    +
    175  static bool validChecksum(const uint8_t state[],
    +
    176  const uint16_t length = kNeoclimaStateLength);
    +
    177  static uint8_t calcChecksum(const uint8_t state[],
    +
    178  const uint16_t length = kNeoclimaStateLength);
    +
    179  String toString(void) const;
    +
    180  static uint8_t convertMode(const stdAc::opmode_t mode);
    +
    181  static uint8_t convertFan(const stdAc::fanspeed_t speed);
    +
    182  static stdAc::opmode_t toCommonMode(const uint8_t mode);
    +
    183  static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed);
    +
    184  stdAc::state_t toCommon(void) const;
    +
    185 #ifndef UNIT_TEST
    +
    186 
    +
    187  private:
    + +
    189 #else // UNIT_TEST
    +
    190  IRsendTest _irsend;
    +
    192 #endif // UNIT_TEST
    + +
    195  void checksum(const uint16_t length = kNeoclimaStateLength);
    +
    196 };
    +
    197 
    +
    198 #endif // IR_NEOCLIMA_H_
    -
    const uint8_t kNeoclimaFanHigh
    Definition: ir_Neoclima.h:72
    -
    const uint8_t kNeoclimaUseFahrenheitOffset
    Definition: ir_Neoclima.h:75
    -
    static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
    Convert a native fan speed into its stdAc equivalent.
    Definition: ir_Neoclima.cpp:310
    -
    const uint8_t kNeoclimaMinTempC
    Definition: ir_Neoclima.h:81
    -
    const uint8_t kNeoclimaButtonFanSpeed
    Definition: ir_Neoclima.h:48
    -
    const uint8_t kNeoclimaButtonTurbo
    Definition: ir_Neoclima.h:52
    -
    const uint8_t kNeoclimaFollowMe
    Definition: ir_Neoclima.h:77
    -
    bool getSleep(void)
    Get the Sleep setting of the A/C.
    Definition: ir_Neoclima.cpp:328
    -
    const uint8_t kNeoclimaEyeOffset
    Mask 0b0x000000.
    Definition: ir_Neoclima.h:38
    -
    const uint8_t kNeoclimaTempOffset
    Definition: ir_Neoclima.h:79
    -
    bool getEye(void)
    Get the Eye (Sensor) setting of the A/C.
    Definition: ir_Neoclima.cpp:464
    -
    bool getFollow(void)
    Get the Follow Me setting of the A/C.
    Definition: ir_Neoclima.cpp:487
    -
    const uint8_t kNeoclimaMaxTempC
    Definition: ir_Neoclima.h:82
    +
    bool getPower(void) const
    Get the value of the current power setting.
    Definition: ir_Neoclima.cpp:178
    +
    uint8_t Hold
    Definition: ir_Neoclima.h:45
    +
    const uint8_t kNeoclimaFanHigh
    Definition: ir_Neoclima.h:102
    +
    bool getEcono(void) const
    Get the Economy (Energy Saver) setting of the A/C.
    Definition: ir_Neoclima.cpp:375
    +
    static stdAc::fanspeed_t toCommonFanSpeed(const uint8_t speed)
    Convert a native fan speed into its stdAc equivalent.
    Definition: ir_Neoclima.cpp:305
    +
    const uint8_t kNeoclimaMinTempC
    Definition: ir_Neoclima.h:108
    +
    const uint8_t kNeoclimaButtonFanSpeed
    Definition: ir_Neoclima.h:85
    +
    const uint8_t kNeoclimaButtonTurbo
    Definition: ir_Neoclima.h:89
    +
    const uint8_t kNeoclimaFollowMe
    Definition: ir_Neoclima.h:106
    +
    NeoclimaProtocol _
    Definition: ir_Neoclima.h:194
    +
    uint8_t Mode
    Definition: ir_Neoclima.h:70
    +
    const uint8_t kNeoclimaMaxTempC
    Definition: ir_Neoclima.h:109
    +
    uint8_t raw[kNeoclimaStateLength]
    State of the remote in code.
    Definition: ir_Neoclima.h:31
    fanspeed_t
    Common A/C settings for Fan Speeds.
    Definition: IRsend.h:58
    -
    const uint8_t kNeoclimaIonOffset
    Definition: ir_Neoclima.h:32
    -
    const uint8_t kNeoclimaDry
    Definition: ir_Neoclima.h:88
    -
    static uint8_t calcChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)
    Calculate the checksum for a given state.
    Definition: ir_Neoclima.cpp:85
    -
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Neoclima.h:105
    -
    void set8CHeat(const bool on)
    Set the 8°C Heat setting of the A/C.
    Definition: ir_Neoclima.cpp:444
    -
    const uint8_t kNeoclimaButtonEye
    Definition: ir_Neoclima.h:55
    -
    const uint8_t kNeoclimaButtonPower
    Definition: ir_Neoclima.h:43
    -
    void setFan(const uint8_t speed)
    Set the speed of the fan.
    Definition: ir_Neoclima.cpp:267
    -
    const uint8_t kNeoclimaSwingVOn
    Definition: ir_Neoclima.h:66
    -
    const uint8_t kNeoclimaButtonMode
    Definition: ir_Neoclima.h:44
    +
    uint8_t SwingV
    Definition: ir_Neoclima.h:62
    +
    const uint8_t kNeoclimaDry
    Definition: ir_Neoclima.h:114
    +
    static uint8_t calcChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)
    Calculate the checksum for a given state.
    Definition: ir_Neoclima.cpp:83
    +
    int8_t calibrate(void)
    Run the calibration to calculate uSec timing offsets for this platform.
    Definition: ir_Neoclima.h:131
    +
    uint8_t SwingH
    Definition: ir_Neoclima.h:63
    +
    void set8CHeat(const bool on)
    Set the 8°C Heat setting of the A/C.
    Definition: ir_Neoclima.cpp:437
    +
    const uint8_t kNeoclimaButtonEye
    Definition: ir_Neoclima.h:92
    +
    const uint8_t kNeoclimaButtonPower
    Definition: ir_Neoclima.h:80
    +
    void setFan(const uint8_t speed)
    Set the speed of the fan.
    Definition: ir_Neoclima.cpp:263
    +
    const uint8_t kNeoclimaSwingVOn
    Definition: ir_Neoclima.h:99
    +
    const uint8_t kNeoclimaButtonMode
    Definition: ir_Neoclima.h:81
    const uint16_t kNeoclimaStateLength
    Definition: IRremoteESP8266.h:1023
    -
    void setHold(const bool on)
    Set the Hold setting of the A/C.
    Definition: ir_Neoclima.cpp:401
    -
    const uint8_t kNeoclimaSleepOffset
    Definition: ir_Neoclima.h:62
    -
    uint8_t getMode(void)
    Get the operating mode setting of the A/C.
    Definition: ir_Neoclima.cpp:208
    -
    bool getPower(void)
    Get the value of the current power setting.
    Definition: ir_Neoclima.cpp:181
    -
    const uint8_t kNeoclimaMinTempF
    Definition: ir_Neoclima.h:83
    -
    void setRaw(const uint8_t new_code[], const uint16_t length=kNeoclimaStateLength)
    Set the internal state from a valid code for this protocol.
    Definition: ir_Neoclima.cpp:126
    -
    const uint8_t kNeoclimaButtonHold
    Definition: ir_Neoclima.h:50
    -
    void setEcono(const bool on)
    Set the Economy (Energy Saver) setting of the A/C.
    Definition: ir_Neoclima.cpp:375
    -
    void setTemp(const uint8_t temp, const bool celsius=true)
    Set the temperature.
    Definition: ir_Neoclima.cpp:241
    +
    Native representation of a Neoclima A/C message.
    Definition: ir_Neoclima.h:30
    +
    uint8_t getFan(void) const
    Get the current fan speed setting.
    Definition: ir_Neoclima.cpp:284
    +
    void setHold(const bool on)
    Set the Hold setting of the A/C.
    Definition: ir_Neoclima.cpp:394
    +
    const uint8_t kNeoclimaMinTempF
    Definition: ir_Neoclima.h:110
    +
    void setRaw(const uint8_t new_code[], const uint16_t length=kNeoclimaStateLength)
    Set the internal state from a valid code for this protocol.
    Definition: ir_Neoclima.cpp:124
    +
    const uint8_t kNeoclimaButtonHold
    Definition: ir_Neoclima.h:87
    +
    uint8_t Power
    Definition: ir_Neoclima.h:61
    +
    void setEcono(const bool on)
    Set the Economy (Energy Saver) setting of the A/C.
    Definition: ir_Neoclima.cpp:368
    +
    uint8_t Eye
    Definition: ir_Neoclima.h:49
    +
    void setTemp(const uint8_t temp, const bool celsius=true)
    Set the temperature.
    Definition: ir_Neoclima.cpp:239
    -
    const uint8_t kNeoclimaSwingVSize
    Definition: ir_Neoclima.h:65
    -
    const uint8_t kNeoclimaAuto
    Definition: ir_Neoclima.h:86
    -
    const uint8_t kNeoclimaMaxTempF
    Definition: ir_Neoclima.h:84
    -
    uint8_t getFan(void)
    Get the current fan speed setting.
    Definition: ir_Neoclima.cpp:289
    -
    void setLight(const bool on)
    Set the Light(LED display) setting of the A/C.
    Definition: ir_Neoclima.cpp:427
    -
    const uint8_t kNeoclimaFan
    Definition: ir_Neoclima.h:89
    +
    bool getSleep(void) const
    Get the Sleep setting of the A/C.
    Definition: ir_Neoclima.cpp:323
    +
    bool getTurbo(void) const
    Get the Turbo setting of the A/C.
    Definition: ir_Neoclima.cpp:362
    +
    uint8_t getMode(void) const
    Get the operating mode setting of the A/C.
    Definition: ir_Neoclima.cpp:206
    +
    const uint8_t kNeoclimaAuto
    Definition: ir_Neoclima.h:112
    +
    const uint8_t kNeoclimaMaxTempF
    Definition: ir_Neoclima.h:111
    +
    void setLight(const bool on)
    Set the Light(LED display) setting of the A/C.
    Definition: ir_Neoclima.cpp:420
    +
    const uint8_t kNeoclimaFan
    Definition: ir_Neoclima.h:115
    Class for sending all basic IR protocols.
    Definition: IRsend.h:182
    -
    uint8_t * getRaw(void)
    Get a PTR to the internal state/code for this protocol.
    Definition: ir_Neoclima.cpp:118
    -
    const uint8_t kNeoclimaFanAuto
    Definition: ir_Neoclima.h:71
    +
    bool get8CHeat(void) const
    Get the 8°C Heat setting of the A/C.
    Definition: ir_Neoclima.cpp:444
    +
    uint8_t Sleep
    Definition: ir_Neoclima.h:60
    +
    uint8_t * getRaw(void)
    Get a PTR to the internal state/code for this protocol.
    Definition: ir_Neoclima.cpp:116
    +
    const uint8_t kNeoclimaFanAuto
    Definition: ir_Neoclima.h:101
    int8_t calibrate(uint16_t hz=38000U)
    Calculate & set any offsets to account for execution times during sending.
    Definition: IRsend.cpp:207
    -
    const uint8_t kNeoclimaFreshOffset
    Mask 0bx0000000.
    Definition: ir_Neoclima.h:40
    -
    bool getFresh(void)
    Get the Fresh (air) setting of the A/C.
    Definition: ir_Neoclima.cpp:395
    -
    uint8_t getButton(void)
    Get the Button/Command setting of the A/C.
    Definition: ir_Neoclima.cpp:162
    +
    uint8_t Econo
    Definition: ir_Neoclima.h:47
    std::string String
    Definition: IRremoteESP8266.h:1178
    -
    bool getSwingH(void)
    Get the horizontal swing (Air Flow) setting of the A/C.
    Definition: ir_Neoclima.cpp:356
    -
    const uint8_t kNeoclimaButtonFresh
    Definition: ir_Neoclima.h:58
    -
    bool getTurbo(void)
    Get the Turbo setting of the A/C.
    Definition: ir_Neoclima.cpp:369
    -
    const uint8_t kNeoclimaButtonEcono
    Definition: ir_Neoclima.h:54
    -
    bool getEcono(void)
    Get the Economy (Energy Saver) setting of the A/C.
    Definition: ir_Neoclima.cpp:382
    -
    const uint8_t kNeoclimaButtonAirFlow
    Definition: ir_Neoclima.h:49
    +
    bool getEye(void) const
    Get the Eye (Sensor) setting of the A/C.
    Definition: ir_Neoclima.cpp:457
    +
    uint8_t getButton(void) const
    Get the Button/Command setting of the A/C.
    Definition: ir_Neoclima.cpp:159
    +
    bool getIon(void) const
    Get the Ion (filter) setting of the A/C.
    Definition: ir_Neoclima.cpp:414
    +
    const uint8_t kNeoclimaButtonFresh
    Definition: ir_Neoclima.h:95
    +
    uint8_t Turbo
    Definition: ir_Neoclima.h:46
    +
    const uint8_t kNeoclimaButtonEcono
    Definition: ir_Neoclima.h:91
    +
    uint8_t Temp
    Definition: ir_Neoclima.h:69
    +
    const uint8_t kNeoclimaButtonAirFlow
    Definition: ir_Neoclima.h:86
    -
    void stateReset(void)
    Reset the state of the remote to a known good state/sequence.
    Definition: ir_Neoclima.cpp:72
    -
    uint8_t convertFan(const stdAc::fanspeed_t speed)
    Convert a stdAc::fanspeed_t enum into it's native speed.
    Definition: ir_Neoclima.cpp:296
    -
    const uint8_t kNeoclimaButtonOffset
    Mask 0b000xxxxx.
    Definition: ir_Neoclima.h:41
    -
    const uint8_t kNeoclimaButtonTempDown
    Definition: ir_Neoclima.h:46
    -
    void begin(void)
    Set up hardware to be able to send a message.
    Definition: ir_Neoclima.cpp:79
    -
    const uint8_t kNeoclima8CHeatOffset
    Definition: ir_Neoclima.h:31
    -
    const uint8_t kNeoclimaEconoOffset
    Mask 0b000x0000.
    Definition: ir_Neoclima.h:37
    -
    const uint8_t kNeoclimaSwingHOffset
    Definition: ir_Neoclima.h:68
    -
    const uint8_t kNeoclimaPowerOffset
    Definition: ir_Neoclima.h:63
    -
    uint8_t getTemp(void)
    Get the current temperature setting.
    Definition: ir_Neoclima.cpp:258
    -
    const uint8_t kNeoclimaFanSize
    Definition: ir_Neoclima.h:70
    -
    bool getSwingV(void)
    Get the vertical swing setting of the A/C.
    Definition: ir_Neoclima.cpp:342
    -
    const uint8_t kNeoclimaButtonSize
    Mask 0b000xxxxx.
    Definition: ir_Neoclima.h:42
    -
    const uint8_t kNeoclimaLightOffset
    Mask 0b0000000x.
    Definition: ir_Neoclima.h:34
    -
    uint8_t remote_state[kNeoclimaStateLength]
    State of the remote in code.
    Definition: ir_Neoclima.h:168
    -
    const uint8_t kNeoclimaTempSize
    Definition: ir_Neoclima.h:80
    -
    const uint8_t kNeoclimaButtonLight
    Definition: ir_Neoclima.h:53
    -
    void setIon(const bool on)
    Set the Ion (filter) setting of the A/C.
    Definition: ir_Neoclima.cpp:414
    -
    const uint8_t kNeoclimaButtonSwing
    Definition: ir_Neoclima.h:47
    -
    const uint8_t kNeoclimaButtonFollow
    Definition: ir_Neoclima.h:56
    -
    bool getHold(void)
    Get the Hold setting of the A/C.
    Definition: ir_Neoclima.cpp:408
    -
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Neoclima.h:162
    -
    const uint8_t kNeoclimaSwingVOff
    Definition: ir_Neoclima.h:67
    -
    void setSwingV(const bool on)
    Set the vertical swing setting of the A/C.
    Definition: ir_Neoclima.cpp:334
    -
    void setEye(const bool on)
    Set the Eye (Sensor) setting of the A/C.
    Definition: ir_Neoclima.cpp:457
    -
    static stdAc::opmode_t toCommonMode(const uint8_t mode)
    Convert a native mode into its stdAc equivalent.
    Definition: ir_Neoclima.cpp:228
    -
    const uint8_t kNeoclimaButtonSleep
    Definition: ir_Neoclima.h:51
    -
    const uint8_t kNeoclimaTurboOffset
    Mask 0b0000x000.
    Definition: ir_Neoclima.h:36
    -
    void on(void)
    Set the requested power state of the A/C to on.
    Definition: ir_Neoclima.cpp:167
    -
    const uint8_t kNeoclimaFanMed
    Definition: ir_Neoclima.h:73
    -
    const uint8_t kNeoclimaButtonTempUnit
    Definition: ir_Neoclima.h:60
    -
    void setFresh(const bool on)
    Set the Fresh (air) setting of the A/C.
    Definition: ir_Neoclima.cpp:388
    -
    stdAc::state_t toCommon(void)
    Convert the current internal state into its stdAc::state_t equivalent.
    Definition: ir_Neoclima.cpp:493
    -
    void setPower(const bool on)
    Change the power setting.
    Definition: ir_Neoclima.cpp:174
    -
    const uint8_t kNeoclimaCool
    Definition: ir_Neoclima.h:87
    -
    const uint8_t kNeoclimaHoldOffset
    Mask 0b00000x00.
    Definition: ir_Neoclima.h:35
    -
    const uint8_t kNeoclimaButton8CHeat
    Definition: ir_Neoclima.h:59
    -
    bool getIon(void)
    Get the Ion (filter) setting of the A/C.
    Definition: ir_Neoclima.cpp:421
    -
    const uint8_t kNeoclimaSwingVOffset
    Definition: ir_Neoclima.h:64
    -
    bool get8CHeat(void)
    Get the 8°C Heat setting of the A/C.
    Definition: ir_Neoclima.cpp:451
    -
    const uint8_t kNeoclimaFanOffest
    Definition: ir_Neoclima.h:69
    -
    uint8_t convertMode(const stdAc::opmode_t mode)
    Convert a stdAc::opmode_t enum into its native mode.
    Definition: ir_Neoclima.cpp:215
    -
    const uint8_t kNeoclimaHeat
    Definition: ir_Neoclima.h:90
    -
    void setButton(const uint8_t button)
    Set the Button/Command pressed setting of the A/C.
    Definition: ir_Neoclima.cpp:132
    -
    const uint8_t kNeoclimaButtonIon
    Definition: ir_Neoclima.h:57
    -
    String toString(void)
    Convert the current internal state into a human readable string.
    Definition: ir_Neoclima.cpp:521
    -
    void setMode(const uint8_t mode)
    Set the operating mode of the A/C.
    Definition: ir_Neoclima.cpp:187
    -
    const uint8_t kNeoclimaFanLow
    Definition: ir_Neoclima.h:74
    -
    void setTurbo(const bool on)
    Set the Turbo setting of the A/C.
    Definition: ir_Neoclima.cpp:362
    -
    bool getTempUnits(void)
    Is the A/C unit using Fahrenheit or Celsius for temperature units.
    Definition: ir_Neoclima.cpp:470
    -
    void checksum(const uint16_t length=kNeoclimaStateLength)
    Calculate & update the checksum for the internal state.
    Definition: ir_Neoclima.cpp:103
    -
    const uint8_t kNeoclimaModeOffset
    Definition: ir_Neoclima.h:85
    -
    void setSwingH(const bool on)
    Set the horizontal swing setting of the A/C.
    Definition: ir_Neoclima.cpp:349
    -
    void send(const uint16_t repeat=kNeoclimaMinRepeat)
    Send the current internal state as an IR message.
    Definition: ir_Neoclima.cpp:111
    -
    void off(void)
    Set the requested power state of the A/C to off.
    Definition: ir_Neoclima.cpp:170
    +
    uint8_t Button
    Definition: ir_Neoclima.h:54
    +
    uint8_t CHeat
    Definition: ir_Neoclima.h:37
    +
    void stateReset(void)
    Reset the state of the remote to a known good state/sequence.
    Definition: ir_Neoclima.cpp:70
    +
    static uint8_t convertFan(const stdAc::fanspeed_t speed)
    Convert a stdAc::fanspeed_t enum into it's native speed.
    Definition: ir_Neoclima.cpp:291
    +
    const uint8_t kNeoclimaButtonTempDown
    Definition: ir_Neoclima.h:83
    +
    void begin(void)
    Set up hardware to be able to send a message.
    Definition: ir_Neoclima.cpp:77
    +
    const uint8_t kNeoclimaButtonLight
    Definition: ir_Neoclima.h:90
    +
    void setIon(const bool on)
    Set the Ion (filter) setting of the A/C.
    Definition: ir_Neoclima.cpp:407
    +
    bool getLight(void) const
    Get the Light (LED display) setting of the A/C.
    Definition: ir_Neoclima.cpp:427
    +
    uint8_t Follow
    Definition: ir_Neoclima.h:67
    +
    const uint8_t kNeoclimaButtonSwing
    Definition: ir_Neoclima.h:84
    +
    const uint8_t kNeoclimaButtonFollow
    Definition: ir_Neoclima.h:93
    +
    IRsend _irsend
    Instance of the IR send class.
    Definition: ir_Neoclima.h:188
    +
    const uint8_t kNeoclimaSwingVOff
    Definition: ir_Neoclima.h:100
    +
    bool getSwingV(void) const
    Get the vertical swing setting of the A/C.
    Definition: ir_Neoclima.cpp:336
    +
    void setSwingV(const bool on)
    Set the vertical swing setting of the A/C.
    Definition: ir_Neoclima.cpp:329
    +
    void setEye(const bool on)
    Set the Eye (Sensor) setting of the A/C.
    Definition: ir_Neoclima.cpp:450
    +
    static stdAc::opmode_t toCommonMode(const uint8_t mode)
    Convert a native mode into its stdAc equivalent.
    Definition: ir_Neoclima.cpp:226
    +
    const uint8_t kNeoclimaButtonSleep
    Definition: ir_Neoclima.h:88
    +
    stdAc::state_t toCommon(void) const
    Convert the current internal state into its stdAc::state_t equivalent.
    Definition: ir_Neoclima.cpp:486
    +
    void on(void)
    Set the requested power state of the A/C to on.
    Definition: ir_Neoclima.cpp:164
    +
    uint8_t UseFah
    Definition: ir_Neoclima.h:65
    +
    const uint8_t kNeoclimaFanMed
    Definition: ir_Neoclima.h:103
    +
    bool getFresh(void) const
    Get the Fresh (air) setting of the A/C.
    Definition: ir_Neoclima.cpp:388
    +
    const uint8_t kNeoclimaButtonTempUnit
    Definition: ir_Neoclima.h:97
    +
    void setFresh(const bool on)
    Set the Fresh (air) setting of the A/C.
    Definition: ir_Neoclima.cpp:381
    +
    bool getHold(void) const
    Get the Hold setting of the A/C.
    Definition: ir_Neoclima.cpp:401
    +
    void setPower(const bool on)
    Change the power setting.
    Definition: ir_Neoclima.cpp:171
    +
    const uint8_t kNeoclimaCool
    Definition: ir_Neoclima.h:113
    +
    const uint8_t kNeoclimaButton8CHeat
    Definition: ir_Neoclima.h:96
    +
    uint8_t Ion
    Definition: ir_Neoclima.h:38
    +
    uint8_t getTemp(void) const
    Get the current temperature setting.
    Definition: ir_Neoclima.cpp:255
    +
    bool getFollow(void) const
    Get the Follow Me setting of the A/C.
    Definition: ir_Neoclima.cpp:480
    +
    static uint8_t convertMode(const stdAc::opmode_t mode)
    Convert a stdAc::opmode_t enum into its native mode.
    Definition: ir_Neoclima.cpp:213
    +
    const uint8_t kNeoclimaHeat
    Definition: ir_Neoclima.h:116
    +
    void setButton(const uint8_t button)
    Set the Button/Command pressed setting of the A/C.
    Definition: ir_Neoclima.cpp:130
    +
    const uint8_t kNeoclimaButtonIon
    Definition: ir_Neoclima.h:94
    +
    String toString(void) const
    Convert the current internal state into a human readable string.
    Definition: ir_Neoclima.cpp:514
    +
    uint8_t Sum
    Definition: ir_Neoclima.h:74
    +
    void setMode(const uint8_t mode)
    Set the operating mode of the A/C.
    Definition: ir_Neoclima.cpp:184
    +
    const uint8_t kNeoclimaFanLow
    Definition: ir_Neoclima.h:104
    +
    void setTurbo(const bool on)
    Set the Turbo setting of the A/C.
    Definition: ir_Neoclima.cpp:355
    +
    bool getTempUnits(void) const
    Is the A/C unit using Fahrenheit or Celsius for temperature units.
    Definition: ir_Neoclima.cpp:463
    +
    uint8_t Light
    Definition: ir_Neoclima.h:43
    +
    bool getSwingH(void) const
    Get the horizontal swing (Air Flow) setting of the A/C.
    Definition: ir_Neoclima.cpp:349
    +
    void checksum(const uint16_t length=kNeoclimaStateLength)
    Calculate & update the checksum for the internal state.
    Definition: ir_Neoclima.cpp:101
    +
    void setSwingH(const bool on)
    Set the horizontal swing setting of the A/C.
    Definition: ir_Neoclima.cpp:342
    +
    void send(const uint16_t repeat=kNeoclimaMinRepeat)
    Send the current internal state as an IR message.
    Definition: ir_Neoclima.cpp:109
    +
    void off(void)
    Set the requested power state of the A/C to off.
    Definition: ir_Neoclima.cpp:167
    +
    uint8_t Fan
    Definition: ir_Neoclima.h:64
    +
    uint8_t Fresh
    Definition: ir_Neoclima.h:56
    Structure to hold a common A/C state.
    Definition: IRsend.h:97
    const uint16_t kNeoclimaMinRepeat
    Definition: IRremoteESP8266.h:1025
    -
    IRNeoclimaAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
    Class constructor.
    Definition: ir_Neoclima.cpp:65
    -
    Class for handling detailed Neoclima A/C messages.
    Definition: ir_Neoclima.h:94
    -
    bool getLight(void)
    Get the Light (LED display) setting of the A/C.
    Definition: ir_Neoclima.cpp:434
    -
    void setSleep(const bool on)
    Set the Sleep setting of the A/C.
    Definition: ir_Neoclima.cpp:321
    -
    static bool validChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)
    Verify the checksum is valid for a given state.
    Definition: ir_Neoclima.cpp:95
    -
    const uint8_t kNeoclimaButtonTempUp
    Definition: ir_Neoclima.h:45
    +
    IRNeoclimaAc(const uint16_t pin, const bool inverted=false, const bool use_modulation=true)
    Class constructor.
    Definition: ir_Neoclima.cpp:63
    +
    Class for handling detailed Neoclima A/C messages.
    Definition: ir_Neoclima.h:120
    +
    void setSleep(const bool on)
    Set the Sleep setting of the A/C.
    Definition: ir_Neoclima.cpp:316
    +
    static bool validChecksum(const uint8_t state[], const uint16_t length=kNeoclimaStateLength)
    Verify the checksum is valid for a given state.
    Definition: ir_Neoclima.cpp:93
    +
    const uint8_t kNeoclimaButtonTempUp
    Definition: ir_Neoclima.h:82
    opmode_t
    Common A/C settings for A/C operating modes.
    Definition: IRsend.h:46