diff --git a/.github/ci/install-esp32.sh b/.github/ci/install-esp32.sh index 402c4cf2..77a1b488 100644 --- a/.github/ci/install-esp32.sh +++ b/.github/ci/install-esp32.sh @@ -12,7 +12,7 @@ echo "Clone esp32 core" cd $HOME/arduino_ide/hardware mkdir esp32 cd esp32 -git clone -b 2.0.8 https://github.com/espressif/arduino-esp32.git esp32 +git clone -b 3.0.4 https://github.com/espressif/arduino-esp32.git esp32 cd esp32 git submodule update --init cd tools diff --git a/.github/ci/prepare-libs.sh b/.github/ci/prepare-libs.sh index a313ac03..1c4f5cc4 100644 --- a/.github/ci/prepare-libs.sh +++ b/.github/ci/prepare-libs.sh @@ -6,13 +6,13 @@ shopt -s globstar ls $HOME # Make sure we are inside the github workspace cd $GITHUB_WORKSPACE -cp -r ./libraries/ESP32SSDP-1.2.1 $HOME/arduino_ide/libraries/ -cp -r ./libraries/arduinoWebSockets-2.3.6 $HOME/arduino_ide/libraries/ +cp -r ./libraries/ESP32SSDP-2.0.2 $HOME/arduino_ide/libraries/ +cp -r ./libraries/arduinoWebSockets-2.5.2 $HOME/arduino_ide/libraries/ cp -r ./libraries/DHT_sensor_library_for_ESPx-1.0.6 $HOME/arduino_ide/libraries/ cp -r ./libraries/esp8266-oled-ssd1306-4.3.0 $HOME/arduino_ide/libraries/ -cp -r ./libraries/TFT_eSPI-2.4.72 $HOME/arduino_ide/libraries/ +cp -r ./libraries/TFT_eSPI-2.5.43 $HOME/arduino_ide/libraries/ cp -r ./libraries/lvgl-8.2.0 $HOME/arduino_ide/libraries/ -cp -r ./libraries/EspLuaEngine-1.0.1 $HOME/arduino_ide/libraries/ +cp -r ./libraries/EspLuaEngine-1.0.2 $HOME/arduino_ide/libraries/ cp -r ./libraries/BMx280MI-1.2.0 $HOME/arduino_ide/libraries/ #TODO add SDFat libraries according version and target diff --git a/astyle.bat b/astyle.bat deleted file mode 100644 index bd71600b..00000000 --- a/astyle.bat +++ /dev/null @@ -1,7 +0,0 @@ - -cd %~dp0esp3d -astyle --recursive --style=otbs *.h *.cpp *.ino -del /S *.ori -dir -cd .. -pause diff --git a/astyle.sh b/astyle.sh deleted file mode 100644 index 18c50c91..00000000 --- a/astyle.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -cd `dirname "$0"` -cd esp3d -astyle --recursive --style=otbs '*.h' '*.cpp' '*.ino' -rm -r -v *.ori -cd .. -read -p "Press any key to continue ..." diff --git a/docs/esp3dcnf.ini b/docs/esp3dcnf.ini index 86109d7b..9293d132 100644 --- a/docs/esp3dcnf.ini +++ b/docs/esp3dcnf.ini @@ -44,6 +44,24 @@ AP_IP = 192.168.0.1 #AP channel 1~14 AP_channel = 11 +#Ethernet STA IP Mode DHCP / STATIC +ETH_STA_IP_mode = DHCP + +#Ethernet STA static IP +ETH_STA_IP = 192.168.0.2 + +#Ethernet STA static gateway +ETH_STA_GW = 192.168.0.1 + +#Ethernet STA static mask +ETH_STA_MSK = 255.255.255.0 + +#Ethernet STA static dns +ETH_STA_DNS = 192.168.0.1 + +#Ethernet fallback mode BT, OFF +eth_sta_fallback = OFF + [services] #Active or not Serial Bridge Yes / No Serial_Bridge_active = Yes diff --git a/esp3d/configuration.h b/esp3d/configuration.h index 38a18691..a57dd975 100644 --- a/esp3d/configuration.h +++ b/esp3d/configuration.h @@ -119,7 +119,7 @@ /* Use Ethernet * Enable ethernet communications */ -// #define ETH_FEATURE +//#define ETH_FEATURE // Ethernet type (Check ETH.h eth_phy_type_t) // TYPE_ETH_PHY_LAN8720 @@ -136,20 +136,20 @@ // MODE_ETH_CLOCK_GPIO0_OUT // MODE_ETH_CLOCK_GPIO16_OUT // MODE_ETH_CLOCK_GPIO17_OUT -#define ESP3D_ETH_CLK_MODE MODE_ETH_CLOCK_GPIO17_OUT +#define ESP3D_ETH_CLK_MODE MODE_ETH_CLOCK_GPIO0_IN // Pins of ethernet board -#define ESP3D_ETH_PHY_POWER_PIN 12 -// #define ESP3D_ETH_PHY_MDC_PIN 23 -// #define ESP3D_ETH_PHY_MDIO_PIN 18 +#define ESP3D_ETH_PHY_POWER_PIN 16 +#define ESP3D_ETH_PHY_MDC_PIN 23 +#define ESP3D_ETH_PHY_MDIO_PIN 18 // Address of ethernet board -// #define ESP3D_ETH_PHY_ADDR 0 +#define ESP3D_ETH_PHY_ADDR 1 /* Use Bluetooth * Enable serial bluetooth communications */ -// #define BLUETOOTH_FEATURE +//#define BLUETOOTH_FEATURE /************************************ * @@ -283,14 +283,15 @@ * ESP_SHARED_SD //Printer SD Card is also connected to ESP3D * Does your system has SD card and how it is connected to your ESP3D */ -// #define SD_DEVICE_CONNECTION ESP_SHARED_SD + //#define SD_DEVICE_CONNECTION ESP_DIRECT_SD /* SD card library * ESP_SD_NATIVE //esp32 / esp8266 * ESP_SDIO //esp32 only * ESP_SDFAT2 //esp8266 / esp32 */ -// #define SD_DEVICE ESP_SD_NATIVE + //#define SD_DEVICE ESP_SDFAT2 + // #define SD_CARD_TYPE ESP_FYSETC_WIFI_PRO_SDCARD @@ -299,7 +300,7 @@ * SD_ONE_BIT_MODE * SD_FOUR_BIT_MODE */ -// #define SDIO_BIT_MODE SD_ONE_BIT_MODE + //#define SDIO_BIT_MODE SD_ONE_BIT_MODE /* Enable date/time on files * Set date/time on files using SNTP or last webui connection @@ -335,7 +336,13 @@ /* SD card CS pin * The pin used to select SD card in SPI mode */ -// #define ESP_SD_CS_PIN 5 + //#define ESP_SD_CS_PIN 21 + //#define ESP_SD_MISO_PIN 8 + //#define ESP_SD_MOSI_PIN 9 + //#define ESP_SD_SCK_PIN 7 + //#define ESP_SDIO_CMD_PIN 38 + //#define ESP_SDIO_D0_PIN 40 + //#define ESP_SDIO_CLK_PIN 39 /************************************ * @@ -383,7 +390,7 @@ * The pin used to reset ESP3D setting if set to low for more than 1 second at * start */ -#define ESP3D_RESET_PIN 0 +//#define ESP3D_RESET_PIN 0 /************************************ * @@ -505,9 +512,10 @@ * CAMERA_MODEL_ESP32S2_CAM_BOARD * CAMERA_MODEL_ESP32S3_CAM_LCD * CAMERA_MODEL_ESP32S3_EYE + * CAMERA_MODEL_XIAO_ESP32S3 * Camera connected to ESP board, only ones with PSRAM are supported */ -// #define CAMERA_DEVICE CAMERA_MODEL_AI_THINKER +// #define CAMERA_DEVICE CAMERA_MODEL_XIAO_ESP32S3 /* Flip vertically * Flip camera vertically @@ -621,9 +629,9 @@ // LOG_OUTPUT_SERIAL2 // LOG_OUTPUT_TELNET // LOG_OUTPUT_WEBSOCKET -// #define ESP_LOG_FEATURE LOG_OUTPUT_SERIAL0 +//#define ESP_LOG_FEATURE LOG_OUTPUT_SERIAL0 -// #define ESP3D_DEBUG_LEVEL LOG_LEVEL_DEBUG +//#define ESP3D_DEBUG_LEVEL LOG_LEVEL_DEBUG #ifdef ESP_LOG_FEATURE #define LOG_ESP3D_BAUDRATE 115200 diff --git a/esp3d/src/core/commands/ESP0.cpp b/esp3d/src/core/commands/ESP0.cpp index d2de1d55..ed6a22b0 100644 --- a/esp3d/src/core/commands/ESP0.cpp +++ b/esp3d/src/core/commands/ESP0.cpp @@ -26,15 +26,11 @@ const char* help[] = { "[ESP100](SSID) - display/set STA SSID", "[ESP101](Password) - set STA password", #endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) "[ESP102](Mode) - display/set STA IP mode (DHCP/STATIC)", "[ESP103](IP=xxxx MSK=xxxx GW=xxxx) - display/set STA IP/Mask/GW", -#endif // WIFI_FEATURE || ETH_FEATURE -#if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) "[ESP104](State) - display/set sta fallback mode which can be BT, SETUP, " "OFF", -#endif // WIFI_FEATURE || BLUETOOTH_FEATURE || ETH_FEATURE -#if defined(WIFI_FEATURE) "[ESP105](SSID) - display/set AP SSID", "[ESP106](Password) - set AP password", "[ESP107](IP) - display/set AP IP", @@ -53,6 +49,11 @@ const char* help[] = { "[ESP115](State) - display/set immediate Network state which can be ON, " "OFF", #endif // WIFI_FEATURE || ETH_FEATURE || BT_FEATURE +#if defined(ETH_FEATURE) + "[ESP116](Mode) - display/set ETH STA IP mode (DHCP/STATIC)", + "[ESP117](IP=xxxx MSK=xxxx GW=xxxx) - display/set ETH STA IP/Mask/GW", + "[ESP118](State) - display/set eth sta fallback mode which can be BT, Off", +#endif // ETH_FEATURE #if defined(HTTP_FEATURE) "[ESP120](State) - display/set HTTP state which can be ON, OFF", "[ESP121](Port) - display/set HTTP port ", @@ -196,13 +197,9 @@ const uint cmdlist[] = { #if defined(WIFI_FEATURE) 100, 101, #endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) 102, 103, -#endif // WIFI_FEATURE || ETH_FEATURE -#if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) 104, -#endif // WIFI_FEATURE || BLUETOOTH_FEATURE || ETH_FEATURE -#if defined(WIFI_FEATURE) 105, 106, 107, 108, #endif // WIFI_FEATURE #if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) @@ -214,6 +211,9 @@ const uint cmdlist[] = { #if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE) 112, 114, 115, #endif // WIFI_FEATURE || ETH_FEATURE || BT_FEATURE +#if defined(ETH_FEATURE) + 116, 117, 118, +#endif // ETH_FEATURE #if defined(HTTP_FEATURE) 120, 121, #endif // HTTP_FEATURE diff --git a/esp3d/src/core/commands/ESP102.cpp b/esp3d/src/core/commands/ESP102.cpp index 731d20b6..a51b947c 100644 --- a/esp3d/src/core/commands/ESP102.cpp +++ b/esp3d/src/core/commands/ESP102.cpp @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../../include/esp3d_config.h" -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) #include "../../modules/network/netconfig.h" #include "../esp3d_commands.h" #include "../esp3d_settings.h" @@ -26,9 +26,6 @@ #if defined(WIFI_FEATURE) #include "../../modules/wifi/wificonfig.h" #endif // WIFI_FEATURE -#if defined(ETH_FEATURE) -#include "../../modules/ethernet/ethconfig.h" -#endif // ETH_FEATURE #include "../../modules/authentication/authentication_service.h" #define COMMAND_ID 102 // Change STA IP mode (DHCP/STATIC) @@ -97,4 +94,4 @@ void ESP3DCommands::ESP102(int cmd_params_pos, ESP3DMessage* msg) { } } -#endif // WIFI_FEATURE || ETH_FEATURE +#endif // WIFI_FEATURE diff --git a/esp3d/src/core/commands/ESP103.cpp b/esp3d/src/core/commands/ESP103.cpp index 4820c148..cb2acc2e 100644 --- a/esp3d/src/core/commands/ESP103.cpp +++ b/esp3d/src/core/commands/ESP103.cpp @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../../include/esp3d_config.h" -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) #include "../../modules/network/netconfig.h" #include "../esp3d_commands.h" #include "../esp3d_settings.h" @@ -26,9 +26,6 @@ #if defined(WIFI_FEATURE) #include "../../modules/wifi/wificonfig.h" #endif // WIFI_FEATURE -#if defined(ETH_FEATURE) -#include "../../modules/ethernet/ethconfig.h" -#endif // ETH_FEATURE #include "../../modules/authentication/authentication_service.h" #define COMMAND_ID 103 // Change STA IP/Mask/GW @@ -121,4 +118,4 @@ void ESP3DCommands::ESP103(int cmd_params_pos, ESP3DMessage* msg) { } } -#endif // WIFI_FEATURE || ETH_FEATURE +#endif // WIFI_FEATURE diff --git a/esp3d/src/core/commands/ESP104.cpp b/esp3d/src/core/commands/ESP104.cpp index 651aa05d..0630483d 100644 --- a/esp3d/src/core/commands/ESP104.cpp +++ b/esp3d/src/core/commands/ESP104.cpp @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "../../include/esp3d_config.h" -#if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) #include "../../modules/authentication/authentication_service.h" #include "../../modules/network/netconfig.h" #include "../esp3d_commands.h" @@ -54,11 +54,6 @@ void ESP3DCommands::ESP104(int cmd_params_pos, ESP3DMessage* msg) { ok_msg = "BT"; } else #endif // BLUETOOTH_FEATURE -#if defined(WIFI_FEATURE) - if (byteValue == (uint8_t)ESP_AP_SETUP) { - ok_msg = "CONFIG"; - } else -#endif // WIFI_FEATURE if (byteValue == (uint8_t)ESP_NO_NETWORK) { ok_msg = "OFF"; } else { @@ -76,11 +71,6 @@ void ESP3DCommands::ESP104(int cmd_params_pos, ESP3DMessage* msg) { byteValue = (uint8_t)ESP_BT; } else #endif // BLUETOOTH_FEATURE -#if defined(WIFI_FEATURE) - if (tmpstr == "CONFIG") { - byteValue = (uint8_t)ESP_AP_SETUP; - } else -#endif // WIFI_FEATURE if (tmpstr == "OFF") { byteValue = (uint8_t)ESP_NO_NETWORK; } else { diff --git a/esp3d/src/core/commands/ESP116.cpp b/esp3d/src/core/commands/ESP116.cpp new file mode 100644 index 00000000..221eaa44 --- /dev/null +++ b/esp3d/src/core/commands/ESP116.cpp @@ -0,0 +1,94 @@ +/* + ESP116.cpp - ESP3D command class + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This code is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This code 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with This code; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "../../include/esp3d_config.h" +#if defined(ETH_FEATURE) +#include "../../modules/network/netconfig.h" +#include "../esp3d_commands.h" +#include "../esp3d_settings.h" +#include "../../modules/ethernet/ethconfig.h" +#include "../../modules/authentication/authentication_service.h" +#define COMMAND_ID 116 +// Change ETH STA IP mode (DHCP/STATIC) +//[ESP116][json=no] [pwd=] +void ESP3DCommands::ESP116(int cmd_params_pos, ESP3DMessage* msg) { + ESP3DClientType target = msg->origin; + ESP3DRequest requestId = msg->request_id; + (void)requestId; + msg->target = target; + msg->origin = ESP3DClientType::command; + bool hasError = false; + String error_msg = "Invalid parameters"; + String ok_msg = "ok"; + bool json = hasTag(msg, cmd_params_pos, "json"); + String tmpstr; + uint8_t byteValue = (uint8_t)-1; +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level == ESP3DAuthenticationLevel::guest) { + msg->authentication_level = ESP3DAuthenticationLevel::not_authenticated; + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE + tmpstr = get_clean_param(msg, cmd_params_pos); + if (tmpstr.length() == 0) { + byteValue = ESP3DSettings::readByte(ESP_ETH_STA_IP_MODE); + if (byteValue == static_cast(DHCP_MODE)) { + ok_msg = "DHCP"; + } else if (byteValue == static_cast(STATIC_IP_MODE)) { + ok_msg = "STATIC"; + } else { + ok_msg = "Unknown:" + String(byteValue); + } + } else { +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level != ESP3DAuthenticationLevel::admin) { + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE + if (tmpstr == "DHCP") { + byteValue = static_cast(DHCP_MODE); + } else if (tmpstr == "STATIC") { + byteValue = static_cast(STATIC_IP_MODE); + } else { + byteValue = (uint8_t)-1; // unknow flag so put outof range value + } + esp3d_log("got %s param for a value of %d, is valid %d", tmpstr.c_str(), + byteValue, + ESP3DSettings::isValidByteSetting(byteValue, ESP_ETH_STA_IP_MODE)); + if (ESP3DSettings::isValidByteSetting(byteValue, ESP_ETH_STA_IP_MODE)) { + esp3d_log("Value %d is valid", byteValue); + if (!ESP3DSettings::writeByte(ESP_ETH_STA_IP_MODE, byteValue)) { + hasError = true; + error_msg = "Set value failed"; + } + } else { + hasError = true; + error_msg = "Invalid parameter"; + } + } + + if (!dispatchAnswer(msg, COMMAND_ID, json, hasError, + hasError ? error_msg.c_str() : ok_msg.c_str())) { + esp3d_log_e("Error sending response to clients"); + } +} + +#endif // ETH_FEATURE diff --git a/esp3d/src/core/commands/ESP117.cpp b/esp3d/src/core/commands/ESP117.cpp new file mode 100644 index 00000000..f3282f83 --- /dev/null +++ b/esp3d/src/core/commands/ESP117.cpp @@ -0,0 +1,118 @@ +/* + ESP117.cpp - ESP3D command class + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This code is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This code 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with This code; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "../../include/esp3d_config.h" +#if defined(ETH_FEATURE) +#include "../../modules/network/netconfig.h" +#include "../esp3d_commands.h" +#include "../esp3d_settings.h" +#include "../../modules/ethernet/ethconfig.h" +#include "../../modules/authentication/authentication_service.h" +#define COMMAND_ID 117 +// Change ETH STA IP/Mask/GW +//[ESP117]IP= MSK= GW= DNS= [json=no] [pwd= +void ESP3DCommands::ESP117(int cmd_params_pos, ESP3DMessage* msg) { + ESP3DClientType target = msg->origin; + ESP3DRequest requestId = msg->request_id; + (void)requestId; + msg->target = target; + msg->origin = ESP3DClientType::command; + bool hasError = false; + String error_msg = "Invalid parameters"; + String ok_msg = "ok"; + bool json = hasTag(msg, cmd_params_pos, "json"); + String tmpstr; + const char* cmdList[] = {"IP=", "MSK=", "GW=", "DNS="}; + uint8_t cmdListSize = sizeof(cmdList) / sizeof(char*); + const ESP3DSettingIndex settingIndex[] = { + ESP_ETH_STA_IP_VALUE, ESP_ETH_STA_MASK_VALUE, ESP_ETH_STA_GATEWAY_VALUE, + ESP_ETH_STA_DNS_VALUE}; +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level == ESP3DAuthenticationLevel::guest) { + msg->authentication_level = ESP3DAuthenticationLevel::not_authenticated; + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE + tmpstr = get_clean_param(msg, cmd_params_pos); + if (tmpstr.length() == 0) { + if (json) { + ok_msg = "{\"ip\":\""; + } else { + ok_msg = "IP: "; + } + ok_msg += ESP3DSettings::readIPString(ESP_ETH_STA_IP_VALUE); + if (json) { + ok_msg += "\",\"gw\":\""; + } else { + ok_msg += ", GW: "; + } + ok_msg += ESP3DSettings::readIPString(ESP_ETH_STA_GATEWAY_VALUE); + if (json) { + ok_msg += "\",\"msk\":\""; + } else { + ok_msg += ", MSK: "; + } + ok_msg += ESP3DSettings::readIPString(ESP_ETH_STA_MASK_VALUE); + if (json) { + ok_msg += "\",\"dns\":\""; + } else { + ok_msg += ", DNS: "; + } + ok_msg += ESP3DSettings::readIPString(ESP_ETH_STA_DNS_VALUE); + if (json) { + ok_msg += "\"}"; + } + } else { +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level != ESP3DAuthenticationLevel::admin) { + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE + bool hasParam = false; + for (uint8_t i = 0; i < cmdListSize; i++) { + tmpstr = get_param(msg, cmd_params_pos, cmdList[i]); + if (tmpstr.length() != 0) { + hasParam = true; + if (ESP3DSettings::isValidIPStringSetting(tmpstr.c_str(), + settingIndex[i])) { + esp3d_log("Value %s is valid", tmpstr.c_str()); + if (!ESP3DSettings::writeIPString(settingIndex[i], tmpstr.c_str())) { + hasError = true; + error_msg = "Set value failed"; + } + } else { + hasError = true; + error_msg = "Invalid parameter"; + } + } + } + if (!hasParam && !hasError) { + hasError = true; + error_msg = "Invalid parameter"; + } + } + if (!dispatchAnswer(msg, COMMAND_ID, json, hasError, + hasError ? error_msg.c_str() : ok_msg.c_str())) { + esp3d_log_e("Error sending response to clients"); + } +} + +#endif // ETH_FEATURE diff --git a/esp3d/src/core/commands/ESP118.cpp b/esp3d/src/core/commands/ESP118.cpp new file mode 100644 index 00000000..23fd06a5 --- /dev/null +++ b/esp3d/src/core/commands/ESP118.cpp @@ -0,0 +1,101 @@ +/* + ESP118.cpp - ESP3D command class + + Copyright (c) 2014 Luc Lebosse. All rights reserved. + + This code is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This code 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with This code; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ +#include "../../include/esp3d_config.h" +#if defined(ETH_FEATURE) +#include "../../modules/authentication/authentication_service.h" +#include "../../modules/network/netconfig.h" +#include "../esp3d_commands.h" +#include "../esp3d_settings.h" + +#define COMMAND_ID 118 +// Set ETH STA fallback mode state at boot which can be BT, WIFI-SETUP, OFF +//[ESP118] json= pwd= +void ESP3DCommands::ESP118(int cmd_params_pos, ESP3DMessage* msg) { + ESP3DClientType target = msg->origin; + ESP3DRequest requestId = msg->request_id; + (void)requestId; + msg->target = target; + msg->origin = ESP3DClientType::command; + bool hasError = false; + String error_msg = "Invalid parameters"; + String ok_msg = "ok"; + bool json = hasTag(msg, cmd_params_pos, "json"); + String tmpstr; + uint8_t byteValue = (uint8_t)-1; +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level == ESP3DAuthenticationLevel::guest) { + msg->authentication_level = ESP3DAuthenticationLevel::not_authenticated; + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE + tmpstr = get_clean_param(msg, cmd_params_pos); + if (tmpstr.length() == 0) { + byteValue = ESP3DSettings::readByte(ESP_ETH_STA_FALLBACK_MODE); +#if defined(BLUETOOTH_FEATURE) + if (byteValue == (uint8_t)ESP_BT) { + ok_msg = "BT"; + } else +#endif // BLUETOOTH_FEATURE + if (byteValue == (uint8_t)ESP_NO_NETWORK) { + ok_msg = "OFF"; + } else { + ok_msg = "Unknown"; + } + } else { +#if defined(AUTHENTICATION_FEATURE) + if (msg->authentication_level != ESP3DAuthenticationLevel::admin) { + dispatchAuthenticationError(msg, COMMAND_ID, json); + return; + } +#endif // AUTHENTICATION_FEATURE +#if defined(BLUETOOTH_FEATURE) + if (tmpstr == "BT") { + byteValue = (uint8_t)ESP_BT; + } else +#endif // BLUETOOTH_FEATURE + if (tmpstr == "OFF") { + byteValue = (uint8_t)ESP_NO_NETWORK; + } else { + byteValue = (uint8_t)-1; // unknow flag so put outof range value + } + esp3d_log( + "got %s param for a value of %d, is valid %d", tmpstr.c_str(), + byteValue, + ESP3DSettings::isValidByteSetting(byteValue, ESP_ETH_STA_FALLBACK_MODE)); + if (ESP3DSettings::isValidByteSetting(byteValue, ESP_ETH_STA_FALLBACK_MODE)) { + esp3d_log("Value %d is valid", byteValue); + if (!ESP3DSettings::writeByte(ESP_ETH_STA_FALLBACK_MODE, byteValue)) { + hasError = true; + error_msg = "Set value failed"; + } + } else { + hasError = true; + error_msg = "Invalid parameter"; + } + } + + if (!dispatchAnswer(msg, COMMAND_ID, json, hasError, + hasError ? error_msg.c_str() : ok_msg.c_str())) { + esp3d_log_e("Error sending response to clients"); + } +} + +#endif // ETH_FEATURE diff --git a/esp3d/src/core/commands/ESP301.cpp b/esp3d/src/core/commands/ESP301.cpp index 8eb4c004..d1b99029 100644 --- a/esp3d/src/core/commands/ESP301.cpp +++ b/esp3d/src/core/commands/ESP301.cpp @@ -51,23 +51,40 @@ void ESP3DCommands::ESP301(int cmd_params_pos, ESP3DMessage* msg) { #endif // AUTHENTICATION_FEATURE tmpstr = get_clean_param(msg, cmd_params_pos); if (tmpstr.length() == 0) { + String error = esp3d_lua_interpreter.getLastError(); if (!esp3d_lua_interpreter.isScriptRunning()) { if (json) { - ok_msg = "{\"status\":\"idle\"}"; + ok_msg = "{\"status\":\"idle\""; + if (error.length() > 0) { + ok_msg += ",\"error\":\"" + error + "\""; + } + ok_msg+="}"; } else { ok_msg = "idle"; + if (error.length() > 0) { + ok_msg += ", error: " + error; + } } } else { String status = esp3d_lua_interpreter.isScriptPaused() ? "paused" : "running"; + + if (error.length() > 0) { + status = "error"; + } String scriptName = esp3d_lua_interpreter.getCurrentScriptName(); String duration = esp3d_string::formatDuration( esp3d_lua_interpreter.getExecutionTime()); if (json) { + String errorMsg = error.length() > 0 ? ",\"error\":\"" + error + "\"" : ""; ok_msg = "{\"status\":\"" + status + "\",\"script\":\"" + scriptName + - "\",\"duration\":\"" + duration + "\"}"; + "\",\"duration\":\"" + duration + "\"" + errorMsg + "}"; } else { - ok_msg = status + ", " + scriptName + ", duration " + duration; + ok_msg = status; + if (error.length() > 0) { + ok_msg += ": " + error; + } + ok_msg += ", " + scriptName + ", duration " + duration; } } } else { @@ -113,7 +130,7 @@ void ESP3DCommands::ESP301(int cmd_params_pos, ESP3DMessage* msg) { } } } else if (tmpstr == "ABORT") { - esp3d_lua_interpreter.abortCurrentScript(); + esp3d_lua_interpreter.abortScript(); ok_msg = "Script aborted"; } } else { diff --git a/esp3d/src/core/commands/ESP400.cpp b/esp3d/src/core/commands/ESP400.cpp index dfe1bf37..5f8be498 100644 --- a/esp3d/src/core/commands/ESP400.cpp +++ b/esp3d/src/core/commands/ESP400.cpp @@ -91,6 +91,19 @@ const char* FallbackValues[] = {"0" #endif // BLUETOOTH_FEATURE }; +const char* EthFallbackValues[] = {"0" +#ifdef BLUETOOTH_FEATURE + , + "3" +#endif // BLUETOOTH_FEATURE +}; +const char* EthFallbackLabels[] = {"none" +#ifdef BLUETOOTH_FEATURE + , + "bt" +#endif // BLUETOOTH_FEATURE +}; + const char* FirmwareLabels[] = {"Unknown", "Grbl", "Marlin", "Smoothieware", "Repetier"}; @@ -204,6 +217,30 @@ void ESP3DCommands::ESP400(int cmd_params_pos, ESP3DMessage* msg) { dispatchSetting(json, "network/network", ESP_BOOT_RADIO_STATE, "radio_boot", YesNoValues, YesNoLabels, sizeof(YesNoValues) / sizeof(char*), -1, -1, -1, NULL, true, target, requestId); +#if defined(ETH_FEATURE) + // Ethernet STA IP mode + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_IP_MODE, "ip mode", IpModeValues, + IpModeLabels, sizeof(IpModeLabels) / sizeof(char*), -1, -1, + -1, nullptr, true, target, requestId); + // Ethernet STA static IP + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_IP_VALUE, "ip", nullptr, nullptr, + -1, -1, -1, -1, nullptr, true, target, requestId); + + // Ethernet STA static Gateway + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_GATEWAY_VALUE, "gw", nullptr, + nullptr, -1, -1, -1, -1, nullptr, true, target, requestId); + // Ethernet STA static Mask + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_MASK_VALUE, "msk", nullptr, + nullptr, -1, -1, -1, -1, nullptr, true, target, requestId); + // Ethernet STA static DNS + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_DNS_VALUE, "DNS", nullptr, + nullptr, -1, -1, -1, -1, nullptr, true, target, requestId); + // Ethernet Sta fallback mode + dispatchSetting(json, "network/eth-sta", ESP_ETH_STA_FALLBACK_MODE, + "sta fallback mode", EthFallbackValues, EthFallbackLabels, + sizeof(EthFallbackValues) / sizeof(char*), -1, -1, -1, nullptr, + true, target, requestId); +#endif // ETH_FEATURE #ifdef WIFI_FEATURE // STA SSID network/sta dispatchSetting(json, "network/sta", ESP_STA_SSID, "SSID", nullptr, nullptr, @@ -214,7 +251,7 @@ void ESP3DCommands::ESP400(int cmd_params_pos, ESP3DMessage* msg) { nullptr, 64, 8, 0, -1, nullptr, true, target, requestId); #endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) // STA IP mode dispatchSetting(json, "network/sta", ESP_STA_IP_MODE, "ip mode", IpModeValues, IpModeLabels, sizeof(IpModeLabels) / sizeof(char*), -1, -1, @@ -233,15 +270,15 @@ void ESP3DCommands::ESP400(int cmd_params_pos, ESP3DMessage* msg) { dispatchSetting(json, "network/sta", ESP_STA_DNS_VALUE, "DNS", nullptr, nullptr, -1, -1, -1, -1, nullptr, true, target, requestId); -#endif // WIFI_FEATURE || ETH_FEATURE +#endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) || defined(BT_FEATURE) +#if defined(WIFI_FEATURE) // Sta fallback mode dispatchSetting(json, "network/sta", ESP_STA_FALLBACK_MODE, "sta fallback mode", FallbackValues, FallbackLabels, sizeof(FallbackValues) / sizeof(char*), -1, -1, -1, nullptr, true, target, requestId); -#endif // WIFI_FEATURE || ETH_FEATURE || BT_FEATURE +#endif // WIFI_FEATURE #if defined(WIFI_FEATURE) // AP SSID network/ap dispatchSetting(json, "network/ap", ESP_AP_SSID, "SSID", nullptr, nullptr, 32, diff --git a/esp3d/src/core/commands/ESP420.cpp b/esp3d/src/core/commands/ESP420.cpp index a75a5a82..5980011b 100644 --- a/esp3d/src/core/commands/ESP420.cpp +++ b/esp3d/src/core/commands/ESP420.cpp @@ -157,6 +157,14 @@ void ESP3DCommands::ESP420(int cmd_params_pos, ESP3DMessage* msg) { // FW architecture tmpstr = ESP3DSettings::TargetBoard(); + #ifdef ARDUINO_ARCH_ESP32 + tmpstr = ESP.getChipModel(); + tmpstr+="-"; + tmpstr+=ESP.getChipRevision(); + tmpstr+="-"; + tmpstr+=ESP.getChipCores(); + tmpstr+="@"; + #endif // ARDUINO_ARCH_ESP32 if (!dispatchIdValue(json, "FW arch", tmpstr.c_str(), target, requestId, false)) { return; @@ -389,6 +397,7 @@ void ESP3DCommands::ESP420(int cmd_params_pos, ESP3DMessage* msg) { return; } // IP mode + esp3d_log_d("IP mode %d", NetConfig::isIPModeDHCP(ESP_ETH_STA)); tmpstr = (NetConfig::isIPModeDHCP(ESP_ETH_STA)) ? "dhcp" : "static"; if (!dispatchIdValue(json, "ip mode", tmpstr.c_str(), target, requestId, false)) { @@ -418,6 +427,11 @@ void ESP3DCommands::ESP420(int cmd_params_pos, ESP3DMessage* msg) { false)) { return; } + } else { + if (!dispatchIdValue(json, "ethernet", "OFF", target, requestId, + false)) { + return; + } } #endif // ETH_FEATURE #if defined(WIFI_FEATURE) diff --git a/esp3d/src/core/commands/ESP710.cpp b/esp3d/src/core/commands/ESP710.cpp index 010e6a1e..0bf68785 100644 --- a/esp3d/src/core/commands/ESP710.cpp +++ b/esp3d/src/core/commands/ESP710.cpp @@ -56,7 +56,7 @@ void ESP3DCommands::ESP710(int cmd_params_pos, ESP3DMessage* msg) { } else { if (formatfs) { ok_msg = "Starting formating..."; - endMsg = ESP3DMessageManager::copyMsgInfos(*msg); + endMsg = esp3d_message_manager.copyMsgInfos(*msg); } else { hasError = true; error_msg = "Invalid parameter"; diff --git a/esp3d/src/core/commands/ESP715.cpp b/esp3d/src/core/commands/ESP715.cpp index 84f34aa6..2f7570a7 100644 --- a/esp3d/src/core/commands/ESP715.cpp +++ b/esp3d/src/core/commands/ESP715.cpp @@ -57,7 +57,7 @@ void ESP3DCommands::ESP715(int cmd_params_pos, ESP3DMessage* msg) { if (formatsd) { if (ESP_SD::getState() != ESP_SDCARD_BUSY) { ok_msg = "Starting formating..."; - endMsg = ESP3DMessageManager::copyMsgInfos(*msg); + endMsg = esp3d_message_manager.copyMsgInfos(*msg); } else { hasError = true; error_msg = "SD card busy"; diff --git a/esp3d/src/core/commands/ESP720.cpp b/esp3d/src/core/commands/ESP720.cpp index 1406ac29..1690760c 100644 --- a/esp3d/src/core/commands/ESP720.cpp +++ b/esp3d/src/core/commands/ESP720.cpp @@ -49,7 +49,11 @@ void ESP3DCommands::ESP720(int cmd_params_pos, ESP3DMessage* msg) { #endif // AUTHENTICATION_FEATURE ESP3DMessage msgInfo; - ESP3DMessageManager::copyMsgInfos(&msgInfo, *msg); + esp3d_log("Copy msg infos"); + if (!esp3d_message_manager.copyMsgInfos(&msgInfo, *msg)) { + esp3d_log_e("Error copying msg infos"); + return; + } tmpstr = get_clean_param(msg, cmd_params_pos); if (tmpstr.length() == 0) { @@ -104,7 +108,7 @@ void ESP3DCommands::ESP720(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -156,7 +160,7 @@ void ESP3DCommands::ESP720(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -202,7 +206,7 @@ void ESP3DCommands::ESP720(int cmd_params_pos, ESP3DMessage* msg) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); newMsg->type = ESP3DMessageType::tail; if (!dispatch(newMsg, ok_msg.c_str())) { esp3d_log_e("Error sending response to clients"); diff --git a/esp3d/src/core/commands/ESP740.cpp b/esp3d/src/core/commands/ESP740.cpp index e6f8e6e6..2f3e6bf5 100644 --- a/esp3d/src/core/commands/ESP740.cpp +++ b/esp3d/src/core/commands/ESP740.cpp @@ -49,7 +49,7 @@ void ESP3DCommands::ESP740(int cmd_params_pos, ESP3DMessage* msg) { #endif // AUTHENTICATION_FEATURE ESP3DMessage msgInfo; - ESP3DMessageManager::copyMsgInfos(&msgInfo, *msg); + esp3d_message_manager.copyMsgInfos(&msgInfo, *msg); tmpstr = get_clean_param(msg, cmd_params_pos); if (tmpstr.length() == 0) { @@ -118,7 +118,7 @@ void ESP3DCommands::ESP740(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -170,7 +170,7 @@ void ESP3DCommands::ESP740(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -216,7 +216,7 @@ void ESP3DCommands::ESP740(int cmd_params_pos, ESP3DMessage* msg) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); newMsg->type = ESP3DMessageType::tail; if (!dispatch(newMsg, ok_msg.c_str())) { esp3d_log_e("Error sending response to clients"); diff --git a/esp3d/src/core/commands/ESP780.cpp b/esp3d/src/core/commands/ESP780.cpp index f0307a0e..f4f98ca2 100644 --- a/esp3d/src/core/commands/ESP780.cpp +++ b/esp3d/src/core/commands/ESP780.cpp @@ -49,7 +49,7 @@ void ESP3DCommands::ESP780(int cmd_params_pos, ESP3DMessage* msg) { #endif // AUTHENTICATION_FEATURE ESP3DMessage msgInfo; - ESP3DMessageManager::copyMsgInfos(&msgInfo, *msg); + esp3d_message_manager.copyMsgInfos(&msgInfo, *msg); tmpstr = get_clean_param(msg, cmd_params_pos); if (tmpstr.length() == 0) { @@ -105,7 +105,7 @@ void ESP3DCommands::ESP780(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -157,7 +157,7 @@ void ESP3DCommands::ESP780(int cmd_params_pos, ESP3DMessage* msg) { if (!json) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); if (newMsg) { newMsg->type = ESP3DMessageType::core; if (!dispatch(newMsg, ok_msg.c_str())) { @@ -203,7 +203,7 @@ void ESP3DCommands::ESP780(int cmd_params_pos, ESP3DMessage* msg) { ok_msg += "\n"; } - ESP3DMessage* newMsg = ESP3DMessageManager::copyMsgInfos(msgInfo); + ESP3DMessage* newMsg = esp3d_message_manager.copyMsgInfos(msgInfo); newMsg->type = ESP3DMessageType::tail; if (!dispatch(newMsg, ok_msg.c_str())) { esp3d_log_e("Error sending response to clients"); diff --git a/esp3d/src/core/esp3d.cpp b/esp3d/src/core/esp3d.cpp index c3d6028f..d8177f9a 100644 --- a/esp3d/src/core/esp3d.cpp +++ b/esp3d/src/core/esp3d.cpp @@ -55,6 +55,9 @@ #endif // SD_UPDATE_FEATURE #include "../modules/boot_delay/boot_delay.h" #include "esp3d_message.h" +#ifdef ESP_LUA_INTERPRETER_FEATURE +#include "../modules/lua_interpreter/lua_interpreter_service.h" +#endif // ESP_LUA_INTERPRETER_FEATURE bool Esp3D::restart = false; @@ -179,6 +182,10 @@ void Esp3D::handle() { #if defined(GCODE_HOST_FEATURE) esp3d_gcode_host.handle(); #endif // GCODE_HOST_FEATURE + +#ifdef ESP_LUA_INTERPRETER_FEATURE + esp3d_lua_interpreter.handle(); +#endif // ESP_LUA_INTERPRETER_FEATURE } bool Esp3D::started() { return _started; } diff --git a/esp3d/src/core/esp3d_commands.cpp b/esp3d/src/core/esp3d_commands.cpp index 1a6d4151..8830bd77 100644 --- a/esp3d/src/core/esp3d_commands.cpp +++ b/esp3d/src/core/esp3d_commands.cpp @@ -388,7 +388,7 @@ void ESP3DCommands::execute_internal_command(int cmd, int cmd_params_pos, ESP101(cmd_params_pos, msg); break; #endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) // Change STA IP mode (DHCP/STATIC) //[ESP102]pwd= case 102: @@ -399,15 +399,11 @@ void ESP3DCommands::execute_internal_command(int cmd, int cmd_params_pos, case 103: ESP103(cmd_params_pos, msg); break; -#endif // WIFI_FEATURE ||ETH_FEATURE -#if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) // Set fallback mode which can be BT, WIFI-AP, OFF //[ESP104]pwd= case 104: ESP104(cmd_params_pos, msg); break; -#endif // WIFI_FEATURE || BLUETOOTH_FEATURE || ETH_FEATURE) -#if defined(WIFI_FEATURE) // AP SSID //[ESP105][pwd=] case 105: @@ -465,6 +461,24 @@ void ESP3DCommands::execute_internal_command(int cmd, int cmd_params_pos, break; #endif // WIFI_FEATURE|| ETH_FEATURE || BT_FEATURE +#if defined(ETH_FEATURE) + // Change ETH STA IP mode (DHCP/STATIC) + //[ESP116]pwd= + case 116: + ESP102(cmd_params_pos, msg); + break; + // Change ETH STA IP/Mask/GW + //[ESP117]IP= MSK= GW= pwd= + case 117: + ESP117(cmd_params_pos, msg); + break; + // Set fallback mode which can be BT, OFF + //[ESP118]pwd= + case 118: + ESP118(cmd_params_pos, msg); + break; +#endif // ETH_FEATURE + #ifdef HTTP_FEATURE // Set HTTP state which can be ON, OFF //[ESP120]pwd= @@ -1165,9 +1179,9 @@ void ESP3DCommands::process(ESP3DMessage *msg) { esp3d_log("Execute internal command %d", cmdId); execute_internal_command(cmdId, espcmdpos, msg); } else { - esp3d_log("Dispatch command, len %d, from %d(%s) to %d(%s)", msg->size, + /*esp3d_log("Dispatch command, len %d, from %d(%s) to %d(%s)", msg->size, static_cast(msg->origin), GETCLIENTSTR(msg->origin), - static_cast(msg->target), GETCLIENTSTR(msg->target)); + static_cast(msg->target), GETCLIENTSTR(msg->target));*/ // Work around to avoid to dispatch single \n or \r to everyone as it is // part of previous ESP3D command @@ -1177,10 +1191,11 @@ void ESP3DCommands::process(ESP3DMessage *msg) { lastIsESP3D = false; // delete message esp3d_log("Delete message"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); return; } lastIsESP3D = false; + esp3d_log("Dispatch message: %s", msg->data); dispatch(msg); } } @@ -1206,25 +1221,25 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg, uint8_t *sbuf, size_t len) { } tmpstr += '\n'; esp3d_log("update command success: *%s*", tmpstr.c_str()); - if (!ESP3DMessageManager::setDataContent(msg, (uint8_t *)tmpstr.c_str(), + if (!esp3d_message_manager.setDataContent(msg, (uint8_t *)tmpstr.c_str(), tmpstr.length())) { esp3d_log_e("set data content failed"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); return false; } } else { esp3d_log("format command success, no need to update"); - if (!ESP3DMessageManager::setDataContent(msg, sbuf, len)) { + if (!esp3d_message_manager.setDataContent(msg, sbuf, len)) { esp3d_log_e("set data content failed"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); return false; } } } else { esp3d_log("not unique or tail message"); - if (!ESP3DMessageManager::setDataContent(msg, sbuf, len)) { + if (!esp3d_message_manager.setDataContent(msg, sbuf, len)) { esp3d_log_e("set data content failed"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); return false; } } @@ -1235,7 +1250,7 @@ bool ESP3DCommands::dispatch(uint8_t *sbuf, size_t size, ESP3DClientType target, ESP3DRequest requestId, ESP3DMessageType type, ESP3DClientType origin, ESP3DAuthenticationLevel authentication_level) { - ESP3DMessage *newMsgPtr = ESP3DMessageManager::newMsg(origin, target); + ESP3DMessage *newMsgPtr = esp3d_message_manager.newMsg(origin, target); if (newMsgPtr) { newMsgPtr->request_id = requestId; newMsgPtr->type = type; @@ -1249,7 +1264,7 @@ bool ESP3DCommands::dispatch(const char *sbuf, ESP3DClientType target, ESP3DRequest requestId, ESP3DMessageType type, ESP3DClientType origin, ESP3DAuthenticationLevel authentication_level) { - ESP3DMessage *newMsgPtr = ESP3DMessageManager::newMsg(origin, target); + ESP3DMessage *newMsgPtr = esp3d_message_manager.newMsg(origin, target); if (newMsgPtr) { newMsgPtr->request_id = requestId; newMsgPtr->type = type; @@ -1281,7 +1296,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { switch (msg->target) { case ESP3DClientType::no_client: esp3d_log("No client message"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); break; #if COMMUNICATION_PROTOCOL == RAW_SERIAL case ESP3DClientType::serial: @@ -1303,7 +1318,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { MYSERIAL1.write('\n'); } } - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); break; case ESP3DClientType::socket_serial: @@ -1413,7 +1428,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { tmp.replace("\n", " "); tmp.replace("\r", ""); tmp += "\n"; - if (ESP3DMessageManager::setDataContent(msg, (uint8_t *)tmp.c_str(), + if (esp3d_message_manager.setDataContent(msg, (uint8_t *)tmp.c_str(), tmp.length())) { return dispatch(msg); } @@ -1432,7 +1447,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::remote_screen; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::remote_screen; dispatch(copy_msg); @@ -1451,7 +1466,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::lua_script; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::lua_script; dispatch(copy_msg); @@ -1471,7 +1486,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->request_id.id = ESP_OUTPUT_STATUS; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::rendering; copy_msg->request_id.id = ESP_OUTPUT_STATUS; @@ -1491,7 +1506,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::echo_serial; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::echo_serial; dispatch(copy_msg); @@ -1509,7 +1524,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::serial_bridge; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::serial_bridge; dispatch(copy_msg); @@ -1528,7 +1543,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::bluetooth; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::bluetooth; dispatch(copy_msg); @@ -1547,7 +1562,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::telnet; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::telnet; dispatch(copy_msg); @@ -1570,7 +1585,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::webui_websocket; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::webui_websocket; dispatch(copy_msg); @@ -1592,7 +1607,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { msg->target = ESP3DClientType::websocket; } else { // duplicate message because current is already pending - ESP3DMessage *copy_msg = ESP3DMessageManager::copyMsg(*msg); + ESP3DMessage *copy_msg = esp3d_message_manager.copyMsg(*msg); if (copy_msg) { copy_msg->target = ESP3DClientType::websocket; dispatch(copy_msg); @@ -1624,7 +1639,7 @@ bool ESP3DCommands::dispatch(ESP3DMessage *msg) { // clear message if (!sendOk) { esp3d_log_e("Send msg failed"); - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); } return sendOk; } diff --git a/esp3d/src/core/esp3d_commands.h b/esp3d/src/core/esp3d_commands.h index 113285b0..eea72bca 100644 --- a/esp3d/src/core/esp3d_commands.h +++ b/esp3d/src/core/esp3d_commands.h @@ -53,14 +53,10 @@ class ESP3DCommands { void ESP100(int cmd_params_pos, ESP3DMessage* msg); void ESP101(int cmd_params_pos, ESP3DMessage* msg); #endif // WIFI_FEATURE -#if defined(WIFI_FEATURE) || defined(ETH_FEATURE) +#if defined(WIFI_FEATURE) void ESP102(int cmd_params_pos, ESP3DMessage* msg); void ESP103(int cmd_params_pos, ESP3DMessage* msg); -#endif // WIFI_FEATURE ||ETH_FEATURE -#if defined(WIFI_FEATURE) || defined(BLUETOOTH_FEATURE) || defined(ETH_FEATURE) void ESP104(int cmd_params_pos, ESP3DMessage* msg); -#endif // WIFI_FEATURE || BLUETOOTH_FEATURE || ETH_FEATURE -#if defined(WIFI_FEATURE) void ESP105(int cmd_params_pos, ESP3DMessage* msg); void ESP106(int cmd_params_pos, ESP3DMessage* msg); void ESP107(int cmd_params_pos, ESP3DMessage* msg); @@ -77,6 +73,11 @@ class ESP3DCommands { void ESP114(int cmd_params_pos, ESP3DMessage* msg); void ESP115(int cmd_params_pos, ESP3DMessage* msg); #endif // WIFI_FEATURE || BLUETOOTH_FEATURE || ETH_FEATURE +#if defined(ETH_FEATURE) + void ESP116(int cmd_params_pos, ESP3DMessage* msg); + void ESP117(int cmd_params_pos, ESP3DMessage* msg); + void ESP118(int cmd_params_pos, ESP3DMessage* msg); +#endif // ETH_FEATURE #if defined(HTTP_FEATURE) void ESP120(int cmd_params_pos, ESP3DMessage* msg); void ESP121(int cmd_params_pos, ESP3DMessage* msg); diff --git a/esp3d/src/core/esp3d_hal.cpp b/esp3d/src/core/esp3d_hal.cpp index f077c4de..7d2a2792 100644 --- a/esp3d/src/core/esp3d_hal.cpp +++ b/esp3d/src/core/esp3d_hal.cpp @@ -34,9 +34,13 @@ #endif // __has_include ("rtc_wdt.h") #endif // CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 #include -#include +#include +#include #include + +#if !CONFIG_IDF_TARGET_ESP32C6 #include +#endif // !CONFIG_IDF_TARGET_ESP32C6 TaskHandle_t ESP3DHal::xHandle = nullptr; #endif // ARDUINO_ARCH_ESP32 @@ -135,10 +139,7 @@ void ESP3DHal::analogRange(uint32_t range) { // Setup bool ESP3DHal::begin() { -#if defined(ARDUINO_ARCH_ESP32) && defined(CAMERA_DEVICE) - esp3d_log("Disable brown out"); - WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // disable brownout detector -#endif // ARDUINO_ARCH_ESP32 && CAMERA_DEVICE + checkTWDT(); // Clear all wifi state WiFi.persistent(false); WiFi.disconnect(true); @@ -160,47 +161,61 @@ bool ESP3DHal::begin() { // End ESP3D void ESP3DHal::end() {} +void ESP3DHal::checkTWDT() { + // ESP32-C6 Seems not working with esp_task_wdt_reset() + // I itinitally though it was wrong initialization of TWDT + // doing esp_task_wdt_init() is not working + // but esp_task_wdt_reconfigure() is working + // unfortunately it is still not working with esp_task_wdt_reset() + // so because doing esp_task_wdt_reconfigure and not do not change the + // behavior so I comment it for now as note Instead I use vTaskDelay(1) to + // feed the WDT and seems ok delay(1) seems also ok + /* + #if CONFIG_IDF_TARGET_ESP32C6 + //ESP32-C6 + esp_err_t err = esp_task_wdt_status(NULL); + if (err == ESP_ERR_NOT_FOUND) { + esp3d_log_e("WDT was never initialized"); + esp_task_wdt_config_t twdt_config = { + .timeout_ms = 2 * 1000, + .idle_core_mask = (1 << 0), + .trigger_panic = true, + }; + err = esp_task_wdt_reconfigure(&twdt_config); + if (err == ESP_ERR_INVALID_STATE) { + esp3d_log_e("WDT already initialized"); + } else if (err != ESP_OK) { + esp3d_log_e("WDT cannot be setup"); + } else { + esp3d_log("WDT setup ok"); + } + } + #endif // CONFIG_IDF_TARGET_ESP32C6 + */ +} + // Watchdog feeder void ESP3DHal::wdtFeed() { +#ifdef ARDUINO_ARCH_ESP32 + vTaskDelay(1); + return; +#endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 ESP.wdtFeed(); #endif // ARDUINO_ARCH_ESP8266 -#ifdef ARDUINO_ARCH_ESP32 - static uint64_t lastYield = 0; - uint64_t now = millis(); - if ((now - lastYield) > 2000) { - lastYield = now; - vTaskDelay(5); // delay 1 RTOS tick - } -#if !defined(DISABLE_WDT_ESP3DLIB_TASK) && !defined(DISABLE_WDT_CORE_0) -#if CONFIG_IDF_TARGET_ESP32 - // FIXME: not implemented - rtc_wdt_feed(); -#endif // CONFIG_IDF_TARGET_ESP32S2 -#endif //! defined(DISABLE_WDT_ESP3DLIB_TASK) && !defined(DISABLE_WDT_CORE_0) -#ifndef DISABLE_WDT_ESP3DLIB_TASK - if (xHandle && esp_task_wdt_status(xHandle) == ESP_OK) { - if (esp_task_wdt_reset() != ESP_OK) { - esp3d_log_e("WDT Reset failed"); - } - } -#endif // DISABLE_WDT_ESP3DLIB_TASK -#endif // ARDUINO_ARCH_ESP32 } // wait function void ESP3DHal::wait(uint32_t milliseconds) { -#if defined(ASYNCWEBSERVER) + #ifdef ARDUINO_ARCH_ESP32 uint32_t timeout = millis(); while ((millis() - timeout) < milliseconds) { wdtFeed(); } -#else // !(ASYNCWEBSERVER - wdtFeed(); - // before 0 was acceptable, now it seems need to put 5 to have some effect if - // on esp32 core 0 - delay(milliseconds < 5 ? 5 : milliseconds); -#endif // !ASYNCWEBSERVER +#endif // CONFIG_IDF_TARGET_ESP32 +#ifdef ARDUINO_ARCH_ESP8266 +delay(milliseconds); +#endif // ARDUINO_ARCH_ESP8266 } uint16_t ESP3DHal::getChipID() { diff --git a/esp3d/src/core/esp3d_hal.h b/esp3d/src/core/esp3d_hal.h index b505f6e5..da59ea0c 100644 --- a/esp3d/src/core/esp3d_hal.h +++ b/esp3d/src/core/esp3d_hal.h @@ -49,6 +49,7 @@ class ESP3DHal { static void analogWriteFreq(uint32_t freq); static void analogRange(uint32_t range); static const char * arduinoVersion(); + static void checkTWDT(); #if defined(ARDUINO_ARCH_ESP32) static TaskHandle_t xHandle; #endif // ARDUINO_ARCH_ESP32 diff --git a/esp3d/src/core/esp3d_message.cpp b/esp3d/src/core/esp3d_message.cpp index f3b48daa..bd7e7e41 100644 --- a/esp3d/src/core/esp3d_message.cpp +++ b/esp3d/src/core/esp3d_message.cpp @@ -24,28 +24,67 @@ ESP3DRequest no_id{.id = 0}; +ESP3DMessageManager esp3d_message_manager; + +ESP3DMessageManager::ESP3DMessageManager() { + _mutex = xSemaphoreCreateMutex(); #if defined(ESP_LOG_FEATURE) -int msg_counting = 0; + _msg_counting = 0; #endif // ESP_LOG_FEATURE +} + +ESP3DMessageManager::~ESP3DMessageManager() { vSemaphoreDelete(_mutex); } bool ESP3DMessageManager::deleteMsg(ESP3DMessage* message) { - if (!message) return false; + esp3d_log("Delete msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + bool result = _deleteMsg(message); + xSemaphoreGive(_mutex); + esp3d_log("Delete msg done"); + return result; + } else { + esp3d_log_e("Mutex not taken"); + } + return false; +} + +bool ESP3DMessageManager::_deleteMsg(ESP3DMessage* message) { + esp3d_log("_Delete msg"); + if (!message) { + esp3d_log_e("Message is null"); + return false; + } if (message->data) { + esp3d_log("Free data"); free(message->data); } free(message); message = NULL; #if defined(ESP_LOG_FEATURE) - esp3d_log("Deletion : Now we have %ld msg", --msg_counting); + esp3d_log("Deletion : Now we have %ld msg", --_msg_counting); #endif // ESP_LOG_FEATURE return true; } ESP3DMessage* ESP3DMessageManager::newMsg() { + esp3d_log("New msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = nullptr; + newMsgPtr = _newMsg(); + xSemaphoreGive(_mutex); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_newMsg() { + esp3d_log("_New msg"); ESP3DMessage* newMsgPtr = (ESP3DMessage*)malloc(sizeof(ESP3DMessage)); if (newMsgPtr) { #if defined(ESP_LOG_FEATURE) - esp3d_log("Creation : Now we have %ld msg", ++msg_counting); + esp3d_log("Creation : Now we have %ld msg", ++_msg_counting); #endif // ESP_LOG_FEATURE newMsgPtr->data = nullptr; newMsgPtr->size = 0; @@ -57,45 +96,113 @@ ESP3DMessage* ESP3DMessageManager::newMsg() { } else { esp3d_log_e("Out of memory"); } + esp3d_log("Message created"); return newMsgPtr; } ESP3DMessage* ESP3DMessageManager::newMsg(ESP3DRequest requestId) { - ESP3DMessage* newMsgPtr = newMsg(); + esp3d_log("New msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = nullptr; + newMsgPtr = _newMsg(requestId); + xSemaphoreGive(_mutex); + esp3d_log("New msg done"); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_newMsg(ESP3DRequest requestId) { + esp3d_log("_New msg"); + ESP3DMessage* newMsgPtr = _newMsg(); if (newMsgPtr) { + esp3d_log("New msg done"); newMsgPtr->origin = ESP3DClientType::command; newMsgPtr->request_id = requestId; + } else { + esp3d_log_e("newMsgPtr is null"); } return newMsgPtr; } bool ESP3DMessageManager::copyMsgInfos(ESP3DMessage* newMsgPtr, ESP3DMessage msg) { + esp3d_log("Copy msg infos"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + bool result = _copyMsgInfos(newMsgPtr, msg); + xSemaphoreGive(_mutex); + esp3d_log("Copy msg infos done"); + return result; + } else { + esp3d_log_e("Mutex not taken"); + } + return NULL; +} + +bool ESP3DMessageManager::_copyMsgInfos(ESP3DMessage* newMsgPtr, + ESP3DMessage msg) { + esp3d_log("_Copy msg infos"); if (!newMsgPtr) { + esp3d_log_e("newMsgPtr is null"); return false; } + esp3d_log("Copying msg infos"); newMsgPtr->origin = msg.origin; newMsgPtr->target = msg.target; newMsgPtr->authentication_level = msg.authentication_level; newMsgPtr->request_id = msg.request_id; newMsgPtr->type = msg.type; + return true; } ESP3DMessage* ESP3DMessageManager::copyMsgInfos(ESP3DMessage msg) { - ESP3DMessage* newMsgPtr = newMsg(); + esp3d_log("Copy msg infos"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = _copyMsgInfos(msg); + xSemaphoreGive(_mutex); + esp3d_log("Copy msg infos done"); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_copyMsgInfos(ESP3DMessage msg) { + esp3d_log("_Copy msg infos"); + ESP3DMessage* newMsgPtr = _newMsg(); if (newMsgPtr) { - copyMsgInfos(newMsgPtr, msg); + _copyMsgInfos(newMsgPtr, msg); + } else { + esp3d_log_e("newMsg is null"); } return newMsgPtr; } ESP3DMessage* ESP3DMessageManager::copyMsg(ESP3DMessage msg) { - ESP3DMessage* newMsgPtr = newMsg(msg.origin, msg.target, msg.data, msg.size, - msg.authentication_level); + esp3d_log("Copy msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = _copyMsg(msg); + xSemaphoreGive(_mutex); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_copyMsg(ESP3DMessage msg) { + esp3d_log("_Copy msg"); + ESP3DMessage* newMsgPtr = _newMsg(msg.origin, msg.target, msg.data, msg.size, + msg.authentication_level); if (newMsgPtr) { newMsgPtr->request_id = msg.request_id; newMsgPtr->type = msg.type; + } else { + esp3d_log_e("newMsgPtr is null"); } return newMsgPtr; } @@ -103,15 +210,36 @@ ESP3DMessage* ESP3DMessageManager::copyMsg(ESP3DMessage msg) { ESP3DMessage* ESP3DMessageManager::newMsg( ESP3DClientType origin, ESP3DClientType target, const uint8_t* data, size_t length, ESP3DAuthenticationLevel authentication_level) { - ESP3DMessage* newMsgPtr = newMsg(origin, target, authentication_level); + esp3d_log("New msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = + _newMsg(origin, target, data, length, authentication_level); + xSemaphoreGive(_mutex); + esp3d_log("New msg done"); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_newMsg( + ESP3DClientType origin, ESP3DClientType target, const uint8_t* data, + size_t length, ESP3DAuthenticationLevel authentication_level) { + ESP3DMessage* newMsgPtr = _newMsg(origin, target, authentication_level); + esp3d_log("_New msg"); if (newMsgPtr) { - if (!setDataContent(newMsgPtr, data, length)) { - deleteMsg(newMsgPtr); + if (!_setDataContent(newMsgPtr, data, length)) { + _deleteMsg(newMsgPtr); newMsgPtr = nullptr; esp3d_log_e("newMsg failed for origin %d, target %d, data %s", (uint8_t)origin, (uint8_t)target, data ? (char*)data : "null"); + } else { + esp3d_log("Message created"); } + } else { + esp3d_log_e("newMsgPtr is null"); } return newMsgPtr; } @@ -119,17 +247,51 @@ ESP3DMessage* ESP3DMessageManager::newMsg( ESP3DMessage* ESP3DMessageManager::newMsg( ESP3DClientType origin, ESP3DClientType target, ESP3DAuthenticationLevel authentication_level) { - ESP3DMessage* newMsgPtr = newMsg(); + esp3d_log("New msg"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + ESP3DMessage* newMsgPtr = _newMsg(origin, target, authentication_level); + xSemaphoreGive(_mutex); + esp3d_log("New msg done"); + return newMsgPtr; + } else { + esp3d_log_e("Mutex not taken"); + } + return nullptr; +} + +ESP3DMessage* ESP3DMessageManager::_newMsg( + ESP3DClientType origin, ESP3DClientType target, + ESP3DAuthenticationLevel authentication_level) { + esp3d_log("_New msg"); + ESP3DMessage* newMsgPtr = _newMsg(); if (newMsgPtr) { newMsgPtr->origin = origin; newMsgPtr->target = target; newMsgPtr->authentication_level = authentication_level; + } else { + esp3d_log_e("newMsgPtr is null"); } + esp3d_log("_New msg done"); return newMsgPtr; } bool ESP3DMessageManager::setDataContent(ESP3DMessage* msg, const uint8_t* data, size_t length) { + esp3d_log("Set data content"); + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + bool result = _setDataContent(msg, data, length); + xSemaphoreGive(_mutex); + esp3d_log("Set data content done"); + return result; + } else { + esp3d_log_e("Mutex not taken"); + } + return false; +} + +bool ESP3DMessageManager::_setDataContent(ESP3DMessage* msg, + const uint8_t* data, size_t length) { + esp3d_log("_Set data content"); if (!msg) { esp3d_log_e("no valid msg container"); return false; diff --git a/esp3d/src/core/esp3d_message.h b/esp3d/src/core/esp3d_message.h index 253c30c0..d0d081ec 100644 --- a/esp3d/src/core/esp3d_message.h +++ b/esp3d/src/core/esp3d_message.h @@ -25,8 +25,7 @@ #define ESP_STATE_DISCONNECTED 0 -#ifndef _ESP3DOUTPUT_H -#define _ESP3DOUTPUT_H +#pragma once #include "../include/esp3d_config.h" @@ -43,6 +42,23 @@ class WebServer; #include "../modules/authentication/authentication_level_types.h" #include "esp3d_client_types.h" +#if defined(ARDUINO_ARCH_ESP32) +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#endif // ARDUINO_ARCH_ESP32 + +#if defined(ARDUINO_ARCH_ESP8266) +//To avoid compilation error on ESP8266 +// and to use many ifdefs +#ifndef pdTRUE +#define pdTRUE true +#define xSemaphoreTake(A, B) true +#define xSemaphoreGive(A) +#define xSemaphoreCreateMutex(A) 0 +#define vSemaphoreDelete(A) +#define SemaphoreHandle_t void* +#endif //pdTRUE +#endif //ESP8266 enum class ESP3DMessageType : uint8_t { head, core, tail, unique }; @@ -68,21 +84,44 @@ struct ESP3DMessage { class ESP3DMessageManager final { public: - static ESP3DMessage *newMsg(); - static ESP3DMessage *newMsg(ESP3DRequest requestId); - static bool deleteMsg(ESP3DMessage *message); - static bool copyMsgInfos(ESP3DMessage *newMsgPtr, ESP3DMessage msg); - static ESP3DMessage *copyMsgInfos(ESP3DMessage msg); - static ESP3DMessage *copyMsg(ESP3DMessage msg); - static ESP3DMessage *newMsg(ESP3DClientType origin, ESP3DClientType target, - const uint8_t *data, size_t length, - ESP3DAuthenticationLevel authentication_level = - ESP3DAuthenticationLevel::guest); - static ESP3DMessage *newMsg(ESP3DClientType origin, ESP3DClientType target, - ESP3DAuthenticationLevel authentication_level = - ESP3DAuthenticationLevel::guest); - static bool setDataContent(ESP3DMessage *msg, const uint8_t *data, - size_t length); + ESP3DMessageManager(); + ~ESP3DMessageManager(); + ESP3DMessage *newMsg(); + ESP3DMessage *newMsg(ESP3DRequest requestId); + bool deleteMsg(ESP3DMessage *message); + bool copyMsgInfos(ESP3DMessage *newMsgPtr, ESP3DMessage msg); + ESP3DMessage *copyMsgInfos(ESP3DMessage msg); + + ESP3DMessage *copyMsg(ESP3DMessage msg); + + ESP3DMessage *newMsg(ESP3DClientType origin, ESP3DClientType target, + const uint8_t *data, size_t length, + ESP3DAuthenticationLevel authentication_level = + ESP3DAuthenticationLevel::guest); + ESP3DMessage *newMsg(ESP3DClientType origin, ESP3DClientType target, + ESP3DAuthenticationLevel authentication_level = + ESP3DAuthenticationLevel::guest); + bool setDataContent(ESP3DMessage *msg, const uint8_t *data, size_t length); + + private: + bool _deleteMsg(ESP3DMessage *message); + ESP3DMessage *_newMsg(); + ESP3DMessage *_newMsg(ESP3DRequest requestId); + bool _copyMsgInfos(ESP3DMessage *newMsgPtr, ESP3DMessage msg); + ESP3DMessage *_copyMsgInfos(ESP3DMessage msg); + ESP3DMessage *_copyMsg(ESP3DMessage msg); + ESP3DMessage *_newMsg(ESP3DClientType origin, ESP3DClientType target, + const uint8_t *data, size_t length, + ESP3DAuthenticationLevel authentication_level = + ESP3DAuthenticationLevel::guest); + ESP3DMessage *_newMsg(ESP3DClientType origin, ESP3DClientType target, + ESP3DAuthenticationLevel authentication_level = + ESP3DAuthenticationLevel::guest); + bool _setDataContent(ESP3DMessage *msg, const uint8_t *data, size_t length); + SemaphoreHandle_t _mutex; +#if defined(ESP_LOG_FEATURE) + int _msg_counting; +#endif // ESP_LOG_FEATURE }; -#endif //_ESP3DOUTPUT_H +extern ESP3DMessageManager esp3d_message_manager; \ No newline at end of file diff --git a/esp3d/src/core/esp3d_messageFifo.h b/esp3d/src/core/esp3d_messageFifo.h index e3dd7c3a..6d2eb013 100644 --- a/esp3d/src/core/esp3d_messageFifo.h +++ b/esp3d/src/core/esp3d_messageFifo.h @@ -1,5 +1,5 @@ /* - esp3d_messageFifo.h - class for handeling message + esp3d_messageFifo.h - class for managing messages list, thread safe Copyright (c) 2014 Luc Lebosse. All rights reserved. @@ -19,77 +19,149 @@ */ #if !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_ESP8285) -#include "esp3d_message.h" -#include "../include/esp3d_config.h" #include #include + +#include "../include/esp3d_config.h" +#include "esp3d_message.h" +#if defined(ARDUINO_ARCH_ESP32) #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" +#endif // ARDUINO_ARCH_ESP32 + +#if defined(ARDUINO_ARCH_ESP8266) +// To avoid compilation error on ESP8266 +// and to use many ifdefs +#ifndef pdTRUE +#define pdTRUE true +#define xSemaphoreTake(A, B) true +#define xSemaphoreGive(A) +#define xSemaphoreCreateMutex(A) 0 +#define vSemaphoreDelete(A) +#define SemaphoreHandle_t void* +#endif // pdTRUE +#endif // ESP8266 class ESP3DMessageFIFO { -public: - ESP3DMessageFIFO(size_t maxSize = 5) : maxSize(maxSize) { - mutex = xSemaphoreCreateMutex(); - } + public: + ESP3DMessageFIFO(size_t maxSize = 5) { + _mutex = xSemaphoreCreateMutex(); + _maxSize = maxSize; + } - ~ESP3DMessageFIFO() { - clear(); - vSemaphoreDelete(mutex); - } + ~ESP3DMessageFIFO() { + clear(); + vSemaphoreDelete(_mutex); + } + void setId(String id) { _id = id; } + String getId() { return _id; } - void push(ESP3DMessage* message) { - xSemaphoreTake(mutex, portMAX_DELAY); - if (fifo.size() >= maxSize) { - ESP3DMessage* oldestMessage = fifo.front(); - fifo.pop(); - ESP3DMessageManager::deleteMsg(oldestMessage); + void setMaxSize(size_t maxSize) { _maxSize = maxSize; } + size_t getMaxSize() { return _maxSize; } + + void push(ESP3DMessage* message) { + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + esp3d_log("push to list [%s] size: %d", _id.c_str(), fifo.size()); + if (fifo.size() >= _maxSize && _maxSize != 0) { + esp3d_log("remove oldest message to make room for new one"); + ESP3DMessage* oldestMessage = fifo.front(); + fifo.pop(); + esp3d_message_manager.deleteMsg(oldestMessage); + esp3d_log("oldest message removed, list [%s] size: %d", _id.c_str(), + fifo.size()); + } + fifo.push(message); + esp3d_log("push to list [%s] size: %d", _id.c_str(), fifo.size()); + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("push to list [%s] failed, list size: %d", _id.c_str(), + fifo.size()); + esp3d_log_e("Delete message"); + esp3d_message_manager.deleteMsg(message); + } + } + + ESP3DMessage* pop() { + ESP3DMessage* message = nullptr; + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + if (!fifo.empty()) { + esp3d_log("pop from list [%s] size: %d", _id.c_str(), fifo.size()); + message = fifo.front(); + fifo.pop(); + esp3d_log("Now list [%s] size: %d", _id.c_str(), fifo.size()); + esp3d_log("Message: %s", (const char*)message->data); + } + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("pop from list [%s] failed, list size: %d", _id.c_str(), + fifo.size()); + } + return message; + } + + bool isEmpty() { + bool empty = true; + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + empty = fifo.empty(); + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("Mutex not taken"); + } + return empty; + } + + size_t size() { + size_t s = 0; + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + s = fifo.size(); + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("Mutex not taken"); + } + return s; + } + + void clear() { + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + while (!fifo.empty()) { + ESP3DMessage* message = fifo.front(); + fifo.pop(); + esp3d_message_manager.deleteMsg(message); + } + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("Mutex not taken"); + } + } + + bool applyToEach(std::function fn, + bool stopOnFalse = true) { + bool result = false; + if (xSemaphoreTake(_mutex, portMAX_DELAY) == pdTRUE) { + result = true; + size_t size = fifo.size(); + for (size_t i = 0; i < size; ++i) { + ESP3DMessage* message = fifo.front(); + bool result = fn(message); + fifo.pop(); + if (!result && stopOnFalse) { + result = false; + break; } - fifo.push(message); - xSemaphoreGive(mutex); + } + xSemaphoreGive(_mutex); + } else { + esp3d_log_e("Mutex not taken"); } + return result; + } - ESP3DMessage* pop() { - ESP3DMessage* message = nullptr; - xSemaphoreTake(mutex, portMAX_DELAY); - if (!fifo.empty()) { - message = fifo.front(); - fifo.pop(); - } - xSemaphoreGive(mutex); - return message; - } - - bool isEmpty() { - bool empty; - xSemaphoreTake(mutex, portMAX_DELAY); - empty = fifo.empty(); - xSemaphoreGive(mutex); - return empty; - } - - size_t size() { - size_t s; - xSemaphoreTake(mutex, portMAX_DELAY); - s = fifo.size(); - xSemaphoreGive(mutex); - return s; - } - - void clear() { - xSemaphoreTake(mutex, portMAX_DELAY); - while (!fifo.empty()) { - ESP3DMessage* message = fifo.front(); - fifo.pop(); - ESP3DMessageManager::deleteMsg(message); - } - xSemaphoreGive(mutex); - } - -private: - std::queue fifo; - SemaphoreHandle_t mutex; - const size_t maxSize; + private: + std::queue fifo; + SemaphoreHandle_t _mutex; + size_t _maxSize; + String _id; }; -#endif // !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_ESP8285) \ No newline at end of file +#endif // !defined(ARDUINO_ARCH_ESP8266) && !defined(ARDUINO_ARCH_ESP8285) \ No newline at end of file diff --git a/esp3d/src/core/esp3d_settings.cpp b/esp3d/src/core/esp3d_settings.cpp index f205e671..754ebe36 100644 --- a/esp3d/src/core/esp3d_settings.cpp +++ b/esp3d/src/core/esp3d_settings.cpp @@ -75,6 +75,12 @@ #define MIN_SERVER_ADDRESS_LENGTH 0 // default byte values +#ifdef ETH_FEATURE +#define DEFAULT_ETH_STA_FALLBACK_MODE STRING(ESP_NO_NETWORK) +#else +#define DEFAULT_ETH_STA_FALLBACK_MODE STRING(ESP_NO_NETWORK) +#endif // ETH_FEATURE + #ifdef WIFI_FEATURE #define DEFAULT_STA_FALLBACK_MODE STRING(ESP_AP_SETUP) #if defined(STATION_WIFI_SSID) && defined(STATION_WIFI_PASSWORD) @@ -192,6 +198,12 @@ uint16_t ESP3DSettingsData[] = {ESP_RADIO_MODE, ESP_STA_DNS_VALUE, ESP_AP_IP_VALUE, ESP_STA_IP_MODE, + ESP_ETH_STA_FALLBACK_MODE, + ESP_ETH_STA_IP_VALUE, + ESP_ETH_STA_GATEWAY_VALUE, + ESP_ETH_STA_MASK_VALUE, + ESP_ETH_STA_DNS_VALUE, + ESP_ETH_STA_IP_MODE, ESP_SETTINGS_VERSION, ESP_NOTIFICATION_TYPE, ESP_CALIBRATION, @@ -240,7 +252,6 @@ uint16_t ESP3DSettingsData[] = {ESP_RADIO_MODE, ESP_FTP_DATA_PASSIVE_PORT, ESP_WEBDAV_PORT, ESP_SERIAL_BRIDGE_BAUD - }; #if defined(SD_DEVICE) const uint8_t SupportedSPIDivider[] = {1, 2, 4, 6, 8, 16, 32}; @@ -714,6 +725,8 @@ const char *ESP3DSettings::TargetBoard() { #define TYPE_BOARD "ESP32-S3" #elif CONFIG_IDF_TARGET_ESP32C3 #define TYPE_BOARD "ESP32-C3" +#elif CONFIG_IDF_TARGET_ESP32C6 +#define TYPE_BOARD "ESP32-C6" #endif #ifdef BOARD_HAS_PSRAM #define IS_PSRAM " (PSRAM)" @@ -960,12 +973,19 @@ bool ESP3DSettings::isValidByteSetting(uint8_t value, return true; } break; +#ifdef ETH_FEATURE + case ESP_ETH_STA_IP_MODE: + if (value == DHCP_MODE || value == STATIC_IP_MODE) { + return true; + } + break; +#endif // ETH_FEATURE +#if defined(WIFI_FEATURE) case ESP_STA_IP_MODE: if (value == DHCP_MODE || value == STATIC_IP_MODE) { return true; } break; -#if defined(WIFI_FEATURE) case ESP_AP_CHANNEL: for (uint8_t i = 0; i < SupportedApChannelsSize; i++) { if (value == SupportedApChannels[i]) { @@ -1012,11 +1032,9 @@ bool ESP3DSettings::isValidByteSetting(uint8_t value, // 0 means no timeout so it is ok to have 0 return true; break; - case ESP_STA_FALLBACK_MODE: +#ifdef ETH_FEATURE + case ESP_ETH_STA_FALLBACK_MODE: if (value == ESP_NO_NETWORK -#if defined(WIFI_FEATURE) - || value == ESP_AP_SETUP -#endif // WIFI_FEATURE #if defined(BT_FEATURE) || value == ESP_BT #endif // BT_FEATURE @@ -1024,7 +1042,20 @@ bool ESP3DSettings::isValidByteSetting(uint8_t value, return true; } break; +#endif // ETH_FEATURE +#if defined(WIFI_FEATURE) + case ESP_STA_FALLBACK_MODE: + if (value == ESP_NO_NETWORK + || value == ESP_AP_SETUP +#if defined(BT_FEATURE) + || value == ESP_BT +#endif // BT_FEATURE + ) { + return true; + } + break; +#endif // WIFI_FEATURE default: return false; } @@ -1117,8 +1148,10 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( case ESP_SECURE_SERIAL: case ESP_BOOT_RADIO_STATE: case ESP_STA_FALLBACK_MODE: + case ESP_ETH_STA_FALLBACK_MODE: case ESP_SERIAL_BRIDGE_ON: case ESP_STA_IP_MODE: + case ESP_ETH_STA_IP_MODE: setting.type = ESP3DSettingType::byte_t; // byte break; @@ -1144,6 +1177,10 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( case ESP_STA_GATEWAY_VALUE: case ESP_STA_MASK_VALUE: case ESP_STA_DNS_VALUE: + case ESP_ETH_STA_IP_VALUE: + case ESP_ETH_STA_GATEWAY_VALUE: + case ESP_ETH_STA_MASK_VALUE: + case ESP_ETH_STA_DNS_VALUE: case ESP_AP_IP_VALUE: setting.type = ESP3DSettingType::ip_t; // ip = 4 bytes @@ -1197,11 +1234,17 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( case ESP_WEBDAV_ON: case ESP_SECURE_SERIAL: case ESP_BOOT_RADIO_STATE: + case ESP_ETH_STA_FALLBACK_MODE: case ESP_STA_FALLBACK_MODE: case ESP_SERIAL_BRIDGE_ON: + case ESP_ETH_STA_IP_MODE: case ESP_STA_IP_MODE: setting.size = 1; // 1 byte break; + case ESP_ETH_STA_IP_VALUE: + case ESP_ETH_STA_GATEWAY_VALUE: + case ESP_ETH_STA_MASK_VALUE: + case ESP_ETH_STA_DNS_VALUE: case ESP_STA_IP_VALUE: case ESP_STA_GATEWAY_VALUE: case ESP_STA_MASK_VALUE: @@ -1278,6 +1321,8 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( // default value of setting in string switch (index) { + + case ESP_ETH_STA_IP_MODE: case ESP_STA_IP_MODE: setting.default_val = DEFAULT_STA_IP_MODE; break; @@ -1350,6 +1395,9 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( case ESP_BOOT_RADIO_STATE: setting.default_val = DEFAULT_BOOT_RADIO_STATE; break; + case ESP_ETH_STA_FALLBACK_MODE: + setting.default_val = DEFAULT_ETH_STA_FALLBACK_MODE; + break; case ESP_STA_FALLBACK_MODE: setting.default_val = DEFAULT_STA_FALLBACK_MODE; break; @@ -1401,15 +1449,19 @@ const ESP3DSettingDescription *ESP3DSettings::getSettingPtr( case ESP_TIME_ZONE: setting.default_val = DEFAULT_TIME_ZONE; break; + case ESP_ETH_STA_IP_VALUE: case ESP_STA_IP_VALUE: setting.default_val = DEFAULT_STA_IP_VALUE; break; + case ESP_ETH_STA_GATEWAY_VALUE: case ESP_STA_GATEWAY_VALUE: setting.default_val = DEFAULT_STA_GATEWAY_VALUE; break; + case ESP_ETH_STA_MASK_VALUE: case ESP_STA_MASK_VALUE: setting.default_val = DEFAULT_STA_MASK_VALUE; break; + case ESP_ETH_STA_DNS_VALUE: case ESP_STA_DNS_VALUE: setting.default_val = DEFAULT_STA_DNS_VALUE; break; diff --git a/esp3d/src/include/esp3d_defines.h b/esp3d/src/include/esp3d_defines.h index 0a00b157..8c54f2f3 100644 --- a/esp3d/src/include/esp3d_defines.h +++ b/esp3d/src/include/esp3d_defines.h @@ -119,7 +119,7 @@ typedef uint ESP3DSettingIndex; #define ESP_SETUP 1192 // 1 byte = flag // #define FREE 1193 // 1 byte = flag // #define FREE 1194 // 1 byte = flag -// #define FREE 1195 // 1 byte = flag +#define ESP_ETH_STA_FALLBACK_MODE 1195 // 1 byte = flag #define ESP_FTP_CTRL_PORT 1196 // 4 bytes = int #define ESP_FTP_DATA_ACTIVE_PORT 1200 // 4 bytes = int #define ESP_FTP_DATA_PASSIVE_PORT 1204 // 4 bytes = int @@ -133,9 +133,13 @@ typedef uint ESP3DSettingIndex; #define ESP_BOOT_RADIO_STATE 1221 // 1 byte = flag #define ESP_STA_FALLBACK_MODE 1222 // 1 byte = flag #define ESP_SERIAL_BRIDGE_ON 1223 // 1 byte = flag -// #define FREE 1224 // 1 byte = flag +#define ESP_ETH_STA_IP_MODE 1224 // 1 byte = flag #define ESP_SERIAL_BRIDGE_BAUD 1225 // 4 bytes= int #define ESP_TIME_ZONE 1229 // 7 bytes 6+1 = string +#define ESP_ETH_STA_IP_VALUE 1237 // 4 bytes xxx.xxx.xxx.xxx +#define ESP_ETH_STA_MASK_VALUE 1240 // 4 bytes xxx.xxx.xxx.xxx +#define ESP_ETH_STA_GATEWAY_VALUE 1244 // 4 bytes xxx.xxx.xxx.xxx +#define ESP_ETH_STA_DNS_VALUE 1248 // 4 bytes xxx.xxx.xxx.xxx // Hidden password #define HIDDEN_PASSWORD "********" @@ -313,14 +317,36 @@ typedef uint ESP3DSettingIndex; #define MODE_ETH_CLOCK_GPIO16_OUT 2 #define MODE_ETH_CLOCK_GPIO17_OUT 3 -// Ethernet type (Check ETH.h eth_phy_type_t) +// Ethernet type (Check ETH.h eth_phy_type_t because it enum with #ifdef CONFIG_....) #define TYPE_ETH_PHY_LAN8720 0 #define TYPE_ETH_PHY_TLK110 1 #define TYPE_ETH_PHY_RTL8201 2 #define TYPE_ETH_PHY_DP83848 3 -#define TYPE_ETH_PHY_DM9051 4 -#define TYPE_ETH_PHY_KSZ8041 5 -#define TYPE_ETH_PHY_KSZ8081 6 +#define TYPE_ETH_PHY_KSZ8041 4 +#define TYPE_ETH_PHY_KSZ8081 5 +#define TYPE_ETH_PHY_DM9051 6 +#define TYPE_ETH_PHY_W5500 7 +#define TYPE_ETH_PHY_KSZ8851 8 + +//SPI pis for ethernet +#ifndef ETH_PHY_CS +#define ETH_PHY_CS 15 +#endif // ETH_PHY_CS +#ifndef ETH_PHY_IRQ +#define ETH_PHY_IRQ 4 +#endif // ETH_PHY_IRQ +#ifndef ETH_PHY_RST +#define ETH_PHY_RST 5 +#endif // ETH_PHY_RST +#ifndef ETH_SPI_SCK +#define ETH_SPI_SCK 14 +#endif // ETH_SPI_SCK +#ifndef ETH_SPI_MISO +#define ETH_SPI_MISO 12 +#endif // ETH_SPI_MISO +#ifndef ETH_SPI_MOSI +#define ETH_SPI_MOSI 13 +#endif // ETH_SPI_MOSI // Host path #define ESP3D_HOST_PATH "/" diff --git a/esp3d/src/include/esp3d_sanity.h b/esp3d/src/include/esp3d_sanity.h index 55d66f16..55515783 100644 --- a/esp3d/src/include/esp3d_sanity.h +++ b/esp3d/src/include/esp3d_sanity.h @@ -77,8 +77,8 @@ /************************** * Bluetooth * ***********************/ -#if defined(BLUETOOTH_FEATURE) && defined(ARDUINO_ARCH_ESP8266) -#error Bluetooth is not available in ESP8266 +#if (defined(BLUETOOTH_FEATURE) && !defined(ARDUINO_ARCH_ESP32)) || (defined(BLUETOOTH_FEATURE) && (defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3) || defined(CONFIG_IDF_TARGET_ESP32C3))) +#error Bluetooth is only available for ESP32 #endif /************************** diff --git a/esp3d/src/modules/bluetooth/BT_service.cpp b/esp3d/src/modules/bluetooth/BT_service.cpp index a7b07961..55014c49 100644 --- a/esp3d/src/modules/bluetooth/BT_service.cpp +++ b/esp3d/src/modules/bluetooth/BT_service.cpp @@ -25,7 +25,7 @@ #ifdef BLUETOOTH_FEATURE #include "../../core/esp3d_commands.h" #include "../../core/esp3d_settings.h" -#include "../../esp3d_string.h" +#include "../../core/esp3d_string.h" #include "../network/netconfig.h" #include "BT_service.h" #include "BluetoothSerial.h" @@ -192,7 +192,7 @@ ESP3DAuthenticationLevel BTService::getAuthentication() { return _auth; } void BTService::flushbuffer() { _buffer[_buffer_size] = 0x0; // dispatch command - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::bluetooth, esp3d_commands.getOutputClient(), _buffer, _buffer_size, _auth); if (msg) { @@ -288,7 +288,7 @@ bool BTService::dispatch(ESP3DMessage *message) { if (sentcnt != message->size) { return false; } - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } diff --git a/esp3d/src/modules/camera/camera.cpp b/esp3d/src/modules/camera/camera.cpp index 4ccbe9d7..18914638 100644 --- a/esp3d/src/modules/camera/camera.cpp +++ b/esp3d/src/modules/camera/camera.cpp @@ -242,8 +242,10 @@ int Camera::command(const char *param, const char *value) { bool Camera::initHardware() { _initialised = false; + #if !(CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6) esp3d_log("Disable brown out"); WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); // disable brownout detector + #endif // !(CONFIG_IDF_TARGET_ESP32S3 || CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32C6) stopHardware(); camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; diff --git a/esp3d/src/modules/display/display.cpp b/esp3d/src/modules/display/display.cpp index e630015a..1dbcb092 100644 --- a/esp3d/src/modules/display/display.cpp +++ b/esp3d/src/modules/display/display.cpp @@ -52,7 +52,7 @@ bool Display::dispatch(ESP3DMessage* message) { break; } - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } return false; diff --git a/esp3d/src/modules/ethernet/ethconfig.cpp b/esp3d/src/modules/ethernet/ethconfig.cpp index 413a6e57..112d30be 100644 --- a/esp3d/src/modules/ethernet/ethconfig.cpp +++ b/esp3d/src/modules/ethernet/ethconfig.cpp @@ -29,62 +29,39 @@ #endif // ARDUINO_ARCH_ESP8266 #include "../../core/esp3d_commands.h" #include "../../core/esp3d_settings.h" +#include "../../core/esp3d_string.h" #include "../network/netconfig.h" #include "ethconfig.h" + +#if defined(GCODE_HOST_FEATURE) +#include "../gcode_host/gcode_host.h" +#endif // GCODE_HOST_FEATURE + bool EthConfig::_started = false; bool EthConfig::_connected = false; +uint8_t EthConfig::_ipMode = DHCP_MODE; const uint8_t DEFAULT_AP_MASK_VALUE[] = {255, 255, 255, 0}; bool EthConfig::StartSTA() { bool res = true; - if ((ESP3DSettings::readByte(ESP_STA_IP_MODE) != DHCP_MODE)) { - int32_t IP = ESP3DSettings::read_IP(ESP_STA_IP_VALUE); - int32_t GW = ESP3DSettings::read_IP(ESP_STA_GATEWAY_VALUE); - int32_t MK = ESP3DSettings::read_IP(ESP_STA_MASK_VALUE); - int32_t DNS = ESP3DSettings::read_IP(ESP_STA_DNS_VALUE); + if (_ipMode == STATIC_IP_MODE) { + int32_t IP = ESP3DSettings::read_IP(ESP_ETH_STA_IP_VALUE); + int32_t GW = ESP3DSettings::read_IP(ESP_ETH_STA_GATEWAY_VALUE); + int32_t MK = ESP3DSettings::read_IP(ESP_ETH_STA_MASK_VALUE); + int32_t DNS = ESP3DSettings::read_IP(ESP_ETH_STA_DNS_VALUE); IPAddress ip(IP), mask(MK), gateway(GW), dns(DNS); res = ETH.config(ip, gateway, mask, dns); } return res; } -/*bool EthConfig::StartSRV() -{ - bool res = true; - //static IP - int32_t IP = ESP3DSettings::read_IP(ESP_AP_IP_VALUE); - IPAddress ip(IP), mask(DEFAULT_AP_MASK_VALUE), gateway(IP); - if (!ETH.config(ip, gateway,mask)) { - res = false; - esp3d_log_e("Set static IP error"); - } - //start DHCP server - if(res) { - dhcps_lease_t lease; - lease.enable = true; - lease.start_ip.addr = static_cast(IP) + (1 << 24); - lease.end_ip.addr = static_cast(IP) + (11 << 24); - tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_ETH); - tcpip_adapter_dhcps_option( - (tcpip_adapter_option_mode_t)TCPIP_ADAPTER_OP_SET, - (tcpip_adapter_option_id_t)REQUESTED_IP_ADDRESS, - (void*)&lease, sizeof(dhcps_lease_t) - ); - if (tcpip_adapter_dhcps_start(TCPIP_ADAPTER_IF_ETH) != ESP_OK){ - res = false; - esp3d_log_e("Start DHCP server failed"); - } - } - return res; -}*/ +bool EthConfig::linkUp() { return _connected; } -bool EthConfig::linkUp() { -#if defined(ESP_IDF_VERSION_MAJOR) - // patch for https://github.com/espressif/arduino-esp32/issues/6105 - return _connected; -#else - return ETH.linkUp(); -#endif +uint8_t EthConfig::ipMode(bool fromsettings) { + if (fromsettings) { + _ipMode = (ESP3DSettings::readByte(ESP_ETH_STA_IP_MODE) != DHCP_MODE); + } + return _ipMode; } /** @@ -92,9 +69,33 @@ bool EthConfig::linkUp() { */ bool EthConfig::begin(int8_t& espMode) { bool res = false; - + ipMode(true); end(); - _started = ETH.begin(); + if (ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_LAN8720) { + esp3d_log_d("ETH PHY Type %d", ESP3D_ETH_PHY_TYPE); + _started = ETH.begin(); + } else { + if (ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_TLK110 || + ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_RTL8201 || + ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_DP83848 || + ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_KSZ8041 || + ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_KSZ8081) { + esp3d_log_d("ETH PHY Type %d", ESP3D_ETH_PHY_TYPE); + _started = ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_POWER, + ETH_PHY_MDC, ETH_PHY_MDIO, ETH_CLK_MODE); + } else { + if (ESP3D_ETH_PHY_TYPE == TYPE_ETH_PHY_W5500) { + esp3d_log_d("ETH spi PHY Type %d", ESP3D_ETH_PHY_TYPE); + SPI.begin(ETH_SPI_SCK, ETH_SPI_MISO, ETH_SPI_MOSI); + _started = ETH.begin(ETH_PHY_TYPE, ETH_PHY_ADDR, ETH_PHY_CS, + ETH_PHY_IRQ, ETH_PHY_RST, SPI); + } else { + esp3d_log("Ethernet PHY type not supported"); + return false; + } + } + } + if (_started) { if (ESP3DSettings::isVerboseBoot()) { esp3d_commands.dispatch("Starting ethernet", ESP3DClientType::all_clients, @@ -104,7 +105,7 @@ bool EthConfig::begin(int8_t& espMode) { } res = true; } else { - esp3d_commands.dispatch("Failed starting ethernet write failed", + esp3d_commands.dispatch("Failed starting ethernet failed", ESP3DClientType::all_clients, no_id, ESP3DMessageType::unique, ESP3DClientType::system, ESP3DAuthenticationLevel::admin); @@ -120,7 +121,7 @@ bool EthConfig::begin(int8_t& espMode) { ESP3DMessageType::unique, ESP3DClientType::system, ESP3DAuthenticationLevel::admin); } - espMode = ESP3DSettings::readByte(ESP_STA_FALLBACK_MODE); + espMode = ESP3DSettings::readByte(ESP_ETH_STA_FALLBACK_MODE); res = true; } else { if (ESP3DSettings::isVerboseBoot()) { @@ -130,20 +131,9 @@ bool EthConfig::begin(int8_t& espMode) { ESP3DAuthenticationLevel::admin); } } - - } else { - // if(!StartSRV()){ - // res = false; - // - // } else { - // - // } } - - // if ((ESP3DSettings::readByte(ESP_STA_IP_MODE) != DHCP_MODE) || (espMode - // == ESP_ETH_SRV)){ - if ((ESP3DSettings::readByte(ESP_STA_IP_MODE) != DHCP_MODE)) { - // as no event to display static IP + // Static IP or DHCP client ? + if ((ESP3DSettings::readByte(ESP_ETH_STA_IP_MODE) != DHCP_MODE)) { esp3d_commands.dispatch(ETH.localIP().toString().c_str(), ESP3DClientType::all_clients, no_id, ESP3DMessageType::unique, ESP3DClientType::system, @@ -158,8 +148,10 @@ bool EthConfig::begin(int8_t& espMode) { */ void EthConfig::end() { - // esp_eth_disable(); + // ETH.end(); _started = false; + _ipMode = DHCP_MODE; + _connected = false; } bool EthConfig::started() { return _started; } diff --git a/esp3d/src/modules/ethernet/ethconfig.h b/esp3d/src/modules/ethernet/ethconfig.h index 69040d08..de5aae8b 100644 --- a/esp3d/src/modules/ethernet/ethconfig.h +++ b/esp3d/src/modules/ethernet/ethconfig.h @@ -55,12 +55,13 @@ class EthConfig { static void handle(); static bool started(); static void setConnected(bool connected) { _connected = connected; } - + static uint8_t ipMode(bool fromsettings = false); static bool linkUp(); private: static bool _started; static bool _connected; + static uint8_t _ipMode; }; #endif //_ETH_CONFIG_H diff --git a/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp32.cpp b/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp32.cpp index 4a1c7af2..fae399ca 100644 --- a/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp32.cpp +++ b/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp32.cpp @@ -127,27 +127,11 @@ uint8_t ESP_SD::getState(bool refresh) { ESP_SD_MOSI_PIN != -1 ? ESP_SD_MOSI_PIN : MOSI, ESP_SD_SCK_PIN != -1 ? ESP_SD_SCK_PIN : SCK); // refresh content if card was removed -#if !(defined(ESP_SD_DETECT_PIN) && ESP_SD_DETECT_PIN != -1) - if (xPortGetCoreID() == 0) { - disableCore0WDT(); - } else { - disableCore1WDT(); - } -#endif // !(defined(ESP_SD_DETECT_PIN) if (SD.begin((ESP_SD_CS_PIN == -1) ? SS : ESP_SD_CS_PIN, SD_SCK_MHZ(FREQMZ / _spi_speed_divider))) { - csd_t m_csd; - if (SD.card()->readCSD(&m_csd) && sdCardCapacity(&m_csd) > 0) { _state = ESP_SDCARD_IDLE; - } } -#if !(defined(ESP_SD_DETECT_PIN) && ESP_SD_DETECT_PIN != -1) - if (xPortGetCoreID() == 0) { - enableCore0WDT(); - } else { - enableCore1WDT(); - } -#endif // !(defined(ESP_SD_DETECT_PIN) + return _state; } diff --git a/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp8266.cpp b/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp8266.cpp index 506e4e1b..15927a83 100644 --- a/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp8266.cpp +++ b/esp3d/src/modules/filesystem/sd/sd_sdfat2_esp8266.cpp @@ -123,12 +123,7 @@ uint8_t ESP_SD::getState(bool refresh) { if (SD.begin((ESP_SD_CS_PIN == -1) ? SS : ESP_SD_CS_PIN, SD_SCK_HZ(F_CPU / _spi_speed_divider))) { esp3d_log("Init SD State ok"); - csd_t m_csd; - if (SD.card()->readCSD(&m_csd) && sdCardCapacity(&m_csd) > 0) { - _state = ESP_SDCARD_IDLE; - } else { - esp3d_log_e("Cannot get card size"); - } + _state = ESP_SDCARD_IDLE; } else { esp3d_log_e("Init SD State failed"); } @@ -463,6 +458,9 @@ ESP_SDFile::ESP_SDFile(void* handle, bool isdir, bool iswritemode, } // todo need also to add short filename const char* ESP_SDFile::shortname() const { + #if SDFAT_FILE_TYPE != 1 + return _name.c_str(); +#else static char sname[13]; File ftmp = SD.open(_filename.c_str()); if (ftmp) { @@ -475,6 +473,7 @@ const char* ESP_SDFile::shortname() const { } else { return _name.c_str(); } +#endif } void ESP_SDFile::close() { diff --git a/esp3d/src/modules/ftp/FtpServer.h b/esp3d/src/modules/ftp/FtpServer.h index 5f8b058e..723308b5 100644 --- a/esp3d/src/modules/ftp/FtpServer.h +++ b/esp3d/src/modules/ftp/FtpServer.h @@ -31,8 +31,8 @@ #ifndef FTP_SERVER_H #define FTP_SERVER_H -class WiFiServer; -class WiFiClient; +#include +#include #ifndef FF_MAX_LFN #define FF_MAX_LFN 255 #endif diff --git a/esp3d/src/modules/gcode_host/gcode_host.cpp b/esp3d/src/modules/gcode_host/gcode_host.cpp index b83f62ba..228a6638 100644 --- a/esp3d/src/modules/gcode_host/gcode_host.cpp +++ b/esp3d/src/modules/gcode_host/gcode_host.cpp @@ -317,7 +317,7 @@ void GcodeHost::processCommand() { bool isESPcmd = esp3d_commands.is_esp_command( (uint8_t *)_currentCommand.c_str(), _currentCommand.length()); if (isESPcmd) { - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::no_client, esp3d_commands.getOutputClient(), (uint8_t *)_currentCommand.c_str(), _currentCommand.length(), _auth); if (msg) { @@ -331,7 +331,7 @@ void GcodeHost::processCommand() { } } else { - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::stream, esp3d_commands.getOutputClient(), (uint8_t *)_currentCommand.c_str(), _currentCommand.length(), _auth); if (msg) { diff --git a/esp3d/src/modules/http/handlers/handle-command.cpp b/esp3d/src/modules/http/handlers/handle-command.cpp index b86256c9..e844b0ac 100644 --- a/esp3d/src/modules/http/handlers/handle-command.cpp +++ b/esp3d/src/modules/http/handlers/handle-command.cpp @@ -74,7 +74,7 @@ void HTTP_Server::handle_web_command() { } esp3d_log("Web Command: %s", cmd.c_str()); if (esp3d_commands.is_esp_command((uint8_t *)cmd.c_str(), cmd.length())) { - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::http, esp3d_commands.getOutputClient(), (uint8_t *)cmd.c_str(), cmd.length(), auth_level); if (msg) { diff --git a/esp3d/src/modules/http/handlers/handle-config.cpp b/esp3d/src/modules/http/handlers/handle-config.cpp index 4bddc14c..43e96065 100644 --- a/esp3d/src/modules/http/handlers/handle-config.cpp +++ b/esp3d/src/modules/http/handlers/handle-config.cpp @@ -39,7 +39,7 @@ void HTTP_Server::handle_config() { if (_webserver->hasArg("json")) { cmd += " json=" + _webserver->arg("json"); } - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::http, ESP3DClientType::http, (uint8_t *)cmd.c_str(), cmd.length(), auth_level); if (msg) { diff --git a/esp3d/src/modules/http/http_server.cpp b/esp3d/src/modules/http/http_server.cpp index af12856d..08299927 100644 --- a/esp3d/src/modules/http/http_server.cpp +++ b/esp3d/src/modules/http/http_server.cpp @@ -289,7 +289,7 @@ bool HTTP_Server::dispatch(ESP3DMessage* msg) { _webserver->sendContent(""); } } - ESP3DMessageManager::deleteMsg(msg); + esp3d_message_manager.deleteMsg(msg); return true; } return false; @@ -346,13 +346,7 @@ void HTTP_Server::end() { void HTTP_Server::handle() { if (_started) { if (_webserver) { -#ifdef DISABLE_WDT_CORE_0 - disableCore0WDT(); -#endif // DISABLE_WDT_CORE_0 _webserver->handleClient(); -#ifdef DISABLE_WDT_CORE_0 - enableCore0WDT(); -#endif // DISABLE_WDT_CORE_0 } } } diff --git a/esp3d/src/modules/lua_interpreter/lua_interpreter_service.cpp b/esp3d/src/modules/lua_interpreter/lua_interpreter_service.cpp index a7b44c17..7f62fb67 100644 --- a/esp3d/src/modules/lua_interpreter/lua_interpreter_service.cpp +++ b/esp3d/src/modules/lua_interpreter/lua_interpreter_service.cpp @@ -20,12 +20,15 @@ #include "../../include/esp3d_config.h" -#ifdef ESP_LUA_INTERPRETER_FEATURE +#if defined(ESP_LUA_INTERPRETER_FEATURE) && defined(ARDUINO_ARCH_ESP32) #include "../../core/esp3d_commands.h" #include "../../core/esp3d_hal.h" #include "../../core/esp3d_settings.h" #include "lua_interpreter_service.h" +#if defined(NOTIFICATION_FEATURE) +#include "../notifications/notifications_service.h" +#endif // NOTIFICATION_FEATURE #if defined(FILESYSTEM_FEATURE) #include "../filesystem/esp_filesystem.h" #endif // FILESYSTEM_FEATURE @@ -39,20 +42,21 @@ LuaInterpreter esp3d_lua_interpreter; LuaInterpreter::LuaInterpreter() { _scriptTask = NULL; - _isRunning = false; - _isPaused = false; _pauseTime = 0; - _pauseSemaphore = xSemaphoreCreateBinary(); _luaFSType = Lua_Filesystem_Type::none; - xSemaphoreGive(_pauseSemaphore); // Initialize as available setupFunctions(); registerConstants(); _scriptBuffer = nullptr; + _stateMutex = xSemaphoreCreateMutex(); + _messageInFIFO.setMaxSize(10); // no limit + _messageInFIFO.setId("in"); + _messageOutFIFO.setMaxSize(0); // no limit + _messageOutFIFO.setId("out"); } LuaInterpreter::~LuaInterpreter() { deleteScriptTask(); - vSemaphoreDelete(_pauseSemaphore); + vSemaphoreDelete(_stateMutex); } bool LuaInterpreter::dispatch(ESP3DMessage *message) { @@ -60,90 +64,105 @@ bool LuaInterpreter::dispatch(ESP3DMessage *message) { return false; } if (message->size > 0 && message->data) { - _messageFIFO.push(message); + _messageInFIFO.push(message); return true; } return false; } +const char *LuaInterpreter::getLastError() { + esp3d_log("getLastError %s %s", _lastError.c_str(), _luaEngine.getLastError()); + if (_lastError.length() == 0) { + return _luaEngine.getLastError(); + } + return _lastError.c_str(); +} + bool LuaInterpreter::createScriptTask() { if (_scriptTask != NULL) { deleteScriptTask(); } - BaseType_t xReturned = xTaskCreate(scriptExecutionTask, "LuaScriptTask", 8192, - this, tskIDLE_PRIORITY + 1, &_scriptTask); + _lastError = ""; + BaseType_t xReturned = xTaskCreatePinnedToCore( + scriptExecutionTask, /* Task function. */ + "LuaScriptTask", /* name of task. */ + 8192, /* Stack size of task */ + this, /* parameter of the task = is main or bridge*/ + 1, /* priority of the task */ + &_scriptTask, /* Task handle to keep track of created task */ + 1 /* Core to run the task */ + ); if (xReturned != pdPASS) { - _lastError = "Failed to create script task"; + if (_lastError.length() == 0) _lastError = "Failed to create script task"; return false; } - _isRunning = true; - _isPaused = false; _startTime = millis(); return true; } bool LuaInterpreter::executeScriptAsync(const char *script) { bool result = true; - if (_isRunning) { - _lastError = "A script is already running"; + if (_luaEngine.isRunning()) { + if (_lastError.length() == 0) _lastError = "A script is already running"; return false; } _currentScriptName = script; if (!createScriptTask()) { - _lastError = "Failed to create script task"; + if (_lastError.length() == 0) _lastError = "Failed to create script task"; result = false; } return result; } -void LuaInterpreter::abortCurrentScript() { - if (_isRunning && _scriptTask != NULL) { - deleteScriptTask(); - _lastError = "Script aborted"; +void LuaInterpreter::abortScript() { + if (_luaEngine.isRunning() && _scriptTask != NULL) { + if (_lastError.length() == 0) _lastError = "Script aborted"; + _luaEngine.stopExecution(); } } bool LuaInterpreter::pauseScript() { - if (_isRunning && !_isPaused) { - _isPaused = true; + if (_luaEngine.isRunning() && !_luaEngine.isPaused()) { + _luaEngine.pauseExecution(); _pauseTime = millis(); - xSemaphoreTake(_pauseSemaphore, 0); return true; } return false; } bool LuaInterpreter::resumeScript() { - if (_isRunning && _isPaused) { - _isPaused = false; + if (_luaEngine.isRunning() && _luaEngine.isPaused()) { + _luaEngine.resumeExecution(); _startTime += (millis() - _pauseTime); - xSemaphoreGive(_pauseSemaphore); return true; } return false; } +void LuaInterpreter::resetLuaEnvironment() { + _luaEngine.resetState(); + setupFunctions(); + registerConstants(); +} + void LuaInterpreter::deleteScriptTask() { - if (_scriptTask != NULL) { - vTaskDelete(_scriptTask); - _scriptTask = NULL; - } + esp3d_log("Delete script task start"); if (_scriptBuffer) { + esp3d_log("Free script buffer"); free(_scriptBuffer); _scriptBuffer = nullptr; } - _isRunning = false; - _isPaused = false; + esp3d_log("Reset lua environment"); _luaFSType = Lua_Filesystem_Type::none; -} - -void LuaInterpreter::checkPause() { - if (_isPaused) { - xSemaphoreTake(_pauseSemaphore, portMAX_DELAY); - xSemaphoreGive(_pauseSemaphore); + if (_lastError != "") resetLuaEnvironment(); + if (_scriptTask != NULL) { + esp3d_log("Delete script task"); + TaskHandle_t tmpTask = _scriptTask; + _scriptTask = NULL; + vTaskDelete(tmpTask); } } @@ -152,6 +171,7 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { String scriptName = self->_currentScriptName; if (self->_scriptBuffer) { free(self->_scriptBuffer); + self->_scriptBuffer = nullptr; } self->_lastError = ""; size_t fileSize = 0; @@ -175,8 +195,9 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { fileSize = FSfileHandle.size(); esp3d_log("File %s opened, size is %d", scriptName.c_str(), fileSize); if (fileSize > ESP_LUA_MAX_SCRIPT_SIZE) { - self->_lastError = "File size is too large"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "File size is too large"; + esp3d_log_e("%s", "File size is too large"); } else { // allocate memory for the script self->_scriptBuffer = (char *)malloc(fileSize + 1); @@ -188,24 +209,28 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { esp3d_log("File %s read into buffer", scriptName.c_str()); // check if the read is ok if (readSize != fileSize) { - self->_lastError = "Failed to read file"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "Failed to read file"; + esp3d_log_e("%s", self->_lastError.c_str()); } else { self->_luaFSType = Lua_Filesystem_Type::fLash; } } else { - self->_lastError = "Failed to allocate memory for script"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "Failed to allocate memory for script"; + esp3d_log_e("%s", "Failed to allocate memory for script"); } } FSfileHandle.close(); } else { - self->_lastError = "File is not open: " + scriptName; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "File is not open: " + scriptName; + esp3d_log_e("%s", self->_lastError.c_str()); } } else { - self->_lastError = "File not found: " + scriptName; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "File not found: " + scriptName; + esp3d_log_e("%s", "File is not open: " + scriptName); } } #endif // FILESYSTEM_FEATURE @@ -216,12 +241,13 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { esp3d_log("Processing SD file %s", scriptName.c_str()); // Check if the SD file system is available if (!ESP_SD::accessFS()) { - self->_lastError = "SD file system not found"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "SD file system not found"; + esp3d_log_e("%s", "SD file system not found"); } else { if (ESP_SD::getState(true) == ESP_SDCARD_NOT_PRESENT) { - self->_lastError = "SD card not present"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) self->_lastError = "SD card not present"; + esp3d_log_e("%s", "SD card not present"); } else { ESP_SD::setState(ESP_SDCARD_BUSY); // Check script name exists @@ -232,8 +258,9 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { // Check script file size is under 2048 bytes fileSize = SDfileHandle.size(); if (fileSize > ESP_LUA_MAX_SCRIPT_SIZE) { - self->_lastError = "File size is too large"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "File size is too large"; + esp3d_log_e("%s", "File size is too large"); } else { // allocate memory for the script self->_scriptBuffer = (char *)malloc(fileSize + 1); @@ -245,25 +272,29 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { esp3d_log("File %s read into buffer", scriptName.c_str()); // check if the read is ok if (readSize != fileSize) { - self->_lastError = "Failed to read file"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "Failed to read file"; + esp3d_log_e("%s", "Failed to read file"); } else { self->_luaFSType = Lua_Filesystem_Type::sd; } } else { - self->_lastError = "Failed to allocate memory for script"; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "Failed to allocate memory for script"; + esp3d_log_e("%s", "Failed to allocate memory for script"); } } // close the file SDfileHandle.close(); } else { - self->_lastError = "File is not open: " + scriptName; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) self->_lastError = + "File is not open: " + scriptName; + esp3d_log_e("%s", "File is not open: " + scriptName); } } else { - self->_lastError = "File not found: " + scriptName; - esp3d_log_e(% s, self->_lastError.c_str()); + if (self->_lastError.length() == 0) + self->_lastError = "File not found: " + scriptName; + esp3d_log_e("%s", "File not found: " + scriptName); } } ESP_SD::releaseFS(); @@ -271,30 +302,76 @@ void LuaInterpreter::scriptExecutionTask(void *parameter) { } #endif // SD_DEVICE // Check if the file system type is not determined - if (self->_luaFSType == Lua_Filesystem_Type::none && - self->_lastError.length() == 0) { - self->_lastError = "Cannot determine file system type"; - esp3d_log_e(% s, self->_lastError.c_str()); - } - // Execute the script - if (self->_luaFSType != Lua_Filesystem_Type::none && self->_scriptBuffer) { - if (!self->_luaEngine.executeScript(self->_scriptBuffer)) { - self->_lastError = "Script execution failed"; - esp3d_log_e(% s, self->_lastError.c_str()); + esp3d_log("Check state"); + if (self->_luaFSType == Lua_Filesystem_Type::none) { + if (self->_lastError.length() == 0) + self->_lastError = "Cannot determine file system type"; + esp3d_log_e("%s", "Cannot determine file system type"); + } else { + // Execute the script + esp3d_log("Execute script"); + if (self->_luaFSType != Lua_Filesystem_Type::none && self->_scriptBuffer) { + if (!self->_luaEngine.executeScript(self->_scriptBuffer)) { + if (self->_lastError.length() == 0) { + self->_lastError = "Script execution failed"; + } + esp3d_log_e("%s", "Script execution failed"); + } } } + esp3d_log("Delete script task"); self->deleteScriptTask(); } -unsigned long LuaInterpreter::getExecutionTime() const { - if (!_isRunning) return 0; - if (_isPaused) return _pauseTime - _startTime; +bool LuaInterpreter::begin() { + end(); + return true; +} + +void LuaInterpreter::end() { deleteScriptTask(); } + +void LuaInterpreter::handle() { + static bool notificationSent = false; + if (_luaEngine.isRunning() && notificationSent) { + notificationSent = false; + } + if (_messageOutFIFO.size() > 0 || _luaEngine.hasError()) { + if (xSemaphoreTake(_stateMutex, portMAX_DELAY) == pdTRUE) { + // Check if the script is in error state and if still running + if (_luaEngine.hasError()) { + _lastError = _luaEngine.getLastError(); +#ifdef NOTIFICATION_FEATURE + if (!notificationSent) { + String errorMsg = "Error: " + _lastError; + notificationsservice.sendAutoNotification(errorMsg.c_str()); + notificationSent = true; + } +#endif // NOTIFICATION_FEATURE + } + if (_messageOutFIFO.size() > 0) { + esp3d_log("lua_interpreter message size %d", _messageOutFIFO.size()); + } + ESP3DMessage *msg = _messageOutFIFO.pop(); + if (msg) { + esp3d_log("Processing message: %s", msg->data); + esp3d_commands.process(msg); + } + xSemaphoreGive(_stateMutex); + } else { + esp3d_log_e("Mutex not taken"); + } + } +} + +uint64_t LuaInterpreter::getExecutionTime() { + if (!_luaEngine.isRunning()) return 0; + if (_luaEngine.isPaused()) return _pauseTime - _startTime; return millis() - _startTime; } -bool LuaInterpreter::isScriptRunning() const { return _isRunning; } +bool LuaInterpreter::isScriptRunning() { return _luaEngine.isRunning(); } -bool LuaInterpreter::isScriptPaused() const { return _isPaused; } +bool LuaInterpreter::isScriptPaused() { return _luaEngine.isPaused(); } void LuaInterpreter::setupFunctions() { _luaEngine.registerFunction("pinMode", l_pinMode); @@ -304,9 +381,10 @@ void LuaInterpreter::setupFunctions() { _luaEngine.registerFunction("analogRead", l_analogRead); _luaEngine.registerFunction("available", l_available, this); _luaEngine.registerFunction("readData", l_readData, this); - _luaEngine.registerFunction("delay", l_delay); + _luaEngine.registerFunction("delay", l_delay, this); _luaEngine.registerFunction("yield", l_yield); _luaEngine.registerFunction("millis", l_millis); + _luaEngine.registerFunction("print", l_print, this); } void LuaInterpreter::registerConstants() { @@ -354,21 +432,45 @@ int LuaInterpreter::l_analogRead(lua_State *L) { return 1; } -int l_print(lua_State *L) { +int LuaInterpreter::l_print(lua_State *L) { + esp3d_log("lua_interpreter output"); + LuaInterpreter *self = + (LuaInterpreter *)lua_touserdata(L, lua_upvalueindex(1)); String dataString; + dataString = ""; int nargs = lua_gettop(L); + // esp3d_log("lua_interpreter output args %d", nargs); for (int i = 1; i <= nargs; i++) { + // esp3d_log("lua_interpreter output arg %d", i); if (lua_isstring(L, i)) { dataString += lua_tostring(L, i); + } else if (lua_isnumber(L, i)) { + dataString += String(lua_tonumber(L, i)); + } else if (lua_isboolean(L, i)) { + dataString += lua_toboolean(L, i) ? "true" : "false"; + } else if (lua_isnil(L, i)) { + dataString += "nil"; + } else { + dataString += lua_typename(L, lua_type(L, i)); } } - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + if (!dataString.endsWith("\n")) { + dataString += "\n"; + } + esp3d_log("lua_interpreter output %s", dataString.c_str()); + esp3d_log("Message Creation"); + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::lua_script, esp3d_commands.getOutputClient(), (uint8_t *)dataString.c_str(), dataString.length(), ESP3DAuthenticationLevel::admin); + esp3d_log("Message created"); + if (msg) { // process command - esp3d_commands.process(msg); + msg->type = ESP3DMessageType::unique; + esp3d_log("Message sent to fifo list"); + // push to FIFO + self->_messageOutFIFO.push(msg); } else { esp3d_log_e("Cannot create message"); } @@ -378,17 +480,17 @@ int l_print(lua_State *L) { int LuaInterpreter::l_available(lua_State *L) { LuaInterpreter *self = (LuaInterpreter *)lua_touserdata(L, lua_upvalueindex(1)); - lua_pushinteger(L, self->_messageFIFO.size()); + lua_pushinteger(L, self->_messageInFIFO.size()); return 1; } int LuaInterpreter::l_readData(lua_State *L) { LuaInterpreter *self = (LuaInterpreter *)lua_touserdata(L, lua_upvalueindex(1)); - ESP3DMessage *message = self->_messageFIFO.pop(); + ESP3DMessage *message = self->_messageInFIFO.pop(); if (message) { lua_pushlstring(L, (const char *)message->data, message->size); - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); } else { lua_pushnil(L); } @@ -396,8 +498,27 @@ int LuaInterpreter::l_readData(lua_State *L) { } int LuaInterpreter::l_delay(lua_State *L) { + LuaInterpreter *self = + (LuaInterpreter *)lua_touserdata(L, lua_upvalueindex(1)); int ms = luaL_checkinteger(L, 1); - vTaskDelay(pdMS_TO_TICKS(ms)); + TickType_t delayTicks = pdMS_TO_TICKS(ms); + // Check if during delay the script is aborted or paused + while (delayTicks > 0) { + TickType_t delayThis = (delayTicks > ESP_LUA_CHECK_INTERVAL) + ? ESP_LUA_CHECK_INTERVAL + : delayTicks; + vTaskDelay(delayThis); + delayTicks -= delayThis; + while (self->_luaEngine.isPaused()) { + vTaskDelay(ESP_LUA_CHECK_INTERVAL); + } + + if (!(self->_luaEngine.isRunning())) { + if (self->_lastError.length() == 0) + self->_lastError = "Execution stopped"; + luaL_error(L, "Execution stopped"); + } + } return 0; } diff --git a/esp3d/src/modules/lua_interpreter/lua_interpreter_service.h b/esp3d/src/modules/lua_interpreter/lua_interpreter_service.h index 7f85fd19..c38d606d 100644 --- a/esp3d/src/modules/lua_interpreter/lua_interpreter_service.h +++ b/esp3d/src/modules/lua_interpreter/lua_interpreter_service.h @@ -18,7 +18,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #pragma once - +#if defined(ARDUINO_ARCH_ESP32) #include #include @@ -39,28 +39,30 @@ class LuaInterpreter { ~LuaInterpreter(); bool executeScriptAsync(const char* script); - void abortCurrentScript(); + void abortScript(); bool pauseScript(); bool resumeScript(); const char* getCurrentScriptName() { return _currentScriptName.c_str(); } - unsigned long getExecutionTime() const; - bool isScriptRunning() const; - bool isScriptPaused() const; - const char* getLastError() const; + uint64_t getExecutionTime(); + bool isScriptRunning(); + bool isScriptPaused(); + const char* getLastError(); bool dispatch(ESP3DMessage* message); + bool begin(); + void end(); + void handle(); private: EspLuaEngine _luaEngine; TaskHandle_t _scriptTask; char* _scriptBuffer; - SemaphoreHandle_t _pauseSemaphore; - ESP3DMessageFIFO _messageFIFO; + SemaphoreHandle_t _stateMutex; + ESP3DMessageFIFO _messageInFIFO; + ESP3DMessageFIFO _messageOutFIFO; Lua_Filesystem_Type _luaFSType; String _currentScriptName; unsigned long _startTime; unsigned long _pauseTime; - bool _isRunning; - bool _isPaused; String _lastError; static void scriptExecutionTask(void* parameter); @@ -68,7 +70,7 @@ class LuaInterpreter { void registerConstants(); bool createScriptTask(); void deleteScriptTask(); - void checkPause(); + void resetLuaEnvironment(); // Wrappers static int l_print(lua_State* L); @@ -85,3 +87,5 @@ class LuaInterpreter { }; extern LuaInterpreter esp3d_lua_interpreter; + +#endif // defined(ARDUINO_ARCH_ESP32) \ No newline at end of file diff --git a/esp3d/src/modules/mDNS/mDNS.cpp b/esp3d/src/modules/mDNS/mDNS.cpp index 130d8f5d..dbf93c2e 100644 --- a/esp3d/src/modules/mDNS/mDNS.cpp +++ b/esp3d/src/modules/mDNS/mDNS.cpp @@ -252,7 +252,7 @@ const char* mDNS_Service::answerIP(uint16_t index) { return ""; } #if defined(ARDUINO_ARCH_ESP32) - tmp = MDNS.IP(index).toString(); + tmp = MDNS.address(index).toString(); #endif // ARDUINO_ARCH_ESP32 #if defined(ARDUINO_ARCH_ESP8266) diff --git a/esp3d/src/modules/mks/mks_service.cpp b/esp3d/src/modules/mks/mks_service.cpp index 7de53b12..4c7c3836 100644 --- a/esp3d/src/modules/mks/mks_service.cpp +++ b/esp3d/src/modules/mks/mks_service.cpp @@ -120,7 +120,7 @@ bool MKSService::dispatch(ESP3DMessage *message) { } if (message->size > 0 && message->data) { if (sendGcodeFrame((const char *)message->data)) { - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } } diff --git a/esp3d/src/modules/network/netconfig.cpp b/esp3d/src/modules/network/netconfig.cpp index 870608cc..a5ec78c0 100644 --- a/esp3d/src/modules/network/netconfig.cpp +++ b/esp3d/src/modules/network/netconfig.cpp @@ -48,6 +48,10 @@ #include "../gcode_host/gcode_host.h" #endif // GCODE_HOST_FEATURE +#if defined(ARDUINO_ARCH_ESP32) +esp_netif_t *get_esp_interface_netif(esp_interface_t interface); +#endif // ARDUINO_ARCH_ESP32 + String NetConfig::_hostname = ""; bool NetConfig::_needReconnect2AP = false; bool NetConfig::_events_registered = false; @@ -231,11 +235,12 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event) { case ARDUINO_EVENT_WIFI_STA_LOST_IP: if (_started) { _needReconnect2AP = true; + esp3d_log("WiFi STA lost IP"); } break; #ifdef ETH_FEATURE case ARDUINO_EVENT_ETH_START: { - EthConfig::setConnected(false); + esp3d_log("Ethernet started"); if (ESP3DSettings::isVerboseBoot()) { esp3d_commands.dispatch( "Checking connection", ESP3DClientType::all_clients, no_id, @@ -248,18 +253,24 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event) { no_id, ESP3DMessageType::unique, ESP3DClientType::system, ESP3DAuthenticationLevel::admin); + esp3d_log("Ethernet connected"); EthConfig::setConnected(true); } break; case ARDUINO_EVENT_ETH_DISCONNECTED: { + esp3d_log("Ethernet disconnected"); esp3d_commands.dispatch("Cable disconnected", ESP3DClientType::all_clients, no_id, ESP3DMessageType::unique, ESP3DClientType::system, ESP3DAuthenticationLevel::admin); EthConfig::setConnected(false); } break; + case ARDUINO_EVENT_ETH_LOST_IP: + esp3d_log("Ethernet lost IP"); + break; case ARDUINO_EVENT_ETH_GOT_IP: { #if COMMUNICATION_PROTOCOL != MKS_SERIAL #if defined(ESP_GOT_IP_HOOK) && defined(GCODE_HOST_FEATURE) + ESP3DHal::wait(500); String ipMsg = esp3d_string::expandString(ESP_GOT_IP_HOOK); esp3d_log("Got IP, sending hook: %s", ipMsg.c_str()); esp3d_gcode_host.processScript(ipMsg.c_str(), @@ -268,7 +279,9 @@ void NetConfig::onWiFiEvent(WiFiEvent_t event) { #endif // #if COMMUNICATION_PROTOCOL == MKS_SERIAL EthConfig::setConnected(true); } break; + case ARDUINO_EVENT_ETH_STOP: + esp3d_log("Ethernet stopped"); EthConfig::setConnected(false); break; #endif // ETH_FEATURE @@ -523,12 +536,20 @@ void NetConfig::handle() { bool NetConfig::isIPModeDHCP(uint8_t mode) { bool started = false; #ifdef ARDUINO_ARCH_ESP32 - tcpip_adapter_dhcp_status_t dhcp_status; - tcpip_adapter_dhcpc_get_status((mode == ESP_WIFI_STA) ? TCPIP_ADAPTER_IF_STA - : (mode == ESP_WIFI_AP) ? TCPIP_ADAPTER_IF_AP - : TCPIP_ADAPTER_IF_ETH, +if (mode == ESP_WIFI_STA || mode == ESP_WIFI_AP) { + esp_netif_dhcp_status_t dhcp_status; + esp_netif_dhcpc_get_status((mode == ESP_WIFI_STA) ? get_esp_interface_netif(ESP_IF_WIFI_STA) + : get_esp_interface_netif(ESP_IF_WIFI_AP), &dhcp_status); - started = (dhcp_status == TCPIP_ADAPTER_DHCP_STARTED); + esp3d_log("DHCP Status %d", (int)dhcp_status); + started = (dhcp_status == ESP_NETIF_DHCP_STARTED); +} +#if defined(ETH_FEATURE) +if (mode == ESP_ETH_STA) { + started = (EthConfig::ipMode()==DHCP_MODE); +} +#endif // ETH_FEATURE + #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 (void)mode; @@ -540,12 +561,13 @@ bool NetConfig::isIPModeDHCP(uint8_t mode) { bool NetConfig::isDHCPServer(uint8_t mode) { bool itis = false; #ifdef ARDUINO_ARCH_ESP32 - tcpip_adapter_dhcp_status_t dhcp_status; - tcpip_adapter_dhcps_get_status((mode == ESP_WIFI_STA) ? TCPIP_ADAPTER_IF_STA - : (mode == ESP_WIFI_AP) ? TCPIP_ADAPTER_IF_AP - : TCPIP_ADAPTER_IF_ETH, + //Fzor some reason esp_netif_dhcps_get_status() give always !DHCP_MODE for Ethernet even if it is set to DHCP + if (mode == ESP_WIFI_AP) { + esp_netif_dhcp_status_t dhcp_status; + esp_netif_dhcps_get_status(get_esp_interface_netif(ESP_IF_WIFI_AP), &dhcp_status); - itis = (dhcp_status == TCPIP_ADAPTER_DHCP_STARTED); + itis = (dhcp_status == ESP_NETIF_DHCP_STARTED); + } #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 (void)mode; diff --git a/esp3d/src/modules/network/netconfig.h b/esp3d/src/modules/network/netconfig.h index d886ecaf..cbcb26b0 100644 --- a/esp3d/src/modules/network/netconfig.h +++ b/esp3d/src/modules/network/netconfig.h @@ -35,6 +35,7 @@ #ifdef ARDUINO_ARCH_ESP32 #include +#include #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 #include diff --git a/esp3d/src/modules/serial/serial_service.cpp b/esp3d/src/modules/serial/serial_service.cpp index 486e55ce..32bd2361 100644 --- a/esp3d/src/modules/serial/serial_service.cpp +++ b/esp3d/src/modules/serial/serial_service.cpp @@ -37,7 +37,7 @@ HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1}; #if defined(ARDUINO_ARCH_ESP32) -#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S2) +#if defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32C6) ||defined(CONFIG_IDF_TARGET_ESP32S2) #define MAX_SERIAL 2 HardwareSerial *Serials[MAX_SERIAL] = {&Serial, &Serial1}; #else @@ -293,7 +293,7 @@ void ESP3DSerialService::flushbuffer() { // dispatch command if (_started) { - ESP3DMessage *message = ESP3DMessageManager::newMsg( + ESP3DMessage *message = esp3d_message_manager.newMsg( _origin, _id == MAIN_SERIAL ? ESP3DClientType::all_clients : esp3d_commands.getOutputClient(), @@ -550,7 +550,7 @@ bool ESP3DSerialService::dispatch(ESP3DMessage *message) { if (writeBytes(message->data, message->size) == message->size) { flush(); // Delete message now - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); done = true; } else { esp3d_log_e("Error while sending data"); diff --git a/esp3d/src/modules/serial2socket/serial2socket.cpp b/esp3d/src/modules/serial2socket/serial2socket.cpp index 2f657cd8..4b134212 100644 --- a/esp3d/src/modules/serial2socket/serial2socket.cpp +++ b/esp3d/src/modules/serial2socket/serial2socket.cpp @@ -167,7 +167,7 @@ void Serial_2_Socket::handle_flush() { } void Serial_2_Socket::flush(void) { if (_TXbufferSize > 0 && _started && !_paused) { - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::socket_serial, ESP3DClientType::all_clients, _TXbuffer, _TXbufferSize, _auth); // dispatch command @@ -195,7 +195,7 @@ bool Serial_2_Socket::dispatch(ESP3DMessage *message) { esp3d_log_e("Serial2Socket: cannot push all data"); return false; } - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } esp3d_log_e("Serial2Socket: no data in message"); diff --git a/esp3d/src/modules/telnet/telnet_server.cpp b/esp3d/src/modules/telnet/telnet_server.cpp index e39de7c0..d09ce198 100644 --- a/esp3d/src/modules/telnet/telnet_server.cpp +++ b/esp3d/src/modules/telnet/telnet_server.cpp @@ -22,8 +22,7 @@ #if defined(TELNET_FEATURE) || \ (defined(ESP_LOG_FEATURE) && ESP_LOG_FEATURE == LOG_OUTPUT_TELNET) -#include -#include + #include "../../core/esp3d_commands.h" #include "../../core/esp3d_message.h" @@ -200,7 +199,7 @@ bool Telnet_Server::dispatch(ESP3DMessage *message) { if (sentcnt != message->size) { return false; } - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } return false; @@ -221,7 +220,7 @@ void Telnet_Server::flushbuffer() { return; } _buffer[_buffer_size] = 0x0; - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( ESP3DClientType::telnet, esp3d_commands.getOutputClient(), _buffer, _buffer_size, _auth); if (msg) { diff --git a/esp3d/src/modules/telnet/telnet_server.h b/esp3d/src/modules/telnet/telnet_server.h index a70508a4..d70eb78a 100644 --- a/esp3d/src/modules/telnet/telnet_server.h +++ b/esp3d/src/modules/telnet/telnet_server.h @@ -21,8 +21,9 @@ #ifndef _TELNET_SERVER_H #define _TELNET_SERVER_H -class WiFiServer; -class WiFiClient; +#include +#include + #include "../../core/esp3d_message.h" #define ESP3D_TELNET_BUFFER_SIZE 1200 diff --git a/esp3d/src/modules/update/update_service.cpp b/esp3d/src/modules/update/update_service.cpp index 2ecf50f2..e6400295 100644 --- a/esp3d/src/modules/update/update_service.cpp +++ b/esp3d/src/modules/update/update_service.cpp @@ -63,11 +63,11 @@ const uint16_t ServstringKeysPos[] = {ESP_TIME_ZONE, ESP_NOTIFICATION_TOKEN2, ESP_NOTIFICATION_SETTINGS}; -const char* IPKeysVal[] = {"STA_IP", "STA_GW", "STA_MSK", "STA_DNS", "AP_IP"}; +const char* IPKeysVal[] = {"STA_IP", "STA_GW", "STA_MSK", "STA_DNS", "AP_IP","ETH_STA_IP", "ETH_STA_GW", "ETH_STA_MSK", "ETH_STA_DNS"}; const uint16_t IPKeysPos[] = {ESP_STA_IP_VALUE, ESP_STA_GATEWAY_VALUE, ESP_STA_MASK_VALUE, ESP_STA_DNS_VALUE, - ESP_AP_IP_VALUE}; + ESP_AP_IP_VALUE, ESP_ETH_STA_IP_VALUE, ESP_ETH_STA_GATEWAY_VALUE, ESP_ETH_STA_MASK_VALUE, ESP_ETH_STA_DNS_VALUE}; const char* ServintKeysVal[] = { "Serial_Bridge_Baud" @@ -226,7 +226,7 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("OFF", value) == 0) { b = ESP_NO_NETWORK; } else { - P = -1; // invalide value + P = -1; // invalid value } } } @@ -243,7 +243,23 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("OFF", value) == 0) { b = ESP_NO_NETWORK; } else { - P = -1; // invalide value + P = -1; // invalid value + } + } + } + + // ETH STA fallback mode BT, OFF + if (!done) { + if (strcasecmp("eth_sta_fallback", key) == 0) { + T = 'B'; + P = ESP_STA_FALLBACK_MODE; + done = true; + if (strcasecmp("BT", value) == 0) { + b = ESP_BT; + } else if (strcasecmp("OFF", value) == 0) { + b = ESP_NO_NETWORK; + } else { + P = -1; // invalid value } } } @@ -259,10 +275,27 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("STATIC", key) == 0) { b = STATIC_IP_MODE; } else { - P = -1; // invalide value + P = -1; // invalid value } } } + + // ETH STA IP Mode DHCP / STATIC + if (!done) { + if (strcasecmp("ETH_STA_IP_mode", key) == 0) { + T = 'B'; + P = ESP_ETH_STA_IP_MODE; + done = true; + if (strcasecmp("DHCP", value) == 0) { + b = DHCP_MODE; + } else if (strcasecmp("STATIC", key) == 0) { + b = STATIC_IP_MODE; + } else { + P = -1; // invalid value + } + } + } + } else if (strcasecmp("services", section) == 0) { if (!done) { done = processString(ServstringKeysVal, ServstringKeysPos, @@ -310,7 +343,7 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("HOMEASSISTANT", value) == 0) { b = ESP_HOMEASSISTANT_NOTIFICATION; } else { - P = -1; // invalide value + P = -1; // invalid value } } } @@ -333,7 +366,7 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("BME280", key) == 0) { b = BME280_DEVICE; } else { - P = -1; // invalide value + P = -1; // invalid value } } } @@ -366,7 +399,7 @@ bool processingFileFunction(const char* section, const char* key, } else if (strcasecmp("SMOOTHIEWARE", value) == 0) { b = SMOOTHIEWARE; } else { - P = -1; // invalide value + P = -1; // invalid value } } } diff --git a/esp3d/src/modules/webdav/webdav_server.h b/esp3d/src/modules/webdav/webdav_server.h index 2c69f1ce..51b1195c 100644 --- a/esp3d/src/modules/webdav/webdav_server.h +++ b/esp3d/src/modules/webdav/webdav_server.h @@ -45,8 +45,8 @@ typedef ESP_SDFile WebDavFile; typedef ESP_SD WebDavFS; #endif // WEBDAV_FEATURE == FS_SD -class WiFiServer; -class WiFiClient; +#include +#include class WebdavServer { public: diff --git a/esp3d/src/modules/websocket/websocket_server.cpp b/esp3d/src/modules/websocket/websocket_server.cpp index c3aeb3a9..d2a7b51a 100644 --- a/esp3d/src/modules/websocket/websocket_server.cpp +++ b/esp3d/src/modules/websocket/websocket_server.cpp @@ -64,7 +64,7 @@ bool WebSocket_Server::dispatch(ESP3DMessage *message) { if (sentcnt != message->size) { return false; } - ESP3DMessageManager::deleteMsg(message); + esp3d_message_manager.deleteMsg(message); return true; } return false; @@ -330,7 +330,7 @@ void WebSocket_Server::flushRXbuffer() { return; } _RXbuffer[_RXbufferSize] = 0x0; - ESP3DMessage *msg = ESP3DMessageManager::newMsg( + ESP3DMessage *msg = esp3d_message_manager.newMsg( _type, esp3d_commands.getOutputClient(), _RXbuffer, _RXbufferSize, _auth); if (msg) { // process command diff --git a/esp3d/src/modules/wifi/wificonfig.cpp b/esp3d/src/modules/wifi/wificonfig.cpp index 742a2327..162353b7 100644 --- a/esp3d/src/modules/wifi/wificonfig.cpp +++ b/esp3d/src/modules/wifi/wificonfig.cpp @@ -22,6 +22,7 @@ #if defined(WIFI_FEATURE) #ifdef ARDUINO_ARCH_ESP32 #include +#include #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 #endif // ARDUINO_ARCH_ESP8266 @@ -30,6 +31,10 @@ #include "../network/netconfig.h" #include "../wifi/wificonfig.h" +#if defined(ARDUINO_ARCH_ESP32) +esp_netif_t *get_esp_interface_netif(esp_interface_t interface); +#endif // ARDUINO_ARCH_ESP32 + const uint8_t DEFAULT_AP_MASK_VALUE[] = {255, 255, 255, 0}; IPAddress WiFiConfig::_ap_gateway; @@ -468,8 +473,8 @@ const char* WiFiConfig::AP_Auth_String() { const char* WiFiConfig::AP_Gateway_String() { static String tmp; #ifdef ARDUINO_ARCH_ESP32 - tcpip_adapter_ip_info_t ip_AP; - tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ip_AP); + esp_netif_ip_info_t ip_AP; + esp_netif_get_ip_info(get_esp_interface_netif(ESP_IF_WIFI_AP), &ip_AP); tmp = IPAddress(ip_AP.gw.addr).toString(); #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 @@ -485,8 +490,8 @@ const char* WiFiConfig::AP_Gateway_String() { const char* WiFiConfig::AP_Mask_String() { static String tmp; #ifdef ARDUINO_ARCH_ESP32 - tcpip_adapter_ip_info_t ip_AP; - tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_AP, &ip_AP); + esp_netif_ip_info_t ip_AP; + esp_netif_get_ip_info(get_esp_interface_netif(ESP_IF_WIFI_STA), &ip_AP); tmp = IPAddress(ip_AP.netmask.addr).toString(); #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 @@ -509,16 +514,22 @@ const char* WiFiConfig::getConnectedSTA(uint8_t* totalcount, bool reset) { if (current > count) { current = 0; } - static wifi_sta_list_t station; - static tcpip_adapter_sta_list_t tcpip_sta_list; +static wifi_sta_list_t sta_list; +static wifi_sta_mac_ip_list_t tcpip_sta_list; + if (reset) { count = 0; } if (count == 0) { current = 0; - esp_wifi_ap_get_sta_list(&station); - tcpip_adapter_get_sta_list(&station, &tcpip_sta_list); - count = station.num; + if(esp_wifi_ap_get_sta_list(&sta_list)!=ESP_OK){ + return ""; +} + if (sta_list.num > 0) { + ESP_ERROR_CHECK( + esp_wifi_ap_get_sta_list_with_ip(&sta_list, &tcpip_sta_list)); + } + count = sta_list.num; } if (count > 0) { data = IPAddress(tcpip_sta_list.sta[current].ip.addr).toString(); diff --git a/esp3d/src/modules/wifi/wificonfig.h b/esp3d/src/modules/wifi/wificonfig.h index 9c6df443..f5b0eb18 100644 --- a/esp3d/src/modules/wifi/wificonfig.h +++ b/esp3d/src/modules/wifi/wificonfig.h @@ -44,6 +44,7 @@ #define AUTH_WPA_WPA2_PSK WIFI_AUTH_WPA_WPA2_PSK #define ENC_TYPE_NONE AUTH_OPEN #define WiFiMode_t wifi_mode_t +#include #endif // ARDUINO_ARCH_ESP32 #ifdef ARDUINO_ARCH_ESP8266 #include diff --git a/extra-libraries/ESP32/SdFat-2.1.2/.gitignore b/extra-libraries/ESP32/SdFat-2.1.2/.gitignore deleted file mode 100644 index b9d6bd92..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/.gitignore +++ /dev/null @@ -1,215 +0,0 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap -.DS_Store - - -############# -## Python -############# - -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/SdErrorCodes.txt b/extra-libraries/ESP32/SdFat-2.1.2/doc/SdErrorCodes.txt deleted file mode 100644 index 359ee00b..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/doc/SdErrorCodes.txt +++ /dev/null @@ -1,50 +0,0 @@ -2021-01-06 - -Run the SdErrorCode example to produce an updated list. - -Code,Symbol - failed operation -0X00,SD_CARD_ERROR_NONE - No error -0X01,SD_CARD_ERROR_CMD0 - Card reset failed -0X02,SD_CARD_ERROR_CMD2 - SDIO read CID -0X03,SD_CARD_ERROR_CMD3 - SDIO publish RCA -0X04,SD_CARD_ERROR_CMD6 - Switch card function -0X05,SD_CARD_ERROR_CMD7 - SDIO card select -0X06,SD_CARD_ERROR_CMD8 - Send and check interface settings -0X07,SD_CARD_ERROR_CMD9 - Read CSD data -0X08,SD_CARD_ERROR_CMD10 - Read CID data -0X09,SD_CARD_ERROR_CMD12 - Stop multiple block read -0X0A,SD_CARD_ERROR_CMD13 - Read card status -0X0B,SD_CARD_ERROR_CMD17 - Read single block -0X0C,SD_CARD_ERROR_CMD18 - Read multiple blocks -0X0D,SD_CARD_ERROR_CMD24 - Write single block -0X0E,SD_CARD_ERROR_CMD25 - Write multiple blocks -0X0F,SD_CARD_ERROR_CMD32 - Set first erase block -0X10,SD_CARD_ERROR_CMD33 - Set last erase block -0X11,SD_CARD_ERROR_CMD38 - Erase selected blocks -0X12,SD_CARD_ERROR_CMD58 - Read OCR register -0X13,SD_CARD_ERROR_CMD59 - Set CRC mode -0X14,SD_CARD_ERROR_ACMD6 - Set SDIO bus width -0X15,SD_CARD_ERROR_ACMD13 - Read extended status -0X16,SD_CARD_ERROR_ACMD23 - Set pre-erased count -0X17,SD_CARD_ERROR_ACMD41 - Activate card initialization -0X18,SD_CARD_ERROR_READ_TOKEN - Bad read data token -0X19,SD_CARD_ERROR_READ_CRC - Read CRC error -0X1A,SD_CARD_ERROR_READ_FIFO - SDIO fifo read timeout -0X1B,SD_CARD_ERROR_READ_REG - Read CID or CSD failed. -0X1C,SD_CARD_ERROR_READ_START - Bad readStart argument -0X1D,SD_CARD_ERROR_READ_TIMEOUT - Read data timeout -0X1E,SD_CARD_ERROR_STOP_TRAN - Multiple block stop failed -0X1F,SD_CARD_ERROR_TRANSFER_COMPLETE - SDIO transfer complete -0X20,SD_CARD_ERROR_WRITE_DATA - Write data not accepted -0X21,SD_CARD_ERROR_WRITE_FIFO - SDIO fifo write timeout -0X22,SD_CARD_ERROR_WRITE_START - Bad writeStart argument -0X23,SD_CARD_ERROR_WRITE_PROGRAMMING - Flash programming -0X24,SD_CARD_ERROR_WRITE_TIMEOUT - Write timeout -0X25,SD_CARD_ERROR_DMA - DMA transfer failed -0X26,SD_CARD_ERROR_ERASE - Card did not accept erase commands -0X27,SD_CARD_ERROR_ERASE_SINGLE_SECTOR - Card does not support erase -0X28,SD_CARD_ERROR_ERASE_TIMEOUT - Erase command timeout -0X29,SD_CARD_ERROR_INIT_NOT_CALLED - Card has not been initialized -0X2A,SD_CARD_ERROR_INVALID_CARD_CONFIG - Invalid card config -0X2B,SD_CARD_ERROR_FUNCTION_NOT_SUPPORTED - Unsupported SDIO command -0X2C,SD_CARD_ERROR_UNKNOWN - Unknown error \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/html.zip b/extra-libraries/ESP32/SdFat-2.1.2/doc/html.zip deleted file mode 100644 index 6d6b00ff..00000000 Binary files a/extra-libraries/ESP32/SdFat-2.1.2/doc/html.zip and /dev/null differ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino deleted file mode 100644 index 52b7ccc8..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Example use of chdir(), ls(), mkdir(), and rmdir(). - */ -#include -#include "SdFat.h" -#include "sdios.h" -// SD card chip select pin. -const uint8_t chipSelect = SS; -//------------------------------------------------------------------------------ - -// File system object. -SdFat sd; - -// Directory file. -SdFile root; - -// Use for file creation in folders. -SdFile file; - -// Create a Serial output stream. -ArduinoOutStream cout(Serial); - -// Buffer for Serial input. -char cinBuf[40]; - -// Create a serial input stream. -ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); -//============================================================================== -// Error messages stored in flash. -#define error(msg) sd.errorHalt(F(msg)) -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - delay(1000); - - cout << F("Type any character to start\n"); - // Wait for input line and discard. - cin.readline(); - cout << endl; - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - if (sd.exists("Folder1") - || sd.exists("Folder1/file1.txt") - || sd.exists("Folder1/File2.txt")) { - error("Please remove existing Folder1, file1.txt, and File2.txt"); - } - - int rootFileCount = 0; - if (!root.open("/")) { - error("open root failed"); - } - while (file.openNext(&root, O_RDONLY)) { - if (!file.isHidden()) { - rootFileCount++; - } - file.close(); - if (rootFileCount > 10) { - error("Too many files in root. Please use an empty SD."); - } - } - if (rootFileCount) { - cout << F("\nPlease use an empty SD for best results.\n\n"); - delay(1000); - } - // Create a new folder. - if (!sd.mkdir("Folder1")) { - error("Create Folder1 failed"); - } - cout << F("Created Folder1\n"); - - // Create a file in Folder1 using a path. - if (!file.open("Folder1/file1.txt", O_WRONLY | O_CREAT)) { - error("create Folder1/file1.txt failed"); - } - file.close(); - cout << F("Created Folder1/file1.txt\n"); - - // Change volume working directory to Folder1. - if (!sd.chdir("Folder1")) { - error("chdir failed for Folder1.\n"); - } - cout << F("chdir to Folder1\n"); - - // Create File2.txt in current directory. - if (!file.open("File2.txt", O_WRONLY | O_CREAT)) { - error("create File2.txt failed"); - } - file.close(); - cout << F("Created File2.txt in current directory\n"); - - cout << F("\nList of files on the SD.\n"); - sd.ls("/", LS_R); - - // Remove files from current directory. - if (!sd.remove("file1.txt") || !sd.remove("File2.txt")) { - error("remove failed"); - } - cout << F("\nfile1.txt and File2.txt removed.\n"); - - // Change current directory to root. - if (!sd.chdir()) { - error("chdir to root failed.\n"); - } - - cout << F("\nList of files on the SD.\n"); - sd.ls(LS_R); - - // Remove Folder1. - if (!sd.rmdir("Folder1")) { - error("rmdir for Folder1 failed\n"); - } - - cout << F("\nFolder1 removed.\n"); - cout << F("\nList of files on the SD.\n"); - sd.ls(LS_R); - cout << F("Done!\n"); -} -//------------------------------------------------------------------------------ -// Nothing happens in loop. -void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/OpenNext/OpenNext.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/OpenNext/OpenNext.ino deleted file mode 100644 index ca5ac303..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/OpenNext/OpenNext.ino +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Print size, modify date/time, and name for all files in root. - */ -#include -#include "SdFat.h" - -// SD default chip select pin. -const uint8_t chipSelect = SS; - -// file system object -SdFat sd; - -SdFile root; -SdFile file; -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - - Serial.println("Type any character to start"); - while (!Serial.available()) { - yield(); - } - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - if (!root.open("/")) { - sd.errorHalt("open root failed"); - } - // Open next file in root. - // Warning, openNext starts at the current directory position - // so a rewind of the directory may be required. - while (file.openNext(&root, O_RDONLY)) { - file.printFileSize(&Serial); - Serial.write(' '); - file.printModifyDateTime(&Serial); - Serial.write(' '); - file.printName(&Serial); - if (file.isDir()) { - // Indicate a directory. - Serial.write('/'); - } - Serial.println(); - file.close(); - } - if (root.getError()) { - Serial.println("openNext failed"); - } else { - Serial.println("Done!"); - } -} -//------------------------------------------------------------------------------ -void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/QuickStart/QuickStart.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/QuickStart/QuickStart.ino deleted file mode 100644 index cea1249f..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/QuickStart/QuickStart.ino +++ /dev/null @@ -1,161 +0,0 @@ -// Quick hardware test for SPI card access. -// -#include -#include "SdFat.h" -#include "sdios.h" -// -// Set DISABLE_CHIP_SELECT to disable a second SPI device. -// For example, with the Ethernet shield, set DISABLE_CHIP_SELECT -// to 10 to disable the Ethernet controller. -const int8_t DISABLE_CHIP_SELECT = -1; -// -// Test with reduced SPI speed for breadboards. SD_SCK_MHZ(4) will select -// the highest speed supported by the board that is not over 4 MHz. -// Change SPI_SPEED to SD_SCK_MHZ(50) for best performance. -#define SPI_SPEED SD_SCK_MHZ(4) -//------------------------------------------------------------------------------ -// File system object. -SdFat sd; - -// Serial streams -ArduinoOutStream cout(Serial); - -// input buffer for line -char cinBuf[40]; -ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); - -// SD card chip select -int chipSelect; - -void cardOrSpeed() { - cout << F("Try another SD card or reduce the SPI bus speed.\n"); - cout << F("Edit SPI_SPEED in this program to change it.\n"); -} - -void reformatMsg() { - cout << F("Try reformatting the card. For best results use\n"); - cout << F("the SdFormatter program in SdFat/examples or download\n"); - cout << F("and use SDFormatter from www.sdcard.org/downloads.\n"); -} - -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - cout << F("\nSPI pins:\n"); - cout << F("MISO: ") << int(MISO) << endl; - cout << F("MOSI: ") << int(MOSI) << endl; - cout << F("SCK: ") << int(SCK) << endl; - cout << F("SS: ") << int(SS) << endl; - - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" - "a second SPI device. For example, with the Ethernet\n" - "shield, DISABLE_CHIP_SELECT should be set to 10\n" - "to disable the Ethernet controller.\n"); - } - cout << F( - "\nSD chip select is the key hardware option.\n" - "Common values are:\n" - "Arduino Ethernet shield, pin 4\n" - "Sparkfun SD shield, pin 8\n" - "Adafruit SD shields and modules, pin 10\n"); -} - -bool firstTry = true; -void loop() { - // Read any existing Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - if (!firstTry) { - cout << F("\nRestarting\n"); - } - firstTry = false; - - cout << F("\nEnter the chip select pin number: "); - while (!Serial.available()) { - yield(); - } - cin.readline(); - if (cin >> chipSelect) { - cout << chipSelect << endl; - } else { - cout << F("\nInvalid pin number\n"); - return; - } - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); - } else { - cout << F("\nDisabling SPI device on pin "); - cout << int(DISABLE_CHIP_SELECT) << endl; - pinMode(DISABLE_CHIP_SELECT, OUTPUT); - digitalWrite(DISABLE_CHIP_SELECT, HIGH); - } - if (!sd.begin(chipSelect, SPI_SPEED)) { - if (sd.card()->errorCode()) { - cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is chipSelect set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - "Is there a wiring/soldering problem?\n"); - cout << F("\nerrorCode: ") << hex << showbase; - cout << int(sd.card()->errorCode()); - cout << F(", errorData: ") << int(sd.card()->errorData()); - cout << dec << noshowbase << endl; - return; - } - if (sd.vol()->fatType() == 0) { - cout << F("Can't find a valid FAT16/FAT32 partition.\n"); - reformatMsg(); - return; - } - cout << F("begin failed, can't determine error type\n"); - return; - } - cout << F("\nCard successfully initialized.\n"); - cout << endl; - - uint32_t size = sd.card()->cardSize(); - if (size == 0) { - cout << F("Can't determine the card size.\n"); - cardOrSpeed(); - return; - } - uint32_t sizeMB = 0.000512 * size + 0.5; - cout << F("Card size: ") << sizeMB; - cout << F(" MB (MB = 1,000,000 bytes)\n"); - cout << endl; - cout << F("Volume is FAT") << int(sd.vol()->fatType()); - cout << F(", Cluster size (bytes): ") << 512L * sd.vol()->blocksPerCluster(); - cout << endl << endl; - - cout << F("Files found (date time size name):\n"); - sd.ls(LS_R | LS_DATE | LS_SIZE); - - if ((sizeMB > 1100 && sd.vol()->blocksPerCluster() < 64) - || (sizeMB < 2200 && sd.vol()->fatType() == 32)) { - cout << F("\nThis card should be reformatted for best performance.\n"); - cout << F("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); - cout << F("Only cards larger than 2 GB should be formatted FAT32.\n"); - reformatMsg(); - return; - } - // Read any extra Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - cout << F("\nSuccess! Type any character to restart.\n"); - while (!Serial.available()) { - yield(); - } -} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdFormatter/SdFormatter.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdFormatter/SdFormatter.ino deleted file mode 100644 index 40326a7a..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdFormatter/SdFormatter.ino +++ /dev/null @@ -1,552 +0,0 @@ -/* - * This program will format an SD or SDHC card. - * Warning all data will be deleted! - * - * For SD/SDHC cards larger than 64 MB this - * program attempts to match the format - * generated by SDFormatter available here: - * - * http://www.sdcard.org/consumers/formatter/ - * - * For smaller cards this program uses FAT16 - * and SDFormatter uses FAT12. - */ -#error use new Version 2 SdFormatter -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 -// -// Change the value of chipSelect if your hardware does -// not use the default value, SS. Common values are: -// Arduino Ethernet shield: pin 4 -// Sparkfun SD shield: pin 8 -// Adafruit SD shields and modules: pin 10 -const uint8_t chipSelect = SS; - -// Initialize at highest supported speed not over 50 MHz. -// Reduce max speed if errors occur. -#define SPI_SPEED SD_SCK_MHZ(50) - -// Print extra info for debug if DEBUG_PRINT is nonzero -#define DEBUG_PRINT 0 -#include -#include "SdFat.h" -#include "sdios.h" -#if DEBUG_PRINT -#include "FreeStack.h" -#endif // DEBUG_PRINT - -// Serial output stream -ArduinoOutStream cout(Serial); - -#if USE_SDIO -// Use faster SdioCardEX -SdioCardEX card; -// SdioCard card; -#else // USE_SDIO -Sd2Card card; -#endif // USE_SDIO - -uint32_t cardSizeBlocks; -uint32_t cardCapacityMB; - -// cache for SD block -cache_t cache; - -// MBR information -uint8_t partType; -uint32_t relSector; -uint32_t partSize; - -// Fake disk geometry -uint8_t numberOfHeads; -uint8_t sectorsPerTrack; - -// FAT parameters -uint16_t reservedSectors; -uint8_t sectorsPerCluster; -uint32_t fatStart; -uint32_t fatSize; -uint32_t dataStart; - -// constants for file system structure -uint16_t const BU16 = 128; -uint16_t const BU32 = 8192; - -// strings needed in file system structures -char noName[] = "NO NAME "; -char fat16str[] = "FAT16 "; -char fat32str[] = "FAT32 "; -//------------------------------------------------------------------------------ -#define sdError(msg) {cout << F("error: ") << F(msg) << endl; sdErrorHalt();} -//------------------------------------------------------------------------------ -void sdErrorHalt() { - if (card.errorCode()) { - cout << F("SD error: ") << hex << int(card.errorCode()); - cout << ',' << int(card.errorData()) << dec << endl; - } - while (true) {} -} -//------------------------------------------------------------------------------ -#if DEBUG_PRINT -void debugPrint() { - cout << F("FreeStack: ") << FreeStack() << endl; - cout << F("partStart: ") << relSector << endl; - cout << F("partSize: ") << partSize << endl; - cout << F("reserved: ") << reservedSectors << endl; - cout << F("fatStart: ") << fatStart << endl; - cout << F("fatSize: ") << fatSize << endl; - cout << F("dataStart: ") << dataStart << endl; - cout << F("clusterCount: "); - cout << ((relSector + partSize - dataStart)/sectorsPerCluster) << endl; - cout << endl; - cout << F("Heads: ") << int(numberOfHeads) << endl; - cout << F("Sectors: ") << int(sectorsPerTrack) << endl; - cout << F("Cylinders: "); - cout << cardSizeBlocks/(numberOfHeads*sectorsPerTrack) << endl; -} -#endif // DEBUG_PRINT -//------------------------------------------------------------------------------ -// write cached block to the card -uint8_t writeCache(uint32_t lbn) { - return card.writeBlock(lbn, cache.data); -} -//------------------------------------------------------------------------------ -// initialize appropriate sizes for SD capacity -void initSizes() { - if (cardCapacityMB <= 6) { - sdError("Card is too small."); - } else if (cardCapacityMB <= 16) { - sectorsPerCluster = 2; - } else if (cardCapacityMB <= 32) { - sectorsPerCluster = 4; - } else if (cardCapacityMB <= 64) { - sectorsPerCluster = 8; - } else if (cardCapacityMB <= 128) { - sectorsPerCluster = 16; - } else if (cardCapacityMB <= 1024) { - sectorsPerCluster = 32; - } else if (cardCapacityMB <= 32768) { - sectorsPerCluster = 64; - } else { - // SDXC cards - sectorsPerCluster = 128; - } - - cout << F("Blocks/Cluster: ") << int(sectorsPerCluster) << endl; - // set fake disk geometry - sectorsPerTrack = cardCapacityMB <= 256 ? 32 : 63; - - if (cardCapacityMB <= 16) { - numberOfHeads = 2; - } else if (cardCapacityMB <= 32) { - numberOfHeads = 4; - } else if (cardCapacityMB <= 128) { - numberOfHeads = 8; - } else if (cardCapacityMB <= 504) { - numberOfHeads = 16; - } else if (cardCapacityMB <= 1008) { - numberOfHeads = 32; - } else if (cardCapacityMB <= 2016) { - numberOfHeads = 64; - } else if (cardCapacityMB <= 4032) { - numberOfHeads = 128; - } else { - numberOfHeads = 255; - } -} -//------------------------------------------------------------------------------ -// zero cache and optionally set the sector signature -void clearCache(uint8_t addSig) { - memset(&cache, 0, sizeof(cache)); - if (addSig) { - cache.mbr.mbrSig0 = BOOTSIG0; - cache.mbr.mbrSig1 = BOOTSIG1; - } -} -//------------------------------------------------------------------------------ -// zero FAT and root dir area on SD -void clearFatDir(uint32_t bgn, uint32_t count) { - clearCache(false); -#if USE_SDIO - for (uint32_t i = 0; i < count; i++) { - if (!card.writeBlock(bgn + i, cache.data)) { - sdError("Clear FAT/DIR writeBlock failed"); - } - if ((i & 0XFF) == 0) { - cout << '.'; - } - } -#else // USE_SDIO - if (!card.writeStart(bgn, count)) { - sdError("Clear FAT/DIR writeStart failed"); - } - for (uint32_t i = 0; i < count; i++) { - if ((i & 0XFF) == 0) { - cout << '.'; - } - if (!card.writeData(cache.data)) { - sdError("Clear FAT/DIR writeData failed"); - } - } - if (!card.writeStop()) { - sdError("Clear FAT/DIR writeStop failed"); - } -#endif // USE_SDIO - cout << endl; -} -//------------------------------------------------------------------------------ -// return cylinder number for a logical block number -uint16_t lbnToCylinder(uint32_t lbn) { - return lbn / (numberOfHeads * sectorsPerTrack); -} -//------------------------------------------------------------------------------ -// return head number for a logical block number -uint8_t lbnToHead(uint32_t lbn) { - return (lbn % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; -} -//------------------------------------------------------------------------------ -// return sector number for a logical block number -uint8_t lbnToSector(uint32_t lbn) { - return (lbn % sectorsPerTrack) + 1; -} -//------------------------------------------------------------------------------ -// format and write the Master Boot Record -void writeMbr() { - clearCache(true); - part_t* p = cache.mbr.part; - p->boot = 0; - uint16_t c = lbnToCylinder(relSector); - if (c > 1023) { - sdError("MBR CHS"); - } - p->beginCylinderHigh = c >> 8; - p->beginCylinderLow = c & 0XFF; - p->beginHead = lbnToHead(relSector); - p->beginSector = lbnToSector(relSector); - p->type = partType; - uint32_t endLbn = relSector + partSize - 1; - c = lbnToCylinder(endLbn); - if (c <= 1023) { - p->endCylinderHigh = c >> 8; - p->endCylinderLow = c & 0XFF; - p->endHead = lbnToHead(endLbn); - p->endSector = lbnToSector(endLbn); - } else { - // Too big flag, c = 1023, h = 254, s = 63 - p->endCylinderHigh = 3; - p->endCylinderLow = 255; - p->endHead = 254; - p->endSector = 63; - } - p->firstSector = relSector; - p->totalSectors = partSize; - if (!writeCache(0)) { - sdError("write MBR"); - } -} -//------------------------------------------------------------------------------ -// generate serial number from card size and micros since boot -uint32_t volSerialNumber() { - return (cardSizeBlocks << 8) + micros(); -} -//------------------------------------------------------------------------------ -// format the SD as FAT16 -void makeFat16() { - uint32_t nc; - for (dataStart = 2 * BU16;; dataStart += BU16) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 255)/256; - uint32_t r = BU16 + 1 + 2 * fatSize + 32; - if (dataStart < r) { - continue; - } - relSector = dataStart - r + BU16; - break; - } - // check valid cluster count for FAT16 volume - if (nc < 4085 || nc >= 65525) { - sdError("Bad cluster count"); - } - reservedSectors = 1; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + 2 * fatSize + reservedSectors + 32; - if (partSize < 32680) { - partType = 0X01; - } else if (partSize < 65536) { - partType = 0X04; - } else { - partType = 0X06; - } - // write MBR - writeMbr(); - clearCache(true); - fat_boot_t* pb = &cache.fbs; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->rootDirEntryCount = 512; - pb->mediaType = 0XF8; - pb->sectorsPerFat16 = fatSize; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->driveNumber = 0X80; - pb->bootSignature = EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); - memcpy(pb->fileSystemType, fat16str, sizeof(pb->fileSystemType)); - // write partition boot sector - if (!writeCache(relSector)) { - sdError("FAT16 write PBS failed"); - } - // clear FAT and root directory - clearFatDir(fatStart, dataStart - fatStart); - clearCache(false); - cache.fat16[0] = 0XFFF8; - cache.fat16[1] = 0XFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) - || !writeCache(fatStart + fatSize)) { - sdError("FAT16 reserve failed"); - } -} -//------------------------------------------------------------------------------ -// format the SD as FAT32 -void makeFat32() { - uint32_t nc; - relSector = BU32; - for (dataStart = 2 * BU32;; dataStart += BU32) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 127)/128; - uint32_t r = relSector + 9 + 2 * fatSize; - if (dataStart >= r) { - break; - } - } - // error if too few clusters in FAT32 volume - if (nc < 65525) { - sdError("Bad cluster count"); - } - reservedSectors = dataStart - relSector - 2 * fatSize; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + dataStart - relSector; - // type depends on address of end sector - // max CHS has lbn = 16450560 = 1024*255*63 - if ((relSector + partSize) <= 16450560) { - // FAT32 - partType = 0X0B; - } else { - // FAT32 with INT 13 - partType = 0X0C; - } - writeMbr(); - clearCache(true); - - fat32_boot_t* pb = &cache.fbs32; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->mediaType = 0XF8; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->sectorsPerFat32 = fatSize; - pb->fat32RootCluster = 2; - pb->fat32FSInfo = 1; - pb->fat32BackBootBlock = 6; - pb->driveNumber = 0X80; - pb->bootSignature = EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); - memcpy(pb->fileSystemType, fat32str, sizeof(pb->fileSystemType)); - // write partition boot sector and backup - if (!writeCache(relSector) - || !writeCache(relSector + 6)) { - sdError("FAT32 write PBS failed"); - } - clearCache(true); - // write extra boot area and backup - if (!writeCache(relSector + 2) - || !writeCache(relSector + 8)) { - sdError("FAT32 PBS ext failed"); - } - fat32_fsinfo_t* pf = &cache.fsinfo; - pf->leadSignature = FSINFO_LEAD_SIG; - pf->structSignature = FSINFO_STRUCT_SIG; - pf->freeCount = 0XFFFFFFFF; - pf->nextFree = 0XFFFFFFFF; - // write FSINFO sector and backup - if (!writeCache(relSector + 1) - || !writeCache(relSector + 7)) { - sdError("FAT32 FSINFO failed"); - } - clearFatDir(fatStart, 2 * fatSize + sectorsPerCluster); - clearCache(false); - cache.fat32[0] = 0x0FFFFFF8; - cache.fat32[1] = 0x0FFFFFFF; - cache.fat32[2] = 0x0FFFFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) - || !writeCache(fatStart + fatSize)) { - sdError("FAT32 reserve failed"); - } -} -//------------------------------------------------------------------------------ -// flash erase all data -uint32_t const ERASE_SIZE = 262144L; -void eraseCard() { - cout << endl << F("Erasing\n"); - uint32_t firstBlock = 0; - uint32_t lastBlock; - uint16_t n = 0; - - do { - lastBlock = firstBlock + ERASE_SIZE - 1; - if (lastBlock >= cardSizeBlocks) { - lastBlock = cardSizeBlocks - 1; - } - if (!card.erase(firstBlock, lastBlock)) { - sdError("erase failed"); - } - cout << '.'; - if ((n++)%32 == 31) { - cout << endl; - } - firstBlock += ERASE_SIZE; - } while (firstBlock < cardSizeBlocks); - cout << endl; - - if (!card.readBlock(0, cache.data)) { - sdError("readBlock"); - } - cout << hex << showbase << setfill('0') << internal; - cout << F("All data set to ") << setw(4) << int(cache.data[0]) << endl; - cout << dec << noshowbase << setfill(' ') << right; - cout << F("Erase done\n"); -} -//------------------------------------------------------------------------------ -void formatCard() { - cout << endl; - cout << F("Formatting\n"); - initSizes(); - if (card.type() != SD_CARD_TYPE_SDHC) { - cout << F("FAT16\n"); - makeFat16(); - } else { - cout << F("FAT32\n"); - makeFat32(); - } -#if DEBUG_PRINT - debugPrint(); -#endif // DEBUG_PRINT - cout << F("Format done\n"); -} -//------------------------------------------------------------------------------ -void setup() { - char c; - Serial.begin(9600); - // Wait for USB Serial - while (!Serial) { - yield(); - } - cout << F("Type any character to start\n"); - while (!Serial.available()) { - yield(); - } - // Discard any extra characters. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - cout << F( - "\n" - "This program can erase and/or format SD/SDHC cards.\n" - "\n" - "Erase uses the card's fast flash erase command.\n" - "Flash erase sets all data to 0X00 for most cards\n" - "and 0XFF for a few vendor's cards.\n" - "\n" - "Cards larger than 2 GB will be formatted FAT32 and\n" - "smaller cards will be formatted FAT16.\n" - "\n" - "Warning, all data on the card will be erased.\n" - "Enter 'Y' to continue: "); - while (!Serial.available()) { - yield(); - } - - c = Serial.read(); - cout << c << endl; - if (c != 'Y') { - cout << F("Quiting, you did not enter 'Y'.\n"); - return; - } - // Read any existing Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - cout << F( - "\n" - "Options are:\n" - "E - erase the card and skip formatting.\n" - "F - erase and then format the card. (recommended)\n" - "Q - quick format the card without erase.\n" - "\n" - "Enter option: "); - - while (!Serial.available()) { - yield(); - } - c = Serial.read(); - cout << c << endl; - if (!strchr("EFQ", c)) { - cout << F("Quiting, invalid option entered.") << endl; - return; - } -#if USE_SDIO - if (!card.begin()) { - sdError("card.begin failed"); - } -#else // USE_SDIO - if (!card.begin(chipSelect, SPI_SPEED)) { - cout << F( - "\nSD initialization failure!\n" - "Is the SD card inserted correctly?\n" - "Is chip select correct at the top of this program?\n"); - sdError("card.begin failed"); - } -#endif - cardSizeBlocks = card.cardSize(); - if (cardSizeBlocks == 0) { - sdError("cardSize"); - } - cardCapacityMB = (cardSizeBlocks + 2047)/2048; - - cout << F("Card Size: ") << setprecision(0) << 1.048576*cardCapacityMB; - cout << F(" MB, (MB = 1,000,000 bytes)") << endl; - - if (c == 'E' || c == 'F') { - eraseCard(); - } - if (c == 'F' || c == 'Q') { - formatCard(); - } -} -//------------------------------------------------------------------------------ -void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdInfo/SdInfo.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdInfo/SdInfo.ino deleted file mode 100644 index bee693c2..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SdInfo/SdInfo.ino +++ /dev/null @@ -1,248 +0,0 @@ -/* - * This program attempts to initialize an SD card and analyze its structure. - */ -#include -#include "SdFat.h" -#include "sdios.h" -#error Use new Version 2 SdInfo -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 -/* - * SD chip select pin. Common values are: - * - * Arduino Ethernet shield, pin 4. - * SparkFun SD shield, pin 8. - * Adafruit SD shields and modules, pin 10. - * Default SD chip select is the SPI SS pin. - */ -const uint8_t SD_CHIP_SELECT = SS; -/* - * Set DISABLE_CHIP_SELECT to disable a second SPI device. - * For example, with the Ethernet shield, set DISABLE_CHIP_SELECT - * to 10 to disable the Ethernet controller. - */ -const int8_t DISABLE_CHIP_SELECT = -1; - -#if USE_SDIO -// Use faster SdioCardEX -SdFatSdioEX sd; -// SdFatSdio sd; -#else // USE_SDIO -SdFat sd; -#endif // USE_SDIO - -// serial output steam -ArduinoOutStream cout(Serial); - -// global for card size -uint32_t cardSize; - -// global for card erase size -uint32_t eraseSize; -//------------------------------------------------------------------------------ -// store error strings in flash -#define sdErrorMsg(msg) sd.errorPrint(F(msg)); -//------------------------------------------------------------------------------ -uint8_t cidDmp() { - cid_t cid; - if (!sd.card()->readCID(&cid)) { - sdErrorMsg("readCID failed"); - return false; - } - cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; - cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; - cout << F("Product: "); - for (uint8_t i = 0; i < 5; i++) { - cout << cid.pnm[i]; - } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; - cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; - cout << endl; - return true; -} -//------------------------------------------------------------------------------ -uint8_t csdDmp() { - csd_t csd; - uint8_t eraseSingleBlock; - if (!sd.card()->readCSD(&csd)) { - sdErrorMsg("readCSD failed"); - return false; - } - if (csd.v1.csd_ver == 0) { - eraseSingleBlock = csd.v1.erase_blk_en; - eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; - } else if (csd.v2.csd_ver == 1) { - eraseSingleBlock = csd.v2.erase_blk_en; - eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; - } else { - cout << F("csd version error\n"); - return false; - } - eraseSize++; - cout << F("cardSize: ") << 0.000512*cardSize; - cout << F(" MB (MB = 1,000,000 bytes)\n"); - - cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); - cout << F("eraseSingleBlock: "); - if (eraseSingleBlock) { - cout << F("true\n"); - } else { - cout << F("false\n"); - } - return true; -} -//------------------------------------------------------------------------------ -// print partition table -uint8_t partDmp() { - mbr_t mbr; - if (!sd.card()->readBlock(0, (uint8_t*)&mbr)) { - sdErrorMsg("read MBR failed"); - return false; - } - for (uint8_t ip = 1; ip < 5; ip++) { - part_t *pt = &mbr.part[ip - 1]; - if ((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) { - cout << F("\nNo MBR. Assuming Super Floppy format.\n"); - return true; - } - } - cout << F("\nSD Partition Table\n"); - cout << F("part,boot,type,start,length\n"); - for (uint8_t ip = 1; ip < 5; ip++) { - part_t *pt = &mbr.part[ip - 1]; - cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); - cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; - } - return true; -} -//------------------------------------------------------------------------------ -void volDmp() { - cout << F("\nVolume is FAT") << int(sd.vol()->fatType()) << endl; - cout << F("blocksPerCluster: ") << int(sd.vol()->blocksPerCluster()) << endl; - cout << F("clusterCount: ") << sd.vol()->clusterCount() << endl; - cout << F("freeClusters: "); - uint32_t volFree = sd.vol()->freeClusterCount(); - cout << volFree << endl; - float fs = 0.000512*volFree*sd.vol()->blocksPerCluster(); - cout << F("freeSpace: ") << fs << F(" MB (MB = 1,000,000 bytes)\n"); - cout << F("fatStartBlock: ") << sd.vol()->fatStartBlock() << endl; - cout << F("fatCount: ") << int(sd.vol()->fatCount()) << endl; - cout << F("blocksPerFat: ") << sd.vol()->blocksPerFat() << endl; - cout << F("rootDirStart: ") << sd.vol()->rootDirStart() << endl; - cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; - if (sd.vol()->dataStartBlock() % eraseSize) { - cout << F("Data area is not aligned on flash erase boundaries!\n"); - cout << F("Download and use formatter from www.sdcard.org!\n"); - } -} -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - - // use uppercase in hex and use 0X base prefix - cout << uppercase << showbase << endl; - - // F stores strings in flash to save RAM - cout << F("SdFat version: ") << SD_FAT_VERSION << endl; -#if !USE_SDIO - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); - } else { - cout << F("\nDisabling SPI device on pin "); - cout << int(DISABLE_CHIP_SELECT) << endl; - pinMode(DISABLE_CHIP_SELECT, OUTPUT); - digitalWrite(DISABLE_CHIP_SELECT, HIGH); - } - cout << F("\nAssuming the SD chip select pin is: ") <= 0); - - // F stores strings in flash to save RAM - cout << F("\ntype any character to start\n"); - while (!Serial.available()) { - yield(); - } - - uint32_t t = millis(); -#if USE_SDIO - if (!sd.cardBegin()) { - sdErrorMsg("\ncardBegin failed"); - return; - } -#else // USE_SDIO - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.cardBegin(SD_CHIP_SELECT, SD_SCK_MHZ(50))) { - sdErrorMsg("cardBegin failed"); - return; - } - #endif // USE_SDIO - t = millis() - t; - - cardSize = sd.card()->cardSize(); - if (cardSize == 0) { - sdErrorMsg("cardSize failed"); - return; - } - cout << F("\ninit time: ") << t << " ms" << endl; - cout << F("\nCard type: "); - switch (sd.card()->type()) { - case SD_CARD_TYPE_SD1: - cout << F("SD1\n"); - break; - - case SD_CARD_TYPE_SD2: - cout << F("SD2\n"); - break; - - case SD_CARD_TYPE_SDHC: - if (cardSize < 70000000) { - cout << F("SDHC\n"); - } else { - cout << F("SDXC\n"); - } - break; - - default: - cout << F("Unknown\n"); - } - if (!cidDmp()) { - return; - } - if (!csdDmp()) { - return; - } - uint32_t ocr; - if (!sd.card()->readOCR(&ocr)) { - sdErrorMsg("\nreadOCR failed"); - return; - } - cout << F("OCR: ") << hex << ocr << dec << endl; - if (!partDmp()) { - return; - } - if (!sd.fsBegin()) { - sdErrorMsg("\nFile System initialization failed.\n"); - return; - } - volDmp(); -} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino deleted file mode 100644 index 874d7d0d..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino +++ /dev/null @@ -1,59 +0,0 @@ -// An example of the SdFatSoftSpi template class. -// This example is for an Adafruit Data Logging Shield on a Mega. -// Software SPI is required on Mega since this shield connects to pins 10-13. -// This example will also run on an Uno and other boards using software SPI. -// -#include -#include "SdFat.h" -#error See Version 2 software SPI example -#if ENABLE_SOFTWARE_SPI_CLASS // Must be set in SdFat/SdFatConfig.h -// -// Pin numbers in templates must be constants. -const uint8_t SOFT_MISO_PIN = 12; -const uint8_t SOFT_MOSI_PIN = 11; -const uint8_t SOFT_SCK_PIN = 13; -// -// Chip select may be constant or RAM variable. -const uint8_t SD_CHIP_SELECT_PIN = 10; - -// SdFat software SPI template -SdFatSoftSpi sd; - -// Test file. -SdFile file; - -void setup() { - Serial.begin(9600); - // Wait for USB Serial - while (!Serial) { - yield(); - } - Serial.println("Type any character to start"); - while (!Serial.available()) { - yield(); - } - - if (!sd.begin(SD_CHIP_SELECT_PIN)) { - sd.initErrorHalt(); - } - - if (!file.open("SoftSPI.txt", O_RDWR | O_CREAT)) { - sd.errorHalt(F("open failed")); - } - file.println(F("This line was printed using software SPI.")); - - file.rewind(); - - while (file.available()) { - Serial.write(file.read()); - } - - file.close(); - - Serial.println(F("Done.")); -} -//------------------------------------------------------------------------------ -void loop() {} -#else // ENABLE_SOFTWARE_SPI_CLASS -#error ENABLE_SOFTWARE_SPI_CLASS must be set non-zero in SdFat/SdFatConfig.h -#endif //ENABLE_SOFTWARE_SPI_CLASS \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino deleted file mode 100644 index 1c5214f4..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino +++ /dev/null @@ -1,169 +0,0 @@ -// Simple performance test for Teensy 3.5/3.6 SDHC. -// Demonstrates yield() efficiency. - -// Warning SdFatSdio and SdFatSdioEX normally should -// not both be used in a program. -// Each has its own cache and member variables. - -#include "SdFat.h" -#error See Version 2 SDIO example -// 32 KiB buffer. -const size_t BUF_DIM = 32768; - -// 8 MiB file. -const uint32_t FILE_SIZE = 256UL*BUF_DIM; - -SdFatSdio sd; - -SdFatSdioEX sdEx; - -File file; - -uint8_t buf[BUF_DIM]; - -// buffer as uint32_t -uint32_t* buf32 = (uint32_t*)buf; - -// Total usec in read/write calls. -uint32_t totalMicros = 0; -// Time in yield() function. -uint32_t yieldMicros = 0; -// Number of yield calls. -uint32_t yieldCalls = 0; -// Max busy time for single yield call. -uint32_t yieldMaxUsec = 0; -// Control access to the two versions of SdFat. -bool useEx = false; -//----------------------------------------------------------------------------- -bool sdBusy() { - return useEx ? sdEx.card()->isBusy() : sd.card()->isBusy(); -} -//----------------------------------------------------------------------------- -void errorHalt(const char* msg) { - if (useEx) { - sdEx.errorHalt(msg); - } else { - sd.errorHalt(msg); - } -} -//------------------------------------------------------------------------------ -uint32_t kHzSdClk() { - return useEx ? sdEx.card()->kHzSdClk() : sd.card()->kHzSdClk(); -} -//------------------------------------------------------------------------------ -// Replace "weak" system yield() function. -void yield() { - // Only count cardBusy time. - if (!sdBusy()) { - return; - } - uint32_t m = micros(); - yieldCalls++; - while (sdBusy()) { - // Do something here. - } - m = micros() - m; - if (m > yieldMaxUsec) { - yieldMaxUsec = m; - } - yieldMicros += m; -} -//----------------------------------------------------------------------------- -void runTest() { - // Zero Stats - totalMicros = 0; - yieldMicros = 0; - yieldCalls = 0; - yieldMaxUsec = 0; - if (!file.open("TeensyDemo.bin", O_RDWR | O_CREAT)) { - errorHalt("open failed"); - } - Serial.println("\nsize,write,read"); - Serial.println("bytes,KB/sec,KB/sec"); - for (size_t nb = 512; nb <= BUF_DIM; nb *= 2) { - file.truncate(0); - uint32_t nRdWr = FILE_SIZE/nb; - Serial.print(nb); - Serial.print(','); - uint32_t t = micros(); - for (uint32_t n = 0; n < nRdWr; n++) { - // Set start and end of buffer. - buf32[0] = n; - buf32[nb/4 - 1] = n; - if (nb != file.write(buf, nb)) { - errorHalt("write failed"); - } - } - t = micros() - t; - totalMicros += t; - Serial.print(1000.0*FILE_SIZE/t); - Serial.print(','); - file.rewind(); - t = micros(); - - for (uint32_t n = 0; n < nRdWr; n++) { - if ((int)nb != file.read(buf, nb)) { - errorHalt("read failed"); - } - // crude check of data. - if (buf32[0] != n || buf32[nb/4 - 1] != n) { - errorHalt("data check"); - } - } - t = micros() - t; - totalMicros += t; - Serial.println(1000.0*FILE_SIZE/t); - } - file.close(); - Serial.print("\ntotalMicros "); - Serial.println(totalMicros); - Serial.print("yieldMicros "); - Serial.println(yieldMicros); - Serial.print("yieldCalls "); - Serial.println(yieldCalls); - Serial.print("yieldMaxUsec "); - Serial.println(yieldMaxUsec); - Serial.print("kHzSdClk "); - Serial.println(kHzSdClk()); - Serial.println("Done"); -} -//----------------------------------------------------------------------------- -void setup() { - Serial.begin(9600); - while (!Serial) { - } - Serial.println("SdFatSdioEX uses extended multi-block transfers without DMA."); - Serial.println("SdFatSdio uses a traditional DMA SDIO implementation."); - Serial.println("Note the difference is speed and busy yield time.\n"); -} -//----------------------------------------------------------------------------- -void loop() { - do { - delay(10); - } while (Serial.available() && Serial.read()); - - Serial.println("Type '1' for SdFatSdioEX or '2' for SdFatSdio"); - while (!Serial.available()) { - } - char c = Serial.read(); - if (c != '1' && c != '2') { - Serial.println("Invalid input"); - return; - } - if (c =='1') { - useEx = true; - if (!sdEx.begin()) { - sd.initErrorHalt("SdFatSdioEX begin() failed"); - } - // make sdEx the current volume. - sdEx.chvol(); - } else { - useEx = false; - if (!sd.begin()) { - sd.initErrorHalt("SdFatSdio begin() failed"); - } - // make sd the current volume. - sd.chvol(); - } - runTest(); -} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/bench/bench.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/bench/bench.ino deleted file mode 100644 index b4f0cf30..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/bench/bench.ino +++ /dev/null @@ -1,222 +0,0 @@ -/* - * This program is a simple binary write/read benchmark. - */ -#include -#include "SdFat.h" -#include "sdios.h" -#include "FreeStack.h" - -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 - -// SD chip select pin -const uint8_t chipSelect = SS; - -// Size of read/write. -const size_t BUF_SIZE = 512; - -// File size in MB where MB = 1,000,000 bytes. -const uint32_t FILE_SIZE_MB = 5; - -// Write pass count. -const uint8_t WRITE_COUNT = 2; - -// Read pass count. -const uint8_t READ_COUNT = 2; -//============================================================================== -// End of configuration constants. -//------------------------------------------------------------------------------ -// File size in bytes. -const uint32_t FILE_SIZE = 1000000UL*FILE_SIZE_MB; - -uint8_t buf[BUF_SIZE]; - -// file system -#if USE_SDIO -// Traditional DMA version. -// SdFatSdio sd; -// Faster version. -SdFatSdioEX sd; -#else // USE_SDIO -SdFat sd; -#endif // USE_SDIO - -// Set ENABLE_EXTENDED_TRANSFER_CLASS to use extended SD I/O. -// Requires dedicated use of the SPI bus. -// SdFatEX sd; - -// Set ENABLE_SOFTWARE_SPI_CLASS to use software SPI. -// Args are misoPin, mosiPin, sckPin. -// SdFatSoftSpi<6, 7, 5> sd; - -// test file -SdFile file; - -// Serial output stream -ArduinoOutStream cout(Serial); -//------------------------------------------------------------------------------ -// Store error strings in flash to save RAM. -#define error(s) sd.errorHalt(F(s)) -//------------------------------------------------------------------------------ -void cidDmp() { - cid_t cid; - if (!sd.card()->readCID(&cid)) { - error("readCID failed"); - } - cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; - cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; - cout << F("Product: "); - for (uint8_t i = 0; i < 5; i++) { - cout << cid.pnm[i]; - } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; - cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; - cout << endl; -} -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - delay(1000); - cout << F("\nUse a freshly formatted SD for best performance.\n"); - - // use uppercase in hex and use 0X base prefix - cout << uppercase << showbase << endl; -} -//------------------------------------------------------------------------------ -void loop() { - float s; - uint32_t t; - uint32_t maxLatency; - uint32_t minLatency; - uint32_t totalLatency; - - // Discard any input. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - // F( stores strings in flash to save RAM - cout << F("Type any character to start\n"); - while (!Serial.available()) { - yield(); - } - cout << F("chipSelect: ") << int(chipSelect) << endl; - cout << F("FreeStack: ") << FreeStack() << endl; - -#if USE_SDIO - if (!sd.begin()) { - sd.initErrorHalt(); - } -#else // USE_SDIO - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } -#endif // USE_SDIO - cout << F("Type is FAT") << int(sd.vol()->fatType()) << endl; - cout << F("Card size: ") << sd.card()->cardSize()*512E-9; - cout << F(" GB (GB = 1E9 bytes)") << endl; - - cidDmp(); - - // open or create file - truncate existing file. - if (!file.open("bench.dat", O_RDWR | O_CREAT | O_TRUNC)) { - error("open failed"); - } - - // fill buf with known data - for (size_t i = 0; i < (BUF_SIZE-2); i++) { - buf[i] = 'A' + (i % 26); - } - buf[BUF_SIZE-2] = '\r'; - buf[BUF_SIZE-1] = '\n'; - - cout << F("File size ") << FILE_SIZE_MB << F(" MB\n"); - cout << F("Buffer size ") << BUF_SIZE << F(" bytes\n"); - cout << F("Starting write test, please wait.") << endl << endl; - - // do write test - uint32_t n = FILE_SIZE/sizeof(buf); - cout < m) { - minLatency = m; - } - totalLatency += m; - } - file.sync(); - t = millis() - t; - s = file.fileSize(); - cout << s/t <<',' << maxLatency << ',' << minLatency; - cout << ',' << totalLatency/n << endl; - } - cout << endl << F("Starting read test, please wait.") << endl; - cout << endl < m) { - minLatency = m; - } - totalLatency += m; - if (buf[BUF_SIZE-1] != '\n') { - error("data check"); - } - } - s = file.fileSize(); - t = millis() - t; - cout << s/t <<',' << maxLatency << ',' << minLatency; - cout << ',' << totalLatency/n << endl; - } - cout << endl << F("Done") << endl; - file.close(); -} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/rename/rename.ino b/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/rename/rename.ino deleted file mode 100644 index 0953e061..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/rename/rename.ino +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This program demonstrates use of SdFile::rename() - * and SdFat::rename(). - */ -#include -#include "SdFat.h" -#include "sdios.h" - -// SD chip select pin -const uint8_t chipSelect = SS; - -// file system -SdFat sd; - -// Serial print stream -ArduinoOutStream cout(Serial); -//------------------------------------------------------------------------------ -// store error strings in flash to save RAM -#define error(s) sd.errorHalt(F(s)) -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - yield(); - } - cout << F("Insert an empty SD. Type any character to start.") << endl; - while (!Serial.available()) { - yield(); - } - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - - // Remove file/dirs from previous run. - if (sd.exists("dir2/DIR3/NAME3.txt")) { - cout << F("Removing /dir2/DIR3/NAME3.txt") << endl; - if (!sd.remove("dir2/DIR3/NAME3.txt") || - !sd.rmdir("dir2/DIR3/") || - !sd.rmdir("dir2/")) { - error("remove/rmdir failed"); - } - } - // create a file and write one line to the file - SdFile file("Name1.txt", O_WRONLY | O_CREAT); - if (!file.isOpen()) { - error("Name1.txt"); - } - file.println("A test line for Name1.txt"); - - // rename the file name2.txt and add a line. - if (!file.rename("name2.txt")) { - error("name2.txt"); - } - file.println("A test line for name2.txt"); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - // make a new directory - "Dir1" - if (!sd.mkdir("Dir1")) { - error("Dir1"); - } - - // move file into Dir1, rename it NAME3.txt and add a line - if (!file.rename("Dir1/NAME3.txt")) { - error("NAME3.txt"); - } - file.println("A line for Dir1/NAME3.txt"); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - // make directory "dir2" - if (!sd.mkdir("dir2")) { - error("dir2"); - } - - // close file before rename(oldPath, newPath) - file.close(); - - // move Dir1 into dir2 and rename it DIR3 - if (!sd.rename("Dir1", "dir2/DIR3")) { - error("dir2/DIR3"); - } - - // open file for append in new location and add a line - if (!file.open("dir2/DIR3/NAME3.txt", O_WRONLY | O_APPEND)) { - error("dir2/DIR3/NAME3.txt"); - } - file.println("A line for dir2/DIR3/NAME3.txt"); - file.close(); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - cout << F("Done") << endl; -} -void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip b/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip deleted file mode 100644 index bb8e5440..00000000 Binary files a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip and /dev/null differ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.cpp b/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.cpp deleted file mode 100644 index 7ba957e4..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/** - * Copyright (c) 2011-2020 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#include "PrintBasic.h" -#include - -size_t PrintBasic::print(long n, uint8_t base) { - if (n < 0 && base == 10) { - return print('-') + printNum(-n, base); - } - return printNum(n, base); -} -size_t PrintBasic::printNum(unsigned long n, uint8_t base) { - const uint8_t DIM = 8*sizeof(long); - char buf[DIM]; - char *str = &buf[DIM]; - - if (base < 2) return 0; - - do { - char c = n%base; - n /= base; - *--str = c + (c < 10 ? '0' : 'A' - 10); - } while (n); - return write(str, &buf[DIM] - str); -} - -size_t PrintBasic::printDouble(double n, uint8_t prec) { - // Max printable 32-bit floating point number. AVR uses 32-bit double. - const double maxfp = static_cast(0XFFFFFF00UL); - size_t rtn = 0; - - if (isnan(n)) { - return write("NaN"); - } - if (n < 0) { - n = -n; - rtn += print('-'); - } - if (isinf(n)) { - return rtn + write("Inf"); - } - if (n > maxfp) { - return rtn + write("Ovf"); - } - - double round = 0.5; - for (uint8_t i = 0; i < prec; ++i) { - round *= 0.1; - } - - n += round; - - uint32_t whole = (uint32_t)n; - rtn += print(whole); - - if (prec) { - rtn += print('.'); - double fraction = n - static_cast(whole); - for (uint8_t i = 0; i < prec; i++) { - fraction *= 10.0; - uint8_t digit = fraction; - rtn += print(digit); - fraction -= digit; - } - } - return rtn; -} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.h b/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.h deleted file mode 100644 index 42e9df5c..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.h +++ /dev/null @@ -1,490 +0,0 @@ -/** - * Copyright (c) 2011-2021 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#ifndef SdCardInfo_h -#define SdCardInfo_h -#include -#include "../common/SysCall.h" -// Based on the document: -// -// SD Specifications -// Part 1 -// Physical Layer -// Simplified Specification -// Version 5.00 -// Aug 10, 2016 -// -// https://www.sdcard.org/downloads/pls/ -//------------------------------------------------------------------------------ -// SD card errors -// See the SD Specification for command info. -#define SD_ERROR_CODE_LIST\ - SD_CARD_ERROR(NONE, "No error")\ - SD_CARD_ERROR(CMD0, "Card reset failed")\ - SD_CARD_ERROR(CMD2, "SDIO read CID")\ - SD_CARD_ERROR(CMD3, "SDIO publish RCA")\ - SD_CARD_ERROR(CMD6, "Switch card function")\ - SD_CARD_ERROR(CMD7, "SDIO card select")\ - SD_CARD_ERROR(CMD8, "Send and check interface settings")\ - SD_CARD_ERROR(CMD9, "Read CSD data")\ - SD_CARD_ERROR(CMD10, "Read CID data")\ - SD_CARD_ERROR(CMD12, "Stop multiple block read")\ - SD_CARD_ERROR(CMD13, "Read card status")\ - SD_CARD_ERROR(CMD17, "Read single block")\ - SD_CARD_ERROR(CMD18, "Read multiple blocks")\ - SD_CARD_ERROR(CMD24, "Write single block")\ - SD_CARD_ERROR(CMD25, "Write multiple blocks")\ - SD_CARD_ERROR(CMD32, "Set first erase block")\ - SD_CARD_ERROR(CMD33, "Set last erase block")\ - SD_CARD_ERROR(CMD38, "Erase selected blocks")\ - SD_CARD_ERROR(CMD58, "Read OCR register")\ - SD_CARD_ERROR(CMD59, "Set CRC mode")\ - SD_CARD_ERROR(ACMD6, "Set SDIO bus width")\ - SD_CARD_ERROR(ACMD13, "Read extended status")\ - SD_CARD_ERROR(ACMD23, "Set pre-erased count")\ - SD_CARD_ERROR(ACMD41, "Activate card initialization")\ - SD_CARD_ERROR(READ_TOKEN, "Bad read data token")\ - SD_CARD_ERROR(READ_CRC, "Read CRC error")\ - SD_CARD_ERROR(READ_FIFO, "SDIO fifo read timeout")\ - SD_CARD_ERROR(READ_REG, "Read CID or CSD failed.")\ - SD_CARD_ERROR(READ_START, "Bad readStart argument")\ - SD_CARD_ERROR(READ_TIMEOUT, "Read data timeout")\ - SD_CARD_ERROR(STOP_TRAN, "Multiple block stop failed")\ - SD_CARD_ERROR(TRANSFER_COMPLETE, "SDIO transfer complete")\ - SD_CARD_ERROR(WRITE_DATA, "Write data not accepted")\ - SD_CARD_ERROR(WRITE_FIFO, "SDIO fifo write timeout")\ - SD_CARD_ERROR(WRITE_START, "Bad writeStart argument")\ - SD_CARD_ERROR(WRITE_PROGRAMMING, "Flash programming")\ - SD_CARD_ERROR(WRITE_TIMEOUT, "Write timeout")\ - SD_CARD_ERROR(DMA, "DMA transfer failed")\ - SD_CARD_ERROR(ERASE, "Card did not accept erase commands")\ - SD_CARD_ERROR(ERASE_SINGLE_SECTOR, "Card does not support erase")\ - SD_CARD_ERROR(ERASE_TIMEOUT, "Erase command timeout")\ - SD_CARD_ERROR(INIT_NOT_CALLED, "Card has not been initialized")\ - SD_CARD_ERROR(INVALID_CARD_CONFIG, "Invalid card config")\ - SD_CARD_ERROR(FUNCTION_NOT_SUPPORTED, "Unsupported SDIO command") - -enum { -#define SD_CARD_ERROR(e, m) SD_CARD_ERROR_##e, - SD_ERROR_CODE_LIST -#undef SD_CARD_ERROR - SD_CARD_ERROR_UNKNOWN -}; -void printSdErrorSymbol(print_t* pr, uint8_t code); -void printSdErrorText(print_t* pr, uint8_t code); -//------------------------------------------------------------------------------ -// card types -/** Standard capacity V1 SD card */ -const uint8_t SD_CARD_TYPE_SD1 = 1; -/** Standard capacity V2 SD card */ -const uint8_t SD_CARD_TYPE_SD2 = 2; -/** High Capacity SD card */ -const uint8_t SD_CARD_TYPE_SDHC = 3; -//------------------------------------------------------------------------------ -// SD operation timeouts -/** CMD0 retry count */ -const uint8_t SD_CMD0_RETRY = 10; -/** command timeout ms */ -const uint16_t SD_CMD_TIMEOUT = 300; -/** erase timeout ms */ -const uint16_t SD_ERASE_TIMEOUT = 10000; -/** init timeout ms */ -const uint16_t SD_INIT_TIMEOUT = 2000; -/** read timeout ms */ -const uint16_t SD_READ_TIMEOUT = 300; -/** write time out ms */ -const uint16_t SD_WRITE_TIMEOUT = 600; -//------------------------------------------------------------------------------ -// SD card commands -/** GO_IDLE_STATE - init card in spi mode if CS low */ -const uint8_t CMD0 = 0X00; -/** ALL_SEND_CID - Asks any card to send the CID. */ -const uint8_t CMD2 = 0X02; -/** SEND_RELATIVE_ADDR - Ask the card to publish a new RCA. */ -const uint8_t CMD3 = 0X03; -/** SWITCH_FUNC - Switch Function Command */ -const uint8_t CMD6 = 0X06; -/** SELECT/DESELECT_CARD - toggles between the stand-by and transfer states. */ -const uint8_t CMD7 = 0X07; -/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ -const uint8_t CMD8 = 0X08; -/** SEND_CSD - read the Card Specific Data (CSD register) */ -const uint8_t CMD9 = 0X09; -/** SEND_CID - read the card identification information (CID register) */ -const uint8_t CMD10 = 0X0A; -/** VOLTAGE_SWITCH -Switch to 1.8V bus signaling level. */ -const uint8_t CMD11 = 0X0B; -/** STOP_TRANSMISSION - end multiple sector read sequence */ -const uint8_t CMD12 = 0X0C; -/** SEND_STATUS - read the card status register */ -const uint8_t CMD13 = 0X0D; -/** READ_SINGLE_SECTOR - read a single data sector from the card */ -const uint8_t CMD17 = 0X11; -/** READ_MULTIPLE_SECTOR - read multiple data sectors from the card */ -const uint8_t CMD18 = 0X12; -/** WRITE_SECTOR - write a single data sector to the card */ -const uint8_t CMD24 = 0X18; -/** WRITE_MULTIPLE_SECTOR - write sectors of data until a STOP_TRANSMISSION */ -const uint8_t CMD25 = 0X19; -/** ERASE_WR_BLK_START - sets the address of the first sector to be erased */ -const uint8_t CMD32 = 0X20; -/** ERASE_WR_BLK_END - sets the address of the last sector of the continuous - range to be erased*/ -const uint8_t CMD33 = 0X21; -/** ERASE - erase all previously selected sectors */ -const uint8_t CMD38 = 0X26; -/** APP_CMD - escape for application specific command */ -const uint8_t CMD55 = 0X37; -/** READ_OCR - read the OCR register of a card */ -const uint8_t CMD58 = 0X3A; -/** CRC_ON_OFF - enable or disable CRC checking */ -const uint8_t CMD59 = 0X3B; -/** SET_BUS_WIDTH - Defines the data bus width for data transfer. */ -const uint8_t ACMD6 = 0X06; -/** SD_STATUS - Send the SD Status. */ -const uint8_t ACMD13 = 0X0D; -/** SET_WR_BLK_ERASE_COUNT - Set the number of write sectors to be - pre-erased before writing */ -const uint8_t ACMD23 = 0X17; -/** SD_SEND_OP_COMD - Sends host capacity support information and - activates the card's initialization process */ -const uint8_t ACMD41 = 0X29; -//============================================================================== -// CARD_STATUS -/** The command's argument was out of the allowed range for this card. */ -const uint32_t CARD_STATUS_OUT_OF_RANGE = 1UL << 31; -/** A misaligned address which did not match the sector length. */ -const uint32_t CARD_STATUS_ADDRESS_ERROR = 1UL << 30; -/** The transferred sector length is not allowed for this card. */ -const uint32_t CARD_STATUS_SECTOR_LEN_ERROR = 1UL << 29; -/** An error in the sequence of erase commands occurred. */ -const uint32_t CARD_STATUS_ERASE_SEQ_ERROR = 1UL <<28; -/** An invalid selection of write-sectors for erase occurred. */ -const uint32_t CARD_STATUS_ERASE_PARAM = 1UL << 27; -/** Set when the host attempts to write to a protected sector. */ -const uint32_t CARD_STATUS_WP_VIOLATION = 1UL << 26; -/** When set, signals that the card is locked by the host. */ -const uint32_t CARD_STATUS_CARD_IS_LOCKED = 1UL << 25; -/** Set when a sequence or password error has been detected. */ -const uint32_t CARD_STATUS_LOCK_UNLOCK_FAILED = 1UL << 24; -/** The CRC check of the previous command failed. */ -const uint32_t CARD_STATUS_COM_CRC_ERROR = 1UL << 23; -/** Command not legal for the card state. */ -const uint32_t CARD_STATUS_ILLEGAL_COMMAND = 1UL << 22; -/** Card internal ECC was applied but failed to correct the data. */ -const uint32_t CARD_STATUS_CARD_ECC_FAILED = 1UL << 21; -/** Internal card controller error */ -const uint32_t CARD_STATUS_CC_ERROR = 1UL << 20; -/** A general or an unknown error occurred during the operation. */ -const uint32_t CARD_STATUS_ERROR = 1UL << 19; -// bits 19, 18, and 17 reserved. -/** Permanent WP set or attempt to change read only values of CSD. */ -const uint32_t CARD_STATUS_CSD_OVERWRITE = 1UL <<16; -/** partial address space was erased due to write protect. */ -const uint32_t CARD_STATUS_WP_ERASE_SKIP = 1UL << 15; -/** The command has been executed without using the internal ECC. */ -const uint32_t CARD_STATUS_CARD_ECC_DISABLED = 1UL << 14; -/** out of erase sequence command was received. */ -const uint32_t CARD_STATUS_ERASE_RESET = 1UL << 13; -/** The state of the card when receiving the command. - * 0 = idle - * 1 = ready - * 2 = ident - * 3 = stby - * 4 = tran - * 5 = data - * 6 = rcv - * 7 = prg - * 8 = dis - * 9-14 = reserved - * 15 = reserved for I/O mode - */ -const uint32_t CARD_STATUS_CURRENT_STATE = 0XF << 9; -/** Shift for current state. */ -const uint32_t CARD_STATUS_CURRENT_STATE_SHIFT = 9; -/** Corresponds to buffer empty signaling on the bus. */ -const uint32_t CARD_STATUS_READY_FOR_DATA = 1UL << 8; -// bit 7 reserved. -/** Extension Functions may set this bit to get host to deal with events. */ -const uint32_t CARD_STATUS_FX_EVENT = 1UL << 6; -/** The card will expect ACMD, or the command has been interpreted as ACMD */ -const uint32_t CARD_STATUS_APP_CMD = 1UL << 5; -// bit 4 reserved. -/** Error in the sequence of the authentication process. */ -const uint32_t CARD_STATUS_AKE_SEQ_ERROR = 1UL << 3; -// bits 2,1, and 0 reserved for manufacturer test mode. -//============================================================================== -/** status for card in the ready state */ -const uint8_t R1_READY_STATE = 0X00; -/** status for card in the idle state */ -const uint8_t R1_IDLE_STATE = 0X01; -/** status bit for illegal command */ -const uint8_t R1_ILLEGAL_COMMAND = 0X04; -/** start data token for read or write single sector*/ -const uint8_t DATA_START_SECTOR = 0XFE; -/** stop token for write multiple sectors*/ -const uint8_t STOP_TRAN_TOKEN = 0XFD; -/** start data token for write multiple sectors*/ -const uint8_t WRITE_MULTIPLE_TOKEN = 0XFC; -/** mask for data response tokens after a write sector operation */ -const uint8_t DATA_RES_MASK = 0X1F; -/** write data accepted token */ -const uint8_t DATA_RES_ACCEPTED = 0X05; -//============================================================================== -/** - * \class CID - * \brief Card IDentification (CID) register. - */ -typedef struct CID { - // byte 0 - /** Manufacturer ID */ - unsigned char mid; - // byte 1-2 - /** OEM/Application ID */ - char oid[2]; - // byte 3-7 - /** Product name */ - char pnm[5]; - // byte 8 - /** Product revision least significant digit */ - unsigned char prv_m : 4; - /** Product revision most significant digit */ - unsigned char prv_n : 4; - // byte 9-12 - /** Product serial number */ - uint32_t psn; - // byte 13 - /** Manufacturing date year high digit */ - unsigned char mdt_year_high : 4; - /** not used */ - unsigned char reserved : 4; - // byte 14 - /** Manufacturing date month */ - unsigned char mdt_month : 4; - /** Manufacturing date year low digit */ - unsigned char mdt_year_low : 4; - // byte 15 - /** not used always 1 */ - unsigned char always1 : 1; - /** CRC7 checksum */ - unsigned char crc : 7; -} __attribute__((packed)) cid_t; - -//============================================================================== -#ifndef DOXYGEN_SHOULD_SKIP_THIS -/** - * \class CSDV1 - * \brief CSD register for version 1.00 cards . - */ -typedef struct CSDV1 { - // byte 0 - unsigned char reserved1 : 6; - unsigned char csd_ver : 2; - // byte 1 - unsigned char taac; - // byte 2 - unsigned char nsac; - // byte 3 - unsigned char tran_speed; - // byte 4 - unsigned char ccc_high; - // byte 5 - unsigned char read_bl_len : 4; - unsigned char ccc_low : 4; - // byte 6 - unsigned char c_size_high : 2; - unsigned char reserved2 : 2; - unsigned char dsr_imp : 1; - unsigned char read_blk_misalign : 1; - unsigned char write_blk_misalign : 1; - unsigned char read_bl_partial : 1; - // byte 7 - unsigned char c_size_mid; - // byte 8 - unsigned char vdd_r_curr_max : 3; - unsigned char vdd_r_curr_min : 3; - unsigned char c_size_low : 2; - // byte 9 - unsigned char c_size_mult_high : 2; - unsigned char vdd_w_cur_max : 3; - unsigned char vdd_w_curr_min : 3; - // byte 10 - unsigned char sector_size_high : 6; - unsigned char erase_blk_en : 1; - unsigned char c_size_mult_low : 1; - // byte 11 - unsigned char wp_grp_size : 7; - unsigned char sector_size_low : 1; - // byte 12 - unsigned char write_bl_len_high : 2; - unsigned char r2w_factor : 3; - unsigned char reserved3 : 2; - unsigned char wp_grp_enable : 1; - // byte 13 - unsigned char reserved4 : 5; - unsigned char write_partial : 1; - unsigned char write_bl_len_low : 2; - // byte 14 - unsigned char reserved5: 2; - unsigned char file_format : 2; - unsigned char tmp_write_protect : 1; - unsigned char perm_write_protect : 1; - unsigned char copy : 1; - /** Indicates the file format on the card */ - unsigned char file_format_grp : 1; - // byte 15 - unsigned char always1 : 1; - unsigned char crc : 7; -} __attribute__((packed)) csd1_t; -//============================================================================== -/** - * \class CSDV2 - * \brief CSD register for version 2.00 cards. - */ -typedef struct CSDV2 { - // byte 0 - unsigned char reserved1 : 6; - unsigned char csd_ver : 2; - // byte 1 - /** fixed to 0X0E */ - unsigned char taac; - // byte 2 - /** fixed to 0 */ - unsigned char nsac; - // byte 3 - unsigned char tran_speed; - // byte 4 - unsigned char ccc_high; - // byte 5 - /** This field is fixed to 9h, which indicates READ_BL_LEN=512 Byte */ - unsigned char read_bl_len : 4; - unsigned char ccc_low : 4; - // byte 6 - /** not used */ - unsigned char reserved2 : 4; - unsigned char dsr_imp : 1; - /** fixed to 0 */ - unsigned char read_blk_misalign : 1; - /** fixed to 0 */ - unsigned char write_blk_misalign : 1; - /** fixed to 0 - no partial read */ - unsigned char read_bl_partial : 1; - // byte 7 - /** high part of card size */ - unsigned char c_size_high : 6; - /** not used */ - unsigned char reserved3 : 2; - // byte 8 - /** middle part of card size */ - unsigned char c_size_mid; - // byte 9 - /** low part of card size */ - unsigned char c_size_low; - // byte 10 - /** sector size is fixed at 64 KB */ - unsigned char sector_size_high : 6; - /** fixed to 1 - erase single is supported */ - unsigned char erase_blk_en : 1; - /** not used */ - unsigned char reserved4 : 1; - // byte 11 - unsigned char wp_grp_size : 7; - /** sector size is fixed at 64 KB */ - unsigned char sector_size_low : 1; - // byte 12 - /** write_bl_len fixed for 512 byte sectors */ - unsigned char write_bl_len_high : 2; - /** fixed value of 2 */ - unsigned char r2w_factor : 3; - /** not used */ - unsigned char reserved5 : 2; - /** fixed value of 0 - no write protect groups */ - unsigned char wp_grp_enable : 1; - // byte 13 - unsigned char reserved6 : 5; - /** always zero - no partial sector read*/ - unsigned char write_partial : 1; - /** write_bl_len fixed for 512 byte sectors */ - unsigned char write_bl_len_low : 2; - // byte 14 - unsigned char reserved7: 2; - /** Do not use always 0 */ - unsigned char file_format : 2; - unsigned char tmp_write_protect : 1; - unsigned char perm_write_protect : 1; - unsigned char copy : 1; - /** Do not use always 0 */ - unsigned char file_format_grp : 1; - // byte 15 - /** not used always 1 */ - unsigned char always1 : 1; - /** checksum */ - unsigned char crc : 7; -} __attribute__((packed)) csd2_t; -//============================================================================== -/** - * \class csd_t - * \brief Union of old and new style CSD register. - */ -union csd_t { - csd1_t v1; - csd2_t v2; -}; -//----------------------------------------------------------------------------- -inline uint32_t sdCardCapacity(csd_t* csd) { - if (csd->v1.csd_ver == 0) { - uint8_t read_bl_len = csd->v1.read_bl_len; - uint16_t c_size = (csd->v1.c_size_high << 10) - | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; - uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) - | csd->v1.c_size_mult_low; - return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); - } else if (csd->v2.csd_ver == 1) { - return (((uint32_t)csd->v2.c_size_high << 16) + - ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; - } else { - return 0; - } -} -//----------------------------------------------------------------------------- -// fields are big endian -typedef struct SdStatus { - uint8_t busWidthSecureMode; - uint8_t reserved1; - uint8_t sdCardType[2]; - uint8_t sizeOfProtectedArea[4]; - uint8_t speedClass; - uint8_t performanceMove; - uint8_t auSize; - uint8_t eraseSize[2]; - uint8_t eraseTimeoutOffset; - uint8_t uhsSpeedAuSize; - uint8_t videoSpeed; - uint8_t vscAuSize[2]; - uint8_t susAddr[3]; - uint8_t reserved2[3]; - uint8_t reservedManufacturer[40]; -} SdStatus_t; -#endif // DOXYGEN_SHOULD_SKIP_THIS -#endif // SdCardInfo_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.h b/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.h deleted file mode 100644 index 69573dc1..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.h +++ /dev/null @@ -1,277 +0,0 @@ -#ifndef SdioTeensy_h -#define SdioTeensy_h - -// From Paul's SD.h driver. - -#if defined(__IMXRT1062__) -#define MAKE_REG_MASK(m,s) (((uint32_t)(((uint32_t)(m) << s)))) -#define MAKE_REG_GET(x,m,s) (((uint32_t)(((uint32_t)(x)>>s) & m))) -#define MAKE_REG_SET(x,m,s) (((uint32_t)(((uint32_t)(x) & m) << s))) - -#define SDHC_BLKATTR_BLKSIZE_MASK MAKE_REG_MASK(0x1FFF,0) //uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size Mask -#define SDHC_BLKATTR_BLKSIZE(n) MAKE_REG_SET(n,0x1FFF,0) //uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size -#define SDHC_BLKATTR_BLKCNT_MASK MAKE_REG_MASK(0x1FFF,16) //((uint32_t)0x1FFF<<16) -#define SDHC_BLKATTR_BLKCNT(n) MAKE_REG_SET(n,0x1FFF,16) //(uint32_t)(((n) & 0x1FFF)<<16) // Blocks Count For Current Transfer - -#define SDHC_XFERTYP_CMDINX(n) MAKE_REG_SET(n,0x3F,24) //(uint32_t)(((n) & 0x3F)<<24)// Command Index -#define SDHC_XFERTYP_CMDTYP(n) MAKE_REG_SET(n,0x3,22) //(uint32_t)(((n) & 0x3)<<22) // Command Type -#define SDHC_XFERTYP_DPSEL MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data Present Select -#define SDHC_XFERTYP_CICEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Command Index Check Enable -#define SDHC_XFERTYP_CCCEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command CRC Check Enable -#define SDHC_XFERTYP_RSPTYP(n) MAKE_REG_SET(n,0x3,16) //(uint32_t)(((n) & 0x3)<<16) // Response Type Select -#define SDHC_XFERTYP_MSBSEL MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Multi/Single Block Select -#define SDHC_XFERTYP_DTDSEL MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Data Transfer Direction Select -#define SDHC_XFERTYP_AC12EN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Auto CMD12 Enable -#define SDHC_XFERTYP_BCEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Block Count Enable -#define SDHC_XFERTYP_DMAEN MAKE_REG_MASK(0x3,0) //((uint32_t)0x00000001) // DMA Enable - -#define SDHC_PRSSTAT_DLSL_MASK MAKE_REG_MASK(0xFF,24) //((uint32_t)0xFF000000) // DAT Line Signal Level -#define SDHC_PRSSTAT_CLSL MAKE_REG_MASK(0x1,23) //((uint32_t)0x00800000) // CMD Line Signal Level -#define SDHC_PRSSTAT_WPSPL MAKE_REG_MASK(0x1,19) // -#define SDHC_PRSSTAT_CDPL MAKE_REG_MASK(0x1,18) // -#define SDHC_PRSSTAT_CINS MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Card Inserted -#define SDHC_PRSSTAT_TSCD MAKE_REG_MASK(0x1,15) -#define SDHC_PRSSTAT_RTR MAKE_REG_MASK(0x1,12) -#define SDHC_PRSSTAT_BREN MAKE_REG_MASK(0x1,11) //((uint32_t)0x00000800) // Buffer Read Enable -#define SDHC_PRSSTAT_BWEN MAKE_REG_MASK(0x1,10) //((uint32_t)0x00000400) // Buffer Write Enable -#define SDHC_PRSSTAT_RTA MAKE_REG_MASK(0x1,9) //((uint32_t)0x00000200) // Read Transfer Active -#define SDHC_PRSSTAT_WTA MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Write Transfer Active -#define SDHC_PRSSTAT_SDOFF MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // SD Clock Gated Off Internally -#define SDHC_PRSSTAT_PEROFF MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // SDHC clock Gated Off Internally -#define SDHC_PRSSTAT_HCKOFF MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // System Clock Gated Off Internally -#define SDHC_PRSSTAT_IPGOFF MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Bus Clock Gated Off Internally -#define SDHC_PRSSTAT_SDSTB MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // SD Clock Stable -#define SDHC_PRSSTAT_DLA MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Data Line Active -#define SDHC_PRSSTAT_CDIHB MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Command Inhibit (DAT) -#define SDHC_PRSSTAT_CIHB MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Inhibit (CMD) - -#define SDHC_PROTCT_NONEXACT_BLKRD MAKE_REG_MASK(0x1,30) // -#define SDHC_PROTCT_BURST_LENEN(n) MAKE_REG_SET(n,0x7,12) // -#define SDHC_PROCTL_WECRM MAKE_REG_MASK(0x1,26) //((uint32_t)0x04000000) // Wakeup Event Enable On SD Card Removal -#define SDHC_PROCTL_WECINS MAKE_REG_MASK(0x1,25) //((uint32_t)0x02000000) // Wakeup Event Enable On SD Card Insertion -#define SDHC_PROCTL_WECINT MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Wakeup Event Enable On Card Interrupt -#define SDHC_PROCTL_RD_DONE_NOBLK MAKE_REG_MASK(0x1,20) // -#define SDHC_PROCTL_IABG MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Interrupt At Block Gap -#define SDHC_PROCTL_RWCTL MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Read Wait Control -#define SDHC_PROCTL_CREQ MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Continue Request -#define SDHC_PROCTL_SABGREQ MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Stop At Block Gap Request -#define SDHC_PROCTL_DMAS(n) MAKE_REG_SET(n,0x3,8) //(uint32_t)(((n) & 0x3)<<8) // DMA Select -#define SDHC_PROCTL_CDSS MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Detect Signal Selection -#define SDHC_PROCTL_CDTL MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Detect Test Level -#define SDHC_PROCTL_EMODE(n) MAKE_REG_SET(n,0x3,4) //(uint32_t)(((n) & 0x3)<<4) // Endian Mode -#define SDHC_PROCTL_EMODE_MASK MAKE_REG_MASK(0x3,4) //(uint32_t)((0x3)<<4) // Endian Mode -#define SDHC_PROCTL_D3CD MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DAT3 As Card Detection Pin -#define SDHC_PROCTL_DTW(n) MAKE_REG_SET(n,0x3,1) //(uint32_t)(((n) & 0x3)<<1) // Data Transfer Width, 0=1bit, 1=4bit, 2=8bit -#define SDHC_PROCTL_DTW_MASK MAKE_REG_MASK(0x3,1) //((uint32_t)0x00000006) -#define SDHC_PROCTL_LCTL MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // LED Control - -#define SDHC_SYSCTL_RSTT MAKE_REG_MASK(0x1,28) // -#define SDHC_SYSCTL_INITA MAKE_REG_MASK(0x1,27) //((uint32_t)0x08000000) // Initialization Active -#define SDHC_SYSCTL_RSTD MAKE_REG_MASK(0x1,26) //((uint32_t)0x04000000) // Software Reset For DAT Line -#define SDHC_SYSCTL_RSTC MAKE_REG_MASK(0x1,25) //((uint32_t)0x02000000) // Software Reset For CMD Line -#define SDHC_SYSCTL_RSTA MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Software Reset For ALL -#define SDHC_SYSCTL_DTOCV(n) MAKE_REG_SET(n,0xF,16) //(uint32_t)(((n) & 0xF)<<16) // Data Timeout Counter Value -#define SDHC_SYSCTL_DTOCV_MASK MAKE_REG_MASK(0xF,16) //((uint32_t)0x000F0000) -#define SDHC_SYSCTL_SDCLKFS(n) MAKE_REG_SET(n,0xFF,8) //(uint32_t)(((n) & 0xFF)<<8) // SDCLK Frequency Select -#define SDHC_SYSCTL_SDCLKFS_MASK MAKE_REG_MASK(0xFF,8) //((uint32_t)0x0000FF00) -#define SDHC_SYSCTL_DVS(n) MAKE_REG_SET(n,0xF,4) //(uint32_t)(((n) & 0xF)<<4) // Divisor -#define SDHC_SYSCTL_DVS_MASK MAKE_REG_MASK(0xF,4) //((uint32_t)0x000000F0) - -#define SDHC_SYSCTL_SDCLKEN ((uint32_t)0x00000008) // SD Clock Enable -#define SDHC_SYSCTL_PEREN ((uint32_t)0x00000004) // Peripheral Clock Enable -#define SDHC_SYSCTL_HCKEN ((uint32_t)0x00000002) // System Clock Enable -#define SDHC_SYSCTL_IPGEN ((uint32_t)0x00000001) // IPG Clock Enable - -#define SDHC_IRQSTAT_DMAE MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error -#define SDHC_IRQSTAT_TNE MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSTAT_AC12E MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error -#define SDHC_IRQSTAT_DEBE MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error -#define SDHC_IRQSTAT_DCE MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error -#define SDHC_IRQSTAT_DTOE MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error -#define SDHC_IRQSTAT_CIE MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error -#define SDHC_IRQSTAT_CEBE MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error -#define SDHC_IRQSTAT_CCE MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error -#define SDHC_IRQSTAT_CTOE MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error -#define SDHC_IRQSTAT_TP MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSTAT_RTE MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSTAT_CINT MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt -#define SDHC_IRQSTAT_CRM MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal -#define SDHC_IRQSTAT_CINS MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion -#define SDHC_IRQSTAT_BRR MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready -#define SDHC_IRQSTAT_BWR MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready -#define SDHC_IRQSTAT_DINT MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt -#define SDHC_IRQSTAT_BGE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event -#define SDHC_IRQSTAT_TC MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete -#define SDHC_IRQSTAT_CC MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete - -#define SDHC_IRQSTATEN_DMAESEN MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error Status Enable -#define SDHC_IRQSTATEN_TNESEN MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSTATEN_AC12ESEN MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error Status Enable -#define SDHC_IRQSTATEN_DEBESEN MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error Status Enable -#define SDHC_IRQSTATEN_DCESEN MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error Status Enable -#define SDHC_IRQSTATEN_DTOESEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error Status Enable -#define SDHC_IRQSTATEN_CIESEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error Status Enable -#define SDHC_IRQSTATEN_CEBESEN MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error Status Enable -#define SDHC_IRQSTATEN_CCESEN MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error Status Enable -#define SDHC_IRQSTATEN_CTOESEN MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error Status Enable -#define SDHC_IRQSTATEN_TPSEN MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSTATEN_RTESEN MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSTATEN_CINTSEN MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt Status Enable -#define SDHC_IRQSTATEN_CRMSEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal Status Enable -#define SDHC_IRQSTATEN_CINSEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion Status Enable -#define SDHC_IRQSTATEN_BRRSEN MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready Status Enable -#define SDHC_IRQSTATEN_BWRSEN MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready Status Enable -#define SDHC_IRQSTATEN_DINTSEN MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt Status Enable -#define SDHC_IRQSTATEN_BGESEN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event Status Enable -#define SDHC_IRQSTATEN_TCSEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete Status Enable -#define SDHC_IRQSTATEN_CCSEN MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete Status Enable - -#define SDHC_IRQSIGEN_DMAEIEN MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error Interrupt Enable -#define SDHC_IRQSIGEN_TNEIEN MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSIGEN_AC12EIEN MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error Interrupt Enable -#define SDHC_IRQSIGEN_DEBEIEN MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error Interrupt Enable -#define SDHC_IRQSIGEN_DCEIEN MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error Interrupt Enable -#define SDHC_IRQSIGEN_DTOEIEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error Interrupt Enable -#define SDHC_IRQSIGEN_CIEIEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error Interrupt Enable -#define SDHC_IRQSIGEN_CEBEIEN MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error Interrupt Enable -#define SDHC_IRQSIGEN_CCEIEN MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error Interrupt Enable -#define SDHC_IRQSIGEN_CTOEIEN MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error Interrupt Enable -#define SDHC_IRQSIGEN_TPIEN MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSIGEN_RTEIEN MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSIGEN_CINTIEN MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt Interrupt Enable -#define SDHC_IRQSIGEN_CRMIEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal Interrupt Enable -#define SDHC_IRQSIGEN_CINSIEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion Interrupt Enable -#define SDHC_IRQSIGEN_BRRIEN MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready Interrupt Enable -#define SDHC_IRQSIGEN_BWRIEN MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready Interrupt Enable -#define SDHC_IRQSIGEN_DINTIEN MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt Interrupt Enable -#define SDHC_IRQSIGEN_BGEIEN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event Interrupt Enable -#define SDHC_IRQSIGEN_TCIEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete Interrupt Enable -#define SDHC_IRQSIGEN_CCIEN MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete Interrupt Enable - -#define SDHC_AC12ERR_SMPLCLK_SEL MAKE_REG_MASK(0x1,23) // -#define SDHC_AC12ERR_EXEC_TUNING MAKE_REG_MASK(0x1,22) // -#define SDHC_AC12ERR_CNIBAC12E MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Command Not Issued By Auto CMD12 Error -#define SDHC_AC12ERR_AC12IE MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Auto CMD12 Index Error -#define SDHC_AC12ERR_AC12CE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // Auto CMD12 CRC Error -#define SDHC_AC12ERR_AC12EBE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Auto CMD12 End Bit Error -#define SDHC_AC12ERR_AC12TOE MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Auto CMD12 Timeout Error -#define SDHC_AC12ERR_AC12NE MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Auto CMD12 Not Executed - -#define SDHC_HTCAPBLT_VS18 MAKE_REG_MASK(0x1,26) // -#define SDHC_HTCAPBLT_VS30 MAKE_REG_MASK(0x1,25) // -#define SDHC_HTCAPBLT_VS33 MAKE_REG_MASK(0x1,24) // -#define SDHC_HTCAPBLT_SRS MAKE_REG_MASK(0x1,23) // -#define SDHC_HTCAPBLT_DMAS MAKE_REG_MASK(0x1,22) // -#define SDHC_HTCAPBLT_HSS MAKE_REG_MASK(0x1,21) // -#define SDHC_HTCAPBLT_ADMAS MAKE_REG_MASK(0x1,20) // -#define SDHC_HTCAPBLT_MBL_VAL MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x7,16) // -#define SDHC_HTCAPBLT_RETUN_MODE MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x3,14) // -#define SDHC_HTCAPBLT_TUNE_SDR50 MAKE_REG_MASK(0x1,13) // -#define SDHC_HTCAPBLT_TIME_RETUN(n) MAKE_REG_SET(n,0xF,8) // - -#define SDHC_WML_WR_BRSTLEN_MASK MAKE_REG_MASK(0x1F,24) // -#define SDHC_WML_RD_BRSTLEN_MASK MAKE_REG_MASK(0x1F,8) // -#define SDHC_WML_WR_WML_MASK MAKE_REG_MASK(0xFF,16) // -#define SDHC_WML_RD_WML_MASK MAKE_REG_MASK(0xFF,0) // -#define SDHC_WML_WR_BRSTLEN(n) MAKE_REG_SET(n,0x1F,24) //(uint32_t)(((n) & 0x7F)<<16) // Write Burst Len -#define SDHC_WML_RD_BRSTLEN(n) MAKE_REG_SET(n,0x1F,8) //(uint32_t)(((n) & 0x7F)<<0) // Read Burst Len -#define SDHC_WML_WR_WML(n) MAKE_REG_SET(n,0xFF,16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level -#define SDHC_WML_RD_WML(n) MAKE_REG_SET(n,0xFF,0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level -#define SDHC_WML_WRWML(n) MAKE_REG_SET(n,0xFF,16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level -#define SDHC_WML_RDWML(n) MAKE_REG_SET(n,0xFF,0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level - -// Teensy 4.0 only -#define SDHC_MIX_CTRL_DMAEN MAKE_REG_MASK(0x1,0) // -#define SDHC_MIX_CTRL_BCEN MAKE_REG_MASK(0x1,1) // -#define SDHC_MIX_CTRL_AC12EN MAKE_REG_MASK(0x1,2) // -#define SDHC_MIX_CTRL_DDR_EN MAKE_REG_MASK(0x1,3) // -#define SDHC_MIX_CTRL_DTDSEL MAKE_REG_MASK(0x1,4) // -#define SDHC_MIX_CTRL_MSBSEL MAKE_REG_MASK(0x1,5) // -#define SDHC_MIX_CTRL_NIBBLE_POS MAKE_REG_MASK(0x1,6) // -#define SDHC_MIX_CTRL_AC23EN MAKE_REG_MASK(0x1,7) // - -#define SDHC_FEVT_CINT MAKE_REG_MASK(0x1,31) //((uint32_t)0x80000000) // Force Event Card Interrupt -#define SDHC_FEVT_DMAE MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // Force Event DMA Error -#define SDHC_FEVT_AC12E MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Force Event Auto CMD12 Error -#define SDHC_FEVT_DEBE MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Force Event Data End Bit Error -#define SDHC_FEVT_DCE MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Force Event Data CRC Error -#define SDHC_FEVT_DTOE MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Force Event Data Timeout Error -#define SDHC_FEVT_CIE MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Force Event Command Index Error -#define SDHC_FEVT_CEBE MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Force Event Command End Bit Error -#define SDHC_FEVT_CCE MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Force Event Command CRC Error -#define SDHC_FEVT_CTOE MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Force Event Command Timeout Error -#define SDHC_FEVT_CNIBAC12E MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Force Event Command Not Executed By Auto Command 12 Error -#define SDHC_FEVT_AC12IE MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Force Event Auto Command 12 Index Error -#define SDHC_FEVT_AC12EBE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // Force Event Auto Command 12 End Bit Error -#define SDHC_FEVT_AC12CE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Force Event Auto Command 12 CRC Error -#define SDHC_FEVT_AC12TOE MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Force Event Auto Command 12 Time Out Error -#define SDHC_FEVT_AC12NE MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Force Event Auto Command 12 Not Executed - -#define SDHC_ADMAES_ADMADCE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) -#define SDHC_ADMAES_ADMALME MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) -#define SDHC_ADMAES_ADMAES_MASK MAKE_REG_MASK(0x3,0) //((uint32_t)0x00000003) - -#define SDHC_MMCBOOT_BOOTBLKCNT(n) MAKE_REG_MASK(0xFF,16) //(uint32_t)(((n) & 0xFFF)<<16) // stop at block gap value of automatic mode -#define SDHC_MMCBOOT_AUTOSABGEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // enable auto stop at block gap function -#define SDHC_MMCBOOT_BOOTEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Boot Mode Enable -#define SDHC_MMCBOOT_BOOTMODE MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Boot Mode Select -#define SDHC_MMCBOOT_BOOTACK MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Boot Ack Mode Select -#define SDHC_MMCBOOT_DTOCVACK(n) MAKE_REG_MASK(0xF,0) //(uint32_t)(((n) & 0xF)<<0) // Boot ACK Time Out Counter Value -//#define SDHC_HOSTVER (*(volatile uint32_t*)0x400B10FC) // Host Controller Version - -#define CCM_ANALOG_PFD_528_PFD0_FRAC_MASK 0x3f -#define CCM_ANALOG_PFD_528_PFD0_FRAC(n) ((n) & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) -#define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3f<<8) -#define CCM_ANALOG_PFD_528_PFD1_FRAC(n) (((n)<<8) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) -#define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3f<<16) -#define CCM_ANALOG_PFD_528_PFD2_FRAC(n) (((n)<<16) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) -#define CCM_ANALOG_PFD_528_PFD3_FRAC_MASK ((0x3f<<24) -#define CCM_ANALOG_PFD_528_PFD3_FRAC(n) (((n)<<24) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) - -#define SDHC_DSADDR (USDHC1_DS_ADDR ) // DMA System Address register -#define SDHC_BLKATTR (USDHC1_BLK_ATT) // Block Attributes register -#define SDHC_CMDARG (USDHC1_CMD_ARG) // Command Argument register -#define SDHC_XFERTYP (USDHC1_CMD_XFR_TYP) // Transfer Type register -#define SDHC_CMDRSP0 (USDHC1_CMD_RSP0) // Command Response 0 -#define SDHC_CMDRSP1 (USDHC1_CMD_RSP1) // Command Response 1 -#define SDHC_CMDRSP2 (USDHC1_CMD_RSP2) // Command Response 2 -#define SDHC_CMDRSP3 (USDHC1_CMD_RSP3) // Command Response 3 -#define SDHC_DATPORT (USDHC1_DATA_BUFF_ACC_PORT) // Buffer Data Port register -#define SDHC_PRSSTAT (USDHC1_PRES_STATE) // Present State register -#define SDHC_PROCTL (USDHC1_PROT_CTRL) // Protocol Control register -#define SDHC_SYSCTL (USDHC1_SYS_CTRL) // System Control register -#define SDHC_IRQSTAT (USDHC1_INT_STATUS) // Interrupt Status register -#define SDHC_IRQSTATEN (USDHC1_INT_STATUS_EN) // Interrupt Status Enable register -#define SDHC_IRQSIGEN (USDHC1_INT_SIGNAL_EN) // Interrupt Signal Enable register -#define SDHC_AC12ERR (USDHC1_AUTOCMD12_ERR_STATUS) // Auto CMD12 Error Status Register -#define SDHC_HTCAPBLT (USDHC1_HOST_CTRL_CAP) // Host Controller Capabilities -#define SDHC_WML (USDHC1_WTMK_LVL) // Watermark Level Register -#define SDHC_MIX_CTRL (USDHC1_MIX_CTRL) // Mixer Control -#define SDHC_FEVT (USDHC1_FORCE_EVENT) // Force Event register -#define SDHC_ADMAES (USDHC1_ADMA_ERR_STATUS) // ADMA Error Status register -#define SDHC_ADSADDR (USDHC1_ADMA_SYS_ADDR) // ADMA System Addressregister -#define SDHC_VENDOR (USDHC1_VEND_SPEC) // Vendor Specific register -#define SDHC_MMCBOOT (USDHC1_MMC_BOOT) // MMC Boot register -#define SDHC_VENDOR2 (USDHC2_VEND_SPEC2) // Vendor Specific2 register -// -#define IRQ_SDHC IRQ_SDHC1 - -#define SDHC_MAX_DVS (0xF + 1U) -#define SDHC_MAX_CLKFS (0xFF + 1U) -#define SDHC_PREV_DVS(x) ((x) -= 1U) -#define SDHC_PREV_CLKFS(x, y) ((x) >>= (y)) - -#define CCM_CSCDR1_USDHC1_CLK_PODF_MASK (0x7<<11) -#define CCM_CSCDR1_USDHC1_CLK_PODF(n) (((n)&0x7)<<11) - -#define IOMUXC_SW_PAD_CTL_PAD_SRE ((0x1<)<0) -#define IOMUXC_SW_PAD_CTL_PAD_PKE ((0x1)<<12) -#define IOMUXC_SW_PAD_CTL_PAD_PUE ((0x1)<<13) -#define IOMUXC_SW_PAD_CTL_PAD_HYS ((0x1)<<16) -#define IOMUXC_SW_PAD_CTL_PAD_SPEED(n) (((n)&0x3)<<6) -#define IOMUXC_SW_PAD_CTL_PAD_PUS(n) (((n)&0x3)<<14) -#define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK ((0x3)<<14) -#define IOMUXC_SW_PAD_CTL_PAD_DSE(n) (((n)&0x7)<<3) -#define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK ((0x7)<<3) -#endif // defined(__IMXRT1062__) -#endif // SdioTeensy_h \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdFat.h b/extra-libraries/ESP32/SdFat-2.1.2/src/SdFat.h deleted file mode 100644 index 3ae8ea9b..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdFat.h +++ /dev/null @@ -1,582 +0,0 @@ -/** - * Copyright (c) 2011-2021 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#ifndef SdFat_h -#define SdFat_h -/** - * \file - * \brief main SdFs include file. - */ -#include "common/SysCall.h" -#include "SdCard/SdCard.h" -#include "ExFatLib/ExFatLib.h" -#include "FatLib/FatLib.h" -#include "FsLib/FsLib.h" -#if INCLUDE_SDIOS -#include "sdios.h" -#endif // INCLUDE_SDIOS -//------------------------------------------------------------------------------ -/** SdFat version for cpp use. */ -#define SD_FAT_VERSION 20102 -/** SdFat version as string. */ -#define SD_FAT_VERSION_STR "2.1.2" -//============================================================================== -/** - * \class SdBase - * \brief base SD file system template class. - */ -template -class SdBase : public Vol -{ -public: - //---------------------------------------------------------------------------- - /** Initialize SD card and file system. - * - * \param[in] csPin SD card chip select pin. - * \return true for success or false for failure. - */ - bool begin(SdCsPin_t csPin = SS) - { -#ifdef BUILTIN_SDCARD - if (csPin == BUILTIN_SDCARD) { - return begin(SdioConfig(FIFO_SDIO)); - } -#endif // BUILTIN_SDCARD - return begin(SdSpiConfig(csPin, SHARED_SPI)); - } - //---------------------------------------------------------------------------- - /** Initialize SD card and file system. - * - * \param[in] csPin SD card chip select pin. - * \param[in] maxSck Maximum SCK frequency. - * \return true for success or false for failure. - */ - bool begin(SdCsPin_t csPin, uint32_t maxSck) - { - return begin(SdSpiConfig(csPin, SHARED_SPI, maxSck)); - } - //---------------------------------------------------------------------------- - /** Initialize SD card and file system for SPI mode. - * - * \param[in] spiConfig SPI configuration. - * \return true for success or false for failure. - */ - bool begin(SdSpiConfig spiConfig) - { - return cardBegin(spiConfig) && Vol::begin(m_card); - } - //--------------------------------------------------------------------------- - /** Initialize SD card and file system for SDIO mode. - * - * \param[in] sdioConfig SDIO configuration. - * \return true for success or false for failure. - */ - bool begin(SdioConfig sdioConfig) - { - return cardBegin(sdioConfig) && Vol::begin(m_card); - } - //---------------------------------------------------------------------------- - /** \return Pointer to SD card object. */ - SdCard* card() - { - return m_card; - } - //---------------------------------------------------------------------------- - /** Initialize SD card in SPI mode. - * - * \param[in] spiConfig SPI configuration. - * \return true for success or false for failure. - */ - bool cardBegin(SdSpiConfig spiConfig) - { - m_card = m_cardFactory.newCard(spiConfig); - return m_card && !m_card->errorCode(); - } - //---------------------------------------------------------------------------- - /** Initialize SD card in SDIO mode. - * - * \param[in] sdioConfig SDIO configuration. - * \return true for success or false for failure. - */ - bool cardBegin(SdioConfig sdioConfig) - { - m_card = m_cardFactory.newCard(sdioConfig); - return m_card && !m_card->errorCode(); - } - //---------------------------------------------------------------------------- - /** End use of card. */ - void end() - { - Vol::end(); - if (m_card) { - m_card->end(); - } - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] pr Print destination. - */ - void errorHalt(print_t* pr) - { - if (sdErrorCode()) { - pr->print(F("SdError: 0X")); - pr->print(sdErrorCode(), HEX); - pr->print(F(",0X")); - pr->println(sdErrorData(), HEX); - } else if (!Vol::fatType()) { - pr->println(F("Check SD format.")); - } - while (true) {} - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void errorHalt(print_t* pr, const char* msg) - { - pr->print(F("error: ")); - pr->println(msg); - errorHalt(pr); - } - //---------------------------------------------------------------------------- - /** %Print msg and halt. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void errorHalt(print_t* pr, const __FlashStringHelper* msg) - { - pr->print(F("error: ")); - pr->println(msg); - errorHalt(pr); - } - //---------------------------------------------------------------------------- - /** Format SD card - * - * \param[in] pr Print destination. - * \return true for success else false. - */ - bool format(print_t* pr = nullptr) - { - Fmt fmt; - uint8_t* mem = Vol::end(); - if (!mem) { - return false; - } - bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); - if (switchSpi && !setDedicatedSpi(true)) { - return 0; - } - bool rtn = fmt.format(card(), mem, pr); - if (switchSpi && !setDedicatedSpi(false)) { - return 0; - } - return rtn; - } - //---------------------------------------------------------------------------- - /** \return the free cluster count. */ - uint32_t freeClusterCount() - { - bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); - if (switchSpi && !setDedicatedSpi(true)) { - return 0; - } - uint32_t rtn = Vol::freeClusterCount(); - if (switchSpi && !setDedicatedSpi(false)) { - return 0; - } - return rtn; - } - //---------------------------------------------------------------------------- - /** \return true if can be in dedicated SPI state */ - bool hasDedicatedSpi() - { - return m_card ? m_card->hasDedicatedSpi() : false; - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] pr Print destination. - */ - void initErrorHalt(print_t* pr) - { - initErrorPrint(pr); - while (true) {} - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void initErrorHalt(print_t* pr, const char* msg) - { - pr->println(msg); - initErrorHalt(pr); - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void initErrorHalt(print_t* pr, const __FlashStringHelper* msg) - { - pr->println(msg); - initErrorHalt(pr); - } - //---------------------------------------------------------------------------- - /** Print error details after begin() fails. - * - * \param[in] pr Print destination. - */ - void initErrorPrint(print_t* pr) - { - pr->println(F("begin() failed")); - if (sdErrorCode()) { - pr->println(F("Do not reformat the SD.")); - if (sdErrorCode() == SD_CARD_ERROR_CMD0) { - pr->println(F("No card, wrong chip select pin, or wiring error?")); - } - } - errorPrint(pr); - } - //---------------------------------------------------------------------------- - /** \return true if in dedicated SPI state. */ - bool isDedicatedSpi() - { - return m_card ? m_card->isDedicatedSpi() : false; - } - //---------------------------------------------------------------------------- - /** %Print volume FAT/exFAT type. - * - * \param[in] pr Print destination. - */ - void printFatType(print_t* pr) - { - if (Vol::fatType() == FAT_TYPE_EXFAT) { - pr->print(F("exFAT")); - } else { - pr->print(F("FAT")); - pr->print(Vol::fatType()); - } - } - //---------------------------------------------------------------------------- - /** %Print SD errorCode and errorData. - * - * \param[in] pr Print destination. - */ - void errorPrint(print_t* pr) - { - if (sdErrorCode()) { - pr->print(F("SdError: 0X")); - pr->print(sdErrorCode(), HEX); - pr->print(F(",0X")); - pr->println(sdErrorData(), HEX); - } else if (!Vol::fatType()) { - pr->println(F("Check SD format.")); - } - } - //---------------------------------------------------------------------------- - /** %Print msg, any SD error code. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void errorPrint(print_t* pr, char const* msg) - { - pr->print(F("error: ")); - pr->println(msg); - errorPrint(pr); - } - - /** %Print msg, any SD error code. - * - * \param[in] pr Print destination. - * \param[in] msg Message to print. - */ - void errorPrint(print_t* pr, const __FlashStringHelper* msg) - { - pr->print(F("error: ")); - pr->println(msg); - errorPrint(pr); - } - //---------------------------------------------------------------------------- - /** %Print error info and return. - * - * \param[in] pr Print destination. - */ - void printSdError(print_t* pr) - { - if (sdErrorCode()) { - if (sdErrorCode() == SD_CARD_ERROR_CMD0) { - pr->println(F("No card, wrong chip select pin, or wiring error?")); - } - pr->print(F("SD error: ")); - printSdErrorSymbol(pr, sdErrorCode()); - pr->print(F(" = 0x")); - pr->print(sdErrorCode(), HEX); - pr->print(F(",0x")); - pr->println(sdErrorData(), HEX); - } else if (!Vol::fatType()) { - pr->println(F("Check SD format.")); - } - } - //---------------------------------------------------------------------------- - /** \return SD card error code. */ - uint8_t sdErrorCode() - { - if (m_card) { - return m_card->errorCode(); - } - return SD_CARD_ERROR_INVALID_CARD_CONFIG; - } - //---------------------------------------------------------------------------- - /** \return SD card error data. */ - uint8_t sdErrorData() - { - return m_card ? m_card->errorData() : 0; - } - //---------------------------------------------------------------------------- - /** Set SPI sharing state - * \param[in] value desired state. - * \return true for success else false; - */ - bool setDedicatedSpi(bool value) - { - if (m_card) { - return m_card->setDedicatedSpi(value); - } - return false; - } - //---------------------------------------------------------------------------- - /** \return pointer to base volume */ - Vol* vol() - { - return reinterpret_cast(this); - } - //---------------------------------------------------------------------------- - /** Initialize file system after call to cardBegin. - * - * \return true for success or false for failure. - */ - bool volumeBegin() - { - return Vol::begin(m_card); - } -#if ENABLE_ARDUINO_SERIAL - /** Print error details after begin() fails. */ - void initErrorPrint() - { - initErrorPrint(&Serial); - } - //---------------------------------------------------------------------------- - /** %Print msg to Serial and halt. - * - * \param[in] msg Message to print. - */ - void errorHalt(const __FlashStringHelper* msg) - { - errorHalt(&Serial, msg); - } - //---------------------------------------------------------------------------- - /** %Print error info to Serial and halt. */ - void errorHalt() - { - errorHalt(&Serial); - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] msg Message to print. - */ - void errorHalt(const char* msg) - { - errorHalt(&Serial, msg); - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. */ - void initErrorHalt() - { - initErrorHalt(&Serial); - } - //---------------------------------------------------------------------------- - /** %Print msg, any SD error code. - * - * \param[in] msg Message to print. - */ - void errorPrint(const char* msg) - { - errorPrint(&Serial, msg); - } - /** %Print msg, any SD error code. - * - * \param[in] msg Message to print. - */ - void errorPrint(const __FlashStringHelper* msg) - { - errorPrint(&Serial, msg); - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] msg Message to print. - */ - void initErrorHalt(const char* msg) - { - initErrorHalt(&Serial, msg); - } - //---------------------------------------------------------------------------- - /** %Print error info and halt. - * - * \param[in] msg Message to print. - */ - void initErrorHalt(const __FlashStringHelper* msg) - { - initErrorHalt(&Serial, msg); - } -#endif // ENABLE_ARDUINO_SERIAL - //---------------------------------------------------------------------------- -private: - SdCard* m_card = nullptr; - SdCardFactory m_cardFactory; -}; -//------------------------------------------------------------------------------ -/** - * \class SdFat32 - * \brief SD file system class for FAT volumes. - */ -class SdFat32 : public SdBase -{ -public: -}; -//------------------------------------------------------------------------------ -/** - * \class SdExFat - * \brief SD file system class for exFAT volumes. - */ -class SdExFat : public SdBase -{ -public: -}; -//------------------------------------------------------------------------------ -/** - * \class SdFs - * \brief SD file system class for FAT16, FAT32, and exFAT volumes. - */ -class SdFs : public SdBase -{ -public: -}; -//------------------------------------------------------------------------------ -#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) -/** Select type for SdFat. */ -typedef SdFat32 SdFat; -/** Select type for SdBaseFile. */ -typedef FatFile SdBaseFile; -#elif SDFAT_FILE_TYPE == 2 -typedef SdExFat SdFat; -typedef ExFatFile SdBaseFile; -#elif SDFAT_FILE_TYPE == 3 -typedef SdFs SdFat; -typedef FsBaseFile SdBaseFile; -#else // SDFAT_FILE_TYPE -#error Invalid SDFAT_FILE_TYPE -#endif // SDFAT_FILE_TYPE -// -// Only define File if FS.h is not included. -// Line with test for __has_include must not have operators or parentheses. -#if defined __has_include -#if __has_include() -#define HAS_INCLUDE_FS_H -//#warning File not defined because __has_include(FS.h) -#endif // __has_include() -#endif // defined __has_include -#ifndef HAS_INCLUDE_FS_H -#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) -/** Select type for File. */ -typedef File32 File; -#elif SDFAT_FILE_TYPE == 2 -typedef ExFile File; -#elif SDFAT_FILE_TYPE == 3 -typedef FsFile File; -#endif // SDFAT_FILE_TYPE -#endif // HAS_INCLUDE_FS_H -/** - * \class SdFile - * \brief FAT16/FAT32 file with Print. - */ -class SdFile : public PrintFile -{ -public: - SdFile() {} - /** Create an open SdFile. - * \param[in] path path for file. - * \param[in] oflag open flags. - */ - SdFile(const char* path, oflag_t oflag) - { - open(path, oflag); - } - /** Set the date/time callback function - * - * \param[in] dateTime The user's call back function. The callback - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here - * - * // return date using FS_DATE macro to format fields - * *date = FS_DATE(year, month, day); - * - * // return time using FS_TIME macro to format fields - * *time = FS_TIME(hour, minute, second); - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - */ - static void dateTimeCallback( - void (*dateTime)(uint16_t* date, uint16_t* time)) - { - FsDateTime::setCallback(dateTime); - } - /** Cancel the date/time callback function. */ - static void dateTimeCallbackCancel() - { - FsDateTime::clearCallback(); - } -}; -#endif // SdFat_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.cpp b/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.cpp deleted file mode 100644 index ea694943..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Copyright (c) 2011-2021 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#include "FsUtf.h" -namespace FsUtf { - //---------------------------------------------------------------------------- - char* cpToMb(uint32_t cp, char* str, char* end) { - size_t n = end - str; - if (cp < 0X80) { - if (n < 1) goto fail; - *(str++) = static_cast(cp); - } else if (cp < 0X800) { - if (n < 2) goto fail; - *(str++) = static_cast((cp >> 6) | 0XC0); - *(str++) = static_cast((cp & 0X3F) | 0X80); - } else if (cp < 0X10000) { - if (n < 3) goto fail; - *(str++) = static_cast((cp >> 12) | 0XE0); - *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); - *(str++) = static_cast((cp & 0X3F) | 0X80); - } else { - if (n < 4) goto fail; - *(str++) = static_cast((cp >> 18) | 0XF0); - *(str++) = static_cast(((cp >> 12) & 0X3F)| 0X80); - *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); - *(str++) = static_cast((cp & 0X3F) | 0X80); - } - return str; - - fail: - return nullptr; - } - //---------------------------------------------------------------------------- - // to do? improve error check - const char* mbToCp(const char* str, const char* end, uint32_t* rtn) { - size_t n; - uint32_t cp; - if (str >= end) { - return nullptr; - } - uint8_t ch = str[0]; - if ((ch & 0X80) == 0) { - *rtn = ch; - return str + 1; - } - if ((ch & 0XE0) == 0XC0) { - cp = ch & 0X1F; - n = 2; - } else if ((ch & 0XF0) == 0XE0) { - cp = ch & 0X0F; - n = 3; - } else if ((ch & 0XF8) == 0XF0) { - cp = ch & 0X07; - n = 4; - } else { - return nullptr; - } - if ((str + n) > end) { - return nullptr; - } - for (size_t i = 1; i < n; i++) { - ch = str[i]; - if ((ch & 0XC0) != 0X80) { - return nullptr; - } - cp <<= 6; - cp |= ch & 0X3F; - } - // Don't allow over long as ASCII. - if (cp < 0X80 || !isValidCp(cp)) { - return nullptr; - } - *rtn = cp; - return str + n; - } - //---------------------------------------------------------------------------- - const char* mbToU16(const char* str, - const char* end, uint16_t* hs, uint16_t* ls) { - uint32_t cp; - const char* ptr = mbToCp(str, end, &cp); - if (!ptr) { - return nullptr; - } - if (cp <= 0XFFFF) { - *hs = cp; - *ls = 0; - } else { - *hs = highSurrogate(cp); - *ls = lowSurrogate(cp); - } - return ptr; - } -} // namespace FsUtf - diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.h b/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.h deleted file mode 100644 index ae72f0d3..00000000 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsUtf.h +++ /dev/null @@ -1,109 +0,0 @@ -/** - * Copyright (c) 2011-2021 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#ifndef FsUtf_h -#define FsUtf_h -/** -* \file -* \brief Unicode Transformation Format functions. -*/ -#include -#include -namespace FsUtf { - /** High surrogate for a code point. - * \param{in} cp code point. - * \return high surrogate. - */ - inline uint16_t highSurrogate(uint32_t cp) { - return (cp >> 10) + (0XD800 - (0X10000 >> 10)); - } - /** Low surrogate for a code point. - * \param{in} cp code point. - * \return low surrogate. - */ - inline uint16_t lowSurrogate(uint32_t cp) { - return (cp & 0X3FF) + 0XDC00; - } - /** Check for a valid code point. - * \param[in] cp code point. - * \return true if valid else false. - */ - inline bool isValidCp(uint32_t cp) { - return cp <= 0x10FFFF && (cp < 0XD800 || cp > 0XDFFF); - } - /** Check for UTF-16 surrogate. - * \param[in] c UTF-16 unit. - * \return true if c is a surrogate else false. - */ - inline bool isSurrogate(uint16_t c) { - return 0XD800 <= c && c <= 0XDFFF; - } - /** Check for UTF-16 high surrogate. - * \param[in] c UTF-16 unit.. - * \return true if c is a high surrogate else false. - */ - inline bool isHighSurrogate(uint16_t c) { - return 0XD800 <= c && c <= 0XDBFF; - } - /** Check for UTF-16 low surrogate. - * \param[in] c UTF-16 unit.. - * \return true if c is a low surrogate else false. - */ - inline bool isLowSurrogate(uint16_t c) { - return 0XDC00 <= c && c <= 0XDFFF; - } - /** Convert UFT-16 surrogate pair to code point. - * \param[in] hs high surrogate. - * \param[in] ls low surrogate. - * \return code point. - */ - inline uint32_t u16ToCp(uint16_t hs, uint16_t ls) { - return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); - } - /** Encodes a 32 bit code point as a UTF-8 sequence. - * \param[in] cp code point to encode. - * \param[out] str location for UTF-8 sequence. - * \param[in] end location following last character of str. - * \return location one beyond last encoded character. - */ - char* cpToMb(uint32_t cp, char* str, char* end); - /** Get next code point from a UTF-8 sequence. - * \param[in] str location for UTF-8 sequence. - * \param[in] end location following last character of str. - * May be nullptr if str is zero terminated. - * \param[out] rtn location for the code point. - * \return location of next UTF-8 character in str of nullptr for error. - */ - const char* mbToCp(const char* str, const char* end, uint32_t* rtn); - /** Get next code point from a UTF-8 sequence as UTF-16. - * \param[in] str location for UTF-8 sequence. - * \param[in] end location following last character of str. - * \param[out] hs location for the code point or high surrogate. - * \param[out] ls location for zero or high surrogate. - * \return location of next UTF-8 character in str of nullptr for error. - */ - const char* mbToU16(const char* str, - const char* end, uint16_t* hs, uint16_t* ls); -} // namespace FsUtf -#endif // FsUtf_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/.gitattributes b/extra-libraries/ESP32/SdFat-2.2.3/.gitattributes similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/.gitattributes rename to extra-libraries/ESP32/SdFat-2.2.3/.gitattributes diff --git a/extra-libraries/ESP32/SdFat-2.2.3/.gitignore b/extra-libraries/ESP32/SdFat-2.2.3/.gitignore new file mode 100644 index 00000000..6dae7474 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/.gitignore @@ -0,0 +1,36 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must ends with two \r. +Icon + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes diff --git a/extra-libraries/ESP32/SdFat-2.1.2/LICENSE.md b/extra-libraries/ESP32/SdFat-2.2.3/LICENSE.md similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/LICENSE.md rename to extra-libraries/ESP32/SdFat-2.2.3/LICENSE.md diff --git a/extra-libraries/ESP32/SdFat-2.1.2/README.md b/extra-libraries/ESP32/SdFat-2.2.3/README.md similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/README.md rename to extra-libraries/ESP32/SdFat-2.2.3/README.md index c3abc011..1f97464b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/README.md +++ b/extra-libraries/ESP32/SdFat-2.2.3/README.md @@ -1,8 +1,8 @@ -### Warning: This is SdFat Version 2. +File copy constructors and file assignment operators have been made private by +default in 2.2.3 to prevent call by value and multiple copies of file instances. -Earlier releases of Version 1 are here: - -https://github.com/greiman/SdFat/releases +SdFatConfig.h has options to make file constructors and assignment operators +public. UTF-8 encoded filenames are supported in v2.1.0 or later. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/Doxyfile b/extra-libraries/ESP32/SdFat-2.2.3/doc/Doxyfile similarity index 92% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/Doxyfile rename to extra-libraries/ESP32/SdFat-2.2.3/doc/Doxyfile index 811563db..54e8ce86 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/doc/Doxyfile +++ b/extra-libraries/ESP32/SdFat-2.2.3/doc/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.9.2 +# Doxyfile 1.9.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,6 +12,16 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options @@ -60,16 +70,28 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = . -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English @@ -452,7 +474,7 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 -# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use # during processing. When set to 0 doxygen will based this on the number of # cores available in the system. You can set it explicitly to a value larger # than 0 to get more control over the balance between CPU load and processing @@ -546,7 +568,8 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO @@ -577,14 +600,15 @@ INTERNAL_DOCS = NO # filesystem is case sensitive (i.e. it supports files in the same directory # whose names only differ in casing), the option must be set to YES to properly # deal with such files in case they appear in the input. For filesystems that -# are not case sensitive the option should be be set to NO to properly deal with +# are not case sensitive the option should be set to NO to properly deal with # output files written for symbols that only differ in casing, such as for two # classes, one named CLASS and the other named Class, and to also support # references to files without having to specify the exact matching casing. On # Windows (including Cygwin) and MacOS, users should typically set this option # to NO, whereas on Linux or other Unix flavors it should typically be set to # YES. -# The default value is: system dependent. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -836,6 +860,14 @@ WARN_IF_INCOMPLETE_DOC = YES WARN_NO_PARAMDOC = YES +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS # then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but @@ -851,13 +883,27 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). WARN_LOGFILE = @@ -887,10 +933,21 @@ INPUT = ../src \ # libiconv (or the iconv built into libc) for the transcoding. See the libiconv # documentation (see: # https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -981,7 +1038,7 @@ EXCLUDE_PATTERNS = # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* @@ -1029,6 +1086,11 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. @@ -1070,6 +1132,15 @@ FILTER_SOURCE_PATTERNS = USE_MDFILE_AS_MAINPAGE = +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 + #--------------------------------------------------------------------------- # Configuration options related to source browsing #--------------------------------------------------------------------------- @@ -1207,10 +1278,11 @@ CLANG_DATABASE_PATH = ALPHABETICAL_INDEX = NO -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. IGNORE_PREFIX = @@ -1289,7 +1361,12 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. HTML_EXTRA_STYLESHEET = @@ -1304,6 +1381,19 @@ HTML_EXTRA_STYLESHEET = HTML_EXTRA_FILES = +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT + # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to # this color. Hue is specified as an angle on a color-wheel, see @@ -1398,6 +1488,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1602,7 +1699,7 @@ GENERATE_TREEVIEW = NO # area (value NO) or if it should extend to the full height of the window (value # YES). Setting this to YES gives a layout similar to # https://docs.readthedocs.io with more room for contents, but less room for the -# project logo, title, and description. If either GENERATOR_TREEVIEW or +# project logo, title, and description. If either GENERATE_TREEVIEW or # DISABLE_INDEX is set to NO, this option has no effect. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1633,6 +1730,13 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + # If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg # tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see # https://inkscape.org) to generate formulas as SVG images instead of PNGs for @@ -1653,17 +1757,6 @@ HTML_FORMULA_FORMAT = png FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. - -FORMULA_TRANSPARENT = YES - # The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands # to create new LaTeX commands to be used in formulas as building blocks. See # the section "Including formulas" for details. @@ -2258,7 +2351,8 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. INCLUDE_PATH = @@ -2354,15 +2448,6 @@ EXTERNAL_PAGES = YES # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. @@ -2395,35 +2480,50 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" + +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. # This tag requires that the tag HAVE_DOT is set to YES. DOT_FONTPATH = -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2437,7 +2537,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2552,6 +2653,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2605,10 +2713,10 @@ MSCFILE_DIRS = DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. PLANTUML_JAR_PATH = @@ -2646,18 +2754,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = YES - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2670,6 +2766,8 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. diff --git a/extra-libraries/ESP32/SdFat-2.2.3/doc/SdErrorCodes.txt b/extra-libraries/ESP32/SdFat-2.2.3/doc/SdErrorCodes.txt new file mode 100644 index 00000000..91802597 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/doc/SdErrorCodes.txt @@ -0,0 +1,51 @@ +2022-07-01 + +Run the SdErrorCode example to produce an updated list. + +Code,Symbol - failed operation +0X00,SD_CARD_ERROR_NONE - No error +0X01,SD_CARD_ERROR_CMD0 - Card reset failed +0X02,SD_CARD_ERROR_CMD2 - SDIO read CID +0X03,SD_CARD_ERROR_CMD3 - SDIO publish RCA +0X04,SD_CARD_ERROR_CMD6 - Switch card function +0X05,SD_CARD_ERROR_CMD7 - SDIO card select +0X06,SD_CARD_ERROR_CMD8 - Send and check interface settings +0X07,SD_CARD_ERROR_CMD9 - Read CSD data +0X08,SD_CARD_ERROR_CMD10 - Read CID data +0X09,SD_CARD_ERROR_CMD12 - Stop multiple block read +0X0A,SD_CARD_ERROR_CMD13 - Read card status +0X0B,SD_CARD_ERROR_CMD17 - Read single block +0X0C,SD_CARD_ERROR_CMD18 - Read multiple blocks +0X0D,SD_CARD_ERROR_CMD24 - Write single block +0X0E,SD_CARD_ERROR_CMD25 - Write multiple blocks +0X0F,SD_CARD_ERROR_CMD32 - Set first erase block +0X10,SD_CARD_ERROR_CMD33 - Set last erase block +0X11,SD_CARD_ERROR_CMD38 - Erase selected blocks +0X12,SD_CARD_ERROR_CMD58 - Read OCR register +0X13,SD_CARD_ERROR_CMD59 - Set CRC mode +0X14,SD_CARD_ERROR_ACMD6 - Set SDIO bus width +0X15,SD_CARD_ERROR_ACMD13 - Read extended status +0X16,SD_CARD_ERROR_ACMD23 - Set pre-erased count +0X17,SD_CARD_ERROR_ACMD41 - Activate card initialization +0X18,SD_CARD_ERROR_ACMD51 - Read SCR data +0X19,SD_CARD_ERROR_READ_TOKEN - Bad read data token +0X1A,SD_CARD_ERROR_READ_CRC - Read CRC error +0X1B,SD_CARD_ERROR_READ_FIFO - SDIO fifo read timeout +0X1C,SD_CARD_ERROR_READ_REG - Read CID or CSD failed. +0X1D,SD_CARD_ERROR_READ_START - Bad readStart argument +0X1E,SD_CARD_ERROR_READ_TIMEOUT - Read data timeout +0X1F,SD_CARD_ERROR_STOP_TRAN - Multiple block stop failed +0X20,SD_CARD_ERROR_TRANSFER_COMPLETE - SDIO transfer complete +0X21,SD_CARD_ERROR_WRITE_DATA - Write data not accepted +0X22,SD_CARD_ERROR_WRITE_FIFO - SDIO fifo write timeout +0X23,SD_CARD_ERROR_WRITE_START - Bad writeStart argument +0X24,SD_CARD_ERROR_WRITE_PROGRAMMING - Flash programming +0X25,SD_CARD_ERROR_WRITE_TIMEOUT - Write timeout +0X26,SD_CARD_ERROR_DMA - DMA transfer failed +0X27,SD_CARD_ERROR_ERASE - Card did not accept erase commands +0X28,SD_CARD_ERROR_ERASE_SINGLE_SECTOR - Card does not support erase +0X29,SD_CARD_ERROR_ERASE_TIMEOUT - Erase command timeout +0X2A,SD_CARD_ERROR_INIT_NOT_CALLED - Card has not been initialized +0X2B,SD_CARD_ERROR_INVALID_CARD_CONFIG - Invalid card config +0X2C,SD_CARD_ERROR_FUNCTION_NOT_SUPPORTED - Unsupported SDIO command +0X2D,SD_CARD_ERROR_UNKNOWN - Unknown error diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/SdFat.html b/extra-libraries/ESP32/SdFat-2.2.3/doc/SdFat.html similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/SdFat.html rename to extra-libraries/ESP32/SdFat-2.2.3/doc/SdFat.html diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/ZipMsg/index.html b/extra-libraries/ESP32/SdFat-2.2.3/doc/ZipMsg/index.html similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/ZipMsg/index.html rename to extra-libraries/ESP32/SdFat-2.2.3/doc/ZipMsg/index.html diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/clean_html.bat b/extra-libraries/ESP32/SdFat-2.2.3/doc/clean_html.bat similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/clean_html.bat rename to extra-libraries/ESP32/SdFat-2.2.3/doc/clean_html.bat diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/del_html.bat b/extra-libraries/ESP32/SdFat-2.2.3/doc/del_html.bat similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/del_html.bat rename to extra-libraries/ESP32/SdFat-2.2.3/doc/del_html.bat diff --git a/extra-libraries/ESP32/SdFat-2.2.3/doc/html.zip b/extra-libraries/ESP32/SdFat-2.2.3/doc/html.zip new file mode 100644 index 00000000..efbd3841 Binary files /dev/null and b/extra-libraries/ESP32/SdFat-2.2.3/doc/html.zip differ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/html/index.html b/extra-libraries/ESP32/SdFat-2.2.3/doc/html/index.html similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/html/index.html rename to extra-libraries/ESP32/SdFat-2.2.3/doc/html/index.html diff --git a/extra-libraries/ESP32/SdFat-2.1.2/doc/mainpage.h b/extra-libraries/ESP32/SdFat-2.2.3/doc/mainpage.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/doc/mainpage.h rename to extra-libraries/ESP32/SdFat-2.2.3/doc/mainpage.h index d8d7a3ac..19312b7b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/doc/mainpage.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/doc/mainpage.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -31,19 +31,19 @@ This is a major new version of SdFat. It is mostly backward compatible with SdFat Version 1 for FAT16/FAT32 cards. You should edit SdFatConfig.h to select features. The default version of -SdFatConfig.h is suitable for UNO and other small AVR boards. +SdFatConfig.h is suitable for UNO and other small AVR boards. \section Intro Introduction - -The Arduino %SdFat library supports FAT16, FAT32, and exFAT file systems + +The Arduino %SdFat library supports FAT16, FAT32, and exFAT file systems on Standard SD, SDHC, and SDXC cards. - + In %SdFat version 1, SdFat and File are the main classes. In %SdFat version 2, SdFat and File are defined by typedefs in terms of the -following classes. +following classes. -The file system classes in the %SdFat library are SdFat32, SdExFat, and SdFs. +The file system classes in the %SdFat library are SdFat32, SdExFat, and SdFs. SdFat32 supports FAT16 and FAT32. SdExFat supports exFAT, SdFs supports FAT16, FAT32, and exFAT. @@ -69,7 +69,7 @@ boards. #endif // defined(__AVR__) && FLASHEND < 0X8000 \endcode -It is possible to use option three, support or FAT16/FAT32 and exFat +It is possible to use option three, support or FAT16/FAT32 and exFat on an Uno or other AVR board with 32KB flash and 2KB SRAM but memory will be very limited. @@ -79,7 +79,7 @@ Uno memory use for a simple data logger is: > > option 2, exFAT, 14942 bytes of flash and 895 bytes of SRAM. > -> option 3, FAT16/FAT32 and exFAT, 21834 bytes of flash and 908 bytes of SRAM. +> option 3, FAT16/FAT32 and exFAT, 21834 bytes of flash and 908 bytes of SRAM. Please read documentation under the above classes tab for more information. @@ -113,8 +113,8 @@ multi-block write. Relative paths in %SdFat are resolved in a manner similar to Windows. -Each instance of SdFat32, SdExFat, and SdFs has a current directory. -This directory is called the volume working directory, vwd. +Each instance of SdFat32, SdExFat, and SdFs has a current directory. +This directory is called the volume working directory, vwd. Initially this directory is the root directory for the volume. The volume working directory is changed by calling the chdir(path). @@ -149,9 +149,9 @@ will open "/music/BigBand.wav" on sd2. \section Install Installation -You must manually install %SdFat by renaming the download folder %SdFat +You must manually install %SdFat by renaming the download folder %SdFat and copy the %SdFat folder to the Arduino libraries folder in your -sketchbook folder. +sketchbook folder. It will be necessary to unzip and rename the folder if you download a zip file from GitHub. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.h similarity index 81% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.h index 054f1994..55f26747 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.h @@ -3,7 +3,8 @@ const size_t BLOCK_SIZE = 64; //------------------------------------------------------------------------------ // First block of file. -const size_t PIN_NUM_DIM = BLOCK_SIZE - 3*sizeof(uint32_t) - 2*sizeof(uint8_t); +const size_t PIN_NUM_DIM = + BLOCK_SIZE - 3 * sizeof(uint32_t) - 2 * sizeof(uint8_t); struct metadata_t { uint32_t adcFrequency; // ADC clock frequency uint32_t cpuFrequency; // CPU clock frequency @@ -14,15 +15,16 @@ struct metadata_t { }; //------------------------------------------------------------------------------ // Data block for 8-bit ADC mode. -const size_t DATA_DIM8 = (BLOCK_SIZE - 2*sizeof(uint16_t))/sizeof(uint8_t); +const size_t DATA_DIM8 = (BLOCK_SIZE - 2 * sizeof(uint16_t)) / sizeof(uint8_t); struct block8_t { uint16_t count; // count of data values uint16_t overrun; // count of overruns since last block - uint8_t data[DATA_DIM8]; + uint8_t data[DATA_DIM8]; }; //------------------------------------------------------------------------------ // Data block for 10-bit ADC mode. -const size_t DATA_DIM16 = (BLOCK_SIZE - 2*sizeof(uint16_t))/sizeof(uint16_t); +const size_t DATA_DIM16 = + (BLOCK_SIZE - 2 * sizeof(uint16_t)) / sizeof(uint16_t); struct block16_t { unsigned short count; // count of data values unsigned short overrun; // count of overruns since last block diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.ino similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.ino index 064edebc..6c70af8b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/AvrAdcLogger/AvrAdcLogger.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/AvrAdcLogger/AvrAdcLogger.ino @@ -20,10 +20,11 @@ */ #ifdef __AVR__ #include -#include "SdFat.h" + +#include "AvrAdcLogger.h" #include "BufferedPrint.h" #include "FreeStack.h" -#include "AvrAdcLogger.h" +#include "SdFat.h" // Save SRAM if 328. #ifdef __AVR_ATmega328P__ @@ -73,7 +74,7 @@ const float SAMPLE_RATE = 5000; // Must be 0.25 or greater. // constant instead of being calculated from SAMPLE_RATE. SAMPLE_RATE is not // used in the code below. For example, setting SAMPLE_INTERVAL = 2.0e-4 // will result in a 200 microsecond sample interval. -const float SAMPLE_INTERVAL = 1.0/SAMPLE_RATE; +const float SAMPLE_INTERVAL = 1.0 / SAMPLE_RATE; // Setting ROUND_SAMPLE_INTERVAL non-zero will cause the sample interval to // be rounded to a a multiple of the ADC clock period and will reduce sample @@ -109,11 +110,11 @@ const size_t NAME_DIM = 40; #elif RAMEND < 0X10FF const size_t FIFO_SIZE_BYTES = 512; #elif RAMEND < 0X20FF -const size_t FIFO_SIZE_BYTES = 4*512; +const size_t FIFO_SIZE_BYTES = 4 * 512; #elif RAMEND < 0X40FF -const size_t FIFO_SIZE_BYTES = 12*512; -#else // RAMEND -const size_t FIFO_SIZE_BYTES = 16*512; +const size_t FIFO_SIZE_BYTES = 12 * 512; +#else // RAMEND +const size_t FIFO_SIZE_BYTES = 16 * 512; #endif // RAMEND //------------------------------------------------------------------------------ // ADC clock rate. @@ -136,7 +137,7 @@ const size_t FIFO_SIZE_BYTES = 16*512; #define TMP_FILE_NAME "tmp_adc.bin" // Number of analog pins to log. -const uint8_t PIN_COUNT = sizeof(PIN_LIST)/sizeof(PIN_LIST[0]); +const uint8_t PIN_COUNT = sizeof(PIN_LIST) / sizeof(PIN_LIST[0]); // Minimum ADC clock cycles per sample interval const uint16_t MIN_ADC_CYCLES = 15; @@ -151,6 +152,7 @@ const uint32_t MAX_FILE_SIZE = MAX_FILE_SIZE_MiB << 20; // Max SPI rate for AVR is 10 MHz for F_CPU 20 MHz, 8 MHz for F_CPU 16 MHz. #define SPI_CLOCK SD_SCK_MHZ(10) + // Select fastest interface. #if ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) @@ -180,19 +182,19 @@ file_t csvFile; char binName[] = LOG_FILE_NAME; #if RECORD_EIGHT_BITS -const size_t BLOCK_MAX_COUNT = PIN_COUNT*(DATA_DIM8/PIN_COUNT); +const size_t BLOCK_MAX_COUNT = PIN_COUNT * (DATA_DIM8 / PIN_COUNT); typedef block8_t block_t; -#else // RECORD_EIGHT_BITS -const size_t BLOCK_MAX_COUNT = PIN_COUNT*(DATA_DIM16/PIN_COUNT); +#else // RECORD_EIGHT_BITS +const size_t BLOCK_MAX_COUNT = PIN_COUNT * (DATA_DIM16 / PIN_COUNT); typedef block16_t block_t; -#endif // RECORD_EIGHT_BITS +#endif // RECORD_EIGHT_BITS // Size of FIFO in blocks. -size_t const FIFO_DIM = FIFO_SIZE_BYTES/sizeof(block_t); +size_t const FIFO_DIM = FIFO_SIZE_BYTES / sizeof(block_t); block_t* fifoData; -volatile size_t fifoCount = 0; // volatile - shared, ISR and background. -size_t fifoHead = 0; // Only accessed by ISR during logging. -size_t fifoTail = 0; // Only accessed by writer during logging. +volatile size_t fifoCount = 0; // volatile - shared, ISR and background. +size_t fifoHead = 0; // Only accessed by ISR during logging. +size_t fifoTail = 0; // Only accessed by writer during logging. //============================================================================== // Interrupt Service Routines @@ -219,7 +221,7 @@ ISR(ADC_vect) { // Read ADC data. #if RECORD_EIGHT_BITS uint8_t d = ADCH; -#else // RECORD_EIGHT_BITS +#else // RECORD_EIGHT_BITS // This will access ADCL first. uint16_t d = ADC; #endif // RECORD_EIGHT_BITS @@ -245,7 +247,7 @@ ISR(ADC_vect) { if (adcindex == 0) { timerFlag = false; } - adcindex = adcindex < (PIN_COUNT - 1) ? adcindex + 1 : 0; + adcindex = adcindex < (PIN_COUNT - 1) ? adcindex + 1 : 0; } else { timerFlag = false; } @@ -277,7 +279,7 @@ ISR(TIMER1_COMPB_vect) { } //============================================================================== // Error messages stored in flash. -#define error(msg) (Serial.println(F(msg)),errorHalt()) +#define error(msg) (Serial.println(F(msg)), errorHalt()) #define assert(e) ((e) ? (void)0 : error("assert: " #e)) //------------------------------------------------------------------------------ // @@ -336,12 +338,13 @@ void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { #error unexpected ADC prescaler bits #endif //------------------------------------------------------------------------------ -inline bool adcActive() {return (1 << ADIE) & ADCSRA;} +inline bool adcActive() { return (1 << ADIE) & ADCSRA; } //------------------------------------------------------------------------------ // initialize ADC and timer1 void adcInit(metadata_t* meta) { uint8_t adps; // prescaler bits for ADCSRA - uint32_t ticks = F_CPU*SAMPLE_INTERVAL + 0.5; // Sample interval cpu cycles. + uint32_t ticks = + F_CPU * SAMPLE_INTERVAL + 0.5; // Sample interval cpu cycles. if (ADC_REF & ~((1 << REFS0) | (1 << REFS1))) { error("Invalid ADC reference"); @@ -351,9 +354,9 @@ void adcInit(metadata_t* meta) { error("Invalid ADC prescaler"); } adps = ADC_PRESCALER; -#else // ADC_PRESCALER +#else // ADC_PRESCALER // Allow extra cpu cycles to change ADC settings if more than one pin. - int32_t adcCycles = (ticks - ISR_TIMER0)/PIN_COUNT - ISR_SETUP_ADC; + int32_t adcCycles = (ticks - ISR_TIMER0) / PIN_COUNT - ISR_SETUP_ADC; for (adps = 7; adps > 0; adps--) { if (adcCycles >= (MIN_ADC_CYCLES << adps)) { @@ -410,19 +413,19 @@ void adcInit(metadata_t* meta) { // no prescale, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); tshift = 0; - } else if (ticks < 0X10000*8) { + } else if (ticks < 0X10000 * 8) { // prescale 8, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); tshift = 3; - } else if (ticks < 0X10000*64) { + } else if (ticks < 0X10000 * 64) { // prescale 64, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10); tshift = 6; - } else if (ticks < 0X10000*256) { + } else if (ticks < 0X10000 * 256) { // prescale 256, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12); tshift = 8; - } else if (ticks < 0X10000*1024) { + } else if (ticks < 0X10000 * 1024) { // prescale 1024, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12) | (1 << CS10); tshift = 10; @@ -442,7 +445,7 @@ void adcInit(metadata_t* meta) { // Sample interval in CPU clock ticks. meta->sampleInterval = ticks; meta->cpuFrequency = F_CPU; - float sampleRate = (float)meta->cpuFrequency/meta->sampleInterval; + float sampleRate = (float)meta->cpuFrequency / meta->sampleInterval; Serial.print(F("Sample pins:")); for (uint8_t i = 0; i < meta->pinCount; i++) { Serial.print(' '); @@ -452,11 +455,11 @@ void adcInit(metadata_t* meta) { Serial.print(F("ADC bits: ")); Serial.println(meta->recordEightBits ? 8 : 10); Serial.print(F("ADC clock kHz: ")); - Serial.println(meta->adcFrequency/1000); + Serial.println(meta->adcFrequency / 1000); Serial.print(F("Sample Rate: ")); Serial.println(sampleRate); Serial.print(F("Sample interval usec: ")); - Serial.println(1000000.0/sampleRate); + Serial.println(1000000.0 / sampleRate); } //------------------------------------------------------------------------------ // enable ADC and timer1 interrupts @@ -508,7 +511,7 @@ void binaryToCsv() { if (nb < 0) { error("read binFile failed"); } - size_t nd = nb/sizeof(block_t); + size_t nd = nb / sizeof(block_t); if (nd < 1) { break; } @@ -519,7 +522,8 @@ void binaryToCsv() { error("Invalid pinCount"); } bp.print(F("Interval,")); - float intervalMicros = 1.0e6*pm->sampleInterval/(float)pm->cpuFrequency; + float intervalMicros = + 1.0e6 * pm->sampleInterval / (float)pm->cpuFrequency; bp.print(intervalMicros, 4); bp.println(F(",usec")); for (uint8_t i = 0; i < PIN_COUNT; i++) { @@ -541,14 +545,15 @@ void binaryToCsv() { } for (size_t j = 0; j < pd->count; j += PIN_COUNT) { for (size_t i = 0; i < PIN_COUNT; i++) { - if (!bp.printField(pd->data[i + j], i == (PIN_COUNT-1) ? '\n' : ',')) { + if (!bp.printField(pd->data[i + j], + i == (PIN_COUNT - 1) ? '\n' : ',')) { error("printField failed"); } } } } if ((millis() - tPct) > 1000) { - uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + uint8_t pct = binFile.curPosition() / (binFile.fileSize() / 100); if (pct != lastPct) { tPct = millis(); lastPct = pct; @@ -561,7 +566,7 @@ void binaryToCsv() { error("close csvFile failed"); } Serial.print(F("Done: ")); - Serial.print(0.001*(millis() - t0)); + Serial.print(0.001 * (millis() - t0)); Serial.println(F(" Seconds")); } //------------------------------------------------------------------------------ @@ -619,7 +624,7 @@ bool createCsvFile() { error("no dot in binName"); } strcpy(dot + 1, "csv"); - if (!csvFile.open(csvName, O_WRONLY|O_CREAT|O_TRUNC)) { + if (!csvFile.open(csvName, O_WRONLY | O_CREAT | O_TRUNC)) { error("open csvFile failed"); } Serial.print(F("Writing: ")); @@ -632,7 +637,7 @@ bool createCsvFile() { void logData() { uint32_t t0; uint32_t t1; - uint32_t overruns =0; + uint32_t overruns = 0; uint32_t count = 0; uint32_t maxLatencyUsec = 0; size_t maxFifoUse = 0; @@ -676,7 +681,7 @@ void logData() { if (m > maxLatencyUsec) { maxLatencyUsec = m; } - if (tmpFifoCount >maxFifoUse) { + if (tmpFifoCount > maxFifoUse) { maxFifoUse = tmpFifoCount; } count += pBlock->count; @@ -711,7 +716,7 @@ void logData() { isrStop = true; } if (fifoCount == 0 && !adcActive()) { - break; + break; } } Serial.println(); @@ -726,9 +731,9 @@ void logData() { Serial.print(F("Max write latency usec: ")); Serial.println(maxLatencyUsec); Serial.print(F("Record time sec: ")); - Serial.println(0.001*(t1 - t0), 3); + Serial.println(0.001 * (t1 - t0), 3); Serial.print(F("Sample count: ")); - Serial.println(count/PIN_COUNT); + Serial.println(count / PIN_COUNT); Serial.print(F("Overruns: ")); Serial.println(overruns); Serial.print(F("FIFO_DIM: ")); @@ -767,13 +772,13 @@ void printData() { return; } binFile.rewind(); - if (binFile.read(&buf , sizeof(buf)) != sizeof(buf)) { + if (binFile.read(&buf, sizeof(buf)) != sizeof(buf)) { error("Read metadata failed"); } Serial.println(F("Type any character to stop")); delay(1000); while (!Serial.available() && - binFile.read(&buf , sizeof(buf)) == sizeof(buf)) { + binFile.read(&buf, sizeof(buf)) == sizeof(buf)) { if (buf.count == 0) { break; } @@ -783,7 +788,7 @@ void printData() { } for (size_t i = 0; i < buf.count; i++) { Serial.print(buf.data[i], DEC); - if ((i+1)%PIN_COUNT) { + if ((i + 1) % PIN_COUNT) { Serial.print(','); } else { Serial.println(); @@ -795,7 +800,7 @@ void printData() { //------------------------------------------------------------------------------ bool serialReadLine(char* str, size_t size) { size_t n = 0; - while(!Serial.available()) { + while (!Serial.available()) { } while (true) { int c = Serial.read(); @@ -806,7 +811,8 @@ bool serialReadLine(char* str, size_t size) { return false; } uint32_t m = millis(); - while (!Serial.available() && (millis() - m) < 100){} + while (!Serial.available() && (millis() - m) < 100) { + } if (!Serial.available()) break; } str[n] = 0; @@ -818,9 +824,11 @@ void setup(void) { pinMode(ERROR_LED_PIN, OUTPUT); } Serial.begin(9600); - while(!Serial) {} + while (!Serial) { + } Serial.println(F("Type any character to begin.")); - while(!Serial.available()) {} + while (!Serial.available()) { + } FillStack(); @@ -828,9 +836,9 @@ void setup(void) { analogRead(PIN_LIST[0]); #if !ENABLE_DEDICATED_SPI - Serial.println(F( - "\nFor best performance edit SdFatConfig.h\n" - "and set ENABLE_DEDICATED_SPI nonzero")); + Serial.println( + F("\nFor best performance edit SdFatConfig.h\n" + "and set ENABLE_DEDICATED_SPI nonzero")); #endif // !ENABLE_DEDICATED_SPI // Initialize SD. if (!sd.begin(SD_CONFIG)) { @@ -864,7 +872,7 @@ void loop(void) { Serial.println(F("p - print data to Serial")); Serial.println(F("r - record ADC data")); - while(!Serial.available()) { + while (!Serial.available()) { yield(); } char c = tolower(Serial.read()); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/BackwardCompatibility/BackwardCompatibility.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/BackwardCompatibility/BackwardCompatibility.ino similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/BackwardCompatibility/BackwardCompatibility.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/BackwardCompatibility/BackwardCompatibility.ino index 8e7299cc..9729695d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/BackwardCompatibility/BackwardCompatibility.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/BackwardCompatibility/BackwardCompatibility.ino @@ -28,11 +28,12 @@ File myFile; void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } #if USE_SD_H Serial.println(F("Using SD.h. Set USE_SD_H zero to use SdFat.h.")); -#else // USE_SD_H +#else // USE_SD_H Serial.println(F("Using SdFat.h. Set USE_SD_H nonzero to use SD.h.")); #endif // USE_SD_H Serial.println(F("\nType any character to begin.")); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/BufferedPrint/BufferedPrint.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/BufferedPrint/BufferedPrint.ino similarity index 67% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/BufferedPrint/BufferedPrint.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/BufferedPrint/BufferedPrint.ino index f889c1a6..5a924eb6 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/BufferedPrint/BufferedPrint.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/BufferedPrint/BufferedPrint.ino @@ -1,12 +1,12 @@ // Test and benchmark of the fast bufferedPrint class. // // Mainly for AVR but may improve print performance with other CPUs. -#include "SdFat.h" #include "BufferedPrint.h" +#include "SdFat.h" // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -19,7 +19,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -30,7 +30,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -71,49 +71,48 @@ void benchmark() { bp.begin(&file); } uint32_t t = millis(); - switch(test) { - case 0: - Serial.println(F("Test of println(uint16_t)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println(i); - } - break; + switch (test) { + case 0: + Serial.println(F("Test of println(uint16_t)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println(i); + } + break; - case 1: - Serial.println(F("Test of printField(uint16_t, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField(i, '\n'); - } - break; + case 1: + Serial.println(F("Test of printField(uint16_t, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField(i, '\n'); + } + break; - case 2: - Serial.println(F("Test of println(uint32_t)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println(12345678UL + i); - } - break; + case 2: + Serial.println(F("Test of println(uint32_t)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println(12345678UL + i); + } + break; - case 3: - Serial.println(F("Test of printField(uint32_t, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField(12345678UL + i, '\n'); - } - break; + case 3: + Serial.println(F("Test of printField(uint32_t, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField(12345678UL + i, '\n'); + } + break; - case 4: - Serial.println(F("Test of println(double)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println((double)0.01*i); - } - break; - - case 5: - Serial.println(F("Test of printField(double, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField((double)0.01*i, '\n'); - } - break; + case 4: + Serial.println(F("Test of println(double)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println((double)0.01 * i); + } + break; + case 5: + Serial.println(F("Test of printField(double, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField((double)0.01 * i, '\n'); + } + break; } if (test & 1) { bp.sync(); @@ -125,13 +124,13 @@ void benchmark() { file.close(); t = millis() - t; Serial.print(F("Time ")); - Serial.print(0.001*t, 3); + Serial.print(0.001 * t, 3); Serial.println(F(" sec")); Serial.print(F("File size ")); - Serial.print(0.001*s); + Serial.print(0.001 * s); Serial.println(F(" KB")); Serial.print(F("Write ")); - Serial.print(s/t); + Serial.print(s / t); Serial.println(F(" KB/sec")); Serial.println(); } @@ -139,23 +138,23 @@ void benchmark() { //------------------------------------------------------------------------------ void testMemberFunctions() { BufferedPrint bp(&Serial); - char c = 'c'; // char + char c = 'c'; // char //#define BASIC_TYPES #ifdef BASIC_TYPES - signed char sc = -1; // signed 8-bit - unsigned char uc = 1; // unsiged 8-bit - signed short ss = -2; // signed 16-bit - unsigned short us = 2; // unsigned 16-bit - signed long sl = -4; // signed 32-bit - unsigned long ul = 4; // unsigned 32-bit -#else // BASIC_TYPES - int8_t sc = -1; // signed 8-bit - uint8_t uc = 1; // unsiged 8-bit - int16_t ss = -2; // signed 16-bit - uint16_t us = 2; // unsigned 16-bit - int32_t sl = -4; // signed 32-bit - uint32_t ul = 4; // unsigned 32-bit -#endif // BASIC_TYPES + signed char sc = -1; // signed 8-bit + unsigned char uc = 1; // unsiged 8-bit + signed short ss = -2; // signed 16-bit + unsigned short us = 2; // unsigned 16-bit + signed long sl = -4; // signed 32-bit + unsigned long ul = 4; // unsigned 32-bit +#else // BASIC_TYPES + int8_t sc = -1; // signed 8-bit + uint8_t uc = 1; // unsiged 8-bit + int16_t ss = -2; // signed 16-bit + uint16_t us = 2; // unsigned 16-bit + int32_t sl = -4; // signed 32-bit + uint32_t ul = 4; // unsigned 32-bit +#endif // BASIC_TYPES float f = -1.234; double d = -5.678; bp.println(); @@ -216,9 +215,11 @@ void testMemberFunctions() { //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } Serial.println("Type any character to begin."); - while(!Serial.available()) {} + while (!Serial.available()) { + } if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } @@ -226,10 +227,10 @@ void setup() { Serial.println(F("Test member funcions:")); testMemberFunctions(); Serial.println(); - Serial.println(F("Benchmark performance for uint16_t, uint32_t, and double:")); + Serial.println( + F("Benchmark performance for uint16_t, uint32_t, and double:")); benchmark(); Serial.println("Done"); } //------------------------------------------------------------------------------ -void loop() { -} \ No newline at end of file +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/DirectoryFunctions/DirectoryFunctions.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/DirectoryFunctions/DirectoryFunctions.ino similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/DirectoryFunctions/DirectoryFunctions.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/DirectoryFunctions/DirectoryFunctions.ino index 008d1fb9..455578e9 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/DirectoryFunctions/DirectoryFunctions.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/DirectoryFunctions/DirectoryFunctions.ino @@ -6,7 +6,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -18,19 +18,19 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN // Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN // Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. -#define SPI_CLOCK SD_SCK_MHZ(50) +#define SPI_CLOCK SD_SCK_MHZ(16) // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -78,9 +78,8 @@ void setup() { if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } - if (sd.exists("Folder1") - || sd.exists("Folder1/file1.txt") - || sd.exists("Folder1/File2.txt")) { + if (sd.exists("Folder1") || sd.exists("Folder1/file1.txt") || + sd.exists("Folder1/File2.txt")) { error("Please remove existing Folder1, file1.txt, and File2.txt"); } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/ExFatLogger/ExFatLogger.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/ExFatLogger/ExFatLogger.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/ExFatLogger/ExFatLogger.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/ExFatLogger/ExFatLogger.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/ExFatLogger/ExFatLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/ExFatLogger/ExFatLogger.ino similarity index 94% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/ExFatLogger/ExFatLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/ExFatLogger/ExFatLogger.ino index aa11284c..f3a6c55d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/ExFatLogger/ExFatLogger.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/ExFatLogger/ExFatLogger.ino @@ -3,9 +3,9 @@ // // The maximum data rate will depend on the quality of your SD, // the size of the FIFO, and using dedicated SPI. -#include "SdFat.h" -#include "FreeStack.h" #include "ExFatLogger.h" +#include "FreeStack.h" +#include "SdFat.h" //------------------------------------------------------------------------------ // This example was designed for exFAT but will support FAT16/FAT32. // Note: Uno will not support SD_FAT_TYPE = 3. @@ -45,7 +45,7 @@ const uint32_t LOG_INTERVAL_USEC = 2000; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -71,7 +71,7 @@ const uint32_t PREALLOCATE_SIZE_MiB = 1024UL; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -127,11 +127,11 @@ void printRecord(Print* pr, data_t* data) { } } //============================================================================== -const uint64_t PREALLOCATE_SIZE = (uint64_t)PREALLOCATE_SIZE_MiB << 20; +const uint64_t PREALLOCATE_SIZE = (uint64_t)PREALLOCATE_SIZE_MiB << 20; // Max length of file name including zero byte. #define FILE_NAME_DIM 40 // Max number of records to buffer while SD is busy. -const size_t FIFO_DIM = 512*FIFO_SIZE_SECTORS/sizeof(data_t); +const size_t FIFO_DIM = 512 * FIFO_SIZE_SECTORS / sizeof(data_t); #if SD_FAT_TYPE == 0 typedef SdFat sd_t; @@ -191,22 +191,22 @@ void binaryToCsv() { data_t binData[FIFO_DIM]; if (!binFile.seekSet(512)) { - error("binFile.seek failed"); + error("binFile.seek failed"); } uint32_t tPct = millis(); printRecord(&csvFile, nullptr); while (!Serial.available() && binFile.available()) { int nb = binFile.read(binData, sizeof(binData)); - if (nb <= 0 ) { + if (nb <= 0) { error("read binFile failed"); } - size_t nr = nb/sizeof(data_t); + size_t nr = nb / sizeof(data_t); for (size_t i = 0; i < nr; i++) { printRecord(&csvFile, &binData[i]); } if ((millis() - tPct) > 1000) { - uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + uint8_t pct = binFile.curPosition() / (binFile.fileSize() / 100); if (pct != lastPct) { tPct = millis(); lastPct = pct; @@ -221,7 +221,7 @@ void binaryToCsv() { } csvFile.close(); Serial.print(F("Done: ")); - Serial.print(0.001*(millis() - t0)); + Serial.print(0.001 * (millis() - t0)); Serial.println(F(" Seconds")); } //------------------------------------------------------------------------------ @@ -302,7 +302,7 @@ void logData() { uint16_t overrun = 0; uint16_t maxOverrun = 0; uint32_t totalOverrun = 0; - uint32_t fifoBuf[128*FIFO_SIZE_SECTORS]; + uint32_t fifoBuf[128 * FIFO_SIZE_SECTORS]; data_t* fifoData = (data_t*)fifoBuf; // Write dummy sector to start multi-block write. @@ -315,7 +315,8 @@ void logData() { Serial.println(F("Type any character to stop")); // Wait until SD is not busy. - while (sd.card()->isBusy()) {} + while (sd.card()->isBusy()) { + } // Start time for log file. uint32_t m = millis(); @@ -370,9 +371,9 @@ void logData() { if (!sd.card()->isBusy()) { size_t nw = fifoHead > fifoTail ? fifoCount : FIFO_DIM - fifoTail; // Limit write time by not writing more than 512 bytes. - const size_t MAX_WRITE = 512/sizeof(data_t); + const size_t MAX_WRITE = 512 / sizeof(data_t); if (nw > MAX_WRITE) nw = MAX_WRITE; - size_t nb = nw*sizeof(data_t); + size_t nb = nw * sizeof(data_t); uint32_t usec = micros(); if (nb != binFile.write(fifoData + fifoTail, nb)) { error("write binFile failed"); @@ -392,7 +393,7 @@ void logData() { } } Serial.print(F("\nLog time: ")); - Serial.print(0.001*(millis() - m)); + Serial.print(0.001 * (millis() - m)); Serial.println(F(" Seconds")); binFile.truncate(); binFile.sync(); @@ -469,7 +470,7 @@ void printUnusedStack() { //------------------------------------------------------------------------------ bool serialReadLine(char* str, size_t size) { size_t n = 0; - while(!Serial.available()) { + while (!Serial.available()) { yield(); } while (true) { @@ -481,7 +482,8 @@ bool serialReadLine(char* str, size_t size) { return false; } uint32_t m = millis(); - while (!Serial.available() && (millis() - m) < 100){} + while (!Serial.available() && (millis() - m) < 100) { + } if (!Serial.available()) break; } str[n] = 0; @@ -525,9 +527,9 @@ void setup() { } FillStack(); #if !ENABLE_DEDICATED_SPI - Serial.println(F( - "\nFor best performance edit SdFatConfig.h\n" - "and set ENABLE_DEDICATED_SPI nonzero")); + Serial.println( + F("\nFor best performance edit SdFatConfig.h\n" + "and set ENABLE_DEDICATED_SPI nonzero")); #endif // !ENABLE_DEDICATED_SPI Serial.print(FIFO_DIM); @@ -567,7 +569,7 @@ void loop() { Serial.println(F("p - print data to Serial")); Serial.println(F("r - record data")); Serial.println(F("t - test without logging")); - while(!Serial.available()) { + while (!Serial.available()) { yield(); } char c = tolower(Serial.read()); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino similarity index 73% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino index 3b03eb6f..1e8a7e9d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino @@ -14,7 +14,8 @@ File file; #include "SdFat.h" // Setting ENABLE_DEDICATED_SPI to zero saves over 200 more bytes. #if ENABLE_DEDICATED_SPI -#warning "Set ENABLE_DEDICATED_SPI zero in SdFat/src/SdFatConfig.h for minimum size" +#warning \ + "Set ENABLE_DEDICATED_SPI zero in SdFat/src/SdFatConfig.h for minimum size" #endif // ENABLE_DEDICATED_SPI // Insure FAT16/FAT32 only. SdFat32 SD; @@ -24,17 +25,19 @@ FatFile file; void error(const char* msg) { Serial.println(msg); - while(true); + while (true) { + } } - void setup() { int n; char buf[4]; Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } Serial.println("Type any character to begin"); - while (!Serial.available()) {} + while (!Serial.available()) { + } if (!SD.begin(CS_PIN)) error("SD.begin"); @@ -47,12 +50,11 @@ void setup() { if (!file.openExistingSFN(SFN_PATH)) error("open"); #endif while ((n = file.read(buf, sizeof(buf)))) { - Serial.write(buf, n); + Serial.write(buf, n); } -// close() is only needed if you write to the file. For example, read -// config data, modify the data, rewind the file and write the data. -// file.close(); + // close() is only needed if you write to the file. For example, read + // config data, modify the data, rewind the file and write the data. + // file.close(); } -void loop() { -} +void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/OpenNext/OpenNext.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/OpenNext/OpenNext.ino similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/OpenNext/OpenNext.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/OpenNext/OpenNext.ino index 6ca5426f..16687260 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/OpenNext/OpenNext.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/OpenNext/OpenNext.ino @@ -5,7 +5,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -17,19 +17,19 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN // Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN // Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. -#define SPI_CLOCK SD_SCK_MHZ(50) +#define SPI_CLOCK SD_SCK_MHZ(30) // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -75,8 +75,12 @@ void setup() { if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } - // Open root directory - if (!dir.open("/")){ + +} +//------------------------------------------------------------------------------ +void loop() { + // Open root directory + if (!dir.open("/")) { error("dir.open failed"); } // Open next file in root. @@ -100,6 +104,7 @@ void setup() { } else { Serial.println("Done!"); } -} -//------------------------------------------------------------------------------ -void loop() {} \ No newline at end of file + dir.close(); + delay(2000); + + } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/QuickStart/QuickStart.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/QuickStart/QuickStart.ino similarity index 78% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/QuickStart/QuickStart.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/QuickStart/QuickStart.ino index f69adf93..eb884ab7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/QuickStart/QuickStart.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/QuickStart/QuickStart.ino @@ -1,6 +1,7 @@ // Quick hardware test for SPI card access. // #include + #include "SdFat.h" #include "sdios.h" @@ -81,17 +82,17 @@ void setup() { if (DISABLE_CHIP_SELECT < 0) { cout << F( - "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" - "a second SPI device. For example, with the Ethernet\n" - "shield, DISABLE_CHIP_SELECT should be set to 10\n" - "to disable the Ethernet controller.\n"); + "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" + "a second SPI device. For example, with the Ethernet\n" + "shield, DISABLE_CHIP_SELECT should be set to 10\n" + "to disable the Ethernet controller.\n"); } cout << F( - "\nSD chip select is the key hardware option.\n" - "Common values are:\n" - "Arduino Ethernet shield, pin 4\n" - "Sparkfun SD shield, pin 8\n" - "Adafruit SD shields and modules, pin 10\n"); + "\nSD chip select is the key hardware option.\n" + "Common values are:\n" + "Arduino Ethernet shield, pin 4\n" + "Sparkfun SD shield, pin 8\n" + "Adafruit SD shields and modules, pin 10\n"); } bool firstTry = true; @@ -117,8 +118,8 @@ void loop() { } if (DISABLE_CHIP_SELECT < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CHIP_SELECT to disable another device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CHIP_SELECT) << endl; @@ -128,12 +129,12 @@ void loop() { if (!sd.begin(chipSelect, SPI_SPEED)) { if (sd.card()->errorCode()) { cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is chipSelect set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - "Is there a wiring/soldering problem?\n"); + "\nSD initialization failed.\n" + "Do not reformat the card!\n" + "Is the card correctly inserted?\n" + "Is chipSelect set to the correct value?\n" + "Does another SPI device need to be disabled?\n" + "Is there a wiring/soldering problem?\n"); cout << F("\nerrorCode: ") << hex << showbase; cout << int(sd.card()->errorCode()); cout << F(", errorData: ") << int(sd.card()->errorData()); @@ -142,7 +143,7 @@ void loop() { } cout << F("\nCard successfully initialized.\n"); if (sd.vol()->fatType() == 0) { - cout << F("Can't find a valid FAT16/FAT32 partition.\n"); + cout << F("Can't find a valid FAT16/FAT32/exFAT partition.\n"); reformatMsg(); return; } @@ -162,15 +163,19 @@ void loop() { cout << F("Card size: ") << sizeMB; cout << F(" MB (MB = 1,000,000 bytes)\n"); cout << endl; - cout << F("Volume is FAT") << int(sd.vol()->fatType()); + if (sd.fatType() <= 32) { + cout << F("\nVolume is FAT") << int(sd.fatType()); + } else { + cout << F("\nVolume is exFAT"); + } cout << F(", Cluster size (bytes): ") << sd.vol()->bytesPerCluster(); cout << endl << endl; cout << F("Files found (date time size name):\n"); sd.ls(LS_R | LS_DATE | LS_SIZE); - if ((sizeMB > 1100 && sd.vol()->sectorsPerCluster() < 64) - || (sizeMB < 2200 && sd.vol()->fatType() == 32)) { + if ((sizeMB > 1100 && sd.vol()->sectorsPerCluster() < 64) || + (sizeMB < 2200 && sd.vol()->fatType() == 32)) { cout << F("\nThis card should be reformatted for best performance.\n"); cout << F("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); cout << F("Only cards larger than 2 GB should be formatted FAT32.\n"); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/ReadCsvFile/ReadCsvFile.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/ReadCsvFile/ReadCsvFile.ino similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/ReadCsvFile/ReadCsvFile.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/ReadCsvFile/ReadCsvFile.ino index efe20ab3..7fb61cad 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/ReadCsvFile/ReadCsvFile.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/ReadCsvFile/ReadCsvFile.ino @@ -2,7 +2,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -15,7 +15,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -26,7 +26,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -127,10 +127,10 @@ void setup() { error("open failed"); } // Write test data. - file.print(F( - "abc,123,456,7.89\r\n" - "def,-321,654,-9.87\r\n" - "ghi,333,0xff,5.55")); + file.print( + F("abc,123,456,7.89\r\n" + "def,-321,654,-9.87\r\n" + "ghi,333,0xff,5.55")); // Rewind file for read. file.rewind(); @@ -140,7 +140,7 @@ void setup() { if (n <= 0) { error("fgets failed"); } - if (line[n-1] != '\n' && n == (sizeof(line) - 1)) { + if (line[n - 1] != '\n' && n == (sizeof(line) - 1)) { error("line too long"); } if (!parseLine(line)) { @@ -152,5 +152,4 @@ void setup() { Serial.println(F("Done")); } -void loop() { -} +void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/RtcTimestampTest/RtcTimestampTest.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/RtcTimestampTest/RtcTimestampTest.ino similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/RtcTimestampTest/RtcTimestampTest.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/RtcTimestampTest/RtcTimestampTest.ino index f18f00c6..3e5e5a74 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/RtcTimestampTest/RtcTimestampTest.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/RtcTimestampTest/RtcTimestampTest.ino @@ -13,7 +13,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -26,7 +26,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -37,7 +37,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -59,7 +59,6 @@ FsFile file; #error Invalid SD_FAT_TYPE #endif // SD_FAT_TYPE - #if RTC_TYPE == 0 RTC_Millis rtc; #elif RTC_TYPE == 1 @@ -108,12 +107,12 @@ void getLine(char* line, size_t size) { while (true) { t = millis() + 10; while (!Serial.available()) { - if (millis() > t){ + if (millis() > t) { return; } } int c = Serial.read(); - if (i >= (size - 1) || c == '\r' || c == '\n' ) { + if (i >= (size - 1) || c == '\r' || c == '\n') { return; } line[i++] = c; @@ -134,11 +133,11 @@ void printField(Print* pr, char sep, uint8_t v) { void printNow(Print* pr) { DateTime now = rtc.now(); pr->print(now.year()); - printField(pr, '-',now.month()); - printField(pr, '-',now.day()); - printField(pr, ' ',now.hour()); - printField(pr, ':',now.minute()); - printField(pr, ':',now.second()); + printField(pr, '-', now.month()); + printField(pr, '-', now.day()); + printField(pr, ' ', now.hour()); + printField(pr, ':', now.minute()); + printField(pr, ':', now.second()); } //------------------------------------------------------------------------------ bool setRtc() { @@ -180,7 +179,7 @@ void setup() { } #if RTC_TYPE == 0 rtc.begin(DateTime(F(__DATE__), F(__TIME__))); -#else // RTC_TYPE +#else // RTC_TYPE if (!rtc.begin()) { Serial.println(F("rtc.begin failed")); return; @@ -201,7 +200,8 @@ void setup() { Serial.println(); clearSerialInput(); Serial.println(F("Type Y to set RTC, any other character to continue")); - while (!Serial.available()) {} + while (!Serial.available()) { + } if (Serial.read() != 'Y') break; if (setRtc()) break; } @@ -232,5 +232,4 @@ void setup() { Serial.println(F("Done")); } //------------------------------------------------------------------------------ -void loop() { -} \ No newline at end of file +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdErrorCodes/SdErrorCodes.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdErrorCodes/SdErrorCodes.ino similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/SdErrorCodes/SdErrorCodes.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/SdErrorCodes/SdErrorCodes.ino index bd22217f..458d37c7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdErrorCodes/SdErrorCodes.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdErrorCodes/SdErrorCodes.ino @@ -2,7 +2,8 @@ #include "SdFat.h" void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } delay(1000); Serial.println(); Serial.println(F("Code,Symbol - failed operation")); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdFormatter/SdFormatter.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdFormatter/SdFormatter.ino similarity index 80% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/SdFormatter/SdFormatter.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/SdFormatter/SdFormatter.ino index 18db8cfb..6cfd37be 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdFormatter/SdFormatter.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdFormatter/SdFormatter.ino @@ -31,7 +31,7 @@ const int8_t DISABLE_CS_PIN = -1; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -42,7 +42,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -52,14 +52,18 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; ArduinoOutStream cout(Serial); //------------------------------------------------------------------------------ uint32_t cardSectorCount = 0; -uint8_t sectorBuffer[512]; +uint8_t sectorBuffer[512]; //------------------------------------------------------------------------------ // SdCardFactory constructs and initializes the appropriate card. SdCardFactory cardFactory; // Pointer to generic SD card. SdCard* m_card = nullptr; //------------------------------------------------------------------------------ -#define sdError(msg) {cout << F("error: ") << F(msg) << endl; sdErrorHalt();} +#define sdError(msg) \ + { \ + cout << F("error: ") << F(msg) << endl; \ + sdErrorHalt(); \ + } //------------------------------------------------------------------------------ void sdErrorHalt() { if (!m_card) { @@ -73,7 +77,8 @@ void sdErrorHalt() { cout << F(" = ") << int(m_card->errorCode()) << endl; cout << F("SD errorData = ") << int(m_card->errorData()) << endl; } - while (true) {} + while (true) { + } } //------------------------------------------------------------------------------ void clearSerialInput() { @@ -102,7 +107,7 @@ void eraseCard() { sdError("erase failed"); } cout << '.'; - if ((n++)%64 == 63) { + if ((n++) % 64 == 63) { cout << endl; } firstBlock += ERASE_SIZE; @@ -123,9 +128,9 @@ void formatCard() { FatFormatter fatFormatter; // Format exFAT if larger than 32GB. - bool rtn = cardSectorCount > 67108864 ? - exFatFormatter.format(m_card, sectorBuffer, &Serial) : - fatFormatter.format(m_card, sectorBuffer, &Serial); + bool rtn = cardSectorCount > 67108864 + ? exFatFormatter.format(m_card, sectorBuffer, &Serial) + : fatFormatter.format(m_card, sectorBuffer, &Serial); if (!rtn) { sdErrorHalt(); @@ -136,8 +141,8 @@ void formatCard() { void printConfig(SdSpiConfig config) { if (DISABLE_CS_PIN < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CS_PIN to disable an SPI device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CS_PIN to disable an SPI device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CS_PIN) << endl; @@ -169,19 +174,19 @@ void setup() { clearSerialInput(); cout << F( - "\n" - "This program can erase and/or format SD/SDHC/SDXC cards.\n" - "\n" - "Erase uses the card's fast flash erase command.\n" - "Flash erase sets all data to 0X00 for most cards\n" - "and 0XFF for a few vendor's cards.\n" - "\n" - "Cards up to 2 GiB (GiB = 2^30 bytes) will be formated FAT16.\n" - "Cards larger than 2 GiB and up to 32 GiB will be formatted\n" - "FAT32. Cards larger than 32 GiB will be formatted exFAT.\n" - "\n" - "Warning, all data on the card will be erased.\n" - "Enter 'Y' to continue: "); + "\n" + "This program can erase and/or format SD/SDHC/SDXC cards.\n" + "\n" + "Erase uses the card's fast flash erase command.\n" + "Flash erase sets all data to 0X00 for most cards\n" + "and 0XFF for a few vendor's cards.\n" + "\n" + "Cards up to 2 GiB (GiB = 2^30 bytes) will be formated FAT16.\n" + "Cards larger than 2 GiB and up to 32 GiB will be formatted\n" + "FAT32. Cards larger than 32 GiB will be formatted exFAT.\n" + "\n" + "Warning, all data on the card will be erased.\n" + "Enter 'Y' to continue: "); while (!Serial.available()) { yield(); } @@ -207,9 +212,9 @@ void setup() { return; } - cout << F("\nCard size: ") << cardSectorCount*5.12e-7; + cout << F("\nCard size: ") << cardSectorCount * 5.12e-7; cout << F(" GB (GB = 1E9 bytes)\n"); - cout << F("Card size: ") << cardSectorCount/2097152.0; + cout << F("Card size: ") << cardSectorCount / 2097152.0; cout << F(" GiB (GiB = 2^30 bytes)\n"); cout << F("Card will be formated "); @@ -221,13 +226,13 @@ void setup() { cout << F("FAT16\n"); } cout << F( - "\n" - "Options are:\n" - "E - erase the card and skip formatting.\n" - "F - erase and then format the card. (recommended)\n" - "Q - quick format the card without erase.\n" - "\n" - "Enter option: "); + "\n" + "Options are:\n" + "E - erase the card and skip formatting.\n" + "F - erase and then format the card. (recommended)\n" + "Q - quick format the card without erase.\n" + "\n" + "Enter option: "); while (!Serial.available()) { yield(); @@ -245,5 +250,4 @@ void setup() { formatCard(); } } -void loop() { -} \ No newline at end of file +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdInfo/SdInfo.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdInfo/SdInfo.ino similarity index 67% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/SdInfo/SdInfo.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/SdInfo/SdInfo.ino index 44410b60..5edbbad4 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/SdInfo/SdInfo.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/SdInfo/SdInfo.ino @@ -1,5 +1,10 @@ /* * This program attempts to initialize an SD card and analyze its structure. + * The CID and CSD registers are also printed in HEX for use in online + * decoders like these. + * + * https://gurumeditation.org/1342/sd-memory-card-register-decoder/ + * https://archive.goughlui.com/static/multicid.htm */ #include "SdFat.h" #include "sdios.h" @@ -19,9 +24,9 @@ const int8_t DISABLE_CS_PIN = -1; */ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN // Try to select the best SD card configuration. @@ -35,28 +40,28 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; //------------------------------------------------------------------------------ SdFs sd; -cid_t m_cid; -csd_t m_csd; -uint32_t m_eraseSize; -uint32_t m_ocr; +cid_t cid; +csd_t csd; +scr_t scr; +uint8_t cmd6Data[64]; +uint32_t eraseSize; +uint32_t ocr; static ArduinoOutStream cout(Serial); //------------------------------------------------------------------------------ -bool cidDmp() { +void cidDmp() { cout << F("\nManufacturer ID: "); - cout << uppercase << showbase << hex << int(m_cid.mid) << dec << endl; - cout << F("OEM ID: ") << m_cid.oid[0] << m_cid.oid[1] << endl; + cout << uppercase << showbase << hex << int(cid.mid) << dec << endl; + cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { - cout << m_cid.pnm[i]; + cout << cid.pnm[i]; } - cout << F("\nVersion: "); - cout << int(m_cid.prv_n) << '.' << int(m_cid.prv_m) << endl; - cout << F("Serial number: ") << hex << m_cid.psn << dec << endl; + cout << F("\nRevision: ") << cid.prvN() << '.' << cid.prvM() << endl; + cout << F("Serial number: ") << hex << cid.psn() << dec << endl; cout << F("Manufacturing date: "); - cout << int(m_cid.mdt_month) << '/'; - cout << (2000 + 16*m_cid.mdt_year_high + m_cid.mdt_year_low) << endl; - cout << endl; - return true; + cout << cid.mdtMonth() << '/' << cid.mdtYear() << endl; + cout << F("CID HEX: "); + hexDmp(&cid, sizeof(cid)); } //------------------------------------------------------------------------------ void clearSerialInput() { @@ -68,30 +73,26 @@ void clearSerialInput() { } while (micros() - m < 10000); } //------------------------------------------------------------------------------ -bool csdDmp() { - bool eraseSingleBlock; - if (m_csd.v1.csd_ver == 0) { - eraseSingleBlock = m_csd.v1.erase_blk_en; - m_eraseSize = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; - } else if (m_csd.v2.csd_ver == 1) { - eraseSingleBlock = m_csd.v2.erase_blk_en; - m_eraseSize = (m_csd.v2.sector_size_high << 1) | m_csd.v2.sector_size_low; - } else { - cout << F("m_csd version error\n"); - return false; - } - m_eraseSize++; - cout << F("cardSize: ") << 0.000512 * sdCardCapacity(&m_csd); +void csdDmp() { + eraseSize = csd.eraseSize(); + cout << F("\ncardSize: ") << 0.000512 * csd.capacity(); cout << F(" MB (MB = 1,000,000 bytes)\n"); - cout << F("flashEraseSize: ") << int(m_eraseSize) << F(" blocks\n"); + cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); cout << F("eraseSingleBlock: "); - if (eraseSingleBlock) { + if (csd.eraseSingleBlock()) { cout << F("true\n"); } else { cout << F("false\n"); } - return true; + cout << F("dataAfterErase: "); + if (scr.dataAfterErase()) { + cout << F("ones\n"); + } else { + cout << F("zeros\n"); + } + cout << F("CSD HEX: "); + hexDmp(&csd, sizeof(csd)); } //------------------------------------------------------------------------------ void errorPrint() { @@ -99,10 +100,19 @@ void errorPrint() { cout << F("SD errorCode: ") << hex << showbase; printSdErrorSymbol(&Serial, sd.sdErrorCode()); cout << F(" = ") << int(sd.sdErrorCode()) << endl; - cout << F("SD errorData = ") << int(sd.sdErrorData()) << endl; + cout << F("SD errorData = ") << int(sd.sdErrorData()) << dec << endl; } } //------------------------------------------------------------------------------ +void hexDmp(void* reg, uint8_t size) { + uint8_t* u8 = reinterpret_cast(reg); + cout << hex << noshowbase; + for (size_t i = 0; i < size; i++) { + cout << setw(2) << setfill('0') << int(u8[i]); + } + cout << dec << endl; +} +//------------------------------------------------------------------------------ bool mbrDmp() { MbrSector_t mbr; bool valid = true; @@ -114,18 +124,18 @@ bool mbrDmp() { cout << F("\nSD Partition Table\n"); cout << F("part,boot,bgnCHS[3],type,endCHS[3],start,length\n"); for (uint8_t ip = 1; ip < 5; ip++) { - MbrPart_t *pt = &mbr.part[ip - 1]; + MbrPart_t* pt = &mbr.part[ip - 1]; if ((pt->boot != 0 && pt->boot != 0X80) || - getLe32(pt->relativeSectors) > sdCardCapacity(&m_csd)) { + getLe32(pt->relativeSectors) > csd.capacity()) { valid = false; } cout << int(ip) << ',' << uppercase << showbase << hex; cout << int(pt->boot) << ','; - for (int i = 0; i < 3; i++ ) { + for (int i = 0; i < 3; i++) { cout << int(pt->beginCHS[i]) << ','; } cout << int(pt->type) << ','; - for (int i = 0; i < 3; i++ ) { + for (int i = 0; i < 3; i++) { cout << int(pt->endCHS[i]) << ','; } cout << dec << getLe32(pt->relativeSectors) << ','; @@ -139,25 +149,26 @@ bool mbrDmp() { //------------------------------------------------------------------------------ void dmpVol() { cout << F("\nScanning FAT, please wait.\n"); - uint32_t freeClusterCount = sd.freeClusterCount(); + int32_t freeClusterCount = sd.freeClusterCount(); if (sd.fatType() <= 32) { cout << F("\nVolume is FAT") << int(sd.fatType()) << endl; } else { cout << F("\nVolume is exFAT\n"); } cout << F("sectorsPerCluster: ") << sd.sectorsPerCluster() << endl; - cout << F("clusterCount: ") << sd.clusterCount() << endl; - cout << F("freeClusterCount: ") << freeClusterCount << endl; cout << F("fatStartSector: ") << sd.fatStartSector() << endl; cout << F("dataStartSector: ") << sd.dataStartSector() << endl; - if (sd.dataStartSector() % m_eraseSize) { - cout << F("Data area is not aligned on flash erase boundary!\n"); - cout << F("Download and use formatter from www.sdcard.org!\n"); + cout << F("clusterCount: ") << sd.clusterCount() << endl; + cout << F("freeClusterCount: "); + if (freeClusterCount >= 0) { + cout << freeClusterCount << endl; + } else { + cout << F("failed\n"); + errorPrint(); } } //------------------------------------------------------------------------------ void printCardType() { - cout << F("\nCard type: "); switch (sd.card()->type()) { @@ -170,7 +181,7 @@ void printCardType() { break; case SD_CARD_TYPE_SDHC: - if (sdCardCapacity(&m_csd) < 70000000) { + if (csd.capacity() < 70000000) { cout << F("SDHC\n"); } else { cout << F("SDXC\n"); @@ -185,8 +196,8 @@ void printCardType() { void printConfig(SdSpiConfig config) { if (DISABLE_CS_PIN < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CS_PIN to disable an SPI device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CS_PIN to disable an SPI device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CS_PIN) << endl; @@ -210,7 +221,6 @@ void setup() { } cout << F("SdFat version: ") << SD_FAT_VERSION_STR << endl; printConfig(SD_CONFIG); - } //------------------------------------------------------------------------------ void loop() { @@ -225,34 +235,40 @@ void loop() { uint32_t t = millis(); if (!sd.cardBegin(SD_CONFIG)) { cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is there a wiring/soldering problem?\n"); + "\nSD initialization failed.\n" + "Do not reformat the card!\n" + "Is the card correctly inserted?\n" + "Is there a wiring/soldering problem?\n"); if (isSpi(SD_CONFIG)) { cout << F( - "Is SD_CS_PIN set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - ); + "Is SD_CS_PIN set to the correct value?\n" + "Does another SPI device need to be disabled?\n"); } errorPrint(); return; } t = millis() - t; - cout << F("init time: ") << t << " ms" << endl; + cout << F("init time: ") << dec << t << " ms" << endl; - if (!sd.card()->readCID(&m_cid) || - !sd.card()->readCSD(&m_csd) || - !sd.card()->readOCR(&m_ocr)) { + if (!sd.card()->readCID(&cid) || !sd.card()->readCSD(&csd) || + !sd.card()->readOCR(&ocr) || !sd.card()->readSCR(&scr)) { cout << F("readInfo failed\n"); errorPrint(); return; } printCardType(); + cout << F("sdSpecVer: ") << 0.01 * scr.sdSpecVer() << endl; + cout << F("HighSpeedMode: "); + if (scr.sdSpecVer() > 101 && sd.card()->cardCMD6(0X00FFFFFF, cmd6Data) && + (2 & cmd6Data[13])) { + cout << F("true\n"); + } else { + cout << F("false\n"); + } cidDmp(); csdDmp(); cout << F("\nOCR: ") << uppercase << showbase; - cout << hex << m_ocr << dec << endl; + cout << hex << ocr << dec << endl; if (!mbrDmp()) { return; } @@ -262,4 +278,4 @@ void loop() { return; } dmpVol(); -} \ No newline at end of file +} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/SoftwareSpi/SoftwareSpi.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/SoftwareSpi/SoftwareSpi.ino similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/SoftwareSpi/SoftwareSpi.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/SoftwareSpi/SoftwareSpi.ino index b9559658..1300cfa0 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/SoftwareSpi/SoftwareSpi.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/SoftwareSpi/SoftwareSpi.ino @@ -8,7 +8,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 // // Chip select may be constant or RAM variable. const uint8_t SD_CS_PIN = 10; @@ -16,7 +16,7 @@ const uint8_t SD_CS_PIN = 10; // Pin numbers in templates must be constants. const uint8_t SOFT_MISO_PIN = 12; const uint8_t SOFT_MOSI_PIN = 11; -const uint8_t SOFT_SCK_PIN = 13; +const uint8_t SOFT_SCK_PIN = 13; // SdFat software SPI template SoftSpiDriver softSpi; @@ -77,4 +77,4 @@ void setup() { void loop() {} #else // SPI_DRIVER_SELECT #error SPI_DRIVER_SELECT must be two in SdFat/SdFatConfig.h -#endif //SPI_DRIVER_SELECT \ No newline at end of file +#endif // SPI_DRIVER_SELECT \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/SpiLoopBackTest/SpiLoopBackTest.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/SpiLoopBackTest/SpiLoopBackTest.ino new file mode 100644 index 00000000..88101a08 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/SpiLoopBackTest/SpiLoopBackTest.ino @@ -0,0 +1,66 @@ +// This is a simple SPI loop-back test. +// +// Connect SD_MISO to SD_MOSI +// +// Modify these defines for your configuration. +#define SD_SPI SPI +#define SD_MISO MISO +#define SD_MOSI MOSI + +#include "SPI.h" +void setup() { + uint8_t rx, tx; + Serial.begin(9600); + while (!Serial) { + yield(); + } + Serial.println(F("\nType any character to start")); + while (!Serial.available()) { + yield(); + } + Serial.print("Begin, SD_MISO: "); + Serial.print(SD_MISO), Serial.print(", SD_MOSI: "); + Serial.println(SD_MOSI); + pinMode(SD_MISO, INPUT_PULLUP); + pinMode(SD_MOSI, OUTPUT); + digitalWrite(SD_MOSI, HIGH); + if (!digitalRead(SD_MISO)) { + Serial.println("Error: SD_MISO not HIGH"); + goto fail; + } + digitalWrite(SD_MOSI, LOW); + if (digitalRead(SD_MISO)) { + Serial.println("Error: SD_MISO not LOW"); + goto fail; + } + pinMode(SD_MISO, INPUT); + pinMode(SD_MOSI, INPUT); + + // Modify if SD_SPI.begin has arguments and use this style SdFat begin call: + // sd.begin(SdSpiConfig(CS_PIN, USER_SPI_BEGIN | , &SD_SPI)); + SD_SPI.begin(); + + // Start with a 400 kHz clock. Try full speed if success for 400 kHz. + SD_SPI.beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0)); + tx = 0; + do { + rx = SD_SPI.transfer(tx); + if (tx != rx) { + Serial.print("Error rx: 0x"); + Serial.print(rx, HEX); + Serial.print(" != tx: 0x"); + Serial.println(tx, HEX); + SD_SPI.endTransaction(); + goto fail; + } + } while (tx++ < 255); + SD_SPI.endTransaction(); + Serial.println("Success!"); + return; + +fail: + SD_SPI.endTransaction(); + Serial.println("Is SD_MISO connected to SD_MOSI?"); + Serial.println("Are SD_MISO and SD_MOSI correct?"); +} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino similarity index 56% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino index f017a19e..ad491f4a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino @@ -1,14 +1,20 @@ // Test of Teensy exFAT DMA ADC logger. // This is mainly to test use of RingBuf in an ISR. +// This example only supports pins on the first ADC. +// it has only been tested on Teensy 3.6 and 4.1. // You should modify it for serious use as a data logger. // +#include "ADC.h" #include "DMAChannel.h" -#include "SdFat.h" #include "FreeStack.h" #include "RingBuf.h" +#include "SdFat.h" + +// Pin must be on first ADC. +#define ADC_PIN A0 // 400 sector RingBuf - could be larger on Teensy 4.1. -const size_t RING_BUF_SIZE = 400*512; +const size_t RING_BUF_SIZE = 400 * 512; // Preallocate 8GiB file. const uint64_t PRE_ALLOCATE_SIZE = 8ULL << 30; @@ -16,15 +22,19 @@ const uint64_t PRE_ALLOCATE_SIZE = 8ULL << 30; // Use FIFO SDIO. #define SD_CONFIG SdioConfig(FIFO_SDIO) +ADC adc; + DMAChannel dma(true); SdFs sd; FsFile file; -//------------------------------------------------------------------------------ + // Ping-pong DMA buffer. DMAMEM static uint16_t __attribute__((aligned(32))) dmaBuf[2][256]; -size_t dmaCount; + +// Count of DMA interrupts. +volatile size_t dmaCount; // RingBuf for 512 byte sectors. RingBuf rb; @@ -32,18 +42,26 @@ RingBuf rb; // Shared between ISR and background. volatile size_t maxBytesUsed; +// Overrun error for write to RingBuf. volatile bool overrun; //------------------------------------------------------------------------------ -//ISR. +// ISR for DMA. static void isr() { - if (rb.bytesFreeIsr() >= 512 && !overrun) { - rb.memcpyIn(dmaBuf[dmaCount & 1], 512); - dmaCount++; - if (rb.bytesUsed() > maxBytesUsed) { - maxBytesUsed = rb.bytesUsed(); + if (!overrun) { + // Clear cache for buffer filled by DMA to insure read from DMA memory. + arm_dcache_delete((void*)dmaBuf[dmaCount & 1], 512); + // Enable RingBuf functions to be called in ISR. + rb.beginISR(); + if (rb.write(dmaBuf[dmaCount & 1], 512) == 512) { + dmaCount++; + if (rb.bytesUsed() > maxBytesUsed) { + maxBytesUsed = rb.bytesUsed(); + } + } else { + overrun = true; } - } else { - overrun = true; + // End use of RingBuf functions in ISR. + rb.endISR(); } dma.clearComplete(); dma.clearInterrupt(); @@ -53,39 +71,7 @@ static void isr() { #endif // defined(__IMXRT1062__) } //------------------------------------------------------------------------------ -// Over-clocking will degrade quality - use only for stress testing. -void overclock() { -#if defined(__IMXRT1062__) // Teensy 4.0 - ADC1_CFG = - // High Speed Configuration - ADC_CFG_ADHSC | - // Sample period 3 clocks - ADC_CFG_ADSTS(0) | - // Input clock - ADC_CFG_ADIV(0) | - // Not selected - Long Sample Time Configuration - // ADC_CFG_ADLSMP | - // 12-bit - ADC_CFG_MODE(2) | - // Asynchronous clock - ADC_CFG_ADICLK(3); -#else // defined(__IMXRT1062__) - // Set 12 bit mode and max over-clock - ADC0_CFG1 = - // Clock divide select, 0=direct, 1=div2, 2=div4, 3=div8 - ADC_CFG1_ADIV(0) | - // Sample time configuration, 0=Short, 1=Long - // ADC_CFG1_ADLSMP | - // Conversion mode, 0=8 bit, 1=12 bit, 2=10 bit, 3=16 bit - ADC_CFG1_MODE(1) | - // Input clock, 0=bus, 1=bus/2, 2=OSCERCLK, 3=async - ADC_CFG1_ADICLK(0); - - ADC0_CFG2 = ADC_CFG2_MUXSEL | ADC_CFG2_ADLSTS(3); -#endif // defined(__IMXRT1062__) -} -//------------------------------------------------------------------------------ -#if defined(__IMXRT1062__) // Teensy 4.0 +#if defined(__IMXRT1062__) // Teensy 4.x #define SOURCE_SADDR ADC1_R0 #define SOURCE_EVENT DMAMUX_SOURCE_ADC1 #else @@ -93,54 +79,26 @@ void overclock() { #define SOURCE_EVENT DMAMUX_SOURCE_ADC0 #endif //------------------------------------------------------------------------------ -// Should replace ADC stuff with calls to Teensy ADC library. -// https://github.com/pedvide/ADC static void init(uint8_t pin) { - uint32_t adch; - uint32_t i, sum = 0; - // Actually, do many normal reads, to start with a nice DC level - for (i=0; i < 1024; i++) { - sum += analogRead(pin); - } -#if defined(__IMXRT1062__) // Teensy 4.0 - // save channel - adch = ADC1_HC0 & 0x1F; - // Continuous conversion , DMA enable - ADC1_GC = ADC_GC_ADCO | ADC_GC_DMAEN; - // start conversion - ADC1_HC0 = adch; -#else // defined(__IMXRT1062__) // Teensy 4.0 - // save channel - adch = ADC0_SC1A & 0x1F; - // DMA enable - ADC0_SC2 |= ADC_SC2_DMAEN; - // Continuous conversion enable - ADC0_SC3 = ADC_SC3_ADCO; - // Start ADC - ADC0_SC1A = adch; - #endif // defined(__IMXRT1062__) // Teensy 4.0 - // set up a DMA channel to store the ADC data - dma.attachInterrupt(isr); - dma.begin(); - dma.source((volatile const signed short &)SOURCE_SADDR); + dma.begin(); + dma.attachInterrupt(isr); + dma.source((volatile const signed short&)SOURCE_SADDR); dma.destinationBuffer((volatile uint16_t*)dmaBuf, sizeof(dmaBuf)); dma.interruptAtHalf(); dma.interruptAtCompletion(); - dma.triggerAtHardwareEvent(SOURCE_EVENT); - dma.enable(); + dma.triggerAtHardwareEvent(SOURCE_EVENT); + dma.enable(); + adc.adc0->enableDMA(); + adc.adc0->startContinuous(pin); } //------------------------------------------------------------------------------ void stopDma() { -#if defined(__IMXRT1062__) // Teensy 4.0 - ADC1_GC = 0; -#else // defined(__IMXRT1062__) - ADC0_SC3 = 0; -#endif // defined(__IMXRT1062__) + adc.adc0->disableDMA(); dma.disable(); } //------------------------------------------------------------------------------ void printTest(Print* pr) { - if (file.fileSize() < 1024*2) { + if (file.fileSize() < 1024 * 2) { return; } file.rewind(); @@ -153,7 +111,8 @@ void printTest(Print* pr) { for (size_t i = 0; i < 1024; i++) { pr->print(i); pr->print(','); - rb.memcpyOut(&data, 2); + // Test read with: template bool read(Type* data). + rb.read(&data); pr->println(data); } } @@ -192,36 +151,42 @@ void runTest(uint8_t pin) { } } stopDma(); - samplingTime = (micros() - samplingTime); + samplingTime = micros() - samplingTime; + if (!rb.sync()) { + Serial.println("sync() failed"); + file.close(); + return; + } if (!file.truncate()) { sd.errorHalt("truncate failed"); } if (overrun) { Serial.println("Overrun ERROR!!"); } + Serial.print("dmsCount "); + Serial.println(dmaCount); Serial.print("RingBufSize "); Serial.println(RING_BUF_SIZE); Serial.print("maxBytesUsed "); Serial.println(maxBytesUsed); Serial.print("fileSize "); - Serial.println((uint32_t)file.fileSize()); - Serial.print(0.000001*samplingTime); + file.printFileSize(&Serial); + Serial.println(); + Serial.print(0.000001 * samplingTime); Serial.println(" seconds"); - Serial.print(1.0*file.fileSize()/samplingTime, 3); + Serial.print(1.0 * file.fileSize() / samplingTime, 3); Serial.println(" MB/sec\n"); printTest(&Serial); file.close(); } //------------------------------------------------------------------------------ void waitSerial(const char* msg) { - uint32_t m = micros(); do { - if (Serial.read() >= 0) { - m = micros(); - } - } while (micros() - m < 10000); + delay(10); + } while (Serial.read() >= 0); Serial.println(msg); - while (!Serial.available()) {} + while (!Serial.available()) { + } Serial.println(); } //------------------------------------------------------------------------------ @@ -239,9 +204,11 @@ void loop() { if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } -//analogReadAveraging(1); -//analogReadResolution(12); -//overclock(); // 3 Msps on Teensy 3.6 - requires high quality card. - runTest(A0); + // Try for max speed. + adc.adc0->setAveraging(1); + adc.adc0->setResolution(10); + adc.adc0->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_HIGH_SPEED); + adc.adc0->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED); + runTest(ADC_PIN); waitSerial("Type any character to run test again"); } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino index 9358644c..496c1d02 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino @@ -1,9 +1,10 @@ // Test of time-stamp callback with Teensy 3/4. // The upload time will be used to set the RTC. // You must arrange for syncing the RTC. -#include "SdFat.h" #include +#include "SdFat.h" + // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. #define SD_FAT_TYPE 3 @@ -19,7 +20,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -30,7 +31,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -55,7 +56,6 @@ FsFile file; //------------------------------------------------------------------------------ // Call back for file timestamps. Only called for file create and sync(). void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { - // Return date using FS_DATE macro to format fields. *date = FS_DATE(year(), month(), day()); @@ -66,10 +66,7 @@ void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { *ms10 = second() & 1 ? 100 : 0; } //------------------------------------------------------------------------------ -time_t getTeensy3Time() -{ - return Teensy3Clock.get(); -} +time_t getTeensy3Time() { return Teensy3Clock.get(); } //------------------------------------------------------------------------------ void printField(Print* pr, char sep, uint8_t v) { if (sep) { @@ -102,7 +99,7 @@ void setup() { while (!Serial.available()) { yield(); } - if (timeStatus()!= timeSet) { + if (timeStatus() != timeSet) { Serial.println("Unable to sync with the RTC"); return; } @@ -135,5 +132,4 @@ void setup() { Serial.println(F("Done")); } //------------------------------------------------------------------------------ -void loop() { -} \ No newline at end of file +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioDemo/TeensySdioDemo.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioDemo/TeensySdioDemo.ino similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioDemo/TeensySdioDemo.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioDemo/TeensySdioDemo.ino index cf79f7e2..6dfbd9d8 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioDemo/TeensySdioDemo.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioDemo/TeensySdioDemo.ino @@ -7,7 +7,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -20,7 +20,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; const size_t BUF_DIM = 32768; // 8 MiB file. -const uint32_t FILE_SIZE = 256UL*BUF_DIM; +const uint32_t FILE_SIZE = 256UL * BUF_DIM; #if SD_FAT_TYPE == 0 SdFat sd; @@ -72,13 +72,12 @@ void errorHalt(const char* msg) { Serial.print(", ErrorData: 0X"); Serial.println(sd.sdErrorData(), HEX); } - while (true) {} + while (true) { + } } bool ready = false; //------------------------------------------------------------------------------ -bool sdBusy() { - return ready ? sd.card()->isBusy() : false; -} +bool sdBusy() { return ready ? sd.card()->isBusy() : false; } //------------------------------------------------------------------------------ // Replace "weak" system yield() function. void yield() { @@ -110,7 +109,7 @@ void runTest() { Serial.println("\nsize,write,read"); Serial.println("bytes,KB/sec,KB/sec"); for (size_t nb = 512; nb <= BUF_DIM; nb *= 2) { - uint32_t nRdWr = FILE_SIZE/nb; + uint32_t nRdWr = FILE_SIZE / nb; if (!file.truncate(0)) { errorHalt("truncate failed"); } @@ -121,14 +120,14 @@ void runTest() { for (uint32_t n = 0; n < nRdWr; n++) { // Set start and end of buffer. buf32[0] = n; - buf32[nb/4 - 1] = n; + buf32[nb / 4 - 1] = n; if (nb != file.write(buf, nb)) { errorHalt("write failed"); } } t = micros() - t; totalMicros += t; - Serial.print(1000.0*FILE_SIZE/t); + Serial.print(1000.0 * FILE_SIZE / t); Serial.print(','); file.rewind(); t = micros(); @@ -138,13 +137,13 @@ void runTest() { errorHalt("read failed"); } // crude check of data. - if (buf32[0] != n || buf32[nb/4 - 1] != n) { + if (buf32[0] != n || buf32[nb / 4 - 1] != n) { errorHalt("data check"); } } t = micros() - t; totalMicros += t; - Serial.println(1000.0*FILE_SIZE/t); + Serial.println(1000.0 * FILE_SIZE / t); } file.close(); Serial.print("\ntotalMicros "); @@ -155,8 +154,8 @@ void runTest() { Serial.println(yieldCalls); Serial.print("yieldMaxUsec "); Serial.println(yieldMaxUsec); -// Serial.print("kHzSdClk "); -// Serial.println(kHzSdClk()); + // Serial.print("kHzSdClk "); + // Serial.println(kHzSdClk()); Serial.println("Done"); } //------------------------------------------------------------------------------ @@ -171,22 +170,22 @@ void loop() { if (warn) { warn = false; Serial.println( - "SD cards must be power cycled to leave\n" - "SPI mode so do SDIO tests first.\n" - "\nCycle power on the card if an error occurs."); + "SD cards must be power cycled to leave\n" + "SPI mode so do SDIO tests first.\n" + "\nCycle power on the card if an error occurs."); } clearSerialInput(); Serial.println( - "\nType '1' for FIFO SDIO" - "\n '2' for DMA SDIO" - "\n '3' for Dedicated SPI" - "\n '4' for Shared SPI"); + "\nType '1' for FIFO SDIO" + "\n '2' for DMA SDIO" + "\n '3' for Dedicated SPI" + "\n '4' for Shared SPI"); while (!Serial.available()) { } char c = Serial.read(); - if (c =='1') { + if (c == '1') { if (!sd.begin(SdioConfig(FIFO_SDIO))) { errorHalt("begin failed"); } @@ -202,7 +201,7 @@ void loop() { errorHalt("begin failed"); } Serial.println("\nDedicated SPI mode."); -#else // ENABLE_DEDICATED_SPI +#else // ENABLE_DEDICATED_SPI Serial.println("ENABLE_DEDICATED_SPI must be non-zero."); return; #endif // ENABLE_DEDICATED_SPI diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioLogger/TeensySdioLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioLogger/TeensySdioLogger.ino similarity index 92% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioLogger/TeensySdioLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioLogger/TeensySdioLogger.ino index 8638f5d1..36a51b93 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/TeensySdioLogger/TeensySdioLogger.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/TeensySdioLogger/TeensySdioLogger.ino @@ -6,20 +6,20 @@ // Teensy 4.1. About 5 usec is required to write a sector when the // controller is in write mode. -#include "SdFat.h" #include "RingBuf.h" +#include "SdFat.h" // Use Teensy SDIO -#define SD_CONFIG SdioConfig(FIFO_SDIO) +#define SD_CONFIG SdioConfig(FIFO_SDIO) // Interval between points for 25 ksps. #define LOG_INTERVAL_USEC 40 // Size to log 10 byte lines at 25 kHz for more than ten minutes. -#define LOG_FILE_SIZE 10*25000*600 // 150,000,000 bytes. +#define LOG_FILE_SIZE 10 * 25000 * 600 // 150,000,000 bytes. // Space to hold more than 800 ms of data for 10 byte lines at 25 ksps. -#define RING_BUF_CAPACITY 400*512 +#define RING_BUF_CAPACITY 400 * 512 #define LOG_FILENAME "SdioLogger.csv" SdFs sd; @@ -41,9 +41,9 @@ void logData() { // File must be pre-allocated to avoid huge // delays searching for free clusters. if (!file.preAllocate(LOG_FILE_SIZE)) { - Serial.println("preAllocate failed\n"); - file.close(); - return; + Serial.println("preAllocate failed\n"); + file.close(); + return; } // initialize the RingBuf. rb.begin(&file); @@ -88,7 +88,8 @@ void logData() { break; } // Wait until time to log data. - while (micros() < logTime) {} + while (micros() < logTime) { + } // Read ADC0 - about 17 usec on Teensy 4, Teensy 3.6 is faster. uint16_t adc = analogRead(0); @@ -134,7 +135,8 @@ void clearSerialInput() { } void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } // Go faster or log more channels. ADC quality will suffer. // analogReadAveraging(1); } @@ -142,7 +144,8 @@ void setup() { void loop() { clearSerialInput(); Serial.println("Type any character to start"); - while (!Serial.available()) {}; + while (!Serial.available()) { + } clearSerialInput(); logData(); } \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/UnicodeFilenames/UnicodeFilenames.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/UnicodeFilenames/UnicodeFilenames.ino similarity index 98% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/UnicodeFilenames/UnicodeFilenames.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/UnicodeFilenames/UnicodeFilenames.ino index 94d2fe7f..a1524070 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/UnicodeFilenames/UnicodeFilenames.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/UnicodeFilenames/UnicodeFilenames.ino @@ -18,7 +18,7 @@ const char* names[] = {u8"россиянин", u8"très élégant", u8"狗.txt", // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -91,8 +91,7 @@ void setup() { #endif // REMOVE_UTF8_FILES Serial.println("Done!"); } -void loop() { -} +void loop() {} #else // USE_UTF8_LONG_NAMES #error USE_UTF8_LONG_NAMES must be non-zero in SdFat/src/SdFatCongfig.h #endif // USE_UTF8_LONG_NAMES \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/UserChipSelectFunction/UserChipSelectFunction.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/UserChipSelectFunction/UserChipSelectFunction.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/UserChipSelectFunction/UserChipSelectFunction.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/UserChipSelectFunction/UserChipSelectFunction.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/UserSPIDriver/UserSPIDriver.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/UserSPIDriver/UserSPIDriver.ino similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/UserSPIDriver/UserSPIDriver.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/UserSPIDriver/UserSPIDriver.ino index c86e32ec..568db423 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/UserSPIDriver/UserSPIDriver.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/UserSPIDriver/UserSPIDriver.ino @@ -1,7 +1,7 @@ // An example of an external SPI driver. // -#include "SdFat.h" #include "SPI.h" // Only required if you use features in the SPI library. +#include "SdFat.h" #if SPI_DRIVER_SELECT == 3 // Must be set in SdFat/SdFatConfig.h @@ -16,22 +16,16 @@ class MySpiClass : public SdSpiBaseClass { public: // Activate SPI hardware with correct speed and mode. - void activate() { - SPI.beginTransaction(m_spiSettings); - } + void activate() { SPI.beginTransaction(m_spiSettings); } // Initialize the SPI bus. void begin(SdSpiConfig config) { (void)config; SPI.begin(); } // Deactivate SPI hardware. - void deactivate() { - SPI.endTransaction(); - } + void deactivate() { SPI.endTransaction(); } // Receive a byte. - uint8_t receive() { - return SPI.transfer(0XFF); - } + uint8_t receive() { return SPI.transfer(0XFF); } // Receive multiple bytes. // Replace this function if your board has multiple byte receive. uint8_t receive(uint8_t* buf, size_t count) { @@ -41,9 +35,7 @@ class MySpiClass : public SdSpiBaseClass { return 0; } // Send a byte. - void send(uint8_t data) { - SPI.transfer(data); - } + void send(uint8_t data) { SPI.transfer(data); } // Send multiple bytes. // Replace this function if your board has multiple byte send. void send(const uint8_t* buf, size_t count) { @@ -73,9 +65,11 @@ void setup() { sd.initErrorHalt(&Serial); } sd.ls(&Serial, LS_SIZE); + Serial.println("Done"); } //------------------------------------------------------------------------------ void loop() {} #else // SPI_DRIVER_SELECT #error SPI_DRIVER_SELECT must be three in SdFat/SdFatConfig.h #endif // SPI_DRIVER_SELECT + diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/bench/bench.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/bench/bench.ino similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/bench/bench.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/bench/bench.ino index 53b3d6d9..36a577c5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/bench/bench.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/bench/bench.ino @@ -2,12 +2,12 @@ * This program is a simple binary write/read benchmark. */ #include "SdFat.h" -#include "sdios.h" #include "FreeStack.h" +#include "sdios.h" // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -19,7 +19,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -58,10 +58,10 @@ const uint8_t READ_COUNT = 2; // End of configuration constants. //------------------------------------------------------------------------------ // File size in bytes. -const uint32_t FILE_SIZE = 1000000UL*FILE_SIZE_MB; +const uint32_t FILE_SIZE = 1000000UL * FILE_SIZE_MB; // Insure 4-byte alignment. -uint32_t buf32[(BUF_SIZE + 3)/4]; +uint32_t buf32[(BUF_SIZE + 3) / 4]; uint8_t* buf = (uint8_t*)buf32; #if SD_FAT_TYPE == 0 @@ -89,22 +89,19 @@ ArduinoOutStream cout(Serial); void cidDmp() { cid_t cid; if (!sd.card()->readCID(&cid)) { - error("readCID failed"); } cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; + cout << uppercase << showbase << hex << int(cid.mid) << dec << endl; cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { cout << cid.pnm[i]; } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; + cout << F("\nRevision: ") << cid.prvN() << '.' << cid.prvM() << endl; + cout << F("Serial number: ") << hex << cid.psn() << dec << endl; cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; + cout << cid.mdtMonth() << '/' << cid.mdtYear() << endl; cout << endl; } //------------------------------------------------------------------------------ @@ -128,8 +125,8 @@ void setup() { cout << F("\nUse a freshly formatted SD for best performance.\n"); if (!ENABLE_DEDICATED_SPI) { cout << F( - "\nSet ENABLE_DEDICATED_SPI nonzero in\n" - "SdFatConfig.h for best SPI performance.\n"); + "\nSet ENABLE_DEDICATED_SPI nonzero in\n" + "SdFatConfig.h for best SPI performance.\n"); } // use uppercase in hex and use 0X base prefix cout << uppercase << showbase << endl; @@ -164,7 +161,7 @@ void loop() { cout << F("Type is FAT") << int(sd.fatType()) << endl; } - cout << F("Card size: ") << sd.card()->sectorCount()*512E-9; + cout << F("Card size: ") << sd.card()->sectorCount() * 512E-9; cout << F(" GB (GB = 1E9 bytes)") << endl; cidDmp(); @@ -179,17 +176,17 @@ void loop() { for (size_t i = 0; i < (BUF_SIZE - 2); i++) { buf[i] = 'A' + (i % 26); } - buf[BUF_SIZE-2] = '\r'; + buf[BUF_SIZE - 2] = '\r'; } - buf[BUF_SIZE-1] = '\n'; + buf[BUF_SIZE - 1] = '\n'; cout << F("FILE_SIZE_MB = ") << FILE_SIZE_MB << endl; cout << F("BUF_SIZE = ") << BUF_SIZE << F(" bytes\n"); cout << F("Starting write test, please wait.") << endl << endl; // do write test - uint32_t n = FILE_SIZE/BUF_SIZE; - cout <= 0) { + m = micros(); + } + } while (micros() - m < 10000); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + + // Wait for USB Serial + while (!Serial) { + yield(); + } + delay(1000); +//------------------------------------------------------------------------------ +} +void loop() { + clearSerialInput(); + Serial.println(F("\nType any character to start\n")); + while (!Serial.available()) { + yield(); + } + // Initialize the SD card. + if (!sd.begin(SD_CONFIG)) { + sd.initErrorHalt(); + } + if (!file.open("SdBusyTest.bin", O_RDWR | O_CREAT |O_TRUNC)) { + error("file open failed"); + } + if (!file.preAllocate(FILE_SIZE)) { + error("preallocate failed"); + } + Serial.print(F("Starting write of ")); + Serial.print(FILE_SIZE_MiB); + Serial.println(F(" MiB.")); + uint32_t maxWrite = 0; + uint32_t minWrite = 99999999; + uint32_t ms = millis(); + uint32_t maxBusy = 0; + uint32_t minBusy = UINT32_MAX; + + // Write a dummy sector to start a multi-sector write. + if(file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed for first sector"); + } + + while (file.position() < FILE_SIZE) { + uint32_t m = micros(); + if (waitBusy) { + m = micros(); + while (sd.card()->isBusy()) {} + m = micros() - m; + if (m < minBusy) { + minBusy = m; + } + if (m > maxBusy) { + maxBusy = m; + } + } + m = micros(); + if (file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed"); + } + m = micros() - m; + if (m < minWrite) { + minWrite = m; + } + if (m > maxWrite) { + maxWrite = m; + } + } + file.close(); + ms = millis() - ms; + Serial.println(F("\nTimes in micros")); + if (waitBusy) { + Serial.print(F("minBusy: ")); + Serial.println(minBusy); + Serial.print(F("maxBusy: ")); + Serial.println(maxBusy); + } + Serial.print(F("minWrite: ")); + Serial.println(minWrite); + Serial.print(F("maxWrite: ")); + Serial.println(maxWrite); + Serial.print(1e-3*ms); + Serial.println(F(" Seconds")); + Serial.print(1.0*FILE_SIZE/ms); + Serial.println(F(" KB/sec")); + +} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino new file mode 100644 index 00000000..165bf604 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino @@ -0,0 +1,51 @@ +#include "SdFat.h" +#define DUMP_RAW 0 +#define DUMP_UPCASE 0 +const uint8_t CS_PIN = SS; +//#define SD_CONFIG SdioConfig(FIFO_SDIO) +#define SD_CONFIG SdSpiConfig(CS_PIN) + +SdExFat sd; +#define error(s) sd.errorHalt(&Serial, F(s)) +void setup() { + Serial.begin(9600); + while (!Serial) { + yield(); + } + Serial.println(F("Type any character to begin")); + while (!Serial.available()) { + yield(); + } + if (!sd.begin(SD_CONFIG)){ + error("begin failed"); + } +#if DUMP_RAW + sd.dmpSector(&Serial, 0); + for (uint8_t i = 0; i < 24; i++) { + sd.dmpSector(&Serial, 0X8000 + i); + Serial.println(); + } + return; + #endif // DUMP_RAW + ExFatFile root; + if (!root.openRoot(&sd)) { + error("openRoot failed"); + } + sd.printDir(&Serial, &root); + // startSector = 0, sectorCount = 1. + sd.dmpFat(&Serial, 0, 1); + sd.dmpBitmap(&Serial); + sd.printVolInfo(&Serial); + + sd.checkUpcase(&Serial); +#if DUMP_UPCASE + sd.printUpcase(&Serial); +#endif // DUMP_UPCASE + // sd.dmpCluster(&Serial, 8, 0, 4); + Serial.println("Done"); +} + +void loop() { + // put your main code here, to run repeatedly: + +} \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestGetName/TestGetName.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestGetName/TestGetName.ino new file mode 100644 index 00000000..48cfb533 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestGetName/TestGetName.ino @@ -0,0 +1,43 @@ +#include "SdFat.h" +SdFs sd; +FsFile file; +const char* name[] = { + "SFN.TXT", + "LongFilename.txt", +#if USE_UTF8_LONG_NAMES + u8"très élégant.txt", +#endif // USE_UTF8_LONG_NAMES + nullptr}; +char buf[32]; +void setup() { + Serial.begin(9600); + while (!Serial) {} + Serial.println("Type any character to begin"); + while (!Serial.available()) {} + if (!sd.begin(SS)) { + sd.initErrorHalt(); + } + for (uint8_t i = 0; name[i]; i++) { + if (!file.open(name[i], O_CREAT |O_RDWR)) { + sd.errorHalt("open"); + } + size_t len = strlen(name[i]); + size_t rtn = file.getName(buf, len); + if (rtn != 0) { + Serial.println("fail len"); + } + rtn = file.getName(buf, len + 1); + if (rtn != len) { + Serial.println("fail len + 1"); + } + Serial.print(rtn); + Serial.print(' '); + Serial.println(buf); + if (!file.remove()) { + sd.errorHalt("remove"); + } + } + Serial.println("Done"); +} + +void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestMkdir/TestMkdir.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestMkdir/TestMkdir.ino new file mode 100644 index 00000000..3101d7a4 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestMkdir/TestMkdir.ino @@ -0,0 +1,140 @@ +/* + * This sketch is a test of subdirectory and file creation. + * It also tests allocation of clusters to directories. + * + * It will create two subdirectories and create enough files + * to force the allocation of a cluster to each directory. + * + * More than 3000 files may be created on a FAT32 volume. + * + * Note: Some cards may 'stutter' others just get slow due + * to the number of flash erases this program causes. + */ +#include + +const uint8_t SD_CHIP_SELECT = SS; + +SdFat sd; +typedef File file_t; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(&Serial, F(s)) + +/* + * create enough files to force a cluster to be allocated to dir. + */ +void dirAllocTest(file_t* dir) { + char buf[32], name[32]; + file_t file; + uint16_t n; + uint32_t size = dir->dirSize(); + + // create files and write name to file + for (n = 0; ; n++){ + // make file name + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_WRONLY | O_CREAT | O_EXCL)) { + error("open for write failed"); + } + + // open end time and write start time + uint32_t t1 = millis(); + // write file name to file + file.print(name); + if (!file.close()) error("close write"); + + // write end time + uint32_t t2 = millis(); + Serial.print(F("WR ")); + Serial.print(n); + Serial.write(' '); + + // print time to create file + Serial.print(t1 - t0); + Serial.write(' '); + + // print time to write file + Serial.println(t2 - t1); + + // directory size will change when a cluster is added + if (dir->curPosition() > size) break; + } + + // read files and check content + for (uint16_t i = 0; i <= n; i++) { + sprintf(name, "%u.TXT", i); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_RDONLY)) { + error("open for read failed"); + } + + // open end time and read start time + uint32_t t1 = millis(); + int16_t nr = file.read(buf, sizeof(buf)); + if (nr < 5) error("file.read failed"); + + // read end time + uint32_t t2 = millis(); + + // check file content + if (strlen(name) != (size_t)nr || strncmp(name, buf, nr)) { + error("content compare failed"); + } + if (!file.close()) error("close read failed"); + + Serial.print(F("RD ")); + Serial.print(i); + Serial.write(' '); + + // print open time + Serial.print(t1 - t0); + Serial.write(' '); + + // print read time + Serial.println(t2 - t1); + } +} + +void setup() { + file_t root; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try lower speed if bus errors occur. + if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) { + sd.initErrorHalt(&Serial); + } + root.openRoot(&sd); + uint32_t m = millis(); + // write files to root if not FAT16 + if (sd.fatType() != 16) { + Serial.println(F("Writing files to root")); + dirAllocTest(&root); + } + + // create sub1 and write files + file_t sub1; + if (!sub1.mkdir(&root, "SUB1")) error("makdeDir SUB1 failed"); + Serial.println(F("Writing files to SUB1")); + dirAllocTest(&sub1); + + // create sub2 and write files + file_t sub2; + if (!sub2.mkdir(&sub1, "SUB2")) error("mkdir SUB2 failed"); + Serial.println(F("Writing files to SUB2")); + dirAllocTest(&sub2); + m = millis() - m; + Serial.print(F("Done millis: ")); + Serial.println(m); +} + +void loop() { } \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestRmdir/TestRmdir.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestRmdir/TestRmdir.ino new file mode 100644 index 00000000..90e29875 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TestRmdir/TestRmdir.ino @@ -0,0 +1,99 @@ +/* + * This sketch will remove the files and directories + * created by the SdFatMakeDir.pde sketch. + * + * Performance is erratic due to the large number + * of flash erase operations caused by many random + * writes to file structures. + */ +#include + +const uint8_t SD_CHIP_SELECT = SS; + +SdFat sd; +typedef File file_t; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(&Serial, F(s)) + +/* + * remove all files in dir. + */ +void deleteFiles(FatFile* dir) { + char name[32]; + file_t file; + + // open and delete files + for (uint16_t n = 0; ; n++){ + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + + // assume done if open fails + if (!file.open(dir, name, O_WRONLY)) return; + + // open end time and remove start time + uint32_t t1 = millis(); + if (!file.remove()) error("file.remove failed"); + + // remove end time + uint32_t t2 = millis(); + + Serial.print(F("RM ")); + Serial.print(n); + Serial.write(' '); + + // open time + Serial.print(t1 - t0); + Serial.write(' '); + + // remove time + Serial.println(t2 - t1); + } +} + +void setup() { + file_t root; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try lower speed if bus errors occur. + if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) { + sd.initErrorHalt(&Serial); + } + root.openRoot(&sd); + // delete files in root if not FAT16. + if (sd.fatType() != 16) { + Serial.println(F("Remove files in root")); + deleteFiles(&root); + } + + // open SUB1 and delete files + file_t sub1; + if (!sub1.open("SUB1", O_RDONLY)) error("open SUB1 failed"); + Serial.println(F("Remove files in SUB1")); + deleteFiles(&sub1); + + // open SUB2 and delete files + file_t sub2; + if (!sub2.open(&sub1, "SUB2", O_RDONLY)) error("open SUB2 failed"); + Serial.println(F("Remove files in SUB2")); + deleteFiles(&sub2); + + // remove SUB2 + if (!sub2.rmdir()) error("sub2.rmdir failed"); + Serial.println(F("SUB2 removed")); + + // remove SUB1 + if (!sub1.rmdir()) error("sub1.rmdir failed"); + Serial.println(F("SUB1 removed")); + + Serial.println(F("Done")); +} + +void loop() { } \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TimestampTest/TimestampTest.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TimestampTest/TimestampTest.ino new file mode 100644 index 00000000..520084af --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/debug/TimestampTest/TimestampTest.ino @@ -0,0 +1,162 @@ +/* + * This program tests the dateTimeCallback() function + * and the timestamp() function. + */ +#include +#include "SdFat.h" +#include "sdios.h" +SdFs sd; + +FsFile file; + +// Default SD chip select is SS pin +const uint8_t chipSelect = SS; + +// create Serial stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(F(s)) +//------------------------------------------------------------------------------ +/* + * date/time values for debug + * normally supplied by a real-time clock or GPS + */ +// date 1-Oct-21 +uint16_t year = 2021; +uint8_t month = 10; +uint8_t day = 1; + +// time 20:30:40 +uint8_t hour = 20; +uint8_t minute = 30; +uint8_t second = 40; +//------------------------------------------------------------------------------ +/* + * User provided date time callback function. + * See SdFile::dateTimeCallback() for usage. + */ +void dateTime(uint16_t* date, uint16_t* time) { + // User gets date and time from GPS or real-time + // clock in real callback function + + // return date using FAT_DATE macro to format fields + *date = FAT_DATE(year, month, day); + + // return time using FAT_TIME macro to format fields + *time = FAT_TIME(hour, minute, second); +} +//------------------------------------------------------------------------------ +/* + * Function to print all timestamps. + */ +void printTimestamps(FsFile& f) { + cout << F("Creation: "); + f.printCreateDateTime(&Serial); + cout << endl << F("Modify: "); + f.printModifyDateTime(&Serial); + cout << endl << F("Access: "); + f.printAccessDateTime(&Serial); + cout << endl; +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + // Wait for USB Serial + while (!Serial) { + yield(); + } + cout << F("Type any character to start\n"); + while (!Serial.available()) { + yield(); + } + // Initialize at the highest speed supported by the board that is + // not over 50 MHz. Try a lower speed if SPI errors occur. + if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { + sd.initErrorHalt(); + } + + // remove files if they exist + sd.remove("callback.txt"); + sd.remove("default.txt"); + sd.remove("stamp.txt"); + + // create a new file with default timestamps + if (!file.open("default.txt", O_WRONLY | O_CREAT)) { + error("open default.txt failed"); + } + cout << F("\nOpen with default times\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test the date time callback function. + * + * dateTimeCallback() sets the function + * that is called when a file is created + * or when a file's directory entry is + * modified by sync(). + * + * The callback can be disabled by the call + * SdFile::dateTimeCallbackCancel() + */ + // set date time callback function + SdFile::dateTimeCallback(dateTime); + + // create a new file with callback timestamps + if (!file.open("callback.txt", O_WRONLY | O_CREAT)) { + error("open callback.txt failed"); + } + cout << ("\nOpen with callback times\n"); + printTimestamps(file); + + // change call back date + day += 1; + + // must add two to see change since FAT second field is 5-bits + second += 2; + + // modify file by writing a byte + file.write('t'); + + // force dir update + file.sync(); + + cout << F("\nTimes after write\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test timestamp() function + * + * Cancel callback so sync will not + * change access/modify timestamp + */ + SdFile::dateTimeCallbackCancel(); + + // create a new file with default timestamps + if (!file.open("stamp.txt", O_WRONLY | O_CREAT)) { + error("open stamp.txt failed"); + } + // set creation date time + if (!file.timestamp(T_CREATE, 2021, 11, 10, 1, 2, 3)) { + error("set create time failed"); + } + // set write/modification date time + if (!file.timestamp(T_WRITE, 2021, 11, 11, 4, 5, 6)) { + error("set write time failed"); + } + // set access date + if (!file.timestamp(T_ACCESS, 2021, 11, 12, 7, 8, 9)) { + error("set access time failed"); + } + cout << F("\nTimes after timestamp() calls\n"); + printTimestamps(file); + + file.close(); + cout << F("\nDone\n"); +} + +void loop() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/MiniSerial/MiniSerial.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/MiniSerial/MiniSerial.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/MiniSerial/MiniSerial.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/MiniSerial/MiniSerial.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/PrintBenchmarkSD/PrintBenchmarkSD.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/SD_Size/SD_Size.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/SD_Size/SD_Size.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/SD_Size/SD_Size.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/SD_Size/SD_Size.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/append/append.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/append/append.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/append/append.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/append/append.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/average/average.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/average/average.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/average/average.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/average/average.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/benchSD/benchSD.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/benchSD/benchSD.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/benchSD/benchSD.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/benchSD/benchSD.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/bufstream/bufstream.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/bufstream/bufstream.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/bufstream/bufstream.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/bufstream/bufstream.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/cin_cout/cin_cout.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/cin_cout/cin_cout.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/cin_cout/cin_cout.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/cin_cout/cin_cout.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/eventlog/eventlog.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/eventlog/eventlog.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/eventlog/eventlog.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/eventlog/eventlog.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/readlog/readlog.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/readlog/readlog.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/readlog/readlog.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/readlog/readlog.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/readme.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/readme.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/#attic/readme.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/#attic/readme.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino similarity index 99% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino index a9edab1d..28346288 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino @@ -22,6 +22,7 @@ #ifdef __AVR__ #include #include "SdFat.h" +#include "sdios.h" #include "FreeStack.h" #include "AnalogBinLogger.h" //------------------------------------------------------------------------------ @@ -648,7 +649,7 @@ void logData() { bgnErase = endErase + 1; } // Start a multiple block write. - if (!sd.card()->writeStart(bgnBlock, FILE_BLOCK_COUNT)) { + if (!sd.card()->writeStart(bgnBlock)) { error("writeBegin failed"); } // Write metadata. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/LongFileName.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/LongFileName.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/LongFileName.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/LongFileName.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/A long name can be 255 characters.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/A long name can be 255 characters.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/A long name can be 255 characters.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/A long name can be 255 characters.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/LFN,NAME.TXT b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/LFN,NAME.TXT similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/LFN,NAME.TXT rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/LFN,NAME.TXT diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/MIXCASE.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/MIXCASE.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/MIXCASE.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/MIXCASE.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/Not_8_3.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/Not_8_3.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/Not_8_3.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/Not_8_3.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/OK%83.TXT b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/OK%83.TXT similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/OK%83.TXT rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/OK%83.TXT diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/STD_8_3.TXT b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/STD_8_3.TXT similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/STD_8_3.TXT rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/STD_8_3.TXT diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/With Blank.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/With Blank.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/With Blank.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/With Blank.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/With.Two dots.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/With.Two dots.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/With.Two dots.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/With.Two dots.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/lower.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/lower.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/lower.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/lower.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/mixed.TXT b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/mixed.TXT similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LongFileName/testFiles/mixed.TXT rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LongFileName/testFiles/mixed.TXT diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/UserFunctions.cpp b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/UserFunctions.cpp similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/UserFunctions.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/UserFunctions.cpp diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/UserTypes.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/UserTypes.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLogger/UserTypes.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLogger/UserTypes.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLoggerADXL345.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLoggerADXL345.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLoggerADXL345.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLoggerADXL345.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/UserFunctions.cpp b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/UserFunctions.cpp similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/UserFunctions.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/UserFunctions.cpp diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/UserTypes.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/UserTypes.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/UserTypes.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/UserTypes.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/readme.txt b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/readme.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerADXL345/readme.txt rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerADXL345/readme.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLoggerMPU6050.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLoggerMPU6050.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLoggerMPU6050.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLoggerMPU6050.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/UserFunctions.cpp b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/UserFunctions.cpp similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/UserFunctions.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/UserFunctions.cpp diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/UserTypes.h b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/UserTypes.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/LowLatencyLoggerMPU6050/UserTypes.h rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/LowLatencyLoggerMPU6050/UserTypes.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/RawWrite/RawWrite.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/RawWrite/RawWrite.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/RawWrite/RawWrite.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/RawWrite/RawWrite.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsv/ReadCsv.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsv/ReadCsv.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsv/ReadCsv.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsv/ReadCsv.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadWrite/ReadWrite.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadWrite/ReadWrite.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/ReadWrite/ReadWrite.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/ReadWrite/ReadWrite.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/STM32Test/STM32Test.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/STM32Test/STM32Test.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/STM32Test/STM32Test.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/STM32Test/STM32Test.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/StdioBench/StdioBench.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/StdioBench/StdioBench.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/StdioBench/StdioBench.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/StdioBench/StdioBench.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/Timestamp/Timestamp.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/Timestamp/Timestamp.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/Timestamp/Timestamp.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/Timestamp/Timestamp.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/TwoCards/TwoCards.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/TwoCards/TwoCards.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/TwoCards/TwoCards.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/TwoCards/TwoCards.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/dataLogger/dataLogger.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/dataLogger/dataLogger.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/dataLogger/dataLogger.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/dataLogger/dataLogger.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/fgets/fgets.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/fgets/fgets.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/fgets/fgets.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/fgets/fgets.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/formatting/formatting.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/formatting/formatting.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/formatting/formatting.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/formatting/formatting.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/getline/getline.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/getline/getline.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/getline/getline.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/getline/getline.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/wipe/wipe.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/wipe/wipe.ino similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/examplesV1/wipe/wipe.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/examplesV1/wipe/wipe.ino diff --git a/extra-libraries/ESP32/SdFat-2.1.2/examples/rename/rename.ino b/extra-libraries/ESP32/SdFat-2.2.3/examples/rename/rename.ino similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/examples/rename/rename.ino rename to extra-libraries/ESP32/SdFat-2.2.3/examples/rename/rename.ino index aed94c5b..3995fce5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/examples/rename/rename.ino +++ b/extra-libraries/ESP32/SdFat-2.2.3/examples/rename/rename.ino @@ -6,7 +6,7 @@ // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and @@ -20,7 +20,7 @@ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -31,7 +31,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) -#elif ENABLE_DEDICATED_SPI +#elif ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS #define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) @@ -80,8 +80,7 @@ void setup() { // Remove file/dirs from previous run. if (sd.exists("dir2/DIR3/NAME3.txt")) { cout << F("Removing /dir2/DIR3/NAME3.txt") << endl; - if (!sd.remove("dir2/DIR3/NAME3.txt") || - !sd.rmdir("dir2/DIR3/") || + if (!sd.remove("dir2/DIR3/NAME3.txt") || !sd.rmdir("dir2/DIR3/") || !sd.rmdir("dir2/")) { error("remove/rmdir failed"); } diff --git a/extra-libraries/ESP32/SdFat-2.2.3/extras/AvrPrintStimmer.cpp b/extra-libraries/ESP32/SdFat-2.2.3/extras/AvrPrintStimmer.cpp new file mode 100644 index 00000000..188db166 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/AvrPrintStimmer.cpp @@ -0,0 +1,567 @@ +/* + Print.cpp - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + many modifications, by Paul Stoffregen + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + */ + +#include +#include +#include +#include +#include +#include "Arduino.h" // (was wiring.h) + +#include "Print.h" + + +#if ARDUINO >= 100 +#else +void Print::write(const char *str) +{ + write((const uint8_t *)str, strlen(str)); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::write(const uint8_t *buffer, size_t size) +{ + size_t count = 0; + while (size--) count += write(*buffer++); + return count; +} +#else +void Print::write(const uint8_t *buffer, size_t size) +{ + while (size--) write(*buffer++); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(const String &s) +{ + uint8_t buffer[33]; + size_t count = 0; + unsigned int index = 0; + unsigned int len = s.length(); + while (len > 0) { + s.getBytes(buffer, sizeof(buffer), index); + unsigned int nbytes = len; + if (nbytes > sizeof(buffer)-1) nbytes = sizeof(buffer)-1; + index += nbytes; + len -= nbytes; + count += write(buffer, nbytes); + } + return count; +} +#else +void Print::print(const String &s) +{ + unsigned int len = s.length(); + for (unsigned int i=0; i < len; i++) { + write(s[i]); + } +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(const __FlashStringHelper *ifsh) +{ + uint8_t buffer[32]; + size_t count = 0; + const char PROGMEM *p = (const char PROGMEM *)ifsh; + unsigned int len = strlen_P(p); + while (len > 0) { + unsigned int nbytes = len; + if (nbytes > sizeof(buffer)) nbytes = sizeof(buffer); + memcpy_P(buffer, p, nbytes); + p += nbytes; + len -= nbytes; + count += write(buffer, nbytes); + } + return count; +} +#else +void Print::print(const __FlashStringHelper *ifsh) +{ + const char PROGMEM *p = (const char PROGMEM *)ifsh; + while (1) { + unsigned char c = pgm_read_byte(p++); + if (c == 0) return; + write(c); + } +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(long n) +{ + uint8_t sign=0; + + if (n < 0) { + sign = 1; + n = -n; + } + return printNumber(n, sign, 10); +} +#else +void Print::print(long n) +{ + uint8_t sign=0; + + if (n < 0) { + sign = 1; + n = -n; + } + printNumber(n, sign, 10); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::println(void) +{ + uint8_t buf[2]={'\r', '\n'}; + return write(buf, 2); +} +#else +void Print::println(void) +{ + uint8_t buf[2]={'\r', '\n'}; + write(buf, 2); +} +#endif + + +//#define USE_HACKER_DELIGHT_OPTIMIZATION +#define USE_STIMMER_OPTIMIZATION +#define USE_BENCHMARK_CODE + + +#ifdef USE_HACKER_DELIGHT_OPTIMIZATION +// Adapted from Hacker's Delight (Henry Warren, ISBN 0321842685) www.hackersdelight.org +// by Rob Tillaart, Tom Carpenter, "genom2" with input from others... +// http://forum.arduino.cc/index.php?topic=167414.0 +// +#define divmod10_asm(in32, tmp32, mod8) \ +asm volatile ( \ + "mov %2, %A0 \n\t" /* mod = in */ \ + "ori %A0, 1 \n\t" /* q = in | 1 */ \ + "movw %A1, %A0 \n\t" /* x = q */ \ + "movw %C1, %C0 \n\t" \ + "lsr %D1 \n\t" /* x = x >> 2 */ \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "sub %A0, %A1 \n\t" /* q = q - x */ \ + "sbc %B0, %B1 \n\t" \ + "sbc %C0, %C1 \n\t" \ + "sbc %D0, %D1 \n\t" \ + "movw %A1, %A0 \n\t" /* x = q */ \ + "movw %C1, %C0 \n\t" \ + "lsr %D1 \n\t" /* x = x >> 4 */ \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "add %A1, %A0 \n\t" /* x = x + q */ \ + "adc %B1, %B0 \n\t" \ + "adc %C1, %C0 \n\t" \ + "adc %D1, %D0 \n\t" \ + "movw %A0, %A1 \n\t" /* q = x */ \ + "movw %C0, %C1 \n\t" \ + "add %A0, %B1 \n\t" /* q = q + (x >> 8) */ \ + "adc %B0, %C1 \n\t" \ + "adc %C0, %D1 \n\t" \ + "adc %D0, r1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "andi %A0, 0xF8 \n\t" /* q = q & ~0x7 */ \ + "sub %2, %A0 \n\t" /* mod = mod - q */ \ + "lsr %D0 \n\t" /* q = q >> 2 */ \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + "lsr %D0 \n\t" \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + "sub %2, %A0 \n\t" /* mod = mod - q */ \ + "lsr %D0 \n\t" /* q = q >> 1 */ \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + : "+d" (in32), "=r" (tmp32), "=r" (mod8) : : "r0" \ +) +#endif // USE_HACKER_DELIGHT_OPTIMIZATION + +#ifdef USE_STIMMER_OPTIMIZATION +// http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 +#define divmod10_asm32(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " mul %D0,%2 \n\t" \ + " clr %D0 \n\t" \ + " add %C0,r0 \n\t" \ + " adc %D0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,%D0 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,%D0 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%D0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " lsr %D0 \n\t" \ + " ror %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm24(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " lsr %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm16(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " lsr %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm8(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,r1 \n\t" \ + " lsr %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") +#endif // USE_STIMMER_OPTIMIZATION + + + +#ifdef USE_BENCHMARK_CODE +uint32_t usec_print = 0; +#endif + + +#if ARDUINO >= 100 +size_t Print::printNumberDec(unsigned long n, uint8_t sign) +#else +void Print::printNumberDec(unsigned long n, uint8_t sign) +#endif +{ + uint8_t digit, buf[11], *p; + uint32_t tmp32; + uint8_t tmp8; + +#ifdef USE_BENCHMARK_CODE + uint32_t usec = micros(); +#endif + p = buf + (sizeof(buf)-1); + + #if defined(USE_STIMMER_OPTIMIZATION) + + while(n & 0xff000000){divmod10_asm32(n, digit, tmp8);*--p = digit + '0';} + while(n & 0xff0000){divmod10_asm24(n, digit, tmp8);*--p = digit + '0';} + while(n & 0xff00){divmod10_asm16(n, digit, tmp8);*--p = digit + '0';} + while((n & 0xff)>9){divmod10_asm8(n, digit, tmp8);*--p = digit + '0';} + *--p = n + '0'; + + #else + do { + #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) + divmod10_asm(n, tmp32, digit); + #else + tmp32 = n; + n = n / 10; + digit = tmp32 - n * 10; + #endif + *--p = digit + '0'; + } while (n); + #endif + if (sign) *--p = '-'; +#ifdef USE_BENCHMARK_CODE + usec_print += micros() - usec; +#endif +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberHex(unsigned long n) +#else +void Print::printNumberHex(unsigned long n) +#endif +{ + uint8_t digit, buf[8], *p; + + p = buf + (sizeof(buf)-1); + do { + digit = n & 15; + *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; + n >>= 4; + } while (n); +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberBin(unsigned long n) +#else +void Print::printNumberBin(unsigned long n) +#endif +{ + uint8_t buf[32], *p; + + p = buf + (sizeof(buf)-1); + do { + *--p = '0' + ((uint8_t)n & 1); + n >>= 1; + } while (n); +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberAny(unsigned long n, uint8_t base) +#else +void Print::printNumberAny(unsigned long n, uint8_t base) +#endif +{ + uint8_t digit, buf[21], *p; + uint32_t tmp; + //uint32_t usec; + + //usec = micros(); + p = buf + (sizeof(buf)-1); + do { + tmp = n; + n = n / base; + digit = tmp - n * base; + *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; + } while (n); + //usec_print += micros() - usec; +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + + + + +#if ARDUINO >= 100 +size_t Print::printFloat(double number, uint8_t digits) +#else +void Print::printFloat(double number, uint8_t digits) +#endif +{ + uint8_t sign=0; +#if ARDUINO >= 100 + size_t count=0; +#endif + + // Handle negative numbers + if (number < 0.0) { + sign = 1; + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i= 100 + count += printNumber(int_part, sign, 10); +#else + printNumber(int_part, sign, 10); +#endif + + // Print the decimal point, but only if there are digits beyond + if (digits > 0) { + uint8_t n, buf[8], count=1; + buf[0] = '.'; + + // Extract digits from the remainder one at a time + if (digits > sizeof(buf) - 1) digits = sizeof(buf) - 1; + + while (digits-- > 0) { + remainder *= 10.0; + n = (uint8_t)(remainder); + buf[count++] = '0' + n; + remainder -= n; + } +#if ARDUINO >= 100 + count += write(buf, count); +#else + write(buf, count); +#endif + } +#if ARDUINO >= 100 + return count; +#endif +} + + diff --git a/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip new file mode 100644 index 00000000..72b3069c Binary files /dev/null and b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip differ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/UsbHostShieldDiff.txt b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/UsbHostShieldDiff.txt similarity index 68% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/UsbHostShieldDiff.txt rename to extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/UsbHostShieldDiff.txt index bbe0f1d4..fdc70d78 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/UsbHostShieldDiff.txt +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/UsbHostShieldDiff.txt @@ -1,6 +1,4 @@ - - -+++ "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\USB_Host_Shield_2.0/masstorage.cpp" 2020-02-20 06:02:48.567008200 -0800 +master/masstorage.cpp" 2022-10-18 08:48:03.639503200 -0700 @@ -796,6 +796,7 @@ buf[i] = 0x00; } @@ -9,3 +7,4 @@ uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf); if(!rc) { WriteOk[lun] = ((buf[2] & 0x80) == 0); + diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/readme.txt b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/readme.txt similarity index 74% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/readme.txt rename to extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/readme.txt index 0d7b60bd..07b26fe2 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/extras/USB_Host_Shield/readme.txt +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/USB_Host_Shield/readme.txt @@ -1,4 +1,4 @@ -This zip file was downloaded on 2/20/2020 from +This zip file was downloaded on 10/18/2022 from https://github.com/felis/USB_Host_Shield_2.0 diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.cpp b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.cpp similarity index 94% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.cpp index c0c6d581..87cd5e1b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.cpp @@ -33,14 +33,14 @@ size_t PrintBasic::print(long n, uint8_t base) { return printNum(n, base); } size_t PrintBasic::printNum(unsigned long n, uint8_t base) { - const uint8_t DIM = 8*sizeof(long); + const uint8_t DIM = 8 * sizeof(long); char buf[DIM]; char *str = &buf[DIM]; if (base < 2) return 0; do { - char c = n%base; + char c = n % base; n /= base; *--str = c + (c < 10 ? '0' : 'A' - 10); } while (n); @@ -67,7 +67,7 @@ size_t PrintBasic::printDouble(double n, uint8_t prec) { } double round = 0.5; - for (uint8_t i = 0; i < prec; ++i) { + for (uint8_t i = 0; i < prec; ++i) { round *= 0.1; } @@ -88,4 +88,4 @@ size_t PrintBasic::printDouble(double n, uint8_t prec) { } return rtn; } -#endif // ENABLE_ARDUINO_FEATURES == 0 +#endif // ENABLE_ARDUINO_FEATURES == 0 diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.h b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.h similarity index 74% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.h rename to extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.h index f1743715..55cb60a5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/PrintBasic.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintBasic.h @@ -28,16 +28,18 @@ * \file * \brief Stream/Print like replacement for non-Arduino systems. */ -#include #include +#include #include + #include "../SdFatConfig.h" #ifndef F #if defined(__AVR__) #include class __FlashStringHelper; -#define F(string_literal) (reinterpret_cast(PSTR(string_literal))) +#define F(string_literal) \ + (reinterpret_cast(PSTR(string_literal))) #else // defined(__AVR__) #define F(str) (str) #endif // defined(__AVR__) @@ -55,63 +57,44 @@ class PrintBasic { public: PrintBasic() : m_error(0) {} - void clearWriteError() { - setWriteError(0); - } - int getWriteError() { - return m_error; - } - size_t print(char c) { - return write(c); - } - size_t print(const char* str) { - return write(str); - } + void clearWriteError() { setWriteError(0); } + int getWriteError() { return m_error; } + size_t print(char c) { return write(c); } + size_t print(const char *str) { return write(str); } size_t print(const __FlashStringHelper *str) { #ifdef __AVR__ - PGM_P p = reinterpret_cast(str); - size_t n = 0; - for (uint8_t c; (c = pgm_read_byte(p + n)) && write(c); n++) {} - return n; -#else // __AVR__ - return print(reinterpret_cast(str)); + PGM_P p = reinterpret_cast(str); + size_t n = 0; + for (uint8_t c; (c = pgm_read_byte(p + n)) && write(c); n++) { + } + return n; +#else // __AVR__ + return print(reinterpret_cast(str)); #endif // __AVR__ } size_t println(const __FlashStringHelper *str) { #ifdef __AVR__ return print(str) + println(); -#else // __AVR__ +#else // __AVR__ return println(reinterpret_cast(str)); #endif // __AVR__ } - size_t print(double n, uint8_t prec = 2) { - return printDouble(n, prec); - } + size_t print(double n, uint8_t prec = 2) { return printDouble(n, prec); } size_t print(signed char n, uint8_t base = 10) { return print((long)n, base); } size_t print(unsigned char n, uint8_t base = 10) { return print((unsigned long)n, base); } - size_t print(int n, uint8_t base = 10) { - return print((long)n, base); - } + size_t print(int n, uint8_t base = 10) { return print((long)n, base); } size_t print(unsigned int n, uint8_t base = 10) { return print((unsigned long)n, base); } size_t print(long n, uint8_t base = 10); - size_t print(unsigned long n, uint8_t base = 10) { - return printNum(n, base); - } - size_t println() { - return write("\r\n"); - } - size_t println(char c) { - return write(c) + println(); - } - size_t println(const char* str) { - return print(str) + println(); - } + size_t print(unsigned long n, uint8_t base = 10) { return printNum(n, base); } + size_t println() { return write("\r\n"); } + size_t println(char c) { return write(c) + println(); } + size_t println(const char *str) { return print(str) + println(); } size_t println(double n, uint8_t prec = 2) { return print(n, prec) + println(); } @@ -133,12 +116,10 @@ class PrintBasic { size_t println(unsigned long n, uint8_t base = 10) { return print(n, base) + println(); } - size_t write(const char *str) { - return write(str, strlen(str)); - } + size_t write(const char *str) { return write(str, strlen(str)); } virtual size_t write(uint8_t b) = 0; - virtual size_t write(const uint8_t* buffer, size_t size) { + virtual size_t write(const uint8_t *buffer, size_t size) { size_t i; for (i = 0; i < size; i++) { if (!write(buffer[i])) break; @@ -146,13 +127,11 @@ class PrintBasic { return i; } size_t write(const char *buffer, size_t size) { - return write((const uint8_t*)buffer, size); + return write(reinterpret_cast(buffer), size); } protected: - void setWriteError(int err = 1) { - m_error = err; - } + void setWriteError(int err = 1) { m_error = err; } private: size_t printDouble(double n, uint8_t prec); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintTemplates.h b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintTemplates.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintTemplates.h rename to extra-libraries/ESP32/SdFat-2.2.3/extras/attic/PrintTemplates.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/SysCallBareUno.cpp b/extra-libraries/ESP32/SdFat-2.2.3/extras/attic/SysCallBareUno.cpp similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/attic/SysCallBareUno.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/extras/attic/SysCallBareUno.cpp diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.bat b/extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.bat similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.bat rename to extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.bat diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.py b/extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.py similarity index 99% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.py rename to extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.py index 4a82bde4..704618f5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.py +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.py @@ -67,7 +67,7 @@ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] [file] ... The style guidelines this tries to follow are those in - https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml + https://google.github.io/styleguide/cppguide.html Every problem is given a confidence score from 1-5, with 5 meaning we are certain of the problem, and 1 meaning it could be a legitimate construct. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.sh b/extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.sh similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/cpplint.sh rename to extra-libraries/ESP32/SdFat-2.2.3/extras/cpplint.sh diff --git a/extra-libraries/ESP32/SdFat-2.2.3/extras/fmt_src.bat b/extra-libraries/ESP32/SdFat-2.2.3/extras/fmt_src.bat new file mode 100644 index 00000000..7ddecdfe --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/extras/fmt_src.bat @@ -0,0 +1,11 @@ +clang-format --style=Google -i *.cpp *.h +rem clang-format --style=Google -i DigitalIO/*.h +rem clang-format --style=Google -i DigitalIO/boards/*.h +clang-format --style=Google -i common/*.cpp common/*.h +clang-format --style=Google -i ExFatLib/*.cpp ExFatLib/*.h +clang-format --style=Google -i FatLib/*.cpp FatLib/*.h +clang-format --style=Google -i FsLib/*.cpp FsLib/*.h +clang-format --style=Google -i iostream/*.cpp iostream/*.h +clang-format --style=Google -i SdCard/*.cpp SdCard/*.h +clang-format --style=Google -i SpiDriver/*.cpp SpiDriver/*.h +pause diff --git a/extra-libraries/ESP32/SdFat-2.1.2/library.properties b/extra-libraries/ESP32/SdFat-2.2.3/library.properties similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/library.properties rename to extra-libraries/ESP32/SdFat-2.2.3/library.properties index f13b4437..12abc4f5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/library.properties +++ b/extra-libraries/ESP32/SdFat-2.2.3/library.properties @@ -1,5 +1,5 @@ name=SdFat -version=2.1.2 +version=2.2.3 license=MIT author=Bill Greiman maintainer=Bill Greiman diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/BufferedPrint.h b/extra-libraries/ESP32/SdFat-2.2.3/src/BufferedPrint.h similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/BufferedPrint.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/BufferedPrint.h index b248d1c6..5145babb 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/BufferedPrint.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/BufferedPrint.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,12 +28,15 @@ * \file * \brief Fast buffered print. */ +#ifdef __AVR__ +#include +#endif // __AVR__ #include "common/FmtNumber.h" /** * \class BufferedPrint * \brief Fast buffered print template. */ -template +template class BufferedPrint { public: BufferedPrint() : m_wr(nullptr), m_in(0) {} @@ -49,7 +52,7 @@ class BufferedPrint { m_in = 0; } /** Flush the buffer - same as sync() with no status return. */ - void flush() {sync();} + void flush() { sync(); } /** Print a character followed by a field terminator. * \param[in] c character to print. * \param[in] term The field terminator. Use '\\n' for CR LF. @@ -72,7 +75,7 @@ class BufferedPrint { * \param[in] term The field terminator. Use '\\n' for CR LF. * \return true for success or false if an error occurs. */ - size_t printField(const __FlashStringHelper *fsh, char term) { + size_t printField(const __FlashStringHelper* fsh, char term) { #ifdef __AVR__ size_t rtn = 0; PGM_P p = reinterpret_cast(fsh); @@ -93,8 +96,8 @@ class BufferedPrint { rtn += write(str, buf + sizeof(buf) - str); } return rtn; -#else // __AVR__ - return printField(reinterpret_cast(fsh), term); +#else // __AVR__ + return printField(reinterpret_cast(fsh), term); #endif // __AVR__ } /** Print a string followed by a field terminator. @@ -139,7 +142,7 @@ class BufferedPrint { * \param[in] prec Number of digits after decimal point. * \return true for success or false if an error occurs. */ - size_t printField(float f, char term, uint8_t prec = 2) { + size_t printField(float f, char term, uint8_t prec = 2) { return printField(static_cast(f), term, prec); } /** Print an integer value for 8, 16, and 32 bit signed and unsigned types. @@ -147,7 +150,7 @@ class BufferedPrint { * \param[in] term The field terminator. Use '\\n' for CR LF. * \return true for success or false if an error occurs. */ - template + template size_t printField(Type n, char term) { const uint8_t DIM = sizeof(Type) <= 2 ? 8 : 13; char buf[DIM]; @@ -184,9 +187,7 @@ class BufferedPrint { * \param[in] prec Number of digits after decimal point. * \return true for success or false if an error occurs. */ - size_t print(double d, uint8_t prec = 2) { - return printField(d, 0, prec); - } + size_t print(double d, uint8_t prec = 2) { return printField(d, 0, prec); } /** Print a double followed by CR LF. * \param[in] d The number to be printed. * \param[in] prec Number of digits after decimal point. @@ -215,7 +216,7 @@ class BufferedPrint { * \param[in] v item to print. * \return true for success or false if an error occurs. */ - template + template size_t print(Type v) { return printField(v, 0); } @@ -223,7 +224,7 @@ class BufferedPrint { * \param[in] v item to print. * \return true for success or false if an error occurs. */ - template + template size_t println(Type v) { return printField(v, '\n'); } @@ -238,7 +239,7 @@ class BufferedPrint { m_in = 0; return true; } - /** Write data to an open file. + /** Write data to an open file. * \param[in] src Pointer to the location of the data to be written. * * \param[in] n Number of bytes to write. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/DigitalPin.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/DigitalPin.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/DigitalPin.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/DigitalPin.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/SoftSPI.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/SoftSPI.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/SoftSPI.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/SoftSPI.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/BobuinoGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/BobuinoGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/BobuinoGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/BobuinoGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/GpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/GpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/GpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/GpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/LeonardoGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/LeonardoGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/LeonardoGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/LeonardoGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/MegaGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/MegaGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/MegaGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/MegaGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Standard1284GpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Standard1284GpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Standard1284GpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Standard1284GpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Teensy2GpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Teensy2GpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Teensy2GpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Teensy2GpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Teensy2ppGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Teensy2ppGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/Teensy2ppGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/Teensy2ppGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/UnoGpioPinMap.h b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/UnoGpioPinMap.h similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/boards/UnoGpioPinMap.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/boards/UnoGpioPinMap.h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/readme.txt b/extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/readme.txt similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/DigitalIO/readme.txt rename to extra-libraries/ESP32/SdFat-2.2.3/src/DigitalIO/readme.txt diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatConfig.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatConfig.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatConfig.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatConfig.h index f04ff756..a512314c 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatConfig.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatConfig.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatDbg.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatDbg.cpp similarity index 91% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatDbg.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatDbg.cpp index dcb3148b..02cc1bf7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatDbg.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatDbg.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,9 +22,9 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "ExFatVolume.h" #include "../common/upcase.h" #include "ExFatLib.h" +#include "ExFatVolume.h" #ifndef DOXYGEN_SHOULD_SKIP_THIS //------------------------------------------------------------------------------ static void printHex(print_t* pr, uint8_t h); @@ -59,15 +59,15 @@ static uint16_t hashDir(DirName_t* dir, uint16_t hash) { if (!u) { break; } - uint16_t c = toUpcase(u); - hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); - hash = ((hash << 15) | (hash >> 1)) + (c >> 8); + uint16_t c = toUpcase(u); + hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); + hash = ((hash << 15) | (hash >> 1)) + (c >> 8); } return hash; } //------------------------------------------------------------------------------ -static void printDateTime(print_t* pr, - uint32_t timeDate, uint8_t ms, int8_t tz) { +static void printDateTime(print_t* pr, uint32_t timeDate, uint8_t ms, + int8_t tz) { fsPrintDateTime(pr, timeDate, ms, tz); pr->println(); } @@ -93,11 +93,11 @@ static void printDirFile(print_t* pr, DirFile_t* dir) { pr->print(F("attributes: 0x")); pr->println(getLe16(dir->attributes), HEX); pr->print(F("createTime: ")); - printDateTime(pr, getLe32(dir->createTime), - dir->createTimeMs, dir->createTimezone); + printDateTime(pr, getLe32(dir->createTime), dir->createTimeMs, + dir->createTimezone); pr->print(F("modifyTime: ")); - printDateTime(pr, getLe32(dir->modifyTime), - dir->modifyTimeMs, dir->modifyTimezone); + printDateTime(pr, getLe32(dir->modifyTime), dir->modifyTimeMs, + dir->modifyTimezone); pr->print(F("accessTime: ")); printDateTime(pr, getLe32(dir->accessTime), 0, dir->accessTimezone); } @@ -109,7 +109,7 @@ static void printDirLabel(print_t* pr, DirLabel_t* dir) { pr->println(dir->labelLength); pr->print(F("unicode: ")); for (size_t i = 0; i < dir->labelLength; i++) { - pr->write(dir->unicode[2*i]); + pr->write(dir->unicode[2 * i]); } pr->println(); } @@ -152,7 +152,7 @@ static void printDirStream(print_t* pr, DirStream_t* dir) { static void printDirUpcase(print_t* pr, DirUpcase_t* dir) { pr->print(F("dirUpcase: 0x")); pr->println(dir->type, HEX); - pr->print(F("checksum: 0x")); + pr->print(F("checksum: 0x")); pr->println(getLe32(dir->checksum), HEX); pr->print(F("firstCluster: ")); pr->println(getLe32(dir->firstCluster)); @@ -192,7 +192,7 @@ static void printExFatBoot(print_t* pr, pbs_t* pbs) { pr->print(F("FileSystemRevision: 0x")); pr->println(getLe32(ebs->fileSystemRevision), HEX); pr->print(F("VolumeFlags: 0x")); - pr->println(getLe16(ebs->volumeFlags) , HEX); + pr->println(getLe16(ebs->volumeFlags), HEX); pr->print(F("BytesPerSectorShift: ")); pr->println(ebs->bytesPerSectorShift); pr->print(F("SectorsPerClusterShift: ")); @@ -215,7 +215,7 @@ static void printHex(print_t* pr, uint8_t h) { static void printHex(print_t* pr, uint16_t val) { bool space = true; for (uint8_t i = 0; i < 4; i++) { - uint8_t h = (val >> (12 - 4*i)) & 15; + uint8_t h = (val >> (12 - 4 * i)) & 15; if (h || i == 3) { space = false; } @@ -230,7 +230,7 @@ static void printHex(print_t* pr, uint16_t val) { static void printHex(print_t* pr, uint32_t val) { bool space = true; for (uint8_t i = 0; i < 8; i++) { - uint8_t h = (val >> (28 - 4*i)) & 15; + uint8_t h = (val >> (28 - 4 * i)) & 15; if (h || i == 7) { space = false; } @@ -244,7 +244,7 @@ static void printHex(print_t* pr, uint32_t val) { //------------------------------------------------------------------------------ static void printHex64(print_t* pr, uint64_t n) { char buf[17]; - char *str = &buf[sizeof(buf) - 1]; + char* str = &buf[sizeof(buf) - 1]; *str = '\0'; do { uint8_t h = n & 15; @@ -256,12 +256,12 @@ static void printHex64(print_t* pr, uint64_t n) { //------------------------------------------------------------------------------ static void println64(print_t* pr, uint64_t n) { char buf[21]; - char *str = &buf[sizeof(buf) - 1]; + char* str = &buf[sizeof(buf) - 1]; *str = '\0'; do { uint64_t m = n; n /= 10; - *--str = m - 10*n + '0'; + *--str = m - 10 * n + '0'; } while (n); pr->println(str); } @@ -313,15 +313,15 @@ void ExFatPartition::checkUpcase(print_t* pr) { pr->println(F("upcase not found")); return; } - for (size_t i = 0; i < size/2; i++) { - if ((i%256) == 0) { + for (size_t i = 0; i < size / 2; i++) { + if ((i % 256) == 0) { upcase = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!upcase) { pr->println(F("read upcase failed")); return; } } - uint16_t v = getLe16(&upcase[2*(i & 0XFF)]); + uint16_t v = getLe16(&upcase[2 * (i & 0XFF)]); if (skip) { pr->print("skip "); pr->print(u); @@ -334,7 +334,7 @@ void ExFatPartition::checkUpcase(print_t* pr) { for (uint16_t k = 0; k < v; k++) { uint16_t x = toUpcase(u + k); if (x != (u + k)) { - printHex(pr, (uint16_t)(u+k)); + printHex(pr, (uint16_t)(u + k)); pr->write(','); printHex(pr, x); pr->println("<<<<<<<<<<<<<<<<<<<<"); @@ -363,8 +363,8 @@ void ExFatPartition::dmpBitmap(print_t* pr) { dmpSector(pr, m_clusterHeapStartSector); } //------------------------------------------------------------------------------ -void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, - uint32_t offset, uint32_t count) { +void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, uint32_t offset, + uint32_t count) { uint32_t sector = clusterStartSector(cluster) + offset; for (uint32_t i = 0; i < count; i++) { pr->print(F("\nSector: ")); @@ -375,7 +375,7 @@ void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, //------------------------------------------------------------------------------ void ExFatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { uint32_t sector = m_fatStartSector + start; - uint32_t cluster = 128*start; + uint32_t cluster = 128 * start; pr->println(F("FAT:")); for (uint32_t i = 0; i < count; i++) { uint8_t* cache = dataCachePrepare(sector + i, FsCache::CACHE_FOR_READ); @@ -385,7 +385,7 @@ void ExFatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } uint32_t* fat = reinterpret_cast(cache); for (size_t k = 0; k < 128; k++) { - if (0 == cluster%8) { + if (0 == cluster % 8) { if (k) { pr->println(); } @@ -406,7 +406,7 @@ void ExFatPartition::dmpSector(print_t* pr, uint32_t sector) { return; } for (uint16_t i = 0; i < m_bytesPerSector; i++) { - if (i%32 == 0) { + if (i % 32 == 0) { if (i) { pr->println(); } @@ -427,9 +427,9 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { uint16_t nameHash = 0; uint16_t setChecksum = 0; uint16_t calcChecksum = 0; - uint8_t nameLength = 0; - uint8_t setCount = 0; - uint8_t nUnicode; + uint8_t nameLength = 0; + uint8_t setCount = 0; + uint8_t nUnicode; #define RAW_ROOT #ifndef RAW_ROOT @@ -439,12 +439,12 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { break; } dir = reinterpret_cast(buf); -#else // RAW_ROOT +#else // RAW_ROOT (void)file; uint32_t nDir = 1UL << (m_sectorsPerClusterShift + 4); uint32_t sector = clusterStartSector(m_rootDirectoryCluster); for (uint32_t iDir = 0; iDir < nDir; iDir++) { - size_t i = iDir%16; + size_t i = iDir % 16; if (i == 0) { uint8_t* cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!cache) { @@ -455,7 +455,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { dir++; } #endif // RAW_ROOT - if (dir->type == 0) { + if (dir->type == EXFAT_TYPE_END_DIR) { break; } pr->println(); @@ -491,7 +491,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { calcHash = 0; break; - case EXFAT_TYPE_NAME: + case EXFAT_TYPE_NAME: dirName = reinterpret_cast(dir); printDirName(pr, dirName); calcChecksum = exFatDirChecksum(dir, calcChecksum); @@ -499,7 +499,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { calcHash = hashDir(dirName, calcHash); nameLength -= nUnicode; setCount--; - if (nameLength == 0 || setCount == 0) { + if (nameLength == 0 || setCount == 0) { pr->print(F("setChecksum: 0x")); pr->print(setChecksum, HEX); if (setChecksum != calcChecksum) { @@ -520,7 +520,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { break; default: - if (dir->type & 0x80) { + if (dir->type & EXFAT_TYPE_USED) { pr->print(F("Unknown dirType: 0x")); } else { pr->print(F("Unused dirType: 0x")); @@ -536,10 +536,9 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { //------------------------------------------------------------------------------ void ExFatPartition::printFat(print_t* pr) { uint32_t next; - int8_t status; pr->println(F("FAT:")); for (uint32_t cluster = 0; cluster < 16; cluster++) { - status = fatGet(cluster, &next); + int8_t status = fatGet(cluster, &next); pr->print(cluster, HEX); pr->write(' '); if (status == 0) { @@ -573,20 +572,20 @@ void ExFatPartition::printUpcase(print_t* pr) { pr->println(F("upcase not found")); return; } - for (uint16_t i = 0; i < size/2; i++) { - if ((i%256) == 0) { + for (uint16_t i = 0; i < size / 2; i++) { + if ((i % 256) == 0) { upcase = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!upcase) { pr->println(F("read upcase failed")); return; } } - if (i%16 == 0) { + if (i % 16 == 0) { pr->println(); printHex(pr, i); } pr->write(' '); - uint16_t uc = getLe16(&upcase[2*(i & 0XFF)]); + uint16_t uc = getLe16(&upcase[2 * (i & 0XFF)]); printHex(pr, uc); checksum = upcaseChecksum(uc, checksum); } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.cpp similarity index 82% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.cpp index 821ac15e..1301d4c0 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -36,14 +36,37 @@ inline bool lfnLegalChar(uint8_t c) { #if USE_UTF8_LONG_NAMES return !lfnReservedChar(c); -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES return !(lfnReservedChar(c) || c & 0X80); #endif // USE_UTF8_LONG_NAMES } //------------------------------------------------------------------------------ +bool ExFatFile::attrib(uint8_t bits) { + if (!isFileOrSubDir() || (bits & FS_ATTRIB_USER_SETTABLE) != bits) { + DBG_FAIL_MACRO; + goto fail; + } + // Don't allow read-only to be set if the file is open for write. + if ((bits & FS_ATTRIB_READ_ONLY) && isWritable()) { + DBG_FAIL_MACRO; + goto fail; + } + m_attributes = (m_attributes & ~FS_ATTRIB_USER_SETTABLE) | bits; + // insure sync() will update dir entry + m_flags |= FILE_FLAG_DIR_DIRTY; + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + return true; + +fail: + return false; +} +//------------------------------------------------------------------------------ uint8_t* ExFatFile::dirCache(uint8_t set, uint8_t options) { DirPos_t pos = m_dirPos; - if (m_vol->dirSeek(&pos, FS_DIR_SIZE*set) != 1) { + if (m_vol->dirSeek(&pos, FS_DIR_SIZE * set) != 1) { return nullptr; } return m_vol->dirCache(&pos, options); @@ -64,8 +87,8 @@ bool ExFatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { *bgnSector = firstSector(); } if (endSector) { - *endSector = firstSector() + - ((m_validLength - 1) >> m_vol->bytesPerSectorShift()); + *endSector = + firstSector() + ((m_validLength - 1) >> m_vol->bytesPerSectorShift()); } return true; } @@ -113,8 +136,8 @@ void ExFatFile::fsetpos(const fspos_t* pos) { } //------------------------------------------------------------------------------ bool ExFatFile::getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -123,13 +146,13 @@ bool ExFatFile::getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->accessTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -138,13 +161,13 @@ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->createTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -153,13 +176,11 @@ bool ExFatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->modifyTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::isBusy() { - return m_vol->isBusy(); -} +bool ExFatFile::isBusy() { return m_vol->isBusy(); } //------------------------------------------------------------------------------ bool ExFatFile::open(const char* path, oflag_t oflag) { return open(ExFatVolume::cwv(), path, oflag); @@ -202,18 +223,24 @@ bool ExFatFile::open(ExFatFile* dirFile, const char* path, oflag_t oflag) { DBG_WARN_MACRO; goto fail; } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); dirFile = &tmpDir; close(); } return openPrivate(dirFile, &fname, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ +bool ExFatFile::open(uint32_t index, oflag_t oflag) { + ExFatVolume* vol = ExFatVolume::cwv(); + return vol ? open(vol->vwd(), index, oflag) : false; +} +//------------------------------------------------------------------------------ bool ExFatFile::open(ExFatFile* dirFile, uint32_t index, oflag_t oflag) { - if (dirFile->seekSet(FS_DIR_SIZE*index) && openNext(dirFile, oflag)) { + if (dirFile->seekSet(FS_DIR_SIZE * index) && openNext(dirFile, oflag)) { if (dirIndex() == index) { return true; } @@ -223,6 +250,20 @@ bool ExFatFile::open(ExFatFile* dirFile, uint32_t index, oflag_t oflag) { return false; } //------------------------------------------------------------------------------ +bool ExFatFile::openCwd() { + if (isOpen() || !ExFatVolume::cwv()) { + DBG_FAIL_MACRO; + goto fail; + } + // *this = *ExFatVolume::cwv()->vwd(); + this->copy(ExFatVolume::cwv()->vwd()); + rewind(); + return true; + +fail: + return false; +} +//------------------------------------------------------------------------------ bool ExFatFile::openNext(ExFatFile* dir, oflag_t oflag) { if (isOpen() || !dir->isDir() || (dir->curPosition() & 0X1F)) { DBG_FAIL_MACRO; @@ -230,20 +271,18 @@ bool ExFatFile::openNext(ExFatFile* dir, oflag_t oflag) { } return openPrivate(dir, nullptr, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { int n; uint8_t modeFlags; - uint32_t curCluster __attribute__((unused)); uint8_t* cache __attribute__((unused)); DirPos_t freePos __attribute__((unused)); - - DirFile_t* dirFile; + DirFile_t* dirFile; DirStream_t* dirStream; - DirName_t* dirName; + DirName_t* dirName; uint8_t buf[FS_DIR_SIZE]; uint8_t freeCount = 0; uint8_t freeNeed = 3; @@ -272,7 +311,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { modeFlags |= oflag & O_APPEND ? FILE_FLAG_APPEND : 0; if (fname) { - freeNeed = 2 + (fname->nameLength + 14)/15; + freeNeed = 2 + (fname->nameLength + 14) / 15; dir->rewind(); } @@ -285,7 +324,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { DBG_FAIL_MACRO; goto fail; } - if (!(buf[0] & 0x80)) { + if (!(buf[0] & EXFAT_TYPE_USED)) { // Unused entry. if (freeCount == 0) { freePos.position = dir->curPosition() - FS_DIR_SIZE; @@ -294,7 +333,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { if (freeCount < freeNeed) { freeCount++; } - if (!buf[0]) { + if (buf[0] == EXFAT_TYPE_END_DIR) { if (fname) { goto create; } @@ -314,8 +353,8 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { memset(this, 0, sizeof(ExFatFile)); dirFile = reinterpret_cast(buf); m_setCount = dirFile->setCount; - m_attributes = getLe16(dirFile->attributes) & FILE_ATTR_COPY; - if (!(m_attributes & EXFAT_ATTRIB_DIRECTORY)) { + m_attributes = getLe16(dirFile->attributes) & FS_ATTRIB_COPY; + if (!(m_attributes & FS_ATTRIB_DIRECTORY)) { m_attributes |= FILE_ATTR_FILE; } m_vol = dir->volume(); @@ -353,7 +392,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { } } - found: +found: // Don't open if create only. if (oflag & O_EXCL) { DBG_FAIL_MACRO; @@ -381,14 +420,17 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { DBG_FAIL_MACRO; goto fail; } + if (isWritable()) { + m_attributes |= FS_ATTRIB_ARCHIVE; + } #endif // !EXFAT_READ_ONLY return true; - create: +create: #if EXFAT_READ_ONLY DBG_FAIL_MACRO; goto fail; -#else // EXFAT_READ_ONLY +#else // EXFAT_READ_ONLY // don't create unless O_CREAT and write if (!(oflag & O_CREAT) || !(modeFlags & FILE_FLAG_WRITE) || !fname) { DBG_WARN_MACRO; @@ -397,12 +439,12 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { while (freeCount < freeNeed) { n = dir->read(buf, FS_DIR_SIZE); if (n == 0) { - curCluster = dir->m_curCluster; + uint32_t saveCurCluster = dir->m_curCluster; if (!dir->addDirCluster()) { DBG_FAIL_MACRO; goto fail; } - dir->m_curCluster = curCluster; + dir->m_curCluster = saveCurCluster; continue; } if (n != FS_DIR_SIZE) { @@ -418,7 +460,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { freePos.isContiguous = dir->isContiguous(); memset(this, 0, sizeof(ExFatFile)); m_vol = dir->volume(); - m_attributes = FILE_ATTR_FILE; + m_attributes = FILE_ATTR_FILE | FS_ATTRIB_ARCHIVE; m_dirPos = freePos; fname->reset(); for (uint8_t i = 0; i < freeNeed; i++) { @@ -427,7 +469,7 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { DBG_FAIL_MACRO; goto fail; } - memset(cache, 0 , FS_DIR_SIZE); + memset(cache, 0, FS_DIR_SIZE); if (i == 0) { dirFile = reinterpret_cast(cache); dirFile->type = EXFAT_TYPE_FILE; @@ -445,11 +487,11 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { setLe16(dirFile->createDate, FS_DEFAULT_DATE); setLe16(dirFile->modifyDate, FS_DEFAULT_DATE); setLe16(dirFile->accessDate, FS_DEFAULT_DATE); - if (FS_DEFAULT_TIME) { - setLe16(dirFile->createTime, FS_DEFAULT_TIME); - setLe16(dirFile->modifyTime, FS_DEFAULT_TIME); - setLe16(dirFile->accessTime, FS_DEFAULT_TIME); - } + if (FS_DEFAULT_TIME) { + setLe16(dirFile->createTime, FS_DEFAULT_TIME); + setLe16(dirFile->modifyTime, FS_DEFAULT_TIME); + setLe16(dirFile->accessTime, FS_DEFAULT_TIME); + } } } else if (i == 1) { dirStream = reinterpret_cast(cache); @@ -466,14 +508,14 @@ bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { break; } uint16_t u = fname->get16(); - setLe16(dirName->unicode + 2*k, u); + setLe16(dirName->unicode + 2 * k, u); } } } return sync(); #endif // EXFAT_READ_ONLY - fail: +fail: // close file m_attributes = FILE_ATTR_CLOSED; m_flags = 0; @@ -491,12 +533,12 @@ bool ExFatFile::openRoot(ExFatVolume* vol) { m_flags = FILE_FLAG_READ; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::parsePathName(const char* path, - ExName_t* fname, const char** ptr) { +bool ExFatFile::parsePathName(const char* path, ExName_t* fname, + const char** ptr) { // Skip leading spaces. while (*path == ' ') { path++; @@ -515,20 +557,21 @@ bool ExFatFile::parsePathName(const char* path, } } // Advance to next path component. - for (; *path == ' ' || isDirSeparator(*path); path++) {} + for (; *path == ' ' || isDirSeparator(*path); path++) { + } *ptr = path; return hashName(fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ int ExFatFile::peek() { - uint64_t curPosition = m_curPosition; - uint32_t curCluster = m_curCluster; + uint64_t saveCurPosition = m_curPosition; + uint32_t saveCurCluster = m_curCluster; int c = read(); - m_curPosition = curPosition; - m_curCluster = curCluster; + m_curPosition = saveCurPosition; + m_curCluster = saveCurCluster; return c; } //------------------------------------------------------------------------------ @@ -556,8 +599,8 @@ int ExFatFile::read(void* buf, size_t count) { sectorOffset = clusterOffset & m_vol->sectorMask(); if (clusterOffset == 0) { if (m_curPosition == 0) { - m_curCluster = isRoot() - ? m_vol->rootDirectoryCluster() : m_firstCluster; + m_curCluster = + isRoot() ? m_vol->rootDirectoryCluster() : m_firstCluster; } else if (isContiguous()) { m_curCluster++; } else { @@ -578,8 +621,8 @@ int ExFatFile::read(void* buf, size_t count) { } sector = m_vol->clusterStartSector(m_curCluster) + (clusterOffset >> m_vol->bytesPerSectorShift()); - if (sectorOffset != 0 || toRead < m_vol->bytesPerSector() - || sector == m_vol->dataCacheSector()) { + if (sectorOffset != 0 || toRead < m_vol->bytesPerSector() || + sector == m_vol->dataCacheSector()) { n = m_vol->bytesPerSector() - sectorOffset; if (n > toRead) { n = toRead; @@ -593,16 +636,16 @@ int ExFatFile::read(void* buf, size_t count) { uint8_t* src = cache + sectorOffset; memcpy(dst, src, n); #if USE_MULTI_SECTOR_IO - } else if (toRead >= 2*m_vol->bytesPerSector()) { + } else if (toRead >= 2 * m_vol->bytesPerSector()) { uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); // Limit reads to current cluster. - uint32_t maxNs = m_vol->sectorsPerCluster() - - (clusterOffset >> m_vol->bytesPerSectorShift()); + uint32_t maxNs = m_vol->sectorsPerCluster() - + (clusterOffset >> m_vol->bytesPerSectorShift()); if (ns > maxNs) { ns = maxNs; } n = ns << m_vol->bytesPerSectorShift(); - if (!m_vol->cacheSafeRead(sector, dst, ns)) { + if (!m_vol->cacheSafeRead(sector, dst, ns)) { DBG_FAIL_MACRO; goto fail; } @@ -621,7 +664,7 @@ int ExFatFile::read(void* buf, size_t count) { } return count - toRead; - fail: +fail: m_error |= READ_ERROR; return -1; } @@ -634,7 +677,7 @@ bool ExFatFile::remove(const char* path) { } return file.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -684,11 +727,11 @@ bool ExFatFile::seekSet(uint64_t pos) { } } - done: +done: m_curPosition = pos; return true; - fail: +fail: m_curCluster = tmp; return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.h similarity index 78% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.h index 34154a71..93c52510 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFile.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,9 +30,10 @@ */ #include #include -#include "../common/FsDateTime.h" -#include "../common/FsApiConstants.h" + #include "../common/FmtNumber.h" +#include "../common/FsApiConstants.h" +#include "../common/FsDateTime.h" #include "../common/FsName.h" #include "ExFatPartition.h" @@ -68,25 +69,100 @@ class ExFatFile { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). */ - ExFatFile(const char* path, oflag_t oflag) { - open(path, oflag); + ExFatFile(const char* path, oflag_t oflag) { open(path, oflag); } + + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const ExFatFile* from) { + if (from != this) { +#if FILE_COPY_CONSTRUCTOR_SELECT + *this = *from; +#else // FILE_COPY_CONSTRUCTOR_SELECT + memcpy(this, from, sizeof(ExFatFile)); +#endif // FILE_COPY_CONSTRUCTOR_SELECT + } + } + /** move from to this. + * \param[in] from Source file. + */ + void move(ExFatFile* from) { + if (from != this) { + copy(from); + from->m_attributes = FILE_ATTR_CLOSED; + } } +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC + /** Copy constructor. + * \param[in] from Move from file. + * + */ + ExFatFile(const ExFatFile& from) = default; + /** Copy assignment operator. + * \param[in] from Move from file. + * \return Copied file. + */ + ExFatFile& operator=(const ExFatFile& from) = default; +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + ExFatFile(const ExFatFile& from) = default; + ExFatFile& operator=(const ExFatFile& from) = default; + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + ExFatFile(const ExFatFile& from) = delete; + ExFatFile& operator=(const ExFatFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from Move from file. + */ + ExFatFile(ExFatFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from Move from file. + * \return Moved file. + */ + ExFatFile& operator=(ExFatFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + ExFatFile(ExFatFile&& from) = delete; + ExFatFile& operator=(ExFatFile&& from) = delete; +#endif + + /** Destructor */ #if DESTRUCTOR_CLOSES_FILE ~ExFatFile() { if (isOpen()) { close(); } } +#else // DESTRUCTOR_CLOSES_FILE + ~ExFatFile() = default; #endif // DESTRUCTOR_CLOSES_FILE /** The parenthesis operator. - * - * \return true if a file is open. - */ - operator bool() { - return isOpen(); - } + * + * \return true if a file is open. + */ + operator bool() { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { return isFileOrSubDir() ? m_attributes & FS_ATTRIB_COPY : -1; } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits); /** \return The number of bytes available from the current position * to EOF for normal files. INT_MAX is returned for very large files. * @@ -102,17 +178,11 @@ class ExFatFile { /** \return The number of bytes available from the current position * to EOF for normal files. Zero is returned for directory files. */ - uint64_t available64() { - return isFile() ? fileSize() - curPosition() : 0; - } + uint64_t available64() { return isFile() ? fileSize() - curPosition() : 0; } /** Clear all error bits. */ - void clearError() { - m_error = 0; - } + void clearError() { m_error = 0; } /** Clear writeError. */ - void clearWriteError() { - m_error &= ~WRITE_ERROR; - } + void clearWriteError() { m_error &= ~WRITE_ERROR; } /** Close a file and force cached data and directory information * to be written to the storage device. * @@ -129,13 +199,14 @@ class ExFatFile { * \return true for success or false for failure. */ bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const { return m_curCluster; } /** \return The current position for a file or directory. */ - uint64_t curPosition() const {return m_curPosition;} - + uint64_t curPosition() const { return m_curPosition; } /** \return Total data length for file. */ - uint64_t dataLength() const {return m_dataLength;} + uint64_t dataLength() const { return m_dataLength; } /** \return Directory entry index. */ - uint32_t dirIndex() const {return m_dirPos.position/FS_DIR_SIZE;} + uint32_t dirIndex() const { return m_dirPos.position / FS_DIR_SIZE; } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. @@ -147,15 +218,15 @@ class ExFatFile { * * \return true if the file exists else false. */ - bool exists(const char* path) { - ExFatFile file; - return file.open(this, path, O_RDONLY); - } + bool exists(const char* path) { + ExFatFile file; + return file.open(this, path, O_RDONLY); + } /** get position for streams * \param[out] pos struct to receive position */ void fgetpos(fspos_t* pos) const; - /** + /** * Get a string from a file. * * fgets() reads bytes from a file into the array pointed to by \a str, until @@ -178,7 +249,7 @@ class ExFatFile { */ int fgets(char* str, int num, char* delim = nullptr); /** \return The total number of bytes in a file. */ - uint64_t fileSize() const {return m_validLength;} + uint64_t fileSize() const { return m_validLength; } /** \return Address of first sector or zero for empty file. */ uint32_t firstSector() const; /** Set position for streams @@ -186,7 +257,7 @@ class ExFatFile { */ void fsetpos(const fspos_t* pos); /** Arduino name for sync() */ - void flush() {sync();} + void flush() { sync(); } /** Get a file's access date and time. * * \param[out] pdate Packed date for directory entry. @@ -204,9 +275,7 @@ class ExFatFile { */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); /** \return All error bits. */ - uint8_t getError() const { - return isOpen() ? m_error : 0XFF; - } + uint8_t getError() const { return isOpen() ? m_error : 0XFF; } /** Get a file's modify date and time. * * \param[out] pdate Packed date for directory entry. @@ -220,12 +289,12 @@ class ExFatFile { * * \param[out] name An array of characters for the file's name. * \param[in] size The size of the array in characters. - * \return the name length. + * \return length for success or zero for failure. */ size_t getName(char* name, size_t size) { #if USE_UTF8_LONG_NAMES return getName8(name, size); -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES return getName7(name, size); #endif // USE_UTF8_LONG_NAMES } @@ -246,9 +315,7 @@ class ExFatFile { */ size_t getName8(char* name, size_t size); /** \return value of writeError */ - bool getWriteError() const { - return isOpen() ? m_error & WRITE_ERROR : true; - } + bool getWriteError() const { return isOpen() ? m_error & WRITE_ERROR : true; } /** * Check for FsBlockDevice busy. * @@ -256,25 +323,29 @@ class ExFatFile { */ bool isBusy(); /** \return True if the file is contiguous. */ - bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} + bool isContiguous() const { return m_flags & FILE_FLAG_CONTIGUOUS; } /** \return True if this is a directory. */ - bool isDir() const {return m_attributes & FILE_ATTR_DIR;} + bool isDir() const { return m_attributes & FILE_ATTR_DIR; } /** \return True if this is a normal file. */ - bool isFile() const {return m_attributes & FILE_ATTR_FILE;} + bool isFile() const { return m_attributes & FILE_ATTR_FILE; } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { return isFile() || isSubDir(); } /** \return True if this is a hidden. */ - bool isHidden() const {return m_attributes & FILE_ATTR_HIDDEN;} + bool isHidden() const { return m_attributes & FS_ATTRIB_HIDDEN; } /** \return true if the file is open. */ - bool isOpen() const {return m_attributes;} + bool isOpen() const { return m_attributes; } /** \return True if file is read-only */ - bool isReadOnly() const {return m_attributes & FILE_ATTR_READ_ONLY;} + bool isReadOnly() const { return m_attributes & FS_ATTRIB_READ_ONLY; } /** \return True if this is the root directory. */ - bool isRoot() const {return m_attributes & FILE_ATTR_ROOT;} + bool isRoot() const { return m_attributes & FILE_ATTR_ROOT; } /** \return True file is readable. */ - bool isReadable() const {return m_flags & FILE_FLAG_READ;} - /** \return True if this is a subdirectory. */ - bool isSubDir() const {return m_attributes & FILE_ATTR_SUBDIR;} + bool isReadable() const { return m_flags & FILE_FLAG_READ; } + /** \return True if this is a sub-directory. */ + bool isSubDir() const { return m_attributes & FILE_ATTR_SUBDIR; } + /** \return True if this is a system file. */ + bool isSystem() const { return m_attributes & FS_ATTRIB_SYSTEM; } /** \return True file is writable. */ - bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} + bool isWritable() const { return m_flags & FILE_FLAG_WRITE; } /** List directory contents. * * \param[in] pr Print stream for list. @@ -291,10 +362,10 @@ class ExFatFile { * * LS_SIZE - %Print file size. * - * LS_R - Recursive list of subdirectories. + * LS_R - Recursive list of sub-directories. * * \param[in] indent Amount of space before file name. Used for recursive - * list to indicate subdirectory level. + * list to indicate sub-directory level. * * \return true for success or false for failure. */ @@ -355,7 +426,7 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool open(ExFatFile* dirFile, const char* path, oflag_t oflag); + bool open(ExFatFile* dirFile, const char* path, oflag_t oflag = O_RDONLY); /** Open a file in the volume working directory. * * \param[in] vol Volume where the file is located. @@ -367,7 +438,7 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool open(ExFatVolume* vol, const char* path, oflag_t oflag); + bool open(ExFatVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file by index. * * \param[in] dirFile An open ExFatFile instance for the directory. @@ -381,7 +452,19 @@ class ExFatFile { * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(ExFatFile* dirFile, uint32_t index, oflag_t oflag); + bool open(ExFatFile* dirFile, uint32_t index, oflag_t oflag = O_RDONLY); + /** Open a file by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag bitwise-inclusive OR of open flags. + * See see FatFile::open(FatFile*, const char*, uint8_t). + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ + bool open(uint32_t index, oflag_t oflag = O_RDONLY); /** Open a file in the current working directory. * * \param[in] path A path with a valid name for a file to be opened. @@ -392,6 +475,11 @@ class ExFatFile { * \return true for success or false for failure. */ bool open(const char* path, oflag_t oflag = O_RDONLY); + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); /** Open the next file or subdirectory in a directory. * * \param[in] dirFile An open instance for the directory @@ -426,14 +514,14 @@ class ExFatFile { * \return true for success or false for failure. */ bool preAllocate(uint64_t length); - /** Print a file's access date and time + /** Print a file's access date and time * * \param[in] pr Print stream for output. * * \return true for success or false for failure. */ size_t printAccessDateTime(print_t* pr); - /** Print a file's creation date and time + /** Print a file's creation date and time * * \param[in] pr Print stream for output. * @@ -475,7 +563,7 @@ class ExFatFile { template size_t printField(Type value, char term) { char sign = 0; - char buf[3*sizeof(Type) + 3]; + char buf[3 * sizeof(Type) + 3]; char* str = buf + sizeof(buf); if (term) { @@ -519,7 +607,7 @@ class ExFatFile { size_t printName(print_t* pr) { #if USE_UTF8_LONG_NAMES return printName8(pr); -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES return printName7(pr); #endif // USE_UTF8_LONG_NAMES } @@ -584,14 +672,14 @@ class ExFatFile { * \return true for success or false for failure. */ bool remove(const char* path); - /** Rename a file or subdirectory. + /** Rename a file or subdirectory. * * \param[in] newPath New path name for the file/directory. * * \return true for success or false for failure. */ bool rename(const char* newPath); - /** Rename a file or subdirectory. + /** Rename a file or subdirectory. * * \param[in] dirFile Directory for the new path. * \param[in] newPath New path name for the file/directory. @@ -600,9 +688,7 @@ class ExFatFile { */ bool rename(ExFatFile* dirFile, const char* newPath); /** Set the file's current position to zero. */ - void rewind() { - seekSet(0); - } + void rewind() { seekSet(0); } /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the @@ -620,9 +706,7 @@ class ExFatFile { * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int64_t offset) { - return seekSet(m_curPosition + offset); - } + bool seekCur(int64_t offset) { return seekSet(m_curPosition + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. @@ -639,7 +723,7 @@ class ExFatFile { */ bool seekSet(uint64_t pos); /** \return directory set count */ - uint8_t setCount() const {return m_setCount;} + uint8_t setCount() const { return m_setCount; } /** The sync() call causes all modified data and directory fields * to be written to the storage device. * @@ -691,32 +775,28 @@ class ExFatFile { * \return true for success or false for failure. */ bool truncate(); - /** Truncate a file to a specified length. The current file position + /** Truncate a file to a specified length. The current file position * will be set to end of file. * * \param[in] length The desired length for the file. * * \return true for success or false for failure. */ - bool truncate(uint64_t length) { - return seekSet(length) && truncate(); - } + bool truncate(uint64_t length) { return seekSet(length) && truncate(); } /** \return The valid number of bytes in a file. */ - uint64_t validLength() const {return m_validLength;} + uint64_t validLength() const { return m_validLength; } /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use getWriteError to check for errors. * \return count of characters written for success or -1 for failure. */ - size_t write(const char* str) { - return write(str, strlen(str)); - } + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a single byte. * \param[in] b The byte to be written. * \return +1 for success or zero for failure. */ - size_t write(uint8_t b) {return write(&b, 1);} + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -744,16 +824,12 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool ls(uint8_t flags = 0) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } /** Print a file's name. * * \return length for success or zero for failure. */ - size_t printName() { - return ExFatFile::printName(&Serial); - } + size_t printName() { return ExFatFile::printName(&Serial); } #endif // ENABLE_ARDUINO_SERIAL private: @@ -767,55 +843,41 @@ class ExFatFile { bool mkdir(ExFatFile* parent, ExName_t* fname); bool openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag); - bool parsePathName(const char* path, - ExName_t* fname, const char** ptr); - uint32_t curCluster() const {return m_curCluster;} - ExFatVolume* volume() const {return m_vol;} + bool parsePathName(const char* path, ExName_t* fname, const char** ptr); + ExFatVolume* volume() const { return m_vol; } bool syncDir(); //---------------------------------------------------------------------------- static const uint8_t WRITE_ERROR = 0X1; - static const uint8_t READ_ERROR = 0X2; + static const uint8_t READ_ERROR = 0X2; /** This file has not been opened. */ static const uint8_t FILE_ATTR_CLOSED = 0; - /** File is read-only. */ - static const uint8_t FILE_ATTR_READ_ONLY = EXFAT_ATTRIB_READ_ONLY; - /** File should be hidden in directory listings. */ - static const uint8_t FILE_ATTR_HIDDEN = EXFAT_ATTRIB_HIDDEN; - /** Entry is for a system file. */ - static const uint8_t FILE_ATTR_SYSTEM = EXFAT_ATTRIB_SYSTEM; /** Entry for normal data file */ static const uint8_t FILE_ATTR_FILE = 0X08; /** Entry is for a subdirectory */ - static const uint8_t FILE_ATTR_SUBDIR = EXFAT_ATTRIB_DIRECTORY; - static const uint8_t FILE_ATTR_ARCHIVE = EXFAT_ATTRIB_ARCHIVE; + static const uint8_t FILE_ATTR_SUBDIR = FS_ATTRIB_DIRECTORY; /** Root directory */ static const uint8_t FILE_ATTR_ROOT = 0X40; /** Directory type bits */ static const uint8_t FILE_ATTR_DIR = FILE_ATTR_SUBDIR | FILE_ATTR_ROOT; - /** Attributes to copy from directory entry */ - static const uint8_t FILE_ATTR_COPY = EXFAT_ATTRIB_READ_ONLY | - EXFAT_ATTRIB_HIDDEN | EXFAT_ATTRIB_SYSTEM | - EXFAT_ATTRIB_DIRECTORY | EXFAT_ATTRIB_ARCHIVE; static const uint8_t FILE_FLAG_READ = 0X01; static const uint8_t FILE_FLAG_WRITE = 0X02; static const uint8_t FILE_FLAG_APPEND = 0X08; - static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; + static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80; - - uint64_t m_curPosition; - uint64_t m_dataLength; - uint64_t m_validLength; - uint32_t m_curCluster; - uint32_t m_firstCluster; - ExFatVolume* m_vol; - DirPos_t m_dirPos; - uint8_t m_setCount; - uint8_t m_attributes = FILE_ATTR_CLOSED; - uint8_t m_error = 0; - uint8_t m_flags = 0; + uint64_t m_curPosition; + uint64_t m_dataLength; + uint64_t m_validLength; + uint32_t m_curCluster; + uint32_t m_firstCluster; + ExFatVolume* m_vol; + DirPos_t m_dirPos; + uint8_t m_setCount; + uint8_t m_attributes = FILE_ATTR_CLOSED; + uint8_t m_error = 0; + uint8_t m_flags = 0; }; #include "../common/ArduinoFiles.h" @@ -825,7 +887,7 @@ class ExFatFile { */ class ExFile : public StreamFile { public: - /** Opens the next file or folder in a directory. + /** Opens the next file or folder in a directory. * * \param[in] oflag open flags. * \return a FatStream object. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFilePrint.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFilePrint.cpp similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFilePrint.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFilePrint.cpp index 69a9330a..38dd0f9e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFilePrint.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFilePrint.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,8 +24,8 @@ */ #define DBG_FILE "ExFatFilePrint.cpp" #include "../common/DebugMacros.h" -#include "ExFatLib.h" #include "../common/FsUtf.h" +#include "ExFatLib.h" //------------------------------------------------------------------------------ bool ExFatFile::ls(print_t* pr) { ExFatFile file; @@ -51,7 +51,7 @@ bool ExFatFile::ls(print_t* pr) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -94,7 +94,7 @@ bool ExFatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -119,13 +119,13 @@ size_t ExFatFile::printCreateDateTime(print_t* pr) { size_t ExFatFile::printFileSize(print_t* pr) { uint64_t n = m_validLength; char buf[21]; - char *str = &buf[sizeof(buf) - 1]; - char *bgn = str - 12; + char* str = &buf[sizeof(buf) - 1]; + char* bgn = str - 12; *str = '\0'; do { uint64_t m = n; n /= 10; - *--str = m - 10*n + '0'; + *--str = m - 10 * n + '0'; } while (n); while (str > bgn) { *--str = ' '; @@ -148,18 +148,17 @@ size_t ExFatFile::printName7(print_t* pr) { uint8_t in; uint8_t buf[15]; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } for (uint8_t is = 2; is <= m_setCount; is++) { - dn = reinterpret_cast - (dirCache(is, FsCache::CACHE_FOR_READ)); + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); if (!dn || dn->type != EXFAT_TYPE_NAME) { DBG_FAIL_MACRO; goto fail; } for (in = 0; in < 15; in++) { - uint16_t c = getLe16(dn->unicode + 2*in); + uint16_t c = getLe16(dn->unicode + 2 * in); if (!c) { break; } @@ -170,11 +169,11 @@ size_t ExFatFile::printName7(print_t* pr) { } return n; - fail: +fail: return 0; } //------------------------------------------------------------------------------ -size_t ExFatFile::printName8(print_t *pr) { +size_t ExFatFile::printName8(print_t* pr) { DirName_t* dn; uint16_t hs = 0; uint32_t cp; @@ -182,18 +181,17 @@ size_t ExFatFile::printName8(print_t *pr) { uint8_t in; char buf[5]; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } for (uint8_t is = 2; is <= m_setCount; is++) { - dn = reinterpret_cast - (dirCache(is, FsCache::CACHE_FOR_READ)); + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); if (!dn || dn->type != EXFAT_TYPE_NAME) { DBG_FAIL_MACRO; goto fail; } for (in = 0; in < 15; in++) { - uint16_t c = getLe16(dn->unicode + 2*in); + uint16_t c = getLe16(dn->unicode + 2 * in); if (hs) { if (!FsUtf::isLowSurrogate(c)) { DBG_FAIL_MACRO; @@ -218,11 +216,11 @@ size_t ExFatFile::printName8(print_t *pr) { DBG_FAIL_MACRO; goto fail; } - n += pr->write(buf, str - buf); + n += pr->write(reinterpret_cast(buf), str - buf); } } return n; - fail: +fail: return 0; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFileWrite.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFileWrite.cpp similarity index 92% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFileWrite.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFileWrite.cpp index 8356f42a..91977e0d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFileWrite.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFileWrite.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,7 +28,7 @@ //============================================================================== #if EXFAT_READ_ONLY bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { - (void) parent; + (void)parent; (void)path; (void)pFlag; return false; @@ -46,12 +46,8 @@ bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { (void)newPath; return false; } -bool ExFatFile::sync() { - return false; -} -bool ExFatFile::truncate() { - return false; -} +bool ExFatFile::sync() { return false; } +bool ExFatFile::truncate() { return false; } size_t ExFatFile::write(const void* buf, size_t nbyte) { (void)buf; (void)nbyte; @@ -69,7 +65,7 @@ static uint16_t exFatDirChecksum(const uint8_t* data, uint16_t checksum) { } //------------------------------------------------------------------------------ bool ExFatFile::addCluster() { - uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); + uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); if (find < 2) { DBG_FAIL_MACRO; goto fail; @@ -109,11 +105,11 @@ bool ExFatFile::addCluster() { } } - done: +done: m_curCluster = find; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -131,9 +127,9 @@ bool ExFatFile::addDirCluster() { goto fail; } sector = m_vol->clusterStartSector(m_curCluster); - for (uint32_t i = 0; i < m_vol->sectorsPerCluster(); i++) { - cache = m_vol->dataCachePrepare(sector + i, - FsCache::CACHE_RESERVE_FOR_WRITE); + for (uint32_t i = 0; i < m_vol->sectorsPerCluster(); i++) { + cache = + m_vol->dataCachePrepare(sector + i, FsCache::CACHE_RESERVE_FOR_WRITE); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -142,12 +138,12 @@ bool ExFatFile::addDirCluster() { } if (!isRoot()) { m_flags |= FILE_FLAG_DIR_DIRTY; - m_dataLength += m_vol->bytesPerCluster(); + m_dataLength += m_vol->bytesPerCluster(); m_validLength += m_vol->bytesPerCluster(); } return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -183,13 +179,14 @@ bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { goto fail; } } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); parent = &tmpDir; close(); } return mkdir(parent, &fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -204,7 +201,7 @@ bool ExFatFile::mkdir(ExFatFile* parent, ExName_t* fname) { goto fail; } // convert file to directory - m_attributes = FILE_ATTR_SUBDIR; + m_attributes = FILE_ATTR_SUBDIR | FS_ATTRIB_ARCHIVE; // allocate and zero first cluster if (!addDirCluster()) { @@ -218,7 +215,7 @@ bool ExFatFile::mkdir(ExFatFile* parent, ExName_t* fname) { m_flags = FILE_FLAG_READ | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -248,7 +245,7 @@ bool ExFatFile::preAllocate(uint64_t length) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -290,7 +287,7 @@ bool ExFatFile::remove() { // Write entry to device. return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -316,7 +313,8 @@ bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { DBG_FAIL_MACRO; goto fail; } - oldFile = *this; + // oldFile = *this; + oldFile.copy(this); m_dirPos = file.m_dirPos; m_setCount = file.m_setCount; m_flags |= FILE_FLAG_DIR_DIRTY; @@ -330,7 +328,7 @@ bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { oldFile.m_attributes = FILE_ATTR_FILE; return oldFile.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -363,7 +361,7 @@ bool ExFatFile::rmdir() { m_flags |= FILE_FLAG_WRITE; return remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -382,7 +380,7 @@ bool ExFatFile::sync() { } return true; - fail: +fail: m_error |= WRITE_ERROR; return false; } @@ -393,7 +391,7 @@ bool ExFatFile::syncDir() { uint8_t* cache; uint16_t checksum = 0; - for (uint8_t is = 0; is <= m_setCount ; is++) { + for (uint8_t is = 0; is <= m_setCount; is++) { cache = dirCache(is, FsCache::CACHE_FOR_READ); if (!cache) { DBG_FAIL_MACRO; @@ -402,7 +400,7 @@ bool ExFatFile::syncDir() { switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); - setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); + setLe16(df->attributes, m_attributes & FS_ATTRIB_COPY); if (FsDateTime::callback) { uint16_t date, time; uint8_t ms10; @@ -439,8 +437,8 @@ bool ExFatFile::syncDir() { } checksum = exFatDirChecksum(cache, checksum); } - df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); + df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -452,13 +450,14 @@ bool ExFatFile::syncDir() { } return true; - fail: +fail: m_error |= WRITE_ERROR; return false; } //------------------------------------------------------------------------------ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, - uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + uint8_t day, uint8_t hour, uint8_t minute, + uint8_t second) { DirFile_t* df; uint8_t* cache; uint16_t checksum = 0; @@ -466,16 +465,9 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, uint16_t time; uint8_t ms10; - if (!isFile() - || year < 1980 - || year > 2107 - || month < 1 - || month > 12 - || day < 1 - || day > 31 - || hour > 23 - || minute > 59 - || second > 59) { + if (!isFileOrSubDir() || year < 1980 || year > 2107 || month < 1 || + month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || + second > 59) { DBG_FAIL_MACRO; goto fail; } @@ -498,7 +490,7 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); - setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); + setLe16(df->attributes, m_attributes & FS_ATTRIB_COPY); m_vol->dataCacheDirty(); if (flags & T_ACCESS) { setLe16(df->accessTime, time); @@ -529,8 +521,8 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, } checksum = exFatDirChecksum(cache, checksum); } - df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); + df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -542,7 +534,7 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -554,7 +546,7 @@ bool ExFatFile::truncate() { goto fail; } if (m_firstCluster == 0) { - return true; + return true; } if (isContiguous()) { uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); @@ -601,7 +593,7 @@ bool ExFatFile::truncate() { m_flags |= FILE_FLAG_DIR_DIRTY; return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -708,18 +700,18 @@ size_t ExFatFile::write(const void* buf, size_t nbyte) { } } #if USE_MULTI_SECTOR_IO - } else if (toWrite >= 2*m_vol->bytesPerSector()) { + } else if (toWrite >= 2 * m_vol->bytesPerSector()) { // use multiple sector write command uint32_t ns = toWrite >> m_vol->bytesPerSectorShift(); // Limit writes to current cluster. - uint32_t maxNs = m_vol->sectorsPerCluster() - - (clusterOffset >> m_vol->bytesPerSectorShift()); + uint32_t maxNs = m_vol->sectorsPerCluster() - + (clusterOffset >> m_vol->bytesPerSectorShift()); if (ns > maxNs) { ns = maxNs; } n = ns << m_vol->bytesPerSectorShift(); if (!m_vol->cacheSafeWrite(sector, src, ns)) { - DBG_FAIL_MACRO; + DBG_FAIL_MACRO; goto fail; } #endif // USE_MULTI_SECTOR_IO @@ -748,7 +740,7 @@ size_t ExFatFile::write(const void* buf, size_t nbyte) { } return nbyte; - fail: +fail: // return for write error m_error |= WRITE_ERROR; return 0; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.cpp similarity index 88% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.cpp index f424b1f3..2710dddb 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -31,7 +31,7 @@ const uint32_t BOOT_BACKUP_OFFSET = 12; const uint16_t BYTES_PER_SECTOR = 512; const uint16_t SECTOR_MASK = BYTES_PER_SECTOR - 1; -const uint8_t BYTES_PER_SECTOR_SHIFT = 9; +const uint8_t BYTES_PER_SECTOR_SHIFT = 9; const uint16_t MINIMUM_UPCASE_SKIP = 512; const uint32_t BITMAP_CLUSTER = 2; const uint32_t UPCASE_CLUSTER = 3; @@ -41,14 +41,16 @@ const uint32_t ROOT_CLUSTER = 4; #if !PRINT_FORMAT_PROGRESS #define writeMsg(pr, str) #elif defined(__AVR__) -#define writeMsg(pr, str) if (pr) pr->print(F(str)) +#define writeMsg(pr, str) \ + if (pr) pr->print(F(str)) #else // PRINT_FORMAT_PROGRESS -#define writeMsg(pr, str) if (pr) pr->write(str) +#define writeMsg(pr, str) \ + if (pr) pr->write(str) #endif // PRINT_FORMAT_PROGRESS //------------------------------------------------------------------------------ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { #if !PRINT_FORMAT_PROGRESS -(void)pr; + (void)pr; #endif // !PRINT_FORMAT_PROGRESS MbrSector_t* mbr; ExFatPbs_t* pbs; @@ -81,14 +83,15 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { goto fail; } // Determine partition layout. - for (m = 1, vs = 0; m && sectorCount > m; m <<= 1, vs++) {} - sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; + for (m = 1, vs = 0; m && sectorCount > m; m <<= 1, vs++) { + } + sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11) / 2; sectorsPerCluster = 1UL << sectorsPerClusterShift; - fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); + fatLength = 1UL << (vs < 27 ? 13 : (vs + 1) / 2); fatOffset = fatLength; - partitionOffset = 2*fatLength; - clusterHeapOffset = 2*fatLength; - clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; + partitionOffset = 2 * fatLength; + clusterHeapOffset = 2 * fatLength; + clusterCount = (sectorCount - 4 * fatLength) >> sectorsPerClusterShift; volumeLength = clusterHeapOffset + (clusterCount << sectorsPerClusterShift); // make Master Boot Record. Use fake CHS. @@ -152,8 +155,8 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { checksum = exFatChecksum(checksum, secBuf[i]); } sector = partitionOffset; - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -165,8 +168,8 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { checksum = exFatChecksum(checksum, secBuf[i]); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -178,8 +181,8 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { checksum = exFatChecksum(checksum, secBuf[i]); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -189,15 +192,15 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i += 4) { setLe32(secBuf + i, checksum); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } // Initialize FAT. writeMsg(pr, "Writing FAT "); sector = partitionOffset + fatOffset; - ns = ((clusterCount + 2)*4 + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; + ns = ((clusterCount + 2) * 4 + BYTES_PER_SECTOR - 1) / BYTES_PER_SECTOR; memset(secBuf, 0, BYTES_PER_SECTOR); // Allocate two reserved clusters, bitmap, upcase, and root clusters. @@ -206,7 +209,7 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { secBuf[i] = 0XFF; } for (uint32_t i = 0; i < ns; i++) { - if (i%(ns/32) == 0) { + if (i % (ns / 32) == 0) { writeMsg(pr, "."); } if (!dev->writeSector(sector + i, secBuf)) { @@ -220,8 +223,8 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { writeMsg(pr, "\r\n"); // Write cluster two, bitmap. sector = partitionOffset + clusterHeapOffset; - bitmapSize = (clusterCount + 7)/8; - ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; + bitmapSize = (clusterCount + 7) / 8; + ns = (bitmapSize + BYTES_PER_SECTOR - 1) / BYTES_PER_SECTOR; if (ns > sectorsPerCluster) { DBG_FAIL_MACRO; goto fail; @@ -244,14 +247,14 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { DBG_FAIL_MACRO; goto fail; } - if (m_upcaseSize > BYTES_PER_SECTOR*sectorsPerCluster) { + if (m_upcaseSize > BYTES_PER_SECTOR * sectorsPerCluster) { DBG_FAIL_MACRO; goto fail; } // Initialize first sector of root. writeMsg(pr, "Writing root\r\n"); ns = sectorsPerCluster; - sector = partitionOffset + clusterHeapOffset + 2*sectorsPerCluster; + sector = partitionOffset + clusterHeapOffset + 2 * sectorsPerCluster; memset(secBuf, 0, BYTES_PER_SECTOR); // Unused Label entry. @@ -284,7 +287,7 @@ bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { writeMsg(pr, "Format done\r\n"); return true; - fail: +fail: writeMsg(pr, "Format failed\r\n"); return false; } @@ -334,7 +337,8 @@ bool ExFatFormatter::writeUpcase(uint32_t sector) { } ch++; } else { - for (n = ch + 1; n < 0X10000 && n == toUpcase(n); n++) {} + for (n = ch + 1; n < 0X10000 && n == toUpcase(n); n++) { + } ns = n - ch; if (ns >= MINIMUM_UPCASE_SKIP) { if (!writeUpcaseUnicode(0XFFFF) || !writeUpcaseUnicode(ns)) { @@ -358,6 +362,6 @@ bool ExFatFormatter::writeUpcase(uint32_t sector) { } return true; - fail: +fail: return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.h similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.h index 89e81e48..16ec8908 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatFormatter.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -31,6 +31,8 @@ */ class ExFatFormatter { public: + /** Constructor. */ + ExFatFormatter() = default; /** * Format an exFAT volume. * @@ -41,6 +43,7 @@ class ExFatFormatter { * \return true for success or false for failure. */ bool format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr = nullptr); + private: bool syncUpcase(); bool writeUpcase(uint32_t sector); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatLib.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatLib.h similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatLib.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatLib.h index 9a396158..26f7e708 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatLib.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,6 +24,6 @@ */ #ifndef ExFatLib_h #define ExFatLib_h -#include "ExFatVolume.h" #include "ExFatFormatter.h" +#include "ExFatVolume.h" #endif // ExFatLib_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatName.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatName.cpp similarity index 88% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatName.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatName.cpp index 32c96aff..70df62d8 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatName.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatName.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,13 +24,11 @@ */ #define DBG_FILE "ExFatName.cpp" #include "../common/DebugMacros.h" -#include "../common/upcase.h" #include "../common/FsUtf.h" +#include "../common/upcase.h" #include "ExFatLib.h" //------------------------------------------------------------------------------ -static char toUpper(char c) { - return 'a' <= c && c <= 'z' ? c - 'a' + 'A' : c; -} +static char toUpper(char c) { return 'a' <= c && c <= 'z' ? c - 'a' + 'A' : c; } //------------------------------------------------------------------------------ inline uint16_t exFatHash(char c, uint16_t hash) { uint8_t u = toUpper(c); @@ -48,16 +46,16 @@ inline uint16_t exFatHash(uint16_t u, uint16_t hash) { //------------------------------------------------------------------------------ bool ExFatFile::cmpName(const DirName_t* dirName, ExName_t* fname) { for (uint8_t i = 0; i < 15; i++) { - uint16_t u = getLe16(dirName->unicode + 2*i); + uint16_t u = getLe16(dirName->unicode + 2 * i); if (fname->atEnd()) { return u == 0; } #if USE_UTF8_LONG_NAMES uint16_t cp = fname->get16(); if (toUpcase(cp) != toUpcase(u)) { - return false; + return false; } -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES char c = fname->getch(); if (u >= 0x7F || toUpper(c) != toUpper(u)) { return false; @@ -71,18 +69,17 @@ size_t ExFatFile::getName7(char* name, size_t count) { DirName_t* dn; size_t n = 0; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } for (uint8_t is = 2; is <= m_setCount; is++) { - dn = reinterpret_cast - (dirCache(is, FsCache::CACHE_FOR_READ)); + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); if (!dn || dn->type != EXFAT_TYPE_NAME) { DBG_FAIL_MACRO; goto fail; } for (uint8_t in = 0; in < 15; in++) { - uint16_t c = getLe16(dn->unicode + 2*in); + uint16_t c = getLe16(dn->unicode + 2 * in); if (c == 0) { goto done; } @@ -93,11 +90,11 @@ size_t ExFatFile::getName7(char* name, size_t count) { name[n++] = c < 0X7F ? c : '?'; } } - done: +done: name[n] = 0; return n; - fail: +fail: *name = 0; return 0; } @@ -110,18 +107,17 @@ size_t ExFatFile::getName8(char* name, size_t count) { uint16_t hs = 0; uint32_t cp; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } for (uint8_t is = 2; is <= m_setCount; is++) { - dn = reinterpret_cast - (dirCache(is, FsCache::CACHE_FOR_READ)); + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); if (!dn || dn->type != EXFAT_TYPE_NAME) { DBG_FAIL_MACRO; goto fail; } for (uint8_t in = 0; in < 15; in++) { - uint16_t c = getLe16(dn->unicode + 2*in); + uint16_t c = getLe16(dn->unicode + 2 * in); if (hs) { if (!FsUtf::isLowSurrogate(c)) { DBG_FAIL_MACRO; @@ -150,11 +146,11 @@ size_t ExFatFile::getName8(char* name, size_t count) { str = ptr; } } - done: +done: *str = '\0'; return str - name; - fail: +fail: *name = 0; return 0; } @@ -167,13 +163,13 @@ bool ExFatFile::hashName(ExName_t* fname) { while (!fname->atEnd()) { uint16_t u = fname->get16(); if (u == 0XFFFF) { - DBG_FAIL_MACRO; + DBG_FAIL_MACRO; goto fail; } hash = exFatHash(u, hash); fname->nameLength++; } -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES while (!fname->atEnd()) { // Convert to byte for smaller exFatHash. char c = fname->getch(); @@ -188,7 +184,6 @@ bool ExFatFile::hashName(ExName_t* fname) { } return true; - fail: +fail: return false; } - diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.cpp similarity index 87% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.cpp index dbb00327..2d22b11f 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -39,8 +39,8 @@ uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { uint8_t* cache; uint8_t mask = 1 << (start & 7); while (true) { - uint32_t sector = m_clusterHeapStartSector + - (endAlloc >> (m_bytesPerSectorShift + 3)); + uint32_t sector = + m_clusterHeapStartSector + (endAlloc >> (m_bytesPerSectorShift + 3)); cache = bitmapCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { return 0; @@ -75,8 +75,8 @@ uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { return 0; } //------------------------------------------------------------------------------ -bool ExFatPartition::bitmapModify(uint32_t cluster, - uint32_t count, bool value) { +bool ExFatPartition::bitmapModify(uint32_t cluster, uint32_t count, + bool value) { uint32_t sector; uint32_t start = cluster - 2; size_t i; @@ -88,7 +88,7 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, goto fail; } if (value) { - if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { + if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { m_bitmapStart = (start + count) < m_clusterCount ? start + count : 0; } } else { @@ -97,8 +97,7 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, } } mask = 1 << (start & 7); - sector = m_clusterHeapStartSector + - (start >> (m_bytesPerSectorShift + 3)); + sector = m_clusterHeapStartSector + (start >> (m_bytesPerSectorShift + 3)); i = (start >> 3) & m_sectorMask; while (true) { cache = bitmapCachePrepare(sector++, FsCache::CACHE_FOR_WRITE); @@ -122,7 +121,7 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, i = 0; } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -130,7 +129,7 @@ uint32_t ExFatPartition::chainSize(uint32_t cluster) { uint32_t n = 0; int8_t status; do { - status = fatGet(cluster, & cluster); + status = fatGet(cluster, &cluster); if (status < 0) return 0; n++; } while (status); @@ -203,7 +202,7 @@ bool ExFatPartition::fatPut(uint32_t cluster, uint32_t value) { setLe32(cache + ((cluster << 2) & m_sectorMask), value); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -233,11 +232,11 @@ bool ExFatPartition::freeChain(uint32_t cluster) { return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -uint32_t ExFatPartition::freeClusterCount() { +int32_t ExFatPartition::freeClusterCount() { uint32_t nc = 0; uint32_t sector = m_clusterHeapStartSector; uint32_t usedCount = 0; @@ -246,13 +245,13 @@ uint32_t ExFatPartition::freeClusterCount() { while (true) { cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!cache) { - return 0; + return -1; } for (size_t i = 0; i < m_bytesPerSector; i++) { if (cache[i] == 0XFF) { - usedCount+= 8; + usedCount += 8; } else if (cache[i]) { - for (uint8_t mask = 1; mask ; mask <<=1) { + for (uint8_t mask = 1; mask; mask <<= 1) { if ((mask & cache[i])) { usedCount++; } @@ -266,37 +265,39 @@ uint32_t ExFatPartition::freeClusterCount() { } } //------------------------------------------------------------------------------ -bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part) { - uint32_t volStart = 0; - uint8_t* cache; +bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part, uint32_t volStart) { pbs_t* pbs; BpbExFat_t* bpb; MbrSector_t* mbr; - MbrPart_t* mp; - m_fatType = 0; m_blockDev = dev; cacheInit(m_blockDev); - cache = dataCachePrepare(0, FsCache::CACHE_FOR_READ); - if (part > 4 || !cache) { - DBG_FAIL_MACRO; - goto fail; - } - if (part >= 1) { - mbr = reinterpret_cast(cache); - mp = &mbr->part[part - 1]; - if ((mp->boot != 0 && mp->boot != 0X80) || mp->type == 0) { + // if part == 0 assume super floppy with FAT boot sector in sector zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4) { + DBG_FAIL_MACRO; + goto fail; + } + mbr = reinterpret_cast( + dataCachePrepare(0, FsCache::CACHE_FOR_READ)); + if (!mbr) { + DBG_FAIL_MACRO; + goto fail; + } + MbrPart_t* mp = mbr->part + part - 1; + if (mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { DBG_FAIL_MACRO; goto fail; } volStart = getLe32(mp->relativeSectors); - cache = dataCachePrepare(volStart, FsCache::CACHE_FOR_READ); - if (!cache) { - DBG_FAIL_MACRO; - goto fail; - } } - pbs = reinterpret_cast(cache); + pbs = reinterpret_cast( + dataCachePrepare(volStart, FsCache::CACHE_FOR_READ)); + if (!pbs) { + DBG_FAIL_MACRO; + goto fail; + } if (strncmp(pbs->oemName, "EXFAT", 5)) { DBG_FAIL_MACRO; goto fail; @@ -320,7 +321,7 @@ bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part) { m_fatType = FAT_TYPE_EXFAT; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.h similarity index 78% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.h index 464251ef..b7ecf757 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatPartition.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatPartition.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,10 +28,10 @@ * \file * \brief ExFatPartition include file. */ -#include "../common/SysCall.h" #include "../common/FsBlockDevice.h" #include "../common/FsCache.h" #include "../common/FsStructs.h" +#include "../common/SysCall.h" /** Set EXFAT_READ_ONLY non-zero for read only */ #ifndef EXFAT_READ_ONLY #define EXFAT_READ_ONLY 0 @@ -51,7 +51,7 @@ struct DirPos_t { /** offset */ uint32_t position; /** directory is contiguous */ - bool isContiguous; + bool isContiguous; }; //============================================================================== /** @@ -60,28 +60,26 @@ struct DirPos_t { */ class ExFatPartition { public: - ExFatPartition() {} + ExFatPartition() = default; /** \return the number of bytes in a cluster. */ - uint32_t bytesPerCluster() const {return m_bytesPerCluster;} + uint32_t bytesPerCluster() const { return m_bytesPerCluster; } /** \return the power of two for bytesPerCluster. */ uint8_t bytesPerClusterShift() const { return m_bytesPerSectorShift + m_sectorsPerClusterShift; } /** \return the number of bytes in a sector. */ - uint16_t bytesPerSector() const {return m_bytesPerSector;} + uint16_t bytesPerSector() const { return m_bytesPerSector; } /** \return the power of two for bytesPerSector. */ - uint8_t bytesPerSectorShift() const {return m_bytesPerSectorShift;} + uint8_t bytesPerSectorShift() const { return m_bytesPerSectorShift; } /** Clear the cache and returns a pointer to the cache. Not for normal apps. * \return A pointer to the cache buffer or zero if an error occurs. */ - uint8_t* cacheClear() { - return m_dataCache.clear(); - } + uint8_t* cacheClear() { return m_dataCache.clear(); } /** \return the cluster count for the partition. */ - uint32_t clusterCount() const {return m_clusterCount;} + uint32_t clusterCount() const { return m_clusterCount; } /** \return the cluster heap start sector. */ - uint32_t clusterHeapStartSector() const {return m_clusterHeapStartSector;} + uint32_t clusterHeapStartSector() const { return m_clusterHeapStartSector; } /** End access to volume * \return pointer to sector size buffer for format. */ @@ -90,47 +88,48 @@ class ExFatPartition { return cacheClear(); } /** \return the FAT length in sectors */ - uint32_t fatLength() const {return m_fatLength;} + uint32_t fatLength() const { return m_fatLength; } /** \return the FAT start sector number. */ - uint32_t fatStartSector() const {return m_fatStartSector;} + uint32_t fatStartSector() const { return m_fatStartSector; } /** \return Type FAT_TYPE_EXFAT for exFAT partition or zero for error. */ - uint8_t fatType() const {return m_fatType;} - /** \return the free cluster count. */ - uint32_t freeClusterCount(); + uint8_t fatType() const { return m_fatType; } + /** \return free cluster count or -1 if an error occurs. */ + int32_t freeClusterCount(); /** Initialize a exFAT partition. * \param[in] dev The blockDevice for the partition. * \param[in] part The partition to be used. Legal values for \a part are * 1-4 to use the corresponding partition on a device formatted with * a MBR, Master Boot Record, or zero if the device is formatted as - * a super floppy with the FAT boot sector in sector zero. + * a super floppy with the FAT boot sector in sector volStart. + * \param[in] volStart location of volume if part is zero. * * \return true for success or false for failure. */ - bool init(FsBlockDevice* dev, uint8_t part); + bool init(FsBlockDevice* dev, uint8_t part, uint32_t volStart = 0); /** * Check for device busy. * * \return true if busy else false. */ - bool isBusy() {return m_blockDev->isBusy();} + bool isBusy() { return m_blockDev->isBusy(); } /** \return the root directory start cluster number. */ - uint32_t rootDirectoryCluster() const {return m_rootDirectoryCluster;} + uint32_t rootDirectoryCluster() const { return m_rootDirectoryCluster; } /** \return the root directory length. */ uint32_t rootLength(); /** \return the number of sectors in a cluster. */ - uint32_t sectorsPerCluster() const {return 1UL << m_sectorsPerClusterShift;} + uint32_t sectorsPerCluster() const { return 1UL << m_sectorsPerClusterShift; } #ifndef DOXYGEN_SHOULD_SKIP_THIS uint32_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** \return the power of two for sectors per cluster. */ - uint8_t sectorsPerClusterShift() const {return m_sectorsPerClusterShift;} + uint8_t sectorsPerClusterShift() const { return m_sectorsPerClusterShift; } //---------------------------------------------------------------------------- #ifndef DOXYGEN_SHOULD_SKIP_THIS void checkUpcase(print_t* pr); bool printDir(print_t* pr, ExFatFile* file); void dmpBitmap(print_t* pr); - void dmpCluster(print_t* pr, uint32_t cluster, - uint32_t offset, uint32_t count); + void dmpCluster(print_t* pr, uint32_t cluster, uint32_t offset, + uint32_t count); void dmpFat(print_t* pr, uint32_t start, uint32_t count); void dmpSector(print_t* pr, uint32_t sector); bool printVolInfo(print_t* pr); @@ -148,7 +147,7 @@ class ExFatPartition { uint8_t* bitmapCachePrepare(uint32_t sector, uint8_t option) { #if USE_EXFAT_BITMAP_CACHE return m_bitmapCache.prepare(sector, option); -#else // USE_EXFAT_BITMAP_CACHE +#else // USE_EXFAT_BITMAP_CACHE return m_dataCache.prepare(sector, option); #endif // USE_EXFAT_BITMAP_CACHE } @@ -161,19 +160,19 @@ class ExFatPartition { bool cacheSync() { #if USE_EXFAT_BITMAP_CACHE return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); -#else // USE_EXFAT_BITMAP_CACHE +#else // USE_EXFAT_BITMAP_CACHE return m_dataCache.sync() && syncDevice(); #endif // USE_EXFAT_BITMAP_CACHE } - void dataCacheDirty() {m_dataCache.dirty();} - void dataCacheInvalidate() {m_dataCache.invalidate();} + void dataCacheDirty() { m_dataCache.dirty(); } + void dataCacheInvalidate() { m_dataCache.invalidate(); } uint8_t* dataCachePrepare(uint32_t sector, uint8_t option) { return m_dataCache.prepare(sector, option); } - uint32_t dataCacheSector() {return m_dataCache.sector();} - bool dataCacheSync() {return m_dataCache.sync();} + uint32_t dataCacheSector() { return m_dataCache.sector(); } + bool dataCacheSync() { return m_dataCache.sync(); } //---------------------------------------------------------------------------- - uint32_t clusterMask() const {return m_clusterMask;} + uint32_t clusterMask() const { return m_clusterMask; } uint32_t clusterStartSector(uint32_t cluster) { return m_clusterHeapStartSector + ((cluster - 2) << m_sectorsPerClusterShift); @@ -184,10 +183,8 @@ class ExFatPartition { bool fatPut(uint32_t cluster, uint32_t value); uint32_t chainSize(uint32_t cluster); bool freeChain(uint32_t cluster); - uint16_t sectorMask() const {return m_sectorMask;} - bool syncDevice() { - return m_blockDev->syncDevice(); - } + uint16_t sectorMask() const { return m_sectorMask; } + bool syncDevice() { return m_blockDev->syncDevice(); } bool cacheSafeRead(uint32_t sector, uint8_t* dst) { return m_dataCache.cacheSafeRead(sector, dst); } @@ -198,7 +195,7 @@ class ExFatPartition { return m_dataCache.cacheSafeRead(sector, dst, count); } bool cacheSafeWrite(uint32_t sector, const uint8_t* src, size_t count) { - return m_dataCache.cacheSafeWrite(sector, src, count); + return m_dataCache.cacheSafeWrite(sector, src, count); } bool readSector(uint32_t sector, uint8_t* dst) { return m_blockDev->readSector(sector, dst); @@ -207,14 +204,14 @@ class ExFatPartition { return m_blockDev->writeSector(sector, src); } //---------------------------------------------------------------------------- - static const uint8_t m_bytesPerSectorShift = 9; + static const uint8_t m_bytesPerSectorShift = 9; static const uint16_t m_bytesPerSector = 1 << m_bytesPerSectorShift; static const uint16_t m_sectorMask = m_bytesPerSector - 1; //---------------------------------------------------------------------------- #if USE_EXFAT_BITMAP_CACHE - FsCache m_bitmapCache; + FsCache m_bitmapCache; #endif // USE_EXFAT_BITMAP_CACHE - FsCache m_dataCache; + FsCache m_dataCache; uint32_t m_bitmapStart; uint32_t m_fatStartSector; uint32_t m_fatLength; @@ -224,7 +221,7 @@ class ExFatPartition { uint32_t m_clusterMask; uint32_t m_bytesPerCluster; FsBlockDevice* m_blockDev; - uint8_t m_fatType = 0; - uint8_t m_sectorsPerClusterShift; + uint8_t m_fatType = 0; + uint8_t m_sectorsPerClusterShift; }; #endif // ExFatPartition_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.cpp similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.cpp index 3b32be5f..10e7f9a3 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -37,9 +37,10 @@ bool ExFatVolume::chdir(const char* path) { DBG_FAIL_MACRO; goto fail; } - m_vwd = dir; + // m_vwd = dir; + m_vwd.copy(&dir); return true; - fail: +fail: return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.h b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.h similarity index 84% rename from extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.h index 3c06dab7..335cba6e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/ExFatLib/ExFatVolume.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/ExFatLib/ExFatVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -33,15 +33,36 @@ class ExFatVolume : public ExFatPartition { public: ExFatVolume() {} + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + ExFatFile tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib() : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + ExFatFile tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib(bits) : false; + } /** * Initialize an FatVolume object. * \param[in] dev Device block driver. * \param[in] setCwv Set current working volume if true. - * \param[in] part partition to initialize. + * \param[in] part Partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1) { - if (!init(dev, part)) { + bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0) { + if (!init(dev, part, volStart)) { return false; } if (!chdir()) { @@ -68,7 +89,7 @@ class ExFatVolume : public ExFatPartition { bool chdir(const char* path); /** Change global working volume to this volume. */ - void chvol() {m_cwv = this;} + void chvol() { m_cwv = this; } /** * Test for the existence of a file. @@ -96,9 +117,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(print_t* pr, uint8_t flags = 0) { - return m_vwd.ls(pr, flags); - } + bool ls(print_t* pr, uint8_t flags = 0) { return m_vwd.ls(pr, flags); } /** List the contents of a directory. * * \param[in] pr Print stream for list. @@ -202,10 +221,8 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls() { - return ls(&Serial); - } - /** List the directory contents of the volume root to Serial. + bool ls() { return ls(&Serial); } + /** List the directory contents of the volume root to Serial. * * \param[in] flags The inclusive OR of * @@ -217,9 +234,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -244,18 +259,14 @@ class ExFatVolume : public ExFatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } + bool chdir(const String& path) { return chdir(path.c_str()); } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String &path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. @@ -264,7 +275,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool mkdir(const String &path, bool pFlag = true) { + bool mkdir(const String& path, bool pFlag = true) { return mkdir(path.c_str(), pFlag); } /** open a file @@ -273,7 +284,7 @@ class ExFatVolume : public ExFatPartition { * \param[in] oflag open oflag flags. * \return a ExFile object. */ - ExFile open(const String &path, oflag_t oflag = O_RDONLY) { + ExFile open(const String& path, oflag_t oflag = O_RDONLY) { return open(path.c_str(), oflag); } /** Remove a file from the volume root directory. @@ -282,9 +293,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool remove(const String& path) { - return remove(path.c_str()); - } + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -310,9 +319,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool rmdir(const String& path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Truncate a file to a specified length. The current file position * will be at the new EOF. * @@ -328,8 +335,8 @@ class ExFatVolume : public ExFatPartition { private: friend ExFatFile; - static ExFatVolume* cwv() {return m_cwv;} - ExFatFile* vwd() {return &m_vwd;} + static ExFatVolume* cwv() { return m_cwv; } + ExFatFile* vwd() { return &m_vwd; } static ExFatVolume* m_cwv; ExFatFile m_vwd; }; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatDbg.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatDbg.cpp similarity index 91% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatDbg.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatDbg.cpp index 01686021..47d46f92 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatDbg.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatDbg.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -27,11 +27,11 @@ //------------------------------------------------------------------------------ static uint16_t getLfnChar(DirLfn_t* ldir, uint8_t i) { if (i < 5) { - return getLe16(ldir->unicode1 + 2*i); + return getLe16(ldir->unicode1 + 2 * i); } else if (i < 11) { - return getLe16(ldir->unicode2 + 2*i - 10); + return getLe16(ldir->unicode2 + 2 * (i - 5)); } else if (i < 13) { - return getLe16(ldir->unicode3 + 2*i - 22); + return getLe16(ldir->unicode3 + 2 * (i - 11)); } return 0; } @@ -58,7 +58,7 @@ static void printHex(print_t* pr, uint8_t w, uint16_t h) { static void printHex(print_t* pr, uint16_t val) { bool space = true; for (uint8_t i = 0; i < 4; i++) { - uint8_t h = (val >> (12 - 4*i)) & 15; + uint8_t h = (val >> (12 - 4 * i)) & 15; if (h || i == 3) { space = false; } @@ -73,7 +73,7 @@ static void printHex(print_t* pr, uint16_t val) { static void printHex(print_t* pr, uint32_t val) { bool space = true; for (uint8_t i = 0; i < 8; i++) { - uint8_t h = (val >> (28 - 4*i)) & 15; + uint8_t h = (val >> (28 - 4 * i)) & 15; if (h || i == 7) { space = false; } @@ -85,7 +85,7 @@ static void printHex(print_t* pr, uint32_t val) { } } //------------------------------------------------------------------------------ -template +template static void printHexLn(print_t* pr, Uint val) { printHex(pr, val); pr->println(); @@ -98,7 +98,7 @@ static bool printFatDir(print_t* pr, DirFat_t* dir) { return false; } else if (dir->name[0] == FAT_NAME_DELETED) { pr->println(F("Deleted")); - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { pr->print(F("SFN: ")); for (uint8_t i = 0; i < 11; i++) { printHex(pr, dir->name[i]); @@ -111,13 +111,13 @@ static bool printFatDir(print_t* pr, DirFat_t* dir) { printHexLn(pr, dir->attributes); pr->print(F("caseFlags: 0X")); printHexLn(pr, dir->caseFlags); - uint32_t fc = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) - | getLe16(dir->firstClusterLow); + uint32_t fc = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) | + getLe16(dir->firstClusterLow); pr->print(F("firstCluster: ")); pr->println(fc, HEX); pr->print(F("fileSize: ")); pr->println(getLe32(dir->fileSize)); - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { pr->print(F("LFN: ")); for (uint8_t i = 0; i < 13; i++) { uint16_t c = getLfnChar(ldir, i); @@ -175,7 +175,7 @@ void FatFile::dmpFile(print_t* pr, uint32_t pos, size_t n) { } pr->write(' '); printHex(pr, 2, h); - text[i&15] = ' ' <= h && h < 0X7F ? h : '.'; + text[i & 15] = ' ' <= h && h < 0X7F ? h : '.'; } pr->write('\r'); pr->write('\n'); @@ -215,7 +215,7 @@ void FatPartition::dmpSector(print_t* pr, uint32_t sector, uint8_t bits) { return; } for (uint16_t i = 0; i < m_bytesPerSector;) { - if (i%32 == 0) { + if (i % 32 == 0) { if (i) { pr->println(); } @@ -243,7 +243,7 @@ void FatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } pr->println(F("FAT:")); uint32_t sector = m_fatStartSector + start; - uint32_t cluster = nf*start; + uint32_t cluster = nf * start; for (uint32_t i = 0; i < count; i++) { uint8_t* pc = fatCachePrepare(sector + i, FsCache::CACHE_FOR_READ); if (!pc) { @@ -251,7 +251,7 @@ void FatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { return; } for (size_t k = 0; k < nf; k++) { - if (0 == cluster%8) { + if (0 == cluster % 8) { if (k) { pr->println(); } @@ -259,7 +259,7 @@ void FatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } cluster++; pr->write(' '); - uint32_t v = fatType() == 32 ? getLe32(pc + 4*k) : getLe16(pc + 2*k); + uint32_t v = fatType() == 32 ? getLe32(pc + 4 * k) : getLe16(pc + 2 * k); printHex(pr, v); } pr->println(); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.cpp similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.cpp index c04e121c..d23efeed 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -42,9 +42,9 @@ bool FatFile::addCluster() { m_flags |= FILE_FLAG_DIR_DIRTY; return true; - fail: +fail: return false; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS m_flags |= FILE_FLAG_DIR_DIRTY; return m_vol->allocateCluster(m_curCluster, &m_curCluster); #endif // USE_FAT_FILE_FLAG_CONTIGUOUS @@ -61,7 +61,7 @@ bool FatFile::addDirCluster() { goto fail; } // max folder size - if (m_curPosition >= 512UL*4095) { + if (m_curPosition >= 512UL * 4095) { DBG_FAIL_MACRO; goto fail; } @@ -82,7 +82,30 @@ bool FatFile::addDirCluster() { m_curPosition += m_vol->bytesPerCluster(); return true; - fail: +fail: + return false; +} +//------------------------------------------------------------------------------ +bool FatFile::attrib(uint8_t bits) { + if (!isFileOrSubDir() || (bits & FS_ATTRIB_USER_SETTABLE) != bits) { + DBG_FAIL_MACRO; + goto fail; + } + // Don't allow read-only to be set if the file is open for write. + if ((bits & FS_ATTRIB_READ_ONLY) && isWritable()) { + DBG_FAIL_MACRO; + goto fail; + } + m_attributes = (m_attributes & ~FS_ATTRIB_USER_SETTABLE) | bits; + // insure sync() will update dir entry + m_flags |= FILE_FLAG_DIR_DIRTY; + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + return true; + +fail: return false; } //------------------------------------------------------------------------------ @@ -97,7 +120,7 @@ DirFat_t* FatFile::cacheDirEntry(uint8_t action) { } return dir + (m_dirIndex & 0XF); - fail: +fail: return nullptr; } //------------------------------------------------------------------------------ @@ -114,7 +137,7 @@ bool FatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { DBG_FAIL_MACRO; goto fail; } - for (uint32_t c = m_firstCluster; ; c++) { + for (uint32_t c = m_firstCluster;; c++) { uint32_t next; int8_t fg = m_vol->fatGet(c, &next); if (fg < 0) { @@ -135,14 +158,14 @@ bool FatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { *bgnSector = m_vol->clusterStartSector(m_firstCluster); } if (endSector) { - *endSector = m_vol->clusterStartSector(c) - + m_vol->sectorsPerCluster() - 1; + *endSector = + m_vol->clusterStartSector(c) + m_vol->sectorsPerCluster() - 1; } return true; } } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -155,12 +178,12 @@ bool FatFile::createContiguous(const char* path, uint32_t size) { return true; } close(); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::createContiguous(FatFile* dirFile, - const char* path, uint32_t size) { +bool FatFile::createContiguous(FatFile* dirFile, const char* path, + uint32_t size) { if (!open(dirFile, path, O_CREAT | O_EXCL | O_RDWR)) { DBG_FAIL_MACRO; goto fail; @@ -169,7 +192,7 @@ bool FatFile::createContiguous(FatFile* dirFile, return true; } close(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -190,7 +213,7 @@ bool FatFile::dirEntry(DirFat_t* dst) { memcpy(dst, dir, sizeof(DirFat_t)); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -200,7 +223,7 @@ uint32_t FatFile::dirSize() { return 0; } if (isRootFixed()) { - return FS_DIR_SIZE*m_vol->rootDirEntryCount(); + return FS_DIR_SIZE * m_vol->rootDirEntryCount(); } uint16_t n = 0; uint32_t c = isRoot32() ? m_vol->rootDirStart() : m_firstCluster; @@ -211,7 +234,7 @@ uint32_t FatFile::dirSize() { } n += m_vol->sectorsPerCluster(); } while (fg); - return 512UL*n; + return 512UL * n; } //------------------------------------------------------------------------------ int FatFile::fgets(char* str, int num, char* delim) { @@ -265,7 +288,7 @@ bool FatFile::getAccessDate(uint16_t* pdate) { *pdate = getLe16(dir.accessDate); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -279,7 +302,7 @@ bool FatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(dir.createTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -293,13 +316,11 @@ bool FatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(dir.modifyTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::isBusy() { - return m_vol->isBusy(); -} +bool FatFile::isBusy() { return m_vol->isBusy(); } //------------------------------------------------------------------------------ bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { FatName_t fname; @@ -333,13 +354,14 @@ bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { goto fail; } } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); parent = &tmpDir; close(); } return mkdir(parent, &fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -382,7 +404,7 @@ bool FatFile::mkdir(FatFile* parent, FatName_t* fname) { goto fail; } // change directory entry attribute - dir->attributes = FAT_ATTRIB_DIRECTORY; + dir->attributes = FS_ATTRIB_DIRECTORY; // make entry for '.' memcpy(&dot, dir, sizeof(dot)); @@ -410,7 +432,7 @@ bool FatFile::mkdir(FatFile* parent, FatName_t* fname) { // write first sector return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -456,16 +478,22 @@ bool FatFile::open(FatFile* dirFile, const char* path, oflag_t oflag) { DBG_WARN_MACRO; goto fail; } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); dirFile = &tmpDir; close(); } return open(dirFile, &fname, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ +bool FatFile::open(uint16_t index, oflag_t oflag) { + FatVolume* vol = FatVolume::cwv(); + return vol ? open(vol->vwd(), index, oflag) : false; +} +//------------------------------------------------------------------------------ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { if (index) { // Find start of LFN. @@ -481,7 +509,7 @@ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { break; } if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { - if (!dirFile->seekSet(32UL*(index - i))) { + if (!dirFile->seekSet(32UL * (index - i))) { DBG_FAIL_MACRO; goto fail; } @@ -502,7 +530,7 @@ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -519,12 +547,12 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, dir += 0XF & dirIndex; // Must be file or subdirectory. - if (!isFileOrSubdir(dir)) { + if (!isFatFileOrSubdir(dir)) { DBG_FAIL_MACRO; goto fail; } - m_attributes = dir->attributes & FILE_ATTR_COPY; - if (isFileDir(dir)) { + m_attributes = dir->attributes & FS_ATTRIB_COPY; + if (isFatFile(dir)) { m_attributes |= FILE_ATTR_FILE; } m_lfnOrd = lfnOrd; @@ -556,21 +584,21 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, DBG_FAIL_MACRO; goto fail; } + m_attributes |= FS_ATTRIB_ARCHIVE; } m_flags |= (oflag & O_APPEND ? FILE_FLAG_APPEND : 0); m_dirSector = m_vol->cacheSectorNumber(); // copy first cluster number for directory fields - firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) - | getLe16(dir->firstClusterLow); + firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) | + getLe16(dir->firstClusterLow); if (oflag & O_TRUNC) { if (firstCluster && !m_vol->freeChain(firstCluster)) { DBG_FAIL_MACRO; goto fail; } - // need to update directory entry m_flags |= FILE_FLAG_DIR_DIRTY; } else { @@ -583,7 +611,7 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, } return true; - fail: +fail: m_attributes = FILE_ATTR_CLOSED; m_flags = 0; return false; @@ -601,6 +629,20 @@ bool FatFile::openCluster(FatFile* file) { return true; } //------------------------------------------------------------------------------ +bool FatFile::openCwd() { + if (isOpen() || !FatVolume::cwv()) { + DBG_FAIL_MACRO; + goto fail; + } + // *this = *FatVolume::cwv()->vwd(); + this->copy(FatVolume::cwv()->vwd()); + rewind(); + return true; + +fail: + return false; +} +//------------------------------------------------------------------------------ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { uint8_t checksum = 0; DirLfn_t* ldir; @@ -614,7 +656,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { } while (1) { // read entry into cache - index = dirFile->curPosition()/FS_DIR_SIZE; + index = dirFile->curPosition() / FS_DIR_SIZE; DirFat_t* dir = dirFile->readDirCache(); if (!dir) { if (dirFile->getError()) { @@ -629,7 +671,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { // skip empty slot or '.' or '..' if (dir->name[0] == '.' || dir->name[0] == FAT_NAME_DELETED) { lfnOrd = 0; - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (lfnOrd && checksum != lfnChecksum(dir->name)) { DBG_FAIL_MACRO; goto fail; @@ -639,7 +681,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { goto fail; } return true; - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { lfnOrd = ldir->order & 0X1F; @@ -650,7 +692,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { } } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -665,34 +707,34 @@ bool FatFile::openRoot(FatVolume* vol) { m_vol = vol; switch (vol->fatType()) { #if FAT12_SUPPORT - case 12: + case 12: #endif // FAT12_SUPPORT - case 16: - m_attributes = FILE_ATTR_ROOT_FIXED; - break; + case 16: + m_attributes = FILE_ATTR_ROOT_FIXED; + break; - case 32: - m_attributes = FILE_ATTR_ROOT32; - break; + case 32: + m_attributes = FILE_ATTR_ROOT32; + break; - default: - DBG_FAIL_MACRO; - goto fail; + default: + DBG_FAIL_MACRO; + goto fail; } // read only m_flags = FILE_FLAG_READ; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ int FatFile::peek() { - uint32_t curPosition = m_curPosition; - uint32_t curCluster = m_curCluster; + uint32_t saveCurPosition = m_curPosition; + uint32_t saveCurCluster = m_curCluster; int c = read(); - m_curPosition = curPosition; - m_curCluster = curCluster; + m_curPosition = saveCurPosition; + m_curCluster = saveCurCluster; return c; } //------------------------------------------------------------------------------ @@ -713,13 +755,13 @@ bool FatFile::preAllocate(uint32_t length) { #if USE_FAT_FILE_FLAG_CONTIGUOUS // Mark contiguous and insure sync() will update dir entry m_flags |= FILE_FLAG_PREALLOCATE | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS // insure sync() will update dir entry m_flags |= FILE_FLAG_DIR_DIRTY; #endif // USE_FAT_FILE_FLAG_CONTIGUOUS return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -744,7 +786,7 @@ int FatFile::read(void* buf, size_t nbyte) { } } else if (isRootFixed()) { uint16_t tmp16 = - FS_DIR_SIZE*m_vol->m_rootDirEntryCount - (uint16_t)m_curPosition; + FS_DIR_SIZE * m_vol->m_rootDirEntryCount - (uint16_t)m_curPosition; if (nbyte > tmp16) { nbyte = tmp16; } @@ -754,8 +796,8 @@ int FatFile::read(void* buf, size_t nbyte) { size_t n; offset = m_curPosition & m_vol->sectorMask(); // offset in sector if (isRootFixed()) { - sector = m_vol->rootDirStart() - + (m_curPosition >> m_vol->bytesPerSectorShift()); + sector = m_vol->rootDirStart() + + (m_curPosition >> m_vol->bytesPerSectorShift()); } else { sectorOfCluster = m_vol->sectorOfCluster(m_curPosition); if (offset == 0 && sectorOfCluster == 0) { @@ -785,8 +827,8 @@ int FatFile::read(void* buf, size_t nbyte) { } sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; } - if (offset != 0 || toRead < m_vol->bytesPerSector() - || sector == m_vol->cacheSectorNumber()) { + if (offset != 0 || toRead < m_vol->bytesPerSector() || + sector == m_vol->cacheSectorNumber()) { // amount to be read from current sector n = m_vol->bytesPerSector() - offset; if (n > toRead) { @@ -801,7 +843,7 @@ int FatFile::read(void* buf, size_t nbyte) { uint8_t* src = pc + offset; memcpy(dst, src, n); #if USE_MULTI_SECTOR_IO - } else if (toRead >= 2*m_vol->bytesPerSector()) { + } else if (toRead >= 2 * m_vol->bytesPerSector()) { uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); if (!isRootFixed()) { uint32_t mb = m_vol->sectorsPerCluster() - sectorOfCluster; @@ -829,20 +871,19 @@ int FatFile::read(void* buf, size_t nbyte) { } return nbyte - toRead; - fail: +fail: m_error |= READ_ERROR; return -1; } //------------------------------------------------------------------------------ int8_t FatFile::readDir(DirFat_t* dir) { - int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0X1F & m_curPosition)) { return -1; } while (1) { - n = read(dir, sizeof(DirFat_t)); + int16_t n = read(dir, sizeof(DirFat_t)); if (n != sizeof(DirFat_t)) { return n == 0 ? 0 : -1; } @@ -855,7 +896,7 @@ int8_t FatFile::readDir(DirFat_t* dir) { continue; } // return if normal file or subdirectory - if (isFileOrSubdir(dir)) { + if (isFatFileOrSubdir(dir)) { return n; } } @@ -869,7 +910,7 @@ DirFat_t* FatFile::readDirCache(bool skipReadOk) { if (i == 0 || !skipReadOk) { int8_t n = read(&n, 1); - if (n != 1) { + if (n != 1) { if (n != 0) { DBG_FAIL_MACRO; } @@ -882,7 +923,7 @@ DirFat_t* FatFile::readDirCache(bool skipReadOk) { // return pointer to entry return reinterpret_cast(m_vol->cacheAddress()) + i; - fail: +fail: return nullptr; } //------------------------------------------------------------------------------ @@ -894,7 +935,7 @@ bool FatFile::remove(const char* path) { } return file.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -927,7 +968,8 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } // sync() and cache directory entry sync(); - oldFile = *this; + // oldFile = *this; + oldFile.copy(this); dir = cacheDirEntry(FsCache::CACHE_FOR_READ); if (!dir) { DBG_FAIL_MACRO; @@ -990,7 +1032,7 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } // store new dot dot sector = m_vol->clusterStartSector(m_firstCluster); - uint8_t* pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_WRITE); + pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_WRITE); dir = reinterpret_cast(pc); if (!dir) { DBG_FAIL_MACRO; @@ -1008,7 +1050,7 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1040,7 +1082,7 @@ bool FatFile::rmdir() { continue; } // error not empty - if (isFileOrSubdir(dir)) { + if (isFatFileOrSubdir(dir)) { DBG_FAIL_MACRO; goto fail; } @@ -1050,7 +1092,7 @@ bool FatFile::rmdir() { m_flags |= FILE_FLAG_WRITE; return remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1064,7 +1106,7 @@ bool FatFile::rmRfStar() { rewind(); while (1) { // remember position - index = m_curPosition/FS_DIR_SIZE; + index = m_curPosition / FS_DIR_SIZE; DirFat_t* dir = readDirCache(); if (!dir) { @@ -1086,7 +1128,7 @@ bool FatFile::rmRfStar() { } // skip if part of long file name or volume label in root - if (!isFileOrSubdir(dir)) { + if (!isFatFileOrSubdir(dir)) { continue; } @@ -1109,8 +1151,8 @@ bool FatFile::rmRfStar() { } } // position to next entry if required - if (m_curPosition != (32UL*(index + 1))) { - if (!seekSet(32UL*(index + 1))) { + if (m_curPosition != (32UL * (index + 1))) { + if (!seekSet(32UL * (index + 1))) { DBG_FAIL_MACRO; goto fail; } @@ -1125,7 +1167,7 @@ bool FatFile::rmRfStar() { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1153,7 +1195,7 @@ bool FatFile::seekSet(uint32_t pos) { goto fail; } } else if (isRootFixed()) { - if (pos <= FS_DIR_SIZE*m_vol->rootDirEntryCount()) { + if (pos <= FS_DIR_SIZE * m_vol->rootDirEntryCount()) { goto done; } DBG_FAIL_MACRO; @@ -1184,12 +1226,12 @@ bool FatFile::seekSet(uint32_t pos) { } } - done: +done: m_curPosition = pos; m_flags &= ~FILE_FLAG_PREALLOCATE; return true; - fail: +fail: m_curCluster = tmp; return false; } @@ -1207,6 +1249,7 @@ bool FatFile::sync() { DBG_FAIL_MACRO; goto fail; } + dir->attributes = m_attributes & FS_ATTRIB_COPY; // do not set filesize for dir files if (isFile()) { setLe32(dir->fileSize, m_fileSize); @@ -1230,27 +1273,21 @@ bool FatFile::sync() { } DBG_FAIL_MACRO; - fail: +fail: m_error |= WRITE_ERROR; return false; } //------------------------------------------------------------------------------ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, - uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + uint8_t day, uint8_t hour, uint8_t minute, + uint8_t second) { uint16_t dirDate; uint16_t dirTime; DirFat_t* dir; - if (!isFile() - || year < 1980 - || year > 2107 - || month < 1 - || month > 12 - || day < 1 - || day > 31 - || hour > 23 - || minute > 59 - || second > 59) { + if (!isFileOrSubDir() || year < 1980 || year > 2107 || month < 1 || + month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || + second > 59) { DBG_FAIL_MACRO; goto fail; } @@ -1281,7 +1318,7 @@ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, } return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1293,7 +1330,7 @@ bool FatFile::truncate() { goto fail; } if (m_firstCluster == 0) { - return true; + return true; } if (m_curCluster) { toFree = 0; @@ -1325,7 +1362,7 @@ bool FatFile::truncate() { m_flags |= FILE_FLAG_DIR_DIRTY; return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1372,7 +1409,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { goto fail; } } -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS int8_t fg = m_vol->fatGet(m_curCluster, &m_curCluster); if (fg < 0) { DBG_FAIL_MACRO; @@ -1400,8 +1437,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } } // sector for data write - uint32_t sector = m_vol->clusterStartSector(m_curCluster) - + sectorOfCluster; + uint32_t sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; if (sectorOffset != 0 || nToWrite < m_vol->bytesPerSector()) { // partial sector - must use cache @@ -1413,7 +1449,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } if (sectorOffset == 0 && - (m_curPosition >= m_fileSize || m_flags & FILE_FLAG_PREALLOCATE)) { + (m_curPosition >= m_fileSize || m_flags & FILE_FLAG_PREALLOCATE)) { // start of new sector don't need to read into cache cacheOption = FsCache::CACHE_RESERVE_FOR_WRITE; } else { @@ -1435,7 +1471,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } } #if USE_MULTI_SECTOR_IO - } else if (nToWrite >= 2*m_vol->bytesPerSector()) { + } else if (nToWrite >= 2 * m_vol->bytesPerSector()) { // use multiple sector write command uint32_t maxSectors = m_vol->sectorsPerCluster() - sectorOfCluster; uint32_t nSector = nToWrite >> m_vol->bytesPerSectorShift(); @@ -1470,7 +1506,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } return nbyte; - fail: +fail: // return for write error m_error |= WRITE_ERROR; return 0; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.h similarity index 82% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.h index 0415bc7b..62977559 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFile.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,9 +28,10 @@ * \file * \brief FatFile class */ -#include -#include #include +#include +#include + #include "../common/FmtNumber.h" #include "../common/FsApiConstants.h" #include "../common/FsDateTime.h" @@ -38,28 +39,6 @@ #include "FatPartition.h" class FatVolume; //------------------------------------------------------------------------------ -// Stuff to store strings in AVR flash. -#ifdef __AVR__ -#include -#else // __AVR__ -#ifndef PSTR -/** store literal string in flash for ARM */ -#define PSTR(x) (x) -#endif // PSTR -#ifndef pgm_read_byte -/** read 8-bits from flash for ARM */ -#define pgm_read_byte(addr) (*(const unsigned char*)(addr)) -#endif // pgm_read_byte -#ifndef pgm_read_word -/** read 16-bits from flash for ARM */ -#define pgm_read_word(addr) (*(const uint16_t*)(addr)) -#endif // pgm_read_word -#ifndef PROGMEM -/** store in flash for ARM */ -#define PROGMEM -#endif // PROGMEM -#endif // __AVR__ -//------------------------------------------------------------------------------ /** * \struct FatPos_t * \brief Internal type for file position - do not use in user apps. @@ -105,7 +84,7 @@ class FatSfn_t { #if USE_LONG_FILE_NAMES /** Internal class for file names */ typedef FatLfn_t FatName_t; -#else // USE_LONG_FILE_NAMES +#else // USE_LONG_FILE_NAMES /** Internal class for file names */ typedef FatSfn_t FatName_t; #endif // USE_LONG_FILE_NAMES @@ -116,14 +95,11 @@ const uint8_t FNAME_FLAG_LOST_CHARS = 0X01; const uint8_t FNAME_FLAG_MIXED_CASE = 0X02; /** LFN entries are required for file name. */ const uint8_t FNAME_FLAG_NEED_LFN = - FNAME_FLAG_LOST_CHARS | FNAME_FLAG_MIXED_CASE; + FNAME_FLAG_LOST_CHARS | FNAME_FLAG_MIXED_CASE; /** Filename base-name is all lower case */ const uint8_t FNAME_FLAG_LC_BASE = FAT_CASE_LC_BASE; /** Filename extension is all lower case. */ const uint8_t FNAME_FLAG_LC_EXT = FAT_CASE_LC_EXT; -#if FNAME_FLAG_NEED_LFN & (FAT_CASE_LC_BASE || FAT_CASE_LC_EXT) -#error FNAME_FLAG_NEED_LFN & (FAT_CASE_LC_BASE || FAT_CASE_LC_EXT) -#endif // FNAME_FLAG_NEED_LFN & (FAT_CASE_LC_BASE || FAT_CASE_LC_EXT) //============================================================================== /** * \class FatFile @@ -140,22 +116,101 @@ class FatFile { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). */ - FatFile(const char* path, oflag_t oflag) { - open(path, oflag); + FatFile(const char* path, oflag_t oflag) { open(path, oflag); } + + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const FatFile* from) { + if (from != this) { +#if FILE_COPY_CONSTRUCTOR_SELECT + *this = *from; +#else // FILE_COPY_CONSTRUCTOR_SELECT + memcpy(this, from, sizeof(FatFile)); +#endif // FILE_COPY_CONSTRUCTOR_SELECT + } } -#if DESTRUCTOR_CLOSES_FILE + /** move from to this. + * \param[in] from Source file. + */ + void move(FatFile* from) { + if (from != this) { + copy(from); + from->m_attributes = FILE_ATTR_CLOSED; + } + } + +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC + /** Copy constructor. + * \param[in] from Move from file. + * + */ + FatFile(const FatFile& from) = default; + /** Copy assignment operator. + * \param[in] from Move from file. + * \return Copied file. + */ + FatFile& operator=(const FatFile& from) = default; +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + FatFile(const FatFile& from) = default; + FatFile& operator=(const FatFile& from) = default; + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + FatFile(const FatFile& from) = delete; + FatFile& operator=(const FatFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from Move from file. + */ + FatFile(FatFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from Move from file. + * \return Moved file. + */ + FatFile& operator=(FatFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + FatFile(FatFile&& from) = delete; + FatFile& operator=(FatFile&& from) = delete; +#endif /** Destructor */ +#if DESTRUCTOR_CLOSES_FILE ~FatFile() { if (isOpen()) { close(); } } +#else // DESTRUCTOR_CLOSES_FILE + ~FatFile() = default; #endif // DESTRUCTOR_CLOSES_FILE + /** The parenthesis operator. * * \return true if a file is open. */ - operator bool() const {return isOpen();} + operator bool() const { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { + return isFileOrSubDir() ? m_attributes & FS_ATTRIB_USER_SETTABLE : -1; + } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits); /** \return The number of bytes available from the current position * to EOF for normal files. INT_MAX is returned for very large files. * @@ -175,13 +230,9 @@ class FatFile { return isFile() ? fileSize() - curPosition() : 0; } /** Clear all error bits. */ - void clearError() { - m_error = 0; - } + void clearError() { m_error = 0; } /** Set writeError to zero */ - void clearWriteError() { - m_error &= ~WRITE_ERROR; - } + void clearWriteError() { m_error &= ~WRITE_ERROR; } /** Close a file and force cached data and directory information * to be written to the storage device. * @@ -206,8 +257,7 @@ class FatFile { * * \return true for success or false for failure. */ - bool createContiguous(FatFile* dirFile, - const char* path, uint32_t size); + bool createContiguous(FatFile* dirFile, const char* path, uint32_t size); /** Create and open a new contiguous file of a specified size. * * \param[in] path A path with a valid file name. @@ -217,10 +267,10 @@ class FatFile { */ bool createContiguous(const char* path, uint32_t size); /** \return The current cluster number for a file or directory. */ - uint32_t curCluster() const {return m_curCluster;} + uint32_t curCluster() const { return m_curCluster; } /** \return The current position for a file or directory. */ - uint32_t curPosition() const {return m_curPosition;} + uint32_t curPosition() const { return m_curPosition; } /** Return a file's directory entry. * * \param[out] dir Location for return of the file's directory entry. @@ -229,7 +279,7 @@ class FatFile { */ bool dirEntry(DirFat_t* dir); /** \return Directory entry index. */ - uint16_t dirIndex() const {return m_dirIndex;} + uint16_t dirIndex() const { return m_dirIndex; } /** \return The number of bytes allocated to a directory or zero * if an error occurs. */ @@ -282,13 +332,13 @@ class FatFile { */ int fgets(char* str, int num, char* delim = nullptr); /** \return The total number of bytes in a file. */ - uint32_t fileSize() const {return m_fileSize;} + uint32_t fileSize() const { return m_fileSize; } /** \return first sector of file or zero for empty file. */ - uint32_t firstBlock() const {return firstSector();} + uint32_t firstBlock() const { return firstSector(); } /** \return Address of first sector or zero for empty file. */ uint32_t firstSector() const; /** Arduino name for sync() */ - void flush() {sync();} + void flush() { sync(); } /** set position for streams * \param[in] pos struct with value for new position */ @@ -325,7 +375,7 @@ class FatFile { */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); /** \return All error bits. */ - uint8_t getError() const {return m_error;} + uint8_t getError() const { return m_error; } /** Get a file's modify date and time. * * \param[out] pdate Packed date for directory entry. @@ -339,8 +389,7 @@ class FatFile { * * \param[out] name An array of characters for the file's name. * \param[in] size The size of the array in bytes. The array - * must be at least 13 bytes long. The file's name will be - * truncated if the file's name is too long. + * must be at least 13 bytes long. * \return length for success or zero for failure. */ size_t getName(char* name, size_t size); @@ -349,7 +398,7 @@ class FatFile { * * \param[out] name An array of characters for the file's name. * \param[in] size The size of the array in characters. - * \return the name length. + * \return length for success or zero for failure. */ size_t getName7(char* name, size_t size); /** @@ -357,7 +406,7 @@ class FatFile { * * \param[out] name An array of characters for the file's name. * \param[in] size The size of the array in characters. - * \return the name length. + * \return length for success or zero for failure. */ size_t getName8(char* name, size_t size); #ifndef DOXYGEN_SHOULD_SKIP_THIS @@ -373,9 +422,7 @@ class FatFile { */ size_t getSFN(char* name, size_t size); /** \return value of writeError */ - bool getWriteError() const { - return isOpen() ? m_error & WRITE_ERROR : true; - } + bool getWriteError() const { return isOpen() ? m_error & WRITE_ERROR : true; } /** * Check for device busy. * @@ -383,35 +430,37 @@ class FatFile { */ bool isBusy(); #if USE_FAT_FILE_FLAG_CONTIGUOUS - /** \return True if the file is contiguous. */ - bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} + /** \return True if the file is contiguous. */ + bool isContiguous() const { return m_flags & FILE_FLAG_CONTIGUOUS; } #endif // USE_FAT_FILE_FLAG_CONTIGUOUS /** \return True if this is a directory. */ - bool isDir() const {return m_attributes & FILE_ATTR_DIR;} + bool isDir() const { return m_attributes & FILE_ATTR_DIR; } /** \return True if this is a normal file. */ - bool isFile() const {return m_attributes & FILE_ATTR_FILE;} + bool isFile() const { return m_attributes & FILE_ATTR_FILE; } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { return isFile() || isSubDir(); } /** \return True if this is a hidden file. */ - bool isHidden() const {return m_attributes & FILE_ATTR_HIDDEN;} + bool isHidden() const { return m_attributes & FS_ATTRIB_HIDDEN; } /** \return true if this file has a Long File Name. */ - bool isLFN() const {return m_lfnOrd;} + bool isLFN() const { return m_lfnOrd; } /** \return True if this is an open file/directory. */ - bool isOpen() const {return m_attributes;} + bool isOpen() const { return m_attributes; } /** \return True file is readable. */ - bool isReadable() const {return m_flags & FILE_FLAG_READ;} + bool isReadable() const { return m_flags & FILE_FLAG_READ; } /** \return True if file is read-only */ - bool isReadOnly() const {return m_attributes & FILE_ATTR_READ_ONLY;} + bool isReadOnly() const { return m_attributes & FS_ATTRIB_READ_ONLY; } /** \return True if this is the root directory. */ - bool isRoot() const {return m_attributes & FILE_ATTR_ROOT;} + bool isRoot() const { return m_attributes & FILE_ATTR_ROOT; } /** \return True if this is the FAT32 root directory. */ - bool isRoot32() const {return m_attributes & FILE_ATTR_ROOT32;} + bool isRoot32() const { return m_attributes & FILE_ATTR_ROOT32; } /** \return True if this is the FAT12 of FAT16 root directory. */ - bool isRootFixed() const {return m_attributes & FILE_ATTR_ROOT_FIXED;} - /** \return True if this is a subdirectory. */ - bool isSubDir() const {return m_attributes & FILE_ATTR_SUBDIR;} + bool isRootFixed() const { return m_attributes & FILE_ATTR_ROOT_FIXED; } + /** \return True if this is a sub-directory. */ + bool isSubDir() const { return m_attributes & FILE_ATTR_SUBDIR; } /** \return True if this is a system file. */ - bool isSystem() const {return m_attributes & FILE_ATTR_SYSTEM;} + bool isSystem() const { return m_attributes & FS_ATTRIB_SYSTEM; } /** \return True file is writable. */ - bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} + bool isWritable() const { return m_flags & FILE_FLAG_WRITE; } /** List directory contents. * * \param[in] pr Print stream for list. @@ -453,7 +502,7 @@ class FatFile { * * \return true for success or false for failure. */ - bool open(FatVolume* vol, const char* path, oflag_t oflag); + bool open(FatVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file by index. * * \param[in] dirFile An open FatFile instance for the directory. @@ -467,7 +516,19 @@ class FatFile { * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(FatFile* dirFile, uint16_t index, oflag_t oflag); + bool open(FatFile* dirFile, uint16_t index, oflag_t oflag = O_RDONLY); + /** Open a file by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag bitwise-inclusive OR of open flags. + * See see FatFile::open(FatFile*, const char*, uint8_t). + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ + bool open(uint16_t index, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] dirFile An open FatFile instance for the directory containing @@ -513,7 +574,7 @@ class FatFile { * * \return true for success or false for failure. */ - bool open(FatFile* dirFile, const char* path, oflag_t oflag); + bool open(FatFile* dirFile, const char* path, oflag_t oflag = O_RDONLY); /** Open a file in the current working volume. * * \param[in] path A path with a valid name for a file to be opened. @@ -524,6 +585,11 @@ class FatFile { * \return true for success or false for failure. */ bool open(const char* path, oflag_t oflag = O_RDONLY); + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); /** Open existing file wih Short 8.3 names. * \param[in] path with short 8.3 names. * @@ -581,9 +647,7 @@ class FatFile { * * \return The number of characters printed. */ - size_t printAccessDateTime(print_t* pr) { - return printAccessDate(pr); - } + size_t printAccessDateTime(print_t* pr) { return printAccessDate(pr); } /** Print a file's creation date and time * * \param[in] pr Print stream for output. @@ -642,7 +706,7 @@ class FatFile { template size_t printField(Type value, char term) { char sign = 0; - char buf[3*sizeof(Type) + 3]; + char buf[3 * sizeof(Type) + 3]; char* str = buf + sizeof(buf); if (term) { @@ -785,9 +849,7 @@ class FatFile { */ bool rename(FatFile* dirFile, const char* newPath); /** Set the file's current position to zero. */ - void rewind() { - seekSet(0); - } + void rewind() { seekSet(0UL); } /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the @@ -820,9 +882,7 @@ class FatFile { * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int32_t offset) { - return seekSet(m_curPosition + offset); - } + bool seekCur(int32_t offset) { return seekSet(m_curPosition + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. @@ -893,24 +953,18 @@ class FatFile { * * \return true for success or false for failure. */ - bool truncate(uint32_t length) { - return seekSet(length) && truncate(); - } + bool truncate(uint32_t length) { return seekSet(length) && truncate(); } /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use getWriteError to check for errors. * \return count of characters written for success or -1 for failure. */ - size_t write(const char* str) { - return write(str, strlen(str)); - } + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a single byte. * \param[in] b The byte to be written. * \return +1 for success or -1 for failure. */ - size_t write(uint8_t b) { - return write(&b, 1); - } + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -939,16 +993,12 @@ class FatFile { * * \return true for success or false for failure. */ - bool ls(uint8_t flags = 0) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } /** Print a file's name. * * \return length for success or zero for failure. */ - size_t printName() { - return FatFile::printName(&Serial); - } + size_t printName() { return FatFile::printName(&Serial); } #endif // ENABLE_ARDUINO_SERIAL private: @@ -957,45 +1007,34 @@ class FatFile { /** This file has not been opened. */ static const uint8_t FILE_ATTR_CLOSED = 0; - /** File is read-only. */ - static const uint8_t FILE_ATTR_READ_ONLY = FAT_ATTRIB_READ_ONLY; - /** File should be hidden in directory listings. */ - static const uint8_t FILE_ATTR_HIDDEN = FAT_ATTRIB_HIDDEN; - /** Entry is for a system file. */ - static const uint8_t FILE_ATTR_SYSTEM = FAT_ATTRIB_SYSTEM; /** Entry for normal data file */ static const uint8_t FILE_ATTR_FILE = 0X08; /** Entry is for a subdirectory */ - static const uint8_t FILE_ATTR_SUBDIR = FAT_ATTRIB_DIRECTORY; + static const uint8_t FILE_ATTR_SUBDIR = FS_ATTRIB_DIRECTORY; /** A FAT12 or FAT16 root directory */ - static const uint8_t FILE_ATTR_ROOT_FIXED = 0X20; + static const uint8_t FILE_ATTR_ROOT_FIXED = 0X40; /** A FAT32 root directory */ - static const uint8_t FILE_ATTR_ROOT32 = 0X40; + static const uint8_t FILE_ATTR_ROOT32 = 0X80; /** Entry is for root. */ - static const uint8_t FILE_ATTR_ROOT = - FILE_ATTR_ROOT_FIXED | FILE_ATTR_ROOT32; + static const uint8_t FILE_ATTR_ROOT = FILE_ATTR_ROOT_FIXED | FILE_ATTR_ROOT32; /** Directory type bits */ static const uint8_t FILE_ATTR_DIR = FILE_ATTR_SUBDIR | FILE_ATTR_ROOT; - /** Attributes to copy from directory entry */ - static const uint8_t FILE_ATTR_COPY = - FAT_ATTRIB_READ_ONLY | FAT_ATTRIB_HIDDEN | - FAT_ATTRIB_SYSTEM | FAT_ATTRIB_DIRECTORY; // private functions bool addCluster(); bool addDirCluster(); DirFat_t* cacheDir(uint16_t index) { - return seekSet(32UL*index) ? readDirCache() : nullptr; + return seekSet(32UL * index) ? readDirCache() : nullptr; } DirFat_t* cacheDirEntry(uint8_t action); bool cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); bool createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); uint16_t getLfnChar(DirLfn_t* ldir, uint8_t i); - uint8_t lfnChecksum(uint8_t* name) { + uint8_t lfnChecksum(const uint8_t* name) { uint8_t sum = 0; for (uint8_t i = 0; i < 11; i++) { - sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; + sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; } return sum; } @@ -1019,26 +1058,26 @@ class FatFile { // treat curPosition as valid length. static const uint8_t FILE_FLAG_PREALLOCATE = 0X20; // file is contiguous - static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; + static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; // sync of directory entry required static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80; // private data static const uint8_t WRITE_ERROR = 0X1; - static const uint8_t READ_ERROR = 0X2; + static const uint8_t READ_ERROR = 0X2; - uint8_t m_attributes = FILE_ATTR_CLOSED; - uint8_t m_error = 0; // Error bits. - uint8_t m_flags = 0; // See above for definition of m_flags bits - uint8_t m_lfnOrd; - uint16_t m_dirIndex; // index of directory entry in dir file - FatVolume* m_vol; // volume where file is located - uint32_t m_dirCluster; - uint32_t m_curCluster; // cluster for current file position - uint32_t m_curPosition; // current file position - uint32_t m_dirSector; // sector for this files directory entry - uint32_t m_fileSize; // file size in bytes - uint32_t m_firstCluster; // first cluster of file + uint8_t m_attributes = FILE_ATTR_CLOSED; + uint8_t m_error = 0; // Error bits. + uint8_t m_flags = 0; // See above for definition of m_flags bits + uint8_t m_lfnOrd; + uint16_t m_dirIndex; // index of directory entry in dir file + FatVolume* m_vol; // volume where file is located + uint32_t m_dirCluster; + uint32_t m_curCluster; // cluster for current file position + uint32_t m_curPosition; // current file position + uint32_t m_dirSector; // sector for this files directory entry + uint32_t m_fileSize; // file size in bytes + uint32_t m_firstCluster; // first cluster of file }; #include "../common/ArduinoFiles.h" @@ -1048,7 +1087,7 @@ class FatFile { */ class File32 : public StreamFile { public: - /** Opens the next file or folder in a directory. + /** Opens the next file or folder in a directory. * * \param[in] oflag open flags. * \return a FatStream object. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileLFN.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileLFN.cpp similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileLFN.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileLFN.cpp index b74b7a73..6844a573 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileLFN.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileLFN.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,23 +24,17 @@ */ #define DBG_FILE "FatFileLFN.cpp" #include "../common/DebugMacros.h" -#include "../common/upcase.h" #include "../common/FsUtf.h" +#include "../common/upcase.h" #include "FatLib.h" #if USE_LONG_FILE_NAMES //------------------------------------------------------------------------------ -static bool isLower(char c) { - return 'a' <= c && c <= 'z'; -} +static bool isLower(char c) { return 'a' <= c && c <= 'z'; } //------------------------------------------------------------------------------ -static bool isUpper(char c) { - return 'A' <= c && c <= 'Z'; -} +static bool isUpper(char c) { return 'A' <= c && c <= 'Z'; } //------------------------------------------------------------------------------ // A bit smaller than toupper in AVR 328. -inline char toUpper(char c) { - return isLower(c) ? c - 'a' + 'A' : c; -} +inline char toUpper(char c) { return isLower(c) ? c - 'a' + 'A' : c; } //------------------------------------------------------------------------------ /** * Store a 16-bit long file name character. @@ -51,27 +45,18 @@ inline char toUpper(char c) { */ static void putLfnChar(DirLfn_t* ldir, uint8_t i, uint16_t c) { if (i < 5) { - setLe16(ldir->unicode1 + 2*i, c); + setLe16(ldir->unicode1 + 2 * i, c); } else if (i < 11) { - setLe16(ldir->unicode2 + 2*i -10, c); + setLe16(ldir->unicode2 + 2 * (i - 5), c); } else if (i < 13) { - setLe16(ldir->unicode3 + 2*i - 22, c); + setLe16(ldir->unicode3 + 2 * (i - 11), c); } } -//------------------------------------------------------------------------------ -// Daniel Bernstein University of Illinois at Chicago. -// Original had + instead of ^ -__attribute__((unused)) -static uint16_t Bernstein(const char* bgn, const char* end, uint16_t hash) { - while (bgn < end) { - // hash = hash * 33 ^ str[i]; - hash = ((hash << 5) + hash) ^ (*bgn++); - } - return hash; -} //============================================================================== bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { - FatFile dir = *this; + // FatFile dir = *this; + FatFile dir; + dir.copy(this); DirLfn_t* ldir; fname->reset(); for (uint8_t order = 1; order <= lfnOrd; order++) { @@ -95,7 +80,7 @@ bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { if (toUpcase(u) != toUpcase(cp)) { return false; } -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES if (u > 0X7F || toUpper(u) != toUpper(fname->getch())) { return false; } @@ -104,12 +89,14 @@ bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { - FatFile dir = *this; + // FatFile dir = *this; + FatFile dir; + dir.copy(this); DirLfn_t* ldir; uint8_t checksum = lfnChecksum(fname->sfn); uint8_t fc = 0; @@ -141,13 +128,13 @@ bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool FatFile::makeSFN(FatLfn_t* fname) { bool is83; -// char c; + // char c; uint8_t c; uint8_t bit = FAT_CASE_LC_BASE; uint8_t lc = 0; @@ -170,15 +157,17 @@ bool FatFile::makeSFN(FatLfn_t* fname) { // Not 8.3 if starts with dot. is83 = *ptr == '.' ? false : true; // Skip leading dots. - for (; *ptr == '.'; ptr++) {} + for (; *ptr == '.'; ptr++) { + } // Find last dot. - for (dot = end - 1; dot > ptr && *dot != '.'; dot--) {} + for (dot = end - 1; dot > ptr && *dot != '.'; dot--) { + } for (; ptr < end; ptr++) { c = *ptr; if (c == '.' && ptr == dot) { - in = 10; // Max index for full 8.3 name. - i = 8; // Place for extension. + in = 10; // Max index for full 8.3 name. + i = 8; // Place for extension. bit = FAT_CASE_LC_EXT; // bit for extension. } else { if (sfnReservedChar(c)) { @@ -192,7 +181,7 @@ bool FatFile::makeSFN(FatLfn_t* fname) { if (i > in) { is83 = false; if (in == 10 || ptr > dot) { - // Done - extension longer than three characters or no extension. + // Done - extension longer than three characters or no extension. break; } // Skip to dot. @@ -216,7 +205,7 @@ bool FatFile::makeSFN(FatLfn_t* fname) { goto fail; } if (is83) { - fname->flags = lc & uc ? FNAME_FLAG_MIXED_CASE : lc; + fname->flags = (lc & uc) ? FNAME_FLAG_MIXED_CASE : lc; } else { fname->flags = FNAME_FLAG_LOST_CHARS; fname->sfn[fname->seqPos] = '~'; @@ -224,7 +213,7 @@ bool FatFile::makeSFN(FatLfn_t* fname) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -238,17 +227,13 @@ bool FatFile::makeUniqueSfn(FatLfn_t* fname) { DBG_HALT_IF(fname->sfn[pos] != '~' && fname->sfn[pos + 1] != '1'); for (uint8_t seq = FIRST_HASH_SEQ; seq < 100; seq++) { - DBG_WARN_IF(seq > FIRST_HASH_SEQ); -#ifdef USE_LFN_HASH - hex = Bernstein(fname->begin, fname->end, seq); -#else + DBG_WARN_IF(seq > FIRST_HASH_SEQ); hex += millis(); -#endif if (pos > 3) { // Make space in name for ~HHHH. pos = 3; } - for (uint8_t i = pos + 4 ; i > pos; i--) { + for (uint8_t i = pos + 4; i > pos; i--) { uint8_t h = hex & 0XF; fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; hex >>= 4; @@ -268,7 +253,7 @@ bool FatFile::makeUniqueSfn(FatLfn_t* fname) { if (dir->name[0] == FAT_NAME_FREE) { goto done; } - if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { + if (isFatFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { // Name found - try another. break; } @@ -277,25 +262,26 @@ bool FatFile::makeUniqueSfn(FatLfn_t* fname) { // fall inti fail - too many tries. DBG_FAIL_MACRO; - fail: +fail: return false; - done: +done: return true; } //------------------------------------------------------------------------------ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { bool fnameFound = false; uint8_t lfnOrd = 0; - uint8_t freeNeed; uint8_t freeFound = 0; + uint8_t freeNeed; uint8_t order = 0; uint8_t checksum = 0; uint8_t ms10; uint8_t nameOrd; - uint16_t freeIndex = 0; uint16_t curIndex; uint16_t date; + uint16_t freeIndex = 0; + uint16_t freeTotal; uint16_t time; DirFat_t* dir; DirLfn_t* ldir; @@ -306,11 +292,11 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { goto fail; } // Number of directory entries needed. - nameOrd = (fname->len + 12)/13; - freeNeed = fname->flags & FNAME_FLAG_NEED_LFN ? 1 + nameOrd : 1; + nameOrd = (fname->len + 12) / 13; + freeNeed = (fname->flags & FNAME_FLAG_NEED_LFN) ? 1 + nameOrd : 1; dirFile->rewind(); while (1) { - curIndex = dirFile->m_curPosition/FS_DIR_SIZE; + curIndex = dirFile->m_curPosition / FS_DIR_SIZE; dir = dirFile->readDirCache(); if (!dir) { if (dirFile->getError()) { @@ -338,12 +324,12 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { // skip empty slot or '.' or '..' if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == '.') { lfnOrd = 0; - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (!lfnOrd) { order = ldir->order & 0X1F; if (order != nameOrd || - (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) == 0) { + (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) == 0) { continue; } lfnOrd = nameOrd; @@ -357,7 +343,7 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { lfnOrd = 0; } } - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (lfnOrd) { if (1 == order && lfnChecksum(dir->name) == checksum) { goto found; @@ -376,7 +362,7 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { } } - found: +found: // Don't open if create only. if (oflag & O_EXCL) { DBG_FAIL_MACRO; @@ -384,7 +370,7 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { } goto open; - create: +create: // don't create unless O_CREAT and write mode if (!(oflag & O_CREAT) || !isWriteMode(oflag)) { DBG_WARN_MACRO; @@ -394,7 +380,6 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { if (freeFound == 0) { freeIndex = curIndex; } - while (freeFound < freeNeed) { dir = dirFile->readDirCache(); if (!dir) { @@ -407,13 +392,16 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { } freeFound++; } - while (freeFound < freeNeed) { + // Loop handles the case of huge filename and cluster size one. + freeTotal = freeFound; + while (freeTotal < freeNeed) { // Will fail if FAT16 root. if (!dirFile->addDirCluster()) { DBG_FAIL_MACRO; goto fail; } - freeFound += vol->dirEntriesPerCluster(); + // 16-bit freeTotal needed for large cluster size. + freeTotal += vol->dirEntriesPerCluster(); } if (fnameFound) { if (!dirFile->makeUniqueSfn(fname)) { @@ -456,7 +444,7 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { // Force write of entry to device. vol->cacheDirty(); - open: +open: // open entry in cache. if (!openCachedEntry(dirFile, curIndex, oflag, lfnOrd)) { DBG_FAIL_MACRO; @@ -464,18 +452,19 @@ bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::parsePathName(const char* path, - FatLfn_t* fname, const char** ptr) { +bool FatFile::parsePathName(const char* path, FatLfn_t* fname, + const char** ptr) { size_t len = 0; // Skip leading spaces. while (*path == ' ') { path++; } fname->begin = path; + fname->len = 0; while (*path && !isDirSeparator(*path)) { #if USE_UTF8_LONG_NAMES uint32_t cp; @@ -490,7 +479,7 @@ bool FatFile::parsePathName(const char* path, DBG_FAIL_MACRO; goto fail; } -#else // USE_UTF8_LONG_NAMES +#else // USE_UTF8_LONG_NAMES uint8_t cp = *path++; if (cp >= 0X80 || lfnReservedChar(cp)) { DBG_FAIL_MACRO; @@ -509,11 +498,12 @@ bool FatFile::parsePathName(const char* path, goto fail; } // Advance to next path component. - for (; *path == ' ' || isDirSeparator(*path); path++) {} + for (; *path == ' ' || isDirSeparator(*path); path++) { + } *ptr = path; return makeSFN(fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -569,8 +559,7 @@ bool FatFile::remove() { goto fail; } if (ldir->attributes != FAT_ATTRIB_LONG_NAME || - order != (ldir->order & 0X1F) || - checksum != ldir->checksum) { + order != (ldir->order & 0X1F) || checksum != ldir->checksum) { DBG_FAIL_MACRO; goto fail; } @@ -588,7 +577,7 @@ bool FatFile::remove() { // Fall into fail. DBG_FAIL_MACRO; - fail: +fail: return false; } #endif // #if USE_LONG_FILE_NAMES diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFilePrint.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFilePrint.cpp similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFilePrint.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFilePrint.cpp index df57610d..34f65946 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFilePrint.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFilePrint.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -67,7 +67,7 @@ bool FatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -99,7 +99,7 @@ size_t FatFile::printModifyDateTime(print_t* pr) { //------------------------------------------------------------------------------ size_t FatFile::printFileSize(print_t* pr) { char buf[11]; - char *ptr = buf + sizeof(buf); + char* ptr = buf + sizeof(buf); *--ptr = 0; ptr = fmtBase10(ptr, fileSize()); while (ptr > buf) { diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileSFN.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileSFN.cpp similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileSFN.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileSFN.cpp index b9f1efd6..3a5f6934 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFileSFN.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFileSFN.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -46,7 +46,7 @@ bool FatFile::open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag) { while (true) { dir = dirFile->readDirCache(true); if (!dir) { - if (dirFile->getError()) { + if (dirFile->getError()) { DBG_FAIL_MACRO; goto fail; } @@ -62,7 +62,7 @@ bool FatFile::open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag) { break; } lfnOrd = 0; - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (!memcmp(fname->sfn, dir->name, 11)) { // don't open existing file if O_EXCL if (oflag & O_EXCL) { @@ -83,7 +83,7 @@ bool FatFile::open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag) { } else { lfnOrd = 0; } - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { lfnOrd = ldir->order & 0X1F; @@ -143,7 +143,7 @@ bool FatFile::open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag) { // open entry in cache. return openCachedEntry(dirFile, index, oflag, 0); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -156,7 +156,8 @@ bool FatFile::openExistingSFN(const char* path) { if (*path == 0) { return openRoot(vol); } - *this = *vol->vwd(); + // *this = *vol->vwd(); + this->copy(vol->vwd()); do { if (!parsePathName(path, &fname, &path)) { DBG_FAIL_MACRO; @@ -169,7 +170,7 @@ bool FatFile::openExistingSFN(const char* path) { } while (*path); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -183,7 +184,7 @@ bool FatFile::openSFN(FatSfn_t* fname) { goto fail; } while (true) { - if (read(&dir, 32) != 32) { + if (read(&dir, sizeof(dir)) != sizeof(dir)) { DBG_FAIL_MACRO; goto fail; } @@ -191,25 +192,29 @@ bool FatFile::openSFN(FatSfn_t* fname) { DBG_FAIL_MACRO; goto fail; } - if (isFileOrSubdir(&dir) && memcmp(fname->sfn, dir.name, 11) == 0) { - uint16_t dirIndex = (m_curPosition - 32) >> 5; - uint32_t dirCluster = m_firstCluster; - memset(this, 0 , sizeof(FatFile)); - m_attributes = dir.attributes & FILE_ATTR_COPY; - if (isFileDir(&dir)) { + if (isFatFileOrSubdir(&dir) && memcmp(fname->sfn, dir.name, 11) == 0) { + uint16_t saveDirIndex = (m_curPosition - sizeof(dir)) >> 5; + uint32_t saveDirCluster = m_firstCluster; + memset(this, 0, sizeof(FatFile)); + m_attributes = dir.attributes & FS_ATTRIB_COPY; + m_flags = FILE_FLAG_READ; + if (isFatFile(&dir)) { m_attributes |= FILE_ATTR_FILE; + if (!isReadOnly()) { + m_attributes |= FS_ATTRIB_ARCHIVE; + m_flags |= FILE_FLAG_WRITE; + } } m_lfnOrd = lfnOrd; m_firstCluster = (uint32_t)getLe16(dir.firstClusterHigh) << 16; m_firstCluster |= getLe16(dir.firstClusterLow); m_fileSize = getLe32(dir.fileSize); - m_flags = isFile() ? FILE_FLAG_READ | FILE_FLAG_WRITE : FILE_FLAG_READ; m_vol = vol; - m_dirCluster = dirCluster; + m_dirCluster = saveDirCluster; m_dirSector = m_vol->cacheSectorNumber(); - m_dirIndex = dirIndex; + m_dirIndex = saveDirIndex; return true; - } else if (isLongName(&dir)) { + } else if (isFatLongName(&dir)) { ldir = reinterpret_cast(&dir); if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { lfnOrd = ldir->order & 0X1F; @@ -219,7 +224,7 @@ bool FatFile::openSFN(FatSfn_t* fname) { } } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -265,14 +270,14 @@ bool FatFile::parsePathName(const char* path, FatSfn_t* fname, goto fail; } // Set base-name and extension bits. - fname->flags = lc & uc ? 0 : lc; + fname->flags = (lc & uc) ? 0 : lc; while (isDirSeparator(*path)) { path++; } *ptr = path; return true; - fail: +fail: return false; } #if !USE_LONG_FILE_NAMES @@ -305,7 +310,7 @@ bool FatFile::remove() { // Write entry to device. return m_vol->cacheSync(); - fail: +fail: return false; } #endif // !USE_LONG_FILE_NAMES diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.cpp similarity index 84% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.cpp index 343f4348..5ea5b4be 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -31,18 +31,20 @@ uint16_t const BU16 = 128; uint16_t const BU32 = 8192; // Assume 512 byte sectors. const uint16_t BYTES_PER_SECTOR = 512; -const uint16_t SECTORS_PER_MB = 0X100000/BYTES_PER_SECTOR; +const uint16_t SECTORS_PER_MB = 0X100000 / BYTES_PER_SECTOR; const uint16_t FAT16_ROOT_ENTRY_COUNT = 512; const uint16_t FAT16_ROOT_SECTOR_COUNT = - 32*FAT16_ROOT_ENTRY_COUNT/BYTES_PER_SECTOR; + 32 * FAT16_ROOT_ENTRY_COUNT / BYTES_PER_SECTOR; //------------------------------------------------------------------------------ #define PRINT_FORMAT_PROGRESS 1 #if !PRINT_FORMAT_PROGRESS #define writeMsg(str) #elif defined(__AVR__) -#define writeMsg(str) if (m_pr) m_pr->print(F(str)) +#define writeMsg(str) \ + if (m_pr) m_pr->print(F(str)) #else // PRINT_FORMAT_PROGRESS -#define writeMsg(str) if (m_pr) m_pr->write(str) +#define writeMsg(str) \ + if (m_pr) m_pr->write(str) #endif // PRINT_FORMAT_PROGRESS //------------------------------------------------------------------------------ bool FatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { @@ -51,7 +53,7 @@ bool FatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { m_secBuf = secBuf; m_pr = pr; m_sectorCount = m_dev->sectorCount(); - m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1)/SECTORS_PER_MB; + m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1) / SECTORS_PER_MB; if (m_capacityMB <= 6) { writeMsg("Card is too small.\r\n"); @@ -87,9 +89,9 @@ bool FatFormatter::initFatDir(uint8_t fatType, uint32_t sectorCount) { writeMsg("Writing FAT "); for (uint32_t i = 1; i < sectorCount; i++) { if (!m_dev->writeSector(m_fatStart + i, m_secBuf)) { - return false; + return false; } - if ((i%(sectorCount/32)) == 0) { + if ((i % (sectorCount / 32)) == 0) { writeMsg("."); } } @@ -131,13 +133,12 @@ void FatFormatter::initPbs() { //------------------------------------------------------------------------------ bool FatFormatter::makeFat16() { uint32_t nc; - uint32_t r; PbsFat_t* pbs = reinterpret_cast(m_secBuf); - for (m_dataStart = 2*BU16; ; m_dataStart += BU16) { - nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; - m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/2) - 1)/(BYTES_PER_SECTOR/2); - r = BU16 + 1 + 2*m_fatSize + FAT16_ROOT_SECTOR_COUNT; + for (m_dataStart = 2 * BU16;; m_dataStart += BU16) { + nc = (m_sectorCount - m_dataStart) / m_sectorsPerCluster; + m_fatSize = (nc + 2 + (BYTES_PER_SECTOR / 2) - 1) / (BYTES_PER_SECTOR / 2); + uint32_t r = BU16 + 1 + 2 * m_fatSize + FAT16_ROOT_SECTOR_COUNT; if (m_dataStart >= r) { m_relativeSectors = m_dataStart - r + BU16; break; @@ -150,8 +151,8 @@ bool FatFormatter::makeFat16() { } m_reservedSectorCount = 1; m_fatStart = m_relativeSectors + m_reservedSectorCount; - m_totalSectors = nc*m_sectorsPerCluster - + 2*m_fatSize + m_reservedSectorCount + 32; + m_totalSectors = + nc * m_sectorsPerCluster + 2 * m_fatSize + m_reservedSectorCount + 32; if (m_totalSectors < 65536) { m_partType = 0X04; } else { @@ -183,15 +184,14 @@ bool FatFormatter::makeFat16() { //------------------------------------------------------------------------------ bool FatFormatter::makeFat32() { uint32_t nc; - uint32_t r; PbsFat_t* pbs = reinterpret_cast(m_secBuf); FsInfo_t* fsi = reinterpret_cast(m_secBuf); m_relativeSectors = BU32; - for (m_dataStart = 2*BU32; ; m_dataStart += BU32) { - nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; - m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/4) - 1)/(BYTES_PER_SECTOR/4); - r = m_relativeSectors + 9 + 2*m_fatSize; + for (m_dataStart = 2 * BU32;; m_dataStart += BU32) { + nc = (m_sectorCount - m_dataStart) / m_sectorsPerCluster; + m_fatSize = (nc + 2 + (BYTES_PER_SECTOR / 4) - 1) / (BYTES_PER_SECTOR / 4); + uint32_t r = m_relativeSectors + 9 + 2 * m_fatSize; if (m_dataStart >= r) { break; } @@ -201,9 +201,9 @@ bool FatFormatter::makeFat32() { writeMsg("Bad cluster count\r\n"); return false; } - m_reservedSectorCount = m_dataStart - m_relativeSectors - 2*m_fatSize; + m_reservedSectorCount = m_dataStart - m_relativeSectors - 2 * m_fatSize; m_fatStart = m_relativeSectors + m_reservedSectorCount; - m_totalSectors = nc*m_sectorsPerCluster + m_dataStart - m_relativeSectors; + m_totalSectors = nc * m_sectorsPerCluster + m_dataStart - m_relativeSectors; // type depends on address of end sector // max CHS has lba = 16450560 = 1024*255*63 if ((m_relativeSectors + m_totalSectors) <= 16450560) { @@ -232,14 +232,14 @@ bool FatFormatter::makeFat32() { pbs->bpb.bpb32.volumeType[2] = 'T'; pbs->bpb.bpb32.volumeType[3] = '3'; pbs->bpb.bpb32.volumeType[4] = '2'; - if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 6, m_secBuf)) { return false; } // write extra boot area and backup - memset(m_secBuf, 0 , BYTES_PER_SECTOR); + memset(m_secBuf, 0, BYTES_PER_SECTOR); setLe32(fsi->trailSignature, FSINFO_TRAIL_SIGNATURE); - if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 8, m_secBuf)) { return false; } @@ -248,11 +248,11 @@ bool FatFormatter::makeFat32() { setLe32(fsi->structSignature, FSINFO_STRUCT_SIGNATURE); setLe32(fsi->freeCount, 0XFFFFFFFF); setLe32(fsi->nextFree, 0XFFFFFFFF); - if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 7, m_secBuf)) { return false; } - return initFatDir(32, 2*m_fatSize + m_sectorsPerCluster); + return initFatDir(32, 2 * m_fatSize + m_sectorsPerCluster); } //------------------------------------------------------------------------------ bool FatFormatter::writeMbr() { @@ -262,8 +262,8 @@ bool FatFormatter::writeMbr() { #if USE_LBA_TO_CHS lbaToMbrChs(mbr->part->beginCHS, m_capacityMB, m_relativeSectors); lbaToMbrChs(mbr->part->endCHS, m_capacityMB, - m_relativeSectors + m_totalSectors -1); -#else // USE_LBA_TO_CHS + m_relativeSectors + m_totalSectors - 1); +#else // USE_LBA_TO_CHS mbr->part->beginCHS[0] = 1; mbr->part->beginCHS[1] = 1; mbr->part->beginCHS[2] = 0; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.h similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.h index 2e7d55d9..d48a1fab 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatFormatter.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,14 +24,16 @@ */ #ifndef FatFormatter_h #define FatFormatter_h -#include "../common/SysCall.h" #include "../common/FsBlockDevice.h" +#include "../common/SysCall.h" /** * \class FatFormatter * \brief Format a FAT volume. */ class FatFormatter { public: + /** Constructor. */ + FatFormatter() = default; /** * Format a FAT volume. * diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatLib.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatLib.h similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatLib.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatLib.h index 7b51c87d..057d4041 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatLib.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,6 +24,6 @@ */ #ifndef FatLib_h #define FatLib_h -#include "FatVolume.h" #include "FatFormatter.h" +#include "FatVolume.h" #endif // FatLib_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatName.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatName.cpp similarity index 94% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatName.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatName.cpp index 8a1205cd..4a4dbff2 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatName.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatName.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,11 @@ //------------------------------------------------------------------------------ uint16_t FatFile::getLfnChar(DirLfn_t* ldir, uint8_t i) { if (i < 5) { - return getLe16(ldir->unicode1 + 2*i); + return getLe16(ldir->unicode1 + 2 * i); } else if (i < 11) { - return getLe16(ldir->unicode2 + 2*i - 10); + return getLe16(ldir->unicode2 + 2 * (i - 5)); } else if (i < 13) { - return getLe16(ldir->unicode3 + 2*i - 22); + return getLe16(ldir->unicode3 + 2 * (i - 11)); } DBG_HALT_IF(i >= 13); return 0; @@ -87,11 +87,11 @@ size_t FatFile::getName7(char* name, size_t size) { name[n++] = c >= 0X7F ? '?' : c; } } - done: +done: name[n] = 0; return n; - fail: +fail: name[0] = '\0'; return 0; } @@ -105,8 +105,8 @@ size_t FatFile::getName8(char* name, size_t size) { uint16_t hs = 0; uint32_t cp; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } if (!isLFN()) { return getSFN(name, size); @@ -156,11 +156,11 @@ size_t FatFile::getName8(char* name, size_t size) { str = ptr; } } - done: +done: *str = '\0'; return str - name; - fail: +fail: *name = 0; return 0; } @@ -217,7 +217,7 @@ size_t FatFile::getSFN(char* name, size_t size) { name[j] = '\0'; return j; - fail: +fail: name[0] = '\0'; return 0; } @@ -227,10 +227,10 @@ size_t FatFile::printName(print_t* pr) { return printSFN(pr); #elif USE_UTF8_LONG_NAMES return printName8(pr); -# else // USE_LONG_FILE_NAMES +#else // USE_LONG_FILE_NAMES return printName7(pr); #endif // !USE_LONG_FILE_NAMES - } +} //------------------------------------------------------------------------------ size_t FatFile::printName7(print_t* pr) { FatFile dir; @@ -240,8 +240,8 @@ size_t FatFile::printName7(print_t* pr) { uint8_t i; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } if (!isLFN()) { return printSFN(pr); @@ -274,11 +274,11 @@ size_t FatFile::printName7(print_t* pr) { } return n; - fail: +fail: return 0; } //------------------------------------------------------------------------------ -size_t FatFile::printName8(print_t *pr) { +size_t FatFile::printName8(print_t* pr) { FatFile dir; DirLfn_t* ldir; uint16_t hs = 0; @@ -287,8 +287,8 @@ size_t FatFile::printName8(print_t *pr) { char buf[5]; char* end = buf + sizeof(buf); if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } if (!isLFN()) { return printSFN(pr); @@ -309,7 +309,7 @@ size_t FatFile::printName8(print_t *pr) { goto fail; } for (uint8_t i = 0; i < 13; i++) { - uint16_t c = getLfnChar(ldir, i);; + uint16_t c = getLfnChar(ldir, i); if (hs) { if (!FsUtf::isLowSurrogate(c)) { DBG_FAIL_MACRO; @@ -334,12 +334,12 @@ size_t FatFile::printName8(print_t *pr) { DBG_FAIL_MACRO; goto fail; } - n += pr->write(buf, str - buf); + n += pr->write(reinterpret_cast(buf), str - buf); } } return n; - fail: +fail: return 0; } //------------------------------------------------------------------------------ @@ -351,6 +351,6 @@ size_t FatFile::printSFN(print_t* pr) { } return pr->write(name); - fail: +fail: return 0; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.cpp similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.cpp index feb2f38d..f6d20437 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -84,7 +84,7 @@ bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { *next = find; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -149,7 +149,7 @@ bool FatPartition::allocContiguous(uint32_t count, uint32_t* firstCluster) { *firstCluster = bgnCluster; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -176,7 +176,7 @@ int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { next = getLe32(pc + offset); } else if (fatType() == 16) { cluster &= 0XFFFF; - sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); + sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1)); pc = fatCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; @@ -216,7 +216,7 @@ int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { *value = next; return 1; - fail: +fail: return -1; } //------------------------------------------------------------------------------ @@ -245,7 +245,7 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { if (fatType() == 16) { cluster &= 0XFFFF; - sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); + sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1)); pc = fatCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!pc) { DBG_FAIL_MACRO; @@ -293,7 +293,7 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { goto fail; } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -322,7 +322,7 @@ bool FatPartition::freeChain(uint32_t cluster) { return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -357,7 +357,7 @@ int32_t FatPartition::freeClusterCount() { DBG_FAIL_MACRO; goto fail; } - n = fatType() == 16 ? m_bytesPerSector/2 : m_bytesPerSector/4; + n = fatType() == 16 ? m_bytesPerSector / 2 : m_bytesPerSector / 4; if (todo < n) { n = todo; } @@ -386,14 +386,13 @@ int32_t FatPartition::freeClusterCount() { setFreeClusterCount(free); return free; - fail: +fail: return -1; } //------------------------------------------------------------------------------ -bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { - uint32_t clusterCount; +bool FatPartition::init(FsBlockDevice* dev, uint8_t part, uint32_t volStart) { + uint32_t countOfClusters; uint32_t totalSectors; - uint32_t volumeStartSector = 0; m_blockDev = dev; pbs_t* pbs; BpbFat32_t* bpb; @@ -412,21 +411,27 @@ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { DBG_FAIL_MACRO; goto fail; } - mbr = reinterpret_cast - (dataCachePrepare(0, FsCache::CACHE_FOR_READ)); - MbrPart_t* mp = mbr->part + part - 1; - - if (!mbr || mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { + mbr = reinterpret_cast( + dataCachePrepare(0, FsCache::CACHE_FOR_READ)); + if (!mbr) { DBG_FAIL_MACRO; goto fail; } - volumeStartSector = getLe32(mp->relativeSectors); + MbrPart_t* mp = mbr->part + part - 1; + if (mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { + DBG_FAIL_MACRO; + goto fail; + } + volStart = getLe32(mp->relativeSectors); + } + pbs = reinterpret_cast( + dataCachePrepare(volStart, FsCache::CACHE_FOR_READ)); + if (!pbs) { + DBG_FAIL_MACRO; + goto fail; } - pbs = reinterpret_cast - (dataCachePrepare(volumeStartSector, FsCache::CACHE_FOR_READ)); bpb = reinterpret_cast(pbs->bpb); - if (!pbs || bpb->fatCount != 2 || - getLe16(bpb->bytesPerSector) != m_bytesPerSector) { + if (bpb->fatCount != 2 || getLe16(bpb->bytesPerSector) != m_bytesPerSector) { DBG_FAIL_MACRO; goto fail; } @@ -445,7 +450,7 @@ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { if (m_sectorsPerFat == 0) { m_sectorsPerFat = getLe32(bpb->sectorsPerFat32); } - m_fatStartSector = volumeStartSector + getLe16(bpb->reservedSectorCount); + m_fatStartSector = volStart + getLe16(bpb->reservedSectorCount); // count for FAT16 zero for FAT32 m_rootDirEntryCount = getLe16(bpb->rootDirEntryCount); @@ -453,8 +458,10 @@ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { // directory start for FAT16 dataStart for FAT32 m_rootDirStart = m_fatStartSector + 2 * m_sectorsPerFat; // data start for FAT16 and FAT32 - m_dataStartSector = m_rootDirStart + - ((FS_DIR_SIZE*m_rootDirEntryCount + m_bytesPerSector - 1)/m_bytesPerSector); + m_dataStartSector = + m_rootDirStart + + ((FS_DIR_SIZE * m_rootDirEntryCount + m_bytesPerSector - 1) / + m_bytesPerSector); // total sectors for FAT16 or FAT32 totalSectors = getLe16(bpb->totalSectors16); @@ -462,22 +469,22 @@ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { totalSectors = getLe32(bpb->totalSectors32); } // total data sectors - clusterCount = totalSectors - (m_dataStartSector - volumeStartSector); + countOfClusters = totalSectors - (m_dataStartSector - volStart); // divide by cluster size to get cluster count - clusterCount >>= m_sectorsPerClusterShift; - m_lastCluster = clusterCount + 1; + countOfClusters >>= m_sectorsPerClusterShift; + m_lastCluster = countOfClusters + 1; // Indicate unknown number of free clusters. setFreeClusterCount(-1); // FAT type is determined by cluster count - if (clusterCount < 4085) { + if (countOfClusters < 4085) { m_fatType = 12; if (!FAT12_SUPPORT) { DBG_FAIL_MACRO; goto fail; } - } else if (clusterCount < 65525) { + } else if (countOfClusters < 65525) { m_fatType = 16; } else { m_rootDirStart = getLe32(bpb->fat32RootCluster); @@ -489,6 +496,6 @@ bool FatPartition::init(FsBlockDevice* dev, uint8_t part) { #endif // USE_SEPARATE_FAT_CACHE return true; - fail: +fail: return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.h similarity index 67% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.h index a9d45d98..076573d0 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatPartition.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatPartition.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,10 +29,11 @@ * \brief FatPartition class */ #include -#include "../common/SysCall.h" + #include "../common/FsBlockDevice.h" #include "../common/FsCache.h" #include "../common/FsStructs.h" +#include "../common/SysCall.h" /** Type for FAT12 partition */ const uint8_t FAT_TYPE_FAT12 = 12; @@ -52,7 +53,7 @@ class FatPartition { public: /** Create an instance of FatPartition */ - FatPartition() {} + FatPartition() = default; /** \return The shift count required to multiply by bytesPerCluster. */ uint8_t bytesPerClusterShift() const { @@ -63,50 +64,32 @@ class FatPartition { return m_bytesPerSector << m_sectorsPerClusterShift; } /** \return Number of bytes per sector. */ - uint16_t bytesPerSector() const { - return m_bytesPerSector; - } + uint16_t bytesPerSector() const { return m_bytesPerSector; } /** \return The shift count required to multiply by bytesPerCluster. */ - uint8_t bytesPerSectorShift() const { - return m_bytesPerSectorShift; - } - /** \return Number of directory entries per sector. */ + uint8_t bytesPerSectorShift() const { return m_bytesPerSectorShift; } + /** \return Number of directory entries per cluster. */ uint16_t dirEntriesPerCluster() const { - return m_sectorsPerCluster*(m_bytesPerSector/FS_DIR_SIZE); + return m_sectorsPerCluster * (m_bytesPerSector / FS_DIR_SIZE); } /** \return Mask for sector offset. */ - uint16_t sectorMask() const { - return m_sectorMask; - } + uint16_t sectorMask() const { return m_sectorMask; } /** \return The volume's cluster size in sectors. */ - uint8_t sectorsPerCluster() const { - return m_sectorsPerCluster; - } + uint8_t sectorsPerCluster() const { return m_sectorsPerCluster; } #ifndef DOXYGEN_SHOULD_SKIP_THIS uint8_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** \return The number of sectors in one FAT. */ - uint32_t sectorsPerFat() const { - return m_sectorsPerFat; - } + uint32_t sectorsPerFat() const { return m_sectorsPerFat; } /** Clear the cache and returns a pointer to the cache. Not for normal apps. * \return A pointer to the cache buffer or zero if an error occurs. */ - uint8_t* cacheClear() { - return m_cache.clear(); - } + uint8_t* cacheClear() { return m_cache.clear(); } /** \return The total number of clusters in the volume. */ - uint32_t clusterCount() const { - return m_lastCluster - 1; - } + uint32_t clusterCount() const { return m_lastCluster - 1; } /** \return The shift count required to multiply by sectorsPerCluster. */ - uint8_t sectorsPerClusterShift() const { - return m_sectorsPerClusterShift; - } + uint8_t sectorsPerClusterShift() const { return m_sectorsPerClusterShift; } /** \return The logical sector number for the start of file data. */ - uint32_t dataStartSector() const { - return m_dataStartSector; - } + uint32_t dataStartSector() const { return m_dataStartSector; } /** End access to volume * \return pointer to sector size buffer for format. */ @@ -115,21 +98,12 @@ class FatPartition { return cacheClear(); } /** \return The number of File Allocation Tables. */ - uint8_t fatCount() const { - return 2; - } + uint8_t fatCount() const { return 2; } /** \return The logical sector number for the start of the first FAT. */ - uint32_t fatStartSector() const { - return m_fatStartSector; - } + uint32_t fatStartSector() const { return m_fatStartSector; } /** \return The FAT type of the volume. Values are 12, 16 or 32. */ - uint8_t fatType() const { - return m_fatType; - } - /** Volume free space in clusters. - * - * \return Count of free clusters for success or -1 if an error occurs. - */ + uint8_t fatType() const { return m_fatType; } + /** \return free cluster count or -1 if an error occurs. */ int32_t freeClusterCount(); /** Initialize a FAT partition. * @@ -137,23 +111,20 @@ class FatPartition { * \param[in] part The partition to be used. Legal values for \a part are * 1-4 to use the corresponding partition on a device formatted with * a MBR, Master Boot Record, or zero if the device is formatted as - * a super floppy with the FAT boot sector in sector zero. + * a super floppy with the FAT boot sector in sector volStart. + * \param[in] volStart location of volume if part is zero. * * \return true for success or false for failure. */ - bool init(FsBlockDevice* dev, uint8_t part = 1); + bool init(FsBlockDevice* dev, uint8_t part = 1, uint32_t volStart = 0); /** \return The number of entries in the root directory for FAT16 volumes. */ - uint16_t rootDirEntryCount() const { - return m_rootDirEntryCount; - } + uint16_t rootDirEntryCount() const { return m_rootDirEntryCount; } /** \return The logical sector number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. */ - uint32_t rootDirStart() const { - return m_rootDirStart; - } + uint32_t rootDirStart() const { return m_rootDirStart; } /** \return The number of sectors in the volume */ uint32_t volumeSectorCount() const { - return sectorsPerCluster()*clusterCount(); + return sectorsPerCluster() * clusterCount(); } /** Debug access to FAT table * @@ -161,15 +132,13 @@ class FatPartition { * \param[out] v value of entry * \return -1 error, 0 EOC, else 1. */ - int8_t dbgFat(uint32_t n, uint32_t* v) { - return fatGet(n, v); - } + int8_t dbgFat(uint32_t n, uint32_t* v) { return fatGet(n, v); } /** * Check for FsBlockDevice busy. * * \return true if busy else false. */ - bool isBusy() {return m_blockDev->isBusy();} + bool isBusy() { return m_blockDev->isBusy(); } //---------------------------------------------------------------------------- #ifndef DOXYGEN_SHOULD_SKIP_THIS bool dmpDirSector(print_t* pr, uint32_t sector); @@ -182,22 +151,22 @@ class FatPartition { /** FatFile allowed access to private members. */ friend class FatFile; //---------------------------------------------------------------------------- - static const uint8_t m_bytesPerSectorShift = 9; + static const uint8_t m_bytesPerSectorShift = 9; static const uint16_t m_bytesPerSector = 1 << m_bytesPerSectorShift; static const uint16_t m_sectorMask = m_bytesPerSector - 1; //---------------------------------------------------------------------------- - FsBlockDevice* m_blockDev; // sector device - uint8_t m_sectorsPerCluster; // Cluster size in sectors. - uint8_t m_clusterSectorMask; // Mask to extract sector of cluster. - uint8_t m_sectorsPerClusterShift; // Cluster count to sector count shift. - uint8_t m_fatType = 0; // Volume type (12, 16, OR 32). - uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir. - uint32_t m_allocSearchStart; // Start cluster for alloc search. - uint32_t m_sectorsPerFat; // FAT size in sectors - uint32_t m_dataStartSector; // First data sector number. - uint32_t m_fatStartSector; // Start sector for first FAT. - uint32_t m_lastCluster; // Last cluster number in FAT. - uint32_t m_rootDirStart; // Start sector FAT16, cluster FAT32. + FsBlockDevice* m_blockDev; // sector device + uint8_t m_sectorsPerCluster; // Cluster size in sectors. + uint8_t m_clusterSectorMask; // Mask to extract sector of cluster. + uint8_t m_sectorsPerClusterShift; // Cluster count to sector count shift. + uint8_t m_fatType = 0; // Volume type (12, 16, OR 32). + uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir. + uint32_t m_allocSearchStart; // Start cluster for alloc search. + uint32_t m_sectorsPerFat; // FAT size in sectors + uint32_t m_dataStartSector; // First data sector number. + uint32_t m_fatStartSector; // Start sector for first FAT. + uint32_t m_lastCluster; // Last cluster number in FAT. + uint32_t m_rootDirStart; // Start sector FAT16, cluster FAT32. //---------------------------------------------------------------------------- // sector I/O functions. bool cacheSafeRead(uint32_t sector, uint8_t* dst) { @@ -212,33 +181,22 @@ class FatPartition { bool cacheSafeWrite(uint32_t sector, const uint8_t* dst, size_t count) { return m_cache.cacheSafeWrite(sector, dst, count); } - bool syncDevice() { - return m_blockDev->syncDevice(); - } + bool syncDevice() { return m_blockDev->syncDevice(); } #if MAINTAIN_FREE_CLUSTER_COUNT - int32_t m_freeClusterCount; // Count of free clusters in volume. - void setFreeClusterCount(int32_t value) { - m_freeClusterCount = value; - } + int32_t m_freeClusterCount; // Count of free clusters in volume. + void setFreeClusterCount(int32_t value) { m_freeClusterCount = value; } void updateFreeClusterCount(int32_t change) { if (m_freeClusterCount >= 0) { m_freeClusterCount += change; } } -#else // MAINTAIN_FREE_CLUSTER_COUNT - void setFreeClusterCount(int32_t value) { - (void)value; - } - void updateFreeClusterCount(int32_t change) { - (void)change; - } +#else // MAINTAIN_FREE_CLUSTER_COUNT + void setFreeClusterCount(int32_t value) { (void)value; } + void updateFreeClusterCount(int32_t change) { (void)change; } #endif // MAINTAIN_FREE_CLUSTER_COUNT -// sector caches + // sector caches FsCache m_cache; - bool cachePrepare(uint32_t sector, uint8_t option) { - return m_cache.prepare(sector, option); - } - FsCache* dataCache() {return &m_cache;} + FsCache* dataCache() { return &m_cache; } #if USE_SEPARATE_FAT_CACHE FsCache m_fatCache; uint8_t* fatCachePrepare(uint32_t sector, uint8_t options) { @@ -248,33 +206,20 @@ class FatPartition { bool cacheSync() { return m_cache.sync() && m_fatCache.sync() && syncDevice(); } -#else // USE_SEPARATE_FAT_CACHE +#else // USE_SEPARATE_FAT_CACHE uint8_t* fatCachePrepare(uint32_t sector, uint8_t options) { options |= FsCache::CACHE_STATUS_MIRROR_FAT; return dataCachePrepare(sector, options); } - bool cacheSync() { - return m_cache.sync() && syncDevice(); - } + bool cacheSync() { return m_cache.sync() && syncDevice(); } #endif // USE_SEPARATE_FAT_CACHE uint8_t* dataCachePrepare(uint32_t sector, uint8_t options) { return m_cache.prepare(sector, options); } - void cacheInvalidate() { - m_cache.invalidate(); - } - bool cacheSyncData() { - return m_cache.sync(); - } - uint8_t* cacheAddress() { - return m_cache.cacheBuffer(); - } - uint32_t cacheSectorNumber() { - return m_cache.sector(); - } - void cacheDirty() { - m_cache.dirty(); - } + bool cacheSyncData() { return m_cache.sync(); } + uint8_t* cacheAddress() { return m_cache.cacheBuffer(); } + uint32_t cacheSectorNumber() { return m_cache.sector(); } + void cacheDirty() { m_cache.dirty(); } //---------------------------------------------------------------------------- bool allocateCluster(uint32_t current, uint32_t* next); bool allocContiguous(uint32_t count, uint32_t* firstCluster); @@ -286,12 +231,8 @@ class FatPartition { } int8_t fatGet(uint32_t cluster, uint32_t* value); bool fatPut(uint32_t cluster, uint32_t value); - bool fatPutEOC(uint32_t cluster) { - return fatPut(cluster, 0x0FFFFFFF); - } + bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); - bool isEOC(uint32_t cluster) const { - return cluster > m_lastCluster; - } + bool isEOC(uint32_t cluster) const { return cluster > m_lastCluster; } }; #endif // FatPartition diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.cpp similarity index 92% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.cpp index 29c1bc62..3003546a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -27,7 +27,7 @@ #include "FatLib.h" FatVolume* FatVolume::m_cwv = nullptr; //------------------------------------------------------------------------------ -bool FatVolume::chdir(const char *path) { +bool FatVolume::chdir(const char* path) { FatFile dir; if (!dir.open(vwd(), path, O_RDONLY)) { DBG_FAIL_MACRO; @@ -37,9 +37,10 @@ bool FatVolume::chdir(const char *path) { DBG_FAIL_MACRO; goto fail; } - m_vwd = dir; + // m_vwd = dir; + m_vwd.copy(&dir); return true; - fail: +fail: return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.h similarity index 85% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.h index fe79a42a..daf64c39 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FatLib/FatVolume.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FatLib/FatVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -34,17 +34,38 @@ * \class FatVolume * \brief Integration class for the FatLib library. */ -class FatVolume : public FatPartition { +class FatVolume : public FatPartition { public: + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + File32 tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib() : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + File32 tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib(bits) : false; + } /** * Initialize an FatVolume object. * \param[in] dev Device block driver. * \param[in] setCwv Set current working volume if true. * \param[in] part partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1) { - if (!init(dev, part)) { + bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0) { + if (!init(dev, part, volStart)) { return false; } if (!chdir()) { @@ -56,7 +77,7 @@ class FatVolume : public FatPartition { return true; } /** Change global current working volume to this volume. */ - void chvol() {m_cwv = this;} + void chvol() { m_cwv = this; } /** * Set volume working directory to root. @@ -71,7 +92,7 @@ class FatVolume : public FatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const char *path); + bool chdir(const char* path); //---------------------------------------------------------------------------- /** * Test for the existence of a file. @@ -99,9 +120,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool ls(print_t* pr, uint8_t flags = 0) { - return m_vwd.ls(pr, flags); - } + bool ls(print_t* pr, uint8_t flags = 0) { return m_vwd.ls(pr, flags); } //---------------------------------------------------------------------------- /** List the contents of a directory. * @@ -143,7 +162,7 @@ class FatVolume : public FatPartition { * \param[in] oflag open flags. * \return a File32 object. */ - File32 open(const char *path, oflag_t oflag = O_RDONLY) { + File32 open(const char* path, oflag_t oflag = O_RDONLY) { File32 tmpFile; tmpFile.open(this, path, oflag); return tmpFile; @@ -174,7 +193,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool rename(const char *oldPath, const char *newPath) { + bool rename(const char* oldPath, const char* newPath) { FatFile file; return file.open(vwd(), oldPath, O_RDONLY) && file.rename(vwd(), newPath); } @@ -205,7 +224,7 @@ class FatVolume : public FatPartition { return file.open(this, path, O_WRONLY) && file.truncate(length); } #if ENABLE_ARDUINO_SERIAL - /** List the directory contents of the root directory to Serial. + /** List the directory contents of the root directory to Serial. * * \param[in] flags The inclusive OR of * @@ -217,9 +236,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool ls(uint8_t flags = 0) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -245,19 +262,15 @@ class FatVolume : public FatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } - /** + bool chdir(const String& path) { return chdir(path.c_str()); } + /** * Test for the existence of a file. * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String& path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid name for the subdirectory. @@ -276,7 +289,7 @@ class FatVolume : public FatPartition { * \return a File32 object. */ File32 open(const String& path, oflag_t oflag = O_RDONLY) { - return open(path.c_str(), oflag ); + return open(path.c_str(), oflag); } /** Remove a file from the volume root directory. * @@ -284,9 +297,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool remove(const String& path) { - return remove(path.c_str()); - } + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -312,9 +323,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool rmdir(const String& path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Truncate a file to a specified length. The current file position * will be at the new EOF. * @@ -330,8 +339,8 @@ class FatVolume : public FatPartition { private: friend FatFile; - static FatVolume* cwv() {return m_cwv;} - FatFile* vwd() {return &m_vwd;} + static FatVolume* cwv() { return m_cwv; } + FatFile* vwd() { return &m_vwd; } static FatVolume* m_cwv; FatFile m_vwd; }; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.cpp similarity index 98% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.cpp index af3ead45..d90959e9 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.h similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.h index d0e77257..60729fac 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FreeStack.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FreeStack.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -34,7 +34,7 @@ /** Indicate FillStack() and UnusedStack() are available. */ #define HAS_UNUSED_STACK 1 /** boundary between stack and heap. */ -extern char *__brkval; +extern char* __brkval; /** End of bss section.*/ extern char __bss_end; /** Amount of free stack space. @@ -48,9 +48,7 @@ inline int FreeStack() { #define HAS_UNUSED_STACK 0 #elif defined(PLATFORM_ID) // Particle board #include "Arduino.h" -inline int FreeStack() { - return System.freeMemory(); -} +inline int FreeStack() { return System.freeMemory(); } #elif defined(__IMXRT1062__) #define HAS_UNUSED_STACK 1 extern uint8_t _ebss; @@ -69,9 +67,7 @@ inline int FreeStack() { #ifndef FREE_STACK_CPP #warning FreeStack is not defined for this system. #endif // FREE_STACK_CPP -inline int FreeStack() { - return 0; -} +inline int FreeStack() { return 0; } #endif // defined(__AVR__) || defined(DOXYGEN) #if defined(HAS_UNUSED_STACK) || defined(DOXYGEN) /** Fill stack with 0x55 pattern */ @@ -89,6 +85,6 @@ int UnusedStack(); #else // HAS_UNUSED_STACK #define HAS_UNUSED_STACK 0 inline void FillStack() {} -inline int UnusedStack() {return 0;} +inline int UnusedStack() { return 0; } #endif // defined(HAS_UNUSED_STACK) #endif // FreeStack_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.cpp similarity index 81% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.cpp index a6bf54b4..4ac76131 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,42 +23,43 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsLib.h" +#if FILE_COPY_CONSTRUCTOR_SELECT //------------------------------------------------------------------------------ -FsBaseFile::FsBaseFile(const FsBaseFile& from) { - m_fFile = nullptr; - m_xFile = nullptr; - if (from.m_fFile) { - m_fFile = new (m_fileMem) FatFile; - *m_fFile = *from.m_fFile; - } else if (from.m_xFile) { - m_xFile = new (m_fileMem) ExFatFile; - *m_xFile = *from.m_xFile; +FsBaseFile::FsBaseFile(const FsBaseFile& from) { copy(&from); } +//------------------------------------------------------------------------------ +FsBaseFile& FsBaseFile::operator=(const FsBaseFile& from) { + copy(&from); + return *this; +} +#endif // FILE_COPY_CONSTRUCTOR_SELECT +//------------------------------------------------------------------------------ +void FsBaseFile::copy(const FsBaseFile* from) { + if (from != this) { + m_fFile = nullptr; + m_xFile = nullptr; + if (from->m_fFile) { + m_fFile = new (m_fileMem) FatFile; + m_fFile->copy(from->m_fFile); + } else if (from->m_xFile) { + m_xFile = new (m_fileMem) ExFatFile; + m_xFile->copy(from->m_xFile); + } } } //------------------------------------------------------------------------------ -FsBaseFile& FsBaseFile::operator=(const FsBaseFile& from) { - if (this == &from) return *this; - close(); - if (from.m_fFile) { - m_fFile = new (m_fileMem) FatFile; - *m_fFile = *from.m_fFile; - } else if (from.m_xFile) { - m_xFile = new (m_fileMem) ExFatFile; - *m_xFile = *from.m_xFile; +void FsBaseFile::move(FsBaseFile* from) { + if (from != this) { + copy(from); + from->m_fFile = nullptr; + from->m_xFile = nullptr; } - return *this; } //------------------------------------------------------------------------------ bool FsBaseFile::close() { - if (m_fFile && m_fFile->close()) { - m_fFile = nullptr; - return true; - } - if (m_xFile && m_xFile->close()) { - m_xFile = nullptr; - return true; - } - return false; + bool rtn = m_fFile ? m_fFile->close() : m_xFile ? m_xFile->close() : true; + m_fFile = nullptr; + m_xFile = nullptr; + return rtn; } //------------------------------------------------------------------------------ bool FsBaseFile::mkdir(FsBaseFile* dir, const char* path, bool pFlag) { @@ -136,6 +137,24 @@ bool FsBaseFile::open(FsBaseFile* dir, uint32_t index, oflag_t oflag) { return false; } //------------------------------------------------------------------------------ +bool FsBaseFile::openCwd() { + close(); + if (FsVolume::m_cwv && FsVolume::m_cwv->m_fVol) { + m_fFile = new (m_fileMem) FatFile; + if (m_fFile->openCwd()) { + return true; + } + m_fFile = nullptr; + } else if (FsVolume::m_cwv && FsVolume::m_cwv->m_xVol) { + m_xFile = new (m_fileMem) ExFatFile; + if (m_xFile->openCwd()) { + return true; + } + m_xFile = nullptr; + } + return false; +} +//------------------------------------------------------------------------------ bool FsBaseFile::openNext(FsBaseFile* dir, oflag_t oflag) { close(); if (dir->m_fFile) { diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.h similarity index 67% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.h index 313abb3e..c8df331e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFile.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,9 +28,10 @@ * \file * \brief FsBaseFile include file. */ -#include "FsNew.h" -#include "FatLib/FatLib.h" #include "ExFatLib/ExFatLib.h" +#include "FatLib/FatLib.h" +#include "FsNew.h" +#include "FsVolume.h" /** * \class FsBaseFile * \brief FsBaseFile class. @@ -38,7 +39,7 @@ class FsBaseFile { public: /** Create an instance. */ - FsBaseFile() {} + FsBaseFile() = default; /** Create a file object and open it in the current working directory. * * \param[in] path A path for a file to be opened. @@ -46,13 +47,20 @@ class FsBaseFile { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). */ - FsBaseFile(const char* path, oflag_t oflag) { - open(path, oflag); - } + FsBaseFile(const char* path, oflag_t oflag) { open(path, oflag); } - ~FsBaseFile() {close();} + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const FsBaseFile* from); + + /** move from to this. + * \param[in] from Source file. + */ + void move(FsBaseFile* from); + +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC /** Copy constructor. - * * \param[in] from Object used to initialize this instance. */ FsBaseFile(const FsBaseFile& from); @@ -61,24 +69,83 @@ class FsBaseFile { * \return assigned object. */ FsBaseFile& operator=(const FsBaseFile& from); +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + FsBaseFile(const FsBaseFile& from); + FsBaseFile& operator=(const FsBaseFile& from); + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + FsBaseFile(const FsBaseFile& from) = delete; + FsBaseFile& operator=(const FsBaseFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from File to move. + */ + FsBaseFile(FsBaseFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from File to move. + * \return Assigned file. + */ + FsBaseFile& operator=(FsBaseFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + FsBaseFile(FsBaseFile&& from) = delete; + FsBaseFile& operator=(FsBaseFile&& from) = delete; +#endif // FILE_MOVE_CONSTRUCTOR_SELECT + +#if DESTRUCTOR_CLOSES_FILE + ~FsBaseFile() { + if (isOpen()) { + close(); + } + } +#else // DESTRUCTOR_CLOSES_FILE + ~FsBaseFile() = default; +#endif // DESTRUCTOR_CLOSES_FILE + /** The parenthesis operator. - * - * \return true if a file is open. - */ - operator bool() const {return isOpen();} + * + * \return true if a file is open. + */ + operator bool() const { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { + return m_fFile ? m_fFile->attrib() : m_xFile ? m_xFile->attrib() : -1; + } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits) { + return m_fFile ? m_fFile->attrib(bits) + : m_xFile ? m_xFile->attrib(bits) + : false; + } /** \return number of bytes available from the current position to EOF * or INT_MAX if more than INT_MAX bytes are available. */ int available() const { - return m_fFile ? m_fFile->available() : - m_xFile ? m_xFile->available() : 0; + return m_fFile ? m_fFile->available() : m_xFile ? m_xFile->available() : 0; } /** \return The number of bytes available from the current position * to EOF for normal files. Zero is returned for directory files. */ uint64_t available64() const { - return m_fFile ? m_fFile->available32() : - m_xFile ? m_xFile->available64() : 0; + return m_fFile ? m_fFile->available32() + : m_xFile ? m_xFile->available64() + : 0; } /** Clear writeError. */ void clearWriteError() { @@ -102,18 +169,29 @@ class FsBaseFile { * \return true for success or false for failure. */ bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { - return m_fFile ? m_fFile->contiguousRange(bgnSector, endSector) : - m_xFile ? m_xFile->contiguousRange(bgnSector, endSector) : false; + return m_fFile ? m_fFile->contiguousRange(bgnSector, endSector) + : m_xFile ? m_xFile->contiguousRange(bgnSector, endSector) + : false; + } + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const { + return m_fFile ? m_fFile->curCluster() + : m_xFile ? m_xFile->curCluster() + : 0; } /** \return The current position for a file or directory. */ uint64_t curPosition() const { - return m_fFile ? m_fFile->curPosition() : - m_xFile ? m_xFile->curPosition() : 0; + return m_fFile ? m_fFile->curPosition() + : m_xFile ? m_xFile->curPosition() + : 0; + } + /** \return Total allocated length for file. */ + uint64_t dataLength() const { + return m_fFile ? m_fFile->fileSize() : m_xFile ? m_xFile->dataLength() : 0; } /** \return Directory entry index. */ uint32_t dirIndex() const { - return m_fFile ? m_fFile->dirIndex() : - m_xFile ? m_xFile->dirIndex() : 0; + return m_fFile ? m_fFile->dirIndex() : m_xFile ? m_xFile->dirIndex() : 0; } /** Test for the existence of a file in a directory * @@ -127,8 +205,9 @@ class FsBaseFile { * \return true if the file exists else false. */ bool exists(const char* path) { - return m_fFile ? m_fFile->exists(path) : - m_xFile ? m_xFile->exists(path) : false; + return m_fFile ? m_fFile->exists(path) + : m_xFile ? m_xFile->exists(path) + : false; } /** get position for streams * \param[out] pos struct to receive position @@ -137,13 +216,13 @@ class FsBaseFile { if (m_fFile) m_fFile->fgetpos(pos); if (m_xFile) m_xFile->fgetpos(pos); } - /** + /** * Get a string from a file. * * fgets() reads bytes from a file into the array pointed to by \a str, until - * \a num - 1 bytes are read, or a delimiter is read and transferred to \a str, - * or end-of-file is encountered. The string is then terminated - * with a null byte. + * \a num - 1 bytes are read, or a delimiter is read and transferred to \a + * str, or end-of-file is encountered. The string is then terminated with a + * null byte. * * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' * terminates the string for Windows text files which use CRLF for newline. @@ -155,24 +234,26 @@ class FsBaseFile { * \param[in] delim Optional set of delimiters. The default is "\n". * * \return For success fgets() returns the length of the string in \a str. - * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. + * If no data is read, fgets() returns zero for EOF or -1 if an error + * occurred. */ int fgets(char* str, int num, char* delim = nullptr) { - return m_fFile ? m_fFile->fgets(str, num, delim) : - m_xFile ? m_xFile->fgets(str, num, delim) : -1; + return m_fFile ? m_fFile->fgets(str, num, delim) + : m_xFile ? m_xFile->fgets(str, num, delim) + : -1; } /** \return The total number of bytes in a file. */ uint64_t fileSize() const { - return m_fFile ? m_fFile->fileSize() : - m_xFile ? m_xFile->fileSize() : 0; + return m_fFile ? m_fFile->fileSize() : m_xFile ? m_xFile->fileSize() : 0; } /** \return Address of first sector or zero for empty file. */ uint32_t firstSector() const { - return m_fFile ? m_fFile->firstSector() : - m_xFile ? m_xFile->firstSector() : 0; + return m_fFile ? m_fFile->firstSector() + : m_xFile ? m_xFile->firstSector() + : 0; } /** Ensure that any bytes written to the file are saved to the SD card. */ - void flush() {sync();} + void flush() { sync(); } /** set position for streams * \param[in] pos struct with value for new position */ @@ -188,8 +269,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getAccessDateTime(pdate, ptime) : - m_xFile ? m_xFile->getAccessDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getAccessDateTime(pdate, ptime) + : m_xFile ? m_xFile->getAccessDateTime(pdate, ptime) + : false; } /** Get a file's create date and time. * @@ -199,13 +281,13 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getCreateDateTime(pdate, ptime) : - m_xFile ? m_xFile->getCreateDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getCreateDateTime(pdate, ptime) + : m_xFile ? m_xFile->getCreateDateTime(pdate, ptime) + : false; } /** \return All error bits. */ uint8_t getError() const { - return m_fFile ? m_fFile->getError() : - m_xFile ? m_xFile->getError() : 0XFF; + return m_fFile ? m_fFile->getError() : m_xFile ? m_xFile->getError() : 0XFF; } /** Get a file's Modify date and time. * @@ -215,8 +297,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getModifyDateTime(pdate, ptime) : - m_xFile ? m_xFile->getModifyDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getModifyDateTime(pdate, ptime) + : m_xFile ? m_xFile->getModifyDateTime(pdate, ptime) + : false; } /** * Get a file's name followed by a zero byte. @@ -229,14 +312,16 @@ class FsBaseFile { */ size_t getName(char* name, size_t len) { *name = 0; - return m_fFile ? m_fFile->getName(name, len) : - m_xFile ? m_xFile->getName(name, len) : 0; + return m_fFile ? m_fFile->getName(name, len) + : m_xFile ? m_xFile->getName(name, len) + : 0; } /** \return value of writeError */ bool getWriteError() const { - return m_fFile ? m_fFile->getWriteError() : - m_xFile ? m_xFile->getWriteError() : true; + return m_fFile ? m_fFile->getWriteError() + : m_xFile ? m_xFile->getWriteError() + : true; } /** * Check for FsBlockDevice busy. @@ -244,58 +329,67 @@ class FsBaseFile { * \return true if busy else false. */ bool isBusy() { - return m_fFile ? m_fFile->isBusy() : - m_xFile ? m_xFile->isBusy() : true; + return m_fFile ? m_fFile->isBusy() : m_xFile ? m_xFile->isBusy() : true; } /** \return True if the file is contiguous. */ bool isContiguous() const { #if USE_FAT_FILE_FLAG_CONTIGUOUS - return m_fFile ? m_fFile->isContiguous() : - m_xFile ? m_xFile->isContiguous() : false; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS + return m_fFile ? m_fFile->isContiguous() + : m_xFile ? m_xFile->isContiguous() + : false; +#else // USE_FAT_FILE_FLAG_CONTIGUOUS return m_xFile ? m_xFile->isContiguous() : false; #endif // USE_FAT_FILE_FLAG_CONTIGUOUS } /** \return True if this is a directory else false. */ bool isDir() const { - return m_fFile ? m_fFile->isDir() : - m_xFile ? m_xFile->isDir() : false; + return m_fFile ? m_fFile->isDir() : m_xFile ? m_xFile->isDir() : false; } /** This function reports if the current file is a directory or not. * \return true if the file is a directory. */ - bool isDirectory() const {return isDir();} + bool isDirectory() const { return isDir(); } /** \return True if this is a normal file. */ bool isFile() const { - return m_fFile ? m_fFile->isFile() : - m_xFile ? m_xFile->isFile() : false; + return m_fFile ? m_fFile->isFile() : m_xFile ? m_xFile->isFile() : false; + } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { + return m_fFile ? m_fFile->isFileOrSubDir() + : m_xFile ? m_xFile->isFileOrSubDir() + : false; } /** \return True if this is a hidden file else false. */ bool isHidden() const { - return m_fFile ? m_fFile->isHidden() : - m_xFile ? m_xFile->isHidden() : false; + return m_fFile ? m_fFile->isHidden() + : m_xFile ? m_xFile->isHidden() + : false; } /** \return True if this is an open file/directory else false. */ - bool isOpen() const {return m_fFile || m_xFile;} + bool isOpen() const { return m_fFile || m_xFile; } /** \return True file is readable. */ bool isReadable() const { - return m_fFile ? m_fFile->isReadable() : - m_xFile ? m_xFile->isReadable() : false; - } + return m_fFile ? m_fFile->isReadable() + : m_xFile ? m_xFile->isReadable() + : false; + } /** \return True if file is read-only */ bool isReadOnly() const { - return m_fFile ? m_fFile->isReadOnly() : - m_xFile ? m_xFile->isReadOnly() : false; + return m_fFile ? m_fFile->isReadOnly() + : m_xFile ? m_xFile->isReadOnly() + : false; } - /** \return True if this is a subdirectory file else false. */ + /** \return True if this is a sub-directory file else false. */ bool isSubDir() const { - return m_fFile ? m_fFile->isSubDir() : - m_xFile ? m_xFile->isSubDir() : false; + return m_fFile ? m_fFile->isSubDir() + : m_xFile ? m_xFile->isSubDir() + : false; } /** \return True file is writable. */ bool isWritable() const { - return m_fFile ? m_fFile->isWritable() : - m_xFile ? m_xFile->isWritable() : false; + return m_fFile ? m_fFile->isWritable() + : m_xFile ? m_xFile->isWritable() + : false; } #if ENABLE_ARDUINO_SERIAL /** List directory contents. @@ -307,14 +401,13 @@ class FsBaseFile { * LS_SIZE - %Print file size. * * LS_R - Recursive list of subdirectories. + * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } - /** List directory contents. */ - bool ls() { - return ls(&Serial); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } + /** List directory contents. + * \return true for success or false for failure. + */ + bool ls() { return ls(&Serial); } #endif // ENABLE_ARDUINO_SERIAL /** List directory contents. * @@ -323,8 +416,7 @@ class FsBaseFile { * \return true for success or false for failure. */ bool ls(print_t* pr) { - return m_fFile ? m_fFile->ls(pr) : - m_xFile ? m_xFile->ls(pr) : false; + return m_fFile ? m_fFile->ls(pr) : m_xFile ? m_xFile->ls(pr) : false; } /** List directory contents. * @@ -340,8 +432,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool ls(print_t* pr, uint8_t flags) { - return m_fFile ? m_fFile->ls(pr, flags) : - m_xFile ? m_xFile->ls(pr, flags) : false; + return m_fFile ? m_fFile->ls(pr, flags) + : m_xFile ? m_xFile->ls(pr, flags) + : false; } /** Make a new directory. * @@ -383,10 +476,12 @@ class FsBaseFile { * O_CREAT - If the file exists, this flag has no effect except as noted * under O_EXCL below. Otherwise, the file shall be created * - * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file + * exists. * * O_TRUNC - If the file exists and is a regular file, and the file is - * successfully opened and is not read only, its length shall be truncated to 0. + * successfully opened and is not read only, its length shall be truncated to + * 0. * * WARNING: A given file must not be opened by more than one file object * or file corruption may occur. @@ -410,7 +505,7 @@ class FsBaseFile { * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(FsBaseFile* dir, uint32_t index, oflag_t oflag); + bool open(FsBaseFile* dir, uint32_t index, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] vol Volume where the file is located. @@ -422,7 +517,7 @@ class FsBaseFile { * * \return true for success or false for failure. */ - bool open(FsVolume* vol, const char* path, oflag_t oflag); + bool open(FsVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] path A path for a file to be opened. @@ -435,6 +530,25 @@ class FsBaseFile { bool open(const char* path, oflag_t oflag = O_RDONLY) { return FsVolume::m_cwv && open(FsVolume::m_cwv, path, oflag); } + /** Open a file or directory by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a + * bitwise-inclusive OR of open flags. + * + * \return true for success or false for failure. + */ + bool open(uint32_t index, oflag_t oflag = O_RDONLY) { + FsBaseFile cwd; + return cwd.openCwd() && open(&cwd, index, oflag); + } + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); /** Opens the next file or folder in a directory. * \param[in] dir directory containing files. * \param[in] oflag open flags. @@ -449,14 +563,13 @@ class FsBaseFile { */ bool openRoot(FsVolume* vol); /** \return the current file position. */ - uint64_t position() const {return curPosition();} + uint64_t position() const { return curPosition(); } /** Return the next available byte without consuming it. * * \return The byte if no error and not at eof else -1; */ int peek() { - return m_fFile ? m_fFile->peek() : - m_xFile ? m_xFile->peek() : -1; + return m_fFile ? m_fFile->peek() : m_xFile ? m_xFile->peek() : -1; } /** Allocate contiguous clusters to an empty file. * @@ -470,8 +583,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool preAllocate(uint64_t length) { - return m_fFile ? length < (1ULL << 32) && m_fFile->preAllocate(length) : - m_xFile ? m_xFile->preAllocate(length) : false; + return m_fFile ? length < (1ULL << 32) && m_fFile->preAllocate(length) + : m_xFile ? m_xFile->preAllocate(length) + : false; } /** Print a file's access date and time * @@ -480,8 +594,9 @@ class FsBaseFile { * \return true for success or false for failure. */ size_t printAccessDateTime(print_t* pr) { - return m_fFile ? m_fFile->printAccessDateTime(pr) : - m_xFile ? m_xFile->printAccessDateTime(pr) : 0; + return m_fFile ? m_fFile->printAccessDateTime(pr) + : m_xFile ? m_xFile->printAccessDateTime(pr) + : 0; } /** Print a file's creation date and time * @@ -490,8 +605,9 @@ class FsBaseFile { * \return true for success or false for failure. */ size_t printCreateDateTime(print_t* pr) { - return m_fFile ? m_fFile->printCreateDateTime(pr) : - m_xFile ? m_xFile->printCreateDateTime(pr) : 0; + return m_fFile ? m_fFile->printCreateDateTime(pr) + : m_xFile ? m_xFile->printCreateDateTime(pr) + : 0; } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. @@ -500,8 +616,9 @@ class FsBaseFile { * \return The number of bytes written or -1 if an error occurs. */ size_t printField(double value, char term, uint8_t prec = 2) { - return m_fFile ? m_fFile->printField(value, term, prec) : - m_xFile ? m_xFile->printField(value, term, prec) : 0; + return m_fFile ? m_fFile->printField(value, term, prec) + : m_xFile ? m_xFile->printField(value, term, prec) + : 0; } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. @@ -510,17 +627,18 @@ class FsBaseFile { * \return The number of bytes written or -1 if an error occurs. */ size_t printField(float value, char term, uint8_t prec = 2) { - return printField(static_cast(value), term, prec); + return printField(static_cast(value), term, prec); } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. * \return The number of bytes written or -1 if an error occurs. */ - template + template size_t printField(Type value, char term) { - return m_fFile ? m_fFile->printField(value, term) : - m_xFile ? m_xFile->printField(value, term) : 0; + return m_fFile ? m_fFile->printField(value, term) + : m_xFile ? m_xFile->printField(value, term) + : 0; } /** Print a file's size. * @@ -530,8 +648,9 @@ class FsBaseFile { * for success and zero is returned for failure. */ size_t printFileSize(print_t* pr) { - return m_fFile ? m_fFile->printFileSize(pr) : - m_xFile ? m_xFile->printFileSize(pr) : 0; + return m_fFile ? m_fFile->printFileSize(pr) + : m_xFile ? m_xFile->printFileSize(pr) + : 0; } /** Print a file's modify date and time * @@ -540,8 +659,9 @@ class FsBaseFile { * \return true for success or false for failure. */ size_t printModifyDateTime(print_t* pr) { - return m_fFile ? m_fFile->printModifyDateTime(pr) : - m_xFile ? m_xFile->printModifyDateTime(pr) : 0; + return m_fFile ? m_fFile->printModifyDateTime(pr) + : m_xFile ? m_xFile->printModifyDateTime(pr) + : 0; } /** Print a file's name * @@ -550,8 +670,9 @@ class FsBaseFile { * \return true for success or false for failure. */ size_t printName(print_t* pr) { - return m_fFile ? m_fFile->printName(pr) : - m_xFile ? m_xFile->printName(pr) : 0; + return m_fFile ? m_fFile->printName(pr) + : m_xFile ? m_xFile->printName(pr) + : 0; } /** Read the next byte from a file. * @@ -576,8 +697,9 @@ class FsBaseFile { * or an I/O error occurred. */ int read(void* buf, size_t count) { - return m_fFile ? m_fFile->read(buf, count) : - m_xFile ? m_xFile->read(buf, count) : -1; + return m_fFile ? m_fFile->read(buf, count) + : m_xFile ? m_xFile->read(buf, count) + : -1; } /** Remove a file. * @@ -590,7 +712,7 @@ class FsBaseFile { * \return true for success or false for failure. */ bool remove(); - /** Remove a file. + /** Remove a file. * * The directory entry and all data for the file are deleted. * @@ -605,8 +727,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool remove(const char* path) { - return m_fFile ? m_fFile->remove(path) : - m_xFile ? m_xFile->remove(path) : false; + return m_fFile ? m_fFile->remove(path) + : m_xFile ? m_xFile->remove(path) + : false; } /** Rename a file or subdirectory. * @@ -615,19 +738,21 @@ class FsBaseFile { * \return true for success or false for failure. */ bool rename(const char* newPath) { - return m_fFile ? m_fFile->rename(newPath) : - m_xFile ? m_xFile->rename(newPath) : false; + return m_fFile ? m_fFile->rename(newPath) + : m_xFile ? m_xFile->rename(newPath) + : false; } /** Rename a file or subdirectory. * - * \param[in] dirFile Directory for the new path. + * \param[in] dir Directory for the new path. * \param[in] newPath New path name for the file/directory. * * \return true for success or false for failure. */ - bool rename(FsBaseFile* dirFile, const char* newPath) { - return m_fFile ? m_fFile->rename(dirFile->m_fFile, newPath) : - m_xFile ? m_xFile->rename(dirFile->m_xFile, newPath) : false; + bool rename(FsBaseFile* dir, const char* newPath) { + return m_fFile && dir->m_fFile ? m_fFile->rename(dir->m_fFile, newPath) + : m_xFile && dir->m_xFile ? m_xFile->rename(dir->m_xFile, newPath) + : false; } /** Set the file's current position to zero. */ void rewind() { @@ -657,22 +782,18 @@ class FsBaseFile { * \param[in] pos the new file position. * \return true for success or false for failure. */ - bool seek(uint64_t pos) {return seekSet(pos);} + bool seek(uint64_t pos) { return seekSet(pos); } /** Set the files position to current position + \a pos. See seekSet(). * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int64_t offset) { - return seekSet(curPosition() + offset); - } + bool seekCur(int64_t offset) { return seekSet(curPosition() + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. * \return true for success or false for failure. */ - bool seekEnd(int64_t offset = 0) { - return seekSet(fileSize() + offset); - } + bool seekEnd(int64_t offset = 0) { return seekSet(fileSize() + offset); } /** Sets a file's position. * * \param[in] pos The new position in bytes from the beginning of the file. @@ -680,19 +801,19 @@ class FsBaseFile { * \return true for success or false for failure. */ bool seekSet(uint64_t pos) { - return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet(pos) : - m_xFile ? m_xFile->seekSet(pos) : false; + return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet((uint32_t)pos) + : m_xFile ? m_xFile->seekSet(pos) + : false; } /** \return the file's size. */ - uint64_t size() const {return fileSize();} + uint64_t size() const { return fileSize(); } /** The sync() call causes all modified data and directory fields * to be written to the storage device. * * \return true for success or false for failure. */ bool sync() { - return m_fFile ? m_fFile->sync() : - m_xFile ? m_xFile->sync() : false; + return m_fFile ? m_fFile->sync() : m_xFile ? m_xFile->sync() : false; } /** Set a file's timestamps in its directory entry. * @@ -728,19 +849,20 @@ class FsBaseFile { */ bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { - return m_fFile ? - m_fFile->timestamp(flags, year, month, day, hour, minute, second) : - m_xFile ? - m_xFile->timestamp(flags, year, month, day, hour, minute, second) : - false; + return m_fFile ? m_fFile->timestamp(flags, year, month, day, hour, minute, + second) + : m_xFile ? m_xFile->timestamp(flags, year, month, day, hour, minute, + second) + : false; } /** Truncate a file to the current position. * * \return true for success or false for failure. */ bool truncate() { - return m_fFile ? m_fFile->truncate() : - m_xFile ? m_xFile->truncate() : false; + return m_fFile ? m_fFile->truncate() + : m_xFile ? m_xFile->truncate() + : false; } /** Truncate a file to a specified length. * The current file position will be set to end of file. @@ -750,23 +872,22 @@ class FsBaseFile { * \return true for success or false for failure. */ bool truncate(uint64_t length) { - return m_fFile ? length < (1ULL << 32) && m_fFile->truncate(length) : - m_xFile ? m_xFile->truncate(length) : false; + return m_fFile ? length < (1ULL << 32) && m_fFile->truncate(length) + : m_xFile ? m_xFile->truncate(length) + : false; } /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use getWriteError to check for errors. * \return count of characters written for success or -1 for failure. */ - size_t write(const char* str) { - return write(str, strlen(str)); - } + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a byte to a file. Required by the Arduino Print class. * \param[in] b the byte to be written. * Use getWriteError to check for errors. * \return 1 for success and 0 for failure. */ - size_t write(uint8_t b) {return write(&b, 1);} + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -780,13 +901,14 @@ class FsBaseFile { * \a nbyte. If an error occurs, write() returns zero and writeError is set. */ size_t write(const void* buf, size_t count) { - return m_fFile ? m_fFile->write(buf, count) : - m_xFile ? m_xFile->write(buf, count) : 0; + return m_fFile ? m_fFile->write(buf, count) + : m_xFile ? m_xFile->write(buf, count) + : 0; } private: newalign_t m_fileMem[FS_ALIGN_DIM(ExFatFile, FatFile)]; - FatFile* m_fFile = nullptr; + FatFile* m_fFile = nullptr; ExFatFile* m_xFile = nullptr; }; /** diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFormatter.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFormatter.h similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFormatter.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFormatter.h index 0c5d3a0a..96266edd 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsFormatter.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,14 +24,16 @@ */ #ifndef FsFormatter_h #define FsFormatter_h -#include "FatLib/FatLib.h" #include "ExFatLib/ExFatLib.h" +#include "FatLib/FatLib.h" /** * \class FsFormatter * \brief Format a exFAT/FAT volume. */ class FsFormatter { public: + /** Constructor. */ + FsFormatter() = default; /** * Format a FAT volume. * @@ -46,10 +48,10 @@ class FsFormatter { if (sectorCount == 0) { return false; } - return sectorCount <= 67108864 ? - m_fFmt.format(dev, secBuffer, pr) : - m_xFmt.format(dev, secBuffer, pr); + return sectorCount <= 67108864 ? m_fFmt.format(dev, secBuffer, pr) + : m_xFmt.format(dev, secBuffer, pr); } + private: FatFormatter m_fFmt; ExFatFormatter m_xFmt; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsLib.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsLib.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsLib.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsLib.h index 2539797a..97eeb07d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsLib.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,7 +28,7 @@ * \file * \brief FsLib include file. */ -#include "FsVolume.h" #include "FsFile.h" #include "FsFormatter.h" +#include "FsVolume.h" #endif // FsLib_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.cpp similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.cpp index f02acb73..b9063978 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.h similarity index 94% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.h index 9ca13f2b..1b19f865 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsNew.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsNew.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -36,7 +36,7 @@ typedef uint32_t newalign_t; /** Dimension of aligned area. */ #define NEW_ALIGN_DIM(n) \ - (((size_t)(n) + sizeof(newalign_t) - 1U)/sizeof(newalign_t)) + (((size_t)(n) + sizeof(newalign_t) - 1U) / sizeof(newalign_t)) /** Dimension of aligned area for etype or ftype class. */ #define FS_ALIGN_DIM(etype, ftype) NEW_ALIGN_DIM(FS_SIZE(etype, ftype)) diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.cpp similarity index 84% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.cpp index e36d6ce6..a578ff30 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,23 +25,22 @@ #include "FsLib.h" FsVolume* FsVolume::m_cwv = nullptr; //------------------------------------------------------------------------------ -bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part) { - m_blockDev = blockDev; +bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part, + uint32_t volStart) { m_fVol = nullptr; m_xVol = new (m_volMem) ExFatVolume; - if (m_xVol && m_xVol->begin(m_blockDev, false, part)) { + if (m_xVol && m_xVol->begin(blockDev, false, part, volStart)) { goto done; } m_xVol = nullptr; m_fVol = new (m_volMem) FatVolume; - if (m_fVol && m_fVol->begin(m_blockDev, false, part)) { + if (m_fVol && m_fVol->begin(blockDev, false, part, volStart)) { goto done; } - m_cwv = nullptr; m_fVol = nullptr; return false; - done: +done: if (setCwv || !m_cwv) { m_cwv = this; } @@ -53,14 +52,14 @@ bool FsVolume::ls(print_t* pr, const char* path, uint8_t flags) { return dir.open(this, path, O_RDONLY) && dir.ls(pr, flags); } //------------------------------------------------------------------------------ -FsFile FsVolume::open(const char *path, oflag_t oflag) { +FsFile FsVolume::open(const char* path, oflag_t oflag) { FsFile tmpFile; tmpFile.open(this, path, oflag); return tmpFile; } #if ENABLE_ARDUINO_STRING //------------------------------------------------------------------------------ -FsFile FsVolume::open(const String &path, oflag_t oflag) { - return open(path.c_str(), oflag ); +FsFile FsVolume::open(const String& path, oflag_t oflag) { + return open(path.c_str(), oflag); } #endif // ENABLE_ARDUINO_STRING diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.h b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.h similarity index 70% rename from extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.h index ec344b35..7a386e0b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/FsLib/FsVolume.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/FsLib/FsVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,9 +28,9 @@ * \file * \brief FsVolume include file. */ -#include "FsNew.h" -#include "../FatLib/FatLib.h" #include "../ExFatLib/ExFatLib.h" +#include "../FatLib/FatLib.h" +#include "FsNew.h" class FsFile; /** @@ -39,54 +39,75 @@ class FsFile; */ class FsVolume { public: - FsVolume() {} - - ~FsVolume() {end();} + FsVolume() = default; + ~FsVolume() { end(); } + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + return m_fVol ? m_fVol->attrib(path) : m_xVol ? m_xVol->attrib(path) : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + return m_fVol ? m_fVol->attrib(path, bits) + : m_xVol ? m_xVol->attrib(path, bits) + : false; + } /** * Initialize an FatVolume object. * \param[in] blockDev Device block driver. * \param[in] setCwv Set current working volume if true. * \param[in] part partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(FsBlockDevice* blockDev, bool setCwv = true, uint8_t part = 1); + bool begin(FsBlockDevice* blockDev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0); #ifndef DOXYGEN_SHOULD_SKIP_THIS uint32_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** \return the number of bytes in a cluster. */ uint32_t bytesPerCluster() const { - return m_fVol ? m_fVol->bytesPerCluster() : - m_xVol ? m_xVol->bytesPerCluster() : 0; + return m_fVol ? m_fVol->bytesPerCluster() + : m_xVol ? m_xVol->bytesPerCluster() + : 0; } /** * Set volume working directory to root. * \return true for success or false for failure. */ bool chdir() { - return m_fVol ? m_fVol->chdir() : - m_xVol ? m_xVol->chdir() : false; + return m_fVol ? m_fVol->chdir() : m_xVol ? m_xVol->chdir() : false; } /** * Set volume working directory. * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const char* path) { - return m_fVol ? m_fVol->chdir(path) : - m_xVol ? m_xVol->chdir(path) : false; + bool chdir(const char* path) { + return m_fVol ? m_fVol->chdir(path) : m_xVol ? m_xVol->chdir(path) : false; } /** Change global working volume to this volume. */ - void chvol() {m_cwv = this;} + void chvol() { m_cwv = this; } /** \return The total number of clusters in the volume. */ uint32_t clusterCount() const { - return m_fVol ? m_fVol->clusterCount() : - m_xVol ? m_xVol->clusterCount() : 0; + return m_fVol ? m_fVol->clusterCount() + : m_xVol ? m_xVol->clusterCount() + : 0; } /** \return The logical sector number for the start of file data. */ uint32_t dataStartSector() const { - return m_fVol ? m_fVol->dataStartSector() : - m_xVol ? m_xVol->clusterHeapStartSector() : 0; + return m_fVol ? m_fVol->dataStartSector() + : m_xVol ? m_xVol->clusterHeapStartSector() + : 0; } /** End access to volume * \return pointer to sector size buffer for format. @@ -104,25 +125,27 @@ class FsVolume { * \return true if the file exists else false. */ bool exists(const char* path) { - return m_fVol ? m_fVol->exists(path) : - m_xVol ? m_xVol->exists(path) : false; + return m_fVol ? m_fVol->exists(path) + : m_xVol ? m_xVol->exists(path) + : false; } /** \return The logical sector number for the start of the first FAT. */ uint32_t fatStartSector() const { - return m_fVol ? m_fVol->fatStartSector() : - m_xVol ? m_xVol->fatStartSector() : 0; + return m_fVol ? m_fVol->fatStartSector() + : m_xVol ? m_xVol->fatStartSector() + : 0; } /** \return Partition type, FAT_TYPE_EXFAT, FAT_TYPE_FAT32, * FAT_TYPE_FAT16, or zero for error. */ uint8_t fatType() const { - return m_fVol ? m_fVol->fatType() : - m_xVol ? m_xVol->fatType() : 0; + return m_fVol ? m_fVol->fatType() : m_xVol ? m_xVol->fatType() : 0; } - /** \return the free cluster count. */ - uint32_t freeClusterCount() const { - return m_fVol ? m_fVol->freeClusterCount() : - m_xVol ? m_xVol->freeClusterCount() : 0; + /** \return free cluster count or -1 if an error occurs. */ + int32_t freeClusterCount() const { + return m_fVol ? m_fVol->freeClusterCount() + : m_xVol ? m_xVol->freeClusterCount() + : -1; } /** * Check for device busy. @@ -130,8 +153,7 @@ class FsVolume { * \return true if busy else false. */ bool isBusy() { - return m_fVol ? m_fVol->isBusy() : - m_xVol ? m_xVol->isBusy() : false; + return m_fVol ? m_fVol->isBusy() : m_xVol ? m_xVol->isBusy() : false; } /** List directory contents. * @@ -140,8 +162,7 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr) { - return m_fVol ? m_fVol->ls(pr) : - m_xVol ? m_xVol->ls(pr) : false; + return m_fVol ? m_fVol->ls(pr) : m_xVol ? m_xVol->ls(pr) : false; } /** List directory contents. * @@ -157,8 +178,9 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr, uint8_t flags) { - return m_fVol ? m_fVol->ls(pr, flags) : - m_xVol ? m_xVol->ls(pr, flags) : false; + return m_fVol ? m_fVol->ls(pr, flags) + : m_xVol ? m_xVol->ls(pr, flags) + : false; } /** List the directory contents of a directory. * @@ -177,7 +199,7 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr, const char* path, uint8_t flags); - /** Make a subdirectory in the volume root directory. + /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. * @@ -185,9 +207,10 @@ class FsVolume { * * \return true for success or false for failure. */ - bool mkdir(const char *path, bool pFlag = true) { - return m_fVol ? m_fVol->mkdir(path, pFlag) : - m_xVol ? m_xVol->mkdir(path, pFlag) : false; + bool mkdir(const char* path, bool pFlag = true) { + return m_fVol ? m_fVol->mkdir(path, pFlag) + : m_xVol ? m_xVol->mkdir(path, pFlag) + : false; } /** open a file * @@ -197,14 +220,15 @@ class FsVolume { */ FsFile open(const char* path, oflag_t oflag = O_RDONLY); /** Remove a file from the volume root directory. - * - * \param[in] path A path with a valid 8.3 DOS name for the file. - * + * + * \param[in] path A path with a valid 8.3 DOS name for the file. + * * \return true for success or false for failure. - */ - bool remove(const char *path) { - return m_fVol ? m_fVol->remove(path) : - m_xVol ? m_xVol->remove(path) : false; + */ + bool remove(const char* path) { + return m_fVol ? m_fVol->remove(path) + : m_xVol ? m_xVol->remove(path) + : false; } /** Rename a file or subdirectory. * @@ -220,9 +244,10 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rename(const char *oldPath, const char *newPath) { - return m_fVol ? m_fVol->rename(oldPath, newPath) : - m_xVol ? m_xVol->rename(oldPath, newPath) : false; + bool rename(const char* oldPath, const char* newPath) { + return m_fVol ? m_fVol->rename(oldPath, newPath) + : m_xVol ? m_xVol->rename(oldPath, newPath) + : false; } /** Remove a subdirectory from the volume's root directory. * @@ -232,22 +257,20 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rmdir(const char *path) { - return m_fVol ? m_fVol->rmdir(path) : - m_xVol ? m_xVol->rmdir(path) : false; + bool rmdir(const char* path) { + return m_fVol ? m_fVol->rmdir(path) : m_xVol ? m_xVol->rmdir(path) : false; } /** \return The volume's cluster size in sectors. */ uint32_t sectorsPerCluster() const { - return m_fVol ? m_fVol->sectorsPerCluster() : - m_xVol ? m_xVol->sectorsPerCluster() : 0; + return m_fVol ? m_fVol->sectorsPerCluster() + : m_xVol ? m_xVol->sectorsPerCluster() + : 0; } #if ENABLE_ARDUINO_SERIAL /** List directory contents. * \return true for success or false for failure. */ - bool ls() { - return ls(&Serial); - } + bool ls() { return ls(&Serial); } /** List directory contents. * * \param[in] flags The inclusive OR of @@ -260,9 +283,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -289,18 +310,14 @@ class FsVolume { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } + bool chdir(const String& path) { return chdir(path.c_str()); } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String &path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. @@ -309,7 +326,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool mkdir(const String &path, bool pFlag = true) { + bool mkdir(const String& path, bool pFlag = true) { return mkdir(path.c_str(), pFlag); } /** open a file @@ -318,16 +335,14 @@ class FsVolume { * \param[in] oflag open flags. * \return a FsBaseFile object. */ - FsFile open(const String &path, oflag_t oflag = O_RDONLY); + FsFile open(const String& path, oflag_t oflag = O_RDONLY); /** Remove a file from the volume root directory. - * - * \param[in] path A path with a valid 8.3 DOS name for the file. - * + * + * \param[in] path A path with a valid 8.3 DOS name for the file. + * * \return true for success or false for failure. - */ - bool remove(const String &path) { - return remove(path.c_str()); - } + */ + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -353,9 +368,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rmdir(const String &path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -373,18 +386,17 @@ class FsVolume { #endif // ENABLE_ARDUINO_STRING protected: - newalign_t m_volMem[FS_ALIGN_DIM(ExFatVolume, FatVolume)]; + newalign_t m_volMem[FS_ALIGN_DIM(ExFatVolume, FatVolume)]; private: /** FsBaseFile allowed access to private members. */ friend class FsBaseFile; - static FsVolume* cwv() {return m_cwv;} + static FsVolume* cwv() { return m_cwv; } FsVolume(const FsVolume& from); FsVolume& operator=(const FsVolume& from); static FsVolume* m_cwv; - FatVolume* m_fVol = nullptr; + FatVolume* m_fVol = nullptr; ExFatVolume* m_xVol = nullptr; - FsBlockDevice* m_blockDev; }; #endif // FsVolume_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.cpp similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.cpp index 50eeb00d..6a9259a9 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,14 +22,11 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "common/SysCall.h" -#if defined(UDR0) || defined(DOXYGEN) #include "MinimumSerial.h" -const uint16_t MIN_2X_BAUD = F_CPU/(4*(2*0XFFF + 1)) + 1; +#if defined(UDR0) || defined(DOXYGEN) +const uint16_t MIN_2X_BAUD = F_CPU / (4 * (2 * 0XFFF + 1)) + 1; //------------------------------------------------------------------------------ -int MinimumSerial::available() { - return UCSR0A & (1 << RXC0) ? 1 : 0; -} +int MinimumSerial::available() { return UCSR0A & (1 << RXC0) ? 1 : 0; } //------------------------------------------------------------------------------ void MinimumSerial::begin(uint32_t baud) { uint16_t baud_setting; @@ -53,7 +50,8 @@ void MinimumSerial::begin(uint32_t baud) { } //------------------------------------------------------------------------------ void MinimumSerial::flush() { - while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) { + } } //------------------------------------------------------------------------------ int MinimumSerial::read() { @@ -64,7 +62,8 @@ int MinimumSerial::read() { } //------------------------------------------------------------------------------ size_t MinimumSerial::write(uint8_t b) { - while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) { + } UDR0 = b; return 1; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.h b/extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.h similarity index 96% rename from extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.h index 951db128..7e232a31 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/MinimumSerial.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/MinimumSerial.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,7 +22,7 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ - /** +/** * \file * \brief Minimal AVR Serial driver. */ @@ -37,7 +37,7 @@ class MinimumSerial : public print_t { public: /** \return true for hardware serial */ - operator bool() {return true;} + operator bool() { return true; } /** * \return one if data is available. */ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/RingBuf.h b/extra-libraries/ESP32/SdFat-2.2.3/src/RingBuf.h similarity index 56% rename from extra-libraries/ESP32/SdFat-2.1.2/src/RingBuf.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/RingBuf.h index a224fdf0..f796768c 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/RingBuf.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/RingBuf.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,22 +28,22 @@ * \file * \brief Ring buffer for data loggers. */ -#include "common/SysCall.h" #include "common/FmtNumber.h" +#include "common/SysCall.h" #ifndef DOXYGEN_SHOULD_SKIP_THIS // Teensy 3.5/3.6 has hard fault at 0x20000000 for unaligned memcpy. #if defined(__MK64FX512__) || defined(__MK66FX1M0__) inline bool is_aligned(const void* ptr, uintptr_t alignment) { - auto iptr = reinterpret_cast(ptr); - return !(iptr % alignment); + auto iptr = reinterpret_cast(ptr); + return !(iptr % alignment); } inline void memcpyBuf(void* dst, const void* src, size_t len) { const uint8_t* b = reinterpret_cast(0X20000000UL); uint8_t* d = reinterpret_cast(dst); - const uint8_t *s = reinterpret_cast(src); + const uint8_t* s = reinterpret_cast(src); if ((is_aligned(d, 4) && is_aligned(s, 4) && (len & 3) == 0) || - !((d < b && b <= (d + len)) || (s < b && b <= (s + len)))) { + !((d < b && b <= (d + len)) || (s < b && b <= (s + len)))) { memcpy(dst, src, len); } else { while (len--) { @@ -51,7 +51,7 @@ inline void memcpyBuf(void* dst, const void* src, size_t len) { } } } -#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) +#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) inline void memcpyBuf(void* dst, const void* src, size_t len) { memcpy(dst, src, len); } @@ -59,23 +59,22 @@ inline void memcpyBuf(void* dst, const void* src, size_t len) { #endif // DOXYGEN_SHOULD_SKIP_THIS /** * \class RingBuf - * \brief Ring buffer for data loggers. + * \brief Ring buffer for data loggers and data transmitters. * - * This ring buffer may be used in ISRs. bytesFreeIsr(), bytesUsedIsr(), - * memcopyIn(), and memcopyOut() are ISR callable. For ISR use call - * memcopyIn() in the ISR and use writeOut() in non-interrupt code - * to write data to a file. readIn() and memcopyOut can be use in a - * similar way to provide file data to an ISR. + * This ring buffer may be used in ISRs. Use beginISR(), endISR(), write() + * and print() in the ISR and use writeOut() in non-interrupt code + * to write data to a file. * - * Print into a RingBuf in an ISR should also work but has not been verified. + * Use beginISR(), endISR() and read() in an ISR with readIn() in non-interrupt + * code to provide file data to an ISR. */ -template +template class RingBuf : public Print { public: /** * RingBuf Constructor. */ - RingBuf() {} + RingBuf() { begin(nullptr); } /** * Initialize RingBuf. * \param[in] file Underlying file. @@ -85,97 +84,41 @@ class RingBuf : public Print { m_count = 0; m_head = 0; m_tail = 0; + m_inISR = false; clearWriteError(); } /** - * - * \return the RingBuf free space in bytes. Not ISR callable. + * Disable protection of m_count by noInterrupts()/interrupts. */ - size_t bytesFree() const { - size_t count; - noInterrupts(); - count = m_count; - interrupts(); - return Size - count; - } + void beginISR() { m_inISR = true; } /** - * \return the RingBuf free space in bytes. ISR callable. + * \return the RingBuf free space in bytes. */ - size_t bytesFreeIsr() const { - return Size - m_count; - } + size_t bytesFree() const { return Size - bytesUsed(); } /** - * \return the RingBuf used space in bytes. Not ISR callable. + * \return the RingBuf used space in bytes. */ size_t bytesUsed() const { - size_t count; - noInterrupts(); - count = m_count; - interrupts(); - return count; + if (m_inISR) { + return m_count; + } else { + noInterrupts(); + size_t rtn = m_count; + interrupts(); + return rtn; + } } /** - * \return the RingBuf used space in bytes. ISR callable. + * Enable protection of m_count by noInterrupts()/interrupts. */ - size_t bytesUsedIsr() const { - return m_count; - } - /** - * Copy data to the RingBuf from buf. - * The number of bytes copied may be less than count if - * count is greater than bytesFree. - * - * This function may be used in an ISR with writeOut() - * in non-interrupt code. - * - * \param[in] buf Location of data to be copied. - * \param[in] count number of bytes to be copied. - * \return Number of bytes actually copied. - */ - size_t memcpyIn(const void* buf, size_t count) { - const uint8_t* src = (const uint8_t*)buf; - size_t n = Size - m_count; - if (count > n) { - count = n; - } - size_t nread = 0; - while (nread != count) { - n = minSize(Size - m_head, count - nread); - memcpyBuf(m_buf + m_head, src + nread, n); - m_head = advance(m_head, n); - nread += n; - } - m_count += nread; - return nread; - } - /** - * Copy date from the RingBuf to buf. - * The number of bytes copied may be less than count if - * bytesUsed is less than count. - * - * This function may be used in an ISR with readIn() in - * non-interrupt code. - * - * \param[out] buf Location to receive the data. - * \param[in] count number of bytes to be copied. - * \return Number of bytes actually copied. - */ - size_t memcpyOut(void* buf, size_t count) { - uint8_t* dst = reinterpret_cast(buf); - size_t nwrite = 0; - size_t n = m_count; - if (count > n) { - count = n; - } - while (nwrite != count) { - n = minSize(Size - m_tail, count - nwrite); - memcpyBuf(dst + nwrite, m_buf + m_tail, n); - m_tail = advance(m_tail, n); - nwrite += n; - } - m_count -= nwrite; - return nwrite; - } + void endISR() { m_inISR = false; } +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // See write(), read(), beginISR() and endISR(). + size_t __attribute__((error("use write(buf, count), beginISR(), endISR()"))) + memcpyIn(const void* buf, size_t count); + size_t __attribute__((error("use read(buf, count), beginISR(), endISR()"))) + memcpyOut(void* buf, size_t count); +#endif // DOXYGEN_SHOULD_SKIP_THIS /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. @@ -211,7 +154,7 @@ class RingBuf : public Print { template size_t printField(Type value, char term) { char sign = 0; - char buf[3*sizeof(Type) + 3]; + char buf[3 * sizeof(Type) + 3]; char* str = buf + sizeof(buf); if (term) { @@ -234,34 +177,77 @@ class RingBuf : public Print { } return write((const uint8_t*)str, &buf[sizeof(buf)] - str); } + /** Read data from RingBuf. + * \param[out] buf destination for data. + * \param[in] count number of bytes to read. + * \return Actual count of bytes read. + */ + size_t read(void* buf, size_t count) { + size_t n = bytesFree(); + if (count > n) { + count = n; + } + uint8_t* dst = reinterpret_cast(buf); + n = minSize(Size - m_tail, count); + if (n == count) { + memcpyBuf(dst, m_buf + m_tail, n); + m_tail = advance(m_tail, n); + } else { + memcpyBuf(dst, m_buf + m_tail, n); + memcpyBuf(dst + n, m_buf, count - n); + m_tail = count - n; + } + adjustCount(-count); + return count; + } + /** + * Efficient read for small types. + * + * \param[in] data location for data item. + * \return true for success else false. + */ + template + bool read(Type* data) { + if (bytesUsed() < sizeof(Type)) { + return false; + } + uint8_t* ptr = reinterpret_cast(data); + for (size_t i = 0; i < sizeof(Type); i++) { + ptr[i] = m_buf[m_tail]; + m_tail = advance(m_tail); + } + adjustCount(-sizeof(Type)); + return true; + } /** * Read data into the RingBuf from the underlying file. * the number of bytes read may be less than count if * bytesFree is less than count. * - * This function may be used in non-interrupt code with - * memcopyOut() in an ISR. + * This function must not be used in an ISR. * * \param[in] count number of bytes to be read. - * \return Number of bytes actually read. + * \return Number of bytes actually read or negative for read error. */ - size_t readIn(size_t count) { - size_t nread = 0; - size_t n = bytesFree(); // Protected from interrupts. + int readIn(size_t count) { + size_t n = bytesFree(); if (count > n) { count = n; } - while (nread != count) { - n = minSize(Size - m_head, count - nread); - if ((size_t)m_file->read(m_buf + m_head, n) != n) { - return nread; - } - m_head = advance(m_head, n); - nread += n; + n = minSize(Size - m_head, count); + auto rtn = m_file->read(m_buf + m_head, n); + if (rtn <= 0) { + return rtn; } - noInterrupts(); - m_count += nread; - interrupts(); + size_t nread = rtn; + if (n < count && nread == n) { + rtn = m_file->read(m_buf, count - n); + if (rtn > 0) { + nread += rtn; + } + } + m_head = advance(m_head, nread); + adjustCount(nread); return nread; } /** @@ -270,25 +256,36 @@ class RingBuf : public Print { */ bool sync() { size_t n = bytesUsed(); - return writeOut(n) == n; + return n ? writeOut(n) == n : true; } /** * Copy data to the RingBuf from buf. * - * The number of bytes copied may be less than count if - * count is greater than bytesFree. + * No data will be copied if count is greater than bytesFree. * Use getWriteError() to check for print errors and - * clearWriteError() to clear error. + * clearWriteError() to clear the error. * * \param[in] buf Location of data to be written. * \param[in] count number of bytes to be written. * \return Number of bytes actually written. */ size_t write(const void* buf, size_t count) { - if (count > bytesFree()) { + if (bytesFree() < count) { setWriteError(); + return 0; } - return memcpyIn(buf, count); + const uint8_t* src = (const uint8_t*)buf; + size_t n = minSize(Size - m_head, count); + if (n == count) { + memcpyBuf(m_buf + m_head, src, n); + m_head = advance(m_head, n); + } else { + memcpyBuf(m_buf + m_head, src, n); + memcpyBuf(m_buf, src + n, count - n); + m_head = count - n; + } + adjustCount(count); + return count; } /** * Copy str to RingBuf. @@ -296,9 +293,7 @@ class RingBuf : public Print { * \param[in] str Location of data to be written. * \return Number of bytes actually written. */ - size_t write(const char* str) { - return Print::write(str); - } + size_t write(const char* str) { return Print::write(str); } /** * Override virtual function in Print for efficiency. * @@ -309,13 +304,35 @@ class RingBuf : public Print { size_t write(const uint8_t* buf, size_t count) override { return write((const void*)buf, count); } + /** + * Efficient write for small types. + * \param[in] data Item to be written. + * \return Number of bytes actually written. + */ + template + size_t write(Type data) { + uint8_t* ptr = reinterpret_cast(&data); + if (bytesFree() < sizeof(Type)) { + setWriteError(); + return 0; + } + for (size_t i = 0; i < sizeof(Type); i++) { + m_buf[m_head] = ptr[i]; + m_head = advance(m_head); + } + adjustCount(sizeof(Type)); + return sizeof(Type); + } /** * Required function for Print. * \param[in] data Byte to be written. * \return Number of bytes actually written. + * + * Try to force devirtualization by using final and always_inline. */ - size_t write(uint8_t data) override { - return write(&data, 1); + size_t write(uint8_t data) final __attribute__((always_inline)) { + // Use this if above does not compile size_t write(uint8_t data) final { + return write(data); } /** * Write data to file from RingBuf buffer. @@ -324,43 +341,60 @@ class RingBuf : public Print { * The number of bytes written may be less than count if * bytesUsed is less than count or if an error occurs. * - * This function may be used in non-interrupt code with - * memcopyIn() in an ISR. + * This function must only be used in non-interrupt code. * * \return Number of bytes actually written. */ size_t writeOut(size_t count) { size_t n = bytesUsed(); // Protected from interrupts; - if (count > n) { + if (count > n) { count = n; } - size_t nwrite = 0; - while (nwrite != count) { - n = minSize(Size - m_tail, count - nwrite); - if (m_file->write(m_buf + m_tail, n) != n) { - break; - } - m_tail = advance(m_tail, n); - nwrite += n; + n = minSize(Size - m_tail, count); + auto rtn = m_file->write(m_buf + m_tail, n); + if (rtn <= 0) { + return 0; } - noInterrupts(); - m_count -= nwrite; - interrupts(); + size_t nwrite = rtn; + if (n < count && nwrite == n) { + rtn = m_file->write(m_buf, count - n); + if (rtn > 0) { + nwrite += rtn; + } + } + m_tail = advance(m_tail, nwrite); + adjustCount(-nwrite); return nwrite; } private: uint8_t __attribute__((aligned(4))) m_buf[Size]; - F* m_file = nullptr; + F* m_file; volatile size_t m_count; size_t m_head; size_t m_tail; + volatile bool m_inISR; + void adjustCount(int amount) { + if (m_inISR) { + m_count += amount; + } else { + noInterrupts(); + m_count += amount; + interrupts(); + } + } + size_t advance(size_t index) { + if (!((Size - 1) & Size)) { + return (index + 1) & (Size - 1); + } + return index + 1 < Size ? index + 1 : 0; + } size_t advance(size_t index, size_t n) { index += n; return index < Size ? index : index - Size; } // avoid macro MIN - size_t minSize(size_t a, size_t b) {return a < b ? a : b;} + size_t minSize(size_t a, size_t b) { return a < b ? a : b; } }; #endif // RingBuf_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/CPPLINT.cfg b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/CPPLINT.cfg similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/CPPLINT.cfg rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/CPPLINT.cfg diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCard.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCard.h similarity index 80% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCard.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCard.h index dd5172b4..86697bbd 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCard.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,13 +22,19 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Top level include for SPI and SDIO cards. + */ #ifndef SdCard_h #define SdCard_h -#include "SdioCard.h" #include "SdSpiCard.h" +#include "SdioCard.h" #if HAS_SDIO_CLASS +/** Type for both SPI and SDIO cards. */ typedef SdCardInterface SdCard; -#else // HAS_SDIO_CLASS +#else // HAS_SDIO_CLASS +/** Type for SPI card. */ typedef SdSpiCard SdCard; #endif // HAS_SDIO_CLASS /** Determine card configuration type. @@ -36,13 +42,19 @@ typedef SdSpiCard SdCard; * \param[in] cfg Card configuration. * \return true if SPI. */ -inline bool isSpi(SdSpiConfig cfg) {(void)cfg; return true;} +inline bool isSpi(SdSpiConfig cfg) { + (void)cfg; + return true; +} /** Determine card configuration type. * * \param[in] cfg Card configuration. * \return true if SPI. */ -inline bool isSpi(SdioConfig cfg) {(void)cfg; return false;} +inline bool isSpi(SdioConfig cfg) { + (void)cfg; + return false; +} /** * \class SdCardFactory * \brief Setup a SPI card or SDIO card. @@ -52,11 +64,10 @@ class SdCardFactory { /** Initialize SPI card. * * \param[in] config SPI configuration. - * \return generic card pointer. + * \return generic card pointer or nullptr if failure. */ SdCard* newCard(SdSpiConfig config) { - m_spiCard.begin(config); - return &m_spiCard; + return m_spiCard.begin(config) ? &m_spiCard : nullptr; } /** Initialize SDIO card. * @@ -65,9 +76,8 @@ class SdCardFactory { */ SdCard* newCard(SdioConfig config) { #if HAS_SDIO_CLASS - m_sdioCard.begin(config); - return &m_sdioCard; -#else // HAS_SDIO_CLASS + return m_sdioCard.begin(config) ? &m_sdioCard : nullptr; +#else // HAS_SDIO_CLASS (void)config; return nullptr; #endif // HAS_SDIO_CLASS diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.cpp similarity index 81% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.cpp index 5705a305..f3a52f2a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInfo.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,21 +25,28 @@ #include "SdCardInfo.h" //------------------------------------------------------------------------------ #undef SD_CARD_ERROR -#define SD_CARD_ERROR(e, m) case SD_CARD_ERROR_##e: pr->print(F(#e)); break; +#define SD_CARD_ERROR(e, m) \ + case SD_CARD_ERROR_##e: \ + pr->print(F(#e)); \ + break; void printSdErrorSymbol(print_t* pr, uint8_t code) { pr->print(F("SD_CARD_ERROR_")); switch (code) { SD_ERROR_CODE_LIST - default: pr->print(F("UNKNOWN")); + default: + pr->print(F("UNKNOWN")); } } //------------------------------------------------------------------------------ #undef SD_CARD_ERROR -#define SD_CARD_ERROR(e, m) case SD_CARD_ERROR_##e: pr->print(F(m)); break; +#define SD_CARD_ERROR(e, m) \ + case SD_CARD_ERROR_##e: \ + pr->print(F(m)); \ + break; void printSdErrorText(print_t* pr, uint8_t code) { - switch - (code) { + switch (code) { SD_ERROR_CODE_LIST - default: pr->print(F("Unknown error")); + default: + pr->print(F("Unknown error")); } } diff --git a/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.h new file mode 100644 index 00000000..9ef7f75b --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInfo.h @@ -0,0 +1,477 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +/** + * \file + * \brief Definitions for SD cards. + */ +#ifndef SdCardInfo_h +#define SdCardInfo_h +#include + +#include "../common/SysCall.h" +// Based on the document: +// +// SD Specifications +// Part 1 +// Physical Layer +// Simplified Specification +// Version 8.00 +// Sep 23, 2020 +// +// https://www.sdcard.org/downloads/pls/ +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +// SD registers are big endian. +#error bit fields in structures assume little endian processor. +#endif // __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +//------------------------------------------------------------------------------ +// SD card errors +// See the SD Specification for command info. +/** Define error codes and brief description. */ +#define SD_ERROR_CODE_LIST \ + SD_CARD_ERROR(NONE, "No error") \ + SD_CARD_ERROR(CMD0, "Card reset failed") \ + SD_CARD_ERROR(CMD2, "SDIO read CID") \ + SD_CARD_ERROR(CMD3, "SDIO publish RCA") \ + SD_CARD_ERROR(CMD6, "Switch card function") \ + SD_CARD_ERROR(CMD7, "SDIO card select") \ + SD_CARD_ERROR(CMD8, "Send and check interface settings") \ + SD_CARD_ERROR(CMD9, "Read CSD data") \ + SD_CARD_ERROR(CMD10, "Read CID data") \ + SD_CARD_ERROR(CMD12, "Stop multiple block transmission") \ + SD_CARD_ERROR(CMD13, "Read card status") \ + SD_CARD_ERROR(CMD17, "Read single block") \ + SD_CARD_ERROR(CMD18, "Read multiple blocks") \ + SD_CARD_ERROR(CMD24, "Write single block") \ + SD_CARD_ERROR(CMD25, "Write multiple blocks") \ + SD_CARD_ERROR(CMD32, "Set first erase block") \ + SD_CARD_ERROR(CMD33, "Set last erase block") \ + SD_CARD_ERROR(CMD38, "Erase selected blocks") \ + SD_CARD_ERROR(CMD58, "Read OCR register") \ + SD_CARD_ERROR(CMD59, "Set CRC mode") \ + SD_CARD_ERROR(ACMD6, "Set SDIO bus width") \ + SD_CARD_ERROR(ACMD13, "Read extended status") \ + SD_CARD_ERROR(ACMD23, "Set pre-erased count") \ + SD_CARD_ERROR(ACMD41, "Activate card initialization") \ + SD_CARD_ERROR(ACMD51, "Read SCR data") \ + SD_CARD_ERROR(READ_TOKEN, "Bad read data token") \ + SD_CARD_ERROR(READ_CRC, "Read CRC error") \ + SD_CARD_ERROR(READ_FIFO, "SDIO fifo read timeout") \ + SD_CARD_ERROR(READ_REG, "Read CID or CSD failed.") \ + SD_CARD_ERROR(READ_START, "Bad readStart argument") \ + SD_CARD_ERROR(READ_TIMEOUT, "Read data timeout") \ + SD_CARD_ERROR(STOP_TRAN, "Multiple block stop failed") \ + SD_CARD_ERROR(TRANSFER_COMPLETE, "SDIO transfer complete") \ + SD_CARD_ERROR(WRITE_DATA, "Write data not accepted") \ + SD_CARD_ERROR(WRITE_FIFO, "SDIO fifo write timeout") \ + SD_CARD_ERROR(WRITE_START, "Bad writeStart argument") \ + SD_CARD_ERROR(WRITE_PROGRAMMING, "Flash programming") \ + SD_CARD_ERROR(WRITE_TIMEOUT, "Write timeout") \ + SD_CARD_ERROR(DMA, "DMA transfer failed") \ + SD_CARD_ERROR(ERASE, "Card did not accept erase commands") \ + SD_CARD_ERROR(ERASE_SINGLE_SECTOR, "Card does not support erase") \ + SD_CARD_ERROR(ERASE_TIMEOUT, "Erase command timeout") \ + SD_CARD_ERROR(INIT_NOT_CALLED, "Card has not been initialized") \ + SD_CARD_ERROR(INVALID_CARD_CONFIG, "Invalid card config") \ + SD_CARD_ERROR(FUNCTION_NOT_SUPPORTED, "Unsupported SDIO command") + +enum { +/** Macro for generation of error codes using an enum. */ +#define SD_CARD_ERROR(e, m) SD_CARD_ERROR_##e, + SD_ERROR_CODE_LIST +#undef SD_CARD_ERROR + SD_CARD_ERROR_UNKNOWN +}; +/** Print the enum symbol for an error code. + * \param[in] pr Print stream. + * \param[in] code enum value for error. + */ +void printSdErrorSymbol(print_t* pr, uint8_t code); +/** Print text for an error code. + * \param[in] pr Print stream. + * \param[in] code enum value for error. + */ +void printSdErrorText(print_t* pr, uint8_t code); +//------------------------------------------------------------------------------ +// card types +/** Standard capacity V1 SD card */ +const uint8_t SD_CARD_TYPE_SD1 = 1; +/** Standard capacity V2 SD card */ +const uint8_t SD_CARD_TYPE_SD2 = 2; +/** High Capacity SD card */ +const uint8_t SD_CARD_TYPE_SDHC = 3; +//------------------------------------------------------------------------------ +// SD operation timeouts +/** command timeout ms */ +const uint16_t SD_CMD_TIMEOUT = 300; +/** erase timeout ms */ +const uint16_t SD_ERASE_TIMEOUT = 10000; +/** init timeout ms */ +const uint16_t SD_INIT_TIMEOUT = 2000; +/** read timeout ms */ +const uint16_t SD_READ_TIMEOUT = 300; +/** write time out ms */ +const uint16_t SD_WRITE_TIMEOUT = 600; +//------------------------------------------------------------------------------ +// SD card commands +/** GO_IDLE_STATE - init card in spi mode if CS low */ +const uint8_t CMD0 = 0X00; +/** ALL_SEND_CID - Asks any card to send the CID. */ +const uint8_t CMD2 = 0X02; +/** SEND_RELATIVE_ADDR - Ask the card to publish a new RCA. */ +const uint8_t CMD3 = 0X03; +/** SWITCH_FUNC - Switch Function Command */ +const uint8_t CMD6 = 0X06; +/** SELECT/DESELECT_CARD - toggles between the stand-by and transfer states. */ +const uint8_t CMD7 = 0X07; +/** SEND_IF_COND - verify SD Memory Card interface operating condition.*/ +const uint8_t CMD8 = 0X08; +/** SEND_CSD - read the Card Specific Data (CSD register) */ +const uint8_t CMD9 = 0X09; +/** SEND_CID - read the card identification information (CID register) */ +const uint8_t CMD10 = 0X0A; +/** VOLTAGE_SWITCH -Switch to 1.8V bus signaling level. */ +const uint8_t CMD11 = 0X0B; +/** STOP_TRANSMISSION - end multiple sector read sequence */ +const uint8_t CMD12 = 0X0C; +/** SEND_STATUS - read the card status register */ +const uint8_t CMD13 = 0X0D; +/** READ_SINGLE_SECTOR - read a single data sector from the card */ +const uint8_t CMD17 = 0X11; +/** READ_MULTIPLE_SECTOR - read multiple data sectors from the card */ +const uint8_t CMD18 = 0X12; +/** WRITE_SECTOR - write a single data sector to the card */ +const uint8_t CMD24 = 0X18; +/** WRITE_MULTIPLE_SECTOR - write sectors of data until a STOP_TRANSMISSION */ +const uint8_t CMD25 = 0X19; +/** ERASE_WR_BLK_START - sets the address of the first sector to be erased */ +const uint8_t CMD32 = 0X20; +/** ERASE_WR_BLK_END - sets the address of the last sector of the continuous + range to be erased*/ +const uint8_t CMD33 = 0X21; +/** ERASE - erase all previously selected sectors */ +const uint8_t CMD38 = 0X26; +/** APP_CMD - escape for application specific command */ +const uint8_t CMD55 = 0X37; +/** READ_OCR - read the OCR register of a card */ +const uint8_t CMD58 = 0X3A; +/** CRC_ON_OFF - enable or disable CRC checking */ +const uint8_t CMD59 = 0X3B; +/** SET_BUS_WIDTH - Defines the data bus width for data transfer. */ +const uint8_t ACMD6 = 0X06; +/** SD_STATUS - Send the SD Status. */ +const uint8_t ACMD13 = 0X0D; +/** SET_WR_BLK_ERASE_COUNT - Set the number of write sectors to be + pre-erased before writing */ +const uint8_t ACMD23 = 0X17; +/** SD_SEND_OP_COMD - Sends host capacity support information and + activates the card's initialization process */ +const uint8_t ACMD41 = 0X29; +/** Reads the SD Configuration Register (SCR). */ +const uint8_t ACMD51 = 0X33; +//============================================================================== +// CARD_STATUS +/** The command's argument was out of the allowed range for this card. */ +const uint32_t CARD_STATUS_OUT_OF_RANGE = 1UL << 31; +/** A misaligned address which did not match the sector length. */ +const uint32_t CARD_STATUS_ADDRESS_ERROR = 1UL << 30; +/** The transferred sector length is not allowed for this card. */ +const uint32_t CARD_STATUS_SECTOR_LEN_ERROR = 1UL << 29; +/** An error in the sequence of erase commands occurred. */ +const uint32_t CARD_STATUS_ERASE_SEQ_ERROR = 1UL << 28; +/** An invalid selection of write-sectors for erase occurred. */ +const uint32_t CARD_STATUS_ERASE_PARAM = 1UL << 27; +/** Set when the host attempts to write to a protected sector. */ +const uint32_t CARD_STATUS_WP_VIOLATION = 1UL << 26; +/** When set, signals that the card is locked by the host. */ +const uint32_t CARD_STATUS_CARD_IS_LOCKED = 1UL << 25; +/** Set when a sequence or password error has been detected. */ +const uint32_t CARD_STATUS_LOCK_UNLOCK_FAILED = 1UL << 24; +/** The CRC check of the previous command failed. */ +const uint32_t CARD_STATUS_COM_CRC_ERROR = 1UL << 23; +/** Command not legal for the card state. */ +const uint32_t CARD_STATUS_ILLEGAL_COMMAND = 1UL << 22; +/** Card internal ECC was applied but failed to correct the data. */ +const uint32_t CARD_STATUS_CARD_ECC_FAILED = 1UL << 21; +/** Internal card controller error */ +const uint32_t CARD_STATUS_CC_ERROR = 1UL << 20; +/** A general or an unknown error occurred during the operation. */ +const uint32_t CARD_STATUS_ERROR = 1UL << 19; +// bits 19, 18, and 17 reserved. +/** Permanent WP set or attempt to change read only values of CSD. */ +const uint32_t CARD_STATUS_CSD_OVERWRITE = 1UL << 16; +/** partial address space was erased due to write protect. */ +const uint32_t CARD_STATUS_WP_ERASE_SKIP = 1UL << 15; +/** The command has been executed without using the internal ECC. */ +const uint32_t CARD_STATUS_CARD_ECC_DISABLED = 1UL << 14; +/** out of erase sequence command was received. */ +const uint32_t CARD_STATUS_ERASE_RESET = 1UL << 13; +/** The state of the card when receiving the command. + * 0 = idle + * 1 = ready + * 2 = ident + * 3 = stby + * 4 = tran + * 5 = data + * 6 = rcv + * 7 = prg + * 8 = dis + * 9-14 = reserved + * 15 = reserved for I/O mode + */ +const uint32_t CARD_STATUS_CURRENT_STATE = 0XF << 9; +/** Shift for current state. */ +const uint32_t CARD_STATUS_CURRENT_STATE_SHIFT = 9; +/** Corresponds to buffer empty signaling on the bus. */ +const uint32_t CARD_STATUS_READY_FOR_DATA = 1UL << 8; +// bit 7 reserved. +/** Extension Functions may set this bit to get host to deal with events. */ +const uint32_t CARD_STATUS_FX_EVENT = 1UL << 6; +/** The card will expect ACMD, or the command has been interpreted as ACMD */ +const uint32_t CARD_STATUS_APP_CMD = 1UL << 5; +// bit 4 reserved. +/** Error in the sequence of the authentication process. */ +const uint32_t CARD_STATUS_AKE_SEQ_ERROR = 1UL << 3; +// bits 2,1, and 0 reserved for manufacturer test mode. +//============================================================================== +/** status for card in the ready state */ +const uint8_t R1_READY_STATE = 0X00; +/** status for card in the idle state */ +const uint8_t R1_IDLE_STATE = 0X01; +/** status bit for illegal command */ +const uint8_t R1_ILLEGAL_COMMAND = 0X04; +/** start data token for read or write single sector*/ +const uint8_t DATA_START_SECTOR = 0XFE; +/** stop token for write multiple sectors*/ +const uint8_t STOP_TRAN_TOKEN = 0XFD; +/** start data token for write multiple sectors*/ +const uint8_t WRITE_MULTIPLE_TOKEN = 0XFC; +/** mask for data response tokens after a write sector operation */ +const uint8_t DATA_RES_MASK = 0X1F; +/** write data accepted token */ +const uint8_t DATA_RES_ACCEPTED = 0X05; +//============================================================================== +/** + * \class cid_t + * \brief Card Identification (CID) register. + */ +struct cid_t { + // byte 0 + /** Manufacturer ID */ + uint8_t mid; + // byte 1-2 + /** OEM/Application ID. */ + char oid[2]; + // byte 3-7 + /** Product name. */ + char pnm[5]; + // byte 8 + /** Product revision - n.m two 4-bit nibbles. */ + uint8_t prv; + // byte 9-12 + /** Product serial 32-bit number Big Endian format. */ + uint8_t psn8[4]; + // byte 13-14 + /** Manufacturing date big endian - four nibbles RYYM Reserved Year Month. */ + uint8_t mdt[2]; + // byte 15 + /** CRC7 bits 1-7 checksum, bit 0 always 1 */ + uint8_t crc; + // Extract big endian fields. + /** \return major revision number. */ + int prvN() const { return prv >> 4; } + /** \return minor revision number. */ + int prvM() const { return prv & 0XF; } + /** \return Manufacturing Year. */ + int mdtYear() const { return 2000 + ((mdt[0] & 0XF) << 4) + (mdt[1] >> 4); } + /** \return Manufacturing Month. */ + int mdtMonth() const { return mdt[1] & 0XF; } + /** \return Product Serial Number. */ + uint32_t psn() const { + return (uint32_t)psn8[0] << 24 | (uint32_t)psn8[1] << 16 | + (uint32_t)psn8[2] << 8 | (uint32_t)psn8[3]; + } +} __attribute__((packed)); +//============================================================================== +/** + * \class csd_t + * \brief Union of old and new style CSD register. + */ +struct csd_t { + /** union of all CSD versions */ + uint8_t csd[16]; + // Extract big endian fields. + /** \return Capacity in sectors */ + uint32_t capacity() const { + uint32_t c_size; + uint8_t ver = csd[0] >> 6; + if (ver == 0) { + c_size = (uint32_t)(csd[6] & 3) << 10; + c_size |= (uint32_t)csd[7] << 2 | csd[8] >> 6; + uint8_t c_size_mult = (csd[9] & 3) << 1 | csd[10] >> 7; + uint8_t read_bl_len = csd[5] & 15; + return (c_size + 1) << (c_size_mult + read_bl_len + 2 - 9); + } else if (ver == 1) { + c_size = (uint32_t)(csd[7] & 63) << 16; + c_size |= (uint32_t)csd[8] << 8; + c_size |= csd[9]; + return (c_size + 1) << 10; + } else { + return 0; + } + } + /** \return true if erase granularity is single block. */ + bool eraseSingleBlock() const { return csd[10] & 0X40; } + /** \return erase size in 512 byte blocks if eraseSingleBlock is false. */ + int eraseSize() const { return ((csd[10] & 0X3F) << 1 | csd[11] >> 7) + 1; } + /** \return true if the contents is copied or true if original. */ + bool copy() const { return csd[14] & 0X40; } + /** \return true if the entire card is permanently write protected. */ + bool permWriteProtect() const { return csd[14] & 0X20; } + /** \return true if the entire card is temporarily write protected. */ + bool tempWriteProtect() const { return csd[14] & 0X10; } +}; +//============================================================================== +/** + * \class scr_t + * \brief SCR register. + */ +struct scr_t { + /** Bytes 0-3 SD Association, bytes 4-7 reserved for manufacturer. */ + uint8_t scr[8]; + /** \return SCR_STRUCTURE field - must be zero.*/ + uint8_t srcStructure() const { return scr[0] >> 4; } + /** \return SD_SPEC field 0 - v1.0 or V1.01, 1 - 1.10, 2 - V2.00 or greater */ + uint8_t sdSpec() const { return scr[0] & 0XF; } + /** \return false if all zero, true if all one. */ + bool dataAfterErase() const { return scr[1] & 0X80; } + /** \return CPRM Security Version. */ + uint8_t sdSecurity() const { return (scr[1] >> 4) & 0X7; } + /** \return 0101b. */ + uint8_t sdBusWidths() const { return scr[1] & 0XF; } + /** \return true if V3.0 or greater. */ + bool sdSpec3() const { return scr[2] & 0X80; } + /** \return if true and sdSpecX is zero V4.xx. */ + bool sdSpec4() const { return scr[2] & 0X4; } + /** \return nonzero for version 5 or greater if sdSpec == 2, + sdSpec3 == true. Version is return plus four.*/ + uint8_t sdSpecX() const { return (scr[2] & 0X3) << 2 | scr[3] >> 6; } + /** \return bit map for support CMD58/59, CMD48/49, CMD23, and CMD20 */ + uint8_t cmdSupport() const { return scr[3] & 0XF; } + /** \return SD spec version */ + int16_t sdSpecVer() const { + if (sdSpec() > 2) { + return -1; + } else if (sdSpec() < 2) { + return sdSpec() ? 110 : 101; + } else if (!sdSpec3()) { + return 200; + } else if (!sdSpec4() && !sdSpecX()) { + return 300; + } + return 400 + 100 * sdSpecX(); + } +}; +//============================================================================== +/** + * \class sds_t + * \brief SD Status. + */ +// fields are big endian +struct sds_t { + /** byte 0, bit 7-6 width, bit 5 secured mode, bits 4-0 reserved. */ + uint8_t busWidthSecureMode; + /** byte 1 reserved */ + uint8_t reserved1; + /** byte 2-3 zero for SD rd/wr memory card. */ + uint8_t sdCardType[2]; + /** byte 4-7 size of protected area big endian */ + uint8_t sizeOfProtectedArea[4]; + /** byte 8 speed class. */ + uint8_t speed; + /** byte 9 performance move */ + uint8_t performanceMove; + /** byte 10 AU size code. */ + uint8_t auSize; + /** byte 11-12 erase size big endian */ + uint8_t eraseSize[2]; + /** byte 13 erase timeout and erase offset */ + uint8_t eraseTimeoutOffset; + /** byte 14 */ + uint8_t uhsClassAuSize; + /** byte 15 */ + uint8_t videoSpeedClass; + /** byte 16-17 */ + uint8_t vscAuSize[2]; + /** byte 18-21 */ + uint8_t susAddr[3]; + /** byte 21 */ + uint8_t appPerfClass; + /** byte 22 */ + uint8_t perfEnhance; + /** byte 23 */ + uint8_t discardFule; + /** byte 24 */ + uint8_t reservedManufacturer[40]; + + /** \return appClass. */ + int appClass() { return appPerfClass; } + /** \return AU size in KB. or zero for error. */ + uint32_t auSizeKB() { + // 0XF mask and uint16_t array helps compiler optimize size on Uno. + uint8_t val = (auSize >> 4) & 0XF; + static const uint16_t au[] = {0, 16, 32, 64, 128, + 256, 512, 1024, 2048, 4096, + 8192, 12288, 16384, 24576, 32768}; + return val < 0XF ? au[val] : 65536UL; + } + /** \return current bus width or -1 for error. */ + uint8_t busWidth() const { + uint8_t w = busWidthSecureMode >> 6; + return w == 2 ? 4 : w == 0 ? 1 : -1; + } + /** \return true is discard operation is supported else true. */ + bool discard() const { return discardFule & 2; } + /** \return eraseSize in AUs. */ + uint16_t eraseSizeAU() const { + return (uint16_t)eraseSize[0] << 8 | (uint16_t)eraseSize[1]; + } + /** \return eraseTimeout seconds. */ + uint8_t eraseTimeout() const { return eraseTimeoutOffset >> 2; } + /** \return eraseOffset seconds. */ + uint8_t eraseOffset() const { return eraseTimeoutOffset & 3; } + /** \return true if full user logical erase is supported else false. */ + bool fule() const { return discardFule & 1; } + /** \return true for secure mode else false. */ + bool secureMode() const { return busWidthSecureMode & 0X20; } + /** \return speed class or -1 for error. */ + int speedClass() const { + return speed < 4 ? 2 * speed : speed == 4 ? 10 : -1; + } + /** \return UHS Speed Grade. */ + int uhsClass() const { return uhsClassAuSize >> 4; } + /** \return Video Speed */ + int videoClass() { return videoSpeedClass; } +}; +#endif // SdCardInfo_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInterface.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInterface.h similarity index 78% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInterface.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInterface.h index 11161036..586fbdd3 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdCardInterface.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdCardInterface.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,6 +22,10 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Abstract interface for an SD card. + */ #ifndef SdCardInterface_h #define SdCardInterface_h #include "../common/FsBlockDeviceInterface.h" @@ -32,9 +36,14 @@ */ class SdCardInterface : public FsBlockDeviceInterface { public: - /** end use of card */ - virtual void end() = 0; - /** Erase a range of sectors. + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. + * + * \return true for success or false for failure. + */ + virtual bool cardCMD6(uint32_t arg, uint8_t* status) = 0; + /** Erase a range of sectors. * * \param[in] firstSector The address of the first sector in the range. * \param[in] lastSector The address of the last sector in the range. @@ -46,12 +55,12 @@ class SdCardInterface : public FsBlockDeviceInterface { virtual uint8_t errorCode() const = 0; /** \return error data. */ virtual uint32_t errorData() const = 0; - /** \return true if card is busy. */ - virtual bool isBusy() = 0; /** \return false by default */ - virtual bool hasDedicatedSpi() {return false;} + virtual bool hasDedicatedSpi() { return false; } /** \return false by default */ - bool virtual isDedicatedSpi() {return false;} + bool virtual isDedicatedSpi() { return false; } + /** \return false by default */ + bool virtual isSpi() { return false; } /** Set SPI sharing state * \param[in] value desired state. * \return false by default. @@ -68,7 +77,7 @@ class SdCardInterface : public FsBlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readCID(cid_t* cid) = 0; - /** + /** * Read a card's CSD register. * * \param[out] csd pointer to area for returned data. @@ -82,15 +91,19 @@ class SdCardInterface : public FsBlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readOCR(uint32_t* ocr) = 0; - /** - * Determine the size of an SD flash memory card. + /** Read SCR register. * - * \return The number of 512 byte data sectors in the card - * or zero if an error occurs. + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. */ - virtual uint32_t sectorCount() = 0; + virtual bool readSCR(scr_t* scr) = 0; + /** Return the 64 byte SD Status register. + * \param[out] sds location for 64 status bytes. + * \return true for success or false for failure. + */ + virtual bool readSDS(sds_t* sds) = 0; /** \return card status. */ - virtual uint32_t status() {return 0XFFFFFFFF;} + virtual uint32_t status() { return 0XFFFFFFFF; } /** Return the card type: SD V1, SD V2 or SDHC/SDXC * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC. */ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.cpp similarity index 75% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.cpp index b2afef16..e924336c 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -27,14 +27,11 @@ class Timeout { public: Timeout() {} - explicit Timeout(uint16_t ms) {set(ms);} - uint16_t millis16() {return millis();} - void set(uint16_t ms) { - m_endTime = ms + millis16(); - } - bool timedOut() { - return (int16_t)(m_endTime - millis16()) < 0; - } + explicit Timeout(uint16_t ms) { set(ms); } + uint16_t millis16() { return millis(); } + void set(uint16_t ms) { m_endTime = ms + millis16(); } + bool timedOut() { return (int16_t)(m_endTime - millis16()) < 0; } + private: uint16_t m_endTime; }; @@ -77,48 +74,44 @@ static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { // uses the x^16,x^12,x^5,x^1 polynomial. #ifdef __AVR__ static const uint16_t crctab[] PROGMEM = { -#else // __AVR__ +#else // __AVR__ static const uint16_t crctab[] = { #endif // __AVR__ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, - 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, - 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, - 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, - 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, - 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, - 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, - 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, - 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, - 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, - 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, - 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, - 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, - 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, + 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, + 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, + 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, + 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, + 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, + 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, + 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, + 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, + 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, + 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, + 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, + 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, + 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, + 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, + 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, + 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, + 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, + 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, + 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, + 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, + 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0}; static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { #ifdef __AVR__ crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0XFF]) ^ (crc << 8); -#else // __AVR__ +#else // __AVR__ crc = crctab[(crc >> 8 ^ data[i]) & 0XFF] ^ (crc << 8); #endif // __AVR__ } @@ -130,10 +123,12 @@ static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { // SharedSpiCard member functions //------------------------------------------------------------------------------ bool SharedSpiCard::begin(SdSpiConfig spiConfig) { + uint8_t cardType; + uint32_t arg; Timeout timeout; - m_spiActive = false; + // Restore state to creator. + initSharedSpiCard(); m_errorCode = SD_CARD_ERROR_NONE; - m_type = 0; m_csPin = spiConfig.csPin; #if SPI_DRIVER_SELECT >= 2 m_spiDriverPtr = spiConfig.spiPort; @@ -144,24 +139,25 @@ bool SharedSpiCard::begin(SdSpiConfig spiConfig) { #endif // SPI_DRIVER_SELECT sdCsInit(m_csPin); spiUnselect(); - spiSetSckSpeed(1000UL*SD_MAX_INIT_RATE_KHZ); + spiSetSckSpeed(1000UL * SD_MAX_INIT_RATE_KHZ); spiBegin(spiConfig); - uint32_t arg; - m_state = IDLE_STATE; + m_beginCalled = true; + spiStart(); // must supply min of 74 clock cycles with CS high. spiUnselect(); for (uint8_t i = 0; i < 10; i++) { - spiSend(0XFF); + spiReceive(); } spiSelect(); - // command to go idle in SPI mode - for (uint8_t i = 1;; i++) { + timeout.set(SD_INIT_TIMEOUT); + while (true) { + // command to go idle in SPI mode if (cardCommand(CMD0, 0) == R1_IDLE_STATE) { break; } - if (i == SD_CMD0_RETRY) { + if (timeout.timedOut()) { error(SD_CARD_ERROR_CMD0); goto fail; } @@ -172,23 +168,27 @@ bool SharedSpiCard::begin(SdSpiConfig spiConfig) { goto fail; } #endif // USE_SD_CRC - // check SD version - if (!(cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { - type(SD_CARD_TYPE_SD2); + while (true) { + if (cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND) { + cardType = SD_CARD_TYPE_SD1; + break; + } + // Skip first three bytes. for (uint8_t i = 0; i < 4; i++) { m_status = spiReceive(); } - if (m_status != 0XAA) { + if (m_status == 0XAA) { + cardType = SD_CARD_TYPE_SD2; + break; + } + if (timeout.timedOut()) { error(SD_CARD_ERROR_CMD8); goto fail; } - } else { - type(SD_CARD_TYPE_SD1); } // initialize card and send host supports SDHC if SD2 - arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; - timeout.set(SD_INIT_TIMEOUT); + arg = cardType == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; while (cardAcmd(ACMD41, arg) != R1_READY_STATE) { // check for timeout if (timeout.timedOut()) { @@ -196,15 +196,14 @@ bool SharedSpiCard::begin(SdSpiConfig spiConfig) { goto fail; } } - // if SD2 read OCR register to check for SDHC card - if (type() == SD_CARD_TYPE_SD2) { + if (cardType == SD_CARD_TYPE_SD2) { if (cardCommand(CMD58, 0)) { error(SD_CARD_ERROR_CMD58); goto fail; } if ((spiReceive() & 0XC0) == 0XC0) { - type(SD_CARD_TYPE_SDHC); + cardType = SD_CARD_TYPE_SDHC; } // Discard rest of ocr - contains allowed voltage range. for (uint8_t i = 0; i < 3; i++) { @@ -213,9 +212,26 @@ bool SharedSpiCard::begin(SdSpiConfig spiConfig) { } spiStop(); spiSetSckSpeed(spiConfig.maxSck); + m_type = cardType; return true; - fail: +fail: + spiStop(); + return false; +} +//------------------------------------------------------------------------------ +bool SharedSpiCard::cardCMD6(uint32_t arg, uint8_t* status) { + if (cardCommand(CMD6, arg)) { + error(SD_CARD_ERROR_CMD6); + goto fail; + } + if (!readData(status, 64)) { + goto fail; + } + spiStop(); + return true; + +fail: spiStop(); return false; } @@ -229,12 +245,9 @@ uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { if (!m_spiActive) { spiStart(); } - if (cmd != CMD12) { - if (!waitReady(SD_CMD_TIMEOUT) && cmd != CMD0) { - return 0XFF; - } + if (cmd != CMD0 && cmd != CMD12 && !waitReady(SD_CMD_TIMEOUT)) { + return 0XFF; } - #if USE_SD_CRC // form message uint8_t buf[6]; @@ -249,7 +262,7 @@ uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { // send message spiSend(buf, 6); -#else // USE_SD_CRC +#else // USE_SD_CRC // send command spiSend(cmd | 0x40); @@ -267,35 +280,42 @@ uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { spiReceive(); // there are 1-8 fill bytes before response. fill bytes should be 0XFF. - uint16_t n = 0; + uint8_t n = 0; do { m_status = spiReceive(); } while (m_status & 0X80 && ++n < 10); return m_status; } //------------------------------------------------------------------------------ +void SharedSpiCard::end() { + if (m_beginCalled) { + syncDevice(); + spiEnd(); + m_beginCalled = false; + } +} +//------------------------------------------------------------------------------ bool SharedSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { csd_t csd; if (!readCSD(&csd)) { goto fail; } // check for single sector erase - if (!csd.v1.erase_blk_en) { + if (!csd.eraseSingleBlock()) { // erase size mask - uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; + uint8_t m = csd.eraseSize() - 1; if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { // error card can't erase specified area error(SD_CARD_ERROR_ERASE_SINGLE_SECTOR); goto fail; } } - if (m_type != SD_CARD_TYPE_SDHC) { + if (type() != SD_CARD_TYPE_SDHC) { firstSector <<= 9; lastSector <<= 9; } - if (cardCommand(CMD32, firstSector) - || cardCommand(CMD33, lastSector) - || cardCommand(CMD38, 0)) { + if (cardCommand(CMD32, firstSector) || cardCommand(CMD33, lastSector) || + cardCommand(CMD38, 0)) { error(SD_CARD_ERROR_ERASE); goto fail; } @@ -306,14 +326,14 @@ bool SharedSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ bool SharedSpiCard::eraseSingleSectorEnable() { csd_t csd; - return readCSD(&csd) ? csd.v1.erase_blk_en : false; + return readCSD(&csd) ? csd.eraseSingleBlock() : false; } //------------------------------------------------------------------------------ bool SharedSpiCard::isBusy() { @@ -331,9 +351,7 @@ bool SharedSpiCard::isBusy() { return rtn; } //------------------------------------------------------------------------------ -bool SharedSpiCard::readData(uint8_t* dst) { - return readData(dst, 512); -} +bool SharedSpiCard::readData(uint8_t* dst) { return readData(dst, 512); } //------------------------------------------------------------------------------ bool SharedSpiCard::readData(uint8_t* dst, size_t count) { #if USE_SD_CRC @@ -365,14 +383,14 @@ bool SharedSpiCard::readData(uint8_t* dst, size_t count) { error(SD_CARD_ERROR_READ_CRC); goto fail; } -#else // USE_SD_CRC +#else // USE_SD_CRC // discard crc spiReceive(); spiReceive(); #endif // USE_SD_CRC return true; - fail: +fail: spiStop(); return false; } @@ -384,12 +402,16 @@ bool SharedSpiCard::readOCR(uint32_t* ocr) { goto fail; } for (uint8_t i = 0; i < 4; i++) { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ p[3 - i] = spiReceive(); +#else // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + p[i] = spiReceive(); +#endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ } spiStop(); return true; - fail: +fail: spiStop(); return false; } @@ -407,7 +429,24 @@ bool SharedSpiCard::readRegister(uint8_t cmd, void* buf) { spiStop(); return true; - fail: +fail: + spiStop(); + return false; +} +//------------------------------------------------------------------------------ +bool SharedSpiCard::readSCR(scr_t* scr) { + uint8_t* dst = reinterpret_cast(scr); + if (cardAcmd(ACMD51, 0)) { + error(SD_CARD_ERROR_ACMD51); + goto fail; + } + if (!readData(dst, sizeof(scr_t))) { + goto fail; + } + spiStop(); + return true; + +fail: spiStop(); return false; } @@ -427,7 +466,7 @@ bool SharedSpiCard::readSector(uint32_t sector, uint8_t* dst) { spiStop(); return true; - fail: +fail: spiStop(); return false; } @@ -442,7 +481,7 @@ bool SharedSpiCard::readSectors(uint32_t sector, uint8_t* dst, size_t ns) { } } return readStop(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -457,24 +496,25 @@ bool SharedSpiCard::readStart(uint32_t sector) { m_state = READ_STATE; return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SharedSpiCard::readStatus(uint8_t* status) { +bool SharedSpiCard::readSDS(sds_t* sds) { + uint8_t* dst = reinterpret_cast(sds); // retrun is R2 so read extra status byte. if (cardAcmd(ACMD13, 0) || spiReceive()) { error(SD_CARD_ERROR_ACMD13); goto fail; } - if (!readData(status, 64)) { + if (!readData(dst, sizeof(sds_t))) { goto fail; } spiStop(); return true; - fail: +fail: spiStop(); return false; } @@ -488,27 +528,29 @@ bool SharedSpiCard::readStop() { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ uint32_t SharedSpiCard::sectorCount() { csd_t csd; - return readCSD(&csd) ? sdCardCapacity(&csd) : 0; + return readCSD(&csd) ? csd.capacity() : 0; } //------------------------------------------------------------------------------ void SharedSpiCard::spiStart() { + SPI_ASSERT_NOT_ACTIVE; if (!m_spiActive) { spiActivate(); + m_spiActive = true; spiSelect(); // Dummy byte to drive MISO busy status. spiSend(0XFF); - m_spiActive = true; } } //------------------------------------------------------------------------------ void SharedSpiCard::spiStop() { + SPI_ASSERT_ACTIVE; if (m_spiActive) { spiUnselect(); // Insure MISO goes to low Z. @@ -549,7 +591,7 @@ bool SharedSpiCard::writeData(const uint8_t* src) { } return true; - fail: +fail: spiStop(); return false; } @@ -558,7 +600,7 @@ bool SharedSpiCard::writeData(const uint8_t* src) { bool SharedSpiCard::writeData(uint8_t token, const uint8_t* src) { #if USE_SD_CRC uint16_t crc = CRC_CCITT(src, 512); -#else // USE_SD_CRC +#else // USE_SD_CRC uint16_t crc = 0XFFFF; #endif // USE_SD_CRC spiSend(token); @@ -573,7 +615,7 @@ bool SharedSpiCard::writeData(uint8_t token, const uint8_t* src) { } return true; - fail: +fail: spiStop(); return false; } @@ -607,13 +649,13 @@ bool SharedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SharedSpiCard::writeSectors(uint32_t sector, - const uint8_t* src, size_t ns) { +bool SharedSpiCard::writeSectors(uint32_t sector, const uint8_t* src, + size_t ns) { if (!writeStart(sector)) { goto fail; } @@ -624,7 +666,7 @@ bool SharedSpiCard::writeSectors(uint32_t sector, } return writeStop(); - fail: +fail: spiStop(); return false; } @@ -641,7 +683,7 @@ bool SharedSpiCard::writeStart(uint32_t sector) { m_state = WRITE_STATE; return true; - fail: +fail: spiStop(); return false; } @@ -655,7 +697,7 @@ bool SharedSpiCard::writeStop() { m_state = IDLE_STATE; return true; - fail: +fail: error(SD_CARD_ERROR_STOP_TRAN); spiStop(); return false; @@ -673,8 +715,7 @@ bool DedicatedSpiCard::readSector(uint32_t sector, uint8_t* dst) { return readSectors(sector, dst, 1); } //------------------------------------------------------------------------------ -bool DedicatedSpiCard::readSectors( - uint32_t sector, uint8_t* dst, size_t ns) { +bool DedicatedSpiCard::readSectors(uint32_t sector, uint8_t* dst, size_t ns) { if (sdState() != READ_STATE || sector != m_curSector) { if (!readStart(sector)) { goto fail; @@ -689,7 +730,7 @@ bool DedicatedSpiCard::readSectors( m_curSector += ns; return m_dedicatedSpi ? true : readStop(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -708,8 +749,8 @@ bool DedicatedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { return SharedSpiCard::writeSector(sector, src); } //------------------------------------------------------------------------------ -bool DedicatedSpiCard::writeSectors( - uint32_t sector, const uint8_t* src, size_t ns) { +bool DedicatedSpiCard::writeSectors(uint32_t sector, const uint8_t* src, + size_t ns) { if (sdState() != WRITE_STATE || m_curSector != sector) { if (!writeStart(sector)) { goto fail; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.h similarity index 76% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.h index d0b5b7bd..4b1477c3 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdSpiCard.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdSpiCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,15 +24,44 @@ */ /** * \file - * \brief SdSpiCard class for V2 SD/SDHC cards + * \brief Classes for SPI access to SD/SDHC cards. */ #ifndef SdSpiCard_h #define SdSpiCard_h #include + +#include "../SpiDriver/SdSpiDriver.h" #include "../common/SysCall.h" #include "SdCardInfo.h" #include "SdCardInterface.h" -#include "../SpiDriver/SdSpiDriver.h" +/** Verify correct SPI active if non-zero. */ +#define CHECK_SPI_ACTIVE 0 +#if CHECK_SPI_ACTIVE +/** Check SPI active. */ +#define SPI_ASSERT_ACTIVE \ + { \ + if (!m_spiActive) { \ + Serial.print(F("SPI_ASSERT_ACTIVE")); \ + Serial.println(__LINE__); \ + while (true) \ + ; \ + } \ + } +#define SPI_ASSERT_NOT_ACTIVE \ + { \ + if (m_spiActive) { \ + Serial.print(F("SPI_ASSERT_NOT_ACTIVE")); \ + Serial.println(__LINE__); \ + while (true) \ + ; \ + } \ + } +#else // CHECK_SPI_ACTIVE +/** Check for SPI active. */ +#define SPI_ASSERT_ACTIVE +/** Check for SPI not active. */ +#define SPI_ASSERT_NOT_ACTIVE +#endif // CHECK_SPI_ACTIVE //============================================================================== /** * \class SharedSpiCard @@ -42,7 +71,7 @@ class SharedSpiCard : public SdCardInterface { #elif USE_BLOCK_DEVICE_INTERFACE class SharedSpiCard : public FsBlockDeviceInterface { -#else // HAS_SDIO_CLASS +#else // HAS_SDIO_CLASS class SharedSpiCard { #endif // HAS_SDIO_CLASS public: @@ -53,16 +82,21 @@ class SharedSpiCard { /** SD is in multi-sector write state. */ static const uint8_t WRITE_STATE = 2; /** Construct an instance of SharedSpiCard. */ - SharedSpiCard() {} + SharedSpiCard() { initSharedSpiCard(); } /** Initialize the SD card. * \param[in] spiConfig SPI card configuration. * \return true for success or false for failure. */ bool begin(SdSpiConfig spiConfig); + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. + * + * \return true for success or false for failure. + */ + bool cardCMD6(uint32_t arg, uint8_t* status); /** End use of card */ - void end() { - spiEnd(); - } + void end(); /** Erase a range of sectors. * * \param[in] firstSector The address of the first sector in the range. @@ -87,21 +121,18 @@ class SharedSpiCard { * \param[in] code value for error code. */ void error(uint8_t code) { -// (void)code; + // (void)code; m_errorCode = code; } /** - * \return code for the last error. See SdCardInfo.h for a list of error codes. + * \return code for the last error. See SdCardInfo.h for a list of error + * codes. */ - uint8_t errorCode() const { - return m_errorCode; - } + uint8_t errorCode() const { return m_errorCode; } /** \return error data for last error. */ - uint32_t errorData() const { - return m_status; - } + uint32_t errorData() const { return m_status; } /** \return false for shared class. */ - bool hasDedicatedSpi() {return false;} + bool hasDedicatedSpi() { return false; } /** * Check for busy. MISO low indicates the card is busy. * @@ -109,7 +140,9 @@ class SharedSpiCard { */ bool isBusy(); /** \return false, can't be in dedicated state. */ - bool isDedicatedSpi() {return false;} + bool isDedicatedSpi() { return false; } + /** \return true if card is on SPI bus. */ + bool isSpi() { return true; } /** * Read a card's CID register. The CID contains card identification * information such as Manufacturer ID, Product name, Product serial @@ -119,9 +152,7 @@ class SharedSpiCard { * * \return true for success or false for failure. */ - bool readCID(cid_t* cid) { - return readRegister(CMD10, cid); - } + bool readCID(cid_t* cid) { return readRegister(CMD10, cid); } /** * Read a card's CSD register. The CSD contains Card-Specific Data that * provides information regarding access to the card's contents. @@ -130,9 +161,7 @@ class SharedSpiCard { * * \return true for success or false for failure. */ - bool readCSD(csd_t* csd) { - return readRegister(CMD9, csd); - } + bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } /** Read one data sector in a multiple sector read sequence * * \param[out] dst Pointer to the location for the data to be read. @@ -146,6 +175,12 @@ class SharedSpiCard { * \return true for success or false for failure. */ bool readOCR(uint32_t* ocr); + /** Read SCR register. + * + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. + */ + bool readSCR(scr_t* scr); /** * Read a 512 byte sector from an SD card. * @@ -174,18 +209,18 @@ class SharedSpiCard { * \return true for success or false for failure. */ bool readStart(uint32_t sector); - /** Return the 64 byte card status + /** Return the 64 byte SD Status register. * \param[out] status location for 64 status bytes. * \return true for success or false for failure. */ - bool readStatus(uint8_t* status); + bool readSDS(sds_t* status); /** End a read multiple sectors sequence. * * \return true for success or false for failure. */ bool readStop(); /** \return SD multi-sector read/write state */ - uint8_t sdState() {return m_state;} + uint8_t sdState() { return m_state; } /** * Determine the size of an SD flash memory card. * @@ -215,9 +250,7 @@ class SharedSpiCard { /** Return the card type: SD V1, SD V2 or SDHC/SDXC * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC. */ - uint8_t type() const { - return m_type; - } + uint8_t type() const { return m_type; } /** * Write a 512 byte sector to an SD card. * @@ -266,86 +299,77 @@ class SharedSpiCard { uint8_t cardCommand(uint8_t cmd, uint32_t arg); bool readData(uint8_t* dst, size_t count); bool readRegister(uint8_t cmd, void* buf); - void spiSelect() { - sdCsWrite(m_csPin, false); - } + void spiSelect() { sdCsWrite(m_csPin, false); } void spiStart(); void spiStop(); - void spiUnselect() { - sdCsWrite(m_csPin, true); - } - void type(uint8_t value) { - m_type = value; - } + void spiUnselect() { sdCsWrite(m_csPin, true); } bool waitReady(uint16_t ms); bool writeData(uint8_t token, const uint8_t* src); #if SPI_DRIVER_SELECT < 2 - void spiActivate() { - m_spiDriver.activate(); - } - void spiBegin(SdSpiConfig spiConfig) { - m_spiDriver.begin(spiConfig); - } - void spiDeactivate() { - m_spiDriver.deactivate(); - } - void spiEnd() { - m_spiDriver.end(); - } + void spiActivate() { m_spiDriver.activate(); } + void spiBegin(SdSpiConfig spiConfig) { m_spiDriver.begin(spiConfig); } + void spiDeactivate() { m_spiDriver.deactivate(); } + void spiEnd() { m_spiDriver.end(); } uint8_t spiReceive() { + SPI_ASSERT_ACTIVE; return m_spiDriver.receive(); } uint8_t spiReceive(uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; return m_spiDriver.receive(buf, n); } void spiSend(uint8_t data) { + SPI_ASSERT_ACTIVE; m_spiDriver.send(data); } void spiSend(const uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; m_spiDriver.send(buf, n); } - void spiSetSckSpeed(uint32_t maxSck) { - m_spiDriver.setSckSpeed(maxSck); - } + void spiSetSckSpeed(uint32_t maxSck) { m_spiDriver.setSckSpeed(maxSck); } SdSpiDriver m_spiDriver; #else // SPI_DRIVER_SELECT < 2 - void spiActivate() { - m_spiDriverPtr->activate(); - } - void spiBegin(SdSpiConfig spiConfig) { - m_spiDriverPtr->begin(spiConfig); - } - void spiDeactivate() { - m_spiDriverPtr->deactivate(); - } - void spiEnd() { - m_spiDriverPtr->end(); - } + void spiActivate() { m_spiDriverPtr->activate(); } + void spiBegin(SdSpiConfig spiConfig) { m_spiDriverPtr->begin(spiConfig); } + void spiDeactivate() { m_spiDriverPtr->deactivate(); } + void spiEnd() { m_spiDriverPtr->end(); } uint8_t spiReceive() { + SPI_ASSERT_ACTIVE; return m_spiDriverPtr->receive(); } uint8_t spiReceive(uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; return m_spiDriverPtr->receive(buf, n); } void spiSend(uint8_t data) { + SPI_ASSERT_ACTIVE; m_spiDriverPtr->send(data); } void spiSend(const uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; m_spiDriverPtr->send(buf, n); } - void spiSetSckSpeed(uint32_t maxSck) { - m_spiDriverPtr->setSckSpeed(maxSck); - } + void spiSetSckSpeed(uint32_t maxSck) { m_spiDriverPtr->setSckSpeed(maxSck); } SdSpiDriver* m_spiDriverPtr; + #endif // SPI_DRIVER_SELECT < 2 + void initSharedSpiCard() { + m_beginCalled = false; + m_csPin = 0; + m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; + m_spiActive = false; + m_state = IDLE_STATE; + m_status = 0; + m_type = 0; + } + bool m_beginCalled; SdCsPin_t m_csPin; - uint8_t m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; - bool m_spiActive; + uint8_t m_errorCode; + bool m_spiActive; uint8_t m_state; uint8_t m_status; - uint8_t m_type = 0; + uint8_t m_type; }; - //============================================================================== /** * \class DedicatedSpiCard @@ -354,16 +378,16 @@ class SharedSpiCard { class DedicatedSpiCard : public SharedSpiCard { public: /** Construct an instance of DedicatedSpiCard. */ - DedicatedSpiCard() {} + DedicatedSpiCard() = default; /** Initialize the SD card. * \param[in] spiConfig SPI card configuration. * \return true for success or false for failure. */ bool begin(SdSpiConfig spiConfig); /** \return true, can be in dedicaded state. */ - bool hasDedicatedSpi() {return true;} + bool hasDedicatedSpi() { return true; } /** \return true if in dedicated SPI state. */ - bool isDedicatedSpi() {return m_dedicatedSpi;} + bool isDedicatedSpi() { return m_dedicatedSpi; } /** * Read a 512 byte sector from an SD card. * @@ -405,7 +429,7 @@ class DedicatedSpiCard : public SharedSpiCard { bool writeSectors(uint32_t sector, const uint8_t* src, size_t ns); private: - uint32_t m_curSector; + uint32_t m_curSector = 0; bool m_dedicatedSpi = false; }; //============================================================================== diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioCard.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioCard.h similarity index 88% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioCard.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioCard.h index cfbe4cdc..eb032e4a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioCard.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,12 +22,17 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Classes for SDIO cards. + */ #ifndef SdioCard_h #define SdioCard_h #include "../common/SysCall.h" #include "SdCardInterface.h" - +/** Use programmed I/O with FIFO. */ #define FIFO_SDIO 0 +/** Use programmed I/O with DMA. */ #define DMA_SDIO 1 /** * \class SdioConfig @@ -42,9 +47,10 @@ class SdioConfig { */ explicit SdioConfig(uint8_t opt) : m_options(opt) {} /** \return SDIO card options. */ - uint8_t options() {return m_options;} + uint8_t options() { return m_options; } /** \return true if DMA_SDIO. */ - bool useDma() {return m_options & DMA_SDIO;} + bool useDma() { return m_options & DMA_SDIO; } + private: uint8_t m_options = FIFO_SDIO; }; @@ -60,13 +66,20 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool begin(SdioConfig sdioConfig); + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. + * + * \return true for success or false for failure. + */ + bool cardCMD6(uint32_t arg, uint8_t* status); /** Disable an SDIO card. * not implemented. */ void end() {} #ifndef DOXYGEN_SHOULD_SKIP_THIS - uint32_t __attribute__((error("use sectorCount()"))) cardSize(); + uint32_t __attribute__((error("use sectorCount()"))) cardSize(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** Erase a range of sectors. * @@ -82,7 +95,8 @@ class SdioCard : public SdCardInterface { */ bool erase(uint32_t firstSector, uint32_t lastSector); /** - * \return code for the last error. See SdCardInfo.h for a list of error codes. + * \return code for the last error. See SdCardInfo.h for a list of error + * codes. */ uint8_t errorCode() const; /** \return error data for last error. */ @@ -146,26 +160,27 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool readOCR(uint32_t* ocr); + /** Read SCR register. + * + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. + */ + bool readSCR(scr_t* scr); + /** Return the 64 byte SD Status register. + * \param[out] sds location for 64 status bytes. + * \return true for success or false for failure. + */ + bool readSDS(sds_t* sds); /** Start a read multiple sectors sequence. * * \param[in] sector Address of first sector in sequence. * * \note This function is used with readData() and readStop() for optimized - * multiple sector reads. SPI chipSelect must be low for the entire sequence. + * multiple sector reads. * * \return true for success or false for failure. */ bool readStart(uint32_t sector); - /** Start a read multiple sectors sequence. - * - * \param[in] sector Address of first sector in sequence. - * \param[in] count Maximum sector count. - * \note This function is used with readData() and readStop() for optimized - * multiple sector reads. SPI chipSelect must be low for the entire sequence. - * - * \return true for success or false for failure. - */ - bool readStart(uint32_t sector, uint32_t count); /** End a read multiple sectors sequence. * * \return true for success or false for failure. @@ -173,7 +188,7 @@ class SdioCard : public SdCardInterface { bool readStop(); /** \return SDIO card status. */ uint32_t status(); - /** + /** * Determine the size of an SD flash memory card. * * \return The number of 512 byte data sectors in the card @@ -226,16 +241,6 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool writeStart(uint32_t sector); - /** Start a write multiple sectors sequence. - * - * \param[in] sector Address of first sector in sequence. - * \param[in] count Maximum sector count. - * \note This function is used with writeData() and writeStop() - * for optimized multiple sector writes. - * - * \return true for success or false for failure. - */ - bool writeStart(uint32_t sector, uint32_t count); /** End a write multiple sectors sequence. * diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.cpp similarity index 76% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.cpp index 8908919c..c4b81330 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdCard/SdioTeensy.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,6 +24,7 @@ */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) #include "SdioTeensy.h" + #include "SdCardInfo.h" #include "SdioCard.h" //============================================================================== @@ -36,39 +37,34 @@ const uint32_t CMD8_RETRIES = 3; const uint32_t BUSY_TIMEOUT_MICROS = 1000000; //============================================================================== const uint32_t SDHC_IRQSTATEN_MASK = - SDHC_IRQSTATEN_DMAESEN | SDHC_IRQSTATEN_AC12ESEN | - SDHC_IRQSTATEN_DEBESEN | SDHC_IRQSTATEN_DCESEN | - SDHC_IRQSTATEN_DTOESEN | SDHC_IRQSTATEN_CIESEN | - SDHC_IRQSTATEN_CEBESEN | SDHC_IRQSTATEN_CCESEN | - SDHC_IRQSTATEN_CTOESEN | SDHC_IRQSTATEN_DINTSEN | - SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN; + SDHC_IRQSTATEN_DMAESEN | SDHC_IRQSTATEN_AC12ESEN | SDHC_IRQSTATEN_DEBESEN | + SDHC_IRQSTATEN_DCESEN | SDHC_IRQSTATEN_DTOESEN | SDHC_IRQSTATEN_CIESEN | + SDHC_IRQSTATEN_CEBESEN | SDHC_IRQSTATEN_CCESEN | SDHC_IRQSTATEN_CTOESEN | + SDHC_IRQSTATEN_DINTSEN | SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN; const uint32_t SDHC_IRQSTAT_CMD_ERROR = - SDHC_IRQSTAT_CIE | SDHC_IRQSTAT_CEBE | - SDHC_IRQSTAT_CCE | SDHC_IRQSTAT_CTOE; + SDHC_IRQSTAT_CIE | SDHC_IRQSTAT_CEBE | SDHC_IRQSTAT_CCE | SDHC_IRQSTAT_CTOE; -const uint32_t SDHC_IRQSTAT_DATA_ERROR = - SDHC_IRQSTAT_AC12E | SDHC_IRQSTAT_DEBE | - SDHC_IRQSTAT_DCE | SDHC_IRQSTAT_DTOE; +const uint32_t SDHC_IRQSTAT_DATA_ERROR = SDHC_IRQSTAT_AC12E | + SDHC_IRQSTAT_DEBE | SDHC_IRQSTAT_DCE | + SDHC_IRQSTAT_DTOE; const uint32_t SDHC_IRQSTAT_ERROR = - SDHC_IRQSTAT_DMAE | SDHC_IRQSTAT_CMD_ERROR | - SDHC_IRQSTAT_DATA_ERROR; + SDHC_IRQSTAT_DMAE | SDHC_IRQSTAT_CMD_ERROR | SDHC_IRQSTAT_DATA_ERROR; const uint32_t SDHC_IRQSIGEN_MASK = - SDHC_IRQSIGEN_DMAEIEN | SDHC_IRQSIGEN_AC12EIEN | - SDHC_IRQSIGEN_DEBEIEN | SDHC_IRQSIGEN_DCEIEN | - SDHC_IRQSIGEN_DTOEIEN | SDHC_IRQSIGEN_CIEIEN | - SDHC_IRQSIGEN_CEBEIEN | SDHC_IRQSIGEN_CCEIEN | - SDHC_IRQSIGEN_CTOEIEN | SDHC_IRQSIGEN_TCIEN; + SDHC_IRQSIGEN_DMAEIEN | SDHC_IRQSIGEN_AC12EIEN | SDHC_IRQSIGEN_DEBEIEN | + SDHC_IRQSIGEN_DCEIEN | SDHC_IRQSIGEN_DTOEIEN | SDHC_IRQSIGEN_CIEIEN | + SDHC_IRQSIGEN_CEBEIEN | SDHC_IRQSIGEN_CCEIEN | SDHC_IRQSIGEN_CTOEIEN | + SDHC_IRQSIGEN_TCIEN; //============================================================================== const uint32_t CMD_RESP_NONE = SDHC_XFERTYP_RSPTYP(0); -const uint32_t CMD_RESP_R1 = SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | - SDHC_XFERTYP_RSPTYP(2); +const uint32_t CMD_RESP_R1 = + SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(2); -const uint32_t CMD_RESP_R1b = SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | - SDHC_XFERTYP_RSPTYP(3); +const uint32_t CMD_RESP_R1b = + SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(3); const uint32_t CMD_RESP_R2 = SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(1); @@ -86,26 +82,23 @@ const uint32_t DATA_READ_DMA = DATA_READ | SDHC_XFERTYP_DMAEN; const uint32_t DATA_READ_MULTI_DMA = DATA_READ_DMA | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_AC12EN | SDHC_XFERTYP_BCEN; -const uint32_t DATA_READ_MULTI_PGM = DATA_READ | SDHC_XFERTYP_MSBSEL | - SDHC_XFERTYP_BCEN; +const uint32_t DATA_READ_MULTI_PGM = + DATA_READ | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_BCEN; const uint32_t DATA_WRITE_DMA = SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_DMAEN; const uint32_t DATA_WRITE_MULTI_DMA = DATA_WRITE_DMA | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_AC12EN | SDHC_XFERTYP_BCEN; -const uint32_t DATA_WRITE_MULTI_PGM = SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_MSBSEL | - SDHC_XFERTYP_BCEN; +const uint32_t DATA_WRITE_MULTI_PGM = + SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_BCEN; #elif defined(__IMXRT1062__) // Use low bits for SDHC_MIX_CTRL since bits 15-0 of SDHC_XFERTYP are reserved. -const uint32_t SDHC_MIX_CTRL_MASK = SDHC_MIX_CTRL_DMAEN | SDHC_MIX_CTRL_BCEN | - SDHC_MIX_CTRL_AC12EN | - SDHC_MIX_CTRL_DDR_EN | - SDHC_MIX_CTRL_DTDSEL | - SDHC_MIX_CTRL_MSBSEL | - SDHC_MIX_CTRL_NIBBLE_POS | - SDHC_MIX_CTRL_AC23EN; +const uint32_t SDHC_MIX_CTRL_MASK = + SDHC_MIX_CTRL_DMAEN | SDHC_MIX_CTRL_BCEN | SDHC_MIX_CTRL_AC12EN | + SDHC_MIX_CTRL_DDR_EN | SDHC_MIX_CTRL_DTDSEL | SDHC_MIX_CTRL_MSBSEL | + SDHC_MIX_CTRL_NIBBLE_POS | SDHC_MIX_CTRL_AC23EN; const uint32_t DATA_READ = SDHC_MIX_CTRL_DTDSEL | SDHC_XFERTYP_DPSEL; @@ -116,7 +109,6 @@ const uint32_t DATA_READ_MULTI_DMA = DATA_READ_DMA | SDHC_MIX_CTRL_MSBSEL | const uint32_t DATA_READ_MULTI_PGM = DATA_READ | SDHC_MIX_CTRL_MSBSEL; - const uint32_t DATA_WRITE_DMA = SDHC_XFERTYP_DPSEL | SDHC_MIX_CTRL_DMAEN; const uint32_t DATA_WRITE_MULTI_DMA = DATA_WRITE_DMA | SDHC_MIX_CTRL_MSBSEL | @@ -128,16 +120,22 @@ const uint32_t DATA_WRITE_MULTI_PGM = SDHC_XFERTYP_DPSEL | SDHC_MIX_CTRL_MSBSEL; const uint32_t ACMD6_XFERTYP = SDHC_XFERTYP_CMDINX(ACMD6) | CMD_RESP_R1; +const uint32_t ACMD13_XFERTYP = + SDHC_XFERTYP_CMDINX(ACMD13) | CMD_RESP_R1 | DATA_READ_DMA; + const uint32_t ACMD41_XFERTYP = SDHC_XFERTYP_CMDINX(ACMD41) | CMD_RESP_R3; +const uint32_t ACMD51_XFERTYP = + SDHC_XFERTYP_CMDINX(ACMD51) | CMD_RESP_R1 | DATA_READ_DMA; + const uint32_t CMD0_XFERTYP = SDHC_XFERTYP_CMDINX(CMD0) | CMD_RESP_NONE; const uint32_t CMD2_XFERTYP = SDHC_XFERTYP_CMDINX(CMD2) | CMD_RESP_R2; const uint32_t CMD3_XFERTYP = SDHC_XFERTYP_CMDINX(CMD3) | CMD_RESP_R6; -const uint32_t CMD6_XFERTYP = SDHC_XFERTYP_CMDINX(CMD6) | CMD_RESP_R1 | - DATA_READ_DMA; +const uint32_t CMD6_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD6) | CMD_RESP_R1 | DATA_READ_DMA; const uint32_t CMD7_XFERTYP = SDHC_XFERTYP_CMDINX(CMD7) | CMD_RESP_R1b; @@ -149,28 +147,28 @@ const uint32_t CMD10_XFERTYP = SDHC_XFERTYP_CMDINX(CMD10) | CMD_RESP_R2; const uint32_t CMD11_XFERTYP = SDHC_XFERTYP_CMDINX(CMD11) | CMD_RESP_R1; -const uint32_t CMD12_XFERTYP = SDHC_XFERTYP_CMDINX(CMD12) | CMD_RESP_R1b | - SDHC_XFERTYP_CMDTYP(3); +const uint32_t CMD12_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD12) | CMD_RESP_R1b | SDHC_XFERTYP_CMDTYP(3); const uint32_t CMD13_XFERTYP = SDHC_XFERTYP_CMDINX(CMD13) | CMD_RESP_R1; -const uint32_t CMD17_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD17) | CMD_RESP_R1 | - DATA_READ_DMA; +const uint32_t CMD17_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD17) | CMD_RESP_R1 | DATA_READ_DMA; -const uint32_t CMD18_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | - DATA_READ_MULTI_DMA; +const uint32_t CMD18_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | DATA_READ_MULTI_DMA; -const uint32_t CMD18_PGM_XFERTYP = SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | - DATA_READ_MULTI_PGM; +const uint32_t CMD18_PGM_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | DATA_READ_MULTI_PGM; -const uint32_t CMD24_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD24) | CMD_RESP_R1 | - DATA_WRITE_DMA; +const uint32_t CMD24_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD24) | CMD_RESP_R1 | DATA_WRITE_DMA; -const uint32_t CMD25_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | - DATA_WRITE_MULTI_DMA; +const uint32_t CMD25_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | DATA_WRITE_MULTI_DMA; -const uint32_t CMD25_PGM_XFERTYP = SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | - DATA_WRITE_MULTI_PGM; +const uint32_t CMD25_PGM_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | DATA_WRITE_MULTI_PGM; const uint32_t CMD32_XFERTYP = SDHC_XFERTYP_CMDINX(CMD32) | CMD_RESP_R1; @@ -208,12 +206,21 @@ static uint32_t m_sdClkKhz = 0; static uint32_t m_ocr; static cid_t m_cid; static csd_t m_csd; +static scr_t m_scr; +static sds_t m_sds; //============================================================================== -#define DBG_TRACE Serial.print("TRACE."); Serial.println(__LINE__); delay(200); +#define DBG_TRACE \ + Serial.print("TRACE."); \ + Serial.println(__LINE__); \ + delay(200); #define USE_DEBUG_MODE 0 #if USE_DEBUG_MODE -#define DBG_IRQSTAT() if (SDHC_IRQSTAT) {Serial.print(__LINE__);\ - Serial.print(" IRQSTAT "); Serial.println(SDHC_IRQSTAT, HEX);} +#define DBG_IRQSTAT() \ + if (SDHC_IRQSTAT) { \ + Serial.print(__LINE__); \ + Serial.print(" IRQSTAT "); \ + Serial.println(SDHC_IRQSTAT, HEX); \ + } static void printRegs(uint32_t line) { uint32_t blkattr = SDHC_BLKATTR; uint32_t xfertyp = SDHC_XFERTYP; @@ -230,36 +237,68 @@ static void printRegs(uint32_t line) { Serial.print(xfertyp >> 24); Serial.print(" TYP"); Serial.print((xfertyp >> 2) & 3); - if (xfertyp & SDHC_XFERTYP_DPSEL) {Serial.print(" DPSEL");} + if (xfertyp & SDHC_XFERTYP_DPSEL) { + Serial.print(" DPSEL"); + } Serial.println(); Serial.print("PRSSTAT "); Serial.print(prsstat, HEX); - if (prsstat & SDHC_PRSSTAT_BREN) {Serial.print(" BREN");} - if (prsstat & SDHC_PRSSTAT_BWEN) {Serial.print(" BWEN");} - if (prsstat & SDHC_PRSSTAT_RTA) {Serial.print(" RTA");} - if (prsstat & SDHC_PRSSTAT_WTA) {Serial.print(" WTA");} - if (prsstat & SDHC_PRSSTAT_SDOFF) {Serial.print(" SDOFF");} - if (prsstat & SDHC_PRSSTAT_PEROFF) {Serial.print(" PEROFF");} - if (prsstat & SDHC_PRSSTAT_HCKOFF) {Serial.print(" HCKOFF");} - if (prsstat & SDHC_PRSSTAT_IPGOFF) {Serial.print(" IPGOFF");} - if (prsstat & SDHC_PRSSTAT_SDSTB) {Serial.print(" SDSTB");} - if (prsstat & SDHC_PRSSTAT_DLA) {Serial.print(" DLA");} - if (prsstat & SDHC_PRSSTAT_CDIHB) {Serial.print(" CDIHB");} - if (prsstat & SDHC_PRSSTAT_CIHB) {Serial.print(" CIHB");} + if (prsstat & SDHC_PRSSTAT_BREN) { + Serial.print(" BREN"); + } + if (prsstat & SDHC_PRSSTAT_BWEN) { + Serial.print(" BWEN"); + } + if (prsstat & SDHC_PRSSTAT_RTA) { + Serial.print(" RTA"); + } + if (prsstat & SDHC_PRSSTAT_WTA) { + Serial.print(" WTA"); + } + if (prsstat & SDHC_PRSSTAT_SDOFF) { + Serial.print(" SDOFF"); + } + if (prsstat & SDHC_PRSSTAT_PEROFF) { + Serial.print(" PEROFF"); + } + if (prsstat & SDHC_PRSSTAT_HCKOFF) { + Serial.print(" HCKOFF"); + } + if (prsstat & SDHC_PRSSTAT_IPGOFF) { + Serial.print(" IPGOFF"); + } + if (prsstat & SDHC_PRSSTAT_SDSTB) { + Serial.print(" SDSTB"); + } + if (prsstat & SDHC_PRSSTAT_DLA) { + Serial.print(" DLA"); + } + if (prsstat & SDHC_PRSSTAT_CDIHB) { + Serial.print(" CDIHB"); + } + if (prsstat & SDHC_PRSSTAT_CIHB) { + Serial.print(" CIHB"); + } Serial.println(); Serial.print("PROCTL "); Serial.print(proctl, HEX); if (proctl & SDHC_PROCTL_SABGREQ) Serial.print(" SABGREQ"); Serial.print(" EMODE"); - Serial.print((proctl >>4) & 3); + Serial.print((proctl >> 4) & 3); Serial.print(" DWT"); - Serial.print((proctl >>1) & 3); + Serial.print((proctl >> 1) & 3); Serial.println(); Serial.print("IRQSTAT "); Serial.print(irqstat, HEX); - if (irqstat & SDHC_IRQSTAT_BGE) {Serial.print(" BGE");} - if (irqstat & SDHC_IRQSTAT_TC) {Serial.print(" TC");} - if (irqstat & SDHC_IRQSTAT_CC) {Serial.print(" CC");} + if (irqstat & SDHC_IRQSTAT_BGE) { + Serial.print(" BGE"); + } + if (irqstat & SDHC_IRQSTAT_TC) { + Serial.print(" TC"); + } + if (irqstat & SDHC_IRQSTAT_CC) { + Serial.print(" CC"); + } Serial.print("\nm_irqstat "); Serial.println(m_irqstat, HEX); } @@ -294,12 +333,12 @@ static void sdIrs() { //------------------------------------------------------------------------------ static void enableGPIO(bool enable) { const uint32_t PORT_CLK = PORT_PCR_MUX(4) | PORT_PCR_DSE; - const uint32_t PORT_CMD_DATA = PORT_CLK | PORT_PCR_PE | PORT_PCR_PS; + const uint32_t PORT_CMD_DATA = PORT_CLK | PORT_PCR_PE | PORT_PCR_PS; const uint32_t PORT_PUP = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; PORTE_PCR0 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D1 PORTE_PCR1 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D0 - PORTE_PCR2 = enable ? PORT_CLK : PORT_PUP; // SDHC_CLK + PORTE_PCR2 = enable ? PORT_CLK : PORT_PUP; // SDHC_CLK PORTE_PCR3 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_CMD PORTE_PCR4 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D3 PORTE_PCR5 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D2 @@ -313,7 +352,7 @@ static void initClock() { // Enable SDHC clock. SIM_SCGC3 |= SIM_SCGC3_SDHC; } -static uint32_t baseClock() { return F_CPU;} +static uint32_t baseClock() { return F_CPU; } #elif defined(__IMXRT1062__) //------------------------------------------------------------------------------ @@ -331,13 +370,13 @@ static void enableGPIO(bool enable) { const uint32_t CLOCK_MASK = IOMUXC_SW_PAD_CTL_PAD_PKE | #if defined(ARDUINO_TEENSY41) IOMUXC_SW_PAD_CTL_PAD_DSE(7) | -#else // defined(ARDUINO_TEENSY41) +#else // defined(ARDUINO_TEENSY41) IOMUXC_SW_PAD_CTL_PAD_DSE(4) | ///// WHG #endif // defined(ARDUINO_TEENSY41) IOMUXC_SW_PAD_CTL_PAD_SPEED(2); - const uint32_t DATA_MASK = CLOCK_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE | - IOMUXC_SW_PAD_CTL_PAD_PUS(1); + const uint32_t DATA_MASK = + CLOCK_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE | IOMUXC_SW_PAD_CTL_PAD_PUS(1); if (enable) { gpioMux(0); IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 @@ -361,20 +400,20 @@ static void initClock() { /* Enable USDHC clock. */ CCM_CCGR6 |= CCM_CCGR6_USDHC1(CCM_CCGR_ON); CCM_CSCDR1 &= ~(CCM_CSCDR1_USDHC1_CLK_PODF_MASK); - CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL; // PLL2PFD0 -// CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((7)); / &0x7 WHG + CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL; // PLL2PFD0 + // CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((7)); / &0x7 WHG CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((1)); } //------------------------------------------------------------------------------ static uint32_t baseClock() { uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; - return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; + return (528000000U * 3) / ((CCM_ANALOG_PFD_528 & 0x3F) / 6) / divider; } #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) //============================================================================== // Static functions. static bool cardAcmd(uint32_t rca, uint32_t xfertyp, uint32_t arg) { - return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); + return cardCommand(CMD55_XFERTYP, rca) && cardCommand(xfertyp, arg); } //------------------------------------------------------------------------------ static bool cardCommand(uint32_t xfertyp, uint32_t arg) { @@ -398,21 +437,38 @@ static bool cardCommand(uint32_t xfertyp, uint32_t arg) { m_irqstat = SDHC_IRQSTAT; SDHC_IRQSTAT = m_irqstat; - return (m_irqstat & SDHC_IRQSTAT_CC) && - !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); + return (m_irqstat & SDHC_IRQSTAT_CC) && !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); } //------------------------------------------------------------------------------ -static bool cardCMD6(uint32_t arg, uint8_t* status) { - // CMD6 returns 64 bytes. +static bool cardACMD13(sds_t* scr) { + // ACMD13 returns 64 bytes. if (waitTimeout(isBusyCMD13)) { return sdError(SD_CARD_ERROR_CMD13); } enableDmaIrs(); - SDHC_DSADDR = (uint32_t)status; + SDHC_DSADDR = (uint32_t)scr; SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; - if (!cardCommand(CMD6_XFERTYP, arg)) { - return sdError(SD_CARD_ERROR_CMD6); + if (!cardAcmd(m_rca, ACMD13_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_ACMD13); + } + if (!waitDmaStatus()) { + return sdError(SD_CARD_ERROR_DMA); + } + return true; +} +//------------------------------------------------------------------------------ +static bool cardACMD51(scr_t* scr) { + // ACMD51 returns 8 bytes. + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + enableDmaIrs(); + SDHC_DSADDR = (uint32_t)scr; + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(8); + SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; + if (!cardAcmd(m_rca, ACMD51_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_ACMD51); } if (!waitDmaStatus()) { return sdError(SD_CARD_ERROR_DMA); @@ -431,7 +487,7 @@ static void initSDHC() { // Disable GPIO clock. enableGPIO(false); -#if defined (__IMXRT1062__) +#if defined(__IMXRT1062__) SDHC_MIX_CTRL |= 0x80000000; #endif // (__IMXRT1062__) @@ -450,7 +506,7 @@ static void initSDHC() { SDHC_IRQSTATEN = SDHC_IRQSTATEN_MASK; attachInterruptVector(IRQ_SDHC, sdIrs); - NVIC_SET_PRIORITY(IRQ_SDHC, 6*16); + NVIC_SET_PRIORITY(IRQ_SDHC, 6 * 16); NVIC_ENABLE_IRQ(IRQ_SDHC); // Send 80 clocks to card. @@ -471,32 +527,22 @@ static bool isBusyCommandComplete() { return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_CMD_ERROR)); } //------------------------------------------------------------------------------ -static bool isBusyCommandInhibit() { - return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; -} +static bool isBusyCommandInhibit() { return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; } //------------------------------------------------------------------------------ -static bool isBusyDat() { - return SDHC_PRSSTAT & (1 << 24) ? false : true; -} +static bool isBusyDat() { return SDHC_PRSSTAT & (1 << 24) ? false : true; } //------------------------------------------------------------------------------ -static bool isBusyDMA() { - return m_dmaBusy; -} +static bool isBusyDMA() { return m_dmaBusy; } //------------------------------------------------------------------------------ -static bool isBusyFifoRead() { - return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); -} +static bool isBusyFifoRead() { return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); } //------------------------------------------------------------------------------ -static bool isBusyFifoWrite() { - return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN); -} +static bool isBusyFifoWrite() { return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN); } //------------------------------------------------------------------------------ static bool isBusyTransferComplete() { return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); } //------------------------------------------------------------------------------ -static bool rdWrSectors(uint32_t xfertyp, - uint32_t sector, uint8_t* buf, size_t n) { +static bool rdWrSectors(uint32_t xfertyp, uint32_t sector, uint8_t* buf, + size_t n) { if ((3 & (uint32_t)buf) || n == 0) { return sdError(SD_CARD_ERROR_DMA); } @@ -504,10 +550,10 @@ static bool rdWrSectors(uint32_t xfertyp, return sdError(SD_CARD_ERROR_CMD13); } enableDmaIrs(); - SDHC_DSADDR = (uint32_t)buf; + SDHC_DSADDR = (uint32_t)buf; SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; - if (!cardCommand(xfertyp, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(xfertyp, m_highCapacity ? sector : 512 * sector)) { return false; } return waitDmaStatus(); @@ -521,7 +567,7 @@ static bool readReg16(uint32_t xfertyp, void* data) { } uint32_t sr[] = {SDHC_CMDRSP0, SDHC_CMDRSP1, SDHC_CMDRSP2, SDHC_CMDRSP3}; for (int i = 0; i < 15; i++) { - d[14 - i] = sr[i/4] >> 8*(i%4); + d[14 - i] = sr[i / 4] >> 8 * (i % 4); } d[15] = 0; return true; @@ -532,16 +578,17 @@ static void setSdclk(uint32_t kHzMax) { const uint32_t SDCLKFS_LIMIT = 0X100; uint32_t dvs = 1; uint32_t sdclkfs = 1; - uint32_t maxSdclk = 1000*kHzMax; + uint32_t maxSdclk = 1000 * kHzMax; uint32_t base = baseClock(); - while ((base/(sdclkfs*DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) { + while ((base / (sdclkfs * DVS_LIMIT) > maxSdclk) && + (sdclkfs < SDCLKFS_LIMIT)) { sdclkfs <<= 1; } - while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { + while ((base / (sdclkfs * dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { dvs++; } - m_sdClkKhz = base/(1000*sdclkfs*dvs); + m_sdClkKhz = base / (1000 * sdclkfs * dvs); sdclkfs >>= 1; dvs--; #if defined(__MK64FX512__) || defined(__MK66FX1M0__) @@ -550,11 +597,12 @@ static void setSdclk(uint32_t kHzMax) { #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) // Change dividers. - uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK - | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK); + uint32_t sysctl = + SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK | SDHC_SYSCTL_DVS_MASK | + SDHC_SYSCTL_SDCLKFS_MASK); - SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) - | SDHC_SYSCTL_SDCLKFS(sdclkfs); + SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) | + SDHC_SYSCTL_SDCLKFS(sdclkfs); // Wait until the SDHC clock is stable. while (!(SDHC_PRSSTAT & SDHC_PRSSTAT_SDSTB)) { @@ -662,12 +710,16 @@ bool SdioCard::begin(SdioConfig sdioConfig) { m_version2 = true; break; } + SDHC_SYSCTL |= SDHC_SYSCTL_RSTA; + while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA) { + } } + // Must support 3.2-3.4 Volts arg = m_version2 ? 0X40300000 : 0x00300000; int m = micros(); do { if (!cardAcmd(0, ACMD41_XFERTYP, arg) || - ((micros() - m) > BUSY_TIMEOUT_MICROS)) { + ((micros() - m) > BUSY_TIMEOUT_MICROS)) { return sdError(SD_CARD_ERROR_ACMD41); } } while ((SDHC_CMDRSP0 & 0x80000000) == 0); @@ -703,14 +755,32 @@ bool SdioCard::begin(SdioConfig sdioConfig) { SDHC_WML = SDHC_WML_RDWML(FIFO_WML) | SDHC_WML_WRWML(FIFO_WML); + if (!cardACMD51(&m_scr)) { + return false; + } + if (!cardACMD13(&m_sds)) { + return false; + } // Determine if High Speed mode is supported and set frequency. // Check status[16] for error 0XF or status[16] for new mode 0X1. uint8_t status[64]; - if (cardCMD6(0X00FFFFFF, status) && (2 & status[13]) && - cardCMD6(0X80FFFFF1, status) && (status[16] & 0XF) == 1) { - kHzSdClk = 50000; - } else { - kHzSdClk = 25000; + kHzSdClk = 25000; + if (m_scr.sdSpec() > 0) { + // card is 1.10 or greater - must support CMD6 + if (!cardCMD6(0X00FFFFFF, status)) { + return false; + } + if (2 & status[13]) { + // Card supports High Speed mode - switch mode. + if (!cardCMD6(0X80FFFFF1, status)) { + return false; + } + if ((status[16] & 0XF) == 1) { + kHzSdClk = 50000; + } else { + return sdError(SD_CARD_ERROR_CMD6); + } + } } // Disable GPIO. enableGPIO(false); @@ -724,16 +794,32 @@ bool SdioCard::begin(SdioConfig sdioConfig) { return true; } //------------------------------------------------------------------------------ +bool SdioCard::cardCMD6(uint32_t arg, uint8_t* status) { + // CMD6 returns 64 bytes. + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + enableDmaIrs(); + SDHC_DSADDR = (uint32_t)status; + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); + SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; + if (!cardCommand(CMD6_XFERTYP, arg)) { + return sdError(SD_CARD_ERROR_CMD6); + } + if (!waitDmaStatus()) { + return sdError(SD_CARD_ERROR_DMA); + } + return true; +} +//------------------------------------------------------------------------------ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { -#if ENABLE_TEENSY_SDIO_MOD if (m_curState != IDLE_STATE && !syncDevice()) { return false; } -#endif // ENABLE_TEENSY_SDIO_MOD // check for single sector erase - if (!m_csd.v1.erase_blk_en) { + if (!m_csd.eraseSingleBlock()) { // erase size mask - uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; + uint8_t m = m_csd.eraseSize() - 1; if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { // error card can't erase specified area return sdError(SD_CARD_ERROR_ERASE_SINGLE_SECTOR); @@ -747,7 +833,7 @@ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { return sdError(SD_CARD_ERROR_CMD32); } if (!cardCommand(CMD33_XFERTYP, lastSector)) { - return sdError(SD_CARD_ERROR_CMD33); + return sdError(SD_CARD_ERROR_CMD33); } if (!cardCommand(CMD38_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD38); @@ -758,17 +844,11 @@ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { return true; } //------------------------------------------------------------------------------ -uint8_t SdioCard::errorCode() const { - return m_errorCode; -} +uint8_t SdioCard::errorCode() const { return m_errorCode; } //------------------------------------------------------------------------------ -uint32_t SdioCard::errorData() const { - return m_irqstat; -} +uint32_t SdioCard::errorData() const { return m_irqstat; } //------------------------------------------------------------------------------ -uint32_t SdioCard::errorLine() const { - return m_errorLine; -} +uint32_t SdioCard::errorLine() const { return m_errorLine; } //------------------------------------------------------------------------------ bool SdioCard::isBusy() { if (m_sdioConfig.useDma()) { @@ -785,7 +865,7 @@ bool SdioCard::isBusy() { m_transferActive = false; stopTransmission(false); return true; -#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) +#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) return false; #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) } @@ -794,17 +874,15 @@ bool SdioCard::isBusy() { } } //------------------------------------------------------------------------------ -uint32_t SdioCard::kHzSdClk() { - return m_sdClkKhz; -} +uint32_t SdioCard::kHzSdClk() { return m_sdClkKhz; } //------------------------------------------------------------------------------ bool SdioCard::readCID(cid_t* cid) { - memcpy(cid, &m_cid, 16); + memcpy(cid, &m_cid, sizeof(cid_t)); return true; } //------------------------------------------------------------------------------ bool SdioCard::readCSD(csd_t* csd) { - memcpy(csd, &m_csd, 16); + memcpy(csd, &m_csd, sizeof(csd_t)); return true; } //------------------------------------------------------------------------------ @@ -822,7 +900,7 @@ bool SdioCard::readData(uint8_t* dst) { if (waitTimeout(isBusyFifoRead)) { return sdError(SD_CARD_ERROR_READ_FIFO); } - for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { + for (uint32_t iw = 0; iw < 512 / (4 * FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { @@ -843,6 +921,16 @@ bool SdioCard::readOCR(uint32_t* ocr) { return true; } //------------------------------------------------------------------------------ +bool SdioCard::readSCR(scr_t* scr) { + memcpy(scr, &m_scr, sizeof(scr_t)); + return true; +} +//------------------------------------------------------------------------------ +bool SdioCard::readSDS(sds_t* sds) { + memcpy(sds, &m_sds, sizeof(sds_t)); + return true; +} +//------------------------------------------------------------------------------ bool SdioCard::readSector(uint32_t sector, uint8_t* dst) { if (m_sdioConfig.useDma()) { uint8_t aligned[512]; @@ -899,7 +987,7 @@ bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n) { } } else { for (size_t i = 0; i < n; i++) { - if (!readSector(sector + i, dst + i*512UL)) { + if (!readSector(sector + i, dst + i * 512UL)) { return false; } } @@ -917,28 +1005,22 @@ bool SdioCard::readStart(uint32_t sector) { #if defined(__IMXRT1062__) // Infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); -#else // defined(__IMXRT1062__) +#else // defined(__IMXRT1062__) // Errata - can't do infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(MAX_BLKCNT) | SDHC_BLKATTR_BLKSIZE(512); #endif // defined(__IMXRT1062__) - if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512 * sector)) { return sdError(SD_CARD_ERROR_CMD18); } return true; } //------------------------------------------------------------------------------ -bool SdioCard::readStop() { - return transferStop(); -} +bool SdioCard::readStop() { return transferStop(); } //------------------------------------------------------------------------------ -uint32_t SdioCard::sectorCount() { - return sdCardCapacity(&m_csd); -} +uint32_t SdioCard::sectorCount() { return m_csd.capacity(); } //------------------------------------------------------------------------------ -uint32_t SdioCard::status() { - return statusCMD13(); -} +uint32_t SdioCard::status() { return statusCMD13(); } //------------------------------------------------------------------------------ bool SdioCard::stopTransmission(bool blocking) { m_curState = IDLE_STATE; @@ -966,8 +1048,10 @@ bool SdioCard::syncDevice() { } //------------------------------------------------------------------------------ uint8_t SdioCard::type() const { - return m_version2 ? m_highCapacity ? - SD_CARD_TYPE_SDHC : SD_CARD_TYPE_SD2 : SD_CARD_TYPE_SD1; + return !m_initDone ? 0 + : !m_version2 ? SD_CARD_TYPE_SD1 + : !m_highCapacity ? SD_CARD_TYPE_SD2 + : SD_CARD_TYPE_SDHC; } //------------------------------------------------------------------------------ bool SdioCard::writeData(const uint8_t* src) { @@ -984,7 +1068,7 @@ bool SdioCard::writeData(const uint8_t* src) { if (waitTimeout(isBusyFifoWrite)) { return sdError(SD_CARD_ERROR_WRITE_FIFO); } - for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { + for (uint32_t iw = 0; iw < 512 / (4 * FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { @@ -1025,7 +1109,7 @@ bool SdioCard::writeSector(uint32_t sector, const uint8_t* src) { if (!syncDevice()) { return false; } - if (!writeStart(sector )) { + if (!writeStart(sector)) { return false; } m_curSector = sector; @@ -1055,7 +1139,7 @@ bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n) { } } else { for (size_t i = 0; i < n; i++) { - if (!writeSector(sector + i, src + i*512UL)) { + if (!writeSector(sector + i, src + i * 512UL)) { return false; } } @@ -1072,17 +1156,15 @@ bool SdioCard::writeStart(uint32_t sector) { #if defined(__IMXRT1062__) // Infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); -#else // defined(__IMXRT1062__) +#else // defined(__IMXRT1062__) // Errata - can't do infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(MAX_BLKCNT) | SDHC_BLKATTR_BLKSIZE(512); #endif // defined(__IMXRT1062__) - if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512 * sector)) { return sdError(SD_CARD_ERROR_CMD25); } return true; } //------------------------------------------------------------------------------ -bool SdioCard::writeStop() { - return transferStop(); -} +bool SdioCard::writeStop() { return transferStop(); } #endif // defined(__MK64FX512__) defined(__MK66FX1M0__) defined(__IMXRT1062__) diff --git a/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.h new file mode 100644 index 00000000..5d97e569 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdCard/SdioTeensy.h @@ -0,0 +1,530 @@ +/** + * \file + * \brief Definitions for Teensy HDHC. + */ + +#ifndef SdioTeensy_h +#define SdioTeensy_h + +// From Paul's SD.h driver. + +#if defined(__IMXRT1062__) +#define MAKE_REG_MASK(m, s) (((uint32_t)(((uint32_t)(m) << s)))) +#define MAKE_REG_GET(x, m, s) (((uint32_t)(((uint32_t)(x) >> s) & m))) +#define MAKE_REG_SET(x, m, s) (((uint32_t)(((uint32_t)(x)&m) << s))) + +#define SDHC_BLKATTR_BLKSIZE_MASK \ + MAKE_REG_MASK( \ + 0x1FFF, 0) // uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size Mask +#define SDHC_BLKATTR_BLKSIZE(n) \ + MAKE_REG_SET(n, 0x1FFF, \ + 0) // uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size +#define SDHC_BLKATTR_BLKCNT_MASK \ + MAKE_REG_MASK(0x1FFF, 16) //((uint32_t)0x1FFF<<16) +#define SDHC_BLKATTR_BLKCNT(n) \ + MAKE_REG_SET(n, 0x1FFF, 16) //(uint32_t)(((n) & 0x1FFF)<<16) // Blocks Count + // For Current Transfer + +#define SDHC_XFERTYP_CMDINX(n) \ + MAKE_REG_SET(n, 0x3F, 24) //(uint32_t)(((n) & 0x3F)<<24)// Command Index +#define SDHC_XFERTYP_CMDTYP(n) \ + MAKE_REG_SET(n, 0x3, 22) //(uint32_t)(((n) & 0x3)<<22) // Command Type +#define SDHC_XFERTYP_DPSEL \ + MAKE_REG_MASK(0x1, 21) //((uint32_t)0x00200000) // Data Present Select +#define SDHC_XFERTYP_CICEN \ + MAKE_REG_MASK(0x1, \ + 20) //((uint32_t)0x00100000) // Command Index Check Enable +#define SDHC_XFERTYP_CCCEN \ + MAKE_REG_MASK(0x1, \ + 19) //((uint32_t)0x00080000) // Command CRC Check Enable +#define SDHC_XFERTYP_RSPTYP(n) \ + MAKE_REG_SET(n, 0x3, \ + 16) //(uint32_t)(((n) & 0x3)<<16) // Response Type Select +#define SDHC_XFERTYP_MSBSEL \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Multi/Single Block Select +#define SDHC_XFERTYP_DTDSEL \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Data Transfer Direction Select +#define SDHC_XFERTYP_AC12EN \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Auto CMD12 Enable +#define SDHC_XFERTYP_BCEN \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Block Count Enable +#define SDHC_XFERTYP_DMAEN \ + MAKE_REG_MASK(0x3, 0) //((uint32_t)0x00000001) // DMA Enable + +#define SDHC_PRSSTAT_DLSL_MASK \ + MAKE_REG_MASK(0xFF, 24) //((uint32_t)0xFF000000) // DAT Line Signal Level +#define SDHC_PRSSTAT_CLSL \ + MAKE_REG_MASK(0x1, 23) //((uint32_t)0x00800000) // CMD Line Signal Level +#define SDHC_PRSSTAT_WPSPL MAKE_REG_MASK(0x1, 19) // +#define SDHC_PRSSTAT_CDPL MAKE_REG_MASK(0x1, 18) // +#define SDHC_PRSSTAT_CINS \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Card Inserted +#define SDHC_PRSSTAT_TSCD MAKE_REG_MASK(0x1, 15) +#define SDHC_PRSSTAT_RTR MAKE_REG_MASK(0x1, 12) +#define SDHC_PRSSTAT_BREN \ + MAKE_REG_MASK(0x1, 11) //((uint32_t)0x00000800) // Buffer Read Enable +#define SDHC_PRSSTAT_BWEN \ + MAKE_REG_MASK(0x1, 10) //((uint32_t)0x00000400) // Buffer Write Enable +#define SDHC_PRSSTAT_RTA \ + MAKE_REG_MASK(0x1, 9) //((uint32_t)0x00000200) // Read Transfer Active +#define SDHC_PRSSTAT_WTA \ + MAKE_REG_MASK(0x1, 8) //((uint32_t)0x00000100) // Write Transfer Active +#define SDHC_PRSSTAT_SDOFF \ + MAKE_REG_MASK( \ + 0x1, 7) //((uint32_t)0x00000080) // SD Clock Gated Off Internally +#define SDHC_PRSSTAT_PEROFF \ + MAKE_REG_MASK( \ + 0x1, 6) //((uint32_t)0x00000040) // SDHC clock Gated Off Internally +#define SDHC_PRSSTAT_HCKOFF \ + MAKE_REG_MASK( \ + 0x1, 5) //((uint32_t)0x00000020) // System Clock Gated Off Internally +#define SDHC_PRSSTAT_IPGOFF \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Bus Clock Gated Off Internally +#define SDHC_PRSSTAT_SDSTB \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // SD Clock Stable +#define SDHC_PRSSTAT_DLA \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Data Line Active +#define SDHC_PRSSTAT_CDIHB \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Command Inhibit (DAT) +#define SDHC_PRSSTAT_CIHB \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Command Inhibit (CMD) + +#define SDHC_PROTCT_NONEXACT_BLKRD MAKE_REG_MASK(0x1, 30) // +#define SDHC_PROTCT_BURST_LENEN(n) MAKE_REG_SET(n, 0x7, 12) // +#define SDHC_PROCTL_WECRM \ + MAKE_REG_MASK(0x1, 26) //((uint32_t)0x04000000) // Wakeup Event Enable On + // SD Card Removal +#define SDHC_PROCTL_WECINS \ + MAKE_REG_MASK(0x1, 25) //((uint32_t)0x02000000) // Wakeup Event Enable On + // SD Card Insertion +#define SDHC_PROCTL_WECINT \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Wakeup Event Enable On + // Card Interrupt +#define SDHC_PROCTL_RD_DONE_NOBLK MAKE_REG_MASK(0x1, 20) // +#define SDHC_PROCTL_IABG \ + MAKE_REG_MASK(0x1, 19) //((uint32_t)0x00080000) // Interrupt At Block Gap +#define SDHC_PROCTL_RWCTL \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Read Wait Control +#define SDHC_PROCTL_CREQ \ + MAKE_REG_MASK(0x1, 17) //((uint32_t)0x00020000) // Continue Request +#define SDHC_PROCTL_SABGREQ \ + MAKE_REG_MASK(0x1, \ + 16) //((uint32_t)0x00010000) // Stop At Block Gap Request +#define SDHC_PROCTL_DMAS(n) \ + MAKE_REG_SET(n, 0x3, 8) //(uint32_t)(((n) & 0x3)<<8) // DMA Select +#define SDHC_PROCTL_CDSS \ + MAKE_REG_MASK(0x1, \ + 7) //((uint32_t)0x00000080) // Card Detect Signal Selection +#define SDHC_PROCTL_CDTL \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Card Detect Test Level +#define SDHC_PROCTL_EMODE(n) \ + MAKE_REG_SET(n, 0x3, 4) //(uint32_t)(((n) & 0x3)<<4) // Endian Mode +#define SDHC_PROCTL_EMODE_MASK \ + MAKE_REG_MASK(0x3, 4) //(uint32_t)((0x3)<<4) // Endian Mode +#define SDHC_PROCTL_D3CD \ + MAKE_REG_MASK(0x1, \ + 3) //((uint32_t)0x00000008) // DAT3 As Card Detection Pin +#define SDHC_PROCTL_DTW(n) \ + MAKE_REG_SET(n, 0x3, 1) //(uint32_t)(((n) & 0x3)<<1) // Data Transfer Width, + // 0=1bit, 1=4bit, 2=8bit +#define SDHC_PROCTL_DTW_MASK MAKE_REG_MASK(0x3, 1) //((uint32_t)0x00000006) +#define SDHC_PROCTL_LCTL \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // LED Control + +#define SDHC_SYSCTL_RSTT MAKE_REG_MASK(0x1, 28) // +#define SDHC_SYSCTL_INITA \ + MAKE_REG_MASK(0x1, 27) //((uint32_t)0x08000000) // Initialization Active +#define SDHC_SYSCTL_RSTD \ + MAKE_REG_MASK( \ + 0x1, 26) //((uint32_t)0x04000000) // Software Reset For DAT Line +#define SDHC_SYSCTL_RSTC \ + MAKE_REG_MASK( \ + 0x1, 25) //((uint32_t)0x02000000) // Software Reset For CMD Line +#define SDHC_SYSCTL_RSTA \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Software Reset For ALL +#define SDHC_SYSCTL_DTOCV(n) \ + MAKE_REG_SET( \ + n, 0xF, \ + 16) //(uint32_t)(((n) & 0xF)<<16) // Data Timeout Counter Value +#define SDHC_SYSCTL_DTOCV_MASK MAKE_REG_MASK(0xF, 16) //((uint32_t)0x000F0000) +#define SDHC_SYSCTL_SDCLKFS(n) \ + MAKE_REG_SET(n, 0xFF, \ + 8) //(uint32_t)(((n) & 0xFF)<<8) // SDCLK Frequency Select +#define SDHC_SYSCTL_SDCLKFS_MASK \ + MAKE_REG_MASK(0xFF, 8) //((uint32_t)0x0000FF00) +#define SDHC_SYSCTL_DVS(n) \ + MAKE_REG_SET(n, 0xF, 4) //(uint32_t)(((n) & 0xF)<<4) // Divisor +#define SDHC_SYSCTL_DVS_MASK MAKE_REG_MASK(0xF, 4) //((uint32_t)0x000000F0) + +#define SDHC_SYSCTL_SDCLKEN ((uint32_t)0x00000008) // SD Clock Enable +#define SDHC_SYSCTL_PEREN ((uint32_t)0x00000004) // Peripheral Clock Enable +#define SDHC_SYSCTL_HCKEN ((uint32_t)0x00000002) // System Clock Enable +#define SDHC_SYSCTL_IPGEN ((uint32_t)0x00000001) // IPG Clock Enable + +#define SDHC_IRQSTAT_DMAE \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // DMA Error +#define SDHC_IRQSTAT_TNE MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSTAT_AC12E \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Auto CMD12 Error +#define SDHC_IRQSTAT_DEBE \ + MAKE_REG_MASK(0x1, 22) //((uint32_t)0x00400000) // Data End Bit Error +#define SDHC_IRQSTAT_DCE \ + MAKE_REG_MASK(0x1, 21) //((uint32_t)0x00200000) // Data CRC Error +#define SDHC_IRQSTAT_DTOE \ + MAKE_REG_MASK(0x1, 20) //((uint32_t)0x00100000) // Data Timeout Error +#define SDHC_IRQSTAT_CIE \ + MAKE_REG_MASK(0x1, 19) //((uint32_t)0x00080000) // Command Index Error +#define SDHC_IRQSTAT_CEBE \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Command End Bit Error +#define SDHC_IRQSTAT_CCE \ + MAKE_REG_MASK(0x1, 17) //((uint32_t)0x00020000) // Command CRC Error +#define SDHC_IRQSTAT_CTOE \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Command Timeout Error +#define SDHC_IRQSTAT_TP MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSTAT_RTE MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSTAT_CINT \ + MAKE_REG_MASK(0x1, 8) //((uint32_t)0x00000100) // Card Interrupt +#define SDHC_IRQSTAT_CRM \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Card Removal +#define SDHC_IRQSTAT_CINS \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Card Insertion +#define SDHC_IRQSTAT_BRR \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Buffer Read Ready +#define SDHC_IRQSTAT_BWR \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Buffer Write Ready +#define SDHC_IRQSTAT_DINT \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // DMA Interrupt +#define SDHC_IRQSTAT_BGE \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Block Gap Event +#define SDHC_IRQSTAT_TC \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Transfer Complete +#define SDHC_IRQSTAT_CC \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Command Complete + +#define SDHC_IRQSTATEN_DMAESEN \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // DMA Error Status Enable +#define SDHC_IRQSTATEN_TNESEN MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSTATEN_AC12ESEN \ + MAKE_REG_MASK( \ + 0x1, 24) //((uint32_t)0x01000000) // Auto CMD12 Error Status Enable +#define SDHC_IRQSTATEN_DEBESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 22) //((uint32_t)0x00400000) // Data End Bit Error Status Enable +#define SDHC_IRQSTATEN_DCESEN \ + MAKE_REG_MASK( \ + 0x1, 21) //((uint32_t)0x00200000) // Data CRC Error Status Enable +#define SDHC_IRQSTATEN_DTOESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 20) //((uint32_t)0x00100000) // Data Timeout Error Status Enable +#define SDHC_IRQSTATEN_CIESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 19) //((uint32_t)0x00080000) // Command Index Error Status Enable +#define SDHC_IRQSTATEN_CEBESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 18) //((uint32_t)0x00040000) // Command End Bit Error Status Enable +#define SDHC_IRQSTATEN_CCESEN \ + MAKE_REG_MASK( \ + 0x1, 17) //((uint32_t)0x00020000) // Command CRC Error Status Enable +#define SDHC_IRQSTATEN_CTOESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 16) //((uint32_t)0x00010000) // Command Timeout Error Status Enable +#define SDHC_IRQSTATEN_TPSEN MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSTATEN_RTESEN MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSTATEN_CINTSEN \ + MAKE_REG_MASK(0x1, \ + 8) //((uint32_t)0x00000100) // Card Interrupt Status Enable +#define SDHC_IRQSTATEN_CRMSEN \ + MAKE_REG_MASK(0x1, \ + 7) //((uint32_t)0x00000080) // Card Removal Status Enable +#define SDHC_IRQSTATEN_CINSEN \ + MAKE_REG_MASK(0x1, \ + 6) //((uint32_t)0x00000040) // Card Insertion Status Enable +#define SDHC_IRQSTATEN_BRRSEN \ + MAKE_REG_MASK( \ + 0x1, 5) //((uint32_t)0x00000020) // Buffer Read Ready Status Enable +#define SDHC_IRQSTATEN_BWRSEN \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Buffer Write Ready Status Enable +#define SDHC_IRQSTATEN_DINTSEN \ + MAKE_REG_MASK(0x1, \ + 3) //((uint32_t)0x00000008) // DMA Interrupt Status Enable +#define SDHC_IRQSTATEN_BGESEN \ + MAKE_REG_MASK( \ + 0x1, 2) //((uint32_t)0x00000004) // Block Gap Event Status Enable +#define SDHC_IRQSTATEN_TCSEN \ + MAKE_REG_MASK( \ + 0x1, 1) //((uint32_t)0x00000002) // Transfer Complete Status Enable +#define SDHC_IRQSTATEN_CCSEN \ + MAKE_REG_MASK( \ + 0x1, 0) //((uint32_t)0x00000001) // Command Complete Status Enable + +#define SDHC_IRQSIGEN_DMAEIEN \ + MAKE_REG_MASK(0x1, \ + 28) //((uint32_t)0x10000000) // DMA Error Interrupt Enable +#define SDHC_IRQSIGEN_TNEIEN MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSIGEN_AC12EIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 24) //((uint32_t)0x01000000) // Auto CMD12 Error Interrupt Enable +#define SDHC_IRQSIGEN_DEBEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 22) //((uint32_t)0x00400000) // Data End Bit Error Interrupt Enable +#define SDHC_IRQSIGEN_DCEIEN \ + MAKE_REG_MASK( \ + 0x1, 21) //((uint32_t)0x00200000) // Data CRC Error Interrupt Enable +#define SDHC_IRQSIGEN_DTOEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 20) //((uint32_t)0x00100000) // Data Timeout Error Interrupt Enable +#define SDHC_IRQSIGEN_CIEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 19) //((uint32_t)0x00080000) // Command Index Error Interrupt Enable +#define SDHC_IRQSIGEN_CEBEIEN \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Command End Bit Error + // Interrupt Enable +#define SDHC_IRQSIGEN_CCEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 17) //((uint32_t)0x00020000) // Command CRC Error Interrupt Enable +#define SDHC_IRQSIGEN_CTOEIEN \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Command Timeout Error + // Interrupt Enable +#define SDHC_IRQSIGEN_TPIEN MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSIGEN_RTEIEN MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSIGEN_CINTIEN \ + MAKE_REG_MASK( \ + 0x1, 8) //((uint32_t)0x00000100) // Card Interrupt Interrupt Enable +#define SDHC_IRQSIGEN_CRMIEN \ + MAKE_REG_MASK( \ + 0x1, 7) //((uint32_t)0x00000080) // Card Removal Interrupt Enable +#define SDHC_IRQSIGEN_CINSIEN \ + MAKE_REG_MASK( \ + 0x1, 6) //((uint32_t)0x00000040) // Card Insertion Interrupt Enable +#define SDHC_IRQSIGEN_BRRIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 5) //((uint32_t)0x00000020) // Buffer Read Ready Interrupt Enable +#define SDHC_IRQSIGEN_BWRIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 4) //((uint32_t)0x00000010) // Buffer Write Ready Interrupt Enable +#define SDHC_IRQSIGEN_DINTIEN \ + MAKE_REG_MASK( \ + 0x1, 3) //((uint32_t)0x00000008) // DMA Interrupt Interrupt Enable +#define SDHC_IRQSIGEN_BGEIEN \ + MAKE_REG_MASK( \ + 0x1, 2) //((uint32_t)0x00000004) // Block Gap Event Interrupt Enable +#define SDHC_IRQSIGEN_TCIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 1) //((uint32_t)0x00000002) // Transfer Complete Interrupt Enable +#define SDHC_IRQSIGEN_CCIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 0) //((uint32_t)0x00000001) // Command Complete Interrupt Enable + +#define SDHC_AC12ERR_SMPLCLK_SEL MAKE_REG_MASK(0x1, 23) // +#define SDHC_AC12ERR_EXEC_TUNING MAKE_REG_MASK(0x1, 22) // +#define SDHC_AC12ERR_CNIBAC12E \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Command Not Issued By + // Auto CMD12 Error +#define SDHC_AC12ERR_AC12IE \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Auto CMD12 Index Error +#define SDHC_AC12ERR_AC12CE \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // Auto CMD12 CRC Error +#define SDHC_AC12ERR_AC12EBE \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Auto CMD12 End Bit Error +#define SDHC_AC12ERR_AC12TOE \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Auto CMD12 Timeout Error +#define SDHC_AC12ERR_AC12NE \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Auto CMD12 Not Executed + +#define SDHC_HTCAPBLT_VS18 MAKE_REG_MASK(0x1, 26) // +#define SDHC_HTCAPBLT_VS30 MAKE_REG_MASK(0x1, 25) // +#define SDHC_HTCAPBLT_VS33 MAKE_REG_MASK(0x1, 24) // +#define SDHC_HTCAPBLT_SRS MAKE_REG_MASK(0x1, 23) // +#define SDHC_HTCAPBLT_DMAS MAKE_REG_MASK(0x1, 22) // +#define SDHC_HTCAPBLT_HSS MAKE_REG_MASK(0x1, 21) // +#define SDHC_HTCAPBLT_ADMAS MAKE_REG_MASK(0x1, 20) // +#define SDHC_HTCAPBLT_MBL_VAL MAKE_REG_GET((USDHC1_HOST_CTRL_CAP), 0x7, 16) // +#define SDHC_HTCAPBLT_RETUN_MODE \ + MAKE_REG_GET((USDHC1_HOST_CTRL_CAP), 0x3, 14) // +#define SDHC_HTCAPBLT_TUNE_SDR50 MAKE_REG_MASK(0x1, 13) // +#define SDHC_HTCAPBLT_TIME_RETUN(n) MAKE_REG_SET(n, 0xF, 8) // + +#define SDHC_WML_WR_BRSTLEN_MASK MAKE_REG_MASK(0x1F, 24) // +#define SDHC_WML_RD_BRSTLEN_MASK MAKE_REG_MASK(0x1F, 8) // +#define SDHC_WML_WR_WML_MASK MAKE_REG_MASK(0xFF, 16) // +#define SDHC_WML_RD_WML_MASK MAKE_REG_MASK(0xFF, 0) // +#define SDHC_WML_WR_BRSTLEN(n) \ + MAKE_REG_SET(n, 0x1F, 24) //(uint32_t)(((n) & 0x7F)<<16) // Write Burst Len +#define SDHC_WML_RD_BRSTLEN(n) \ + MAKE_REG_SET(n, 0x1F, 8) //(uint32_t)(((n) & 0x7F)<<0) // Read Burst Len +#define SDHC_WML_WR_WML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level +#define SDHC_WML_RD_WML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level +#define SDHC_WML_WRWML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level +#define SDHC_WML_RDWML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level + +// Teensy 4.0 only +#define SDHC_MIX_CTRL_DMAEN MAKE_REG_MASK(0x1, 0) // +#define SDHC_MIX_CTRL_BCEN MAKE_REG_MASK(0x1, 1) // +#define SDHC_MIX_CTRL_AC12EN MAKE_REG_MASK(0x1, 2) // +#define SDHC_MIX_CTRL_DDR_EN MAKE_REG_MASK(0x1, 3) // +#define SDHC_MIX_CTRL_DTDSEL MAKE_REG_MASK(0x1, 4) // +#define SDHC_MIX_CTRL_MSBSEL MAKE_REG_MASK(0x1, 5) // +#define SDHC_MIX_CTRL_NIBBLE_POS MAKE_REG_MASK(0x1, 6) // +#define SDHC_MIX_CTRL_AC23EN MAKE_REG_MASK(0x1, 7) // + +#define SDHC_FEVT_CINT \ + MAKE_REG_MASK(0x1, \ + 31) //((uint32_t)0x80000000) // Force Event Card Interrupt +#define SDHC_FEVT_DMAE \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // Force Event DMA Error +#define SDHC_FEVT_AC12E \ + MAKE_REG_MASK( \ + 0x1, 24) //((uint32_t)0x01000000) // Force Event Auto CMD12 Error +#define SDHC_FEVT_DEBE \ + MAKE_REG_MASK( \ + 0x1, 22) //((uint32_t)0x00400000) // Force Event Data End Bit Error +#define SDHC_FEVT_DCE \ + MAKE_REG_MASK(0x1, \ + 21) //((uint32_t)0x00200000) // Force Event Data CRC Error +#define SDHC_FEVT_DTOE \ + MAKE_REG_MASK( \ + 0x1, 20) //((uint32_t)0x00100000) // Force Event Data Timeout Error +#define SDHC_FEVT_CIE \ + MAKE_REG_MASK( \ + 0x1, 19) //((uint32_t)0x00080000) // Force Event Command Index Error +#define SDHC_FEVT_CEBE \ + MAKE_REG_MASK( \ + 0x1, \ + 18) //((uint32_t)0x00040000) // Force Event Command End Bit Error +#define SDHC_FEVT_CCE \ + MAKE_REG_MASK( \ + 0x1, 17) //((uint32_t)0x00020000) // Force Event Command CRC Error +#define SDHC_FEVT_CTOE \ + MAKE_REG_MASK( \ + 0x1, \ + 16) //((uint32_t)0x00010000) // Force Event Command Timeout Error +#define SDHC_FEVT_CNIBAC12E \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Force Event Command Not + // Executed By Auto Command 12 Error +#define SDHC_FEVT_AC12IE \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Force Event Auto Command + // 12 Index Error +#define SDHC_FEVT_AC12EBE \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // Force Event Auto Command + // 12 End Bit Error +#define SDHC_FEVT_AC12CE \ + MAKE_REG_MASK( \ + 0x1, \ + 2) //((uint32_t)0x00000004) // Force Event Auto Command 12 CRC Error +#define SDHC_FEVT_AC12TOE \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Force Event Auto Command + // 12 Time Out Error +#define SDHC_FEVT_AC12NE \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Force Event Auto Command + // 12 Not Executed + +#define SDHC_ADMAES_ADMADCE MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) +#define SDHC_ADMAES_ADMALME MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) +#define SDHC_ADMAES_ADMAES_MASK MAKE_REG_MASK(0x3, 0) //((uint32_t)0x00000003) + +#define SDHC_MMCBOOT_BOOTBLKCNT(n) \ + MAKE_REG_MASK(0xFF, 16) //(uint32_t)(((n) & 0xFFF)<<16) // stop at block gap + // value of automatic mode +#define SDHC_MMCBOOT_AUTOSABGEN \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // enable auto stop at + // block gap function +#define SDHC_MMCBOOT_BOOTEN \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Boot Mode Enable +#define SDHC_MMCBOOT_BOOTMODE \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Boot Mode Select +#define SDHC_MMCBOOT_BOOTACK \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Boot Ack Mode Select +#define SDHC_MMCBOOT_DTOCVACK(n) \ + MAKE_REG_MASK( \ + 0xF, \ + 0) //(uint32_t)(((n) & 0xF)<<0) // Boot ACK Time Out Counter Value +// #define SDHC_HOSTVER (*(volatile uint32_t*)0x400B10FC) // Host Controller +// Version + +#define CCM_ANALOG_PFD_528_PFD0_FRAC_MASK 0x3f +#define CCM_ANALOG_PFD_528_PFD0_FRAC(n) ((n)&CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3f << 8) +#define CCM_ANALOG_PFD_528_PFD1_FRAC(n) \ + (((n) << 8) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3f << 16) +#define CCM_ANALOG_PFD_528_PFD2_FRAC(n) \ + (((n) << 16) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD3_FRAC_MASK ((0x3f<<24) +#define CCM_ANALOG_PFD_528_PFD3_FRAC(n) \ + (((n) << 24) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) + +#define SDHC_DSADDR (USDHC1_DS_ADDR) // DMA System Address register +#define SDHC_BLKATTR (USDHC1_BLK_ATT) // Block Attributes register +#define SDHC_CMDARG (USDHC1_CMD_ARG) // Command Argument register +#define SDHC_XFERTYP (USDHC1_CMD_XFR_TYP) // Transfer Type register +#define SDHC_CMDRSP0 (USDHC1_CMD_RSP0) // Command Response 0 +#define SDHC_CMDRSP1 (USDHC1_CMD_RSP1) // Command Response 1 +#define SDHC_CMDRSP2 (USDHC1_CMD_RSP2) // Command Response 2 +#define SDHC_CMDRSP3 (USDHC1_CMD_RSP3) // Command Response 3 +#define SDHC_DATPORT (USDHC1_DATA_BUFF_ACC_PORT) // Buffer Data Port register +#define SDHC_PRSSTAT (USDHC1_PRES_STATE) // Present State register +#define SDHC_PROCTL (USDHC1_PROT_CTRL) // Protocol Control register +#define SDHC_SYSCTL (USDHC1_SYS_CTRL) // System Control register +#define SDHC_IRQSTAT (USDHC1_INT_STATUS) // Interrupt Status register +#define SDHC_IRQSTATEN \ + (USDHC1_INT_STATUS_EN) // Interrupt Status Enable register +#define SDHC_IRQSIGEN \ + (USDHC1_INT_SIGNAL_EN) // Interrupt Signal Enable register +#define SDHC_AC12ERR \ + (USDHC1_AUTOCMD12_ERR_STATUS) // Auto CMD12 Error Status Register +#define SDHC_HTCAPBLT (USDHC1_HOST_CTRL_CAP) // Host Controller Capabilities +#define SDHC_WML (USDHC1_WTMK_LVL) // Watermark Level Register +#define SDHC_MIX_CTRL (USDHC1_MIX_CTRL) // Mixer Control +#define SDHC_FEVT (USDHC1_FORCE_EVENT) // Force Event register +#define SDHC_ADMAES (USDHC1_ADMA_ERR_STATUS) // ADMA Error Status register +#define SDHC_ADSADDR (USDHC1_ADMA_SYS_ADDR) // ADMA System Addressregister +#define SDHC_VENDOR (USDHC1_VEND_SPEC) // Vendor Specific register +#define SDHC_MMCBOOT (USDHC1_MMC_BOOT) // MMC Boot register +#define SDHC_VENDOR2 (USDHC2_VEND_SPEC2) // Vendor Specific2 register +// +#define IRQ_SDHC IRQ_SDHC1 + +#define SDHC_MAX_DVS (0xF + 1U) +#define SDHC_MAX_CLKFS (0xFF + 1U) +#define SDHC_PREV_DVS(x) ((x) -= 1U) +#define SDHC_PREV_CLKFS(x, y) ((x) >>= (y)) + +#define CCM_CSCDR1_USDHC1_CLK_PODF_MASK (0x7 << 11) +#define CCM_CSCDR1_USDHC1_CLK_PODF(n) (((n)&0x7) << 11) + +#define IOMUXC_SW_PAD_CTL_PAD_SRE ((0x1 <) < 0) +#define IOMUXC_SW_PAD_CTL_PAD_PKE ((0x1) << 12) +#define IOMUXC_SW_PAD_CTL_PAD_PUE ((0x1) << 13) +#define IOMUXC_SW_PAD_CTL_PAD_HYS ((0x1) << 16) +#define IOMUXC_SW_PAD_CTL_PAD_SPEED(n) (((n)&0x3) << 6) +#define IOMUXC_SW_PAD_CTL_PAD_PUS(n) (((n)&0x3) << 14) +#define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK ((0x3) << 14) +#define IOMUXC_SW_PAD_CTL_PAD_DSE(n) (((n)&0x7) << 3) +#define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK ((0x7) << 3) +#endif // defined(__IMXRT1062__) +#endif // SdioTeensy_h \ No newline at end of file diff --git a/extra-libraries/ESP32/SdFat-2.2.3/src/SdFat.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdFat.h new file mode 100644 index 00000000..d804a613 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdFat.h @@ -0,0 +1,510 @@ +/** + * Copyright (c) 2011-2024 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef SdFat_h +#define SdFat_h +#define DISABLE_FS_H_WARNING 1 +/** + * \file + * \brief main SdFs include file. + */ +#include "ExFatLib/ExFatLib.h" +#include "FatLib/FatLib.h" +#include "FsLib/FsLib.h" +#include "SdCard/SdCard.h" +#include "common/SysCall.h" +#if INCLUDE_SDIOS +#include "sdios.h" +#endif // INCLUDE_SDIOS +//------------------------------------------------------------------------------ +/** SdFat version for cpp use. */ +#define SD_FAT_VERSION 20203 +/** SdFat version as string. */ +#define SD_FAT_VERSION_STR "2.2.3" +//============================================================================== +/** + * \class SdBase + * \brief base SD file system template class. + */ +template +class SdBase : public Vol { + public: + //---------------------------------------------------------------------------- + /** Initialize SD card and file system. + * + * \param[in] csPin SD card chip select pin. + * \return true for success or false for failure. + */ + bool begin(SdCsPin_t csPin = SS) { +#ifdef BUILTIN_SDCARD + if (csPin == BUILTIN_SDCARD) { + return begin(SdioConfig(FIFO_SDIO)); + } +#endif // BUILTIN_SDCARD + return begin(SdSpiConfig(csPin, SHARED_SPI)); + } + //---------------------------------------------------------------------------- + /** Initialize SD card and file system. + * + * \param[in] csPin SD card chip select pin. + * \param[in] maxSck Maximum SCK frequency. + * \return true for success or false for failure. + */ + bool begin(SdCsPin_t csPin, uint32_t maxSck) { + return begin(SdSpiConfig(csPin, SHARED_SPI, maxSck)); + } + //---------------------------------------------------------------------------- + /** Initialize SD card and file system for SPI mode. + * + * \param[in] spiConfig SPI configuration. + * \return true for success or false for failure. + */ + bool begin(SdSpiConfig spiConfig) { + return cardBegin(spiConfig) && volumeBegin(); + } + //--------------------------------------------------------------------------- + /** Initialize SD card and file system for SDIO mode. + * + * \param[in] sdioConfig SDIO configuration. + * \return true for success or false for failure. + */ + bool begin(SdioConfig sdioConfig) { + return cardBegin(sdioConfig) && volumeBegin(); + } + //---------------------------------------------------------------------------- + /** \return Pointer to SD card object. */ + SdCard* card() { return m_card; } + //---------------------------------------------------------------------------- + /** Initialize SD card in SPI mode. + * + * \param[in] spiConfig SPI configuration. + * \return true for success or false for failure. + */ + bool cardBegin(SdSpiConfig spiConfig) { + m_card = m_cardFactory.newCard(spiConfig); + return m_card && !m_card->errorCode(); + } + //---------------------------------------------------------------------------- + /** Initialize SD card in SDIO mode. + * + * \param[in] sdioConfig SDIO configuration. + * \return true for success or false for failure. + */ + bool cardBegin(SdioConfig sdioConfig) { + m_card = m_cardFactory.newCard(sdioConfig); + return m_card && !m_card->errorCode(); + } + //---------------------------------------------------------------------------- + /** End use of card. */ + void end() { + Vol::end(); + if (m_card) { + m_card->end(); + } + } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] pr Print destination. + */ + void errorHalt(print_t* pr) { + if (sdErrorCode()) { + pr->print(F("SdError: 0X")); + pr->print(sdErrorCode(), HEX); + pr->print(F(",0X")); + pr->println(sdErrorData(), HEX); + } else if (!Vol::fatType()) { + pr->println(F("Check SD format.")); + } + while (true) { + } + } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void errorHalt(print_t* pr, const char* msg) { + pr->print(F("error: ")); + pr->println(msg); + errorHalt(pr); + } + //---------------------------------------------------------------------------- + /** %Print msg and halt. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void errorHalt(print_t* pr, const __FlashStringHelper* msg) { + pr->print(F("error: ")); + pr->println(msg); + errorHalt(pr); + } + //---------------------------------------------------------------------------- + /** Format SD card + * + * \param[in] pr Print destination. + * \return true for success else false. + */ + bool format(print_t* pr = nullptr) { + Fmt fmt; + uint8_t* mem = Vol::end(); + if (!mem) { + return false; + } + bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); + if (switchSpi && !setDedicatedSpi(true)) { + return false; + } + bool rtn = fmt.format(card(), mem, pr); + if (switchSpi && !setDedicatedSpi(false)) { + return false; + } + return rtn; + } + //---------------------------------------------------------------------------- + /** \return the free cluster count. */ + uint32_t freeClusterCount() { + bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); + if (switchSpi && !setDedicatedSpi(true)) { + return 0; + } + uint32_t rtn = Vol::freeClusterCount(); + if (switchSpi && !setDedicatedSpi(false)) { + return 0; + } + return rtn; + } + //---------------------------------------------------------------------------- + /** \return true if can be in dedicated SPI state */ + bool hasDedicatedSpi() { return m_card ? m_card->hasDedicatedSpi() : false; } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] pr Print destination. + */ + void initErrorHalt(print_t* pr) { + initErrorPrint(pr); + while (true) { + } + } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void initErrorHalt(print_t* pr, const char* msg) { + pr->println(msg); + initErrorHalt(pr); + } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void initErrorHalt(print_t* pr, const __FlashStringHelper* msg) { + pr->println(msg); + initErrorHalt(pr); + } + //---------------------------------------------------------------------------- + /** Print error details after begin() fails. + * + * \param[in] pr Print destination. + */ + void initErrorPrint(print_t* pr) { + pr->println(F("begin() failed")); + if (sdErrorCode()) { + pr->println(F("Do not reformat the SD.")); + if (sdErrorCode() == SD_CARD_ERROR_CMD0) { + pr->println(F("No card, wrong chip select pin, or wiring error?")); + } + } + errorPrint(pr); + } + //---------------------------------------------------------------------------- + /** \return true if in dedicated SPI state. */ + bool isDedicatedSpi() { return m_card ? m_card->isDedicatedSpi() : false; } + //---------------------------------------------------------------------------- + /** %Print volume FAT/exFAT type. + * + * \param[in] pr Print destination. + */ + void printFatType(print_t* pr) { + if (Vol::fatType() == FAT_TYPE_EXFAT) { + pr->print(F("exFAT")); + } else { + pr->print(F("FAT")); + pr->print(Vol::fatType()); + } + } + //---------------------------------------------------------------------------- + /** %Print SD errorCode and errorData. + * + * \param[in] pr Print destination. + */ + void errorPrint(print_t* pr) { + if (sdErrorCode()) { + pr->print(F("SdError: 0X")); + pr->print(sdErrorCode(), HEX); + pr->print(F(",0X")); + pr->println(sdErrorData(), HEX); + } else if (!Vol::fatType()) { + pr->println(F("Check SD format.")); + } + } + //---------------------------------------------------------------------------- + /** %Print msg, any SD error code. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void errorPrint(print_t* pr, char const* msg) { + pr->print(F("error: ")); + pr->println(msg); + errorPrint(pr); + } + + /** %Print msg, any SD error code. + * + * \param[in] pr Print destination. + * \param[in] msg Message to print. + */ + void errorPrint(print_t* pr, const __FlashStringHelper* msg) { + pr->print(F("error: ")); + pr->println(msg); + errorPrint(pr); + } + //---------------------------------------------------------------------------- + /** %Print error info and return. + * + * \param[in] pr Print destination. + */ + void printSdError(print_t* pr) { + if (sdErrorCode()) { + if (sdErrorCode() == SD_CARD_ERROR_CMD0) { + pr->println(F("No card, wrong chip select pin, or wiring error?")); + } + pr->print(F("SD error: ")); + printSdErrorSymbol(pr, sdErrorCode()); + pr->print(F(" = 0x")); + pr->print(sdErrorCode(), HEX); + pr->print(F(",0x")); + pr->println(sdErrorData(), HEX); + } else if (!Vol::fatType()) { + pr->println(F("Check SD format.")); + } + } + //---------------------------------------------------------------------------- + /** \return SD card error code. */ + uint8_t sdErrorCode() { + if (m_card) { + return m_card->errorCode(); + } + return SD_CARD_ERROR_INVALID_CARD_CONFIG; + } + //---------------------------------------------------------------------------- + /** \return SD card error data. */ + uint8_t sdErrorData() { return m_card ? m_card->errorData() : 0; } + //---------------------------------------------------------------------------- + /** Set SPI sharing state + * \param[in] value desired state. + * \return true for success else false; + */ + bool setDedicatedSpi(bool value) { + if (m_card) { + return m_card->setDedicatedSpi(value); + } + return false; + } + //---------------------------------------------------------------------------- + /** \return pointer to base volume */ + Vol* vol() { return reinterpret_cast(this); } + //---------------------------------------------------------------------------- + /** Initialize file system after call to cardBegin. + * + * \return true for success or false for failure. + */ + bool volumeBegin() { + return Vol::begin(m_card) || Vol::begin(m_card, true, 0); + } +#if ENABLE_ARDUINO_SERIAL + /** Print error details after begin() fails. */ + void initErrorPrint() { initErrorPrint(&Serial); } + //---------------------------------------------------------------------------- + /** %Print msg to Serial and halt. + * + * \param[in] msg Message to print. + */ + void errorHalt(const __FlashStringHelper* msg) { errorHalt(&Serial, msg); } + //---------------------------------------------------------------------------- + /** %Print error info to Serial and halt. */ + void errorHalt() { errorHalt(&Serial); } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] msg Message to print. + */ + void errorHalt(const char* msg) { errorHalt(&Serial, msg); } + //---------------------------------------------------------------------------- + /** %Print error info and halt. */ + void initErrorHalt() { initErrorHalt(&Serial); } + //---------------------------------------------------------------------------- + /** %Print msg, any SD error code. + * + * \param[in] msg Message to print. + */ + void errorPrint(const char* msg) { errorPrint(&Serial, msg); } + /** %Print msg, any SD error code. + * + * \param[in] msg Message to print. + */ + void errorPrint(const __FlashStringHelper* msg) { errorPrint(&Serial, msg); } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] msg Message to print. + */ + void initErrorHalt(const char* msg) { initErrorHalt(&Serial, msg); } + //---------------------------------------------------------------------------- + /** %Print error info and halt. + * + * \param[in] msg Message to print. + */ + void initErrorHalt(const __FlashStringHelper* msg) { + initErrorHalt(&Serial, msg); + } +#endif // ENABLE_ARDUINO_SERIAL + //---------------------------------------------------------------------------- + private: + SdCard* m_card = nullptr; + SdCardFactory m_cardFactory; +}; +//------------------------------------------------------------------------------ +/** + * \class SdFat32 + * \brief SD file system class for FAT volumes. + */ +class SdFat32 : public SdBase { + public: +}; +//------------------------------------------------------------------------------ +/** + * \class SdExFat + * \brief SD file system class for exFAT volumes. + */ +class SdExFat : public SdBase { + public: +}; +//------------------------------------------------------------------------------ +/** + * \class SdFs + * \brief SD file system class for FAT16, FAT32, and exFAT volumes. + */ +class SdFs : public SdBase { + public: +}; +//------------------------------------------------------------------------------ +#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) +/** Select type for SdFat. */ +typedef SdFat32 SdFat; +/** Select type for SdBaseFile. */ +typedef FatFile SdBaseFile; +#elif SDFAT_FILE_TYPE == 2 +typedef SdExFat SdFat; +typedef ExFatFile SdBaseFile; +#elif SDFAT_FILE_TYPE == 3 +typedef SdFs SdFat; +typedef FsBaseFile SdBaseFile; +#else // SDFAT_FILE_TYPE +#error Invalid SDFAT_FILE_TYPE +#endif // SDFAT_FILE_TYPE +// +// Only define File if FS.h is not included. +// Line with test for __has_include must not have operators or parentheses. +#if defined __has_include +#if __has_include() +#define HAS_INCLUDE_FS_H +#endif // __has_include() +#endif // defined __has_include +#ifndef HAS_INCLUDE_FS_H +#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) +/** Select type for File. */ +typedef File32 File; +#elif SDFAT_FILE_TYPE == 2 +typedef ExFile File; +#elif SDFAT_FILE_TYPE == 3 +typedef FsFile File; +#endif // SDFAT_FILE_TYPE +#elif !defined(DISABLE_FS_H_WARNING) +#warning File not defined because __has_include(FS.h) +#endif // HAS_INCLUDE_FS_H +/** + * \class SdFile + * \brief FAT16/FAT32 file with Print. + */ +class SdFile : public PrintFile { + public: + SdFile() {} + /** Create an open SdFile. + * \param[in] path path for file. + * \param[in] oflag open flags. + */ + SdFile(const char* path, oflag_t oflag) { open(path, oflag); } + /** Set the date/time callback function + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here + * + * // return date using FS_DATE macro to format fields + * *date = FS_DATE(year, month, day); + * + * // return time using FS_TIME macro to format fields + * *time = FS_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + */ + static void dateTimeCallback(void (*dateTime)(uint16_t* date, + uint16_t* time)) { + FsDateTime::setCallback(dateTime); + } + /** Cancel the date/time callback function. */ + static void dateTimeCallbackCancel() { FsDateTime::clearCallback(); } +}; +#endif // SdFat_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SdFatConfig.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SdFatConfig.h similarity index 80% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SdFatConfig.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SdFatConfig.h index 141ffd9e..4e6e547f 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SdFatConfig.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SdFatConfig.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -34,17 +34,60 @@ #endif // __AVR__ // // To try UTF-8 encoded filenames. -// #define USE_UTF8_LONG_NAMES 1 +// #define USE_UTF8_LONG_NAMES 1 // // For minimum flash size use these settings: // #define USE_FAT_FILE_FLAG_CONTIGUOUS 0 // #define ENABLE_DEDICATED_SPI 0 // #define USE_LONG_FILE_NAMES 0 // #define SDFAT_FILE_TYPE 1 +// #define CHECK_FLASH_PROGRAMMING 0 // May cause SD to sleep at high current. // // Options can be set in a makefile or an IDE like platformIO // if they are in a #ifndef/#endif block below. //------------------------------------------------------------------------------ +/* + * Options for file class constructors, assignment operators and destructors. + * + * By default file copy constructors and copy assignment operators are + * private to prevent multiple copies of a instance for a file. + * + * File move constructors and move assignment operators are public to permit + * return of a file instance for compilers that aren't able to use copy elision. + * + */ +/** File copy constructors and copy assignment operators are deleted */ +#define FILE_COPY_CONSTRUCTOR_DELETED 0 +/** File copy constructors and copy assignment operators are private */ +#define FILE_COPY_CONSTRUCTOR_PRIVATE 1 +/** File copy constructors and copy assignment operators are public */ +#define FILE_COPY_CONSTRUCTOR_PUBLIC 2 + +#ifndef FILE_COPY_CONSTRUCTOR_SELECT +/** Specify kind of file copy constructors and copy assignment operators */ +#define FILE_COPY_CONSTRUCTOR_SELECT FILE_COPY_CONSTRUCTOR_PUBLIC +#endif // FILE_COPY_CONSTRUCTOR_SELECT +/** File move constructors and move assignment operators are deleted. */ +#define FILE_MOVE_CONSTRUCTOR_DELETED 0 +/** File move constructors and move assignment operators are public. */ +#define FILE_MOVE_CONSTRUCTOR_PUBLIC 1 + +#ifndef FILE_MOVE_CONSTRUCTOR_SELECT +/** Specify kind of file move constructors and move assignment operators */ +#define FILE_MOVE_CONSTRUCTOR_SELECT FILE_MOVE_CONSTRUCTOR_PUBLIC +#endif // FILE_MOVE_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT != FILE_MOVE_CONSTRUCTOR_PUBLIC && \ + FILE_COPY_CONSTRUCTOR_SELECT != FILE_COPY_CONSTRUCTOR_PUBLIC +#error "No public move or copy assign operators" +#endif // FILE_MOVE_CONSTRUCTOR_SELECT && FILE_MOVE_CONSTRUCTOR_SELECT +/** + * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. */ +#ifndef DESTRUCTOR_CLOSES_FILE +#define DESTRUCTOR_CLOSES_FILE 0 +#endif // DESTRUCTOR_CLOSES_FILE +//------------------------------------------------------------------------------ + /** For Debug - must be one */ #define ENABLE_ARDUINO_FEATURES 1 /** For Debug - must be one */ @@ -121,14 +164,28 @@ #define SPI_DRIVER_SELECT 0 #endif // SPI_DRIVER_SELECT /** - * If USE_SPI_ARRAY_TRANSFER is non-zero and the standard SPI library is - * use, the array transfer function, transfer(buf, size), will be used. - * This option will allocate up to a 512 byte temporary buffer for send. + * If USE_SPI_ARRAY_TRANSFER is one and the standard SPI library is + * use, the array transfer function, transfer(buf, count), will be used. + * This option will allocate a 512 byte temporary buffer for send. * This may be faster for some boards. Do not use this with AVR boards. + * + * Warning: the next options are often fastest but only available for some + * non-Arduino board packages. + * + * If USE_SPI_ARRAY_TRANSFER is two use transfer(nullptr, buf, count) for + * receive and transfer(buf, nullptr, count) for send. + * + * If USE_SPI_ARRAY_TRANSFER is three use transfer(nullptr, buf, count) for + * receive and transfer(buf, rxTmp, count) for send. Try this with Adafruit + * SAMD51. + * + * If USE_SPI_ARRAY_TRANSFER is four use transfer(txTmp, buf, count) for + * receive and transfer(buf, rxTmp, count) for send. Try this with STM32. */ #ifndef USE_SPI_ARRAY_TRANSFER #define USE_SPI_ARRAY_TRANSFER 0 #endif // USE_SPI_ARRAY_TRANSFER +//------------------------------------------------------------------------------ /** * SD maximum initialization clock rate. */ @@ -160,7 +217,8 @@ #ifndef USE_BLOCK_DEVICE_INTERFACE #define USE_BLOCK_DEVICE_INTERFACE 0 #endif // USE_BLOCK_DEVICE_INTERFACE - /** +//------------------------------------------------------------------------------ +/** * SD_CHIP_SELECT_MODE defines how the functions * void sdCsInit(SdCsPin_t pin) {pinMode(pin, OUTPUT);} * and @@ -258,7 +316,7 @@ typedef uint8_t SdCsPin_t; * is non-zero. */ #ifndef CHECK_FLASH_PROGRAMMING -#define CHECK_FLASH_PROGRAMMING 0 +#define CHECK_FLASH_PROGRAMMING 1 #endif // CHECK_FLASH_PROGRAMMING //------------------------------------------------------------------------------ /** @@ -311,15 +369,6 @@ typedef uint8_t SdCsPin_t; #define FAT12_SUPPORT 0 #endif // FAT12_SUPPORT //------------------------------------------------------------------------------ -/** - * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. - * - * Causes use of lots of heap in ARM. - */ -#ifndef DESTRUCTOR_CLOSES_FILE -#define DESTRUCTOR_CLOSES_FILE 0 -#endif // DESTRUCTOR_CLOSES_FILE -//------------------------------------------------------------------------------ /** * Call flush for endl if ENDL_CALLS_FLUSH is nonzero * @@ -345,8 +394,8 @@ typedef uint8_t SdCsPin_t; * Set USE_SIMPLE_LITTLE_ENDIAN nonzero for little endian processors * with no memory alignment restrictions. */ -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\ - && (defined(__AVR__) || defined(__ARM_FEATURE_UNALIGNED)) +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && \ + (defined(__AVR__) || defined(__ARM_FEATURE_UNALIGNED)) #define USE_SIMPLE_LITTLE_ENDIAN 1 #else // __BYTE_ORDER_ #define USE_SIMPLE_LITTLE_ENDIAN 0 @@ -393,11 +442,11 @@ typedef uint8_t SdCsPin_t; #endif // BUILTIN_SDCARD // SPI for built-in card. #ifndef SDCARD_SPI -#define SDCARD_SPI SPI1 +#define SDCARD_SPI SPI1 #define SDCARD_MISO_PIN 59 #define SDCARD_MOSI_PIN 61 -#define SDCARD_SCK_PIN 60 -#define SDCARD_SS_PIN 62 +#define SDCARD_SCK_PIN 60 +#define SDCARD_SS_PIN 62 #endif // SDCARD_SPI #define HAS_SDIO_CLASS 1 #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) @@ -408,15 +457,13 @@ typedef uint8_t SdCsPin_t; /** * Determine the default SPI configuration. */ -#if defined(ARDUINO_ARCH_APOLLO3)\ - || (defined(__AVR__) && defined(SPDR) && defined(SPSR) && defined(SPIF))\ - || (defined(__AVR__) && defined(SPI0) && defined(SPI_RXCIF_bm))\ - || defined(ESP8266) || defined(ESP32)\ - || defined(PLATFORM_ID)\ - || defined(ARDUINO_SAM_DUE)\ - || defined(STM32_CORE_VERSION)\ - || defined(__STM32F1__) || defined(__STM32F4__)\ - || (defined(CORE_TEENSY) && defined(__arm__)) +#if defined(ARDUINO_ARCH_APOLLO3) || \ + (defined(__AVR__) && defined(SPDR) && defined(SPSR) && defined(SPIF)) || \ + (defined(__AVR__) && defined(SPI0) && defined(SPI_RXCIF_bm)) || \ + defined(ESP8266) || defined(ESP32) || defined(PLATFORM_ID) || \ + defined(ARDUINO_SAM_DUE) || defined(STM32_CORE_VERSION) || \ + defined(__STM32F1__) || defined(__STM32F4__) || \ + (defined(CORE_TEENSY) && defined(__arm__)) #define SD_HAS_CUSTOM_SPI 1 #else // SD_HAS_CUSTOM_SPI // Use standard SPI library. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArduinoDriver.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArduinoDriver.h similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArduinoDriver.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArduinoDriver.h index 00bdb9ff..a571f9fb 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArduinoDriver.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArduinoDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -38,6 +38,8 @@ */ class SdSpiArduinoDriver { public: + /** Constructor. */ + SdSpiArduinoDriver() = default; /** Activate SPI hardware. */ void activate(); /** Initialize the SPI bus. @@ -55,12 +57,12 @@ class SdSpiArduinoDriver { */ uint8_t receive(); /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ uint8_t receive(uint8_t* buf, size_t count); /** Send a byte. * @@ -82,7 +84,7 @@ class SdSpiArduinoDriver { } private: - SPIClass *m_spi; + SPIClass* m_spi = nullptr; SPISettings m_spiSettings; }; /** Typedef for use of SdSpiArduinoDriver */ diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArtemis.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArtemis.cpp similarity index 83% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArtemis.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArtemis.cpp index a7a064f7..8f6efdd1 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiArtemis.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiArtemis.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,9 +25,7 @@ #include "SdSpiDriver.h" #if defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_ARCH_APOLLO3) //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -38,17 +36,11 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { memset(buf, 0XFF, count); @@ -56,24 +48,22 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { // If not a multiple of four. Command with CRC used six byte send. - while (count%4) { + while (count % 4) { send(*buf++); count--; } // Convert byte array to 4 byte array. - uint32_t myArray[count/4]; // NOLINT - for (int x = 0; x < count/4; x++) { + uint32_t myArray[count / 4]; // NOLINT + for (int x = 0; x < count / 4; x++) { myArray[x] = ((uint32_t)buf[(x * 4) + 3] << (8 * 3)) | ((uint32_t)buf[(x * 4) + 2] << (8 * 2)) | ((uint32_t)buf[(x * 4) + 1] << (8 * 1)) | ((uint32_t)buf[(x * 4) + 0] << (8 * 0)); } - m_spi->transfer(reinterpret_cast(myArray), count); + m_spi->transfer(reinterpret_cast(myArray), count); } #endif // defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_ARCH_APOLLO3) diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiAvr.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiAvr.h similarity index 80% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiAvr.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiAvr.h index c3df3fe8..731bf8f7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiAvr.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiAvr.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,7 +25,7 @@ #ifndef SdSpiAvr_h #define SdSpiAvr_h // Use of in-line for AVR to save flash. -#define nop asm volatile ("nop\n\t") +#define nop asm volatile("nop\n\t") //------------------------------------------------------------------------------ inline void SdSpiArduinoDriver::activate() { SPI.beginTransaction(m_spiSettings); @@ -36,17 +36,11 @@ inline void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { SPI.begin(); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::deactivate() { - SPI.endTransaction(); -} +inline void SdSpiArduinoDriver::deactivate() { SPI.endTransaction(); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::end() { - SPI.end(); -} +inline void SdSpiArduinoDriver::end() { SPI.end(); } //------------------------------------------------------------------------------ -inline uint8_t SdSpiArduinoDriver::receive() { - return SPI.transfer(0XFF); -} +inline uint8_t SdSpiArduinoDriver::receive() { return SPI.transfer(0XFF); } //------------------------------------------------------------------------------ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { if (count == 0) { @@ -58,12 +52,14 @@ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { // nops optimize loop for 16MHz CPU 8 MHz SPI nop; nop; - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } uint8_t in = SPDR; SPDR = 0XFF; *buf++ = in; } - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } *buf = SPDR; #elif defined(SPI_RXCIF_bm) SPI0.DATA = 0XFF; @@ -73,12 +69,14 @@ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { nop; nop; nop; - while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) {} + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } uint8_t in = SPI0.DATA; SPI0.DATA = 0XFF; *buf++ = in; } - while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) {} + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } *buf = SPI0.DATA; #else // SPSR #error Unsupported AVR CPU - edit SdFatConfig.h to use standard SPI library. @@ -86,11 +84,9 @@ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(uint8_t data) { - SPI.transfer(data); -} +inline void SdSpiArduinoDriver::send(uint8_t data) { SPI.transfer(data); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +inline void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { if (count == 0) { return; } @@ -101,10 +97,12 @@ inline void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { // nops optimize loop for 16MHz CPU 8 MHz SPI nop; nop; - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } SPDR = b; } - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } #elif defined(SPI_RXCIF_bm) SPI0.DATA = *buf++; while (--count) { @@ -113,10 +111,12 @@ inline void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { nop; nop; nop; - while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) {} + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } SPI0.DATA = b; } - while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) {} + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } #else // SPSR #error Unsupported AVR CPU - edit SdFatConfig.h to use standard SPI library. #endif // SPSR diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBareUnoDriver.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBareUnoDriver.h similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBareUnoDriver.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBareUnoDriver.h index c0c8bbdd..5c3eda34 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBareUnoDriver.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBareUnoDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,8 +30,9 @@ */ #include + #include "../common/SysCall.h" -#define nop asm volatile ("nop\n\t") +#define nop asm volatile("nop\n\t") #ifndef HIGH #define HIGH 1 #endif // HIGH @@ -79,10 +80,10 @@ inline void unoPinMode(uint8_t pin, uint8_t mode) { sei(); } -#define UNO_SS 10 +#define UNO_SS 10 #define UNO_MOSI 11 #define UNO_MISO 12 -#define UNO_SCK 13 +#define UNO_SCK 13 //------------------------------------------------------------------------------ /** * \class SdSpiDriverBareUno @@ -116,16 +117,14 @@ class SdSpiDriverBareUno { * * \return The byte. */ - uint8_t receive() { - return transfer(0XFF); - } + uint8_t receive() { return transfer(0XFF); } /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ uint8_t receive(uint8_t* buf, size_t count) { if (count == 0) { return 0; @@ -133,7 +132,8 @@ class SdSpiDriverBareUno { uint8_t* pr = buf; SPDR = 0XFF; while (--count > 0) { - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } uint8_t in = SPDR; SPDR = 0XFF; *pr++ = in; @@ -141,7 +141,8 @@ class SdSpiDriverBareUno { nop; nop; } - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } *pr = SPDR; return 0; } @@ -149,9 +150,7 @@ class SdSpiDriverBareUno { * * \param[in] data Byte to send */ - void send(uint8_t data) { - transfer(data); - } + void send(uint8_t data) { transfer(data); } /** Send multiple bytes. * * \param[in] buf Buffer for data to be sent. @@ -164,18 +163,18 @@ class SdSpiDriverBareUno { SPDR = *buf++; while (--count > 0) { uint8_t b = *buf++; - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } SPDR = b; // nops to optimize loop for 16MHz CPU 8 MHz SPI nop; nop; } - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } } /** Set CS low. */ - void select() { - unoDigitalWrite(m_csPin, LOW); - } + void select() { unoDigitalWrite(m_csPin, LOW); } /** Save high speed SPISettings after SD initialization. * * \param[in] spiConfig SPI options. @@ -186,13 +185,12 @@ class SdSpiDriverBareUno { } static uint8_t transfer(uint8_t data) { SPDR = data; - while (!(SPSR & _BV(SPIF))) {} // wait + while (!(SPSR & _BV(SPIF))) { + } // wait return SPDR; } /** Set CS high. */ - void unselect() { - unoDigitalWrite(m_csPin, HIGH); - } + void unselect() { unoDigitalWrite(m_csPin, HIGH); } private: SdCsPin_t m_csPin; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBaseClass.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBaseClass.h similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBaseClass.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBaseClass.h index cd61fef7..505e2f60 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiBaseClass.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiBaseClass.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -51,12 +51,12 @@ class SdSpiBaseClass { */ virtual uint8_t receive() = 0; /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ virtual uint8_t receive(uint8_t* buf, size_t count) = 0; /** Send a byte. * @@ -73,6 +73,6 @@ class SdSpiBaseClass { * * \param[in] maxSck Maximum SCK frequency. */ - virtual void setSckSpeed(uint32_t maxSck) {(void)maxSck;} + virtual void setSckSpeed(uint32_t maxSck) { (void)maxSck; } }; #endif // SdSpiBaseClass_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiChipSelect.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiChipSelect.cpp similarity index 84% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiChipSelect.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiChipSelect.cpp index cec052a8..f7927f2c 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiChipSelect.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiChipSelect.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -26,22 +26,14 @@ #if ENABLE_ARDUINO_FEATURES #if SD_CHIP_SELECT_MODE == 0 //------------------------------------------------------------------------------ -void sdCsInit(SdCsPin_t pin) { - pinMode(pin, OUTPUT); -} +void sdCsInit(SdCsPin_t pin) { pinMode(pin, OUTPUT); } //------------------------------------------------------------------------------ -void sdCsWrite(SdCsPin_t pin, bool level) { - digitalWrite(pin, level); -} +void sdCsWrite(SdCsPin_t pin, bool level) { digitalWrite(pin, level); } #elif SD_CHIP_SELECT_MODE == 1 //------------------------------------------------------------------------------ -__attribute__((weak)) -void sdCsInit(SdCsPin_t pin) { - pinMode(pin, OUTPUT); -} +__attribute__((weak)) void sdCsInit(SdCsPin_t pin) { pinMode(pin, OUTPUT); } //------------------------------------------------------------------------------ -__attribute__((weak)) -void sdCsWrite(SdCsPin_t pin, bool level) { +__attribute__((weak)) void sdCsWrite(SdCsPin_t pin, bool level) { digitalWrite(pin, level); } #endif // SD_CHIP_SELECT_MODE == 0 diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDriver.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDriver.h similarity index 87% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDriver.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDriver.h index dfbad17f..c43055b7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDriver.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -52,19 +52,24 @@ const uint8_t DEDICATED_SPI = 1; * \param[in] opt option field of SdSpiConfig. * \return true for dedicated SPI. */ -inline bool spiOptionDedicated(uint8_t opt) {return opt & DEDICATED_SPI;} -#else // ENABLE_DEDICATED_SPI +inline bool spiOptionDedicated(uint8_t opt) { return opt & DEDICATED_SPI; } +#else // ENABLE_DEDICATED_SPI /** * \param[in] opt option field of SdSpiConfig. * \return true for dedicated SPI. */ -inline bool spiOptionDedicated(uint8_t opt) {(void)opt; return false;} +inline bool spiOptionDedicated(uint8_t opt) { + (void)opt; + return false; +} #endif // ENABLE_DEDICATED_SPI +/** The user will call begin. Useful for custom SPI configurations. */ +const uint8_t USER_SPI_BEGIN = 2; //------------------------------------------------------------------------------ /** SPISettings for SCK frequency in Hz. */ #define SD_SCK_HZ(maxSpeed) (maxSpeed) /** SPISettings for SCK frequency in MHz. */ -#define SD_SCK_MHZ(maxMhz) (1000000UL*(maxMhz)) +#define SD_SCK_MHZ(maxMhz) (1000000UL * (maxMhz)) // SPI divisor constants - obsolete. /** Set SCK to max rate. */ #define SPI_FULL_SPEED SD_SCK_MHZ(50) @@ -93,8 +98,8 @@ typedef SdSpiSoftDriver SpiPort_t; class SdSpiBaseClass; /** Port type for extrernal SPI driver. */ typedef SdSpiBaseClass SpiPort_t; -#else // SPI_DRIVER_SELECT -typedef void* SpiPort_t; +#else // SPI_DRIVER_SELECT +typedef void* SpiPort_t; #endif // SPI_DRIVER_SELECT //------------------------------------------------------------------------------ /** @@ -103,15 +108,15 @@ typedef void* SpiPort_t; */ class SdSpiConfig { public: - /** SdSpiConfig constructor. + /** SdSpiConfig constructor. * * \param[in] cs Chip select pin. * \param[in] opt Options. * \param[in] maxSpeed Maximum SCK frequency. * \param[in] port The SPI port to use. */ - SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t* port) : - csPin(cs), options(opt), maxSck(maxSpeed), spiPort(port) {} + SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t* port) + : csPin(cs), options(opt), maxSck(maxSpeed), spiPort(port) {} /** SdSpiConfig constructor. * @@ -119,8 +124,8 @@ class SdSpiConfig { * \param[in] opt Options. * \param[in] maxSpeed Maximum SCK frequency. */ - SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed) : - csPin(cs), options(opt), maxSck(maxSpeed) {} + SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed) + : csPin(cs), options(opt), maxSck(maxSpeed) {} /** SdSpiConfig constructor. * * \param[in] cs Chip select pin. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDue.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDue.cpp similarity index 75% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDue.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDue.cpp index f9260b11..73fc4c64 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiDue.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiDue.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -42,13 +42,9 @@ #define SPI_RX_IDX 2 //------------------------------------------------------------------------------ /* Disable DMA Controller. */ -static void dmac_disable() { - DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); -} +static void dmac_disable() { DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); } /* Enable DMA Controller. */ -static void dmac_enable() { - DMAC->DMAC_EN = DMAC_EN_ENABLE; -} +static void dmac_enable() { DMAC->DMAC_EN = DMAC_EN_ENABLE; } /* Disable DMA Channel. */ static void dmac_channel_disable(uint32_t ul_num) { DMAC->DMAC_CHDR = DMAC_CHDR_DIS0 << ul_num; @@ -67,14 +63,15 @@ static void spiDmaRX(uint8_t* dst, uint16_t count) { dmac_channel_disable(SPI_DMAC_RX_CH); DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = + count | DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = + DMAC_CTRLB_SRC_DSCR | DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(SPI_RX_IDX) | - DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = + DMAC_CFG_SRC_PER(SPI_RX_IDX) | DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | + DMAC_CFG_FIFOCFG_ASAP_CFG; dmac_channel_enable(SPI_DMAC_RX_CH); } //------------------------------------------------------------------------------ @@ -89,16 +86,17 @@ static void spiDmaTX(const uint8_t* src, uint16_t count) { dmac_channel_disable(SPI_DMAC_TX_CH); DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = + count | DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = + DMAC_CTRLB_SRC_DSCR | DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | src_incr | DMAC_CTRLB_DST_INCR_FIXED; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(SPI_TX_IDX) | - DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = + DMAC_CFG_DST_PER(SPI_TX_IDX) | DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | + DMAC_CFG_FIFOCFG_ALAP_CFG; dmac_channel_enable(SPI_DMAC_TX_CH); } @@ -141,39 +139,36 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { #endif // USE_SAM3X_DMAC } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - SPI.endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { SPI.endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - SPI.end(); -} +void SdSpiArduinoDriver::end() { SPI.end(); } //------------------------------------------------------------------------------ static inline uint8_t spiTransfer(uint8_t b) { Spi* pSpi = SPI0; pSpi->SPI_TDR = b; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) { + } b = pSpi->SPI_RDR; return b; } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return spiTransfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return spiTransfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { Spi* pSpi = SPI0; int rtn = 0; #if USE_SAM3X_DMAC // clear overrun error - while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) {pSpi->SPI_RDR;} + while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) { + pSpi->SPI_RDR; + } spiDmaRX(buf, count); spiDmaTX(0, count); uint32_t m = millis(); while (!dmac_channel_transfer_done(SPI_DMAC_RX_CH)) { - if ((millis() - m) > SAM3X_DMA_TIMEOUT) { + if ((millis() - m) > SAM3X_DMA_TIMEOUT) { dmac_channel_disable(SPI_DMAC_RX_CH); dmac_channel_disable(SPI_DMAC_TX_CH); rtn = 2; @@ -183,34 +178,39 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { if (pSpi->SPI_SR & SPI_SR_OVRES) { rtn |= 1; } -#else // USE_SAM3X_DMAC +#else // USE_SAM3X_DMAC for (size_t i = 0; i < count; i++) { pSpi->SPI_TDR = 0XFF; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) { + } buf[i] = pSpi->SPI_RDR; } #endif // USE_SAM3X_DMAC return rtn; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - spiTransfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { spiTransfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { Spi* pSpi = SPI0; #if USE_SAM3X_DMAC spiDmaTX(buf, count); - while (!dmac_channel_transfer_done(SPI_DMAC_TX_CH)) {} -#else // #if USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + while (!dmac_channel_transfer_done(SPI_DMAC_TX_CH)) { + } +#else // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) { + } for (size_t i = 0; i < count; i++) { pSpi->SPI_TDR = buf[i]; - while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) { + } } #endif // #if USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) { + } // leave RDR empty - while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) {pSpi->SPI_RDR;} + while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) { + pSpi->SPI_RDR; + } } #endif // defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_SAM_DUE) diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiESP.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiESP.cpp similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiESP.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiESP.cpp index bc58f5d3..27a51803 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiESP.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiESP.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -27,9 +27,7 @@ #if defined(SD_USE_CUSTOM_SPI) && (defined(ESP8266) || defined(ESP32)) #define ESP_UNALIGN_OK 1 //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -44,29 +42,23 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if ESP_UNALIGN_OK m_spi->transferBytes(nullptr, buf, count); -#else // ESP_UNALIGN_OK +#else // ESP_UNALIGN_OK // Adjust to 32-bit alignment. while ((reinterpret_cast(buf) & 0X3) && count) { *buf++ = m_spi->transfer(0xff); count--; } // Do multiple of four byte transfers. - size_t n4 = 4*(count/4); + size_t n4 = 4 * (count / 4); if (n4) { m_spi->transferBytes(nullptr, buf, n4); } @@ -78,11 +70,9 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if !ESP_UNALIGN_OK // Adjust to 32-bit alignment. while ((reinterpret_cast(buf) & 0X3) && count) { diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiLibDriver.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiLibDriver.h similarity index 62% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiLibDriver.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiLibDriver.h index 0522419c..44a7a2d5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiLibDriver.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiLibDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -43,48 +43,72 @@ inline void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { } else { m_spi = &SPI; } - m_spi->begin(); + if (!(spiConfig.options & USER_SPI_BEGIN)) { + m_spi->begin(); + } } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::end() { - m_spi->end(); -} +inline void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +inline void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -inline uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer( 0XFF); -} +inline uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { -#if USE_SPI_ARRAY_TRANSFER - memset(buf, 0XFF, count); - m_spi->transfer(buf, count); -#else // USE_SPI_ARRAY_TRANSFER +#if USE_SPI_ARRAY_TRANSFER == 0 for (size_t i = 0; i < count; i++) { buf[i] = m_spi->transfer(0XFF); } -#endif // USE_SPI_ARRAY_TRANSFER +#elif USE_SPI_ARRAY_TRANSFER == 1 + memset(buf, 0XFF, count); + m_spi->transfer(buf, count); +#elif USE_SPI_ARRAY_TRANSFER < 4 + m_spi->transfer(nullptr, buf, count); +#elif USE_SPI_ARRAY_TRANSFER == 4 + uint8_t txTmp[512]; + memset(txTmp, 0XFF, sizeof(txTmp)); + while (count) { + size_t n = count <= sizeof(txTmp) ? count : sizeof(txTmp); + m_spi->transfer(txTmp, buf, n); + buf += n; + count -= n; + } +#else // USE_SPI_ARRAY_TRANSFER == 0 +#error invalid USE_SPI_ARRAY_TRANSFER +#endif // USE_SPI_ARRAY_TRANSFER == 0 return 0; } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +inline void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ inline void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { -#if USE_SPI_ARRAY_TRANSFER - if (count <= 512) { - uint8_t tmp[512]; - memcpy(tmp, buf, count); - m_spi->transfer(tmp, count); - } -#else // USE_SPI_ARRAY_TRANSFER +#if USE_SPI_ARRAY_TRANSFER == 0 for (size_t i = 0; i < count; i++) { m_spi->transfer(buf[i]); } -#endif // USE_SPI_ARRAY_TRANSFER +#elif USE_SPI_ARRAY_TRANSFER == 1 + uint8_t tmp[512]; + while (count > 0) { + size_t n = count <= sizeof(tmp) ? count : sizeof(tmp); + memcpy(tmp, buf, n); + m_spi->transfer(tmp, n); + count -= n; + buf += n; + } +#elif USE_SPI_ARRAY_TRANSFER == 2 + // Some systems do not allow const uint8_t*. + m_spi->transfer(const_cast(buf), nullptr, count); +#elif USE_SPI_ARRAY_TRANSFER < 5 + uint8_t rxTmp[512]; + while (count > 0) { + size_t n = count <= sizeof(rxTmp) ? count : sizeof(rxTmp); + // Some systems do not allow const uint8_t*. + m_spi->transfer(const_cast(buf), rxTmp, n); + buf += n; + count -= n; + } +#else // if USE_SPI_ARRAY_TRANSFER == 0 +#error invalid USE_SPI_ARRAY_TRANSFER +#endif // USE_SPI_ARRAY_TRANSFER == 0 } #endif // SdSpiLibDriver_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiParticle.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiParticle.cpp similarity index 81% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiParticle.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiParticle.cpp index e6918204..ecf6f52e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiParticle.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiParticle.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,9 +30,7 @@ static void SD_SPI_DMA_TransferComplete_Callback() { SPI_DMA_TransferCompleted = true; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -43,36 +41,29 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { SPI_DMA_TransferCompleted = false; m_spi->transfer(nullptr, buf, count, SD_SPI_DMA_TransferComplete_Callback); - while (!SPI_DMA_TransferCompleted) {} + while (!SPI_DMA_TransferCompleted) { + } return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { SPI_DMA_TransferCompleted = false; m_spi->transfer(const_cast(buf), nullptr, count, - SD_SPI_DMA_TransferComplete_Callback); + SD_SPI_DMA_TransferComplete_Callback); - while (!SPI_DMA_TransferCompleted) {} + while (!SPI_DMA_TransferCompleted) { + } } #endif // defined(SD_USE_CUSTOM_SPI) && defined(PLATFORM_ID) - diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32.cpp similarity index 82% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32.cpp index 1e2369ac..544c2dfb 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,8 +24,7 @@ */ // Driver for: https://github.com/rogerclarkmelbourne/Arduino_STM32 #include "SdSpiDriver.h" -#if defined(SD_USE_CUSTOM_SPI)\ - && (defined(__STM32F1__) || defined(__STM32F4__)) +#if defined(SD_USE_CUSTOM_SPI) && (defined(__STM32F1__) || defined(__STM32F4__)) #if defined(__STM32F1__) #define USE_STM32_DMA 1 #elif defined(__STM32F4__) @@ -34,9 +33,7 @@ #error Unknown STM32 type #endif // defined(__STM32F1__) //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -47,35 +44,27 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if USE_STM32_DMA return m_spi->dmaTransfer(nullptr, buf, count); -#else // USE_STM32_DMA +#else // USE_STM32_DMA m_spi->read(buf, count); return 0; #endif // USE_STM32_DMA } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if USE_STM32_DMA m_spi->dmaTransfer(const_cast(buf), nullptr, count); -#else // USE_STM32_DMA +#else // USE_STM32_DMA m_spi->write(const_cast(buf), count); #endif // USE_STM32_DMA } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32Core.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32Core.cpp similarity index 87% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32Core.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32Core.cpp index 86b2a7a0..8b7da947 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSTM32Core.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSTM32Core.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -26,9 +26,7 @@ #include "SdSpiDriver.h" #if defined(SD_USE_CUSTOM_SPI) && defined(STM32_CORE_VERSION) //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -39,17 +37,11 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { // Must send 0XFF - SD looks at send data for command. @@ -58,9 +50,7 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { // Avoid stack overflow if bad count. This should cause a write error. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSoftDriver.h b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSoftDriver.h similarity index 91% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSoftDriver.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSoftDriver.h index b49221ea..c681ca4a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiSoftDriver.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiSoftDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -88,30 +88,29 @@ class SdSpiSoftDriver { * * \param[in] maxSck Maximum SCK frequency. */ - void setSckSpeed(uint32_t maxSck) { - (void)maxSck; - } + void setSckSpeed(uint32_t maxSck) { (void)maxSck; } }; //------------------------------------------------------------------------------ /** * \class SoftSpiDriver * \brief Class for external soft SPI. */ -template +template class SoftSpiDriver : public SdSpiSoftDriver { public: /** Initialize the SPI bus. */ - void begin() {m_spi.begin();} + void begin() { m_spi.begin(); } /** Receive a byte. * * \return The byte. */ - uint8_t receive() {return m_spi.receive();} + uint8_t receive() { return m_spi.receive(); } /** Send a byte. * * \param[in] data Byte to send */ - void send(uint8_t data) {m_spi.send(data);} + void send(uint8_t data) { m_spi.send(data); } + private: SoftSPI m_spi; }; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiTeensy3.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiTeensy3.cpp similarity index 83% rename from extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiTeensy3.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiTeensy3.cpp index d0303e3d..6c8e045b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/SpiDriver/SdSpiTeensy3.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/SpiDriver/SdSpiTeensy3.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,12 +23,10 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" -#if defined(SD_USE_CUSTOM_SPI) && defined(__arm__) && defined(CORE_TEENSY) +#if defined(SD_USE_CUSTOM_SPI) && defined(__arm__) && defined(CORE_TEENSY) #define USE_BLOCK_TRANSFER 1 //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -46,23 +44,17 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::end() { - m_spi->end(); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if USE_BLOCK_TRANSFER memset(buf, 0XFF, count); m_spi->transfer(buf, count); -#else // USE_BLOCK_TRANSFER +#else // USE_BLOCK_TRANSFER for (size_t i = 0; i < count; i++) { buf[i] = m_spi->transfer(0XFF); } @@ -70,11 +62,9 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if USE_BLOCK_TRANSFER uint32_t tmp[128]; if (0 < count && count <= 512) { diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/ArduinoFiles.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/ArduinoFiles.h similarity index 82% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/ArduinoFiles.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/ArduinoFiles.h index 748125de..e5a06d64 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/ArduinoFiles.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/ArduinoFiles.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -39,7 +39,7 @@ * \class PrintFile * \brief PrintFile class. */ -template +template class PrintFile : public print_t, public BaseFile { public: using BaseFile::clearWriteError; @@ -50,16 +50,14 @@ class PrintFile : public print_t, public BaseFile { * \param[in] b byte to write. * \return one for success. */ - size_t write(uint8_t b) { - return BaseFile::write(&b, 1); - } + size_t write(uint8_t b) { return BaseFile::write(&b, 1); } }; //------------------------------------------------------------------------------ /** * \class StreamFile * \brief StreamFile class. */ -template +template class StreamFile : public stream_t, public BaseFile { public: using BaseFile::clearWriteError; @@ -72,24 +70,13 @@ class StreamFile : public stream_t, public BaseFile { /** \return number of bytes available from the current position to EOF * or INT_MAX if more than INT_MAX bytes are available. */ - int available() { - return BaseFile::available(); - } + int available() { return BaseFile::available(); } /** Ensure that any bytes written to the file are saved to the SD card. */ - void flush() { - BaseFile::sync(); - } + void flush() { BaseFile::sync(); } /** This function reports if the current file is a directory or not. - * \return true if the file is a directory. - */ - bool isDirectory() { - return BaseFile::isDir(); - } - /** No longer implemented due to Long File Names. - * - * Use getName(char* name, size_t size). - * \return a pointer to replacement suggestion. + * \return true if the file is a directory. */ + bool isDirectory() { return BaseFile::isDir(); } #ifndef DOXYGEN_SHOULD_SKIP_THIS char* __attribute__((error("use getName(name, size)"))) name(); #endif // DOXYGEN_SHOULD_SKIP_THIS @@ -97,21 +84,15 @@ class StreamFile : public stream_t, public BaseFile { * * \return The byte if no error and not at eof else -1; */ - int peek() { - return BaseFile::peek(); - } + int peek() { return BaseFile::peek(); } /** \return the current file position. */ - PosType position() { - return BaseFile::curPosition(); - } + PosType position() { return BaseFile::curPosition(); } /** Read the next byte from a file. * * \return For success return the next byte in the file as an int. * If an error occurs or end of file is reached return -1. */ - int read() { - return BaseFile::read(); - } + int read() { return BaseFile::read(); } /** Rewind a file if it is a directory */ void rewindDirectory() { if (BaseFile::isDir()) { @@ -125,21 +106,15 @@ class StreamFile : public stream_t, public BaseFile { * \param[in] pos the new file position. * \return true for success or false for failure. */ - bool seek(PosType pos) { - return BaseFile::seekSet(pos); - } + bool seek(PosType pos) { return BaseFile::seekSet(pos); } /** \return the file's size. */ - PosType size() { - return BaseFile::fileSize(); - } + PosType size() { return BaseFile::fileSize(); } /** Write a byte to a file. Required by the Arduino Print class. * \param[in] b the byte to be written. * Use getWriteError to check for errors. * \return 1 for success and 0 for failure. */ - size_t write(uint8_t b) { - return BaseFile::write(b); - } + size_t write(uint8_t b) { return BaseFile::write(b); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/CPPLINT.cfg b/extra-libraries/ESP32/SdFat-2.2.3/src/common/CPPLINT.cfg similarity index 100% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/CPPLINT.cfg rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/CPPLINT.cfg diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/CompileDateTime.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/CompileDateTime.h similarity index 56% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/CompileDateTime.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/CompileDateTime.h index 4f57aa6a..7cc041eb 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/CompileDateTime.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/CompileDateTime.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,51 +24,46 @@ */ #ifndef CompileDateTime_h #define CompileDateTime_h +#include // Note - these functions will compile to a few bytes // since they are evaluated at compile time. /** \return year field of the __DATE__ macro. */ constexpr uint16_t compileYear() { - return 1000*(__DATE__[7] - '0') - + 100*(__DATE__[8] - '0') - + 10*(__DATE__[9] - '0') - + (__DATE__[10] - '0'); -} -/** \return true if str equals the month field of the __DATE__ macro. */ -constexpr bool compileMonthIs(const char* str) { - return __DATE__[0] == str[0] - && __DATE__[1] == str[1] - && __DATE__[2] == str[2]; + return 1000 * (__DATE__[7] - '0') + 100 * (__DATE__[8] - '0') + + 10 * (__DATE__[9] - '0') + (__DATE__[10] - '0'); } /** \return month field of the __DATE__ macro. */ constexpr uint8_t compileMonth() { - return compileMonthIs("Jan") ? 1 : - compileMonthIs("Feb") ? 2 : - compileMonthIs("Mar") ? 3 : - compileMonthIs("Apr") ? 4 : - compileMonthIs("May") ? 5 : - compileMonthIs("Jun") ? 6 : - compileMonthIs("Jul") ? 7 : - compileMonthIs("Aug") ? 8 : - compileMonthIs("Sep") ? 9 : - compileMonthIs("Oct") ? 10 : - compileMonthIs("Nov") ? 11 : - compileMonthIs("Dec") ? 12 : 0; + return __DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n' ? 1 + : __DATE__[0] == 'F' && __DATE__[1] == 'e' && __DATE__[2] == 'b' ? 2 + : __DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r' ? 3 + : __DATE__[0] == 'A' && __DATE__[1] == 'p' && __DATE__[2] == 'r' ? 4 + : __DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y' ? 5 + : __DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n' ? 6 + : __DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l' ? 7 + : __DATE__[0] == 'A' && __DATE__[1] == 'u' && __DATE__[2] == 'g' ? 8 + : __DATE__[0] == 'S' && __DATE__[1] == 'e' && __DATE__[2] == 'p' ? 9 + : __DATE__[0] == 'O' && __DATE__[1] == 'c' && __DATE__[2] == 't' ? 10 + : __DATE__[0] == 'N' && __DATE__[1] == 'o' && __DATE__[2] == 'v' ? 11 + : __DATE__[0] == 'D' && __DATE__[1] == 'e' && __DATE__[2] == 'c' ? 12 + : 0; } /** \return day field of the __DATE__ macro. */ constexpr uint8_t compileDay() { - return 10*(__DATE__[4] == ' ' ? 0 : __DATE__[4] - '0') + (__DATE__[5] - '0'); + return 10 * ((__DATE__[4] == ' ' ? '0' : __DATE__[4]) - '0') + + (__DATE__[5] - '0'); } /** \return hour field of the __TIME__ macro. */ constexpr uint8_t compileHour() { - return 10*(__TIME__[0] - '0') + __TIME__[1] - '0'; + return 10 * (__TIME__[0] - '0') + __TIME__[1] - '0'; } /** \return minute field of the __TIME__ macro. */ constexpr uint8_t compileMinute() { - return 10*(__TIME__[3] - '0') + __TIME__[4] - '0'; + return 10 * (__TIME__[3] - '0') + __TIME__[4] - '0'; } /** \return second field of the __TIME__ macro. */ constexpr uint8_t compileSecond() { - return 10*(__TIME__[6] - '0') + __TIME__[7] - '0'; + return 10 * (__TIME__[6] - '0') + __TIME__[7] - '0'; } #endif // CompileDateTime_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/DebugMacros.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/DebugMacros.h similarity index 91% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/DebugMacros.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/DebugMacros.h index 7d0af924..653cc86e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/DebugMacros.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/DebugMacros.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -46,11 +46,15 @@ __attribute__((unused)) static void dbgHalt(uint16_t line) { Serial.print(F(DBG_FILE)); Serial.write('.'); Serial.println(line); - while (true) {} + while (true) { + } } #define DBG_FAIL_MACRO dbgFail(__LINE__) #define DBG_HALT_MACRO dbgHalt(__LINE__) -#define DBG_HALT_IF(b) if (b) {dbgHalt(__LINE__);} +#define DBG_HALT_IF(b) \ + if (b) { \ + dbgHalt(__LINE__); \ + } #else // USE_DBG_MACROS #define DBG_FAIL_MACRO @@ -66,7 +70,10 @@ __attribute__((unused)) static void dbgWarn(uint16_t line) { Serial.println(line); } #define DBG_WARN_MACRO dbgWarn(__LINE__) -#define DBG_WARN_IF(b) if (b) {dbgWarn(__LINE__);} +#define DBG_WARN_IF(b) \ + if (b) { \ + dbgWarn(__LINE__); \ + } #else // USE_DBG_MACROS > 1 #define DBG_WARN_MACRO #define DBG_WARN_IF(b) diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.cpp similarity index 71% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.cpp index d9eb37e0..906d8ee0 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -40,80 +40,84 @@ // (we add 1 because we will be using the floor of the result later) // divmod10_asm16 and divmod10_asm32 are public domain code by Stimmer. // http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 -#define divmod10_asm16(in32, mod8, tmp8) \ -asm volatile( \ - " ldi %2,51 \n\t" \ - " mul %A0,%2 \n\t" \ - " clr %A0 \n\t" \ - " add r0,%2 \n\t" \ - " adc %A0,r1 \n\t" \ - " mov %1,r0 \n\t" \ - " mul %B0,%2 \n\t" \ - " clr %B0 \n\t" \ - " add %A0,r0 \n\t" \ - " adc %B0,r1 \n\t" \ - " clr r1 \n\t" \ - " add %1,%A0 \n\t" \ - " adc %A0,%B0 \n\t" \ - " adc %B0,r1 \n\t" \ - " add %1,%B0 \n\t" \ - " adc %A0,r1 \n\t" \ - " adc %B0,r1 \n\t" \ - " lsr %B0 \n\t" \ - " ror %A0 \n\t" \ - " ror %1 \n\t" \ - " ldi %2,10 \n\t" \ - " mul %1,%2 \n\t" \ - " mov %1,r1 \n\t" \ - " clr r1 \n\t" \ - :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") +#define divmod10_asm16(in32, mod8, tmp8) \ + asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " lsr %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + : "+r"(in32), "=d"(mod8), "=d"(tmp8) \ + : \ + : "r0") -#define divmod10_asm32(in32, mod8, tmp8) \ -asm volatile( \ - " ldi %2,51 \n\t" \ - " mul %A0,%2 \n\t" \ - " clr %A0 \n\t" \ - " add r0,%2 \n\t" \ - " adc %A0,r1 \n\t" \ - " mov %1,r0 \n\t" \ - " mul %B0,%2 \n\t" \ - " clr %B0 \n\t" \ - " add %A0,r0 \n\t" \ - " adc %B0,r1 \n\t" \ - " mul %C0,%2 \n\t" \ - " clr %C0 \n\t" \ - " add %B0,r0 \n\t" \ - " adc %C0,r1 \n\t" \ - " mul %D0,%2 \n\t" \ - " clr %D0 \n\t" \ - " add %C0,r0 \n\t" \ - " adc %D0,r1 \n\t" \ - " clr r1 \n\t" \ - " add %1,%A0 \n\t" \ - " adc %A0,%B0 \n\t" \ - " adc %B0,%C0 \n\t" \ - " adc %C0,%D0 \n\t" \ - " adc %D0,r1 \n\t" \ - " add %1,%B0 \n\t" \ - " adc %A0,%C0 \n\t" \ - " adc %B0,%D0 \n\t" \ - " adc %C0,r1 \n\t" \ - " adc %D0,r1 \n\t" \ - " add %1,%D0 \n\t" \ - " adc %A0,r1 \n\t" \ - " adc %B0,r1 \n\t" \ - " adc %C0,r1 \n\t" \ - " adc %D0,r1 \n\t" \ - " lsr %D0 \n\t" \ - " ror %C0 \n\t" \ - " ror %B0 \n\t" \ - " ror %A0 \n\t" \ - " ror %1 \n\t" \ - " ldi %2,10 \n\t" \ - " mul %1,%2 \n\t" \ - " mov %1,r1 \n\t" \ - " clr r1 \n\t" \ - :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") +#define divmod10_asm32(in32, mod8, tmp8) \ + asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " mul %D0,%2 \n\t" \ + " clr %D0 \n\t" \ + " add %C0,r0 \n\t" \ + " adc %D0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,%D0 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,%D0 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%D0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " lsr %D0 \n\t" \ + " ror %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + : "+r"(in32), "=d"(mod8), "=d"(tmp8) \ + : \ + : "r0") //------------------------------------------------------------------------------ /* // C++ code is based on this version of divmod10 by robtillaart. @@ -162,7 +166,7 @@ char* fmtBase10(char* str, uint16_t n) { #ifdef USE_STIMMER uint8_t tmp8, r; divmod10_asm16(n, r, tmp8); -#else // USE_STIMMER +#else // USE_STIMMER uint16_t t = n; n = (n >> 1) + (n >> 2); n = n + (n >> 4); @@ -187,7 +191,7 @@ char* fmtBase10(char* str, uint32_t n) { #ifdef USE_STIMMER uint8_t tmp8, r; divmod10_asm32(n, r, tmp8); -#else // USE_STIMMER +#else // USE_STIMMER uint32_t t = n; n = (n >> 1) + (n >> 2); n = n + (n >> 4); @@ -231,7 +235,7 @@ char* fmtUnsigned(char* str, uint32_t num, uint8_t base, bool caps) { if (base == 10) return fmtBase10(str, (uint32_t)num); #endif // USE_FMT_BASE10 do { - int c = num%base; + int c = num % base; *--str = c + (c < 10 ? '0' : caps ? 'A' - 10 : 'a' - 10); } while (num /= base); return str; @@ -239,11 +243,11 @@ char* fmtUnsigned(char* str, uint32_t num, uint8_t base, bool caps) { //----------------------------------------------------------------------------- static const double powTen[] = {1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9}; -static const double rnd[] = - {5e-1, 5e-2, 5e-3, 5e-4, 5e-5, 5e-6, 5e-7, 5e-8, 5e-9, 5e-10}; -static const size_t MAX_PREC = sizeof(powTen)/sizeof(powTen[0]); +static const double rnd[] = {5e-1, 5e-2, 5e-3, 5e-4, 5e-5, + 5e-6, 5e-7, 5e-8, 5e-9, 5e-10}; +static const size_t MAX_PREC = sizeof(powTen) / sizeof(powTen[0]); -char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { +char* fmtDouble(char* str, double num, uint8_t prec, bool altFmt) { bool neg = num < 0; if (neg) { num = -num; @@ -275,7 +279,7 @@ char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { uint32_t ul = num; if (prec) { char* s = str - prec; - uint32_t f = (num - ul)*powTen[prec - 1]; + uint32_t f = (num - ul) * powTen[prec - 1]; str = fmtBase10(str, f); while (str > s) { *--str = '0'; @@ -298,8 +302,8 @@ char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { * \param[in] expChar Use exp format if non zero. * \return Pointer to first character of result. */ -char* fmtDouble(char* str, double value, - uint8_t prec, bool altFmt, char expChar) { +char* fmtDouble(char* str, double value, uint8_t prec, bool altFmt, + char expChar) { if (expChar != 'e' && expChar != 'E') { expChar = 0; } @@ -347,11 +351,11 @@ char* fmtDouble(char* str, double value, exp++; } } else if (value < 1.0L) { - while (value < 1e-16L) { + while (value < 1e-16L) { value *= 1e16L; exp -= 16; } - while (value < 1e-4L) { + while (value < 1e-4L) { value *= 1e4L; exp -= 4; } @@ -384,13 +388,13 @@ char* fmtDouble(char* str, double value, uint32_t whole = value; if (prec) { char* tmp = str - prec; - uint32_t fraction = (value - whole)*powTen[prec - 1]; + uint32_t fraction = (value - whole) * powTen[prec - 1]; str = fmtBase10(str, fraction); while (str > tmp) { *--str = '0'; } } - if (prec || altFmt)*--str = '.'; + if (prec || altFmt) *--str = '.'; str = fmtBase10(str, whole); if (neg) { *--str = '-'; @@ -404,14 +408,14 @@ char* fmtDouble(char* str, double value, #ifdef __AVR__ static const float m[] PROGMEM = {1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32}; static const float p[] PROGMEM = {1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32}; -#else // __AVR__ +#else // __AVR__ static const float m[] = {1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32}; static const float p[] = {1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32}; #endif // __AVR__ #endif // DOXYGEN_SHOULD_SKIP_THIS // scale float v by power of ten. return v*10^n float scale10(float v, int8_t n) { - const float *s; + const float* s; if (n < 0) { n = -n; s = m; @@ -424,7 +428,7 @@ float scale10(float v, int8_t n) { if (n & 1) { v *= pgm_read_float(&s[i]); } -#else // __AVR__ +#else // __AVR__ if (n & 1) { v *= s[i]; } @@ -449,7 +453,8 @@ float scanFloat(const char* str, const char** ptr) { *ptr = str; } - while (isSpace((c = *str++))) {} + while (isSpace((c = *str++))) { + } neg = c == '-'; if (c == '-' || c == '+') { c = *str++; @@ -463,7 +468,7 @@ float scanFloat(const char* str, const char** ptr) { if (isDigit(c)) { digit = true; if (nd < 9) { - fract = 10*fract + c - '0'; + fract = 10 * fract + c - '0'; nd++; if (dot) { fracExp--; @@ -498,7 +503,7 @@ float scanFloat(const char* str, const char** ptr) { if (exp > EXP_LIMIT) { goto fail; } - exp = 10*exp + c - '0'; + exp = 10 * exp + c - '0'; successPtr = str; c = *str++; } @@ -510,6 +515,6 @@ float scanFloat(const char* str, const char** ptr) { v = scale10(static_cast(fract), fracExp); return neg ? -v : v; - fail: +fail: return 0; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.h similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.h index 6d25ed82..7f435232 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FmtNumber.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FmtNumber.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,17 +25,13 @@ #ifndef FmtNumber_h #define FmtNumber_h #include -#include #include -inline bool isDigit(char c) { - return '0' <= (c) && (c) <= '9'; -} -inline bool isSpace(char c) { - return (c) == ' ' || (0X9 <= (c) && (c) <= 0XD); -} +#include +inline bool isDigit(char c) { return '0' <= (c) && (c) <= '9'; } +inline bool isSpace(char c) { return (c) == ' ' || (0X9 <= (c) && (c) <= 0XD); } char* fmtBase10(char* str, uint16_t n); char* fmtBase10(char* str, uint32_t n); -char* fmtDouble(char *str, double d, uint8_t prec, bool altFmt); +char* fmtDouble(char* str, double d, uint8_t prec, bool altFmt); char* fmtDouble(char* str, double d, uint8_t prec, bool altFmt, char expChar); char* fmtHex(char* str, uint32_t n); char* fmtSigned(char* str, int32_t n, uint8_t base, bool caps); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsApiConstants.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsApiConstants.h similarity index 75% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsApiConstants.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsApiConstants.h index 3905e147..3fcc20ca 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsApiConstants.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsApiConstants.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -42,23 +42,23 @@ /** Use O_NONBLOCK for open at EOF */ #define O_AT_END O_NONBLOCK ///< Open at EOF. typedef int oflag_t; -#else // USE_FCNTL_H -#define O_RDONLY 0X00 ///< Open for reading only. -#define O_WRONLY 0X01 ///< Open for writing only. -#define O_RDWR 0X02 ///< Open for reading and writing. -#define O_AT_END 0X04 ///< Open at EOF. -#define O_APPEND 0X08 ///< Set append mode. -#define O_CREAT 0x10 ///< Create file if it does not exist. -#define O_TRUNC 0x20 ///< Truncate file to zero length. -#define O_EXCL 0x40 ///< Fail if the file exists. -#define O_SYNC 0x80 ///< Synchronized write I/O operations. +#else // USE_FCNTL_H +#define O_RDONLY 0X00 ///< Open for reading only. +#define O_WRONLY 0X01 ///< Open for writing only. +#define O_RDWR 0X02 ///< Open for reading and writing. +#define O_AT_END 0X04 ///< Open at EOF. +#define O_APPEND 0X08 ///< Set append mode. +#define O_CREAT 0x10 ///< Create file if it does not exist. +#define O_TRUNC 0x20 ///< Truncate file to zero length. +#define O_EXCL 0x40 ///< Fail if the file exists. +#define O_SYNC 0x80 ///< Synchronized write I/O operations. -#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) ///< Mask for access mode. +#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) ///< Mask for access mode. typedef uint8_t oflag_t; -#endif // USE_FCNTL_H +#endif // USE_FCNTL_H -#define O_READ O_RDONLY -#define O_WRITE O_WRONLY +#define O_READ O_RDONLY +#define O_WRITE O_WRONLY inline bool isWriteMode(oflag_t oflag) { oflag &= O_ACCMODE; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDevice.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDevice.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDevice.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDevice.h index c0cabaff..e89c5b02 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDevice.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDevice.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDeviceInterface.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDeviceInterface.h similarity index 98% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDeviceInterface.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDeviceInterface.h index ecd99121..93913181 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsBlockDeviceInterface.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsBlockDeviceInterface.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,8 +28,8 @@ */ #ifndef FsBlockDeviceInterface_h #define FsBlockDeviceInterface_h -#include #include +#include /** * \class FsBlockDeviceInterface * \brief FsBlockDeviceInterface class. diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.cpp similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.cpp index 227a82f7..031c42ee 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,8 +23,9 @@ * DEALINGS IN THE SOFTWARE. */ #define DBG_FILE "FsCache.cpp" -#include "DebugMacros.h" #include "FsCache.h" + +#include "DebugMacros.h" //------------------------------------------------------------------------------ uint8_t* FsCache::prepare(uint32_t sector, uint8_t option) { if (!m_blockDev) { @@ -48,7 +49,7 @@ uint8_t* FsCache::prepare(uint32_t sector, uint8_t option) { m_status |= option & CACHE_STATUS_MASK; return m_buffer; - fail: +fail: return nullptr; } //------------------------------------------------------------------------------ @@ -60,8 +61,7 @@ bool FsCache::sync() { } // mirror second FAT if (m_status & CACHE_STATUS_MIRROR_FAT) { - uint32_t sector = m_sector + m_mirrorOffset; - if (!m_blockDev->writeSector(sector, m_buffer)) { + if (!m_blockDev->writeSector(m_sector + m_mirrorOffset, m_buffer)) { DBG_FAIL_MACRO; goto fail; } @@ -70,6 +70,6 @@ bool FsCache::sync() { } return true; - fail: +fail: return false; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.h similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.h index f5d8ae80..54778012 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsCache.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsCache.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,8 +28,8 @@ * \file * \brief Common cache code for exFAT and FAT. */ -#include "SysCall.h" #include "FsBlockDevice.h" +#include "SysCall.h" /** * \class FsCache * \brief Sector cache. @@ -42,7 +42,7 @@ class FsCache { static const uint8_t CACHE_STATUS_MIRROR_FAT = 2; /** Cache sector status bits */ static const uint8_t CACHE_STATUS_MASK = - CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT; + CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT; /** Sync existing sector but do not read new sector. */ static const uint8_t CACHE_OPTION_NO_READ = 4; /** Cache sector for read. */ @@ -51,12 +51,12 @@ class FsCache { static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY; /** Reserve cache sector for write - do not read from sector device. */ static const uint8_t CACHE_RESERVE_FOR_WRITE = - CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; + CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; //---------------------------------------------------------------------------- + /** Cobstructor. */ + FsCache() { init(nullptr); } /** \return Cache buffer address. */ - uint8_t* cacheBuffer() { - return m_buffer; - } + uint8_t* cacheBuffer() { return m_buffer; } /** * Cache safe read of a sector. * @@ -107,7 +107,7 @@ class FsCache { * \return true for success or false for failure. */ bool cacheSafeWrite(uint32_t sector, const uint8_t* src, size_t count) { - if (isCached(sector, count)) { + if (isCached(sector, count)) { invalidate(); } return m_blockDev->writeSectors(sector, src, count); @@ -121,9 +121,7 @@ class FsCache { return m_buffer; } /** Set current sector dirty. */ - void dirty() { - m_status |= CACHE_STATUS_DIRTY; - } + void dirty() { m_status |= CACHE_STATUS_DIRTY; } /** Initialize the cache. * \param[in] blockDev Block device for this cache. */ @@ -140,8 +138,8 @@ class FsCache { * \param[in] sector Sector to checked. * \return true if the sector is cached. */ - bool isCached(uint32_t sector) const {return sector == m_sector;} - /** Check if the cache contains a sector from a range. + bool isCached(uint32_t sector) const { return sector == m_sector; } + /** Check if the cache contains a sector from a range. * \param[in] sector Start sector of the range. * \param[in] count Number of sectors in the range. * \return true if a sector in the range is cached. @@ -150,9 +148,7 @@ class FsCache { return sector <= m_sector && m_sector < (sector + count); } /** \return dirty status */ - bool isDirty() { - return m_status & CACHE_STATUS_DIRTY; - } + bool isDirty() { return m_status & CACHE_STATUS_DIRTY; } /** Prepare cache to access sector. * \param[in] sector Sector to read. * \param[in] option mode for cached sector. @@ -160,15 +156,11 @@ class FsCache { */ uint8_t* prepare(uint32_t sector, uint8_t option); /** \return Logical sector number for cached sector. */ - uint32_t sector() { - return m_sector; - } + uint32_t sector() { return m_sector; } /** Set the offset to the second FAT for mirroring. * \param[in] offset Sector offset to second FAT. */ - void setMirrorOffset(uint32_t offset) { - m_mirrorOffset = offset; - } + void setMirrorOffset(uint32_t offset) { m_mirrorOffset = offset; } /** Write current sector if dirty. * \return true for success or false for failure. */ @@ -177,8 +169,8 @@ class FsCache { private: uint8_t m_status; FsBlockDevice* m_blockDev; - uint32_t m_mirrorOffset; uint32_t m_sector; + uint32_t m_mirrorOffset; uint8_t m_buffer[512]; }; #endif // FsCache_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.cpp similarity index 83% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.cpp index 31f5f585..be3736b6 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,9 +22,10 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "SysCall.h" #include "FsDateTime.h" + #include "FmtNumber.h" +#include "SysCall.h" static void dateTimeMs10(uint16_t* date, uint16_t* time, uint8_t* ms10) { *ms10 = 0; @@ -33,19 +34,17 @@ static void dateTimeMs10(uint16_t* date, uint16_t* time, uint8_t* ms10) { //------------------------------------------------------------------------------ /** Date time callback. */ namespace FsDateTime { - void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10) = nullptr; - void (*callback2)(uint16_t* date, uint16_t* time) = nullptr; - void clearCallback() { - callback = nullptr; - } - void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)) { - callback = dateTimeMs10; - callback2 = dateTime; - } - void setCallback( - void (*dateTime)(uint16_t* date, uint16_t* time, uint8_t* ms10)) { - callback = dateTime; - } +void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10) = nullptr; +void (*callback2)(uint16_t* date, uint16_t* time) = nullptr; +void clearCallback() { callback = nullptr; } +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)) { + callback = dateTimeMs10; + callback2 = dateTime; +} +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time, + uint8_t* ms10)) { + callback = dateTime; +} } // namespace FsDateTime //------------------------------------------------------------------------------ static char* fsFmtField(char* str, uint16_t n, char sep) { @@ -74,14 +73,14 @@ char* fsFmtTime(char* str, uint16_t time) { } //------------------------------------------------------------------------------ char* fsFmtTime(char* str, uint16_t time, uint8_t sec100) { - str = fsFmtField(str, 2*(time & 31) + (sec100 < 100 ? 0 : 1), 0); + str = fsFmtField(str, 2 * (time & 31) + (sec100 < 100 ? 0 : 1), 0); *--str = ':'; return fsFmtTime(str, time); } //------------------------------------------------------------------------------ char* fsFmtTimeZone(char* str, int8_t tz) { - char sign; if (tz & 0X80) { + char sign; if (tz & 0X40) { sign = '-'; tz = -tz; @@ -90,8 +89,8 @@ char* fsFmtTimeZone(char* str, int8_t tz) { tz &= 0X7F; } if (tz) { - str = fsFmtField(str, 15*(tz%4), 0); - str = fsFmtField(str, tz/4, ':'); + str = fsFmtField(str, 15 * (tz % 4), 0); + str = fsFmtField(str, tz / 4, ':'); *--str = sign; } *--str = 'C'; @@ -103,12 +102,12 @@ char* fsFmtTimeZone(char* str, int8_t tz) { //------------------------------------------------------------------------------ size_t fsPrintDate(print_t* pr, uint16_t date) { // Allow YYYY-MM-DD - char buf[sizeof("YYYY-MM-DD") -1]; + char buf[sizeof("YYYY-MM-DD") - 1]; char* str = buf + sizeof(buf); if (date) { str = fsFmtDate(str, date); } else { - do { + do { *--str = ' '; } while (str > buf); } @@ -117,7 +116,7 @@ size_t fsPrintDate(print_t* pr, uint16_t date) { //------------------------------------------------------------------------------ size_t fsPrintDateTime(print_t* pr, uint16_t date, uint16_t time) { // Allow YYYY-MM-DD hh:mm - char buf[sizeof("YYYY-MM-DD hh:mm") -1]; + char buf[sizeof("YYYY-MM-DD hh:mm") - 1]; char* str = buf + sizeof(buf); if (date) { str = fsFmtTime(str, time); @@ -135,10 +134,10 @@ size_t fsPrintDateTime(print_t* pr, uint32_t dateTime) { return fsPrintDateTime(pr, dateTime >> 16, dateTime & 0XFFFF); } //------------------------------------------------------------------------------ -size_t fsPrintDateTime(print_t* pr, - uint32_t dateTime, uint8_t s100, int8_t tz) { +size_t fsPrintDateTime(print_t* pr, uint32_t dateTime, uint8_t s100, + int8_t tz) { // Allow YYYY-MM-DD hh:mm:ss UTC+hh:mm - char buf[sizeof("YYYY-MM-DD hh:mm:ss UTC+hh:mm") -1]; + char buf[sizeof("YYYY-MM-DD hh:mm:ss UTC+hh:mm") - 1]; char* str = buf + sizeof(buf); if (tz) { str = fsFmtTimeZone(str, tz); @@ -152,7 +151,7 @@ size_t fsPrintDateTime(print_t* pr, //------------------------------------------------------------------------------ size_t fsPrintTime(print_t* pr, uint16_t time) { // Allow hh:mm - char buf[sizeof("hh:mm") -1]; + char buf[sizeof("hh:mm") - 1]; char* str = buf + sizeof(buf); str = fsFmtTime(str, time); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); @@ -160,7 +159,7 @@ size_t fsPrintTime(print_t* pr, uint16_t time) { //------------------------------------------------------------------------------ size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100) { // Allow hh:mm:ss - char buf[sizeof("hh:mm:ss") -1]; + char buf[sizeof("hh:mm:ss") - 1]; char* str = buf + sizeof(buf); str = fsFmtTime(str, time, sec100); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); @@ -168,7 +167,7 @@ size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100) { //------------------------------------------------------------------------------ size_t fsPrintTimeZone(print_t* pr, int8_t tz) { // Allow UTC+hh:mm - char buf[sizeof("UTC+hh:mm") -1]; + char buf[sizeof("UTC+hh:mm") - 1]; char* str = buf + sizeof(buf); str = fsFmtTimeZone(str, tz); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.h similarity index 56% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.h index cd8b2c7c..3080c14b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsDateTime.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsDateTime.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,6 +25,7 @@ #ifndef FsDateTime_h #define FsDateTime_h #include + #include "CompileDateTime.h" #include "SysCall.h" @@ -36,74 +37,74 @@ /** Date time callback */ namespace FsDateTime { - /** Date time callback. */ - extern void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10); - /** Date time callback. */ - extern void (*callback2)(uint16_t* date, uint16_t* time); - /** Cancel callback. */ - void clearCallback(); - /** Set the date/time callback function. - * - * \param[in] dateTime The user's call back function. The callback. - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here. - * - * // Return date using FS_DATE macro to format fields. - * *date = FS_DATE(year, month, day); - * - * // Return time using FS_TIME macro to format fields. - * *time = FS_TIME(hour, minute, second); - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - */ - void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)); - /** Set the date/time callback function. - * - * \param[in] dateTime The user's call back function. The callback - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here. - * - * // Return date using FS_DATE macro to format fields - * *date = FS_DATE(year, month, day); - * - * // Return time using FS_TIME macro to format fields - * *time = FS_TIME(hour, minute, second); - * - * // Return the time since the last even second in units of 10 ms. - * // The granularity of the seconds part of FS_TIME is 2 seconds so - * // this field is a count of hundredth of a second and its valid - * // range is 0-199 inclusive. - * // For a simple RTC return 100*(seconds & 1). - * *ms10 = - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - */ - void setCallback( - void (*dateTime)(uint16_t* date, uint16_t* time, uint8_t* ms10)); +/** Date time callback. */ +extern void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10); +/** Date time callback. */ +extern void (*callback2)(uint16_t* date, uint16_t* time); +/** Cancel callback. */ +void clearCallback(); +/** Set the date/time callback function. + * + * \param[in] dateTime The user's call back function. The callback. + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here. + * + * // Return date using FS_DATE macro to format fields. + * *date = FS_DATE(year, month, day); + * + * // Return time using FS_TIME macro to format fields. + * *time = FS_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + */ +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)); +/** Set the date/time callback function. + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here. + * + * // Return date using FS_DATE macro to format fields + * *date = FS_DATE(year, month, day); + * + * // Return time using FS_TIME macro to format fields + * *time = FS_TIME(hour, minute, second); + * + * // Return the time since the last even second in units of 10 ms. + * // The granularity of the seconds part of FS_TIME is 2 seconds so + * // this field is a count of hundredth of a second and its valid + * // range is 0-199 inclusive. + * // For a simple RTC return 100*(seconds & 1). + * *ms10 = + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + */ +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time, + uint8_t* ms10)); } // namespace FsDateTime /** date field for directory entry @@ -115,8 +116,8 @@ namespace FsDateTime { */ static inline uint16_t FS_DATE(uint16_t year, uint8_t month, uint8_t day) { year -= 1980; - return year > 127 || month > 12 || day > 31 ? 0 : - year << 9 | month << 5 | day; + return year > 127 || month > 12 || day > 31 ? 0 + : year << 9 | month << 5 | day; } /** year part of FAT directory date field * \param[in] fatDate Date in packed dir format. @@ -139,9 +140,7 @@ static inline uint8_t FS_MONTH(uint16_t fatDate) { * * \return Extracted day [1,31] */ -static inline uint8_t FS_DAY(uint16_t fatDate) { - return fatDate & 0X1F; -} +static inline uint8_t FS_DAY(uint16_t fatDate) { return fatDate & 0X1F; } /** time field for directory entry * \param[in] hour [0,23] * \param[in] minute [0,59] @@ -150,17 +149,16 @@ static inline uint8_t FS_DAY(uint16_t fatDate) { * \return Packed time for directory entry. */ static inline uint16_t FS_TIME(uint8_t hour, uint8_t minute, uint8_t second) { - return hour > 23 || minute > 59 || second > 59 ? 0 : - hour << 11 | minute << 5 | second >> 1; + return hour > 23 || minute > 59 || second > 59 + ? 0 + : hour << 11 | minute << 5 | second >> 1; } /** hour part of FAT directory time field * \param[in] fatTime Time in packed dir format. * * \return Extracted hour [0,23] */ -static inline uint8_t FS_HOUR(uint16_t fatTime) { - return fatTime >> 11; -} +static inline uint8_t FS_HOUR(uint16_t fatTime) { return fatTime >> 11; } /** minute part of FAT directory time field * \param[in] fatTime Time in packed dir format. * @@ -177,7 +175,7 @@ static inline uint8_t FS_MINUTE(uint16_t fatTime) { * \return Extracted second [0,58] */ static inline uint8_t FS_SECOND(uint16_t fatTime) { - return 2*(fatTime & 0X1F); + return 2 * (fatTime & 0X1F); } char* fsFmtDate(char* str, uint16_t date); char* fsFmtTime(char* str, uint16_t time); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.cpp similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.cpp index f2a98e8a..d75d642b 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,6 +23,7 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsName.h" + #include "FsUtf.h" #if USE_UTF8_LONG_NAMES uint16_t FsName::get16() { @@ -48,7 +49,7 @@ uint16_t FsName::get16() { } return rtn; - fail: +fail: return 0XFFFF; } #endif // USE_UTF8_LONG_NAMES diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.h similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.h index d7cc425c..93753aae 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsName.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsName.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,8 +24,9 @@ */ #ifndef FsName_h #define FsName_h -#include "SysCall.h" #include + +#include "SysCall.h" /** * \file * \brief FsName class. @@ -44,18 +45,16 @@ class FsName { const char* end; #if !USE_UTF8_LONG_NAMES /** \return true if at end. */ - bool atEnd() {return next == end;} + bool atEnd() { return next == end; } /** Reset to start of LFN. */ - void reset() {next = begin;} + void reset() { next = begin; } /** \return next char of LFN. */ - char getch() {return atEnd() ? 0 : *next++;} + char getch() { return atEnd() ? 0 : *next++; } /** \return next UTF-16 unit of LFN. */ - uint16_t get16() {return atEnd() ? 0 : *next++;} -#else // !USE_UTF8_LONG_NAMES + uint16_t get16() { return atEnd() ? 0 : *next++; } +#else // !USE_UTF8_LONG_NAMES uint16_t ls = 0; - bool atEnd() { - return !ls && next == end; - } + bool atEnd() { return !ls && next == end; } void reset() { next = begin; ls = 0; // lowSurrogate diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.cpp similarity index 98% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.cpp index 14f3a7da..294dbe25 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.h similarity index 57% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.h index 750af2e1..4ea662dd 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/FsStructs.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsStructs.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -26,9 +26,15 @@ #define FsStructs_h #include #include -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// See: +// https://learn.microsoft.com/en-us/windows/win32/fileio/file-systems +// https://learn.microsoft.com/en-us/windows/win32/fileio/exfat-specification +// https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/fatgen103.doc +// https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/FileIO/exfat-specification.md +//------------------------------------------------------------------------------ void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba); -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ #if !defined(USE_SIMPLE_LITTLE_ENDIAN) || USE_SIMPLE_LITTLE_ENDIAN // assumes CPU is little-endian and handles alignment issues. inline uint16_t getLe16(const uint8_t* src) { @@ -49,40 +55,33 @@ inline void setLe32(uint8_t* dst, uint32_t src) { inline void setLe64(uint8_t* dst, uint64_t src) { *reinterpret_cast(dst) = src; } -#else // USE_SIMPLE_LITTLE_ENDIAN +#else // USE_SIMPLE_LITTLE_ENDIAN inline uint16_t getLe16(const uint8_t* src) { - return (uint16_t)src[0] << 0 | - (uint16_t)src[1] << 8; + return (uint16_t)src[0] << 0 | (uint16_t)src[1] << 8; } inline uint32_t getLe32(const uint8_t* src) { - return (uint32_t)src[0] << 0 | - (uint32_t)src[1] << 8 | - (uint32_t)src[2] << 16 | - (uint32_t)src[3] << 24; + return (uint32_t)src[0] << 0 | (uint32_t)src[1] << 8 | + (uint32_t)src[2] << 16 | (uint32_t)src[3] << 24; } inline uint64_t getLe64(const uint8_t* src) { - return (uint64_t)src[0] << 0 | - (uint64_t)src[1] << 8 | - (uint64_t)src[2] << 16 | - (uint64_t)src[3] << 24 | - (uint64_t)src[4] << 32 | - (uint64_t)src[5] << 40 | - (uint64_t)src[6] << 48 | - (uint64_t)src[7] << 56; + return (uint64_t)src[0] << 0 | (uint64_t)src[1] << 8 | + (uint64_t)src[2] << 16 | (uint64_t)src[3] << 24 | + (uint64_t)src[4] << 32 | (uint64_t)src[5] << 40 | + (uint64_t)src[6] << 48 | (uint64_t)src[7] << 56; } inline void setLe16(uint8_t* dst, uint16_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; } inline void setLe32(uint8_t* dst, uint32_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; dst[2] = src >> 16; dst[3] = src >> 24; } inline void setLe64(uint8_t* dst, uint64_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; dst[2] = src >> 16; dst[3] = src >> 24; dst[4] = src >> 32; @@ -97,8 +96,8 @@ const size_t FS_DIR_SIZE = 32; //------------------------------------------------------------------------------ // Reserved characters for exFAT names and FAT LFN. inline bool lfnReservedChar(uint8_t c) { - return c < 0X20 || c == '"' || c == '*' || c == '/' || c == ':' - || c == '<' || c == '>' || c == '?' || c == '\\'|| c == '|'; + return c < 0X20 || c == '"' || c == '*' || c == '/' || c == ':' || c == '<' || + c == '>' || c == '?' || c == '\\' || c == '|'; } //------------------------------------------------------------------------------ // Reserved characters for FAT short 8.3 names. @@ -127,17 +126,17 @@ typedef struct mbrPartition { } MbrPart_t; //------------------------------------------------------------------------------ typedef struct masterBootRecordSector { - uint8_t bootCode[446]; + uint8_t bootCode[446]; MbrPart_t part[4]; - uint8_t signature[2]; + uint8_t signature[2]; } MbrSector_t; //------------------------------------------------------------------------------ typedef struct partitionBootSector { - uint8_t jmpInstruction[3]; - char oemName[8]; - uint8_t bpb[109]; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t jmpInstruction[3]; + char oemName[8]; + uint8_t bpb[109]; + uint8_t bootCode[390]; + uint8_t signature[2]; } pbs_t; //------------------------------------------------------------------------------ typedef struct { @@ -149,72 +148,72 @@ typedef struct { uint64_t position; uint32_t cluster; } fspos_t; -//============================================================================= +//============================================================================== const uint8_t EXTENDED_BOOT_SIGNATURE = 0X29; typedef struct biosParameterBlockFat16 { - uint8_t bytesPerSector[2]; - uint8_t sectorsPerCluster; - uint8_t reservedSectorCount[2]; - uint8_t fatCount; - uint8_t rootDirEntryCount[2]; - uint8_t totalSectors16[2]; - uint8_t mediaType; - uint8_t sectorsPerFat16[2]; - uint8_t sectorsPerTrtack[2]; - uint8_t headCount[2]; - uint8_t hidddenSectors[4]; - uint8_t totalSectors32[4]; + uint8_t bytesPerSector[2]; + uint8_t sectorsPerCluster; + uint8_t reservedSectorCount[2]; + uint8_t fatCount; + uint8_t rootDirEntryCount[2]; + uint8_t totalSectors16[2]; + uint8_t mediaType; + uint8_t sectorsPerFat16[2]; + uint8_t sectorsPerTrtack[2]; + uint8_t headCount[2]; + uint8_t hidddenSectors[4]; + uint8_t totalSectors32[4]; - uint8_t physicalDriveNumber; - uint8_t extReserved; - uint8_t extSignature; - uint8_t volumeSerialNumber[4]; - uint8_t volumeLabel[11]; - uint8_t volumeType[8]; + uint8_t physicalDriveNumber; + uint8_t extReserved; + uint8_t extSignature; + uint8_t volumeSerialNumber[4]; + uint8_t volumeLabel[11]; + uint8_t volumeType[8]; } BpbFat16_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct biosParameterBlockFat32 { - uint8_t bytesPerSector[2]; - uint8_t sectorsPerCluster; - uint8_t reservedSectorCount[2]; - uint8_t fatCount; - uint8_t rootDirEntryCount[2]; - uint8_t totalSectors16[2]; - uint8_t mediaType; - uint8_t sectorsPerFat16[2]; - uint8_t sectorsPerTrtack[2]; - uint8_t headCount[2]; - uint8_t hidddenSectors[4]; - uint8_t totalSectors32[4]; + uint8_t bytesPerSector[2]; + uint8_t sectorsPerCluster; + uint8_t reservedSectorCount[2]; + uint8_t fatCount; + uint8_t rootDirEntryCount[2]; + uint8_t totalSectors16[2]; + uint8_t mediaType; + uint8_t sectorsPerFat16[2]; + uint8_t sectorsPerTrtack[2]; + uint8_t headCount[2]; + uint8_t hidddenSectors[4]; + uint8_t totalSectors32[4]; - uint8_t sectorsPerFat32[4]; - uint8_t fat32Flags[2]; - uint8_t fat32Version[2]; - uint8_t fat32RootCluster[4]; - uint8_t fat32FSInfoSector[2]; - uint8_t fat32BackBootSector[2]; - uint8_t fat32Reserved[12]; + uint8_t sectorsPerFat32[4]; + uint8_t fat32Flags[2]; + uint8_t fat32Version[2]; + uint8_t fat32RootCluster[4]; + uint8_t fat32FSInfoSector[2]; + uint8_t fat32BackBootSector[2]; + uint8_t fat32Reserved[12]; - uint8_t physicalDriveNumber; - uint8_t extReserved; - uint8_t extSignature; - uint8_t volumeSerialNumber[4]; - uint8_t volumeLabel[11]; - uint8_t volumeType[8]; + uint8_t physicalDriveNumber; + uint8_t extReserved; + uint8_t extSignature; + uint8_t volumeSerialNumber[4]; + uint8_t volumeLabel[11]; + uint8_t volumeType[8]; } BpbFat32_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct partitionBootSectorFat { - uint8_t jmpInstruction[3]; - char oemName[8]; + uint8_t jmpInstruction[3]; + char oemName[8]; union { uint8_t bpb[109]; BpbFat16_t bpb16; BpbFat32_t bpb32; } bpb; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t bootCode[390]; + uint8_t signature[2]; } PbsFat_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint32_t FSINFO_LEAD_SIGNATURE = 0X41615252; const uint32_t FSINFO_STRUCT_SIGNATURE = 0x61417272; const uint32_t FSINFO_TRAIL_SIGNATURE = 0xAA550000; @@ -227,17 +226,25 @@ typedef struct FsInfoSector { uint8_t reserved2[12]; uint8_t trailSignature[4]; } FsInfo_t; -//----------------------------------------------------------------------------- -/** name[0] value for entry that is free after being "deleted" */ -const uint8_t FAT_NAME_DELETED = 0XE5; +//============================================================================== +/** Attributes common to FAT and exFAT */ +const uint8_t FS_ATTRIB_READ_ONLY = 0x01; +const uint8_t FS_ATTRIB_HIDDEN = 0x02; +const uint8_t FS_ATTRIB_SYSTEM = 0x04; +const uint8_t FS_ATTRIB_DIRECTORY = 0x10; +const uint8_t FS_ATTRIB_ARCHIVE = 0x20; +// Attributes that users can change. +const uint8_t FS_ATTRIB_USER_SETTABLE = FS_ATTRIB_READ_ONLY | FS_ATTRIB_HIDDEN | + FS_ATTRIB_SYSTEM | FS_ATTRIB_ARCHIVE; +// Attributes to copy when a file is opened. +const uint8_t FS_ATTRIB_COPY = FS_ATTRIB_USER_SETTABLE | FS_ATTRIB_DIRECTORY; +//============================================================================== /** name[0] value for entry that is free and no allocated entries follow */ const uint8_t FAT_NAME_FREE = 0X00; -const uint8_t FAT_ATTRIB_READ_ONLY = 0x01; -const uint8_t FAT_ATTRIB_HIDDEN = 0x02; -const uint8_t FAT_ATTRIB_SYSTEM = 0x04; -const uint8_t FAT_ATTRIB_LABEL = 0x08; -const uint8_t FAT_ATTRIB_DIRECTORY = 0x10; -const uint8_t FAT_ATTRIB_ARCHIVE = 0x20; +/** name[0] value for entry that is free after being "deleted" */ +const uint8_t FAT_NAME_DELETED = 0XE5; +// Directory attribute of volume label. +const uint8_t FAT_ATTRIB_LABEL = 0x08; const uint8_t FAT_ATTRIB_LONG_NAME = 0X0F; /** Filename base-name is all lower case */ const uint8_t FAT_CASE_LC_BASE = 0X08; @@ -245,34 +252,34 @@ const uint8_t FAT_CASE_LC_BASE = 0X08; const uint8_t FAT_CASE_LC_EXT = 0X10; typedef struct { - uint8_t name[11]; - uint8_t attributes; - uint8_t caseFlags; - uint8_t createTimeMs; - uint8_t createTime[2]; - uint8_t createDate[2]; - uint8_t accessDate[2]; - uint8_t firstClusterHigh[2]; - uint8_t modifyTime[2]; - uint8_t modifyDate[2]; - uint8_t firstClusterLow[2]; - uint8_t fileSize[4]; + uint8_t name[11]; + uint8_t attributes; + uint8_t caseFlags; + uint8_t createTimeMs; + uint8_t createTime[2]; + uint8_t createDate[2]; + uint8_t accessDate[2]; + uint8_t firstClusterHigh[2]; + uint8_t modifyTime[2]; + uint8_t modifyDate[2]; + uint8_t firstClusterLow[2]; + uint8_t fileSize[4]; } DirFat_t; -static inline bool isFileDir(const DirFat_t* dir) { - return (dir->attributes & (FAT_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == 0; +static inline bool isFatFile(const DirFat_t* dir) { + return (dir->attributes & (FS_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == 0; } -static inline bool isFileOrSubdir(const DirFat_t* dir) { +static inline bool isFatFileOrSubdir(const DirFat_t* dir) { return (dir->attributes & FAT_ATTRIB_LABEL) == 0; } -static inline uint8_t isLongName(const DirFat_t* dir) { +static inline uint8_t isFatLongName(const DirFat_t* dir) { return dir->attributes == FAT_ATTRIB_LONG_NAME; } -static inline bool isSubdir(const DirFat_t* dir) { - return (dir->attributes & (FAT_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) - == FAT_ATTRIB_DIRECTORY; +static inline bool isFatSubdir(const DirFat_t* dir) { + return (dir->attributes & (FS_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == + FS_ATTRIB_DIRECTORY; } -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ /** * Order mask that indicates the entry is the last long dir entry in a * set of long dir entries. All valid sets of long dir entries must @@ -283,20 +290,20 @@ const uint8_t FAT_ORDER_LAST_LONG_ENTRY = 0X40; const uint8_t FAT_MAX_LFN_LENGTH = 255; typedef struct { - uint8_t order; - uint8_t unicode1[10]; - uint8_t attributes; - uint8_t mustBeZero1; - uint8_t checksum; - uint8_t unicode2[12]; - uint8_t mustBeZero2[2]; - uint8_t unicode3[4]; + uint8_t order; + uint8_t unicode1[10]; + uint8_t attributes; + uint8_t mustBeZero1; + uint8_t checksum; + uint8_t unicode2[12]; + uint8_t mustBeZero2[2]; + uint8_t unicode3[4]; } DirLfn_t; -//============================================================================= +//============================================================================== inline uint32_t exFatChecksum(uint32_t sum, uint8_t data) { return (sum << 31) + (sum >> 1) + data; } -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct biosParameterBlockExFat { uint8_t mustBeZero[53]; uint8_t partitionOffset[8]; @@ -316,93 +323,93 @@ typedef struct biosParameterBlockExFat { uint8_t percentInUse; uint8_t reserved[7]; } BpbExFat_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct ExFatBootSector { - uint8_t jmpInstruction[3]; - char oemName[8]; - BpbExFat_t bpb; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t jmpInstruction[3]; + char oemName[8]; + BpbExFat_t bpb; + uint8_t bootCode[390]; + uint8_t signature[2]; } ExFatPbs_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint32_t EXFAT_EOC = 0XFFFFFFFF; const uint8_t EXFAT_TYPE_BITMAP = 0X81; typedef struct { - uint8_t type; - uint8_t flags; - uint8_t reserved[18]; - uint8_t firstCluster[4]; - uint8_t size[8]; + uint8_t type; + uint8_t flags; + uint8_t reserved[18]; + uint8_t firstCluster[4]; + uint8_t size[8]; } DirBitmap_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint8_t EXFAT_TYPE_UPCASE = 0X82; typedef struct { - uint8_t type; - uint8_t reserved1[3]; - uint8_t checksum[4]; - uint8_t reserved2[12]; - uint8_t firstCluster[4]; - uint8_t size[8]; + uint8_t type; + uint8_t reserved1[3]; + uint8_t checksum[4]; + uint8_t reserved2[12]; + uint8_t firstCluster[4]; + uint8_t size[8]; } DirUpcase_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint8_t EXFAT_TYPE_LABEL = 0X83; typedef struct { - uint8_t type; - uint8_t labelLength; - uint8_t unicode[22]; - uint8_t reserved[8]; + uint8_t type; + uint8_t labelLength; + uint8_t unicode[22]; + uint8_t reserved[8]; } DirLabel_t; -//----------------------------------------------------------------------------- -const uint8_t EXFAT_TYPE_FILE = 0X85; -const uint8_t EXFAT_ATTRIB_READ_ONLY = 0x01; -const uint8_t EXFAT_ATTRIB_HIDDEN = 0x02; -const uint8_t EXFAT_ATTRIB_SYSTEM = 0x04; -const uint8_t EXFAT_ATTRIB_RESERVED = 0x08; -const uint8_t EXFAT_ATTRIB_DIRECTORY = 0x10; -const uint8_t EXFAT_ATTRIB_ARCHIVE = 0x20; +//------------------------------------------------------------------------------ +// Last entry in directory. +const uint8_t EXFAT_TYPE_END_DIR = 0X00; +// Entry is used if bit is set. +const uint8_t EXFAT_TYPE_USED = 0X80; +const uint8_t EXFAT_TYPE_FILE = 0X85; +// File attribute reserved since used for FAT volume label. +const uint8_t EXFAT_ATTRIB_RESERVED = 0x08; typedef struct { - uint8_t type; - uint8_t setCount; - uint8_t setChecksum[2]; - uint8_t attributes[2]; - uint8_t reserved1[2]; - uint8_t createTime[2]; - uint8_t createDate[2]; - uint8_t modifyTime[2]; - uint8_t modifyDate[2]; - uint8_t accessTime[2]; - uint8_t accessDate[2]; - uint8_t createTimeMs; - uint8_t modifyTimeMs; - uint8_t createTimezone; - uint8_t modifyTimezone; - uint8_t accessTimezone; - uint8_t reserved2[7]; + uint8_t type; + uint8_t setCount; + uint8_t setChecksum[2]; + uint8_t attributes[2]; + uint8_t reserved1[2]; + uint8_t createTime[2]; + uint8_t createDate[2]; + uint8_t modifyTime[2]; + uint8_t modifyDate[2]; + uint8_t accessTime[2]; + uint8_t accessDate[2]; + uint8_t createTimeMs; + uint8_t modifyTimeMs; + uint8_t createTimezone; + uint8_t modifyTimezone; + uint8_t accessTimezone; + uint8_t reserved2[7]; } DirFile_t; -const uint8_t EXFAT_TYPE_STREAM = 0XC0; -const uint8_t EXFAT_FLAG_ALWAYS1 = 0x01; +const uint8_t EXFAT_TYPE_STREAM = 0XC0; +const uint8_t EXFAT_FLAG_ALWAYS1 = 0x01; const uint8_t EXFAT_FLAG_CONTIGUOUS = 0x02; typedef struct { - uint8_t type; - uint8_t flags; - uint8_t reserved1; - uint8_t nameLength; - uint8_t nameHash[2]; - uint8_t reserved2[2]; - uint8_t validLength[8]; - uint8_t reserved3[4]; - uint8_t firstCluster[4]; - uint8_t dataLength[8]; + uint8_t type; + uint8_t flags; + uint8_t reserved1; + uint8_t nameLength; + uint8_t nameHash[2]; + uint8_t reserved2[2]; + uint8_t validLength[8]; + uint8_t reserved3[4]; + uint8_t firstCluster[4]; + uint8_t dataLength[8]; } DirStream_t; const uint8_t EXFAT_TYPE_NAME = 0XC1; const uint8_t EXFAT_MAX_NAME_LENGTH = 255; typedef struct { - uint8_t type; - uint8_t mustBeZero; - uint8_t unicode[30]; + uint8_t type; + uint8_t mustBeZero; + uint8_t unicode[30]; } DirName_t; #endif // FsStructs_h diff --git a/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.cpp new file mode 100644 index 00000000..7b7ef143 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.cpp @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#include "FsUtf.h" +namespace FsUtf { +//---------------------------------------------------------------------------- +char* cpToMb(uint32_t cp, char* str, const char* end) { + size_t n = end - str; + if (cp < 0X80) { + if (n < 1) goto fail; + *(str++) = static_cast(cp); + } else if (cp < 0X800) { + if (n < 2) goto fail; + *(str++) = static_cast((cp >> 6) | 0XC0); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } else if (cp < 0X10000) { + if (n < 3) goto fail; + *(str++) = static_cast((cp >> 12) | 0XE0); + *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } else { + if (n < 4) goto fail; + *(str++) = static_cast((cp >> 18) | 0XF0); + *(str++) = static_cast(((cp >> 12) & 0X3F) | 0X80); + *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } + return str; + +fail: + return nullptr; +} +//---------------------------------------------------------------------------- +// to do? improve error check +const char* mbToCp(const char* str, const char* end, uint32_t* rtn) { + size_t n; + uint32_t cp; + if (str >= end) { + return nullptr; + } + uint8_t ch = str[0]; + if ((ch & 0X80) == 0) { + *rtn = ch; + return str + 1; + } + if ((ch & 0XE0) == 0XC0) { + cp = ch & 0X1F; + n = 2; + } else if ((ch & 0XF0) == 0XE0) { + cp = ch & 0X0F; + n = 3; + } else if ((ch & 0XF8) == 0XF0) { + cp = ch & 0X07; + n = 4; + } else { + return nullptr; + } + if ((str + n) > end) { + return nullptr; + } + for (size_t i = 1; i < n; i++) { + ch = str[i]; + if ((ch & 0XC0) != 0X80) { + return nullptr; + } + cp <<= 6; + cp |= ch & 0X3F; + } + // Don't allow over long as ASCII. + if (cp < 0X80 || !isValidCp(cp)) { + return nullptr; + } + *rtn = cp; + return str + n; +} +//---------------------------------------------------------------------------- +const char* mbToU16(const char* str, const char* end, uint16_t* hs, + uint16_t* ls) { + uint32_t cp; + const char* ptr = mbToCp(str, end, &cp); + if (!ptr) { + return nullptr; + } + if (cp <= 0XFFFF) { + *hs = cp; + *ls = 0; + } else { + *hs = highSurrogate(cp); + *ls = lowSurrogate(cp); + } + return ptr; +} +} // namespace FsUtf diff --git a/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.h new file mode 100644 index 00000000..8d4e9701 --- /dev/null +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/FsUtf.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef FsUtf_h +#define FsUtf_h +/** + * \file + * \brief Unicode Transformation Format functions. + */ +#include +#include +namespace FsUtf { +/** High surrogate for a code point. + * \param{in} cp code point. + * \return high surrogate. + */ +inline uint16_t highSurrogate(uint32_t cp) { + return (cp >> 10) + (0XD800 - (0X10000 >> 10)); +} +/** Low surrogate for a code point. + * \param{in} cp code point. + * \return low surrogate. + */ +inline uint16_t lowSurrogate(uint32_t cp) { return (cp & 0X3FF) + 0XDC00; } +/** Check for a valid code point. + * \param[in] cp code point. + * \return true if valid else false. + */ +inline bool isValidCp(uint32_t cp) { + return cp <= 0x10FFFF && (cp < 0XD800 || cp > 0XDFFF); +} +/** Check for UTF-16 surrogate. + * \param[in] c UTF-16 unit. + * \return true if c is a surrogate else false. + */ +inline bool isSurrogate(uint16_t c) { return 0XD800 <= c && c <= 0XDFFF; } +/** Check for UTF-16 high surrogate. + * \param[in] c UTF-16 unit.. + * \return true if c is a high surrogate else false. + */ +inline bool isHighSurrogate(uint16_t c) { return 0XD800 <= c && c <= 0XDBFF; } +/** Check for UTF-16 low surrogate. + * \param[in] c UTF-16 unit.. + * \return true if c is a low surrogate else false. + */ +inline bool isLowSurrogate(uint16_t c) { return 0XDC00 <= c && c <= 0XDFFF; } +/** Convert UFT-16 surrogate pair to code point. + * \param[in] hs high surrogate. + * \param[in] ls low surrogate. + * \return code point. + */ +inline uint32_t u16ToCp(uint16_t hs, uint16_t ls) { + return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); +} +/** Encodes a 32 bit code point as a UTF-8 sequence. + * \param[in] cp code point to encode. + * \param[out] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * \return location one beyond last encoded character. + */ +char* cpToMb(uint32_t cp, char* str, const char* end); +/** Get next code point from a UTF-8 sequence. + * \param[in] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * May be nullptr if str is zero terminated. + * \param[out] rtn location for the code point. + * \return location of next UTF-8 character in str of nullptr for error. + */ +const char* mbToCp(const char* str, const char* end, uint32_t* rtn); +/** Get next code point from a UTF-8 sequence as UTF-16. + * \param[in] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * \param[out] hs location for the code point or high surrogate. + * \param[out] ls location for zero or high surrogate. + * \return location of next UTF-8 character in str of nullptr for error. + */ +const char* mbToU16(const char* str, const char* end, uint16_t* hs, + uint16_t* ls); +} // namespace FsUtf +#endif // FsUtf_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/SysCall.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/SysCall.h similarity index 98% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/SysCall.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/SysCall.h index c7be07e1..709dfae1 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/SysCall.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/SysCall.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,8 +28,9 @@ */ #ifndef SysCall_h #define SysCall_h -#include #include +#include + #include "../SdFatConfig.h" #if __cplusplus < 201103 #warning nullptr defined diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.cpp similarity index 50% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.cpp index af23181c..fb1e2175 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,16 +22,17 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include #include "upcase.h" + +#include #ifdef __AVR__ #include #define TABLE_MEM PROGMEM -#define readTable8(sym) pgm_read_byte(&sym) +#define readTable8(sym) pgm_read_byte(&sym) #define readTable16(sym) pgm_read_word(&sym) #else // __AVR__ #define TABLE_MEM -#define readTable8(sym) (sym) +#define readTable8(sym) (sym) #define readTable16(sym) (sym) #endif // __AVR__ @@ -49,147 +50,51 @@ struct pair16 { typedef struct pair16 pair16_t; //------------------------------------------------------------------------------ static const map16_t mapTable[] TABLE_MEM = { - {0X0061, -32, 26}, - {0X00E0, -32, 23}, - {0X00F8, -32, 7 }, - {0X0100, 1, 48}, - {0X0132, 1, 6}, - {0X0139, 1, 16}, - {0X014A, 1, 46}, - {0X0179, 1, 6}, - {0X0182, 1, 4}, - {0X01A0, 1, 6}, - {0X01B3, 1, 4}, - {0X01CD, 1, 16}, - {0X01DE, 1, 18}, - {0X01F8, 1, 40}, - {0X0222, 1, 18}, - {0X0246, 1, 10}, - {0X03AD, -37, 3}, - {0X03B1, -32, 17}, - {0X03C3, -32, 9}, - {0X03D8, 1, 24}, - {0X0430, -32, 32}, - {0X0450, -80, 16}, - {0X0460, 1, 34}, - {0X048A, 1, 54}, - {0X04C1, 1, 14}, - {0X04D0, 1, 68}, - {0X0561, -48, 38}, - {0X1E00, 1, 150}, - {0X1EA0, 1, 90}, - {0X1F00, 8, 8}, - {0X1F10, 8, 6}, - {0X1F20, 8, 8}, - {0X1F30, 8, 8}, - {0X1F40, 8, 6}, - {0X1F60, 8, 8}, - {0X1F70, 74, 2}, - {0X1F72, 86, 4}, - {0X1F76, 100, 2}, - {0X1F7A, 112, 2}, - {0X1F7C, 126, 2}, - {0X1F80, 8, 8}, - {0X1F90, 8, 8}, - {0X1FA0, 8, 8}, - {0X1FB0, 8, 2}, - {0X1FD0, 8, 2}, - {0X1FE0, 8, 2}, - {0X2170, -16, 16}, - {0X24D0, -26, 26}, - {0X2C30, -48, 47}, - {0X2C67, 1, 6}, - {0X2C80, 1, 100}, - {0X2D00, 0, 38}, - {0XFF41, -32, 26}, + {0X0061, -32, 26}, {0X00E0, -32, 23}, {0X00F8, -32, 7}, {0X0100, 1, 48}, + {0X0132, 1, 6}, {0X0139, 1, 16}, {0X014A, 1, 46}, {0X0179, 1, 6}, + {0X0182, 1, 4}, {0X01A0, 1, 6}, {0X01B3, 1, 4}, {0X01CD, 1, 16}, + {0X01DE, 1, 18}, {0X01F8, 1, 40}, {0X0222, 1, 18}, {0X0246, 1, 10}, + {0X03AD, -37, 3}, {0X03B1, -32, 17}, {0X03C3, -32, 9}, {0X03D8, 1, 24}, + {0X0430, -32, 32}, {0X0450, -80, 16}, {0X0460, 1, 34}, {0X048A, 1, 54}, + {0X04C1, 1, 14}, {0X04D0, 1, 68}, {0X0561, -48, 38}, {0X1E00, 1, 150}, + {0X1EA0, 1, 90}, {0X1F00, 8, 8}, {0X1F10, 8, 6}, {0X1F20, 8, 8}, + {0X1F30, 8, 8}, {0X1F40, 8, 6}, {0X1F60, 8, 8}, {0X1F70, 74, 2}, + {0X1F72, 86, 4}, {0X1F76, 100, 2}, {0X1F7A, 112, 2}, {0X1F7C, 126, 2}, + {0X1F80, 8, 8}, {0X1F90, 8, 8}, {0X1FA0, 8, 8}, {0X1FB0, 8, 2}, + {0X1FD0, 8, 2}, {0X1FE0, 8, 2}, {0X2170, -16, 16}, {0X24D0, -26, 26}, + {0X2C30, -48, 47}, {0X2C67, 1, 6}, {0X2C80, 1, 100}, {0X2D00, 0, 38}, + {0XFF41, -32, 26}, }; -const size_t MAP_DIM = sizeof(mapTable)/sizeof(map16_t); +const size_t MAP_DIM = sizeof(mapTable) / sizeof(map16_t); //------------------------------------------------------------------------------ static const pair16_t lookupTable[] TABLE_MEM = { - {0X00FF, 0X0178}, - {0X0180, 0X0243}, - {0X0188, 0X0187}, - {0X018C, 0X018B}, - {0X0192, 0X0191}, - {0X0195, 0X01F6}, - {0X0199, 0X0198}, - {0X019A, 0X023D}, - {0X019E, 0X0220}, - {0X01A8, 0X01A7}, - {0X01AD, 0X01AC}, - {0X01B0, 0X01AF}, - {0X01B9, 0X01B8}, - {0X01BD, 0X01BC}, - {0X01BF, 0X01F7}, - {0X01C6, 0X01C4}, - {0X01C9, 0X01C7}, - {0X01CC, 0X01CA}, - {0X01DD, 0X018E}, - {0X01F3, 0X01F1}, - {0X01F5, 0X01F4}, - {0X023A, 0X2C65}, - {0X023C, 0X023B}, - {0X023E, 0X2C66}, - {0X0242, 0X0241}, - {0X0253, 0X0181}, - {0X0254, 0X0186}, - {0X0256, 0X0189}, - {0X0257, 0X018A}, - {0X0259, 0X018F}, - {0X025B, 0X0190}, - {0X0260, 0X0193}, - {0X0263, 0X0194}, - {0X0268, 0X0197}, - {0X0269, 0X0196}, - {0X026B, 0X2C62}, - {0X026F, 0X019C}, - {0X0272, 0X019D}, - {0X0275, 0X019F}, - {0X027D, 0X2C64}, - {0X0280, 0X01A6}, - {0X0283, 0X01A9}, - {0X0288, 0X01AE}, - {0X0289, 0X0244}, - {0X028A, 0X01B1}, - {0X028B, 0X01B2}, - {0X028C, 0X0245}, - {0X0292, 0X01B7}, - {0X037B, 0X03FD}, - {0X037C, 0X03FE}, - {0X037D, 0X03FF}, - {0X03AC, 0X0386}, - {0X03C2, 0X03A3}, - {0X03CC, 0X038C}, - {0X03CD, 0X038E}, - {0X03CE, 0X038F}, - {0X03F2, 0X03F9}, - {0X03F8, 0X03F7}, - {0X03FB, 0X03FA}, - {0X04CF, 0X04C0}, - {0X1D7D, 0X2C63}, - {0X1F51, 0X1F59}, - {0X1F53, 0X1F5B}, - {0X1F55, 0X1F5D}, - {0X1F57, 0X1F5F}, - {0X1F78, 0X1FF8}, - {0X1F79, 0X1FF9}, - {0X1FB3, 0X1FBC}, - {0X1FCC, 0X1FC3}, - {0X1FE5, 0X1FEC}, - {0X1FFC, 0X1FF3}, - {0X214E, 0X2132}, - {0X2184, 0X2183}, - {0X2C61, 0X2C60}, - {0X2C76, 0X2C75}, + {0X00FF, 0X0178}, {0X0180, 0X0243}, {0X0188, 0X0187}, {0X018C, 0X018B}, + {0X0192, 0X0191}, {0X0195, 0X01F6}, {0X0199, 0X0198}, {0X019A, 0X023D}, + {0X019E, 0X0220}, {0X01A8, 0X01A7}, {0X01AD, 0X01AC}, {0X01B0, 0X01AF}, + {0X01B9, 0X01B8}, {0X01BD, 0X01BC}, {0X01BF, 0X01F7}, {0X01C6, 0X01C4}, + {0X01C9, 0X01C7}, {0X01CC, 0X01CA}, {0X01DD, 0X018E}, {0X01F3, 0X01F1}, + {0X01F5, 0X01F4}, {0X023A, 0X2C65}, {0X023C, 0X023B}, {0X023E, 0X2C66}, + {0X0242, 0X0241}, {0X0253, 0X0181}, {0X0254, 0X0186}, {0X0256, 0X0189}, + {0X0257, 0X018A}, {0X0259, 0X018F}, {0X025B, 0X0190}, {0X0260, 0X0193}, + {0X0263, 0X0194}, {0X0268, 0X0197}, {0X0269, 0X0196}, {0X026B, 0X2C62}, + {0X026F, 0X019C}, {0X0272, 0X019D}, {0X0275, 0X019F}, {0X027D, 0X2C64}, + {0X0280, 0X01A6}, {0X0283, 0X01A9}, {0X0288, 0X01AE}, {0X0289, 0X0244}, + {0X028A, 0X01B1}, {0X028B, 0X01B2}, {0X028C, 0X0245}, {0X0292, 0X01B7}, + {0X037B, 0X03FD}, {0X037C, 0X03FE}, {0X037D, 0X03FF}, {0X03AC, 0X0386}, + {0X03C2, 0X03A3}, {0X03CC, 0X038C}, {0X03CD, 0X038E}, {0X03CE, 0X038F}, + {0X03F2, 0X03F9}, {0X03F8, 0X03F7}, {0X03FB, 0X03FA}, {0X04CF, 0X04C0}, + {0X1D7D, 0X2C63}, {0X1F51, 0X1F59}, {0X1F53, 0X1F5B}, {0X1F55, 0X1F5D}, + {0X1F57, 0X1F5F}, {0X1F78, 0X1FF8}, {0X1F79, 0X1FF9}, {0X1FB3, 0X1FBC}, + {0X1FCC, 0X1FC3}, {0X1FE5, 0X1FEC}, {0X1FFC, 0X1FF3}, {0X214E, 0X2132}, + {0X2184, 0X2183}, {0X2C61, 0X2C60}, {0X2C76, 0X2C75}, }; -const size_t LOOKUP_DIM = sizeof(lookupTable)/sizeof(pair16_t); +const size_t LOOKUP_DIM = sizeof(lookupTable) / sizeof(pair16_t); //------------------------------------------------------------------------------ static size_t searchPair16(const pair16_t* table, size_t size, uint16_t key) { size_t left = 0; size_t right = size; - size_t mid; while (right - left > 1) { - mid = left + (right - left)/2; + size_t mid = left + (right - left) / 2; if (readTable16(table[mid].key) <= key) { left = mid; } else { @@ -207,7 +112,7 @@ uint16_t toUpcase(uint16_t chr) { } i = searchPair16(reinterpret_cast(mapTable), MAP_DIM, chr); first = readTable16(mapTable[i].base); - if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { + if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { int8_t off = readTable8(mapTable[i].off); if (off == 1) { return chr - ((chr - first) & 1); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.h b/extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.h index 979986ed..1a8ece9a 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/common/upcase.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/common/upcase.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ArduinoStream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ArduinoStream.h similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ArduinoStream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ArduinoStream.h index 1fbce34e..8dfc3225 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ArduinoStream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ArduinoStream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -42,7 +42,7 @@ class ArduinoInStream : public ibufstream { * \param[in] buf buffer for input line * \param[in] size size of input buffer */ - ArduinoInStream(Stream &hws, char* buf, size_t size) { + ArduinoInStream(Stream& hws, char* buf, size_t size) { m_hw = &hws; m_line = buf; m_size = size; @@ -70,7 +70,7 @@ class ArduinoInStream : public ibufstream { m_line[i++] = m_hw->read(); m_line[i] = '\0'; } -done: + done: init(m_line); } @@ -95,7 +95,7 @@ done: } private: - char *m_line; + char* m_line; size_t m_size; Stream* m_hw; }; @@ -124,9 +124,7 @@ class ArduinoOutStream : public ostream { } m_pr->write(c); } - void putstr(const char* str) { - m_pr->write(str); - } + void putstr(const char* str) { m_pr->write(str); } bool seekoff(off_type off, seekdir way) { (void)off; (void)way; @@ -136,12 +134,8 @@ class ArduinoOutStream : public ostream { (void)pos; return false; } - bool sync() { - return true; - } - pos_type tellpos() { - return 0; - } + bool sync() { return true; } + pos_type tellpos() { return 0; } /// @endcond private: ArduinoOutStream() {} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.cpp similarity index 83% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.cpp index 3505b14f..1433e3d7 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,6 +23,9 @@ * DEALINGS IN THE SOFTWARE. */ #include "StdioStream.h" +#ifdef __AVR__ +#include +#endif // __AVR__ #include "../common/FmtNumber.h" //------------------------------------------------------------------------------ int StdioStream::fclose() { @@ -55,11 +58,11 @@ int StdioStream::fflush() { //------------------------------------------------------------------------------ char* StdioStream::fgets(char* str, size_t num, size_t* len) { char* s = str; - size_t n; if (num-- == 0) { return 0; } while (num) { + size_t n; if ((n = m_r) == 0) { if (!fillBuf()) { if (s == str) { @@ -98,43 +101,43 @@ bool StdioStream::fopen(const char* path, const char* mode) { oflag_t oflag; uint8_t m; switch (*mode++) { - case 'a': - m = O_WRONLY; - oflag = O_CREAT | O_APPEND; - m_status = S_SWR; - break; - - case 'r': - m = O_RDONLY; - oflag = 0; - m_status = S_SRD; - break; - - case 'w': - m = O_WRONLY; - oflag = O_CREAT | O_TRUNC; - m_status = S_SWR; - break; - - default: - goto fail; - } - while (*mode) { - switch (*mode++) { - case '+': - m_status = S_SRW; - m = O_RDWR; + case 'a': + m = O_WRONLY; + oflag = O_CREAT | O_APPEND; + m_status = S_SWR; break; - case 'b': + case 'r': + m = O_RDONLY; + oflag = 0; + m_status = S_SRD; break; - case 'x': - oflag |= O_EXCL; + case 'w': + m = O_WRONLY; + oflag = O_CREAT | O_TRUNC; + m_status = S_SWR; break; default: goto fail; + } + while (*mode) { + switch (*mode++) { + case '+': + m_status = S_SRW; + m = O_RDWR; + break; + + case 'b': + break; + + case 'x': + oflag |= O_EXCL; + break; + + default: + goto fail; } } oflag |= m; @@ -146,7 +149,7 @@ bool StdioStream::fopen(const char* path, const char* mode) { m_p = m_buf; return true; - fail: +fail: m_status = 0; return false; } @@ -158,7 +161,7 @@ int StdioStream::fputs(const char* str) { //------------------------------------------------------------------------------ size_t StdioStream::fread(void* ptr, size_t size, size_t count) { uint8_t* dst = reinterpret_cast(ptr); - size_t total = size*count; + size_t total = size * count; if (total == 0) { return 0; } @@ -169,7 +172,7 @@ size_t StdioStream::fread(void* ptr, size_t size, size_t count) { m_p += m_r; need -= m_r; if (!fillBuf()) { - return (total - need)/size; + return (total - need) / size; } } memcpy(dst, m_p, need); @@ -186,37 +189,40 @@ int StdioStream::fseek(int32_t offset, int origin) { } } switch (origin) { - case SEEK_CUR: - pos = ftell(); - if (pos < 0) { - goto fail; - } - pos += offset; - if (!StreamBaseFile::seekCur(pos)) { - goto fail; - } - break; + case SEEK_CUR: + pos = ftell(); + if (pos < 0) { + goto fail; + } + pos += offset; + if (!StreamBaseFile::seekCur(pos)) { + goto fail; + } + break; - case SEEK_SET: - if (!StreamBaseFile::seekSet(offset)) { - goto fail; - } - break; + case SEEK_SET: + if (offset < 0) { + goto fail; + } + if (!StreamBaseFile::seekSet((uint32_t)offset)) { + goto fail; + } + break; - case SEEK_END: - if (!StreamBaseFile::seekEnd(offset)) { - goto fail; - } - break; + case SEEK_END: + if (!StreamBaseFile::seekEnd(offset)) { + goto fail; + } + break; - default: - goto fail; + default: + goto fail; } m_r = 0; m_p = m_buf; return 0; - fail: +fail: return EOF; } //------------------------------------------------------------------------------ @@ -234,7 +240,7 @@ int32_t StdioStream::ftell() { } //------------------------------------------------------------------------------ size_t StdioStream::fwrite(const void* ptr, size_t size, size_t count) { - return write(ptr, count*size) < 0 ? EOF : count; + return write(ptr, count * size) < 0 ? EOF : count; } //------------------------------------------------------------------------------ int StdioStream::write(const void* buf, size_t count) { @@ -257,8 +263,9 @@ int StdioStream::write(const void* buf, size_t count) { } //------------------------------------------------------------------------------ #if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) -size_t StdioStream::print(const __FlashStringHelper *str) { - const char *p = (const char*)str; +size_t StdioStream::print(const __FlashStringHelper* str) { +#ifdef __AVR__ + PGM_P p = reinterpret_cast(str); uint8_t c; while ((c = pgm_read_byte(p))) { if (putc(c) < 0) { @@ -266,13 +273,16 @@ size_t StdioStream::print(const __FlashStringHelper *str) { } p++; } - return p - (const char*)str; + return p - reinterpret_cast(str); +#else // __AVR__ + return print(reinterpret_cast(str)); +#endif // __AVR__ } #endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) //------------------------------------------------------------------------------ int StdioStream::printDec(float value, uint8_t prec) { char buf[24]; - char *ptr = fmtDouble(buf + sizeof(buf), value, prec, false); + char* ptr = fmtDouble(buf + sizeof(buf), value, prec, false); return write(ptr, buf + sizeof(buf) - ptr); } //------------------------------------------------------------------------------ @@ -304,7 +314,7 @@ int StdioStream::printDec(int16_t n) { //------------------------------------------------------------------------------ int StdioStream::printDec(uint16_t n) { char buf[5]; - char *ptr = fmtBase10(buf + sizeof(buf), n); + char* ptr = fmtBase10(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } @@ -324,14 +334,14 @@ int StdioStream::printDec(int32_t n) { //------------------------------------------------------------------------------ int StdioStream::printDec(uint32_t n) { char buf[10]; - char *ptr = fmtBase10(buf + sizeof(buf), n); + char* ptr = fmtBase10(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } //------------------------------------------------------------------------------ int StdioStream::printHex(uint32_t n) { char buf[8]; - char *ptr = fmtHex(buf + sizeof(buf), n); + char* ptr = fmtHex(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } @@ -342,7 +352,7 @@ bool StdioStream::rewind() { return false; } } - StreamBaseFile::seekSet(0); + StreamBaseFile::seekSet(0UL); m_r = 0; return true; } @@ -377,8 +387,7 @@ int StdioStream::fillGet() { //------------------------------------------------------------------------------ // private bool StdioStream::fillBuf() { - if (!(m_status & - S_SRD)) { // check for S_ERR and S_EOF ??///////////////// + if (!(m_status & S_SRD)) { // check for S_ERR and S_EOF ??///////////////// if (!(m_status & S_SRW)) { m_status |= S_ERR; return false; @@ -405,8 +414,7 @@ bool StdioStream::fillBuf() { //------------------------------------------------------------------------------ // private bool StdioStream::flushBuf() { - if (!(m_status & - S_SWR)) { // check for S_ERR ??//////////////////////// + if (!(m_status & S_SWR)) { if (!(m_status & S_SRW)) { m_status |= S_ERR; return false; @@ -435,17 +443,3 @@ int StdioStream::flushPut(uint8_t c) { m_w--; return *m_p++ = c; } -//------------------------------------------------------------------------------ -char* StdioStream::fmtSpace(uint8_t len) { - if (m_w < len) { - if (!flushBuf() || m_w < len) { - return 0; - } - } - if (len > m_w) { - return 0; - } - m_p += len; - m_w -= len; - return reinterpret_cast(m_p); -} diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.h similarity index 95% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.h index 76998d7f..276c7790 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StdioStream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StdioStream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,12 @@ * \brief StdioStream class */ #include + #include "ios.h" //------------------------------------------------------------------------------ /** Total size of stream buffer. The entire buffer is used for output. - * During input UNGETC_BUF_SIZE of this space is reserved for ungetc. - */ + * During input UNGETC_BUF_SIZE of this space is reserved for ungetc. + */ const uint8_t STREAM_BUF_SIZE = 64; /** Amount of buffer allocated for ungetc during input. */ const uint8_t UNGETC_BUF_SIZE = 2; @@ -63,7 +64,7 @@ const uint8_t UNGETC_BUF_SIZE = 2; #undef getchar #undef gets #undef perror -//#undef printf // NOLINT +// #undef printf // NOLINT #undef putc #undef putchar #undef puts @@ -73,7 +74,7 @@ const uint8_t UNGETC_BUF_SIZE = 2; #undef scanf #undef setbuf #undef setvbuf -//#undef sprintf // NOLINT +// #undef sprintf // NOLINT #undef sscanf #undef tmpfile #undef tmpnam @@ -114,12 +115,10 @@ class StdioStream : private StreamBaseFile { /** Constructor * */ - StdioStream() {} + StdioStream() : m_buf{0} {} //---------------------------------------------------------------------------- /** Clear the stream's end-of-file and error indicators. */ - void clearerr() { - m_status &= ~(S_ERR | S_EOF); - } + void clearerr() { m_status &= ~(S_ERR | S_EOF); } //---------------------------------------------------------------------------- /** Close a stream. * @@ -137,16 +136,12 @@ class StdioStream : private StreamBaseFile { /** Test the stream's end-of-file indicator. * \return non-zero if and only if the end-of-file indicator is set. */ - int feof() { - return (m_status & S_EOF) != 0; - } + int feof() { return (m_status & S_EOF) != 0; } //---------------------------------------------------------------------------- /** Test the stream's error indicator. * \return return non-zero if and only if the error indicator is set. */ - int ferror() { - return (m_status & S_ERR) != 0; - } + int ferror() { return (m_status & S_ERR) != 0; } //---------------------------------------------------------------------------- /** Flush the stream. * @@ -167,9 +162,7 @@ class StdioStream : private StreamBaseFile { * set and the fgetc function returns EOF. Otherwise, the fgetc function * returns the next character from the input stream. */ - int fgetc() { - return m_r-- == 0 ? fillGet() : *m_p++; - } + int fgetc() { return m_r-- == 0 ? fillGet() : *m_p++; } //---------------------------------------------------------------------------- /** Get a string from a stream. * @@ -265,9 +258,7 @@ class StdioStream : private StreamBaseFile { * has written. Otherwise, it returns EOF and sets the error indicator for * the stream. */ - int fputc(int c) { - return m_w-- == 0 ? flushPut(c) : *m_p++ = c; - } + int fputc(int c) { return m_w-- == 0 ? flushPut(c) : *m_p++ = c; } //---------------------------------------------------------------------------- /** Write a string to a stream. * @@ -336,7 +327,7 @@ class StdioStream : private StreamBaseFile { * less than count, an error has occurred. If size or count is zero, * fwrite returns zero. */ - size_t fwrite(const void * ptr, size_t size, size_t count); + size_t fwrite(const void* ptr, size_t size, size_t count); //---------------------------------------------------------------------------- /** Get a byte from the stream. * @@ -348,8 +339,7 @@ class StdioStream : private StreamBaseFile { * set and the fgetc function returns EOF. Otherwise, the fgetc function * returns the next character from the input stream. */ - inline __attribute__((always_inline)) - int getc() { + inline __attribute__((always_inline)) int getc() { return m_r-- == 0 ? fillGet() : *m_p++; } //---------------------------------------------------------------------------- @@ -364,8 +354,7 @@ class StdioStream : private StreamBaseFile { * has written. Otherwise, it returns EOF and sets the error indicator for * the stream. */ - inline __attribute__((always_inline)) - int putc(int c) { + inline __attribute__((always_inline)) int putc(int c) { return m_w-- == 0 ? flushPut(c) : *m_p++ = c; } //---------------------------------------------------------------------------- @@ -373,8 +362,7 @@ class StdioStream : private StreamBaseFile { * * \return two, the number of bytes written, for success or -1 for failure. */ - inline __attribute__((always_inline)) - int putCRLF() { + inline __attribute__((always_inline)) int putCRLF() { if (m_w < 2) { if (!flushBuf()) { return -1; @@ -390,9 +378,7 @@ class StdioStream : private StreamBaseFile { * \param[in] c the character to write. * \return the number of bytes written. */ - size_t print(char c) { - return putc(c) < 0 ? 0 : 1; - } + size_t print(char c) { return putc(c) < 0 ? 0 : 1; } //---------------------------------------------------------------------------- /** Write a string. * @@ -412,7 +398,7 @@ class StdioStream : private StreamBaseFile { * * \return the number of bytes written. */ - size_t print(const __FlashStringHelper *str); + size_t print(const __FlashStringHelper* str); #endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) //---------------------------------------------------------------------------- /** Print a floating point number. @@ -456,9 +442,7 @@ class StdioStream : private StreamBaseFile { * * \return two, the number of bytes written, for success or zero for failure. */ - size_t println() { - return putCRLF() > 0 ? 2 : 0; - } + size_t println() { return putCRLF() > 0 ? 2 : 0; } //---------------------------------------------------------------------------- /** Print a floating point number followed by CR/LF. * @@ -519,9 +503,7 @@ class StdioStream : private StreamBaseFile { * \param[in] n number to be print. * \return The number of bytes written or -1 if an error occurs. */ - int printDec(unsigned char n) { - return printDec((uint16_t)n); - } + int printDec(unsigned char n) { return printDec((uint16_t)n); } //---------------------------------------------------------------------------- /** Print a int16_t * \param[in] n number to be printed. @@ -609,7 +591,7 @@ class StdioStream : private StreamBaseFile { */ int printHexln(uint32_t n) { int rtn = printHex(n); - return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2; + return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2; } //---------------------------------------------------------------------------- /** Set position of a stream to the beginning. @@ -643,7 +625,6 @@ class StdioStream : private StreamBaseFile { int fillGet(); bool flushBuf(); int flushPut(uint8_t c); - char* fmtSpace(uint8_t len); int write(const void* buf, size_t count); //---------------------------------------------------------------------------- // S_SRD and S_WR are never simultaneously asserted @@ -653,11 +634,11 @@ class StdioStream : private StreamBaseFile { static const uint8_t S_EOF = 0x10; // found EOF static const uint8_t S_ERR = 0x20; // found error //---------------------------------------------------------------------------- - uint8_t m_buf[STREAM_BUF_SIZE]; - uint8_t m_status = 0; + uint8_t m_buf[STREAM_BUF_SIZE]; + uint8_t m_status = 0; uint8_t* m_p = m_buf; - uint8_t m_r = 0; - uint8_t m_w; + uint8_t m_r = 0; + uint8_t m_w = 0; }; //------------------------------------------------------------------------------ #endif // StdioStream_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StreamBaseClass.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StreamBaseClass.cpp similarity index 79% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StreamBaseClass.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StreamBaseClass.cpp index 0d867d77..ca2a3396 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/StreamBaseClass.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/StreamBaseClass.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -52,35 +52,35 @@ void StreamBaseClass::open(const char* path, ios::openmode mode) { oflag_t oflag; clearWriteError(); switch (mode & (app | in | out | trunc)) { - case app | in: - case app | in | out: - oflag = O_RDWR | O_APPEND | O_CREAT; - break; + case app | in: + case app | in | out: + oflag = O_RDWR | O_APPEND | O_CREAT; + break; - case app: - case app | out: - oflag = O_WRONLY | O_APPEND | O_CREAT; - break; + case app: + case app | out: + oflag = O_WRONLY | O_APPEND | O_CREAT; + break; - case in: - oflag = O_RDONLY; - break; + case in: + oflag = O_RDONLY; + break; - case in | out: - oflag = O_RDWR | O_CREAT; - break; + case in | out: + oflag = O_RDWR | O_CREAT; + break; - case in | out | trunc: - oflag = O_RDWR | O_TRUNC | O_CREAT; - break; + case in | out | trunc: + oflag = O_RDWR | O_TRUNC | O_CREAT; + break; - case out: - case out | trunc: - oflag = O_WRONLY | O_TRUNC | O_CREAT; - break; + case out: + case out | trunc: + oflag = O_WRONLY | O_TRUNC | O_CREAT; + break; - default: - goto fail; + default: + goto fail; } if (mode & ios::ate) { oflag |= O_AT_END; @@ -92,7 +92,7 @@ void StreamBaseClass::open(const char* path, ios::openmode mode) { clear(); return; - fail: +fail: StreamBaseFile::close(); setstate(failbit); return; @@ -133,20 +133,20 @@ void StreamBaseClass::putstr(const char* str) { bool StreamBaseClass::seekoff(off_type off, seekdir way) { pos_type pos; switch (way) { - case beg: - pos = off; - break; + case beg: + pos = off; + break; - case cur: - pos = StreamBaseFile::curPosition() + off; - break; + case cur: + pos = StreamBaseFile::curPosition() + off; + break; - case end: - pos = StreamBaseFile::fileSize() + off; - break; + case end: + pos = StreamBaseFile::fileSize() + off; + break; - default: - return false; + default: + return false; } return seekpos(pos); } @@ -155,6 +155,4 @@ int StreamBaseClass::write(const void* buf, size_t n) { return StreamBaseFile::write(buf, n); } //------------------------------------------------------------------------------ -void StreamBaseClass::write(char c) { - StreamBaseFile::write(&c, 1); -} +void StreamBaseClass::write(char c) { StreamBaseFile::write(&c, 1); } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/bufstream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/bufstream.h similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/bufstream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/bufstream.h index 1b91f04a..a7e75053 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/bufstream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/bufstream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,6 +29,7 @@ * \brief \ref ibufstream and \ref obufstream classes */ #include + #include "iostream.h" //============================================================================== /** @@ -43,9 +44,7 @@ class ibufstream : public istream { * \param[in] str pointer to string to be parsed * Warning: The string will not be copied so must stay in scope. */ - explicit ibufstream(const char* str) { - init(str); - } + explicit ibufstream(const char* str) { init(str); } /** Initialize an ibufstream * \param[in] str pointer to string to be parsed * Warning: The string will not be copied so must stay in scope. @@ -66,9 +65,7 @@ class ibufstream : public istream { setstate(eofbit); return -1; } - void getpos(pos_t* pos) { - pos->position = m_pos; - } + void getpos(pos_t* pos) { pos->position = m_pos; } bool seekoff(off_type off, seekdir way) { (void)off; (void)way; @@ -81,12 +78,8 @@ class ibufstream : public istream { } return false; } - void setpos(pos_t* pos) { - m_pos = pos->position; - } - pos_type tellpos() { - return m_pos; - } + void setpos(pos_t* pos) { m_pos = pos->position; } + pos_type tellpos() { return m_pos; } /// @endcond private: const char* m_buf = nullptr; @@ -106,27 +99,21 @@ class obufstream : public ostream { * \param[in] buf buffer for formatted string * \param[in] size buffer size */ - obufstream(char *buf, size_t size) { - init(buf, size); - } + obufstream(char* buf, size_t size) { init(buf, size); } /** Initialize an obufstream * \param[in] buf buffer for formatted string * \param[in] size buffer size */ - void init(char *buf, size_t size) { + void init(char* buf, size_t size) { m_buf = buf; buf[0] = '\0'; m_size = size; m_in = 0; } /** \return a pointer to the buffer */ - char* buf() { - return m_buf; - } + char* buf() { return m_buf; } /** \return the length of the formatted string */ - size_t length() { - return m_in; - } + size_t length() { return m_in; } protected: /// @cond SHOW_PROTECTED @@ -138,7 +125,7 @@ class obufstream : public ostream { m_buf[m_in++] = c; m_buf[m_in] = '\0'; } - void putstr(const char *str) { + void putstr(const char* str) { while (*str) { putch(*str++); } @@ -156,15 +143,11 @@ class obufstream : public ostream { m_buf[m_in] = '\0'; return true; } - bool sync() { - return true; - } - pos_type tellpos() { - return m_in; - } + bool sync() { return true; } + pos_type tellpos() { return m_in; } /// @endcond private: - char *m_buf = nullptr; + char* m_buf = nullptr; size_t m_size = 0; size_t m_in = 0; }; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/fstream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/fstream.h similarity index 72% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/fstream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/fstream.h index b176a52f..e6e222e2 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/fstream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/fstream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -36,38 +36,28 @@ */ class StreamBaseClass : protected StreamBaseFile, virtual public ios { protected: - void clearWriteError() { - StreamBaseFile::clearWriteError(); - } + void clearWriteError() { StreamBaseFile::clearWriteError(); } /* Internal do not use * \return mode */ int16_t getch(); - bool getWriteError() { - return StreamBaseFile::getWriteError(); - } + bool getWriteError() { return StreamBaseFile::getWriteError(); } void open(const char* path, ios::openmode mode); /** Internal do not use * \return mode */ - ios::openmode getmode() { - return m_mode; - } + ios::openmode getmode() { return m_mode; } void putch(char c); - void putstr(const char *str); + void putstr(const char* str); bool seekoff(off_type off, seekdir way); /** Internal do not use * \param[in] pos */ - bool seekpos(pos_type pos) { - return StreamBaseFile::seekSet(pos); - } + bool seekpos(pos_type pos) { return StreamBaseFile::seekSet(pos); } /** Internal do not use * \param[in] mode */ - void setmode(ios::openmode mode) { - m_mode = mode; - } + void setmode(ios::openmode mode) { m_mode = mode; } int write(const void* buf, size_t n); void write(char c); @@ -79,7 +69,7 @@ class StreamBaseClass : protected StreamBaseFile, virtual public ios { * \class fstream * \brief file input/output stream. */ -class fstream : public iostream, StreamBaseClass { +class fstream : public iostream, StreamBaseClass { public: using iostream::peek; fstream() {} @@ -103,9 +93,7 @@ class fstream : public iostream, StreamBaseClass { /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** Open a fstream * \param[in] path path to open * \param[in] mode open mode @@ -132,54 +120,36 @@ class fstream : public iostream, StreamBaseClass { StreamBaseClass::open(path, mode); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } protected: /// @cond SHOW_PROTECTED /** Internal - do not use * \return */ - int16_t getch() { - return StreamBaseClass::getch(); - } + int16_t getch() { return StreamBaseClass::getch(); } /** Internal - do not use - * \param[out] pos - */ - void getpos(pos_t* pos) { - StreamBaseFile::fgetpos(pos); - } + * \param[out] pos + */ + void getpos(pos_t* pos) { StreamBaseFile::fgetpos(pos); } /** Internal - do not use * \param[in] c */ - void putch(char c) { - StreamBaseClass::putch(c); - } + void putch(char c) { StreamBaseClass::putch(c); } /** Internal - do not use * \param[in] str */ - void putstr(const char *str) { - StreamBaseClass::putstr(str); - } + void putstr(const char* str) { StreamBaseClass::putstr(str); } /** Internal - do not use * \param[in] pos */ bool seekoff(off_type off, seekdir way) { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } - void setpos(pos_t* pos) { - StreamBaseFile::fsetpos(pos); - } - bool sync() { - return StreamBaseClass::sync(); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool seekpos(pos_type pos) { return StreamBaseClass::seekpos(pos); } + void setpos(pos_t* pos) { StreamBaseFile::fsetpos(pos); } + bool sync() { return StreamBaseClass::sync(); } + pos_type tellpos() { return StreamBaseFile::curPosition(); } /// @endcond }; //============================================================================== @@ -187,7 +157,7 @@ class fstream : public iostream, StreamBaseClass { * \class ifstream * \brief file input stream. */ -class ifstream : public istream, StreamBaseClass { +class ifstream : public istream, StreamBaseClass { public: using istream::peek; ifstream() {} @@ -195,22 +165,16 @@ class ifstream : public istream, StreamBaseClass { * \param[in] path file to open * \param[in] mode open mode */ - explicit ifstream(const char* path, openmode mode = in) { - open(path, mode); - } + explicit ifstream(const char* path, openmode mode = in) { open(path, mode); } #if DESTRUCTOR_CLOSES_FILE ~ifstream() {} #endif // DESTRUCTOR_CLOSES_FILE /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } /** Open an ifstream * \param[in] path file to open * \param[in] mode open mode @@ -226,30 +190,20 @@ class ifstream : public istream, StreamBaseClass { /** Internal - do not use * \return */ - int16_t getch() { - return StreamBaseClass::getch(); - } + int16_t getch() override { return StreamBaseClass::getch(); } /** Internal - do not use * \param[out] pos */ - void getpos(pos_t* pos) { - StreamBaseFile::fgetpos(pos); - } + void getpos(pos_t* pos) override { StreamBaseFile::fgetpos(pos); } /** Internal - do not use * \param[in] pos */ - bool seekoff(off_type off, seekdir way) { + bool seekoff(off_type off, seekdir way) override { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } - void setpos(pos_t* pos) { - StreamBaseFile::fsetpos(pos); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool seekpos(pos_type pos) override { return StreamBaseClass::seekpos(pos); } + void setpos(pos_t* pos) override { StreamBaseFile::fsetpos(pos); } + pos_type tellpos() override { return StreamBaseFile::curPosition(); } /// @endcond }; //============================================================================== @@ -257,16 +211,14 @@ class ifstream : public istream, StreamBaseClass { * \class ofstream * \brief file output stream. */ -class ofstream : public ostream, StreamBaseClass { +class ofstream : public ostream, StreamBaseClass { public: ofstream() {} /** Constructor with open * \param[in] path file to open * \param[in] mode open mode */ - explicit ofstream(const char* path, openmode mode = out) { - open(path, mode); - } + explicit ofstream(const char* path, openmode mode = out) { open(path, mode); } #if DESTRUCTOR_CLOSES_FILE ~ofstream() {} #endif // DESTRUCTOR_CLOSES_FILE @@ -280,9 +232,7 @@ class ofstream : public ostream, StreamBaseClass { /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** Open an ofstream * \param[in] path file to open * \param[in] mode open mode @@ -293,9 +243,7 @@ class ofstream : public ostream, StreamBaseClass { StreamBaseClass::open(path, mode | out); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } protected: /// @cond SHOW_PROTECTED @@ -303,28 +251,18 @@ class ofstream : public ostream, StreamBaseClass { * Internal do not use * \param[in] c */ - void putch(char c) { - StreamBaseClass::putch(c); - } - void putstr(const char* str) { - StreamBaseClass::putstr(str); - } - bool seekoff(off_type off, seekdir way) { + void putch(char c) override { StreamBaseClass::putch(c); } + void putstr(const char* str) override { StreamBaseClass::putstr(str); } + bool seekoff(off_type off, seekdir way) override { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } + bool seekpos(pos_type pos) override { return StreamBaseClass::seekpos(pos); } /** * Internal do not use * \param[in] b */ - bool sync() { - return StreamBaseClass::sync(); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool sync() override { return StreamBaseClass::sync(); } + pos_type tellpos() override { return StreamBaseFile::curPosition(); } /// @endcond }; #endif // fstream_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ios.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ios.h similarity index 86% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ios.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ios.h index cb22a582..50eb58fe 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ios.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ios.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -70,7 +70,7 @@ class ios_base { typedef uint32_t pos_type; /** type for relative seek offset */ typedef int32_t off_type; -#else // SDFAT_FILE_TYPE +#else // SDFAT_FILE_TYPE /** * unsigned size that can represent maximum file size. * (violates spec - should be signed) @@ -93,36 +93,36 @@ class ios_base { /** type for format flags */ typedef unsigned int fmtflags; /** left adjust fields */ - static const fmtflags left = 0x0001; + static const fmtflags left = 0x0001; /** right adjust fields */ - static const fmtflags right = 0x0002; + static const fmtflags right = 0x0002; /** fill between sign/base prefix and number */ - static const fmtflags internal = 0x0004; + static const fmtflags internal = 0x0004; /** base 10 flag*/ - static const fmtflags dec = 0x0008; + static const fmtflags dec = 0x0008; /** base 16 flag */ - static const fmtflags hex = 0x0010; + static const fmtflags hex = 0x0010; /** base 8 flag */ - static const fmtflags oct = 0x0020; + static const fmtflags oct = 0x0020; // static const fmtflags fixed = 0x0040; // static const fmtflags scientific = 0x0080; /** use strings true/false for bool */ - static const fmtflags boolalpha = 0x0100; + static const fmtflags boolalpha = 0x0100; /** use prefix 0X for hex and 0 for oct */ - static const fmtflags showbase = 0x0200; + static const fmtflags showbase = 0x0200; /** always show '.' for floating numbers */ - static const fmtflags showpoint = 0x0400; + static const fmtflags showpoint = 0x0400; /** show + sign for nonnegative numbers */ - static const fmtflags showpos = 0x0800; + static const fmtflags showpos = 0x0800; /** skip initial white space */ - static const fmtflags skipws = 0x1000; + static const fmtflags skipws = 0x1000; // static const fmtflags unitbuf = 0x2000; /** use uppercase letters in number representations */ - static const fmtflags uppercase = 0x4000; + static const fmtflags uppercase = 0x4000; /** mask for adjustfield */ static const fmtflags adjustfield = left | right | internal; /** mask for basefield */ - static const fmtflags basefield = dec | hex | oct; + static const fmtflags basefield = dec | hex | oct; // static const fmtflags floatfield = scientific | fixed; //---------------------------------------------------------------------------- /** typedef for iostream open mode */ @@ -130,24 +130,25 @@ class ios_base { // Openmode flags. /** seek to end before each write */ - static const openmode app = 0X4; + static const openmode app = 0X4; /** open and seek to end immediately after opening */ - static const openmode ate = 0X8; + static const openmode ate = 0X8; /** perform input and output in binary mode (as opposed to text mode) */ static const openmode binary = 0X10; /** open for input */ - static const openmode in = 0X20; + static const openmode in = 0X20; /** open for output */ - static const openmode out = 0X40; + static const openmode out = 0X40; /** truncate an existing stream when opening */ - static const openmode trunc = 0X80; + static const openmode trunc = 0X80; //---------------------------------------------------------------------------- - ios_base() : m_fill(' '), m_fmtflags(dec | right | skipws) - , m_precision(2), m_width(0) {} + ios_base() + : m_fill(' '), + m_fmtflags(dec | right | skipws), + m_precision(2), + m_width(0) {} /** \return fill character */ - char fill() { - return m_fill; - } + char fill() { return m_fill; } /** Set fill character * \param[in] c new fill character * \return old fill character @@ -158,9 +159,7 @@ class ios_base { return r; } /** \return format flags */ - fmtflags flags() const { - return m_fmtflags; - } + fmtflags flags() const { return m_fmtflags; } /** set format flags * \param[in] fl new flag * \return old flags @@ -171,9 +170,7 @@ class ios_base { return tmp; } /** \return precision */ - int precision() const { - return m_precision; - } + int precision() const { return m_precision; } /** set precision * \param[in] n new precision * \return old precision @@ -206,13 +203,9 @@ class ios_base { /** clear format flags * \param[in] fl flags to be cleared */ - void unsetf(fmtflags fl) { - m_fmtflags &= ~fl; - } + void unsetf(fmtflags fl) { m_fmtflags &= ~fl; } /** \return width */ - unsigned width() { - return m_width; - } + unsigned width() { return m_width; } /** set width * \param[in] n new width * \return old width @@ -396,19 +389,13 @@ class ios : public ios_base { return !fail() ? reinterpret_cast(this) : nullptr; } /** \return true if fail() else false. */ - bool operator!() const { - return fail(); - } + bool operator!() const { return fail(); } /** \return false if fail() else true. */ - explicit operator bool() const {return !fail();} + explicit operator bool() const { return !fail(); } /** \return The iostate flags for this file. */ - iostate rdstate() const { - return m_iostate; - } + iostate rdstate() const { return m_iostate; } /** \return True if no iostate flags are set else false. */ - bool good() const { - return m_iostate == goodbit; - } + bool good() const { return m_iostate == goodbit; } /** \return true if end of file has been reached else false. * * Warning: An empty file returns false before the first read. @@ -416,31 +403,21 @@ class ios : public ios_base { * Moral: eof() is only useful in combination with fail(), to find out * whether EOF was the cause for failure */ - bool eof() const { - return m_iostate & eofbit; - } + bool eof() const { return m_iostate & eofbit; } /** \return true if any iostate bit other than eof are set else false. */ - bool fail() const { - return m_iostate & (failbit | badbit); - } + bool fail() const { return m_iostate & (failbit | badbit); } /** \return true if bad bit is set else false. */ - bool bad() const { - return m_iostate & badbit; - } + bool bad() const { return m_iostate & badbit; } /** Clear iostate bits. * * \param[in] state The flags you want to set after clearing all flags. **/ - void clear(iostate state = goodbit) { - m_iostate = state; - } + void clear(iostate state = goodbit) { m_iostate = state; } /** Set iostate bits. * * \param[in] state Bitts to set. **/ - void setstate(iostate state) { - m_iostate |= state; - } + void setstate(iostate state) { m_iostate |= state; } private: iostate m_iostate = 0; diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/iostream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/iostream.h similarity index 90% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/iostream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/iostream.h index 8ced1492..697f478f 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/iostream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/iostream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -34,7 +34,7 @@ * \param[in] is the Stream * \return The stream */ -inline istream& ws(istream& is) { +inline istream &ws(istream &is) { is.skipWhite(); return is; } @@ -42,7 +42,7 @@ inline istream& ws(istream& is) { * \param[in] os The Stream * \return The stream */ -inline ostream& endl(ostream& os) { +inline ostream &endl(ostream &os) { os.put('\n'); #if ENDL_CALLS_FLUSH os.flush(); @@ -53,7 +53,7 @@ inline ostream& endl(ostream& os) { * \param[in] os The stream * \return The stream */ -inline ostream& flush(ostream& os) { +inline ostream &flush(ostream &os) { os.flush(); return os; } @@ -75,7 +75,7 @@ struct setfill { * \param[in] arg set setfill object * \return the stream */ -inline ostream &operator<< (ostream &os, const setfill &arg) { +inline ostream &operator<<(ostream &os, const setfill &arg) { os.fill(arg.c); return os; } @@ -105,7 +105,7 @@ struct setprecision { * \param[in] arg set setprecision object * \return the stream */ -inline ostream &operator<< (ostream &os, const setprecision &arg) { +inline ostream &operator<<(ostream &os, const setprecision &arg) { os.precision(arg.p); return os; } @@ -135,7 +135,7 @@ struct setw { * \param[in] arg set setw object * \return the stream */ -inline ostream &operator<< (ostream &os, const setw &arg) { +inline ostream &operator<<(ostream &os, const setw &arg) { os.width(arg.w); return os; } @@ -153,6 +153,5 @@ inline istream &operator>>(istream &is, const setw &arg) { * \class iostream * \brief Input/Output stream */ -class iostream : public istream, public ostream { -}; +class iostream : public istream, public ostream {}; #endif // iostream_h diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.cpp similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.cpp index 87fe004e..48a2044d 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,9 +22,13 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include -#include #include "istream.h" + +#ifdef __AVR__ +#include +#endif // __AVR__ +#include +#include //------------------------------------------------------------------------------ int istream::get() { int c; @@ -46,12 +50,11 @@ istream& istream::get(char& c) { return *this; } //------------------------------------------------------------------------------ -istream& istream::get(char *str, streamsize n, char delim) { - int c; +istream& istream::get(char* str, streamsize n, char delim) { pos_t pos; m_gcount = 0; - while ((m_gcount + 1) < n) { - c = getch(&pos); + while ((m_gcount + 1) < n) { + int c = getch(&pos); if (c < 0) { break; } @@ -70,7 +73,7 @@ istream& istream::get(char *str, streamsize n, char delim) { return *this; } //------------------------------------------------------------------------------ -void istream::getBool(bool *b) { +void istream::getBool(bool* b) { if ((flags() & boolalpha) == 0) { getNumber(b); return; @@ -78,7 +81,7 @@ void istream::getBool(bool *b) { #ifdef __AVR__ PGM_P truePtr = PSTR("true"); PGM_P falsePtr = PSTR("false"); -#else // __AVR__ +#else // __AVR__ const char* truePtr = "true"; const char* falsePtr = "false"; #endif // __AVR @@ -92,7 +95,7 @@ void istream::getBool(bool *b) { #ifdef __AVR__ falseOk = falseOk && c == pgm_read_byte(falsePtr + i); trueOk = trueOk && c == pgm_read_byte(truePtr + i); -#else // __AVR__ +#else // __AVR__ falseOk = falseOk && c == falsePtr[i]; trueOk = trueOk && c == truePtr[i]; #endif // __AVR__ @@ -149,8 +152,8 @@ bool istream::getDouble(double* value) { while (1) { if (isdigit(c)) { got_digit = true; - if (frac < uint32_max/10) { - frac = frac * 10 + (c - '0'); + if (frac < uint32_max / 10) { + frac = frac * 10 + (c - '0'); if (got_dot) { fracExp--; } @@ -197,7 +200,7 @@ bool istream::getDouble(double* value) { if (exp & 1) { if (expNeg) { // check for underflow - if (v < DBL_MIN * pow10 && frac != 0) { + if (v < DBL_MIN * pow10 && frac != 0) { goto fail; } v /= pow10; @@ -216,7 +219,7 @@ bool istream::getDouble(double* value) { *value = neg ? -v : v; return true; - fail: +fail: // error restore position to last good place setpos(&endPos); setstate(failbit); @@ -224,15 +227,14 @@ bool istream::getDouble(double* value) { } //------------------------------------------------------------------------------ -istream& istream::getline(char *str, streamsize n, char delim) { +istream& istream::getline(char* str, streamsize n, char delim) { pos_t pos; - int c; m_gcount = 0; if (n > 0) { str[0] = '\0'; } while (1) { - c = getch(&pos); + int c = getch(&pos); if (c < 0) { break; } @@ -240,7 +242,7 @@ istream& istream::getline(char *str, streamsize n, char delim) { m_gcount++; break; } - if ((m_gcount + 1) >= n) { + if ((m_gcount + 1) >= n) { setpos(&pos); setstate(failbit); break; @@ -310,14 +312,14 @@ bool istream::getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num) { } setpos(&endPos); if (any > 0 || (have_zero && any >= 0)) { - *num = neg ? -val : val; + *num = neg ? -val : val; return true; } setstate(failbit); return false; } //------------------------------------------------------------------------------ -void istream::getStr(char *str) { +void istream::getStr(char* str) { pos_t pos; uint16_t i = 0; uint16_t m = width() ? width() - 1 : 0XFFFE; @@ -345,10 +347,9 @@ void istream::getStr(char *str) { } //------------------------------------------------------------------------------ istream& istream::ignore(streamsize n, int delim) { - int c; m_gcount = 0; while (m_gcount < n) { - c = getch(); + int c = getch(); if (c < 0) { break; } diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.h similarity index 89% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.h index 5642f3cf..1a959c82 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/istream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/istream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -36,14 +36,12 @@ */ class istream : public virtual ios { public: - istream() {} + istream() = default; /** call manipulator * \param[in] pf function to call * \return the stream */ - istream& operator>>(istream& (*pf)(istream& str)) { - return pf(*this); - } + istream& operator>>(istream& (*pf)(istream& str)) { return pf(*this); } /** call manipulator * \param[in] pf function to call * \return the stream @@ -65,7 +63,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(char *str) { + istream& operator>>(char* str) { getStr(str); return *this; } @@ -83,7 +81,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(signed char *str) { + istream& operator>>(signed char* str) { getStr(reinterpret_cast(str)); return *this; } @@ -101,7 +99,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(unsigned char *str) { + istream& operator>>(unsigned char* str) { getStr(reinterpret_cast(str)); return *this; } @@ -128,7 +126,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(short& arg) { // NOLINT + istream& operator>>(short& arg) { // NOLINT getNumber(&arg); return *this; } @@ -137,7 +135,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned short& arg) { // NOLINT + istream& operator>>(unsigned short& arg) { // NOLINT getNumber(&arg); return *this; } @@ -146,7 +144,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(int& arg) { + istream& operator>>(int& arg) { getNumber(&arg); return *this; } @@ -155,7 +153,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned int& arg) { + istream& operator>>(unsigned int& arg) { getNumber(&arg); return *this; } @@ -164,7 +162,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(long& arg) { // NOLINT + istream& operator>>(long& arg) { // NOLINT getNumber(&arg); return *this; } @@ -173,16 +171,16 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned long& arg) { // NOLINT + istream& operator>>(unsigned long& arg) { // NOLINT getNumber(&arg); return *this; } /** - * Extract a value of type double. - * \param[out] arg location to store the value. - * \return Is always *this. Failure is indicated by the state of *this. - */ - istream &operator>> (double& arg) { + * Extract a value of type double. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(double& arg) { getDouble(&arg); return *this; } @@ -191,7 +189,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>> (float& arg) { + istream& operator>>(float& arg) { double v; getDouble(&v); arg = v; @@ -202,7 +200,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>> (void*& arg) { + istream& operator>>(void*& arg) { uint32_t val; getNumber(&val); arg = reinterpret_cast(val); @@ -212,9 +210,7 @@ class istream : public virtual ios { * \return The number of characters extracted by the last unformatted * input function. */ - streamsize gcount() const { - return m_gcount; - } + streamsize gcount() const { return m_gcount; } /** * Extract a character if one is available. * @@ -244,7 +240,7 @@ class istream : public virtual ios { * * \return always returns *this. A failure is indicated by the stream state. */ - istream& get(char *str, streamsize n, char delim = '\n'); + istream& get(char* str, streamsize n, char delim = '\n'); /** * Extract characters * @@ -261,7 +257,7 @@ class istream : public virtual ios { * * \return always returns *this. A failure is indicated by the stream state. */ - istream& getline(char *str, streamsize n, char delim = '\n'); + istream& getline(char* str, streamsize n, char delim = '\n'); /** * Extract characters and discard them. * @@ -290,9 +286,7 @@ class istream : public virtual ios { /** * \return the stream position */ - pos_type tellg() { - return tellpos(); - } + pos_type tellg() { return tellpos(); } /** * Set the stream position * \param[in] pos The absolute position in which to move the read pointer. @@ -323,9 +317,9 @@ class istream : public virtual ios { protected: /// @cond SHOW_PROTECTED /** - * Internal - do not use - * \return - */ + * Internal - do not use + * \return + */ virtual int16_t getch() = 0; /** * Internal - do not use @@ -352,15 +346,16 @@ class istream : public virtual ios { /// @endcond private: - void getBool(bool *b); + void getBool(bool* b); void getChar(char* ch); bool getDouble(double* value); - template void getNumber(T* value); + template + void getNumber(T* value); bool getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num); - void getStr(char *str); + void getStr(char* str); int16_t readSkip(); - size_t m_gcount; + size_t m_gcount = 0; }; //------------------------------------------------------------------------------ template diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.cpp b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.cpp similarity index 93% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.cpp rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.cpp index c82c5a67..7f946bd5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.cpp +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,8 +22,11 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include #include "ostream.h" +#ifdef __AVR__ +#include +#endif // __AVR__ +#include #ifndef PSTR #define PSTR(x) x #endif // PSTR @@ -135,14 +138,20 @@ void ostream::putNum(int64_t n) { putNum((uint64_t)(neg ? -n : n), neg); } //------------------------------------------------------------------------------ -void ostream::putPgm(const char* str) { +void ostream::putPgm(const char *str) { +#ifndef __AVR__ + putStr(str); +#else // __AVR__ + uint8_t c; int n; - for (n = 0; pgm_read_byte(&str[n]); n++) {} + for (n = 0; pgm_read_byte(&str[n]); n++) { + } fill_not_left(n); - for (uint8_t c; (c = pgm_read_byte(str)); str++) { + for (n = 0; (c = pgm_read_byte(&str[n])); n++) { putch(c); } do_fill(n); +#endif // __AVR__ } //------------------------------------------------------------------------------ void ostream::putStr(const char *str) { diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.h b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.h similarity index 79% rename from extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.h index e57ff79e..7dc8eb0e 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/iostream/ostream.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/iostream/ostream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -42,14 +42,12 @@ class ostream : public virtual ios { * \param[in] pf function to call * \return the stream */ - ostream& operator<< (ostream& (*pf)(ostream& str)) { - return pf(*this); - } + ostream &operator<<(ostream &(*pf)(ostream &str)) { return pf(*this); } /** call manipulator * \param[in] pf function to call * \return the stream */ - ostream& operator<< (ios_base& (*pf)(ios_base& str)) { + ostream &operator<<(ios_base &(*pf)(ios_base &str)) { pf(*this); return *this; } @@ -57,7 +55,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (bool arg) { + ostream &operator<<(bool arg) { putBool(arg); return *this; } @@ -65,7 +63,7 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const char *arg) { + ostream &operator<<(const char *arg) { putStr(arg); return *this; } @@ -73,16 +71,16 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const signed char *arg) { - putStr((const char*)arg); + ostream &operator<<(const signed char *arg) { + putStr(reinterpret_cast(arg)); return *this; } /** Output string * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const unsigned char *arg) { - putStr((const char*)arg); + ostream &operator<<(const unsigned char *arg) { + putStr(reinterpret_cast(arg)); return *this; } #if ENABLE_ARDUINO_STRING @@ -90,7 +88,7 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const String& arg) { + ostream &operator<<(const String &arg) { putStr(arg.c_str()); return *this; } @@ -99,7 +97,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (char arg) { + ostream &operator<<(char arg) { putChar(arg); return *this; } @@ -107,7 +105,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (signed char arg) { + ostream &operator<<(signed char arg) { putChar(static_cast(arg)); return *this; } @@ -115,7 +113,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (unsigned char arg) { + ostream &operator<<(unsigned char arg) { putChar(static_cast(arg)); return *this; } @@ -123,7 +121,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (double arg) { + ostream &operator<<(double arg) { putDouble(arg); return *this; } @@ -131,7 +129,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (float arg) { + ostream &operator<<(float arg) { putDouble(arg); return *this; } @@ -139,7 +137,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (short arg) { // NOLINT + ostream &operator<<(short arg) { // NOLINT putNum((int32_t)arg); return *this; } @@ -147,7 +145,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned short arg) { // NOLINT + ostream &operator<<(unsigned short arg) { // NOLINT putNum((uint32_t)arg); return *this; } @@ -155,7 +153,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (int arg) { + ostream &operator<<(int arg) { putNum((int32_t)arg); return *this; } @@ -163,7 +161,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned int arg) { + ostream &operator<<(unsigned int arg) { putNum((uint32_t)arg); return *this; } @@ -171,7 +169,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (long arg) { // NOLINT + ostream &operator<<(long arg) { // NOLINT putNum((int32_t)arg); return *this; } @@ -179,7 +177,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned long arg) { // NOLINT + ostream &operator<<(unsigned long arg) { // NOLINT putNum((uint32_t)arg); return *this; } @@ -187,7 +185,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (long long arg) { // NOLINT + ostream &operator<<(long long arg) { // NOLINT putNum((int64_t)arg); return *this; } @@ -195,7 +193,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned long long arg) { // NOLINT + ostream &operator<<(unsigned long long arg) { // NOLINT putNum((uint64_t)arg); return *this; } @@ -203,7 +201,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream& operator<< (const void* arg) { + ostream &operator<<(const void *arg) { putNum(reinterpret_cast(arg)); return *this; } @@ -211,8 +209,8 @@ class ostream : public virtual ios { * \param[in] arg pointing to flash string * \return the stream */ - ostream &operator<< (const __FlashStringHelper *arg) { - putPgm(reinterpret_cast(arg)); + ostream &operator<<(const __FlashStringHelper *arg) { + putPgm(reinterpret_cast(arg)); return *this; } /** @@ -224,17 +222,17 @@ class ostream : public virtual ios { * \param[in] ch The character * \return A reference to the ostream object. */ - ostream& put(char ch) { + ostream &put(char ch) { putch(ch); return *this; } -// ostream& write(char *str, streamsize count); + // ostream& write(char *str, streamsize count); /** * Flushes the buffer associated with this stream. The flush function * calls the sync function of the associated file. * \return A reference to the ostream object. */ - ostream& flush() { + ostream &flush() { if (!sync()) { setstate(badbit); } @@ -243,15 +241,13 @@ class ostream : public virtual ios { /** * \return the stream position */ - pos_type tellp() { - return tellpos(); - } + pos_type tellp() { return tellpos(); } /** * Set the stream position * \param[in] pos The absolute position in which to move the write pointer. * \return Is always *this. Failure is indicated by the state of *this. */ - ostream& seekp(pos_type pos) { + ostream &seekp(pos_type pos) { if (!seekpos(pos)) { setstate(failbit); } @@ -265,7 +261,7 @@ class ostream : public virtual ios { * \param[in] way One of ios::beg, ios::cur, or ios::end. * \return Is always *this. Failure is indicated by the state of *this. */ - ostream& seekp(off_type off, seekdir way) { + ostream &seekp(off_type off, seekdir way) { if (!seekoff(off, way)) { setstate(failbit); } @@ -292,14 +288,14 @@ class ostream : public virtual ios { void putDouble(double n); void putNum(int32_t n); void putNum(int64_t n); - void putNum(uint32_t n) {putNum(n, false);} - void putNum(uint64_t n) {putNum(n, false);} - void putPgm(const char* str); - void putStr(const char* str); + void putNum(uint32_t n) { putNum(n, false); } + void putNum(uint64_t n) { putNum(n, false); } + void putPgm(const char *str); + void putStr(const char *str); - template - char* fmtNum(T n, char *ptr, uint8_t base) { - char a = flags() & uppercase ? 'A' - 10 : 'a' - 10; + template + char *fmtNum(T n, char *ptr, uint8_t base) { + char a = (flags() & uppercase) ? 'A' - 10 : 'a' - 10; do { T m = n; n /= base; @@ -309,12 +305,12 @@ class ostream : public virtual ios { return ptr; } - template + template void putNum(T n, bool neg) { - char buf[(8*sizeof(T) + 2)/3 + 2]; - char* ptr = buf + sizeof(buf) - 1; - char* num; - char* str; + char buf[(8 * sizeof(T) + 2) / 3 + 2]; + char *ptr = buf + sizeof(buf) - 1; + char *num; + char *str; uint8_t base = flagsToBase(); *ptr = '\0'; str = num = fmtNum(n, ptr, base); diff --git a/extra-libraries/ESP32/SdFat-2.1.2/src/sdios.h b/extra-libraries/ESP32/SdFat-2.2.3/src/sdios.h similarity index 97% rename from extra-libraries/ESP32/SdFat-2.1.2/src/sdios.h rename to extra-libraries/ESP32/SdFat-2.2.3/src/sdios.h index 64c197ec..d86a0b01 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/src/sdios.h +++ b/extra-libraries/ESP32/SdFat-2.2.3/src/sdios.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2021 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,6 +29,6 @@ * \brief C++ IO Streams features. */ #include "iostream/ArduinoStream.h" -#include "iostream/fstream.h" #include "iostream/StdioStream.h" +#include "iostream/fstream.h" #endif // sdios_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/.gitignore b/extra-libraries/ESP8266/ESP8266SdFat/.gitignore index b9d6bd92..6dae7474 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/.gitignore +++ b/extra-libraries/ESP8266/ESP8266SdFat/.gitignore @@ -1,215 +1,36 @@ -################# -## Eclipse -################# - -*.pydevproject -.project -.metadata -bin/ -tmp/ -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath - -# External tool builders -.externalToolBuilders/ - -# Locally stored "Eclipse launch configurations" -*.launch - -# CDT-specific -.cproject - -# PDT-specific -.buildpath - - -################# -## Visual Studio -################# - -## Ignore Visual Studio temporary files, build results, and -## files generated by popular Visual Studio add-ons. - -# User-specific files -*.suo -*.user -*.sln.docstates - -# Build results - -[Dd]ebug/ -[Rr]elease/ -x64/ -build/ -[Bb]in/ -[Oo]bj/ - -# MSTest test Results -[Tt]est[Rr]esult*/ -[Bb]uild[Ll]og.* - -*_i.c -*_p.c -*.ilk -*.meta -*.obj -*.pch -*.pdb -*.pgc -*.pgd -*.rsp -*.sbr -*.tlb -*.tli -*.tlh -*.tmp -*.tmp_proj -*.log -*.vspscc -*.vssscc -.builds -*.pidb -*.log -*.scc - -# Visual C++ cache files -ipch/ -*.aps -*.ncb -*.opensdf -*.sdf -*.cachefile - -# Visual Studio profiler -*.psess -*.vsp -*.vspx - -# Guidance Automation Toolkit -*.gpState - -# ReSharper is a .NET coding add-in -_ReSharper*/ -*.[Rr]e[Ss]harper - -# TeamCity is a build add-in -_TeamCity* - -# DotCover is a Code Coverage Tool -*.dotCover - -# NCrunch -*.ncrunch* -.*crunch*.local.xml - -# Installshield output folder -[Ee]xpress/ - -# DocProject is a documentation generator add-in -DocProject/buildhelp/ -DocProject/Help/*.HxT -DocProject/Help/*.HxC -DocProject/Help/*.hhc -DocProject/Help/*.hhk -DocProject/Help/*.hhp -DocProject/Help/Html2 -DocProject/Help/html - -# Click-Once directory -publish/ - -# Publish Web Output -*.Publish.xml -*.pubxml - -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ - -# Windows Azure Build Output -csx -*.build.csdef - -# Windows Store app package directory -AppPackages/ - -# Others -sql/ -*.Cache -ClientBin/ -[Ss]tyle[Cc]op.* -~$* -*~ -*.dbmdl -*.[Pp]ublish.xml -*.pfx -*.publishsettings - -# RIA/Silverlight projects -Generated_Code/ - -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) -_UpgradeReport_Files/ -Backup*/ -UpgradeLog*.XML -UpgradeLog*.htm - -# SQL Server files -App_Data/*.mdf -App_Data/*.ldf - -############# -## Windows detritus -############# - -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Mac crap +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + .DS_Store +.AppleDouble +.LSOverride +# Icon must ends with two \r. +Icon -############# -## Python -############# +# Thumbnails +._* -*.py[co] - -# Packages -*.egg -*.egg-info -dist/ -build/ -eggs/ -parts/ -var/ -sdist/ -develop-eggs/ -.installed.cfg - -# Installer logs -pip-log.txt - -# Unit test / coverage reports -.coverage -.tox - -#Translations -*.mo - -#Mr Developer -.mr.developer.cfg +# Files that might appear on external disk +.Spotlight-V100 +.Trashes diff --git a/extra-libraries/ESP8266/ESP8266SdFat/README.md b/extra-libraries/ESP8266/ESP8266SdFat/README.md index 425fb33d..1f97464b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/README.md +++ b/extra-libraries/ESP8266/ESP8266SdFat/README.md @@ -1,8 +1,20 @@ -### Warning: This is SdFat Version 2. +File copy constructors and file assignment operators have been made private by +default in 2.2.3 to prevent call by value and multiple copies of file instances. -Earlier releases of Version 1 are here: +SdFatConfig.h has options to make file constructors and assignment operators +public. -https://github.com/greiman/SdFat/releases +UTF-8 encoded filenames are supported in v2.1.0 or later. + +Try the UnicodeFilenames example. Here is output from ls: +
+Type any character to begin
+ls:
+         0 😀/
+          20 россиянин
+          17 très élégant
+           9 狗.txt
+
SdFat Version 2 supports FAT16/FAT32 and exFAT SD cards. It is mostly backward compatible with SdFat Version 1 for FAT16/FAT32 cards. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/Doxyfile b/extra-libraries/ESP8266/ESP8266SdFat/doc/Doxyfile index 4e5760a2..54e8ce86 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/Doxyfile +++ b/extra-libraries/ESP8266/ESP8266SdFat/doc/Doxyfile @@ -1,4 +1,4 @@ -# Doxyfile 1.8.14 +# Doxyfile 1.9.6 # This file describes the settings to be used by the documentation system # doxygen (www.doxygen.org) for a project. @@ -12,15 +12,25 @@ # For lists, items can also be appended using: # TAG += value [value, ...] # Values that contain spaces should be placed between quotes (\" \"). +# +# Note: +# +# Use doxygen to compare the used configuration file with the template +# configuration file: +# doxygen -x [configFile] +# Use doxygen to compare the used configuration file with the template +# configuration file without replacing the environment variables or CMake type +# replacement variables: +# doxygen -x_noenv [configFile] #--------------------------------------------------------------------------- # Project related configuration options #--------------------------------------------------------------------------- -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all text -# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv -# built into libc) for the transcoding. See +# This tag specifies the encoding used for all characters in the configuration +# file that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See # https://www.gnu.org/software/libiconv/ for the list of possible encodings. # The default value is: UTF-8. @@ -38,20 +48,20 @@ PROJECT_NAME = SdFat # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = +PROJECT_NUMBER = # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a # quick idea about the purpose of the project. Keep the description short. -PROJECT_BRIEF = +PROJECT_BRIEF = # With the PROJECT_LOGO tag one can specify a logo or an icon that is included # in the documentation. The maximum height of the logo should not exceed 55 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # into which the generated documentation will be written. If a relative path is @@ -60,16 +70,28 @@ PROJECT_LOGO = OUTPUT_DIRECTORY = . -# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- -# directories (in 2 levels) under the output directory of each output format and -# will distribute the generated files over these directories. Enabling this +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096 +# sub-directories (in 2 levels) under the output directory of each output format +# and will distribute the generated files over these directories. Enabling this # option can be useful when feeding doxygen a huge amount of source files, where # putting all generated files in the same directory would otherwise causes -# performance problems for the file system. +# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to +# control the number of sub-directories. # The default value is: NO. CREATE_SUBDIRS = NO +# Controls the number of sub-directories that will be created when +# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every +# level increment doubles the number of directories, resulting in 4096 +# directories at level 8 which is the default and also the maximum value. The +# sub-directories are organized in 2 levels, the first level always has a fixed +# number of 16 directories. +# Minimum value: 0, maximum value: 8, default value: 8. +# This tag requires that the tag CREATE_SUBDIRS is set to YES. + +CREATE_SUBDIRS_LEVEL = 8 + # If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII # characters to appear in the names of generated files. If set to NO, non-ASCII # characters will be escaped, for example _xE3_x81_x84 will be used for Unicode @@ -81,14 +103,14 @@ ALLOW_UNICODE_NAMES = NO # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this # information to generate all constant output in the proper language. -# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, -# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), -# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, -# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), -# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, -# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, -# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, -# Ukrainian and Vietnamese. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian, +# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English +# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek, +# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with +# English messages), Korean, Korean-en (Korean with English messages), Latvian, +# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, +# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, +# Swedish, Turkish, Ukrainian and Vietnamese. # The default value is: English. OUTPUT_LANGUAGE = English @@ -171,7 +193,7 @@ STRIP_FROM_PATH = C:/Users/bill/Documents/ # specify the list of include paths that are normally passed to the compiler # using the -I flag. -STRIP_FROM_INC_PATH = +STRIP_FROM_INC_PATH = # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but # less readable) file names. This can be useful is your file systems doesn't @@ -189,6 +211,16 @@ SHORT_NAMES = NO JAVADOC_AUTOBRIEF = NO +# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line +# such as +# /*************** +# as being the beginning of a Javadoc-style comment "banner". If set to NO, the +# Javadoc-style will behave just like regular comments and it will not be +# interpreted by doxygen. +# The default value is: NO. + +JAVADOC_BANNER = NO + # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # line (until the first dot) of a Qt-style comment as the brief description. If # set to NO, the Qt-style will behave just like regular Qt-style comments (thus @@ -209,6 +241,14 @@ QT_AUTOBRIEF = NO MULTILINE_CPP_IS_BRIEF = NO +# By default Python docstrings are displayed as preformatted text and doxygen's +# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the +# doxygen's special commands can be used and the contents of the docstring +# documentation blocks is shown as doxygen documentation. +# The default value is: YES. + +PYTHON_DOCSTRING = YES + # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # documentation from any documented member that it re-implements. # The default value is: YES. @@ -232,19 +272,18 @@ TAB_SIZE = 8 # the documentation. An alias has the form: # name=value # For example adding -# "sideeffect=@par Side Effects:\n" +# "sideeffect=@par Side Effects:^^" # will allow you to put the command \sideeffect (or @sideeffect) in the # documentation, which will result in a user-defined paragraph with heading -# "Side Effects:". You can put \n's in the value part of an alias to insert -# newlines. +# "Side Effects:". Note that you cannot put \n's in the value part of an alias +# to insert newlines (in the resulting output). You can put ^^ in the value part +# of an alias to insert a newline as if a physical newline was in the original +# file. When you need a literal { or } or , in the value part of an alias you +# have to escape them by means of a backslash (\), this can lead to conflicts +# with the commands \{ and \} for these it is advised to use the version @{ and +# @} or use a double escape (\\{ and \\}) -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name=value". For example adding "class=itcl::class" -# will allow you to use the command class in the itcl::class meaning. - -TCL_SUBST = +ALIASES = # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # only. Doxygen will then generate output that is more tailored for C. For @@ -274,28 +313,40 @@ OPTIMIZE_FOR_FORTRAN = NO OPTIMIZE_OUTPUT_VHDL = NO +# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice +# sources only. Doxygen will then generate output that is more tailored for that +# language. For instance, namespaces will be presented as modules, types will be +# separated into more groups, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_SLICE = NO + # Doxygen selects the parser to use depending on the extension of the files it # parses. With this tag you can assign which parser to use for a given # extension. Doxygen has a built-in mapping, but you can override or extend it # using this tag. The format is ext=language, where ext is a file extension, and -# language is one of the parsers supported by doxygen: IDL, Java, Javascript, -# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: -# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: -# Fortran. In the later case the parser tries to guess whether the code is fixed -# or free formatted code, this is the default for Fortran type files), VHDL. For -# instance to make doxygen treat .inc files as Fortran files (default is PHP), -# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# language is one of the parsers supported by doxygen: IDL, Java, JavaScript, +# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice, +# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: +# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser +# tries to guess whether the code is fixed or free formatted code, this is the +# default for Fortran type files). For instance to make doxygen treat .inc files +# as Fortran files (default is PHP), and .f files as C (default is Fortran), +# use: inc=Fortran f=C. # # Note: For files without extension you can use no_extension as a placeholder. # # Note that for custom extensions you also need to set FILE_PATTERNS otherwise -# the files are not read by doxygen. +# the files are not read by doxygen. When specifying no_extension you should add +# * to the FILE_PATTERNS. +# +# Note see also the list of default file extension mappings. -EXTENSION_MAPPING = +EXTENSION_MAPPING = # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments # according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. +# documentation. See https://daringfireball.net/projects/markdown/ for details. # The output of markdown processing is further processed by doxygen, so you can # mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in # case of backward compatibilities issues. @@ -307,7 +358,7 @@ MARKDOWN_SUPPORT = YES # to that level are automatically included in the table of contents, even if # they do not have an id attribute. # Note: This feature currently applies only to Markdown headings. -# Minimum value: 0, maximum value: 99, default value: 0. +# Minimum value: 0, maximum value: 99, default value: 5. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES. TOC_INCLUDE_HEADINGS = 0 @@ -423,6 +474,19 @@ TYPEDEF_HIDES_STRUCT = NO LOOKUP_CACHE_SIZE = 0 +# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use +# during processing. When set to 0 doxygen will based this on the number of +# cores available in the system. You can set it explicitly to a value larger +# than 0 to get more control over the balance between CPU load and processing +# speed. At this moment only the input processing can be done using multiple +# threads. Since this is still an experimental feature the default is set to 1, +# which effectively disables parallel processing. Please report any issues you +# encounter. Generating dot graphs in parallel is controlled by the +# DOT_NUM_THREADS setting. +# Minimum value: 0, maximum value: 32, default value: 1. + +NUM_PROC_THREADS = 1 + #--------------------------------------------------------------------------- # Build related configuration options #--------------------------------------------------------------------------- @@ -443,6 +507,12 @@ EXTRACT_ALL = NO EXTRACT_PRIVATE = NO +# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual +# methods of a class will be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIV_VIRTUAL = NO + # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # scope will be included in the documentation. # The default value is: NO. @@ -480,6 +550,13 @@ EXTRACT_LOCAL_METHODS = NO EXTRACT_ANON_NSPACES = NO +# If this flag is set to YES, the name of an unnamed parameter in a declaration +# will be determined by the corresponding definition. By default unnamed +# parameters remain unnamed in the output. +# The default value is: YES. + +RESOLVE_UNNAMED_PARAMS = YES + # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # undocumented members inside documented classes or files. If set to NO these # members will be included in the various overviews, but no documentation @@ -491,14 +568,15 @@ HIDE_UNDOC_MEMBERS = NO # If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all # undocumented classes that are normally visible in the class hierarchy. If set # to NO, these classes will be included in the various overviews. This option -# has no effect if EXTRACT_ALL is enabled. +# will also hide undocumented C++ concepts if enabled. This option has no effect +# if EXTRACT_ALL is enabled. # The default value is: NO. HIDE_UNDOC_CLASSES = NO # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend -# (class|struct|union) declarations. If set to NO, these declarations will be -# included in the documentation. +# declarations. If set to NO, these declarations will be included in the +# documentation. # The default value is: NO. HIDE_FRIEND_COMPOUNDS = NO @@ -517,12 +595,20 @@ HIDE_IN_BODY_DOCS = NO INTERNAL_DOCS = NO -# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file -# names in lower-case letters. If set to YES, upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. -# The default value is: system dependent. +# With the correct setting of option CASE_SENSE_NAMES doxygen will better be +# able to match the capabilities of the underlying filesystem. In case the +# filesystem is case sensitive (i.e. it supports files in the same directory +# whose names only differ in casing), the option must be set to YES to properly +# deal with such files in case they appear in the input. For filesystems that +# are not case sensitive the option should be set to NO to properly deal with +# output files written for symbols that only differ in casing, such as for two +# classes, one named CLASS and the other named Class, and to also support +# references to files without having to specify the exact matching casing. On +# Windows (including Cygwin) and MacOS, users should typically set this option +# to NO, whereas on Linux or other Unix flavors it should typically be set to +# YES. +# Possible values are: SYSTEM, NO and YES. +# The default value is: SYSTEM. CASE_SENSE_NAMES = NO @@ -540,6 +626,12 @@ HIDE_SCOPE_NAMES = NO HIDE_COMPOUND_REFERENCE= NO +# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class +# will show which file needs to be included to use the class. +# The default value is: YES. + +SHOW_HEADERFILE = YES + # If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of # the files that are included by a file in the documentation of that file. # The default value is: YES. @@ -648,7 +740,7 @@ GENERATE_DEPRECATEDLIST= YES # sections, marked by \if ... \endif and \cond # ... \endcond blocks. -ENABLED_SECTIONS = +ENABLED_SECTIONS = # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the # initial value of a variable or macro / define can have for it to appear in the @@ -690,20 +782,21 @@ SHOW_NAMESPACES = YES # by doxygen. Whatever the program writes to standard output is used as the file # version. For an example see the documentation. -FILE_VERSION_FILTER = +FILE_VERSION_FILTER = # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed # by doxygen. The layout file controls the global structure of the generated # output files in an output format independent way. To create the layout file # that represents doxygen's defaults, run doxygen with the -l option. You can # optionally specify a file name after the option, if omitted DoxygenLayout.xml -# will be used as the name of the layout file. +# will be used as the name of the layout file. See also section "Changing the +# layout of pages" for information. # # Note that if you run doxygen from a directory containing a file called # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE # tag is left empty. -LAYOUT_FILE = +LAYOUT_FILE = # The CITE_BIB_FILES tag can be used to specify one or more bib files containing # the reference definitions. This must be a list of .bib files. The .bib @@ -713,7 +806,7 @@ LAYOUT_FILE = # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the # search path. See also \cite for info how to create references. -CITE_BIB_FILES = +CITE_BIB_FILES = #--------------------------------------------------------------------------- # Configuration options related to warning and progress messages @@ -743,23 +836,43 @@ WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some parameters -# in a documented function, or documenting parameters that don't exist or using -# markup commands wrongly. +# potential errors in the documentation, such as documenting some parameters in +# a documented function twice, or documenting parameters that don't exist or +# using markup commands wrongly. # The default value is: YES. WARN_IF_DOC_ERROR = YES +# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete +# function parameter documentation. If set to NO, doxygen will accept that some +# parameters have no documentation without warning. +# The default value is: YES. + +WARN_IF_INCOMPLETE_DOC = YES + # This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that # are documented, but have no documentation for their parameters or return -# value. If set to NO, doxygen will only warn about wrong or incomplete -# parameter documentation, but not about the absence of documentation. +# value. If set to NO, doxygen will only warn about wrong parameter +# documentation, but not about the absence of documentation. If EXTRACT_ALL is +# set to YES then this flag will automatically be disabled. See also +# WARN_IF_INCOMPLETE_DOC # The default value is: NO. WARN_NO_PARAMDOC = YES +# If WARN_IF_UNDOC_ENUM_VAL option is set to YES, doxygen will warn about +# undocumented enumeration values. If set to NO, doxygen will accept +# undocumented enumeration values. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: NO. + +WARN_IF_UNDOC_ENUM_VAL = NO + # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when -# a warning is encountered. +# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS +# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but +# at the end of the doxygen process doxygen will return with a non-zero status. +# Possible values are: NO, YES and FAIL_ON_WARNINGS. # The default value is: NO. WARN_AS_ERROR = NO @@ -770,15 +883,29 @@ WARN_AS_ERROR = NO # and the warning text. Optionally the format may contain $version, which will # be replaced by the version of the file (if it could be obtained via # FILE_VERSION_FILTER) +# See also: WARN_LINE_FORMAT # The default value is: $file:$line: $text. WARN_FORMAT = "$file:$line: $text" +# In the $text part of the WARN_FORMAT command it is possible that a reference +# to a more specific place is given. To make it easier to jump to this place +# (outside of doxygen) the user can define a custom "cut" / "paste" string. +# Example: +# WARN_LINE_FORMAT = "'vi $file +$line'" +# See also: WARN_FORMAT +# The default value is: at line $line of file $file. + +WARN_LINE_FORMAT = "at line $line of file $file" + # The WARN_LOGFILE tag can be used to specify a file to which warning and error # messages should be written. If left blank the output is written to standard -# error (stderr). +# error (stderr). In case the file specified cannot be opened for writing the +# warning and error messages are written to standard error. When as file - is +# specified the warning and error messages are written to standard output +# (stdout). -WARN_LOGFILE = +WARN_LOGFILE = #--------------------------------------------------------------------------- # Configuration options related to the input files @@ -804,12 +931,23 @@ INPUT = ../src \ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # libiconv (or the iconv built into libc) for the transcoding. See the libiconv -# documentation (see: https://www.gnu.org/software/libiconv/) for the list of -# possible encodings. +# documentation (see: +# https://www.gnu.org/software/libiconv/) for the list of possible encodings. +# See also: INPUT_FILE_ENCODING # The default value is: UTF-8. INPUT_ENCODING = UTF-8 +# This tag can be used to specify the character encoding of the source files +# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify +# character encoding on a per file pattern basis. Doxygen will compare the file +# name with each pattern and apply the encoding instead of the default +# INPUT_ENCODING) if there is a match. The character encodings are a list of the +# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding +# "INPUT_ENCODING" for further information on supported encodings. + +INPUT_FILE_ENCODING = + # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and # *.h) to filter out the source-files in the directories. @@ -818,11 +956,15 @@ INPUT_ENCODING = UTF-8 # need to set EXTENSION_MAPPING for the extension otherwise the files are not # read by doxygen. # +# Note the list of default checked file patterns might differ from the list of +# default file extension mappings. +# # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, -# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, -# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, -# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf. +# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, +# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C +# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, +# *.vhdl, *.ucf, *.qsf and *.ice. FILE_PATTERNS = *.c \ *.cc \ @@ -890,24 +1032,24 @@ EXCLUDE_SYMLINKS = NO # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names # (namespaces, classes, functions, etc.) that should be excluded from the # output. The symbol name can be a fully qualified name, a word, or if the # wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test +# ANamespace::AClass, ANamespace::*Test # # Note that the wildcards are matched against the file with absolute path, so to # exclude all test directories use the pattern */test/* -EXCLUDE_SYMBOLS = +EXCLUDE_SYMBOLS = # The EXAMPLE_PATH tag can be used to specify one or more files or directories # that contain example code fragments that are included (see the \include # command). -EXAMPLE_PATH = +EXAMPLE_PATH = # If the value of the EXAMPLE_PATH tag contains directories, you can use the # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and @@ -927,7 +1069,7 @@ EXAMPLE_RECURSIVE = NO # that contain images that are to be included in the documentation (see the # \image command). -IMAGE_PATH = +IMAGE_PATH = # The INPUT_FILTER tag can be used to specify a program that doxygen should # invoke to filter for each input file. Doxygen will invoke the filter program @@ -944,11 +1086,16 @@ IMAGE_PATH = # code is scanned, but not when the output code is generated. If lines are added # or removed, the anchors will not be placed correctly. # +# Note that doxygen will use the data processed and written to standard output +# for further processing, therefore nothing else, like debug statements or used +# commands (so in case of a Windows batch file always use @echo OFF), should be +# written to standard output. +# # Note that for custom extensions or not directly supported extensions you also # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -INPUT_FILTER = +INPUT_FILTER = # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern # basis. Doxygen will compare the file name with each pattern and apply the @@ -961,7 +1108,7 @@ INPUT_FILTER = # need to set EXTENSION_MAPPING for the extension otherwise the files are not # properly processed by doxygen. -FILTER_PATTERNS = +FILTER_PATTERNS = # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using # INPUT_FILTER) will also be used to filter the input files that are used for @@ -976,14 +1123,23 @@ FILTER_SOURCE_FILES = NO # *.ext= (so without naming a filter). # This tag requires that the tag FILTER_SOURCE_FILES is set to YES. -FILTER_SOURCE_PATTERNS = +FILTER_SOURCE_PATTERNS = # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that # is part of the input, its contents will be placed on the main page # (index.html). This can be useful if you have a project on for instance GitHub # and want to reuse the introduction page also for the doxygen output. -USE_MDFILE_AS_MAINPAGE = +USE_MDFILE_AS_MAINPAGE = + +# The Fortran standard specifies that for fixed formatted Fortran code all +# characters from position 72 are to be considered as comment. A common +# extension is to allow longer lines before the automatic comment starts. The +# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can +# be processed before the automatic comment starts. +# Minimum value: 7, maximum value: 10000, default value: 72. + +FORTRAN_COMMENT_AFTER = 72 #--------------------------------------------------------------------------- # Configuration options related to source browsing @@ -1012,7 +1168,7 @@ INLINE_SOURCES = NO STRIP_CODE_COMMENTS = YES # If the REFERENCED_BY_RELATION tag is set to YES then for each documented -# function all documented functions referencing it will be listed. +# entity all documented functions referencing it will be listed. # The default value is: NO. REFERENCED_BY_RELATION = NO @@ -1049,7 +1205,7 @@ SOURCE_TOOLTIPS = YES # # To use it do the following: # - Install the latest version of global -# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file # - Make sure the INPUT points to the root of the source tree # - Run doxygen as normal # @@ -1072,34 +1228,44 @@ USE_HTAGS = NO VERBATIM_HEADERS = NO # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the -# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the -# cost of reduced performance. This can be particularly helpful with template -# rich C++ code for which doxygen's built-in parser lacks the necessary type -# information. +# clang parser (see: +# http://clang.llvm.org/) for more accurate parsing at the cost of reduced +# performance. This can be particularly helpful with template rich C++ code for +# which doxygen's built-in parser lacks the necessary type information. # Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. +# generated with the -Duse_libclang=ON option for CMake. # The default value is: NO. CLANG_ASSISTED_PARSING = NO +# If the CLANG_ASSISTED_PARSING tag is set to YES and the CLANG_ADD_INC_PATHS +# tag is set to YES then doxygen will add the directory of each input to the +# include path. +# The default value is: YES. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_ADD_INC_PATHS = YES + # If clang assisted parsing is enabled you can provide the compiler with command # line options that you would normally use when invoking the compiler. Note that # the include paths will already be set by doxygen for the files and directories # specified with INPUT and INCLUDE_PATH. # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. -CLANG_OPTIONS = +CLANG_OPTIONS = # If clang assisted parsing is enabled you can provide the clang parser with the -# path to the compilation database (see: -# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files -# were built. This is equivalent to specifying the "-p" option to a clang tool, -# such as clang-check. These options will then be pased to the parser. +# path to the directory containing a file called compile_commands.json. This +# file is the compilation database (see: +# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the +# options used when the source files were built. This is equivalent to +# specifying the -p option to a clang tool, such as clang-check. These options +# will then be passed to the parser. Any options specified with CLANG_OPTIONS +# will be added as well. # Note: The availability of this option depends on whether or not doxygen was -# generated with the -Duse-libclang=ON option for CMake. -# The default value is: 0. +# generated with the -Duse_libclang=ON option for CMake. -CLANG_COMPILATION_DATABASE_PATH= 0 +CLANG_DATABASE_PATH = #--------------------------------------------------------------------------- # Configuration options related to the alphabetical class index @@ -1112,20 +1278,14 @@ CLANG_COMPILATION_DATABASE_PATH= 0 ALPHABETICAL_INDEX = NO -# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in -# which the alphabetical index list will be split. -# Minimum value: 1, maximum value: 20, default value: 5. +# The IGNORE_PREFIX tag can be used to specify a prefix (or a list of prefixes) +# that should be ignored while generating the index headers. The IGNORE_PREFIX +# tag works for classes, function and member names. The entity will be placed in +# the alphabetical list under the first letter of the entity name that remains +# after removing the prefix. # This tag requires that the tag ALPHABETICAL_INDEX is set to YES. -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all classes will -# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag -# can be used to specify a prefix (or a list of prefixes) that should be ignored -# while generating the index headers. -# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. - -IGNORE_PREFIX = +IGNORE_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the HTML output @@ -1169,7 +1329,7 @@ HTML_FILE_EXTENSION = .html # of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_HEADER = +HTML_HEADER = # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each # generated HTML page. If the tag is left blank doxygen will generate a standard @@ -1179,7 +1339,7 @@ HTML_HEADER = # that doxygen normally uses. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_FOOTER = +HTML_FOOTER = # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style # sheet that is used by each HTML page. It can be used to fine-tune the look of @@ -1191,7 +1351,7 @@ HTML_FOOTER = # obsolete. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_STYLESHEET = +HTML_STYLESHEET = # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined # cascading style sheets that are included after the standard style sheets @@ -1201,10 +1361,15 @@ HTML_STYLESHEET = # Doxygen will copy the style sheet files to the output directory. # Note: The order of the extra style sheet files is of importance (e.g. the last # style sheet in the list overrules the setting of the previous ones in the -# list). For an example see the documentation. +# list). +# Note: Since the styling of scrollbars can currently not be overruled in +# Webkit/Chromium, the styling will be left out of the default doxygen.css if +# one or more extra stylesheets have been specified. So if scrollbar +# customization is desired it has to be added explicitly. For an example see the +# documentation. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_STYLESHEET = +HTML_EXTRA_STYLESHEET = # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the HTML output directory. Note @@ -1214,11 +1379,24 @@ HTML_EXTRA_STYLESHEET = # files will be copied as-is; there are no commands or markers available. # This tag requires that the tag GENERATE_HTML is set to YES. -HTML_EXTRA_FILES = +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output +# should be rendered with a dark or light theme. +# Possible values are: LIGHT always generate light mode output, DARK always +# generate dark mode output, AUTO_LIGHT automatically set the mode according to +# the user preference, use light mode if no preference is set (the default), +# AUTO_DARK automatically set the mode according to the user preference, use +# dark mode if no preference is set and TOGGLE allow to user to switch between +# light and dark mode via a button. +# The default value is: AUTO_LIGHT. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE = AUTO_LIGHT # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen # will adjust the colors in the style sheet and background images according to -# this color. Hue is specified as an angle on a colorwheel, see +# this color. Hue is specified as an angle on a color-wheel, see # https://en.wikipedia.org/wiki/Hue for more information. For instance the value # 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 # purple, and 360 is red again. @@ -1228,7 +1406,7 @@ HTML_EXTRA_FILES = HTML_COLORSTYLE_HUE = 220 # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors -# in the HTML output. For a value of 0 the output will use grayscales only. A +# in the HTML output. For a value of 0 the output will use gray-scales only. A # value of 255 will produce the most vivid colors. # Minimum value: 0, maximum value: 255, default value: 100. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1257,9 +1435,9 @@ HTML_TIMESTAMP = YES # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # documentation will contain a main index with vertical navigation menus that -# are dynamically created via Javascript. If disabled, the navigation index will +# are dynamically created via JavaScript. If disabled, the navigation index will # consists of multiple levels of tabs that are statically embedded in every HTML -# page. Disable this option to support browsers that do not have Javascript, +# page. Disable this option to support browsers that do not have JavaScript, # like the Qt help browser. # The default value is: YES. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1289,13 +1467,14 @@ HTML_INDEX_NUM_ENTRIES = 100 # If the GENERATE_DOCSET tag is set to YES, additional index files will be # generated that can be used as input for Apple's Xcode 3 integrated development -# environment (see: https://developer.apple.com/tools/xcode/), introduced with -# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a -# Makefile in the HTML output directory. Running make will produce the docset in -# that directory and running make install will install the docset in +# environment (see: +# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To +# create a documentation set, doxygen will generate a Makefile in the HTML +# output directory. Running make will produce the docset in that directory and +# running make install will install the docset in # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at -# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. +# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy +# genXcode/_index.html for more information. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. @@ -1309,6 +1488,13 @@ GENERATE_DOCSET = NO DOCSET_FEEDNAME = "Doxygen generated docs" +# This tag determines the URL of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDURL = + # This tag specifies a string that should uniquely identify the documentation # set bundle. This should be a reverse domain-name style string, e.g. # com.mycompany.MyDocSet. Doxygen will append .docset to the name. @@ -1334,8 +1520,12 @@ DOCSET_PUBLISHER_NAME = Publisher # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # additional HTML index files: index.hhp, index.hhc, and index.hhk. The # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop -# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on -# Windows. +# on Windows. In the beginning of 2021 Microsoft took the original page, with +# a.o. the download links, offline the HTML help workshop was already many years +# in maintenance mode). You can download the HTML help workshop from the web +# archives at Installation executable (see: +# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo +# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe). # # The HTML Help Workshop contains a compiler that can convert all HTML output # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML @@ -1354,7 +1544,7 @@ GENERATE_HTMLHELP = NO # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = +CHM_FILE = # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler (hhc.exe). If non-empty, @@ -1362,10 +1552,10 @@ CHM_FILE = # The file has to be specified with full path. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -HHC_LOCATION = +HHC_LOCATION = # The GENERATE_CHI flag controls if a separate .chi index file is generated -# (YES) or that it should be included in the master .chm file (NO). +# (YES) or that it should be included in the main .chm file (NO). # The default value is: NO. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. @@ -1375,7 +1565,7 @@ GENERATE_CHI = NO # and project file content. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_INDEX_ENCODING = +CHM_INDEX_ENCODING = # The BINARY_TOC flag controls whether a binary table of contents is generated # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it @@ -1406,11 +1596,12 @@ GENERATE_QHP = NO # the HTML output folder. # This tag requires that the tag GENERATE_QHP is set to YES. -QCH_FILE = +QCH_FILE = # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # Project output. For more information please see Qt Help Project / Namespace -# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace). +# (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # The default value is: org.doxygen.Project. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1418,7 +1609,8 @@ QHP_NAMESPACE = org.doxygen.Project # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # Help Project output. For more information please see Qt Help Project / Virtual -# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders). +# Folders (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders). # The default value is: doc. # This tag requires that the tag GENERATE_QHP is set to YES. @@ -1426,31 +1618,33 @@ QHP_VIRTUAL_FOLDER = doc # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_NAME = # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # custom filter to add. For more information please see Qt Help Project / Custom -# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters). +# Filters (see: +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_CUST_FILTER_ATTRS = +QHP_CUST_FILTER_ATTRS = # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # project's filter section matches. Qt Help Project / Filter Attributes (see: -# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes). +# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # This tag requires that the tag GENERATE_QHP is set to YES. -QHP_SECT_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = -# The QHG_LOCATION tag can be used to specify the location of Qt's -# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the -# generated .qhp file. +# The QHG_LOCATION tag can be used to specify the location (absolute path +# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to +# run qhelpgenerator on the generated .qhp file. # This tag requires that the tag GENERATE_QHP is set to YES. -QHG_LOCATION = +QHG_LOCATION = # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be # generated, together with the HTML files, they form an Eclipse help plugin. To @@ -1490,16 +1684,28 @@ DISABLE_INDEX = NO # to work a browser that supports JavaScript, DHTML, CSS and frames is required # (i.e. any modern browser). Windows users are probably better off using the # HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can -# further fine-tune the look of the index. As an example, the default style -# sheet generated by doxygen has an example that shows how to put an image at -# the root of the tree instead of the PROJECT_NAME. Since the tree basically has -# the same information as the tab index, you could consider setting -# DISABLE_INDEX to YES when enabling this option. +# further fine tune the look of the index (see "Fine-tuning the output"). As an +# example, the default style sheet generated by doxygen has an example that +# shows how to put an image at the root of the tree instead of the PROJECT_NAME. +# Since the tree basically has the same information as the tab index, you could +# consider setting DISABLE_INDEX to YES when enabling this option. # The default value is: NO. # This tag requires that the tag GENERATE_HTML is set to YES. GENERATE_TREEVIEW = NO +# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the +# FULL_SIDEBAR option determines if the side bar is limited to only the treeview +# area (value NO) or if it should extend to the full height of the window (value +# YES). Setting this to YES gives a layout similar to +# https://docs.readthedocs.io with more room for contents, but less room for the +# project logo, title, and description. If either GENERATE_TREEVIEW or +# DISABLE_INDEX is set to NO, this option has no effect. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FULL_SIDEBAR = NO + # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # doxygen will group on one line in the generated HTML documentation. # @@ -1524,6 +1730,24 @@ TREEVIEW_WIDTH = 250 EXT_LINKS_IN_WINDOW = NO +# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email +# addresses. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +OBFUSCATE_EMAILS = YES + +# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg +# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see +# https://inkscape.org) to generate formulas as SVG images instead of PNGs for +# the HTML output. These images will generally look nicer at scaled resolutions. +# Possible values are: png (the default) and svg (looks nicer but requires the +# pdf2svg or inkscape tool). +# The default value is: png. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FORMULA_FORMAT = png + # Use this tag to change the font size of LaTeX formulas included as images in # the HTML documentation. When you change the font size after a successful # doxygen run you need to manually remove any form_*.png images from the HTML @@ -1533,19 +1757,14 @@ EXT_LINKS_IN_WINDOW = NO FORMULA_FONTSIZE = 10 -# Use the FORMULA_TRANSPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are not -# supported properly for IE 6.0, but are supported on all modern browsers. -# -# Note that when changing this option you need to delete any form_*.png files in -# the HTML output directory before the changes have effect. -# The default value is: YES. -# This tag requires that the tag GENERATE_HTML is set to YES. +# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands +# to create new LaTeX commands to be used in formulas as building blocks. See +# the section "Including formulas" for details. -FORMULA_TRANSPARENT = YES +FORMULA_MACROFILE = # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see -# https://www.mathjax.org) which uses client side Javascript for the rendering +# https://www.mathjax.org) which uses client side JavaScript for the rendering # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # installed or if you want to formulas look prettier in the HTML output. When # enabled you may also need to install MathJax separately and configure the path @@ -1555,11 +1774,29 @@ FORMULA_TRANSPARENT = YES USE_MATHJAX = NO +# With MATHJAX_VERSION it is possible to specify the MathJax version to be used. +# Note that the different versions of MathJax have different requirements with +# regards to the different settings, so it is possible that also other MathJax +# settings have to be changed when switching between the different MathJax +# versions. +# Possible values are: MathJax_2 and MathJax_3. +# The default value is: MathJax_2. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_VERSION = MathJax_2 + # When MathJax is enabled you can set the default output format to be used for -# the MathJax output. See the MathJax site (see: -# http://docs.mathjax.org/en/latest/output.html) for more details. +# the MathJax output. For more details about the output format see MathJax +# version 2 (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3 +# (see: +# http://docs.mathjax.org/en/latest/web/components/output.html). # Possible values are: HTML-CSS (which is slower, but has the best -# compatibility), NativeMML (i.e. MathML) and SVG. +# compatibility. This is the name for Mathjax version 2, for MathJax version 3 +# this will be translated into chtml), NativeMML (i.e. MathML. Only supported +# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This +# is the name for Mathjax version 3, for MathJax version 2 this will be +# translated into HTML-CSS) and SVG. # The default value is: HTML-CSS. # This tag requires that the tag USE_MATHJAX is set to YES. @@ -1572,26 +1809,33 @@ MATHJAX_FORMAT = HTML-CSS # MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax # Content Delivery Network so you can quickly see the result without installing # MathJax. However, it is strongly recommended to install a local copy of -# MathJax from https://www.mathjax.org before deployment. -# The default value is: http://cdn.mathjax.org/mathjax/latest. +# MathJax from https://www.mathjax.org before deployment. The default value is: +# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2 +# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3 # This tag requires that the tag USE_MATHJAX is set to YES. MATHJAX_RELPATH = http://www.mathjax.org/mathjax # The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax # extension names that should be enabled during MathJax rendering. For example +# for MathJax version 2 (see +# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions): # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# For example for MathJax version 3 (see +# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html): +# MATHJAX_EXTENSIONS = ams # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_EXTENSIONS = +MATHJAX_EXTENSIONS = # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # of code that will be used on startup of the MathJax code. See the MathJax site -# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# (see: +# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an # example see the documentation. # This tag requires that the tag USE_MATHJAX is set to YES. -MATHJAX_CODEFILE = +MATHJAX_CODEFILE = # When the SEARCHENGINE tag is enabled doxygen will generate a search box for # the HTML output. The underlying search engine uses javascript and DHTML and @@ -1615,7 +1859,7 @@ MATHJAX_CODEFILE = SEARCHENGINE = YES # When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. There +# implemented using a web server instead of a web client using JavaScript. There # are two flavors of web server based searching depending on the EXTERNAL_SEARCH # setting. When disabled, doxygen will generate a PHP script for searching and # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing @@ -1634,7 +1878,8 @@ SERVER_BASED_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). +# Xapian (see: +# https://xapian.org/). # # See the section "External Indexing and Searching" for details. # The default value is: NO. @@ -1647,11 +1892,12 @@ EXTERNAL_SEARCH = NO # # Doxygen ships with an example indexer (doxyindexer) and search engine # (doxysearch.cgi) which are based on the open source search engine library -# Xapian (see: https://xapian.org/). See the section "External Indexing and -# Searching" for details. +# Xapian (see: +# https://xapian.org/). See the section "External Indexing and Searching" for +# details. # This tag requires that the tag SEARCHENGINE is set to YES. -SEARCHENGINE_URL = +SEARCHENGINE_URL = # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed # search data is written to a file for indexing by an external tool. With the @@ -1667,7 +1913,7 @@ SEARCHDATA_FILE = searchdata.xml # projects and redirect the results back to the right project. # This tag requires that the tag SEARCHENGINE is set to YES. -EXTERNAL_SEARCH_ID = +EXTERNAL_SEARCH_ID = # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen # projects other than the one defined by this configuration file, but that are @@ -1677,7 +1923,7 @@ EXTERNAL_SEARCH_ID = # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... # This tag requires that the tag SEARCHENGINE is set to YES. -EXTRA_SEARCH_MAPPINGS = +EXTRA_SEARCH_MAPPINGS = #--------------------------------------------------------------------------- # Configuration options related to the LaTeX output @@ -1699,21 +1945,35 @@ LATEX_OUTPUT = latex # The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be # invoked. # -# Note that when enabling USE_PDFLATEX this option is only used for generating -# bitmaps for formulas in the HTML output, but not in the Makefile that is -# written to the output directory. -# The default file is: latex. +# Note that when not enabling USE_PDFLATEX the default is latex when enabling +# USE_PDFLATEX the default is pdflatex and when in the later case latex is +# chosen this is overwritten by pdflatex. For specific output languages the +# default can have been set differently, this depends on the implementation of +# the output language. # This tag requires that the tag GENERATE_LATEX is set to YES. LATEX_CMD_NAME = latex # The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate # index for LaTeX. +# Note: This tag is used in the Makefile / make.bat. +# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file +# (.tex). # The default file is: makeindex. # This tag requires that the tag GENERATE_LATEX is set to YES. MAKEINDEX_CMD_NAME = makeindex +# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to +# generate index for LaTeX. In case there is no backslash (\) as first character +# it will be automatically added in the LaTeX code. +# Note: This tag is used in the generated output file (.tex). +# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. +# The default value is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_MAKEINDEX_CMD = makeindex + # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # documents. This may be useful for small projects and may help to save some # trees in general. @@ -1729,7 +1989,7 @@ COMPACT_LATEX = NO # The default value is: a4. # This tag requires that the tag GENERATE_LATEX is set to YES. -PAPER_TYPE = a4wide +PAPER_TYPE = a4 # The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names # that should be included in the LaTeX output. The package can be specified just @@ -1741,34 +2001,36 @@ PAPER_TYPE = a4wide # If left blank no extra packages will be included. # This tag requires that the tag GENERATE_LATEX is set to YES. -EXTRA_PACKAGES = +EXTRA_PACKAGES = -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the -# generated LaTeX document. The header should contain everything until the first -# chapter. If it is left blank doxygen will generate a standard header. See -# section "Doxygen usage" for information on how to let doxygen write the -# default header to a separate file. +# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for +# the generated LaTeX document. The header should contain everything until the +# first chapter. If it is left blank doxygen will generate a standard header. It +# is highly recommended to start with a default header using +# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty +# and then modify the file new_header.tex. See also section "Doxygen usage" for +# information on how to generate the default header that doxygen normally uses. # -# Note: Only use a user-defined header if you know what you are doing! The -# following commands have a special meaning inside the header: $title, -# $datetime, $date, $doxygenversion, $projectname, $projectnumber, -# $projectbrief, $projectlogo. Doxygen will replace $title with the empty -# string, for the replacement values of the other commands the user is referred -# to HTML_HEADER. +# Note: Only use a user-defined header if you know what you are doing! +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. The following +# commands have a special meaning inside the header (and footer): For a +# description of the possible markers and block names see the documentation. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_HEADER = +LATEX_HEADER = -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the -# generated LaTeX document. The footer should contain everything after the last -# chapter. If it is left blank doxygen will generate a standard footer. See +# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for +# the generated LaTeX document. The footer should contain everything after the +# last chapter. If it is left blank doxygen will generate a standard footer. See # LATEX_HEADER for more information on how to generate a default footer and what -# special commands can be used inside the footer. -# -# Note: Only use a user-defined footer if you know what you are doing! +# special commands can be used inside the footer. See also section "Doxygen +# usage" for information on how to generate the default footer that doxygen +# normally uses. Note: Only use a user-defined footer if you know what you are +# doing! # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_FOOTER = +LATEX_FOOTER = # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined # LaTeX style sheets that are included after the standard style sheets created @@ -1779,7 +2041,7 @@ LATEX_FOOTER = # list). # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_STYLESHEET = +LATEX_EXTRA_STYLESHEET = # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or # other source files which should be copied to the LATEX_OUTPUT output @@ -1787,7 +2049,7 @@ LATEX_EXTRA_STYLESHEET = # markers available. # This tag requires that the tag GENERATE_LATEX is set to YES. -LATEX_EXTRA_FILES = +LATEX_EXTRA_FILES = # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will @@ -1798,9 +2060,11 @@ LATEX_EXTRA_FILES = PDF_HYPERLINKS = YES -# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate -# the PDF file directly from the LaTeX files. Set this option to YES, to get a -# higher quality PDF documentation. +# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as +# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX +# files. Set this option to YES, to get a higher quality PDF documentation. +# +# See also section LATEX_CMD_NAME for selecting the engine. # The default value is: YES. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1808,8 +2072,7 @@ USE_PDFLATEX = YES # If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode # command to the generated LaTeX files. This will instruct LaTeX to keep running -# if errors occur, instead of asking the user for help. This option is also used -# when generating formulas in HTML. +# if errors occur, instead of asking the user for help. # The default value is: NO. # This tag requires that the tag GENERATE_LATEX is set to YES. @@ -1822,16 +2085,6 @@ LATEX_BATCHMODE = NO LATEX_HIDE_INDICES = NO -# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source -# code with syntax highlighting in the LaTeX output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_LATEX is set to YES. - -LATEX_SOURCE_CODE = NO - # The LATEX_BIB_STYLE tag can be used to specify the style to use for the # bibliography, e.g. plainnat, or ieeetr. See # https://en.wikipedia.org/wiki/BibTeX and \cite for more info. @@ -1848,6 +2101,14 @@ LATEX_BIB_STYLE = plain LATEX_TIMESTAMP = NO +# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) +# path from which the emoji images will be read. If a relative path is entered, +# it will be relative to the LATEX_OUTPUT directory. If left blank the +# LATEX_OUTPUT directory will be used. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EMOJI_DIRECTORY = + #--------------------------------------------------------------------------- # Configuration options related to the RTF output #--------------------------------------------------------------------------- @@ -1887,9 +2148,9 @@ COMPACT_RTF = NO RTF_HYPERLINKS = YES -# Load stylesheet definitions from file. Syntax is similar to doxygen's config -# file, i.e. a series of assignments. You only have to provide replacements, -# missing definitions are set to their default value. +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# configuration file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. # # See also section "Doxygen usage" for information on how to generate the # default style sheet that doxygen normally uses. @@ -1898,21 +2159,11 @@ RTF_HYPERLINKS = YES RTF_STYLESHEET_FILE = rtfstyle.cfg # Set optional variables used in the generation of an RTF document. Syntax is -# similar to doxygen's config file. A template extensions file can be generated -# using doxygen -e rtf extensionFile. +# similar to doxygen's configuration file. A template extensions file can be +# generated using doxygen -e rtf extensionFile. # This tag requires that the tag GENERATE_RTF is set to YES. -RTF_EXTENSIONS_FILE = - -# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code -# with syntax highlighting in the RTF output. -# -# Note that which sources are shown also depends on other settings such as -# SOURCE_BROWSER. -# The default value is: NO. -# This tag requires that the tag GENERATE_RTF is set to YES. - -RTF_SOURCE_CODE = NO +RTF_EXTENSIONS_FILE = #--------------------------------------------------------------------------- # Configuration options related to the man page output @@ -1947,7 +2198,7 @@ MAN_EXTENSION = .3 # MAN_EXTENSION with the initial . removed. # This tag requires that the tag GENERATE_MAN is set to YES. -MAN_SUBDIR = +MAN_SUBDIR = # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it # will generate one additional man file for each entity documented in the real @@ -1985,6 +2236,13 @@ XML_OUTPUT = xml XML_PROGRAMLISTING = YES +# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include +# namespace members in file scope as well, matching the HTML output. +# The default value is: NO. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_NS_MEMB_FILE_SCOPE = NO + #--------------------------------------------------------------------------- # Configuration options related to the DOCBOOK output #--------------------------------------------------------------------------- @@ -2003,15 +2261,6 @@ GENERATE_DOCBOOK = NO DOCBOOK_OUTPUT = docbook -# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the -# program listings (including syntax highlighting and cross-referencing -# information) to the DOCBOOK output. Note that enabling this will significantly -# increase the size of the DOCBOOK output. -# The default value is: NO. -# This tag requires that the tag GENERATE_DOCBOOK is set to YES. - -DOCBOOK_PROGRAMLISTING = NO - #--------------------------------------------------------------------------- # Configuration options for the AutoGen Definitions output #--------------------------------------------------------------------------- @@ -2024,6 +2273,10 @@ DOCBOOK_PROGRAMLISTING = NO GENERATE_AUTOGEN_DEF = NO +#--------------------------------------------------------------------------- +# Configuration options related to Sqlite3 output +#--------------------------------------------------------------------------- + #--------------------------------------------------------------------------- # Configuration options related to the Perl module output #--------------------------------------------------------------------------- @@ -2060,7 +2313,7 @@ PERLMOD_PRETTY = YES # overwrite each other's variables. # This tag requires that the tag GENERATE_PERLMOD is set to YES. -PERLMOD_MAKEVAR_PREFIX = +PERLMOD_MAKEVAR_PREFIX = #--------------------------------------------------------------------------- # Configuration options related to the preprocessor @@ -2098,10 +2351,11 @@ SEARCH_INCLUDES = YES # The INCLUDE_PATH tag can be used to specify one or more directories that # contain include files that are not input files but should be processed by the -# preprocessor. +# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of +# RECURSIVE has no effect here. # This tag requires that the tag SEARCH_INCLUDES is set to YES. -INCLUDE_PATH = +INCLUDE_PATH = # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard # patterns (like *.h and *.hpp) to filter out the header-files in the @@ -2109,7 +2363,7 @@ INCLUDE_PATH = # used. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -INCLUDE_FILE_PATTERNS = +INCLUDE_FILE_PATTERNS = # The PREDEFINED tag can be used to specify one or more macro names that are # defined before the preprocessor is started (similar to the -D option of e.g. @@ -2132,7 +2386,7 @@ PREDEFINED = __attribute__(x)= \ # definition found in the source code. # This tag requires that the tag ENABLE_PREPROCESSING is set to YES. -EXPAND_AS_DEFINED = +EXPAND_AS_DEFINED = # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will # remove all references to function-like macros that are alone on a line, have @@ -2161,13 +2415,13 @@ SKIP_FUNCTION_MACROS = YES # the path). If a tag file is not located in the directory in which doxygen is # run, you must also specify the path to the tagfile here. -TAGFILES = +TAGFILES = # When a file name is specified after GENERATE_TAGFILE, doxygen will create a # tag file that is based on the input files it reads. See section "Linking to # external documentation" for more information about the usage of tag files. -GENERATE_TAGFILE = +GENERATE_TAGFILE = # If the ALLEXTERNALS tag is set to YES, all external class will be listed in # the class index. If set to NO, only the inherited external classes will be @@ -2190,40 +2444,16 @@ EXTERNAL_GROUPS = YES EXTERNAL_PAGES = YES -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of 'which perl'). -# The default file (with absolute path) is: /usr/bin/perl. - -PERL_PATH = /usr/bin/perl - #--------------------------------------------------------------------------- # Configuration options related to the dot tool #--------------------------------------------------------------------------- -# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram -# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to -# NO turns the diagrams off. Note that this option also works with HAVE_DOT -# disabled, but it is recommended to install and use dot, since it yields more -# powerful graphs. -# The default value is: YES. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see: -# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - # You can include diagrams made with dia in doxygen documentation. Doxygen will # then run dia to produce the diagram and insert it in the documentation. The # DIA_PATH tag allows you to specify the directory where the dia binary resides. # If left empty dia is assumed to be found in the default search path. -DIA_PATH = +DIA_PATH = # If set to YES the inheritance and collaboration graphs will hide inheritance # and usage relations if the target is undocumented or is not a class. @@ -2250,35 +2480,50 @@ HAVE_DOT = YES DOT_NUM_THREADS = 0 -# When you want a differently looking font in the dot files that doxygen -# generates you can specify the font name using DOT_FONTNAME. You need to make -# sure dot is able to find the font, which can be done by putting it in a -# standard location or by setting the DOTFONTPATH environment variable or by -# setting DOT_FONTPATH to the directory containing the font. -# The default value is: Helvetica. +# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of +# subgraphs. When you want a differently looking font in the dot files that +# doxygen generates you can specify fontname, fontcolor and fontsize attributes. +# For details please see Node, +# Edge and Graph Attributes specification You need to make sure dot is able +# to find the font, which can be done by putting it in a standard location or by +# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the +# directory containing the font. Default graphviz fontsize is 14. +# The default value is: fontname=Helvetica,fontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTNAME = Helvetica +DOT_COMMON_ATTR = "fontname=Helvetica,fontsize=10" -# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of -# dot graphs. -# Minimum value: 4, maximum value: 24, default value: 10. +# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can +# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. Complete documentation about +# arrows shapes. +# The default value is: labelfontname=Helvetica,labelfontsize=10. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTSIZE = 10 +DOT_EDGE_ATTR = "labelfontname=Helvetica,labelfontsize=10" -# By default doxygen will tell dot to use the default font as specified with -# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set -# the path where dot can find it using this tag. +# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes +# around nodes set 'shape=plain' or 'shape=plaintext' Shapes specification +# The default value is: shape=box,height=0.2,width=0.4. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_FONTPATH = +DOT_NODE_ATTR = "shape=box,height=0.2,width=0.4" -# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for -# each documented class showing the direct and indirect inheritance relations. -# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# You can set the path where dot can find font specified with fontname in +# DOT_COMMON_ATTR and others dot attributes. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH = + +# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a +# graph for each documented class showing the direct and indirect inheritance +# relations. In case HAVE_DOT is set as well dot will be used to draw the graph, +# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set +# to TEXT the direct and indirect inheritance relations will be shown as texts / +# links. +# Possible values are: NO, YES, TEXT and GRAPH. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. CLASS_GRAPH = YES @@ -2292,7 +2537,8 @@ CLASS_GRAPH = YES COLLABORATION_GRAPH = YES # If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for -# groups, showing the direct groups dependencies. +# groups, showing the direct groups dependencies. See also the chapter Grouping +# in the manual. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. @@ -2315,10 +2561,32 @@ UML_LOOK = NO # but if the number exceeds 15, the total amount of fields shown is limited to # 10. # Minimum value: 0, maximum value: 100, default value: 10. -# This tag requires that the tag HAVE_DOT is set to YES. +# This tag requires that the tag UML_LOOK is set to YES. UML_LIMIT_NUM_FIELDS = 10 +# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and +# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS +# tag is set to YES, doxygen will add type and arguments for attributes and +# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen +# will not generate fields with class member information in the UML graphs. The +# class diagrams will look similar to the default class diagrams but using UML +# notation for the relationships. +# Possible values are: NO, YES and NONE. +# The default value is: NO. +# This tag requires that the tag UML_LOOK is set to YES. + +DOT_UML_DETAILS = NO + +# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters +# to display on a single line. If the actual line length exceeds this threshold +# significantly it will wrapped across multiple lines. Some heuristics are apply +# to avoid ugly line breaks. +# Minimum value: 0, maximum value: 1000, default value: 17. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_WRAP_THRESHOLD = 17 + # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # collaboration graphs will show the relations between templates and their # instances. @@ -2385,6 +2653,13 @@ GRAPHICAL_HIERARCHY = YES DIRECTORY_GRAPH = YES +# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels +# of child directories generated in directory dependency graphs by dot. +# Minimum value: 1, maximum value: 25, default value: 1. +# This tag requires that the tag DIRECTORY_GRAPH is set to YES. + +DIR_GRAPH_MAX_DEPTH = 1 + # The DOT_IMAGE_FORMAT tag can be used to set the image format of the images # generated by dot. For an explanation of the image formats see the section # output formats in the documentation of the dot tool (Graphviz (see: @@ -2416,44 +2691,44 @@ INTERACTIVE_SVG = NO # found. If left blank, it is assumed the dot tool can be found in the path. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_PATH = +DOT_PATH = # The DOTFILE_DIRS tag can be used to specify one or more directories that # contain dot files that are included in the documentation (see the \dotfile # command). # This tag requires that the tag HAVE_DOT is set to YES. -DOTFILE_DIRS = +DOTFILE_DIRS = # The MSCFILE_DIRS tag can be used to specify one or more directories that # contain msc files that are included in the documentation (see the \mscfile # command). -MSCFILE_DIRS = +MSCFILE_DIRS = # The DIAFILE_DIRS tag can be used to specify one or more directories that # contain dia files that are included in the documentation (see the \diafile # command). -DIAFILE_DIRS = +DIAFILE_DIRS = # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the -# path where java can find the plantuml.jar file. If left blank, it is assumed -# PlantUML is not used or called during a preprocessing step. Doxygen will -# generate a warning when it encounters a \startuml command in this case and -# will not generate output for the diagram. +# path where java can find the plantuml.jar file or to the filename of jar file +# to be used. If left blank, it is assumed PlantUML is not used or called during +# a preprocessing step. Doxygen will generate a warning when it encounters a +# \startuml command in this case and will not generate output for the diagram. -PLANTUML_JAR_PATH = +PLANTUML_JAR_PATH = # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a # configuration file for plantuml. -PLANTUML_CFG_FILE = +PLANTUML_CFG_FILE = # When using plantuml, the specified paths are searched for files specified by # the !include statement in a plantuml block. -PLANTUML_INCLUDE_PATH = +PLANTUML_INCLUDE_PATH = # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes # that will be shown in the graph. If the number of nodes in a graph becomes @@ -2479,18 +2754,6 @@ DOT_GRAPH_MAX_NODES = 50 MAX_DOT_GRAPH_DEPTH = 1000 -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not seem -# to support this out of the box. -# -# Warning: Depending on the platform used, enabling this option may lead to -# badly anti-aliased labels on the edges of a graph (i.e. they become hard to -# read). -# The default value is: NO. -# This tag requires that the tag HAVE_DOT is set to YES. - -DOT_TRANSPARENT = YES - # Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output # files in one run (i.e. multiple -o and -T options on the command line). This # makes dot run faster, but since only newer versions of dot (>1.8.10) support @@ -2503,14 +2766,18 @@ DOT_MULTI_TARGETS = NO # If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page # explaining the meaning of the various boxes and arrows in the dot generated # graphs. +# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal +# graphical representation for inheritance and collaboration diagrams is used. # The default value is: YES. # This tag requires that the tag HAVE_DOT is set to YES. GENERATE_LEGEND = YES -# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate # files that are used to generate the various graphs. +# +# Note: This setting is not only used for dot files but also for msc temporary +# files. # The default value is: YES. -# This tag requires that the tag HAVE_DOT is set to YES. DOT_CLEANUP = YES diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/SdErrorCodes.txt b/extra-libraries/ESP8266/ESP8266SdFat/doc/SdErrorCodes.txt index 133c0a2b..91802597 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/SdErrorCodes.txt +++ b/extra-libraries/ESP8266/ESP8266SdFat/doc/SdErrorCodes.txt @@ -1,8 +1,7 @@ -2019-12-10 +2022-07-01 Run the SdErrorCode example to produce an updated list. -C Code,Symbol - failed operation 0X00,SD_CARD_ERROR_NONE - No error 0X01,SD_CARD_ERROR_CMD0 - Card reset failed @@ -28,23 +27,25 @@ Code,Symbol - failed operation 0X15,SD_CARD_ERROR_ACMD13 - Read extended status 0X16,SD_CARD_ERROR_ACMD23 - Set pre-erased count 0X17,SD_CARD_ERROR_ACMD41 - Activate card initialization -0X18,SD_CARD_ERROR_READ_TOKEN - Bad read data token -0X19,SD_CARD_ERROR_READ_CRC - Read CRC error -0X1A,SD_CARD_ERROR_READ_FIFO - SDIO fifo read timeout -0X1B,SD_CARD_ERROR_READ_REG - Read CID or CSD failed. -0X1C,SD_CARD_ERROR_READ_START - Bad readStart argument -0X1D,SD_CARD_ERROR_READ_TIMEOUT - Read data timeout -0X1E,SD_CARD_ERROR_STOP_TRAN - Multiple block stop failed -0X1F,SD_CARD_ERROR_WRITE_DATA - Write data not accepted -0X20,SD_CARD_ERROR_WRITE_FIFO - SDIO fifo write timeout -0X21,SD_CARD_ERROR_WRITE_START - Bad writeStart argument -0X22,SD_CARD_ERROR_WRITE_PROGRAMMING - Flash programming -0X23,SD_CARD_ERROR_WRITE_TIMEOUT - Write timeout -0X24,SD_CARD_ERROR_DMA - DMA transfer failed -0X25,SD_CARD_ERROR_ERASE - Card did not accept erase commands -0X26,SD_CARD_ERROR_ERASE_SINGLE_SECTOR - Card does not support erase -0X27,SD_CARD_ERROR_ERASE_TIMEOUT - Erase command timeout -0X28,SD_CARD_ERROR_INIT_NOT_CALLED - Card has not been initialized -0X29,SD_CARD_ERROR_INVALID_CARD_CONFIG - Invalid card config -0X2A,SD_CARD_ERROR_FUNCTION_NOT_SUPPORTED - Unsupported SDIO command -0X2B,SD_CARD_ERROR_UNKNOWN - Unknown error +0X18,SD_CARD_ERROR_ACMD51 - Read SCR data +0X19,SD_CARD_ERROR_READ_TOKEN - Bad read data token +0X1A,SD_CARD_ERROR_READ_CRC - Read CRC error +0X1B,SD_CARD_ERROR_READ_FIFO - SDIO fifo read timeout +0X1C,SD_CARD_ERROR_READ_REG - Read CID or CSD failed. +0X1D,SD_CARD_ERROR_READ_START - Bad readStart argument +0X1E,SD_CARD_ERROR_READ_TIMEOUT - Read data timeout +0X1F,SD_CARD_ERROR_STOP_TRAN - Multiple block stop failed +0X20,SD_CARD_ERROR_TRANSFER_COMPLETE - SDIO transfer complete +0X21,SD_CARD_ERROR_WRITE_DATA - Write data not accepted +0X22,SD_CARD_ERROR_WRITE_FIFO - SDIO fifo write timeout +0X23,SD_CARD_ERROR_WRITE_START - Bad writeStart argument +0X24,SD_CARD_ERROR_WRITE_PROGRAMMING - Flash programming +0X25,SD_CARD_ERROR_WRITE_TIMEOUT - Write timeout +0X26,SD_CARD_ERROR_DMA - DMA transfer failed +0X27,SD_CARD_ERROR_ERASE - Card did not accept erase commands +0X28,SD_CARD_ERROR_ERASE_SINGLE_SECTOR - Card does not support erase +0X29,SD_CARD_ERROR_ERASE_TIMEOUT - Erase command timeout +0X2A,SD_CARD_ERROR_INIT_NOT_CALLED - Card has not been initialized +0X2B,SD_CARD_ERROR_INVALID_CARD_CONFIG - Invalid card config +0X2C,SD_CARD_ERROR_FUNCTION_NOT_SUPPORTED - Unsupported SDIO command +0X2D,SD_CARD_ERROR_UNKNOWN - Unknown error diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/ZipMsg/index.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/ZipMsg/index.html new file mode 100644 index 00000000..54887899 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/doc/ZipMsg/index.html @@ -0,0 +1,4 @@ +

Replace the content of the html folder by unzipping html.zip.

+

I have zipped the documentation since Doxygen changes every file each time it runs.

+

This makes viewing changes on GitHub difficult.

+

 

\ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html.zip b/extra-libraries/ESP8266/ESP8266SdFat/doc/html.zip new file mode 100644 index 00000000..efbd3841 Binary files /dev/null and b/extra-libraries/ESP8266/ESP8266SdFat/doc/html.zip differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h.html deleted file mode 100644 index cbf164f9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/ArduinoStream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
ArduinoStream.h File Reference
-
-
- -

ArduinoInStream and ArduinoOutStream classes. -More...

-
#include "SdFatConfig.h"
-#include "bufstream.h"
-
-Include dependency graph for ArduinoStream.h:
-
-
- - - - - - - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - - - - -

-Classes

class  ArduinoInStream
 Input stream for Arduino Stream objects. More...
 
class  ArduinoOutStream
 Output stream for Arduino Print objects. More...
 
-

Detailed Description

-

ArduinoInStream and ArduinoOutStream classes.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__dep__incl.png deleted file mode 100644 index 9242d2ff..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__incl.png deleted file mode 100644 index 5f077f56..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_arduino_stream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h.html deleted file mode 100644 index 34bff9c9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/common/BlockDeviceInterface.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
BlockDeviceInterface.h File Reference
-
-
- -

BlockDeviceInterface include file. -More...

-
#include <stdint.h>
-#include <stddef.h>
-#include "../SdFatConfig.h"
-
-Include dependency graph for BlockDeviceInterface.h:
-
-
- - - - - - - -
-
- - - - -

-Classes

class  BlockDeviceInterface
 BlockDeviceInterface class. More...
 
-

Detailed Description

-

BlockDeviceInterface include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h__incl.png deleted file mode 100644 index 46f44782..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_block_device_interface_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_buffered_print_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_buffered_print_8h.html deleted file mode 100644 index a7f348aa..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_buffered_print_8h.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/BufferedPrint.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
BufferedPrint.h File Reference
-
-
- -

Fast buffered print. -More...

-
#include "common/FmtNumber.h"
-
- - - - -

-Classes

class  BufferedPrint< WriteClass, BUF_DIM >
 Fast buffered print template. More...
 
-

Detailed Description

-

Fast buffered print.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h.html deleted file mode 100644 index 487c5de6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h.html +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/ExFatLib/ExFatFile.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
ExFatFile.h File Reference
-
-
- -

ExFatFile class. -More...

-
#include <limits.h>
-#include <string.h>
-#include "ExFatConfig.h"
-#include "../common/FsDateTime.h"
-#include "../common/FsStructs.h"
-#include "../common/FsApiConstants.h"
-#include "../common/FmtNumber.h"
-#include "ExFatTypes.h"
-#include "ExFatPartition.h"
-#include "../common/ArduinoFiles.h"
-
-Include dependency graph for ExFatFile.h:
-
-
- - - - - - - - - - - - -
-
- - - - - - - - - - - - - -

-Classes

class  ExFatFile
 Basic file class. More...
 
struct  ExFatPos_t
 Internal type for file position - do not use in user apps. More...
 
class  ExFile
 exFAT file with Arduino Stream. More...
 
struct  ExName_t
 Internal type for file name - do not use in user apps. More...
 
- - - -

-Macros

#define isDirSeparator(c)   ((c) == '/')
 
- - - -

-Functions

bool lfnLegalChar (ExChar_t c)
 
-

Detailed Description

-

ExFatFile class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ isDirSeparator

- -
-
- - - - - - - - -
#define isDirSeparator( c)   ((c) == '/')
-
-

Expression for path name separator.

- -
-
-

Function Documentation

- -

◆ lfnLegalChar()

- -
-
- - - - - -
- - - - - - - - -
bool lfnLegalChar (ExChar_t c)
-
-inline
-
-

test for legal character.

-
Parameters
- - -
[in]ccharacter to be tested.
-
-
-
Returns
true for legal character else false.
- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h__incl.png deleted file mode 100644 index 3547cbe5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_file_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h.html deleted file mode 100644 index 2a5774d2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/ExFatLib/ExFatPartition.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
ExFatPartition.h File Reference
-
-
- -

ExFatPartition include file. -More...

-
#include "../common/SysCall.h"
-#include "../common/BlockDevice.h"
-#include "ExFatConfig.h"
-#include "ExFatTypes.h"
-
-Include dependency graph for ExFatPartition.h:
-
-
- - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - - - - -

-Classes

class  ExFatPartition
 Access exFat partitions on raw file devices. More...
 
class  FsCache
 Sector cache. More...
 
- - - -

-Variables

const uint8_t FAT_TYPE_EXFAT = 64
 
-

Detailed Description

-

ExFatPartition include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Variable Documentation

- -

◆ FAT_TYPE_EXFAT

- -
-
- - - - -
const uint8_t FAT_TYPE_EXFAT = 64
-
-

Type for exFAT partition

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__dep__incl.png deleted file mode 100644 index 9a089b70..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__incl.png deleted file mode 100644 index 8374aca5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_ex_fat_partition_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h.html deleted file mode 100644 index cc3fb90c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h.html +++ /dev/null @@ -1,345 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib/FatFile.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FatFile.h File Reference
-
-
- -

FatFile class. -More...

-
#include <string.h>
-#include <stddef.h>
-#include <limits.h>
-#include "FatLibConfig.h"
-#include "../common/FmtNumber.h"
-#include "../common/FsApiConstants.h"
-#include "../common/FsDateTime.h"
-#include "../common/FsStructs.h"
-#include "FatPartition.h"
-#include "../common/ArduinoFiles.h"
-
-Include dependency graph for FatFile.h:
-
-
- - - - - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - - - - - - - - - - -

-Classes

class  FatFile
 Basic file class. More...
 
struct  FatPos_t
 Internal type for file position - do not use in user apps. More...
 
class  File32
 FAT16/FAT32 file with Arduino Stream. More...
 
struct  fname_t
 Internal type for Short File Name - do not use in user apps. More...
 
- - - - - - - - - - - -

-Macros

#define isDirSeparator(c)   ((c) == '/')
 
#define pgm_read_byte(addr)   (*(const unsigned char*)(addr))
 
#define pgm_read_word(addr)   (*(const uint16_t*)(addr))
 
#define PROGMEM
 
#define PSTR(x)   (x)
 
- - - - - - - - - - - -

-Variables

const uint8_t FNAME_FLAG_LC_BASE = FAT_CASE_LC_BASE
 
const uint8_t FNAME_FLAG_LC_EXT = FAT_CASE_LC_EXT
 
const uint8_t FNAME_FLAG_LOST_CHARS = 0X01
 
const uint8_t FNAME_FLAG_MIXED_CASE = 0X02
 
const uint8_t FNAME_FLAG_NEED_LFN
 
-

Detailed Description

-

FatFile class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ isDirSeparator

- -
-
- - - - - - - - -
#define isDirSeparator( c)   ((c) == '/')
-
-

Expression for path name separator.

- -
-
- -

◆ pgm_read_byte

- -
-
- - - - - - - - -
#define pgm_read_byte( addr)   (*(const unsigned char*)(addr))
-
-

read 8-bits from flash for ARM

- -
-
- -

◆ pgm_read_word

- -
-
- - - - - - - - -
#define pgm_read_word( addr)   (*(const uint16_t*)(addr))
-
-

read 16-bits from flash for ARM

- -
-
- -

◆ PROGMEM

- -
-
- - - - -
#define PROGMEM
-
-

store in flash for ARM

- -
-
- -

◆ PSTR

- -
-
- - - - - - - - -
#define PSTR( x)   (x)
-
-

store literal string in flash for ARM

- -
-
-

Variable Documentation

- -

◆ FNAME_FLAG_LC_BASE

- -
-
- - - - -
const uint8_t FNAME_FLAG_LC_BASE = FAT_CASE_LC_BASE
-
-

Filename base-name is all lower case

- -
-
- -

◆ FNAME_FLAG_LC_EXT

- -
-
- - - - -
const uint8_t FNAME_FLAG_LC_EXT = FAT_CASE_LC_EXT
-
-

Filename extension is all lower case.

- -
-
- -

◆ FNAME_FLAG_LOST_CHARS

- -
-
- - - - -
const uint8_t FNAME_FLAG_LOST_CHARS = 0X01
-
-

Derived from a LFN with loss or conversion of characters.

- -
-
- -

◆ FNAME_FLAG_MIXED_CASE

- -
-
- - - - -
const uint8_t FNAME_FLAG_MIXED_CASE = 0X02
-
-

Base-name or extension has mixed case.

- -
-
- -

◆ FNAME_FLAG_NEED_LFN

- -
-
- - - - -
const uint8_t FNAME_FLAG_NEED_LFN
-
-Initial value:

LFN entries are required for file name.

- -
-
-
-
const uint8_t FNAME_FLAG_LOST_CHARS
Definition: FatFile.h:96
-
const uint8_t FNAME_FLAG_MIXED_CASE
Definition: FatFile.h:98
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__dep__incl.png deleted file mode 100644 index f40953d8..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__incl.png deleted file mode 100644 index 43acf104..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_file_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h.html deleted file mode 100644 index b9ae7099..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib/FatLibConfig.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
FatLibConfig.h File Reference
-
-
- -

configuration definitions -More...

-
#include "SdFatConfig.h"
-
-Include dependency graph for FatLibConfig.h:
-
-
- - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - -
-

Detailed Description

-

configuration definitions

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__dep__incl.png deleted file mode 100644 index 8e585671..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__incl.png deleted file mode 100644 index 04aea878..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_lib_config_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h.html deleted file mode 100644 index 0b3d23ea..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib/FatPartition.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FatPartition.h File Reference
-
-
- -

FatPartition class. -More...

-
#include <stddef.h>
-#include "FatLibConfig.h"
-#include "../common/SysCall.h"
-#include "../common/BlockDevice.h"
-#include "../common/FsStructs.h"
-
-Include dependency graph for FatPartition.h:
-
-
- - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - -
-
- - - - - - - - - - -

-Classes

union  cache_t
 Cache for an raw data sector. More...
 
class  FatCache
 Sector cache. More...
 
class  FatPartition
 Access FAT16 and FAT32 partitions on raw file devices. More...
 
- - - - - - - -

-Variables

const uint8_t FAT_TYPE_FAT12 = 12
 
const uint8_t FAT_TYPE_FAT16 = 16
 
const uint8_t FAT_TYPE_FAT32 = 32
 
-

Detailed Description

-

FatPartition class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Variable Documentation

- -

◆ FAT_TYPE_FAT12

- -
-
- - - - -
const uint8_t FAT_TYPE_FAT12 = 12
-
-

Type for FAT12 partition

- -
-
- -

◆ FAT_TYPE_FAT16

- -
-
- - - - -
const uint8_t FAT_TYPE_FAT16 = 16
-
-

Type for FAT12 partition

- -
-
- -

◆ FAT_TYPE_FAT32

- -
-
- - - - -
const uint8_t FAT_TYPE_FAT32 = 32
-
-

Type for FAT12 partition

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__dep__incl.png deleted file mode 100644 index 551495a7..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__incl.png deleted file mode 100644 index 67854e22..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_partition_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h.html deleted file mode 100644 index bfea1dc2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib/FatVolume.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FatVolume.h File Reference
-
-
- -

FatVolume class. -More...

-
#include "FatPartition.h"
-#include "FatFile.h"
-
-Include dependency graph for FatVolume.h:
-
-
- - - - - - - - - - - - - - -
-
- - - - -

-Classes

class  FatVolume
 Integration class for the FatLib library. More...
 
-

Detailed Description

-

FatVolume class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h__incl.png deleted file mode 100644 index 4642240a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fat_volume_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h.html deleted file mode 100644 index 3877853a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FreeStack.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FreeStack.h File Reference
-
-
- -

FreeStack() function. -More...

-
#include <stdint.h>
-#include <avr/io.h>
-
-Include dependency graph for FreeStack.h:
-
-
- - - - - -
-
- - - -

-Macros

#define HAS_UNUSED_STACK   1
 
- - - - - - - -

-Functions

void FillStack ()
 
int FreeStack ()
 
int UnusedStack ()
 
- - - - - -

-Variables

char * __brkval
 
char __bss_end
 
-

Detailed Description

-

FreeStack() function.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ HAS_UNUSED_STACK

- -
-
- - - - -
#define HAS_UNUSED_STACK   1
-
-

Indicate FillStack() and UnusedStack() are available.

- -
-
-

Function Documentation

- -

◆ FillStack()

- -
-
- - - - - - - -
void FillStack ()
-
-

Fill stack with 0x55 pattern

- -
-
- -

◆ FreeStack()

- -
-
- - - - - -
- - - - - - - -
int FreeStack ()
-
-inline
-
-

Amount of free stack space.

Returns
The number of free bytes.
- -
-
- -

◆ UnusedStack()

- -
-
- - - - - - - -
int UnusedStack ()
-
-

Determine the amount of unused stack.

-

FillStack() must be called to fill the stack with a 0x55 pattern.

-

UnusedStack() may fail if malloc() or new is use.

-
Returns
number of bytes with 0x55 pattern.
- -
-
-

Variable Documentation

- -

◆ __brkval

- -
-
- - - - -
char* __brkval
-
-

boundary between stack and heap.

- -
-
- -

◆ __bss_end

- -
-
- - - - -
char __bss_end
-
-

End of bss section.

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h__incl.png deleted file mode 100644 index 53c16e27..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_free_stack_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h.html deleted file mode 100644 index c9551165..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FsLib/FsFile.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FsFile.h File Reference
-
-
- -

FsBaseFile include file. -More...

-
#include "FsNew.h"
-#include "FatLib/FatLib.h"
-#include "ExFatLib/ExFatLib.h"
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - - - - -
-
- - - - - - - -

-Classes

class  FsBaseFile
 FsBaseFile class. More...
 
class  FsFile
 FsBaseFile file with Arduino Stream. More...
 
-

Detailed Description

-

FsBaseFile include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h__dep__incl.png deleted file mode 100644 index fe89e04c..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_file_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h.html deleted file mode 100644 index 90829e76..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h.html +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FsLib/FsLib.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
FsLib.h File Reference
-
-
- -

FsLib include file. -More...

-
#include "FsVolume.h"
-#include "FsFile.h"
-
-Include dependency graph for FsLib.h:
-
-
- - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - - - -
-

Detailed Description

-

FsLib include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__dep__incl.png deleted file mode 100644 index 841b9d77..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__incl.png deleted file mode 100644 index afadd7e3..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_lib_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h.html deleted file mode 100644 index 9de88dec..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FsLib/FsVolume.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
FsVolume.h File Reference
-
-
- -

FsVolume include file. -More...

-
#include "FsNew.h"
-#include "../FatLib/FatLib.h"
-#include "../ExFatLib/ExFatLib.h"
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - - - - -
-
- - - - -

-Classes

class  FsVolume
 FsVolume class. More...
 
-

Detailed Description

-

FsVolume include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h__dep__incl.png deleted file mode 100644 index b9af14cc..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_fs_volume_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h.html deleted file mode 100644 index 1c2e8da7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/MinimumSerial.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
MinimumSerial.h File Reference
-
-
- -

Minimal AVR Serial driver. -More...

-
#include "common/SysCall.h"
-
-Include dependency graph for MinimumSerial.h:
-
-
- - - - - - - - -
-
- - - - -

-Classes

class  MinimumSerial
 mini serial class for the SdFat library. More...
 
-

Detailed Description

-

Minimal AVR Serial driver.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h__incl.png deleted file mode 100644 index e3b9b035..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_minimum_serial_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h.html deleted file mode 100644 index a2a1af1e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h.html +++ /dev/null @@ -1,393 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/common/PrintTemplates.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
PrintTemplates.h File Reference
-
-
- -

templates for printf -More...

-
#include <stdarg.h>
-#include "FmtNumber.h"
-
-Include dependency graph for PrintTemplates.h:
-
-
- - - - -
-
- - - - - -

-Macros

#define isDigit(d)   ('0' <= (d) && (d) <= '9')
 
#define PRINTF_USE_FLOAT   2
 
- - - - - - - - - - - - - - - - -

-Functions

template<typename T >
int fprintf (T *file, const char *fmt,...)
 
template<typename F >
int mprintf (F *file, const __FlashStringHelper *ifsh,...)
 
template<typename T >
int mprintf (T *file, const char *fmt,...)
 
template<typename F >
int vfprintf (F *file, const char *fmt, va_list ap)
 
template<typename F >
int vmprintf (F *file, const char *fmt, va_list ap)
 
-

Detailed Description

-

templates for printf

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ isDigit

- -
-
- - - - - - - - -
#define isDigit( d)   ('0' <= (d) && (d) <= '9')
-
-

test for digit

- -
-
- -

◆ PRINTF_USE_FLOAT

- -
-
- - - - -
#define PRINTF_USE_FLOAT   2
-
-

control for supported floating formats

- -
-
-

Function Documentation

- -

◆ fprintf()

- -
-
-
-template<typename T >
- - - - - - - - - - - - - - - - - - - - - - - - -
int fprintf (T * file,
const char * fmt,
 ... 
)
-
-

Formatted print.

-
Parameters
- - - -
[in]filedestination file or device.
[in]fmtformat string.
-
-
-
Returns
number of character printed for success else a negative value.
- -
-
- -

◆ mprintf() [1/2]

- -
-
-
-template<typename F >
- - - - - - - - - - - - - - - - - - - - - - - - -
int mprintf (Ffile,
const __FlashStringHelper * ifsh,
 ... 
)
-
-

Minimal formatted print.

-
Parameters
- - - -
[in]filedestination file or device.
[in]ifshformat string using F() macro.
-
-
-
Returns
number of character printed for success else a negative value.
- -
-
- -

◆ mprintf() [2/2]

- -
-
-
-template<typename T >
- - - - - - - - - - - - - - - - - - - - - - - - -
int mprintf (T * file,
const char * fmt,
 ... 
)
-
-

Minimal formatted print.

-
Parameters
- - - -
[in]filedestination file or device.
[in]fmtformat string.
-
-
-
Returns
number of character printed for success else a negative value.
- -
-
- -

◆ vfprintf()

- -
-
-
-template<typename F >
- - - - - - - - - - - - - - - - - - - - - - - - -
int vfprintf (Ffile,
const char * fmt,
va_list ap 
)
-
-

Formatted print.

-
Parameters
- - - - -
[in]filedestination file or device.
[in]fmtformat string.
[in]apargument list.
-
-
-
Returns
number of character printed for success else a negative value.
- -
-
- -

◆ vmprintf()

- -
-
-
-template<typename F >
- - - - - - - - - - - - - - - - - - - - - - - - -
int vmprintf (Ffile,
const char * fmt,
va_list ap 
)
-
-

Minimal formatted print.

-
Parameters
- - - - -
[in]filedestination file or device.
[in]fmtformat string.
[in]apargument list.
-
-
-
Returns
number of character printed for success else a negative value.
- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h__incl.png deleted file mode 100644 index 0668771f..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_print_templates_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h.html deleted file mode 100644 index 0db11015..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h.html +++ /dev/null @@ -1,210 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdFat.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdFat.h File Reference
-
-
- -

main SdFs include file. -More...

-
#include "common/SysCall.h"
-#include "SdCard/SdCard.h"
-#include "ExFatLib/ExFatLib.h"
-#include "FatLib/FatLib.h"
-#include "FsLib/FsLib.h"
-
-Include dependency graph for SdFat.h:
-
-
- - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - -

-Classes

class  SdBase< Vol >
 base SD file system template class. More...
 
class  SdExFat
 SD file system class for exFAT volumes. More...
 
class  SdFat32
 SD file system class for FAT volumes. More...
 
class  SdFile
 FAT16/FAT32 file with Print. More...
 
class  SdFs
 SD file system class for FAT16, FAT32, and exFAT volumes. More...
 
- - - -

-Macros

#define SD_FAT_VERSION   "2.0.2"
 
- - - - - - - -

-Typedefs

typedef File32 File
 
typedef FatFile SdBaseFile
 
typedef SdFat32 SdFat
 
-

Detailed Description

-

main SdFs include file.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ SD_FAT_VERSION

- -
-
- - - - -
#define SD_FAT_VERSION   "2.0.2"
-
-

SdFat version

- -
-
-

Typedef Documentation

- -

◆ File

- -
-
- - - - -
typedef File32 File
-
-

Select type for File.

- -
-
- -

◆ SdBaseFile

- -
-
- - - - -
typedef FatFile SdBaseFile
-
-

Select type for SdBaseFile.

- -
-
- -

◆ SdFat

- -
-
- - - - -
typedef SdFat32 SdFat
-
-

Select type for SdFat.

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h__incl.png deleted file mode 100644 index 6059fe47..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h.html deleted file mode 100644 index 6d514c7a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h.html +++ /dev/null @@ -1,660 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdFatConfig.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdFatConfig.h File Reference
-
-
- -

configuration definitions -More...

-
#include <stdint.h>
-#include "Arduino.h"
-
-Include dependency graph for SdFatConfig.h:
-
-
- - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - - - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Macros

#define CHECK_FLASH_PROGRAMMING   1
 
#define DESTRUCTOR_CLOSES_FILE   0
 
#define ENABLE_ARDUINO_FEATURES   1
 
#define ENABLE_ARDUINO_SERIAL   1
 
#define ENABLE_ARDUINO_STRING   1
 
#define ENABLE_DEDICATED_SPI   1
 
#define ENDL_CALLS_FLUSH   0
 
#define FAT12_SUPPORT   0
 
#define FS_DEFAULT_DATE   FS_DATE(compileYear(), 1, 1)
 
#define FS_DEFAULT_TIME   FS_TIME(0, 0, 0)
 
#define HAS_SDIO_CLASS   0
 
#define INCLUDE_SDIOS   0
 
#define MAINTAIN_FREE_CLUSTER_COUNT   0
 
#define SD_CHIP_SELECT_MODE   0
 
#define SD_HAS_CUSTOM_SPI   0
 
#define SD_MAX_INIT_RATE_KHZ   400
 
#define SDFAT_FILE_TYPE   1
 
#define SPI_DRIVER_SELECT   0
 
#define USE_BLOCK_DEVICE_INTERFACE   0
 
#define USE_EXFAT_BITMAP_CACHE   0
 
#define USE_FAT_FILE_FLAG_CONTIGUOUS   1
 
#define USE_FCNTL_H   0
 
#define USE_LONG_FILE_NAMES   1
 
#define USE_MULTI_SECTOR_IO   1
 
#define USE_SD_CRC   0
 
#define USE_SEPARATE_FAT_CACHE   0
 
#define USE_SIMPLE_LITTLE_ENDIAN   1
 
#define WDT_YIELD_TIME_MILLIS   0
 
- - - -

-Typedefs

typedef uint8_t SdCsPin_t
 
-

Detailed Description

-

configuration definitions

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ CHECK_FLASH_PROGRAMMING

- -
-
- - - - -
#define CHECK_FLASH_PROGRAMMING   1
-
-

If CHECK_FLASH_PROGRAMMING is zero, overlap of single sector flash programming and other operations will be allowed for faster write performance.

-

Some cards will not sleep in low power mode unless CHECK_FLASH_PROGRAMMING is non-zero.

- -
-
- -

◆ DESTRUCTOR_CLOSES_FILE

- -
-
- - - - -
#define DESTRUCTOR_CLOSES_FILE   0
-
-

Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor.

-

Causes use of lots of heap in ARM.

- -
-
- -

◆ ENABLE_ARDUINO_FEATURES

- -
-
- - - - -
#define ENABLE_ARDUINO_FEATURES   1
-
-

For Debug - must be one

- -
-
- -

◆ ENABLE_ARDUINO_SERIAL

- -
-
- - - - -
#define ENABLE_ARDUINO_SERIAL   1
-
-

For Debug - must be one

- -
-
- -

◆ ENABLE_ARDUINO_STRING

- -
-
- - - - -
#define ENABLE_ARDUINO_STRING   1
-
-

For Debug - must be one

- -
-
- -

◆ ENABLE_DEDICATED_SPI

- -
-
- - - - -
#define ENABLE_DEDICATED_SPI   1
-
-

Set ENABLE_DEDICATED_SPI to enable dedicated use of the SPI bus. Selecting dedicated SPI in SdSpiConfig() will produce better performance by using very large multi-block transfers to and from the SD card.

-

Enabling dedicated SPI will cost some extra flash and RAM.

- -
-
- -

◆ ENDL_CALLS_FLUSH

- -
-
- - - - -
#define ENDL_CALLS_FLUSH   0
-
-

Call flush for endl if ENDL_CALLS_FLUSH is nonzero

-

The standard for iostreams is to call flush. This is very costly for SdFat. Each call to flush causes 2048 bytes of I/O to the SD.

-

SdFat has a single 512 byte buffer for SD I/O so it must write the current data sector to the SD, read the directory sector from the SD, update the directory entry, write the directory sector to the SD and read the data sector back into the buffer.

-

The SD flash memory controller is not designed for this many rewrites so performance may be reduced by more than a factor of 100.

-

If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force all data to be written to the SD.

- -
-
- -

◆ FAT12_SUPPORT

- -
-
- - - - -
#define FAT12_SUPPORT   0
-
-

Set FAT12_SUPPORT nonzero to enable use if FAT12 volumes. FAT12 has not been well tested and requires additional flash.

- -
-
- -

◆ FS_DEFAULT_DATE

- -
-
- - - - -
#define FS_DEFAULT_DATE   FS_DATE(compileYear(), 1, 1)
-
-

Set the default file time stamp when a RTC callback is not used. A valid date and time is required by the FAT/exFAT standard.

-

The default below is YYYY-01-01 00:00:00 midnight where YYYY is the compile year from the DATE macro. This is easy to recognize as a placeholder for a correct date/time.

-

The full compile date is: FS_DATE(compileYear(), compileMonth(), compileDay())

-

The full compile time is: FS_TIME(compileHour(), compileMinute(), compileSecond())

- -
-
- -

◆ FS_DEFAULT_TIME

- -
-
- - - - -
#define FS_DEFAULT_TIME   FS_TIME(0, 0, 0)
-
-

00:00:00 midnight

- -
-
- -

◆ HAS_SDIO_CLASS

- -
-
- - - - -
#define HAS_SDIO_CLASS   0
-
-

Default is no SDIO.

- -
-
- -

◆ INCLUDE_SDIOS

- -
-
- - - - -
#define INCLUDE_SDIOS   0
-
-

Set INCLUDE_SDIOS nonzero to include sdios.h in SdFat.h. sdios.h provides C++ style IO Streams.

- -
-
- -

◆ MAINTAIN_FREE_CLUSTER_COUNT

- -
-
- - - - -
#define MAINTAIN_FREE_CLUSTER_COUNT   0
-
-

Set MAINTAIN_FREE_CLUSTER_COUNT nonzero to keep the count of free clusters updated. This will increase the speed of the freeClusterCount() call after the first call. Extra flash will be required.

- -
-
- -

◆ SD_CHIP_SELECT_MODE

- -
-
- - - - -
#define SD_CHIP_SELECT_MODE   0
-
-

SD_CHIP_SELECT_MODE defines how the functions void sdCsInit(SdCsPin_t pin) {pinMode(pin, OUTPUT);} and void sdCsWrite(SdCsPin_t pin, bool level) {digitalWrite(pin, level);} are defined.

-

0 - Internal definition is a strong symbol and can't be replaced.

-

1 - Internal definition is a weak symbol and can be replaced.

-

2 - No internal definition and must be defined in the application.

- -
-
- -

◆ SD_HAS_CUSTOM_SPI

- -
-
- - - - -
#define SD_HAS_CUSTOM_SPI   0
-
-

Enable SDIO driver if available. Determine the default SPI configuration.

- -
-
- -

◆ SD_MAX_INIT_RATE_KHZ

- -
-
- - - - -
#define SD_MAX_INIT_RATE_KHZ   400
-
-

SD maximum initialization clock rate.

- -
-
- -

◆ SDFAT_FILE_TYPE

- -
-
- - - - -
#define SDFAT_FILE_TYPE   1
-
-

File types for SdFat, File, SdFile, SdBaseFile, fstream, ifstream, and ofstream.

-

Set SDFAT_FILE_TYPE to:

-

1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.

- -
-
- -

◆ SPI_DRIVER_SELECT

- -
-
- - - - -
#define SPI_DRIVER_SELECT   0
-
-

If the symbol SPI_DRIVER_SELECT is:

-

0 - An optimized custom SPI driver is used if it exists else the standard library driver is used.

-

1 - The standard library driver is always used.

-

2 - An external SPI driver of SoftSpiDriver template class is always used.

-

3 - An external SPI driver derived from SdSpiBaseClass is always used.

- -
-
- -

◆ USE_BLOCK_DEVICE_INTERFACE

- -
-
- - - - -
#define USE_BLOCK_DEVICE_INTERFACE   0
-
-

Set USE_BLOCK_DEVICE_INTERFACE nonzero to use generic block device

- -
-
- -

◆ USE_EXFAT_BITMAP_CACHE

- -
-
- - - - -
#define USE_EXFAT_BITMAP_CACHE   0
-
-

Set USE_EXFAT_BITMAP_CACHE nonzero to use a second 512 byte cache for exFAT bitmap entries. This improves performance for large writes that are not a multiple of 512 bytes.

- -
-
- -

◆ USE_FAT_FILE_FLAG_CONTIGUOUS

- -
-
- - - - -
#define USE_FAT_FILE_FLAG_CONTIGUOUS   1
-
-

Set USE_FAT_FILE_FLAG_CONTIGUOUS nonzero to optimize access to contiguous files.

- -
-
- -

◆ USE_FCNTL_H

- -
-
- - - - -
#define USE_FCNTL_H   0
-
-

If the symbol USE_FCNTL_H is nonzero, open flags for access modes O_RDONLY, O_WRONLY, O_RDWR and the open modifiers O_APPEND, O_CREAT, O_EXCL, O_SYNC will be defined by including the system file fcntl.h.

- -
-
- -

◆ USE_LONG_FILE_NAMES

- -
-
- - - - -
#define USE_LONG_FILE_NAMES   1
-
-

Set USE_LONG_FILE_NAMES nonzero to use long file names (LFN) in FAT16/FAT32. exFAT always uses long file names.

-

Long File Name are limited to a maximum length of 255 characters.

-

This implementation allows 7-bit characters in the range 0X20 to 0X7E except the following characters are not allowed:

-

< (less than)

-

(greater than)

-
-

: (colon) " (double quote) / (forward slash) \ (backslash) | (vertical bar or pipe) ? (question mark)

    -
  • (asterisk)
  • -
- -
-
- -

◆ USE_MULTI_SECTOR_IO

- -
-
- - - - -
#define USE_MULTI_SECTOR_IO   1
-
-

Set USE_MULTI_SECTOR_IO nonzero to use multi-sector SD read/write.

-

Don't use mult-sector read/write on small AVR boards.

- -
-
- -

◆ USE_SD_CRC

- -
-
- - - - -
#define USE_SD_CRC   0
-
-

To enable SD card CRC checking for SPI, set USE_SD_CRC nonzero.

-

Set USE_SD_CRC to 1 to use a smaller CRC-CCITT function. This function is slower for AVR but may be fast for ARM and other processors.

-

Set USE_SD_CRC to 2 to used a larger table driven CRC-CCITT function. This function is faster for AVR but may be slower for ARM and other processors.

- -
-
- -

◆ USE_SEPARATE_FAT_CACHE

- -
-
- - - - -
#define USE_SEPARATE_FAT_CACHE   0
-
-

Set USE_SEPARATE_FAT_CACHE nonzero to use a second 512 byte cache for FAT16/FAT32 table entries. This improves performance for large writes that are not a multiple of 512 bytes.

- -
-
- -

◆ USE_SIMPLE_LITTLE_ENDIAN

- -
-
- - - - -
#define USE_SIMPLE_LITTLE_ENDIAN   1
-
-

Set USE_SIMPLE_LITTLE_ENDIAN nonzero for little endian processors with no memory alignment restrictions.

- -
-
- -

◆ WDT_YIELD_TIME_MILLIS

- -
-
- - - - -
#define WDT_YIELD_TIME_MILLIS   0
-
-

Handle Watchdog Timer for WiFi modules.

-

Yield will be called before accessing the SPI bus if it has been more than WDT_YIELD_TIME_MILLIS milliseconds since the last yield call by SdFat.

- -
-
-

Typedef Documentation

- -

◆ SdCsPin_t

- -
-
- - - - -
typedef uint8_t SdCsPin_t
-
-

Type for card chip select pin.

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__dep__incl.png deleted file mode 100644 index ebb2162d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__incl.png deleted file mode 100644 index 75065382..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_fat_config_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h.html deleted file mode 100644 index 72f413b4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver/SdSpiArduinoDriver.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdSpiArduinoDriver.h File Reference
-
-
- -

SpiDriver classes for Arduino compatible systems. -More...

-
#include "SdSpiLibDriver.h"
-
-Include dependency graph for SdSpiArduinoDriver.h:
-
-
- - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - -
-
- - - - -

-Classes

class  SdSpiArduinoDriver
 Optimized SPI class for access to SD and SDHC flash memory cards. More...
 
- - - -

-Typedefs

typedef SdSpiArduinoDriver SdSpiDriver
 
-

Detailed Description

-

SpiDriver classes for Arduino compatible systems.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Typedef Documentation

- -

◆ SdSpiDriver

- -
-
- - - - -
typedef SdSpiArduinoDriver SdSpiDriver
-
-

Typedef for use of SdSpiArduinoDriver

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__dep__incl.png deleted file mode 100644 index ba454e22..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__incl.png deleted file mode 100644 index 8c2eff48..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_arduino_driver_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_base_class_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_base_class_8h.html deleted file mode 100644 index 0fc2be1d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_base_class_8h.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver/SdSpiBaseClass.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdSpiBaseClass.h File Reference
-
-
- -

Base class for external SPI driver. -More...

- - - - - -

-Classes

class  SdSpiBaseClass
 Base class for external SPI drivers. More...
 
-

Detailed Description

-

Base class for external SPI driver.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h.html deleted file mode 100644 index c7d36e7d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdCard/SdSpiCard.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdSpiCard.h File Reference
-
-
- -

SdSpiCard class for V2 SD/SDHC cards. -More...

-
#include <stddef.h>
-#include "../common/SysCall.h"
-#include "SdCardInfo.h"
-#include "SdCardInterface.h"
-#include "../SpiDriver/SdSpiDriver.h"
-
-Include dependency graph for SdSpiCard.h:
-
-
- - - - - - - - - - - - -
-
- - - - -

-Classes

class  SdSpiCard
 Raw access to SD and SDHC flash memory cards via SPI protocol. More...
 
-

Detailed Description

-

SdSpiCard class for V2 SD/SDHC cards.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h__incl.png deleted file mode 100644 index f353d73a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_card_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h.html deleted file mode 100644 index e0b00b98..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h.html +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver/SdSpiDriver.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdSpiDriver.h File Reference
-
-
- -

SpiDriver classes. -More...

-
#include "../common/SysCall.h"
-#include "SPI.h"
-#include "SdSpiArduinoDriver.h"
-
-Include dependency graph for SdSpiDriver.h:
-
-
- - - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - -

-Classes

class  SdSpiConfig
 SPI card configuration. More...
 
- - - - - - - - - - - - - - - - - - - - - - - -

-Macros

#define DEDICATED_SPI   0X80
 
#define SD_SCK_HZ(maxSpeed)   (maxSpeed)
 
#define SD_SCK_MHZ(maxMhz)   (1000000UL*(maxMhz))
 
#define SHARED_SPI   0
 
#define SPI_DIV3_SPEED   SD_SCK_MHZ(16)
 
#define SPI_DIV6_SPEED   SD_SCK_MHZ(8)
 
#define SPI_EIGHTH_SPEED   SD_SCK_MHZ(1)
 
#define SPI_FULL_SPEED   SD_SCK_MHZ(50)
 
#define SPI_HALF_SPEED   SD_SCK_MHZ(4)
 
#define SPI_QUARTER_SPEED   SD_SCK_MHZ(2)
 
#define SPI_SIXTEENTH_SPEED   SD_SCK_HZ(500000)
 
- - - -

-Typedefs

typedef SPIClass SpiPort_t
 
- - - - - -

-Functions

void sdCsInit (SdCsPin_t pin)
 
void sdCsWrite (SdCsPin_t pin, bool level)
 
-

Detailed Description

-

SpiDriver classes.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ DEDICATED_SPI

- -
-
- - - - -
#define DEDICATED_SPI   0X80
-
-

The SD is the only device on the SPI bus.

- -
-
- -

◆ SD_SCK_HZ

- -
-
- - - - - - - - -
#define SD_SCK_HZ( maxSpeed)   (maxSpeed)
-
-

SPISettings for SCK frequency in Hz.

- -
-
- -

◆ SD_SCK_MHZ

- -
-
- - - - - - - - -
#define SD_SCK_MHZ( maxMhz)   (1000000UL*(maxMhz))
-
-

SPISettings for SCK frequency in MHz.

- -
-
- -

◆ SHARED_SPI

- -
-
- - - - -
#define SHARED_SPI   0
-
-

SPI bus is share with other devices.

- -
-
- -

◆ SPI_DIV3_SPEED

- -
-
- - - - -
#define SPI_DIV3_SPEED   SD_SCK_MHZ(16)
-
-

Set SCK rate to 16 MHz for Due

- -
-
- -

◆ SPI_DIV6_SPEED

- -
-
- - - - -
#define SPI_DIV6_SPEED   SD_SCK_MHZ(8)
-
-

Set SCK rate to 8 MHz for Due

- -
-
- -

◆ SPI_EIGHTH_SPEED

- -
-
- - - - -
#define SPI_EIGHTH_SPEED   SD_SCK_MHZ(1)
-
-

Set SCK rate to 1 MHz for AVR.

- -
-
- -

◆ SPI_FULL_SPEED

- -
-
- - - - -
#define SPI_FULL_SPEED   SD_SCK_MHZ(50)
-
-

Set SCK to max rate.

- -
-
- -

◆ SPI_HALF_SPEED

- -
-
- - - - -
#define SPI_HALF_SPEED   SD_SCK_MHZ(4)
-
-

Set SCK rate to 4 MHz for AVR.

- -
-
- -

◆ SPI_QUARTER_SPEED

- -
-
- - - - -
#define SPI_QUARTER_SPEED   SD_SCK_MHZ(2)
-
-

Set SCK rate to 2 MHz for AVR.

- -
-
- -

◆ SPI_SIXTEENTH_SPEED

- -
-
- - - - -
#define SPI_SIXTEENTH_SPEED   SD_SCK_HZ(500000)
-
-

Set SCK rate to 500 kHz for AVR.

- -
-
-

Typedef Documentation

- -

◆ SpiPort_t

- -
-
- - - - -
typedef SPIClass SpiPort_t
-
-

Port type for Arduino SPI hardware driver.

- -
-
-

Function Documentation

- -

◆ sdCsInit()

- -
-
- - - - - - - - -
void sdCsInit (SdCsPin_t pin)
-
-

Initialize SD chip select pin.

-
Parameters
- - -
[in]pinSD card chip select pin.
-
-
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ sdCsWrite()

- -
-
- - - - - - - - - - - - - - - - - - -
void sdCsWrite (SdCsPin_t pin,
bool level 
)
-
-

Initialize SD chip select pin.

-
Parameters
- - - -
[in]pinSD card chip select pin.
[in]levelSD card chip select level.
-
-
- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__dep__incl.png deleted file mode 100644 index 418ee922..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__incl.png deleted file mode 100644 index 5acbd374..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_driver_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h.html deleted file mode 100644 index 5485a7a7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver/SdSpiLibDriver.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
SdSpiLibDriver.h File Reference
-
-
- -

Class using only simple SPI library functions. -More...

-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - -
-

Detailed Description

-

Class using only simple SPI library functions.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h__dep__incl.png deleted file mode 100644 index 0ab0d4e4..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_lib_driver_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h.html deleted file mode 100644 index f86d3ee0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver/SdSpiSoftDriver.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SdSpiSoftDriver.h File Reference
-
-
- -

Class for software SPI. -More...

-
#include "../DigitalIO/SoftSPI.h"
-
-Include dependency graph for SdSpiSoftDriver.h:
-
-
- - - - - - - -
-
- - - - - - - -

-Classes

class  SdSpiSoftDriver
 Base class for external soft SPI. More...
 
class  SoftSpiDriver< MisoPin, MosiPin, SckPin >
 Class for external soft SPI. More...
 
- - - -

-Typedefs

typedef SdSpiSoftDriver SdSpiDriver
 
-

Detailed Description

-

Class for software SPI.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Typedef Documentation

- -

◆ SdSpiDriver

- -
-
- - - - -
typedef SdSpiSoftDriver SdSpiDriver
-
-

Typedef for use of SdSoftSpiDriver

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h__incl.png deleted file mode 100644 index eb28c458..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sd_spi_soft_driver_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h.html deleted file mode 100644 index 59c363be..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/StdioStream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
StdioStream.h File Reference
-
-
- -

StdioStream class. -More...

-
#include <limits.h>
-#include "ios.h"
-#include <stdio.h>
-
-Include dependency graph for StdioStream.h:
-
-
- - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - -

-Classes

class  StdioStream
 StdioStream implements a minimal stdio stream. More...
 
- - - - - - - - - - - -

-Macros

#define EOF   (-1)
 
#define NULL   0
 
#define SEEK_CUR   1
 
#define SEEK_END   2
 
#define SEEK_SET   0
 
- - - - - -

-Variables

const uint8_t STREAM_BUF_SIZE = 64
 
const uint8_t UNGETC_BUF_SIZE = 2
 
-

Detailed Description

-

StdioStream class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ EOF

- -
-
- - - - -
#define EOF   (-1)
-
-

End-of-file return value.

- -
-
- -

◆ NULL

- -
-
- - - - -
#define NULL   0
-
-

Null pointer

- -
-
- -

◆ SEEK_CUR

- -
-
- - - - -
#define SEEK_CUR   1
-
-

Seek relative to current position.

- -
-
- -

◆ SEEK_END

- -
-
- - - - -
#define SEEK_END   2
-
-

Seek relative to end-of-file.

- -
-
- -

◆ SEEK_SET

- -
-
- - - - -
#define SEEK_SET   0
-
-

Seek relative to start-of-file.

- -
-
-

Variable Documentation

- -

◆ STREAM_BUF_SIZE

- -
-
- - - - -
const uint8_t STREAM_BUF_SIZE = 64
-
-

Total size of stream buffer. The entire buffer is used for output. During input UNGETC_BUF_SIZE of this space is reserved for ungetc.

- -
-
- -

◆ UNGETC_BUF_SIZE

- -
-
- - - - -
const uint8_t UNGETC_BUF_SIZE = 2
-
-

Amount of buffer allocated for ungetc during input.

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__dep__incl.png deleted file mode 100644 index 0e9a945b..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__incl.png deleted file mode 100644 index 5bb91569..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_stdio_stream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h.html deleted file mode 100644 index 85f30c2f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/common/SysCall.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
SysCall.h File Reference
-
-
- -

SysCall class. -More...

-
#include <stdint.h>
-#include <stddef.h>
-#include "../SdFatConfig.h"
-
-Include dependency graph for SysCall.h:
-
-
- - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - - -
-
- - - - -

-Classes

class  SysCall
 SysCall - Class to wrap system calls. More...
 
- - - - - -

-Macros

#define F(str)   (str)
 
#define nullptr   NULL
 
- - - - - - - -

-Typedefs

typedef Print print_t
 
typedef uint16_t SdMillis_t
 
typedef Stream stream_t
 
-

Detailed Description

-

SysCall class.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Macro Definition Documentation

- -

◆ F

- -
-
- - - - - - - - -
#define F( str)   (str)
-
-

Define macro for strings stored in flash.

- -
-
- -

◆ nullptr

- -
-
- - - - -
#define nullptr   NULL
-
-

Define nullptr if not C++11

- -
-
-

Typedef Documentation

- -

◆ print_t

- -
-
- - - - -
typedef Print print_t
-
-

Use Arduino Print.

- -
-
- -

◆ SdMillis_t

- -
-
- - - - -
typedef uint16_t SdMillis_t
-
-

Type for millis.

- -
-
- -

◆ stream_t

- -
-
- - - - -
typedef Stream stream_t
-
-

Use Arduino Stream.

- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__dep__incl.png deleted file mode 100644 index b3042180..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__incl.png deleted file mode 100644 index 5457bad5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/_sys_call_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/annotated.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/annotated.html deleted file mode 100644 index dc2dcc39..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/annotated.html +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - -SdFat: Class List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class List
-
-
-
Here are the classes, structs, unions and interfaces with brief descriptions:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 CArduinoInStreamInput stream for Arduino Stream objects
 CArduinoOutStreamOutput stream for Arduino Print objects
 CBlockDeviceInterfaceBlockDeviceInterface class
 CBufferedPrintFast buffered print template
 Ccache_tCache for an raw data sector
 CCIDCard IDentification (CID) register
 CDirPos_tInternal type for position in directory file
 CExFatFileBasic file class
 CExFatFormatterFormat an exFAT volume
 CExFatPartitionAccess exFat partitions on raw file devices
 CExFatPos_tInternal type for file position - do not use in user apps
 CExFatVolumeExFAT volume
 CExFileExFAT file with Arduino Stream
 CExName_tInternal type for file name - do not use in user apps
 CFatCacheSector cache
 CFatFileBasic file class
 CFatFormatterFormat a FAT volume
 CFatPartitionAccess FAT16 and FAT32 partitions on raw file devices
 CFatPos_tInternal type for file position - do not use in user apps
 CFatVolumeIntegration class for the FatLib library
 CFile32FAT16/FAT32 file with Arduino Stream
 Cfname_tInternal type for Short File Name - do not use in user apps
 CFsBaseFileFsBaseFile class
 CFsCacheSector cache
 CFsFileFsBaseFile file with Arduino Stream
 CfstreamFile input/output stream
 CFsVolumeFsVolume class
 CibufstreamParse a char string
 CifstreamFile input stream
 CiosError and state information for all streams
 Cios_baseBase class for all streams
 CiostreamInput/Output stream
 CistreamInput Stream
 CMinimumSerialMini serial class for the SdFat library
 CobufstreamFormat a char string
 CofstreamFile output stream
 CostreamOutput Stream
 CPrintFilePrintFile class
 CSdBaseBase SD file system template class
 CSdCardFactorySetup a SPI card or SDIO card
 CSdCardInterfaceAbstract interface for an SD card
 CSdExFatSD file system class for exFAT volumes
 CSdFat32SD file system class for FAT volumes
 CSdFileFAT16/FAT32 file with Print
 CSdFsSD file system class for FAT16, FAT32, and exFAT volumes
 CSdioCardRaw SDIO access to SD and SDHC flash memory cards
 CSdioConfigSDIO card configuration
 CSdSpiArduinoDriverOptimized SPI class for access to SD and SDHC flash memory cards
 CSdSpiBaseClassBase class for external SPI drivers
 CSdSpiCardRaw access to SD and SDHC flash memory cards via SPI protocol
 CSdSpiConfigSPI card configuration
 CSdSpiSoftDriverBase class for external soft SPI
 CsetfillType for setfill manipulator
 CsetprecisionType for setprecision manipulator
 CsetwType for setw manipulator
 CSoftSpiDriverClass for external soft SPI
 CStdioStreamStdioStream implements a minimal stdio stream
 CStreamBaseClassBase type for FAT and exFAT streams
 CStreamFileStreamFile class
 CSysCallSysCall - Class to wrap system calls
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bc_s.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bc_s.png deleted file mode 100644 index 224b29aa..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bc_s.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bdwn.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bdwn.png deleted file mode 100644 index 940a0b95..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bdwn.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h.html deleted file mode 100644 index 941dd3ca..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/bufstream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
bufstream.h File Reference
-
-
- -

ibufstream and obufstream classes -More...

-
#include <string.h>
-#include "iostream.h"
-
-Include dependency graph for bufstream.h:
-
-
- - - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - -
-
- - - - - - - -

-Classes

class  ibufstream
 parse a char string More...
 
class  obufstream
 format a char string More...
 
-

Detailed Description

-

ibufstream and obufstream classes

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__dep__incl.png deleted file mode 100644 index 8656382a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__incl.png deleted file mode 100644 index ce968dcb..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/bufstream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream-members.html deleted file mode 100644 index 6c523d29..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream-members.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ArduinoInStream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ArduinoInStream(Stream &hws, char *buf, size_t size)ArduinoInStreaminline
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ibufstream()ibufstreaminline
ibufstream(const char *str)ibufstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
init(const char *str)ibufstreaminline
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
readline()ArduinoInStreaminline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream.html deleted file mode 100644 index 834ca9ff..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream.html +++ /dev/null @@ -1,2785 +0,0 @@ - - - - - - - -SdFat: ArduinoInStream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ArduinoInStream Class Reference
-
-
- -

Input stream for Arduino Stream objects. - More...

- -

#include <ArduinoStream.h>

-
-Inheritance diagram for ArduinoInStream:
-
-
Inheritance graph
- - - - - - - -
[legend]
-
-Collaboration diagram for ArduinoInStream:
-
-
Collaboration graph
- - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

 ArduinoInStream (Stream &hws, char *buf, size_t size)
 
bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
void init (const char *str)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
void readline ()
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Input stream for Arduino Stream objects.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ArduinoInStream()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
ArduinoInStream::ArduinoInStream (Stream & hws,
char * buf,
size_t size 
)
-
-inline
-
-

Constructor

Parameters
- - - - -
[in]hwshardware stream
[in]bufbuffer for input line
[in]sizesize of input buffer
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inlineinherited
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - -
- - - - - - - -
int istream::get ()
-
-inherited
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - -
- - - - - - - - -
istream & istream::get (char & ch)
-
-inherited
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-inherited
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - -
void ibufstream::init (const char * str)
-
-inlineinherited
-
-

Initialize an ibufstream

Parameters
- - -
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
-
-
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inlineinherited
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inlineinherited
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inlineinherited
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inlineinherited
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inlineinherited
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inlineinherited
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inlineinherited
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int istream::peek ()
-
-inherited
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ readline()

- -
-
- - - - - -
- - - - - - - -
void ArduinoInStream::readline ()
-
-inline
-
-

read a line.

- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - -
- - - - - - - -
void istream::skipWhite ()
-
-inherited
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__coll__graph.png deleted file mode 100644 index 0d8855be..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__inherit__graph.png deleted file mode 100644 index 0d8855be..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_in_stream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream-members.html deleted file mode 100644 index 0d04cda6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream-members.html +++ /dev/null @@ -1,165 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ArduinoOutStream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ArduinoOutStream(Print &pr)ArduinoOutStreaminlineexplicit
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream.html deleted file mode 100644 index 6e0d04e1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream.html +++ /dev/null @@ -1,2559 +0,0 @@ - - - - - - - -SdFat: ArduinoOutStream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ArduinoOutStream Class Reference
-
-
- -

Output stream for Arduino Print objects. - More...

- -

#include <ArduinoStream.h>

-
-Inheritance diagram for ArduinoOutStream:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for ArduinoOutStream:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

 ArduinoOutStream (Print &pr)
 
bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Output stream for Arduino Print objects.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ArduinoOutStream()

- -
-
- - - - - -
- - - - - - - - -
ArduinoOutStream::ArduinoOutStream (Print & pr)
-
-inlineexplicit
-
-

constructor

-
Parameters
- - -
[in]prPrint object for this ArduinoOutStream.
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inlineinherited
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inlineinherited
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inlineinherited
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inlineinherited
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inlineinherited
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inlineinherited
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inlineinherited
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inlineinherited
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inlineinherited
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inlineinherited
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inlineinherited
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inlineinherited
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inlineinherited
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inlineinherited
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inlineinherited
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__coll__graph.png deleted file mode 100644 index 971f0527..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__inherit__graph.png deleted file mode 100644 index 971f0527..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_arduino_out_stream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface-members.html deleted file mode 100644 index cc63e614..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface-members.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
BlockDeviceInterface Member List
-
-
- -

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

- - - - - - - - -
readSector(uint32_t sector, uint8_t *dst)=0BlockDeviceInterfacepure virtual
readSectors(uint32_t sector, uint8_t *dst, size_t ns)=0BlockDeviceInterfacepure virtual
sectorCount()=0BlockDeviceInterfacepure virtual
syncDevice()=0BlockDeviceInterfacepure virtual
writeSector(uint32_t sector, const uint8_t *src)=0BlockDeviceInterfacepure virtual
writeSectors(uint32_t sector, const uint8_t *src, size_t ns)=0BlockDeviceInterfacepure virtual
~BlockDeviceInterface() (defined in BlockDeviceInterface)BlockDeviceInterfaceinlinevirtual
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface.html deleted file mode 100644 index 42c6362a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface.html +++ /dev/null @@ -1,374 +0,0 @@ - - - - - - - -SdFat: BlockDeviceInterface Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
BlockDeviceInterface Class Referenceabstract
-
-
- -

BlockDeviceInterface class. - More...

- -

#include <BlockDeviceInterface.h>

-
-Inheritance diagram for BlockDeviceInterface:
-
-
Inheritance graph
- - - - - -
[legend]
- - - - - - - - - - - - - - -

-Public Member Functions

virtual bool readSector (uint32_t sector, uint8_t *dst)=0
 
virtual bool readSectors (uint32_t sector, uint8_t *dst, size_t ns)=0
 
virtual uint32_t sectorCount ()=0
 
virtual bool syncDevice ()=0
 
virtual bool writeSector (uint32_t sector, const uint8_t *src)=0
 
virtual bool writeSectors (uint32_t sector, const uint8_t *src, size_t ns)=0
 
-

Detailed Description

-

Member Function Documentation

- -

◆ readSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::readSector (uint32_t sector,
uint8_t * dst 
)
-
-pure virtual
-
-

Read a sector.

-
Parameters
- - - -
[in]sectorLogical sector to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ readSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::readSectors (uint32_t sector,
uint8_t * dst,
size_t ns 
)
-
-pure virtual
-
-

Read multiple sectors.

-
Parameters
- - - - -
[in]sectorLogical sector to be read.
[in]nsNumber of sectors to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ sectorCount()

- -
-
- - - - - -
- - - - - - - -
virtual uint32_t BlockDeviceInterface::sectorCount ()
-
-pure virtual
-
-
Returns
device size in sectors.
- -

Implemented in SdCardInterface, and SdioCard.

- -
-
- -

◆ syncDevice()

- -
-
- - - - - -
- - - - - - - -
virtual bool BlockDeviceInterface::syncDevice ()
-
-pure virtual
-
-

End multi-sector transfer and go to idle state.

Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::writeSector (uint32_t sector,
const uint8_t * src 
)
-
-pure virtual
-
-

Writes a sector.

-
Parameters
- - - -
[in]sectorLogical sector to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::writeSectors (uint32_t sector,
const uint8_t * src,
size_t ns 
)
-
-pure virtual
-
-

Write multiple sectors.

-
Parameters
- - - - -
[in]sectorLogical sector to be written.
[in]nsNumber of sectors to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface__inherit__graph.png deleted file mode 100644 index e865fc79..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_block_device_interface__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print-members.html deleted file mode 100644 index 5beb7057..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print-members.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
BufferedPrint< WriteClass, BUF_DIM > Member List
-
-
- -

This is the complete list of members for BufferedPrint< WriteClass, BUF_DIM >, including all inherited members.

- - - - - - - - - - - - - - - - - - - - -
begin(WriteClass *wr)BufferedPrint< WriteClass, BUF_DIM >inline
BufferedPrint() (defined in BufferedPrint< WriteClass, BUF_DIM >)BufferedPrint< WriteClass, BUF_DIM >inline
BufferedPrint(WriteClass *wr)BufferedPrint< WriteClass, BUF_DIM >inlineexplicit
flush()BufferedPrint< WriteClass, BUF_DIM >inline
print(double d, uint8_t prec=2)BufferedPrint< WriteClass, BUF_DIM >inline
print(float f, uint8_t prec=2)BufferedPrint< WriteClass, BUF_DIM >inline
print(Type v)BufferedPrint< WriteClass, BUF_DIM >inline
printField(char c, char term)BufferedPrint< WriteClass, BUF_DIM >inline
printField(const __FlashStringHelper *fsh, char term)BufferedPrint< WriteClass, BUF_DIM >inline
printField(const char *str, char term)BufferedPrint< WriteClass, BUF_DIM >inline
printField(double d, char term, uint8_t prec=2)BufferedPrint< WriteClass, BUF_DIM >inline
printField(float f, char term, uint8_t prec=2)BufferedPrint< WriteClass, BUF_DIM >inline
printField(Type n, char term)BufferedPrint< WriteClass, BUF_DIM >inline
println()BufferedPrint< WriteClass, BUF_DIM >inline
println(double d, uint8_t prec=2)BufferedPrint< WriteClass, BUF_DIM >inline
println(float f, uint8_t prec)BufferedPrint< WriteClass, BUF_DIM >inline
println(Type v)BufferedPrint< WriteClass, BUF_DIM >inline
sync()BufferedPrint< WriteClass, BUF_DIM >inline
write(const void *src, size_t n)BufferedPrint< WriteClass, BUF_DIM >inline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print.html deleted file mode 100644 index 1cc8aaaf..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_buffered_print.html +++ /dev/null @@ -1,885 +0,0 @@ - - - - - - - -SdFat: BufferedPrint< WriteClass, BUF_DIM > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
BufferedPrint< WriteClass, BUF_DIM > Class Template Reference
-
-
- -

Fast buffered print template. - More...

- -

#include <BufferedPrint.h>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void begin (WriteClass *wr)
 
 BufferedPrint (WriteClass *wr)
 
void flush ()
 
size_t print (double d, uint8_t prec=2)
 
size_t print (float f, uint8_t prec=2)
 
template<typename Type >
size_t print (Type v)
 
size_t printField (char c, char term)
 
size_t printField (const __FlashStringHelper *fsh, char term)
 
size_t printField (const char *str, char term)
 
size_t printField (double d, char term, uint8_t prec=2)
 
size_t printField (float f, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type n, char term)
 
size_t println ()
 
size_t println (double d, uint8_t prec=2)
 
size_t println (float f, uint8_t prec)
 
template<typename Type >
size_t println (Type v)
 
bool sync ()
 
size_t write (const void *src, size_t n)
 
-

Detailed Description

-

template<typename WriteClass, uint8_t BUF_DIM>
-class BufferedPrint< WriteClass, BUF_DIM >

- -

Fast buffered print template.

-

Constructor & Destructor Documentation

- -

◆ BufferedPrint()

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - -
BufferedPrint< WriteClass, BUF_DIM >::BufferedPrint (WriteClass * wr)
-
-inlineexplicit
-
-

BufferedPrint constructor.

Parameters
- - -
[in]wrPrint destination.
-
-
- -
-
-

Member Function Documentation

- -

◆ begin()

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - -
void BufferedPrint< WriteClass, BUF_DIM >::begin (WriteClass * wr)
-
-inline
-
-

Initialize the BuffedPrint class.

Parameters
- - -
[in]wrPrint destination.
-
-
- -
-
- -

◆ flush()

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - -
void BufferedPrint< WriteClass, BUF_DIM >::flush ()
-
-inline
-
-

Flush the buffer - same as sync() with no status return.

- -
-
- -

◆ print() [1/3]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::print (double d,
uint8_t prec = 2 
)
-
-inline
-
-

Print a double.

Parameters
- - - -
[in]dThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ print() [2/3]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::print (float f,
uint8_t prec = 2 
)
-
-inline
-
-

Print a float.

Parameters
- - - -
[in]fThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ print() [3/3]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
-
-template<typename Type >
- - - - - -
- - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::print (Type v)
-
-inline
-
-

Print character, string, or number.

Parameters
- - -
[in]vitem to print.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [1/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (char c,
char term 
)
-
-inline
-
-

Print a character followed by a field terminator.

Parameters
- - - -
[in]ccharacter to print.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [2/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (const __FlashStringHelper * fsh,
char term 
)
-
-inline
-
-

Print a string stored in AVR flash followed by a field terminator.

Parameters
- - - -
[in]fshstring to print.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [3/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (const char * str,
char term 
)
-
-inline
-
-

Print a string followed by a field terminator.

Parameters
- - - -
[in]strstring to print.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [4/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (double d,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a double followed by a field terminator.

Parameters
- - - - -
[in]dThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [5/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (float f,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a float followed by a field terminator.

Parameters
- - - - -
[in]fThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ printField() [6/6]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::printField (Type n,
char term 
)
-
-inline
-
-

Print an integer value for 8, 16, and 32 bit signed and unsigned types.

Parameters
- - - -
[in]nThe value to print.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ println() [1/4]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::println ()
-
-inline
-
-

Print CR LF.

Returns
true for success or false if an error occurs.
- -
-
- -

◆ println() [2/4]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::println (double d,
uint8_t prec = 2 
)
-
-inline
-
-

Print a double followed by CR LF.

Parameters
- - - -
[in]dThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ println() [3/4]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::println (float f,
uint8_t prec 
)
-
-inline
-
-

Print a float followed by CR LF.

Parameters
- - - -
[in]fThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ println() [4/4]

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
-
-template<typename Type >
- - - - - -
- - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::println (Type v)
-
-inline
-
-

Print character, string, or number followed by CR LF.

Parameters
- - -
[in]vitem to print.
-
-
-
Returns
true for success or false if an error occurs.
- -
-
- -

◆ sync()

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - -
bool BufferedPrint< WriteClass, BUF_DIM >::sync ()
-
-inline
-
-

Flush the buffer.

Returns
true for success or false if an error occurs.
- -
-
- -

◆ write()

- -
-
-
-template<typename WriteClass , uint8_t BUF_DIM>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t BufferedPrint< WriteClass, BUF_DIM >::write (const void * src,
size_t n 
)
-
-inline
-
-

Write data to an open file.

Parameters
- - - -
[in]srcPointer to the location of the data to be written.
[in]nNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always n.
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file-members.html deleted file mode 100644 index a9721ad9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file-members.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ExFatFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()ExFatFileinline
available64()ExFatFileinline
clearError()ExFatFileinline
clearWriteError()ExFatFileinline
close()ExFatFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)ExFatFile
curPosition() constExFatFileinline
dataLength()ExFatFileinline
dirIndex()ExFatFileinline
ExFatFile()ExFatFileinline
ExFatVolume classExFatFilefriend
exists(const ExChar_t *path)ExFatFileinline
fgetpos(fspos_t *pos)ExFatFile
fgets(char *str, int num, char *delim=NULL)ExFatFile
fileSize()ExFatFileinline
firstSector()ExFatFile
flush()ExFatFileinline
fsetpos(const fspos_t *pos)ExFatFile
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getError()ExFatFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getName(ExChar_t *name, size_t size)ExFatFile
getWriteError()ExFatFileinline
isContiguous() constExFatFileinline
isDir() constExFatFileinline
isFile() constExFatFileinline
isHidden() constExFatFileinline
isOpen() constExFatFileinline
isReadable() constExFatFileinline
isReadOnly() constExFatFileinline
isRoot() constExFatFileinline
isSubDir() constExFatFileinline
isWritable() constExFatFileinline
ls(print_t *pr)ExFatFile
ls(print_t *pr, uint8_t flags, uint8_t indent=0)ExFatFile
mkdir(ExFatFile *parent, const ExChar_t *path, bool pFlag=true)ExFatFile
open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)ExFatFile
open(ExFatVolume *vol, const ExChar_t *path, int oflag)ExFatFile
open(ExFatFile *dirFile, uint32_t index, oflag_t oflag)ExFatFile
open(const ExChar_t *path, int oflag=0X00)ExFatFile
openNext(ExFatFile *dirFile, oflag_t oflag=0X00)ExFatFile
openRoot(ExFatVolume *vol)ExFatFile
operator bool()ExFatFileinline
peek()ExFatFile
preAllocate(uint64_t length)ExFatFile
printAccessDateTime(print_t *pr)ExFatFile
printCreateDateTime(print_t *pr)ExFatFile
printField(double value, char term, uint8_t prec=2)ExFatFileinline
printField(float value, char term, uint8_t prec=2)ExFatFileinline
printField(Type value, char term)ExFatFileinline
printFileSize(print_t *pr)ExFatFile
printModifyDateTime(print_t *pr)ExFatFile
printName(print_t *pr)ExFatFile
read()ExFatFileinline
read(void *buf, size_t count)ExFatFile
remove()ExFatFile
remove(const ExChar_t *path)ExFatFile
rename(const ExChar_t *newPath)ExFatFile
rename(ExFatFile *dirFile, const ExChar_t *newPath)ExFatFile
rewind()ExFatFileinline
rmdir()ExFatFile
seekCur(int64_t offset)ExFatFileinline
seekEnd(int64_t offset=0)ExFatFileinline
seekSet(uint64_t pos)ExFatFile
sync()ExFatFile
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)ExFatFile
truncate()ExFatFile
truncate(uint64_t length)ExFatFileinline
validLength()ExFatFileinline
write(const char *str)ExFatFileinline
write(uint8_t b)ExFatFileinline
write(const void *buf, size_t count)ExFatFile
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file.html deleted file mode 100644 index 176155ea..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file.html +++ /dev/null @@ -1,2529 +0,0 @@ - - - - - - - -SdFat: ExFatFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ExFatFile Class Reference
-
-
- -

Basic file class. - More...

- -

#include <ExFatFile.h>

-
-Inheritance diagram for ExFatFile:
-
-
Inheritance graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
uint64_t available64 ()
 
void clearError ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
uint64_t curPosition () const
 
uint64_t dataLength ()
 
uint32_t dirIndex ()
 
 ExFatFile ()
 
bool exists (const ExChar_t *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=NULL)
 
uint64_t fileSize ()
 
uint32_t firstSector ()
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
size_t getName (ExChar_t *name, size_t size)
 
bool getWriteError ()
 
bool isContiguous () const
 
bool isDir () const
 
bool isFile () const
 
bool isHidden () const
 
bool isOpen () const
 
bool isReadable () const
 
bool isReadOnly () const
 
bool isRoot () const
 
bool isSubDir () const
 
bool isWritable () const
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, uint8_t flags, uint8_t indent=0)
 
bool mkdir (ExFatFile *parent, const ExChar_t *path, bool pFlag=true)
 
bool open (const ExChar_t *path, int oflag=0X00)
 
bool open (ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)
 
bool open (ExFatFile *dirFile, uint32_t index, oflag_t oflag)
 
bool open (ExFatVolume *vol, const ExChar_t *path, int oflag)
 
bool openNext (ExFatFile *dirFile, oflag_t oflag=0X00)
 
bool openRoot (ExFatVolume *vol)
 
 operator bool ()
 
int peek ()
 
bool preAllocate (uint64_t length)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
bool remove ()
 
bool remove (const ExChar_t *path)
 
bool rename (const ExChar_t *newPath)
 
bool rename (ExFatFile *dirFile, const ExChar_t *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool seekCur (int64_t offset)
 
bool seekEnd (int64_t offset=0)
 
bool seekSet (uint64_t pos)
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint64_t length)
 
uint64_t validLength ()
 
size_t write (const char *str)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
- - - -

-Friends

class ExFatVolume
 
-

Detailed Description

-

Basic file class.

-

Constructor & Destructor Documentation

- -

◆ ExFatFile()

- -
-
- - - - - -
- - - - - - - -
ExFatFile::ExFatFile ()
-
-inline
-
-

Create an instance.

- -
-
-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int ExFatFile::available ()
-
-inline
-
-
Returns
The number of bytes available from the current position to EOF for normal files. INT_MAX is returned for very large files.
-

available64() is recommended for very large files.

-

Zero is returned for directory files.

- -
-
- -

◆ available64()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::available64 ()
-
-inline
-
-
Returns
The number of bytes available from the current position to EOF for normal files. Zero is returned for directory files.
- -
-
- -

◆ clearError()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::clearError ()
-
-inline
-
-

Clear all error bits.

- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::clearWriteError ()
-
-inline
-
-

Clear writeError.

- -
-
- -

◆ close()

- -
-
- - - - - - - -
bool ExFatFile::close ()
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Parameters may be nullptr.

-
Returns
true for success or false for failure.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::curPosition () const
-
-inline
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dataLength()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::dataLength ()
-
-inline
-
-
Returns
Total data length for file.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatFile::dirIndex ()
-
-inline
-
-
Returns
Directory entry index.
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::exists (const ExChar_t * path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
true if the file exists else false.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - - - - -
void ExFatFile::fgetpos (fspos_t * pos)
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
int ExFatFile::fgets (char * str,
int num,
char * delim = NULL 
)
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::fileSize ()
-
-inline
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - - - -
uint32_t ExFatFile::firstSector ()
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::flush ()
-
-inline
-
-

Arduino name for sync()

- -
-
- -

◆ fsetpos()

- -
-
- - - - - - - - -
void ExFatFile::fsetpos (const fspos_t * pos)
-
-

Set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatFile::getError ()
-
-inline
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-

Get a file's modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::getName (ExChar_t * name,
size_t size 
)
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]sizeThe size of the array in characters.
-
-
-
Returns
the name length.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::getWriteError ()
-
-inline
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isContiguous () const
-
-inline
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isDir () const
-
-inline
-
-
Returns
True if this is a directory.
- -
-
- -

◆ isFile()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isFile () const
-
-inline
-
-
Returns
True if this is a normal file.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isHidden () const
-
-inline
-
-
Returns
True if this is a hidden.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isOpen () const
-
-inline
-
-
Returns
true if the file is open.
- -
-
- -

◆ isReadable()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isReadable () const
-
-inline
-
-
Returns
True file is writable.
- -
-
- -

◆ isReadOnly()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isReadOnly () const
-
-inline
-
-
Returns
True if file is read-only
- -
-
- -

◆ isRoot()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isRoot () const
-
-inline
-
-
Returns
True if this is the root directory.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isSubDir () const
-
-inline
-
-
Returns
True if this is a subdirectory.
- -
-
- -

◆ isWritable()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isWritable () const
-
-inline
-
-
Returns
True file is writable.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - - - - -
bool ExFatFile::ls (print_tpr)
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint stream for list.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::ls (print_tpr,
uint8_t flags,
uint8_t indent = 0 
)
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Parameters
- - -
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::mkdir (ExFatFileparent,
const ExChar_t * path,
bool pFlag = true 
)
-
-

Make a new directory.

-
Parameters
- - - - -
[in]parentAn open directory file that will contain the new directory.
[in]pathA path with a valid name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (const ExChar_t * path,
int oflag = 0X00 
)
-
-

Open a file in the current working directory.

-
Parameters
- - - -
[in]pathA path with a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see ExFatFile::open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatFiledirFile,
const ExChar_t * path,
oflag_t oflag 
)
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirFileAn open directory containing the file to be opened.
[in]pathThe path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list. Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or O_RDWR is allowed.
-
-
-

O_RDONLY - Open for reading.

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one file object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatFiledirFile,
uint32_t index,
oflag_t oflag 
)
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirFileAn open ExFatFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see ExFatFile::open(ExFatFile*, const ExChar_t*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatVolumevol,
const ExChar_t * path,
int oflag 
)
-
-

Open a file in the volume working directory.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathwith a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::openNext (ExFatFiledirFile,
oflag_t oflag = 0X00 
)
-
-

Open the next file or subdirectory in a directory.

-
Parameters
- - - -
[in]dirFileAn open instance for the directory containing the file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openRoot()

- -
-
- - - - - - - - -
bool ExFatFile::openRoot (ExFatVolumevol)
-
-

Open a volume's root directory.

-
Parameters
- - -
[in]volThe FAT volume containing the root directory to be opened.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ExFatFile::operator bool ()
-
-inline
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - - - -
int ExFatFile::peek ()
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ preAllocate()

- -
-
- - - - - - - - -
bool ExFatFile::preAllocate (uint64_t length)
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will have zero validLength and dataLength will equal the requested length.

-
Parameters
- - -
[in]lengthsize of allocated space in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - - - - -
size_t ExFatFile::printAccessDateTime (print_tpr)
-
-

Print a file's access date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - - - - -
size_t ExFatFile::printCreateDateTime (print_tpr)
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (Type value,
char term 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - - - - -
size_t ExFatFile::printFileSize (print_tpr)
-
-

Print a file's size in bytes.

Parameters
- - -
[in]prPrtin stream for the output.
-
-
-
Returns
The number of bytes printed.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - - - - -
size_t ExFatFile::printModifyDateTime (print_tpr)
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printName()

- -
-
- - - - - - - - -
size_t ExFatFile::printName (print_tpr)
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ExFatFile::read ()
-
-inline
-
-

Read the next byte from a file.

-
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
int ExFatFile::read (void * buf,
size_t count 
)
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - - - -
bool ExFatFile::remove ()
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - - - - -
bool ExFatFile::remove (const ExChar_t * path)
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - - - - -
bool ExFatFile::rename (const ExChar_t * newPath)
-
-

Rename a file or subdirectory.

-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::rename (ExFatFiledirFile,
const ExChar_t * newPath 
)
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::rewind ()
-
-inline
-
-

Set the file's current position to zero.

- -
-
- -

◆ rmdir()

- -
-
- - - - - - - -
bool ExFatFile::rmdir ()
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::seekCur (int64_t offset)
-
-inline
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::seekEnd (int64_t offset = 0)
-
-inline
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - - - - -
bool ExFatFile::seekSet (uint64_t pos)
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ sync()

- -
-
- - - - - - - -
bool ExFatFile::sync ()
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-

Truncate a file at the current file position.

-
Returns
true for success or false for failure. Set a file's timestamps in its directory entry.
-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date and time.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - - - -
bool ExFatFile::truncate ()
-
-

Truncate a file at the current file position. will be maintained if it is less than or equal to length otherwise it will be set to end of file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::truncate (uint64_t length)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ validLength()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::validLength ()
-
-inline
-
-
Returns
The valid number of bytes in a file.
- -
-
- -

◆ write() [1/3]

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::write (const char * str)
-
-inline
-
-

Write a string to a file. Used by the Arduino Print class.

Parameters
- - -
[in]strPointer to the string. Use getWriteError to check for errors.
-
-
-
Returns
count of characters written for success or -1 for failure.
- -
-
- -

◆ write() [2/3]

- -
-
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::write (const void * buf,
size_t count 
)
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always count.
- -
-
- -

◆ write() [3/3]

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::write (uint8_t b)
-
-inline
-
-

Write a single byte.

Parameters
- - -
[in]bThe byte to be written.
-
-
-
Returns
+1 for success or zero for failure.
- -
-
-

Friends And Related Function Documentation

- -

◆ ExFatVolume

- -
-
- - - - - -
- - - - -
friend class ExFatVolume
-
-friend
-
-

ExFatVolume allowed access to private members.

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFile.h
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFile.cpp
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFilePrint.cpp
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFileWrite.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file__inherit__graph.png deleted file mode 100644 index d184b1ab..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter-members.html deleted file mode 100644 index 0933df85..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter-members.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ExFatFormatter Member List
-
-
- -

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

- - -
format(BlockDevice *dev, uint8_t *secBuf, print_t *pr=NULL)ExFatFormatter
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter.html deleted file mode 100644 index 49e61abb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_formatter.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - -SdFat: ExFatFormatter Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ExFatFormatter Class Reference
-
-
- -

Format an exFAT volume. - More...

- -

#include <ExFatFormatter.h>

- - - - -

-Public Member Functions

bool format (BlockDevice *dev, uint8_t *secBuf, print_t *pr=NULL)
 
-

Detailed Description

-

Format an exFAT volume.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Member Function Documentation

- -

◆ format()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFormatter::format (BlockDevicedev,
uint8_t * secBuf,
print_tpr = NULL 
)
-
-

Format an exFAT volume.

-
Parameters
- - - - -
[in]devBlock device for volume.
[in]secBufbuffer for writing to volume.
[in]prPrint device for progress output.
-
-
-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFormatter.h
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatFormatter.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition-members.html deleted file mode 100644 index 0c9d0e42..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition-members.html +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ExFatPartition Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - -
bytesPerCluster() constExFatPartitioninline
bytesPerClusterShift() constExFatPartitioninline
bytesPerSector() constExFatPartitioninline
bytesPerSectorShift() constExFatPartitioninline
cacheClear()ExFatPartitioninline
clusterCount() constExFatPartitioninline
clusterHeapStartSector() constExFatPartitioninline
ExFatFile classExFatPartitionfriend
ExFatPartition() (defined in ExFatPartition)ExFatPartitioninline
fatLength() constExFatPartitioninline
fatStartSector() constExFatPartitioninline
fatType() constExFatPartitioninline
freeClusterCount()ExFatPartition
init(BlockDevice *dev, uint8_t part)ExFatPartition
rootDirectoryCluster() constExFatPartitioninline
rootLength()ExFatPartition
sectorsPerCluster() constExFatPartitioninline
sectorsPerClusterShift() constExFatPartitioninline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition.html deleted file mode 100644 index fd3dbb45..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition.html +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - - -SdFat: ExFatPartition Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ExFatPartition Class Reference
-
-
- -

Access exFat partitions on raw file devices. - More...

- -

#include <ExFatPartition.h>

-
-Inheritance diagram for ExFatPartition:
-
-
Inheritance graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

uint32_t bytesPerCluster () const
 
uint8_t bytesPerClusterShift () const
 
uint16_t bytesPerSector () const
 
uint8_t bytesPerSectorShift () const
 
uint8_t * cacheClear ()
 
uint32_t clusterCount () const
 
uint32_t clusterHeapStartSector () const
 
uint32_t fatLength () const
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
uint32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part)
 
uint32_t rootDirectoryCluster () const
 
uint32_t rootLength ()
 
uint32_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
- - - -

-Friends

class ExFatFile
 
-

Detailed Description

-

Access exFat partitions on raw file devices.

-

Member Function Documentation

- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::bytesPerCluster () const
-
-inline
-
-
Returns
the number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerClusterShift () const
-
-inline
-
-
Returns
the power of two for bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t ExFatPartition::bytesPerSector () const
-
-inline
-
-
Returns
the number of bytes in a sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerSectorShift () const
-
-inline
-
-
Returns
the power of two for bytesPerSector.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
uint8_t* ExFatPartition::cacheClear ()
-
-inline
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterCount () const
-
-inline
-
-
Returns
the cluster count for the partition.
- -
-
- -

◆ clusterHeapStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterHeapStartSector () const
-
-inline
-
-
Returns
the cluster heap start sector.
- -
-
- -

◆ fatLength()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatLength () const
-
-inline
-
-
Returns
the FAT length in sectors
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatStartSector () const
-
-inline
-
-
Returns
the FAT start sector number.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::fatType () const
-
-inline
-
-
Returns
Type FAT_TYPE_EXFAT for exFAT partition or zero for error.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - - - -
uint32_t ExFatPartition::freeClusterCount ()
-
-
Returns
the free cluster count.
- -
-
- -

◆ init()

- -
-
- - - - - - - - - - - - - - - - - - -
bool ExFatPartition::init (BlockDevicedev,
uint8_t part 
)
-
-

Initialize a exFAT partition.

Parameters
- - - -
[in]devThe blockDevice for the partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirectoryCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::rootDirectoryCluster () const
-
-inline
-
-
Returns
the root directory start cluster number.
- -
-
- -

◆ rootLength()

- -
-
- - - - - - - -
uint32_t ExFatPartition::rootLength ()
-
-
Returns
the root directory length.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::sectorsPerCluster () const
-
-inline
-
-
Returns
the number of sectors in a cluster.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::sectorsPerClusterShift () const
-
-inline
-
-
Returns
the power of two for sectors per cluster.
- -
-
-

Friends And Related Function Documentation

- -

◆ ExFatFile

- -
-
- - - - - -
- - - - -
friend class ExFatFile
-
-friend
-
-

ExFatFile allowed access to private members.

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatPartition.h
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatPartition.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition__inherit__graph.png deleted file mode 100644 index 0bebc906..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_partition__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume-members.html deleted file mode 100644 index 29df91d9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume-members.html +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ExFatVolume Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(BlockDevice *dev, bool setCwv=true, uint8_t part=1)ExFatVolumeinline
bytesPerCluster() constExFatPartitioninline
bytesPerClusterShift() constExFatPartitioninline
bytesPerSector() constExFatPartitioninline
bytesPerSectorShift() constExFatPartitioninline
cacheClear()ExFatPartitioninline
chdir()ExFatVolumeinline
chdir(const ExChar_t *path)ExFatVolume
chdir(const String &path)ExFatVolumeinline
chvol()ExFatVolumeinline
clusterCount() constExFatPartitioninline
clusterHeapStartSector() constExFatPartitioninline
cwv()ExFatVolumeinlinestatic
ExFatPartition() (defined in ExFatPartition)ExFatPartitioninline
ExFatVolume() (defined in ExFatVolume)ExFatVolumeinline
exists(const ExChar_t *path)ExFatVolumeinline
exists(const String &path)ExFatVolumeinline
fatLength() constExFatPartitioninline
fatStartSector() constExFatPartitioninline
fatType() constExFatPartitioninline
freeClusterCount()ExFatPartition
init(BlockDevice *dev, uint8_t part)ExFatPartition
ls(print_t *pr, uint8_t flags=0)ExFatVolumeinline
ls(print_t *pr, const ExChar_t *path, uint8_t flags)ExFatVolumeinline
ls()ExFatVolumeinline
ls(uint8_t flags)ExFatVolumeinline
ls(const ExChar_t *path, uint8_t flags=0)ExFatVolumeinline
mkdir(const ExChar_t *path, bool pFlag=true)ExFatVolumeinline
mkdir(const String &path, bool pFlag=true)ExFatVolumeinline
open(const ExChar_t *path, oflag_t oflag=0X00)ExFatVolumeinline
open(const String &path, oflag_t oflag=0X00)ExFatVolumeinline
remove(const ExChar_t *path)ExFatVolumeinline
remove(const String &path)ExFatVolumeinline
rename(const ExChar_t *oldPath, const ExChar_t *newPath)ExFatVolumeinline
rename(const String &oldPath, const String &newPath)ExFatVolumeinline
rmdir(const ExChar_t *path)ExFatVolumeinline
rmdir(const String &path)ExFatVolumeinline
rootDirectoryCluster() constExFatPartitioninline
rootLength()ExFatPartition
sectorsPerCluster() constExFatPartitioninline
sectorsPerClusterShift() constExFatPartitioninline
truncate(const ExChar_t *path, uint64_t length)ExFatVolumeinline
truncate(const String &path, uint64_t length)ExFatVolumeinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume.html deleted file mode 100644 index abdeff84..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume.html +++ /dev/null @@ -1,1612 +0,0 @@ - - - - - - - -SdFat: ExFatVolume Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

exFAT volume. - More...

- -

#include <ExFatVolume.h>

-
-Inheritance diagram for ExFatVolume:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for ExFatVolume:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *dev, bool setCwv=true, uint8_t part=1)
 
uint32_t bytesPerCluster () const
 
uint8_t bytesPerClusterShift () const
 
uint16_t bytesPerSector () const
 
uint8_t bytesPerSectorShift () const
 
uint8_t * cacheClear ()
 
bool chdir ()
 
bool chdir (const ExChar_t *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount () const
 
uint32_t clusterHeapStartSector () const
 
bool exists (const ExChar_t *path)
 
bool exists (const String &path)
 
uint32_t fatLength () const
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
uint32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part)
 
bool ls ()
 
bool ls (const ExChar_t *path, uint8_t flags=0)
 
bool ls (print_t *pr, const ExChar_t *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags=0)
 
bool ls (uint8_t flags)
 
bool mkdir (const ExChar_t *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
ExFile open (const ExChar_t *path, oflag_t oflag=0X00)
 
ExFile open (const String &path, oflag_t oflag=0X00)
 
bool remove (const ExChar_t *path)
 
bool remove (const String &path)
 
bool rename (const ExChar_t *oldPath, const ExChar_t *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const ExChar_t *path)
 
bool rmdir (const String &path)
 
uint32_t rootDirectoryCluster () const
 
uint32_t rootLength ()
 
uint32_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
bool truncate (const ExChar_t *path, uint64_t length)
 
bool truncate (const String &path, uint64_t length)
 
- - - -

-Static Public Member Functions

static ExFatVolumecwv ()
 
-

Detailed Description

-

exFAT volume.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Member Function Documentation

- -

◆ begin()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatVolume::begin (BlockDevicedev,
bool setCwv = true,
uint8_t part = 1 
)
-
-inline
-
-

Initialize an FatVolume object.

Parameters
- - - - -
[in]devDevice block driver.
[in]setCwvSet current working volume if true.
[in]partpartition to initialize.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::bytesPerCluster () const
-
-inlineinherited
-
-
Returns
the number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerClusterShift () const
-
-inlineinherited
-
-
Returns
the power of two for bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t ExFatPartition::bytesPerSector () const
-
-inlineinherited
-
-
Returns
the number of bytes in a sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerSectorShift () const
-
-inlineinherited
-
-
Returns
the power of two for bytesPerSector.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
uint8_t* ExFatPartition::cacheClear ()
-
-inlineinherited
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool ExFatVolume::chdir ()
-
-inline
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - - - - -
bool ExFatVolume::chdir (const ExChar_t * path)
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::chdir (const String & path)
-
-inline
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void ExFatVolume::chvol ()
-
-inline
-
-

Change global working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterCount () const
-
-inlineinherited
-
-
Returns
the cluster count for the partition.
- -
-
- -

◆ clusterHeapStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterHeapStartSector () const
-
-inlineinherited
-
-
Returns
the cluster heap start sector.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static ExFatVolume* ExFatVolume::cwv ()
-
-inlinestatic
-
-
Returns
current working volume.
- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::exists (const ExChar_t * path)
-
-inline
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::exists (const String & path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatLength()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatLength () const
-
-inlineinherited
-
-
Returns
the FAT length in sectors
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatStartSector () const
-
-inlineinherited
-
-
Returns
the FAT start sector number.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::fatType () const
-
-inlineinherited
-
-
Returns
Type FAT_TYPE_EXFAT for exFAT partition or zero for error.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::freeClusterCount ()
-
-inherited
-
-
Returns
the free cluster count.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatPartition::init (BlockDevicedev,
uint8_t part 
)
-
-inherited
-
-

Initialize a exFAT partition.

Parameters
- - - -
[in]devThe blockDevice for the partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [1/5]

- -
-
- - - - - -
- - - - - - - -
bool ExFatVolume::ls ()
-
-inline
-
-

List the directory contents of the root directory to Serial.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (const ExChar_t * path,
uint8_t flags = 0 
)
-
-inline
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [3/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (print_tpr,
const ExChar_t * path,
uint8_t flags 
)
-
-inline
-
-

List the contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (print_tpr,
uint8_t flags = 0 
)
-
-inline
-
-

List the directory contents of the root directory.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [5/5]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::ls (uint8_t flags)
-
-inline
-
-

List the directory contents of the volume root to Serial.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::mkdir (const ExChar_t * path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ExFile ExFatVolume::open (const ExChar_t * path,
oflag_t oflag = 0X00 
)
-
-inline
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a ExFile object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ExFile ExFatVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-inline
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen oflag flags.
-
-
-
Returns
a ExFile object.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::remove (const ExChar_t * path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::remove (const String & path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::rename (const ExChar_t * oldPath,
const ExChar_t * newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::rmdir (const ExChar_t * path)
-
-inline
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::rmdir (const String & path)
-
-inline
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirectoryCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::rootDirectoryCluster () const
-
-inlineinherited
-
-
Returns
the root directory start cluster number.
- -
-
- -

◆ rootLength()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::rootLength ()
-
-inherited
-
-
Returns
the root directory length.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::sectorsPerCluster () const
-
-inlineinherited
-
-
Returns
the number of sectors in a cluster.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::sectorsPerClusterShift () const
-
-inlineinherited
-
-
Returns
the power of two for sectors per cluster.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::truncate (const ExChar_t * path,
uint64_t length 
)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::truncate (const String & path,
uint64_t length 
)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatVolume.h
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatVolume.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__coll__graph.png deleted file mode 100644 index 561a21ff..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__inherit__graph.png deleted file mode 100644 index 2590d24f..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_fat_volume__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file-members.html deleted file mode 100644 index 05f8ba27..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file-members.html +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ExFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()StreamFile< ExFatFile, uint64_t >inline
available64()ExFatFileinline
clearError()ExFatFileinline
clearWriteError()ExFatFileinline
close()ExFatFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)ExFatFile
curPosition() constExFatFileinline
dataLength()ExFatFileinline
dirIndex()ExFatFileinline
ExFatFile()ExFatFileinline
exists(const ExChar_t *path)ExFatFileinline
fgetpos(fspos_t *pos)ExFatFile
fgets(char *str, int num, char *delim=NULL)ExFatFile
fileSize()ExFatFileinline
firstSector()ExFatFile
flush()StreamFile< ExFatFile, uint64_t >inline
fsetpos(const fspos_t *pos)ExFatFile
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getError()ExFatFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)ExFatFile
getName(ExChar_t *name, size_t size)ExFatFile
getWriteError()ExFatFileinline
isContiguous() constExFatFileinline
isDir() constExFatFileinline
isDirectory()StreamFile< ExFatFile, uint64_t >inline
isFile() constExFatFileinline
isHidden() constExFatFileinline
isOpen() constExFatFileinline
isReadable() constExFatFileinline
isReadOnly() constExFatFileinline
isRoot() constExFatFileinline
isSubDir() constExFatFileinline
isWritable() constExFatFileinline
ls(print_t *pr)ExFatFile
ls(print_t *pr, uint8_t flags, uint8_t indent=0)ExFatFile
mkdir(ExFatFile *parent, const ExChar_t *path, bool pFlag=true)ExFatFile
name() constStreamFile< ExFatFile, uint64_t >inline
open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)ExFatFile
open(ExFatVolume *vol, const ExChar_t *path, int oflag)ExFatFile
open(ExFatFile *dirFile, uint32_t index, oflag_t oflag)ExFatFile
open(const ExChar_t *path, int oflag=0X00)ExFatFile
openNext(ExFatFile *dirFile, oflag_t oflag=0X00)ExFatFile
openNextFile(oflag_t oflag=0X00)ExFileinline
openRoot(ExFatVolume *vol)ExFatFile
operator bool()ExFatFileinline
peek()StreamFile< ExFatFile, uint64_t >inline
position()StreamFile< ExFatFile, uint64_t >inline
preAllocate(uint64_t length)ExFatFile
printAccessDateTime(print_t *pr)ExFatFile
printCreateDateTime(print_t *pr)ExFatFile
printField(double value, char term, uint8_t prec=2)ExFatFileinline
printField(float value, char term, uint8_t prec=2)ExFatFileinline
printField(Type value, char term)ExFatFileinline
printFileSize(print_t *pr)ExFatFile
printModifyDateTime(print_t *pr)ExFatFile
printName(print_t *pr)ExFatFile
read()StreamFile< ExFatFile, uint64_t >inline
ExFatFile::read(void *buf, size_t count)ExFatFile
remove()ExFatFile
remove(const ExChar_t *path)ExFatFile
rename(const ExChar_t *newPath)ExFatFile
rename(ExFatFile *dirFile, const ExChar_t *newPath)ExFatFile
rewind()ExFatFileinline
rewindDirectory()StreamFile< ExFatFile, uint64_t >inline
rmdir()ExFatFile
seek(uint64_t pos)StreamFile< ExFatFile, uint64_t >inline
seekCur(int64_t offset)ExFatFileinline
seekEnd(int64_t offset=0)ExFatFileinline
seekSet(uint64_t pos)ExFatFile
size()StreamFile< ExFatFile, uint64_t >inline
StreamFile() (defined in StreamFile< ExFatFile, uint64_t >)StreamFile< ExFatFile, uint64_t >inline
sync()ExFatFile
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)ExFatFile
truncate()ExFatFile
truncate(uint64_t length)ExFatFileinline
validLength()ExFatFileinline
write(uint8_t b)StreamFile< ExFatFile, uint64_t >inline
write(const uint8_t *buffer, size_t size)StreamFile< ExFatFile, uint64_t >inline
ExFatFile::write(const char *str)ExFatFileinline
ExFatFile::write(const void *buf, size_t count)ExFatFile
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file.html deleted file mode 100644 index bea831d3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file.html +++ /dev/null @@ -1,3034 +0,0 @@ - - - - - - - -SdFat: ExFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
ExFile Class Reference
-
-
- -

exFAT file with Arduino Stream. - More...

- -

#include <ExFatFile.h>

-
-Inheritance diagram for ExFile:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for ExFile:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
uint64_t available64 ()
 
void clearError ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
uint64_t curPosition () const
 
uint64_t dataLength ()
 
uint32_t dirIndex ()
 
bool exists (const ExChar_t *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=NULL)
 
uint64_t fileSize ()
 
uint32_t firstSector ()
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
size_t getName (ExChar_t *name, size_t size)
 
bool getWriteError ()
 
bool isContiguous () const
 
bool isDir () const
 
bool isDirectory ()
 
bool isFile () const
 
bool isHidden () const
 
bool isOpen () const
 
bool isReadable () const
 
bool isReadOnly () const
 
bool isRoot () const
 
bool isSubDir () const
 
bool isWritable () const
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, uint8_t flags, uint8_t indent=0)
 
bool mkdir (ExFatFile *parent, const ExChar_t *path, bool pFlag=true)
 
const char * name () const
 
bool open (const ExChar_t *path, int oflag=0X00)
 
bool open (ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)
 
bool open (ExFatFile *dirFile, uint32_t index, oflag_t oflag)
 
bool open (ExFatVolume *vol, const ExChar_t *path, int oflag)
 
bool openNext (ExFatFile *dirFile, oflag_t oflag=0X00)
 
ExFile openNextFile (oflag_t oflag=0X00)
 
bool openRoot (ExFatVolume *vol)
 
 operator bool ()
 
int peek ()
 
uint64_t position ()
 
bool preAllocate (uint64_t length)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
bool remove ()
 
bool remove (const ExChar_t *path)
 
bool rename (const ExChar_t *newPath)
 
bool rename (ExFatFile *dirFile, const ExChar_t *newPath)
 
void rewind ()
 
void rewindDirectory ()
 
bool rmdir ()
 
bool seek (uint64_t pos)
 
bool seekCur (int64_t offset)
 
bool seekEnd (int64_t offset=0)
 
bool seekSet (uint64_t pos)
 
uint64_t size ()
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint64_t length)
 
uint64_t validLength ()
 
size_t write (const char *str)
 
size_t write (const uint8_t *buffer, size_t size)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

exFAT file with Arduino Stream.

-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< ExFatFile , uint64_t >::available ()
-
-inlineinherited
-
-
Returns
number of bytes available from the current position to EOF or INT_MAX if more than INT_MAX bytes are available.
- -
-
- -

◆ available64()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::available64 ()
-
-inlineinherited
-
-
Returns
The number of bytes available from the current position to EOF for normal files. Zero is returned for directory files.
- -
-
- -

◆ clearError()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::clearError ()
-
-inlineinherited
-
-

Clear all error bits.

- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::clearWriteError ()
-
-inlineinherited
-
-

Clear writeError.

- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::close ()
-
-inherited
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-inherited
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Parameters may be nullptr.

-
Returns
true for success or false for failure.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::curPosition () const
-
-inlineinherited
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dataLength()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::dataLength ()
-
-inlineinherited
-
-
Returns
Total data length for file.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatFile::dirIndex ()
-
-inlineinherited
-
-
Returns
Directory entry index.
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::exists (const ExChar_t * path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
true if the file exists else false.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - -
- - - - - - - - -
void ExFatFile::fgetpos (fspos_t * pos)
-
-inherited
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int ExFatFile::fgets (char * str,
int num,
char * delim = NULL 
)
-
-inherited
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::fileSize ()
-
-inlineinherited
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatFile::firstSector ()
-
-inherited
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< ExFatFile , uint64_t >::flush ()
-
-inlineinherited
-
-

Ensure that any bytes written to the file are saved to the SD card.

- -
-
- -

◆ fsetpos()

- -
-
- - - - - -
- - - - - - - - -
void ExFatFile::fsetpos (const fspos_t * pos)
-
-inherited
-
-

Set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatFile::getError ()
-
-inlineinherited
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::getName (ExChar_t * name,
size_t size 
)
-
-inherited
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]sizeThe size of the array in characters.
-
-
-
Returns
the name length.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::getWriteError ()
-
-inlineinherited
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isContiguous () const
-
-inlineinherited
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isDir () const
-
-inlineinherited
-
-
Returns
True if this is a directory.
- -
-
- -

◆ isDirectory()

- -
-
- - - - - -
- - - - - - - -
bool StreamFile< ExFatFile , uint64_t >::isDirectory ()
-
-inlineinherited
-
-

This function reports if the current file is a directory or not.

Returns
true if the file is a directory.
- -
-
- -

◆ isFile()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isFile () const
-
-inlineinherited
-
-
Returns
True if this is a normal file.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isHidden () const
-
-inlineinherited
-
-
Returns
True if this is a hidden.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isOpen () const
-
-inlineinherited
-
-
Returns
true if the file is open.
- -
-
- -

◆ isReadable()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isReadable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ isReadOnly()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isReadOnly () const
-
-inlineinherited
-
-
Returns
True if file is read-only
- -
-
- -

◆ isRoot()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isRoot () const
-
-inlineinherited
-
-
Returns
True if this is the root directory.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isSubDir () const
-
-inlineinherited
-
-
Returns
True if this is a subdirectory.
- -
-
- -

◆ isWritable()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::isWritable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::ls (print_tpr)
-
-inherited
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint stream for list.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::ls (print_tpr,
uint8_t flags,
uint8_t indent = 0 
)
-
-inherited
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Parameters
- - -
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::mkdir (ExFatFileparent,
const ExChar_t * path,
bool pFlag = true 
)
-
-inherited
-
-

Make a new directory.

-
Parameters
- - - - -
[in]parentAn open directory file that will contain the new directory.
[in]pathA path with a valid name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ name()

- -
-
- - - - - -
- - - - - - - -
const char* StreamFile< ExFatFile , uint64_t >::name () const
-
-inlineinherited
-
-

No longer implemented due to Long File Names.

-

Use getName(char* name, size_t size).

Returns
a pointer to replacement suggestion.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (const ExChar_t * path,
int oflag = 0X00 
)
-
-inherited
-
-

Open a file in the current working directory.

-
Parameters
- - - -
[in]pathA path with a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see ExFatFile::open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatFiledirFile,
const ExChar_t * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirFileAn open directory containing the file to be opened.
[in]pathThe path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list. Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or O_RDWR is allowed.
-
-
-

O_RDONLY - Open for reading.

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one file object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatFiledirFile,
uint32_t index,
oflag_t oflag 
)
-
-inherited
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirFileAn open ExFatFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see ExFatFile::open(ExFatFile*, const ExChar_t*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::open (ExFatVolumevol,
const ExChar_t * path,
int oflag 
)
-
-inherited
-
-

Open a file in the volume working directory.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathwith a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::openNext (ExFatFiledirFile,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

Open the next file or subdirectory in a directory.

-
Parameters
- - - -
[in]dirFileAn open instance for the directory containing the file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see open(ExFatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNextFile()

- -
-
- - - - - -
- - - - - - - - -
ExFile ExFile::openNextFile (oflag_t oflag = 0X00)
-
-inline
-
-

Opens the next file or folder in a directory.

-
Parameters
- - -
[in]oflagopen flags.
-
-
-
Returns
a FatStream object.
- -
-
- -

◆ openRoot()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::openRoot (ExFatVolumevol)
-
-inherited
-
-

Open a volume's root directory.

-
Parameters
- - -
[in]volThe FAT volume containing the root directory to be opened.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ExFatFile::operator bool ()
-
-inlineinherited
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< ExFatFile , uint64_t >::peek ()
-
-inlineinherited
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ position()

- -
-
- - - - - -
- - - - - - - -
uint64_t StreamFile< ExFatFile , uint64_t >::position ()
-
-inlineinherited
-
-
Returns
the current file position.
- -
-
- -

◆ preAllocate()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::preAllocate (uint64_t length)
-
-inherited
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will have zero validLength and dataLength will equal the requested length.

-
Parameters
- - -
[in]lengthsize of allocated space in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::printAccessDateTime (print_tpr)
-
-inherited
-
-

Print a file's access date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::printCreateDateTime (print_tpr)
-
-inherited
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::printField (Type value,
char term 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::printFileSize (print_tpr)
-
-inherited
-
-

Print a file's size in bytes.

Parameters
- - -
[in]prPrtin stream for the output.
-
-
-
Returns
The number of bytes printed.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::printModifyDateTime (print_tpr)
-
-inherited
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printName()

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::printName (print_tpr)
-
-inherited
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int StreamFile< ExFatFile , uint64_t >::read ()
-
-inlineinherited
-
-

Read the next byte from a file.

-
Returns
For success return the next byte in the file as an int. If an error occurs or end of file is reached return -1.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int ExFatFile::read (void * buf,
size_t count 
)
-
-inherited
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::remove ()
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::remove (const ExChar_t * path)
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::rename (const ExChar_t * newPath)
-
-inherited
-
-

Rename a file or subdirectory.

-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatFile::rename (ExFatFiledirFile,
const ExChar_t * newPath 
)
-
-inherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void ExFatFile::rewind ()
-
-inlineinherited
-
-

Set the file's current position to zero.

- -
-
- -

◆ rewindDirectory()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< ExFatFile , uint64_t >::rewindDirectory ()
-
-inlineinherited
-
-

Rewind a file if it is a directory

- -
-
- -

◆ rmdir()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::rmdir ()
-
-inherited
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ seek()

- -
-
- - - - - -
- - - - - - - - -
bool StreamFile< ExFatFile , uint64_t >::seek (uint64_t pos)
-
-inlineinherited
-
-

Seek to a new position in the file, which must be between 0 and the size of the file (inclusive).

-
Parameters
- - -
[in]posthe new file position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::seekCur (int64_t offset)
-
-inlineinherited
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::seekEnd (int64_t offset = 0)
-
-inlineinherited
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::seekSet (uint64_t pos)
-
-inherited
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ size()

- -
-
- - - - - -
- - - - - - - -
uint64_t StreamFile< ExFatFile , uint64_t >::size ()
-
-inlineinherited
-
-
Returns
the file's size.
- -
-
- -

◆ sync()

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::sync ()
-
-inherited
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-inherited
-
-

Truncate a file at the current file position.

-
Returns
true for success or false for failure. Set a file's timestamps in its directory entry.
-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date and time.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool ExFatFile::truncate ()
-
-inherited
-
-

Truncate a file at the current file position. will be maintained if it is less than or equal to length otherwise it will be set to end of file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatFile::truncate (uint64_t length)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ validLength()

- -
-
- - - - - -
- - - - - - - -
uint64_t ExFatFile::validLength ()
-
-inlineinherited
-
-
Returns
The valid number of bytes in a file.
- -
-
- -

◆ write() [1/4]

- -
-
- - - - - -
- - - - - - - - -
size_t ExFatFile::write (const char * str)
-
-inlineinherited
-
-

Write a string to a file. Used by the Arduino Print class.

Parameters
- - -
[in]strPointer to the string. Use getWriteError to check for errors.
-
-
-
Returns
count of characters written for success or -1 for failure.
- -
-
- -

◆ write() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StreamFile< ExFatFile , uint64_t >::write (const uint8_t * buffer,
size_t size 
)
-
-inlineinherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufferPointer to the location of the data to be written.
[in]sizeNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always size.
- -
-
- -

◆ write() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t ExFatFile::write (const void * buf,
size_t count 
)
-
-inherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always count.
- -
-
- -

◆ write() [4/4]

- -
-
- - - - - -
- - - - - - - - -
size_t StreamFile< ExFatFile , uint64_t >::write (uint8_t b)
-
-inlineinherited
-
-

Write a byte to a file. Required by the Arduino Print class.

Parameters
- - -
[in]bthe byte to be written. Use getWriteError to check for errors.
-
-
-
Returns
1 for success and 0 for failure.
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__coll__graph.png deleted file mode 100644 index 9a11e99f..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__inherit__graph.png deleted file mode 100644 index 9a11e99f..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_ex_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache-members.html deleted file mode 100644 index 7b0b10e3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache-members.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FatCache Member List
-
-
- -

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

- - - - - - - - - - - - - - - - -
buffer()FatCacheinline
CACHE_FOR_READFatCachestatic
CACHE_FOR_WRITEFatCachestatic
CACHE_OPTION_NO_READFatCachestatic
CACHE_RESERVE_FOR_WRITEFatCachestatic
CACHE_STATUS_DIRTYFatCachestatic
CACHE_STATUS_MASKFatCachestatic
CACHE_STATUS_MIRROR_FATFatCachestatic
dirty()FatCacheinline
init(FatPartition *vol)FatCacheinline
invalidate()FatCacheinline
isDirty()FatCacheinline
read(uint32_t sector, uint8_t option)FatCache
sector()FatCacheinline
sync()FatCache
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache.html deleted file mode 100644 index ce6abd7d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_cache.html +++ /dev/null @@ -1,507 +0,0 @@ - - - - - - - -SdFat: FatCache Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Sector cache. - More...

- -

#include <FatPartition.h>

- - - - - - - - - - - - - - - - - - -

-Public Member Functions

cache_tbuffer ()
 
void dirty ()
 
void init (FatPartition *vol)
 
void invalidate ()
 
bool isDirty ()
 
cache_tread (uint32_t sector, uint8_t option)
 
uint32_t sector ()
 
bool sync ()
 
- - - - - - - - - - - - - - - -

-Static Public Attributes

static const uint8_t CACHE_FOR_READ = 0
 
static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY
 
static const uint8_t CACHE_OPTION_NO_READ = 4
 
static const uint8_t CACHE_RESERVE_FOR_WRITE = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ
 
static const uint8_t CACHE_STATUS_DIRTY = 1
 
static const uint8_t CACHE_STATUS_MASK = CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT
 
static const uint8_t CACHE_STATUS_MIRROR_FAT = 2
 
-

Detailed Description

-

Sector cache.

-

Member Function Documentation

- -

◆ buffer()

- -
-
- - - - - -
- - - - - - - -
cache_t* FatCache::buffer ()
-
-inline
-
-
Returns
Cache sector address.
- -
-
- -

◆ dirty()

- -
-
- - - - - -
- - - - - - - -
void FatCache::dirty ()
-
-inline
-
-

Set current sector dirty.

- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - -
void FatCache::init (FatPartitionvol)
-
-inline
-
-

Initialize the cache.

Parameters
- - -
[in]volFatPartition that owns this FatCache.
-
-
- -
-
- -

◆ invalidate()

- -
-
- - - - - -
- - - - - - - -
void FatCache::invalidate ()
-
-inline
-
-

Invalidate current cache sector.

- -
-
- -

◆ isDirty()

- -
-
- - - - - -
- - - - - - - -
bool FatCache::isDirty ()
-
-inline
-
-
Returns
dirty status
- -
-
- -

◆ read()

- -
-
- - - - - - - - - - - - - - - - - - -
cache_t * FatCache::read (uint32_t sector,
uint8_t option 
)
-
-

Read a sector into the cache.

Parameters
- - - -
[in]sectorSector to read.
[in]optionmode for cached sector.
-
-
-
Returns
Address of cached sector.
- -
-
- -

◆ sector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatCache::sector ()
-
-inline
-
-
Returns
Logical sector number for cached sector.
- -
-
- -

◆ sync()

- -
-
- - - - - - - -
bool FatCache::sync ()
-
-

Write current sector if dirty.

Returns
true for success or false for failure.
- -
-
-

Member Data Documentation

- -

◆ CACHE_FOR_READ

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_FOR_READ = 0
-
-static
-
-

Cache sector for read.

- -
-
- -

◆ CACHE_FOR_WRITE

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_FOR_WRITE = CACHE_STATUS_DIRTY
-
-static
-
-

Cache sector for write.

- -
-
- -

◆ CACHE_OPTION_NO_READ

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_OPTION_NO_READ = 4
-
-static
-
-

Sync existing sector but do not read new sector.

- -
-
- -

◆ CACHE_RESERVE_FOR_WRITE

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_RESERVE_FOR_WRITE = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ
-
-static
-
-

Reserve cache sector for write - do not read from sector device.

- -
-
- -

◆ CACHE_STATUS_DIRTY

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_STATUS_DIRTY = 1
-
-static
-
-

Cached sector is dirty

- -
-
- -

◆ CACHE_STATUS_MASK

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_STATUS_MASK = CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT
-
-static
-
-

Cache sector status bits

- -
-
- -

◆ CACHE_STATUS_MIRROR_FAT

- -
-
- - - - - -
- - - - -
const uint8_t FatCache::CACHE_STATUS_MIRROR_FAT = 2
-
-static
-
-

Cashed sector is FAT entry and must be mirrored in second FAT.

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatPartition.h
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatPartition.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file-members.html deleted file mode 100644 index 95dfc857..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file-members.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FatFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()FatFileinline
available32()FatFileinline
clearError()FatFileinline
clearWriteError()FatFileinline
close()FatFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)FatFile
createContiguous(FatFile *dirFile, const char *path, uint32_t size)FatFile
createContiguous(const char *path, uint32_t size)FatFile
curCluster() constFatFileinline
curPosition() constFatFileinline
dirEntry(DirFat_t *dir)FatFile
dirIndex()FatFileinline
dirSize()FatFile
dmpFile(print_t *pr, uint32_t pos, size_t n)FatFile
exists(const char *path)FatFileinline
FatFile()FatFileinline
FatFile(const char *path, oflag_t oflag)FatFileinline
FatVolume classFatFilefriend
fgetpos(fspos_t *pos)FatFile
fgets(char *str, int num, char *delim=NULL)FatFile
fileSize() constFatFileinline
firstBlock() constFatFileinline
firstSector() constFatFile
flush()FatFileinline
fsetpos(const fspos_t *pos)FatFile
getAccessDate(uint16_t *pdate)FatFile
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)FatFileinline
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getError()FatFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getName(char *name, size_t size)FatFile
getSFN(char *name)FatFile
getWriteError()FatFileinline
isContiguous() constFatFileinline
isDir() constFatFileinline
isFile() constFatFileinline
isHidden() constFatFileinline
isLFN() constFatFileinline
isOpen() constFatFileinline
isReadable() constFatFileinline
isReadOnly() constFatFileinline
isRoot() constFatFileinline
isRoot32() constFatFileinline
isRootFixed() constFatFileinline
isSubDir() constFatFileinline
isSystem() constFatFileinline
isWritable() constFatFileinline
legal83Char(uint8_t c)FatFileinlinestatic
ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)FatFile
ls(uint8_t flags=0)FatFileinline
mkdir(FatFile *dir, const char *path, bool pFlag=true)FatFile
open(FatVolume *vol, const char *path, oflag_t oflag)FatFile
open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFile
open(FatFile *dirFile, const char *path, oflag_t oflag)FatFile
open(const char *path, oflag_t oflag=0X00)FatFile
openNext(FatFile *dirFile, oflag_t oflag=0X00)FatFile
openRoot(FatVolume *vol)FatFile
operator bool()FatFileinline
peek()FatFile
preAllocate(uint32_t length)FatFile
printAccessDate(print_t *pr)FatFile
printAccessDateTime(print_t *pr)FatFileinline
printCreateDateTime(print_t *pr)FatFile
printFatDate(print_t *pr, uint16_t fatDate)FatFilestatic
printFatTime(print_t *pr, uint16_t fatTime)FatFilestatic
printField(double value, char term, uint8_t prec=2)FatFileinline
printField(float value, char term, uint8_t prec=2)FatFileinline
printField(Type value, char term)FatFileinline
printFileSize(print_t *pr)FatFile
printModifyDateTime(print_t *pr)FatFile
printName(print_t *pr)FatFile
printName()FatFileinline
printSFN(print_t *pr)FatFile
read()FatFileinline
read(void *buf, size_t count)FatFile
readDir(DirFat_t *dir)FatFile
remove()FatFile
remove(const char *path)FatFile
rename(const char *newPath)FatFile
rename(FatFile *dirFile, const char *newPath)FatFile
rewind()FatFileinline
rmdir()FatFile
rmRfStar()FatFile
seekCur(int32_t offset)FatFileinline
seekEnd(int32_t offset=0)FatFileinline
seekSet(uint32_t pos)FatFile
sync()FatFile
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)FatFile
truncate()FatFile
truncate(uint32_t length)FatFileinline
write(const char *str)FatFileinline
write(uint8_t b)FatFileinline
write(const void *buf, size_t count)FatFile
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file.html deleted file mode 100644 index 40cf1986..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file.html +++ /dev/null @@ -1,3225 +0,0 @@ - - - - - - - -SdFat: FatFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Basic file class. - More...

- -

#include <FatFile.h>

-
-Inheritance diagram for FatFile:
-
-
Inheritance graph
- - - - - - - - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
uint32_t available32 ()
 
void clearError ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
bool createContiguous (const char *path, uint32_t size)
 
bool createContiguous (FatFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (DirFat_t *dir)
 
uint16_t dirIndex ()
 
uint32_t dirSize ()
 
void dmpFile (print_t *pr, uint32_t pos, size_t n)
 
bool exists (const char *path)
 
 FatFile ()
 
 FatFile (const char *path, oflag_t oflag)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=NULL)
 
uint32_t fileSize () const
 
uint32_t firstBlock () const
 
uint32_t firstSector () const
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDate (uint16_t *pdate)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getName (char *name, size_t size)
 
bool getSFN (char *name)
 
bool getWriteError ()
 
bool isContiguous () const
 
bool isDir () const
 
bool isFile () const
 
bool isHidden () const
 
bool isLFN () const
 
bool isOpen () const
 
bool isReadable () const
 
bool isReadOnly () const
 
bool isRoot () const
 
bool isRoot32 () const
 
bool isRootFixed () const
 
bool isSubDir () const
 
bool isSystem () const
 
bool isWritable () const
 
bool ls (print_t *pr, uint8_t flags=0, uint8_t indent=0)
 
bool ls (uint8_t flags=0)
 
bool mkdir (FatFile *dir, const char *path, bool pFlag=true)
 
bool open (const char *path, oflag_t oflag=0X00)
 
bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
bool openNext (FatFile *dirFile, oflag_t oflag=0X00)
 
bool openRoot (FatVolume *vol)
 
 operator bool ()
 
int peek ()
 
bool preAllocate (uint32_t length)
 
size_t printAccessDate (print_t *pr)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName ()
 
size_t printName (print_t *pr)
 
size_t printSFN (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
int8_t readDir (DirFat_t *dir)
 
bool remove ()
 
bool remove (const char *path)
 
bool rename (const char *newPath)
 
bool rename (FatFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint32_t length)
 
size_t write (const char *str)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
- - - - - - - -

-Static Public Member Functions

static bool legal83Char (uint8_t c)
 
static void printFatDate (print_t *pr, uint16_t fatDate)
 
static void printFatTime (print_t *pr, uint16_t fatTime)
 
- - - -

-Friends

class FatVolume
 
-

Detailed Description

-

Basic file class.

-

Constructor & Destructor Documentation

- -

◆ FatFile() [1/2]

- -
-
- - - - - -
- - - - - - - -
FatFile::FatFile ()
-
-inline
-
-

Create an instance.

- -
-
- -

◆ FatFile() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
FatFile::FatFile (const char * path,
oflag_t oflag 
)
-
-inline
-
-

Create a file object and open it in the current working directory.

-
Parameters
- - - -
[in]pathA path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t).
-
-
- -
-
-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int FatFile::available ()
-
-inline
-
-
Returns
The number of bytes available from the current position to EOF for normal files. INT_MAX is returned for very large files.
-

available64() is recomended for very large files.

-

Zero is returned for directory files.

- -
-
- -

◆ available32()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::available32 ()
-
-inline
-
-
Returns
The number of bytes available from the current position to EOF for normal files. Zero is returned for directory files.
- -
-
- -

◆ clearError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearError ()
-
-inline
-
-

Clear all error bits.

- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearWriteError ()
-
-inline
-
-

Set writeError to zero

- -
-
- -

◆ close()

- -
-
- - - - - - - -
bool FatFile::close ()
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Set the contiguous flag if the file is contiguous. The parameters may be nullptr to only set the flag.

Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [1/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (const char * path,
uint32_t size 
)
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - -
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (FatFiledirFile,
const char * path,
uint32_t size 
)
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - - -
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ curCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curCluster () const
-
-inline
-
-
Returns
The current cluster number for a file or directory.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curPosition () const
-
-inline
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dirEntry()

- -
-
- - - - - - - - -
bool FatFile::dirEntry (DirFat_t * dir)
-
-

Return a file's directory entry.

-
Parameters
- - -
[out]dirLocation for return of the file's directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatFile::dirIndex ()
-
-inline
-
-
Returns
Directory entry index.
- -
-
- -

◆ dirSize()

- -
-
- - - - - - - -
uint32_t FatFile::dirSize ()
-
-
Returns
The number of bytes allocated to a directory or zero if an error occurs.
- -
-
- -

◆ dmpFile()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
void FatFile::dmpFile (print_tpr,
uint32_t pos,
size_t n 
)
-
-

Dump file in Hex

Parameters
- - - - -
[in]prPrint stream for list.
[in]posStart position in file.
[in]nnumber of locations to dump.
-
-
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::exists (const char * path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
True if the file exists.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - - - - -
void FatFile::fgetpos (fspos_t * pos)
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
int FatFile::fgets (char * str,
int num,
char * delim = NULL 
)
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::fileSize () const
-
-inline
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstBlock()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::firstBlock () const
-
-inline
-
-
Returns
first sector of file or zero for empty file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - - - -
uint32_t FatFile::firstSector () const
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void FatFile::flush ()
-
-inline
-
-

Arduino name for sync()

- -
-
- -

◆ fsetpos()

- -
-
- - - - - - - - -
void FatFile::fsetpos (const fspos_t * pos)
-
-

set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDate()

- -
-
- - - - - - - - -
bool FatFile::getAccessDate (uint16_t * pdate)
-
-

Get a file's access date.

-
Parameters
- - -
[out]pdatePacked date for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inline
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimereturn zero since FAT has no time.
-
-
-

This function is for comparability in FsFile.

-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatFile::getError ()
-
-inline
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-

Get a file's modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::getName (char * name,
size_t size 
)
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]sizeThe size of the array in bytes. The array must be at least 13 bytes long. The file's name will be truncated if the file's name is too long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getSFN()

- -
-
- - - - - - - - -
bool FatFile::getSFN (char * name)
-
-

Get a file's Short File Name followed by a zero byte.

-
Parameters
- - -
[out]nameAn array of characters for the file's name. The array must be at least 13 bytes long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::getWriteError ()
-
-inline
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isContiguous () const
-
-inline
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isDir () const
-
-inline
-
-
Returns
True if this is a directory.
- -
-
- -

◆ isFile()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isFile () const
-
-inline
-
-
Returns
True if this is a normal file.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isHidden () const
-
-inline
-
-
Returns
True if this is a hidden file.
- -
-
- -

◆ isLFN()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isLFN () const
-
-inline
-
-
Returns
true if this file has a Long File Name.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isOpen () const
-
-inline
-
-
Returns
True if this is an open file/directory.
- -
-
- -

◆ isReadable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadable () const
-
-inline
-
-
Returns
True file is writable.
- -
-
- -

◆ isReadOnly()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadOnly () const
-
-inline
-
-
Returns
True if file is read-only
- -
-
- -

◆ isRoot()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot () const
-
-inline
-
-
Returns
True if this is the root directory.
- -
-
- -

◆ isRoot32()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot32 () const
-
-inline
-
-
Returns
True if this is the FAT32 root directory.
- -
-
- -

◆ isRootFixed()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRootFixed () const
-
-inline
-
-
Returns
True if this is the FAT12 of FAT16 root directory.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSubDir () const
-
-inline
-
-
Returns
True if this is a subdirectory.
- -
-
- -

◆ isSystem()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSystem () const
-
-inline
-
-
Returns
True if this is a system file.
- -
-
- -

◆ isWritable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isWritable () const
-
-inline
-
-
Returns
True file is writable.
- -
-
- -

◆ legal83Char()

- -
-
- - - - - -
- - - - - - - - -
static bool FatFile::legal83Char (uint8_t c)
-
-inlinestatic
-
-

Check for a legal 8.3 character.

Parameters
- - -
[in]cCharacter to be checked.
-
-
-
Returns
true for a legal 8.3 character.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::ls (print_tpr,
uint8_t flags = 0,
uint8_t indent = 0 
)
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Parameters
- - -
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::ls (uint8_t flags = 0)
-
-inline
-
-

List directory contents.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::mkdir (FatFiledir,
const char * path,
bool pFlag = true 
)
-
-

Make a new directory.

-
Parameters
- - - - -
[in]dirAn open FatFile instance for the directory that will contain the new directory.
[in]pathA path with a valid name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::open (const char * path,
oflag_t oflag = 0X00 
)
-
-

Open a file in the current working volume.

-
Parameters
- - - -
[in]pathA path with a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
const char * path,
oflag_t oflag 
)
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]pathA path with a valid name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list. Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or O_RDWR is allowed.
-
-
-

O_RDONLY - Open for reading.

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one FatFile object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
uint16_t index,
oflag_t oflag 
)
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatVolumevol,
const char * path,
oflag_t oflag 
)
-
-

Open a file in the volume root directory.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathwith a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::openNext (FatFiledirFile,
oflag_t oflag = 0X00 
)
-
-

Open the next file or subdirectory in a directory.

-
Parameters
- - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openRoot()

- -
-
- - - - - - - - -
bool FatFile::openRoot (FatVolumevol)
-
-

Open a volume's root directory.

-
Parameters
- - -
[in]volThe FAT volume containing the root directory to be opened.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
FatFile::operator bool ()
-
-inline
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - - - -
int FatFile::peek ()
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ preAllocate()

- -
-
- - - - - - - - -
bool FatFile::preAllocate (uint32_t length)
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will contain uninitialized data.

-
Parameters
- - -
[in]lengthsize of the file in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDate()

- -
-
- - - - - - - - -
size_t FatFile::printAccessDate (print_tpr)
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printAccessDateTime (print_tpr)
-
-inline
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - - - - -
size_t FatFile::printCreateDateTime (print_tpr)
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of bytes printed.
- -
-
- -

◆ printFatDate()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatDate (print_tpr,
uint16_t fatDate 
)
-
-static
-
-

Print a directory date field.

-

Format is yyyy-mm-dd.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
-
-
- -
-
- -

◆ printFatTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatTime (print_tpr,
uint16_t fatTime 
)
-
-static
-
-

Print a directory time field.

-

Format is hh:mm:ss.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
-
-
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (Type value,
char term 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - - - - -
size_t FatFile::printFileSize (print_tpr)
-
-

Print a file's size.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - - - - -
size_t FatFile::printModifyDateTime (print_tpr)
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printName() [1/2]

- -
-
- - - - - -
- - - - - - - -
size_t FatFile::printName ()
-
-inline
-
-

Print a file's name.

-
Returns
true for success or false for failure.
- -
-
- -

◆ printName() [2/2]

- -
-
- - - - - - - - -
size_t FatFile::printName (print_tpr)
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printSFN()

- -
-
- - - - - - - - -
size_t FatFile::printSFN (print_tpr)
-
-

Print a file's Short File Name.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int FatFile::read ()
-
-inline
-
-

Read the next byte from a file.

-
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
int FatFile::read (void * buf,
size_t count 
)
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1.
- -
-
- -

◆ readDir()

- -
-
- - - - - - - - -
int8_t FatFile::readDir (DirFat_t * dir)
-
-

Read the next directory entry from a directory file.

-
Parameters
- - -
[out]dirThe DirFat_t struct that will receive the data.
-
-
-
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - - - -
bool FatFile::remove ()
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - - - - -
bool FatFile::remove (const char * path)
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - - - - -
bool FatFile::rename (const char * newPath)
-
-

Rename a file or subdirectory.

Note
the renamed file will be moved to the current volume working directory.
-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatFile::rename (FatFiledirFile,
const char * newPath 
)
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void FatFile::rewind ()
-
-inline
-
-

Set the file's current position to zero.

- -
-
- -

◆ rmdir()

- -
-
- - - - - - - -
bool FatFile::rmdir ()
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rmRfStar()

- -
-
- - - - - - - -
bool FatFile::rmRfStar ()
-
-

Recursively delete a directory and all contained files.

-

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

-

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekCur (int32_t offset)
-
-inline
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekEnd (int32_t offset = 0)
-
-inline
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - - - - -
bool FatFile::seekSet (uint32_t pos)
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ sync()

- -
-
- - - - - - - -
bool FatFile::sync ()
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-

Set a file's timestamps in its directory entry.

-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - - - -
bool FatFile::truncate ()
-
-

Truncate a file at the current file position. will be maintained if it is less than or equal to length otherwise it will be set to end of file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::truncate (uint32_t length)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ write() [1/3]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::write (const char * str)
-
-inline
-
-

Write a string to a file. Used by the Arduino Print class.

Parameters
- - -
[in]strPointer to the string. Use getWriteError to check for errors.
-
-
-
Returns
count of characters written for success or -1 for failure.
- -
-
- -

◆ write() [2/3]

- -
-
- - - - - - - - - - - - - - - - - - -
size_t FatFile::write (const void * buf,
size_t count 
)
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always count. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
- -
-
- -

◆ write() [3/3]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::write (uint8_t b)
-
-inline
-
-

Write a single byte.

Parameters
- - -
[in]bThe byte to be written.
-
-
-
Returns
+1 for success or -1 for failure.
- -
-
-

Friends And Related Function Documentation

- -

◆ FatVolume

- -
-
- - - - - -
- - - - -
friend class FatVolume
-
-friend
-
-

FatVolume allowed access to private members.

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatFile.h
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatFile.cpp
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatFileLFN.cpp
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatFilePrint.cpp
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatFileSFN.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file__inherit__graph.png deleted file mode 100644 index 936f4b5f..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter-members.html deleted file mode 100644 index c68ba218..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter-members.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FatFormatter Member List
-
-
- -

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

- - -
format(BlockDevice *dev, uint8_t *secBuffer, print_t *pr=NULL)FatFormatter
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter.html deleted file mode 100644 index bbeacb53..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_formatter.html +++ /dev/null @@ -1,146 +0,0 @@ - - - - - - - -SdFat: FatFormatter Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
FatFormatter Class Reference
-
-
- -

Format a FAT volume. - More...

- -

#include <FatFormatter.h>

- - - - -

-Public Member Functions

bool format (BlockDevice *dev, uint8_t *secBuffer, print_t *pr=NULL)
 
-

Detailed Description

-

Format a FAT volume.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Member Function Documentation

- -

◆ format()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFormatter::format (BlockDevicedev,
uint8_t * secBuffer,
print_tpr = NULL 
)
-
-

Format a FAT volume.

-
Parameters
- - - - -
[in]devBlock device for volume.
[in]secBufferbuffer for writing to volume.
[in]prPrint device for progress output.
-
-
-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatFormatter.h
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatFormatter.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition-members.html deleted file mode 100644 index 18344b6c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition-members.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FatPartition Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - -
bytesPerCluster()FatPartitioninline
bytesPerClusterShift()FatPartitioninline
bytesPerSector()FatPartitioninline
bytesPerSectorShift()FatPartitioninline
cacheClear()FatPartitioninline
clusterCount() constFatPartitioninline
dataStartSector() constFatPartitioninline
dbgFat(uint32_t n, uint32_t *v)FatPartitioninline
FatCache classFatPartitionfriend
fatCount()FatPartitioninline
FatFile classFatPartitionfriend
FatPartition()FatPartitioninline
fatStartSector() constFatPartitioninline
fatType() constFatPartitioninline
freeClusterCount()FatPartition
init(BlockDevice *dev, uint8_t part=1)FatPartition
rootDirEntryCount() constFatPartitioninline
rootDirStart() constFatPartitioninline
sectorMask()FatPartitioninline
sectorsPerCluster() constFatPartitioninline
sectorsPerClusterShift() constFatPartitioninline
sectorsPerFat() constFatPartitioninline
volumeSectorCount() constFatPartitioninline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition.html deleted file mode 100644 index 52e1e85e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition.html +++ /dev/null @@ -1,773 +0,0 @@ - - - - - - - -SdFat: FatPartition Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
FatPartition Class Reference
-
-
- -

Access FAT16 and FAT32 partitions on raw file devices. - More...

- -

#include <FatPartition.h>

-
-Inheritance diagram for FatPartition:
-
-
Inheritance graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

uint16_t bytesPerCluster ()
 
uint8_t bytesPerClusterShift ()
 
uint16_t bytesPerSector ()
 
uint8_t bytesPerSectorShift ()
 
cache_tcacheClear ()
 
uint32_t clusterCount () const
 
uint32_t dataStartSector () const
 
int8_t dbgFat (uint32_t n, uint32_t *v)
 
uint8_t fatCount ()
 
 FatPartition ()
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
int32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part=1)
 
uint16_t rootDirEntryCount () const
 
uint32_t rootDirStart () const
 
uint16_t sectorMask ()
 
uint8_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
uint32_t sectorsPerFat () const
 
uint32_t volumeSectorCount () const
 
- - - - - -

-Friends

class FatCache
 
class FatFile
 
-

Detailed Description

-

Access FAT16 and FAT32 partitions on raw file devices.

-

Constructor & Destructor Documentation

- -

◆ FatPartition()

- -
-
- - - - - -
- - - - - - - -
FatPartition::FatPartition ()
-
-inline
-
-

Create an instance of FatPartition

- -
-
-

Member Function Documentation

- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerCluster ()
-
-inline
-
-
Returns
Number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerClusterShift ()
-
-inline
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerSector ()
-
-inline
-
-
Returns
Number of bytes per sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerSectorShift ()
-
-inline
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
cache_t* FatPartition::cacheClear ()
-
-inline
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::clusterCount () const
-
-inline
-
-
Returns
The total number of clusters in the volume.
- -
-
- -

◆ dataStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::dataStartSector () const
-
-inline
-
-
Returns
The logical sector number for the start of file data.
- -
-
- -

◆ dbgFat()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int8_t FatPartition::dbgFat (uint32_t n,
uint32_t * v 
)
-
-inline
-
-

Debug access to FAT table

-
Parameters
- - - -
[in]ncluster number.
[out]vvalue of entry
-
-
-
Returns
-1 error, 0 EOC, else 1.
- -
-
- -

◆ fatCount()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatCount ()
-
-inline
-
-
Returns
The number of File Allocation Tables.
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::fatStartSector () const
-
-inline
-
-
Returns
The logical sector number for the start of the first FAT.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatType () const
-
-inline
-
-
Returns
The FAT type of the volume. Values are 12, 16 or 32.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - - - -
int32_t FatPartition::freeClusterCount ()
-
-

Volume free space in clusters.

-
Returns
Count of free clusters for success or -1 if an error occurs.
- -
-
- -

◆ init()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FatPartition::init (BlockDevicedev,
uint8_t part = 1 
)
-
-

Initialize a FAT partition.

-
Parameters
- - - -
[in]devBlockDevice for this partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirEntryCount()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::rootDirEntryCount () const
-
-inline
-
-
Returns
The number of entries in the root directory for FAT16 volumes.
- -
-
- -

◆ rootDirStart()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::rootDirStart () const
-
-inline
-
-
Returns
The logical sector number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes.
- -
-
- -

◆ sectorMask()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::sectorMask ()
-
-inline
-
-
Returns
Mask for sector offset.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerCluster () const
-
-inline
-
-
Returns
The volume's cluster size in sectors.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerClusterShift () const
-
-inline
-
-
Returns
The shift count required to multiply by sectorsPerCluster.
- -
-
- -

◆ sectorsPerFat()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::sectorsPerFat () const
-
-inline
-
-
Returns
The number of sectors in one FAT.
- -
-
- -

◆ volumeSectorCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::volumeSectorCount () const
-
-inline
-
-
Returns
The number of sectors in the volume
- -
-
-

Friends And Related Function Documentation

- -

◆ FatCache

- -
-
- - - - - -
- - - - -
friend class FatCache
-
-friend
-
-

FatCache allowed access to private members.

- -
-
- -

◆ FatFile

- -
-
- - - - - -
- - - - -
friend class FatFile
-
-friend
-
-

FatFile allowed access to private members.

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatPartition.h
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatPartition.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition__inherit__graph.png deleted file mode 100644 index 1f468393..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_partition__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume-members.html deleted file mode 100644 index ba316f15..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume-members.html +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FatVolume Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(BlockDevice *dev, bool setCwv=true, uint8_t part=1)FatVolumeinline
bytesPerCluster()FatPartitioninline
bytesPerClusterShift()FatPartitioninline
bytesPerSector()FatPartitioninline
bytesPerSectorShift()FatPartitioninline
cacheClear()FatPartitioninline
chdir()FatVolumeinline
chdir(const char *path)FatVolume
chdir(const String &path)FatVolumeinline
chvol()FatVolumeinline
clusterCount() constFatPartitioninline
cwv()FatVolumeinlinestatic
dataStartSector() constFatPartitioninline
dbgFat(uint32_t n, uint32_t *v)FatPartitioninline
exists(const char *path)FatVolumeinline
exists(const String &path)FatVolumeinline
fatCount()FatPartitioninline
FatPartition()FatPartitioninline
fatStartSector() constFatPartitioninline
fatType() constFatPartitioninline
freeClusterCount()FatPartition
init(BlockDevice *dev, uint8_t part=1)FatPartition
ls(print_t *pr, uint8_t flags=0)FatVolumeinline
ls(print_t *pr, const char *path, uint8_t flags)FatVolumeinline
ls(uint8_t flags=0)FatVolumeinline
ls(const char *path, uint8_t flags=0)FatVolumeinline
mkdir(const char *path, bool pFlag=true)FatVolumeinline
mkdir(const String &path, bool pFlag=true)FatVolumeinline
open(const char *path, oflag_t oflag=0X00)FatVolumeinline
open(const String &path, oflag_t oflag=0X00)FatVolumeinline
remove(const char *path)FatVolumeinline
remove(const String &path)FatVolumeinline
rename(const char *oldPath, const char *newPath)FatVolumeinline
rename(const String &oldPath, const String &newPath)FatVolumeinline
rmdir(const char *path)FatVolumeinline
rmdir(const String &path)FatVolumeinline
rootDirEntryCount() constFatPartitioninline
rootDirStart() constFatPartitioninline
sectorMask()FatPartitioninline
sectorsPerCluster() constFatPartitioninline
sectorsPerClusterShift() constFatPartitioninline
sectorsPerFat() constFatPartitioninline
truncate(const char *path, uint32_t length)FatVolumeinline
truncate(const String &path, uint32_t length)FatVolumeinline
volumeSectorCount() constFatPartitioninline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume.html deleted file mode 100644 index c5f85aad..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume.html +++ /dev/null @@ -1,1711 +0,0 @@ - - - - - - - -SdFat: FatVolume Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Integration class for the FatLib library. - More...

- -

#include <FatVolume.h>

-
-Inheritance diagram for FatVolume:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for FatVolume:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *dev, bool setCwv=true, uint8_t part=1)
 
uint16_t bytesPerCluster ()
 
uint8_t bytesPerClusterShift ()
 
uint16_t bytesPerSector ()
 
uint8_t bytesPerSectorShift ()
 
cache_tcacheClear ()
 
bool chdir ()
 
bool chdir (const char *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount () const
 
uint32_t dataStartSector () const
 
int8_t dbgFat (uint32_t n, uint32_t *v)
 
bool exists (const char *path)
 
bool exists (const String &path)
 
uint8_t fatCount ()
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
int32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part=1)
 
bool ls (const char *path, uint8_t flags=0)
 
bool ls (print_t *pr, const char *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags=0)
 
bool ls (uint8_t flags=0)
 
bool mkdir (const char *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
File32 open (const char *path, oflag_t oflag=0X00)
 
File32 open (const String &path, oflag_t oflag=0X00)
 
bool remove (const char *path)
 
bool remove (const String &path)
 
bool rename (const char *oldPath, const char *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const char *path)
 
bool rmdir (const String &path)
 
uint16_t rootDirEntryCount () const
 
uint32_t rootDirStart () const
 
uint16_t sectorMask ()
 
uint8_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
uint32_t sectorsPerFat () const
 
bool truncate (const char *path, uint32_t length)
 
bool truncate (const String &path, uint32_t length)
 
uint32_t volumeSectorCount () const
 
- - - -

-Static Public Member Functions

static FatVolumecwv ()
 
-

Detailed Description

-

Integration class for the FatLib library.

-

Member Function Documentation

- -

◆ begin()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatVolume::begin (BlockDevicedev,
bool setCwv = true,
uint8_t part = 1 
)
-
-inline
-
-

Initialize an FatVolume object.

Parameters
- - - - -
[in]devDevice block driver.
[in]setCwvSet current working volume if true.
[in]partpartition to initialize.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerCluster ()
-
-inlineinherited
-
-
Returns
Number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerClusterShift ()
-
-inlineinherited
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerSector ()
-
-inlineinherited
-
-
Returns
Number of bytes per sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerSectorShift ()
-
-inlineinherited
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
cache_t* FatPartition::cacheClear ()
-
-inlineinherited
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool FatVolume::chdir ()
-
-inline
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - - - - -
bool FatVolume::chdir (const char * path)
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::chdir (const String & path)
-
-inline
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void FatVolume::chvol ()
-
-inline
-
-

Change global current working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::clusterCount () const
-
-inlineinherited
-
-
Returns
The total number of clusters in the volume.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static FatVolume* FatVolume::cwv ()
-
-inlinestatic
-
-
Returns
current working volume.
- -
-
- -

◆ dataStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::dataStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of file data.
- -
-
- -

◆ dbgFat()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int8_t FatPartition::dbgFat (uint32_t n,
uint32_t * v 
)
-
-inlineinherited
-
-

Debug access to FAT table

-
Parameters
- - - -
[in]ncluster number.
[out]vvalue of entry
-
-
-
Returns
-1 error, 0 EOC, else 1.
- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::exists (const char * path)
-
-inline
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::exists (const String & path)
-
-inline
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatCount()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatCount ()
-
-inlineinherited
-
-
Returns
The number of File Allocation Tables.
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::fatStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of the first FAT.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatType () const
-
-inlineinherited
-
-
Returns
The FAT type of the volume. Values are 12, 16 or 32.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
int32_t FatPartition::freeClusterCount ()
-
-inherited
-
-

Volume free space in clusters.

-
Returns
Count of free clusters for success or -1 if an error occurs.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatPartition::init (BlockDevicedev,
uint8_t part = 1 
)
-
-inherited
-
-

Initialize a FAT partition.

-
Parameters
- - - -
[in]devBlockDevice for this partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (const char * path,
uint8_t flags = 0 
)
-
-inline
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (print_tpr,
const char * path,
uint8_t flags 
)
-
-inline
-
-

List the contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (print_tpr,
uint8_t flags = 0 
)
-
-inline
-
-

List the directory contents of the volume root directory.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/4]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::ls (uint8_t flags = 0)
-
-inline
-
-

List the directory contents of the root directory to Serial.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::mkdir (const char * path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
File32 FatVolume::open (const char * path,
oflag_t oflag = 0X00 
)
-
-inline
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a File32 object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
File32 FatVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-inline
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a File32 object.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::remove (const char * path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::remove (const String & path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::rename (const char * oldPath,
const char * newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::rmdir (const char * path)
-
-inline
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::rmdir (const String & path)
-
-inline
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirEntryCount()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::rootDirEntryCount () const
-
-inlineinherited
-
-
Returns
The number of entries in the root directory for FAT16 volumes.
- -
-
- -

◆ rootDirStart()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::rootDirStart () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes.
- -
-
- -

◆ sectorMask()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::sectorMask ()
-
-inlineinherited
-
-
Returns
Mask for sector offset.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerCluster () const
-
-inlineinherited
-
-
Returns
The volume's cluster size in sectors.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerClusterShift () const
-
-inlineinherited
-
-
Returns
The shift count required to multiply by sectorsPerCluster.
- -
-
- -

◆ sectorsPerFat()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::sectorsPerFat () const
-
-inlineinherited
-
-
Returns
The number of sectors in one FAT.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::truncate (const char * path,
uint32_t length 
)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::truncate (const String & path,
uint32_t length 
)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ volumeSectorCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::volumeSectorCount () const
-
-inlineinherited
-
-
Returns
The number of sectors in the volume
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatVolume.h
  • -
  • Arduino/libraries/SdFat/src/FatLib/FatVolume.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__coll__graph.png deleted file mode 100644 index 986a8d3e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__inherit__graph.png deleted file mode 100644 index 5ff55073..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fat_volume__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32-members.html deleted file mode 100644 index 6cf4358a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32-members.html +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
File32 Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()StreamFile< FatFile, uint32_t >inline
available32()FatFileinline
clearError()FatFileinline
clearWriteError()FatFileinline
close()FatFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)FatFile
createContiguous(FatFile *dirFile, const char *path, uint32_t size)FatFile
createContiguous(const char *path, uint32_t size)FatFile
curCluster() constFatFileinline
curPosition() constFatFileinline
dirEntry(DirFat_t *dir)FatFile
dirIndex()FatFileinline
dirSize()FatFile
dmpFile(print_t *pr, uint32_t pos, size_t n)FatFile
exists(const char *path)FatFileinline
FatFile()FatFileinline
FatFile(const char *path, oflag_t oflag)FatFileinline
fgetpos(fspos_t *pos)FatFile
fgets(char *str, int num, char *delim=NULL)FatFile
fileSize() constFatFileinline
firstBlock() constFatFileinline
firstSector() constFatFile
flush()StreamFile< FatFile, uint32_t >inline
fsetpos(const fspos_t *pos)FatFile
getAccessDate(uint16_t *pdate)FatFile
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)FatFileinline
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getError()FatFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getName(char *name, size_t size)FatFile
getSFN(char *name)FatFile
getWriteError()FatFileinline
isContiguous() constFatFileinline
isDir() constFatFileinline
isDirectory()StreamFile< FatFile, uint32_t >inline
isFile() constFatFileinline
isHidden() constFatFileinline
isLFN() constFatFileinline
isOpen() constFatFileinline
isReadable() constFatFileinline
isReadOnly() constFatFileinline
isRoot() constFatFileinline
isRoot32() constFatFileinline
isRootFixed() constFatFileinline
isSubDir() constFatFileinline
isSystem() constFatFileinline
isWritable() constFatFileinline
legal83Char(uint8_t c)FatFileinlinestatic
ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)FatFile
ls(uint8_t flags=0)FatFileinline
mkdir(FatFile *dir, const char *path, bool pFlag=true)FatFile
name() constStreamFile< FatFile, uint32_t >inline
open(FatVolume *vol, const char *path, oflag_t oflag)FatFile
open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFile
open(FatFile *dirFile, const char *path, oflag_t oflag)FatFile
open(const char *path, oflag_t oflag=0X00)FatFile
openNext(FatFile *dirFile, oflag_t oflag=0X00)FatFile
openNextFile(oflag_t oflag=0X00)File32inline
openRoot(FatVolume *vol)FatFile
operator bool()FatFileinline
peek()StreamFile< FatFile, uint32_t >inline
position()StreamFile< FatFile, uint32_t >inline
preAllocate(uint32_t length)FatFile
printAccessDate(print_t *pr)FatFile
printAccessDateTime(print_t *pr)FatFileinline
printCreateDateTime(print_t *pr)FatFile
printFatDate(print_t *pr, uint16_t fatDate)FatFilestatic
printFatTime(print_t *pr, uint16_t fatTime)FatFilestatic
printField(double value, char term, uint8_t prec=2)FatFileinline
printField(float value, char term, uint8_t prec=2)FatFileinline
printField(Type value, char term)FatFileinline
printFileSize(print_t *pr)FatFile
printModifyDateTime(print_t *pr)FatFile
printName(print_t *pr)FatFile
printName()FatFileinline
printSFN(print_t *pr)FatFile
read()StreamFile< FatFile, uint32_t >inline
FatFile::read(void *buf, size_t count)FatFile
readDir(DirFat_t *dir)FatFile
remove()FatFile
remove(const char *path)FatFile
rename(const char *newPath)FatFile
rename(FatFile *dirFile, const char *newPath)FatFile
rewind()FatFileinline
rewindDirectory()StreamFile< FatFile, uint32_t >inline
rmdir()FatFile
rmRfStar()FatFile
seek(uint32_t pos)StreamFile< FatFile, uint32_t >inline
seekCur(int32_t offset)FatFileinline
seekEnd(int32_t offset=0)FatFileinline
seekSet(uint32_t pos)FatFile
size()StreamFile< FatFile, uint32_t >inline
StreamFile() (defined in StreamFile< FatFile, uint32_t >)StreamFile< FatFile, uint32_t >inline
sync()FatFile
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)FatFile
truncate()FatFile
truncate(uint32_t length)FatFileinline
write(uint8_t b)StreamFile< FatFile, uint32_t >inline
write(const uint8_t *buffer, size_t size)StreamFile< FatFile, uint32_t >inline
FatFile::write(const char *str)FatFileinline
FatFile::write(const void *buf, size_t count)FatFile
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32.html deleted file mode 100644 index 71cdd1f3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32.html +++ /dev/null @@ -1,3740 +0,0 @@ - - - - - - - -SdFat: File32 Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

FAT16/FAT32 file with Arduino Stream. - More...

- -

#include <FatFile.h>

-
-Inheritance diagram for File32:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for File32:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
uint32_t available32 ()
 
void clearError ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
bool createContiguous (const char *path, uint32_t size)
 
bool createContiguous (FatFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (DirFat_t *dir)
 
uint16_t dirIndex ()
 
uint32_t dirSize ()
 
void dmpFile (print_t *pr, uint32_t pos, size_t n)
 
bool exists (const char *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=NULL)
 
uint32_t fileSize () const
 
uint32_t firstBlock () const
 
uint32_t firstSector () const
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDate (uint16_t *pdate)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getName (char *name, size_t size)
 
bool getSFN (char *name)
 
bool getWriteError ()
 
bool isContiguous () const
 
bool isDir () const
 
bool isDirectory ()
 
bool isFile () const
 
bool isHidden () const
 
bool isLFN () const
 
bool isOpen () const
 
bool isReadable () const
 
bool isReadOnly () const
 
bool isRoot () const
 
bool isRoot32 () const
 
bool isRootFixed () const
 
bool isSubDir () const
 
bool isSystem () const
 
bool isWritable () const
 
bool ls (print_t *pr, uint8_t flags=0, uint8_t indent=0)
 
bool ls (uint8_t flags=0)
 
bool mkdir (FatFile *dir, const char *path, bool pFlag=true)
 
const char * name () const
 
bool open (const char *path, oflag_t oflag=0X00)
 
bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
bool openNext (FatFile *dirFile, oflag_t oflag=0X00)
 
File32 openNextFile (oflag_t oflag=0X00)
 
bool openRoot (FatVolume *vol)
 
 operator bool ()
 
int peek ()
 
uint32_t position ()
 
bool preAllocate (uint32_t length)
 
size_t printAccessDate (print_t *pr)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName ()
 
size_t printName (print_t *pr)
 
size_t printSFN (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
int8_t readDir (DirFat_t *dir)
 
bool remove ()
 
bool remove (const char *path)
 
bool rename (const char *newPath)
 
bool rename (FatFile *dirFile, const char *newPath)
 
void rewind ()
 
void rewindDirectory ()
 
bool rmdir ()
 
bool rmRfStar ()
 
bool seek (uint32_t pos)
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
uint32_t size ()
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint32_t length)
 
size_t write (const char *str)
 
size_t write (const uint8_t *buffer, size_t size)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
- - - - - - - -

-Static Public Member Functions

static bool legal83Char (uint8_t c)
 
static void printFatDate (print_t *pr, uint16_t fatDate)
 
static void printFatTime (print_t *pr, uint16_t fatTime)
 
-

Detailed Description

-

FAT16/FAT32 file with Arduino Stream.

-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FatFile , uint32_t >::available ()
-
-inlineinherited
-
-
Returns
number of bytes available from the current position to EOF or INT_MAX if more than INT_MAX bytes are available.
- -
-
- -

◆ available32()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::available32 ()
-
-inlineinherited
-
-
Returns
The number of bytes available from the current position to EOF for normal files. Zero is returned for directory files.
- -
-
- -

◆ clearError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearError ()
-
-inlineinherited
-
-

Clear all error bits.

- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearWriteError ()
-
-inlineinherited
-
-

Set writeError to zero

- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::close ()
-
-inherited
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-inherited
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Set the contiguous flag if the file is contiguous. The parameters may be nullptr to only set the flag.

Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (const char * path,
uint32_t size 
)
-
-inherited
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - -
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (FatFiledirFile,
const char * path,
uint32_t size 
)
-
-inherited
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - - -
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ curCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curCluster () const
-
-inlineinherited
-
-
Returns
The current cluster number for a file or directory.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curPosition () const
-
-inlineinherited
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dirEntry()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::dirEntry (DirFat_t * dir)
-
-inherited
-
-

Return a file's directory entry.

-
Parameters
- - -
[out]dirLocation for return of the file's directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatFile::dirIndex ()
-
-inlineinherited
-
-
Returns
Directory entry index.
- -
-
- -

◆ dirSize()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::dirSize ()
-
-inherited
-
-
Returns
The number of bytes allocated to a directory or zero if an error occurs.
- -
-
- -

◆ dmpFile()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
void FatFile::dmpFile (print_tpr,
uint32_t pos,
size_t n 
)
-
-inherited
-
-

Dump file in Hex

Parameters
- - - - -
[in]prPrint stream for list.
[in]posStart position in file.
[in]nnumber of locations to dump.
-
-
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::exists (const char * path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
True if the file exists.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - -
- - - - - - - - -
void FatFile::fgetpos (fspos_t * pos)
-
-inherited
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int FatFile::fgets (char * str,
int num,
char * delim = NULL 
)
-
-inherited
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::fileSize () const
-
-inlineinherited
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstBlock()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::firstBlock () const
-
-inlineinherited
-
-
Returns
first sector of file or zero for empty file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::firstSector () const
-
-inherited
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< FatFile , uint32_t >::flush ()
-
-inlineinherited
-
-

Ensure that any bytes written to the file are saved to the SD card.

- -
-
- -

◆ fsetpos()

- -
-
- - - - - -
- - - - - - - - -
void FatFile::fsetpos (const fspos_t * pos)
-
-inherited
-
-

set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDate()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::getAccessDate (uint16_t * pdate)
-
-inherited
-
-

Get a file's access date.

-
Parameters
- - -
[out]pdatePacked date for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inlineinherited
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimereturn zero since FAT has no time.
-
-
-

This function is for comparability in FsFile.

-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatFile::getError ()
-
-inlineinherited
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getName (char * name,
size_t size 
)
-
-inherited
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]sizeThe size of the array in bytes. The array must be at least 13 bytes long. The file's name will be truncated if the file's name is too long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getSFN()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::getSFN (char * name)
-
-inherited
-
-

Get a file's Short File Name followed by a zero byte.

-
Parameters
- - -
[out]nameAn array of characters for the file's name. The array must be at least 13 bytes long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::getWriteError ()
-
-inlineinherited
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isContiguous () const
-
-inlineinherited
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isDir () const
-
-inlineinherited
-
-
Returns
True if this is a directory.
- -
-
- -

◆ isDirectory()

- -
-
- - - - - -
- - - - - - - -
bool StreamFile< FatFile , uint32_t >::isDirectory ()
-
-inlineinherited
-
-

This function reports if the current file is a directory or not.

Returns
true if the file is a directory.
- -
-
- -

◆ isFile()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isFile () const
-
-inlineinherited
-
-
Returns
True if this is a normal file.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isHidden () const
-
-inlineinherited
-
-
Returns
True if this is a hidden file.
- -
-
- -

◆ isLFN()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isLFN () const
-
-inlineinherited
-
-
Returns
true if this file has a Long File Name.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isOpen () const
-
-inlineinherited
-
-
Returns
True if this is an open file/directory.
- -
-
- -

◆ isReadable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ isReadOnly()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadOnly () const
-
-inlineinherited
-
-
Returns
True if file is read-only
- -
-
- -

◆ isRoot()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot () const
-
-inlineinherited
-
-
Returns
True if this is the root directory.
- -
-
- -

◆ isRoot32()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot32 () const
-
-inlineinherited
-
-
Returns
True if this is the FAT32 root directory.
- -
-
- -

◆ isRootFixed()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRootFixed () const
-
-inlineinherited
-
-
Returns
True if this is the FAT12 of FAT16 root directory.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSubDir () const
-
-inlineinherited
-
-
Returns
True if this is a subdirectory.
- -
-
- -

◆ isSystem()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSystem () const
-
-inlineinherited
-
-
Returns
True if this is a system file.
- -
-
- -

◆ isWritable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isWritable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ legal83Char()

- -
-
- - - - - -
- - - - - - - - -
static bool FatFile::legal83Char (uint8_t c)
-
-inlinestaticinherited
-
-

Check for a legal 8.3 character.

Parameters
- - -
[in]cCharacter to be checked.
-
-
-
Returns
true for a legal 8.3 character.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::ls (print_tpr,
uint8_t flags = 0,
uint8_t indent = 0 
)
-
-inherited
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Parameters
- - -
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::ls (uint8_t flags = 0)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::mkdir (FatFiledir,
const char * path,
bool pFlag = true 
)
-
-inherited
-
-

Make a new directory.

-
Parameters
- - - - -
[in]dirAn open FatFile instance for the directory that will contain the new directory.
[in]pathA path with a valid name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ name()

- -
-
- - - - - -
- - - - - - - -
const char* StreamFile< FatFile , uint32_t >::name () const
-
-inlineinherited
-
-

No longer implemented due to Long File Names.

-

Use getName(char* name, size_t size).

Returns
a pointer to replacement suggestion.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::open (const char * path,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

Open a file in the current working volume.

-
Parameters
- - - -
[in]pathA path with a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
const char * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]pathA path with a valid name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list. Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or O_RDWR is allowed.
-
-
-

O_RDONLY - Open for reading.

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one FatFile object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
uint16_t index,
oflag_t oflag 
)
-
-inherited
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatVolumevol,
const char * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file in the volume root directory.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathwith a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::openNext (FatFiledirFile,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

Open the next file or subdirectory in a directory.

-
Parameters
- - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNextFile()

- -
-
- - - - - -
- - - - - - - - -
File32 File32::openNextFile (oflag_t oflag = 0X00)
-
-inline
-
-

Opens the next file or folder in a directory.

-
Parameters
- - -
[in]oflagopen flags.
-
-
-
Returns
a FatStream object.
- -
-
- -

◆ openRoot()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::openRoot (FatVolumevol)
-
-inherited
-
-

Open a volume's root directory.

-
Parameters
- - -
[in]volThe FAT volume containing the root directory to be opened.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
FatFile::operator bool ()
-
-inlineinherited
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FatFile , uint32_t >::peek ()
-
-inlineinherited
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ position()

- -
-
- - - - - -
- - - - - - - -
uint32_t StreamFile< FatFile , uint32_t >::position ()
-
-inlineinherited
-
-
Returns
the current file position.
- -
-
- -

◆ preAllocate()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::preAllocate (uint32_t length)
-
-inherited
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will contain uninitialized data.

-
Parameters
- - -
[in]lengthsize of the file in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDate()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printAccessDate (print_tpr)
-
-inherited
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printAccessDateTime (print_tpr)
-
-inlineinherited
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printCreateDateTime (print_tpr)
-
-inherited
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of bytes printed.
- -
-
- -

◆ printFatDate()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatDate (print_tpr,
uint16_t fatDate 
)
-
-staticinherited
-
-

Print a directory date field.

-

Format is yyyy-mm-dd.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
-
-
- -
-
- -

◆ printFatTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatTime (print_tpr,
uint16_t fatTime 
)
-
-staticinherited
-
-

Print a directory time field.

-

Format is hh:mm:ss.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
-
-
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (Type value,
char term 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printFileSize (print_tpr)
-
-inherited
-
-

Print a file's size.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printModifyDateTime (print_tpr)
-
-inherited
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printName() [1/2]

- -
-
- - - - - -
- - - - - - - -
size_t FatFile::printName ()
-
-inlineinherited
-
-

Print a file's name.

-
Returns
true for success or false for failure.
- -
-
- -

◆ printName() [2/2]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printName (print_tpr)
-
-inherited
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printSFN()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printSFN (print_tpr)
-
-inherited
-
-

Print a file's Short File Name.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FatFile , uint32_t >::read ()
-
-inlineinherited
-
-

Read the next byte from a file.

-
Returns
For success return the next byte in the file as an int. If an error occurs or end of file is reached return -1.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int FatFile::read (void * buf,
size_t count 
)
-
-inherited
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1.
- -
-
- -

◆ readDir()

- -
-
- - - - - -
- - - - - - - - -
int8_t FatFile::readDir (DirFat_t * dir)
-
-inherited
-
-

Read the next directory entry from a directory file.

-
Parameters
- - -
[out]dirThe DirFat_t struct that will receive the data.
-
-
-
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FatFile::remove ()
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::remove (const char * path)
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::rename (const char * newPath)
-
-inherited
-
-

Rename a file or subdirectory.

Note
the renamed file will be moved to the current volume working directory.
-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::rename (FatFiledirFile,
const char * newPath 
)
-
-inherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void FatFile::rewind ()
-
-inlineinherited
-
-

Set the file's current position to zero.

- -
-
- -

◆ rewindDirectory()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< FatFile , uint32_t >::rewindDirectory ()
-
-inlineinherited
-
-

Rewind a file if it is a directory

- -
-
- -

◆ rmdir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::rmdir ()
-
-inherited
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rmRfStar()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::rmRfStar ()
-
-inherited
-
-

Recursively delete a directory and all contained files.

-

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

-

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
-
Returns
true for success or false for failure.
- -
-
- -

◆ seek()

- -
-
- - - - - -
- - - - - - - - -
bool StreamFile< FatFile , uint32_t >::seek (uint32_t pos)
-
-inlineinherited
-
-

Seek to a new position in the file, which must be between 0 and the size of the file (inclusive).

-
Parameters
- - -
[in]posthe new file position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekCur (int32_t offset)
-
-inlineinherited
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekEnd (int32_t offset = 0)
-
-inlineinherited
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekSet (uint32_t pos)
-
-inherited
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ size()

- -
-
- - - - - -
- - - - - - - -
uint32_t StreamFile< FatFile , uint32_t >::size ()
-
-inlineinherited
-
-
Returns
the file's size.
- -
-
- -

◆ sync()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::sync ()
-
-inherited
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-inherited
-
-

Set a file's timestamps in its directory entry.

-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FatFile::truncate ()
-
-inherited
-
-

Truncate a file at the current file position. will be maintained if it is less than or equal to length otherwise it will be set to end of file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::truncate (uint32_t length)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ write() [1/4]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::write (const char * str)
-
-inlineinherited
-
-

Write a string to a file. Used by the Arduino Print class.

Parameters
- - -
[in]strPointer to the string. Use getWriteError to check for errors.
-
-
-
Returns
count of characters written for success or -1 for failure.
- -
-
- -

◆ write() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StreamFile< FatFile , uint32_t >::write (const uint8_t * buffer,
size_t size 
)
-
-inlineinherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufferPointer to the location of the data to be written.
[in]sizeNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always size.
- -
-
- -

◆ write() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FatFile::write (const void * buf,
size_t count 
)
-
-inherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always count. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
- -
-
- -

◆ write() [4/4]

- -
-
- - - - - -
- - - - - - - - -
size_t StreamFile< FatFile , uint32_t >::write (uint8_t b)
-
-inlineinherited
-
-

Write a byte to a file. Required by the Arduino Print class.

Parameters
- - -
[in]bthe byte to be written. Use getWriteError to check for errors.
-
-
-
Returns
1 for success and 0 for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/FatLib/FatFile.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__coll__graph.png deleted file mode 100644 index ae9a14b5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__inherit__graph.png deleted file mode 100644 index ae9a14b5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_file32__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file-members.html deleted file mode 100644 index 48a73ff3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file-members.html +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FsBaseFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()FsBaseFileinline
clearWriteError()FsBaseFileinline
close()FsBaseFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)FsBaseFileinline
curPosition()FsBaseFileinline
dirIndex()FsBaseFileinline
exists(const char *path)FsBaseFileinline
fgetpos(fspos_t *pos)FsBaseFileinline
fgets(char *str, int num, char *delim=nullptr)FsBaseFileinline
fileSize()FsBaseFileinline
firstSector()FsBaseFileinline
flush()FsBaseFileinline
FsBaseFile() (defined in FsBaseFile)FsBaseFileinline
FsBaseFile(const FsBaseFile &from)FsBaseFile
fsetpos(const fspos_t *pos)FsBaseFileinline
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getError()FsBaseFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getName(char *name, size_t len)FsBaseFileinline
getWriteError()FsBaseFileinline
isContiguous()FsBaseFileinline
isDir()FsBaseFileinline
isDirectory()FsBaseFileinline
isHidden()FsBaseFileinline
isOpen()FsBaseFileinline
isSubDir()FsBaseFileinline
ls(print_t *pr)FsBaseFileinline
ls(print_t *pr, uint8_t flags)FsBaseFileinline
mkdir(FsBaseFile *dir, const char *path, bool pFlag=true)FsBaseFile
name() constFsBaseFileinline
open(FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)FsBaseFile
open(FsBaseFile *dir, uint32_t index, oflag_t oflag)FsBaseFile
open(FsVolume *vol, const char *path, oflag_t oflag)FsBaseFile
open(const char *path, oflag_t oflag=O_RDONLY)FsBaseFileinline
openNext(FsBaseFile *dir, oflag_t oflag=O_RDONLY)FsBaseFile
operator bool()FsBaseFileinline
operator=(const FsBaseFile &from)FsBaseFile
peek()FsBaseFileinline
position()FsBaseFileinline
preAllocate(uint64_t length)FsBaseFileinline
printAccessDateTime(print_t *pr)FsBaseFileinline
printCreateDateTime(print_t *pr)FsBaseFileinline
printField(double value, char term, uint8_t prec=2)FsBaseFileinline
printField(float value, char term, uint8_t prec=2)FsBaseFileinline
printField(Type value, char term)FsBaseFileinline
printFileSize(print_t *pr)FsBaseFileinline
printModifyDateTime(print_t *pr)FsBaseFileinline
printName(print_t *pr)FsBaseFileinline
read()FsBaseFileinline
read(void *buf, size_t count)FsBaseFileinline
remove()FsBaseFile
remove(const char *path)FsBaseFileinline
rename(const char *newPath)FsBaseFileinline
rename(FsBaseFile *dirFile, const char *newPath)FsBaseFileinline
rewind()FsBaseFileinline
rewindDirectory()FsBaseFileinline
rmdir()FsBaseFile
seek(uint64_t pos)FsBaseFileinline
seekCur(int64_t offset)FsBaseFileinline
seekEnd(int64_t offset=0)FsBaseFileinline
seekSet(uint64_t pos)FsBaseFileinline
size()FsBaseFileinline
sync()FsBaseFileinline
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)FsBaseFileinline
truncate()FsBaseFileinline
truncate(uint64_t length)FsBaseFileinline
write(uint8_t b)FsBaseFileinline
write(const void *buf, size_t count)FsBaseFileinline
~FsBaseFile() (defined in FsBaseFile)FsBaseFileinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file.html deleted file mode 100644 index cc1f2e5f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file.html +++ /dev/null @@ -1,2599 +0,0 @@ - - - - - - - -SdFat: FsBaseFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
FsBaseFile Class Reference
-
-
- -

FsBaseFile class. - More...

- -

#include <FsFile.h>

-
-Inheritance diagram for FsBaseFile:
-
-
Inheritance graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
uint64_t curPosition ()
 
uint32_t dirIndex ()
 
bool exists (const char *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=nullptr)
 
uint64_t fileSize ()
 
uint32_t firstSector ()
 
void flush ()
 
 FsBaseFile (const FsBaseFile &from)
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
size_t getName (char *name, size_t len)
 
bool getWriteError ()
 
bool isContiguous ()
 
bool isDir ()
 
bool isDirectory ()
 
bool isHidden ()
 
bool isOpen ()
 
bool isSubDir ()
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, uint8_t flags)
 
bool mkdir (FsBaseFile *dir, const char *path, bool pFlag=true)
 
const char * name () const
 
bool open (const char *path, oflag_t oflag=O_RDONLY)
 
bool open (FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)
 
bool open (FsBaseFile *dir, uint32_t index, oflag_t oflag)
 
bool open (FsVolume *vol, const char *path, oflag_t oflag)
 
bool openNext (FsBaseFile *dir, oflag_t oflag=O_RDONLY)
 
 operator bool ()
 
FsBaseFileoperator= (const FsBaseFile &from)
 
int peek ()
 
uint64_t position ()
 
bool preAllocate (uint64_t length)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
bool remove ()
 
bool remove (const char *path)
 
bool rename (const char *newPath)
 
bool rename (FsBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
void rewindDirectory ()
 
bool rmdir ()
 
bool seek (uint64_t pos)
 
bool seekCur (int64_t offset)
 
bool seekEnd (int64_t offset=0)
 
bool seekSet (uint64_t pos)
 
uint64_t size ()
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint64_t length)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

FsBaseFile class.

-

Constructor & Destructor Documentation

- -

◆ FsBaseFile()

- -
-
- - - - - - - - -
FsBaseFile::FsBaseFile (const FsBaseFilefrom)
-
-

Copy constructor.

-
Parameters
- - -
[in]fromObject used to initialize this instance.
-
-
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int FsBaseFile::available ()
-
-inline
-
-
Returns
number of bytes available from the current position to EOF or INT_MAX if more than INT_MAX bytes are available.
- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::clearWriteError ()
-
-inline
-
-

Clear writeError.

- -
-
- -

◆ close()

- -
-
- - - - - - - -
bool FsBaseFile::close ()
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-inline
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Set contiguous flag for FAT16/FAT32 files. Parameters may be nullptr.

-
Returns
true for success or false for failure.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::curPosition ()
-
-inline
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsBaseFile::dirIndex ()
-
-inline
-
-
Returns
Directory entry index.
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::exists (const char * path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
true if the file exists else false.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - -
- - - - - - - - -
void FsBaseFile::fgetpos (fspos_t * pos)
-
-inline
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int FsBaseFile::fgets (char * str,
int num,
char * delim = nullptr 
)
-
-inline
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::fileSize ()
-
-inline
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsBaseFile::firstSector ()
-
-inline
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::flush ()
-
-inline
-
-

Ensure that any bytes written to the file are saved to the SD card.

- -
-
- -

◆ fsetpos()

- -
-
- - - - - -
- - - - - - - - -
void FsBaseFile::fsetpos (const fspos_t * pos)
-
-inline
-
-

set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inline
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inline
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t FsBaseFile::getError ()
-
-inline
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inline
-
-

Get a file's Modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::getName (char * name,
size_t len 
)
-
-inline
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]lenThe size of the array in bytes. The array must be at least 13 bytes long. The file's name will be truncated if the file's name is too long.
-
-
-
Returns
The length of the returned string.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::getWriteError ()
-
-inline
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isContiguous ()
-
-inline
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isDir ()
-
-inline
-
-
Returns
True if this is a directory else false.
- -
-
- -

◆ isDirectory()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isDirectory ()
-
-inline
-
-

This function reports if the current file is a directory or not.

Returns
true if the file is a directory.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isHidden ()
-
-inline
-
-
Returns
True if this is a hidden file else false.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isOpen ()
-
-inline
-
-
Returns
True if this is an open file/directory else false.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isSubDir ()
-
-inline
-
-
Returns
True if this is a subdirectory file else false.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::ls (print_tpr)
-
-inline
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint object.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::ls (print_tpr,
uint8_t flags 
)
-
-inline
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint object.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::mkdir (FsBaseFiledir,
const char * path,
bool pFlag = true 
)
-
-

Make a new directory.

-
Parameters
- - - - -
[in]dirAn open FatFile instance for the directory that will contain the new directory.
[in]pathA path with a valid 8.3 DOS name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ name()

- -
-
- - - - - -
- - - - - - - -
const char* FsBaseFile::name () const
-
-inline
-
-

No longer implemented due to Long File Names.

-

Use getName(char* name, size_t size).

Returns
a pointer to replacement suggestion.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (const char * path,
oflag_t oflag = O_RDONLY 
)
-
-inline
-
-

Open a file or directory by name.

-
Parameters
- - - -
[in]pathA path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsBaseFiledir,
const char * path,
oflag_t oflag = O_RDONLY 
)
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirAn open file instance for the directory containing the file to be opened.
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

O_RDONLY - Open for reading only..

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing only.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one file object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsBaseFiledir,
uint32_t index,
oflag_t oflag 
)
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirAn open FsFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see FsFile::open(FsFile*, const char*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsVolumevol,
const char * path,
oflag_t oflag 
)
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathA path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::openNext (FsBaseFiledir,
oflag_t oflag = O_RDONLY 
)
-
-

Opens the next file or folder in a directory.

Parameters
- - - -
[in]dirdirectory containing files.
[in]oflagopen flags.
-
-
-
Returns
a file object.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
FsBaseFile::operator bool ()
-
-inline
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ operator=()

- -
-
- - - - - - - - -
FsBaseFile & FsBaseFile::operator= (const FsBaseFilefrom)
-
-

Copy assignment operator

Parameters
- - -
[in]fromObject used to initialize this instance.
-
-
-
Returns
assigned object.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int FsBaseFile::peek ()
-
-inline
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ position()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::position ()
-
-inline
-
-
Returns
the current file position.
- -
-
- -

◆ preAllocate()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::preAllocate (uint64_t length)
-
-inline
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will contain uninitialized data for FAT16/FAT32 files. exFAT files will have zero validLength and dataLength will equal the requested length.

-
Parameters
- - -
[in]lengthsize of the file in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printAccessDateTime (print_tpr)
-
-inline
-
-

Print a file's access date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printCreateDateTime (print_tpr)
-
-inline
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (Type value,
char term 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printFileSize (print_tpr)
-
-inline
-
-

Print a file's size.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printModifyDateTime (print_tpr)
-
-inline
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printName()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printName (print_tpr)
-
-inline
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int FsBaseFile::read ()
-
-inline
-
-

Read the next byte from a file.

-
Returns
For success return the next byte in the file as an int. If an error occurs or end of file is reached return -1.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int FsBaseFile::read (void * buf,
size_t count 
)
-
-inline
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than count, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1. Possible errors include read() called before a file has been opened, corrupt file system or an I/O error occurred.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - - - -
bool FsBaseFile::remove ()
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::remove (const char * path)
-
-inline
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::rename (const char * newPath)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::rename (FsBaseFiledirFile,
const char * newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::rewind ()
-
-inline
-
-

Set the file's current position to zero.

- -
-
- -

◆ rewindDirectory()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::rewindDirectory ()
-
-inline
-
-

Rewind a file if it is a directory

- -
-
- -

◆ rmdir()

- -
-
- - - - - - - -
bool FsBaseFile::rmdir ()
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ seek()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seek (uint64_t pos)
-
-inline
-
-

Seek to a new position in the file, which must be between 0 and the size of the file (inclusive).

-
Parameters
- - -
[in]posthe new file position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekCur (int64_t offset)
-
-inline
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekEnd (int64_t offset = 0)
-
-inline
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekSet (uint64_t pos)
-
-inline
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ size()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::size ()
-
-inline
-
-
Returns
the file's size.
- -
-
- -

◆ sync()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::sync ()
-
-inline
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-inline
-
-

Set a file's timestamps in its directory entry.

-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date and time.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::truncate ()
-
-inline
-
-

Truncate a file to the current position.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::truncate (uint64_t length)
-
-inline
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ write() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::write (const void * buf,
size_t count 
)
-
-inline
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always nbyte. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
- -
-
- -

◆ write() [2/2]

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::write (uint8_t b)
-
-inline
-
-

Write a byte to a file. Required by the Arduino Print class.

Parameters
- - -
[in]bthe byte to be written. Use getWriteError to check for errors.
-
-
-
Returns
1 for success and 0 for failure.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FsLib/FsFile.h
  • -
  • Arduino/libraries/SdFat/src/FsLib/FsFile.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file__inherit__graph.png deleted file mode 100644 index d72ae9e9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_base_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache-members.html deleted file mode 100644 index 540c5de1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache-members.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FsCache Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - -
CACHE_FOR_READFsCachestatic
CACHE_FOR_WRITEFsCachestatic
CACHE_OPTION_NO_READFsCachestatic
CACHE_RESERVE_FOR_WRITEFsCachestatic
CACHE_STATUS_DIRTYFsCachestatic
CACHE_STATUS_MASKFsCachestatic
cacheBuffer()FsCacheinline
clear()FsCacheinline
dirty()FsCacheinline
FsCache() (defined in FsCache)FsCacheinline
get(uint32_t sector, uint8_t option)FsCache
init(BlockDevice *blockDev)FsCacheinline
invalidate()FsCache
isDirty()FsCacheinline
sector()FsCacheinline
sync()FsCache
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache.html deleted file mode 100644 index 6e6ff5a3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_cache.html +++ /dev/null @@ -1,502 +0,0 @@ - - - - - - - -SdFat: FsCache Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Sector cache. - More...

- -

#include <ExFatPartition.h>

- - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

uint8_t * cacheBuffer ()
 
uint8_t * clear ()
 
void dirty ()
 
uint8_t * get (uint32_t sector, uint8_t option)
 
void init (BlockDevice *blockDev)
 
void invalidate ()
 
bool isDirty ()
 
uint32_t sector ()
 
bool sync ()
 
- - - - - - - - - - - - - -

-Static Public Attributes

static const uint8_t CACHE_FOR_READ = 0
 
static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY
 
static const uint8_t CACHE_OPTION_NO_READ = 2
 
static const uint8_t CACHE_RESERVE_FOR_WRITE = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ
 
static const uint8_t CACHE_STATUS_DIRTY = 1
 
static const uint8_t CACHE_STATUS_MASK = CACHE_STATUS_DIRTY
 
-

Detailed Description

-

Sector cache.

-

Member Function Documentation

- -

◆ cacheBuffer()

- -
-
- - - - - -
- - - - - - - -
uint8_t* FsCache::cacheBuffer ()
-
-inline
-
-
Returns
Cache sector address.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - -
uint8_t* FsCache::clear ()
-
-inline
-
-
Returns
Clear the cache and returns a pointer to the cache.
- -
-
- -

◆ dirty()

- -
-
- - - - - -
- - - - - - - -
void FsCache::dirty ()
-
-inline
-
-

Set current sector dirty.

- -
-
- -

◆ get()

- -
-
- - - - - - - - - - - - - - - - - - -
uint8_t * FsCache::get (uint32_t sector,
uint8_t option 
)
-
-

Fill cache with sector data.

Parameters
- - - -
[in]sectorSector to read.
[in]optionmode for cached sector.
-
-
-
Returns
Address of cached sector.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - -
void FsCache::init (BlockDeviceblockDev)
-
-inline
-
-

Initialize the cache.

Parameters
- - -
[in]blockDevBlock device for this partition.
-
-
- -
-
- -

◆ invalidate()

- -
-
- - - - - - - -
void FsCache::invalidate ()
-
-

Invalidate current cache sector.

- -
-
- -

◆ isDirty()

- -
-
- - - - - -
- - - - - - - -
bool FsCache::isDirty ()
-
-inline
-
-
Returns
dirty status
- -
-
- -

◆ sector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsCache::sector ()
-
-inline
-
-
Returns
Logical sector number for cached sector.
- -
-
- -

◆ sync()

- -
-
- - - - - - - -
bool FsCache::sync ()
-
-

Write current sector if dirty.

Returns
true for success or false for failure.
- -
-
-

Member Data Documentation

- -

◆ CACHE_FOR_READ

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_FOR_READ = 0
-
-static
-
-

Cache sector for read.

- -
-
- -

◆ CACHE_FOR_WRITE

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_FOR_WRITE = CACHE_STATUS_DIRTY
-
-static
-
-

Cache sector for write.

- -
-
- -

◆ CACHE_OPTION_NO_READ

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_OPTION_NO_READ = 2
-
-static
-
-

Sync existing sector but do not read new sector.

- -
-
- -

◆ CACHE_RESERVE_FOR_WRITE

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_RESERVE_FOR_WRITE = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ
-
-static
-
-

Reserve cache sector for write - do not read from sector device.

- -
-
- -

◆ CACHE_STATUS_DIRTY

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_STATUS_DIRTY = 1
-
-static
-
-

Cached sector is dirty

- -
-
- -

◆ CACHE_STATUS_MASK

- -
-
- - - - - -
- - - - -
const uint8_t FsCache::CACHE_STATUS_MASK = CACHE_STATUS_DIRTY
-
-static
-
-

Cache sector status bits

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatPartition.h
  • -
  • Arduino/libraries/SdFat/src/ExFatLib/ExFatPartition.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file-members.html deleted file mode 100644 index b2f41d35..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file-members.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FsFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()StreamFile< FsBaseFile, uint64_t >inline
clearWriteError()FsBaseFileinline
close()FsBaseFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)FsBaseFileinline
curPosition()FsBaseFileinline
dirIndex()FsBaseFileinline
exists(const char *path)FsBaseFileinline
fgetpos(fspos_t *pos)FsBaseFileinline
fgets(char *str, int num, char *delim=nullptr)FsBaseFileinline
fileSize()FsBaseFileinline
firstSector()FsBaseFileinline
flush()StreamFile< FsBaseFile, uint64_t >inline
FsBaseFile() (defined in FsBaseFile)FsBaseFileinline
FsBaseFile(const FsBaseFile &from)FsBaseFile
fsetpos(const fspos_t *pos)FsBaseFileinline
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getError()FsBaseFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)FsBaseFileinline
getName(char *name, size_t len)FsBaseFileinline
getWriteError()FsBaseFileinline
isContiguous()FsBaseFileinline
isDir()FsBaseFileinline
isDirectory()StreamFile< FsBaseFile, uint64_t >inline
isHidden()FsBaseFileinline
isOpen()FsBaseFileinline
isSubDir()FsBaseFileinline
ls(print_t *pr)FsBaseFileinline
ls(print_t *pr, uint8_t flags)FsBaseFileinline
mkdir(FsBaseFile *dir, const char *path, bool pFlag=true)FsBaseFile
name() constStreamFile< FsBaseFile, uint64_t >inline
open(FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)FsBaseFile
open(FsBaseFile *dir, uint32_t index, oflag_t oflag)FsBaseFile
open(FsVolume *vol, const char *path, oflag_t oflag)FsBaseFile
open(const char *path, oflag_t oflag=O_RDONLY)FsBaseFileinline
openNext(FsBaseFile *dir, oflag_t oflag=O_RDONLY)FsBaseFile
openNextFile(oflag_t oflag=O_RDONLY)FsFileinline
operator bool()FsBaseFileinline
operator=(const FsBaseFile &from)FsBaseFile
peek()StreamFile< FsBaseFile, uint64_t >inline
position()StreamFile< FsBaseFile, uint64_t >inline
preAllocate(uint64_t length)FsBaseFileinline
printAccessDateTime(print_t *pr)FsBaseFileinline
printCreateDateTime(print_t *pr)FsBaseFileinline
printField(double value, char term, uint8_t prec=2)FsBaseFileinline
printField(float value, char term, uint8_t prec=2)FsBaseFileinline
printField(Type value, char term)FsBaseFileinline
printFileSize(print_t *pr)FsBaseFileinline
printModifyDateTime(print_t *pr)FsBaseFileinline
printName(print_t *pr)FsBaseFileinline
read()StreamFile< FsBaseFile, uint64_t >inline
FsBaseFile::read(void *buf, size_t count)FsBaseFileinline
remove()FsBaseFile
remove(const char *path)FsBaseFileinline
rename(const char *newPath)FsBaseFileinline
rename(FsBaseFile *dirFile, const char *newPath)FsBaseFileinline
rewind()FsBaseFileinline
rewindDirectory()StreamFile< FsBaseFile, uint64_t >inline
rmdir()FsBaseFile
seek(uint64_t pos)StreamFile< FsBaseFile, uint64_t >inline
seekCur(int64_t offset)FsBaseFileinline
seekEnd(int64_t offset=0)FsBaseFileinline
seekSet(uint64_t pos)FsBaseFileinline
size()StreamFile< FsBaseFile, uint64_t >inline
StreamFile() (defined in StreamFile< FsBaseFile, uint64_t >)StreamFile< FsBaseFile, uint64_t >inline
sync()FsBaseFileinline
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)FsBaseFileinline
truncate()FsBaseFileinline
truncate(uint64_t length)FsBaseFileinline
write(uint8_t b)StreamFile< FsBaseFile, uint64_t >inline
write(const uint8_t *buffer, size_t size)StreamFile< FsBaseFile, uint64_t >inline
FsBaseFile::write(const void *buf, size_t count)FsBaseFileinline
~FsBaseFile() (defined in FsBaseFile)FsBaseFileinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file.html deleted file mode 100644 index 70ca7309..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file.html +++ /dev/null @@ -1,2698 +0,0 @@ - - - - - - - -SdFat: FsFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
FsFile Class Reference
-
-
- -

FsBaseFile file with Arduino Stream. - More...

- -

#include <FsFile.h>

-
-Inheritance diagram for FsFile:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for FsFile:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
uint64_t curPosition ()
 
uint32_t dirIndex ()
 
bool exists (const char *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=nullptr)
 
uint64_t fileSize ()
 
uint32_t firstSector ()
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
size_t getName (char *name, size_t len)
 
bool getWriteError ()
 
bool isContiguous ()
 
bool isDir ()
 
bool isDirectory ()
 
bool isHidden ()
 
bool isOpen ()
 
bool isSubDir ()
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, uint8_t flags)
 
bool mkdir (FsBaseFile *dir, const char *path, bool pFlag=true)
 
const char * name () const
 
bool open (const char *path, oflag_t oflag=O_RDONLY)
 
bool open (FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)
 
bool open (FsBaseFile *dir, uint32_t index, oflag_t oflag)
 
bool open (FsVolume *vol, const char *path, oflag_t oflag)
 
bool openNext (FsBaseFile *dir, oflag_t oflag=O_RDONLY)
 
FsFile openNextFile (oflag_t oflag=O_RDONLY)
 
 operator bool ()
 
int peek ()
 
uint64_t position ()
 
bool preAllocate (uint64_t length)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
bool remove ()
 
bool remove (const char *path)
 
bool rename (const char *newPath)
 
bool rename (FsBaseFile *dirFile, const char *newPath)
 
void rewind ()
 
void rewindDirectory ()
 
bool rmdir ()
 
bool seek (uint64_t pos)
 
bool seekCur (int64_t offset)
 
bool seekEnd (int64_t offset=0)
 
bool seekSet (uint64_t pos)
 
uint64_t size ()
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint64_t length)
 
size_t write (const uint8_t *buffer, size_t size)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

FsBaseFile file with Arduino Stream.

-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FsBaseFile , uint64_t >::available ()
-
-inlineinherited
-
-
Returns
number of bytes available from the current position to EOF or INT_MAX if more than INT_MAX bytes are available.
- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::clearWriteError ()
-
-inlineinherited
-
-

Clear writeError.

- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::close ()
-
-inherited
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-inlineinherited
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Set contiguous flag for FAT16/FAT32 files. Parameters may be nullptr.

-
Returns
true for success or false for failure.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::curPosition ()
-
-inlineinherited
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsBaseFile::dirIndex ()
-
-inlineinherited
-
-
Returns
Directory entry index.
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::exists (const char * path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
true if the file exists else false.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - -
- - - - - - - - -
void FsBaseFile::fgetpos (fspos_t * pos)
-
-inlineinherited
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int FsBaseFile::fgets (char * str,
int num,
char * delim = nullptr 
)
-
-inlineinherited
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint64_t FsBaseFile::fileSize ()
-
-inlineinherited
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsBaseFile::firstSector ()
-
-inlineinherited
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< FsBaseFile , uint64_t >::flush ()
-
-inlineinherited
-
-

Ensure that any bytes written to the file are saved to the SD card.

- -
-
- -

◆ fsetpos()

- -
-
- - - - - -
- - - - - - - - -
void FsBaseFile::fsetpos (const fspos_t * pos)
-
-inlineinherited
-
-

set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inlineinherited
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inlineinherited
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t FsBaseFile::getError ()
-
-inlineinherited
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inlineinherited
-
-

Get a file's Modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::getName (char * name,
size_t len 
)
-
-inlineinherited
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]lenThe size of the array in bytes. The array must be at least 13 bytes long. The file's name will be truncated if the file's name is too long.
-
-
-
Returns
The length of the returned string.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::getWriteError ()
-
-inlineinherited
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isContiguous ()
-
-inlineinherited
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isDir ()
-
-inlineinherited
-
-
Returns
True if this is a directory else false.
- -
-
- -

◆ isDirectory()

- -
-
- - - - - -
- - - - - - - -
bool StreamFile< FsBaseFile , uint64_t >::isDirectory ()
-
-inlineinherited
-
-

This function reports if the current file is a directory or not.

Returns
true if the file is a directory.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isHidden ()
-
-inlineinherited
-
-
Returns
True if this is a hidden file else false.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isOpen ()
-
-inlineinherited
-
-
Returns
True if this is an open file/directory else false.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::isSubDir ()
-
-inlineinherited
-
-
Returns
True if this is a subdirectory file else false.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::ls (print_tpr)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint object.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::ls (print_tpr,
uint8_t flags 
)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint object.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::mkdir (FsBaseFiledir,
const char * path,
bool pFlag = true 
)
-
-inherited
-
-

Make a new directory.

-
Parameters
- - - - -
[in]dirAn open FatFile instance for the directory that will contain the new directory.
[in]pathA path with a valid 8.3 DOS name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ name()

- -
-
- - - - - -
- - - - - - - -
const char* StreamFile< FsBaseFile , uint64_t >::name () const
-
-inlineinherited
-
-

No longer implemented due to Long File Names.

-

Use getName(char* name, size_t size).

Returns
a pointer to replacement suggestion.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (const char * path,
oflag_t oflag = O_RDONLY 
)
-
-inlineinherited
-
-

Open a file or directory by name.

-
Parameters
- - - -
[in]pathA path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsBaseFiledir,
const char * path,
oflag_t oflag = O_RDONLY 
)
-
-inherited
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirAn open file instance for the directory containing the file to be opened.
[in]pathA path with a valid 8.3 DOS name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

O_RDONLY - Open for reading only..

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing only.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one file object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsBaseFiledir,
uint32_t index,
oflag_t oflag 
)
-
-inherited
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirAn open FsFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see FsFile::open(FsFile*, const char*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::open (FsVolumevol,
const char * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathA path for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of open flags.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::openNext (FsBaseFiledir,
oflag_t oflag = O_RDONLY 
)
-
-inherited
-
-

Opens the next file or folder in a directory.

Parameters
- - - -
[in]dirdirectory containing files.
[in]oflagopen flags.
-
-
-
Returns
a file object.
- -
-
- -

◆ openNextFile()

- -
-
- - - - - -
- - - - - - - - -
FsFile FsFile::openNextFile (oflag_t oflag = O_RDONLY)
-
-inline
-
-

Opens the next file or folder in a directory.

-
Parameters
- - -
[in]oflagopen flags.
-
-
-
Returns
a FatStream object.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
FsBaseFile::operator bool ()
-
-inlineinherited
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FsBaseFile , uint64_t >::peek ()
-
-inlineinherited
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ position()

- -
-
- - - - - -
- - - - - - - -
uint64_t StreamFile< FsBaseFile , uint64_t >::position ()
-
-inlineinherited
-
-
Returns
the current file position.
- -
-
- -

◆ preAllocate()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::preAllocate (uint64_t length)
-
-inlineinherited
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will contain uninitialized data for FAT16/FAT32 files. exFAT files will have zero validLength and dataLength will equal the requested length.

-
Parameters
- - -
[in]lengthsize of the file in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printAccessDateTime (print_tpr)
-
-inlineinherited
-
-

Print a file's access date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printCreateDateTime (print_tpr)
-
-inlineinherited
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::printField (Type value,
char term 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printFileSize (print_tpr)
-
-inlineinherited
-
-

Print a file's size.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printModifyDateTime (print_tpr)
-
-inlineinherited
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printName()

- -
-
- - - - - -
- - - - - - - - -
size_t FsBaseFile::printName (print_tpr)
-
-inlineinherited
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int StreamFile< FsBaseFile , uint64_t >::read ()
-
-inlineinherited
-
-

Read the next byte from a file.

-
Returns
For success return the next byte in the file as an int. If an error occurs or end of file is reached return -1.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int FsBaseFile::read (void * buf,
size_t count 
)
-
-inlineinherited
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than count, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1. Possible errors include read() called before a file has been opened, corrupt file system or an I/O error occurred.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::remove ()
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::remove (const char * path)
-
-inlineinherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::rename (const char * newPath)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsBaseFile::rename (FsBaseFiledirFile,
const char * newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void FsBaseFile::rewind ()
-
-inlineinherited
-
-

Set the file's current position to zero.

- -
-
- -

◆ rewindDirectory()

- -
-
- - - - - -
- - - - - - - -
void StreamFile< FsBaseFile , uint64_t >::rewindDirectory ()
-
-inlineinherited
-
-

Rewind a file if it is a directory

- -
-
- -

◆ rmdir()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::rmdir ()
-
-inherited
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ seek()

- -
-
- - - - - -
- - - - - - - - -
bool StreamFile< FsBaseFile , uint64_t >::seek (uint64_t pos)
-
-inlineinherited
-
-

Seek to a new position in the file, which must be between 0 and the size of the file (inclusive).

-
Parameters
- - -
[in]posthe new file position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekCur (int64_t offset)
-
-inlineinherited
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekEnd (int64_t offset = 0)
-
-inlineinherited
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::seekSet (uint64_t pos)
-
-inlineinherited
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ size()

- -
-
- - - - - -
- - - - - - - -
uint64_t StreamFile< FsBaseFile , uint64_t >::size ()
-
-inlineinherited
-
-
Returns
the file's size.
- -
-
- -

◆ sync()

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::sync ()
-
-inlineinherited
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FsBaseFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-inlineinherited
-
-

Set a file's timestamps in its directory entry.

-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date and time.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FsBaseFile::truncate ()
-
-inlineinherited
-
-

Truncate a file to the current position.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsBaseFile::truncate (uint64_t length)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ write() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StreamFile< FsBaseFile , uint64_t >::write (const uint8_t * buffer,
size_t size 
)
-
-inlineinherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufferPointer to the location of the data to be written.
[in]sizeNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always size.
- -
-
- -

◆ write() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FsBaseFile::write (const void * buf,
size_t count 
)
-
-inlineinherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always nbyte. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
- -
-
- -

◆ write() [3/3]

- -
-
- - - - - -
- - - - - - - - -
size_t StreamFile< FsBaseFile , uint64_t >::write (uint8_t b)
-
-inlineinherited
-
-

Write a byte to a file. Required by the Arduino Print class.

Parameters
- - -
[in]bthe byte to be written. Use getWriteError to check for errors.
-
-
-
Returns
1 for success and 0 for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/FsLib/FsFile.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__coll__graph.png deleted file mode 100644 index 67e504a9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__inherit__graph.png deleted file mode 100644 index 67e504a9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume-members.html deleted file mode 100644 index 7a99d114..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume-members.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
FsVolume Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(BlockDevice *blockDev)FsVolume
bytesPerCluster()FsVolumeinline
chdir()FsVolumeinline
chdir(const char *path)FsVolumeinline
chdir(const String &path)FsVolumeinline
chvol()FsVolumeinline
clusterCount()FsVolumeinline
cwv()FsVolumeinlinestatic
dataStartSector() constFsVolumeinline
end()FsVolumeinline
exists(const char *path)FsVolumeinline
exists(const String &path)FsVolumeinline
fatStartSector() constFsVolumeinline
fatType() constFsVolumeinline
freeClusterCount()FsVolumeinline
FsBaseFile classFsVolumefriend
FsVolume() (defined in FsVolume)FsVolumeinline
ls(print_t *pr)FsVolumeinline
ls(print_t *pr, uint8_t flags)FsVolumeinline
ls(print_t *pr, const char *path, uint8_t flags)FsVolume
ls()FsVolumeinline
ls(uint8_t flags)FsVolumeinline
ls(const char *path, uint8_t flags=0)FsVolumeinline
mkdir(const char *path, bool pFlag=true)FsVolumeinline
mkdir(const String &path, bool pFlag=true)FsVolumeinline
open(const char *path, oflag_t oflag=0X00)FsVolume
open(const String &path, oflag_t oflag=0X00)FsVolume
remove(const char *path)FsVolumeinline
remove(const String &path)FsVolumeinline
rename(const char *oldPath, const char *newPath)FsVolumeinline
rename(const String &oldPath, const String &newPath)FsVolumeinline
rmdir(const char *path)FsVolumeinline
rmdir(const String &path)FsVolumeinline
sectorsPerCluster() constFsVolumeinline
~FsVolume() (defined in FsVolume)FsVolumeinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume.html deleted file mode 100644 index c8593512..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume.html +++ /dev/null @@ -1,1296 +0,0 @@ - - - - - - - -SdFat: FsVolume Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

FsVolume class. - More...

- -

#include <FsVolume.h>

-
-Inheritance diagram for FsVolume:
-
-
Inheritance graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *blockDev)
 
uint32_t bytesPerCluster ()
 
bool chdir ()
 
bool chdir (const char *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount ()
 
uint32_t dataStartSector () const
 
void end ()
 
bool exists (const char *path)
 
bool exists (const String &path)
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
uint32_t freeClusterCount ()
 
bool ls ()
 
bool ls (const char *path, uint8_t flags=0)
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, const char *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags)
 
bool ls (uint8_t flags)
 
bool mkdir (const char *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
FsFile open (const char *path, oflag_t oflag=0X00)
 
FsFile open (const String &path, oflag_t oflag=0X00)
 
bool remove (const char *path)
 
bool remove (const String &path)
 
bool rename (const char *oldPath, const char *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const char *path)
 
bool rmdir (const String &path)
 
uint32_t sectorsPerCluster () const
 
- - - -

-Static Public Member Functions

static FsVolumecwv ()
 
- - - -

-Friends

class FsBaseFile
 
-

Detailed Description

-

FsVolume class.

-

Member Function Documentation

- -

◆ begin()

- -
-
- - - - - - - - -
bool FsVolume::begin (BlockDeviceblockDev)
-
-

Initialize an FatVolume object.

Parameters
- - -
[in]blockDevDevice block driver.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::bytesPerCluster ()
-
-inline
-
-
Returns
the number of bytes in a cluster.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool FsVolume::chdir ()
-
-inline
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::chdir (const char * path)
-
-inline
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::chdir (const String & path)
-
-inline
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void FsVolume::chvol ()
-
-inline
-
-

Change global working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::clusterCount ()
-
-inline
-
-
Returns
The total number of clusters in the volume.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static FsVolume* FsVolume::cwv ()
-
-inlinestatic
-
-
Returns
current working volume.
- -
-
- -

◆ dataStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::dataStartSector () const
-
-inline
-
-
Returns
The logical sector number for the start of file data.
- -
-
- -

◆ end()

- -
-
- - - - - -
- - - - - - - -
void FsVolume::end ()
-
-inline
-
-

free dynamic memory and end access to volume

- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::exists (const char * path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::exists (const String & path)
-
-inline
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::fatStartSector () const
-
-inline
-
-
Returns
The logical sector number for the start of the first FAT.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t FsVolume::fatType () const
-
-inline
-
-
Returns
Partition type, FAT_TYPE_EXFAT, FAT_TYPE_FAT32, FAT_TYPE_FAT16, or zero for error.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::freeClusterCount ()
-
-inline
-
-
Returns
the free cluster count.
- -
-
- -

◆ ls() [1/6]

- -
-
- - - - - -
- - - - - - - -
bool FsVolume::ls ()
-
-inline
-
-

List directory contents.

Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (const char * path,
uint8_t flags = 0 
)
-
-inline
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
-
-true for success or false for failure.
- -
-
- -

◆ ls() [3/6]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::ls (print_tpr)
-
-inline
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint object.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/6]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (print_tpr,
const char * path,
uint8_t flags 
)
-
-

List the directory contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (print_tpr,
uint8_t flags 
)
-
-inline
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint object.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [6/6]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::ls (uint8_t flags)
-
-inline
-
-

List directory contents.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::mkdir (const char * path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inline
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - - - - - - - - - - - - - - -
FsFile FsVolume::open (const char * path,
oflag_t oflag = 0X00 
)
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a FsBaseFile object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
FsFile FsVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a FsBaseFile object.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::remove (const char * path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::remove (const String & path)
-
-inline
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::rename (const char * oldPath,
const char * newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inline
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::rmdir (const char * path)
-
-inline
-
-

Remove a subdirectory from the volume's root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::rmdir (const String & path)
-
-inline
-
-

Remove a subdirectory from the volume's root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::sectorsPerCluster () const
-
-inline
-
-
Returns
The volume's cluster size in sectors.
- -
-
-

Friends And Related Function Documentation

- -

◆ FsBaseFile

- -
-
- - - - - -
- - - - -
friend class FsBaseFile
-
-friend
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure. FsBaseFile allowed access to private members.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/FsLib/FsVolume.h
  • -
  • Arduino/libraries/SdFat/src/FsLib/FsVolume.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume__inherit__graph.png deleted file mode 100644 index cb61c56c..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_fs_volume__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial-members.html deleted file mode 100644 index 53ba99bb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial-members.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
MinimumSerial Member List
-
-
- -

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

- - - - - - - -
available()MinimumSerial
begin(uint32_t baud)MinimumSerial
flush()MinimumSerial
operator bool()MinimumSerialinline
read()MinimumSerial
write(uint8_t b)MinimumSerial
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial.html deleted file mode 100644 index 7544e7f4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial.html +++ /dev/null @@ -1,255 +0,0 @@ - - - - - - - -SdFat: MinimumSerial Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
MinimumSerial Class Reference
-
-
- -

mini serial class for the SdFat library. - More...

- -

#include <MinimumSerial.h>

-
-Inheritance diagram for MinimumSerial:
-
-
Inheritance graph
- - - - -
[legend]
-
-Collaboration diagram for MinimumSerial:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
void begin (uint32_t baud)
 
void flush ()
 
 operator bool ()
 
int read ()
 
size_t write (uint8_t b)
 
-

Detailed Description

-

mini serial class for the SdFat library.

-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - - - -
int MinimumSerial::available ()
-
-
Returns
one if data is available.
- -
-
- -

◆ begin()

- -
-
- - - - - - - - -
void MinimumSerial::begin (uint32_t baud)
-
-

Set baud rate for serial port zero and enable in non interrupt mode. Do not call this function if you use another serial library.

Parameters
- - -
[in]baudrate
-
-
- -
-
- -

◆ flush()

- -
-
- - - - - - - -
void MinimumSerial::flush ()
-
-

Wait for write done.

- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
MinimumSerial::operator bool ()
-
-inline
-
-
Returns
true for hardware serial
- -
-
- -

◆ read()

- -
-
- - - - - - - -
int MinimumSerial::read ()
-
-

Unbuffered read

Returns
-1 if no character is available or an available character.
- -
-
- -

◆ write()

- -
-
- - - - - - - - -
size_t MinimumSerial::write (uint8_t b)
-
-

Unbuffered write

-
Parameters
- - -
[in]bbyte to write.
-
-
-
Returns
1
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/MinimumSerial.h
  • -
  • Arduino/libraries/SdFat/src/MinimumSerial.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__coll__graph.png deleted file mode 100644 index 790bea9e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__inherit__graph.png deleted file mode 100644 index 790bea9e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_minimum_serial__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file-members.html deleted file mode 100644 index d4525c07..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file-members.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
PrintFile< BaseFile > Member List
-
-
- -

This is the complete list of members for PrintFile< BaseFile >, including all inherited members.

- - -
write(uint8_t b)PrintFile< BaseFile >inline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file.html deleted file mode 100644 index e62a7e4a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file.html +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - - -SdFat: PrintFile< BaseFile > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
PrintFile< BaseFile > Class Template Reference
-
-
- -

PrintFile class. - More...

- -

#include <ArduinoFiles.h>

-
-Inheritance diagram for PrintFile< BaseFile >:
-
-
Inheritance graph
- - - - - -
[legend]
-
-Collaboration diagram for PrintFile< BaseFile >:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - -

-Public Member Functions

size_t write (uint8_t b)
 
-

Detailed Description

-

template<class BaseFile>
-class PrintFile< BaseFile >

- -

PrintFile class.

-

Member Function Documentation

- -

◆ write()

- -
-
-
-template<class BaseFile>
- - - - - -
- - - - - - - - -
size_t PrintFile< BaseFile >::write (uint8_t b)
-
-inline
-
-

Write a single byte.

Parameters
- - -
[in]bbyte to write.
-
-
-
Returns
one for success.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/common/ArduinoFiles.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__coll__graph.png deleted file mode 100644 index d83d8993..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__inherit__graph.png deleted file mode 100644 index d83d8993..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_print_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base-members.html deleted file mode 100644 index c6456f08..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base-members.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdBase< Vol > Member List
-
-
- -

This is the complete list of members for SdBase< Vol >, including all inherited members.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdCsPin_t csPin=SS)SdBase< Vol >inline
begin(SdCsPin_t csPin, uint32_t maxSck)SdBase< Vol >inline
begin(SdSpiConfig spiConfig)SdBase< Vol >inline
begin(SdioConfig sdioConfig)SdBase< Vol >inline
card()SdBase< Vol >inline
cardBegin(SdSpiConfig spiConfig)SdBase< Vol >inline
cardBegin(SdioConfig sdioConfig)SdBase< Vol >inline
errorHalt(print_t *pr)SdBase< Vol >inline
errorHalt(print_t *pr, const char *msg)SdBase< Vol >inline
errorHalt(print_t *pr, const __FlashStringHelper *msg)SdBase< Vol >inline
errorHalt(const __FlashStringHelper *msg)SdBase< Vol >inline
errorHalt()SdBase< Vol >inline
errorHalt(const char *msg)SdBase< Vol >inline
errorPrint(print_t *pr)SdBase< Vol >inline
errorPrint(print_t *pr, char const *msg)SdBase< Vol >inline
errorPrint(Print *pr, const __FlashStringHelper *msg)SdBase< Vol >inline
errorPrint(const char *msg)SdBase< Vol >inline
errorPrint(const __FlashStringHelper *msg)SdBase< Vol >inline
initErrorHalt(print_t *pr)SdBase< Vol >inline
initErrorHalt(print_t *pr, const char *msg)SdBase< Vol >inline
initErrorHalt(Print *pr, const __FlashStringHelper *msg)SdBase< Vol >inline
initErrorHalt()SdBase< Vol >inline
initErrorHalt(const char *msg)SdBase< Vol >inline
initErrorHalt(const __FlashStringHelper *msg)SdBase< Vol >inline
initErrorPrint(Print *pr)SdBase< Vol >inline
initErrorPrint()SdBase< Vol >inline
printFatType(print_t *pr)SdBase< Vol >inline
printSdError(print_t *pr)SdBase< Vol >inline
sdErrorCode()SdBase< Vol >inline
sdErrorData()SdBase< Vol >inline
vol()SdBase< Vol >inline
volumeBegin()SdBase< Vol >inline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base.html deleted file mode 100644 index 27d1130d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base.html +++ /dev/null @@ -1,1327 +0,0 @@ - - - - - - - -SdFat: SdBase< Vol > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdBase< Vol > Class Template Reference
-
-
- -

base SD file system template class. - More...

- -

#include <SdFat.h>

-
-Inheritance diagram for SdBase< Vol >:
-
-
Inheritance graph
- - - - -
[legend]
-
-Collaboration diagram for SdBase< Vol >:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (SdCsPin_t csPin, uint32_t maxSck)
 
bool begin (SdCsPin_t csPin=SS)
 
bool begin (SdioConfig sdioConfig)
 
bool begin (SdSpiConfig spiConfig)
 
SdCardcard ()
 
bool cardBegin (SdioConfig sdioConfig)
 
bool cardBegin (SdSpiConfig spiConfig)
 
void errorHalt ()
 
void errorHalt (const __FlashStringHelper *msg)
 
void errorHalt (const char *msg)
 
void errorHalt (print_t *pr)
 
void errorHalt (print_t *pr, const __FlashStringHelper *msg)
 
void errorHalt (print_t *pr, const char *msg)
 
void errorPrint (const __FlashStringHelper *msg)
 
void errorPrint (const char *msg)
 
void errorPrint (Print *pr, const __FlashStringHelper *msg)
 
void errorPrint (print_t *pr)
 
void errorPrint (print_t *pr, char const *msg)
 
void initErrorHalt ()
 
void initErrorHalt (const __FlashStringHelper *msg)
 
void initErrorHalt (const char *msg)
 
void initErrorHalt (Print *pr, const __FlashStringHelper *msg)
 
void initErrorHalt (print_t *pr)
 
void initErrorHalt (print_t *pr, const char *msg)
 
void initErrorPrint ()
 
void initErrorPrint (Print *pr)
 
void printFatType (print_t *pr)
 
void printSdError (print_t *pr)
 
uint8_t sdErrorCode ()
 
uint8_t sdErrorData ()
 
Vol * vol ()
 
bool volumeBegin ()
 
-

Detailed Description

-

template<class Vol>
-class SdBase< Vol >

- -

base SD file system template class.

-

Member Function Documentation

- -

◆ begin() [1/4]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdBase< Vol >::begin (SdCsPin_t csPin,
uint32_t maxSck 
)
-
-inline
-
-

Initialize SD card and file system.

-
Parameters
- - - -
[in]csPinSD card chip select pin.
[in]maxSckMaximum SCK frequency.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [2/4]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
bool SdBase< Vol >::begin (SdCsPin_t csPin = SS)
-
-inline
-
-

Initialize SD card and file system.

-
Parameters
- - -
[in]csPinSD card chip select pin.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [3/4]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
bool SdBase< Vol >::begin (SdioConfig sdioConfig)
-
-inline
-
-

Initialize SD card and file system for SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [4/4]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
bool SdBase< Vol >::begin (SdSpiConfig spiConfig)
-
-inline
-
-

Initialize SD card and file system for SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ card()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
SdCard* SdBase< Vol >::card ()
-
-inline
-
-
Returns
Pointer to SD card object.
- -
-
- -

◆ cardBegin() [1/2]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
bool SdBase< Vol >::cardBegin (SdioConfig sdioConfig)
-
-inline
-
-

Initialize SD card in SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ cardBegin() [2/2]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
bool SdBase< Vol >::cardBegin (SdSpiConfig spiConfig)
-
-inline
-
-

Initialize SD card in SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ errorHalt() [1/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
void SdBase< Vol >::errorHalt ()
-
-inline
-
-

Print error info to Serial and halt.

- -
-
- -

◆ errorHalt() [2/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorHalt (const __FlashStringHelper * msg)
-
-inline
-
-

Print msg to Serial and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [3/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorHalt (const char * msg)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [4/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorHalt (print_tpr)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorHalt() [5/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::errorHalt (print_tpr,
const __FlashStringHelper * msg 
)
-
-inline
-
-

Print msg and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [6/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::errorHalt (print_tpr,
const char * msg 
)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [1/5]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorPrint (const __FlashStringHelper * msg)
-
-inline
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [2/5]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorPrint (const char * msg)
-
-inline
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [3/5]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::errorPrint (Print * pr,
const __FlashStringHelper * msg 
)
-
-inline
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [4/5]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::errorPrint (print_tpr)
-
-inline
-
-

Print SD errorCode and errorData.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorPrint() [5/5]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::errorPrint (print_tpr,
char const * msg 
)
-
-inline
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [1/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
void SdBase< Vol >::initErrorHalt ()
-
-inline
-
-

Print error info and halt.

- -
-
- -

◆ initErrorHalt() [2/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::initErrorHalt (const __FlashStringHelper * msg)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [3/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::initErrorHalt (const char * msg)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [4/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::initErrorHalt (Print * pr,
const __FlashStringHelper * msg 
)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [5/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::initErrorHalt (print_tpr)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ initErrorHalt() [6/6]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< Vol >::initErrorHalt (print_tpr,
const char * msg 
)
-
-inline
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorPrint() [1/2]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
void SdBase< Vol >::initErrorPrint ()
-
-inline
-
-

Print error details after begin() fails.

- -
-
- -

◆ initErrorPrint() [2/2]

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::initErrorPrint (Print * pr)
-
-inline
-
-

Print error details after begin() fails.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ printFatType()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::printFatType (print_tpr)
-
-inline
-
-

Print volume FAT/exFAT type.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ printSdError()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - - -
void SdBase< Vol >::printSdError (print_tpr)
-
-inline
-
-

Print error info and return.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ sdErrorCode()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
uint8_t SdBase< Vol >::sdErrorCode ()
-
-inline
-
-
Returns
SD card error code.
- -
-
- -

◆ sdErrorData()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
uint8_t SdBase< Vol >::sdErrorData ()
-
-inline
-
-
Returns
SD card error data.
- -
-
- -

◆ vol()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
Vol* SdBase< Vol >::vol ()
-
-inline
-
-
Returns
pointer to base volume
- -
-
- -

◆ volumeBegin()

- -
-
-
-template<class Vol>
- - - - - -
- - - - - - - -
bool SdBase< Vol >::volumeBegin ()
-
-inline
-
-

Initialize file system after call to cardBegin.

-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdFat.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__coll__graph.png deleted file mode 100644 index 1154d646..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__inherit__graph.png deleted file mode 100644 index 1154d646..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_base__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory-members.html deleted file mode 100644 index b4396d14..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory-members.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdCardFactory Member List
-
-
- -

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

- - - -
newCard(SdSpiConfig config)SdCardFactoryinline
newCard(SdioConfig config)SdCardFactoryinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory.html deleted file mode 100644 index 5fdde56c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_factory.html +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - -SdFat: SdCardFactory Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdCardFactory Class Reference
-
-
- -

Setup a SPI card or SDIO card. - More...

- -

#include <SdCard.h>

- - - - - - -

-Public Member Functions

SdCardnewCard (SdioConfig config)
 
SdCardnewCard (SdSpiConfig config)
 
-

Detailed Description

-

Setup a SPI card or SDIO card.

-

Member Function Documentation

- -

◆ newCard() [1/2]

- -
-
- - - - - -
- - - - - - - - -
SdCard* SdCardFactory::newCard (SdioConfig config)
-
-inline
-
-

Initialize SDIO card.

-
Parameters
- - -
[in]configSDIO configuration.
-
-
-
Returns
generic card pointer or nullptr if SDIO is not supported.
- -
-
- -

◆ newCard() [2/2]

- -
-
- - - - - -
- - - - - - - - -
SdCard* SdCardFactory::newCard (SdSpiConfig config)
-
-inline
-
-

Initialize SPI card.

-
Parameters
- - -
[in]configSPI configuration.
-
-
-
Returns
generic card pointer.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdCard/SdCard.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface-members.html deleted file mode 100644 index a7954a43..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface-members.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdCardInterface Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - -
erase(uint32_t firstSector, uint32_t lastSector)=0SdCardInterfacepure virtual
errorCode() const =0SdCardInterfacepure virtual
errorData() const =0SdCardInterfacepure virtual
isBusy()=0SdCardInterfacepure virtual
readCID(cid_t *cid)=0SdCardInterfacepure virtual
readCSD(csd_t *csd)=0SdCardInterfacepure virtual
readOCR(uint32_t *ocr)=0SdCardInterfacepure virtual
readSector(uint32_t sector, uint8_t *dst)=0BlockDeviceInterfacepure virtual
readSectors(uint32_t sector, uint8_t *dst, size_t ns)=0BlockDeviceInterfacepure virtual
sectorCount()=0SdCardInterfacepure virtual
status()SdCardInterfaceinlinevirtual
syncDevice()=0BlockDeviceInterfacepure virtual
type() const =0SdCardInterfacepure virtual
writeData(const uint8_t *src)=0SdCardInterfacepure virtual
writeSector(uint32_t sector, const uint8_t *src)=0BlockDeviceInterfacepure virtual
writeSectors(uint32_t sector, const uint8_t *src, size_t ns)=0BlockDeviceInterfacepure virtual
writeStart(uint32_t sector)=0SdCardInterfacepure virtual
writeStop()=0SdCardInterfacepure virtual
~BlockDeviceInterface() (defined in BlockDeviceInterface)BlockDeviceInterfaceinlinevirtual
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface.html deleted file mode 100644 index 6f0e8fec..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface.html +++ /dev/null @@ -1,809 +0,0 @@ - - - - - - - -SdFat: SdCardInterface Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdCardInterface Class Referenceabstract
-
-
- -

Abstract interface for an SD card. - More...

- -

#include <SdCardInterface.h>

-
-Inheritance diagram for SdCardInterface:
-
-
Inheritance graph
- - - - - -
[legend]
-
-Collaboration diagram for SdCardInterface:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

virtual bool erase (uint32_t firstSector, uint32_t lastSector)=0
 
virtual uint8_t errorCode () const =0
 
virtual uint32_t errorData () const =0
 
virtual bool isBusy ()=0
 
virtual bool readCID (cid_t *cid)=0
 
virtual bool readCSD (csd_t *csd)=0
 
virtual bool readOCR (uint32_t *ocr)=0
 
virtual bool readSector (uint32_t sector, uint8_t *dst)=0
 
virtual bool readSectors (uint32_t sector, uint8_t *dst, size_t ns)=0
 
virtual uint32_t sectorCount ()=0
 
virtual uint32_t status ()
 
virtual bool syncDevice ()=0
 
virtual uint8_t type () const =0
 
virtual bool writeData (const uint8_t *src)=0
 
virtual bool writeSector (uint32_t sector, const uint8_t *src)=0
 
virtual bool writeSectors (uint32_t sector, const uint8_t *src, size_t ns)=0
 
virtual bool writeStart (uint32_t sector)=0
 
virtual bool writeStop ()=0
 
-

Detailed Description

-

Abstract interface for an SD card.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Member Function Documentation

- -

◆ erase()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual bool SdCardInterface::erase (uint32_t firstSector,
uint32_t lastSector 
)
-
-pure virtual
-
-

Erase a range of sectors.

-
Parameters
- - - -
[in]firstSectorThe address of the first sector in the range.
[in]lastSectorThe address of the last sector in the range.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ errorCode()

- -
-
- - - - - -
- - - - - - - -
virtual uint8_t SdCardInterface::errorCode () const
-
-pure virtual
-
-
Returns
error code.
- -

Implemented in SdioCard.

- -
-
- -

◆ errorData()

- -
-
- - - - - -
- - - - - - - -
virtual uint32_t SdCardInterface::errorData () const
-
-pure virtual
-
-
Returns
error data.
- -

Implemented in SdioCard.

- -
-
- -

◆ isBusy()

- -
-
- - - - - -
- - - - - - - -
virtual bool SdCardInterface::isBusy ()
-
-pure virtual
-
-
Returns
true if card is busy.
- -

Implemented in SdioCard.

- -
-
- -

◆ readCID()

- -
-
- - - - - -
- - - - - - - - -
virtual bool SdCardInterface::readCID (cid_tcid)
-
-pure virtual
-
-

Read a card's CID register.

-
Parameters
- - -
[out]cidpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ readCSD()

- -
-
- - - - - -
- - - - - - - - -
virtual bool SdCardInterface::readCSD (csd_t * csd)
-
-pure virtual
-
-

Read a card's CSD register.

-
Parameters
- - -
[out]csdpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ readOCR()

- -
-
- - - - - -
- - - - - - - - -
virtual bool SdCardInterface::readOCR (uint32_t * ocr)
-
-pure virtual
-
-

Read OCR register.

-
Parameters
- - -
[out]ocrValue of OCR register.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ readSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::readSector (uint32_t sector,
uint8_t * dst 
)
-
-pure virtualinherited
-
-

Read a sector.

-
Parameters
- - - -
[in]sectorLogical sector to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ readSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::readSectors (uint32_t sector,
uint8_t * dst,
size_t ns 
)
-
-pure virtualinherited
-
-

Read multiple sectors.

-
Parameters
- - - - -
[in]sectorLogical sector to be read.
[in]nsNumber of sectors to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ sectorCount()

- -
-
- - - - - -
- - - - - - - -
virtual uint32_t SdCardInterface::sectorCount ()
-
-pure virtual
-
-

Determine the size of an SD flash memory card.

-
Returns
The number of 512 byte data sectors in the card or zero if an error occurs.
- -

Implements BlockDeviceInterface.

- -

Implemented in SdioCard.

- -
-
- -

◆ status()

- -
-
- - - - - -
- - - - - - - -
virtual uint32_t SdCardInterface::status ()
-
-inlinevirtual
-
-
Returns
card status.
- -

Reimplemented in SdioCard.

- -
-
- -

◆ syncDevice()

- -
-
- - - - - -
- - - - - - - -
virtual bool BlockDeviceInterface::syncDevice ()
-
-pure virtualinherited
-
-

End multi-sector transfer and go to idle state.

Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ type()

- -
-
- - - - - -
- - - - - - - -
virtual uint8_t SdCardInterface::type () const
-
-pure virtual
-
-

Return the card type: SD V1, SD V2 or SDHC/SDXC

Returns
0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeData()

- -
-
- - - - - -
- - - - - - - - -
virtual bool SdCardInterface::writeData (const uint8_t * src)
-
-pure virtual
-
-

Write one data sector in a multiple sector write sequence.

Parameters
- - -
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::writeSector (uint32_t sector,
const uint8_t * src 
)
-
-pure virtualinherited
-
-

Writes a sector.

-
Parameters
- - - -
[in]sectorLogical sector to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
virtual bool BlockDeviceInterface::writeSectors (uint32_t sector,
const uint8_t * src,
size_t ns 
)
-
-pure virtualinherited
-
-

Write multiple sectors.

-
Parameters
- - - - -
[in]sectorLogical sector to be written.
[in]nsNumber of sectors to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeStart()

- -
-
- - - - - -
- - - - - - - - -
virtual bool SdCardInterface::writeStart (uint32_t sector)
-
-pure virtual
-
-

Start a write multiple sectors sequence.

-
Parameters
- - -
[in]sectorAddress of first sector in sequence.
-
-
-
Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
- -

◆ writeStop()

- -
-
- - - - - -
- - - - - - - -
virtual bool SdCardInterface::writeStop ()
-
-pure virtual
-
-

End a write multiple sectors sequence.

Returns
true for success or false for failure.
- -

Implemented in SdioCard.

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdCard/SdCardInterface.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__coll__graph.png deleted file mode 100644 index 030b1620..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__inherit__graph.png deleted file mode 100644 index fda0d431..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_card_interface__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat-members.html deleted file mode 100644 index e92c9695..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat-members.html +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdExFat Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdCsPin_t csPin=SS)SdBase< ExFatVolume >inline
begin(SdCsPin_t csPin, uint32_t maxSck)SdBase< ExFatVolume >inline
begin(SdSpiConfig spiConfig)SdBase< ExFatVolume >inline
begin(SdioConfig sdioConfig)SdBase< ExFatVolume >inline
ExFatVolume::begin(BlockDevice *dev, bool setCwv=true, uint8_t part=1)ExFatVolumeinline
bytesPerCluster() constExFatPartitioninline
bytesPerClusterShift() constExFatPartitioninline
bytesPerSector() constExFatPartitioninline
bytesPerSectorShift() constExFatPartitioninline
cacheClear()ExFatPartitioninline
card()SdBase< ExFatVolume >inline
cardBegin(SdSpiConfig spiConfig)SdBase< ExFatVolume >inline
cardBegin(SdioConfig sdioConfig)SdBase< ExFatVolume >inline
chdir()ExFatVolumeinline
chdir(const ExChar_t *path)ExFatVolume
chdir(const String &path)ExFatVolumeinline
chvol()ExFatVolumeinline
clusterCount() constExFatPartitioninline
clusterHeapStartSector() constExFatPartitioninline
cwv()ExFatVolumeinlinestatic
errorHalt(print_t *pr)SdBase< ExFatVolume >inline
errorHalt(print_t *pr, const char *msg)SdBase< ExFatVolume >inline
errorHalt(print_t *pr, const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
errorHalt(const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
errorHalt()SdBase< ExFatVolume >inline
errorHalt(const char *msg)SdBase< ExFatVolume >inline
errorPrint(print_t *pr)SdBase< ExFatVolume >inline
errorPrint(print_t *pr, char const *msg)SdBase< ExFatVolume >inline
errorPrint(Print *pr, const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
errorPrint(const char *msg)SdBase< ExFatVolume >inline
errorPrint(const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
ExFatPartition() (defined in ExFatPartition)ExFatPartitioninline
ExFatVolume() (defined in ExFatVolume)ExFatVolumeinline
exists(const ExChar_t *path)ExFatVolumeinline
exists(const String &path)ExFatVolumeinline
fatLength() constExFatPartitioninline
fatStartSector() constExFatPartitioninline
fatType() constExFatPartitioninline
format(print_t *pr=NULL)SdExFatinline
freeClusterCount()ExFatPartition
init(BlockDevice *dev, uint8_t part)ExFatPartition
initErrorHalt(print_t *pr)SdBase< ExFatVolume >inline
initErrorHalt(print_t *pr, const char *msg)SdBase< ExFatVolume >inline
initErrorHalt(Print *pr, const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
initErrorHalt()SdBase< ExFatVolume >inline
initErrorHalt(const char *msg)SdBase< ExFatVolume >inline
initErrorHalt(const __FlashStringHelper *msg)SdBase< ExFatVolume >inline
initErrorPrint(Print *pr)SdBase< ExFatVolume >inline
initErrorPrint()SdBase< ExFatVolume >inline
ls(print_t *pr, uint8_t flags=0)ExFatVolumeinline
ls(print_t *pr, const ExChar_t *path, uint8_t flags)ExFatVolumeinline
ls()ExFatVolumeinline
ls(uint8_t flags)ExFatVolumeinline
ls(const ExChar_t *path, uint8_t flags=0)ExFatVolumeinline
mkdir(const ExChar_t *path, bool pFlag=true)ExFatVolumeinline
mkdir(const String &path, bool pFlag=true)ExFatVolumeinline
open(const ExChar_t *path, oflag_t oflag=0X00)ExFatVolumeinline
open(const String &path, oflag_t oflag=0X00)ExFatVolumeinline
printFatType(print_t *pr)SdBase< ExFatVolume >inline
printSdError(print_t *pr)SdBase< ExFatVolume >inline
remove(const ExChar_t *path)ExFatVolumeinline
remove(const String &path)ExFatVolumeinline
rename(const ExChar_t *oldPath, const ExChar_t *newPath)ExFatVolumeinline
rename(const String &oldPath, const String &newPath)ExFatVolumeinline
rmdir(const ExChar_t *path)ExFatVolumeinline
rmdir(const String &path)ExFatVolumeinline
rootDirectoryCluster() constExFatPartitioninline
rootLength()ExFatPartition
sdErrorCode()SdBase< ExFatVolume >inline
sdErrorData()SdBase< ExFatVolume >inline
sectorsPerCluster() constExFatPartitioninline
sectorsPerClusterShift() constExFatPartitioninline
truncate(const ExChar_t *path, uint64_t length)ExFatVolumeinline
truncate(const String &path, uint64_t length)ExFatVolumeinline
vol()SdBase< ExFatVolume >inline
volumeBegin()SdBase< ExFatVolume >inline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat.html deleted file mode 100644 index d28b997f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat.html +++ /dev/null @@ -1,2800 +0,0 @@ - - - - - - - -SdFat: SdExFat Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

SD file system class for exFAT volumes. - More...

- -

#include <SdFat.h>

-
-Inheritance diagram for SdExFat:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for SdExFat:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *dev, bool setCwv=true, uint8_t part=1)
 
bool begin (SdCsPin_t csPin, uint32_t maxSck)
 
bool begin (SdCsPin_t csPin=SS)
 
bool begin (SdioConfig sdioConfig)
 
bool begin (SdSpiConfig spiConfig)
 
uint32_t bytesPerCluster () const
 
uint8_t bytesPerClusterShift () const
 
uint16_t bytesPerSector () const
 
uint8_t bytesPerSectorShift () const
 
uint8_t * cacheClear ()
 
SdCardcard ()
 
bool cardBegin (SdioConfig sdioConfig)
 
bool cardBegin (SdSpiConfig spiConfig)
 
bool chdir ()
 
bool chdir (const ExChar_t *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount () const
 
uint32_t clusterHeapStartSector () const
 
void errorHalt ()
 
void errorHalt (const __FlashStringHelper *msg)
 
void errorHalt (const char *msg)
 
void errorHalt (print_t *pr)
 
void errorHalt (print_t *pr, const __FlashStringHelper *msg)
 
void errorHalt (print_t *pr, const char *msg)
 
void errorPrint (const __FlashStringHelper *msg)
 
void errorPrint (const char *msg)
 
void errorPrint (Print *pr, const __FlashStringHelper *msg)
 
void errorPrint (print_t *pr)
 
void errorPrint (print_t *pr, char const *msg)
 
bool exists (const ExChar_t *path)
 
bool exists (const String &path)
 
uint32_t fatLength () const
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
bool format (print_t *pr=NULL)
 
uint32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part)
 
void initErrorHalt ()
 
void initErrorHalt (const __FlashStringHelper *msg)
 
void initErrorHalt (const char *msg)
 
void initErrorHalt (Print *pr, const __FlashStringHelper *msg)
 
void initErrorHalt (print_t *pr)
 
void initErrorHalt (print_t *pr, const char *msg)
 
void initErrorPrint ()
 
void initErrorPrint (Print *pr)
 
bool ls ()
 
bool ls (const ExChar_t *path, uint8_t flags=0)
 
bool ls (print_t *pr, const ExChar_t *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags=0)
 
bool ls (uint8_t flags)
 
bool mkdir (const ExChar_t *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
ExFile open (const ExChar_t *path, oflag_t oflag=0X00)
 
ExFile open (const String &path, oflag_t oflag=0X00)
 
void printFatType (print_t *pr)
 
void printSdError (print_t *pr)
 
bool remove (const ExChar_t *path)
 
bool remove (const String &path)
 
bool rename (const ExChar_t *oldPath, const ExChar_t *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const ExChar_t *path)
 
bool rmdir (const String &path)
 
uint32_t rootDirectoryCluster () const
 
uint32_t rootLength ()
 
uint8_t sdErrorCode ()
 
uint8_t sdErrorData ()
 
uint32_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
bool truncate (const ExChar_t *path, uint64_t length)
 
bool truncate (const String &path, uint64_t length)
 
ExFatVolumevol ()
 
bool volumeBegin ()
 
- - - -

-Static Public Member Functions

static ExFatVolumecwv ()
 
-

Detailed Description

-

SD file system class for exFAT volumes.

-

Member Function Documentation

- -

◆ begin() [1/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatVolume::begin (BlockDevicedev,
bool setCwv = true,
uint8_t part = 1 
)
-
-inlineinherited
-
-

Initialize an FatVolume object.

Parameters
- - - - -
[in]devDevice block driver.
[in]setCwvSet current working volume if true.
[in]partpartition to initialize.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [2/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdBase< ExFatVolume >::begin (SdCsPin_t csPin,
uint32_t maxSck 
)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - - -
[in]csPinSD card chip select pin.
[in]maxSckMaximum SCK frequency.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [3/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< ExFatVolume >::begin (SdCsPin_t csPin = SS)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - -
[in]csPinSD card chip select pin.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [4/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< ExFatVolume >::begin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [5/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< ExFatVolume >::begin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::bytesPerCluster () const
-
-inlineinherited
-
-
Returns
the number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerClusterShift () const
-
-inlineinherited
-
-
Returns
the power of two for bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t ExFatPartition::bytesPerSector () const
-
-inlineinherited
-
-
Returns
the number of bytes in a sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::bytesPerSectorShift () const
-
-inlineinherited
-
-
Returns
the power of two for bytesPerSector.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
uint8_t* ExFatPartition::cacheClear ()
-
-inlineinherited
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ card()

- -
-
- - - - - -
- - - - - - - -
SdCard* SdBase< ExFatVolume >::card ()
-
-inlineinherited
-
-
Returns
Pointer to SD card object.
- -
-
- -

◆ cardBegin() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< ExFatVolume >::cardBegin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card in SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ cardBegin() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< ExFatVolume >::cardBegin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card in SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool ExFatVolume::chdir ()
-
-inlineinherited
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::chdir (const ExChar_t * path)
-
-inherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::chdir (const String & path)
-
-inlineinherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void ExFatVolume::chvol ()
-
-inlineinherited
-
-

Change global working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterCount () const
-
-inlineinherited
-
-
Returns
the cluster count for the partition.
- -
-
- -

◆ clusterHeapStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::clusterHeapStartSector () const
-
-inlineinherited
-
-
Returns
the cluster heap start sector.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static ExFatVolume* ExFatVolume::cwv ()
-
-inlinestaticinherited
-
-
Returns
current working volume.
- -
-
- -

◆ errorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< ExFatVolume >::errorHalt ()
-
-inlineinherited
-
-

Print error info to Serial and halt.

- -
-
- -

◆ errorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg to Serial and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::errorHalt (print_tpr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::errorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [1/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorPrint (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [2/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorPrint (const char * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [3/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::errorPrint (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [4/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::errorPrint (print_tpr)
-
-inlineinherited
-
-

Print SD errorCode and errorData.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorPrint() [5/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::errorPrint (print_tpr,
char const * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::exists (const ExChar_t * path)
-
-inlineinherited
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::exists (const String & path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatLength()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatLength () const
-
-inlineinherited
-
-
Returns
the FAT length in sectors
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::fatStartSector () const
-
-inlineinherited
-
-
Returns
the FAT start sector number.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::fatType () const
-
-inlineinherited
-
-
Returns
Type FAT_TYPE_EXFAT for exFAT partition or zero for error.
- -
-
- -

◆ format()

- -
-
- - - - - -
- - - - - - - - -
bool SdExFat::format (print_tpr = NULL)
-
-inline
-
-

Format a SD card exFAT.

-
Parameters
- - -
[in]prOptional Print information.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::freeClusterCount ()
-
-inherited
-
-
Returns
the free cluster count.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatPartition::init (BlockDevicedev,
uint8_t part 
)
-
-inherited
-
-

Initialize a exFAT partition.

Parameters
- - - -
[in]devThe blockDevice for the partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ initErrorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt ()
-
-inlineinherited
-
-

Print error info and halt.

- -
-
- -

◆ initErrorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ initErrorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< ExFatVolume >::initErrorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorPrint() [1/2]

- -
-
- - - - - -
- - - - - - - -
void SdBase< ExFatVolume >::initErrorPrint ()
-
-inlineinherited
-
-

Print error details after begin() fails.

- -
-
- -

◆ initErrorPrint() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::initErrorPrint (Print * pr)
-
-inlineinherited
-
-

Print error details after begin() fails.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ ls() [1/5]

- -
-
- - - - - -
- - - - - - - -
bool ExFatVolume::ls ()
-
-inlineinherited
-
-

List the directory contents of the root directory to Serial.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (const ExChar_t * path,
uint8_t flags = 0 
)
-
-inlineinherited
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [3/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (print_tpr,
const ExChar_t * path,
uint8_t flags 
)
-
-inlineinherited
-
-

List the contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::ls (print_tpr,
uint8_t flags = 0 
)
-
-inlineinherited
-
-

List the directory contents of the root directory.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [5/5]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::ls (uint8_t flags)
-
-inlineinherited
-
-

List the directory contents of the volume root to Serial.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::mkdir (const ExChar_t * path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ExFile ExFatVolume::open (const ExChar_t * path,
oflag_t oflag = 0X00 
)
-
-inlineinherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a ExFile object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ExFile ExFatVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-inlineinherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen oflag flags.
-
-
-
Returns
a ExFile object.
- -
-
- -

◆ printFatType()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::printFatType (print_tpr)
-
-inlineinherited
-
-

Print volume FAT/exFAT type.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ printSdError()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< ExFatVolume >::printSdError (print_tpr)
-
-inlineinherited
-
-

Print error info and return.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::remove (const ExChar_t * path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::remove (const String & path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::rename (const ExChar_t * oldPath,
const ExChar_t * newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::rmdir (const ExChar_t * path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool ExFatVolume::rmdir (const String & path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirectoryCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::rootDirectoryCluster () const
-
-inlineinherited
-
-
Returns
the root directory start cluster number.
- -
-
- -

◆ rootLength()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::rootLength ()
-
-inherited
-
-
Returns
the root directory length.
- -
-
- -

◆ sdErrorCode()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< ExFatVolume >::sdErrorCode ()
-
-inlineinherited
-
-
Returns
SD card error code.
- -
-
- -

◆ sdErrorData()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< ExFatVolume >::sdErrorData ()
-
-inlineinherited
-
-
Returns
SD card error data.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t ExFatPartition::sectorsPerCluster () const
-
-inlineinherited
-
-
Returns
the number of sectors in a cluster.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t ExFatPartition::sectorsPerClusterShift () const
-
-inlineinherited
-
-
Returns
the power of two for sectors per cluster.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::truncate (const ExChar_t * path,
uint64_t length 
)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool ExFatVolume::truncate (const String & path,
uint64_t length 
)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ vol()

- -
-
- - - - - -
- - - - - - - -
ExFatVolume * SdBase< ExFatVolume >::vol ()
-
-inlineinherited
-
-
Returns
pointer to base volume
- -
-
- -

◆ volumeBegin()

- -
-
- - - - - -
- - - - - - - -
bool SdBase< ExFatVolume >::volumeBegin ()
-
-inlineinherited
-
-

Initialize file system after call to cardBegin.

-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdFat.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__coll__graph.png deleted file mode 100644 index e1c1ed8a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__inherit__graph.png deleted file mode 100644 index e1c1ed8a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_ex_fat__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32-members.html deleted file mode 100644 index e1c42ee9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32-members.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdFat32 Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdCsPin_t csPin=SS)SdBase< FatVolume >inline
begin(SdCsPin_t csPin, uint32_t maxSck)SdBase< FatVolume >inline
begin(SdSpiConfig spiConfig)SdBase< FatVolume >inline
begin(SdioConfig sdioConfig)SdBase< FatVolume >inline
FatVolume::begin(BlockDevice *dev, bool setCwv=true, uint8_t part=1)FatVolumeinline
bytesPerCluster()FatPartitioninline
bytesPerClusterShift()FatPartitioninline
bytesPerSector()FatPartitioninline
bytesPerSectorShift()FatPartitioninline
cacheClear()FatPartitioninline
card()SdBase< FatVolume >inline
cardBegin(SdSpiConfig spiConfig)SdBase< FatVolume >inline
cardBegin(SdioConfig sdioConfig)SdBase< FatVolume >inline
chdir()FatVolumeinline
chdir(const char *path)FatVolume
chdir(const String &path)FatVolumeinline
chvol()FatVolumeinline
clusterCount() constFatPartitioninline
cwv()FatVolumeinlinestatic
dataStartSector() constFatPartitioninline
dbgFat(uint32_t n, uint32_t *v)FatPartitioninline
errorHalt(print_t *pr)SdBase< FatVolume >inline
errorHalt(print_t *pr, const char *msg)SdBase< FatVolume >inline
errorHalt(print_t *pr, const __FlashStringHelper *msg)SdBase< FatVolume >inline
errorHalt(const __FlashStringHelper *msg)SdBase< FatVolume >inline
errorHalt()SdBase< FatVolume >inline
errorHalt(const char *msg)SdBase< FatVolume >inline
errorPrint(print_t *pr)SdBase< FatVolume >inline
errorPrint(print_t *pr, char const *msg)SdBase< FatVolume >inline
errorPrint(Print *pr, const __FlashStringHelper *msg)SdBase< FatVolume >inline
errorPrint(const char *msg)SdBase< FatVolume >inline
errorPrint(const __FlashStringHelper *msg)SdBase< FatVolume >inline
exists(const char *path)FatVolumeinline
exists(const String &path)FatVolumeinline
fatCount()FatPartitioninline
FatPartition()FatPartitioninline
fatStartSector() constFatPartitioninline
fatType() constFatPartitioninline
format(print_t *pr=NULL)SdFat32inline
freeClusterCount()FatPartition
init(BlockDevice *dev, uint8_t part=1)FatPartition
initErrorHalt(print_t *pr)SdBase< FatVolume >inline
initErrorHalt(print_t *pr, const char *msg)SdBase< FatVolume >inline
initErrorHalt(Print *pr, const __FlashStringHelper *msg)SdBase< FatVolume >inline
initErrorHalt()SdBase< FatVolume >inline
initErrorHalt(const char *msg)SdBase< FatVolume >inline
initErrorHalt(const __FlashStringHelper *msg)SdBase< FatVolume >inline
initErrorPrint(Print *pr)SdBase< FatVolume >inline
initErrorPrint()SdBase< FatVolume >inline
ls(print_t *pr, uint8_t flags=0)FatVolumeinline
ls(print_t *pr, const char *path, uint8_t flags)FatVolumeinline
ls(uint8_t flags=0)FatVolumeinline
ls(const char *path, uint8_t flags=0)FatVolumeinline
mkdir(const char *path, bool pFlag=true)FatVolumeinline
mkdir(const String &path, bool pFlag=true)FatVolumeinline
open(const char *path, oflag_t oflag=0X00)FatVolumeinline
open(const String &path, oflag_t oflag=0X00)FatVolumeinline
printFatType(print_t *pr)SdBase< FatVolume >inline
printSdError(print_t *pr)SdBase< FatVolume >inline
remove(const char *path)FatVolumeinline
remove(const String &path)FatVolumeinline
rename(const char *oldPath, const char *newPath)FatVolumeinline
rename(const String &oldPath, const String &newPath)FatVolumeinline
rmdir(const char *path)FatVolumeinline
rmdir(const String &path)FatVolumeinline
rootDirEntryCount() constFatPartitioninline
rootDirStart() constFatPartitioninline
sdErrorCode()SdBase< FatVolume >inline
sdErrorData()SdBase< FatVolume >inline
sectorMask()FatPartitioninline
sectorsPerCluster() constFatPartitioninline
sectorsPerClusterShift() constFatPartitioninline
sectorsPerFat() constFatPartitioninline
truncate(const char *path, uint32_t length)FatVolumeinline
truncate(const String &path, uint32_t length)FatVolumeinline
vol()SdBase< FatVolume >inline
volumeBegin()SdBase< FatVolume >inline
volumeSectorCount() constFatPartitioninline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32.html deleted file mode 100644 index 93af6df4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32.html +++ /dev/null @@ -1,2904 +0,0 @@ - - - - - - - -SdFat: SdFat32 Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

SD file system class for FAT volumes. - More...

- -

#include <SdFat.h>

-
-Inheritance diagram for SdFat32:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for SdFat32:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *dev, bool setCwv=true, uint8_t part=1)
 
bool begin (SdCsPin_t csPin, uint32_t maxSck)
 
bool begin (SdCsPin_t csPin=SS)
 
bool begin (SdioConfig sdioConfig)
 
bool begin (SdSpiConfig spiConfig)
 
uint16_t bytesPerCluster ()
 
uint8_t bytesPerClusterShift ()
 
uint16_t bytesPerSector ()
 
uint8_t bytesPerSectorShift ()
 
cache_tcacheClear ()
 
SdCardcard ()
 
bool cardBegin (SdioConfig sdioConfig)
 
bool cardBegin (SdSpiConfig spiConfig)
 
bool chdir ()
 
bool chdir (const char *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount () const
 
uint32_t dataStartSector () const
 
int8_t dbgFat (uint32_t n, uint32_t *v)
 
void errorHalt ()
 
void errorHalt (const __FlashStringHelper *msg)
 
void errorHalt (const char *msg)
 
void errorHalt (print_t *pr)
 
void errorHalt (print_t *pr, const __FlashStringHelper *msg)
 
void errorHalt (print_t *pr, const char *msg)
 
void errorPrint (const __FlashStringHelper *msg)
 
void errorPrint (const char *msg)
 
void errorPrint (Print *pr, const __FlashStringHelper *msg)
 
void errorPrint (print_t *pr)
 
void errorPrint (print_t *pr, char const *msg)
 
bool exists (const char *path)
 
bool exists (const String &path)
 
uint8_t fatCount ()
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
bool format (print_t *pr=NULL)
 
int32_t freeClusterCount ()
 
bool init (BlockDevice *dev, uint8_t part=1)
 
void initErrorHalt ()
 
void initErrorHalt (const __FlashStringHelper *msg)
 
void initErrorHalt (const char *msg)
 
void initErrorHalt (Print *pr, const __FlashStringHelper *msg)
 
void initErrorHalt (print_t *pr)
 
void initErrorHalt (print_t *pr, const char *msg)
 
void initErrorPrint ()
 
void initErrorPrint (Print *pr)
 
bool ls (const char *path, uint8_t flags=0)
 
bool ls (print_t *pr, const char *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags=0)
 
bool ls (uint8_t flags=0)
 
bool mkdir (const char *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
File32 open (const char *path, oflag_t oflag=0X00)
 
File32 open (const String &path, oflag_t oflag=0X00)
 
void printFatType (print_t *pr)
 
void printSdError (print_t *pr)
 
bool remove (const char *path)
 
bool remove (const String &path)
 
bool rename (const char *oldPath, const char *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const char *path)
 
bool rmdir (const String &path)
 
uint16_t rootDirEntryCount () const
 
uint32_t rootDirStart () const
 
uint8_t sdErrorCode ()
 
uint8_t sdErrorData ()
 
uint16_t sectorMask ()
 
uint8_t sectorsPerCluster () const
 
uint8_t sectorsPerClusterShift () const
 
uint32_t sectorsPerFat () const
 
bool truncate (const char *path, uint32_t length)
 
bool truncate (const String &path, uint32_t length)
 
FatVolumevol ()
 
bool volumeBegin ()
 
uint32_t volumeSectorCount () const
 
- - - -

-Static Public Member Functions

static FatVolumecwv ()
 
-

Detailed Description

-

SD file system class for FAT volumes.

-

Member Function Documentation

- -

◆ begin() [1/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatVolume::begin (BlockDevicedev,
bool setCwv = true,
uint8_t part = 1 
)
-
-inlineinherited
-
-

Initialize an FatVolume object.

Parameters
- - - - -
[in]devDevice block driver.
[in]setCwvSet current working volume if true.
[in]partpartition to initialize.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [2/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdBase< FatVolume >::begin (SdCsPin_t csPin,
uint32_t maxSck 
)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - - -
[in]csPinSD card chip select pin.
[in]maxSckMaximum SCK frequency.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [3/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FatVolume >::begin (SdCsPin_t csPin = SS)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - -
[in]csPinSD card chip select pin.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [4/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FatVolume >::begin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [5/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FatVolume >::begin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerCluster ()
-
-inlineinherited
-
-
Returns
Number of bytes in a cluster.
- -
-
- -

◆ bytesPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerClusterShift ()
-
-inlineinherited
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ bytesPerSector()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::bytesPerSector ()
-
-inlineinherited
-
-
Returns
Number of bytes per sector.
- -
-
- -

◆ bytesPerSectorShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::bytesPerSectorShift ()
-
-inlineinherited
-
-
Returns
The shift count required to multiply by bytesPerCluster.
- -
-
- -

◆ cacheClear()

- -
-
- - - - - -
- - - - - - - -
cache_t* FatPartition::cacheClear ()
-
-inlineinherited
-
-

Clear the cache and returns a pointer to the cache. Not for normal apps.

Returns
A pointer to the cache buffer or zero if an error occurs.
- -
-
- -

◆ card()

- -
-
- - - - - -
- - - - - - - -
SdCard* SdBase< FatVolume >::card ()
-
-inlineinherited
-
-
Returns
Pointer to SD card object.
- -
-
- -

◆ cardBegin() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FatVolume >::cardBegin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card in SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ cardBegin() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FatVolume >::cardBegin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card in SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool FatVolume::chdir ()
-
-inlineinherited
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::chdir (const char * path)
-
-inherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::chdir (const String & path)
-
-inlineinherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void FatVolume::chvol ()
-
-inlineinherited
-
-

Change global current working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::clusterCount () const
-
-inlineinherited
-
-
Returns
The total number of clusters in the volume.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static FatVolume* FatVolume::cwv ()
-
-inlinestaticinherited
-
-
Returns
current working volume.
- -
-
- -

◆ dataStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::dataStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of file data.
- -
-
- -

◆ dbgFat()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int8_t FatPartition::dbgFat (uint32_t n,
uint32_t * v 
)
-
-inlineinherited
-
-

Debug access to FAT table

-
Parameters
- - - -
[in]ncluster number.
[out]vvalue of entry
-
-
-
Returns
-1 error, 0 EOC, else 1.
- -
-
- -

◆ errorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FatVolume >::errorHalt ()
-
-inlineinherited
-
-

Print error info to Serial and halt.

- -
-
- -

◆ errorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg to Serial and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::errorHalt (print_tpr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::errorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [1/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorPrint (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [2/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorPrint (const char * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [3/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::errorPrint (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [4/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::errorPrint (print_tpr)
-
-inlineinherited
-
-

Print SD errorCode and errorData.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorPrint() [5/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::errorPrint (print_tpr,
char const * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::exists (const char * path)
-
-inlineinherited
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::exists (const String & path)
-
-inlineinherited
-
-

Test for the existence of a file.

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatCount()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatCount ()
-
-inlineinherited
-
-
Returns
The number of File Allocation Tables.
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::fatStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of the first FAT.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::fatType () const
-
-inlineinherited
-
-
Returns
The FAT type of the volume. Values are 12, 16 or 32.
- -
-
- -

◆ format()

- -
-
- - - - - -
- - - - - - - - -
bool SdFat32::format (print_tpr = NULL)
-
-inline
-
-

Format a SD card FAT32/FAT16.

-
Parameters
- - -
[in]prOptional Print information.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
int32_t FatPartition::freeClusterCount ()
-
-inherited
-
-

Volume free space in clusters.

-
Returns
Count of free clusters for success or -1 if an error occurs.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatPartition::init (BlockDevicedev,
uint8_t part = 1 
)
-
-inherited
-
-

Initialize a FAT partition.

-
Parameters
- - - -
[in]devBlockDevice for this partition.
[in]partThe partition to be used. Legal values for part are 1-4 to use the corresponding partition on a device formatted with a MBR, Master Boot Record, or zero if the device is formatted as a super floppy with the FAT boot sector in sector zero.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ initErrorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FatVolume >::initErrorHalt ()
-
-inlineinherited
-
-

Print error info and halt.

- -
-
- -

◆ initErrorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::initErrorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::initErrorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::initErrorHalt (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::initErrorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ initErrorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FatVolume >::initErrorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorPrint() [1/2]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FatVolume >::initErrorPrint ()
-
-inlineinherited
-
-

Print error details after begin() fails.

- -
-
- -

◆ initErrorPrint() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::initErrorPrint (Print * pr)
-
-inlineinherited
-
-

Print error details after begin() fails.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ ls() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (const char * path,
uint8_t flags = 0 
)
-
-inlineinherited
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (print_tpr,
const char * path,
uint8_t flags 
)
-
-inlineinherited
-
-

List the contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::ls (print_tpr,
uint8_t flags = 0 
)
-
-inlineinherited
-
-

List the directory contents of the volume root directory.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/4]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::ls (uint8_t flags = 0)
-
-inlineinherited
-
-

List the directory contents of the root directory to Serial.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::mkdir (const char * path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
File32 FatVolume::open (const char * path,
oflag_t oflag = 0X00 
)
-
-inlineinherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a File32 object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
File32 FatVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-inlineinherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a File32 object.
- -
-
- -

◆ printFatType()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::printFatType (print_tpr)
-
-inlineinherited
-
-

Print volume FAT/exFAT type.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ printSdError()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FatVolume >::printSdError (print_tpr)
-
-inlineinherited
-
-

Print error info and return.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::remove (const char * path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::remove (const String & path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::rename (const char * oldPath,
const char * newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::rmdir (const char * path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatVolume::rmdir (const String & path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's working directory.

-
Parameters
- - -
[in]pathA path with a valid name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rootDirEntryCount()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::rootDirEntryCount () const
-
-inlineinherited
-
-
Returns
The number of entries in the root directory for FAT16 volumes.
- -
-
- -

◆ rootDirStart()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::rootDirStart () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes.
- -
-
- -

◆ sdErrorCode()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< FatVolume >::sdErrorCode ()
-
-inlineinherited
-
-
Returns
SD card error code.
- -
-
- -

◆ sdErrorData()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< FatVolume >::sdErrorData ()
-
-inlineinherited
-
-
Returns
SD card error data.
- -
-
- -

◆ sectorMask()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatPartition::sectorMask ()
-
-inlineinherited
-
-
Returns
Mask for sector offset.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerCluster () const
-
-inlineinherited
-
-
Returns
The volume's cluster size in sectors.
- -
-
- -

◆ sectorsPerClusterShift()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatPartition::sectorsPerClusterShift () const
-
-inlineinherited
-
-
Returns
The shift count required to multiply by sectorsPerCluster.
- -
-
- -

◆ sectorsPerFat()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::sectorsPerFat () const
-
-inlineinherited
-
-
Returns
The number of sectors in one FAT.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::truncate (const char * path,
uint32_t length 
)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatVolume::truncate (const String & path,
uint32_t length 
)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be at the new EOF.

-
Parameters
- - - -
[in]pathA path with a valid name for the file.
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ vol()

- -
-
- - - - - -
- - - - - - - -
FatVolume * SdBase< FatVolume >::vol ()
-
-inlineinherited
-
-
Returns
pointer to base volume
- -
-
- -

◆ volumeBegin()

- -
-
- - - - - -
- - - - - - - -
bool SdBase< FatVolume >::volumeBegin ()
-
-inlineinherited
-
-

Initialize file system after call to cardBegin.

-
Returns
true for success or false for failure.
- -
-
- -

◆ volumeSectorCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatPartition::volumeSectorCount () const
-
-inlineinherited
-
-
Returns
The number of sectors in the volume
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdFat.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__coll__graph.png deleted file mode 100644 index d7ff0975..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__inherit__graph.png deleted file mode 100644 index d7ff0975..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fat32__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file-members.html deleted file mode 100644 index dc59cfaa..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file-members.html +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdFile Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
available()FatFileinline
available32()FatFileinline
clearError()FatFileinline
clearWriteError()FatFileinline
close()FatFile
contiguousRange(uint32_t *bgnSector, uint32_t *endSector)FatFile
createContiguous(FatFile *dirFile, const char *path, uint32_t size)FatFile
createContiguous(const char *path, uint32_t size)FatFile
curCluster() constFatFileinline
curPosition() constFatFileinline
dateTimeCallback(void(*dateTime)(uint16_t *date, uint16_t *time))SdFileinlinestatic
dateTimeCallbackCancel()SdFileinlinestatic
dirEntry(DirFat_t *dir)FatFile
dirIndex()FatFileinline
dirSize()FatFile
dmpFile(print_t *pr, uint32_t pos, size_t n)FatFile
exists(const char *path)FatFileinline
FatFile()FatFileinline
FatFile(const char *path, oflag_t oflag)FatFileinline
fgetpos(fspos_t *pos)FatFile
fgets(char *str, int num, char *delim=NULL)FatFile
fileSize() constFatFileinline
firstBlock() constFatFileinline
firstSector() constFatFile
flush()FatFileinline
fsetpos(const fspos_t *pos)FatFile
getAccessDate(uint16_t *pdate)FatFile
getAccessDateTime(uint16_t *pdate, uint16_t *ptime)FatFileinline
getCreateDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getError()FatFileinline
getModifyDateTime(uint16_t *pdate, uint16_t *ptime)FatFile
getName(char *name, size_t size)FatFile
getSFN(char *name)FatFile
getWriteError()FatFileinline
isContiguous() constFatFileinline
isDir() constFatFileinline
isFile() constFatFileinline
isHidden() constFatFileinline
isLFN() constFatFileinline
isOpen() constFatFileinline
isReadable() constFatFileinline
isReadOnly() constFatFileinline
isRoot() constFatFileinline
isRoot32() constFatFileinline
isRootFixed() constFatFileinline
isSubDir() constFatFileinline
isSystem() constFatFileinline
isWritable() constFatFileinline
legal83Char(uint8_t c)FatFileinlinestatic
ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)FatFile
ls(uint8_t flags=0)FatFileinline
mkdir(FatFile *dir, const char *path, bool pFlag=true)FatFile
open(FatVolume *vol, const char *path, oflag_t oflag)FatFile
open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFile
open(FatFile *dirFile, const char *path, oflag_t oflag)FatFile
open(const char *path, oflag_t oflag=0X00)FatFile
openNext(FatFile *dirFile, oflag_t oflag=0X00)FatFile
openRoot(FatVolume *vol)FatFile
operator bool()FatFileinline
peek()FatFile
preAllocate(uint32_t length)FatFile
printAccessDate(print_t *pr)FatFile
printAccessDateTime(print_t *pr)FatFileinline
printCreateDateTime(print_t *pr)FatFile
printFatDate(print_t *pr, uint16_t fatDate)FatFilestatic
printFatTime(print_t *pr, uint16_t fatTime)FatFilestatic
printField(double value, char term, uint8_t prec=2)FatFileinline
printField(float value, char term, uint8_t prec=2)FatFileinline
printField(Type value, char term)FatFileinline
printFileSize(print_t *pr)FatFile
printModifyDateTime(print_t *pr)FatFile
printName(print_t *pr)FatFile
printName()FatFileinline
printSFN(print_t *pr)FatFile
read()FatFileinline
read(void *buf, size_t count)FatFile
readDir(DirFat_t *dir)FatFile
remove()FatFile
remove(const char *path)FatFile
rename(const char *newPath)FatFile
rename(FatFile *dirFile, const char *newPath)FatFile
rewind()FatFileinline
rmdir()FatFile
rmRfStar()FatFile
SdFile() (defined in SdFile)SdFileinline
SdFile(const char *path, oflag_t oflag)SdFileinline
seekCur(int32_t offset)FatFileinline
seekEnd(int32_t offset=0)FatFileinline
seekSet(uint32_t pos)FatFile
sync()FatFile
timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)FatFile
truncate()FatFile
truncate(uint32_t length)FatFileinline
write(uint8_t b)PrintFile< SdBaseFile >inline
FatFile::write(const char *str)FatFileinline
FatFile::write(const void *buf, size_t count)FatFile
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file.html deleted file mode 100644 index 267b9b64..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file.html +++ /dev/null @@ -1,3603 +0,0 @@ - - - - - - - -SdFat: SdFile Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

FAT16/FAT32 file with Print. - More...

- -

#include <SdFat.h>

-
-Inheritance diagram for SdFile:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for SdFile:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
uint32_t available32 ()
 
void clearError ()
 
void clearWriteError ()
 
bool close ()
 
bool contiguousRange (uint32_t *bgnSector, uint32_t *endSector)
 
bool createContiguous (const char *path, uint32_t size)
 
bool createContiguous (FatFile *dirFile, const char *path, uint32_t size)
 
uint32_t curCluster () const
 
uint32_t curPosition () const
 
bool dirEntry (DirFat_t *dir)
 
uint16_t dirIndex ()
 
uint32_t dirSize ()
 
void dmpFile (print_t *pr, uint32_t pos, size_t n)
 
bool exists (const char *path)
 
void fgetpos (fspos_t *pos)
 
int fgets (char *str, int num, char *delim=NULL)
 
uint32_t fileSize () const
 
uint32_t firstBlock () const
 
uint32_t firstSector () const
 
void flush ()
 
void fsetpos (const fspos_t *pos)
 
bool getAccessDate (uint16_t *pdate)
 
bool getAccessDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getCreateDateTime (uint16_t *pdate, uint16_t *ptime)
 
uint8_t getError ()
 
bool getModifyDateTime (uint16_t *pdate, uint16_t *ptime)
 
bool getName (char *name, size_t size)
 
bool getSFN (char *name)
 
bool getWriteError ()
 
bool isContiguous () const
 
bool isDir () const
 
bool isFile () const
 
bool isHidden () const
 
bool isLFN () const
 
bool isOpen () const
 
bool isReadable () const
 
bool isReadOnly () const
 
bool isRoot () const
 
bool isRoot32 () const
 
bool isRootFixed () const
 
bool isSubDir () const
 
bool isSystem () const
 
bool isWritable () const
 
bool ls (print_t *pr, uint8_t flags=0, uint8_t indent=0)
 
bool ls (uint8_t flags=0)
 
bool mkdir (FatFile *dir, const char *path, bool pFlag=true)
 
bool open (const char *path, oflag_t oflag=0X00)
 
bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
bool openNext (FatFile *dirFile, oflag_t oflag=0X00)
 
bool openRoot (FatVolume *vol)
 
 operator bool ()
 
int peek ()
 
bool preAllocate (uint32_t length)
 
size_t printAccessDate (print_t *pr)
 
size_t printAccessDateTime (print_t *pr)
 
size_t printCreateDateTime (print_t *pr)
 
size_t printField (double value, char term, uint8_t prec=2)
 
size_t printField (float value, char term, uint8_t prec=2)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t printFileSize (print_t *pr)
 
size_t printModifyDateTime (print_t *pr)
 
size_t printName ()
 
size_t printName (print_t *pr)
 
size_t printSFN (print_t *pr)
 
int read ()
 
int read (void *buf, size_t count)
 
int8_t readDir (DirFat_t *dir)
 
bool remove ()
 
bool remove (const char *path)
 
bool rename (const char *newPath)
 
bool rename (FatFile *dirFile, const char *newPath)
 
void rewind ()
 
bool rmdir ()
 
bool rmRfStar ()
 
 SdFile (const char *path, oflag_t oflag)
 
bool seekCur (int32_t offset)
 
bool seekEnd (int32_t offset=0)
 
bool seekSet (uint32_t pos)
 
bool sync ()
 
bool timestamp (uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second)
 
bool truncate ()
 
bool truncate (uint32_t length)
 
size_t write (const char *str)
 
size_t write (const void *buf, size_t count)
 
size_t write (uint8_t b)
 
- - - - - - - - - - - -

-Static Public Member Functions

static void dateTimeCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
 
static void dateTimeCallbackCancel ()
 
static bool legal83Char (uint8_t c)
 
static void printFatDate (print_t *pr, uint16_t fatDate)
 
static void printFatTime (print_t *pr, uint16_t fatTime)
 
-

Detailed Description

-

FAT16/FAT32 file with Print.

-

Constructor & Destructor Documentation

- -

◆ SdFile()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
SdFile::SdFile (const char * path,
oflag_t oflag 
)
-
-inline
-
-

Create an open SdFile.

Parameters
- - - -
[in]pathpath for file.
[in]oflagopen flags.
-
-
- -
-
-

Member Function Documentation

- -

◆ available()

- -
-
- - - - - -
- - - - - - - -
int FatFile::available ()
-
-inlineinherited
-
-
Returns
The number of bytes available from the current position to EOF for normal files. INT_MAX is returned for very large files.
-

available64() is recomended for very large files.

-

Zero is returned for directory files.

- -
-
- -

◆ available32()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::available32 ()
-
-inlineinherited
-
-
Returns
The number of bytes available from the current position to EOF for normal files. Zero is returned for directory files.
- -
-
- -

◆ clearError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearError ()
-
-inlineinherited
-
-

Clear all error bits.

- -
-
- -

◆ clearWriteError()

- -
-
- - - - - -
- - - - - - - -
void FatFile::clearWriteError ()
-
-inlineinherited
-
-

Set writeError to zero

- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::close ()
-
-inherited
-
-

Close a file and force cached data and directory information to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ contiguousRange()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::contiguousRange (uint32_t * bgnSector,
uint32_t * endSector 
)
-
-inherited
-
-

Check for contiguous file and return its raw sector range.

-
Parameters
- - - -
[out]bgnSectorthe first sector address for the file.
[out]endSectorthe last sector address for the file.
-
-
-

Set the contiguous flag if the file is contiguous. The parameters may be nullptr to only set the flag.

Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (const char * path,
uint32_t size 
)
-
-inherited
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - -
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ createContiguous() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::createContiguous (FatFiledirFile,
const char * path,
uint32_t size 
)
-
-inherited
-
-

Create and open a new contiguous file of a specified size.

-
Parameters
- - - - -
[in]dirFileThe directory where the file will be created.
[in]pathA path with a valid file name.
[in]sizeThe desired file size.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ curCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curCluster () const
-
-inlineinherited
-
-
Returns
The current cluster number for a file or directory.
- -
-
- -

◆ curPosition()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::curPosition () const
-
-inlineinherited
-
-
Returns
The current position for a file or directory.
- -
-
- -

◆ dateTimeCallback()

- -
-
- - - - - -
- - - - - - - - -
static void SdFile::dateTimeCallback (void(*)(uint16_t *date, uint16_t *time) dateTime)
-
-inlinestatic
-
-

Set the date/time callback function

-
Parameters
- - -
[in]dateTimeThe user's call back function. The callback function is of the form:
-
-
-
void dateTime(uint16_t* date, uint16_t* time) {
-
uint16_t year;
-
uint8_t month, day, hour, minute, second;
-
-
// User gets date and time from GPS or real-time clock here
-
-
// return date using FS_DATE macro to format fields
-
*date = FS_DATE(year, month, day);
-
-
// return time using FS_TIME macro to format fields
-
*time = FS_TIME(hour, minute, second);
-
}
-

Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

- -
-
- -

◆ dateTimeCallbackCancel()

- -
-
- - - - - -
- - - - - - - -
static void SdFile::dateTimeCallbackCancel ()
-
-inlinestatic
-
-

Cancel the date/time callback function.

- -
-
- -

◆ dirEntry()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::dirEntry (DirFat_t * dir)
-
-inherited
-
-

Return a file's directory entry.

-
Parameters
- - -
[out]dirLocation for return of the file's directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ dirIndex()

- -
-
- - - - - -
- - - - - - - -
uint16_t FatFile::dirIndex ()
-
-inlineinherited
-
-
Returns
Directory entry index.
- -
-
- -

◆ dirSize()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::dirSize ()
-
-inherited
-
-
Returns
The number of bytes allocated to a directory or zero if an error occurs.
- -
-
- -

◆ dmpFile()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
void FatFile::dmpFile (print_tpr,
uint32_t pos,
size_t n 
)
-
-inherited
-
-

Dump file in Hex

Parameters
- - - - -
[in]prPrint stream for list.
[in]posStart position in file.
[in]nnumber of locations to dump.
-
-
- -
-
- -

◆ exists()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::exists (const char * path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-

The calling instance must be an open directory file.

-

dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory dirFile.

-
Returns
True if the file exists.
- -
-
- -

◆ fgetpos()

- -
-
- - - - - -
- - - - - - - - -
void FatFile::fgetpos (fspos_t * pos)
-
-inherited
-
-

get position for streams

Parameters
- - -
[out]posstruct to receive position
-
-
- -
-
- -

◆ fgets()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int FatFile::fgets (char * str,
int num,
char * delim = NULL 
)
-
-inherited
-
-

Get a string from a file.

-

fgets() reads bytes from a file into the array pointed to by str, until num - 1 bytes are read, or a delimiter is read and transferred to str, or end-of-file is encountered. The string is then terminated with a null byte.

-

fgets() deletes CR, '\r', from the string. This insures only a '\n' terminates the string for Windows text files which use CRLF for newline.

-
Parameters
- - - - -
[out]strPointer to the array where the string is stored.
[in]numMaximum number of characters to be read (including the final null byte). Usually the length of the array str is used.
[in]delimOptional set of delimiters. The default is "\n".
-
-
-
Returns
For success fgets() returns the length of the string in str. If no data is read, fgets() returns zero for EOF or -1 if an error occurred.
- -
-
- -

◆ fileSize()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::fileSize () const
-
-inlineinherited
-
-
Returns
The total number of bytes in a file.
- -
-
- -

◆ firstBlock()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::firstBlock () const
-
-inlineinherited
-
-
Returns
first sector of file or zero for empty file.
- -
-
- -

◆ firstSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FatFile::firstSector () const
-
-inherited
-
-
Returns
Address of first sector or zero for empty file.
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
void FatFile::flush ()
-
-inlineinherited
-
-

Arduino name for sync()

- -
-
- -

◆ fsetpos()

- -
-
- - - - - -
- - - - - - - - -
void FatFile::fsetpos (const fspos_t * pos)
-
-inherited
-
-

set position for streams

Parameters
- - -
[in]posstruct with value for new position
-
-
- -
-
- -

◆ getAccessDate()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::getAccessDate (uint16_t * pdate)
-
-inherited
-
-

Get a file's access date.

-
Parameters
- - -
[out]pdatePacked date for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getAccessDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getAccessDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inlineinherited
-
-

Get a file's access date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimereturn zero since FAT has no time.
-
-
-

This function is for comparability in FsFile.

-
Returns
true for success or false for failure.
- -
-
- -

◆ getCreateDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getCreateDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's create date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getError()

- -
-
- - - - - -
- - - - - - - -
uint8_t FatFile::getError ()
-
-inlineinherited
-
-
Returns
All error bits.
- -
-
- -

◆ getModifyDateTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getModifyDateTime (uint16_t * pdate,
uint16_t * ptime 
)
-
-inherited
-
-

Get a file's modify date and time.

-
Parameters
- - - -
[out]pdatePacked date for directory entry.
[out]ptimePacked time for directory entry.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getName()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::getName (char * name,
size_t size 
)
-
-inherited
-
-

Get a file's name followed by a zero byte.

-
Parameters
- - - -
[out]nameAn array of characters for the file's name.
[in]sizeThe size of the array in bytes. The array must be at least 13 bytes long. The file's name will be truncated if the file's name is too long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getSFN()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::getSFN (char * name)
-
-inherited
-
-

Get a file's Short File Name followed by a zero byte.

-
Parameters
- - -
[out]nameAn array of characters for the file's name. The array must be at least 13 bytes long.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ getWriteError()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::getWriteError ()
-
-inlineinherited
-
-
Returns
value of writeError
- -
-
- -

◆ isContiguous()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isContiguous () const
-
-inlineinherited
-
-
Returns
True if the file is contiguous.
- -
-
- -

◆ isDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isDir () const
-
-inlineinherited
-
-
Returns
True if this is a directory.
- -
-
- -

◆ isFile()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isFile () const
-
-inlineinherited
-
-
Returns
True if this is a normal file.
- -
-
- -

◆ isHidden()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isHidden () const
-
-inlineinherited
-
-
Returns
True if this is a hidden file.
- -
-
- -

◆ isLFN()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isLFN () const
-
-inlineinherited
-
-
Returns
true if this file has a Long File Name.
- -
-
- -

◆ isOpen()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isOpen () const
-
-inlineinherited
-
-
Returns
True if this is an open file/directory.
- -
-
- -

◆ isReadable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ isReadOnly()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isReadOnly () const
-
-inlineinherited
-
-
Returns
True if file is read-only
- -
-
- -

◆ isRoot()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot () const
-
-inlineinherited
-
-
Returns
True if this is the root directory.
- -
-
- -

◆ isRoot32()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRoot32 () const
-
-inlineinherited
-
-
Returns
True if this is the FAT32 root directory.
- -
-
- -

◆ isRootFixed()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isRootFixed () const
-
-inlineinherited
-
-
Returns
True if this is the FAT12 of FAT16 root directory.
- -
-
- -

◆ isSubDir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSubDir () const
-
-inlineinherited
-
-
Returns
True if this is a subdirectory.
- -
-
- -

◆ isSystem()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isSystem () const
-
-inlineinherited
-
-
Returns
True if this is a system file.
- -
-
- -

◆ isWritable()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::isWritable () const
-
-inlineinherited
-
-
Returns
True file is writable.
- -
-
- -

◆ legal83Char()

- -
-
- - - - - -
- - - - - - - - -
static bool FatFile::legal83Char (uint8_t c)
-
-inlinestaticinherited
-
-

Check for a legal 8.3 character.

Parameters
- - -
[in]cCharacter to be checked.
-
-
-
Returns
true for a legal 8.3 character.
- -
-
- -

◆ ls() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::ls (print_tpr,
uint8_t flags = 0,
uint8_t indent = 0 
)
-
-inherited
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint stream for list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Parameters
- - -
[in]indentAmount of space before file name. Used for recursive list to indicate subdirectory level.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::ls (uint8_t flags = 0)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::mkdir (FatFiledir,
const char * path,
bool pFlag = true 
)
-
-inherited
-
-

Make a new directory.

-
Parameters
- - - - -
[in]dirAn open FatFile instance for the directory that will contain the new directory.
[in]pathA path with a valid name for the new directory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::open (const char * path,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

Open a file in the current working volume.

-
Parameters
- - - -
[in]pathA path with a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
const char * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file or directory by name.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]pathA path with a valid name for a file to be opened.
[in]oflagValues for oflag are constructed by a bitwise-inclusive OR of flags from the following list. Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or O_RDWR is allowed.
-
-
-

O_RDONLY - Open for reading.

-

O_READ - Same as O_RDONLY.

-

O_WRONLY - Open for writing.

-

O_WRITE - Same as O_WRONLY.

-

O_RDWR - Open for reading and writing.

-

O_APPEND - If set, the file offset shall be set to the end of the file prior to each write.

-

O_AT_END - Set the initial position at the end of the file.

-

O_CREAT - If the file exists, this flag has no effect except as noted under O_EXCL below. Otherwise, the file shall be created

-

O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists.

-

O_TRUNC - If the file exists and is a regular file, and the file is successfully opened and is not read only, its length shall be truncated to 0.

-

WARNING: A given file must not be opened by more than one FatFile object or file corruption may occur.

-
Note
Directory files must be opened read only. Write and truncation is not allowed for directory files.
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatFiledirFile,
uint16_t index,
oflag_t oflag 
)
-
-inherited
-
-

Open a file by index.

-
Parameters
- - - - -
[in]dirFileAn open FatFile instance for the directory.
[in]indexThe index of the directory entry for the file to be opened. The value for index is (directory file position)/32.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-

See open() by path for definition of flags.

Returns
true for success or false for failure.
- -
-
- -

◆ open() [4/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::open (FatVolumevol,
const char * path,
oflag_t oflag 
)
-
-inherited
-
-

Open a file in the volume root directory.

-
Parameters
- - - - -
[in]volVolume where the file is located.
[in]pathwith a valid name for a file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openNext()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::openNext (FatFiledirFile,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

Open the next file or subdirectory in a directory.

-
Parameters
- - - -
[in]dirFileAn open FatFile instance for the directory containing the file to be opened.
[in]oflagbitwise-inclusive OR of open flags. See see FatFile::open(FatFile*, const char*, uint8_t).
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ openRoot()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::openRoot (FatVolumevol)
-
-inherited
-
-

Open a volume's root directory.

-
Parameters
- - -
[in]volThe FAT volume containing the root directory to be opened.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
FatFile::operator bool ()
-
-inlineinherited
-
-

The parenthesis operator.

-
Returns
true if a file is open.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int FatFile::peek ()
-
-inherited
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ preAllocate()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::preAllocate (uint32_t length)
-
-inherited
-
-

Allocate contiguous clusters to an empty file.

-

The file must be empty with no clusters allocated.

-

The file will contain uninitialized data.

-
Parameters
- - -
[in]lengthsize of the file in bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printAccessDate()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printAccessDate (print_tpr)
-
-inherited
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printAccessDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printAccessDateTime (print_tpr)
-
-inlineinherited
-
-

Print a file's access date

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printCreateDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printCreateDateTime (print_tpr)
-
-inherited
-
-

Print a file's creation date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of bytes printed.
- -
-
- -

◆ printFatDate()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatDate (print_tpr,
uint16_t fatDate 
)
-
-staticinherited
-
-

Print a directory date field.

-

Format is yyyy-mm-dd.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatDateThe date field from a directory entry.
-
-
- -
-
- -

◆ printFatTime()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
static void FatFile::printFatTime (print_tpr,
uint16_t fatTime 
)
-
-staticinherited
-
-

Print a directory time field.

-

Format is hh:mm:ss.

-
Parameters
- - - -
[in]prPrint stream for output.
[in]fatTimeThe time field from a directory entry.
-
-
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename Type >
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FatFile::printField (Type value,
char term 
)
-
-inlineinherited
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator. Use '\n' for CR LF.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printFileSize()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printFileSize (print_tpr)
-
-inherited
-
-

Print a file's size.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ printModifyDateTime()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printModifyDateTime (print_tpr)
-
-inherited
-
-

Print a file's modify date and time

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed.
- -
-
- -

◆ printName() [1/2]

- -
-
- - - - - -
- - - - - - - -
size_t FatFile::printName ()
-
-inlineinherited
-
-

Print a file's name.

-
Returns
true for success or false for failure.
- -
-
- -

◆ printName() [2/2]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printName (print_tpr)
-
-inherited
-
-

Print a file's name

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ printSFN()

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::printSFN (print_tpr)
-
-inherited
-
-

Print a file's Short File Name.

-
Parameters
- - -
[in]prPrint stream for output.
-
-
-
Returns
The number of characters printed is returned for success and zero is returned for failure.
- -
-
- -

◆ read() [1/2]

- -
-
- - - - - -
- - - - - - - -
int FatFile::read ()
-
-inlineinherited
-
-

Read the next byte from a file.

-
Returns
For success read returns the next byte in the file as an int. If an error occurs or end of file is reached -1 is returned.
- -
-
- -

◆ read() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int FatFile::read (void * buf,
size_t count 
)
-
-inherited
-
-

Read data from a file starting at the current position.

-
Parameters
- - - -
[out]bufPointer to the location that will receive the data.
[in]countMaximum number of bytes to read.
-
-
-
Returns
For success read() returns the number of bytes read. A value less than nbyte, including zero, will be returned if end of file is reached. If an error occurs, read() returns -1.
- -
-
- -

◆ readDir()

- -
-
- - - - - -
- - - - - - - - -
int8_t FatFile::readDir (DirFat_t * dir)
-
-inherited
-
-

Read the next directory entry from a directory file.

-
Parameters
- - -
[out]dirThe DirFat_t struct that will receive the data.
-
-
-
Returns
For success readDir() returns the number of bytes read. A value of zero will be returned if end of file is reached. If an error occurs, readDir() returns -1. Possible errors include readDir() called before a directory has been opened, this is not a directory file or an I/O error occurred.
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FatFile::remove ()
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::remove (const char * path)
-
-inherited
-
-

Remove a file.

-

The directory entry and all data for the file are deleted.

-
Parameters
- - -
[in]pathPath for the file to be removed.
-
-
-

Example use: dirFile.remove(filenameToRemove);

-
Note
This function should not be used to delete the 8.3 version of a file that has a long name. For example if a file has the long name "New Text Document.txt" you should not delete the 8.3 name "NEWTEX~1.TXT".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::rename (const char * newPath)
-
-inherited
-
-

Rename a file or subdirectory.

Note
the renamed file will be moved to the current volume working directory.
-
Parameters
- - -
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FatFile::rename (FatFiledirFile,
const char * newPath 
)
-
-inherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]dirFileDirectory for the new path.
[in]newPathNew path name for the file/directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - -
- - - - - - - -
void FatFile::rewind ()
-
-inlineinherited
-
-

Set the file's current position to zero.

- -
-
- -

◆ rmdir()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::rmdir ()
-
-inherited
-
-

Remove a directory file.

-

The directory file will be removed only if it is empty and is not the root directory. rmdir() follows DOS and Windows and ignores the read-only attribute for the directory.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. For example if a directory has the long name "New folder" you should not delete the 8.3 name "NEWFOL~1".
-
Returns
true for success or false for failure.
- -
-
- -

◆ rmRfStar()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::rmRfStar ()
-
-inherited
-
-

Recursively delete a directory and all contained files.

-

This is like the Unix/Linux 'rm -rf *' if called with the root directory hence the name.

-

Warning - This will remove all contents of the directory including subdirectories. The directory will then be removed if it is not root. The read-only attribute for files will be ignored.

-
Note
This function should not be used to delete the 8.3 version of a directory that has a long name. See remove() and rmdir().
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekCur()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekCur (int32_t offset)
-
-inlineinherited
-
-

Set the files position to current position + pos. See seekSet().

Parameters
- - -
[in]offsetThe new position in bytes from the current position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekEnd()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekEnd (int32_t offset = 0)
-
-inlineinherited
-
-

Set the files position to end-of-file + offset. See seekSet(). Can't be used for directory files since file size is not defined.

Parameters
- - -
[in]offsetThe new position in bytes from end-of-file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ seekSet()

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::seekSet (uint32_t pos)
-
-inherited
-
-

Sets a file's position.

-
Parameters
- - -
[in]posThe new position in bytes from the beginning of the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ sync()

- -
-
- - - - - -
- - - - - - - -
bool FatFile::sync ()
-
-inherited
-
-

The sync() call causes all modified data and directory fields to be written to the storage device.

-
Returns
true for success or false for failure.
- -
-
- -

◆ timestamp()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool FatFile::timestamp (uint8_t flags,
uint16_t year,
uint8_t month,
uint8_t day,
uint8_t hour,
uint8_t minute,
uint8_t second 
)
-
-inherited
-
-

Set a file's timestamps in its directory entry.

-
Parameters
- - -
[in]flagsValues for flags are constructed by a bitwise-inclusive OR of flags from the following list
-
-
-

T_ACCESS - Set the file's last access date.

-

T_CREATE - Set the file's creation date and time.

-

T_WRITE - Set the file's last write/modification date and time.

-
Parameters
- - - - - - - -
[in]yearValid range 1980 - 2107 inclusive.
[in]monthValid range 1 - 12 inclusive.
[in]dayValid range 1 - 31 inclusive.
[in]hourValid range 0 - 23 inclusive.
[in]minuteValid range 0 - 59 inclusive.
[in]secondValid range 0 - 59 inclusive
-
-
-
Note
It is possible to set an invalid date since there is no check for the number of days in a month.
-
-Modify and access timestamps may be overwritten if a date time callback function has been set by dateTimeCallback().
-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [1/2]

- -
-
- - - - - -
- - - - - - - -
bool FatFile::truncate ()
-
-inherited
-
-

Truncate a file at the current file position. will be maintained if it is less than or equal to length otherwise it will be set to end of file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ truncate() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FatFile::truncate (uint32_t length)
-
-inlineinherited
-
-

Truncate a file to a specified length. The current file position will be set to end of file.

-
Parameters
- - -
[in]lengthThe desired length for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ write() [1/3]

- -
-
- - - - - -
- - - - - - - - -
size_t FatFile::write (const char * str)
-
-inlineinherited
-
-

Write a string to a file. Used by the Arduino Print class.

Parameters
- - -
[in]strPointer to the string. Use getWriteError to check for errors.
-
-
-
Returns
count of characters written for success or -1 for failure.
- -
-
- -

◆ write() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t FatFile::write (const void * buf,
size_t count 
)
-
-inherited
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufPointer to the location of the data to be written.
[in]countNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always count. If an error occurs, write() returns -1. Possible errors include write() is called before a file has been opened, write is called for a read-only file, device is full, a corrupt file system or an I/O error.
- -
-
- -

◆ write() [3/3]

- -
-
- - - - - -
- - - - - - - - -
size_t PrintFile< SdBaseFile >::write (uint8_t b)
-
-inlineinherited
-
-

Write a single byte.

Parameters
- - -
[in]bbyte to write.
-
-
-
Returns
one for success.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdFat.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__coll__graph.png deleted file mode 100644 index c275e3e5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__inherit__graph.png deleted file mode 100644 index c275e3e5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs-members.html deleted file mode 100644 index 4515acb7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs-members.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdFs Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdCsPin_t csPin=SS)SdBase< FsVolume >inline
begin(SdCsPin_t csPin, uint32_t maxSck)SdBase< FsVolume >inline
begin(SdSpiConfig spiConfig)SdBase< FsVolume >inline
begin(SdioConfig sdioConfig)SdBase< FsVolume >inline
FsVolume::begin(BlockDevice *blockDev)FsVolume
bytesPerCluster()FsVolumeinline
card()SdBase< FsVolume >inline
cardBegin(SdSpiConfig spiConfig)SdBase< FsVolume >inline
cardBegin(SdioConfig sdioConfig)SdBase< FsVolume >inline
chdir()FsVolumeinline
chdir(const char *path)FsVolumeinline
chdir(const String &path)FsVolumeinline
chvol()FsVolumeinline
clusterCount()FsVolumeinline
cwv()FsVolumeinlinestatic
dataStartSector() constFsVolumeinline
end()FsVolumeinline
errorHalt(print_t *pr)SdBase< FsVolume >inline
errorHalt(print_t *pr, const char *msg)SdBase< FsVolume >inline
errorHalt(print_t *pr, const __FlashStringHelper *msg)SdBase< FsVolume >inline
errorHalt(const __FlashStringHelper *msg)SdBase< FsVolume >inline
errorHalt()SdBase< FsVolume >inline
errorHalt(const char *msg)SdBase< FsVolume >inline
errorPrint(print_t *pr)SdBase< FsVolume >inline
errorPrint(print_t *pr, char const *msg)SdBase< FsVolume >inline
errorPrint(Print *pr, const __FlashStringHelper *msg)SdBase< FsVolume >inline
errorPrint(const char *msg)SdBase< FsVolume >inline
errorPrint(const __FlashStringHelper *msg)SdBase< FsVolume >inline
exists(const char *path)FsVolumeinline
exists(const String &path)FsVolumeinline
fatStartSector() constFsVolumeinline
fatType() constFsVolumeinline
freeClusterCount()FsVolumeinline
FsVolume() (defined in FsVolume)FsVolumeinline
initErrorHalt(print_t *pr)SdBase< FsVolume >inline
initErrorHalt(print_t *pr, const char *msg)SdBase< FsVolume >inline
initErrorHalt(Print *pr, const __FlashStringHelper *msg)SdBase< FsVolume >inline
initErrorHalt()SdBase< FsVolume >inline
initErrorHalt(const char *msg)SdBase< FsVolume >inline
initErrorHalt(const __FlashStringHelper *msg)SdBase< FsVolume >inline
initErrorPrint(Print *pr)SdBase< FsVolume >inline
initErrorPrint()SdBase< FsVolume >inline
ls(print_t *pr)FsVolumeinline
ls(print_t *pr, uint8_t flags)FsVolumeinline
ls(print_t *pr, const char *path, uint8_t flags)FsVolume
ls()FsVolumeinline
ls(uint8_t flags)FsVolumeinline
ls(const char *path, uint8_t flags=0)FsVolumeinline
mkdir(const char *path, bool pFlag=true)FsVolumeinline
mkdir(const String &path, bool pFlag=true)FsVolumeinline
open(const char *path, oflag_t oflag=0X00)FsVolume
open(const String &path, oflag_t oflag=0X00)FsVolume
printFatType(print_t *pr)SdBase< FsVolume >inline
printSdError(print_t *pr)SdBase< FsVolume >inline
remove(const char *path)FsVolumeinline
remove(const String &path)FsVolumeinline
rename(const char *oldPath, const char *newPath)FsVolumeinline
rename(const String &oldPath, const String &newPath)FsVolumeinline
rmdir(const char *path)FsVolumeinline
rmdir(const String &path)FsVolumeinline
sdErrorCode()SdBase< FsVolume >inline
sdErrorData()SdBase< FsVolume >inline
sectorsPerCluster() constFsVolumeinline
vol()SdBase< FsVolume >inline
volumeBegin()SdBase< FsVolume >inline
~FsVolume() (defined in FsVolume)FsVolumeinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs.html deleted file mode 100644 index b9e4b746..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs.html +++ /dev/null @@ -1,2445 +0,0 @@ - - - - - - - -SdFat: SdFs Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

SD file system class for FAT16, FAT32, and exFAT volumes. - More...

- -

#include <SdFat.h>

-
-Inheritance diagram for SdFs:
-
-
Inheritance graph
- - - - - -
[legend]
-
-Collaboration diagram for SdFs:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (BlockDevice *blockDev)
 
bool begin (SdCsPin_t csPin, uint32_t maxSck)
 
bool begin (SdCsPin_t csPin=SS)
 
bool begin (SdioConfig sdioConfig)
 
bool begin (SdSpiConfig spiConfig)
 
uint32_t bytesPerCluster ()
 
SdCardcard ()
 
bool cardBegin (SdioConfig sdioConfig)
 
bool cardBegin (SdSpiConfig spiConfig)
 
bool chdir ()
 
bool chdir (const char *path)
 
bool chdir (const String &path)
 
void chvol ()
 
uint32_t clusterCount ()
 
uint32_t dataStartSector () const
 
void end ()
 
void errorHalt ()
 
void errorHalt (const __FlashStringHelper *msg)
 
void errorHalt (const char *msg)
 
void errorHalt (print_t *pr)
 
void errorHalt (print_t *pr, const __FlashStringHelper *msg)
 
void errorHalt (print_t *pr, const char *msg)
 
void errorPrint (const __FlashStringHelper *msg)
 
void errorPrint (const char *msg)
 
void errorPrint (Print *pr, const __FlashStringHelper *msg)
 
void errorPrint (print_t *pr)
 
void errorPrint (print_t *pr, char const *msg)
 
bool exists (const char *path)
 
bool exists (const String &path)
 
uint32_t fatStartSector () const
 
uint8_t fatType () const
 
uint32_t freeClusterCount ()
 
void initErrorHalt ()
 
void initErrorHalt (const __FlashStringHelper *msg)
 
void initErrorHalt (const char *msg)
 
void initErrorHalt (Print *pr, const __FlashStringHelper *msg)
 
void initErrorHalt (print_t *pr)
 
void initErrorHalt (print_t *pr, const char *msg)
 
void initErrorPrint ()
 
void initErrorPrint (Print *pr)
 
bool ls ()
 
bool ls (const char *path, uint8_t flags=0)
 
bool ls (print_t *pr)
 
bool ls (print_t *pr, const char *path, uint8_t flags)
 
bool ls (print_t *pr, uint8_t flags)
 
bool ls (uint8_t flags)
 
bool mkdir (const char *path, bool pFlag=true)
 
bool mkdir (const String &path, bool pFlag=true)
 
FsFile open (const char *path, oflag_t oflag=0X00)
 
FsFile open (const String &path, oflag_t oflag=0X00)
 
void printFatType (print_t *pr)
 
void printSdError (print_t *pr)
 
bool remove (const char *path)
 
bool remove (const String &path)
 
bool rename (const char *oldPath, const char *newPath)
 
bool rename (const String &oldPath, const String &newPath)
 
bool rmdir (const char *path)
 
bool rmdir (const String &path)
 
uint8_t sdErrorCode ()
 
uint8_t sdErrorData ()
 
uint32_t sectorsPerCluster () const
 
FsVolumevol ()
 
bool volumeBegin ()
 
- - - -

-Static Public Member Functions

static FsVolumecwv ()
 
-

Detailed Description

-

SD file system class for FAT16, FAT32, and exFAT volumes.

-

Member Function Documentation

- -

◆ begin() [1/5]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::begin (BlockDeviceblockDev)
-
-inherited
-
-

Initialize an FatVolume object.

Parameters
- - -
[in]blockDevDevice block driver.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [2/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdBase< FsVolume >::begin (SdCsPin_t csPin,
uint32_t maxSck 
)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - - -
[in]csPinSD card chip select pin.
[in]maxSckMaximum SCK frequency.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [3/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FsVolume >::begin (SdCsPin_t csPin = SS)
-
-inlineinherited
-
-

Initialize SD card and file system.

-
Parameters
- - -
[in]csPinSD card chip select pin.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [4/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FsVolume >::begin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ begin() [5/5]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FsVolume >::begin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card and file system for SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ bytesPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::bytesPerCluster ()
-
-inlineinherited
-
-
Returns
the number of bytes in a cluster.
- -
-
- -

◆ card()

- -
-
- - - - - -
- - - - - - - -
SdCard* SdBase< FsVolume >::card ()
-
-inlineinherited
-
-
Returns
Pointer to SD card object.
- -
-
- -

◆ cardBegin() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FsVolume >::cardBegin (SdioConfig sdioConfig)
-
-inlineinherited
-
-

Initialize SD card in SDIO mode.

-
Parameters
- - -
[in]sdioConfigSDIO configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ cardBegin() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdBase< FsVolume >::cardBegin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize SD card in SPI mode.

-
Parameters
- - -
[in]spiConfigSPI configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [1/3]

- -
-
- - - - - -
- - - - - - - -
bool FsVolume::chdir ()
-
-inlineinherited
-
-

Set volume working directory to root.

Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [2/3]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::chdir (const char * path)
-
-inlineinherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chdir() [3/3]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::chdir (const String & path)
-
-inlineinherited
-
-

Set volume working directory.

Parameters
- - -
[in]pathPath for volume working directory.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ chvol()

- -
-
- - - - - -
- - - - - - - -
void FsVolume::chvol ()
-
-inlineinherited
-
-

Change global working volume to this volume.

- -
-
- -

◆ clusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::clusterCount ()
-
-inlineinherited
-
-
Returns
The total number of clusters in the volume.
- -
-
- -

◆ cwv()

- -
-
- - - - - -
- - - - - - - -
static FsVolume* FsVolume::cwv ()
-
-inlinestaticinherited
-
-
Returns
current working volume.
- -
-
- -

◆ dataStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::dataStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of file data.
- -
-
- -

◆ end()

- -
-
- - - - - -
- - - - - - - -
void FsVolume::end ()
-
-inlineinherited
-
-

free dynamic memory and end access to volume

- -
-
- -

◆ errorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FsVolume >::errorHalt ()
-
-inlineinherited
-
-

Print error info to Serial and halt.

- -
-
- -

◆ errorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg to Serial and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::errorHalt (print_tpr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::errorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [1/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorPrint (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [2/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorPrint (const char * msg)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [3/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::errorPrint (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ errorPrint() [4/5]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::errorPrint (print_tpr)
-
-inlineinherited
-
-

Print SD errorCode and errorData.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ errorPrint() [5/5]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::errorPrint (print_tpr,
char const * msg 
)
-
-inlineinherited
-
-

Print msg, any SD error code.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ exists() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::exists (const char * path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ exists() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::exists (const String & path)
-
-inlineinherited
-
-

Test for the existence of a file in a directory

-
Parameters
- - -
[in]pathPath of the file to be tested for.
-
-
-
Returns
true if the file exists else false.
- -
-
- -

◆ fatStartSector()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::fatStartSector () const
-
-inlineinherited
-
-
Returns
The logical sector number for the start of the first FAT.
- -
-
- -

◆ fatType()

- -
-
- - - - - -
- - - - - - - -
uint8_t FsVolume::fatType () const
-
-inlineinherited
-
-
Returns
Partition type, FAT_TYPE_EXFAT, FAT_TYPE_FAT32, FAT_TYPE_FAT16, or zero for error.
- -
-
- -

◆ freeClusterCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::freeClusterCount ()
-
-inlineinherited
-
-
Returns
the free cluster count.
- -
-
- -

◆ initErrorHalt() [1/6]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FsVolume >::initErrorHalt ()
-
-inlineinherited
-
-

Print error info and halt.

- -
-
- -

◆ initErrorHalt() [2/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::initErrorHalt (const __FlashStringHelper * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [3/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::initErrorHalt (const char * msg)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [4/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::initErrorHalt (Print * pr,
const __FlashStringHelper * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorHalt() [5/6]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::initErrorHalt (print_tpr)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ initErrorHalt() [6/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdBase< FsVolume >::initErrorHalt (print_tpr,
const char * msg 
)
-
-inlineinherited
-
-

Print error info and halt.

-
Parameters
- - - -
[in]prPrint destination.
[in]msgMessage to print.
-
-
- -
-
- -

◆ initErrorPrint() [1/2]

- -
-
- - - - - -
- - - - - - - -
void SdBase< FsVolume >::initErrorPrint ()
-
-inlineinherited
-
-

Print error details after begin() fails.

- -
-
- -

◆ initErrorPrint() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::initErrorPrint (Print * pr)
-
-inlineinherited
-
-

Print error details after begin() fails.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ ls() [1/6]

- -
-
- - - - - -
- - - - - - - -
bool FsVolume::ls ()
-
-inlineinherited
-
-

List directory contents.

Returns
true for success or false for failure.
- -
-
- -

◆ ls() [2/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (const char * path,
uint8_t flags = 0 
)
-
-inlineinherited
-
-

List the directory contents of a directory to Serial.

-
Parameters
- - - -
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
-
-true for success or false for failure.
- -
-
- -

◆ ls() [3/6]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::ls (print_tpr)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - -
[in]prPrint object.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [4/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (print_tpr,
const char * path,
uint8_t flags 
)
-
-inherited
-
-

List the directory contents of a directory.

-
Parameters
- - - - -
[in]prPrint stream for list.
[in]pathdirectory to list.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::ls (print_tpr,
uint8_t flags 
)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - - -
[in]prPrint object.
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ls() [6/6]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::ls (uint8_t flags)
-
-inlineinherited
-
-

List directory contents.

-
Parameters
- - -
[in]flagsThe inclusive OR of
-
-
-

LS_DATE - Print file modification date

-

LS_SIZE - Print file size.

-

LS_R - Recursive list of subdirectories.

-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::mkdir (const char * path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ mkdir() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::mkdir (const String & path,
bool pFlag = true 
)
-
-inlineinherited
-
-

Make a subdirectory in the volume root directory.

-
Parameters
- - - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
[in]pFlagCreate missing parent directories if true.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ open() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
FsFile FsVolume::open (const char * path,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a FsBaseFile object.
- -
-
- -

◆ open() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
FsFile FsVolume::open (const String & path,
oflag_t oflag = 0X00 
)
-
-inherited
-
-

open a file

-
Parameters
- - - -
[in]pathlocation of file to be opened.
[in]oflagopen flags.
-
-
-
Returns
a FsBaseFile object.
- -
-
- -

◆ printFatType()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::printFatType (print_tpr)
-
-inlineinherited
-
-

Print volume FAT/exFAT type.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ printSdError()

- -
-
- - - - - -
- - - - - - - - -
void SdBase< FsVolume >::printSdError (print_tpr)
-
-inlineinherited
-
-

Print error info and return.

-
Parameters
- - -
[in]prPrint destination.
-
-
- -
-
- -

◆ remove() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::remove (const char * path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ remove() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::remove (const String & path)
-
-inlineinherited
-
-

Remove a file from the volume root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the file.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::rename (const char * oldPath,
const char * newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rename() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool FsVolume::rename (const String & oldPath,
const String & newPath 
)
-
-inlineinherited
-
-

Rename a file or subdirectory.

-
Parameters
- - - -
[in]oldPathPath name to the file or subdirectory to be renamed.
[in]newPathNew path name of the file or subdirectory.
-
-
-

The newPath object must not exist before the rename call.

-

The file to be renamed must not be open. The directory entry may be moved and file system corruption could occur if the file is accessed by a file object that was opened before the rename() call.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::rmdir (const char * path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ rmdir() [2/2]

- -
-
- - - - - -
- - - - - - - - -
bool FsVolume::rmdir (const String & path)
-
-inlineinherited
-
-

Remove a subdirectory from the volume's root directory.

-
Parameters
- - -
[in]pathA path with a valid 8.3 DOS name for the subdirectory.
-
-
-

The subdirectory file will be removed only if it is empty.

-
Returns
true for success or false for failure.
- -
-
- -

◆ sdErrorCode()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< FsVolume >::sdErrorCode ()
-
-inlineinherited
-
-
Returns
SD card error code.
- -
-
- -

◆ sdErrorData()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdBase< FsVolume >::sdErrorData ()
-
-inlineinherited
-
-
Returns
SD card error data.
- -
-
- -

◆ sectorsPerCluster()

- -
-
- - - - - -
- - - - - - - -
uint32_t FsVolume::sectorsPerCluster () const
-
-inlineinherited
-
-
Returns
The volume's cluster size in sectors.
- -
-
- -

◆ vol()

- -
-
- - - - - -
- - - - - - - -
FsVolume * SdBase< FsVolume >::vol ()
-
-inlineinherited
-
-
Returns
pointer to base volume
- -
-
- -

◆ volumeBegin()

- -
-
- - - - - -
- - - - - - - -
bool SdBase< FsVolume >::volumeBegin ()
-
-inlineinherited
-
-

Initialize file system after call to cardBegin.

-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdFat.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__coll__graph.png deleted file mode 100644 index 94b7508d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__inherit__graph.png deleted file mode 100644 index 94b7508d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_fs__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver-members.html deleted file mode 100644 index 57fa2427..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver-members.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdSpiArduinoDriver Member List
-
-
- -

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

- - - - - - - - - - -
activate()SdSpiArduinoDriverinline
begin(SdSpiConfig spiConfig)SdSpiArduinoDriverinline
deactivate()SdSpiArduinoDriverinline
end()SdSpiArduinoDriver
receive()SdSpiArduinoDriverinline
receive(uint8_t *buf, size_t count)SdSpiArduinoDriverinline
send(uint8_t data)SdSpiArduinoDriverinline
send(const uint8_t *buf, size_t count)SdSpiArduinoDriverinline
setSckSpeed(uint32_t maxSck)SdSpiArduinoDriverinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver.html deleted file mode 100644 index bb293951..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_arduino_driver.html +++ /dev/null @@ -1,399 +0,0 @@ - - - - - - - -SdFat: SdSpiArduinoDriver Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdSpiArduinoDriver Class Reference
-
-
- -

Optimized SPI class for access to SD and SDHC flash memory cards. - More...

- -

#include <SdSpiArduinoDriver.h>

- - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void activate ()
 
void begin (SdSpiConfig spiConfig)
 
void deactivate ()
 
void end ()
 
uint8_t receive ()
 
uint8_t receive (uint8_t *buf, size_t count)
 
void send (const uint8_t *buf, size_t count)
 
void send (uint8_t data)
 
void setSckSpeed (uint32_t maxSck)
 
-

Detailed Description

-

Optimized SPI class for access to SD and SDHC flash memory cards.

-

Member Function Documentation

- -

◆ activate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiArduinoDriver::activate ()
-
-inline
-
-

Activate SPI hardware.

- -
-
- -

◆ begin()

- -
-
- - - - - -
- - - - - - - - -
void SdSpiArduinoDriver::begin (SdSpiConfig spiConfig)
-
-inline
-
-

Initialize the SPI bus.

-
Parameters
- - -
[in]spiConfigSD card configuration.
-
-
- -
-
- -

◆ deactivate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiArduinoDriver::deactivate ()
-
-inline
-
-

Deactivate SPI hardware.

- -
-
- -

◆ end()

- -
-
- - - - - - - -
void SdSpiArduinoDriver::end ()
-
-

End use of SPI driver after begin() call.

- -
-
- -

◆ receive() [1/2]

- -
-
- - - - - -
- - - - - - - -
uint8_t SdSpiArduinoDriver::receive ()
-
-inline
-
-

Receive a byte.

-
Returns
The byte.
- -
-
- -

◆ receive() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
uint8_t SdSpiArduinoDriver::receive (uint8_t * buf,
size_t count 
)
-
-inline
-
-

Receive multiple bytes.

-
Parameters
- - - -
[out]bufBuffer to receive the data.
[in]countNumber of bytes to receive.
-
-
-
Returns
Zero for no error or nonzero error code.
- -
-
- -

◆ send() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdSpiArduinoDriver::send (const uint8_t * buf,
size_t count 
)
-
-inline
-
-

Send multiple bytes.

-
Parameters
- - - -
[in]bufBuffer for data to be sent.
[in]countNumber of bytes to send.
-
-
- -
-
- -

◆ send() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdSpiArduinoDriver::send (uint8_t data)
-
-inline
-
-

Send a byte.

-
Parameters
- - -
[in]dataByte to send
-
-
- -
-
- -

◆ setSckSpeed()

- -
-
- - - - - -
- - - - - - - - -
void SdSpiArduinoDriver::setSckSpeed (uint32_t maxSck)
-
-inline
-
-

Save high speed SPISettings after SD initialization.

-
Parameters
- - -
[in]maxSckMaximum SCK frequency.
-
-
- -
-
-
The documentation for this class was generated from the following files: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class-members.html deleted file mode 100644 index 122f8cc4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class-members.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdSpiBaseClass Member List
-
-
- -

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

- - - - - - - - - -
activate()SdSpiBaseClassinlinevirtual
begin(SdSpiConfig config)=0SdSpiBaseClasspure virtual
deactivate()SdSpiBaseClassinlinevirtual
receive()=0SdSpiBaseClasspure virtual
receive(uint8_t *buf, size_t count)=0SdSpiBaseClasspure virtual
send(uint8_t data)=0SdSpiBaseClasspure virtual
send(const uint8_t *buf, size_t count)=0SdSpiBaseClasspure virtual
setSckSpeed(uint32_t maxSck)SdSpiBaseClassinlinevirtual
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class.html deleted file mode 100644 index 04d191f0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_base_class.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - - - - -SdFat: SdSpiBaseClass Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdSpiBaseClass Class Referenceabstract
-
-
- -

Base class for external SPI drivers. - More...

- -

#include <SdSpiBaseClass.h>

- - - - - - - - - - - - - - - - - - -

-Public Member Functions

virtual void activate ()
 
virtual void begin (SdSpiConfig config)=0
 
virtual void deactivate ()
 
virtual uint8_t receive ()=0
 
virtual uint8_t receive (uint8_t *buf, size_t count)=0
 
virtual void send (const uint8_t *buf, size_t count)=0
 
virtual void send (uint8_t data)=0
 
virtual void setSckSpeed (uint32_t maxSck)
 
-

Detailed Description

-

Base class for external SPI drivers.

-

Member Function Documentation

- -

◆ activate()

- -
-
- - - - - -
- - - - - - - -
virtual void SdSpiBaseClass::activate ()
-
-inlinevirtual
-
-

Activate SPI hardware.

- -
-
- -

◆ begin()

- -
-
- - - - - -
- - - - - - - - -
virtual void SdSpiBaseClass::begin (SdSpiConfig config)
-
-pure virtual
-
-

Initialize the SPI bus.

-
Parameters
- - -
[in]configSPI configuration.
-
-
- -
-
- -

◆ deactivate()

- -
-
- - - - - -
- - - - - - - -
virtual void SdSpiBaseClass::deactivate ()
-
-inlinevirtual
-
-

Deactivate SPI hardware.

- -
-
- -

◆ receive() [1/2]

- -
-
- - - - - -
- - - - - - - -
virtual uint8_t SdSpiBaseClass::receive ()
-
-pure virtual
-
-

Receive a byte.

-
Returns
The byte.
- -
-
- -

◆ receive() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual uint8_t SdSpiBaseClass::receive (uint8_t * buf,
size_t count 
)
-
-pure virtual
-
-

Receive multiple bytes.

-
Parameters
- - - -
[out]bufBuffer to receive the data.
[in]countNumber of bytes to receive.
-
-
-
Returns
Zero for no error or nonzero error code.
- -
-
- -

◆ send() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
virtual void SdSpiBaseClass::send (const uint8_t * buf,
size_t count 
)
-
-pure virtual
-
-

Send multiple bytes.

-
Parameters
- - - -
[in]bufBuffer for data to be sent.
[in]countNumber of bytes to send.
-
-
- -
-
- -

◆ send() [2/2]

- -
-
- - - - - -
- - - - - - - - -
virtual void SdSpiBaseClass::send (uint8_t data)
-
-pure virtual
-
-

Send a byte.

-
Parameters
- - -
[in]dataByte to send
-
-
- -
-
- -

◆ setSckSpeed()

- -
-
- - - - - -
- - - - - - - - -
virtual void SdSpiBaseClass::setSckSpeed (uint32_t maxSck)
-
-inlinevirtual
-
-

Save high speed SPISettings after SD initialization.

-
Parameters
- - -
[in]maxSckMaximum SCK frequency.
-
-
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card-members.html deleted file mode 100644 index 2ca2e85a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card-members.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdSpiCard Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdSpiConfig spiConfig)SdSpiCard
dbgClearStats()SdSpiCard
dbgPrintStats()SdSpiCard
erase(uint32_t firstSector, uint32_t lastSector)SdSpiCard
eraseSingleSectorEnable()SdSpiCard
error(uint8_t code)SdSpiCardinline
errorCode() constSdSpiCardinline
errorData() constSdSpiCardinline
isBusy()SdSpiCard
readCID(cid_t *cid)SdSpiCardinline
readCSD(csd_t *csd)SdSpiCardinline
readData(uint8_t *dst)SdSpiCard
readOCR(uint32_t *ocr)SdSpiCard
readSector(uint32_t sector, uint8_t *dst)SdSpiCardinline
readSectors(uint32_t sector, uint8_t *dst, size_t ns)SdSpiCard
readSingle(uint32_t sector, uint8_t *dst)SdSpiCard
readStart(uint32_t sector)SdSpiCard
readStatus(uint8_t *status)SdSpiCard
readStop()SdSpiCard
SdSpiCard()SdSpiCardinline
sectorCount()SdSpiCard
spiStart()SdSpiCard
spiStop()SdSpiCard
syncDevice()SdSpiCard
type() constSdSpiCardinline
writeData(const uint8_t *src)SdSpiCard
writeSector(uint32_t sector, const uint8_t *src)SdSpiCardinline
writeSectors(uint32_t sector, const uint8_t *src, size_t ns)SdSpiCard
writeSingle(uint32_t sector, const uint8_t *src)SdSpiCard
writeStart(uint32_t sector)SdSpiCard
writeStart(uint32_t sector, uint32_t eraseCount)SdSpiCard
writeStop()SdSpiCard
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card.html deleted file mode 100644 index f3701886..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_card.html +++ /dev/null @@ -1,1058 +0,0 @@ - - - - - - - -SdFat: SdSpiCard Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdSpiCard Class Reference
-
-
- -

Raw access to SD and SDHC flash memory cards via SPI protocol. - More...

- -

#include <SdSpiCard.h>

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (SdSpiConfig spiConfig)
 
void dbgClearStats ()
 
void dbgPrintStats ()
 
bool erase (uint32_t firstSector, uint32_t lastSector)
 
bool eraseSingleSectorEnable ()
 
void error (uint8_t code)
 
uint8_t errorCode () const
 
uint32_t errorData () const
 
bool isBusy ()
 
bool readCID (cid_t *cid)
 
bool readCSD (csd_t *csd)
 
bool readData (uint8_t *dst)
 
bool readOCR (uint32_t *ocr)
 
bool readSector (uint32_t sector, uint8_t *dst)
 
bool readSectors (uint32_t sector, uint8_t *dst, size_t ns)
 
bool readSingle (uint32_t sector, uint8_t *dst)
 
bool readStart (uint32_t sector)
 
bool readStatus (uint8_t *status)
 
bool readStop ()
 
 SdSpiCard ()
 
uint32_t sectorCount ()
 
void spiStart ()
 
void spiStop ()
 
bool syncDevice ()
 
uint8_t type () const
 
bool writeData (const uint8_t *src)
 
bool writeSector (uint32_t sector, const uint8_t *src)
 
bool writeSectors (uint32_t sector, const uint8_t *src, size_t ns)
 
bool writeSingle (uint32_t sector, const uint8_t *src)
 
bool writeStart (uint32_t sector)
 
bool writeStart (uint32_t sector, uint32_t eraseCount)
 
bool writeStop ()
 
-

Detailed Description

-

Raw access to SD and SDHC flash memory cards via SPI protocol.

-

Constructor & Destructor Documentation

- -

◆ SdSpiCard()

- -
-
- - - - - -
- - - - - - - -
SdSpiCard::SdSpiCard ()
-
-inline
-
-

Construct an instance of SdSpiCard.

- -
-
-

Member Function Documentation

- -

◆ begin()

- -
-
- - - - - - - - -
bool SdSpiCard::begin (SdSpiConfig spiConfig)
-
-

Initialize the SD card.

Parameters
- - -
[in]spiConfigSPI card configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ dbgClearStats()

- -
-
- - - - - - - -
void SdSpiCard::dbgClearStats ()
-
-

Clear debug stats.

- -
-
- -

◆ dbgPrintStats()

- -
-
- - - - - - - -
void SdSpiCard::dbgPrintStats ()
-
-

Print debug stats.

- -
-
- -

◆ erase()

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::erase (uint32_t firstSector,
uint32_t lastSector 
)
-
-

Erase a range of sectors.

-
Parameters
- - - -
[in]firstSectorThe address of the first sector in the range.
[in]lastSectorThe address of the last sector in the range.
-
-
-
Note
This function requests the SD card to do a flash erase for a range of sectors. The data on the card after an erase operation is either 0 or 1, depends on the card vendor. The card must support single sector erase.
-
Returns
true for success or false for failure.
- -
-
- -

◆ eraseSingleSectorEnable()

- -
-
- - - - - - - -
bool SdSpiCard::eraseSingleSectorEnable ()
-
-

Determine if card supports single sector erase.

-
Returns
true is returned if single sector erase is supported. false is returned if single sector erase is not supported.
- -
-
- -

◆ error()

- -
-
- - - - - -
- - - - - - - - -
void SdSpiCard::error (uint8_t code)
-
-inline
-
-

Set SD error code.

Parameters
- - -
[in]codevalue for error code.
-
-
- -
-
- -

◆ errorCode()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdSpiCard::errorCode () const
-
-inline
-
-
Returns
code for the last error. See SdCardInfo.h for a list of error codes.
- -
-
- -

◆ errorData()

- -
-
- - - - - -
- - - - - - - -
uint32_t SdSpiCard::errorData () const
-
-inline
-
-
Returns
error data for last error.
- -
-
- -

◆ isBusy()

- -
-
- - - - - - - -
bool SdSpiCard::isBusy ()
-
-

Check for busy. MISO low indicates the card is busy.

-
Returns
true if busy else false.
- -
-
- -

◆ readCID()

- -
-
- - - - - -
- - - - - - - - -
bool SdSpiCard::readCID (cid_tcid)
-
-inline
-
-

Read a card's CID register. The CID contains card identification information such as Manufacturer ID, Product name, Product serial number and Manufacturing date.

-
Parameters
- - -
[out]cidpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readCSD()

- -
-
- - - - - -
- - - - - - - - -
bool SdSpiCard::readCSD (csd_t * csd)
-
-inline
-
-

Read a card's CSD register. The CSD contains Card-Specific Data that provides information regarding access to the card's contents.

-
Parameters
- - -
[out]csdpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readData()

- -
-
- - - - - - - - -
bool SdSpiCard::readData (uint8_t * dst)
-
-

Read one data sector in a multiple sector read sequence

-
Parameters
- - -
[out]dstPointer to the location for the data to be read.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readOCR()

- -
-
- - - - - - - - -
bool SdSpiCard::readOCR (uint32_t * ocr)
-
-

Read OCR register.

-
Parameters
- - -
[out]ocrValue of OCR register.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::readSector (uint32_t sector,
uint8_t * dst 
)
-
-inline
-
-

Read a 512 byte sector from an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readSectors()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool SdSpiCard::readSectors (uint32_t sector,
uint8_t * dst,
size_t ns 
)
-
-

Read multiple 512 byte sectors from an SD card.

-
Parameters
- - - - -
[in]sectorLogical sector to be read.
[in]nsNumber of sectors to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readSingle()

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::readSingle (uint32_t sector,
uint8_t * dst 
)
-
-

Read a 512 byte sector from an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readStart()

- -
-
- - - - - - - - -
bool SdSpiCard::readStart (uint32_t sector)
-
-

Start a read multiple sector sequence.

-
Parameters
- - -
[in]sectorAddress of first sector in sequence.
-
-
-
Note
This function is used with readData() and readStop() for optimized multiple sector reads. SPI chipSelect must be low for the entire sequence.
-
Returns
true for success or false for failure.
- -
-
- -

◆ readStatus()

- -
-
- - - - - - - - -
bool SdSpiCard::readStatus (uint8_t * status)
-
-

Return the 64 byte card status

Parameters
- - -
[out]statuslocation for 64 status bytes.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readStop()

- -
-
- - - - - - - -
bool SdSpiCard::readStop ()
-
-

End a read multiple sectors sequence.

-
Returns
true for success or false for failure.
- -
-
- -

◆ sectorCount()

- -
-
- - - - - - - -
uint32_t SdSpiCard::sectorCount ()
-
-

Determine the size of an SD flash memory card.

-
Returns
The number of 512 byte data sectors in the card or zero if an error occurs.
- -
-
- -

◆ spiStart()

- -
-
- - - - - - - -
void SdSpiCard::spiStart ()
-
-

Set CS low and activate the card.

- -
-
- -

◆ spiStop()

- -
-
- - - - - - - -
void SdSpiCard::spiStop ()
-
-

Set CS high and deactivate the card.

- -
-
- -

◆ syncDevice()

- -
-
- - - - - - - -
bool SdSpiCard::syncDevice ()
-
-
Returns
success if sync successful. Not for user apps.
- -
-
- -

◆ type()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdSpiCard::type () const
-
-inline
-
-

Return the card type: SD V1, SD V2 or SDHC/SDXC

Returns
0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC.
- -
-
- -

◆ writeData()

- -
-
- - - - - - - - -
bool SdSpiCard::writeData (const uint8_t * src)
-
-

Write one data sector in a multiple sector write sequence.

Parameters
- - -
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::writeSector (uint32_t sector,
const uint8_t * src 
)
-
-inline
-
-

Writes a 512 byte sector to an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeSectors()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
bool SdSpiCard::writeSectors (uint32_t sector,
const uint8_t * src,
size_t ns 
)
-
-

Write multiple 512 byte sectors to an SD card.

-
Parameters
- - - - -
[in]sectorLogical sector to be written.
[in]nsNumber of sectors to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeSingle()

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::writeSingle (uint32_t sector,
const uint8_t * src 
)
-
-

Writes a 512 byte sector to an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeStart() [1/2]

- -
-
- - - - - - - - -
bool SdSpiCard::writeStart (uint32_t sector)
-
-

Start a write multiple sectors sequence.

-
Parameters
- - -
[in]sectorAddress of first sector in sequence.
-
-
-
Note
This function is used with writeData() and writeStop() for optimized multiple sector writes.
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeStart() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdSpiCard::writeStart (uint32_t sector,
uint32_t eraseCount 
)
-
-

Start a write multiple sector sequence with pre-erase.

-
Parameters
- - - -
[in]sectorAddress of first sector in sequence.
[in]eraseCountThe number of sectors to be pre-erased.
-
-
-
Note
This function is used with writeData() and writeStop() for optimized multiple sector writes.
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeStop()

- -
-
- - - - - - - -
bool SdSpiCard::writeStop ()
-
-

End a write multiple sectors sequence.

-
Returns
true for success or false for failure.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/SdCard/SdSpiCard.h
  • -
  • Arduino/libraries/SdFat/src/SdCard/SdSpiCard.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config-members.html deleted file mode 100644 index 966ca412..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config-members.html +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdSpiConfig Member List
-
-
- -

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

- - - - - - - - - -
csPinSdSpiConfig
maxSckSdSpiConfig
optionsSdSpiConfig
SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t *port)SdSpiConfiginline
SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed)SdSpiConfiginline
SdSpiConfig(SdCsPin_t cs, uint8_t opt)SdSpiConfiginline
SdSpiConfig(SdCsPin_t cs)SdSpiConfiginlineexplicit
spiPortSdSpiConfig
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config.html deleted file mode 100644 index cfa53519..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_config.html +++ /dev/null @@ -1,361 +0,0 @@ - - - - - - - -SdFat: SdSpiConfig Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdSpiConfig Class Reference
-
-
- -

SPI card configuration. - More...

- -

#include <SdSpiDriver.h>

- - - - - - - - - - -

-Public Member Functions

 SdSpiConfig (SdCsPin_t cs)
 
 SdSpiConfig (SdCsPin_t cs, uint8_t opt)
 
 SdSpiConfig (SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed)
 
 SdSpiConfig (SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t *port)
 
- - - - - - - - - -

-Public Attributes

const SdCsPin_t csPin
 
const uint32_t maxSck
 
const uint8_t options
 
SpiPort_tspiPort
 
-

Detailed Description

-

SPI card configuration.

-

Constructor & Destructor Documentation

- -

◆ SdSpiConfig() [1/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SdSpiConfig::SdSpiConfig (SdCsPin_t cs,
uint8_t opt,
uint32_t maxSpeed,
SpiPort_tport 
)
-
-inline
-
-

SdSpiConfig constructor.

-
Parameters
- - - - - -
[in]csChip select pin.
[in]optOptions.
[in]maxSpeedMaximum SCK frequency.
[in]portThe SPI port to use.
-
-
- -
-
- -

◆ SdSpiConfig() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
SdSpiConfig::SdSpiConfig (SdCsPin_t cs,
uint8_t opt,
uint32_t maxSpeed 
)
-
-inline
-
-

SdSpiConfig constructor.

-
Parameters
- - - - -
[in]csChip select pin.
[in]optOptions.
[in]maxSpeedMaximum SCK frequency.
-
-
- -
-
- -

◆ SdSpiConfig() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
SdSpiConfig::SdSpiConfig (SdCsPin_t cs,
uint8_t opt 
)
-
-inline
-
-

SdSpiConfig constructor.

-
Parameters
- - - -
[in]csChip select pin.
[in]optOptions.
-
-
- -
-
- -

◆ SdSpiConfig() [4/4]

- -
-
- - - - - -
- - - - - - - - -
SdSpiConfig::SdSpiConfig (SdCsPin_t cs)
-
-inlineexplicit
-
-

SdSpiConfig constructor.

-
Parameters
- - -
[in]csChip select pin.
-
-
- -
-
-

Member Data Documentation

- -

◆ csPin

- -
-
- - - - -
const SdCsPin_t SdSpiConfig::csPin
-
-

Chip select pin.

- -
-
- -

◆ maxSck

- -
-
- - - - -
const uint32_t SdSpiConfig::maxSck
-
-

Max SCK frequency

- -
-
- -

◆ options

- -
-
- - - - -
const uint8_t SdSpiConfig::options
-
-

Options

- -
-
- -

◆ spiPort

- -
-
- - - - -
SpiPort_t* SdSpiConfig::spiPort
-
-

SPI port

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver-members.html deleted file mode 100644 index af8871b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver-members.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdSpiSoftDriver Member List
-
-
- -

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

- - - - - - - - - - -
activate()SdSpiSoftDriverinline
begin()=0SdSpiSoftDriverpure virtual
begin(SdSpiConfig spiConfig)SdSpiSoftDriverinline
deactivate()SdSpiSoftDriverinline
receive()=0SdSpiSoftDriverpure virtual
receive(uint8_t *buf, size_t count)SdSpiSoftDriverinline
send(uint8_t data)=0SdSpiSoftDriverpure virtual
send(const uint8_t *buf, size_t count)SdSpiSoftDriverinline
setSckSpeed(uint32_t maxSck)SdSpiSoftDriverinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver.html deleted file mode 100644 index 736a6a98..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver.html +++ /dev/null @@ -1,420 +0,0 @@ - - - - - - - -SdFat: SdSpiSoftDriver Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdSpiSoftDriver Class Referenceabstract
-
-
- -

Base class for external soft SPI. - More...

- -

#include <SdSpiSoftDriver.h>

-
-Inheritance diagram for SdSpiSoftDriver:
-
-
Inheritance graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void activate ()
 
virtual void begin ()=0
 
void begin (SdSpiConfig spiConfig)
 
void deactivate ()
 
virtual uint8_t receive ()=0
 
uint8_t receive (uint8_t *buf, size_t count)
 
void send (const uint8_t *buf, size_t count)
 
virtual void send (uint8_t data)=0
 
void setSckSpeed (uint32_t maxSck)
 
-

Detailed Description

-

Base class for external soft SPI.

-

Member Function Documentation

- -

◆ activate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiSoftDriver::activate ()
-
-inline
-
-

Activate SPI hardware.

- -
-
- -

◆ begin() [1/2]

- -
-
- - - - - -
- - - - - - - -
virtual void SdSpiSoftDriver::begin ()
-
-pure virtual
-
-

Initialize the SPI bus.

- -

Implemented in SoftSpiDriver< MisoPin, MosiPin, SckPin >.

- -
-
- -

◆ begin() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdSpiSoftDriver::begin (SdSpiConfig spiConfig)
-
-inline
-
-

Initialize the SPI bus.

-
Parameters
- - -
[in]spiConfigSD card configuration.
-
-
- -
-
- -

◆ deactivate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiSoftDriver::deactivate ()
-
-inline
-
-

Deactivate SPI hardware.

- -
-
- -

◆ receive() [1/2]

- -
-
- - - - - -
- - - - - - - -
virtual uint8_t SdSpiSoftDriver::receive ()
-
-pure virtual
-
-

Receive a byte.

-
Returns
The byte.
- -

Implemented in SoftSpiDriver< MisoPin, MosiPin, SckPin >.

- -
-
- -

◆ receive() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
uint8_t SdSpiSoftDriver::receive (uint8_t * buf,
size_t count 
)
-
-inline
-
-

Receive multiple bytes.

-
Parameters
- - - -
[out]bufBuffer to receive the data.
[in]countNumber of bytes to receive.
-
-
-
Returns
Zero for no error or nonzero error code.
- -
-
- -

◆ send() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdSpiSoftDriver::send (const uint8_t * buf,
size_t count 
)
-
-inline
-
-

Send multiple bytes.

-
Parameters
- - - -
[in]bufBuffer for data to be sent.
[in]countNumber of bytes to send.
-
-
- -
-
- -

◆ send() [2/2]

- -
-
- - - - - -
- - - - - - - - -
virtual void SdSpiSoftDriver::send (uint8_t data)
-
-pure virtual
-
-

Send a byte.

-
Parameters
- - -
[in]dataByte to send
-
-
- -

Implemented in SoftSpiDriver< MisoPin, MosiPin, SckPin >.

- -
-
- -

◆ setSckSpeed()

- -
-
- - - - - -
- - - - - - - - -
void SdSpiSoftDriver::setSckSpeed (uint32_t maxSck)
-
-inline
-
-

Save high speed SPISettings after SD initialization.

-
Parameters
- - -
[in]maxSckMaximum SCK frequency.
-
-
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver__inherit__graph.png deleted file mode 100644 index 216a5b94..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sd_spi_soft_driver__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card-members.html deleted file mode 100644 index e468df61..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card-members.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdioCard Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
begin(SdioConfig sdioConfig)SdioCard
end()SdioCardinline
erase(uint32_t firstSector, uint32_t lastSector)SdioCardvirtual
errorCode() constSdioCardvirtual
errorData() constSdioCardvirtual
errorLine() constSdioCard
isBusy()SdioCardvirtual
kHzSdClk()SdioCard
readCID(cid_t *cid)SdioCardvirtual
readCSD(csd_t *csd)SdioCardvirtual
readData(uint8_t *dst)SdioCard
readOCR(uint32_t *ocr)SdioCardvirtual
readSector(uint32_t sector, uint8_t *dst)SdioCardvirtual
readSectors(uint32_t sector, uint8_t *dst, size_t ns)SdioCardvirtual
readStart(uint32_t sector)SdioCard
readStart(uint32_t sector, uint32_t count)SdioCard
readStop()SdioCard
sectorCount()SdioCardvirtual
status()SdioCardvirtual
syncDevice()SdioCardvirtual
type() constSdioCardvirtual
writeData(const uint8_t *src)SdioCardvirtual
writeSector(uint32_t sector, const uint8_t *src)SdioCardvirtual
writeSectors(uint32_t sector, const uint8_t *src, size_t ns)SdioCardvirtual
writeStart(uint32_t sector)SdioCardvirtual
writeStart(uint32_t sector, uint32_t count)SdioCard
writeStop()SdioCardvirtual
~BlockDeviceInterface() (defined in BlockDeviceInterface)BlockDeviceInterfaceinlinevirtual
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card.html deleted file mode 100644 index 5fc1fb88..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card.html +++ /dev/null @@ -1,1060 +0,0 @@ - - - - - - - -SdFat: SdioCard Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdioCard Class Reference
-
-
- -

Raw SDIO access to SD and SDHC flash memory cards. - More...

- -

#include <SdioCard.h>

-
-Inheritance diagram for SdioCard:
-
-
Inheritance graph
- - - - - -
[legend]
-
-Collaboration diagram for SdioCard:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool begin (SdioConfig sdioConfig)
 
bool end ()
 
bool erase (uint32_t firstSector, uint32_t lastSector)
 
uint8_t errorCode () const
 
uint32_t errorData () const
 
uint32_t errorLine () const
 
bool isBusy ()
 
uint32_t kHzSdClk ()
 
bool readCID (cid_t *cid)
 
bool readCSD (csd_t *csd)
 
bool readData (uint8_t *dst)
 
bool readOCR (uint32_t *ocr)
 
bool readSector (uint32_t sector, uint8_t *dst)
 
bool readSectors (uint32_t sector, uint8_t *dst, size_t ns)
 
bool readStart (uint32_t sector)
 
bool readStart (uint32_t sector, uint32_t count)
 
bool readStop ()
 
uint32_t sectorCount ()
 
uint32_t status ()
 
bool syncDevice ()
 
uint8_t type () const
 
bool writeData (const uint8_t *src)
 
bool writeSector (uint32_t sector, const uint8_t *src)
 
bool writeSectors (uint32_t sector, const uint8_t *src, size_t ns)
 
bool writeStart (uint32_t sector)
 
bool writeStart (uint32_t sector, uint32_t count)
 
bool writeStop ()
 
-

Detailed Description

-

Raw SDIO access to SD and SDHC flash memory cards.

-

Member Function Documentation

- -

◆ begin()

- -
-
- - - - - - - - -
bool SdioCard::begin (SdioConfig sdioConfig)
-
-

Initialize the SD card.

Parameters
- - -
[in]sdioConfigSDIO card configuration.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ end()

- -
-
- - - - - -
- - - - - - - -
bool SdioCard::end ()
-
-inline
-
-

Disable an SDIO card.

Returns
false - not implemented.
- -
-
- -

◆ erase()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdioCard::erase (uint32_t firstSector,
uint32_t lastSector 
)
-
-virtual
-
-

Erase a range of sectors.

-
Parameters
- - - -
[in]firstSectorThe address of the first sector in the range.
[in]lastSectorThe address of the last sector in the range.
-
-
-
Note
This function requests the SD card to do a flash erase for a range of sectors. The data on the card after an erase operation is either 0 or 1, depends on the card vendor. The card must support single sector erase.
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ errorCode()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdioCard::errorCode () const
-
-virtual
-
-
Returns
code for the last error. See SdCardInfo.h for a list of error codes.
- -

Implements SdCardInterface.

- -
-
- -

◆ errorData()

- -
-
- - - - - -
- - - - - - - -
uint32_t SdioCard::errorData () const
-
-virtual
-
-
Returns
error data for last error.
- -

Implements SdCardInterface.

- -
-
- -

◆ errorLine()

- -
-
- - - - - - - -
uint32_t SdioCard::errorLine () const
-
-
Returns
error line for last error. Tmp function for debug.
- -
-
- -

◆ isBusy()

- -
-
- - - - - -
- - - - - - - -
bool SdioCard::isBusy ()
-
-virtual
-
-

Check for busy with CMD13.

-
Returns
true if busy else false.
- -

Implements SdCardInterface.

- -
-
- -

◆ kHzSdClk()

- -
-
- - - - - - - -
uint32_t SdioCard::kHzSdClk ()
-
-
Returns
the SD clock frequency in kHz.
- -
-
- -

◆ readCID()

- -
-
- - - - - -
- - - - - - - - -
bool SdioCard::readCID (cid_tcid)
-
-virtual
-
-

Read a card's CID register. The CID contains card identification information such as Manufacturer ID, Product name, Product serial number and Manufacturing date.

-
Parameters
- - -
[out]cidpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ readCSD()

- -
-
- - - - - -
- - - - - - - - -
bool SdioCard::readCSD (csd_t * csd)
-
-virtual
-
-

Read a card's CSD register. The CSD contains Card-Specific Data that provides information regarding access to the card's contents.

-
Parameters
- - -
[out]csdpointer to area for returned data.
-
-
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ readData()

- -
-
- - - - - - - - -
bool SdioCard::readData (uint8_t * dst)
-
-

Read one data sector in a multiple sector read sequence

-
Parameters
- - -
[out]dstPointer to the location for the data to be read.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ readOCR()

- -
-
- - - - - -
- - - - - - - - -
bool SdioCard::readOCR (uint32_t * ocr)
-
-virtual
-
-

Read OCR register.

-
Parameters
- - -
[out]ocrValue of OCR register.
-
-
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ readSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdioCard::readSector (uint32_t sector,
uint8_t * dst 
)
-
-virtual
-
-

Read a 512 byte sector from an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implements BlockDeviceInterface.

- -
-
- -

◆ readSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool SdioCard::readSectors (uint32_t sector,
uint8_t * dst,
size_t ns 
)
-
-virtual
-
-

Read multiple 512 byte sectors from an SD card.

-
Parameters
- - - - -
[in]sectorLogical sector to be read.
[in]nsNumber of sectors to be read.
[out]dstPointer to the location that will receive the data.
-
-
-
Returns
true for success or false for failure.
- -

Implements BlockDeviceInterface.

- -
-
- -

◆ readStart() [1/2]

- -
-
- - - - - - - - -
bool SdioCard::readStart (uint32_t sector)
-
-

Start a read multiple sectors sequence.

-
Parameters
- - -
[in]sectorAddress of first sector in sequence.
-
-
-
Note
This function is used with readData() and readStop() for optimized multiple sector reads. SPI chipSelect must be low for the entire sequence.
-
Returns
true for success or false for failure.
- -
-
- -

◆ readStart() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdioCard::readStart (uint32_t sector,
uint32_t count 
)
-
-

Start a read multiple sectors sequence.

-
Parameters
- - - -
[in]sectorAddress of first sector in sequence.
[in]countMaximum sector count.
-
-
-
Note
This function is used with readData() and readStop() for optimized multiple sector reads. SPI chipSelect must be low for the entire sequence.
-
Returns
true for success or false for failure.
- -
-
- -

◆ readStop()

- -
-
- - - - - - - -
bool SdioCard::readStop ()
-
-

End a read multiple sectors sequence.

-
Returns
true for success or false for failure.
- -
-
- -

◆ sectorCount()

- -
-
- - - - - -
- - - - - - - -
uint32_t SdioCard::sectorCount ()
-
-virtual
-
-

Determine the size of an SD flash memory card.

-
Returns
The number of 512 byte data sectors in the card or zero if an error occurs.
- -

Implements SdCardInterface.

- -
-
- -

◆ status()

- -
-
- - - - - -
- - - - - - - -
uint32_t SdioCard::status ()
-
-virtual
-
-
Returns
SDIO card status.
- -

Reimplemented from SdCardInterface.

- -
-
- -

◆ syncDevice()

- -
-
- - - - - -
- - - - - - - -
bool SdioCard::syncDevice ()
-
-virtual
-
-
Returns
success if sync successful. Not for user apps.
- -

Implements BlockDeviceInterface.

- -
-
- -

◆ type()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdioCard::type () const
-
-virtual
-
-

Return the card type: SD V1, SD V2 or SDHC

Returns
0 - SD V1, 1 - SD V2, or 3 - SDHC.
- -

Implements SdCardInterface.

- -
-
- -

◆ writeData()

- -
-
- - - - - -
- - - - - - - - -
bool SdioCard::writeData (const uint8_t * src)
-
-virtual
-
-

Write one data sector in a multiple sector write sequence.

Parameters
- - -
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ writeSector()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
bool SdioCard::writeSector (uint32_t sector,
const uint8_t * src 
)
-
-virtual
-
-

Writes a 512 byte sector to an SD card.

-
Parameters
- - - -
[in]sectorLogical sector to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implements BlockDeviceInterface.

- -
-
- -

◆ writeSectors()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
bool SdioCard::writeSectors (uint32_t sector,
const uint8_t * src,
size_t ns 
)
-
-virtual
-
-

Write multiple 512 byte sectors to an SD card.

-
Parameters
- - - - -
[in]sectorLogical sector to be written.
[in]nsNumber of sectors to be written.
[in]srcPointer to the location of the data to be written.
-
-
-
Returns
true for success or false for failure.
- -

Implements BlockDeviceInterface.

- -
-
- -

◆ writeStart() [1/2]

- -
-
- - - - - -
- - - - - - - - -
bool SdioCard::writeStart (uint32_t sector)
-
-virtual
-
-

Start a write multiple sectors sequence.

-
Parameters
- - -
[in]sectorAddress of first sector in sequence.
-
-
-
Note
This function is used with writeData() and writeStop() for optimized multiple sector writes.
-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
- -

◆ writeStart() [2/2]

- -
-
- - - - - - - - - - - - - - - - - - -
bool SdioCard::writeStart (uint32_t sector,
uint32_t count 
)
-
-

Start a write multiple sectors sequence.

-
Parameters
- - - -
[in]sectorAddress of first sector in sequence.
[in]countMaximum sector count.
-
-
-
Note
This function is used with writeData() and writeStop() for optimized multiple sector writes.
-
Returns
true for success or false for failure.
- -
-
- -

◆ writeStop()

- -
-
- - - - - -
- - - - - - - -
bool SdioCard::writeStop ()
-
-virtual
-
-

End a write multiple sectors sequence.

-
Returns
true for success or false for failure.
- -

Implements SdCardInterface.

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdCard/SdioCard.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__coll__graph.png deleted file mode 100644 index 2777f7b3..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__inherit__graph.png deleted file mode 100644 index 2777f7b3..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_card__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config-members.html deleted file mode 100644 index 952c18df..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config-members.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SdioConfig Member List
-
-
- -

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

- - - - - -
options()SdioConfiginline
SdioConfig() (defined in SdioConfig)SdioConfiginline
SdioConfig(uint8_t opt)SdioConfiginlineexplicit
useDma()SdioConfiginline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config.html deleted file mode 100644 index e5ae18bb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sdio_config.html +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - - -SdFat: SdioConfig Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SdioConfig Class Reference
-
-
- -

SDIO card configuration. - More...

- -

#include <SdioCard.h>

- - - - - - - - -

-Public Member Functions

uint8_t options ()
 
 SdioConfig (uint8_t opt)
 
bool useDma ()
 
-

Detailed Description

-

SDIO card configuration.

-

Constructor & Destructor Documentation

- -

◆ SdioConfig()

- -
-
- - - - - -
- - - - - - - - -
SdioConfig::SdioConfig (uint8_t opt)
-
-inlineexplicit
-
-

SdioConfig constructor.

Parameters
- - -
[in]optSDIO options.
-
-
- -
-
-

Member Function Documentation

- -

◆ options()

- -
-
- - - - - -
- - - - - - - -
uint8_t SdioConfig::options ()
-
-inline
-
-
Returns
SDIO card options.
- -
-
- -

◆ useDma()

- -
-
- - - - - -
- - - - - - - -
bool SdioConfig::useDma ()
-
-inline
-
-
Returns
true if DMA_SDIO.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/SdCard/SdioCard.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver-members.html deleted file mode 100644 index 32bebac0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver-members.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SoftSpiDriver< MisoPin, MosiPin, SckPin > Member List
-
-
- -

This is the complete list of members for SoftSpiDriver< MisoPin, MosiPin, SckPin >, including all inherited members.

- - - - - - - - - - -
activate()SdSpiSoftDriverinline
begin()SoftSpiDriver< MisoPin, MosiPin, SckPin >inlinevirtual
SdSpiSoftDriver::begin(SdSpiConfig spiConfig)SdSpiSoftDriverinline
deactivate()SdSpiSoftDriverinline
receive()SoftSpiDriver< MisoPin, MosiPin, SckPin >inlinevirtual
SdSpiSoftDriver::receive(uint8_t *buf, size_t count)SdSpiSoftDriverinline
send(uint8_t data)SoftSpiDriver< MisoPin, MosiPin, SckPin >inlinevirtual
SdSpiSoftDriver::send(const uint8_t *buf, size_t count)SdSpiSoftDriverinline
setSckSpeed(uint32_t maxSck)SdSpiSoftDriverinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver.html deleted file mode 100644 index 571fcd3a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver.html +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - -SdFat: SoftSpiDriver< MisoPin, MosiPin, SckPin > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SoftSpiDriver< MisoPin, MosiPin, SckPin > Class Template Reference
-
-
- -

Class for external soft SPI. - More...

- -

#include <SdSpiSoftDriver.h>

-
-Inheritance diagram for SoftSpiDriver< MisoPin, MosiPin, SckPin >:
-
-
Inheritance graph
- - - - -
[legend]
-
-Collaboration diagram for SoftSpiDriver< MisoPin, MosiPin, SckPin >:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void activate ()
 
void begin ()
 
void begin (SdSpiConfig spiConfig)
 
void deactivate ()
 
uint8_t receive ()
 
uint8_t receive (uint8_t *buf, size_t count)
 
void send (const uint8_t *buf, size_t count)
 
void send (uint8_t data)
 
void setSckSpeed (uint32_t maxSck)
 
-

Detailed Description

-

template<uint8_t MisoPin, uint8_t MosiPin, uint8_t SckPin>
-class SoftSpiDriver< MisoPin, MosiPin, SckPin >

- -

Class for external soft SPI.

-

Member Function Documentation

- -

◆ activate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiSoftDriver::activate ()
-
-inlineinherited
-
-

Activate SPI hardware.

- -
-
- -

◆ begin() [1/2]

- -
-
-
-template<uint8_t MisoPin, uint8_t MosiPin, uint8_t SckPin>
- - - - - -
- - - - - - - -
void SoftSpiDriver< MisoPin, MosiPin, SckPin >::begin ()
-
-inlinevirtual
-
-

Initialize the SPI bus.

- -

Implements SdSpiSoftDriver.

- -
-
- -

◆ begin() [2/2]

- -
-
- - - - - -
- - - - - - - - -
void SdSpiSoftDriver::begin (SdSpiConfig spiConfig)
-
-inlineinherited
-
-

Initialize the SPI bus.

-
Parameters
- - -
[in]spiConfigSD card configuration.
-
-
- -
-
- -

◆ deactivate()

- -
-
- - - - - -
- - - - - - - -
void SdSpiSoftDriver::deactivate ()
-
-inlineinherited
-
-

Deactivate SPI hardware.

- -
-
- -

◆ receive() [1/2]

- -
-
-
-template<uint8_t MisoPin, uint8_t MosiPin, uint8_t SckPin>
- - - - - -
- - - - - - - -
uint8_t SoftSpiDriver< MisoPin, MosiPin, SckPin >::receive ()
-
-inlinevirtual
-
-

Receive a byte.

-
Returns
The byte.
- -

Implements SdSpiSoftDriver.

- -
-
- -

◆ receive() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
uint8_t SdSpiSoftDriver::receive (uint8_t * buf,
size_t count 
)
-
-inlineinherited
-
-

Receive multiple bytes.

-
Parameters
- - - -
[out]bufBuffer to receive the data.
[in]countNumber of bytes to receive.
-
-
-
Returns
Zero for no error or nonzero error code.
- -
-
- -

◆ send() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void SdSpiSoftDriver::send (const uint8_t * buf,
size_t count 
)
-
-inlineinherited
-
-

Send multiple bytes.

-
Parameters
- - - -
[in]bufBuffer for data to be sent.
[in]countNumber of bytes to send.
-
-
- -
-
- -

◆ send() [2/2]

- -
-
-
-template<uint8_t MisoPin, uint8_t MosiPin, uint8_t SckPin>
- - - - - -
- - - - - - - - -
void SoftSpiDriver< MisoPin, MosiPin, SckPin >::send (uint8_t data)
-
-inlinevirtual
-
-

Send a byte.

-
Parameters
- - -
[in]dataByte to send
-
-
- -

Implements SdSpiSoftDriver.

- -
-
- -

◆ setSckSpeed()

- -
-
- - - - - -
- - - - - - - - -
void SdSpiSoftDriver::setSckSpeed (uint32_t maxSck)
-
-inlineinherited
-
-

Save high speed SPISettings after SD initialization.

-
Parameters
- - -
[in]maxSckMaximum SCK frequency.
-
-
- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__coll__graph.png deleted file mode 100644 index 56bd8b49..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__inherit__graph.png deleted file mode 100644 index 56bd8b49..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_soft_spi_driver__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream-members.html deleted file mode 100644 index 0e353e23..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream-members.html +++ /dev/null @@ -1,127 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
StdioStream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
clearerr()StdioStreaminline
fclose()StdioStream
feof()StdioStreaminline
ferror()StdioStreaminline
fflush()StdioStream
fgetc()StdioStreaminline
fgets(char *str, size_t num, size_t *len=0)StdioStream
FatFile::fgets(char *str, int num, char *delim=NULL)FatFileprivate
fopen(const char *path, const char *mode)StdioStream
fputc(int c)StdioStreaminline
fputs(const char *str)StdioStream
fread(void *ptr, size_t size, size_t count)StdioStream
fseek(int32_t offset, int origin)StdioStream
ftell()StdioStream
fwrite(const void *ptr, size_t size, size_t count)StdioStream
getc()StdioStreaminline
print(char c)StdioStreaminline
print(const char *str)StdioStreaminline
print(const __FlashStringHelper *str)StdioStream
print(double val, uint8_t prec=2)StdioStreaminline
print(float val, uint8_t prec=2)StdioStreaminline
print(T val)StdioStreaminline
printDec(char n)StdioStreaminline
printDec(signed char n)StdioStream
printDec(unsigned char n)StdioStreaminline
printDec(int16_t n)StdioStream
printDec(uint16_t n)StdioStream
printDec(int32_t n)StdioStream
printDec(uint32_t n)StdioStream
printDec(double value, uint8_t prec)StdioStreaminline
printDec(float value, uint8_t prec)StdioStream
printField(double value, char term, uint8_t prec=2)StdioStreaminline
printField(float value, char term, uint8_t prec=2)StdioStreaminline
printField(T value, char term)StdioStreaminline
FatFile::printField(Type value, char term)FatFileinlineprivate
printHex(uint32_t n)StdioStream
printHexln(uint32_t n)StdioStreaminline
println()StdioStreaminline
println(double val, uint8_t prec=2)StdioStreaminline
println(float val, uint8_t prec=2)StdioStreaminline
println(T val)StdioStreaminline
putc(int c)StdioStreaminline
putCRLF()StdioStreaminline
rewind()StdioStream
StdioStream()StdioStreaminline
ungetc(int c)StdioStream
FatFile::write(const char *str)FatFileinlineprivate
FatFile::write(uint8_t b)FatFileinlineprivate
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream.html deleted file mode 100644 index 55b8c6ab..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream.html +++ /dev/null @@ -1,1693 +0,0 @@ - - - - - - - -SdFat: StdioStream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
StdioStream Class Reference
-
-
- -

StdioStream implements a minimal stdio stream. - More...

- -

#include <StdioStream.h>

-
-Inheritance diagram for StdioStream:
-
-
Inheritance graph
- - - - -
[legend]
-
-Collaboration diagram for StdioStream:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

void clearerr ()
 
int fclose ()
 
int feof ()
 
int ferror ()
 
int fflush ()
 
int fgetc ()
 
char * fgets (char *str, size_t num, size_t *len=0)
 
bool fopen (const char *path, const char *mode)
 
int fputc (int c)
 
int fputs (const char *str)
 
size_t fread (void *ptr, size_t size, size_t count)
 
int fseek (int32_t offset, int origin)
 
int32_t ftell ()
 
size_t fwrite (const void *ptr, size_t size, size_t count)
 
int getc ()
 
size_t print (char c)
 
size_t print (const __FlashStringHelper *str)
 
size_t print (const char *str)
 
size_t print (double val, uint8_t prec=2)
 
size_t print (float val, uint8_t prec=2)
 
template<typename T >
size_t print (T val)
 
int printDec (char n)
 
int printDec (double value, uint8_t prec)
 
int printDec (float value, uint8_t prec)
 
int printDec (int16_t n)
 
int printDec (int32_t n)
 
int printDec (signed char n)
 
int printDec (uint16_t n)
 
int printDec (uint32_t n)
 
int printDec (unsigned char n)
 
int printField (double value, char term, uint8_t prec=2)
 
int printField (float value, char term, uint8_t prec=2)
 
template<typename T >
int printField (T value, char term)
 
int printHex (uint32_t n)
 
int printHexln (uint32_t n)
 
size_t println ()
 
size_t println (double val, uint8_t prec=2)
 
size_t println (float val, uint8_t prec=2)
 
template<typename T >
size_t println (T val)
 
int putc (int c)
 
int putCRLF ()
 
bool rewind ()
 
 StdioStream ()
 
int ungetc (int c)
 
- - - - - - - - - - -

-Private Member Functions

int fgets (char *str, int num, char *delim=NULL)
 
template<typename Type >
size_t printField (Type value, char term)
 
size_t write (const char *str)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

StdioStream implements a minimal stdio stream.

-

StdioStream does not support subdirectories or long file names.

-

Constructor & Destructor Documentation

- -

◆ StdioStream()

- -
-
- - - - - -
- - - - - - - -
StdioStream::StdioStream ()
-
-inline
-
-

Constructor

- -
-
-

Member Function Documentation

- -

◆ clearerr()

- -
-
- - - - - -
- - - - - - - -
void StdioStream::clearerr ()
-
-inline
-
-

Clear the stream's end-of-file and error indicators.

- -
-
- -

◆ fclose()

- -
-
- - - - - - - -
int StdioStream::fclose ()
-
-

Close a stream.

-

A successful call to the fclose function causes the stream to be flushed and the associated file to be closed. Any unwritten buffered data is written to the file; any unread buffered data is discarded. Whether or not the call succeeds, the stream is disassociated from the file.

-
Returns
zero if the stream was successfully closed, or EOF if any any errors are detected.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ feof()

- -
-
- - - - - -
- - - - - - - -
int StdioStream::feof ()
-
-inline
-
-

Test the stream's end-of-file indicator.

Returns
non-zero if and only if the end-of-file indicator is set.
- -
-
- -

◆ ferror()

- -
-
- - - - - -
- - - - - - - -
int StdioStream::ferror ()
-
-inline
-
-

Test the stream's error indicator.

Returns
return non-zero if and only if the error indicator is set.
- -
-
- -

◆ fflush()

- -
-
- - - - - - - -
int StdioStream::fflush ()
-
-

Flush the stream.

-

If stream is an output stream or an update stream in which the most recent operation was not input, any unwritten data is written to the file; otherwise the call is an error since any buffered input data would be lost.

-
Returns
sets the error indicator for the stream and returns EOF if an error occurs, otherwise it returns zero.
- -
-
- -

◆ fgetc()

- -
-
- - - - - -
- - - - - - - -
int StdioStream::fgetc ()
-
-inline
-
-

Get a byte from the stream.

-
Returns
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream.
- -
-
- -

◆ fgets()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
char * StdioStream::fgets (char * str,
size_t num,
size_t * len = 0 
)
-
-

Get a string from a stream.

-

The fgets function reads at most one less than the number of characters specified by num from the stream into the array pointed to by str. No additional characters are read after a new-line character (which is retained) or after end-of-file. A null character is written immediately after the last character read into the array.

-
Parameters
- - - - -
[out]strPointer to an array of where the string is copied.
[in]numMaximum number of characters including the null character.
[out]lenIf len is not null and fgets is successful, the length of the string is returned.
-
-
-
Returns
str if successful. If end-of-file is encountered and no characters have been read into the array, the contents of the array remain unchanged and a null pointer is returned. If a read error occurs during the operation, the array contents are indeterminate and a null pointer is returned.
- -
-
- -

◆ fopen()

- -
-
- - - - - - - - - - - - - - - - - - -
bool StdioStream::fopen (const char * path,
const char * mode 
)
-
-

Open a stream.

-

Open a file and associates the stream with it.

-
Parameters
- - - -
[in]pathfile to be opened.
[in]modea string that indicates the open mode.
-
-
- - - - - - - - - - - - - - - - - -
"r" or "rb" Open a file for reading. The file must exist.
"w" or "wb" Truncate an existing to zero length or create an empty file for writing.
"wx" or "wbx" Create a file for writing. Fails if the file already exists.
"a" or "ab" Append; open or create file for writing at end-of-file.
"r+" or "rb+" or "r+b" Open a file for update (reading and writing).
"w+" or "w+b" or "wb+" Truncate an existing to zero length or create a file for update.
"w+x" or "w+bx" or "wb+x" Create a file for update. Fails if the file already exists.
"a+" or "a+b" or "ab+" Append; open or create a file for update, writing at end-of-file.
-

The character 'b' shall have no effect, but is allowed for ISO C standard conformance.

-

Opening a file with append mode causes all subsequent writes to the file to be forced to the then current end-of-file, regardless of intervening calls to the fseek function.

-

When a file is opened with update mode, both input and output may be performed on the associated stream. However, output shall not be directly followed by input without an intervening call to the fflush function or to a file positioning function (fseek, or rewind), and input shall not be directly followed by output without an intervening call to a file positioning function, unless the input operation encounters end-of-file.

-
Returns
true for success or false for failure.
- -
-
- -

◆ fputc()

- -
-
- - - - - -
- - - - - - - - -
int StdioStream::fputc (int c)
-
-inline
-
-

Write a byte to a stream.

-
Parameters
- - -
[in]cthe byte to be written (converted to an unsigned char).
-
-
-
Returns
Upon successful completion, fputc() returns the value it has written. Otherwise, it returns EOF and sets the error indicator for the stream.
- -
-
- -

◆ fputs()

- -
-
- - - - - - - - -
int StdioStream::fputs (const char * str)
-
-

Write a string to a stream.

-
Parameters
- - -
[in]stra pointer to the string to be written.
-
-
-
Returns
for success, fputs() returns a non-negative number. Otherwise, it returns EOF and sets the error indicator for the stream.
- -
-
- -

◆ fread()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t StdioStream::fread (void * ptr,
size_t size,
size_t count 
)
-
-

Binary input.

-

Reads an array of up to count elements, each one with a size of size bytes.

Parameters
- - - - -
[out]ptrpointer to area of at least (size*count) bytes where the data will be stored.
[in]sizethe size, in bytes, of each element to be read.
[in]countthe number of elements to be read.
-
-
-
Returns
number of elements successfully read, which may be less than count if a read error or end-of-file is encountered. If size or count is zero, fread returns zero and the contents of the array and the state of the stream remain unchanged.
- -
-
- -

◆ fseek()

- -
-
- - - - - - - - - - - - - - - - - - -
int StdioStream::fseek (int32_t offset,
int origin 
)
-
-

Set the file position for the stream.

-
Parameters
- - - -
[in]offsetnumber of offset from the origin.
[in]originposition used as reference for the offset. It is specified by one of the following constants.
-
-
-

SEEK_SET - Beginning of file.

-

SEEK_CUR - Current position of the file pointer.

-

SEEK_END - End of file.

-
Returns
zero for success. Otherwise, it returns non-zero and sets the error indicator for the stream.
- -
-
- -

◆ ftell()

- -
-
- - - - - - - -
int32_t StdioStream::ftell ()
-
-

Get the current position in a stream.

-
Returns
If successful, ftell return the current value of the position indicator. On failure, ftell returns −1L.
- -
-
- -

◆ fwrite()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
size_t StdioStream::fwrite (const void * ptr,
size_t size,
size_t count 
)
-
-

Binary output.

-

Writes an array of up to count elements, each one with a size of size bytes.

Parameters
- - - - -
[in]ptrpointer to (size*count) bytes of data to be written.
[in]sizethe size, in bytes, of each element to be written.
[in]countthe number of elements to be written.
-
-
-
Returns
number of elements successfully written. if this number is less than count, an error has occurred. If size or count is zero, fwrite returns zero.
- -
-
- -

◆ getc()

- -
-
- - - - - -
- - - - - - - -
int StdioStream::getc ()
-
-inline
-
-

Get a byte from the stream.

-

getc and fgetc are equivalent but getc is in-line so it is faster but require more flash memory.

-
Returns
If the end-of-file indicator for the stream is set, or if the stream is at end-of-file, the end-of-file indicator for the stream is set and the fgetc function returns EOF. Otherwise, the fgetc function returns the next character from the input stream.
- -
-
- -

◆ print() [1/6]

- -
-
- - - - - -
- - - - - - - - -
size_t StdioStream::print (char c)
-
-inline
-
-

Write a character.

Parameters
- - -
[in]cthe character to write.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ print() [2/6]

- -
-
- - - - - - - - -
size_t StdioStream::print (const __FlashStringHelper * str)
-
-

Print a string stored in flash memory.

-
Parameters
- - -
[in]strthe string to print.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ print() [3/6]

- -
-
- - - - - -
- - - - - - - - -
size_t StdioStream::print (const char * str)
-
-inline
-
-

Write a string.

-
Parameters
- - -
[in]strthe string to be written.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ print() [4/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StdioStream::print (double val,
uint8_t prec = 2 
)
-
-inline
-
-

Print a floating point number.

-
Parameters
- - - -
[in]precNumber of digits after decimal point.
[in]valthe number to be printed.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ print() [5/6]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StdioStream::print (float val,
uint8_t prec = 2 
)
-
-inline
-
-

Print a floating point number.

-
Parameters
- - - -
[in]precNumber of digits after decimal point.
[in]valthe number to be printed.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ print() [6/6]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
size_t StdioStream::print (val)
-
-inline
-
-

Print a number.

-
Parameters
- - -
[in]valthe number to be printed.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ printDec() [1/9]

- -
-
- - - - - -
- - - - - - - - -
int StdioStream::printDec (char n)
-
-inline
-
-

Print a char as a number.

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [2/9]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
int StdioStream::printDec (double value,
uint8_t prec 
)
-
-inline
-
-

Print a double.

Parameters
- - - -
[in]valueThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [3/9]

- -
-
- - - - - - - - - - - - - - - - - - -
int StdioStream::printDec (float value,
uint8_t prec 
)
-
-

Print a float.

Parameters
- - - -
[in]valueThe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [4/9]

- -
-
- - - - - - - - -
int StdioStream::printDec (int16_t n)
-
-

Print a int16_t

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [5/9]

- -
-
- - - - - - - - -
int StdioStream::printDec (int32_t n)
-
-

Print a signed 32-bit integer.

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [6/9]

- -
-
- - - - - - - - -
int StdioStream::printDec (signed char n)
-
-

print a signed 8-bit integer

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [7/9]

- -
-
- - - - - - - - -
int StdioStream::printDec (uint16_t n)
-
-

print a uint16_t.

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [8/9]

- -
-
- - - - - - - - -
int StdioStream::printDec (uint32_t n)
-
-

Write an unsigned 32-bit number.

Parameters
- - -
[in]nnumber to be printed.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printDec() [9/9]

- -
-
- - - - - -
- - - - - - - - -
int StdioStream::printDec (unsigned char n)
-
-inline
-
-

Print an unsigned 8-bit number.

Parameters
- - -
[in]nnumber to be print.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int StdioStream::printField (double value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
int StdioStream::printField (float value,
char term,
uint8_t prec = 2 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - - -
[in]valueThe number to be printed.
[in]termThe field terminator.
[in]precNumber of digits after decimal point.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printField() [3/3]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - - - - - - - - - - - -
int StdioStream::printField (value,
char term 
)
-
-inline
-
-

Print a number followed by a field terminator.

Parameters
- - - -
[in]valueThe number to be printed.
[in]termThe field terminator.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printHex()

- -
-
- - - - - - - - -
int StdioStream::printHex (uint32_t n)
-
-

Print HEX

Parameters
- - -
[in]nnumber to be printed as HEX.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ printHexln()

- -
-
- - - - - -
- - - - - - - - -
int StdioStream::printHexln (uint32_t n)
-
-inline
-
-

Print HEX with CRLF

Parameters
- - -
[in]nnumber to be printed as HEX.
-
-
-
Returns
The number of bytes written or -1 if an error occurs.
- -
-
- -

◆ println() [1/4]

- -
-
- - - - - -
- - - - - - - -
size_t StdioStream::println ()
-
-inline
-
-

Write a CR/LF.

-
Returns
two, the number of bytes written, for success or zero for failure.
- -
-
- -

◆ println() [2/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StdioStream::println (double val,
uint8_t prec = 2 
)
-
-inline
-
-

Print a floating point number followed by CR/LF.

-
Parameters
- - - -
[in]valthe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ println() [3/4]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StdioStream::println (float val,
uint8_t prec = 2 
)
-
-inline
-
-

Print a floating point number followed by CR/LF.

-
Parameters
- - - -
[in]valthe number to be printed.
[in]precNumber of digits after decimal point.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ println() [4/4]

- -
-
-
-template<typename T >
- - - - - -
- - - - - - - - -
size_t StdioStream::println (val)
-
-inline
-
-

Print an item followed by CR/LF

-
Parameters
- - -
[in]valthe item to be printed.
-
-
-
Returns
the number of bytes written.
- -
-
- -

◆ putc()

- -
-
- - - - - -
- - - - - - - - -
int StdioStream::putc (int c)
-
-inline
-
-

Write a byte to a stream.

-

putc and fputc are equivalent but putc is in-line so it is faster but require more flash memory.

-
Parameters
- - -
[in]cthe byte to be written (converted to an unsigned char).
-
-
-
Returns
Upon successful completion, fputc() returns the value it has written. Otherwise, it returns EOF and sets the error indicator for the stream.
- -
-
- -

◆ putCRLF()

- -
-
- - - - - -
- - - - - - - -
int StdioStream::putCRLF ()
-
-inline
-
-

Write a CR/LF.

-
Returns
two, the number of bytes written, for success or -1 for failure.
- -
-
- -

◆ rewind()

- -
-
- - - - - - - -
bool StdioStream::rewind ()
-
-

Set position of a stream to the beginning.

-

The rewind function sets the file position to the beginning of the file. It is equivalent to fseek(0L, SEEK_SET) except that the error indicator for the stream is also cleared.

-
Returns
true for success or false for failure.
- -
-
- -

◆ ungetc()

- -
-
- - - - - - - - -
int StdioStream::ungetc (int c)
-
-

Push a byte back into an input stream.

-
Parameters
- - -
[in]cthe byte (converted to an unsigned char) to be pushed back.
-
-
-

One character of push-back is guaranteed. If the ungetc function is called too many times without an intervening read or file positioning operation on that stream, the operation may fail.

-

A successful intervening call to a file positioning function (fseek, fsetpos, or rewind) discards any pushed-back characters for the stream.

-
Returns
Upon successful completion, ungetc() returns the byte pushed back after conversion. Otherwise it returns EOF.
- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/iostream/StdioStream.h
  • -
  • Arduino/libraries/SdFat/src/iostream/StdioStream.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__coll__graph.png deleted file mode 100644 index af4919ec..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__inherit__graph.png deleted file mode 100644 index af4919ec..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stdio_stream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class-members.html deleted file mode 100644 index 1b164a44..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class-members.html +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
StreamBaseClass Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)FatFileprivate
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
FatFile::write(const char *str)FatFileinlineprivate
FatFile::write(uint8_t b)FatFileinlineprivate
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class.html deleted file mode 100644 index 7b59e6a1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class.html +++ /dev/null @@ -1,1595 +0,0 @@ - - - - - - - -SdFat: StreamBaseClass Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

base type for FAT and exFAT streams - More...

- -

#include <fstream.h>

-
-Inheritance diagram for StreamBaseClass:
-
-
Inheritance graph
- - - - - - - - - -
[legend]
-
-Collaboration diagram for StreamBaseClass:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
bool good () const
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
- - - - - - - - - - - -

-Private Member Functions

bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
size_t write (const char *str)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

base type for FAT and exFAT streams

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/fstream.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__coll__graph.png deleted file mode 100644 index 850ba666..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__inherit__graph.png deleted file mode 100644 index 4220bf11..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_base_class__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file-members.html deleted file mode 100644 index 90db6d40..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file-members.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
StreamFile< BaseFile, PosType > Member List
-
- - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file.html deleted file mode 100644 index de1c597c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file.html +++ /dev/null @@ -1,515 +0,0 @@ - - - - - - - -SdFat: StreamFile< BaseFile, PosType > Class Template Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
StreamFile< BaseFile, PosType > Class Template Reference
-
-
- -

StreamFile class. - More...

- -

#include <ArduinoFiles.h>

-
-Inheritance diagram for StreamFile< BaseFile, PosType >:
-
-
Inheritance graph
- - - - - -
[legend]
-
-Collaboration diagram for StreamFile< BaseFile, PosType >:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

int available ()
 
void flush ()
 
bool isDirectory ()
 
const char * name () const
 
int peek ()
 
PosType position ()
 
int read ()
 
void rewindDirectory ()
 
bool seek (PosType pos)
 
PosType size ()
 
size_t write (const uint8_t *buffer, size_t size)
 
size_t write (uint8_t b)
 
-

Detailed Description

-

template<class BaseFile, typename PosType>
-class StreamFile< BaseFile, PosType >

- -

StreamFile class.

-

Member Function Documentation

- -

◆ available()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
int StreamFile< BaseFile, PosType >::available ()
-
-inline
-
-
Returns
number of bytes available from the current position to EOF or INT_MAX if more than INT_MAX bytes are available.
- -
-
- -

◆ flush()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
void StreamFile< BaseFile, PosType >::flush ()
-
-inline
-
-

Ensure that any bytes written to the file are saved to the SD card.

- -
-
- -

◆ isDirectory()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
bool StreamFile< BaseFile, PosType >::isDirectory ()
-
-inline
-
-

This function reports if the current file is a directory or not.

Returns
true if the file is a directory.
- -
-
- -

◆ name()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
const char* StreamFile< BaseFile, PosType >::name () const
-
-inline
-
-

No longer implemented due to Long File Names.

-

Use getName(char* name, size_t size).

Returns
a pointer to replacement suggestion.
- -
-
- -

◆ peek()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
int StreamFile< BaseFile, PosType >::peek ()
-
-inline
-
-

Return the next available byte without consuming it.

-
Returns
The byte if no error and not at eof else -1;
- -
-
- -

◆ position()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
PosType StreamFile< BaseFile, PosType >::position ()
-
-inline
-
-
Returns
the current file position.
- -
-
- -

◆ read()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
int StreamFile< BaseFile, PosType >::read ()
-
-inline
-
-

Read the next byte from a file.

-
Returns
For success return the next byte in the file as an int. If an error occurs or end of file is reached return -1.
- -
-
- -

◆ rewindDirectory()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
void StreamFile< BaseFile, PosType >::rewindDirectory ()
-
-inline
-
-

Rewind a file if it is a directory

- -
-
- -

◆ seek()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - - -
bool StreamFile< BaseFile, PosType >::seek (PosType pos)
-
-inline
-
-

Seek to a new position in the file, which must be between 0 and the size of the file (inclusive).

-
Parameters
- - -
[in]posthe new file position.
-
-
-
Returns
true for success or false for failure.
- -
-
- -

◆ size()

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - -
PosType StreamFile< BaseFile, PosType >::size ()
-
-inline
-
-
Returns
the file's size.
- -
-
- -

◆ write() [1/2]

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - - - - - - - - - - - - -
size_t StreamFile< BaseFile, PosType >::write (const uint8_t * buffer,
size_t size 
)
-
-inline
-
-

Write data to an open file.

-
Note
Data is moved to the cache but may not be written to the storage device until sync() is called.
-
Parameters
- - - -
[in]bufferPointer to the location of the data to be written.
[in]sizeNumber of bytes to write.
-
-
-
Returns
For success write() returns the number of bytes written, always size.
- -
-
- -

◆ write() [2/2]

- -
-
-
-template<class BaseFile, typename PosType>
- - - - - -
- - - - - - - - -
size_t StreamFile< BaseFile, PosType >::write (uint8_t b)
-
-inline
-
-

Write a byte to a file. Required by the Arduino Print class.

Parameters
- - -
[in]bthe byte to be written. Use getWriteError to check for errors.
-
-
-
Returns
1 for success and 0 for failure.
- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/common/ArduinoFiles.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__coll__graph.png deleted file mode 100644 index 43b23b35..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__inherit__graph.png deleted file mode 100644 index 43b23b35..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_stream_file__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call-members.html deleted file mode 100644 index c2136286..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
SysCall Member List
-
-
- -

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

- - - - -
curTimeMS()SysCallinlinestatic
halt()SysCallinlinestatic
yield()SysCallinlinestatic
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call.html deleted file mode 100644 index 5c05f557..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/class_sys_call.html +++ /dev/null @@ -1,178 +0,0 @@ - - - - - - - -SdFat: SysCall Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
- -
-
SysCall Class Reference
-
-
- -

SysCall - Class to wrap system calls. - More...

- -

#include <SysCall.h>

- - - - - - - - -

-Static Public Member Functions

static SdMillis_t curTimeMS ()
 
static void halt ()
 
static void yield ()
 
-

Detailed Description

-

SysCall - Class to wrap system calls.

-

Member Function Documentation

- -

◆ curTimeMS()

- -
-
- - - - - -
- - - - - - - -
SdMillis_t SysCall::curTimeMS ()
-
-inlinestatic
-
-
Returns
the time in milliseconds.
- -
-
- -

◆ halt()

- -
-
- - - - - -
- - - - - - - -
static void SysCall::halt ()
-
-inlinestatic
-
-

Halt execution of this thread.

- -
-
- -

◆ yield()

- -
-
- - - - - -
- - - - - - - -
void SysCall::yield ()
-
-inlinestatic
-
-

Yield to other threads.

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/common/SysCall.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classes.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classes.html deleted file mode 100644 index 790dc164..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classes.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - -SdFat: Class Index - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class Index
-
-
-
a | b | c | d | e | f | i | m | o | p | s
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  a  
-
ExFatFormatter   FsCache   ofstream   SdSpiBaseClass   
ExFatPartition   FsFile   ostream   SdSpiCard   
ArduinoInStream   ExFatPos_t   fstream   
  p  
-
SdSpiConfig   
ArduinoOutStream   ExFatVolume   FsVolume   SdSpiSoftDriver   
  b  
-
ExFile   
  i  
-
PrintFile   setfill   
ExName_t   
  s  
-
setprecision   
BlockDeviceInterface   
  f  
-
ibufstream   setw   
BufferedPrint   ifstream   SdBase   SoftSpiDriver   
  c  
-
FatCache   ios   SdCardFactory   StdioStream   
FatFile   ios_base   SdCardInterface   StreamBaseClass   
cache_t   FatFormatter   iostream   SdExFat   StreamFile   
CID   FatPartition   istream   SdFat32   SysCall   
  d  
-
FatPos_t   
  m  
-
SdFile   
FatVolume   SdFs   
DirPos_t   File32   MinimumSerial   SdioCard   
  e  
-
fname_t   
  o  
-
SdioConfig   
FsBaseFile   SdSpiArduinoDriver   
ExFatFile   obufstream   
-
a | b | c | d | e | f | i | m | o | p | s
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream-members.html deleted file mode 100644 index 1f51f940..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream-members.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
fstream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)fstreaminline
close()fstreaminline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
fstream() (defined in fstream)fstreaminline
fstream(const char *path, openmode mode=in|out)fstreaminlineexplicit
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
is_open()fstreaminline
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
open(const char *path, openmode mode=in|out)fstreaminline
FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)FatFileprivate
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream.html deleted file mode 100644 index 44c2d916..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream.html +++ /dev/null @@ -1,3784 +0,0 @@ - - - - - - - -SdFat: fstream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

file input/output stream. - More...

- -

#include <fstream.h>

-
-Inheritance diagram for fstream:
-
-
Inheritance graph
- - - - - - - - - - -
[legend]
-
-Collaboration diagram for fstream:
-
-
Collaboration graph
- - - - - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
 fstream (const char *path, openmode mode=in|out)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
bool is_open ()
 
void open (const char *path, openmode mode=in|out)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
- - - - - - - -

-Private Member Functions

bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
-

Detailed Description

-

file input/output stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ fstream()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fstream::fstream (const char * path,
openmode mode = in | out 
)
-
-inlineexplicit
-
-

Constructor with open

Parameters
- - - -
[in]pathfile to open
[in]modeopen mode
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void fstream::clear (iostate state = goodbit)
-
-inline
-
-

Clear state and writeError

Parameters
- - -
[in]statenew state for stream
-
-
- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
void fstream::close ()
-
-inline
-
-

Close a file and force cached data and directory information to be written to the storage device.

- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inlineinherited
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inlineinherited
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - -
- - - - - - - -
int istream::get ()
-
-inherited
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - -
- - - - - - - - -
istream & istream::get (char & ch)
-
-inherited
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-inherited
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ is_open()

- -
-
- - - - - -
- - - - - - - -
bool fstream::is_open ()
-
-inline
-
-
Returns
True if stream is open else false.
- -
-
- -

◆ open()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void fstream::open (const char * path,
openmode mode = in | out 
)
-
-inline
-
-

Open a fstream

Parameters
- - - -
[in]pathpath to open
[in]modeopen mode
-
-
-

Valid open modes are (at end, ios::ate, and/or ios::binary may be added):

-

ios::in - Open file for reading.

-

ios::out or ios::out | ios::trunc - Truncate to 0 length, if existent, or create a file for writing only.

-

ios::app or ios::out | ios::app - Append; open or create file for writing at end-of-file.

-

ios::in | ios::out - Open file for update (reading and writing).

-

ios::in | ios::out | ios::trunc - Truncate to zero length, if existent, or create file for update.

-

ios::in | ios::app or ios::in | ios::out | ios::app - Append; open or create text file for update, writing at end of file.

- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inlineinherited
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inlineinherited
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inlineinherited
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inlineinherited
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inlineinherited
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inlineinherited
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inlineinherited
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inlineinherited
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inlineinherited
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inlineinherited
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inlineinherited
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inlineinherited
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inlineinherited
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inlineinherited
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inlineinherited
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inlineinherited
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inlineinherited
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inlineinherited
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inlineinherited
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inlineinherited
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int istream::peek ()
-
-inherited
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inlineinherited
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - -
- - - - - - - -
void istream::skipWhite ()
-
-inherited
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/fstream.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__coll__graph.png deleted file mode 100644 index 22415e6e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__inherit__graph.png deleted file mode 100644 index 22415e6e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classfstream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream-members.html deleted file mode 100644 index d9c9191f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream-members.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ibufstream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ibufstream()ibufstreaminline
ibufstream(const char *str)ibufstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
init(const char *str)ibufstreaminline
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream.html deleted file mode 100644 index 07ad224c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream.html +++ /dev/null @@ -1,2766 +0,0 @@ - - - - - - - -SdFat: ibufstream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

parse a char string - More...

- -

#include <bufstream.h>

-
-Inheritance diagram for ibufstream:
-
-
Inheritance graph
- - - - - - - -
[legend]
-
-Collaboration diagram for ibufstream:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
 ibufstream ()
 
 ibufstream (const char *str)
 
istreamignore (streamsize n=1, int delim=-1)
 
void init (const char *str)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

parse a char string

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ibufstream() [1/2]

- -
-
- - - - - -
- - - - - - - -
ibufstream::ibufstream ()
-
-inline
-
-

Constructor

- -
-
- -

◆ ibufstream() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ibufstream::ibufstream (const char * str)
-
-inlineexplicit
-
-

Constructor

Parameters
- - -
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inlineinherited
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - -
- - - - - - - -
int istream::get ()
-
-inherited
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - -
- - - - - - - - -
istream & istream::get (char & ch)
-
-inherited
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-inherited
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - -
void ibufstream::init (const char * str)
-
-inline
-
-

Initialize an ibufstream

Parameters
- - -
[in]strpointer to string to be parsed Warning: The string will not be copied so must stay in scope.
-
-
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inlineinherited
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inlineinherited
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inlineinherited
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inlineinherited
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inlineinherited
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inlineinherited
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inlineinherited
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int istream::peek ()
-
-inherited
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - -
- - - - - - - -
void istream::skipWhite ()
-
-inherited
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__coll__graph.png deleted file mode 100644 index d91bbc79..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__inherit__graph.png deleted file mode 100644 index 0b88104d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classibufstream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream-members.html deleted file mode 100644 index bac19633..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream-members.html +++ /dev/null @@ -1,176 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ifstream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
close()ifstreaminline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ifstream() (defined in ifstream)ifstreaminline
ifstream(const char *path, openmode mode=in)ifstreaminlineexplicit
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
is_open()ifstreaminline
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
open(const char *path, openmode mode=in)ifstreaminline
FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)FatFileprivate
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()ifstream
istream::peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream.html deleted file mode 100644 index 29dad34b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream.html +++ /dev/null @@ -1,2848 +0,0 @@ - - - - - - - -SdFat: ifstream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

file input stream. - More...

- -

#include <fstream.h>

-
-Inheritance diagram for ifstream:
-
-
Inheritance graph
- - - - - - - - -
[legend]
-
-Collaboration diagram for ifstream:
-
-
Collaboration graph
- - - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
 ifstream (const char *path, openmode mode=in)
 
istreamignore (streamsize n=1, int delim=-1)
 
bool is_open ()
 
void open (const char *path, openmode mode=in)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
- - - - - - - -

-Private Member Functions

bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
-

Detailed Description

-

file input stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ifstream()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ifstream::ifstream (const char * path,
openmode mode = in 
)
-
-inlineexplicit
-
-

Constructor with open

Parameters
- - - -
[in]pathfile to open
[in]modeopen mode
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
void ifstream::close ()
-
-inline
-
-

Close a file and force cached data and directory information to be written to the storage device.

- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inlineinherited
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - -
- - - - - - - -
int istream::get ()
-
-inherited
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - -
- - - - - - - - -
istream & istream::get (char & ch)
-
-inherited
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-inherited
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ is_open()

- -
-
- - - - - -
- - - - - - - -
bool ifstream::is_open ()
-
-inline
-
-
Returns
True if stream is open else false.
- -
-
- -

◆ open()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void ifstream::open (const char * path,
openmode mode = in 
)
-
-inline
-
-

Open an ifstream

Parameters
- - - -
[in]pathfile to open
[in]modeopen mode
-
-
-

mode See fstream::open() for valid modes.

- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inlineinherited
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inlineinherited
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inlineinherited
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inlineinherited
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inlineinherited
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inlineinherited
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inlineinherited
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek() [1/2]

- -
-
- - - - -
int istream::peek
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ peek() [2/2]

- -
-
- - - - - -
- - - - - - - -
int istream::peek ()
-
-inherited
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - -
- - - - - - - -
void istream::skipWhite ()
-
-inherited
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/fstream.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__coll__graph.png deleted file mode 100644 index df2931c1..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__inherit__graph.png deleted file mode 100644 index df2931c1..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classifstream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios-members.html deleted file mode 100644 index 167d53c0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios-members.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ios Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios.html deleted file mode 100644 index e557868a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios.html +++ /dev/null @@ -1,1614 +0,0 @@ - - - - - - - -SdFat: ios Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Error and state information for all streams. - More...

- -

#include <ios.h>

-
-Inheritance diagram for ios:
-
-
Inheritance graph
- - - - - - - - - - - - - - - -
[legend]
-
-Collaboration diagram for ios:
-
-
Collaboration graph
- - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
bool good () const
 
 ios ()
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Error and state information for all streams.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ios()

- -
-
- - - - - -
- - - - - - - -
ios::ios ()
-
-inline
-
-

Create ios with no error flags set

- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inline
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inline
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inline
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inline
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inline
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicit
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inline
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inline
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inline
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inline
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/ios.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base-members.html deleted file mode 100644 index 16640c87..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base-members.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ios_base Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
cur enum valueios_base
decios_basestatic
end enum valueios_base
eofbitios_basestatic
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rightios_basestatic
seekdir enum nameios_base
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base.html deleted file mode 100644 index eb39a69d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base.html +++ /dev/null @@ -1,1222 +0,0 @@ - - - - - - - -SdFat: ios_base Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Base class for all streams. - More...

- -

#include <ios.h>

-
-Inheritance diagram for ios_base:
-
-
Inheritance graph
- - - - - - - - - - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
int precision () const
 
int precision (unsigned int n)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Base class for all streams.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - -
typedef unsigned int ios_base::fmtflags
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - -
typedef unsigned char ios_base::iostate
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - -
typedef int32_t ios_base::off_type
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - -
typedef uint8_t ios_base::openmode
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - -
typedef uint32_t ios_base::pos_type
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - -
typedef uint32_t ios_base::streamsize
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - -
enum ios_base::seekdir
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Member Function Documentation

- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inline
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inline
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inline
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inline
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inline
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inline
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inline
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inline
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inline
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inline
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inline
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-static
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-static
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-static
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-static
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-static
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-static
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-static
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-static
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-static
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-static
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-static
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-static
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-static
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-static
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-static
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-static
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-static
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-static
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-static
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-static
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-static
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-static
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-static
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-static
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/ios.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base__inherit__graph.png deleted file mode 100644 index 90170c98..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__base__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__coll__graph.png deleted file mode 100644 index d817f0a0..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__inherit__graph.png deleted file mode 100644 index 58fb612d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classios__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream-members.html deleted file mode 100644 index 52ab13f7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream-members.html +++ /dev/null @@ -1,195 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
iostream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream.html deleted file mode 100644 index 01889077..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream.html +++ /dev/null @@ -1,3616 +0,0 @@ - - - - - - - -SdFat: iostream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Input/Output stream. - More...

- -

#include <iostream.h>

-
-Inheritance diagram for iostream:
-
-
Inheritance graph
- - - - - - - - -
[legend]
-
-Collaboration diagram for iostream:
-
-
Collaboration graph
- - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Input/Output stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inlineinherited
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inlineinherited
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - -
- - - - - - - -
int istream::get ()
-
-inherited
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - -
- - - - - - - - -
istream & istream::get (char & ch)
-
-inherited
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-inherited
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-inherited
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inlineinherited
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inlineinherited
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inlineinherited
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inlineinherited
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inlineinherited
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inlineinherited
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inlineinherited
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inlineinherited
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inlineinherited
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inlineinherited
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inlineinherited
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inlineinherited
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inlineinherited
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inlineinherited
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inlineinherited
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inlineinherited
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inlineinherited
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inlineinherited
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inlineinherited
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inlineinherited
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inlineinherited
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inlineinherited
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inlineinherited
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek()

- -
-
- - - - - -
- - - - - - - -
int istream::peek ()
-
-inherited
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inlineinherited
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - -
- - - - - - - -
void istream::skipWhite ()
-
-inherited
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/iostream.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__coll__graph.png deleted file mode 100644 index 749d6536..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__inherit__graph.png deleted file mode 100644 index 644dd2dc..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classiostream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream-members.html deleted file mode 100644 index db38193f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream-members.html +++ /dev/null @@ -1,167 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
istream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
fmtflags typedefios_base
gcount() constistreaminline
get()istream
get(char &ch)istream
get(char *str, streamsize n, char delim='\n')istream
getline(char *str, streamsize n, char delim='\n')istream
good() constiosinline
goodbitios_basestatic
hexios_basestatic
ignore(streamsize n=1, int delim=-1)istream
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
istream() (defined in istream)istreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator>>(istream &(*pf)(istream &str))istreaminline
operator>>(ios_base &(*pf)(ios_base &str))istreaminline
operator>>(ios &(*pf)(ios &str))istreaminline
operator>>(char *str)istreaminline
operator>>(char &ch)istreaminline
operator>>(signed char *str)istreaminline
operator>>(signed char &ch)istreaminline
operator>>(unsigned char *str)istreaminline
operator>>(unsigned char &ch)istreaminline
operator>>(bool &arg)istreaminline
operator>>(short &arg)istreaminline
operator>>(unsigned short &arg)istreaminline
operator>>(int &arg)istreaminline
operator>>(unsigned int &arg)istreaminline
operator>>(long &arg)istreaminline
operator>>(unsigned long &arg)istreaminline
operator>>(double &arg)istreaminline
operator>>(float &arg)istreaminline
operator>>(void *&arg)istreaminline
outios_basestatic
peek()istream
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekg(pos_type pos)istreaminline
seekg(off_type off, seekdir way)istreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipWhite()istream
skipwsios_basestatic
streamsize typedefios_base
tellg()istreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream.html deleted file mode 100644 index 66d76df1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream.html +++ /dev/null @@ -1,2616 +0,0 @@ - - - - - - - -SdFat: istream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Input Stream. - More...

- -

#include <istream.h>

-
-Inheritance diagram for istream:
-
-
Inheritance graph
- - - - - - - - - - -
[legend]
-
-Collaboration diagram for istream:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
streamsize gcount () const
 
int get ()
 
istreamget (char &ch)
 
istreamget (char *str, streamsize n, char delim='\n')
 
istreamgetline (char *str, streamsize n, char delim='\n')
 
bool good () const
 
istreamignore (streamsize n=1, int delim=-1)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
istreamoperator>> (bool &arg)
 
istreamoperator>> (char &ch)
 
istreamoperator>> (char *str)
 
istreamoperator>> (double &arg)
 
istreamoperator>> (float &arg)
 
istreamoperator>> (int &arg)
 
istreamoperator>> (ios &(*pf)(ios &str))
 
istreamoperator>> (ios_base &(*pf)(ios_base &str))
 
istreamoperator>> (istream &(*pf)(istream &str))
 
istreamoperator>> (long &arg)
 
istreamoperator>> (short &arg)
 
istreamoperator>> (signed char &ch)
 
istreamoperator>> (signed char *str)
 
istreamoperator>> (unsigned char &ch)
 
istreamoperator>> (unsigned char *str)
 
istreamoperator>> (unsigned int &arg)
 
istreamoperator>> (unsigned long &arg)
 
istreamoperator>> (unsigned short &arg)
 
istreamoperator>> (void *&arg)
 
int peek ()
 
int precision () const
 
int precision (unsigned int n)
 
iostate rdstate () const
 
istreamseekg (off_type off, seekdir way)
 
istreamseekg (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
void skipWhite ()
 
pos_type tellg ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Input Stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ gcount()

- -
-
- - - - - -
- - - - - - - -
streamsize istream::gcount () const
-
-inline
-
-
Returns
The number of characters extracted by the last unformatted input function.
- -
-
- -

◆ get() [1/3]

- -
-
- - - - - - - -
int istream::get ()
-
-

Extract a character if one is available.

-
Returns
The character or -1 if a failure occurs. A failure is indicated by the stream state.
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

- -
-
- -

◆ get() [2/3]

- -
-
- - - - - - - - -
istream & istream::get (char & ch)
-
-

Extract a character if one is available.

-
Parameters
- - -
[out]chlocation to receive the extracted character.
-
-
-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ get() [3/3]

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::get (char * str,
streamsize n,
char delim = '\n' 
)
-
-

Extract characters.

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, n is less than 1, n-1 characters are extracted, or the next character equals delim (delim is not extracted). If no characters are extracted failbit is set. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ getline()

- -
-
- - - - - - - - - - - - - - - - - - - - - - - - -
istream & istream::getline (char * str,
streamsize n,
char delim = '\n' 
)
-
-

Extract characters

-
Parameters
- - - - -
[out]strLocation to receive extracted characters.
[in]nSize of str.
[in]delimDelimiter
-
-
-

Characters are extracted until extraction fails, the next character equals delim (delim is extracted), or n-1 characters are extracted.

-

The failbit is set if no characters are extracted or n-1 characters are extracted. If end-of-file occurs the eofbit is set.

-
Returns
always returns *this. A failure is indicated by the stream state.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ ignore()

- -
-
- - - - - - - - - - - - - - - - - - -
istream & istream::ignore (streamsize n = 1,
int delim = -1 
)
-
-

Extract characters and discard them.

-
Parameters
- - - -
[in]nmaximum number of characters to ignore.
[in]delimDelimiter.
-
-
-

Characters are extracted until extraction fails, n characters are extracted, or the next input character equals delim (the delimiter is extracted). If end-of-file occurs the eofbit is set.

-

Failures are indicated by the state of the stream.

-
Returns
*this
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator>>() [1/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (bool & arg)
-
-inline
-
-

Extract a value of type bool.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [2/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char & ch)
-
-inline
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [3/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (char * str)
-
-inline
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [4/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (double & arg)
-
-inline
-
-

Extract a value of type double.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [5/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (float & arg)
-
-inline
-
-

Extract a value of type float.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [6/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (int & arg)
-
-inline
-
-

Extract a value of type int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [7/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios &(*)(ios &str) pf)
-
-inline
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [8/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (ios_base &(*)(ios_base &str) pf)
-
-inline
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [9/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (istream &(*)(istream &str) pf)
-
-inline
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [10/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (long & arg)
-
-inline
-
-

Extract a value of type long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [11/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (short & arg)
-
-inline
-
-

Extract a value of type short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [12/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char & ch)
-
-inline
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [13/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (signed char * str)
-
-inline
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [14/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char & ch)
-
-inline
-
-

Extract a character

Parameters
- - -
[out]chlocation to store the character.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [15/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned char * str)
-
-inline
-
-

Extract a character string

Parameters
- - -
[out]strlocation to store the string.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [16/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned int & arg)
-
-inline
-
-

Extract a value of type unsigned int.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [17/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned long & arg)
-
-inline
-
-

Extract a value of type unsigned long.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [18/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (unsigned short & arg)
-
-inline
-
-

Extract a value of type unsigned short.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ operator>>() [19/19]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::operator>> (void *& arg)
-
-inline
-
-

Extract a value of type void*.

Parameters
- - -
[out]arglocation to store the value.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ peek()

- -
-
- - - - - - - -
int istream::peek ()
-
-

Return the next available character without consuming it.

-
Returns
The character if the stream state is good else -1;
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekg() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& istream::seekg (off_type off,
seekdir way 
)
-
-inline
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the read pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekg() [2/2]

- -
-
- - - - - -
- - - - - - - - -
istream& istream::seekg (pos_type pos)
-
-inline
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the read pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ skipWhite()

- -
-
- - - - - - - -
void istream::skipWhite ()
-
-

used to implement ws()

- -
-
- -

◆ tellg()

- -
-
- - - - - -
- - - - - - - -
pos_type istream::tellg ()
-
-inline
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/iostream/istream.h
  • -
  • Arduino/libraries/SdFat/src/iostream/istream.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__coll__graph.png deleted file mode 100644 index d4c4e3ab..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__inherit__graph.png deleted file mode 100644 index aa20a7a2..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classistream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream-members.html deleted file mode 100644 index 19e771e0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream-members.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
obufstream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
buf()obufstreaminline
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
init(char *buf, size_t size)obufstreaminline
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
length()obufstreaminline
obufstream()obufstreaminline
obufstream(char *buf, size_t size)obufstreaminline
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream.html deleted file mode 100644 index f160b80d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream.html +++ /dev/null @@ -1,2698 +0,0 @@ - - - - - - - -SdFat: obufstream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

format a char string - More...

- -

#include <bufstream.h>

-
-Inheritance diagram for obufstream:
-
-
Inheritance graph
- - - - - - -
[legend]
-
-Collaboration diagram for obufstream:
-
-
Collaboration graph
- - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
char * buf ()
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
void init (char *buf, size_t size)
 
size_t length ()
 
 obufstream ()
 
 obufstream (char *buf, size_t size)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

format a char string

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ obufstream() [1/2]

- -
-
- - - - - -
- - - - - - - -
obufstream::obufstream ()
-
-inline
-
-

constructor

- -
-
- -

◆ obufstream() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
obufstream::obufstream (char * buf,
size_t size 
)
-
-inline
-
-

Constructor

Parameters
- - - -
[in]bufbuffer for formatted string
[in]sizebuffer size
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ buf()

- -
-
- - - - - -
- - - - - - - -
char* obufstream::buf ()
-
-inline
-
-
Returns
a pointer to the buffer
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inlineinherited
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ init()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void obufstream::init (char * buf,
size_t size 
)
-
-inline
-
-

Initialize an obufstream

Parameters
- - - -
[in]bufbuffer for formatted string
[in]sizebuffer size
-
-
- -
-
- -

◆ length()

- -
-
- - - - - -
- - - - - - - -
size_t obufstream::length ()
-
-inline
-
-
Returns
the length of the formatted string
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inlineinherited
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inlineinherited
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inlineinherited
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inlineinherited
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inlineinherited
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inlineinherited
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inlineinherited
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inlineinherited
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inlineinherited
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inlineinherited
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inlineinherited
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inlineinherited
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inlineinherited
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inlineinherited
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file: -
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__coll__graph.png deleted file mode 100644 index 24cb78cb..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__inherit__graph.png deleted file mode 100644 index 24cb78cb..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classobufstream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream-members.html deleted file mode 100644 index 9f2fbcf4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream-members.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ofstream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)ofstreaminline
close()ofstreaminline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
is_open()ofstreaminline
leftios_basestatic
octios_basestatic
off_type typedefios_base
ofstream() (defined in ofstream)ofstreaminline
ofstream(const char *path, openmode mode=out)ofstreaminlineexplicit
open(const char *path, openmode mode=out)ofstreaminline
FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)FatFileprivate
FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)FatFileprivate
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream.html deleted file mode 100644 index e1ad7032..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream.html +++ /dev/null @@ -1,2684 +0,0 @@ - - - - - - - -SdFat: ofstream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

file output stream. - More...

- -

#include <fstream.h>

-
-Inheritance diagram for ofstream:
-
-
Inheritance graph
- - - - - - - - -
[legend]
-
-Collaboration diagram for ofstream:
-
-
Collaboration graph
- - - - - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
void close ()
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
bool is_open ()
 
 ofstream (const char *path, openmode mode=out)
 
void open (const char *path, openmode mode=out)
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
- - - - - - - -

-Private Member Functions

bool open (FatFile *dirFile, const char *path, oflag_t oflag)
 
bool open (FatFile *dirFile, uint16_t index, oflag_t oflag)
 
bool open (FatVolume *vol, const char *path, oflag_t oflag)
 
-

Detailed Description

-

file output stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Constructor & Destructor Documentation

- -

◆ ofstream()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ofstream::ofstream (const char * path,
openmode mode = out 
)
-
-inlineexplicit
-
-

Constructor with open

Parameters
- - - -
[in]pathfile to open
[in]modeopen mode
-
-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ofstream::clear (iostate state = goodbit)
-
-inline
-
-

Clear state and writeError

Parameters
- - -
[in]statenew state for stream
-
-
- -
-
- -

◆ close()

- -
-
- - - - - -
- - - - - - - -
void ofstream::close ()
-
-inline
-
-

Close a file and force cached data and directory information to be written to the storage device.

- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inlineinherited
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ is_open()

- -
-
- - - - - -
- - - - - - - -
bool ofstream::is_open ()
-
-inline
-
-
Returns
True if stream is open else false.
- -
-
- -

◆ open()

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
void ofstream::open (const char * path,
openmode mode = out 
)
-
-inline
-
-

Open an ofstream

Parameters
- - - -
[in]pathfile to open
[in]modeopen mode
-
-
-

mode See fstream::open() for valid modes.

- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inlineinherited
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inlineinherited
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inlineinherited
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inlineinherited
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inlineinherited
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inlineinherited
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inlineinherited
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inlineinherited
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inlineinherited
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inlineinherited
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inlineinherited
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inlineinherited
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inlineinherited
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inlineinherited
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inlineinherited
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inlineinherited
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inlineinherited
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inlineinherited
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inlineinherited
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inlineinherited
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following file:
    -
  • Arduino/libraries/SdFat/src/iostream/fstream.h
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__coll__graph.png deleted file mode 100644 index ecc36059..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__inherit__graph.png deleted file mode 100644 index ecc36059..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classofstream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream-members.html deleted file mode 100644 index 518fa3b0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream-members.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
-
-
-
ostream Member List
-
-
- -

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

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
adjustfieldios_basestatic
appios_basestatic
ateios_basestatic
bad() constiosinline
badbitios_basestatic
basefieldios_basestatic
beg enum valueios_base
binaryios_basestatic
boolalphaios_basestatic
clear(iostate state=goodbit)iosinline
cur enum valueios_base
decios_basestatic
end enum valueios_base
eof() constiosinline
eofbitios_basestatic
fail() constiosinline
failbitios_basestatic
fill()ios_baseinline
fill(char c)ios_baseinline
flags() constios_baseinline
flags(fmtflags fl)ios_baseinline
flush()ostreaminline
fmtflags typedefios_base
good() constiosinline
goodbitios_basestatic
hexios_basestatic
inios_basestatic
internalios_basestatic
ios()iosinline
ios_base() (defined in ios_base)ios_baseinline
iostate typedefios_base
leftios_basestatic
octios_basestatic
off_type typedefios_base
openmode typedefios_base
operator bool() constiosinlineexplicit
operator const void *() constiosinline
operator!() constiosinline
operator<<(ostream &(*pf)(ostream &str))ostreaminline
operator<<(ios_base &(*pf)(ios_base &str))ostreaminline
operator<<(bool arg)ostreaminline
operator<<(const char *arg)ostreaminline
operator<<(const signed char *arg)ostreaminline
operator<<(const unsigned char *arg)ostreaminline
operator<<(const String &arg)ostreaminline
operator<<(char arg)ostreaminline
operator<<(signed char arg)ostreaminline
operator<<(unsigned char arg)ostreaminline
operator<<(double arg)ostreaminline
operator<<(float arg)ostreaminline
operator<<(short arg)ostreaminline
operator<<(unsigned short arg)ostreaminline
operator<<(int arg)ostreaminline
operator<<(unsigned int arg)ostreaminline
operator<<(long arg)ostreaminline
operator<<(unsigned long arg)ostreaminline
operator<<(long long arg)ostreaminline
operator<<(unsigned long long arg)ostreaminline
operator<<(const void *arg)ostreaminline
operator<<(const __FlashStringHelper *arg)ostreaminline
ostream() (defined in ostream)ostreaminline
outios_basestatic
pos_type typedefios_base
precision() constios_baseinline
precision(unsigned int n)ios_baseinline
put(char ch)ostreaminline
rdstate() constiosinline
rightios_basestatic
seekdir enum nameios_base
seekp(pos_type pos)ostreaminline
seekp(off_type off, seekdir way)ostreaminline
setf(fmtflags fl)ios_baseinline
setf(fmtflags fl, fmtflags mask)ios_baseinline
setstate(iostate state)iosinline
showbaseios_basestatic
showpointios_basestatic
showposios_basestatic
skipwsios_basestatic
streamsize typedefios_base
tellp()ostreaminline
truncios_basestatic
unsetf(fmtflags fl)ios_baseinline
uppercaseios_basestatic
width()ios_baseinline
width(unsigned n)ios_baseinline
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream.html deleted file mode 100644 index fb4d97c1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream.html +++ /dev/null @@ -1,2527 +0,0 @@ - - - - - - - -SdFat: ostream Class Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- -
- -
- -

Output Stream. - More...

- -

#include <ostream.h>

-
-Inheritance diagram for ostream:
-
-
Inheritance graph
- - - - - - - - - - -
[legend]
-
-Collaboration diagram for ostream:
-
-
Collaboration graph
- - - - - -
[legend]
- - - - - - - - - - - - - - - - -

-Public Types

typedef unsigned int fmtflags
 
typedef unsigned char iostate
 
typedef int32_t off_type
 
typedef uint8_t openmode
 
typedef uint32_t pos_type
 
enum  seekdir { beg, -cur, -end - }
 
typedef uint32_t streamsize
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Public Member Functions

bool bad () const
 
void clear (iostate state=goodbit)
 
bool eof () const
 
bool fail () const
 
char fill ()
 
char fill (char c)
 
fmtflags flags () const
 
fmtflags flags (fmtflags fl)
 
ostreamflush ()
 
bool good () const
 
 operator bool () const
 
 operator const void * () const
 
bool operator! () const
 
ostreamoperator<< (bool arg)
 
ostreamoperator<< (char arg)
 
ostreamoperator<< (const __FlashStringHelper *arg)
 
ostreamoperator<< (const char *arg)
 
ostreamoperator<< (const signed char *arg)
 
ostreamoperator<< (const String &arg)
 
ostreamoperator<< (const unsigned char *arg)
 
ostreamoperator<< (const void *arg)
 
ostreamoperator<< (double arg)
 
ostreamoperator<< (float arg)
 
ostreamoperator<< (int arg)
 
ostreamoperator<< (ios_base &(*pf)(ios_base &str))
 
ostreamoperator<< (long arg)
 
ostreamoperator<< (long long arg)
 
ostreamoperator<< (ostream &(*pf)(ostream &str))
 
ostreamoperator<< (short arg)
 
ostreamoperator<< (signed char arg)
 
ostreamoperator<< (unsigned char arg)
 
ostreamoperator<< (unsigned int arg)
 
ostreamoperator<< (unsigned long arg)
 
ostreamoperator<< (unsigned long long arg)
 
ostreamoperator<< (unsigned short arg)
 
int precision () const
 
int precision (unsigned int n)
 
ostreamput (char ch)
 
iostate rdstate () const
 
ostreamseekp (off_type off, seekdir way)
 
ostreamseekp (pos_type pos)
 
fmtflags setf (fmtflags fl)
 
fmtflags setf (fmtflags fl, fmtflags mask)
 
void setstate (iostate state)
 
pos_type tellp ()
 
void unsetf (fmtflags fl)
 
unsigned width ()
 
unsigned width (unsigned n)
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Static Public Attributes

static const fmtflags adjustfield = left | right | internal
 
static const openmode app = 0X4
 
static const openmode ate = 0X8
 
static const iostate badbit = 0X01
 
static const fmtflags basefield = dec | hex | oct
 
static const openmode binary = 0X10
 
static const fmtflags boolalpha = 0x0100
 
static const fmtflags dec = 0x0008
 
static const iostate eofbit = 0x02
 
static const iostate failbit = 0X04
 
static const iostate goodbit = 0x00
 
static const fmtflags hex = 0x0010
 
static const openmode in = 0X20
 
static const fmtflags internal = 0x0004
 
static const fmtflags left = 0x0001
 
static const fmtflags oct = 0x0020
 
static const openmode out = 0X40
 
static const fmtflags right = 0x0002
 
static const fmtflags showbase = 0x0200
 
static const fmtflags showpoint = 0x0400
 
static const fmtflags showpos = 0x0800
 
static const fmtflags skipws = 0x1000
 
static const openmode trunc = 0X80
 
static const fmtflags uppercase = 0x4000
 
-

Detailed Description

-

Output Stream.

-

Member Typedef Documentation

- -

◆ fmtflags

- -
-
- - - - - -
- - - - -
typedef unsigned int ios_base::fmtflags
-
-inherited
-
-

type for format flags

- -
-
- -

◆ iostate

- -
-
- - - - - -
- - - - -
typedef unsigned char ios_base::iostate
-
-inherited
-
-

typedef for iostate bitmask

- -
-
- -

◆ off_type

- -
-
- - - - - -
- - - - -
typedef int32_t ios_base::off_type
-
-inherited
-
-

type for relative seek offset

- -
-
- -

◆ openmode

- -
-
- - - - - -
- - - - -
typedef uint8_t ios_base::openmode
-
-inherited
-
-

typedef for iostream open mode

- -
-
- -

◆ pos_type

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::pos_type
-
-inherited
-
-

type for absolute seek position

- -
-
- -

◆ streamsize

- -
-
- - - - - -
- - - - -
typedef uint32_t ios_base::streamsize
-
-inherited
-
-

unsigned size that can represent maximum file size. (violates spec - should be signed)

- -
-
-

Member Enumeration Documentation

- -

◆ seekdir

- -
-
- - - - - -
- - - - -
enum ios_base::seekdir
-
-inherited
-
-

enumerated type for the direction of relative seeks

- - - - -
Enumerator
beg 

seek relative to the beginning of the stream

-
cur 

seek relative to the current stream position

-
end 

seek relative to the end of the stream

-
- -
-
-

Member Function Documentation

- -

◆ bad()

- -
-
- - - - - -
- - - - - - - -
bool ios::bad () const
-
-inlineinherited
-
-
Returns
true if bad bit is set else false.
- -
-
- -

◆ clear()

- -
-
- - - - - -
- - - - - - - - -
void ios::clear (iostate state = goodbit)
-
-inlineinherited
-
-

Clear iostate bits.

-
Parameters
- - -
[in]stateThe flags you want to set after clearing all flags.
-
-
- -
-
- -

◆ eof()

- -
-
- - - - - -
- - - - - - - -
bool ios::eof () const
-
-inlineinherited
-
-
Returns
true if end of file has been reached else false.
-

Warning: An empty file returns false before the first read.

-

Moral: eof() is only useful in combination with fail(), to find out whether EOF was the cause for failure

- -
-
- -

◆ fail()

- -
-
- - - - - -
- - - - - - - -
bool ios::fail () const
-
-inlineinherited
-
-
Returns
true if any iostate bit other than eof are set else false.
- -
-
- -

◆ fill() [1/2]

- -
-
- - - - - -
- - - - - - - -
char ios_base::fill ()
-
-inlineinherited
-
-
Returns
fill character
- -
-
- -

◆ fill() [2/2]

- -
-
- - - - - -
- - - - - - - - -
char ios_base::fill (char c)
-
-inlineinherited
-
-

Set fill character

Parameters
- - -
[in]cnew fill character
-
-
-
Returns
old fill character
- -
-
- -

◆ flags() [1/2]

- -
-
- - - - - -
- - - - - - - -
fmtflags ios_base::flags () const
-
-inlineinherited
-
-
Returns
format flags
- -
-
- -

◆ flags() [2/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::flags (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flag
-
-
-
Returns
old flags
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - -
ostream& ostream::flush ()
-
-inline
-
-

Flushes the buffer associated with this stream. The flush function calls the sync function of the associated file.

Returns
A reference to the ostream object.
- -
-
- -

◆ good()

- -
-
- - - - - -
- - - - - - - -
bool ios::good () const
-
-inlineinherited
-
-
Returns
True if no iostate flags are set else false.
- -
-
- -

◆ operator bool()

- -
-
- - - - - -
- - - - - - - -
ios::operator bool () const
-
-inlineexplicitinherited
-
-
Returns
false if fail() else true.
-
- -
-
- -

◆ operator const void *()

- -
-
- - - - - -
- - - - - - - -
ios::operator const void * () const
-
-inlineinherited
-
-
Returns
null pointer if fail() is true.
- -
-
- -

◆ operator!()

- -
-
- - - - - -
- - - - - - - -
bool ios::operator! () const
-
-inlineinherited
-
-
Returns
true if fail() else false.
-
- -
-
- -

◆ operator<<() [1/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (bool arg)
-
-inline
-
-

Output bool

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (char arg)
-
-inline
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const __FlashStringHelper * arg)
-
-inline
-
-

Output a string from flash using the Arduino F() macro.

Parameters
- - -
[in]argpointing to flash string
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [4/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const char * arg)
-
-inline
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [5/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const signed char * arg)
-
-inline
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [6/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const String & arg)
-
-inline
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [7/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const unsigned char * arg)
-
-inline
-
-

Output string

Parameters
- - -
[in]argstring to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [8/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (const void * arg)
-
-inline
-
-

Output pointer

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [9/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (double arg)
-
-inline
-
-

Output double

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [10/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (float arg)
-
-inline
-
-

Output float

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [11/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (int arg)
-
-inline
-
-

Output signed int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [12/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ios_base &(*)(ios_base &str) pf)
-
-inline
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [13/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long arg)
-
-inline
-
-

Output signed long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [14/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (long long arg)
-
-inline
-
-

Output signed long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [15/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (ostream &(*)(ostream &str) pf)
-
-inline
-
-

call manipulator

Parameters
- - -
[in]pffunction to call
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [16/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (short arg)
-
-inline
-
-

Output signed short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [17/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (signed char arg)
-
-inline
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [18/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned char arg)
-
-inline
-
-

Output character

Parameters
- - -
[in]argcharacter to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [19/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned int arg)
-
-inline
-
-

Output unsigned int

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [20/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long arg)
-
-inline
-
-

Output unsigned long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [21/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned long long arg)
-
-inline
-
-

Output unsigned long long

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [22/22]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::operator<< (unsigned short arg)
-
-inline
-
-

Output unsigned short

Parameters
- - -
[in]argvalue to output
-
-
-
Returns
the stream
- -
-
- -

◆ precision() [1/2]

- -
-
- - - - - -
- - - - - - - -
int ios_base::precision () const
-
-inlineinherited
-
-
Returns
precision
- -
-
- -

◆ precision() [2/2]

- -
-
- - - - - -
- - - - - - - - -
int ios_base::precision (unsigned int n)
-
-inlineinherited
-
-

set precision

Parameters
- - -
[in]nnew precision
-
-
-
Returns
old precision
- -
-
- -

◆ put()

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::put (char ch)
-
-inline
-
-

Puts a character in a stream.

-

The unformatted output function inserts the element ch. It returns *this.

-
Parameters
- - -
[in]chThe character
-
-
-
Returns
A reference to the ostream object.
- -
-
- -

◆ rdstate()

- -
-
- - - - - -
- - - - - - - -
iostate ios::rdstate () const
-
-inlineinherited
-
-
Returns
The iostate flags for this file.
- -
-
- -

◆ seekp() [1/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& ostream::seekp (off_type off,
seekdir way 
)
-
-inline
-
-

Set the stream position.

-
Parameters
- - - -
[in]offAn offset to move the write pointer relative to way. off is a signed 32-bit int so the offset is limited to +- 2GB.
[in]wayOne of ios::beg, ios::cur, or ios::end.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ seekp() [2/2]

- -
-
- - - - - -
- - - - - - - - -
ostream& ostream::seekp (pos_type pos)
-
-inline
-
-

Set the stream position

Parameters
- - -
[in]posThe absolute position in which to move the write pointer.
-
-
-
Returns
Is always *this. Failure is indicated by the state of *this.
- -
-
- -

◆ setf() [1/2]

- -
-
- - - - - -
- - - - - - - - -
fmtflags ios_base::setf (fmtflags fl)
-
-inlineinherited
-
-

set format flags

Parameters
- - -
[in]flnew flags to be or'ed in
-
-
-
Returns
old flags
- -
-
- -

◆ setf() [2/2]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
fmtflags ios_base::setf (fmtflags fl,
fmtflags mask 
)
-
-inlineinherited
-
-

modify format flags

Parameters
- - - -
[in]maskflags to be removed
[in]flflags to be set after mask bits have been cleared
-
-
-
Returns
old flags
- -
-
- -

◆ setstate()

- -
-
- - - - - -
- - - - - - - - -
void ios::setstate (iostate state)
-
-inlineinherited
-
-

Set iostate bits.

-
Parameters
- - -
[in]stateBitts to set.
-
-
- -
-
- -

◆ tellp()

- -
-
- - - - - -
- - - - - - - -
pos_type ostream::tellp ()
-
-inline
-
-
Returns
the stream position
- -
-
- -

◆ unsetf()

- -
-
- - - - - -
- - - - - - - - -
void ios_base::unsetf (fmtflags fl)
-
-inlineinherited
-
-

clear format flags

Parameters
- - -
[in]flflags to be cleared
-
-
- -
-
- -

◆ width() [1/2]

- -
-
- - - - - -
- - - - - - - -
unsigned ios_base::width ()
-
-inlineinherited
-
-
Returns
width
- -
-
- -

◆ width() [2/2]

- -
-
- - - - - -
- - - - - - - - -
unsigned ios_base::width (unsigned n)
-
-inlineinherited
-
-

set width

Parameters
- - -
[in]nnew width
-
-
-
Returns
old width
- -
-
-

Member Data Documentation

- -

◆ adjustfield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::adjustfield = left | right | internal
-
-staticinherited
-
-

mask for adjustfield

- -
-
- -

◆ app

- -
-
- - - - - -
- - - - -
const openmode ios_base::app = 0X4
-
-staticinherited
-
-

seek to end before each write

- -
-
- -

◆ ate

- -
-
- - - - - -
- - - - -
const openmode ios_base::ate = 0X8
-
-staticinherited
-
-

open and seek to end immediately after opening

- -
-
- -

◆ badbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::badbit = 0X01
-
-staticinherited
-
-

iostate bad bit for a nonrecoverable error.

- -
-
- -

◆ basefield

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::basefield = dec | hex | oct
-
-staticinherited
-
-

mask for basefield

- -
-
- -

◆ binary

- -
-
- - - - - -
- - - - -
const openmode ios_base::binary = 0X10
-
-staticinherited
-
-

perform input and output in binary mode (as opposed to text mode)

- -
-
- -

◆ boolalpha

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::boolalpha = 0x0100
-
-staticinherited
-
-

use strings true/false for bool

- -
-
- -

◆ dec

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::dec = 0x0008
-
-staticinherited
-
-

base 10 flag

- -
-
- -

◆ eofbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::eofbit = 0x02
-
-staticinherited
-
-

iostate bit for end of file reached

- -
-
- -

◆ failbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::failbit = 0X04
-
-staticinherited
-
-

iostate fail bit for nonfatal error

- -
-
- -

◆ goodbit

- -
-
- - - - - -
- - - - -
const iostate ios_base::goodbit = 0x00
-
-staticinherited
-
-

iostate for no flags

- -
-
- -

◆ hex

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::hex = 0x0010
-
-staticinherited
-
-

base 16 flag

- -
-
- -

◆ in

- -
-
- - - - - -
- - - - -
const openmode ios_base::in = 0X20
-
-staticinherited
-
-

open for input

- -
-
- -

◆ internal

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::internal = 0x0004
-
-staticinherited
-
-

fill between sign/base prefix and number

- -
-
- -

◆ left

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::left = 0x0001
-
-staticinherited
-
-

left adjust fields

- -
-
- -

◆ oct

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::oct = 0x0020
-
-staticinherited
-
-

base 8 flag

- -
-
- -

◆ out

- -
-
- - - - - -
- - - - -
const openmode ios_base::out = 0X40
-
-staticinherited
-
-

open for output

- -
-
- -

◆ right

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::right = 0x0002
-
-staticinherited
-
-

right adjust fields

- -
-
- -

◆ showbase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showbase = 0x0200
-
-staticinherited
-
-

use prefix 0X for hex and 0 for oct

- -
-
- -

◆ showpoint

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpoint = 0x0400
-
-staticinherited
-
-

always show '.' for floating numbers

- -
-
- -

◆ showpos

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::showpos = 0x0800
-
-staticinherited
-
-

show + sign for nonnegative numbers

- -
-
- -

◆ skipws

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::skipws = 0x1000
-
-staticinherited
-
-

skip initial white space

- -
-
- -

◆ trunc

- -
-
- - - - - -
- - - - -
const openmode ios_base::trunc = 0X80
-
-staticinherited
-
-

truncate an existing stream when opening

- -
-
- -

◆ uppercase

- -
-
- - - - - -
- - - - -
const fmtflags ios_base::uppercase = 0x4000
-
-staticinherited
-
-

use uppercase letters in number representations

- -
-
-
The documentation for this class was generated from the following files:
    -
  • Arduino/libraries/SdFat/src/iostream/ostream.h
  • -
  • Arduino/libraries/SdFat/src/iostream/ostream.cpp
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__coll__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__coll__graph.png deleted file mode 100644 index 361df37d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__coll__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__inherit__graph.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__inherit__graph.png deleted file mode 100644 index e83f4076..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/classostream__inherit__graph.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/closed.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/closed.png deleted file mode 100644 index 98cc2c90..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/closed.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000004_000009.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000004_000009.html deleted file mode 100644 index ff4d397a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000004_000009.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src -> iostream Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

src → iostream Relation

File in Arduino/libraries/SdFat/srcIncludes file in Arduino/libraries/SdFat/src/iostream
sdios.hArduinoStream.h
sdios.hfstream.h
sdios.hStdioStream.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000006_000005.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000006_000005.html deleted file mode 100644 index 370f8ad5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000006_000005.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/ExFatLib -> common Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

ExFatLib → common Relation

File in Arduino/libraries/SdFat/src/ExFatLibIncludes file in Arduino/libraries/SdFat/src/common
ExFatFormatter.hSysCall.h
ExFatPartition.hSysCall.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000007_000005.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000007_000005.html deleted file mode 100644 index 4b481922..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000007_000005.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib -> common Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

FatLib → common Relation

File in Arduino/libraries/SdFat/src/FatLibIncludes file in Arduino/libraries/SdFat/src/common
FatFormatter.hSysCall.h
FatPartition.hSysCall.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000009_000008.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000009_000008.html deleted file mode 100644 index 8deee93b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000009_000008.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream -> FsLib Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

iostream → FsLib Relation

File in Arduino/libraries/SdFat/src/iostreamIncludes file in Arduino/libraries/SdFat/src/FsLib
ios.hFsLib.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000005.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000005.html deleted file mode 100644 index 39ed57fe..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000005.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdCard -> common Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

SdCard → common Relation

File in Arduino/libraries/SdFat/src/SdCardIncludes file in Arduino/libraries/SdFat/src/common
SdCardInfo.hSysCall.h
SdCardInterface.hBlockDeviceInterface.h
SdioCard.hSysCall.h
SdSpiCard.hSysCall.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000011.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000011.html deleted file mode 100644 index a20faf38..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000010_000011.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdCard -> SpiDriver Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

SdCard → SpiDriver Relation

File in Arduino/libraries/SdFat/src/SdCardIncludes file in Arduino/libraries/SdFat/src/SpiDriver
SdSpiCard.hSdSpiDriver.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000011_000005.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000011_000005.html deleted file mode 100644 index afadbe75..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_000011_000005.html +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver -> common Relation - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-

SpiDriver → common Relation

File in Arduino/libraries/SdFat/src/SpiDriverIncludes file in Arduino/libraries/SdFat/src/common
SdSpiDriver.hSysCall.h
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f.html deleted file mode 100644 index a27ea57d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
iostream Directory Reference
-
-
-
-Directory dependency graph for iostream:
-
-
Arduino/libraries/SdFat/src/iostream
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - -

-Files

file  ArduinoStream.h
 ArduinoInStream and ArduinoOutStream classes.
 
file  bufstream.h
 ibufstream and obufstream classes
 
file  fstream.h
 iostreams for files.
 
file  ios.h
 ios_base and ios classes
 
file  iostream.h
 iostream class
 
file  istream.h
 istream class
 
file  ostream.h
 ostream class
 
file  StdioStream.h
 StdioStream class.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f_dep.png deleted file mode 100644 index 15c81729..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_05631d2e79636c8b95a1e5d165caf51f_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf.html deleted file mode 100644 index c247c4c6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf.html +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
SdFat Directory Reference
-
-
-
-Directory dependency graph for SdFat:
-
-
Arduino/libraries/SdFat
- - - - - - -
- - -

-Directories

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png deleted file mode 100644 index 4e8b76ac..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_1281b15c327061056ab3b326e90c50cf_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160.html deleted file mode 100644 index 8d061292..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
libraries Directory Reference
-
-
-
-Directory dependency graph for libraries:
-
-
Arduino/libraries
- - - - - -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png deleted file mode 100644 index c1c42499..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_481cc946b8a81b8d9363a4aad6201160_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_4944048bb6fb9e219242a59a3faf7f85.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_4944048bb6fb9e219242a59a3faf7f85.html deleted file mode 100644 index a625c40a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_4944048bb6fb9e219242a59a3faf7f85.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/doc Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
doc Directory Reference
-
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a.html deleted file mode 100644 index 2a824b4a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/ExFatLib Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
ExFatLib Directory Reference
-
-
-
-Directory dependency graph for ExFatLib:
-
-
Arduino/libraries/SdFat/src/ExFatLib
- - - - - - -
- - - - - - - - -

-Files

file  ExFatFile.h
 ExFatFile class.
 
file  ExFatPartition.h
 ExFatPartition include file.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a_dep.png deleted file mode 100644 index 274fa690..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_6ad57a83f04f6188f18545163430419a_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a.html deleted file mode 100644 index bf9d1643..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a.html +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SpiDriver Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
SpiDriver Directory Reference
-
-
-
-Directory dependency graph for SpiDriver:
-
-
Arduino/libraries/SdFat/src/SpiDriver
- - - - - - -
- - - - - - - - - - - - - - - - - -

-Files

file  SdSpiArduinoDriver.h
 SpiDriver classes for Arduino compatible systems.
 
file  SdSpiBaseClass.h
 Base class for external SPI driver.
 
file  SdSpiDriver.h
 SpiDriver classes.
 
file  SdSpiLibDriver.h
 Class using only simple SPI library functions.
 
file  SdSpiSoftDriver.h
 Class for software SPI.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a_dep.png deleted file mode 100644 index d38032c9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_72a7f5d5cdfff657f3dd19b69595124a_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f.html deleted file mode 100644 index 3a738eff..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f.html +++ /dev/null @@ -1,107 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FatLib Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
FatLib Directory Reference
-
-
-
-Directory dependency graph for FatLib:
-
-
Arduino/libraries/SdFat/src/FatLib
- - - - - - -
- - - - - - - - - - - - - - -

-Files

file  FatFile.h
 FatFile class.
 
file  FatLibConfig.h
 configuration definitions
 
file  FatPartition.h
 FatPartition class.
 
file  FatVolume.h
 FatVolume class.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f_dep.png deleted file mode 100644 index 826801b9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_7e472674a7b7d2590a789f197241f95f_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_954f1cc1f567c84d567c4e2ef94e5c23.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_954f1cc1f567c84d567c4e2ef94e5c23.html deleted file mode 100644 index 549a9ebb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_954f1cc1f567c84d567c4e2ef94e5c23.html +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/FsLib Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
FsLib Directory Reference
-
-
- - - - - - - - - - - -

-Files

file  FsFile.h
 FsBaseFile include file.
 
file  FsLib.h
 FsLib include file.
 
file  FsVolume.h
 FsVolume include file.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480.html deleted file mode 100644 index b29efa93..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/SdCard Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
SdCard Directory Reference
-
-
-
-Directory dependency graph for SdCard:
-
-
Arduino/libraries/SdFat/src/SdCard
- - - - - - - - - -
- - - - - -

-Files

file  SdSpiCard.h
 SdSpiCard class for V2 SD/SDHC cards.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480_dep.png deleted file mode 100644 index 9d9db67d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a70af2fb8f1edf8b7124f41d82dbf480_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2.html deleted file mode 100644 index f6467ec3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - -SdFat: Arduino Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
Arduino Directory Reference
-
-
-
-Directory dependency graph for Arduino:
-
-
Arduino
- - - - -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png deleted file mode 100644 index d3e87478..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_a991eec27578c865874ede3d8ec657c2_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e.html deleted file mode 100644 index 8399cda4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
src Directory Reference
-
-
-
-Directory dependency graph for src:
-
-
Arduino/libraries/SdFat/src
- - - - - - - - - - - - - - - - - - -
- - -

-Directories

- - - - - - - - - - - - - - - - - - - -

-Files

file  BufferedPrint.h
 Fast buffered print.
 
file  FreeStack.h
 FreeStack() function.
 
file  MinimumSerial.h
 Minimal AVR Serial driver.
 
file  SdFat.h
 main SdFs include file.
 
file  SdFatConfig.h
 configuration definitions
 
file  sdios.h
 C++ IO Streams features.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e_dep.png deleted file mode 100644 index 4caaf07b..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_c18d6c86f7b0afecac5c3a8a9885031e_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf.html deleted file mode 100644 index 13a3635a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/common Directory Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
-
-
common Directory Reference
-
-
-
-Directory dependency graph for common:
-
-
Arduino/libraries/SdFat/src/common
- - - - -
- - - - - - - - - - - -

-Files

file  BlockDeviceInterface.h
 BlockDeviceInterface include file.
 
file  PrintTemplates.h
 templates for printf
 
file  SysCall.h
 SysCall class.
 
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf_dep.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf_dep.png deleted file mode 100644 index 54011a26..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dir_f9735b46fbe6c50afc1ee0ea5d409dcf_dep.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doc.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doc.png deleted file mode 100644 index 17edabff..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doc.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.css b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.css deleted file mode 100644 index 5bc13aac..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.css +++ /dev/null @@ -1,1766 +0,0 @@ -/* The standard CSS for doxygen 1.8.16 */ - -body, table, div, p, dl { - font: 400 14px/22px Roboto,sans-serif; -} - -p.reference, p.definition { - font: 400 14px/22px Roboto,sans-serif; -} - -/* @group Heading Levels */ - -h1.groupheader { - font-size: 150%; -} - -.title { - font: 400 14px/28px Roboto,sans-serif; - font-size: 150%; - font-weight: bold; - margin: 10px 2px; -} - -h2.groupheader { - border-bottom: 1px solid #879ECB; - color: #354C7B; - font-size: 150%; - font-weight: normal; - margin-top: 1.75em; - padding-top: 8px; - padding-bottom: 4px; - width: 100%; -} - -h3.groupheader { - font-size: 100%; -} - -h1, h2, h3, h4, h5, h6 { - -webkit-transition: text-shadow 0.5s linear; - -moz-transition: text-shadow 0.5s linear; - -ms-transition: text-shadow 0.5s linear; - -o-transition: text-shadow 0.5s linear; - transition: text-shadow 0.5s linear; - margin-right: 15px; -} - -h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { - text-shadow: 0 0 15px cyan; -} - -dt { - font-weight: bold; -} - -ul.multicol { - -moz-column-gap: 1em; - -webkit-column-gap: 1em; - column-gap: 1em; - -moz-column-count: 3; - -webkit-column-count: 3; - column-count: 3; -} - -p.startli, p.startdd { - margin-top: 2px; -} - -p.starttd { - margin-top: 0px; -} - -p.endli { - margin-bottom: 0px; -} - -p.enddd { - margin-bottom: 4px; -} - -p.endtd { - margin-bottom: 2px; -} - -p.interli { -} - -p.interdd { -} - -p.intertd { -} - -/* @end */ - -caption { - font-weight: bold; -} - -span.legend { - font-size: 70%; - text-align: center; -} - -h3.version { - font-size: 90%; - text-align: center; -} - -div.qindex, div.navtab{ - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; -} - -div.qindex, div.navpath { - width: 100%; - line-height: 140%; -} - -div.navtab { - margin-right: 15px; -} - -/* @group Link Styling */ - -a { - color: #3D578C; - font-weight: normal; - text-decoration: none; -} - -.contents a:visited { - color: #4665A2; -} - -a:hover { - text-decoration: underline; -} - -a.qindex { - font-weight: bold; -} - -a.qindexHL { - font-weight: bold; - background-color: #9CAFD4; - color: #FFFFFF; - border: 1px double #869DCA; -} - -.contents a.qindexHL:visited { - color: #FFFFFF; -} - -a.el { - font-weight: bold; -} - -a.elRef { -} - -a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; -} - -a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; -} - -/* @end */ - -dl.el { - margin-left: -1cm; -} - -ul { - overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ -} - -#side-nav ul { - overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ -} - -#main-nav ul { - overflow: visible; /* reset ul rule for the navigation bar drop down lists */ -} - -.fragment { - text-align: left; - direction: ltr; - overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ - overflow-y: hidden; -} - -pre.fragment { - border: 1px solid #C4CFE5; - background-color: #FBFCFD; - padding: 4px 6px; - margin: 4px 8px 4px 2px; - overflow: auto; - word-wrap: break-word; - font-size: 9pt; - line-height: 125%; - font-family: monospace, fixed; - font-size: 105%; -} - -div.fragment { - padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ - margin: 4px 8px 4px 2px; - background-color: #FBFCFD; - border: 1px solid #C4CFE5; -} - -div.line { - font-family: monospace, fixed; - font-size: 13px; - min-height: 13px; - line-height: 1.0; - text-wrap: unrestricted; - white-space: -moz-pre-wrap; /* Moz */ - white-space: -pre-wrap; /* Opera 4-6 */ - white-space: -o-pre-wrap; /* Opera 7 */ - white-space: pre-wrap; /* CSS3 */ - word-wrap: break-word; /* IE 5.5+ */ - text-indent: -53px; - padding-left: 53px; - padding-bottom: 0px; - margin: 0px; - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -div.line:after { - content:"\000A"; - white-space: pre; -} - -div.line.glow { - background-color: cyan; - box-shadow: 0 0 10px cyan; -} - - -span.lineno { - padding-right: 4px; - text-align: right; - border-right: 2px solid #0F0; - background-color: #E8E8E8; - white-space: pre; -} -span.lineno a { - background-color: #D8D8D8; -} - -span.lineno a:hover { - background-color: #C8C8C8; -} - -.lineno { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -div.ah, span.ah { - background-color: black; - font-weight: bold; - color: #FFFFFF; - margin-bottom: 3px; - margin-top: 3px; - padding: 0.2em; - border: solid thin #333; - border-radius: 0.5em; - -webkit-border-radius: .5em; - -moz-border-radius: .5em; - box-shadow: 2px 2px 3px #999; - -webkit-box-shadow: 2px 2px 3px #999; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); - background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); -} - -div.classindex ul { - list-style: none; - padding-left: 0; -} - -div.classindex span.ai { - display: inline-block; -} - -div.groupHeader { - margin-left: 16px; - margin-top: 12px; - font-weight: bold; -} - -div.groupText { - margin-left: 16px; - font-style: italic; -} - -body { - background-color: white; - color: black; - margin: 0; -} - -div.contents { - margin-top: 10px; - margin-left: 12px; - margin-right: 8px; -} - -td.indexkey { - background-color: #EBEFF6; - font-weight: bold; - border: 1px solid #C4CFE5; - margin: 2px 0px 2px 0; - padding: 2px 10px; - white-space: nowrap; - vertical-align: top; -} - -td.indexvalue { - background-color: #EBEFF6; - border: 1px solid #C4CFE5; - padding: 2px 10px; - margin: 2px 0px; -} - -tr.memlist { - background-color: #EEF1F7; -} - -p.formulaDsp { - text-align: center; -} - -img.formulaDsp { - -} - -img.formulaInl, img.inline { - vertical-align: middle; -} - -div.center { - text-align: center; - margin-top: 0px; - margin-bottom: 0px; - padding: 0px; -} - -div.center img { - border: 0px; -} - -address.footer { - text-align: right; - padding-right: 12px; -} - -img.footer { - border: 0px; - vertical-align: middle; -} - -/* @group Code Colorization */ - -span.keyword { - color: #008000 -} - -span.keywordtype { - color: #604020 -} - -span.keywordflow { - color: #e08000 -} - -span.comment { - color: #800000 -} - -span.preprocessor { - color: #806020 -} - -span.stringliteral { - color: #002080 -} - -span.charliteral { - color: #008080 -} - -span.vhdldigit { - color: #ff00ff -} - -span.vhdlchar { - color: #000000 -} - -span.vhdlkeyword { - color: #700070 -} - -span.vhdllogic { - color: #ff0000 -} - -blockquote { - background-color: #F7F8FB; - border-left: 2px solid #9CAFD4; - margin: 0 24px 0 4px; - padding: 0 12px 0 16px; -} - -blockquote.DocNodeRTL { - border-left: 0; - border-right: 2px solid #9CAFD4; - margin: 0 4px 0 24px; - padding: 0 16px 0 12px; -} - -/* @end */ - -/* -.search { - color: #003399; - font-weight: bold; -} - -form.search { - margin-bottom: 0px; - margin-top: 0px; -} - -input.search { - font-size: 75%; - color: #000080; - font-weight: normal; - background-color: #e8eef2; -} -*/ - -td.tiny { - font-size: 75%; -} - -.dirtab { - padding: 4px; - border-collapse: collapse; - border: 1px solid #A3B4D7; -} - -th.dirtab { - background: #EBEFF6; - font-weight: bold; -} - -hr { - height: 0px; - border: none; - border-top: 1px solid #4A6AAA; -} - -hr.footer { - height: 1px; -} - -/* @group Member Descriptions */ - -table.memberdecls { - border-spacing: 0px; - padding: 0px; -} - -.memberdecls td, .fieldtable tr { - -webkit-transition-property: background-color, box-shadow; - -webkit-transition-duration: 0.5s; - -moz-transition-property: background-color, box-shadow; - -moz-transition-duration: 0.5s; - -ms-transition-property: background-color, box-shadow; - -ms-transition-duration: 0.5s; - -o-transition-property: background-color, box-shadow; - -o-transition-duration: 0.5s; - transition-property: background-color, box-shadow; - transition-duration: 0.5s; -} - -.memberdecls td.glow, .fieldtable tr.glow { - background-color: cyan; - box-shadow: 0 0 15px cyan; -} - -.mdescLeft, .mdescRight, -.memItemLeft, .memItemRight, -.memTemplItemLeft, .memTemplItemRight, .memTemplParams { - background-color: #F9FAFC; - border: none; - margin: 4px; - padding: 1px 0 0 8px; -} - -.mdescLeft, .mdescRight { - padding: 0px 8px 4px 8px; - color: #555; -} - -.memSeparator { - border-bottom: 1px solid #DEE4F0; - line-height: 1px; - margin: 0px; - padding: 0px; -} - -.memItemLeft, .memTemplItemLeft { - white-space: nowrap; -} - -.memItemRight { - width: 100%; -} - -.memTemplParams { - color: #4665A2; - white-space: nowrap; - font-size: 80%; -} - -/* @end */ - -/* @group Member Details */ - -/* Styles for detailed member documentation */ - -.memtitle { - padding: 8px; - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - border-top-right-radius: 4px; - border-top-left-radius: 4px; - margin-bottom: -1px; - background-image: url('nav_f.png'); - background-repeat: repeat-x; - background-color: #E2E8F2; - line-height: 1.25; - font-weight: 300; - float:left; -} - -.permalink -{ - font-size: 65%; - display: inline-block; - vertical-align: middle; -} - -.memtemplate { - font-size: 80%; - color: #4665A2; - font-weight: normal; - margin-left: 9px; -} - -.memnav { - background-color: #EBEFF6; - border: 1px solid #A3B4D7; - text-align: center; - margin: 2px; - margin-right: 15px; - padding: 2px; -} - -.mempage { - width: 100%; -} - -.memitem { - padding: 0; - margin-bottom: 10px; - margin-right: 5px; - -webkit-transition: box-shadow 0.5s linear; - -moz-transition: box-shadow 0.5s linear; - -ms-transition: box-shadow 0.5s linear; - -o-transition: box-shadow 0.5s linear; - transition: box-shadow 0.5s linear; - display: table !important; - width: 100%; -} - -.memitem.glow { - box-shadow: 0 0 15px cyan; -} - -.memname { - font-weight: 400; - margin-left: 6px; -} - -.memname td { - vertical-align: bottom; -} - -.memproto, dl.reflist dt { - border-top: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 0px 6px 0px; - color: #253555; - font-weight: bold; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - background-color: #DFE5F1; - /* opera specific markup */ - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - border-top-right-radius: 4px; - /* firefox specific markup */ - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - -moz-border-radius-topright: 4px; - /* webkit specific markup */ - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - -webkit-border-top-right-radius: 4px; - -} - -.overload { - font-family: "courier new",courier,monospace; - font-size: 65%; -} - -.memdoc, dl.reflist dd { - border-bottom: 1px solid #A8B8D9; - border-left: 1px solid #A8B8D9; - border-right: 1px solid #A8B8D9; - padding: 6px 10px 2px 10px; - background-color: #FBFCFD; - border-top-width: 0; - background-image:url('nav_g.png'); - background-repeat:repeat-x; - background-color: #FFFFFF; - /* opera specific markup */ - border-bottom-left-radius: 4px; - border-bottom-right-radius: 4px; - box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); - /* firefox specific markup */ - -moz-border-radius-bottomleft: 4px; - -moz-border-radius-bottomright: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; - /* webkit specific markup */ - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -dl.reflist dt { - padding: 5px; -} - -dl.reflist dd { - margin: 0px 0px 10px 0px; - padding: 5px; -} - -.paramkey { - text-align: right; -} - -.paramtype { - white-space: nowrap; -} - -.paramname { - color: #602020; - white-space: nowrap; -} -.paramname em { - font-style: normal; -} -.paramname code { - line-height: 14px; -} - -.params, .retval, .exception, .tparams { - margin-left: 0px; - padding-left: 0px; -} - -.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { - font-weight: bold; - vertical-align: top; -} - -.params .paramtype, .tparams .paramtype { - font-style: italic; - vertical-align: top; -} - -.params .paramdir, .tparams .paramdir { - font-family: "courier new",courier,monospace; - vertical-align: top; -} - -table.mlabels { - border-spacing: 0px; -} - -td.mlabels-left { - width: 100%; - padding: 0px; -} - -td.mlabels-right { - vertical-align: bottom; - padding: 0px; - white-space: nowrap; -} - -span.mlabels { - margin-left: 8px; -} - -span.mlabel { - background-color: #728DC1; - border-top:1px solid #5373B4; - border-left:1px solid #5373B4; - border-right:1px solid #C4CFE5; - border-bottom:1px solid #C4CFE5; - text-shadow: none; - color: white; - margin-right: 4px; - padding: 2px 3px; - border-radius: 3px; - font-size: 7pt; - white-space: nowrap; - vertical-align: middle; -} - - - -/* @end */ - -/* these are for tree view inside a (index) page */ - -div.directory { - margin: 10px 0px; - border-top: 1px solid #9CAFD4; - border-bottom: 1px solid #9CAFD4; - width: 100%; -} - -.directory table { - border-collapse:collapse; -} - -.directory td { - margin: 0px; - padding: 0px; - vertical-align: top; -} - -.directory td.entry { - white-space: nowrap; - padding-right: 6px; - padding-top: 3px; -} - -.directory td.entry a { - outline:none; -} - -.directory td.entry a img { - border: none; -} - -.directory td.desc { - width: 100%; - padding-left: 6px; - padding-right: 6px; - padding-top: 3px; - border-left: 1px solid rgba(0,0,0,0.05); -} - -.directory tr.even { - padding-left: 6px; - background-color: #F7F8FB; -} - -.directory img { - vertical-align: -30%; -} - -.directory .levels { - white-space: nowrap; - width: 100%; - text-align: right; - font-size: 9pt; -} - -.directory .levels span { - cursor: pointer; - padding-left: 2px; - padding-right: 2px; - color: #3D578C; -} - -.arrow { - color: #9CAFD4; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - font-size: 80%; - display: inline-block; - width: 16px; - height: 22px; -} - -.icon { - font-family: Arial, Helvetica; - font-weight: bold; - font-size: 12px; - height: 14px; - width: 16px; - display: inline-block; - background-color: #728DC1; - color: white; - text-align: center; - border-radius: 4px; - margin-left: 2px; - margin-right: 2px; -} - -.icona { - width: 24px; - height: 22px; - display: inline-block; -} - -.iconfopen { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderopen.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.iconfclosed { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('folderclosed.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -.icondoc { - width: 24px; - height: 18px; - margin-bottom: 4px; - background-image:url('doc.png'); - background-position: 0px -4px; - background-repeat: repeat-y; - vertical-align:top; - display: inline-block; -} - -table.directory { - font: 400 14px Roboto,sans-serif; -} - -/* @end */ - -div.dynheader { - margin-top: 8px; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -address { - font-style: normal; - color: #2A3D61; -} - -table.doxtable caption { - caption-side: top; -} - -table.doxtable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.doxtable td, table.doxtable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.doxtable th { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -table.fieldtable { - /*width: 100%;*/ - margin-bottom: 10px; - border: 1px solid #A8B8D9; - border-spacing: 0px; - -moz-border-radius: 4px; - -webkit-border-radius: 4px; - border-radius: 4px; - -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; - -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); - box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); -} - -.fieldtable td, .fieldtable th { - padding: 3px 7px 2px; -} - -.fieldtable td.fieldtype, .fieldtable td.fieldname { - white-space: nowrap; - border-right: 1px solid #A8B8D9; - border-bottom: 1px solid #A8B8D9; - vertical-align: top; -} - -.fieldtable td.fieldname { - padding-top: 3px; -} - -.fieldtable td.fielddoc { - border-bottom: 1px solid #A8B8D9; - /*width: 100%;*/ -} - -.fieldtable td.fielddoc p:first-child { - margin-top: 0px; -} - -.fieldtable td.fielddoc p:last-child { - margin-bottom: 2px; -} - -.fieldtable tr:last-child td { - border-bottom: none; -} - -.fieldtable th { - background-image:url('nav_f.png'); - background-repeat:repeat-x; - background-color: #E2E8F2; - font-size: 90%; - color: #253555; - padding-bottom: 4px; - padding-top: 5px; - text-align:left; - font-weight: 400; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - border-bottom: 1px solid #A8B8D9; -} - - -.tabsearch { - top: 0px; - left: 10px; - height: 36px; - background-image: url('tab_b.png'); - z-index: 101; - overflow: hidden; - font-size: 13px; -} - -.navpath ul -{ - font-size: 11px; - background-image:url('tab_b.png'); - background-repeat:repeat-x; - background-position: 0 -5px; - height:30px; - line-height:30px; - color:#8AA0CC; - border:solid 1px #C2CDE4; - overflow:hidden; - margin:0px; - padding:0px; -} - -.navpath li -{ - list-style-type:none; - float:left; - padding-left:10px; - padding-right:15px; - background-image:url('bc_s.png'); - background-repeat:no-repeat; - background-position:right; - color:#364D7C; -} - -.navpath li.navelem a -{ - height:32px; - display:block; - text-decoration: none; - outline: none; - color: #283A5D; - font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; - text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); - text-decoration: none; -} - -.navpath li.navelem a:hover -{ - color:#6884BD; -} - -.navpath li.footer -{ - list-style-type:none; - float:right; - padding-left:10px; - padding-right:15px; - background-image:none; - background-repeat:no-repeat; - background-position:right; - color:#364D7C; - font-size: 8pt; -} - - -div.summary -{ - float: right; - font-size: 8pt; - padding-right: 5px; - width: 50%; - text-align: right; -} - -div.summary a -{ - white-space: nowrap; -} - -table.classindex -{ - margin: 10px; - white-space: nowrap; - margin-left: 3%; - margin-right: 3%; - width: 94%; - border: 0; - border-spacing: 0; - padding: 0; -} - -div.ingroups -{ - font-size: 8pt; - width: 50%; - text-align: left; -} - -div.ingroups a -{ - white-space: nowrap; -} - -div.header -{ - background-image:url('nav_h.png'); - background-repeat:repeat-x; - background-color: #F9FAFC; - margin: 0px; - border-bottom: 1px solid #C4CFE5; -} - -div.headertitle -{ - padding: 5px 5px 5px 10px; -} - -.PageDocRTL-title div.headertitle { - text-align: right; - direction: rtl; -} - -dl { - padding: 0 0 0 0; -} - -/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ -dl.section { - margin-left: 0px; - padding-left: 0px; -} - -dl.section.DocNodeRTL { - margin-right: 0px; - padding-right: 0px; -} - -dl.note { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #D0C000; -} - -dl.note.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #D0C000; -} - -dl.warning, dl.attention { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #FF0000; -} - -dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #FF0000; -} - -dl.pre, dl.post, dl.invariant { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00D000; -} - -dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00D000; -} - -dl.deprecated { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #505050; -} - -dl.deprecated.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #505050; -} - -dl.todo { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #00C0E0; -} - -dl.todo.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #00C0E0; -} - -dl.test { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #3030E0; -} - -dl.test.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #3030E0; -} - -dl.bug { - margin-left: -7px; - padding-left: 3px; - border-left: 4px solid; - border-color: #C08050; -} - -dl.bug.DocNodeRTL { - margin-left: 0; - padding-left: 0; - border-left: 0; - margin-right: -7px; - padding-right: 3px; - border-right: 4px solid; - border-color: #C08050; -} - -dl.section dd { - margin-bottom: 6px; -} - - -#projectlogo -{ - text-align: center; - vertical-align: bottom; - border-collapse: separate; -} - -#projectlogo img -{ - border: 0px none; -} - -#projectalign -{ - vertical-align: middle; -} - -#projectname -{ - font: 300% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 2px 0px; -} - -#projectbrief -{ - font: 120% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectnumber -{ - font: 50% Tahoma, Arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#titlearea -{ - padding: 0px; - margin: 0px; - width: 100%; - border-bottom: 1px solid #5373B4; -} - -.image -{ - text-align: center; -} - -.dotgraph -{ - text-align: center; -} - -.mscgraph -{ - text-align: center; -} - -.plantumlgraph -{ - text-align: center; -} - -.diagraph -{ - text-align: center; -} - -.caption -{ - font-weight: bold; -} - -div.zoom -{ - border: 1px solid #90A5CE; -} - -dl.citelist { - margin-bottom:50px; -} - -dl.citelist dt { - color:#334975; - float:left; - font-weight:bold; - margin-right:10px; - padding:5px; -} - -dl.citelist dd { - margin:2px 0; - padding:5px 0; -} - -div.toc { - padding: 14px 25px; - background-color: #F4F6FA; - border: 1px solid #D8DFEE; - border-radius: 7px 7px 7px 7px; - float: right; - height: auto; - margin: 0 8px 10px 10px; - width: 200px; -} - -.PageDocRTL-title div.toc { - float: left !important; - text-align: right; -} - -div.toc li { - background: url("bdwn.png") no-repeat scroll 0 5px transparent; - font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; - margin-top: 5px; - padding-left: 10px; - padding-top: 2px; -} - -.PageDocRTL-title div.toc li { - background-position-x: right !important; - padding-left: 0 !important; - padding-right: 10px; -} - -div.toc h3 { - font: bold 12px/1.2 Arial,FreeSans,sans-serif; - color: #4665A2; - border-bottom: 0 none; - margin: 0; -} - -div.toc ul { - list-style: none outside none; - border: medium none; - padding: 0px; -} - -div.toc li.level1 { - margin-left: 0px; -} - -div.toc li.level2 { - margin-left: 15px; -} - -div.toc li.level3 { - margin-left: 30px; -} - -div.toc li.level4 { - margin-left: 45px; -} - -.PageDocRTL-title div.toc li.level1 { - margin-left: 0 !important; - margin-right: 0; -} - -.PageDocRTL-title div.toc li.level2 { - margin-left: 0 !important; - margin-right: 15px; -} - -.PageDocRTL-title div.toc li.level3 { - margin-left: 0 !important; - margin-right: 30px; -} - -.PageDocRTL-title div.toc li.level4 { - margin-left: 0 !important; - margin-right: 45px; -} - -.inherit_header { - font-weight: bold; - color: gray; - cursor: pointer; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.inherit_header td { - padding: 6px 0px 2px 5px; -} - -.inherit { - display: none; -} - -tr.heading h2 { - margin-top: 12px; - margin-bottom: 4px; -} - -/* tooltip related style info */ - -.ttc { - position: absolute; - display: none; -} - -#powerTip { - cursor: default; - white-space: nowrap; - background-color: white; - border: 1px solid gray; - border-radius: 4px 4px 4px 4px; - box-shadow: 1px 1px 7px gray; - display: none; - font-size: smaller; - max-width: 80%; - opacity: 0.9; - padding: 1ex 1em 1em; - position: absolute; - z-index: 2147483647; -} - -#powerTip div.ttdoc { - color: grey; - font-style: italic; -} - -#powerTip div.ttname a { - font-weight: bold; -} - -#powerTip div.ttname { - font-weight: bold; -} - -#powerTip div.ttdeci { - color: #006318; -} - -#powerTip div { - margin: 0px; - padding: 0px; - font: 12px/16px Roboto,sans-serif; -} - -#powerTip:before, #powerTip:after { - content: ""; - position: absolute; - margin: 0px; -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.s:after, #powerTip.s:before, -#powerTip.w:after, #powerTip.w:before, -#powerTip.e:after, #powerTip.e:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.nw:after, #powerTip.nw:before, -#powerTip.sw:after, #powerTip.sw:before { - border: solid transparent; - content: " "; - height: 0; - width: 0; - position: absolute; -} - -#powerTip.n:after, #powerTip.s:after, -#powerTip.w:after, #powerTip.e:after, -#powerTip.nw:after, #powerTip.ne:after, -#powerTip.sw:after, #powerTip.se:after { - border-color: rgba(255, 255, 255, 0); -} - -#powerTip.n:before, #powerTip.s:before, -#powerTip.w:before, #powerTip.e:before, -#powerTip.nw:before, #powerTip.ne:before, -#powerTip.sw:before, #powerTip.se:before { - border-color: rgba(128, 128, 128, 0); -} - -#powerTip.n:after, #powerTip.n:before, -#powerTip.ne:after, #powerTip.ne:before, -#powerTip.nw:after, #powerTip.nw:before { - top: 100%; -} - -#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { - border-top-color: #FFFFFF; - border-width: 10px; - margin: 0px -10px; -} -#powerTip.n:before { - border-top-color: #808080; - border-width: 11px; - margin: 0px -11px; -} -#powerTip.n:after, #powerTip.n:before { - left: 50%; -} - -#powerTip.nw:after, #powerTip.nw:before { - right: 14px; -} - -#powerTip.ne:after, #powerTip.ne:before { - left: 14px; -} - -#powerTip.s:after, #powerTip.s:before, -#powerTip.se:after, #powerTip.se:before, -#powerTip.sw:after, #powerTip.sw:before { - bottom: 100%; -} - -#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { - border-bottom-color: #FFFFFF; - border-width: 10px; - margin: 0px -10px; -} - -#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { - border-bottom-color: #808080; - border-width: 11px; - margin: 0px -11px; -} - -#powerTip.s:after, #powerTip.s:before { - left: 50%; -} - -#powerTip.sw:after, #powerTip.sw:before { - right: 14px; -} - -#powerTip.se:after, #powerTip.se:before { - left: 14px; -} - -#powerTip.e:after, #powerTip.e:before { - left: 100%; -} -#powerTip.e:after { - border-left-color: #FFFFFF; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.e:before { - border-left-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -#powerTip.w:after, #powerTip.w:before { - right: 100%; -} -#powerTip.w:after { - border-right-color: #FFFFFF; - border-width: 10px; - top: 50%; - margin-top: -10px; -} -#powerTip.w:before { - border-right-color: #808080; - border-width: 11px; - top: 50%; - margin-top: -11px; -} - -@media print -{ - #top { display: none; } - #side-nav { display: none; } - #nav-path { display: none; } - body { overflow:visible; } - h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } - .summary { display: none; } - .memitem { page-break-inside: avoid; } - #doc-content - { - margin-left:0 !important; - height:auto !important; - width:auto !important; - overflow:inherit; - display:inline; - } -} - -/* @group Markdown */ - -/* -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTableHead tr { -} - -table.markdownTableBodyLeft td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -th.markdownTableHeadLeft th.markdownTableHeadRight th.markdownTableHeadCenter th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft { - text-align: left -} - -th.markdownTableHeadRight { - text-align: right -} - -th.markdownTableHeadCenter { - text-align: center -} -*/ - -table.markdownTable { - border-collapse:collapse; - margin-top: 4px; - margin-bottom: 4px; -} - -table.markdownTable td, table.markdownTable th { - border: 1px solid #2D4068; - padding: 3px 7px 2px; -} - -table.markdownTable tr { -} - -th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { - background-color: #374F7F; - color: #FFFFFF; - font-size: 110%; - padding-bottom: 4px; - padding-top: 5px; -} - -th.markdownTableHeadLeft, td.markdownTableBodyLeft { - text-align: left -} - -th.markdownTableHeadRight, td.markdownTableBodyRight { - text-align: right -} - -th.markdownTableHeadCenter, td.markdownTableBodyCenter { - text-align: center -} - -.DocNodeRTL { - text-align: right; - direction: rtl; -} - -.DocNodeLTR { - text-align: left; - direction: ltr; -} - -table.DocNodeRTL { - width: auto; - margin-right: 0; - margin-left: auto; -} - -table.DocNodeLTR { - width: auto; - margin-right: auto; - margin-left: 0; -} - -tt, code, kbd, samp -{ - display: inline-block; - direction:ltr; -} -/* @end */ - -u { - text-decoration: underline; -} - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.png deleted file mode 100644 index 3ff17d80..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/doxygen.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dynsections.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dynsections.js deleted file mode 100644 index ea0a7b39..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/dynsections.js +++ /dev/null @@ -1,120 +0,0 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - 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. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -function toggleVisibility(linkObj) -{ - var base = $(linkObj).attr('id'); - var summary = $('#'+base+'-summary'); - var content = $('#'+base+'-content'); - var trigger = $('#'+base+'-trigger'); - var src=$(trigger).attr('src'); - if (content.is(':visible')===true) { - content.hide(); - summary.show(); - $(linkObj).addClass('closed').removeClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); - } else { - content.show(); - summary.hide(); - $(linkObj).removeClass('closed').addClass('opened'); - $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); - } - return false; -} - -function updateStripes() -{ - $('table.directory tr'). - removeClass('even').filter(':visible:even').addClass('even'); -} - -function toggleLevel(level) -{ - $('table.directory tr').each(function() { - var l = this.id.split('_').length-1; - var i = $('#img'+this.id.substring(3)); - var a = $('#arr'+this.id.substring(3)); - if (l - - - - - - -SdFat: File List - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
File List
-
-
-
Here is a list of all documented files with brief descriptions:
-
[detail level 123456]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  Arduino
  libraries
  SdFat
  src
  common
 BlockDeviceInterface.hBlockDeviceInterface include file
 PrintTemplates.hTemplates for printf
 SysCall.hSysCall class
  ExFatLib
 ExFatFile.hExFatFile class
 ExFatPartition.hExFatPartition include file
  FatLib
 FatFile.hFatFile class
 FatLibConfig.hConfiguration definitions
 FatPartition.hFatPartition class
 FatVolume.hFatVolume class
  FsLib
 FsFile.hFsBaseFile include file
 FsLib.hFsLib include file
 FsVolume.hFsVolume include file
  iostream
 ArduinoStream.hArduinoInStream and ArduinoOutStream classes
 bufstream.hibufstream and obufstream classes
 fstream.hIostreams for files
 ios.hios_base and ios classes
 iostream.hiostream class
 istream.histream class
 ostream.hostream class
 StdioStream.hStdioStream class
  SdCard
 SdSpiCard.hSdSpiCard class for V2 SD/SDHC cards
  SpiDriver
 SdSpiArduinoDriver.hSpiDriver classes for Arduino compatible systems
 SdSpiBaseClass.hBase class for external SPI driver
 SdSpiDriver.hSpiDriver classes
 SdSpiLibDriver.hClass using only simple SPI library functions
 SdSpiSoftDriver.hClass for software SPI
 BufferedPrint.hFast buffered print
 FreeStack.hFreeStack() function
 MinimumSerial.hMinimal AVR Serial driver
 SdFat.hMain SdFs include file
 SdFatConfig.hConfiguration definitions
 sdios.hC++ IO Streams features
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderclosed.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderclosed.png deleted file mode 100644 index bb8ab35e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderclosed.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderopen.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderopen.png deleted file mode 100644 index d6c7f676..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/folderopen.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h.html deleted file mode 100644 index d1bbe6e0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/fstream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
fstream.h File Reference
-
-
- -

iostreams for files. -More...

-
#include "iostream.h"
-
-Include dependency graph for fstream.h:
-
-
- - - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - -
-
- - - - - - - - - - - - - -

-Classes

class  fstream
 file input/output stream. More...
 
class  ifstream
 file input stream. More...
 
class  ofstream
 file output stream. More...
 
class  StreamBaseClass
 base type for FAT and exFAT streams More...
 
-

Detailed Description

-

iostreams for files.

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__dep__incl.png deleted file mode 100644 index 132c33d0..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__incl.png deleted file mode 100644 index 3f96943a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/fstream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions.html deleted file mode 100644 index 1264a9c7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions.html +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- a -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_b.html deleted file mode 100644 index b24b1082..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_b.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- b -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_c.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_c.html deleted file mode 100644 index 63157251..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_c.html +++ /dev/null @@ -1,201 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- c -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_d.html deleted file mode 100644 index 22ac0a9a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_d.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- d -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_e.html deleted file mode 100644 index ccd8a58b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_e.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- e -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_enum.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_enum.html deleted file mode 100644 index 9c2fef85..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_enum.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - -SdFat: Class Members - Enumerations - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_eval.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_eval.html deleted file mode 100644 index c1c6239e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_eval.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -SdFat: Class Members - Enumerator - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_f.html deleted file mode 100644 index 6493845f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_f.html +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- f -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func.html deleted file mode 100644 index 100a8c92..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- a -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_b.html deleted file mode 100644 index 4e384375..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_b.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- b -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_c.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_c.html deleted file mode 100644 index 1fedf23b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_c.html +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- c -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_d.html deleted file mode 100644 index c7f5c700..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_d.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- d -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_e.html deleted file mode 100644 index 0b0d279c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_e.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- e -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_f.html deleted file mode 100644 index b04cb3da..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_f.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- f -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_g.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_g.html deleted file mode 100644 index ada9aa9e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_g.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- g -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_h.html deleted file mode 100644 index e6cc7895..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_h.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- h -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_i.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_i.html deleted file mode 100644 index 64111e3d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_i.html +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- i -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_k.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_k.html deleted file mode 100644 index e41b6764..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_k.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- k -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_l.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_l.html deleted file mode 100644 index 2075380f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_l.html +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- l -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_m.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_m.html deleted file mode 100644 index 004fad78..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_m.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- m -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_n.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_n.html deleted file mode 100644 index e4730929..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_n.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- n -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_o.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_o.html deleted file mode 100644 index 5250338d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_o.html +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- o -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_p.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_p.html deleted file mode 100644 index acd0c299..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_p.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- p -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_r.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_r.html deleted file mode 100644 index 64ab1bf0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_r.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- r -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_s.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_s.html deleted file mode 100644 index a8f3d78b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_s.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- s -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_t.html deleted file mode 100644 index 3ba5480a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_t.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- t -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_u.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_u.html deleted file mode 100644 index b837ba84..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_u.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- u -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_v.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_v.html deleted file mode 100644 index 7814010b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_v.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- v -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_w.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_w.html deleted file mode 100644 index e713ae53..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_w.html +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_y.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_y.html deleted file mode 100644 index a10f07a7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_func_y.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -SdFat: Class Members - Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- y -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_g.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_g.html deleted file mode 100644 index 25b3dae4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_g.html +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- g -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_h.html deleted file mode 100644 index 62559d77..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_h.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- h -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_i.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_i.html deleted file mode 100644 index c3227103..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_i.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- i -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_k.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_k.html deleted file mode 100644 index 4a58ec67..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_k.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- k -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_l.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_l.html deleted file mode 100644 index ed8a97b6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_l.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- l -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_m.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_m.html deleted file mode 100644 index 22d43e0f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_m.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- m -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_n.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_n.html deleted file mode 100644 index d2658d7c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_n.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- n -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_o.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_o.html deleted file mode 100644 index 356f0ce4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_o.html +++ /dev/null @@ -1,148 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- o -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_p.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_p.html deleted file mode 100644 index b1a6581f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_p.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- p -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_r.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_r.html deleted file mode 100644 index 5db13a9a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_r.html +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- r -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_rela.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_rela.html deleted file mode 100644 index 04c0e75f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_rela.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -SdFat: Class Members - Related Functions - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_s.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_s.html deleted file mode 100644 index 714167b0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_s.html +++ /dev/null @@ -1,230 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- s -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_t.html deleted file mode 100644 index abe4658a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_t.html +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- t -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_type.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_type.html deleted file mode 100644 index c22361b7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_type.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - -SdFat: Class Members - Typedefs - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_u.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_u.html deleted file mode 100644 index 44031b59..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_u.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- u -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_v.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_v.html deleted file mode 100644 index 9abad90a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_v.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- v -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_vars.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_vars.html deleted file mode 100644 index 548c8658..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_vars.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - - - -SdFat: Class Members - Variables - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- a -

- - -

- b -

- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- g -

- - -

- h -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- t -

- - -

- u -

- - -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_w.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_w.html deleted file mode 100644 index 45baba71..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_w.html +++ /dev/null @@ -1,119 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_y.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_y.html deleted file mode 100644 index ef82013d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/functions_y.html +++ /dev/null @@ -1,79 +0,0 @@ - - - - - - - -SdFat: Class Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented class members with links to the class documentation for each member:
- -

- y -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals.html deleted file mode 100644 index 0e68d4d2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals.html +++ /dev/null @@ -1,482 +0,0 @@ - - - - - - - -SdFat: File Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
Here is a list of all documented file members with links to the documentation:
- -

- _ -

- - -

- b -

    -
  • boolalpha() -: ios.h -
  • -
- - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- h -

- - -

- i -

- - -

- l -

- - -

- m -

- - -

- n -

- - -

- o -

- - -

- p -

- - -

- r -

- - -

- s -

- - -

- u -

- - -

- v -

- - -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_defs.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_defs.html deleted file mode 100644 index 7ed456cd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_defs.html +++ /dev/null @@ -1,286 +0,0 @@ - - - - - - - -SdFat: File Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- c -

- - -

- d -

- - -

- e -

- - -

- f -

- - -

- h -

- - -

- i -

- - -

- m -

- - -

- n -

- - -

- p -

- - -

- s -

- - -

- u -

- - -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_func.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_func.html deleted file mode 100644 index 9f91746b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_func.html +++ /dev/null @@ -1,231 +0,0 @@ - - - - - - - -SdFat: File Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-  - -

- b -

    -
  • boolalpha() -: ios.h -
  • -
- - -

- d -

- - -

- e -

- - -

- f -

- - -

- h -

- - -

- i -

    -
  • internal() -: ios.h -
  • -
- - -

- l -

- - -

- m -

- - -

- n -

    -
  • noboolalpha() -: ios.h -
  • -
  • noshowbase() -: ios.h -
  • -
  • noshowpoint() -: ios.h -
  • -
  • noshowpos() -: ios.h -
  • -
  • noskipws() -: ios.h -
  • -
  • nouppercase() -: ios.h -
  • -
- - -

- o -

- - -

- r -

- - -

- s -

- - -

- u -

- - -

- v -

- - -

- w -

-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_type.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_type.html deleted file mode 100644 index 7d7281ec..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_type.html +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - -SdFat: File Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_vars.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_vars.html deleted file mode 100644 index dc602d9d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/globals_vars.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - -SdFat: File Members - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.html deleted file mode 100644 index 59cc13ca..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.html +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - -SdFat: Graph Legend - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Graph Legend
-
-
-

This page explains how to interpret the graphs that are generated by doxygen.

-

Consider the following example:

/*! Invisible class because of truncation */
-
class Invisible { };
-
-
/*! Truncated class, inheritance relation is hidden */
-
class Truncated : public Invisible { };
-
-
/* Class not documented with doxygen comments */
-
class Undocumented { };
-
-
/*! Class that is inherited using public inheritance */
-
class PublicBase : public Truncated { };
-
-
/*! A template class */
-
template<class T> class Templ { };
-
-
/*! Class that is inherited using protected inheritance */
-
class ProtectedBase { };
-
-
/*! Class that is inherited using private inheritance */
-
class PrivateBase { };
-
-
/*! Class that is used by the Inherited class */
-
class Used { };
-
-
/*! Super class that inherits a number of other classes */
-
class Inherited : public PublicBase,
-
protected ProtectedBase,
-
private PrivateBase,
-
public Undocumented,
-
public Templ<int>
-
{
-
private:
-
Used *m_usedClass;
-
};
-

This will result in the following graph:

-

The boxes in the above graph have the following meaning:

-
    -
  • -A filled gray box represents the struct or class for which the graph is generated.
  • -
  • -A box with a black border denotes a documented struct or class.
  • -
  • -A box with a gray border denotes an undocumented struct or class.
  • -
  • -A box with a red border denotes a documented struct or class forwhich not all inheritance/containment relations are shown. A graph is truncated if it does not fit within the specified boundaries.
  • -
-

The arrows have the following meaning:

-
    -
  • -A dark blue arrow is used to visualize a public inheritance relation between two classes.
  • -
  • -A dark green arrow is used for protected inheritance.
  • -
  • -A dark red arrow is used for private inheritance.
  • -
  • -A purple dashed arrow is used if a class is contained or used by another class. The arrow is labelled with the variable(s) through which the pointed class or struct is accessible.
  • -
  • -A yellow dashed arrow denotes a relation between a template instance and the template class it was instantiated from. The arrow is labelled with the template parameters of the instance.
  • -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.png deleted file mode 100644 index c0d711ba..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/graph_legend.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/hierarchy.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/hierarchy.html deleted file mode 100644 index 62b85dc0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/hierarchy.html +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - -SdFat: Class Hierarchy - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class Hierarchy
-
-
-
-

Go to the graphical class hierarchy

-This inheritance list is sorted roughly, but not completely, alphabetically:
-
[detail level 12345]
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 CBlockDeviceInterfaceBlockDeviceInterface class
 CSdCardInterfaceAbstract interface for an SD card
 CSdioCardRaw SDIO access to SD and SDHC flash memory cards
 CBufferedPrint< WriteClass, BUF_DIM >Fast buffered print template
 Ccache_tCache for an raw data sector
 CCIDCard IDentification (CID) register
 CDirPos_tInternal type for position in directory file
 CExFatFileBasic file class
 CStreamFile< ExFatFile, uint64_t >
 CExFileExFAT file with Arduino Stream
 CExFatFormatterFormat an exFAT volume
 CExFatPartitionAccess exFat partitions on raw file devices
 CExFatVolumeExFAT volume
 CSdBase< ExFatVolume >
 CSdExFatSD file system class for exFAT volumes
 CExFatPos_tInternal type for file position - do not use in user apps
 CExName_tInternal type for file name - do not use in user apps
 CFatCacheSector cache
 CFatFileBasic file class
 CPrintFile< SdBaseFile >
 CSdFileFAT16/FAT32 file with Print
 CStdioStreamStdioStream implements a minimal stdio stream
 CStreamBaseClassBase type for FAT and exFAT streams
 CfstreamFile input/output stream
 CifstreamFile input stream
 CofstreamFile output stream
 CStreamFile< FatFile, uint32_t >
 CFile32FAT16/FAT32 file with Arduino Stream
 CFatFormatterFormat a FAT volume
 CFatPartitionAccess FAT16 and FAT32 partitions on raw file devices
 CFatVolumeIntegration class for the FatLib library
 CSdBase< FatVolume >
 CSdFat32SD file system class for FAT volumes
 CFatPos_tInternal type for file position - do not use in user apps
 Cfname_tInternal type for Short File Name - do not use in user apps
 CFsBaseFileFsBaseFile class
 CStreamFile< FsBaseFile, uint64_t >
 CFsFileFsBaseFile file with Arduino Stream
 CFsCacheSector cache
 CFsVolumeFsVolume class
 CSdBase< FsVolume >
 CSdFsSD file system class for FAT16, FAT32, and exFAT volumes
 Cios_baseBase class for all streams
 CiosError and state information for all streams
 CistreamInput Stream
 CibufstreamParse a char string
 CArduinoInStreamInput stream for Arduino Stream objects
 CifstreamFile input stream
 CiostreamInput/Output stream
 CfstreamFile input/output stream
 CostreamOutput Stream
 CArduinoOutStreamOutput stream for Arduino Print objects
 CiostreamInput/Output stream
 CobufstreamFormat a char string
 CofstreamFile output stream
 CStreamBaseClassBase type for FAT and exFAT streams
 Cprint_t
 CMinimumSerialMini serial class for the SdFat library
 CPrintFile< BaseFile >PrintFile class
 CPrintFile< SdBaseFile >
 CSdCardFactorySetup a SPI card or SDIO card
 CSdioConfigSDIO card configuration
 CSdSpiArduinoDriverOptimized SPI class for access to SD and SDHC flash memory cards
 CSdSpiBaseClassBase class for external SPI drivers
 CSdSpiCardRaw access to SD and SDHC flash memory cards via SPI protocol
 CSdSpiConfigSPI card configuration
 CSdSpiSoftDriverBase class for external soft SPI
 CSoftSpiDriver< MisoPin, MosiPin, SckPin >Class for external soft SPI
 CsetfillType for setfill manipulator
 CsetprecisionType for setprecision manipulator
 CsetwType for setw manipulator
 Cstream_t
 CStreamFile< BaseFile, PosType >StreamFile class
 CStreamFile< ExFatFile, uint64_t >
 CStreamFile< FatFile, uint32_t >
 CStreamFile< FsBaseFile, uint64_t >
 CSysCallSysCall - Class to wrap system calls
 CBaseFile
 CPrintFile< BaseFile >PrintFile class
 CStreamFile< BaseFile, PosType >StreamFile class
 CVol
 CSdBase< Vol >Base SD file system template class
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/index.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/index.html index eabe3e04..54887899 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/index.html +++ b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/index.html @@ -1,205 +1,4 @@ - - - - - - - -SdFat: Arduino SdFat Library - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Arduino SdFat Library
-
-
-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

-Warnings for SdFat V2

-

This is a major new version of SdFat. It is mostly backward compatible with SdFat Version 1 for FAT16/FAT32 cards.

-

You should edit SdFatConfig.h to select features. The default version of SdFatConfig.h is suitable for UNO and other small AVR boards.

-

-Introduction

-

The Arduino SdFat library supports FAT16, FAT32, and exFAT file systems on Standard SD, SDHC, and SDXC cards.

-

In SdFat version 1, SdFat and File are the main classes.

-

In SdFat version 2, SdFat and File are defined by typedefs in terms of the following classes.

-

The file system classes in the SdFat library are SdFat32, SdExFat, and SdFs. SdFat32 supports FAT16 and FAT32. SdExFat supports exFAT, SdFs supports FAT16, FAT32, and exFAT.

-

The corresponding file classes are File32, ExFile, and FsFile.

-

The types for SdFat and File are defined in SdFatConfig.h. This version uses FAT16/FAT32 for small AVR boards and FAT16/FAT32/exFAT for all other boards.

-
// File types for SdFat, File, SdFile, SdBaseFile, fstream,
-
// ifstream, and ofstream.
-
//
-
// Set SDFAT_FILE_TYPE to:
-
// 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT.
-
//
-
#if defined(__AVR__) && FLASHEND < 0X8000
-
// FAT16/FAT32 for 32K AVR boards.
-
#define SDFAT_FILE_TYPE 1
-
#else // defined(__AVR__) && FLASHEND < 0X8000
-
// FAT16/FAT32 and exFAT for all other boards.
-
#define SDFAT_FILE_TYPE 3
-
#endif // defined(__AVR__) && FLASHEND < 0X8000
-

It is possible to use option three, support or FAT16/FAT32 and exFat on an Uno or other AVR board with 32KB flash and 2KB SRAM but memory will be very limited.

-

Uno memory use for a simple data logger is:

-
-

option 1, FAT16/FAT32, 11902 bytes of flash and 855 bytes of SRAM.

-

option 2, exFAT, 14942 bytes of flash and 895 bytes of SRAM.

-

option 3, FAT16/FAT32 and exFAT, 21834 bytes of flash and 908 bytes of SRAM.

-
-

Please read documentation under the above classes tab for more information.

-

A number of example are provided in the SdFat/examples folder. These were developed to test SdFat and illustrate its use.

-

-exFAT Features

-

exFAT has many features not available in FAT16/FAT32.

-

Files larger than 4GiB, 64-bit file size and file position.

-

Free space allocation performance improved by using a free space bitmap.

-

Removal of the physical "." and ".." directory entries that appear in FAT16/FAT32 subdirectories.

-

Better support for large flash pages with boundary alignment offsets for the FAT table and data region.

-

exFAT files have two separate 64-bit length fields. The DataLength field indicate how much space is allocate to the file. The ValidDataLength field indicates how much actual data has been written to the file.

-

An exFAT file can be contiguous with pre-allocate clusters and bypass the use of the FAT table. In this case the contiguous flag is set in the directory entry. This allows an entire file to be written as one large multi-block write.

-

-Paths and Working Directories

-

Relative paths in SdFat are resolved in a manner similar to Windows.

-

Each instance of SdFat32, SdExFat, and SdFs has a current directory.
- This directory is called the volume working directory, vwd.
- Initially this directory is the root directory for the volume.

-

The volume working directory is changed by calling the chdir(path).

-

The call sd.chdir("/2014") will change the volume working directory for sd to "/2014", assuming "/2014" exists.

-

Relative paths for member functions are resolved by starting at the volume working directory.

-

For example, the call sd.mkdir("April") will create the directory "/2014/April" assuming the volume working directory is "/2014".

-

There is current working directory, cwd, that is used to resolve paths for file.open() calls.

-

For a single SD card, the current working directory is always the volume working directory for that card.

-

For multiple SD cards the current working directory is set to the volume working directory of a card by calling the chvol() member function. The chvol() call is like the Windows <drive letter>: command.

-

The call sd2.chvol() will set the current working directory to the volume working directory for sd2.

-

If the volume working directory for sd2 is "/music" the call

-

file.open("BigBand.wav", O_READ);

-

will open "/music/BigBand.wav" on sd2.

-

-Installation

-

You must manually install SdFat by renaming the download folder SdFat and copy the SdFat folder to the Arduino libraries folder in your sketchbook folder.

-

It will be necessary to unzip and rename the folder if you download a zip file from GitHub.

-

See the Manual installation section of this guide.

-

http://arduino.cc/en/Guide/Libraries

-

-SdFat Configuration

-

Several configuration options may be changed by editing the SdFatConfig.h file in the SdFat/src folder.

-

Here are a few of the key options.

-

If the symbol ENABLE_DEDICATED_SPI is nonzero, multi-block SD I/O may be used for better performance. The SPI bus may not be shared with other devices in this mode.

-

The symbol SPI_DRIVER_SELECT is used to select the SPI driver.

-
-

If the symbol SPI_DRIVER_SELECT is:

-

0 - An optimized custom SPI driver is used if it exists else the standard library driver is used.

-

1 - The standard library driver is always used.

-

2 - The software SPI driver is always used.

-

3 - An external SPI driver derived from SdSpiBaseClass is always used.

-
-

To enable SD card CRC checking in SPI mode set USE_SD_CRC nonzero.

-

See SdFatConfig.h for other options.

-

-Hardware Configuration

-

The hardware interface to the SD card should not use a resistor based level shifter. Resistor based level shifters results in signal rise times that are too slow for many newer SD cards.

-

-How to format SD Cards

-

The best way to restore an SD card's format on a PC or Mac is to use SDFormatter which can be downloaded from:

-

http://www.sdcard.org/downloads

-

A formatter program, SdFormatter.ino, is included in the SdFat/examples/SdFormatter directory. This program attempts to emulate SD Association's SDFormatter.

-

SDFormatter aligns flash erase boundaries with file system structures which reduces write latency and file system overhead.

-

The PC/Mac SDFormatter does not have an option for FAT type so it may format very small cards as FAT12. Use the SdFormatter example to force FAT16 formatting of small cards.

-

Do not format the SD card with an OS utility, OS utilities do not format SD cards in conformance with the SD standard.

-

You should use a freshly formatted SD card for best performance. FAT file systems become slower if many files have been created and deleted. This is because the directory entry for a deleted file is marked as deleted, but is not deleted. When a new file is created, these entries must be scanned before creating the file. Also files can become fragmented which causes reads and writes to be slower.

-

-Examples

-

A number of examples are provided in the SdFat/examples folder.

-

To access these examples from the Arduino development environment go to: File -> Examples -> SdFat -> <program Name>

-

Compile, upload to your Arduino and click on Serial Monitor to run the example.

-

Here is a list:

-

AvrAdcLogger - Fast AVR ADC logger using Timer/ADC interrupts.

-

BackwardCompatibility - Demonstrate SD.h compatibility with SdFat.h.

-

bench - A read/write benchmark.

-

BufferedPrint - Demo a buffered print class for AVR loggers.

-

debug folder - Some of my debug programs - will be remove in the future.

-

DirectoryFunctions - Use of chdir(), ls(), mkdir(), and rmdir().

-

examplesV1 folder - Examples from SdFat V1 for compatibility tests.

-

ExFatFormatter - Produces optimal exFAT format for smaller SD cards.

-

ExFatLogger - A data-logger optimized for exFAT features.

-

ExFatUnicodeTest - Test program for Unicode file names.

-

OpenNext - Open all files in the root dir and print their filename.

-

QuickStart - Quick hardware test for SPI card access.

-

ReadCsvFile - Function to read a CSV text file one field at a time.

-

rename - demonstrates use of rename().

-

RtcTimestampTest - Demonstration of timestamps with RTClib.

-

SdErrorCodes - Produce a list of error codes.

-

SdFormatter - This program will format an SD, SDHC, or SDXC card.

-

SdInfo - Initialize an SD card and analyze its structure for trouble shooting.

-

SoftwareSpi - Demo of limited Software SPI support in SdFat V2.

-

STM32Test - Example use of two SPI ports on an STM32 board.

-

TeensyRtcTimestamp - File timestamps for Teensy3.

-

TeensySdioDemo - Demo of SDIO and SPI modes for the Teensy 3.5/3.6 built-in SD.

-

UserChipSelectFunction - Useful for port expanders or replacement of the standard GPIO functions.

-

UserSPIDriver - An example of an external SPI driver.

-
-
- - - - +

Replace the content of the html folder by unzipping html.zip.

+

I have zipped the documentation since Doxygen changes every file each time it runs.

+

This makes viewing changes on GitHub difficult.

+

 

\ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_0.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_0.png deleted file mode 100644 index d6eb612a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_0.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_1.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_1.png deleted file mode 100644 index 01767e92..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_1.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_10.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_10.png deleted file mode 100644 index 1a4e3f40..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_10.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_11.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_11.png deleted file mode 100644 index 44052554..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_11.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_12.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_12.png deleted file mode 100644 index 9ac44585..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_12.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_13.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_13.png deleted file mode 100644 index aeccc523..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_13.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_14.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_14.png deleted file mode 100644 index 47b5280d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_14.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_15.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_15.png deleted file mode 100644 index 5b3a832c..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_15.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_16.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_16.png deleted file mode 100644 index a9536964..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_16.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_17.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_17.png deleted file mode 100644 index a4f2c5fc..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_17.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_18.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_18.png deleted file mode 100644 index bd80900b..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_18.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_19.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_19.png deleted file mode 100644 index 93fe9f64..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_19.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_2.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_2.png deleted file mode 100644 index 16382510..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_2.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_20.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_20.png deleted file mode 100644 index f19fa6a2..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_20.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_21.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_21.png deleted file mode 100644 index 5cca3cb5..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_21.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_22.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_22.png deleted file mode 100644 index f654fac2..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_22.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_23.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_23.png deleted file mode 100644 index d289adaf..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_23.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_24.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_24.png deleted file mode 100644 index adae8006..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_24.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_25.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_25.png deleted file mode 100644 index 6815203e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_25.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_26.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_26.png deleted file mode 100644 index 50928857..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_26.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_27.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_27.png deleted file mode 100644 index 1171b428..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_27.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_28.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_28.png deleted file mode 100644 index cb756b51..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_28.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_3.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_3.png deleted file mode 100644 index 4035b529..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_3.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_4.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_4.png deleted file mode 100644 index 45215929..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_4.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_5.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_5.png deleted file mode 100644 index b9811ee9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_5.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_6.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_6.png deleted file mode 100644 index 735ee5fe..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_6.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_7.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_7.png deleted file mode 100644 index d46652cd..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_7.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_8.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_8.png deleted file mode 100644 index b6d5b94e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_8.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_9.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_9.png deleted file mode 100644 index ab588808..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherit_graph_9.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherits.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherits.html deleted file mode 100644 index ea6e93ec..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/inherits.html +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - -SdFat: Class Hierarchy - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - -
- -
-
- - -
- -
- -
-
-
Class Hierarchy
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - - - - -
- - - -
- - - -
- - - -
- - - -
- - - - - - -
- - - -
- - - -
- - - -
- - - - - -
- - - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - -
- - - - -
- - - -
- - - -
- - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - -
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h.html deleted file mode 100644 index a76af4ff..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h.html +++ /dev/null @@ -1,804 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/ios.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
ios.h File Reference
-
-
- -

ios_base and ios classes -More...

-
#include "../FsLib/FsLib.h"
-
-Include dependency graph for ios.h:
-
-
- - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - - - - -
-
- - - - - - - -

-Classes

class  ios
 Error and state information for all streams. More...
 
class  ios_base
 Base class for all streams. More...
 
- - - - - -

-Typedefs

typedef fspos_t pos_t
 
typedef FatFile StreamBaseFile
 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-Functions

ios_baseboolalpha (ios_base &str)
 
ios_basedec (ios_base &str)
 
ios_basehex (ios_base &str)
 
ios_baseinternal (ios_base &str)
 
ios_baseleft (ios_base &str)
 
ios_basenoboolalpha (ios_base &str)
 
ios_basenoshowbase (ios_base &str)
 
ios_basenoshowpoint (ios_base &str)
 
ios_basenoshowpos (ios_base &str)
 
ios_basenoskipws (ios_base &str)
 
ios_basenouppercase (ios_base &str)
 
ios_baseoct (ios_base &str)
 
ios_baseright (ios_base &str)
 
ios_baseshowbase (ios_base &str)
 
ios_baseshowpoint (ios_base &str)
 
ios_baseshowpos (ios_base &str)
 
ios_baseskipws (ios_base &str)
 
ios_baseuppercase (ios_base &str)
 
-

Detailed Description

-

ios_base and ios classes

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Typedef Documentation

- -

◆ pos_t

- -
-
- - - - -
typedef fspos_t pos_t
-
-

For internal use in c++ streams

- -
-
- -

◆ StreamBaseFile

- -
-
- - - - -
typedef FatFile StreamBaseFile
-
-

Set File type for iostreams.

- -
-
-

Function Documentation

- -

◆ boolalpha()

- -
-
- - - - - -
- - - - - - - - -
ios_base& boolalpha (ios_basestr)
-
-inline
-
-

function for boolalpha manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ dec()

- -
-
- - - - - -
- - - - - - - - -
ios_base& dec (ios_basestr)
-
-inline
-
-

function for dec manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ hex()

- -
-
- - - - - -
- - - - - - - - -
ios_base& hex (ios_basestr)
-
-inline
-
-

function for hex manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ internal()

- -
-
- - - - - -
- - - - - - - - -
ios_base& internal (ios_basestr)
-
-inline
-
-

function for internal manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ left()

- -
-
- - - - - -
- - - - - - - - -
ios_base& left (ios_basestr)
-
-inline
-
-

function for left manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ noboolalpha()

- -
-
- - - - - -
- - - - - - - - -
ios_base& noboolalpha (ios_basestr)
-
-inline
-
-

function for noboolalpha manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ noshowbase()

- -
-
- - - - - -
- - - - - - - - -
ios_base& noshowbase (ios_basestr)
-
-inline
-
-

function for noshowbase manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ noshowpoint()

- -
-
- - - - - -
- - - - - - - - -
ios_base& noshowpoint (ios_basestr)
-
-inline
-
-

function for noshowpoint manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ noshowpos()

- -
-
- - - - - -
- - - - - - - - -
ios_base& noshowpos (ios_basestr)
-
-inline
-
-

function for noshowpos manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ noskipws()

- -
-
- - - - - -
- - - - - - - - -
ios_base& noskipws (ios_basestr)
-
-inline
-
-

function for noskipws manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ nouppercase()

- -
-
- - - - - -
- - - - - - - - -
ios_base& nouppercase (ios_basestr)
-
-inline
-
-

function for nouppercase manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ oct()

- -
-
- - - - - -
- - - - - - - - -
ios_base& oct (ios_basestr)
-
-inline
-
-

function for oct manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ right()

- -
-
- - - - - -
- - - - - - - - -
ios_base& right (ios_basestr)
-
-inline
-
-

function for right manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ showbase()

- -
-
- - - - - -
- - - - - - - - -
ios_base& showbase (ios_basestr)
-
-inline
-
-

function for showbase manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ showpoint()

- -
-
- - - - - -
- - - - - - - - -
ios_base& showpoint (ios_basestr)
-
-inline
-
-

function for showpoint manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ showpos()

- -
-
- - - - - -
- - - - - - - - -
ios_base& showpos (ios_basestr)
-
-inline
-
-

function for showpos manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ skipws()

- -
-
- - - - - -
- - - - - - - - -
ios_base& skipws (ios_basestr)
-
-inline
-
-

function for skipws manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ uppercase()

- -
-
- - - - - -
- - - - - - - - -
ios_base& uppercase (ios_basestr)
-
-inline
-
-

function for uppercase manipulator

Parameters
- - -
[in]strThe stream
-
-
-
Returns
The stream
- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__dep__incl.png deleted file mode 100644 index d36b5a1d..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__incl.png deleted file mode 100644 index f58bb926..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ios_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h.html deleted file mode 100644 index 5ca3dadb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/iostream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
iostream.h File Reference
-
-
- -

iostream class -More...

-
#include "istream.h"
-#include "ostream.h"
-
-Include dependency graph for iostream.h:
-
-
- - - - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - -
-
- - - - - - - - - - - - - -

-Classes

class  iostream
 Input/Output stream. More...
 
struct  setfill
 type for setfill manipulator More...
 
struct  setprecision
 type for setprecision manipulator More...
 
struct  setw
 type for setw manipulator More...
 
- - - - - - - - - - - - - - - - - - - -

-Functions

ostreamendl (ostream &os)
 
ostreamflush (ostream &os)
 
ostreamoperator<< (ostream &os, const setfill &arg)
 
ostreamoperator<< (ostream &os, const setprecision &arg)
 
ostreamoperator<< (ostream &os, const setw &arg)
 
istreamoperator>> (istream &is, const setprecision &arg)
 
istreamoperator>> (istream &is, const setw &arg)
 
istreamoperator>> (istream &obj, const setfill &arg)
 
istreamws (istream &is)
 
-

Detailed Description

-

iostream class

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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.

-

Function Documentation

- -

◆ endl()

- -
-
- - - - - -
- - - - - - - - -
ostream& endl (ostreamos)
-
-inline
-
-

insert endline

Parameters
- - -
[in]osThe Stream
-
-
-
Returns
The stream
- -
-
- -

◆ flush()

- -
-
- - - - - -
- - - - - - - - -
ostream& flush (ostreamos)
-
-inline
-
-

flush manipulator

Parameters
- - -
[in]osThe stream
-
-
-
Returns
The stream
- -
-
- -

◆ operator<<() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& operator<< (ostreamos,
const setfillarg 
)
-
-inline
-
-

setfill manipulator

Parameters
- - - -
[in]osthe stream
[in]argset setfill object
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& operator<< (ostreamos,
const setprecisionarg 
)
-
-inline
-
-

setprecision manipulator

Parameters
- - - -
[in]osthe stream
[in]argset setprecision object
-
-
-
Returns
the stream
- -
-
- -

◆ operator<<() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
ostream& operator<< (ostreamos,
const setwarg 
)
-
-inline
-
-

setw manipulator

Parameters
- - - -
[in]osthe stream
[in]argset setw object
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [1/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& operator>> (istreamis,
const setprecisionarg 
)
-
-inline
-
-

setprecision manipulator

Parameters
- - - -
[in]isthe stream
[in]argset setprecision object
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [2/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& operator>> (istreamis,
const setwarg 
)
-
-inline
-
-

setw manipulator

Parameters
- - - -
[in]isthe stream
[in]argset setw object
-
-
-
Returns
the stream
- -
-
- -

◆ operator>>() [3/3]

- -
-
- - - - - -
- - - - - - - - - - - - - - - - - - -
istream& operator>> (istreamobj,
const setfillarg 
)
-
-inline
-
-

setfill manipulator

Parameters
- - - -
[in]objthe stream
[in]argset setfill object
-
-
-
Returns
the stream
- -
-
- -

◆ ws()

- -
-
- - - - - -
- - - - - - - - -
istream& ws (istreamis)
-
-inline
-
-

Skip white space

Parameters
- - -
[in]isthe Stream
-
-
-
Returns
The stream
- -
-
-
- - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__dep__incl.png deleted file mode 100644 index fc62696a..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__incl.png deleted file mode 100644 index b3863b3e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/iostream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h.html deleted file mode 100644 index 450c6abe..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/istream.h File Reference - - - - - - - - - -
-
- - - - - - -
-
SdFat -
-
-
- - - - - - - - -
-
- - -
- -
- - -
-
- -
-
istream.h File Reference
-
-
- -

istream class -More...

-
#include "ios.h"
-
-Include dependency graph for istream.h:
-
-
- - - - - - - -
-
-This graph shows which files directly or indirectly include this file:
-
-
- - - - - - - - -
-
- - - - -

-Classes

class  istream
 Input Stream. More...
 
-

Detailed Description

-

istream class

-

Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

-

MIT License

-

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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__dep__incl.png deleted file mode 100644 index 5e0ad292..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__incl.png deleted file mode 100644 index 93c24f71..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/istream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/jquery.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/jquery.js deleted file mode 100644 index 103c32d7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/jquery.js +++ /dev/null @@ -1,35 +0,0 @@ -/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element -},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** - * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler - * Licensed under MIT - * @author Ariel Flesler - * @version 2.1.2 - */ -;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 - * http://www.smartmenus.org/ - * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menu.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menu.js deleted file mode 100644 index 433c15b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menu.js +++ /dev/null @@ -1,50 +0,0 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - 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. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { - function makeTree(data,relPath) { - var result=''; - if ('children' in data) { - result+=''; - } - return result; - } - - $('#main-nav').append(makeTree(menudata,relPath)); - $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); - if (searchEnabled) { - if (serverSide) { - $('#main-menu').append('
  • '); - } else { - $('#main-menu').append('
  • '); - } - } - $('#main-menu').smartmenus(); -} -/* @license-end */ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menudata.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menudata.js deleted file mode 100644 index f48182c8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/menudata.js +++ /dev/null @@ -1,156 +0,0 @@ -/* -@licstart The following is the entire license notice for the -JavaScript code in this file. - -Copyright (C) 1997-2019 by Dimitri van Heesch - -This program is free software; you can redistribute it and/or modify -it under the terms of version 2 of the GNU General Public License as published by -the Free Software Foundation - -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. - -@licend The above is the entire license notice -for the JavaScript code in this file -*/ -var menudata={children:[ -{text:"Main Page",url:"index.html"}, -{text:"Namespaces",url:"namespaces.html",children:[ -{text:"Namespace List",url:"namespaces.html"}, -{text:"Namespace Members",url:"namespacemembers.html",children:[ -{text:"All",url:"namespacemembers.html"}, -{text:"Functions",url:"namespacemembers_func.html"}, -{text:"Variables",url:"namespacemembers_vars.html"}]}]}, -{text:"Classes",url:"annotated.html",children:[ -{text:"Class List",url:"annotated.html"}, -{text:"Class Hierarchy",url:"inherits.html"}, -{text:"Class Members",url:"functions.html",children:[ -{text:"All",url:"functions.html",children:[ -{text:"a",url:"functions.html#index_a"}, -{text:"b",url:"functions_b.html#index_b"}, -{text:"c",url:"functions_c.html#index_c"}, -{text:"d",url:"functions_d.html#index_d"}, -{text:"e",url:"functions_e.html#index_e"}, -{text:"f",url:"functions_f.html#index_f"}, -{text:"g",url:"functions_g.html#index_g"}, -{text:"h",url:"functions_h.html#index_h"}, -{text:"i",url:"functions_i.html#index_i"}, -{text:"k",url:"functions_k.html#index_k"}, -{text:"l",url:"functions_l.html#index_l"}, -{text:"m",url:"functions_m.html#index_m"}, -{text:"n",url:"functions_n.html#index_n"}, -{text:"o",url:"functions_o.html#index_o"}, -{text:"p",url:"functions_p.html#index_p"}, -{text:"r",url:"functions_r.html#index_r"}, -{text:"s",url:"functions_s.html#index_s"}, -{text:"t",url:"functions_t.html#index_t"}, -{text:"u",url:"functions_u.html#index_u"}, -{text:"v",url:"functions_v.html#index_v"}, -{text:"w",url:"functions_w.html#index_w"}, -{text:"y",url:"functions_y.html#index_y"}]}, -{text:"Functions",url:"functions_func.html",children:[ -{text:"a",url:"functions_func.html#index_a"}, -{text:"b",url:"functions_func_b.html#index_b"}, -{text:"c",url:"functions_func_c.html#index_c"}, -{text:"d",url:"functions_func_d.html#index_d"}, -{text:"e",url:"functions_func_e.html#index_e"}, -{text:"f",url:"functions_func_f.html#index_f"}, -{text:"g",url:"functions_func_g.html#index_g"}, -{text:"h",url:"functions_func_h.html#index_h"}, -{text:"i",url:"functions_func_i.html#index_i"}, -{text:"k",url:"functions_func_k.html#index_k"}, -{text:"l",url:"functions_func_l.html#index_l"}, -{text:"m",url:"functions_func_m.html#index_m"}, -{text:"n",url:"functions_func_n.html#index_n"}, -{text:"o",url:"functions_func_o.html#index_o"}, -{text:"p",url:"functions_func_p.html#index_p"}, -{text:"r",url:"functions_func_r.html#index_r"}, -{text:"s",url:"functions_func_s.html#index_s"}, -{text:"t",url:"functions_func_t.html#index_t"}, -{text:"u",url:"functions_func_u.html#index_u"}, -{text:"v",url:"functions_func_v.html#index_v"}, -{text:"w",url:"functions_func_w.html#index_w"}, -{text:"y",url:"functions_func_y.html#index_y"}]}, -{text:"Variables",url:"functions_vars.html",children:[ -{text:"a",url:"functions_vars.html#index_a"}, -{text:"b",url:"functions_vars.html#index_b"}, -{text:"c",url:"functions_vars.html#index_c"}, -{text:"d",url:"functions_vars.html#index_d"}, -{text:"e",url:"functions_vars.html#index_e"}, -{text:"f",url:"functions_vars.html#index_f"}, -{text:"g",url:"functions_vars.html#index_g"}, -{text:"h",url:"functions_vars.html#index_h"}, -{text:"i",url:"functions_vars.html#index_i"}, -{text:"l",url:"functions_vars.html#index_l"}, -{text:"m",url:"functions_vars.html#index_m"}, -{text:"o",url:"functions_vars.html#index_o"}, -{text:"p",url:"functions_vars.html#index_p"}, -{text:"r",url:"functions_vars.html#index_r"}, -{text:"s",url:"functions_vars.html#index_s"}, -{text:"t",url:"functions_vars.html#index_t"}, -{text:"u",url:"functions_vars.html#index_u"}, -{text:"w",url:"functions_vars.html#index_w"}]}, -{text:"Typedefs",url:"functions_type.html"}, -{text:"Enumerations",url:"functions_enum.html"}, -{text:"Enumerator",url:"functions_eval.html"}, -{text:"Related Functions",url:"functions_rela.html"}]}]}, -{text:"Files",url:"files.html",children:[ -{text:"File List",url:"files.html"}, -{text:"File Members",url:"globals.html",children:[ -{text:"All",url:"globals.html",children:[ -{text:"_",url:"globals.html#index__5F"}, -{text:"b",url:"globals.html#index_b"}, -{text:"c",url:"globals.html#index_c"}, -{text:"d",url:"globals.html#index_d"}, -{text:"e",url:"globals.html#index_e"}, -{text:"f",url:"globals.html#index_f"}, -{text:"h",url:"globals.html#index_h"}, -{text:"i",url:"globals.html#index_i"}, -{text:"l",url:"globals.html#index_l"}, -{text:"m",url:"globals.html#index_m"}, -{text:"n",url:"globals.html#index_n"}, -{text:"o",url:"globals.html#index_o"}, -{text:"p",url:"globals.html#index_p"}, -{text:"r",url:"globals.html#index_r"}, -{text:"s",url:"globals.html#index_s"}, -{text:"u",url:"globals.html#index_u"}, -{text:"v",url:"globals.html#index_v"}, -{text:"w",url:"globals.html#index_w"}]}, -{text:"Functions",url:"globals_func.html",children:[ -{text:"b",url:"globals_func.html#index_b"}, -{text:"d",url:"globals_func.html#index_d"}, -{text:"e",url:"globals_func.html#index_e"}, -{text:"f",url:"globals_func.html#index_f"}, -{text:"h",url:"globals_func.html#index_h"}, -{text:"i",url:"globals_func.html#index_i"}, -{text:"l",url:"globals_func.html#index_l"}, -{text:"m",url:"globals_func.html#index_m"}, -{text:"n",url:"globals_func.html#index_n"}, -{text:"o",url:"globals_func.html#index_o"}, -{text:"r",url:"globals_func.html#index_r"}, -{text:"s",url:"globals_func.html#index_s"}, -{text:"u",url:"globals_func.html#index_u"}, -{text:"v",url:"globals_func.html#index_v"}, -{text:"w",url:"globals_func.html#index_w"}]}, -{text:"Variables",url:"globals_vars.html"}, -{text:"Typedefs",url:"globals_type.html"}, -{text:"Macros",url:"globals_defs.html",children:[ -{text:"c",url:"globals_defs.html#index_c"}, -{text:"d",url:"globals_defs.html#index_d"}, -{text:"e",url:"globals_defs.html#index_e"}, -{text:"f",url:"globals_defs.html#index_f"}, -{text:"h",url:"globals_defs.html#index_h"}, -{text:"i",url:"globals_defs.html#index_i"}, -{text:"m",url:"globals_defs.html#index_m"}, -{text:"n",url:"globals_defs.html#index_n"}, -{text:"p",url:"globals_defs.html#index_p"}, -{text:"s",url:"globals_defs.html#index_s"}, -{text:"u",url:"globals_defs.html#index_u"}, -{text:"w",url:"globals_defs.html#index_w"}]}]}]}]} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespace_fs_date_time.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespace_fs_date_time.html deleted file mode 100644 index 60bb0bb7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespace_fs_date_time.html +++ /dev/null @@ -1,232 +0,0 @@ - - - - - - - -SdFat: FsDateTime Namespace Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    FsDateTime Namespace Reference
    -
    -
    - - - - - - - - -

    -Functions

    void clearCallback ()
     
    void setCallback (void(*dateTime)(uint16_t *date, uint16_t *time))
     
    void setCallback (void(*dateTime)(uint16_t *date, uint16_t *time, uint8_t *ms10))
     
    - - - - - -

    -Variables

    void(* callback )(uint16_t *date, uint16_t *time, uint8_t *ms10) = NULL
     
    void(* callback2 )(uint16_t *date, uint16_t *time) = NULL
     
    -

    Detailed Description

    -

    Date time callback.

    -

    Date time callback

    -

    Function Documentation

    - -

    ◆ clearCallback()

    - -
    -
    - - - - - - - -
    void FsDateTime::clearCallback ()
    -
    -

    Cancel callback.

    - -
    -
    - -

    ◆ setCallback() [1/2]

    - -
    -
    - - - - - - - - -
    void FsDateTime::setCallback (void(*)(uint16_t *date, uint16_t *time) dateTime)
    -
    -

    Set the date/time callback function.

    -
    Parameters
    - - -
    [in]dateTimeThe user's call back function. The callback. function is of the form:
    -
    -
    -
    void dateTime(uint16_t* date, uint16_t* time) {
    -
    uint16_t year;
    -
    uint8_t month, day, hour, minute, second;
    -
    -
    // User gets date and time from GPS or real-time clock here.
    -
    -
    // Return date using FS_DATE macro to format fields.
    -
    *date = FS_DATE(year, month, day);
    -
    -
    // Return time using FS_TIME macro to format fields.
    -
    *time = FS_TIME(hour, minute, second);
    -
    }
    -

    Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

    - -
    -
    - -

    ◆ setCallback() [2/2]

    - -
    -
    - - - - - - - - -
    void FsDateTime::setCallback (void(*)(uint16_t *date, uint16_t *time, uint8_t *ms10) dateTime)
    -
    -

    Set the date/time callback function.

    -
    Parameters
    - - -
    [in]dateTimeThe user's call back function. The callback function is of the form:
    -
    -
    -
    void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) {
    -
    uint16_t year;
    -
    uint8_t month, day, hour, minute, second;
    -
    -
    // User gets date and time from GPS or real-time clock here.
    -
    -
    // Return date using FS_DATE macro to format fields
    -
    *date = FS_DATE(year, month, day);
    -
    -
    // Return time using FS_TIME macro to format fields
    -
    *time = FS_TIME(hour, minute, second);
    -
    -
    // Return tenths of milliseconds since last even second.
    -
    // The granularity of the seconds part of FS_TIME is 2 seconds so
    -
    // this field is a count of tenths of a second and its valid value
    -
    // range is 0-199 inclusive.
    -
    // For a simple RTC return 100*(seconds & 1).
    -
    *ms10 = <tens of ms since even second>
    -
    }
    -

    Sets the function that is called when a file is created or when a file's directory entry is modified by sync(). All timestamps, access, creation, and modify, are set when a file is created. sync() maintains the last access date and last modify date/time.

    - -
    -
    -

    Variable Documentation

    - -

    ◆ callback

    - -
    -
    - - - - -
    void(* FsDateTime::callback = NULL
    -
    -

    Date time callback.

    - -
    -
    - -

    ◆ callback2

    - -
    -
    - - - - -
    void(* FsDateTime::callback2 = NULL
    -
    -

    Date time callback.

    - -
    -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers.html deleted file mode 100644 index abc2effe..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers.html +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - -SdFat: Namespace Members - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    - -
    - -
    -
    Here is a list of all documented namespace members with links to the namespaces they belong to:
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_func.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_func.html deleted file mode 100644 index 584610af..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_func.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Namespace Members - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    - -
    - -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_vars.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_vars.html deleted file mode 100644 index 8a0fbf51..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespacemembers_vars.html +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - -SdFat: Namespace Members - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    - -
    - -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespaces.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespaces.html deleted file mode 100644 index 6d7c844f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/namespaces.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Namespace List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - -
    - -
    -
    - - -
    - -
    - -
    -
    -
    Namespace List
    -
    -
    -
    Here is a list of all documented namespaces with brief descriptions:
    - - -
     NFsDateTime
    -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_f.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_f.png deleted file mode 100644 index 72a58a52..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_f.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_g.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_g.png deleted file mode 100644 index 2093a237..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_g.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_h.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_h.png deleted file mode 100644 index 33389b10..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/nav_h.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/open.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/open.png deleted file mode 100644 index 30f75c7e..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/open.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h.html deleted file mode 100644 index 6f5ddb47..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h.html +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/iostream/ostream.h File Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    - -
    -
    ostream.h File Reference
    -
    -
    - -

    ostream class -More...

    -
    #include "ios.h"
    -
    -Include dependency graph for ostream.h:
    -
    -
    - - - - - - - -
    -
    -This graph shows which files directly or indirectly include this file:
    -
    -
    - - - - - - - - -
    -
    - - - - -

    -Classes

    class  ostream
     Output Stream. More...
     
    -

    Detailed Description

    -

    ostream class

    -

    Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

    -

    MIT License

    -

    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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__dep__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__dep__incl.png deleted file mode 100644 index af88ac33..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__dep__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__incl.png deleted file mode 100644 index c12090ea..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/ostream_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h.html deleted file mode 100644 index 3db662bd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h.html +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - -SdFat: Arduino/libraries/SdFat/src/sdios.h File Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - - -
    -
    -
    -
    sdios.h File Reference
    -
    -
    - -

    C++ IO Streams features. -More...

    -
    -Include dependency graph for sdios.h:
    -
    -
    - - - - - - - - - - - - - - - - - - - - -
    -

    Detailed Description

    -

    C++ IO Streams features.

    -

    Copyright (c) 2011-2020 Bill Greiman This file is part of the SdFat library for SD memory cards.

    -

    MIT License

    -

    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/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h__incl.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h__incl.png deleted file mode 100644 index 132c50d9..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sdios_8h__incl.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.html deleted file mode 100644 index a52d5f05..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.js deleted file mode 100644 index 577a4e45..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['_5f_5fbrkval_0',['__brkval',['../_free_stack_8h.html#ad193a2cc121e0d4614a1c21eb463fb56',1,'FreeStack.h']]], - ['_5f_5fbss_5fend_1',['__bss_end',['../_free_stack_8h.html#adbad17f740c2d7f2bc4833681c93c932',1,'FreeStack.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.html deleted file mode 100644 index 0fcb7040..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.js deleted file mode 100644 index 12e0f76f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_1.js +++ /dev/null @@ -1,15 +0,0 @@ -var searchData= -[ - ['activate_2',['activate',['../class_sd_spi_arduino_driver.html#abb6b88c5c8b87fc344a69f23f6eab3d9',1,'SdSpiArduinoDriver::activate()'],['../class_sd_spi_base_class.html#ace7d46253efcaaab8b6be50cc17233e4',1,'SdSpiBaseClass::activate()'],['../class_sd_spi_soft_driver.html#abed1f06be38711517f622f537657c89f',1,'SdSpiSoftDriver::activate()']]], - ['adjustfield_3',['adjustfield',['../classios__base.html#adaaf735381254aa096ebe3605e8bbd0a',1,'ios_base']]], - ['always1_4',['always1',['../struct_c_i_d.html#ae9d4ba51ed4102255aa87bb92882f119',1,'CID']]], - ['app_5',['app',['../classios__base.html#a8380aac3c405730708888fdc68905820',1,'ios_base']]], - ['arduinoinstream_6',['ArduinoInStream',['../class_arduino_in_stream.html',1,'ArduinoInStream'],['../class_arduino_in_stream.html#a61ee22a5824849ec3261ee2f814dfb93',1,'ArduinoInStream::ArduinoInStream()']]], - ['arduinooutstream_7',['ArduinoOutStream',['../class_arduino_out_stream.html',1,'ArduinoOutStream'],['../class_arduino_out_stream.html#a228b667f9f53dc91c6ed7735d34f04a8',1,'ArduinoOutStream::ArduinoOutStream()']]], - ['arduinostream_2eh_8',['ArduinoStream.h',['../_arduino_stream_8h.html',1,'']]], - ['ate_9',['ate',['../classios__base.html#aa434355c165500065276d955d8b36e99',1,'ios_base']]], - ['available_10',['available',['../class_minimum_serial.html#a2abe4370989968938b5dc4872d51c3df',1,'MinimumSerial::available()'],['../class_ex_fat_file.html#a1eae02704b69e903ea174c5d0744debb',1,'ExFatFile::available()'],['../class_fat_file.html#a4baea142c9cd53293a93ef3d6a67aa16',1,'FatFile::available()'],['../class_stream_file.html#a0112cc39b64aac6f1ec47741397a7582',1,'StreamFile::available()'],['../class_fs_base_file.html#a5762772ce4e72776c2806af21c1251b8',1,'FsBaseFile::available()']]], - ['available32_11',['available32',['../class_fat_file.html#a651ffa37e7e586fc3c2de8cbbd500ea6',1,'FatFile']]], - ['available64_12',['available64',['../class_ex_fat_file.html#adcf47e15b819fe2d6faac2a027ab30f5',1,'ExFatFile']]], - ['arduino_20_25sdfat_20library_13',['Arduino %SdFat Library',['../index.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.html deleted file mode 100644 index c234738e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.js deleted file mode 100644 index b4f2976d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_10.js +++ /dev/null @@ -1,30 +0,0 @@ -var searchData= -[ - ['rdstate_331',['rdstate',['../classios.html#afe4d084ba0d2704a27525147d1463c36',1,'ios']]], - ['read_332',['read',['../class_minimum_serial.html#a4890dd60f2ffb61eba0821cc80d411ad',1,'MinimumSerial::read()'],['../class_ex_fat_file.html#a77f4fea0aae0c8bae926fdfbba260a55',1,'ExFatFile::read()'],['../class_ex_fat_file.html#a5ae5477efe55179cf07e173c62654313',1,'ExFatFile::read(void *buf, size_t count)'],['../class_fat_file.html#a60ae55ff6fe158c2340071d702a363c5',1,'FatFile::read()'],['../class_fat_file.html#aba893af8107a18017482d2311b066187',1,'FatFile::read(void *buf, size_t count)'],['../class_fat_cache.html#a9c3d0dfa0d987f2c8dbad2d35024b56b',1,'FatCache::read()'],['../class_stream_file.html#a249a5d428f303e2a8e7c3ae476e74829',1,'StreamFile::read()'],['../class_fs_base_file.html#acbe2d203d212a50871db77a9b2ba01f6',1,'FsBaseFile::read()'],['../class_fs_base_file.html#ae8d8cb4cceda9d56e8dae692d04a46e6',1,'FsBaseFile::read(void *buf, size_t count)']]], - ['readcid_333',['readCID',['../class_sd_card_interface.html#ab61ea0c742074271de0552c46be8ae51',1,'SdCardInterface::readCID()'],['../class_sdio_card.html#a2490b07ee400aaf799ea5c37052041bf',1,'SdioCard::readCID()'],['../class_sd_spi_card.html#aa073dc42828164883db1b9faeff909ea',1,'SdSpiCard::readCID()']]], - ['readcsd_334',['readCSD',['../class_sd_card_interface.html#a8aaf7a014423034652f2a1ded1aaa127',1,'SdCardInterface::readCSD()'],['../class_sdio_card.html#a72bbb4fda29fb6313981a63ea2f43d5f',1,'SdioCard::readCSD()'],['../class_sd_spi_card.html#a9fbea9525e70f6e3602fe5153a5a1290',1,'SdSpiCard::readCSD()']]], - ['readdata_335',['readData',['../class_sdio_card.html#a9dc1cd99d0136e514faaecf56a6318d2',1,'SdioCard::readData()'],['../class_sd_spi_card.html#a3a1d1b4b4ceb42fcd41aaf6649482770',1,'SdSpiCard::readData()']]], - ['readdir_336',['readDir',['../class_fat_file.html#a29502cd34ef186763d2196daef27df1f',1,'FatFile']]], - ['readline_337',['readline',['../class_arduino_in_stream.html#ad4c60f813b8df6dd1d6696a3458de09c',1,'ArduinoInStream']]], - ['readocr_338',['readOCR',['../class_sd_card_interface.html#abb2742e6e81d18552308519a0dfb72a6',1,'SdCardInterface::readOCR()'],['../class_sdio_card.html#adc583f7a27f57ce55ce474b1379b9303',1,'SdioCard::readOCR()'],['../class_sd_spi_card.html#ab446e49338b3ce834a750ac6dae35f61',1,'SdSpiCard::readOCR()']]], - ['readsector_339',['readSector',['../class_block_device_interface.html#a537ffdf8645666ee60d9bee0d7e3d17e',1,'BlockDeviceInterface::readSector()'],['../class_sdio_card.html#a77ae4fbe24bb04b74af5d388d4139dde',1,'SdioCard::readSector()'],['../class_sd_spi_card.html#adbdb4df6d74ffa21df7f19a46c781f17',1,'SdSpiCard::readSector()']]], - ['readsectors_340',['readSectors',['../class_block_device_interface.html#aeee2944296d4aaabd00ee7be90596c5c',1,'BlockDeviceInterface::readSectors()'],['../class_sdio_card.html#a1ed4229446a5a2fe815d460b027243b9',1,'SdioCard::readSectors()'],['../class_sd_spi_card.html#a248a56a6b15182c4d558f497c99fbf15',1,'SdSpiCard::readSectors()']]], - ['readsingle_341',['readSingle',['../class_sd_spi_card.html#a6eb6241369637ca07c0d1c3fe303750d',1,'SdSpiCard']]], - ['readstart_342',['readStart',['../class_sdio_card.html#a9fde1fb0e6603e7140cac16395815df0',1,'SdioCard::readStart(uint32_t sector)'],['../class_sdio_card.html#a54732c9d38998ddd42b72b720e0ee54c',1,'SdioCard::readStart(uint32_t sector, uint32_t count)'],['../class_sd_spi_card.html#a6f10180a070fa01834cef47e70649a8e',1,'SdSpiCard::readStart()']]], - ['readstatus_343',['readStatus',['../class_sd_spi_card.html#a91d0413599efe0d63c8c2dfe4a12d9ae',1,'SdSpiCard']]], - ['readstop_344',['readStop',['../class_sdio_card.html#a5bd3f206d790149340783135d08eb701',1,'SdioCard::readStop()'],['../class_sd_spi_card.html#afdac7c399fa1ba3f904cf503526e007e',1,'SdSpiCard::readStop()']]], - ['receive_345',['receive',['../class_sd_spi_arduino_driver.html#a8d6bc852a52e9d69c4b1e48ee062e8d1',1,'SdSpiArduinoDriver::receive()'],['../class_sd_spi_arduino_driver.html#a4f5be313b836ca937a5b5be6432987ec',1,'SdSpiArduinoDriver::receive(uint8_t *buf, size_t count)'],['../class_sd_spi_base_class.html#a537c71fb2cdb8a825215c0faeb6f7dbd',1,'SdSpiBaseClass::receive()=0'],['../class_sd_spi_base_class.html#a45693c18a8bb44ec9e5b9b1dee39b393',1,'SdSpiBaseClass::receive(uint8_t *buf, size_t count)=0'],['../class_sd_spi_soft_driver.html#a189c85920acdcb3ad90b68a998ffeb2a',1,'SdSpiSoftDriver::receive()=0'],['../class_sd_spi_soft_driver.html#a94c6dc242a83a91be44f994a67a7f583',1,'SdSpiSoftDriver::receive(uint8_t *buf, size_t count)'],['../class_soft_spi_driver.html#a0c2a84b8b0f7b4eaa9d970aa3f31a6d8',1,'SoftSpiDriver::receive()']]], - ['remove_346',['remove',['../class_ex_fat_file.html#a8e88c8e79551a72cc98310038514c47a',1,'ExFatFile::remove()'],['../class_ex_fat_file.html#ad10417a851dba3d40a78eb2c0eb11fff',1,'ExFatFile::remove(const ExChar_t *path)'],['../class_ex_fat_volume.html#a58061d05f5dc5a52706cdd61a1a86e80',1,'ExFatVolume::remove(const ExChar_t *path)'],['../class_ex_fat_volume.html#adc22ad4ce966654944b18d31fc6ac5ee',1,'ExFatVolume::remove(const String &path)'],['../class_fat_file.html#ac837a537fbcca14c7aa390c5fc9f4e7c',1,'FatFile::remove()'],['../class_fat_file.html#a75d3276f0b02b03e863afafe5731fedb',1,'FatFile::remove(const char *path)'],['../class_fat_volume.html#abb11d05ef407775bcdb9b14a6c608433',1,'FatVolume::remove(const char *path)'],['../class_fat_volume.html#a994411f55df474be6be87f06100c2c39',1,'FatVolume::remove(const String &path)'],['../class_fs_base_file.html#a8d21f9df86e846e34c3bb11cf7db21bc',1,'FsBaseFile::remove()'],['../class_fs_base_file.html#a64feff69c4f09e56247c7f9dc7c74f34',1,'FsBaseFile::remove(const char *path)'],['../class_fs_volume.html#aaaa53cfc48602b3d1524508944bd112e',1,'FsVolume::remove(const char *path)'],['../class_fs_volume.html#a069e1d9b3a6bba07b7edc5dcde434e0c',1,'FsVolume::remove(const String &path)']]], - ['rename_347',['rename',['../class_ex_fat_file.html#aab50b2646035f76834c75230d2b55c64',1,'ExFatFile::rename(const ExChar_t *newPath)'],['../class_ex_fat_file.html#aea570a3b6afbe633d874803b137a46b8',1,'ExFatFile::rename(ExFatFile *dirFile, const ExChar_t *newPath)'],['../class_ex_fat_volume.html#a8dcd1b108167803a24f7314f5fce6bc4',1,'ExFatVolume::rename(const ExChar_t *oldPath, const ExChar_t *newPath)'],['../class_ex_fat_volume.html#a1396c06f6c5e138889125d2f62cdbdcb',1,'ExFatVolume::rename(const String &oldPath, const String &newPath)'],['../class_fat_file.html#a4cebcac13c1f4c9de7a055ae73133599',1,'FatFile::rename(const char *newPath)'],['../class_fat_file.html#a4b42f2454ff462555c07ea094a92a1e0',1,'FatFile::rename(FatFile *dirFile, const char *newPath)'],['../class_fat_volume.html#a5e4ea6c91569dc435c7aacd7ba704911',1,'FatVolume::rename(const char *oldPath, const char *newPath)'],['../class_fat_volume.html#aa7015c0f694261780081c79c05d0882d',1,'FatVolume::rename(const String &oldPath, const String &newPath)'],['../class_fs_base_file.html#af532d87177e86995a053503eb9152115',1,'FsBaseFile::rename(const char *newPath)'],['../class_fs_base_file.html#a4e4347f6e89bf0b487824dbdc5b82068',1,'FsBaseFile::rename(FsBaseFile *dirFile, const char *newPath)'],['../class_fs_volume.html#aae3be08aff89f5a113cfa0b89c4a6004',1,'FsVolume::rename(const char *oldPath, const char *newPath)'],['../class_fs_volume.html#a7da5cf51eceaa2ea8799be05c3bf9258',1,'FsVolume::rename(const String &oldPath, const String &newPath)']]], - ['reserved_348',['reserved',['../struct_c_i_d.html#a7d489455802a3a9728a5cec60927a7c7',1,'CID']]], - ['rewind_349',['rewind',['../class_ex_fat_file.html#a3c1d3ef65284ffb13ed3ceee472adf9a',1,'ExFatFile::rewind()'],['../class_fat_file.html#a5aac6e0b3cb08fc8b8668e916a8b0ca5',1,'FatFile::rewind()'],['../class_stdio_stream.html#ad985866675193d2ee1dde9e27b0d08da',1,'StdioStream::rewind()'],['../class_fs_base_file.html#a22f8ef845d610493ebe314e19ddda561',1,'FsBaseFile::rewind()']]], - ['rewinddirectory_350',['rewindDirectory',['../class_stream_file.html#a91e8cfbde27d6879b4f51d2ceb2a9f06',1,'StreamFile::rewindDirectory()'],['../class_fs_base_file.html#a56bfeb031562a6fb30e057670e6b326d',1,'FsBaseFile::rewindDirectory()']]], - ['right_351',['right',['../classios__base.html#aec064a12730b5d87e718c1864e29ac64',1,'ios_base::right()'],['../ios_8h.html#aee80fd600c5c58a2bebbd48afdcf8280',1,'right(): ios.h']]], - ['rmdir_352',['rmdir',['../class_ex_fat_file.html#a0165e0fde12a53e419bd92cd37f9cfed',1,'ExFatFile::rmdir()'],['../class_ex_fat_volume.html#ab9e3e7d9538c905ca60b834e244943ee',1,'ExFatVolume::rmdir(const ExChar_t *path)'],['../class_ex_fat_volume.html#af0adfad817e085d676479fefbb343197',1,'ExFatVolume::rmdir(const String &path)'],['../class_fat_file.html#a9515bac181d33e7f0125e88fa2ccd283',1,'FatFile::rmdir()'],['../class_fat_volume.html#af1181990bcece7dbb7d19293dd4fe11a',1,'FatVolume::rmdir(const char *path)'],['../class_fat_volume.html#a105f437fb649b57ed3823f8ff1a2f37e',1,'FatVolume::rmdir(const String &path)'],['../class_fs_base_file.html#ac47870fd89b0849cda33f2780918a286',1,'FsBaseFile::rmdir()'],['../class_fs_volume.html#ad2457b491bf85495140fd4a8ca743513',1,'FsVolume::rmdir(const char *path)'],['../class_fs_volume.html#a32cdbc9c2d29ed95b2a7ff8d117dadc8',1,'FsVolume::rmdir(const String &path)']]], - ['rmrfstar_353',['rmRfStar',['../class_fat_file.html#ac780a80526f86d3def701ecdc99d8bfe',1,'FatFile']]], - ['rootdirectorycluster_354',['rootDirectoryCluster',['../class_ex_fat_partition.html#ac7ddc5d4efd1651816f1284980b6f790',1,'ExFatPartition']]], - ['rootdirentrycount_355',['rootDirEntryCount',['../class_fat_partition.html#a6ba99b9711269b5ab6ca091b88e81288',1,'FatPartition']]], - ['rootdirstart_356',['rootDirStart',['../class_fat_partition.html#a5d005e0f6fd4b84da8a5ebdea03aaf85',1,'FatPartition']]], - ['rootlength_357',['rootLength',['../class_ex_fat_partition.html#a9412bd687edc99266c88f8aa87f01c51',1,'ExFatPartition']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.html deleted file mode 100644 index 2f927fe5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.js deleted file mode 100644 index c1782d4d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_11.js +++ /dev/null @@ -1,107 +0,0 @@ -var searchData= -[ - ['sd_5fchip_5fselect_5fmode_358',['SD_CHIP_SELECT_MODE',['../_sd_fat_config_8h.html#ab81c0135853c34b24c8314849950f6ab',1,'SdFatConfig.h']]], - ['sd_5ffat_5fversion_359',['SD_FAT_VERSION',['../_sd_fat_8h.html#aca25ecce379f446043bdee2c55304210',1,'SdFat.h']]], - ['sd_5fhas_5fcustom_5fspi_360',['SD_HAS_CUSTOM_SPI',['../_sd_fat_config_8h.html#a838861a01379e94361148d22e62b1977',1,'SdFatConfig.h']]], - ['sd_5fmax_5finit_5frate_5fkhz_361',['SD_MAX_INIT_RATE_KHZ',['../_sd_fat_config_8h.html#adb969469c422c2da5438963623bdfbd3',1,'SdFatConfig.h']]], - ['sd_5fsck_5fhz_362',['SD_SCK_HZ',['../_sd_spi_driver_8h.html#a7509778808cb232d96b7c45ad76034b0',1,'SdSpiDriver.h']]], - ['sd_5fsck_5fmhz_363',['SD_SCK_MHZ',['../_sd_spi_driver_8h.html#af9d0d377262ffe2bf47d8604381a5ec1',1,'SdSpiDriver.h']]], - ['sdbase_364',['SdBase',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20exfatvolume_20_3e_365',['SdBase< ExFatVolume >',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20fatvolume_20_3e_366',['SdBase< FatVolume >',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20fsvolume_20_3e_367',['SdBase< FsVolume >',['../class_sd_base.html',1,'']]], - ['sdbasefile_368',['SdBaseFile',['../_sd_fat_8h.html#a3991b0f70199d1a17dbb837bb041e89c',1,'SdFat.h']]], - ['sdcardfactory_369',['SdCardFactory',['../class_sd_card_factory.html',1,'']]], - ['sdcardinterface_370',['SdCardInterface',['../class_sd_card_interface.html',1,'']]], - ['sdcsinit_371',['sdCsInit',['../_sd_spi_driver_8h.html#ad4854101780daaa378827ecb62ef86d9',1,'SdSpiChipSelect.cpp']]], - ['sdcspin_5ft_372',['SdCsPin_t',['../_sd_fat_config_8h.html#a7a489fb14a59adf251794342604fc5ea',1,'SdFatConfig.h']]], - ['sdcswrite_373',['sdCsWrite',['../_sd_spi_driver_8h.html#ac469bbe2d31ffde9b00ffc68258d7428',1,'SdSpiChipSelect.cpp']]], - ['sderrorcode_374',['sdErrorCode',['../class_sd_base.html#af2bb8fea732f9272a2e98772fbcc4595',1,'SdBase']]], - ['sderrordata_375',['sdErrorData',['../class_sd_base.html#a5f8f363b6c23f1d8bfeb858c946f1994',1,'SdBase']]], - ['sdexfat_376',['SdExFat',['../class_sd_ex_fat.html',1,'']]], - ['sdfat_377',['SdFat',['../_sd_fat_8h.html#a6e295d38f798fdc044c3282818cdb064',1,'SdFat.h']]], - ['sdfat_2eh_378',['SdFat.h',['../_sd_fat_8h.html',1,'']]], - ['sdfat32_379',['SdFat32',['../class_sd_fat32.html',1,'']]], - ['sdfat_5ffile_5ftype_380',['SDFAT_FILE_TYPE',['../_sd_fat_config_8h.html#acdbec9ae1f12e4154878ac10672103fb',1,'SdFatConfig.h']]], - ['sdfatconfig_2eh_381',['SdFatConfig.h',['../_sd_fat_config_8h.html',1,'']]], - ['sdfile_382',['SdFile',['../class_sd_file.html',1,'SdFile'],['../class_sd_file.html#ad05be3a1fb635448d15a154424b6c33f',1,'SdFile::SdFile()']]], - ['sdfs_383',['SdFs',['../class_sd_fs.html',1,'']]], - ['sdiocard_384',['SdioCard',['../class_sdio_card.html',1,'']]], - ['sdioconfig_385',['SdioConfig',['../class_sdio_config.html',1,'SdioConfig'],['../class_sdio_config.html#a1eaa863465cec6f67210b4888532b3dd',1,'SdioConfig::SdioConfig()']]], - ['sdios_2eh_386',['sdios.h',['../sdios_8h.html',1,'']]], - ['sdmillis_5ft_387',['SdMillis_t',['../_sys_call_8h.html#a94fe72e6e55572f63ac9d8fbad429980',1,'SysCall.h']]], - ['sdspiarduinodriver_388',['SdSpiArduinoDriver',['../class_sd_spi_arduino_driver.html',1,'']]], - ['sdspiarduinodriver_2eh_389',['SdSpiArduinoDriver.h',['../_sd_spi_arduino_driver_8h.html',1,'']]], - ['sdspibaseclass_390',['SdSpiBaseClass',['../class_sd_spi_base_class.html',1,'']]], - ['sdspibaseclass_2eh_391',['SdSpiBaseClass.h',['../_sd_spi_base_class_8h.html',1,'']]], - ['sdspicard_392',['SdSpiCard',['../class_sd_spi_card.html',1,'SdSpiCard'],['../class_sd_spi_card.html#a0441c5da53bd3bd72fb833fc940f25e8',1,'SdSpiCard::SdSpiCard()']]], - ['sdspicard_2eh_393',['SdSpiCard.h',['../_sd_spi_card_8h.html',1,'']]], - ['sdspiconfig_394',['SdSpiConfig',['../class_sd_spi_config.html',1,'SdSpiConfig'],['../class_sd_spi_config.html#a3c68a4b6ddc549abfb62fa662b59ef10',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t *port)'],['../class_sd_spi_config.html#adb0a2a3d7dc801305fef5167d538abe1',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed)'],['../class_sd_spi_config.html#a30087e90e8c4043aed90693c3be5855b',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt)'],['../class_sd_spi_config.html#a038e3578396f4682f1b8cd0b934f42f1',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs)']]], - ['sdspidriver_395',['SdSpiDriver',['../_sd_spi_arduino_driver_8h.html#a737a41f87fd0d1824d87d83a1f976c14',1,'SdSpiDriver(): SdSpiArduinoDriver.h'],['../_sd_spi_soft_driver_8h.html#a8990c69a7a6a738c2e74dc155a98430b',1,'SdSpiDriver(): SdSpiSoftDriver.h']]], - ['sdspidriver_2eh_396',['SdSpiDriver.h',['../_sd_spi_driver_8h.html',1,'']]], - ['sdspilibdriver_2eh_397',['SdSpiLibDriver.h',['../_sd_spi_lib_driver_8h.html',1,'']]], - ['sdspisoftdriver_398',['SdSpiSoftDriver',['../class_sd_spi_soft_driver.html',1,'']]], - ['sdspisoftdriver_2eh_399',['SdSpiSoftDriver.h',['../_sd_spi_soft_driver_8h.html',1,'']]], - ['sector_400',['sector',['../class_fs_cache.html#a5b90e145400de8687d9f34536b134130',1,'FsCache::sector()'],['../class_fat_cache.html#a1a9d892b5a68463598bb39d2732cb664',1,'FatCache::sector()']]], - ['sectorcount_401',['sectorCount',['../class_block_device_interface.html#a1531ba16d499510ae60be288112faae1',1,'BlockDeviceInterface::sectorCount()'],['../class_sd_card_interface.html#a1a8c37709b578bffc556240f6f03a8da',1,'SdCardInterface::sectorCount()'],['../class_sdio_card.html#a49a502cf7b59dc559a6c75a3285e6c1a',1,'SdioCard::sectorCount()'],['../class_sd_spi_card.html#a463ee796cf57c7e3e93f7817895fc492',1,'SdSpiCard::sectorCount()']]], - ['sectormask_402',['sectorMask',['../class_fat_partition.html#a6b970fa2e06de1a826b09e251dc3119b',1,'FatPartition']]], - ['sectorspercluster_403',['sectorsPerCluster',['../class_ex_fat_partition.html#a12798377b4d3cb16891607c543d0bded',1,'ExFatPartition::sectorsPerCluster()'],['../class_fat_partition.html#a836546c368e6ffe117e6ab8775d23eba',1,'FatPartition::sectorsPerCluster()'],['../class_fs_volume.html#acf62acd37d3f59dedd3e34b3e7d64da0',1,'FsVolume::sectorsPerCluster()']]], - ['sectorsperclustershift_404',['sectorsPerClusterShift',['../class_ex_fat_partition.html#aa4ff8402ba78a2de52ed61175a044ee3',1,'ExFatPartition::sectorsPerClusterShift()'],['../class_fat_partition.html#a593a27482ff8d993542d6f82bd92e26c',1,'FatPartition::sectorsPerClusterShift()']]], - ['sectorsperfat_405',['sectorsPerFat',['../class_fat_partition.html#a1f5c7599333dbe152a3cdd60623ce6d1',1,'FatPartition']]], - ['seek_406',['seek',['../class_stream_file.html#a773ee6f661fc689a5187f51cb5498086',1,'StreamFile::seek()'],['../class_fs_base_file.html#ae86486f4e20f4924797124f9c6042bfd',1,'FsBaseFile::seek()']]], - ['seek_5fcur_407',['SEEK_CUR',['../_stdio_stream_8h.html#a4c8d0b76b470ba65a43ca46a88320f39',1,'StdioStream.h']]], - ['seek_5fend_408',['SEEK_END',['../_stdio_stream_8h.html#ad2a2e6c114780c3071efd24f16c7f7d8',1,'StdioStream.h']]], - ['seek_5fset_409',['SEEK_SET',['../_stdio_stream_8h.html#a0d112bae8fd35be772185b6ec6bcbe64',1,'StdioStream.h']]], - ['seekcur_410',['seekCur',['../class_ex_fat_file.html#ab42494880cf229adfb0fc8edb0647686',1,'ExFatFile::seekCur()'],['../class_fat_file.html#a5812037ea30777cc350698ad26f2c73f',1,'FatFile::seekCur()'],['../class_fs_base_file.html#a5fa242a4598eab5caa6efd4bdf62f5c0',1,'FsBaseFile::seekCur()']]], - ['seekdir_411',['seekdir',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191e',1,'ios_base']]], - ['seekend_412',['seekEnd',['../class_ex_fat_file.html#a2994a71751ed4f137f48b2e9a7d94091',1,'ExFatFile::seekEnd()'],['../class_fat_file.html#a84f677f4e75ef6fa2eb632f4cdf6b486',1,'FatFile::seekEnd()'],['../class_fs_base_file.html#ade9f9a9ac4d3e0a392a6cc45c9551767',1,'FsBaseFile::seekEnd()']]], - ['seekg_413',['seekg',['../classistream.html#a52d637b1aeca9946085a4a72e0208aec',1,'istream::seekg(pos_type pos)'],['../classistream.html#a60dd48a3b374fb9cbdc59e1f930dea95',1,'istream::seekg(off_type off, seekdir way)']]], - ['seekp_414',['seekp',['../classostream.html#a18b453d2770a8852c312cbda919c4687',1,'ostream::seekp(pos_type pos)'],['../classostream.html#af6265a5be29237517b30673667ba4213',1,'ostream::seekp(off_type off, seekdir way)']]], - ['seekset_415',['seekSet',['../class_ex_fat_file.html#a9834c4da2f14c66f4bda26938ebb36f6',1,'ExFatFile::seekSet()'],['../class_fat_file.html#ab067190d25733ed7e697d9890f61fd7a',1,'FatFile::seekSet()'],['../class_fs_base_file.html#a460f7598c903b8a4b4fe868dacccb6dd',1,'FsBaseFile::seekSet()']]], - ['send_416',['send',['../class_sd_spi_arduino_driver.html#a3c4842e47f98fe5d3799cd6028778ab5',1,'SdSpiArduinoDriver::send(uint8_t data)'],['../class_sd_spi_arduino_driver.html#a0516f7cd20263f90f83c57c4c6ce14e4',1,'SdSpiArduinoDriver::send(const uint8_t *buf, size_t count)'],['../class_sd_spi_base_class.html#a28001200e3d464f5c6e910837924c577',1,'SdSpiBaseClass::send(uint8_t data)=0'],['../class_sd_spi_base_class.html#a51923b03f35af4bac7c3bb7c8d13303d',1,'SdSpiBaseClass::send(const uint8_t *buf, size_t count)=0'],['../class_sd_spi_soft_driver.html#a89eff51e8313d9b27c3641cd8310d022',1,'SdSpiSoftDriver::send(uint8_t data)=0'],['../class_sd_spi_soft_driver.html#a5607c2b3773e25404880a93e5e7a23a1',1,'SdSpiSoftDriver::send(const uint8_t *buf, size_t count)'],['../class_soft_spi_driver.html#ae465952c49043991ec808c2f1eca8e9c',1,'SoftSpiDriver::send()']]], - ['seqpos_417',['seqPos',['../structfname__t.html#a96b7c779dec8dd568be3290451078a4e',1,'fname_t']]], - ['setcallback_418',['setCallback',['../namespace_fs_date_time.html#afae6e23c2ed7d8194023d19d87fb1b62',1,'FsDateTime::setCallback(void(*dateTime)(uint16_t *date, uint16_t *time))'],['../namespace_fs_date_time.html#aa48bd625d32aae8fcfe67aba1d080be3',1,'FsDateTime::setCallback(void(*dateTime)(uint16_t *date, uint16_t *time, uint8_t *ms10))']]], - ['setf_419',['setf',['../classios__base.html#ab5db835cb45bba7684ebf72d9a3cccb4',1,'ios_base::setf(fmtflags fl)'],['../classios__base.html#a74dbc93607ab7d68a87ec326b92b6c81',1,'ios_base::setf(fmtflags fl, fmtflags mask)']]], - ['setfill_420',['setfill',['../structsetfill.html',1,'setfill'],['../structsetfill.html#abcd87f0632678d277df55406d25c8325',1,'setfill::setfill()']]], - ['setprecision_421',['setprecision',['../structsetprecision.html',1,'setprecision'],['../structsetprecision.html#a73fce143591989f56ef887a2ea86ac45',1,'setprecision::setprecision()']]], - ['setsckspeed_422',['setSckSpeed',['../class_sd_spi_arduino_driver.html#acf0cc41d2bd80479237aa2799e119973',1,'SdSpiArduinoDriver::setSckSpeed()'],['../class_sd_spi_base_class.html#a937215f1dc238285bd140c11ab82bbc9',1,'SdSpiBaseClass::setSckSpeed()'],['../class_sd_spi_soft_driver.html#a6002aaab8f8a751cbfc3274b17856930',1,'SdSpiSoftDriver::setSckSpeed()']]], - ['setstate_423',['setstate',['../classios.html#aee5d194656bdfb0c8621b23ea2f51afb',1,'ios']]], - ['setw_424',['setw',['../structsetw.html',1,'setw'],['../structsetw.html#afd8bfd075474f63df3c8b44ad47517d2',1,'setw::setw()']]], - ['sfn_425',['sfn',['../structfname__t.html#a37ed0c108b1feb81be4f8c041a4336bd',1,'fname_t']]], - ['shared_5fspi_426',['SHARED_SPI',['../_sd_spi_driver_8h.html#a5601868235dd7041b2e6e0be9445fe5d',1,'SdSpiDriver.h']]], - ['showbase_427',['showbase',['../classios__base.html#a7e3373ab307feecfc228bc9bdb29cd01',1,'ios_base::showbase()'],['../ios_8h.html#a73159e1398939807aeae6015dd86f2f4',1,'showbase(): ios.h']]], - ['showpoint_428',['showpoint',['../classios__base.html#ac9bb172682e157f037bd7fb82a236ee6',1,'ios_base::showpoint()'],['../ios_8h.html#a322f5897ace09768cd782f0c8f222770',1,'showpoint(): ios.h']]], - ['showpos_429',['showpos',['../classios__base.html#a7bfa4a883933105d10f8ce2693cb9f21',1,'ios_base::showpos()'],['../ios_8h.html#a80798554dbfece679adb0e05eb855943',1,'showpos(): ios.h']]], - ['size_430',['size',['../class_stream_file.html#a5813d451e7f7ba57a04d177caffc5a9f',1,'StreamFile::size()'],['../class_fs_base_file.html#a1c27b009372668a9c2de4a57195b0b36',1,'FsBaseFile::size()']]], - ['skipwhite_431',['skipWhite',['../classistream.html#a0f7468be86d93de5d33fa99095898279',1,'istream']]], - ['skipws_432',['skipws',['../classios__base.html#a64977c777d6e45826d1be9763f17f824',1,'ios_base::skipws()'],['../ios_8h.html#a972282e5d9d894f61c8a54423858c0a4',1,'skipws(): ios.h']]], - ['softspidriver_433',['SoftSpiDriver',['../class_soft_spi_driver.html',1,'']]], - ['spi_5fdiv3_5fspeed_434',['SPI_DIV3_SPEED',['../_sd_spi_driver_8h.html#a2d3c9c75ba6bea3fbcb82c2d0fbc21bb',1,'SdSpiDriver.h']]], - ['spi_5fdiv6_5fspeed_435',['SPI_DIV6_SPEED',['../_sd_spi_driver_8h.html#acbca47c0a33eec35109cea773bb65ee0',1,'SdSpiDriver.h']]], - ['spi_5fdriver_5fselect_436',['SPI_DRIVER_SELECT',['../_sd_fat_config_8h.html#a6761799c8dffafbf5b7dd914772be28c',1,'SdFatConfig.h']]], - ['spi_5feighth_5fspeed_437',['SPI_EIGHTH_SPEED',['../_sd_spi_driver_8h.html#a4818fb924fd75160a3fcd5d14abdc375',1,'SdSpiDriver.h']]], - ['spi_5ffull_5fspeed_438',['SPI_FULL_SPEED',['../_sd_spi_driver_8h.html#a785afdf191e080f93703ad0a6f8f3d3b',1,'SdSpiDriver.h']]], - ['spi_5fhalf_5fspeed_439',['SPI_HALF_SPEED',['../_sd_spi_driver_8h.html#af7493f43efa1c1be2b718bd3cc759d0e',1,'SdSpiDriver.h']]], - ['spi_5fquarter_5fspeed_440',['SPI_QUARTER_SPEED',['../_sd_spi_driver_8h.html#a3bfd4f8b788952234111778be51087ae',1,'SdSpiDriver.h']]], - ['spi_5fsixteenth_5fspeed_441',['SPI_SIXTEENTH_SPEED',['../_sd_spi_driver_8h.html#a6d3bbc68aed8dc3948669d0d40f4eb11',1,'SdSpiDriver.h']]], - ['spiport_442',['spiPort',['../class_sd_spi_config.html#aedaada290c35b55d36671ca377620480',1,'SdSpiConfig']]], - ['spiport_5ft_443',['SpiPort_t',['../_sd_spi_driver_8h.html#a472d56ea7cb52ec5d68b3067baa000c3',1,'SdSpiDriver.h']]], - ['spistart_444',['spiStart',['../class_sd_spi_card.html#aa39feb6ebb269071ac6843a424ac311c',1,'SdSpiCard']]], - ['spistop_445',['spiStop',['../class_sd_spi_card.html#a1033a4a68d38f52dddf6a1764fcca3e1',1,'SdSpiCard']]], - ['status_446',['status',['../class_sd_card_interface.html#a6315bf0d5852bc24563b7977f7c7e5b4',1,'SdCardInterface::status()'],['../class_sdio_card.html#a58880a055e58410f8b22658b88622f63',1,'SdioCard::status()']]], - ['stdiostream_447',['StdioStream',['../class_stdio_stream.html',1,'StdioStream'],['../class_stdio_stream.html#a96b2c027e76bfca6d6835c9ae1be2ad2',1,'StdioStream::StdioStream()']]], - ['stdiostream_2eh_448',['StdioStream.h',['../_stdio_stream_8h.html',1,'']]], - ['stream_5fbuf_5fsize_449',['STREAM_BUF_SIZE',['../_stdio_stream_8h.html#ad9a6150ef11e2616c1a99bc777df17d3',1,'StdioStream.h']]], - ['stream_5ft_450',['stream_t',['../_sys_call_8h.html#a708fe172ce8f40fdb50a2df8c567d07a',1,'SysCall.h']]], - ['streambaseclass_451',['StreamBaseClass',['../class_stream_base_class.html',1,'']]], - ['streambasefile_452',['StreamBaseFile',['../ios_8h.html#a77934df7b6e6d581c762dd387e2b5162',1,'ios.h']]], - ['streamfile_453',['StreamFile',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20exfatfile_2c_20uint64_5ft_20_3e_454',['StreamFile< ExFatFile, uint64_t >',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20fatfile_2c_20uint32_5ft_20_3e_455',['StreamFile< FatFile, uint32_t >',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20fsbasefile_2c_20uint64_5ft_20_3e_456',['StreamFile< FsBaseFile, uint64_t >',['../class_stream_file.html',1,'']]], - ['streamsize_457',['streamsize',['../classios__base.html#a82836e1d3cc603fba8f0b54d323a2dff',1,'ios_base']]], - ['sync_458',['sync',['../class_buffered_print.html#a2253d1e7f231b94b18eab1281c123a49',1,'BufferedPrint::sync()'],['../class_ex_fat_file.html#a2cb3638069afd2d01b79e5dff1a66f55',1,'ExFatFile::sync()'],['../class_fs_cache.html#a5a2c8fb432d7b7590ebb43200ca21893',1,'FsCache::sync()'],['../class_fat_file.html#a67f3dc4896c542d695e11aac927f585e',1,'FatFile::sync()'],['../class_fat_cache.html#a4d76d4f46ce5994f6fc4678a7b4f8cf1',1,'FatCache::sync()'],['../class_fs_base_file.html#acf2d9261c5c1b1b022a0414cdfe0a17b',1,'FsBaseFile::sync()']]], - ['syncdevice_459',['syncDevice',['../class_block_device_interface.html#a23e30999f1cc03da99e285cf180dbbb7',1,'BlockDeviceInterface::syncDevice()'],['../class_sdio_card.html#a1201ec7a6fa91b73a1daa584a1b055f7',1,'SdioCard::syncDevice()'],['../class_sd_spi_card.html#ac9f3bfbfc5029f93da1fa233cbe617c4',1,'SdSpiCard::syncDevice()']]], - ['syscall_460',['SysCall',['../class_sys_call.html',1,'']]], - ['syscall_2eh_461',['SysCall.h',['../_sys_call_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.html deleted file mode 100644 index 6b0988c9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.js deleted file mode 100644 index 87bfc9e1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_12.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['tellg_462',['tellg',['../classistream.html#a18332bdcb7fbe33ca06045c786cac4c3',1,'istream']]], - ['tellp_463',['tellp',['../classostream.html#a92dec0e2bc8352df1419d1cdc434e619',1,'ostream']]], - ['timestamp_464',['timestamp',['../class_ex_fat_file.html#a6d3ab10983e206401ebd5c24a1c46174',1,'ExFatFile::timestamp()'],['../class_fat_file.html#a56dabdf73833b7e961c4530eb8e16d23',1,'FatFile::timestamp()'],['../class_fs_base_file.html#acea65e639feebaac01964af02a77d324',1,'FsBaseFile::timestamp()']]], - ['trunc_465',['trunc',['../classios__base.html#ae62b8972f37509819e1384214071194b',1,'ios_base']]], - ['truncate_466',['truncate',['../class_ex_fat_file.html#aca37955d3c7cce40f7f9e1ea078e5636',1,'ExFatFile::truncate()'],['../class_ex_fat_file.html#a6262b0d6d43d2a426953a0a7d90f624f',1,'ExFatFile::truncate(uint64_t length)'],['../class_ex_fat_volume.html#ae5cbcdd7907a882b4686cb3ba7e85bcc',1,'ExFatVolume::truncate(const ExChar_t *path, uint64_t length)'],['../class_ex_fat_volume.html#ae6d409b7f24593dca7aae70513e18b70',1,'ExFatVolume::truncate(const String &path, uint64_t length)'],['../class_fat_file.html#a7dda881dac19ea2aa9b2e85a229a98d7',1,'FatFile::truncate()'],['../class_fat_file.html#aa6e663098a578635d37d92e82d18d616',1,'FatFile::truncate(uint32_t length)'],['../class_fat_volume.html#a86a08bf789e33567418465b9b12751e2',1,'FatVolume::truncate(const char *path, uint32_t length)'],['../class_fat_volume.html#a97ef39ec02c38c0772f0029d42edcb46',1,'FatVolume::truncate(const String &path, uint32_t length)'],['../class_fs_base_file.html#a2a0bf00241df08a604f054512746986b',1,'FsBaseFile::truncate()'],['../class_fs_base_file.html#a47247cc54157ef79e0752f55ba01cf7e',1,'FsBaseFile::truncate(uint64_t length)']]], - ['type_467',['type',['../class_sd_card_interface.html#a80796bc06b4090c15b3d46e651dd38c8',1,'SdCardInterface::type()'],['../class_sdio_card.html#a22451464dba5275838908c2d19392850',1,'SdioCard::type()'],['../class_sd_spi_card.html#ac53e0f3575db5be26dcba825bab3ca12',1,'SdSpiCard::type()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.html deleted file mode 100644 index 7e5f42a9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.js deleted file mode 100644 index 137ffa5c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_13.js +++ /dev/null @@ -1,18 +0,0 @@ -var searchData= -[ - ['ungetc_468',['ungetc',['../class_stdio_stream.html#ac00e0dd906c2e857ece53794c6c92786',1,'StdioStream']]], - ['ungetc_5fbuf_5fsize_469',['UNGETC_BUF_SIZE',['../_stdio_stream_8h.html#a785dd413c0d7b05f95df82d3453ecacd',1,'StdioStream.h']]], - ['unsetf_470',['unsetf',['../classios__base.html#a3bf7d054a433ed15e8b984e16f630fa4',1,'ios_base']]], - ['unusedstack_471',['UnusedStack',['../_free_stack_8h.html#a0a6400cf785c9647c0bacb76b15851de',1,'FreeStack.cpp']]], - ['uppercase_472',['uppercase',['../classios__base.html#ade3db1fe3249e87f4c47a9a8916793d9',1,'ios_base::uppercase()'],['../ios_8h.html#af5d5e1a0effa1b500bb882feed5a2061',1,'uppercase(): ios.h']]], - ['use_5fblock_5fdevice_5finterface_473',['USE_BLOCK_DEVICE_INTERFACE',['../_sd_fat_config_8h.html#ae92cc0fb2a31925cfc5694feb048dca2',1,'SdFatConfig.h']]], - ['use_5fexfat_5fbitmap_5fcache_474',['USE_EXFAT_BITMAP_CACHE',['../_sd_fat_config_8h.html#a8d3fca2607182c1ba389dd61c283a3e2',1,'SdFatConfig.h']]], - ['use_5ffat_5ffile_5fflag_5fcontiguous_475',['USE_FAT_FILE_FLAG_CONTIGUOUS',['../_sd_fat_config_8h.html#ad42a354208ecb245adfc238266a612e5',1,'SdFatConfig.h']]], - ['use_5ffcntl_5fh_476',['USE_FCNTL_H',['../_sd_fat_config_8h.html#ab4b7255422e65730612f1f6af1a26752',1,'SdFatConfig.h']]], - ['use_5flong_5ffile_5fnames_477',['USE_LONG_FILE_NAMES',['../_sd_fat_config_8h.html#a2536b194b3b007604a39e8526e108b52',1,'SdFatConfig.h']]], - ['use_5fmulti_5fsector_5fio_478',['USE_MULTI_SECTOR_IO',['../_sd_fat_config_8h.html#ae477a983188d4370faff32b07a5cfacb',1,'SdFatConfig.h']]], - ['use_5fsd_5fcrc_479',['USE_SD_CRC',['../_sd_fat_config_8h.html#af2e76ffb2fdb830175abf513dd640fdd',1,'SdFatConfig.h']]], - ['use_5fseparate_5ffat_5fcache_480',['USE_SEPARATE_FAT_CACHE',['../_sd_fat_config_8h.html#a23f662882413dcb017ebd8107473b8c3',1,'SdFatConfig.h']]], - ['use_5fsimple_5flittle_5fendian_481',['USE_SIMPLE_LITTLE_ENDIAN',['../_sd_fat_config_8h.html#a9d4fac424e31b4383a10211f0489d93b',1,'SdFatConfig.h']]], - ['usedma_482',['useDma',['../class_sdio_config.html#a07ddb8b18bf24fa61fdd289a112e79a8',1,'SdioConfig']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.html deleted file mode 100644 index ec7711ee..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.js deleted file mode 100644 index b9a15f0d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_14.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['validlength_483',['validLength',['../class_ex_fat_file.html#afc8af11ba8e3a830dff1dd5e59446243',1,'ExFatFile']]], - ['vfprintf_484',['vfprintf',['../_print_templates_8h.html#aa3bc14da82a850b0f8ce848a6d54045f',1,'PrintTemplates.h']]], - ['vmprintf_485',['vmprintf',['../_print_templates_8h.html#ad139f8bf9b6ead8bd28abf1dd412a8a4',1,'PrintTemplates.h']]], - ['vol_486',['vol',['../class_sd_base.html#a20ed1868a6498cd336364c22d1df28a5',1,'SdBase']]], - ['volumebegin_487',['volumeBegin',['../class_sd_base.html#a1f1de2aac5384475b67506f86199e4c8',1,'SdBase']]], - ['volumesectorcount_488',['volumeSectorCount',['../class_fat_partition.html#a916ba7d67711bb62daf12ecd47ca4b8e',1,'FatPartition']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.html deleted file mode 100644 index 2409e3c2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.js deleted file mode 100644 index 7999a55c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_15.js +++ /dev/null @@ -1,14 +0,0 @@ -var searchData= -[ - ['w_489',['w',['../structsetw.html#ab48d915a24d3f3365c9eb76e138a6f4e',1,'setw']]], - ['wdt_5fyield_5ftime_5fmillis_490',['WDT_YIELD_TIME_MILLIS',['../_sd_fat_config_8h.html#a03b3cad4ee9ca6915330f41b2924bca1',1,'SdFatConfig.h']]], - ['width_491',['width',['../classios__base.html#afa30e7644b4eae5928ad9c487ad387de',1,'ios_base::width()'],['../classios__base.html#ab2ba0f005bbf3d8ebed93b64068492e0',1,'ios_base::width(unsigned n)']]], - ['write_492',['write',['../class_buffered_print.html#ab41de6eca77a04a49a6fc965b1950fc5',1,'BufferedPrint::write()'],['../class_minimum_serial.html#a0ca1d9631fe5f2f00878bd481dbbd3aa',1,'MinimumSerial::write()'],['../class_ex_fat_file.html#a6fb2905a5e363554a5118b5d1322cd87',1,'ExFatFile::write(const char *str)'],['../class_ex_fat_file.html#afd011d17d66707623c28927a63f81015',1,'ExFatFile::write(uint8_t b)'],['../class_ex_fat_file.html#abc1423c7b550614d1067e7173f8b46a8',1,'ExFatFile::write(const void *buf, size_t count)'],['../class_fat_file.html#a081dd810835f1ebf8c23ffe92706b485',1,'FatFile::write(const char *str)'],['../class_fat_file.html#ae51e724ac6cc3d67d64a5a666d5850f1',1,'FatFile::write(uint8_t b)'],['../class_fat_file.html#a5d84d871ac904a22aa48308713d14682',1,'FatFile::write(const void *buf, size_t count)'],['../class_print_file.html#a52f78f160083b416d66e23c680e0577d',1,'PrintFile::write()'],['../class_stream_file.html#a0695220134825199b39dee82f18ab1ec',1,'StreamFile::write(uint8_t b)'],['../class_stream_file.html#a0ace3aaaf6d0fb673a43059c0664fab6',1,'StreamFile::write(const uint8_t *buffer, size_t size)'],['../class_fs_base_file.html#a023c0392aa72b32652546f48ef8ba1e5',1,'FsBaseFile::write(uint8_t b)'],['../class_fs_base_file.html#aa763e83fea4889828effc3308f13113a',1,'FsBaseFile::write(const void *buf, size_t count)']]], - ['writedata_493',['writeData',['../class_sd_card_interface.html#ad12a0053d3e832da694bd8d3d66adbc1',1,'SdCardInterface::writeData()'],['../class_sdio_card.html#a8467e7ffafa45ff930b38a6f18e9547a',1,'SdioCard::writeData()'],['../class_sd_spi_card.html#a9495c0b148eb380358bb4a9721c0dffa',1,'SdSpiCard::writeData()']]], - ['writesector_494',['writeSector',['../class_block_device_interface.html#a8a4be0a85c3771c705617fad98303e49',1,'BlockDeviceInterface::writeSector()'],['../class_sdio_card.html#a74919a168bac68028ce62222500cf238',1,'SdioCard::writeSector()'],['../class_sd_spi_card.html#a9a230924d82c5df07df592c571bc3fa5',1,'SdSpiCard::writeSector()']]], - ['writesectors_495',['writeSectors',['../class_block_device_interface.html#a5cb063692a65f092ccdfd14f8700b58a',1,'BlockDeviceInterface::writeSectors()'],['../class_sdio_card.html#a55e2fc82ef9ecf7272a94b565c50303b',1,'SdioCard::writeSectors()'],['../class_sd_spi_card.html#a4165166d5d038c8f1c00c5a04e9f8a63',1,'SdSpiCard::writeSectors()']]], - ['writesingle_496',['writeSingle',['../class_sd_spi_card.html#a3172d671447410f19447b78b856a9689',1,'SdSpiCard']]], - ['writestart_497',['writeStart',['../class_sd_card_interface.html#abf04f87ec5c49fe6d9e23c8ac4cf482d',1,'SdCardInterface::writeStart()'],['../class_sdio_card.html#a1edd70537e2d7fa556532790cf413b5c',1,'SdioCard::writeStart(uint32_t sector)'],['../class_sdio_card.html#a82fe097fdbae26b3c8f92f215499cdf3',1,'SdioCard::writeStart(uint32_t sector, uint32_t count)'],['../class_sd_spi_card.html#ae46068850a0cb9f142d5b0b0147716fa',1,'SdSpiCard::writeStart(uint32_t sector)'],['../class_sd_spi_card.html#a785250ef0281fbb1cbe5078de9e80be3',1,'SdSpiCard::writeStart(uint32_t sector, uint32_t eraseCount)']]], - ['writestop_498',['writeStop',['../class_sd_card_interface.html#a2eac04896a05bd57730e96708934970f',1,'SdCardInterface::writeStop()'],['../class_sdio_card.html#acb560c2ea1f30c646b96f02e728b0fe1',1,'SdioCard::writeStop()'],['../class_sd_spi_card.html#aef9154785a4de5560fb807e4f9316fb0',1,'SdSpiCard::writeStop()']]], - ['ws_499',['ws',['../iostream_8h.html#a8adf4c714b8c8f201dedc83ee04556b1',1,'iostream.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.html deleted file mode 100644 index 37b68745..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.js deleted file mode 100644 index b5331019..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_16.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['yield_500',['yield',['../class_sys_call.html#a2219ba5ea8e411b022a3a00df5f380e0',1,'SysCall']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.html deleted file mode 100644 index 19c530f2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.js deleted file mode 100644 index c3c95ed8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_2.js +++ /dev/null @@ -1,21 +0,0 @@ -var searchData= -[ - ['bad_14',['bad',['../classios.html#a78be4e3069a644ff36d83a70b080c321',1,'ios']]], - ['badbit_15',['badbit',['../classios__base.html#ac8c2c8f2f6bc9e6ce101c20e88ebce35',1,'ios_base']]], - ['basefield_16',['basefield',['../classios__base.html#a75ce5482aa207d7aa0265d138b50a102',1,'ios_base']]], - ['beg_17',['beg',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191ea6639b4dd9e9b57ffef4a176cd1a1e7bb',1,'ios_base']]], - ['begin_18',['begin',['../class_buffered_print.html#a1382e2cedf67d12aa3ba056b0e7b10d3',1,'BufferedPrint::begin()'],['../class_minimum_serial.html#a5c56beb3472bb97f949defeecacda52c',1,'MinimumSerial::begin()'],['../class_sd_base.html#abff5f318cfe072b80119f1938cd591bb',1,'SdBase::begin(SdCsPin_t csPin=SS)'],['../class_sd_base.html#a94081827e77063eacf6fa035143cfde1',1,'SdBase::begin(SdCsPin_t csPin, uint32_t maxSck)'],['../class_sd_base.html#a5748f43d73a4272ec8dc302fb0213556',1,'SdBase::begin(SdSpiConfig spiConfig)'],['../class_sd_base.html#ab6343925e4605897d4a1c39be6705760',1,'SdBase::begin(SdioConfig sdioConfig)'],['../class_ex_fat_volume.html#ade318d2517a1bd3abe56e9e530fdcd78',1,'ExFatVolume::begin()'],['../class_fat_volume.html#af3a219ea89bbbf310a61115c9a3d221a',1,'FatVolume::begin()'],['../class_sdio_card.html#afbb5ab075dfd16ceebfcba5a20e70434',1,'SdioCard::begin()'],['../class_sd_spi_card.html#a6c256f8dcfa7f9d1fac165eed942ab73',1,'SdSpiCard::begin()'],['../class_sd_spi_arduino_driver.html#ae837a6d51bfe5518cb4744581824db88',1,'SdSpiArduinoDriver::begin()'],['../class_sd_spi_base_class.html#ad0cef6e2a3d21e438a2b7f428a218c03',1,'SdSpiBaseClass::begin()'],['../class_sd_spi_soft_driver.html#acb6b99f42e9a1b3a66adf520291dd647',1,'SdSpiSoftDriver::begin()=0'],['../class_sd_spi_soft_driver.html#af122eab393d7336ae3a86d80ebd62627',1,'SdSpiSoftDriver::begin(SdSpiConfig spiConfig)'],['../class_soft_spi_driver.html#a10552c46ff7d74df7b90081547357a13',1,'SoftSpiDriver::begin()'],['../class_fs_volume.html#ae587e7c114b0af86ec0b2927300133b0',1,'FsVolume::begin()']]], - ['binary_19',['binary',['../classios__base.html#ac99947c17c2936d15243671366605602',1,'ios_base']]], - ['blockdeviceinterface_20',['BlockDeviceInterface',['../class_block_device_interface.html',1,'']]], - ['blockdeviceinterface_2eh_21',['BlockDeviceInterface.h',['../_block_device_interface_8h.html',1,'']]], - ['boolalpha_22',['boolalpha',['../classios__base.html#afa74acd95d4bbc7cc3551251aac2bf00',1,'ios_base::boolalpha()'],['../ios_8h.html#a0016daaaf730481e2ad36972fa7abb17',1,'boolalpha(): ios.h']]], - ['buf_23',['buf',['../classobufstream.html#a4f699181bd3727f4288f4f95a5ce207f',1,'obufstream']]], - ['buffer_24',['buffer',['../class_fat_cache.html#a50b61cdeeff5c5dfd2a4bd7430ef19ac',1,'FatCache']]], - ['bufferedprint_25',['BufferedPrint',['../class_buffered_print.html',1,'BufferedPrint< WriteClass, BUF_DIM >'],['../class_buffered_print.html#af879eab3e69cfd9d15768451e091c6a2',1,'BufferedPrint::BufferedPrint()']]], - ['bufferedprint_2eh_26',['BufferedPrint.h',['../_buffered_print_8h.html',1,'']]], - ['bufstream_2eh_27',['bufstream.h',['../bufstream_8h.html',1,'']]], - ['bytespercluster_28',['bytesPerCluster',['../class_ex_fat_partition.html#ac2b5adafda0a9b52ffedf964e355da31',1,'ExFatPartition::bytesPerCluster()'],['../class_fat_partition.html#a1c3ab374b425c27bb6b6ddd55752c056',1,'FatPartition::bytesPerCluster()'],['../class_fs_volume.html#a770e0dca5ed7f8d3ca63768da38042cb',1,'FsVolume::bytesPerCluster()']]], - ['bytesperclustershift_29',['bytesPerClusterShift',['../class_ex_fat_partition.html#aedaebff39e7cbae66f226e9c7593b5b6',1,'ExFatPartition::bytesPerClusterShift()'],['../class_fat_partition.html#aaf43a09e71689c257f4b189ee307db4f',1,'FatPartition::bytesPerClusterShift()']]], - ['bytespersector_30',['bytesPerSector',['../class_ex_fat_partition.html#a3859310dde1f70daaca0ebcf274cb558',1,'ExFatPartition::bytesPerSector()'],['../class_fat_partition.html#a1eba03c763bab44263735488435731f8',1,'FatPartition::bytesPerSector()']]], - ['bytespersectorshift_31',['bytesPerSectorShift',['../class_ex_fat_partition.html#a226e452b6ae5c6846059e4acd21be1f1',1,'ExFatPartition::bytesPerSectorShift()'],['../class_fat_partition.html#a4e513ab3fcfb95583092793116aa4df5',1,'FatPartition::bytesPerSectorShift()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.html deleted file mode 100644 index 1ae887fc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.js deleted file mode 100644 index 423ade8a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_3.js +++ /dev/null @@ -1,40 +0,0 @@ -var searchData= -[ - ['c_32',['c',['../structsetfill.html#a42ffb4e6135c1274ae827cfed7793a82',1,'setfill']]], - ['cache_5ffor_5fread_33',['CACHE_FOR_READ',['../class_fs_cache.html#a1df1d63f86fcf36e1ae08a48a05ead8b',1,'FsCache::CACHE_FOR_READ()'],['../class_fat_cache.html#ab4b446515ff9a0cebc747630ddd10c93',1,'FatCache::CACHE_FOR_READ()']]], - ['cache_5ffor_5fwrite_34',['CACHE_FOR_WRITE',['../class_fs_cache.html#ade321e6538ffc77c7f36ea200decaa6f',1,'FsCache::CACHE_FOR_WRITE()'],['../class_fat_cache.html#a81cb572f33443bd6aee9aa33ec395d0f',1,'FatCache::CACHE_FOR_WRITE()']]], - ['cache_5foption_5fno_5fread_35',['CACHE_OPTION_NO_READ',['../class_fs_cache.html#ab694436995afb87d6e31693b47811243',1,'FsCache::CACHE_OPTION_NO_READ()'],['../class_fat_cache.html#adf974f55e53ee0aaa85abb0d7d67181c',1,'FatCache::CACHE_OPTION_NO_READ()']]], - ['cache_5freserve_5ffor_5fwrite_36',['CACHE_RESERVE_FOR_WRITE',['../class_fs_cache.html#ae960459db6fda0de3d67768d3b59331d',1,'FsCache::CACHE_RESERVE_FOR_WRITE()'],['../class_fat_cache.html#a49d2896ff525ab77852f76df5c2a09c2',1,'FatCache::CACHE_RESERVE_FOR_WRITE()']]], - ['cache_5fstatus_5fdirty_37',['CACHE_STATUS_DIRTY',['../class_fs_cache.html#a9d83a0401f452c0572c4c4f869b698ab',1,'FsCache::CACHE_STATUS_DIRTY()'],['../class_fat_cache.html#aac8c38e5c545d0f80b13d816117f626e',1,'FatCache::CACHE_STATUS_DIRTY()']]], - ['cache_5fstatus_5fmask_38',['CACHE_STATUS_MASK',['../class_fs_cache.html#abb6b6426373bb591f027ac29eca4bacb',1,'FsCache::CACHE_STATUS_MASK()'],['../class_fat_cache.html#ab70dc4a2e387f0e9bf392044c702ae32',1,'FatCache::CACHE_STATUS_MASK()']]], - ['cache_5fstatus_5fmirror_5ffat_39',['CACHE_STATUS_MIRROR_FAT',['../class_fat_cache.html#a45236e1c0a2a098f08d3add0e4b1467a',1,'FatCache']]], - ['cache_5ft_40',['cache_t',['../unioncache__t.html',1,'']]], - ['cachebuffer_41',['cacheBuffer',['../class_fs_cache.html#a1533fdfef219ae4f3d6fb9299f51a1ee',1,'FsCache']]], - ['cacheclear_42',['cacheClear',['../class_ex_fat_partition.html#a63fac808e421ed5c8e72a37616ac56ac',1,'ExFatPartition::cacheClear()'],['../class_fat_partition.html#abf74c1e3c714b396e6271aee304c2448',1,'FatPartition::cacheClear()']]], - ['callback_43',['callback',['../namespace_fs_date_time.html#ab4e1acabf30bc682af20e1cc93330a6a',1,'FsDateTime']]], - ['callback2_44',['callback2',['../namespace_fs_date_time.html#a1c19b53a8b6c93d38a4bb2f2981a4efa',1,'FsDateTime']]], - ['card_45',['card',['../class_sd_base.html#a1516a55bdab1ee7fe56848808986ae34',1,'SdBase']]], - ['cardbegin_46',['cardBegin',['../class_sd_base.html#a7a5e3b08f6cdd94cfaa19a1b43df6ed9',1,'SdBase::cardBegin(SdSpiConfig spiConfig)'],['../class_sd_base.html#a64cd10a3ce5ee342d0fd31738f385362',1,'SdBase::cardBegin(SdioConfig sdioConfig)']]], - ['chdir_47',['chdir',['../class_ex_fat_volume.html#abdc1addfc9474bf42cab31bcb49b4b65',1,'ExFatVolume::chdir()'],['../class_ex_fat_volume.html#a4e0a0e838088f31b15a36925f21c314c',1,'ExFatVolume::chdir(const ExChar_t *path)'],['../class_ex_fat_volume.html#afb7a1d7e4de9690b2c63cc8cd22ab4b5',1,'ExFatVolume::chdir(const String &path)'],['../class_fat_volume.html#a659d921b3efd52d310a33cba69eff18b',1,'FatVolume::chdir()'],['../class_fat_volume.html#ac0f6cf6ece2285af777c1fdf5cf8c219',1,'FatVolume::chdir(const char *path)'],['../class_fat_volume.html#ac591520e33ff8ba51e80782a87423872',1,'FatVolume::chdir(const String &path)'],['../class_fs_volume.html#abcc645df09441d40c476e4981393c944',1,'FsVolume::chdir()'],['../class_fs_volume.html#ac4f62724d5eeaec3582594bb3b4c3e65',1,'FsVolume::chdir(const char *path)'],['../class_fs_volume.html#a6c0758acb32b59c1861cc143612765d2',1,'FsVolume::chdir(const String &path)']]], - ['check_5fflash_5fprogramming_48',['CHECK_FLASH_PROGRAMMING',['../_sd_fat_config_8h.html#a63747c9ac4e3d78579690cf9eb38c4df',1,'SdFatConfig.h']]], - ['chvol_49',['chvol',['../class_ex_fat_volume.html#a6bcabab1ded2e71c1272c1baf009c2ab',1,'ExFatVolume::chvol()'],['../class_fat_volume.html#a36fbc19755b066068cac7c4ca578b27b',1,'FatVolume::chvol()'],['../class_fs_volume.html#a34a5bb7a97a081a7d74cf297f1fbee82',1,'FsVolume::chvol()']]], - ['cid_50',['CID',['../struct_c_i_d.html',1,'']]], - ['clear_51',['clear',['../class_fs_cache.html#a734ac2e9931f141c9ba9a3ef021a8691',1,'FsCache::clear()'],['../classfstream.html#a682b278a6a299ffb21b8737717ff12bf',1,'fstream::clear()'],['../classofstream.html#a09edfdb3dbda20aff105e751001313f0',1,'ofstream::clear()'],['../classios.html#aa49ed6670d1743e7a373b2d915ec739a',1,'ios::clear()']]], - ['clearcallback_52',['clearCallback',['../namespace_fs_date_time.html#af88a1ebd9c91a474c79a641e716729a0',1,'FsDateTime']]], - ['clearerr_53',['clearerr',['../class_stdio_stream.html#aa737e5680fc2808a03a603ea8559d82b',1,'StdioStream']]], - ['clearerror_54',['clearError',['../class_ex_fat_file.html#ac2004e7bf328b3edda7d4c3acba2726f',1,'ExFatFile::clearError()'],['../class_fat_file.html#a052e2c15a39b322a5307b693b8835b22',1,'FatFile::clearError()']]], - ['clearwriteerror_55',['clearWriteError',['../class_ex_fat_file.html#abc0d3863895c17df53930bdfa84cb06f',1,'ExFatFile::clearWriteError()'],['../class_fat_file.html#aeca2a2eff91e6aa55fe1b0e3860c9a05',1,'FatFile::clearWriteError()'],['../class_fs_base_file.html#a936fc1e3fb13a6ae1352d027bf0a70f7',1,'FsBaseFile::clearWriteError()']]], - ['close_56',['close',['../class_ex_fat_file.html#a7ba9e04099bdf8fd34220ebfdde72867',1,'ExFatFile::close()'],['../class_fat_file.html#afd16af325e0642e4bff6430b7d8bb18b',1,'FatFile::close()'],['../classfstream.html#ac5720ee620c09d63dd186823e688ea9a',1,'fstream::close()'],['../classifstream.html#ac5892f472afdef6160f5fe2401b16dce',1,'ifstream::close()'],['../classofstream.html#a240f3752c7ff7a78d10c143d2083715f',1,'ofstream::close()'],['../class_fs_base_file.html#aa669c695a839e68e417fb15eebe3de13',1,'FsBaseFile::close()']]], - ['cluster_57',['cluster',['../struct_ex_fat_pos__t.html#aef933f72a904d60398285bd0d833ee24',1,'ExFatPos_t::cluster()'],['../struct_dir_pos__t.html#a11898149ae53f0b189c6b13590c60a5f',1,'DirPos_t::cluster()'],['../struct_fat_pos__t.html#a7b50657b0debaf0e6231af2c74a655fe',1,'FatPos_t::cluster()']]], - ['clustercount_58',['clusterCount',['../class_ex_fat_partition.html#a17b72f8a437c5663a04473606fd36d58',1,'ExFatPartition::clusterCount()'],['../class_fat_partition.html#aba35645c23735c4833c07bc2b3adcd1f',1,'FatPartition::clusterCount()'],['../class_fs_volume.html#abc9731fa79598460a37f10a2e561f29c',1,'FsVolume::clusterCount()']]], - ['clusterheapstartsector_59',['clusterHeapStartSector',['../class_ex_fat_partition.html#a2f75613844b26a2a574a0ee31005b1a0',1,'ExFatPartition']]], - ['contiguousrange_60',['contiguousRange',['../class_ex_fat_file.html#add39a8c7f7961321ba647e8da8f3d461',1,'ExFatFile::contiguousRange()'],['../class_fat_file.html#a12b3c5a763416ca62c70e3db74033cd0',1,'FatFile::contiguousRange()'],['../class_fs_base_file.html#adff091db3361b34a3f63ffeb495c27c7',1,'FsBaseFile::contiguousRange()']]], - ['crc_61',['crc',['../struct_c_i_d.html#aa10cfc5aef8e979e47009474dfa3d940',1,'CID']]], - ['createcontiguous_62',['createContiguous',['../class_fat_file.html#a0afc2a1cffa238d1cb2049bfa2d8d199',1,'FatFile::createContiguous(FatFile *dirFile, const char *path, uint32_t size)'],['../class_fat_file.html#a0853fbd44aee2798d14d8e3aed78f8bf',1,'FatFile::createContiguous(const char *path, uint32_t size)']]], - ['cspin_63',['csPin',['../class_sd_spi_config.html#a0c1797197fbd4e4c4499daf4b51628e6',1,'SdSpiConfig']]], - ['cur_64',['cur',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191ea53910041525b9e2f33bfc3bb4482134c',1,'ios_base']]], - ['curcluster_65',['curCluster',['../class_fat_file.html#a526f3dd56ce205690e45ffc86ef6f891',1,'FatFile']]], - ['curposition_66',['curPosition',['../class_ex_fat_file.html#ab49396aad3f6500aa19f75490dc26719',1,'ExFatFile::curPosition()'],['../class_fat_file.html#a97e0620949f97e9b9c91ed1094d728aa',1,'FatFile::curPosition()'],['../class_fs_base_file.html#a856bccf55a40ebbea27072dcfea06191',1,'FsBaseFile::curPosition()']]], - ['curtimems_67',['curTimeMS',['../class_sys_call.html#aa508a9a3066020fc94765e4099490372',1,'SysCall']]], - ['cwv_68',['cwv',['../class_ex_fat_volume.html#a5b2a874ef0306425bf54c18454771b45',1,'ExFatVolume::cwv()'],['../class_fat_volume.html#a06acd4a434456b6a4644ff79a0bf0a24',1,'FatVolume::cwv()'],['../class_fs_volume.html#ab4fa0f21669b84e00d00fd54c3144a8f',1,'FsVolume::cwv()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.html deleted file mode 100644 index 14c90ef5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.js deleted file mode 100644 index dda54378..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_4.js +++ /dev/null @@ -1,22 +0,0 @@ -var searchData= -[ - ['data_69',['data',['../unioncache__t.html#ae675b7a3a87d809070de111d1d1f1d81',1,'cache_t']]], - ['datalength_70',['dataLength',['../class_ex_fat_file.html#ada4dde9f2eed36bf556fcf1bd3d28ccf',1,'ExFatFile']]], - ['datastartsector_71',['dataStartSector',['../class_fat_partition.html#a7e89ec91780f7dfa060b261c605bf2e5',1,'FatPartition::dataStartSector()'],['../class_fs_volume.html#a79cebeb23cb3cdaa06550475fe24272a',1,'FsVolume::dataStartSector()']]], - ['datetimecallback_72',['dateTimeCallback',['../class_sd_file.html#a2d78e6a8cedbf8ce545af68457b43bf1',1,'SdFile']]], - ['datetimecallbackcancel_73',['dateTimeCallbackCancel',['../class_sd_file.html#ad266770d0a779d1a528a3997aee5142d',1,'SdFile']]], - ['dbgclearstats_74',['dbgClearStats',['../class_sd_spi_card.html#ab6cf8283dee415d9217eb758e75a98ef',1,'SdSpiCard']]], - ['dbgfat_75',['dbgFat',['../class_fat_partition.html#a0af1e91a311180119b4a2c85d7e6e87e',1,'FatPartition']]], - ['dbgprintstats_76',['dbgPrintStats',['../class_sd_spi_card.html#abdb02df511072aefb465a22858d92e06',1,'SdSpiCard']]], - ['deactivate_77',['deactivate',['../class_sd_spi_arduino_driver.html#ae88a255f533e3acb41d1221025a69b55',1,'SdSpiArduinoDriver::deactivate()'],['../class_sd_spi_base_class.html#ae3a5ede781e390263382fcf7765d665d',1,'SdSpiBaseClass::deactivate()'],['../class_sd_spi_soft_driver.html#a05315e4128ae7263d9e68119d6ae4308',1,'SdSpiSoftDriver::deactivate()']]], - ['dec_78',['dec',['../classios__base.html#a2826aed005e7c1f6858060cddae7971a',1,'ios_base::dec()'],['../ios_8h.html#ada38ab90e22f0ebb638cb864a35c562d',1,'dec(): ios.h']]], - ['dedicated_5fspi_79',['DEDICATED_SPI',['../_sd_spi_driver_8h.html#a666c394438267afda9b1e63f6b61459c',1,'SdSpiDriver.h']]], - ['destructor_5fcloses_5ffile_80',['DESTRUCTOR_CLOSES_FILE',['../_sd_fat_config_8h.html#a9a2b1ca4d91cff876f48deeaacbc33da',1,'SdFatConfig.h']]], - ['dir_81',['dir',['../unioncache__t.html#a04a7472d08f2545d6db7804c82c99d7c',1,'cache_t']]], - ['direntry_82',['dirEntry',['../class_fat_file.html#a2f4e9ab3056125b07f15d14ca26d5346',1,'FatFile']]], - ['dirindex_83',['dirIndex',['../class_ex_fat_file.html#a5e3baa5d5269c2948cfaf604c42f6a16',1,'ExFatFile::dirIndex()'],['../class_fat_file.html#ae5ec24d4a94d3780384d3f2b731c7eb9',1,'FatFile::dirIndex()'],['../class_fs_base_file.html#ac05660570595552c72164a61001899d5',1,'FsBaseFile::dirIndex()']]], - ['dirpos_5ft_84',['DirPos_t',['../struct_dir_pos__t.html',1,'']]], - ['dirsize_85',['dirSize',['../class_fat_file.html#ae2ed15f05c9ccbce355e7a8d3ce8382d',1,'FatFile']]], - ['dirty_86',['dirty',['../class_fs_cache.html#af50f564561a2db190280769d4641147b',1,'FsCache::dirty()'],['../class_fat_cache.html#ab4d3b0c16bb6a116c7d01afff2dcb307',1,'FatCache::dirty()']]], - ['dmpfile_87',['dmpFile',['../class_fat_file.html#a4f01d27954ae49aeb6888ac7302f55d9',1,'FatFile']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.html deleted file mode 100644 index 60fa53e9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.js deleted file mode 100644 index 05c8717d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_5.js +++ /dev/null @@ -1,30 +0,0 @@ -var searchData= -[ - ['enable_5farduino_5ffeatures_88',['ENABLE_ARDUINO_FEATURES',['../_sd_fat_config_8h.html#a9a8c1ea8596f35f7f33a24b642567206',1,'SdFatConfig.h']]], - ['enable_5farduino_5fserial_89',['ENABLE_ARDUINO_SERIAL',['../_sd_fat_config_8h.html#aa0a95c918e41f5cb3850231fc41fdcd0',1,'SdFatConfig.h']]], - ['enable_5farduino_5fstring_90',['ENABLE_ARDUINO_STRING',['../_sd_fat_config_8h.html#aae353ccb45df7772d8022763a57410d9',1,'SdFatConfig.h']]], - ['enable_5fdedicated_5fspi_91',['ENABLE_DEDICATED_SPI',['../_sd_fat_config_8h.html#a3ceb23f14263a17c56eac40e484cbbbb',1,'SdFatConfig.h']]], - ['end_92',['end',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191eaae47c0ae984e90b38907783a1a804811',1,'ios_base::end()'],['../class_sdio_card.html#aef8e287f0e2033d4afe5e7051c293334',1,'SdioCard::end()'],['../class_sd_spi_arduino_driver.html#a7f94ce98855bb3d1781bbad77741e494',1,'SdSpiArduinoDriver::end()'],['../class_fs_volume.html#acd5a0e50a30334785d75a8c8bfc3e1f9',1,'FsVolume::end()']]], - ['endl_93',['endl',['../iostream_8h.html#ab9868f8e151efc1705646437dbb59bb2',1,'iostream.h']]], - ['endl_5fcalls_5fflush_94',['ENDL_CALLS_FLUSH',['../_sd_fat_config_8h.html#a270eefdaec4778f2a491658f34f61b17',1,'SdFatConfig.h']]], - ['eof_95',['eof',['../classios.html#a7aa5ea2f670d64eb3dcb3b62eddd576c',1,'ios::eof()'],['../_stdio_stream_8h.html#a59adc4c82490d23754cd39c2fb99b0da',1,'EOF(): StdioStream.h']]], - ['eofbit_96',['eofbit',['../classios__base.html#af75072b7ef2a931c77a2cb8e7ccda460',1,'ios_base']]], - ['erase_97',['erase',['../class_sd_card_interface.html#a6a57c5bced670759b7c278c7a5988fd1',1,'SdCardInterface::erase()'],['../class_sdio_card.html#a03b1cdcf988acbdee91bfa8974be50f9',1,'SdioCard::erase()'],['../class_sd_spi_card.html#a904d56312d7a9cfc8bf33e3ad041c9eb',1,'SdSpiCard::erase()']]], - ['erasesinglesectorenable_98',['eraseSingleSectorEnable',['../class_sd_spi_card.html#a1b137a1ab76da21379bc59efeac90e1f',1,'SdSpiCard']]], - ['error_99',['error',['../class_sd_spi_card.html#aa12ad53111abcb187d3c6119a3a77592',1,'SdSpiCard']]], - ['errorcode_100',['errorCode',['../class_sd_card_interface.html#af83618545960af2f1ceec84927c12fc9',1,'SdCardInterface::errorCode()'],['../class_sdio_card.html#a1d505c4fb461bb7103692054ef6f7f1f',1,'SdioCard::errorCode()'],['../class_sd_spi_card.html#ad14f9be4d9087db44309fdc6597c949e',1,'SdSpiCard::errorCode()']]], - ['errordata_101',['errorData',['../class_sd_card_interface.html#ab84d7a9506d49366d8ec105e239ab0e1',1,'SdCardInterface::errorData()'],['../class_sdio_card.html#a9c2da202da95162d2eb694363fbe8654',1,'SdioCard::errorData()'],['../class_sd_spi_card.html#aae2cc2a741646bb2aaabaf0547298de8',1,'SdSpiCard::errorData()']]], - ['errorhalt_102',['errorHalt',['../class_sd_base.html#ac9d239810a48c90bd0f3a3e9c4c606a9',1,'SdBase::errorHalt(print_t *pr)'],['../class_sd_base.html#a1691b7a85fc11851a6942de035d73772',1,'SdBase::errorHalt(print_t *pr, const char *msg)'],['../class_sd_base.html#ac530fe041855d994a53d2e1b9c33f22d',1,'SdBase::errorHalt(print_t *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#a3a0d626662aa29c5b942442d0f6ee0ff',1,'SdBase::errorHalt(const __FlashStringHelper *msg)'],['../class_sd_base.html#a841a42d2ddc34c21dfb208b9a377c777',1,'SdBase::errorHalt()'],['../class_sd_base.html#a65aab6f19ed26777c2b3a149bbed39b5',1,'SdBase::errorHalt(const char *msg)']]], - ['errorline_103',['errorLine',['../class_sdio_card.html#a37e477b39d2a9c874fd338b4f7ef6b0e',1,'SdioCard']]], - ['errorprint_104',['errorPrint',['../class_sd_base.html#a22d184b3266ae7cb31ab47b7203e91ac',1,'SdBase::errorPrint(print_t *pr)'],['../class_sd_base.html#a7d119e8ae896cc4caa073e9f54823f3e',1,'SdBase::errorPrint(print_t *pr, char const *msg)'],['../class_sd_base.html#a6793653198ce4c570ae92d2f9436dca9',1,'SdBase::errorPrint(Print *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#ab4d5db510feb64a9cd487defe5bb62d9',1,'SdBase::errorPrint(const char *msg)'],['../class_sd_base.html#afebeeb8af2027f1c9a0b4f1106be9c2a',1,'SdBase::errorPrint(const __FlashStringHelper *msg)']]], - ['exfatfile_105',['ExFatFile',['../class_ex_fat_file.html',1,'ExFatFile'],['../class_ex_fat_partition.html#a0ea68fb710b4ca007419acbf84ca6908',1,'ExFatPartition::ExFatFile()'],['../class_ex_fat_file.html#a3c1303c37cad370b33f0279524c93720',1,'ExFatFile::ExFatFile()']]], - ['exfatfile_2eh_106',['ExFatFile.h',['../_ex_fat_file_8h.html',1,'']]], - ['exfatformatter_107',['ExFatFormatter',['../class_ex_fat_formatter.html',1,'']]], - ['exfatpartition_108',['ExFatPartition',['../class_ex_fat_partition.html',1,'']]], - ['exfatpartition_2eh_109',['ExFatPartition.h',['../_ex_fat_partition_8h.html',1,'']]], - ['exfatpos_5ft_110',['ExFatPos_t',['../struct_ex_fat_pos__t.html',1,'']]], - ['exfatvolume_111',['ExFatVolume',['../class_ex_fat_volume.html',1,'ExFatVolume'],['../class_ex_fat_file.html#a064869383f7639b113eb0aaf0b84335c',1,'ExFatFile::ExFatVolume()']]], - ['exfile_112',['ExFile',['../class_ex_file.html',1,'']]], - ['exists_113',['exists',['../class_ex_fat_file.html#a22a717ddc6d2004c540c67a14264d9dd',1,'ExFatFile::exists()'],['../class_ex_fat_volume.html#a7fdcdffb720a1cca5cfa73f4cfa281df',1,'ExFatVolume::exists(const ExChar_t *path)'],['../class_ex_fat_volume.html#af705d3a2434d64efebaa5b3615131dc5',1,'ExFatVolume::exists(const String &path)'],['../class_fat_file.html#a50242f98dea0d4488ce4039a279f2a57',1,'FatFile::exists()'],['../class_fat_volume.html#a21541734ad76f64ea24b9f45e2bd6117',1,'FatVolume::exists(const char *path)'],['../class_fat_volume.html#afb7709e5b9e04265467305b43adf7cef',1,'FatVolume::exists(const String &path)'],['../class_fs_base_file.html#a76aea9766ffeae5454381a0704e62505',1,'FsBaseFile::exists()'],['../class_fs_volume.html#a9bece771399c97b136868f684c2b4496',1,'FsVolume::exists(const char *path)'],['../class_fs_volume.html#a5cabbe39ffc114d79ebe4e793024354e',1,'FsVolume::exists(const String &path)']]], - ['exname_5ft_114',['ExName_t',['../struct_ex_name__t.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.html deleted file mode 100644 index 71803631..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.js deleted file mode 100644 index 298558c8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_6.js +++ /dev/null @@ -1,75 +0,0 @@ -var searchData= -[ - ['f_115',['F',['../_sys_call_8h.html#a0e3009529aac180ed5f48296d6670d6b',1,'SysCall.h']]], - ['fail_116',['fail',['../classios.html#a15269e67d05d4fe83a6cf344d542f8ae',1,'ios']]], - ['failbit_117',['failbit',['../classios__base.html#a36157154001bcce17827db6786e35efd',1,'ios_base']]], - ['fat12_5fsupport_118',['FAT12_SUPPORT',['../_sd_fat_config_8h.html#a28998c5daf4bd038f4f93172698320b1',1,'SdFatConfig.h']]], - ['fat16_119',['fat16',['../unioncache__t.html#a8f3a4e9392a7d8ace954fc44c57df887',1,'cache_t']]], - ['fat32_120',['fat32',['../unioncache__t.html#a57e16421bf460d1ba6cb9ce9a23a4a83',1,'cache_t']]], - ['fat_5ftype_5fexfat_121',['FAT_TYPE_EXFAT',['../_ex_fat_partition_8h.html#ad74089b317bc77bd1e8cbb56fef8046a',1,'ExFatPartition.h']]], - ['fat_5ftype_5ffat12_122',['FAT_TYPE_FAT12',['../_fat_partition_8h.html#a2914ab2ce1d4cff984ad93b922e99d50',1,'FatPartition.h']]], - ['fat_5ftype_5ffat16_123',['FAT_TYPE_FAT16',['../_fat_partition_8h.html#a586e7b4151f14bd56b78a836855c0f55',1,'FatPartition.h']]], - ['fat_5ftype_5ffat32_124',['FAT_TYPE_FAT32',['../_fat_partition_8h.html#a63da6e74b3bce481580263cebb591d5e',1,'FatPartition.h']]], - ['fatcache_125',['FatCache',['../class_fat_cache.html',1,'FatCache'],['../class_fat_partition.html#a1e97a7aed860b898c403cb29455b3fe7',1,'FatPartition::FatCache()']]], - ['fatcount_126',['fatCount',['../class_fat_partition.html#a56b37c3230818b9ae8e0a25c01a370a3',1,'FatPartition']]], - ['fatfile_127',['FatFile',['../class_fat_file.html',1,'FatFile'],['../class_fat_partition.html#a18fb15a715ea85037ab802286853103e',1,'FatPartition::FatFile()'],['../class_fat_file.html#a7b591c9b92165fa8e4eae8c30c30e533',1,'FatFile::FatFile()'],['../class_fat_file.html#a38f9a296138648d6135cbbbf41ef6b92',1,'FatFile::FatFile(const char *path, oflag_t oflag)']]], - ['fatfile_2eh_128',['FatFile.h',['../_fat_file_8h.html',1,'']]], - ['fatformatter_129',['FatFormatter',['../class_fat_formatter.html',1,'']]], - ['fatlength_130',['fatLength',['../class_ex_fat_partition.html#a12e390567f2217f804af9b1ea397780c',1,'ExFatPartition']]], - ['fatlibconfig_2eh_131',['FatLibConfig.h',['../_fat_lib_config_8h.html',1,'']]], - ['fatpartition_132',['FatPartition',['../class_fat_partition.html',1,'FatPartition'],['../class_fat_partition.html#a2c94db084d89355da7695d82ee612f72',1,'FatPartition::FatPartition()']]], - ['fatpartition_2eh_133',['FatPartition.h',['../_fat_partition_8h.html',1,'']]], - ['fatpos_5ft_134',['FatPos_t',['../struct_fat_pos__t.html',1,'']]], - ['fatstartsector_135',['fatStartSector',['../class_ex_fat_partition.html#ab63f9a3aacc0aeccae138a77cccbbb5b',1,'ExFatPartition::fatStartSector()'],['../class_fat_partition.html#a6a1ce7d707cf15bea08b63216413e055',1,'FatPartition::fatStartSector()'],['../class_fs_volume.html#ac5f4de35d2bfdd65bc38c2562b147a26',1,'FsVolume::fatStartSector()']]], - ['fattype_136',['fatType',['../class_ex_fat_partition.html#a3e63d87b4ef985f92c1793d269274f44',1,'ExFatPartition::fatType()'],['../class_fat_partition.html#ad45c276232d7093b82f1075e8c488bac',1,'FatPartition::fatType()'],['../class_fs_volume.html#ad26b5c171ca4c6e953cfbdbfe0b9a988',1,'FsVolume::fatType()']]], - ['fatvolume_137',['FatVolume',['../class_fat_volume.html',1,'FatVolume'],['../class_fat_file.html#a6ca3f436167f187097347a20ea221555',1,'FatFile::FatVolume()']]], - ['fatvolume_2eh_138',['FatVolume.h',['../_fat_volume_8h.html',1,'']]], - ['fclose_139',['fclose',['../class_stdio_stream.html#a4ddd4658d49182013d2fa2a181e96c5a',1,'StdioStream']]], - ['feof_140',['feof',['../class_stdio_stream.html#acb38c3211feedbf2206eb1d9a3a9d24f',1,'StdioStream']]], - ['ferror_141',['ferror',['../class_stdio_stream.html#afd64cec6440b923660b444f6d5f0586e',1,'StdioStream']]], - ['fflush_142',['fflush',['../class_stdio_stream.html#a7ce32ec7ea3f2fd8ea42b9633890f1c0',1,'StdioStream']]], - ['fgetc_143',['fgetc',['../class_stdio_stream.html#a160bd2828cb7e7370cffe1046eff8899',1,'StdioStream']]], - ['fgetpos_144',['fgetpos',['../class_ex_fat_file.html#a8614bcbf04b7bbfc70fe36d2fa7f70c1',1,'ExFatFile::fgetpos()'],['../class_fat_file.html#a33e0b0a8a342047f29ab8e8aae9cae14',1,'FatFile::fgetpos()'],['../class_fs_base_file.html#adda345ec539688e40e279a4e3020d208',1,'FsBaseFile::fgetpos()']]], - ['fgets_145',['fgets',['../class_ex_fat_file.html#abc69c9dfc8fdb4ebf9db3bc37c879dc6',1,'ExFatFile::fgets()'],['../class_fat_file.html#a9e05a51767f7c8f70c6f337eecbdca03',1,'FatFile::fgets()'],['../class_stdio_stream.html#aa240c1021a1aad1cc57f63a483541dc7',1,'StdioStream::fgets()'],['../class_fs_base_file.html#ab6b6b97a6382a763d6de882252412727',1,'FsBaseFile::fgets()']]], - ['file_146',['File',['../_sd_fat_8h.html#aa0ffd23c3e43af0bcbd2fb4d62f3286d',1,'SdFat.h']]], - ['file32_147',['File32',['../class_file32.html',1,'']]], - ['filesize_148',['fileSize',['../class_ex_fat_file.html#af2c08909b62b01f3edc4ee0c51ea7435',1,'ExFatFile::fileSize()'],['../class_fat_file.html#a874940574b9c99e763526465adf8dc28',1,'FatFile::fileSize()'],['../class_fs_base_file.html#aef21ae3af496d80f214918bb40b5b3ba',1,'FsBaseFile::fileSize()']]], - ['fill_149',['fill',['../classios__base.html#ade5bd46462e075999c3a5c2cff2015f1',1,'ios_base::fill()'],['../classios__base.html#aa5683f9bdf295311bd5a6d3cdc2fedd5',1,'ios_base::fill(char c)']]], - ['fillstack_150',['FillStack',['../_free_stack_8h.html#a534f4eab46987296c6951fc35a2f9a7f',1,'FreeStack.cpp']]], - ['firstblock_151',['firstBlock',['../class_fat_file.html#a5ac8a604863d18840f4a93c5c788b7c8',1,'FatFile']]], - ['firstsector_152',['firstSector',['../class_ex_fat_file.html#a883a36174d7753abbbdb7547e44b1739',1,'ExFatFile::firstSector()'],['../class_fat_file.html#af3108df387f30ca3d367dd390a04daaa',1,'FatFile::firstSector()'],['../class_fs_base_file.html#ad952b756b5bb3861472140fd5f733fe8',1,'FsBaseFile::firstSector()']]], - ['flags_153',['flags',['../structfname__t.html#a39c69edff13165c6e03b308104e7286d',1,'fname_t::flags()'],['../classios__base.html#a2a73a30a8b157cc1cc92bb55b0a62e4a',1,'ios_base::flags() const'],['../classios__base.html#ae67e900dc12e4c7cbc0741ad1c70d6c2',1,'ios_base::flags(fmtflags fl)']]], - ['flush_154',['flush',['../class_buffered_print.html#a3fcb4970129a6fbfbd125ed8f2869d9b',1,'BufferedPrint::flush()'],['../class_minimum_serial.html#a872f0ff70f0e256352004f83d13fff28',1,'MinimumSerial::flush()'],['../class_ex_fat_file.html#ab16f38103a13394bffd8aa5be830c4fe',1,'ExFatFile::flush()'],['../class_fat_file.html#a166b5ff04754cc925f2aee71bf92f800',1,'FatFile::flush()'],['../classostream.html#af6be1f30d824f5a65d27d5b5d20b8c6c',1,'ostream::flush()'],['../class_stream_file.html#a32f813e659414892a58aa5157fe14f82',1,'StreamFile::flush()'],['../class_fs_base_file.html#adba2e8ad2ec46ae0f7b8f93b33a2b262',1,'FsBaseFile::flush()'],['../iostream_8h.html#a2f6f5344fca38fd4fe7b6231fd992a0d',1,'flush(): iostream.h']]], - ['fmtflags_155',['fmtflags',['../classios__base.html#ac9a54e52cef4f01ac0afd8ae896a3413',1,'ios_base']]], - ['fname_5fflag_5flc_5fbase_156',['FNAME_FLAG_LC_BASE',['../_fat_file_8h.html#a79e43960e1b4eecf274f5faea9c3168c',1,'FatFile.h']]], - ['fname_5fflag_5flc_5fext_157',['FNAME_FLAG_LC_EXT',['../_fat_file_8h.html#a135b7572768b09661aa38afaceec7296',1,'FatFile.h']]], - ['fname_5fflag_5flost_5fchars_158',['FNAME_FLAG_LOST_CHARS',['../_fat_file_8h.html#acd45286b7dfc5ba68be18c8c3a9d298d',1,'FatFile.h']]], - ['fname_5fflag_5fmixed_5fcase_159',['FNAME_FLAG_MIXED_CASE',['../_fat_file_8h.html#a63994c21f3b723a55247f063a1b01c9c',1,'FatFile.h']]], - ['fname_5fflag_5fneed_5flfn_160',['FNAME_FLAG_NEED_LFN',['../_fat_file_8h.html#a1a041207a19d2fd9a1e2739343ccb29b',1,'FatFile.h']]], - ['fname_5ft_161',['fname_t',['../structfname__t.html',1,'']]], - ['fopen_162',['fopen',['../class_stdio_stream.html#a4ffc37225fb6deed98905aa71d1f9c4b',1,'StdioStream']]], - ['format_163',['format',['../class_sd_fat32.html#a303f00204805011d12e70c59ad24e42d',1,'SdFat32::format()'],['../class_sd_ex_fat.html#a6120786dcb0e7628301899f31af39e6b',1,'SdExFat::format()'],['../class_ex_fat_formatter.html#afe8c02e629e61bb4d83dee9076ef6d70',1,'ExFatFormatter::format()'],['../class_fat_formatter.html#a95c64e724b8b67eec1a476f21784540e',1,'FatFormatter::format()']]], - ['fprintf_164',['fprintf',['../_print_templates_8h.html#a3899b48e0eb6938ff58ca3accd53402a',1,'PrintTemplates.h']]], - ['fputc_165',['fputc',['../class_stdio_stream.html#a9f23cfa6b112a5da6ae08340af23c57b',1,'StdioStream']]], - ['fputs_166',['fputs',['../class_stdio_stream.html#a6adea52f55ef7d97cdb54e9e11fc2daa',1,'StdioStream']]], - ['fread_167',['fread',['../class_stdio_stream.html#a2d363b02abcef82b25ff025d50375bce',1,'StdioStream']]], - ['freeclustercount_168',['freeClusterCount',['../class_ex_fat_partition.html#ae6d4414d6440b79b6314cd1edbaa35b0',1,'ExFatPartition::freeClusterCount()'],['../class_fat_partition.html#ac9689f1e11f59acc5f1b21ed9bb71174',1,'FatPartition::freeClusterCount()'],['../class_fs_volume.html#af6dbe47dfe11adf752df95c351b10fdd',1,'FsVolume::freeClusterCount()']]], - ['freestack_169',['FreeStack',['../_free_stack_8h.html#a86da1fd0aa8dcc6a981803373bc8839d',1,'FreeStack.h']]], - ['freestack_2eh_170',['FreeStack.h',['../_free_stack_8h.html',1,'']]], - ['fs_5fdefault_5fdate_171',['FS_DEFAULT_DATE',['../_sd_fat_config_8h.html#af9e38fab77717460deffabaec90ffc9f',1,'SdFatConfig.h']]], - ['fs_5fdefault_5ftime_172',['FS_DEFAULT_TIME',['../_sd_fat_config_8h.html#aa881707cd0526be3a1d2e3f214db2d5e',1,'SdFatConfig.h']]], - ['fsbasefile_173',['FsBaseFile',['../class_fs_base_file.html',1,'FsBaseFile'],['../class_fs_volume.html#a1655636bca63e3ac7e7ab6a8d112a2f0',1,'FsVolume::FsBaseFile()'],['../class_fs_base_file.html#a6ddaf9a50682a50bacbddf541c35b017',1,'FsBaseFile::FsBaseFile()']]], - ['fscache_174',['FsCache',['../class_fs_cache.html',1,'']]], - ['fsdatetime_175',['FsDateTime',['../namespace_fs_date_time.html',1,'']]], - ['fseek_176',['fseek',['../class_stdio_stream.html#a71584fd5c5cda3c31ce6cdbcc56f104d',1,'StdioStream']]], - ['fsetpos_177',['fsetpos',['../class_ex_fat_file.html#aea1e4d0c0981081774dc3c7cd3c55264',1,'ExFatFile::fsetpos()'],['../class_fat_file.html#ac042c43d41ecfff4e101b88f3f82086e',1,'FatFile::fsetpos()'],['../class_fs_base_file.html#a4bc085bc1ef0569f4ca7f14fff3e5678',1,'FsBaseFile::fsetpos()']]], - ['fsfile_178',['FsFile',['../class_fs_file.html',1,'']]], - ['fsfile_2eh_179',['FsFile.h',['../_fs_file_8h.html',1,'']]], - ['fslib_2eh_180',['FsLib.h',['../_fs_lib_8h.html',1,'']]], - ['fstream_181',['fstream',['../classfstream.html',1,'fstream'],['../classfstream.html#aed23877c52f828cab8de7a23603b3b6c',1,'fstream::fstream()']]], - ['fstream_2eh_182',['fstream.h',['../fstream_8h.html',1,'']]], - ['fsvolume_183',['FsVolume',['../class_fs_volume.html',1,'']]], - ['fsvolume_2eh_184',['FsVolume.h',['../_fs_volume_8h.html',1,'']]], - ['ftell_185',['ftell',['../class_stdio_stream.html#a809639fc5fb4fa5b6789dc121659f386',1,'StdioStream']]], - ['fwrite_186',['fwrite',['../class_stdio_stream.html#ad79465afb52579cbc801f4585c3f9c25',1,'StdioStream']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.html deleted file mode 100644 index ee6d2e4a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.js deleted file mode 100644 index c30368bc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_7.js +++ /dev/null @@ -1,17 +0,0 @@ -var searchData= -[ - ['gcount_187',['gcount',['../classistream.html#ad0a3db5199ca44b191a9675f2dd3a098',1,'istream']]], - ['get_188',['get',['../class_fs_cache.html#a2483025514ecc0f69cabffcbeb052678',1,'FsCache::get()'],['../classistream.html#a36573c9b7fc522e6c85a73221019fd11',1,'istream::get()'],['../classistream.html#a9c7313d6f21f1f7ac9b0e759e74b4db2',1,'istream::get(char &ch)'],['../classistream.html#a2c963fd04375e5faa1b7a4362986269a',1,'istream::get(char *str, streamsize n, char delim='\n')']]], - ['getaccessdate_189',['getAccessDate',['../class_fat_file.html#a5d085c695e920b658a1505e480bc467f',1,'FatFile']]], - ['getaccessdatetime_190',['getAccessDateTime',['../class_ex_fat_file.html#a0d935161fde4a3f8d2fcd13140073adc',1,'ExFatFile::getAccessDateTime()'],['../class_fat_file.html#af70c42baeb45e0d7047ae63de568d0d2',1,'FatFile::getAccessDateTime()'],['../class_fs_base_file.html#add0901e13594348e1919a9df2fbad985',1,'FsBaseFile::getAccessDateTime()']]], - ['getc_191',['getc',['../class_stdio_stream.html#a28ba31e7b526607744bfa41844ffce31',1,'StdioStream']]], - ['getcreatedatetime_192',['getCreateDateTime',['../class_ex_fat_file.html#a703397b32592631c189a23047cc44c09',1,'ExFatFile::getCreateDateTime()'],['../class_fat_file.html#a94d484b5198032a9e00194e72182cc57',1,'FatFile::getCreateDateTime()'],['../class_fs_base_file.html#a5101edd57ee4ac0cd771b97cd089e4be',1,'FsBaseFile::getCreateDateTime()']]], - ['geterror_193',['getError',['../class_ex_fat_file.html#ac697224450ca216c60585d25f5f6e310',1,'ExFatFile::getError()'],['../class_fat_file.html#ad0dbbd083180f44c7a3ce7124d4ce19c',1,'FatFile::getError()'],['../class_fs_base_file.html#a7553d4aeb68fe8d3f1b61a16c8005e34',1,'FsBaseFile::getError()']]], - ['getline_194',['getline',['../classistream.html#a7ea6a5edd6b44a6e1ed297fb278b5d52',1,'istream']]], - ['getmodifydatetime_195',['getModifyDateTime',['../class_ex_fat_file.html#ac0c15cff235937cdfd7860d5fb441728',1,'ExFatFile::getModifyDateTime()'],['../class_fat_file.html#a28537b48ed2cb886c5f22984d07492b7',1,'FatFile::getModifyDateTime()'],['../class_fs_base_file.html#aee20c403ceed3b036dae70838c9f1bbf',1,'FsBaseFile::getModifyDateTime()']]], - ['getname_196',['getName',['../class_ex_fat_file.html#aba93e2c18be9fa4df7e067b7d6ac5906',1,'ExFatFile::getName()'],['../class_fat_file.html#aafa565e286440aab612cdb430fc01da5',1,'FatFile::getName()'],['../class_fs_base_file.html#ad2099dbe6bb8f61e1bf933d8e97b2d86',1,'FsBaseFile::getName()']]], - ['getsfn_197',['getSFN',['../class_fat_file.html#aba30e92a66f8e0d2f815c85662772a58',1,'FatFile']]], - ['getwriteerror_198',['getWriteError',['../class_ex_fat_file.html#a01da9896a59671a61f90dd20c3ac5d07',1,'ExFatFile::getWriteError()'],['../class_fat_file.html#a8062c0d3a118e8d77d0310418703d5f5',1,'FatFile::getWriteError()'],['../class_fs_base_file.html#ab5525bef93bab61569225374d475f2cb',1,'FsBaseFile::getWriteError()']]], - ['good_199',['good',['../classios.html#a0192d754476f243d7f13dc16e851c7cc',1,'ios']]], - ['goodbit_200',['goodbit',['../classios__base.html#a07a00996a6e525b88bdfe7935d5ead05',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.html deleted file mode 100644 index 7829aa40..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.js deleted file mode 100644 index b92aa9f7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_8.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['halt_201',['halt',['../class_sys_call.html#a9b1ef8900e97f572ca561760b4dd4191',1,'SysCall']]], - ['has_5fsdio_5fclass_202',['HAS_SDIO_CLASS',['../_sd_fat_config_8h.html#a356309f8e0bad852d7a07ad0b9326a27',1,'SdFatConfig.h']]], - ['has_5funused_5fstack_203',['HAS_UNUSED_STACK',['../_free_stack_8h.html#acd5a8222ee7af79faab74b1df412d600',1,'FreeStack.h']]], - ['hex_204',['hex',['../classios__base.html#a3608e51eb0a80ea94ddadd5b713a3750',1,'ios_base::hex()'],['../ios_8h.html#ace2036d970905192360d622140bfe336',1,'hex(): ios.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.html deleted file mode 100644 index e4242c71..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.js deleted file mode 100644 index 417ad36e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_9.js +++ /dev/null @@ -1,41 +0,0 @@ -var searchData= -[ - ['ibufstream_205',['ibufstream',['../classibufstream.html',1,'ibufstream'],['../classibufstream.html#afe28f27d24a62a21428b60fe8834dd05',1,'ibufstream::ibufstream()'],['../classibufstream.html#a819561105ef7dc3828e0cfedfed708d8',1,'ibufstream::ibufstream(const char *str)']]], - ['ifstream_206',['ifstream',['../classifstream.html',1,'ifstream'],['../classifstream.html#a11f4bfaa5c37cfcf8878c367fd861a88',1,'ifstream::ifstream()']]], - ['ignore_207',['ignore',['../classistream.html#a12597b03d86b66047a5581bbd26eb032',1,'istream']]], - ['in_208',['in',['../classios__base.html#ae5432e3c269064480652c4602f5f74ad',1,'ios_base']]], - ['include_5fsdios_209',['INCLUDE_SDIOS',['../_sd_fat_config_8h.html#a7cc6c9647297d65f8e823de70740630b',1,'SdFatConfig.h']]], - ['init_210',['init',['../class_fs_cache.html#a2e56c9443880e3db0b68cc50217e8abe',1,'FsCache::init()'],['../class_ex_fat_partition.html#adb1d277492dccba09031e2064f4fa66f',1,'ExFatPartition::init()'],['../class_fat_cache.html#a30790e03daad69b62ec6d7d643975454',1,'FatCache::init()'],['../class_fat_partition.html#ab827224f30eec57255d21cae589911ef',1,'FatPartition::init()'],['../classibufstream.html#a1d7bae17d9d2c79218085251946f322a',1,'ibufstream::init()'],['../classobufstream.html#a8f75dbadab2fed7770d01a2cc2628258',1,'obufstream::init()']]], - ['initerrorhalt_211',['initErrorHalt',['../class_sd_base.html#acb8180faf22cf72d97ec81330a700b05',1,'SdBase::initErrorHalt(print_t *pr)'],['../class_sd_base.html#aef6fd47c67b9b8498c1398e58422f169',1,'SdBase::initErrorHalt(print_t *pr, const char *msg)'],['../class_sd_base.html#a8a249b866a4b24ac0a0753f966aab299',1,'SdBase::initErrorHalt(Print *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#a5901169e4d6ae992b348df518da68a76',1,'SdBase::initErrorHalt()'],['../class_sd_base.html#a9b6c279ebcd8fa95d6b409d099986931',1,'SdBase::initErrorHalt(const char *msg)'],['../class_sd_base.html#a557ac64877bdd851cd27bf0a00f380c2',1,'SdBase::initErrorHalt(const __FlashStringHelper *msg)']]], - ['initerrorprint_212',['initErrorPrint',['../class_sd_base.html#a918474d623107f64b7ab9ca88d6fe46f',1,'SdBase::initErrorPrint(Print *pr)'],['../class_sd_base.html#abe8d75ba435b4decd6b2079b4272d0e5',1,'SdBase::initErrorPrint()']]], - ['internal_213',['internal',['../classios__base.html#afc720b7f6f461ec8e9cf5505059e5d7c',1,'ios_base::internal()'],['../ios_8h.html#a8dd76c1ce8fced364a98428ca1eea7a6',1,'internal(): ios.h']]], - ['invalidate_214',['invalidate',['../class_fs_cache.html#a963ea866ca2a9c4f63afd57cf287733d',1,'FsCache::invalidate()'],['../class_fat_cache.html#a70071a128d647b49b523dbb2f5f944a5',1,'FatCache::invalidate()']]], - ['ios_215',['ios',['../classios.html',1,'ios'],['../classios.html#adc5dbd7b69da79493ebc84aa1e681aaa',1,'ios::ios()']]], - ['ios_2eh_216',['ios.h',['../ios_8h.html',1,'']]], - ['ios_5fbase_217',['ios_base',['../classios__base.html',1,'']]], - ['iostate_218',['iostate',['../classios__base.html#aef19291eeae0f072ac42c6ba1fe3033c',1,'ios_base']]], - ['iostream_219',['iostream',['../classiostream.html',1,'']]], - ['iostream_2eh_220',['iostream.h',['../iostream_8h.html',1,'']]], - ['is_5fopen_221',['is_open',['../classfstream.html#ae4a71c6f3da2f168ec222739d796fc8b',1,'fstream::is_open()'],['../classifstream.html#aaa16c6422ea371995d02159f2e6707b2',1,'ifstream::is_open()'],['../classofstream.html#a9c97eb2eb6e35ae87cf7f7453a67e70a',1,'ofstream::is_open()']]], - ['isbusy_222',['isBusy',['../class_sd_card_interface.html#a26c31b07a866469098d702fed54f51b2',1,'SdCardInterface::isBusy()'],['../class_sdio_card.html#a560bdfc96932d073c2b0610600560f78',1,'SdioCard::isBusy()'],['../class_sd_spi_card.html#aa3cb9139dbc1e6596c6717da2b486328',1,'SdSpiCard::isBusy()']]], - ['iscontiguous_223',['isContiguous',['../struct_dir_pos__t.html#a7bea047144551b24c5aa301dc8dd44d7',1,'DirPos_t::isContiguous()'],['../class_ex_fat_file.html#a7a167102bd47b7cf91167b69f8cc57d1',1,'ExFatFile::isContiguous()'],['../class_fat_file.html#a16478eafdb731e867fb627d19091c3ce',1,'FatFile::isContiguous()'],['../class_fs_base_file.html#a7566bb4c71b5883e7bc15b45a1ee28a2',1,'FsBaseFile::isContiguous()']]], - ['isdigit_224',['isDigit',['../_print_templates_8h.html#ab82ae47ddc52e7a1a9400cc3c42a9de7',1,'PrintTemplates.h']]], - ['isdir_225',['isDir',['../class_ex_fat_file.html#ad0a3687bd95bed5b216651335e66b500',1,'ExFatFile::isDir()'],['../class_fat_file.html#a933360b20b496421b2bd9ee7a95563a6',1,'FatFile::isDir()'],['../class_fs_base_file.html#ae93db43779d54734855005116244f6aa',1,'FsBaseFile::isDir()']]], - ['isdirectory_226',['isDirectory',['../class_stream_file.html#a586ad44055eca4c1b2b457299b829d44',1,'StreamFile::isDirectory()'],['../class_fs_base_file.html#aa564175ba0065803013338d89510ea81',1,'FsBaseFile::isDirectory()']]], - ['isdirseparator_227',['isDirSeparator',['../_ex_fat_file_8h.html#a9f85580ad6f1dfc86fff09a58ff0a1c0',1,'isDirSeparator(): ExFatFile.h'],['../_fat_file_8h.html#a9f85580ad6f1dfc86fff09a58ff0a1c0',1,'isDirSeparator(): FatFile.h']]], - ['isdirty_228',['isDirty',['../class_fs_cache.html#a22f4284aefd18f569d962d37f4a5db70',1,'FsCache::isDirty()'],['../class_fat_cache.html#ae50287d95bd78558db1e4aa97d7b2c06',1,'FatCache::isDirty()']]], - ['isfile_229',['isFile',['../class_ex_fat_file.html#af601285f95db8398c140b3927cf9111c',1,'ExFatFile::isFile()'],['../class_fat_file.html#acc5a87da1a5c8cb9758bfeaa7ae47b57',1,'FatFile::isFile()']]], - ['ishidden_230',['isHidden',['../class_ex_fat_file.html#ac926285fa4321ebee28fa91beb511eae',1,'ExFatFile::isHidden()'],['../class_fat_file.html#ae216b4a2bc44a9cfb88478fa051a1fd8',1,'FatFile::isHidden()'],['../class_fs_base_file.html#a00e76b229cbb5098e1eb88e64a41dbfb',1,'FsBaseFile::isHidden()']]], - ['islfn_231',['isLFN',['../class_fat_file.html#af8f456ab790e818bfdd225cf6ffd40f3',1,'FatFile']]], - ['isopen_232',['isOpen',['../class_ex_fat_file.html#a804c34bbe3ebefe2b6c1d77ff8d49a35',1,'ExFatFile::isOpen()'],['../class_fat_file.html#a8b8a2850c086d3ce79bee64a23fbf7a6',1,'FatFile::isOpen()'],['../class_fs_base_file.html#a707007ff19ac5e4eb94cd0b26c542e0e',1,'FsBaseFile::isOpen()']]], - ['isreadable_233',['isReadable',['../class_ex_fat_file.html#a9ca137dfba2c7772910f4d2b3fdd9411',1,'ExFatFile::isReadable()'],['../class_fat_file.html#ae60b4cedb69c88ac641813d5edfa6b4a',1,'FatFile::isReadable()']]], - ['isreadonly_234',['isReadOnly',['../class_ex_fat_file.html#a14d160bfbfb39717746b93fa2eda5739',1,'ExFatFile::isReadOnly()'],['../class_fat_file.html#abaf639ec8f86f34aeb7e6b3615526f0b',1,'FatFile::isReadOnly()']]], - ['isroot_235',['isRoot',['../class_ex_fat_file.html#ad9f8e7afcf749ebcaaf055bd569dc7da',1,'ExFatFile::isRoot()'],['../class_fat_file.html#a03421a0c28649332f55e6ca06d3aeedb',1,'FatFile::isRoot()']]], - ['isroot32_236',['isRoot32',['../class_fat_file.html#a8fda8004720ec4cc55710869dbb52e35',1,'FatFile']]], - ['isrootfixed_237',['isRootFixed',['../class_fat_file.html#a0cc65089f7ce6c1ff92edbf0bff59dee',1,'FatFile']]], - ['issubdir_238',['isSubDir',['../class_ex_fat_file.html#ad7e02a1db8fb5a90288bb4679e9ddcb9',1,'ExFatFile::isSubDir()'],['../class_fat_file.html#abfd02c5d26f7d4f8739a8610116a6660',1,'FatFile::isSubDir()'],['../class_fs_base_file.html#a3140f64c85218c4b2f12f711483cd4c6',1,'FsBaseFile::isSubDir()']]], - ['issystem_239',['isSystem',['../class_fat_file.html#a48087bdeb6b94fc27e0f74c3d90af5a9',1,'FatFile']]], - ['istream_240',['istream',['../classistream.html',1,'']]], - ['istream_2eh_241',['istream.h',['../istream_8h.html',1,'']]], - ['iswritable_242',['isWritable',['../class_ex_fat_file.html#a04d1c43e80743f8c1a51b64062ce16dd',1,'ExFatFile::isWritable()'],['../class_fat_file.html#aa484d5b2b147c5f3fe0e26b6eaf11ffc',1,'FatFile::isWritable()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.html deleted file mode 100644 index 47a4a78d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.js deleted file mode 100644 index 31f77a2d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_a.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['khzsdclk_243',['kHzSdClk',['../class_sdio_card.html#a3532a1a4b8a43a51ed9b5853186203cb',1,'SdioCard']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.html deleted file mode 100644 index 1320a43f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.js deleted file mode 100644 index 631a9fe0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_b.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['left_244',['left',['../classios__base.html#ad364df9af2cfde1f40bd8e10c62bb215',1,'ios_base::left()'],['../ios_8h.html#a24a80a73f0a0d2d72d1cb74f49ff4759',1,'left(): ios.h']]], - ['legal83char_245',['legal83Char',['../class_fat_file.html#a94df8090f16e9666cdc53ca20f6aff90',1,'FatFile']]], - ['len_246',['len',['../struct_ex_name__t.html#a4c1c36c08b96a553854ac16c8309cd93',1,'ExName_t::len()'],['../structfname__t.html#a471184cc4c2671526d7d6fb80b2fe20c',1,'fname_t::len()']]], - ['length_247',['length',['../classobufstream.html#ac650708e968b0c0545a3badeb809cf15',1,'obufstream']]], - ['lfn_248',['lfn',['../struct_ex_name__t.html#afcdcceaf5309a7b6e21ddbf15e5b83cb',1,'ExName_t::lfn()'],['../structfname__t.html#a76ffd7abd5b7d3acf90b329c905770fd',1,'fname_t::lfn()']]], - ['lfnlegalchar_249',['lfnLegalChar',['../_ex_fat_file_8h.html#acfe36e138012e39e1d66891a4e070871',1,'ExFatFile.h']]], - ['ls_250',['ls',['../class_ex_fat_file.html#aa0e074c891f3db5ea2ebd491667b03a6',1,'ExFatFile::ls(print_t *pr)'],['../class_ex_fat_file.html#a09f8beb55f939874e93c1df6c8a046d4',1,'ExFatFile::ls(print_t *pr, uint8_t flags, uint8_t indent=0)'],['../class_ex_fat_volume.html#abe1e8cad0a5922984b28edfd987bc856',1,'ExFatVolume::ls(print_t *pr, uint8_t flags=0)'],['../class_ex_fat_volume.html#aad2de66514174edb37b0fe7e44b33abf',1,'ExFatVolume::ls(print_t *pr, const ExChar_t *path, uint8_t flags)'],['../class_ex_fat_volume.html#abe74c248cfe9d57d9a10f651203df9dc',1,'ExFatVolume::ls()'],['../class_ex_fat_volume.html#ae883a72fbfe40f9a6fe6c6bf349d5c1f',1,'ExFatVolume::ls(uint8_t flags)'],['../class_ex_fat_volume.html#ad3a1aa9f64361b81d0cfe5b9f5de3891',1,'ExFatVolume::ls(const ExChar_t *path, uint8_t flags=0)'],['../class_fat_file.html#a60ab9d16bcc778150a364c26de467de1',1,'FatFile::ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)'],['../class_fat_file.html#a6a11f3307da6232b5f2d11812832d93a',1,'FatFile::ls(uint8_t flags=0)'],['../class_fat_volume.html#ae40964f357cfff4208812344a0e6f26f',1,'FatVolume::ls(print_t *pr, uint8_t flags=0)'],['../class_fat_volume.html#ac5fc83cac7fd3af0b140a7986b9472f8',1,'FatVolume::ls(print_t *pr, const char *path, uint8_t flags)'],['../class_fat_volume.html#ad455ad05551329865c659cc4676f2d18',1,'FatVolume::ls(uint8_t flags=0)'],['../class_fat_volume.html#a455ad7b2a5b6b31551dca08087a3c404',1,'FatVolume::ls(const char *path, uint8_t flags=0)'],['../class_fs_base_file.html#aecbc336b952eebebfdfcf917863183ee',1,'FsBaseFile::ls(print_t *pr)'],['../class_fs_base_file.html#a6a254df9866966f7f97478e916fe6a7f',1,'FsBaseFile::ls(print_t *pr, uint8_t flags)'],['../class_fs_volume.html#a679105032aa3e5c4585c63f8e7acfc02',1,'FsVolume::ls(print_t *pr)'],['../class_fs_volume.html#a5ce82e5970856d1e8d549c512ec8a253',1,'FsVolume::ls(print_t *pr, uint8_t flags)'],['../class_fs_volume.html#ab429316ed9e57a52ecfb938aca7dff6c',1,'FsVolume::ls(print_t *pr, const char *path, uint8_t flags)'],['../class_fs_volume.html#aac4bf1f75fd37ba2e5a145569ab0790b',1,'FsVolume::ls()'],['../class_fs_volume.html#aed1c1e5e351b442ad8c0030bc63c655f',1,'FsVolume::ls(uint8_t flags)'],['../class_fs_volume.html#a212afe6a3393930b5d9ec6be86aabcd2',1,'FsVolume::ls(const char *path, uint8_t flags=0)']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.html deleted file mode 100644 index 32a3a1b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.js deleted file mode 100644 index af456561..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_c.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['maintain_5ffree_5fcluster_5fcount_251',['MAINTAIN_FREE_CLUSTER_COUNT',['../_sd_fat_config_8h.html#ac2865dac8fdbb4fff47105db32ddf05b',1,'SdFatConfig.h']]], - ['maxsck_252',['maxSck',['../class_sd_spi_config.html#ac1afd080e2baa2b6eb81331ed5180f37',1,'SdSpiConfig']]], - ['mdt_5fmonth_253',['mdt_month',['../struct_c_i_d.html#a60e35d4b824da135dc2a9197c5544929',1,'CID']]], - ['mdt_5fyear_5fhigh_254',['mdt_year_high',['../struct_c_i_d.html#a6b16c5e74b48af39036aa831fca4cb46',1,'CID']]], - ['mdt_5fyear_5flow_255',['mdt_year_low',['../struct_c_i_d.html#afe44a84b416bea68dea9bad27c172c3d',1,'CID']]], - ['mid_256',['mid',['../struct_c_i_d.html#aa77436aa64a8a0e80573ade765039d2f',1,'CID']]], - ['minimumserial_257',['MinimumSerial',['../class_minimum_serial.html',1,'']]], - ['minimumserial_2eh_258',['MinimumSerial.h',['../_minimum_serial_8h.html',1,'']]], - ['mkdir_259',['mkdir',['../class_ex_fat_file.html#a3a393624d52854e74bf385c9e513a86d',1,'ExFatFile::mkdir()'],['../class_ex_fat_volume.html#a407b93b16554b26ff52f7b762a9217aa',1,'ExFatVolume::mkdir(const ExChar_t *path, bool pFlag=true)'],['../class_ex_fat_volume.html#a0f4cf7e2853225380574724314327597',1,'ExFatVolume::mkdir(const String &path, bool pFlag=true)'],['../class_fat_file.html#abab5b9f72cc796388dd4eed01d13d90d',1,'FatFile::mkdir()'],['../class_fat_volume.html#ad80bccf8f24ff001a7b9277effc2cc52',1,'FatVolume::mkdir(const char *path, bool pFlag=true)'],['../class_fat_volume.html#ab423ec4f7e5b58a6d454f328f61fd864',1,'FatVolume::mkdir(const String &path, bool pFlag=true)'],['../class_fs_base_file.html#a8b7aa7f2c63882e483336dfe12ef6800',1,'FsBaseFile::mkdir()'],['../class_fs_volume.html#a9d38c297dccceeb5f48dceb17232368d',1,'FsVolume::mkdir(const char *path, bool pFlag=true)'],['../class_fs_volume.html#a5d07b87552368dc66e08aab2e7be14af',1,'FsVolume::mkdir(const String &path, bool pFlag=true)']]], - ['mprintf_260',['mprintf',['../_print_templates_8h.html#afceda1e76dbfc91ef2d06925a10eaea9',1,'mprintf(T *file, const char *fmt,...): PrintTemplates.h'],['../_print_templates_8h.html#a5893e928fd47234a7a69049f9e769359',1,'mprintf(F *file, const __FlashStringHelper *ifsh,...): PrintTemplates.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.html deleted file mode 100644 index a3860966..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.js deleted file mode 100644 index f66602f0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_d.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['name_261',['name',['../class_stream_file.html#a8792c863080576eb65ce6cacbe1dd931',1,'StreamFile::name()'],['../class_fs_base_file.html#a6ccd545042d98841246edfbf2f482677',1,'FsBaseFile::name()']]], - ['newcard_262',['newCard',['../class_sd_card_factory.html#a8337ec1a741c25ed9fb9fd730d68b792',1,'SdCardFactory::newCard(SdSpiConfig config)'],['../class_sd_card_factory.html#a7e5bcb01e8eed2df25e60c25fe47d916',1,'SdCardFactory::newCard(SdioConfig config)']]], - ['noboolalpha_263',['noboolalpha',['../ios_8h.html#aa6a1ec04992fc8090ca775a39678be01',1,'ios.h']]], - ['noshowbase_264',['noshowbase',['../ios_8h.html#ab861ff5f863de0ae002b65390dde36b0',1,'ios.h']]], - ['noshowpoint_265',['noshowpoint',['../ios_8h.html#ad85399d1b75151cf9e2436f2a1ccfc13',1,'ios.h']]], - ['noshowpos_266',['noshowpos',['../ios_8h.html#a985805b22ffb4ce2f5298168662bd2d7',1,'ios.h']]], - ['noskipws_267',['noskipws',['../ios_8h.html#a773b847300db776fde08a0b562792131',1,'ios.h']]], - ['nouppercase_268',['nouppercase',['../ios_8h.html#a24b96fb317e056b34aa84c4bb965a79a',1,'ios.h']]], - ['null_269',['NULL',['../_stdio_stream_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4',1,'StdioStream.h']]], - ['nullptr_270',['nullptr',['../_sys_call_8h.html#ab979d9d4b4923f7c54d6caa6e1a61936',1,'SysCall.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.html deleted file mode 100644 index 29316189..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.js deleted file mode 100644 index 1d6af59d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_e.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['obufstream_271',['obufstream',['../classobufstream.html',1,'obufstream'],['../classobufstream.html#a74f7dbcf1131b77d3665aa85d6629722',1,'obufstream::obufstream()'],['../classobufstream.html#a7af0555c5c08ebf9cbc70fc5e2f67db7',1,'obufstream::obufstream(char *buf, size_t size)']]], - ['oct_272',['oct',['../classios__base.html#a4155540f8d3ffdb8d25a2f50ee4df08f',1,'ios_base::oct()'],['../ios_8h.html#ae661b435df22f8e8e643817f4f915123',1,'oct(): ios.h']]], - ['off_5ftype_273',['off_type',['../classios__base.html#a45de7cca0d01da781f4b886179c65c22',1,'ios_base']]], - ['ofstream_274',['ofstream',['../classofstream.html',1,'ofstream'],['../classofstream.html#abd1a07c492699c44f149da45b8d593c1',1,'ofstream::ofstream()']]], - ['oid_275',['oid',['../struct_c_i_d.html#a12cb950aa46c62c8af1e530006f97031',1,'CID']]], - ['open_276',['open',['../class_ex_fat_file.html#ad0be05c5c7092317089872778052cbd7',1,'ExFatFile::open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)'],['../class_ex_fat_file.html#a825447643e6c9e8284a3ed78e3363788',1,'ExFatFile::open(ExFatVolume *vol, const ExChar_t *path, int oflag)'],['../class_ex_fat_file.html#a414b64dc30551e05dcc46f04e0f6413a',1,'ExFatFile::open(ExFatFile *dirFile, uint32_t index, oflag_t oflag)'],['../class_ex_fat_file.html#ab1e224aba9eb796c7ad48062cc1434c2',1,'ExFatFile::open(const ExChar_t *path, int oflag=0X00)'],['../class_ex_fat_volume.html#a0807cfcef46ef74cfe238badb83f3dda',1,'ExFatVolume::open(const ExChar_t *path, oflag_t oflag=0X00)'],['../class_ex_fat_volume.html#adce2c8ab2f73f56614b08fac42cabaea',1,'ExFatVolume::open(const String &path, oflag_t oflag=0X00)'],['../class_fat_file.html#af49a42dc64cd954debb271eae5639059',1,'FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)'],['../class_fat_file.html#ab44920bb9cd5414b8e69c9dc4343394a',1,'FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)'],['../class_fat_file.html#a58d6ea245f1bc3ae7a6df311cd25052f',1,'FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)'],['../class_fat_file.html#afd3e4d5a76b6751ca796fc57f4dd2be4',1,'FatFile::open(const char *path, oflag_t oflag=0X00)'],['../class_fat_volume.html#a22923b86de9c797ce5e19f206dd4ce1f',1,'FatVolume::open(const char *path, oflag_t oflag=0X00)'],['../class_fat_volume.html#af7178b7f13eeae7748640b6268a34812',1,'FatVolume::open(const String &path, oflag_t oflag=0X00)'],['../classfstream.html#a85b24d94552991f33caf4c3a83420879',1,'fstream::open()'],['../classifstream.html#a169694d6535fd551fd6db48a2867590e',1,'ifstream::open()'],['../classofstream.html#a4b9d30c742fbe01baa336406c7afdcb2',1,'ofstream::open()'],['../class_fs_base_file.html#aa767859d4a4b4716ebbc4ea42a6d74df',1,'FsBaseFile::open(FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)'],['../class_fs_base_file.html#ac4edea1afb935119ecaf39607016c3cc',1,'FsBaseFile::open(FsBaseFile *dir, uint32_t index, oflag_t oflag)'],['../class_fs_base_file.html#a9786eb47f5d001e89ff291c271517547',1,'FsBaseFile::open(FsVolume *vol, const char *path, oflag_t oflag)'],['../class_fs_base_file.html#af44f0decd9b11dd45996e81f46e2cdee',1,'FsBaseFile::open(const char *path, oflag_t oflag=O_RDONLY)'],['../class_fs_volume.html#a2f28fc92b7a71607bc57aa72f5a4c0a7',1,'FsVolume::open(const char *path, oflag_t oflag=0X00)'],['../class_fs_volume.html#a55804d14db55dd29bf7b26d692275ac9',1,'FsVolume::open(const String &path, oflag_t oflag=0X00)']]], - ['openmode_277',['openmode',['../classios__base.html#aaa192ec0dccc43050715553a34644523',1,'ios_base']]], - ['opennext_278',['openNext',['../class_ex_fat_file.html#a89b6021cf70b7adb9feb162260d5a101',1,'ExFatFile::openNext()'],['../class_fat_file.html#a7f98b908a686574efbd7e1d20121ef9a',1,'FatFile::openNext()'],['../class_fs_base_file.html#acb9b1075f4db76fa7e0521c9aff9c3df',1,'FsBaseFile::openNext()']]], - ['opennextfile_279',['openNextFile',['../class_ex_file.html#ada8cd27e9a2f604f5c05088024a46a63',1,'ExFile::openNextFile()'],['../class_file32.html#a571434707124ee554d659ec82e2ef750',1,'File32::openNextFile()'],['../class_fs_file.html#ab2f85961e3831d0d654da862becb7433',1,'FsFile::openNextFile()']]], - ['openroot_280',['openRoot',['../class_ex_fat_file.html#af664c1da1bfa0bb5f6eb933bc25f757e',1,'ExFatFile::openRoot()'],['../class_fat_file.html#a7e0c0548fed3a69e7284b91b694439d4',1,'FatFile::openRoot()']]], - ['operator_20bool_281',['operator bool',['../class_minimum_serial.html#a73a1a2a92604ecb8507afde0022aedd8',1,'MinimumSerial::operator bool()'],['../class_ex_fat_file.html#aa1abbd813f27d488f0ff439ccbc9ca98',1,'ExFatFile::operator bool()'],['../class_fat_file.html#acd141c43d03cf790b3b9806f3b059e77',1,'FatFile::operator bool()'],['../classios.html#a940890a2e7fb429fd32813b0ea7ed35d',1,'ios::operator bool()'],['../class_fs_base_file.html#a3ad633f3efc2701a3a89e776436b14e1',1,'FsBaseFile::operator bool()']]], - ['operator_20const_20void_20_2a_282',['operator const void *',['../classios.html#aa919219fd2fa41d49c8573b36bb04418',1,'ios']]], - ['operator_21_283',['operator!',['../classios.html#aea64e05b9aa58bd75ca636692f881fb6',1,'ios']]], - ['operator_3c_3c_284',['operator<<',['../classostream.html#a4dfc0cdb38bced959ba7cf963db38c30',1,'ostream::operator<<(ostream &(*pf)(ostream &str))'],['../classostream.html#af52c607ea168aff1025222c62cad392f',1,'ostream::operator<<(ios_base &(*pf)(ios_base &str))'],['../classostream.html#a63e3999be154253cf92a45c22e548f51',1,'ostream::operator<<(bool arg)'],['../classostream.html#a618b5d6861dde2347847102b89e0ccfa',1,'ostream::operator<<(const char *arg)'],['../classostream.html#aebe24ff723b806cbee19deb2165d0a5b',1,'ostream::operator<<(const signed char *arg)'],['../classostream.html#ac0cf68ffa4706994f47acb1fa37c601a',1,'ostream::operator<<(const unsigned char *arg)'],['../classostream.html#a9d91797605a48ffcad21738bfc876547',1,'ostream::operator<<(const String &arg)'],['../classostream.html#a1d1e11d2fadaf4c9e34194a1f28572e4',1,'ostream::operator<<(char arg)'],['../classostream.html#ad06f8c6c47667e9c7b14620882c09434',1,'ostream::operator<<(signed char arg)'],['../classostream.html#a69912ec4a8536f289b716e95953d09d7',1,'ostream::operator<<(unsigned char arg)'],['../classostream.html#a8065697d56d5e5d1a0ca50c1916b4955',1,'ostream::operator<<(double arg)'],['../classostream.html#a6c68e418e19d9dcdfe6b1790b2621666',1,'ostream::operator<<(float arg)'],['../classostream.html#a227c47e2b631f29d8873b00290bb4872',1,'ostream::operator<<(short arg)'],['../classostream.html#ace10a3a767dc55faff2cec71cd0a89b1',1,'ostream::operator<<(unsigned short arg)'],['../classostream.html#a62488f7ce7822c777ea27d15223b8e5f',1,'ostream::operator<<(int arg)'],['../classostream.html#ad31df6cd88c7248c01808e40889a7907',1,'ostream::operator<<(unsigned int arg)'],['../classostream.html#a15db9977ed82e503bd3cd1f585acf9e6',1,'ostream::operator<<(long arg)'],['../classostream.html#aaedd44fefa48cf3f0967fcd699a2909d',1,'ostream::operator<<(unsigned long arg)'],['../classostream.html#a3b1be06d511106bb0449f4424962ad72',1,'ostream::operator<<(long long arg)'],['../classostream.html#a9f9adac280c449da7be40f0f1a65fcd6',1,'ostream::operator<<(unsigned long long arg)'],['../classostream.html#a2a8febd7c07f078120dd69bb71f25a94',1,'ostream::operator<<(const void *arg)'],['../classostream.html#a99ee8d9265d9354f197d02a3d17116be',1,'ostream::operator<<(const __FlashStringHelper *arg)'],['../iostream_8h.html#aa125ac928f3377cbc6e3cf288b9378fd',1,'operator<<(ostream &os, const setfill &arg): iostream.h'],['../iostream_8h.html#a23d4c29ef8ae37ec7d972d0b66187652',1,'operator<<(ostream &os, const setprecision &arg): iostream.h'],['../iostream_8h.html#a331649f2fdb01ed069dc18a5fad781b1',1,'operator<<(ostream &os, const setw &arg): iostream.h']]], - ['operator_3d_285',['operator=',['../class_fs_base_file.html#ae4f6d168072bb4f2a61976f621659d20',1,'FsBaseFile']]], - ['operator_3e_3e_286',['operator>>',['../classistream.html#aa67d3b8ac67e2097d876a66657ec6067',1,'istream::operator>>(istream &(*pf)(istream &str))'],['../classistream.html#ac6e2f17c80edd19deecdc20f804c424e',1,'istream::operator>>(ios_base &(*pf)(ios_base &str))'],['../classistream.html#a5a0a2c0e06abadb79951ebe34f36d62a',1,'istream::operator>>(ios &(*pf)(ios &str))'],['../classistream.html#a99db66d2e192f02deff0171ad098271f',1,'istream::operator>>(char *str)'],['../classistream.html#addaf5e0f39a15cc213117165dfef0d77',1,'istream::operator>>(char &ch)'],['../classistream.html#a390af4d28adbdc537e436f2121d1c862',1,'istream::operator>>(signed char *str)'],['../classistream.html#a49ab1a573fbf69809d19a52855a30072',1,'istream::operator>>(signed char &ch)'],['../classistream.html#a52e85d01198968330f20026a52cb9f72',1,'istream::operator>>(unsigned char *str)'],['../classistream.html#a74875fcf9ccdc0dca4b46a0b66821798',1,'istream::operator>>(unsigned char &ch)'],['../classistream.html#a3708636d095d360695e9c23335639317',1,'istream::operator>>(bool &arg)'],['../classistream.html#a662060e885a0551c390b7042b3b9e4a5',1,'istream::operator>>(short &arg)'],['../classistream.html#a31a706a374c5a594e400734b8992e2a0',1,'istream::operator>>(unsigned short &arg)'],['../classistream.html#ae8451bc86d83828892d9d67c67b7f02b',1,'istream::operator>>(int &arg)'],['../classistream.html#a35c9847ebf7b822c5ec9742e9de19345',1,'istream::operator>>(unsigned int &arg)'],['../classistream.html#aa26e7f35e74d96803bb0dfb3fb0dc154',1,'istream::operator>>(long &arg)'],['../classistream.html#a5aafa4c7f6615a7f1441962b61b8ef59',1,'istream::operator>>(unsigned long &arg)'],['../classistream.html#af9bf453725ce1d9ef62142a7ee38936e',1,'istream::operator>>(double &arg)'],['../classistream.html#aa8efce6fecab80cf7a17d5dfa31f5aa8',1,'istream::operator>>(float &arg)'],['../classistream.html#a62ef4762feacc64a8acdcbf8f1296936',1,'istream::operator>>(void *&arg)'],['../iostream_8h.html#a4a4079de901e0f3f10c743115bd345b2',1,'operator>>(istream &obj, const setfill &arg): iostream.h'],['../iostream_8h.html#a2f819cd0ccda31a8b648f20534469308',1,'operator>>(istream &is, const setprecision &arg): iostream.h'],['../iostream_8h.html#a8d1b3da6f1074322a6e9e11ff4ce8c33',1,'operator>>(istream &is, const setw &arg): iostream.h']]], - ['options_287',['options',['../class_sd_spi_config.html#a6292855eeea89636ad2b4da9675dbc96',1,'SdSpiConfig::options()'],['../class_sdio_config.html#a905aeb5dc774c63af6e72b3be51fc845',1,'SdioConfig::options()']]], - ['ostream_288',['ostream',['../classostream.html',1,'']]], - ['ostream_2eh_289',['ostream.h',['../ostream_8h.html',1,'']]], - ['out_290',['out',['../classios__base.html#a4c1d517774c0d11af3424e90395f26ae',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.html deleted file mode 100644 index ca42a522..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.js deleted file mode 100644 index 854c4cb5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/all_f.js +++ /dev/null @@ -1,43 +0,0 @@ -var searchData= -[ - ['p_291',['p',['../structsetprecision.html#a7cb7bb355a303fa39a8035615bde9348',1,'setprecision']]], - ['peek_292',['peek',['../class_ex_fat_file.html#afc2e375faa696545f7ebbf583faae72a',1,'ExFatFile::peek()'],['../class_fat_file.html#ac05b7136b887539426856c623869aa3a',1,'FatFile::peek()'],['../classistream.html#a4022265e0ede3698454f1ff59348c14a',1,'istream::peek()'],['../class_stream_file.html#af0da96e502485133ca0cff27fa130082',1,'StreamFile::peek()'],['../class_fs_base_file.html#adc49cb204f293a28b67af64c49c4c9f3',1,'FsBaseFile::peek()']]], - ['pgm_5fread_5fbyte_293',['pgm_read_byte',['../_fat_file_8h.html#a48c60b057902adf805797f183286728d',1,'FatFile.h']]], - ['pgm_5fread_5fword_294',['pgm_read_word',['../_fat_file_8h.html#a910fb5f01313d339d3b835d45e1e5ad0',1,'FatFile.h']]], - ['pnm_295',['pnm',['../struct_c_i_d.html#a6484cd56fc4bacfa815c12d8682129ba',1,'CID']]], - ['pos_5ft_296',['pos_t',['../ios_8h.html#aae8adaedc486a4b2f67576fdeaf0a585',1,'ios.h']]], - ['pos_5ftype_297',['pos_type',['../classios__base.html#abe85cf1f181b8bce8022f05ab76aae7f',1,'ios_base']]], - ['position_298',['position',['../struct_ex_fat_pos__t.html#abfab79daf5a2df281ebf3c5dad204f23',1,'ExFatPos_t::position()'],['../struct_dir_pos__t.html#a6cef96844ecd8e9972df860bacc04f24',1,'DirPos_t::position()'],['../struct_fat_pos__t.html#a8e14c6f2705777502b543452743eaa26',1,'FatPos_t::position()'],['../class_stream_file.html#a18a04d1e68a0c1e3e38e5712cd9bbc03',1,'StreamFile::position()'],['../class_fs_base_file.html#a8d5ea7284de7ec0bfdb0b2294001f015',1,'FsBaseFile::position()']]], - ['preallocate_299',['preAllocate',['../class_ex_fat_file.html#a35a5093014e80965e49c84b61780556f',1,'ExFatFile::preAllocate()'],['../class_fat_file.html#aeeb13b9de68bf9097c863c41d655ee83',1,'FatFile::preAllocate()'],['../class_fs_base_file.html#acbc037f9f07c57235bb8b30af5a53ac2',1,'FsBaseFile::preAllocate()']]], - ['precision_300',['precision',['../classios__base.html#aba92f0687644fc14f202958635ce276f',1,'ios_base::precision() const'],['../classios__base.html#a5b70cc65fc2c276136fea99bddedb6f0',1,'ios_base::precision(unsigned int n)']]], - ['print_301',['print',['../class_buffered_print.html#a95f984c4702b0e20d781efd9d1ea8f27',1,'BufferedPrint::print(double d, uint8_t prec=2)'],['../class_buffered_print.html#aeed86ef2ea320cd8ff47ee871663a8ce',1,'BufferedPrint::print(float f, uint8_t prec=2)'],['../class_buffered_print.html#ae9472f3acd3f7d3187500e60754963bb',1,'BufferedPrint::print(Type v)'],['../class_stdio_stream.html#ad3f6ee8e8ca5dcf6dabfd88199b172e2',1,'StdioStream::print(char c)'],['../class_stdio_stream.html#a1158ea5f9bf041f21b1733b7811c9bb9',1,'StdioStream::print(const char *str)'],['../class_stdio_stream.html#aac4d7b3548d03b8fd70adf12c7ee315c',1,'StdioStream::print(const __FlashStringHelper *str)'],['../class_stdio_stream.html#a26f5b98560b6771225005b073166108b',1,'StdioStream::print(double val, uint8_t prec=2)'],['../class_stdio_stream.html#a06b6eb9f0a7000fdcc73cd6af8d40560',1,'StdioStream::print(float val, uint8_t prec=2)'],['../class_stdio_stream.html#a7129f85c7c5f16867f467731ef84dee9',1,'StdioStream::print(T val)']]], - ['print_5ft_302',['print_t',['../_sys_call_8h.html#ac62f6449331cfe1a71f29be30efe7890',1,'SysCall.h']]], - ['printaccessdate_303',['printAccessDate',['../class_fat_file.html#a22be4c339d0bfa331f75415b74dd4f37',1,'FatFile']]], - ['printaccessdatetime_304',['printAccessDateTime',['../class_ex_fat_file.html#ad9ba8aa00b9db683d40fc2989dbe1922',1,'ExFatFile::printAccessDateTime()'],['../class_fat_file.html#a19b3196bb1f6a68a2447e53b09369aef',1,'FatFile::printAccessDateTime()'],['../class_fs_base_file.html#a264ba61530aee50dbe9659d41dd2c1d6',1,'FsBaseFile::printAccessDateTime()']]], - ['printcreatedatetime_305',['printCreateDateTime',['../class_ex_fat_file.html#a7318b2d7594d6ba52421c413f5fc35cd',1,'ExFatFile::printCreateDateTime()'],['../class_fat_file.html#ab22396a285e27b53501a0047ddd97f59',1,'FatFile::printCreateDateTime()'],['../class_fs_base_file.html#a3f75ac7eb6643afcabae28e8c93479c8',1,'FsBaseFile::printCreateDateTime()']]], - ['printdec_306',['printDec',['../class_stdio_stream.html#ac0a907feb1e4b7e00de99857b4c0a470',1,'StdioStream::printDec(char n)'],['../class_stdio_stream.html#a2707ea97f6113c226781469f4f39ff62',1,'StdioStream::printDec(signed char n)'],['../class_stdio_stream.html#a6e6ac78caa6259a4c4934707bf497a2b',1,'StdioStream::printDec(unsigned char n)'],['../class_stdio_stream.html#a218af88db35f38babf01d6e0a9cdceeb',1,'StdioStream::printDec(int16_t n)'],['../class_stdio_stream.html#a90b2999af94a3578fff7579c2acf8e35',1,'StdioStream::printDec(uint16_t n)'],['../class_stdio_stream.html#ad4591f1234b57f63c1acf0f3392099ac',1,'StdioStream::printDec(int32_t n)'],['../class_stdio_stream.html#a8b6c2c80342abe45e6f564e9bd5bb7ea',1,'StdioStream::printDec(uint32_t n)'],['../class_stdio_stream.html#aaa8921947d4dbbae840d285cb633e8aa',1,'StdioStream::printDec(double value, uint8_t prec)'],['../class_stdio_stream.html#a6a09284b1c6d0769c27916a2e131e749',1,'StdioStream::printDec(float value, uint8_t prec)']]], - ['printf_5fuse_5ffloat_307',['PRINTF_USE_FLOAT',['../_print_templates_8h.html#a26baac10baccbe6d4f13f98981dd202a',1,'PrintTemplates.h']]], - ['printfatdate_308',['printFatDate',['../class_fat_file.html#aabcd863883bfcfb37b63dbd6021f7eb8',1,'FatFile']]], - ['printfattime_309',['printFatTime',['../class_fat_file.html#a7f84d953190ea94710dad9ebb897b957',1,'FatFile']]], - ['printfattype_310',['printFatType',['../class_sd_base.html#a234e80318c39229fe968a182b172148c',1,'SdBase']]], - ['printfield_311',['printField',['../class_buffered_print.html#a69ea9541fb854448b9fe3aff44583975',1,'BufferedPrint::printField(char c, char term)'],['../class_buffered_print.html#ac18cc8c86b73b073a28db85075215f4f',1,'BufferedPrint::printField(const __FlashStringHelper *fsh, char term)'],['../class_buffered_print.html#ac49d0beb5fdad68e82f741bbaad4bb1b',1,'BufferedPrint::printField(const char *str, char term)'],['../class_buffered_print.html#a5b5b11f01adf91a1854a44b131886219',1,'BufferedPrint::printField(double d, char term, uint8_t prec=2)'],['../class_buffered_print.html#a93369fc042366488ef40426f9fd3286d',1,'BufferedPrint::printField(float f, char term, uint8_t prec=2)'],['../class_buffered_print.html#af680cf36170347287d20ed92ae5f6c9b',1,'BufferedPrint::printField(Type n, char term)'],['../class_ex_fat_file.html#a496ac61e367a24665425d54956a46346',1,'ExFatFile::printField(double value, char term, uint8_t prec=2)'],['../class_ex_fat_file.html#a70eda4191df90f608694c1faede7fb33',1,'ExFatFile::printField(float value, char term, uint8_t prec=2)'],['../class_ex_fat_file.html#a9759c13e804c01ff9e7e2ac8fbabc5b8',1,'ExFatFile::printField(Type value, char term)'],['../class_fat_file.html#aa4a61a0cca1813d2ad0f6fe99cc4e41d',1,'FatFile::printField(double value, char term, uint8_t prec=2)'],['../class_fat_file.html#a90ccef676afd62bbe7c773dd863a56e0',1,'FatFile::printField(float value, char term, uint8_t prec=2)'],['../class_fat_file.html#a8f906be79086f38943cb0911310d67bf',1,'FatFile::printField(Type value, char term)'],['../class_stdio_stream.html#a4988592ada39c4b4c603b061f84d183f',1,'StdioStream::printField(double value, char term, uint8_t prec=2)'],['../class_stdio_stream.html#a3b90b2317cc391f94784a847f5313c08',1,'StdioStream::printField(float value, char term, uint8_t prec=2)'],['../class_stdio_stream.html#a02c2ad1a2e71e82d238b8386cf3e6c41',1,'StdioStream::printField(T value, char term)'],['../class_fs_base_file.html#a911ae825e67d7e6ade4a672595e060d6',1,'FsBaseFile::printField(double value, char term, uint8_t prec=2)'],['../class_fs_base_file.html#a5dd2738efe2e550f56037536bc252f13',1,'FsBaseFile::printField(float value, char term, uint8_t prec=2)'],['../class_fs_base_file.html#a45639312b8c5aa9ceddb19e654e902b4',1,'FsBaseFile::printField(Type value, char term)']]], - ['printfile_312',['PrintFile',['../class_print_file.html',1,'']]], - ['printfile_3c_20sdbasefile_20_3e_313',['PrintFile< SdBaseFile >',['../class_print_file.html',1,'']]], - ['printfilesize_314',['printFileSize',['../class_ex_fat_file.html#a16d527f98cff3ffd3ba8bc594a22d186',1,'ExFatFile::printFileSize()'],['../class_fat_file.html#a12a5d2de2737c201aa39ca1bd2ab9c47',1,'FatFile::printFileSize()'],['../class_fs_base_file.html#a6760471e3c445f66b94f3f0e96fdfe10',1,'FsBaseFile::printFileSize()']]], - ['printhex_315',['printHex',['../class_stdio_stream.html#add39b2b4ec3daa7c8922e96ce5d368bc',1,'StdioStream']]], - ['printhexln_316',['printHexln',['../class_stdio_stream.html#aec6ebea511489b0ef6b61d9132d93af9',1,'StdioStream']]], - ['println_317',['println',['../class_buffered_print.html#a7bd188ccc8b38b83cf44b96164a1d816',1,'BufferedPrint::println()'],['../class_buffered_print.html#aaeaceb452361377ce73db0041edbcdff',1,'BufferedPrint::println(double d, uint8_t prec=2)'],['../class_buffered_print.html#afc449966c5c7357fde925c6888669698',1,'BufferedPrint::println(float f, uint8_t prec)'],['../class_buffered_print.html#a0945ed373bd17a309bb6661faad3be9c',1,'BufferedPrint::println(Type v)'],['../class_stdio_stream.html#ad0cd3acc05a91456f505752377bd405a',1,'StdioStream::println()'],['../class_stdio_stream.html#a3793dd66cf347a1ca0b7b167e948cce9',1,'StdioStream::println(double val, uint8_t prec=2)'],['../class_stdio_stream.html#aac250d041a7844c8db1cbd2d97ecfdaa',1,'StdioStream::println(float val, uint8_t prec=2)'],['../class_stdio_stream.html#a3b14532768d07e6ed89c762d04792c12',1,'StdioStream::println(T val)']]], - ['printmodifydatetime_318',['printModifyDateTime',['../class_ex_fat_file.html#a16488d3e0d946f108240b7d6c536c6f4',1,'ExFatFile::printModifyDateTime()'],['../class_fat_file.html#a43c8a1cabcae673e43c590f5db44c65a',1,'FatFile::printModifyDateTime()'],['../class_fs_base_file.html#a0f2f813496fa156f9808a5d33c2d8746',1,'FsBaseFile::printModifyDateTime()']]], - ['printname_319',['printName',['../class_ex_fat_file.html#a095c0a865e5e5b6463c3dc0c90680635',1,'ExFatFile::printName()'],['../class_fat_file.html#afe18a787fb8640e2d2483370c770f82f',1,'FatFile::printName(print_t *pr)'],['../class_fat_file.html#ad1cbc3aeb0f5193b7a26595966da9621',1,'FatFile::printName()'],['../class_fs_base_file.html#a178a1cbe2bce19758a55bd00fa262732',1,'FsBaseFile::printName()']]], - ['printsderror_320',['printSdError',['../class_sd_base.html#a6a8ba118e754b2b9fa0f34410163e228',1,'SdBase']]], - ['printsfn_321',['printSFN',['../class_fat_file.html#a791cd7aade71f609aab62ec018aea3c0',1,'FatFile']]], - ['printtemplates_2eh_322',['PrintTemplates.h',['../_print_templates_8h.html',1,'']]], - ['progmem_323',['PROGMEM',['../_fat_file_8h.html#a75acaba9e781937468d0911423bc0c35',1,'FatFile.h']]], - ['prv_5fm_324',['prv_m',['../struct_c_i_d.html#a142fd792bb74d7af1f0fb62833ae053b',1,'CID']]], - ['prv_5fn_325',['prv_n',['../struct_c_i_d.html#ae50f389a50daf99d15d1ea7ce2d426cf',1,'CID']]], - ['psn_326',['psn',['../struct_c_i_d.html#ada215f8541fa46078461d8da9574fc5e',1,'CID']]], - ['pstr_327',['PSTR',['../_fat_file_8h.html#a9c00057fd19e916cc1aa0a5949336beb',1,'FatFile.h']]], - ['put_328',['put',['../classostream.html#a11aad8a1efd284ccfa91cbfb78d089bd',1,'ostream']]], - ['putc_329',['putc',['../class_stdio_stream.html#adf9e552212aad6fc2284da0ee62d04dc',1,'StdioStream']]], - ['putcrlf_330',['putCRLF',['../class_stdio_stream.html#a09ccc4b6cabc3502c1052e85d94e84ef',1,'StdioStream']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.html deleted file mode 100644 index d585e6a9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.js deleted file mode 100644 index d6141dbe..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['arduinoinstream_501',['ArduinoInStream',['../class_arduino_in_stream.html',1,'']]], - ['arduinooutstream_502',['ArduinoOutStream',['../class_arduino_out_stream.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.html deleted file mode 100644 index baeb182b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.js deleted file mode 100644 index 0a5aaaf7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['blockdeviceinterface_503',['BlockDeviceInterface',['../class_block_device_interface.html',1,'']]], - ['bufferedprint_504',['BufferedPrint',['../class_buffered_print.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.html deleted file mode 100644 index d2672790..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.js deleted file mode 100644 index ce8074b6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['cache_5ft_505',['cache_t',['../unioncache__t.html',1,'']]], - ['cid_506',['CID',['../struct_c_i_d.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.html deleted file mode 100644 index 8a5cbe17..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.js deleted file mode 100644 index 2ba63f03..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_3.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['dirpos_5ft_507',['DirPos_t',['../struct_dir_pos__t.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.html deleted file mode 100644 index 300b9aba..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.js deleted file mode 100644 index cdd5651b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_4.js +++ /dev/null @@ -1,10 +0,0 @@ -var searchData= -[ - ['exfatfile_508',['ExFatFile',['../class_ex_fat_file.html',1,'']]], - ['exfatformatter_509',['ExFatFormatter',['../class_ex_fat_formatter.html',1,'']]], - ['exfatpartition_510',['ExFatPartition',['../class_ex_fat_partition.html',1,'']]], - ['exfatpos_5ft_511',['ExFatPos_t',['../struct_ex_fat_pos__t.html',1,'']]], - ['exfatvolume_512',['ExFatVolume',['../class_ex_fat_volume.html',1,'']]], - ['exfile_513',['ExFile',['../class_ex_file.html',1,'']]], - ['exname_5ft_514',['ExName_t',['../struct_ex_name__t.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.html deleted file mode 100644 index e7afb2c3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.js deleted file mode 100644 index 8c6fa857..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_5.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['fatcache_515',['FatCache',['../class_fat_cache.html',1,'']]], - ['fatfile_516',['FatFile',['../class_fat_file.html',1,'']]], - ['fatformatter_517',['FatFormatter',['../class_fat_formatter.html',1,'']]], - ['fatpartition_518',['FatPartition',['../class_fat_partition.html',1,'']]], - ['fatpos_5ft_519',['FatPos_t',['../struct_fat_pos__t.html',1,'']]], - ['fatvolume_520',['FatVolume',['../class_fat_volume.html',1,'']]], - ['file32_521',['File32',['../class_file32.html',1,'']]], - ['fname_5ft_522',['fname_t',['../structfname__t.html',1,'']]], - ['fsbasefile_523',['FsBaseFile',['../class_fs_base_file.html',1,'']]], - ['fscache_524',['FsCache',['../class_fs_cache.html',1,'']]], - ['fsfile_525',['FsFile',['../class_fs_file.html',1,'']]], - ['fstream_526',['fstream',['../classfstream.html',1,'']]], - ['fsvolume_527',['FsVolume',['../class_fs_volume.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.html deleted file mode 100644 index f397fd5a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.js deleted file mode 100644 index 96ac279c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_6.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['ibufstream_528',['ibufstream',['../classibufstream.html',1,'']]], - ['ifstream_529',['ifstream',['../classifstream.html',1,'']]], - ['ios_530',['ios',['../classios.html',1,'']]], - ['ios_5fbase_531',['ios_base',['../classios__base.html',1,'']]], - ['iostream_532',['iostream',['../classiostream.html',1,'']]], - ['istream_533',['istream',['../classistream.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.html deleted file mode 100644 index 6453cb7f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.js deleted file mode 100644 index 86841b6e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['minimumserial_534',['MinimumSerial',['../class_minimum_serial.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.html deleted file mode 100644 index f2f78e9f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.js deleted file mode 100644 index 5969ae39..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_8.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['obufstream_535',['obufstream',['../classobufstream.html',1,'']]], - ['ofstream_536',['ofstream',['../classofstream.html',1,'']]], - ['ostream_537',['ostream',['../classostream.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.html deleted file mode 100644 index e4e148f0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.js deleted file mode 100644 index 251bed64..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_9.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['printfile_538',['PrintFile',['../class_print_file.html',1,'']]], - ['printfile_3c_20sdbasefile_20_3e_539',['PrintFile< SdBaseFile >',['../class_print_file.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.html deleted file mode 100644 index 157ebcb7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.js deleted file mode 100644 index 71bd0cb9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/classes_a.js +++ /dev/null @@ -1,31 +0,0 @@ -var searchData= -[ - ['sdbase_540',['SdBase',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20exfatvolume_20_3e_541',['SdBase< ExFatVolume >',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20fatvolume_20_3e_542',['SdBase< FatVolume >',['../class_sd_base.html',1,'']]], - ['sdbase_3c_20fsvolume_20_3e_543',['SdBase< FsVolume >',['../class_sd_base.html',1,'']]], - ['sdcardfactory_544',['SdCardFactory',['../class_sd_card_factory.html',1,'']]], - ['sdcardinterface_545',['SdCardInterface',['../class_sd_card_interface.html',1,'']]], - ['sdexfat_546',['SdExFat',['../class_sd_ex_fat.html',1,'']]], - ['sdfat32_547',['SdFat32',['../class_sd_fat32.html',1,'']]], - ['sdfile_548',['SdFile',['../class_sd_file.html',1,'']]], - ['sdfs_549',['SdFs',['../class_sd_fs.html',1,'']]], - ['sdiocard_550',['SdioCard',['../class_sdio_card.html',1,'']]], - ['sdioconfig_551',['SdioConfig',['../class_sdio_config.html',1,'']]], - ['sdspiarduinodriver_552',['SdSpiArduinoDriver',['../class_sd_spi_arduino_driver.html',1,'']]], - ['sdspibaseclass_553',['SdSpiBaseClass',['../class_sd_spi_base_class.html',1,'']]], - ['sdspicard_554',['SdSpiCard',['../class_sd_spi_card.html',1,'']]], - ['sdspiconfig_555',['SdSpiConfig',['../class_sd_spi_config.html',1,'']]], - ['sdspisoftdriver_556',['SdSpiSoftDriver',['../class_sd_spi_soft_driver.html',1,'']]], - ['setfill_557',['setfill',['../structsetfill.html',1,'']]], - ['setprecision_558',['setprecision',['../structsetprecision.html',1,'']]], - ['setw_559',['setw',['../structsetw.html',1,'']]], - ['softspidriver_560',['SoftSpiDriver',['../class_soft_spi_driver.html',1,'']]], - ['stdiostream_561',['StdioStream',['../class_stdio_stream.html',1,'']]], - ['streambaseclass_562',['StreamBaseClass',['../class_stream_base_class.html',1,'']]], - ['streamfile_563',['StreamFile',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20exfatfile_2c_20uint64_5ft_20_3e_564',['StreamFile< ExFatFile, uint64_t >',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20fatfile_2c_20uint32_5ft_20_3e_565',['StreamFile< FatFile, uint32_t >',['../class_stream_file.html',1,'']]], - ['streamfile_3c_20fsbasefile_2c_20uint64_5ft_20_3e_566',['StreamFile< FsBaseFile, uint64_t >',['../class_stream_file.html',1,'']]], - ['syscall_567',['SysCall',['../class_sys_call.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/close.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/close.png deleted file mode 100644 index 9342d3df..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/close.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.html deleted file mode 100644 index 8fb07b8c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.js deleted file mode 100644 index 1f3b35cd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['check_5fflash_5fprogramming_991',['CHECK_FLASH_PROGRAMMING',['../_sd_fat_config_8h.html#a63747c9ac4e3d78579690cf9eb38c4df',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.html deleted file mode 100644 index 2858dbe3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.js deleted file mode 100644 index 95af909a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_1.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['dedicated_5fspi_992',['DEDICATED_SPI',['../_sd_spi_driver_8h.html#a666c394438267afda9b1e63f6b61459c',1,'SdSpiDriver.h']]], - ['destructor_5fcloses_5ffile_993',['DESTRUCTOR_CLOSES_FILE',['../_sd_fat_config_8h.html#a9a2b1ca4d91cff876f48deeaacbc33da',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.html deleted file mode 100644 index 81824d5d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.js deleted file mode 100644 index 5068b075..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_2.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['enable_5farduino_5ffeatures_994',['ENABLE_ARDUINO_FEATURES',['../_sd_fat_config_8h.html#a9a8c1ea8596f35f7f33a24b642567206',1,'SdFatConfig.h']]], - ['enable_5farduino_5fserial_995',['ENABLE_ARDUINO_SERIAL',['../_sd_fat_config_8h.html#aa0a95c918e41f5cb3850231fc41fdcd0',1,'SdFatConfig.h']]], - ['enable_5farduino_5fstring_996',['ENABLE_ARDUINO_STRING',['../_sd_fat_config_8h.html#aae353ccb45df7772d8022763a57410d9',1,'SdFatConfig.h']]], - ['enable_5fdedicated_5fspi_997',['ENABLE_DEDICATED_SPI',['../_sd_fat_config_8h.html#a3ceb23f14263a17c56eac40e484cbbbb',1,'SdFatConfig.h']]], - ['endl_5fcalls_5fflush_998',['ENDL_CALLS_FLUSH',['../_sd_fat_config_8h.html#a270eefdaec4778f2a491658f34f61b17',1,'SdFatConfig.h']]], - ['eof_999',['EOF',['../_stdio_stream_8h.html#a59adc4c82490d23754cd39c2fb99b0da',1,'StdioStream.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.html deleted file mode 100644 index e9d08d70..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.js deleted file mode 100644 index ec7ff9bb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_3.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['f_1000',['F',['../_sys_call_8h.html#a0e3009529aac180ed5f48296d6670d6b',1,'SysCall.h']]], - ['fat12_5fsupport_1001',['FAT12_SUPPORT',['../_sd_fat_config_8h.html#a28998c5daf4bd038f4f93172698320b1',1,'SdFatConfig.h']]], - ['fs_5fdefault_5fdate_1002',['FS_DEFAULT_DATE',['../_sd_fat_config_8h.html#af9e38fab77717460deffabaec90ffc9f',1,'SdFatConfig.h']]], - ['fs_5fdefault_5ftime_1003',['FS_DEFAULT_TIME',['../_sd_fat_config_8h.html#aa881707cd0526be3a1d2e3f214db2d5e',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.html deleted file mode 100644 index d8b61bbf..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.js deleted file mode 100644 index fccdc8d5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_4.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['has_5fsdio_5fclass_1004',['HAS_SDIO_CLASS',['../_sd_fat_config_8h.html#a356309f8e0bad852d7a07ad0b9326a27',1,'SdFatConfig.h']]], - ['has_5funused_5fstack_1005',['HAS_UNUSED_STACK',['../_free_stack_8h.html#acd5a8222ee7af79faab74b1df412d600',1,'FreeStack.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.html deleted file mode 100644 index 14637be6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.js deleted file mode 100644 index 752b7332..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_5.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['include_5fsdios_1006',['INCLUDE_SDIOS',['../_sd_fat_config_8h.html#a7cc6c9647297d65f8e823de70740630b',1,'SdFatConfig.h']]], - ['isdigit_1007',['isDigit',['../_print_templates_8h.html#ab82ae47ddc52e7a1a9400cc3c42a9de7',1,'PrintTemplates.h']]], - ['isdirseparator_1008',['isDirSeparator',['../_ex_fat_file_8h.html#a9f85580ad6f1dfc86fff09a58ff0a1c0',1,'isDirSeparator(): ExFatFile.h'],['../_fat_file_8h.html#a9f85580ad6f1dfc86fff09a58ff0a1c0',1,'isDirSeparator(): FatFile.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.html deleted file mode 100644 index ad0d34c9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.js deleted file mode 100644 index 1551fab9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['maintain_5ffree_5fcluster_5fcount_1009',['MAINTAIN_FREE_CLUSTER_COUNT',['../_sd_fat_config_8h.html#ac2865dac8fdbb4fff47105db32ddf05b',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.html deleted file mode 100644 index 4e8e63d2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.js deleted file mode 100644 index 8d776a9c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['null_1010',['NULL',['../_stdio_stream_8h.html#a070d2ce7b6bb7e5c05602aa8c308d0c4',1,'StdioStream.h']]], - ['nullptr_1011',['nullptr',['../_sys_call_8h.html#ab979d9d4b4923f7c54d6caa6e1a61936',1,'SysCall.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.html deleted file mode 100644 index c737d1c7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.js deleted file mode 100644 index d747e8db..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_8.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['pgm_5fread_5fbyte_1012',['pgm_read_byte',['../_fat_file_8h.html#a48c60b057902adf805797f183286728d',1,'FatFile.h']]], - ['pgm_5fread_5fword_1013',['pgm_read_word',['../_fat_file_8h.html#a910fb5f01313d339d3b835d45e1e5ad0',1,'FatFile.h']]], - ['printf_5fuse_5ffloat_1014',['PRINTF_USE_FLOAT',['../_print_templates_8h.html#a26baac10baccbe6d4f13f98981dd202a',1,'PrintTemplates.h']]], - ['progmem_1015',['PROGMEM',['../_fat_file_8h.html#a75acaba9e781937468d0911423bc0c35',1,'FatFile.h']]], - ['pstr_1016',['PSTR',['../_fat_file_8h.html#a9c00057fd19e916cc1aa0a5949336beb',1,'FatFile.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.html deleted file mode 100644 index dcd8c1cd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.js deleted file mode 100644 index cc6cf53b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_9.js +++ /dev/null @@ -1,22 +0,0 @@ -var searchData= -[ - ['sd_5fchip_5fselect_5fmode_1017',['SD_CHIP_SELECT_MODE',['../_sd_fat_config_8h.html#ab81c0135853c34b24c8314849950f6ab',1,'SdFatConfig.h']]], - ['sd_5ffat_5fversion_1018',['SD_FAT_VERSION',['../_sd_fat_8h.html#aca25ecce379f446043bdee2c55304210',1,'SdFat.h']]], - ['sd_5fhas_5fcustom_5fspi_1019',['SD_HAS_CUSTOM_SPI',['../_sd_fat_config_8h.html#a838861a01379e94361148d22e62b1977',1,'SdFatConfig.h']]], - ['sd_5fmax_5finit_5frate_5fkhz_1020',['SD_MAX_INIT_RATE_KHZ',['../_sd_fat_config_8h.html#adb969469c422c2da5438963623bdfbd3',1,'SdFatConfig.h']]], - ['sd_5fsck_5fhz_1021',['SD_SCK_HZ',['../_sd_spi_driver_8h.html#a7509778808cb232d96b7c45ad76034b0',1,'SdSpiDriver.h']]], - ['sd_5fsck_5fmhz_1022',['SD_SCK_MHZ',['../_sd_spi_driver_8h.html#af9d0d377262ffe2bf47d8604381a5ec1',1,'SdSpiDriver.h']]], - ['sdfat_5ffile_5ftype_1023',['SDFAT_FILE_TYPE',['../_sd_fat_config_8h.html#acdbec9ae1f12e4154878ac10672103fb',1,'SdFatConfig.h']]], - ['seek_5fcur_1024',['SEEK_CUR',['../_stdio_stream_8h.html#a4c8d0b76b470ba65a43ca46a88320f39',1,'StdioStream.h']]], - ['seek_5fend_1025',['SEEK_END',['../_stdio_stream_8h.html#ad2a2e6c114780c3071efd24f16c7f7d8',1,'StdioStream.h']]], - ['seek_5fset_1026',['SEEK_SET',['../_stdio_stream_8h.html#a0d112bae8fd35be772185b6ec6bcbe64',1,'StdioStream.h']]], - ['shared_5fspi_1027',['SHARED_SPI',['../_sd_spi_driver_8h.html#a5601868235dd7041b2e6e0be9445fe5d',1,'SdSpiDriver.h']]], - ['spi_5fdiv3_5fspeed_1028',['SPI_DIV3_SPEED',['../_sd_spi_driver_8h.html#a2d3c9c75ba6bea3fbcb82c2d0fbc21bb',1,'SdSpiDriver.h']]], - ['spi_5fdiv6_5fspeed_1029',['SPI_DIV6_SPEED',['../_sd_spi_driver_8h.html#acbca47c0a33eec35109cea773bb65ee0',1,'SdSpiDriver.h']]], - ['spi_5fdriver_5fselect_1030',['SPI_DRIVER_SELECT',['../_sd_fat_config_8h.html#a6761799c8dffafbf5b7dd914772be28c',1,'SdFatConfig.h']]], - ['spi_5feighth_5fspeed_1031',['SPI_EIGHTH_SPEED',['../_sd_spi_driver_8h.html#a4818fb924fd75160a3fcd5d14abdc375',1,'SdSpiDriver.h']]], - ['spi_5ffull_5fspeed_1032',['SPI_FULL_SPEED',['../_sd_spi_driver_8h.html#a785afdf191e080f93703ad0a6f8f3d3b',1,'SdSpiDriver.h']]], - ['spi_5fhalf_5fspeed_1033',['SPI_HALF_SPEED',['../_sd_spi_driver_8h.html#af7493f43efa1c1be2b718bd3cc759d0e',1,'SdSpiDriver.h']]], - ['spi_5fquarter_5fspeed_1034',['SPI_QUARTER_SPEED',['../_sd_spi_driver_8h.html#a3bfd4f8b788952234111778be51087ae',1,'SdSpiDriver.h']]], - ['spi_5fsixteenth_5fspeed_1035',['SPI_SIXTEENTH_SPEED',['../_sd_spi_driver_8h.html#a6d3bbc68aed8dc3948669d0d40f4eb11',1,'SdSpiDriver.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.html deleted file mode 100644 index e11f42d4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.js deleted file mode 100644 index 6a7e89c8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_a.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['use_5fblock_5fdevice_5finterface_1036',['USE_BLOCK_DEVICE_INTERFACE',['../_sd_fat_config_8h.html#ae92cc0fb2a31925cfc5694feb048dca2',1,'SdFatConfig.h']]], - ['use_5fexfat_5fbitmap_5fcache_1037',['USE_EXFAT_BITMAP_CACHE',['../_sd_fat_config_8h.html#a8d3fca2607182c1ba389dd61c283a3e2',1,'SdFatConfig.h']]], - ['use_5ffat_5ffile_5fflag_5fcontiguous_1038',['USE_FAT_FILE_FLAG_CONTIGUOUS',['../_sd_fat_config_8h.html#ad42a354208ecb245adfc238266a612e5',1,'SdFatConfig.h']]], - ['use_5ffcntl_5fh_1039',['USE_FCNTL_H',['../_sd_fat_config_8h.html#ab4b7255422e65730612f1f6af1a26752',1,'SdFatConfig.h']]], - ['use_5flong_5ffile_5fnames_1040',['USE_LONG_FILE_NAMES',['../_sd_fat_config_8h.html#a2536b194b3b007604a39e8526e108b52',1,'SdFatConfig.h']]], - ['use_5fmulti_5fsector_5fio_1041',['USE_MULTI_SECTOR_IO',['../_sd_fat_config_8h.html#ae477a983188d4370faff32b07a5cfacb',1,'SdFatConfig.h']]], - ['use_5fsd_5fcrc_1042',['USE_SD_CRC',['../_sd_fat_config_8h.html#af2e76ffb2fdb830175abf513dd640fdd',1,'SdFatConfig.h']]], - ['use_5fseparate_5ffat_5fcache_1043',['USE_SEPARATE_FAT_CACHE',['../_sd_fat_config_8h.html#a23f662882413dcb017ebd8107473b8c3',1,'SdFatConfig.h']]], - ['use_5fsimple_5flittle_5fendian_1044',['USE_SIMPLE_LITTLE_ENDIAN',['../_sd_fat_config_8h.html#a9d4fac424e31b4383a10211f0489d93b',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.html deleted file mode 100644 index ad79b9de..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.js deleted file mode 100644 index e3599b73..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/defines_b.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['wdt_5fyield_5ftime_5fmillis_1045',['WDT_YIELD_TIME_MILLIS',['../_sd_fat_config_8h.html#a03b3cad4ee9ca6915330f41b2924bca1',1,'SdFatConfig.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.html deleted file mode 100644 index ae7a8844..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.js deleted file mode 100644 index a0b6ed00..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enums_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['seekdir_981',['seekdir',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191e',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.html deleted file mode 100644 index 1c0bbf93..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.js deleted file mode 100644 index 696625bd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['beg_982',['beg',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191ea6639b4dd9e9b57ffef4a176cd1a1e7bb',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.html deleted file mode 100644 index 070fd0b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.js deleted file mode 100644 index 97e5834c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['cur_983',['cur',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191ea53910041525b9e2f33bfc3bb4482134c',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.html deleted file mode 100644 index 25e9a370..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.js deleted file mode 100644 index 1b49f61d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/enumvalues_2.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['end_984',['end',['../classios__base.html#ab01103ba35f6ba93a704b3ec0c86191eaae47c0ae984e90b38907783a1a804811',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.html deleted file mode 100644 index de151d53..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.js deleted file mode 100644 index 443dc8b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['arduinostream_2eh_569',['ArduinoStream.h',['../_arduino_stream_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.html deleted file mode 100644 index 73e2c8bc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.js deleted file mode 100644 index 055bacd2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_1.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['blockdeviceinterface_2eh_570',['BlockDeviceInterface.h',['../_block_device_interface_8h.html',1,'']]], - ['bufferedprint_2eh_571',['BufferedPrint.h',['../_buffered_print_8h.html',1,'']]], - ['bufstream_2eh_572',['bufstream.h',['../bufstream_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.html deleted file mode 100644 index 24cb5419..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.js deleted file mode 100644 index 7a001d4e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['exfatfile_2eh_573',['ExFatFile.h',['../_ex_fat_file_8h.html',1,'']]], - ['exfatpartition_2eh_574',['ExFatPartition.h',['../_ex_fat_partition_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.html deleted file mode 100644 index ef0b0ff7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.js deleted file mode 100644 index 0f5871c3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_3.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['fatfile_2eh_575',['FatFile.h',['../_fat_file_8h.html',1,'']]], - ['fatlibconfig_2eh_576',['FatLibConfig.h',['../_fat_lib_config_8h.html',1,'']]], - ['fatpartition_2eh_577',['FatPartition.h',['../_fat_partition_8h.html',1,'']]], - ['fatvolume_2eh_578',['FatVolume.h',['../_fat_volume_8h.html',1,'']]], - ['freestack_2eh_579',['FreeStack.h',['../_free_stack_8h.html',1,'']]], - ['fsfile_2eh_580',['FsFile.h',['../_fs_file_8h.html',1,'']]], - ['fslib_2eh_581',['FsLib.h',['../_fs_lib_8h.html',1,'']]], - ['fstream_2eh_582',['fstream.h',['../fstream_8h.html',1,'']]], - ['fsvolume_2eh_583',['FsVolume.h',['../_fs_volume_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.html deleted file mode 100644 index 324abe4f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.js deleted file mode 100644 index 7985a61d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_4.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['ios_2eh_584',['ios.h',['../ios_8h.html',1,'']]], - ['iostream_2eh_585',['iostream.h',['../iostream_8h.html',1,'']]], - ['istream_2eh_586',['istream.h',['../istream_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.html deleted file mode 100644 index 7d688167..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.js deleted file mode 100644 index be1cc990..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['minimumserial_2eh_587',['MinimumSerial.h',['../_minimum_serial_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.html deleted file mode 100644 index cc06fb25..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.js deleted file mode 100644 index f218425b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_6.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['ostream_2eh_588',['ostream.h',['../ostream_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.html deleted file mode 100644 index 10c2046e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.js deleted file mode 100644 index ccc95901..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['printtemplates_2eh_589',['PrintTemplates.h',['../_print_templates_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.html deleted file mode 100644 index 6ee57c51..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.js deleted file mode 100644 index a3c0b353..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/files_8.js +++ /dev/null @@ -1,14 +0,0 @@ -var searchData= -[ - ['sdfat_2eh_590',['SdFat.h',['../_sd_fat_8h.html',1,'']]], - ['sdfatconfig_2eh_591',['SdFatConfig.h',['../_sd_fat_config_8h.html',1,'']]], - ['sdios_2eh_592',['sdios.h',['../sdios_8h.html',1,'']]], - ['sdspiarduinodriver_2eh_593',['SdSpiArduinoDriver.h',['../_sd_spi_arduino_driver_8h.html',1,'']]], - ['sdspibaseclass_2eh_594',['SdSpiBaseClass.h',['../_sd_spi_base_class_8h.html',1,'']]], - ['sdspicard_2eh_595',['SdSpiCard.h',['../_sd_spi_card_8h.html',1,'']]], - ['sdspidriver_2eh_596',['SdSpiDriver.h',['../_sd_spi_driver_8h.html',1,'']]], - ['sdspilibdriver_2eh_597',['SdSpiLibDriver.h',['../_sd_spi_lib_driver_8h.html',1,'']]], - ['sdspisoftdriver_2eh_598',['SdSpiSoftDriver.h',['../_sd_spi_soft_driver_8h.html',1,'']]], - ['stdiostream_2eh_599',['StdioStream.h',['../_stdio_stream_8h.html',1,'']]], - ['syscall_2eh_600',['SysCall.h',['../_sys_call_8h.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.html deleted file mode 100644 index 8a729f78..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.js deleted file mode 100644 index 23e9bb1b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_0.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['activate_601',['activate',['../class_sd_spi_arduino_driver.html#abb6b88c5c8b87fc344a69f23f6eab3d9',1,'SdSpiArduinoDriver::activate()'],['../class_sd_spi_base_class.html#ace7d46253efcaaab8b6be50cc17233e4',1,'SdSpiBaseClass::activate()'],['../class_sd_spi_soft_driver.html#abed1f06be38711517f622f537657c89f',1,'SdSpiSoftDriver::activate()']]], - ['arduinoinstream_602',['ArduinoInStream',['../class_arduino_in_stream.html#a61ee22a5824849ec3261ee2f814dfb93',1,'ArduinoInStream']]], - ['arduinooutstream_603',['ArduinoOutStream',['../class_arduino_out_stream.html#a228b667f9f53dc91c6ed7735d34f04a8',1,'ArduinoOutStream']]], - ['available_604',['available',['../class_minimum_serial.html#a2abe4370989968938b5dc4872d51c3df',1,'MinimumSerial::available()'],['../class_ex_fat_file.html#a1eae02704b69e903ea174c5d0744debb',1,'ExFatFile::available()'],['../class_fat_file.html#a4baea142c9cd53293a93ef3d6a67aa16',1,'FatFile::available()'],['../class_stream_file.html#a0112cc39b64aac6f1ec47741397a7582',1,'StreamFile::available()'],['../class_fs_base_file.html#a5762772ce4e72776c2806af21c1251b8',1,'FsBaseFile::available()']]], - ['available32_605',['available32',['../class_fat_file.html#a651ffa37e7e586fc3c2de8cbbd500ea6',1,'FatFile']]], - ['available64_606',['available64',['../class_ex_fat_file.html#adcf47e15b819fe2d6faac2a027ab30f5',1,'ExFatFile']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.html deleted file mode 100644 index d4929aaf..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.js deleted file mode 100644 index c2ce042a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_1.js +++ /dev/null @@ -1,13 +0,0 @@ -var searchData= -[ - ['bad_607',['bad',['../classios.html#a78be4e3069a644ff36d83a70b080c321',1,'ios']]], - ['begin_608',['begin',['../class_buffered_print.html#a1382e2cedf67d12aa3ba056b0e7b10d3',1,'BufferedPrint::begin()'],['../class_minimum_serial.html#a5c56beb3472bb97f949defeecacda52c',1,'MinimumSerial::begin()'],['../class_sd_base.html#abff5f318cfe072b80119f1938cd591bb',1,'SdBase::begin(SdCsPin_t csPin=SS)'],['../class_sd_base.html#a94081827e77063eacf6fa035143cfde1',1,'SdBase::begin(SdCsPin_t csPin, uint32_t maxSck)'],['../class_sd_base.html#a5748f43d73a4272ec8dc302fb0213556',1,'SdBase::begin(SdSpiConfig spiConfig)'],['../class_sd_base.html#ab6343925e4605897d4a1c39be6705760',1,'SdBase::begin(SdioConfig sdioConfig)'],['../class_ex_fat_volume.html#ade318d2517a1bd3abe56e9e530fdcd78',1,'ExFatVolume::begin()'],['../class_fat_volume.html#af3a219ea89bbbf310a61115c9a3d221a',1,'FatVolume::begin()'],['../class_sdio_card.html#afbb5ab075dfd16ceebfcba5a20e70434',1,'SdioCard::begin()'],['../class_sd_spi_card.html#a6c256f8dcfa7f9d1fac165eed942ab73',1,'SdSpiCard::begin()'],['../class_sd_spi_arduino_driver.html#ae837a6d51bfe5518cb4744581824db88',1,'SdSpiArduinoDriver::begin()'],['../class_sd_spi_base_class.html#ad0cef6e2a3d21e438a2b7f428a218c03',1,'SdSpiBaseClass::begin()'],['../class_sd_spi_soft_driver.html#acb6b99f42e9a1b3a66adf520291dd647',1,'SdSpiSoftDriver::begin()=0'],['../class_sd_spi_soft_driver.html#af122eab393d7336ae3a86d80ebd62627',1,'SdSpiSoftDriver::begin(SdSpiConfig spiConfig)'],['../class_soft_spi_driver.html#a10552c46ff7d74df7b90081547357a13',1,'SoftSpiDriver::begin()'],['../class_fs_volume.html#ae587e7c114b0af86ec0b2927300133b0',1,'FsVolume::begin()']]], - ['boolalpha_609',['boolalpha',['../ios_8h.html#a0016daaaf730481e2ad36972fa7abb17',1,'ios.h']]], - ['buf_610',['buf',['../classobufstream.html#a4f699181bd3727f4288f4f95a5ce207f',1,'obufstream']]], - ['buffer_611',['buffer',['../class_fat_cache.html#a50b61cdeeff5c5dfd2a4bd7430ef19ac',1,'FatCache']]], - ['bufferedprint_612',['BufferedPrint',['../class_buffered_print.html#af879eab3e69cfd9d15768451e091c6a2',1,'BufferedPrint']]], - ['bytespercluster_613',['bytesPerCluster',['../class_ex_fat_partition.html#ac2b5adafda0a9b52ffedf964e355da31',1,'ExFatPartition::bytesPerCluster()'],['../class_fat_partition.html#a1c3ab374b425c27bb6b6ddd55752c056',1,'FatPartition::bytesPerCluster()'],['../class_fs_volume.html#a770e0dca5ed7f8d3ca63768da38042cb',1,'FsVolume::bytesPerCluster()']]], - ['bytesperclustershift_614',['bytesPerClusterShift',['../class_ex_fat_partition.html#aedaebff39e7cbae66f226e9c7593b5b6',1,'ExFatPartition::bytesPerClusterShift()'],['../class_fat_partition.html#aaf43a09e71689c257f4b189ee307db4f',1,'FatPartition::bytesPerClusterShift()']]], - ['bytespersector_615',['bytesPerSector',['../class_ex_fat_partition.html#a3859310dde1f70daaca0ebcf274cb558',1,'ExFatPartition::bytesPerSector()'],['../class_fat_partition.html#a1eba03c763bab44263735488435731f8',1,'FatPartition::bytesPerSector()']]], - ['bytespersectorshift_616',['bytesPerSectorShift',['../class_ex_fat_partition.html#a226e452b6ae5c6846059e4acd21be1f1',1,'ExFatPartition::bytesPerSectorShift()'],['../class_fat_partition.html#a4e513ab3fcfb95583092793116aa4df5',1,'FatPartition::bytesPerSectorShift()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.html deleted file mode 100644 index 839ba330..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.js deleted file mode 100644 index 49f81628..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_10.js +++ /dev/null @@ -1,43 +0,0 @@ -var searchData= -[ - ['sdcsinit_821',['sdCsInit',['../_sd_spi_driver_8h.html#ad4854101780daaa378827ecb62ef86d9',1,'SdSpiChipSelect.cpp']]], - ['sdcswrite_822',['sdCsWrite',['../_sd_spi_driver_8h.html#ac469bbe2d31ffde9b00ffc68258d7428',1,'SdSpiChipSelect.cpp']]], - ['sderrorcode_823',['sdErrorCode',['../class_sd_base.html#af2bb8fea732f9272a2e98772fbcc4595',1,'SdBase']]], - ['sderrordata_824',['sdErrorData',['../class_sd_base.html#a5f8f363b6c23f1d8bfeb858c946f1994',1,'SdBase']]], - ['sdfile_825',['SdFile',['../class_sd_file.html#ad05be3a1fb635448d15a154424b6c33f',1,'SdFile']]], - ['sdioconfig_826',['SdioConfig',['../class_sdio_config.html#a1eaa863465cec6f67210b4888532b3dd',1,'SdioConfig']]], - ['sdspicard_827',['SdSpiCard',['../class_sd_spi_card.html#a0441c5da53bd3bd72fb833fc940f25e8',1,'SdSpiCard']]], - ['sdspiconfig_828',['SdSpiConfig',['../class_sd_spi_config.html#a3c68a4b6ddc549abfb62fa662b59ef10',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t *port)'],['../class_sd_spi_config.html#adb0a2a3d7dc801305fef5167d538abe1',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed)'],['../class_sd_spi_config.html#a30087e90e8c4043aed90693c3be5855b',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs, uint8_t opt)'],['../class_sd_spi_config.html#a038e3578396f4682f1b8cd0b934f42f1',1,'SdSpiConfig::SdSpiConfig(SdCsPin_t cs)']]], - ['sector_829',['sector',['../class_fs_cache.html#a5b90e145400de8687d9f34536b134130',1,'FsCache::sector()'],['../class_fat_cache.html#a1a9d892b5a68463598bb39d2732cb664',1,'FatCache::sector()']]], - ['sectorcount_830',['sectorCount',['../class_block_device_interface.html#a1531ba16d499510ae60be288112faae1',1,'BlockDeviceInterface::sectorCount()'],['../class_sd_card_interface.html#a1a8c37709b578bffc556240f6f03a8da',1,'SdCardInterface::sectorCount()'],['../class_sdio_card.html#a49a502cf7b59dc559a6c75a3285e6c1a',1,'SdioCard::sectorCount()'],['../class_sd_spi_card.html#a463ee796cf57c7e3e93f7817895fc492',1,'SdSpiCard::sectorCount()']]], - ['sectormask_831',['sectorMask',['../class_fat_partition.html#a6b970fa2e06de1a826b09e251dc3119b',1,'FatPartition']]], - ['sectorspercluster_832',['sectorsPerCluster',['../class_ex_fat_partition.html#a12798377b4d3cb16891607c543d0bded',1,'ExFatPartition::sectorsPerCluster()'],['../class_fat_partition.html#a836546c368e6ffe117e6ab8775d23eba',1,'FatPartition::sectorsPerCluster()'],['../class_fs_volume.html#acf62acd37d3f59dedd3e34b3e7d64da0',1,'FsVolume::sectorsPerCluster()']]], - ['sectorsperclustershift_833',['sectorsPerClusterShift',['../class_ex_fat_partition.html#aa4ff8402ba78a2de52ed61175a044ee3',1,'ExFatPartition::sectorsPerClusterShift()'],['../class_fat_partition.html#a593a27482ff8d993542d6f82bd92e26c',1,'FatPartition::sectorsPerClusterShift()']]], - ['sectorsperfat_834',['sectorsPerFat',['../class_fat_partition.html#a1f5c7599333dbe152a3cdd60623ce6d1',1,'FatPartition']]], - ['seek_835',['seek',['../class_stream_file.html#a773ee6f661fc689a5187f51cb5498086',1,'StreamFile::seek()'],['../class_fs_base_file.html#ae86486f4e20f4924797124f9c6042bfd',1,'FsBaseFile::seek()']]], - ['seekcur_836',['seekCur',['../class_ex_fat_file.html#ab42494880cf229adfb0fc8edb0647686',1,'ExFatFile::seekCur()'],['../class_fat_file.html#a5812037ea30777cc350698ad26f2c73f',1,'FatFile::seekCur()'],['../class_fs_base_file.html#a5fa242a4598eab5caa6efd4bdf62f5c0',1,'FsBaseFile::seekCur()']]], - ['seekend_837',['seekEnd',['../class_ex_fat_file.html#a2994a71751ed4f137f48b2e9a7d94091',1,'ExFatFile::seekEnd()'],['../class_fat_file.html#a84f677f4e75ef6fa2eb632f4cdf6b486',1,'FatFile::seekEnd()'],['../class_fs_base_file.html#ade9f9a9ac4d3e0a392a6cc45c9551767',1,'FsBaseFile::seekEnd()']]], - ['seekg_838',['seekg',['../classistream.html#a52d637b1aeca9946085a4a72e0208aec',1,'istream::seekg(pos_type pos)'],['../classistream.html#a60dd48a3b374fb9cbdc59e1f930dea95',1,'istream::seekg(off_type off, seekdir way)']]], - ['seekp_839',['seekp',['../classostream.html#a18b453d2770a8852c312cbda919c4687',1,'ostream::seekp(pos_type pos)'],['../classostream.html#af6265a5be29237517b30673667ba4213',1,'ostream::seekp(off_type off, seekdir way)']]], - ['seekset_840',['seekSet',['../class_ex_fat_file.html#a9834c4da2f14c66f4bda26938ebb36f6',1,'ExFatFile::seekSet()'],['../class_fat_file.html#ab067190d25733ed7e697d9890f61fd7a',1,'FatFile::seekSet()'],['../class_fs_base_file.html#a460f7598c903b8a4b4fe868dacccb6dd',1,'FsBaseFile::seekSet()']]], - ['send_841',['send',['../class_sd_spi_arduino_driver.html#a3c4842e47f98fe5d3799cd6028778ab5',1,'SdSpiArduinoDriver::send(uint8_t data)'],['../class_sd_spi_arduino_driver.html#a0516f7cd20263f90f83c57c4c6ce14e4',1,'SdSpiArduinoDriver::send(const uint8_t *buf, size_t count)'],['../class_sd_spi_base_class.html#a28001200e3d464f5c6e910837924c577',1,'SdSpiBaseClass::send(uint8_t data)=0'],['../class_sd_spi_base_class.html#a51923b03f35af4bac7c3bb7c8d13303d',1,'SdSpiBaseClass::send(const uint8_t *buf, size_t count)=0'],['../class_sd_spi_soft_driver.html#a89eff51e8313d9b27c3641cd8310d022',1,'SdSpiSoftDriver::send(uint8_t data)=0'],['../class_sd_spi_soft_driver.html#a5607c2b3773e25404880a93e5e7a23a1',1,'SdSpiSoftDriver::send(const uint8_t *buf, size_t count)'],['../class_soft_spi_driver.html#ae465952c49043991ec808c2f1eca8e9c',1,'SoftSpiDriver::send()']]], - ['setcallback_842',['setCallback',['../namespace_fs_date_time.html#afae6e23c2ed7d8194023d19d87fb1b62',1,'FsDateTime::setCallback(void(*dateTime)(uint16_t *date, uint16_t *time))'],['../namespace_fs_date_time.html#aa48bd625d32aae8fcfe67aba1d080be3',1,'FsDateTime::setCallback(void(*dateTime)(uint16_t *date, uint16_t *time, uint8_t *ms10))']]], - ['setf_843',['setf',['../classios__base.html#ab5db835cb45bba7684ebf72d9a3cccb4',1,'ios_base::setf(fmtflags fl)'],['../classios__base.html#a74dbc93607ab7d68a87ec326b92b6c81',1,'ios_base::setf(fmtflags fl, fmtflags mask)']]], - ['setfill_844',['setfill',['../structsetfill.html#abcd87f0632678d277df55406d25c8325',1,'setfill']]], - ['setprecision_845',['setprecision',['../structsetprecision.html#a73fce143591989f56ef887a2ea86ac45',1,'setprecision']]], - ['setsckspeed_846',['setSckSpeed',['../class_sd_spi_arduino_driver.html#acf0cc41d2bd80479237aa2799e119973',1,'SdSpiArduinoDriver::setSckSpeed()'],['../class_sd_spi_base_class.html#a937215f1dc238285bd140c11ab82bbc9',1,'SdSpiBaseClass::setSckSpeed()'],['../class_sd_spi_soft_driver.html#a6002aaab8f8a751cbfc3274b17856930',1,'SdSpiSoftDriver::setSckSpeed()']]], - ['setstate_847',['setstate',['../classios.html#aee5d194656bdfb0c8621b23ea2f51afb',1,'ios']]], - ['setw_848',['setw',['../structsetw.html#afd8bfd075474f63df3c8b44ad47517d2',1,'setw']]], - ['showbase_849',['showbase',['../ios_8h.html#a73159e1398939807aeae6015dd86f2f4',1,'ios.h']]], - ['showpoint_850',['showpoint',['../ios_8h.html#a322f5897ace09768cd782f0c8f222770',1,'ios.h']]], - ['showpos_851',['showpos',['../ios_8h.html#a80798554dbfece679adb0e05eb855943',1,'ios.h']]], - ['size_852',['size',['../class_stream_file.html#a5813d451e7f7ba57a04d177caffc5a9f',1,'StreamFile::size()'],['../class_fs_base_file.html#a1c27b009372668a9c2de4a57195b0b36',1,'FsBaseFile::size()']]], - ['skipwhite_853',['skipWhite',['../classistream.html#a0f7468be86d93de5d33fa99095898279',1,'istream']]], - ['skipws_854',['skipws',['../ios_8h.html#a972282e5d9d894f61c8a54423858c0a4',1,'ios.h']]], - ['spistart_855',['spiStart',['../class_sd_spi_card.html#aa39feb6ebb269071ac6843a424ac311c',1,'SdSpiCard']]], - ['spistop_856',['spiStop',['../class_sd_spi_card.html#a1033a4a68d38f52dddf6a1764fcca3e1',1,'SdSpiCard']]], - ['status_857',['status',['../class_sd_card_interface.html#a6315bf0d5852bc24563b7977f7c7e5b4',1,'SdCardInterface::status()'],['../class_sdio_card.html#a58880a055e58410f8b22658b88622f63',1,'SdioCard::status()']]], - ['stdiostream_858',['StdioStream',['../class_stdio_stream.html#a96b2c027e76bfca6d6835c9ae1be2ad2',1,'StdioStream']]], - ['sync_859',['sync',['../class_buffered_print.html#a2253d1e7f231b94b18eab1281c123a49',1,'BufferedPrint::sync()'],['../class_ex_fat_file.html#a2cb3638069afd2d01b79e5dff1a66f55',1,'ExFatFile::sync()'],['../class_fs_cache.html#a5a2c8fb432d7b7590ebb43200ca21893',1,'FsCache::sync()'],['../class_fat_file.html#a67f3dc4896c542d695e11aac927f585e',1,'FatFile::sync()'],['../class_fat_cache.html#a4d76d4f46ce5994f6fc4678a7b4f8cf1',1,'FatCache::sync()'],['../class_fs_base_file.html#acf2d9261c5c1b1b022a0414cdfe0a17b',1,'FsBaseFile::sync()']]], - ['syncdevice_860',['syncDevice',['../class_block_device_interface.html#a23e30999f1cc03da99e285cf180dbbb7',1,'BlockDeviceInterface::syncDevice()'],['../class_sdio_card.html#a1201ec7a6fa91b73a1daa584a1b055f7',1,'SdioCard::syncDevice()'],['../class_sd_spi_card.html#ac9f3bfbfc5029f93da1fa233cbe617c4',1,'SdSpiCard::syncDevice()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.html deleted file mode 100644 index 9d548c4f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.js deleted file mode 100644 index 765ad36a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_11.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['tellg_861',['tellg',['../classistream.html#a18332bdcb7fbe33ca06045c786cac4c3',1,'istream']]], - ['tellp_862',['tellp',['../classostream.html#a92dec0e2bc8352df1419d1cdc434e619',1,'ostream']]], - ['timestamp_863',['timestamp',['../class_ex_fat_file.html#a6d3ab10983e206401ebd5c24a1c46174',1,'ExFatFile::timestamp()'],['../class_fat_file.html#a56dabdf73833b7e961c4530eb8e16d23',1,'FatFile::timestamp()'],['../class_fs_base_file.html#acea65e639feebaac01964af02a77d324',1,'FsBaseFile::timestamp()']]], - ['truncate_864',['truncate',['../class_ex_fat_file.html#aca37955d3c7cce40f7f9e1ea078e5636',1,'ExFatFile::truncate()'],['../class_ex_fat_file.html#a6262b0d6d43d2a426953a0a7d90f624f',1,'ExFatFile::truncate(uint64_t length)'],['../class_ex_fat_volume.html#ae5cbcdd7907a882b4686cb3ba7e85bcc',1,'ExFatVolume::truncate(const ExChar_t *path, uint64_t length)'],['../class_ex_fat_volume.html#ae6d409b7f24593dca7aae70513e18b70',1,'ExFatVolume::truncate(const String &path, uint64_t length)'],['../class_fat_file.html#a7dda881dac19ea2aa9b2e85a229a98d7',1,'FatFile::truncate()'],['../class_fat_file.html#aa6e663098a578635d37d92e82d18d616',1,'FatFile::truncate(uint32_t length)'],['../class_fat_volume.html#a86a08bf789e33567418465b9b12751e2',1,'FatVolume::truncate(const char *path, uint32_t length)'],['../class_fat_volume.html#a97ef39ec02c38c0772f0029d42edcb46',1,'FatVolume::truncate(const String &path, uint32_t length)'],['../class_fs_base_file.html#a2a0bf00241df08a604f054512746986b',1,'FsBaseFile::truncate()'],['../class_fs_base_file.html#a47247cc54157ef79e0752f55ba01cf7e',1,'FsBaseFile::truncate(uint64_t length)']]], - ['type_865',['type',['../class_sd_card_interface.html#a80796bc06b4090c15b3d46e651dd38c8',1,'SdCardInterface::type()'],['../class_sdio_card.html#a22451464dba5275838908c2d19392850',1,'SdioCard::type()'],['../class_sd_spi_card.html#ac53e0f3575db5be26dcba825bab3ca12',1,'SdSpiCard::type()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.html deleted file mode 100644 index 16f6ecce..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.js deleted file mode 100644 index 4d045b07..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_12.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['ungetc_866',['ungetc',['../class_stdio_stream.html#ac00e0dd906c2e857ece53794c6c92786',1,'StdioStream']]], - ['unsetf_867',['unsetf',['../classios__base.html#a3bf7d054a433ed15e8b984e16f630fa4',1,'ios_base']]], - ['unusedstack_868',['UnusedStack',['../_free_stack_8h.html#a0a6400cf785c9647c0bacb76b15851de',1,'FreeStack.cpp']]], - ['uppercase_869',['uppercase',['../ios_8h.html#af5d5e1a0effa1b500bb882feed5a2061',1,'ios.h']]], - ['usedma_870',['useDma',['../class_sdio_config.html#a07ddb8b18bf24fa61fdd289a112e79a8',1,'SdioConfig']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.html deleted file mode 100644 index a552a4f2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.js deleted file mode 100644 index d64d96c5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_13.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['validlength_871',['validLength',['../class_ex_fat_file.html#afc8af11ba8e3a830dff1dd5e59446243',1,'ExFatFile']]], - ['vfprintf_872',['vfprintf',['../_print_templates_8h.html#aa3bc14da82a850b0f8ce848a6d54045f',1,'PrintTemplates.h']]], - ['vmprintf_873',['vmprintf',['../_print_templates_8h.html#ad139f8bf9b6ead8bd28abf1dd412a8a4',1,'PrintTemplates.h']]], - ['vol_874',['vol',['../class_sd_base.html#a20ed1868a6498cd336364c22d1df28a5',1,'SdBase']]], - ['volumebegin_875',['volumeBegin',['../class_sd_base.html#a1f1de2aac5384475b67506f86199e4c8',1,'SdBase']]], - ['volumesectorcount_876',['volumeSectorCount',['../class_fat_partition.html#a916ba7d67711bb62daf12ecd47ca4b8e',1,'FatPartition']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.html deleted file mode 100644 index 97f0dcb8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.js deleted file mode 100644 index d72179df..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_14.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['width_877',['width',['../classios__base.html#afa30e7644b4eae5928ad9c487ad387de',1,'ios_base::width()'],['../classios__base.html#ab2ba0f005bbf3d8ebed93b64068492e0',1,'ios_base::width(unsigned n)']]], - ['write_878',['write',['../class_buffered_print.html#ab41de6eca77a04a49a6fc965b1950fc5',1,'BufferedPrint::write()'],['../class_minimum_serial.html#a0ca1d9631fe5f2f00878bd481dbbd3aa',1,'MinimumSerial::write()'],['../class_ex_fat_file.html#a6fb2905a5e363554a5118b5d1322cd87',1,'ExFatFile::write(const char *str)'],['../class_ex_fat_file.html#afd011d17d66707623c28927a63f81015',1,'ExFatFile::write(uint8_t b)'],['../class_ex_fat_file.html#abc1423c7b550614d1067e7173f8b46a8',1,'ExFatFile::write(const void *buf, size_t count)'],['../class_fat_file.html#a081dd810835f1ebf8c23ffe92706b485',1,'FatFile::write(const char *str)'],['../class_fat_file.html#ae51e724ac6cc3d67d64a5a666d5850f1',1,'FatFile::write(uint8_t b)'],['../class_fat_file.html#a5d84d871ac904a22aa48308713d14682',1,'FatFile::write(const void *buf, size_t count)'],['../class_print_file.html#a52f78f160083b416d66e23c680e0577d',1,'PrintFile::write()'],['../class_stream_file.html#a0695220134825199b39dee82f18ab1ec',1,'StreamFile::write(uint8_t b)'],['../class_stream_file.html#a0ace3aaaf6d0fb673a43059c0664fab6',1,'StreamFile::write(const uint8_t *buffer, size_t size)'],['../class_fs_base_file.html#a023c0392aa72b32652546f48ef8ba1e5',1,'FsBaseFile::write(uint8_t b)'],['../class_fs_base_file.html#aa763e83fea4889828effc3308f13113a',1,'FsBaseFile::write(const void *buf, size_t count)']]], - ['writedata_879',['writeData',['../class_sd_card_interface.html#ad12a0053d3e832da694bd8d3d66adbc1',1,'SdCardInterface::writeData()'],['../class_sdio_card.html#a8467e7ffafa45ff930b38a6f18e9547a',1,'SdioCard::writeData()'],['../class_sd_spi_card.html#a9495c0b148eb380358bb4a9721c0dffa',1,'SdSpiCard::writeData()']]], - ['writesector_880',['writeSector',['../class_block_device_interface.html#a8a4be0a85c3771c705617fad98303e49',1,'BlockDeviceInterface::writeSector()'],['../class_sdio_card.html#a74919a168bac68028ce62222500cf238',1,'SdioCard::writeSector()'],['../class_sd_spi_card.html#a9a230924d82c5df07df592c571bc3fa5',1,'SdSpiCard::writeSector()']]], - ['writesectors_881',['writeSectors',['../class_block_device_interface.html#a5cb063692a65f092ccdfd14f8700b58a',1,'BlockDeviceInterface::writeSectors()'],['../class_sdio_card.html#a55e2fc82ef9ecf7272a94b565c50303b',1,'SdioCard::writeSectors()'],['../class_sd_spi_card.html#a4165166d5d038c8f1c00c5a04e9f8a63',1,'SdSpiCard::writeSectors()']]], - ['writesingle_882',['writeSingle',['../class_sd_spi_card.html#a3172d671447410f19447b78b856a9689',1,'SdSpiCard']]], - ['writestart_883',['writeStart',['../class_sd_card_interface.html#abf04f87ec5c49fe6d9e23c8ac4cf482d',1,'SdCardInterface::writeStart()'],['../class_sdio_card.html#a1edd70537e2d7fa556532790cf413b5c',1,'SdioCard::writeStart(uint32_t sector)'],['../class_sdio_card.html#a82fe097fdbae26b3c8f92f215499cdf3',1,'SdioCard::writeStart(uint32_t sector, uint32_t count)'],['../class_sd_spi_card.html#ae46068850a0cb9f142d5b0b0147716fa',1,'SdSpiCard::writeStart(uint32_t sector)'],['../class_sd_spi_card.html#a785250ef0281fbb1cbe5078de9e80be3',1,'SdSpiCard::writeStart(uint32_t sector, uint32_t eraseCount)']]], - ['writestop_884',['writeStop',['../class_sd_card_interface.html#a2eac04896a05bd57730e96708934970f',1,'SdCardInterface::writeStop()'],['../class_sdio_card.html#acb560c2ea1f30c646b96f02e728b0fe1',1,'SdioCard::writeStop()'],['../class_sd_spi_card.html#aef9154785a4de5560fb807e4f9316fb0',1,'SdSpiCard::writeStop()']]], - ['ws_885',['ws',['../iostream_8h.html#a8adf4c714b8c8f201dedc83ee04556b1',1,'iostream.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.html deleted file mode 100644 index fbd092e6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.js deleted file mode 100644 index 7962967f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_15.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['yield_886',['yield',['../class_sys_call.html#a2219ba5ea8e411b022a3a00df5f380e0',1,'SysCall']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.html deleted file mode 100644 index 07e3fdad..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.js deleted file mode 100644 index f8c579e6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_2.js +++ /dev/null @@ -1,23 +0,0 @@ -var searchData= -[ - ['cachebuffer_617',['cacheBuffer',['../class_fs_cache.html#a1533fdfef219ae4f3d6fb9299f51a1ee',1,'FsCache']]], - ['cacheclear_618',['cacheClear',['../class_ex_fat_partition.html#a63fac808e421ed5c8e72a37616ac56ac',1,'ExFatPartition::cacheClear()'],['../class_fat_partition.html#abf74c1e3c714b396e6271aee304c2448',1,'FatPartition::cacheClear()']]], - ['card_619',['card',['../class_sd_base.html#a1516a55bdab1ee7fe56848808986ae34',1,'SdBase']]], - ['cardbegin_620',['cardBegin',['../class_sd_base.html#a7a5e3b08f6cdd94cfaa19a1b43df6ed9',1,'SdBase::cardBegin(SdSpiConfig spiConfig)'],['../class_sd_base.html#a64cd10a3ce5ee342d0fd31738f385362',1,'SdBase::cardBegin(SdioConfig sdioConfig)']]], - ['chdir_621',['chdir',['../class_ex_fat_volume.html#abdc1addfc9474bf42cab31bcb49b4b65',1,'ExFatVolume::chdir()'],['../class_ex_fat_volume.html#a4e0a0e838088f31b15a36925f21c314c',1,'ExFatVolume::chdir(const ExChar_t *path)'],['../class_ex_fat_volume.html#afb7a1d7e4de9690b2c63cc8cd22ab4b5',1,'ExFatVolume::chdir(const String &path)'],['../class_fat_volume.html#a659d921b3efd52d310a33cba69eff18b',1,'FatVolume::chdir()'],['../class_fat_volume.html#ac0f6cf6ece2285af777c1fdf5cf8c219',1,'FatVolume::chdir(const char *path)'],['../class_fat_volume.html#ac591520e33ff8ba51e80782a87423872',1,'FatVolume::chdir(const String &path)'],['../class_fs_volume.html#abcc645df09441d40c476e4981393c944',1,'FsVolume::chdir()'],['../class_fs_volume.html#ac4f62724d5eeaec3582594bb3b4c3e65',1,'FsVolume::chdir(const char *path)'],['../class_fs_volume.html#a6c0758acb32b59c1861cc143612765d2',1,'FsVolume::chdir(const String &path)']]], - ['chvol_622',['chvol',['../class_ex_fat_volume.html#a6bcabab1ded2e71c1272c1baf009c2ab',1,'ExFatVolume::chvol()'],['../class_fat_volume.html#a36fbc19755b066068cac7c4ca578b27b',1,'FatVolume::chvol()'],['../class_fs_volume.html#a34a5bb7a97a081a7d74cf297f1fbee82',1,'FsVolume::chvol()']]], - ['clear_623',['clear',['../class_fs_cache.html#a734ac2e9931f141c9ba9a3ef021a8691',1,'FsCache::clear()'],['../classfstream.html#a682b278a6a299ffb21b8737717ff12bf',1,'fstream::clear()'],['../classofstream.html#a09edfdb3dbda20aff105e751001313f0',1,'ofstream::clear()'],['../classios.html#aa49ed6670d1743e7a373b2d915ec739a',1,'ios::clear()']]], - ['clearcallback_624',['clearCallback',['../namespace_fs_date_time.html#af88a1ebd9c91a474c79a641e716729a0',1,'FsDateTime']]], - ['clearerr_625',['clearerr',['../class_stdio_stream.html#aa737e5680fc2808a03a603ea8559d82b',1,'StdioStream']]], - ['clearerror_626',['clearError',['../class_ex_fat_file.html#ac2004e7bf328b3edda7d4c3acba2726f',1,'ExFatFile::clearError()'],['../class_fat_file.html#a052e2c15a39b322a5307b693b8835b22',1,'FatFile::clearError()']]], - ['clearwriteerror_627',['clearWriteError',['../class_ex_fat_file.html#abc0d3863895c17df53930bdfa84cb06f',1,'ExFatFile::clearWriteError()'],['../class_fat_file.html#aeca2a2eff91e6aa55fe1b0e3860c9a05',1,'FatFile::clearWriteError()'],['../class_fs_base_file.html#a936fc1e3fb13a6ae1352d027bf0a70f7',1,'FsBaseFile::clearWriteError()']]], - ['close_628',['close',['../class_ex_fat_file.html#a7ba9e04099bdf8fd34220ebfdde72867',1,'ExFatFile::close()'],['../class_fat_file.html#afd16af325e0642e4bff6430b7d8bb18b',1,'FatFile::close()'],['../classfstream.html#ac5720ee620c09d63dd186823e688ea9a',1,'fstream::close()'],['../classifstream.html#ac5892f472afdef6160f5fe2401b16dce',1,'ifstream::close()'],['../classofstream.html#a240f3752c7ff7a78d10c143d2083715f',1,'ofstream::close()'],['../class_fs_base_file.html#aa669c695a839e68e417fb15eebe3de13',1,'FsBaseFile::close()']]], - ['clustercount_629',['clusterCount',['../class_ex_fat_partition.html#a17b72f8a437c5663a04473606fd36d58',1,'ExFatPartition::clusterCount()'],['../class_fat_partition.html#aba35645c23735c4833c07bc2b3adcd1f',1,'FatPartition::clusterCount()'],['../class_fs_volume.html#abc9731fa79598460a37f10a2e561f29c',1,'FsVolume::clusterCount()']]], - ['clusterheapstartsector_630',['clusterHeapStartSector',['../class_ex_fat_partition.html#a2f75613844b26a2a574a0ee31005b1a0',1,'ExFatPartition']]], - ['contiguousrange_631',['contiguousRange',['../class_ex_fat_file.html#add39a8c7f7961321ba647e8da8f3d461',1,'ExFatFile::contiguousRange()'],['../class_fat_file.html#a12b3c5a763416ca62c70e3db74033cd0',1,'FatFile::contiguousRange()'],['../class_fs_base_file.html#adff091db3361b34a3f63ffeb495c27c7',1,'FsBaseFile::contiguousRange()']]], - ['createcontiguous_632',['createContiguous',['../class_fat_file.html#a0afc2a1cffa238d1cb2049bfa2d8d199',1,'FatFile::createContiguous(FatFile *dirFile, const char *path, uint32_t size)'],['../class_fat_file.html#a0853fbd44aee2798d14d8e3aed78f8bf',1,'FatFile::createContiguous(const char *path, uint32_t size)']]], - ['curcluster_633',['curCluster',['../class_fat_file.html#a526f3dd56ce205690e45ffc86ef6f891',1,'FatFile']]], - ['curposition_634',['curPosition',['../class_ex_fat_file.html#ab49396aad3f6500aa19f75490dc26719',1,'ExFatFile::curPosition()'],['../class_fat_file.html#a97e0620949f97e9b9c91ed1094d728aa',1,'FatFile::curPosition()'],['../class_fs_base_file.html#a856bccf55a40ebbea27072dcfea06191',1,'FsBaseFile::curPosition()']]], - ['curtimems_635',['curTimeMS',['../class_sys_call.html#aa508a9a3066020fc94765e4099490372',1,'SysCall']]], - ['cwv_636',['cwv',['../class_ex_fat_volume.html#a5b2a874ef0306425bf54c18454771b45',1,'ExFatVolume::cwv()'],['../class_fat_volume.html#a06acd4a434456b6a4644ff79a0bf0a24',1,'FatVolume::cwv()'],['../class_fs_volume.html#ab4fa0f21669b84e00d00fd54c3144a8f',1,'FsVolume::cwv()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.html deleted file mode 100644 index 40bd389e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.js deleted file mode 100644 index 96d5873a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_3.js +++ /dev/null @@ -1,17 +0,0 @@ -var searchData= -[ - ['datalength_637',['dataLength',['../class_ex_fat_file.html#ada4dde9f2eed36bf556fcf1bd3d28ccf',1,'ExFatFile']]], - ['datastartsector_638',['dataStartSector',['../class_fat_partition.html#a7e89ec91780f7dfa060b261c605bf2e5',1,'FatPartition::dataStartSector()'],['../class_fs_volume.html#a79cebeb23cb3cdaa06550475fe24272a',1,'FsVolume::dataStartSector()']]], - ['datetimecallback_639',['dateTimeCallback',['../class_sd_file.html#a2d78e6a8cedbf8ce545af68457b43bf1',1,'SdFile']]], - ['datetimecallbackcancel_640',['dateTimeCallbackCancel',['../class_sd_file.html#ad266770d0a779d1a528a3997aee5142d',1,'SdFile']]], - ['dbgclearstats_641',['dbgClearStats',['../class_sd_spi_card.html#ab6cf8283dee415d9217eb758e75a98ef',1,'SdSpiCard']]], - ['dbgfat_642',['dbgFat',['../class_fat_partition.html#a0af1e91a311180119b4a2c85d7e6e87e',1,'FatPartition']]], - ['dbgprintstats_643',['dbgPrintStats',['../class_sd_spi_card.html#abdb02df511072aefb465a22858d92e06',1,'SdSpiCard']]], - ['deactivate_644',['deactivate',['../class_sd_spi_arduino_driver.html#ae88a255f533e3acb41d1221025a69b55',1,'SdSpiArduinoDriver::deactivate()'],['../class_sd_spi_base_class.html#ae3a5ede781e390263382fcf7765d665d',1,'SdSpiBaseClass::deactivate()'],['../class_sd_spi_soft_driver.html#a05315e4128ae7263d9e68119d6ae4308',1,'SdSpiSoftDriver::deactivate()']]], - ['dec_645',['dec',['../ios_8h.html#ada38ab90e22f0ebb638cb864a35c562d',1,'ios.h']]], - ['direntry_646',['dirEntry',['../class_fat_file.html#a2f4e9ab3056125b07f15d14ca26d5346',1,'FatFile']]], - ['dirindex_647',['dirIndex',['../class_ex_fat_file.html#a5e3baa5d5269c2948cfaf604c42f6a16',1,'ExFatFile::dirIndex()'],['../class_fat_file.html#ae5ec24d4a94d3780384d3f2b731c7eb9',1,'FatFile::dirIndex()'],['../class_fs_base_file.html#ac05660570595552c72164a61001899d5',1,'FsBaseFile::dirIndex()']]], - ['dirsize_648',['dirSize',['../class_fat_file.html#ae2ed15f05c9ccbce355e7a8d3ce8382d',1,'FatFile']]], - ['dirty_649',['dirty',['../class_fs_cache.html#af50f564561a2db190280769d4641147b',1,'FsCache::dirty()'],['../class_fat_cache.html#ab4d3b0c16bb6a116c7d01afff2dcb307',1,'FatCache::dirty()']]], - ['dmpfile_650',['dmpFile',['../class_fat_file.html#a4f01d27954ae49aeb6888ac7302f55d9',1,'FatFile']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.html deleted file mode 100644 index 8a4df4cd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.js deleted file mode 100644 index d64198e7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_4.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['end_651',['end',['../class_sdio_card.html#aef8e287f0e2033d4afe5e7051c293334',1,'SdioCard::end()'],['../class_sd_spi_arduino_driver.html#a7f94ce98855bb3d1781bbad77741e494',1,'SdSpiArduinoDriver::end()'],['../class_fs_volume.html#acd5a0e50a30334785d75a8c8bfc3e1f9',1,'FsVolume::end()']]], - ['endl_652',['endl',['../iostream_8h.html#ab9868f8e151efc1705646437dbb59bb2',1,'iostream.h']]], - ['eof_653',['eof',['../classios.html#a7aa5ea2f670d64eb3dcb3b62eddd576c',1,'ios']]], - ['erase_654',['erase',['../class_sd_card_interface.html#a6a57c5bced670759b7c278c7a5988fd1',1,'SdCardInterface::erase()'],['../class_sdio_card.html#a03b1cdcf988acbdee91bfa8974be50f9',1,'SdioCard::erase()'],['../class_sd_spi_card.html#a904d56312d7a9cfc8bf33e3ad041c9eb',1,'SdSpiCard::erase()']]], - ['erasesinglesectorenable_655',['eraseSingleSectorEnable',['../class_sd_spi_card.html#a1b137a1ab76da21379bc59efeac90e1f',1,'SdSpiCard']]], - ['error_656',['error',['../class_sd_spi_card.html#aa12ad53111abcb187d3c6119a3a77592',1,'SdSpiCard']]], - ['errorcode_657',['errorCode',['../class_sd_card_interface.html#af83618545960af2f1ceec84927c12fc9',1,'SdCardInterface::errorCode()'],['../class_sdio_card.html#a1d505c4fb461bb7103692054ef6f7f1f',1,'SdioCard::errorCode()'],['../class_sd_spi_card.html#ad14f9be4d9087db44309fdc6597c949e',1,'SdSpiCard::errorCode()']]], - ['errordata_658',['errorData',['../class_sd_card_interface.html#ab84d7a9506d49366d8ec105e239ab0e1',1,'SdCardInterface::errorData()'],['../class_sdio_card.html#a9c2da202da95162d2eb694363fbe8654',1,'SdioCard::errorData()'],['../class_sd_spi_card.html#aae2cc2a741646bb2aaabaf0547298de8',1,'SdSpiCard::errorData()']]], - ['errorhalt_659',['errorHalt',['../class_sd_base.html#ac9d239810a48c90bd0f3a3e9c4c606a9',1,'SdBase::errorHalt(print_t *pr)'],['../class_sd_base.html#a1691b7a85fc11851a6942de035d73772',1,'SdBase::errorHalt(print_t *pr, const char *msg)'],['../class_sd_base.html#ac530fe041855d994a53d2e1b9c33f22d',1,'SdBase::errorHalt(print_t *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#a3a0d626662aa29c5b942442d0f6ee0ff',1,'SdBase::errorHalt(const __FlashStringHelper *msg)'],['../class_sd_base.html#a841a42d2ddc34c21dfb208b9a377c777',1,'SdBase::errorHalt()'],['../class_sd_base.html#a65aab6f19ed26777c2b3a149bbed39b5',1,'SdBase::errorHalt(const char *msg)']]], - ['errorline_660',['errorLine',['../class_sdio_card.html#a37e477b39d2a9c874fd338b4f7ef6b0e',1,'SdioCard']]], - ['errorprint_661',['errorPrint',['../class_sd_base.html#a22d184b3266ae7cb31ab47b7203e91ac',1,'SdBase::errorPrint(print_t *pr)'],['../class_sd_base.html#a7d119e8ae896cc4caa073e9f54823f3e',1,'SdBase::errorPrint(print_t *pr, char const *msg)'],['../class_sd_base.html#a6793653198ce4c570ae92d2f9436dca9',1,'SdBase::errorPrint(Print *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#ab4d5db510feb64a9cd487defe5bb62d9',1,'SdBase::errorPrint(const char *msg)'],['../class_sd_base.html#afebeeb8af2027f1c9a0b4f1106be9c2a',1,'SdBase::errorPrint(const __FlashStringHelper *msg)']]], - ['exfatfile_662',['ExFatFile',['../class_ex_fat_file.html#a3c1303c37cad370b33f0279524c93720',1,'ExFatFile']]], - ['exists_663',['exists',['../class_ex_fat_file.html#a22a717ddc6d2004c540c67a14264d9dd',1,'ExFatFile::exists()'],['../class_ex_fat_volume.html#a7fdcdffb720a1cca5cfa73f4cfa281df',1,'ExFatVolume::exists(const ExChar_t *path)'],['../class_ex_fat_volume.html#af705d3a2434d64efebaa5b3615131dc5',1,'ExFatVolume::exists(const String &path)'],['../class_fat_file.html#a50242f98dea0d4488ce4039a279f2a57',1,'FatFile::exists()'],['../class_fat_volume.html#a21541734ad76f64ea24b9f45e2bd6117',1,'FatVolume::exists(const char *path)'],['../class_fat_volume.html#afb7709e5b9e04265467305b43adf7cef',1,'FatVolume::exists(const String &path)'],['../class_fs_base_file.html#a76aea9766ffeae5454381a0704e62505',1,'FsBaseFile::exists()'],['../class_fs_volume.html#a9bece771399c97b136868f684c2b4496',1,'FsVolume::exists(const char *path)'],['../class_fs_volume.html#a5cabbe39ffc114d79ebe4e793024354e',1,'FsVolume::exists(const String &path)']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.html deleted file mode 100644 index 2b983b21..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.js deleted file mode 100644 index 00a228ea..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_5.js +++ /dev/null @@ -1,38 +0,0 @@ -var searchData= -[ - ['fail_664',['fail',['../classios.html#a15269e67d05d4fe83a6cf344d542f8ae',1,'ios']]], - ['fatcount_665',['fatCount',['../class_fat_partition.html#a56b37c3230818b9ae8e0a25c01a370a3',1,'FatPartition']]], - ['fatfile_666',['FatFile',['../class_fat_file.html#a7b591c9b92165fa8e4eae8c30c30e533',1,'FatFile::FatFile()'],['../class_fat_file.html#a38f9a296138648d6135cbbbf41ef6b92',1,'FatFile::FatFile(const char *path, oflag_t oflag)']]], - ['fatlength_667',['fatLength',['../class_ex_fat_partition.html#a12e390567f2217f804af9b1ea397780c',1,'ExFatPartition']]], - ['fatpartition_668',['FatPartition',['../class_fat_partition.html#a2c94db084d89355da7695d82ee612f72',1,'FatPartition']]], - ['fatstartsector_669',['fatStartSector',['../class_ex_fat_partition.html#ab63f9a3aacc0aeccae138a77cccbbb5b',1,'ExFatPartition::fatStartSector()'],['../class_fat_partition.html#a6a1ce7d707cf15bea08b63216413e055',1,'FatPartition::fatStartSector()'],['../class_fs_volume.html#ac5f4de35d2bfdd65bc38c2562b147a26',1,'FsVolume::fatStartSector()']]], - ['fattype_670',['fatType',['../class_ex_fat_partition.html#a3e63d87b4ef985f92c1793d269274f44',1,'ExFatPartition::fatType()'],['../class_fat_partition.html#ad45c276232d7093b82f1075e8c488bac',1,'FatPartition::fatType()'],['../class_fs_volume.html#ad26b5c171ca4c6e953cfbdbfe0b9a988',1,'FsVolume::fatType()']]], - ['fclose_671',['fclose',['../class_stdio_stream.html#a4ddd4658d49182013d2fa2a181e96c5a',1,'StdioStream']]], - ['feof_672',['feof',['../class_stdio_stream.html#acb38c3211feedbf2206eb1d9a3a9d24f',1,'StdioStream']]], - ['ferror_673',['ferror',['../class_stdio_stream.html#afd64cec6440b923660b444f6d5f0586e',1,'StdioStream']]], - ['fflush_674',['fflush',['../class_stdio_stream.html#a7ce32ec7ea3f2fd8ea42b9633890f1c0',1,'StdioStream']]], - ['fgetc_675',['fgetc',['../class_stdio_stream.html#a160bd2828cb7e7370cffe1046eff8899',1,'StdioStream']]], - ['fgetpos_676',['fgetpos',['../class_ex_fat_file.html#a8614bcbf04b7bbfc70fe36d2fa7f70c1',1,'ExFatFile::fgetpos()'],['../class_fat_file.html#a33e0b0a8a342047f29ab8e8aae9cae14',1,'FatFile::fgetpos()'],['../class_fs_base_file.html#adda345ec539688e40e279a4e3020d208',1,'FsBaseFile::fgetpos()']]], - ['fgets_677',['fgets',['../class_ex_fat_file.html#abc69c9dfc8fdb4ebf9db3bc37c879dc6',1,'ExFatFile::fgets()'],['../class_fat_file.html#a9e05a51767f7c8f70c6f337eecbdca03',1,'FatFile::fgets()'],['../class_stdio_stream.html#aa240c1021a1aad1cc57f63a483541dc7',1,'StdioStream::fgets()'],['../class_fs_base_file.html#ab6b6b97a6382a763d6de882252412727',1,'FsBaseFile::fgets()']]], - ['filesize_678',['fileSize',['../class_ex_fat_file.html#af2c08909b62b01f3edc4ee0c51ea7435',1,'ExFatFile::fileSize()'],['../class_fat_file.html#a874940574b9c99e763526465adf8dc28',1,'FatFile::fileSize()'],['../class_fs_base_file.html#aef21ae3af496d80f214918bb40b5b3ba',1,'FsBaseFile::fileSize()']]], - ['fill_679',['fill',['../classios__base.html#ade5bd46462e075999c3a5c2cff2015f1',1,'ios_base::fill()'],['../classios__base.html#aa5683f9bdf295311bd5a6d3cdc2fedd5',1,'ios_base::fill(char c)']]], - ['fillstack_680',['FillStack',['../_free_stack_8h.html#a534f4eab46987296c6951fc35a2f9a7f',1,'FreeStack.cpp']]], - ['firstblock_681',['firstBlock',['../class_fat_file.html#a5ac8a604863d18840f4a93c5c788b7c8',1,'FatFile']]], - ['firstsector_682',['firstSector',['../class_ex_fat_file.html#a883a36174d7753abbbdb7547e44b1739',1,'ExFatFile::firstSector()'],['../class_fat_file.html#af3108df387f30ca3d367dd390a04daaa',1,'FatFile::firstSector()'],['../class_fs_base_file.html#ad952b756b5bb3861472140fd5f733fe8',1,'FsBaseFile::firstSector()']]], - ['flags_683',['flags',['../classios__base.html#a2a73a30a8b157cc1cc92bb55b0a62e4a',1,'ios_base::flags() const'],['../classios__base.html#ae67e900dc12e4c7cbc0741ad1c70d6c2',1,'ios_base::flags(fmtflags fl)']]], - ['flush_684',['flush',['../class_buffered_print.html#a3fcb4970129a6fbfbd125ed8f2869d9b',1,'BufferedPrint::flush()'],['../class_minimum_serial.html#a872f0ff70f0e256352004f83d13fff28',1,'MinimumSerial::flush()'],['../class_ex_fat_file.html#ab16f38103a13394bffd8aa5be830c4fe',1,'ExFatFile::flush()'],['../class_fat_file.html#a166b5ff04754cc925f2aee71bf92f800',1,'FatFile::flush()'],['../classostream.html#af6be1f30d824f5a65d27d5b5d20b8c6c',1,'ostream::flush()'],['../class_stream_file.html#a32f813e659414892a58aa5157fe14f82',1,'StreamFile::flush()'],['../class_fs_base_file.html#adba2e8ad2ec46ae0f7b8f93b33a2b262',1,'FsBaseFile::flush()'],['../iostream_8h.html#a2f6f5344fca38fd4fe7b6231fd992a0d',1,'flush(): iostream.h']]], - ['fopen_685',['fopen',['../class_stdio_stream.html#a4ffc37225fb6deed98905aa71d1f9c4b',1,'StdioStream']]], - ['format_686',['format',['../class_sd_fat32.html#a303f00204805011d12e70c59ad24e42d',1,'SdFat32::format()'],['../class_sd_ex_fat.html#a6120786dcb0e7628301899f31af39e6b',1,'SdExFat::format()'],['../class_ex_fat_formatter.html#afe8c02e629e61bb4d83dee9076ef6d70',1,'ExFatFormatter::format()'],['../class_fat_formatter.html#a95c64e724b8b67eec1a476f21784540e',1,'FatFormatter::format()']]], - ['fprintf_687',['fprintf',['../_print_templates_8h.html#a3899b48e0eb6938ff58ca3accd53402a',1,'PrintTemplates.h']]], - ['fputc_688',['fputc',['../class_stdio_stream.html#a9f23cfa6b112a5da6ae08340af23c57b',1,'StdioStream']]], - ['fputs_689',['fputs',['../class_stdio_stream.html#a6adea52f55ef7d97cdb54e9e11fc2daa',1,'StdioStream']]], - ['fread_690',['fread',['../class_stdio_stream.html#a2d363b02abcef82b25ff025d50375bce',1,'StdioStream']]], - ['freeclustercount_691',['freeClusterCount',['../class_ex_fat_partition.html#ae6d4414d6440b79b6314cd1edbaa35b0',1,'ExFatPartition::freeClusterCount()'],['../class_fat_partition.html#ac9689f1e11f59acc5f1b21ed9bb71174',1,'FatPartition::freeClusterCount()'],['../class_fs_volume.html#af6dbe47dfe11adf752df95c351b10fdd',1,'FsVolume::freeClusterCount()']]], - ['freestack_692',['FreeStack',['../_free_stack_8h.html#a86da1fd0aa8dcc6a981803373bc8839d',1,'FreeStack.h']]], - ['fsbasefile_693',['FsBaseFile',['../class_fs_base_file.html#a6ddaf9a50682a50bacbddf541c35b017',1,'FsBaseFile']]], - ['fseek_694',['fseek',['../class_stdio_stream.html#a71584fd5c5cda3c31ce6cdbcc56f104d',1,'StdioStream']]], - ['fsetpos_695',['fsetpos',['../class_ex_fat_file.html#aea1e4d0c0981081774dc3c7cd3c55264',1,'ExFatFile::fsetpos()'],['../class_fat_file.html#ac042c43d41ecfff4e101b88f3f82086e',1,'FatFile::fsetpos()'],['../class_fs_base_file.html#a4bc085bc1ef0569f4ca7f14fff3e5678',1,'FsBaseFile::fsetpos()']]], - ['fstream_696',['fstream',['../classfstream.html#aed23877c52f828cab8de7a23603b3b6c',1,'fstream']]], - ['ftell_697',['ftell',['../class_stdio_stream.html#a809639fc5fb4fa5b6789dc121659f386',1,'StdioStream']]], - ['fwrite_698',['fwrite',['../class_stdio_stream.html#ad79465afb52579cbc801f4585c3f9c25',1,'StdioStream']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.html deleted file mode 100644 index f7d283d1..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.js deleted file mode 100644 index f83abdad..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_6.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['gcount_699',['gcount',['../classistream.html#ad0a3db5199ca44b191a9675f2dd3a098',1,'istream']]], - ['get_700',['get',['../class_fs_cache.html#a2483025514ecc0f69cabffcbeb052678',1,'FsCache::get()'],['../classistream.html#a36573c9b7fc522e6c85a73221019fd11',1,'istream::get()'],['../classistream.html#a9c7313d6f21f1f7ac9b0e759e74b4db2',1,'istream::get(char &ch)'],['../classistream.html#a2c963fd04375e5faa1b7a4362986269a',1,'istream::get(char *str, streamsize n, char delim='\n')']]], - ['getaccessdate_701',['getAccessDate',['../class_fat_file.html#a5d085c695e920b658a1505e480bc467f',1,'FatFile']]], - ['getaccessdatetime_702',['getAccessDateTime',['../class_ex_fat_file.html#a0d935161fde4a3f8d2fcd13140073adc',1,'ExFatFile::getAccessDateTime()'],['../class_fat_file.html#af70c42baeb45e0d7047ae63de568d0d2',1,'FatFile::getAccessDateTime()'],['../class_fs_base_file.html#add0901e13594348e1919a9df2fbad985',1,'FsBaseFile::getAccessDateTime()']]], - ['getc_703',['getc',['../class_stdio_stream.html#a28ba31e7b526607744bfa41844ffce31',1,'StdioStream']]], - ['getcreatedatetime_704',['getCreateDateTime',['../class_ex_fat_file.html#a703397b32592631c189a23047cc44c09',1,'ExFatFile::getCreateDateTime()'],['../class_fat_file.html#a94d484b5198032a9e00194e72182cc57',1,'FatFile::getCreateDateTime()'],['../class_fs_base_file.html#a5101edd57ee4ac0cd771b97cd089e4be',1,'FsBaseFile::getCreateDateTime()']]], - ['geterror_705',['getError',['../class_ex_fat_file.html#ac697224450ca216c60585d25f5f6e310',1,'ExFatFile::getError()'],['../class_fat_file.html#ad0dbbd083180f44c7a3ce7124d4ce19c',1,'FatFile::getError()'],['../class_fs_base_file.html#a7553d4aeb68fe8d3f1b61a16c8005e34',1,'FsBaseFile::getError()']]], - ['getline_706',['getline',['../classistream.html#a7ea6a5edd6b44a6e1ed297fb278b5d52',1,'istream']]], - ['getmodifydatetime_707',['getModifyDateTime',['../class_ex_fat_file.html#ac0c15cff235937cdfd7860d5fb441728',1,'ExFatFile::getModifyDateTime()'],['../class_fat_file.html#a28537b48ed2cb886c5f22984d07492b7',1,'FatFile::getModifyDateTime()'],['../class_fs_base_file.html#aee20c403ceed3b036dae70838c9f1bbf',1,'FsBaseFile::getModifyDateTime()']]], - ['getname_708',['getName',['../class_ex_fat_file.html#aba93e2c18be9fa4df7e067b7d6ac5906',1,'ExFatFile::getName()'],['../class_fat_file.html#aafa565e286440aab612cdb430fc01da5',1,'FatFile::getName()'],['../class_fs_base_file.html#ad2099dbe6bb8f61e1bf933d8e97b2d86',1,'FsBaseFile::getName()']]], - ['getsfn_709',['getSFN',['../class_fat_file.html#aba30e92a66f8e0d2f815c85662772a58',1,'FatFile']]], - ['getwriteerror_710',['getWriteError',['../class_ex_fat_file.html#a01da9896a59671a61f90dd20c3ac5d07',1,'ExFatFile::getWriteError()'],['../class_fat_file.html#a8062c0d3a118e8d77d0310418703d5f5',1,'FatFile::getWriteError()'],['../class_fs_base_file.html#ab5525bef93bab61569225374d475f2cb',1,'FsBaseFile::getWriteError()']]], - ['good_711',['good',['../classios.html#a0192d754476f243d7f13dc16e851c7cc',1,'ios']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.html deleted file mode 100644 index a74fe44a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.js deleted file mode 100644 index a39f9d37..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_7.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['halt_712',['halt',['../class_sys_call.html#a9b1ef8900e97f572ca561760b4dd4191',1,'SysCall']]], - ['hex_713',['hex',['../ios_8h.html#ace2036d970905192360d622140bfe336',1,'ios.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.html deleted file mode 100644 index 75fc0bea..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.js deleted file mode 100644 index 9d473fc4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_8.js +++ /dev/null @@ -1,30 +0,0 @@ -var searchData= -[ - ['ibufstream_714',['ibufstream',['../classibufstream.html#afe28f27d24a62a21428b60fe8834dd05',1,'ibufstream::ibufstream()'],['../classibufstream.html#a819561105ef7dc3828e0cfedfed708d8',1,'ibufstream::ibufstream(const char *str)']]], - ['ifstream_715',['ifstream',['../classifstream.html#a11f4bfaa5c37cfcf8878c367fd861a88',1,'ifstream']]], - ['ignore_716',['ignore',['../classistream.html#a12597b03d86b66047a5581bbd26eb032',1,'istream']]], - ['init_717',['init',['../class_fs_cache.html#a2e56c9443880e3db0b68cc50217e8abe',1,'FsCache::init()'],['../class_ex_fat_partition.html#adb1d277492dccba09031e2064f4fa66f',1,'ExFatPartition::init()'],['../class_fat_cache.html#a30790e03daad69b62ec6d7d643975454',1,'FatCache::init()'],['../class_fat_partition.html#ab827224f30eec57255d21cae589911ef',1,'FatPartition::init()'],['../classibufstream.html#a1d7bae17d9d2c79218085251946f322a',1,'ibufstream::init()'],['../classobufstream.html#a8f75dbadab2fed7770d01a2cc2628258',1,'obufstream::init()']]], - ['initerrorhalt_718',['initErrorHalt',['../class_sd_base.html#acb8180faf22cf72d97ec81330a700b05',1,'SdBase::initErrorHalt(print_t *pr)'],['../class_sd_base.html#aef6fd47c67b9b8498c1398e58422f169',1,'SdBase::initErrorHalt(print_t *pr, const char *msg)'],['../class_sd_base.html#a8a249b866a4b24ac0a0753f966aab299',1,'SdBase::initErrorHalt(Print *pr, const __FlashStringHelper *msg)'],['../class_sd_base.html#a5901169e4d6ae992b348df518da68a76',1,'SdBase::initErrorHalt()'],['../class_sd_base.html#a9b6c279ebcd8fa95d6b409d099986931',1,'SdBase::initErrorHalt(const char *msg)'],['../class_sd_base.html#a557ac64877bdd851cd27bf0a00f380c2',1,'SdBase::initErrorHalt(const __FlashStringHelper *msg)']]], - ['initerrorprint_719',['initErrorPrint',['../class_sd_base.html#a918474d623107f64b7ab9ca88d6fe46f',1,'SdBase::initErrorPrint(Print *pr)'],['../class_sd_base.html#abe8d75ba435b4decd6b2079b4272d0e5',1,'SdBase::initErrorPrint()']]], - ['internal_720',['internal',['../ios_8h.html#a8dd76c1ce8fced364a98428ca1eea7a6',1,'ios.h']]], - ['invalidate_721',['invalidate',['../class_fs_cache.html#a963ea866ca2a9c4f63afd57cf287733d',1,'FsCache::invalidate()'],['../class_fat_cache.html#a70071a128d647b49b523dbb2f5f944a5',1,'FatCache::invalidate()']]], - ['ios_722',['ios',['../classios.html#adc5dbd7b69da79493ebc84aa1e681aaa',1,'ios']]], - ['is_5fopen_723',['is_open',['../classfstream.html#ae4a71c6f3da2f168ec222739d796fc8b',1,'fstream::is_open()'],['../classifstream.html#aaa16c6422ea371995d02159f2e6707b2',1,'ifstream::is_open()'],['../classofstream.html#a9c97eb2eb6e35ae87cf7f7453a67e70a',1,'ofstream::is_open()']]], - ['isbusy_724',['isBusy',['../class_sd_card_interface.html#a26c31b07a866469098d702fed54f51b2',1,'SdCardInterface::isBusy()'],['../class_sdio_card.html#a560bdfc96932d073c2b0610600560f78',1,'SdioCard::isBusy()'],['../class_sd_spi_card.html#aa3cb9139dbc1e6596c6717da2b486328',1,'SdSpiCard::isBusy()']]], - ['iscontiguous_725',['isContiguous',['../class_ex_fat_file.html#a7a167102bd47b7cf91167b69f8cc57d1',1,'ExFatFile::isContiguous()'],['../class_fat_file.html#a16478eafdb731e867fb627d19091c3ce',1,'FatFile::isContiguous()'],['../class_fs_base_file.html#a7566bb4c71b5883e7bc15b45a1ee28a2',1,'FsBaseFile::isContiguous()']]], - ['isdir_726',['isDir',['../class_ex_fat_file.html#ad0a3687bd95bed5b216651335e66b500',1,'ExFatFile::isDir()'],['../class_fat_file.html#a933360b20b496421b2bd9ee7a95563a6',1,'FatFile::isDir()'],['../class_fs_base_file.html#ae93db43779d54734855005116244f6aa',1,'FsBaseFile::isDir()']]], - ['isdirectory_727',['isDirectory',['../class_stream_file.html#a586ad44055eca4c1b2b457299b829d44',1,'StreamFile::isDirectory()'],['../class_fs_base_file.html#aa564175ba0065803013338d89510ea81',1,'FsBaseFile::isDirectory()']]], - ['isdirty_728',['isDirty',['../class_fs_cache.html#a22f4284aefd18f569d962d37f4a5db70',1,'FsCache::isDirty()'],['../class_fat_cache.html#ae50287d95bd78558db1e4aa97d7b2c06',1,'FatCache::isDirty()']]], - ['isfile_729',['isFile',['../class_ex_fat_file.html#af601285f95db8398c140b3927cf9111c',1,'ExFatFile::isFile()'],['../class_fat_file.html#acc5a87da1a5c8cb9758bfeaa7ae47b57',1,'FatFile::isFile()']]], - ['ishidden_730',['isHidden',['../class_ex_fat_file.html#ac926285fa4321ebee28fa91beb511eae',1,'ExFatFile::isHidden()'],['../class_fat_file.html#ae216b4a2bc44a9cfb88478fa051a1fd8',1,'FatFile::isHidden()'],['../class_fs_base_file.html#a00e76b229cbb5098e1eb88e64a41dbfb',1,'FsBaseFile::isHidden()']]], - ['islfn_731',['isLFN',['../class_fat_file.html#af8f456ab790e818bfdd225cf6ffd40f3',1,'FatFile']]], - ['isopen_732',['isOpen',['../class_ex_fat_file.html#a804c34bbe3ebefe2b6c1d77ff8d49a35',1,'ExFatFile::isOpen()'],['../class_fat_file.html#a8b8a2850c086d3ce79bee64a23fbf7a6',1,'FatFile::isOpen()'],['../class_fs_base_file.html#a707007ff19ac5e4eb94cd0b26c542e0e',1,'FsBaseFile::isOpen()']]], - ['isreadable_733',['isReadable',['../class_ex_fat_file.html#a9ca137dfba2c7772910f4d2b3fdd9411',1,'ExFatFile::isReadable()'],['../class_fat_file.html#ae60b4cedb69c88ac641813d5edfa6b4a',1,'FatFile::isReadable()']]], - ['isreadonly_734',['isReadOnly',['../class_ex_fat_file.html#a14d160bfbfb39717746b93fa2eda5739',1,'ExFatFile::isReadOnly()'],['../class_fat_file.html#abaf639ec8f86f34aeb7e6b3615526f0b',1,'FatFile::isReadOnly()']]], - ['isroot_735',['isRoot',['../class_ex_fat_file.html#ad9f8e7afcf749ebcaaf055bd569dc7da',1,'ExFatFile::isRoot()'],['../class_fat_file.html#a03421a0c28649332f55e6ca06d3aeedb',1,'FatFile::isRoot()']]], - ['isroot32_736',['isRoot32',['../class_fat_file.html#a8fda8004720ec4cc55710869dbb52e35',1,'FatFile']]], - ['isrootfixed_737',['isRootFixed',['../class_fat_file.html#a0cc65089f7ce6c1ff92edbf0bff59dee',1,'FatFile']]], - ['issubdir_738',['isSubDir',['../class_ex_fat_file.html#ad7e02a1db8fb5a90288bb4679e9ddcb9',1,'ExFatFile::isSubDir()'],['../class_fat_file.html#abfd02c5d26f7d4f8739a8610116a6660',1,'FatFile::isSubDir()'],['../class_fs_base_file.html#a3140f64c85218c4b2f12f711483cd4c6',1,'FsBaseFile::isSubDir()']]], - ['issystem_739',['isSystem',['../class_fat_file.html#a48087bdeb6b94fc27e0f74c3d90af5a9',1,'FatFile']]], - ['iswritable_740',['isWritable',['../class_ex_fat_file.html#a04d1c43e80743f8c1a51b64062ce16dd',1,'ExFatFile::isWritable()'],['../class_fat_file.html#aa484d5b2b147c5f3fe0e26b6eaf11ffc',1,'FatFile::isWritable()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.html deleted file mode 100644 index 7541c9e3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.js deleted file mode 100644 index 51596bf9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_9.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['khzsdclk_741',['kHzSdClk',['../class_sdio_card.html#a3532a1a4b8a43a51ed9b5853186203cb',1,'SdioCard']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.html deleted file mode 100644 index 5a5be630..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.js deleted file mode 100644 index c0493d5a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_a.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['left_742',['left',['../ios_8h.html#a24a80a73f0a0d2d72d1cb74f49ff4759',1,'ios.h']]], - ['legal83char_743',['legal83Char',['../class_fat_file.html#a94df8090f16e9666cdc53ca20f6aff90',1,'FatFile']]], - ['length_744',['length',['../classobufstream.html#ac650708e968b0c0545a3badeb809cf15',1,'obufstream']]], - ['lfnlegalchar_745',['lfnLegalChar',['../_ex_fat_file_8h.html#acfe36e138012e39e1d66891a4e070871',1,'ExFatFile.h']]], - ['ls_746',['ls',['../class_ex_fat_file.html#aa0e074c891f3db5ea2ebd491667b03a6',1,'ExFatFile::ls(print_t *pr)'],['../class_ex_fat_file.html#a09f8beb55f939874e93c1df6c8a046d4',1,'ExFatFile::ls(print_t *pr, uint8_t flags, uint8_t indent=0)'],['../class_ex_fat_volume.html#abe1e8cad0a5922984b28edfd987bc856',1,'ExFatVolume::ls(print_t *pr, uint8_t flags=0)'],['../class_ex_fat_volume.html#aad2de66514174edb37b0fe7e44b33abf',1,'ExFatVolume::ls(print_t *pr, const ExChar_t *path, uint8_t flags)'],['../class_ex_fat_volume.html#abe74c248cfe9d57d9a10f651203df9dc',1,'ExFatVolume::ls()'],['../class_ex_fat_volume.html#ae883a72fbfe40f9a6fe6c6bf349d5c1f',1,'ExFatVolume::ls(uint8_t flags)'],['../class_ex_fat_volume.html#ad3a1aa9f64361b81d0cfe5b9f5de3891',1,'ExFatVolume::ls(const ExChar_t *path, uint8_t flags=0)'],['../class_fat_file.html#a60ab9d16bcc778150a364c26de467de1',1,'FatFile::ls(print_t *pr, uint8_t flags=0, uint8_t indent=0)'],['../class_fat_file.html#a6a11f3307da6232b5f2d11812832d93a',1,'FatFile::ls(uint8_t flags=0)'],['../class_fat_volume.html#ae40964f357cfff4208812344a0e6f26f',1,'FatVolume::ls(print_t *pr, uint8_t flags=0)'],['../class_fat_volume.html#ac5fc83cac7fd3af0b140a7986b9472f8',1,'FatVolume::ls(print_t *pr, const char *path, uint8_t flags)'],['../class_fat_volume.html#ad455ad05551329865c659cc4676f2d18',1,'FatVolume::ls(uint8_t flags=0)'],['../class_fat_volume.html#a455ad7b2a5b6b31551dca08087a3c404',1,'FatVolume::ls(const char *path, uint8_t flags=0)'],['../class_fs_base_file.html#aecbc336b952eebebfdfcf917863183ee',1,'FsBaseFile::ls(print_t *pr)'],['../class_fs_base_file.html#a6a254df9866966f7f97478e916fe6a7f',1,'FsBaseFile::ls(print_t *pr, uint8_t flags)'],['../class_fs_volume.html#a679105032aa3e5c4585c63f8e7acfc02',1,'FsVolume::ls(print_t *pr)'],['../class_fs_volume.html#a5ce82e5970856d1e8d549c512ec8a253',1,'FsVolume::ls(print_t *pr, uint8_t flags)'],['../class_fs_volume.html#ab429316ed9e57a52ecfb938aca7dff6c',1,'FsVolume::ls(print_t *pr, const char *path, uint8_t flags)'],['../class_fs_volume.html#aac4bf1f75fd37ba2e5a145569ab0790b',1,'FsVolume::ls()'],['../class_fs_volume.html#aed1c1e5e351b442ad8c0030bc63c655f',1,'FsVolume::ls(uint8_t flags)'],['../class_fs_volume.html#a212afe6a3393930b5d9ec6be86aabcd2',1,'FsVolume::ls(const char *path, uint8_t flags=0)']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.html deleted file mode 100644 index fc2d5aa4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.js deleted file mode 100644 index 4eddf2d5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_b.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['mkdir_747',['mkdir',['../class_ex_fat_file.html#a3a393624d52854e74bf385c9e513a86d',1,'ExFatFile::mkdir()'],['../class_ex_fat_volume.html#a407b93b16554b26ff52f7b762a9217aa',1,'ExFatVolume::mkdir(const ExChar_t *path, bool pFlag=true)'],['../class_ex_fat_volume.html#a0f4cf7e2853225380574724314327597',1,'ExFatVolume::mkdir(const String &path, bool pFlag=true)'],['../class_fat_file.html#abab5b9f72cc796388dd4eed01d13d90d',1,'FatFile::mkdir()'],['../class_fat_volume.html#ad80bccf8f24ff001a7b9277effc2cc52',1,'FatVolume::mkdir(const char *path, bool pFlag=true)'],['../class_fat_volume.html#ab423ec4f7e5b58a6d454f328f61fd864',1,'FatVolume::mkdir(const String &path, bool pFlag=true)'],['../class_fs_base_file.html#a8b7aa7f2c63882e483336dfe12ef6800',1,'FsBaseFile::mkdir()'],['../class_fs_volume.html#a9d38c297dccceeb5f48dceb17232368d',1,'FsVolume::mkdir(const char *path, bool pFlag=true)'],['../class_fs_volume.html#a5d07b87552368dc66e08aab2e7be14af',1,'FsVolume::mkdir(const String &path, bool pFlag=true)']]], - ['mprintf_748',['mprintf',['../_print_templates_8h.html#afceda1e76dbfc91ef2d06925a10eaea9',1,'mprintf(T *file, const char *fmt,...): PrintTemplates.h'],['../_print_templates_8h.html#a5893e928fd47234a7a69049f9e769359',1,'mprintf(F *file, const __FlashStringHelper *ifsh,...): PrintTemplates.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.html deleted file mode 100644 index a1a14378..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.js deleted file mode 100644 index ee25bb48..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_c.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['name_749',['name',['../class_stream_file.html#a8792c863080576eb65ce6cacbe1dd931',1,'StreamFile::name()'],['../class_fs_base_file.html#a6ccd545042d98841246edfbf2f482677',1,'FsBaseFile::name()']]], - ['newcard_750',['newCard',['../class_sd_card_factory.html#a8337ec1a741c25ed9fb9fd730d68b792',1,'SdCardFactory::newCard(SdSpiConfig config)'],['../class_sd_card_factory.html#a7e5bcb01e8eed2df25e60c25fe47d916',1,'SdCardFactory::newCard(SdioConfig config)']]], - ['noboolalpha_751',['noboolalpha',['../ios_8h.html#aa6a1ec04992fc8090ca775a39678be01',1,'ios.h']]], - ['noshowbase_752',['noshowbase',['../ios_8h.html#ab861ff5f863de0ae002b65390dde36b0',1,'ios.h']]], - ['noshowpoint_753',['noshowpoint',['../ios_8h.html#ad85399d1b75151cf9e2436f2a1ccfc13',1,'ios.h']]], - ['noshowpos_754',['noshowpos',['../ios_8h.html#a985805b22ffb4ce2f5298168662bd2d7',1,'ios.h']]], - ['noskipws_755',['noskipws',['../ios_8h.html#a773b847300db776fde08a0b562792131',1,'ios.h']]], - ['nouppercase_756',['nouppercase',['../ios_8h.html#a24b96fb317e056b34aa84c4bb965a79a',1,'ios.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.html deleted file mode 100644 index 4375535f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.js deleted file mode 100644 index d58b2bc7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_d.js +++ /dev/null @@ -1,17 +0,0 @@ -var searchData= -[ - ['obufstream_757',['obufstream',['../classobufstream.html#a74f7dbcf1131b77d3665aa85d6629722',1,'obufstream::obufstream()'],['../classobufstream.html#a7af0555c5c08ebf9cbc70fc5e2f67db7',1,'obufstream::obufstream(char *buf, size_t size)']]], - ['oct_758',['oct',['../ios_8h.html#ae661b435df22f8e8e643817f4f915123',1,'ios.h']]], - ['ofstream_759',['ofstream',['../classofstream.html#abd1a07c492699c44f149da45b8d593c1',1,'ofstream']]], - ['open_760',['open',['../class_ex_fat_file.html#ad0be05c5c7092317089872778052cbd7',1,'ExFatFile::open(ExFatFile *dirFile, const ExChar_t *path, oflag_t oflag)'],['../class_ex_fat_file.html#a825447643e6c9e8284a3ed78e3363788',1,'ExFatFile::open(ExFatVolume *vol, const ExChar_t *path, int oflag)'],['../class_ex_fat_file.html#a414b64dc30551e05dcc46f04e0f6413a',1,'ExFatFile::open(ExFatFile *dirFile, uint32_t index, oflag_t oflag)'],['../class_ex_fat_file.html#ab1e224aba9eb796c7ad48062cc1434c2',1,'ExFatFile::open(const ExChar_t *path, int oflag=0X00)'],['../class_ex_fat_volume.html#a0807cfcef46ef74cfe238badb83f3dda',1,'ExFatVolume::open(const ExChar_t *path, oflag_t oflag=0X00)'],['../class_ex_fat_volume.html#adce2c8ab2f73f56614b08fac42cabaea',1,'ExFatVolume::open(const String &path, oflag_t oflag=0X00)'],['../class_fat_file.html#af49a42dc64cd954debb271eae5639059',1,'FatFile::open(FatVolume *vol, const char *path, oflag_t oflag)'],['../class_fat_file.html#ab44920bb9cd5414b8e69c9dc4343394a',1,'FatFile::open(FatFile *dirFile, uint16_t index, oflag_t oflag)'],['../class_fat_file.html#a58d6ea245f1bc3ae7a6df311cd25052f',1,'FatFile::open(FatFile *dirFile, const char *path, oflag_t oflag)'],['../class_fat_file.html#afd3e4d5a76b6751ca796fc57f4dd2be4',1,'FatFile::open(const char *path, oflag_t oflag=0X00)'],['../class_fat_volume.html#a22923b86de9c797ce5e19f206dd4ce1f',1,'FatVolume::open(const char *path, oflag_t oflag=0X00)'],['../class_fat_volume.html#af7178b7f13eeae7748640b6268a34812',1,'FatVolume::open(const String &path, oflag_t oflag=0X00)'],['../classfstream.html#a85b24d94552991f33caf4c3a83420879',1,'fstream::open()'],['../classifstream.html#a169694d6535fd551fd6db48a2867590e',1,'ifstream::open()'],['../classofstream.html#a4b9d30c742fbe01baa336406c7afdcb2',1,'ofstream::open()'],['../class_fs_base_file.html#aa767859d4a4b4716ebbc4ea42a6d74df',1,'FsBaseFile::open(FsBaseFile *dir, const char *path, oflag_t oflag=O_RDONLY)'],['../class_fs_base_file.html#ac4edea1afb935119ecaf39607016c3cc',1,'FsBaseFile::open(FsBaseFile *dir, uint32_t index, oflag_t oflag)'],['../class_fs_base_file.html#a9786eb47f5d001e89ff291c271517547',1,'FsBaseFile::open(FsVolume *vol, const char *path, oflag_t oflag)'],['../class_fs_base_file.html#af44f0decd9b11dd45996e81f46e2cdee',1,'FsBaseFile::open(const char *path, oflag_t oflag=O_RDONLY)'],['../class_fs_volume.html#a2f28fc92b7a71607bc57aa72f5a4c0a7',1,'FsVolume::open(const char *path, oflag_t oflag=0X00)'],['../class_fs_volume.html#a55804d14db55dd29bf7b26d692275ac9',1,'FsVolume::open(const String &path, oflag_t oflag=0X00)']]], - ['opennext_761',['openNext',['../class_ex_fat_file.html#a89b6021cf70b7adb9feb162260d5a101',1,'ExFatFile::openNext()'],['../class_fat_file.html#a7f98b908a686574efbd7e1d20121ef9a',1,'FatFile::openNext()'],['../class_fs_base_file.html#acb9b1075f4db76fa7e0521c9aff9c3df',1,'FsBaseFile::openNext()']]], - ['opennextfile_762',['openNextFile',['../class_ex_file.html#ada8cd27e9a2f604f5c05088024a46a63',1,'ExFile::openNextFile()'],['../class_file32.html#a571434707124ee554d659ec82e2ef750',1,'File32::openNextFile()'],['../class_fs_file.html#ab2f85961e3831d0d654da862becb7433',1,'FsFile::openNextFile()']]], - ['openroot_763',['openRoot',['../class_ex_fat_file.html#af664c1da1bfa0bb5f6eb933bc25f757e',1,'ExFatFile::openRoot()'],['../class_fat_file.html#a7e0c0548fed3a69e7284b91b694439d4',1,'FatFile::openRoot()']]], - ['operator_20bool_764',['operator bool',['../class_minimum_serial.html#a73a1a2a92604ecb8507afde0022aedd8',1,'MinimumSerial::operator bool()'],['../class_ex_fat_file.html#aa1abbd813f27d488f0ff439ccbc9ca98',1,'ExFatFile::operator bool()'],['../class_fat_file.html#acd141c43d03cf790b3b9806f3b059e77',1,'FatFile::operator bool()'],['../classios.html#a940890a2e7fb429fd32813b0ea7ed35d',1,'ios::operator bool()'],['../class_fs_base_file.html#a3ad633f3efc2701a3a89e776436b14e1',1,'FsBaseFile::operator bool()']]], - ['operator_20const_20void_20_2a_765',['operator const void *',['../classios.html#aa919219fd2fa41d49c8573b36bb04418',1,'ios']]], - ['operator_21_766',['operator!',['../classios.html#aea64e05b9aa58bd75ca636692f881fb6',1,'ios']]], - ['operator_3c_3c_767',['operator<<',['../classostream.html#a4dfc0cdb38bced959ba7cf963db38c30',1,'ostream::operator<<(ostream &(*pf)(ostream &str))'],['../classostream.html#af52c607ea168aff1025222c62cad392f',1,'ostream::operator<<(ios_base &(*pf)(ios_base &str))'],['../classostream.html#a63e3999be154253cf92a45c22e548f51',1,'ostream::operator<<(bool arg)'],['../classostream.html#a618b5d6861dde2347847102b89e0ccfa',1,'ostream::operator<<(const char *arg)'],['../classostream.html#aebe24ff723b806cbee19deb2165d0a5b',1,'ostream::operator<<(const signed char *arg)'],['../classostream.html#ac0cf68ffa4706994f47acb1fa37c601a',1,'ostream::operator<<(const unsigned char *arg)'],['../classostream.html#a9d91797605a48ffcad21738bfc876547',1,'ostream::operator<<(const String &arg)'],['../classostream.html#a1d1e11d2fadaf4c9e34194a1f28572e4',1,'ostream::operator<<(char arg)'],['../classostream.html#ad06f8c6c47667e9c7b14620882c09434',1,'ostream::operator<<(signed char arg)'],['../classostream.html#a69912ec4a8536f289b716e95953d09d7',1,'ostream::operator<<(unsigned char arg)'],['../classostream.html#a8065697d56d5e5d1a0ca50c1916b4955',1,'ostream::operator<<(double arg)'],['../classostream.html#a6c68e418e19d9dcdfe6b1790b2621666',1,'ostream::operator<<(float arg)'],['../classostream.html#a227c47e2b631f29d8873b00290bb4872',1,'ostream::operator<<(short arg)'],['../classostream.html#ace10a3a767dc55faff2cec71cd0a89b1',1,'ostream::operator<<(unsigned short arg)'],['../classostream.html#a62488f7ce7822c777ea27d15223b8e5f',1,'ostream::operator<<(int arg)'],['../classostream.html#ad31df6cd88c7248c01808e40889a7907',1,'ostream::operator<<(unsigned int arg)'],['../classostream.html#a15db9977ed82e503bd3cd1f585acf9e6',1,'ostream::operator<<(long arg)'],['../classostream.html#aaedd44fefa48cf3f0967fcd699a2909d',1,'ostream::operator<<(unsigned long arg)'],['../classostream.html#a3b1be06d511106bb0449f4424962ad72',1,'ostream::operator<<(long long arg)'],['../classostream.html#a9f9adac280c449da7be40f0f1a65fcd6',1,'ostream::operator<<(unsigned long long arg)'],['../classostream.html#a2a8febd7c07f078120dd69bb71f25a94',1,'ostream::operator<<(const void *arg)'],['../classostream.html#a99ee8d9265d9354f197d02a3d17116be',1,'ostream::operator<<(const __FlashStringHelper *arg)'],['../iostream_8h.html#aa125ac928f3377cbc6e3cf288b9378fd',1,'operator<<(ostream &os, const setfill &arg): iostream.h'],['../iostream_8h.html#a23d4c29ef8ae37ec7d972d0b66187652',1,'operator<<(ostream &os, const setprecision &arg): iostream.h'],['../iostream_8h.html#a331649f2fdb01ed069dc18a5fad781b1',1,'operator<<(ostream &os, const setw &arg): iostream.h']]], - ['operator_3d_768',['operator=',['../class_fs_base_file.html#ae4f6d168072bb4f2a61976f621659d20',1,'FsBaseFile']]], - ['operator_3e_3e_769',['operator>>',['../classistream.html#aa67d3b8ac67e2097d876a66657ec6067',1,'istream::operator>>(istream &(*pf)(istream &str))'],['../classistream.html#ac6e2f17c80edd19deecdc20f804c424e',1,'istream::operator>>(ios_base &(*pf)(ios_base &str))'],['../classistream.html#a5a0a2c0e06abadb79951ebe34f36d62a',1,'istream::operator>>(ios &(*pf)(ios &str))'],['../classistream.html#a99db66d2e192f02deff0171ad098271f',1,'istream::operator>>(char *str)'],['../classistream.html#addaf5e0f39a15cc213117165dfef0d77',1,'istream::operator>>(char &ch)'],['../classistream.html#a390af4d28adbdc537e436f2121d1c862',1,'istream::operator>>(signed char *str)'],['../classistream.html#a49ab1a573fbf69809d19a52855a30072',1,'istream::operator>>(signed char &ch)'],['../classistream.html#a52e85d01198968330f20026a52cb9f72',1,'istream::operator>>(unsigned char *str)'],['../classistream.html#a74875fcf9ccdc0dca4b46a0b66821798',1,'istream::operator>>(unsigned char &ch)'],['../classistream.html#a3708636d095d360695e9c23335639317',1,'istream::operator>>(bool &arg)'],['../classistream.html#a662060e885a0551c390b7042b3b9e4a5',1,'istream::operator>>(short &arg)'],['../classistream.html#a31a706a374c5a594e400734b8992e2a0',1,'istream::operator>>(unsigned short &arg)'],['../classistream.html#ae8451bc86d83828892d9d67c67b7f02b',1,'istream::operator>>(int &arg)'],['../classistream.html#a35c9847ebf7b822c5ec9742e9de19345',1,'istream::operator>>(unsigned int &arg)'],['../classistream.html#aa26e7f35e74d96803bb0dfb3fb0dc154',1,'istream::operator>>(long &arg)'],['../classistream.html#a5aafa4c7f6615a7f1441962b61b8ef59',1,'istream::operator>>(unsigned long &arg)'],['../classistream.html#af9bf453725ce1d9ef62142a7ee38936e',1,'istream::operator>>(double &arg)'],['../classistream.html#aa8efce6fecab80cf7a17d5dfa31f5aa8',1,'istream::operator>>(float &arg)'],['../classistream.html#a62ef4762feacc64a8acdcbf8f1296936',1,'istream::operator>>(void *&arg)'],['../iostream_8h.html#a4a4079de901e0f3f10c743115bd345b2',1,'operator>>(istream &obj, const setfill &arg): iostream.h'],['../iostream_8h.html#a2f819cd0ccda31a8b648f20534469308',1,'operator>>(istream &is, const setprecision &arg): iostream.h'],['../iostream_8h.html#a8d1b3da6f1074322a6e9e11ff4ce8c33',1,'operator>>(istream &is, const setw &arg): iostream.h']]], - ['options_770',['options',['../class_sdio_config.html#a905aeb5dc774c63af6e72b3be51fc845',1,'SdioConfig']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.html deleted file mode 100644 index 0f205446..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.js deleted file mode 100644 index f0362348..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_e.js +++ /dev/null @@ -1,27 +0,0 @@ -var searchData= -[ - ['peek_771',['peek',['../class_ex_fat_file.html#afc2e375faa696545f7ebbf583faae72a',1,'ExFatFile::peek()'],['../class_fat_file.html#ac05b7136b887539426856c623869aa3a',1,'FatFile::peek()'],['../classistream.html#a4022265e0ede3698454f1ff59348c14a',1,'istream::peek()'],['../class_stream_file.html#af0da96e502485133ca0cff27fa130082',1,'StreamFile::peek()'],['../class_fs_base_file.html#adc49cb204f293a28b67af64c49c4c9f3',1,'FsBaseFile::peek()']]], - ['position_772',['position',['../class_stream_file.html#a18a04d1e68a0c1e3e38e5712cd9bbc03',1,'StreamFile::position()'],['../class_fs_base_file.html#a8d5ea7284de7ec0bfdb0b2294001f015',1,'FsBaseFile::position()']]], - ['preallocate_773',['preAllocate',['../class_ex_fat_file.html#a35a5093014e80965e49c84b61780556f',1,'ExFatFile::preAllocate()'],['../class_fat_file.html#aeeb13b9de68bf9097c863c41d655ee83',1,'FatFile::preAllocate()'],['../class_fs_base_file.html#acbc037f9f07c57235bb8b30af5a53ac2',1,'FsBaseFile::preAllocate()']]], - ['precision_774',['precision',['../classios__base.html#aba92f0687644fc14f202958635ce276f',1,'ios_base::precision() const'],['../classios__base.html#a5b70cc65fc2c276136fea99bddedb6f0',1,'ios_base::precision(unsigned int n)']]], - ['print_775',['print',['../class_buffered_print.html#a95f984c4702b0e20d781efd9d1ea8f27',1,'BufferedPrint::print(double d, uint8_t prec=2)'],['../class_buffered_print.html#aeed86ef2ea320cd8ff47ee871663a8ce',1,'BufferedPrint::print(float f, uint8_t prec=2)'],['../class_buffered_print.html#ae9472f3acd3f7d3187500e60754963bb',1,'BufferedPrint::print(Type v)'],['../class_stdio_stream.html#ad3f6ee8e8ca5dcf6dabfd88199b172e2',1,'StdioStream::print(char c)'],['../class_stdio_stream.html#a1158ea5f9bf041f21b1733b7811c9bb9',1,'StdioStream::print(const char *str)'],['../class_stdio_stream.html#aac4d7b3548d03b8fd70adf12c7ee315c',1,'StdioStream::print(const __FlashStringHelper *str)'],['../class_stdio_stream.html#a26f5b98560b6771225005b073166108b',1,'StdioStream::print(double val, uint8_t prec=2)'],['../class_stdio_stream.html#a06b6eb9f0a7000fdcc73cd6af8d40560',1,'StdioStream::print(float val, uint8_t prec=2)'],['../class_stdio_stream.html#a7129f85c7c5f16867f467731ef84dee9',1,'StdioStream::print(T val)']]], - ['printaccessdate_776',['printAccessDate',['../class_fat_file.html#a22be4c339d0bfa331f75415b74dd4f37',1,'FatFile']]], - ['printaccessdatetime_777',['printAccessDateTime',['../class_ex_fat_file.html#ad9ba8aa00b9db683d40fc2989dbe1922',1,'ExFatFile::printAccessDateTime()'],['../class_fat_file.html#a19b3196bb1f6a68a2447e53b09369aef',1,'FatFile::printAccessDateTime()'],['../class_fs_base_file.html#a264ba61530aee50dbe9659d41dd2c1d6',1,'FsBaseFile::printAccessDateTime()']]], - ['printcreatedatetime_778',['printCreateDateTime',['../class_ex_fat_file.html#a7318b2d7594d6ba52421c413f5fc35cd',1,'ExFatFile::printCreateDateTime()'],['../class_fat_file.html#ab22396a285e27b53501a0047ddd97f59',1,'FatFile::printCreateDateTime()'],['../class_fs_base_file.html#a3f75ac7eb6643afcabae28e8c93479c8',1,'FsBaseFile::printCreateDateTime()']]], - ['printdec_779',['printDec',['../class_stdio_stream.html#ac0a907feb1e4b7e00de99857b4c0a470',1,'StdioStream::printDec(char n)'],['../class_stdio_stream.html#a2707ea97f6113c226781469f4f39ff62',1,'StdioStream::printDec(signed char n)'],['../class_stdio_stream.html#a6e6ac78caa6259a4c4934707bf497a2b',1,'StdioStream::printDec(unsigned char n)'],['../class_stdio_stream.html#a218af88db35f38babf01d6e0a9cdceeb',1,'StdioStream::printDec(int16_t n)'],['../class_stdio_stream.html#a90b2999af94a3578fff7579c2acf8e35',1,'StdioStream::printDec(uint16_t n)'],['../class_stdio_stream.html#ad4591f1234b57f63c1acf0f3392099ac',1,'StdioStream::printDec(int32_t n)'],['../class_stdio_stream.html#a8b6c2c80342abe45e6f564e9bd5bb7ea',1,'StdioStream::printDec(uint32_t n)'],['../class_stdio_stream.html#aaa8921947d4dbbae840d285cb633e8aa',1,'StdioStream::printDec(double value, uint8_t prec)'],['../class_stdio_stream.html#a6a09284b1c6d0769c27916a2e131e749',1,'StdioStream::printDec(float value, uint8_t prec)']]], - ['printfatdate_780',['printFatDate',['../class_fat_file.html#aabcd863883bfcfb37b63dbd6021f7eb8',1,'FatFile']]], - ['printfattime_781',['printFatTime',['../class_fat_file.html#a7f84d953190ea94710dad9ebb897b957',1,'FatFile']]], - ['printfattype_782',['printFatType',['../class_sd_base.html#a234e80318c39229fe968a182b172148c',1,'SdBase']]], - ['printfield_783',['printField',['../class_buffered_print.html#a69ea9541fb854448b9fe3aff44583975',1,'BufferedPrint::printField(char c, char term)'],['../class_buffered_print.html#ac18cc8c86b73b073a28db85075215f4f',1,'BufferedPrint::printField(const __FlashStringHelper *fsh, char term)'],['../class_buffered_print.html#ac49d0beb5fdad68e82f741bbaad4bb1b',1,'BufferedPrint::printField(const char *str, char term)'],['../class_buffered_print.html#a5b5b11f01adf91a1854a44b131886219',1,'BufferedPrint::printField(double d, char term, uint8_t prec=2)'],['../class_buffered_print.html#a93369fc042366488ef40426f9fd3286d',1,'BufferedPrint::printField(float f, char term, uint8_t prec=2)'],['../class_buffered_print.html#af680cf36170347287d20ed92ae5f6c9b',1,'BufferedPrint::printField(Type n, char term)'],['../class_ex_fat_file.html#a496ac61e367a24665425d54956a46346',1,'ExFatFile::printField(double value, char term, uint8_t prec=2)'],['../class_ex_fat_file.html#a70eda4191df90f608694c1faede7fb33',1,'ExFatFile::printField(float value, char term, uint8_t prec=2)'],['../class_ex_fat_file.html#a9759c13e804c01ff9e7e2ac8fbabc5b8',1,'ExFatFile::printField(Type value, char term)'],['../class_fat_file.html#aa4a61a0cca1813d2ad0f6fe99cc4e41d',1,'FatFile::printField(double value, char term, uint8_t prec=2)'],['../class_fat_file.html#a90ccef676afd62bbe7c773dd863a56e0',1,'FatFile::printField(float value, char term, uint8_t prec=2)'],['../class_fat_file.html#a8f906be79086f38943cb0911310d67bf',1,'FatFile::printField(Type value, char term)'],['../class_stdio_stream.html#a4988592ada39c4b4c603b061f84d183f',1,'StdioStream::printField(double value, char term, uint8_t prec=2)'],['../class_stdio_stream.html#a3b90b2317cc391f94784a847f5313c08',1,'StdioStream::printField(float value, char term, uint8_t prec=2)'],['../class_stdio_stream.html#a02c2ad1a2e71e82d238b8386cf3e6c41',1,'StdioStream::printField(T value, char term)'],['../class_fs_base_file.html#a911ae825e67d7e6ade4a672595e060d6',1,'FsBaseFile::printField(double value, char term, uint8_t prec=2)'],['../class_fs_base_file.html#a5dd2738efe2e550f56037536bc252f13',1,'FsBaseFile::printField(float value, char term, uint8_t prec=2)'],['../class_fs_base_file.html#a45639312b8c5aa9ceddb19e654e902b4',1,'FsBaseFile::printField(Type value, char term)']]], - ['printfilesize_784',['printFileSize',['../class_ex_fat_file.html#a16d527f98cff3ffd3ba8bc594a22d186',1,'ExFatFile::printFileSize()'],['../class_fat_file.html#a12a5d2de2737c201aa39ca1bd2ab9c47',1,'FatFile::printFileSize()'],['../class_fs_base_file.html#a6760471e3c445f66b94f3f0e96fdfe10',1,'FsBaseFile::printFileSize()']]], - ['printhex_785',['printHex',['../class_stdio_stream.html#add39b2b4ec3daa7c8922e96ce5d368bc',1,'StdioStream']]], - ['printhexln_786',['printHexln',['../class_stdio_stream.html#aec6ebea511489b0ef6b61d9132d93af9',1,'StdioStream']]], - ['println_787',['println',['../class_buffered_print.html#a7bd188ccc8b38b83cf44b96164a1d816',1,'BufferedPrint::println()'],['../class_buffered_print.html#aaeaceb452361377ce73db0041edbcdff',1,'BufferedPrint::println(double d, uint8_t prec=2)'],['../class_buffered_print.html#afc449966c5c7357fde925c6888669698',1,'BufferedPrint::println(float f, uint8_t prec)'],['../class_buffered_print.html#a0945ed373bd17a309bb6661faad3be9c',1,'BufferedPrint::println(Type v)'],['../class_stdio_stream.html#ad0cd3acc05a91456f505752377bd405a',1,'StdioStream::println()'],['../class_stdio_stream.html#a3793dd66cf347a1ca0b7b167e948cce9',1,'StdioStream::println(double val, uint8_t prec=2)'],['../class_stdio_stream.html#aac250d041a7844c8db1cbd2d97ecfdaa',1,'StdioStream::println(float val, uint8_t prec=2)'],['../class_stdio_stream.html#a3b14532768d07e6ed89c762d04792c12',1,'StdioStream::println(T val)']]], - ['printmodifydatetime_788',['printModifyDateTime',['../class_ex_fat_file.html#a16488d3e0d946f108240b7d6c536c6f4',1,'ExFatFile::printModifyDateTime()'],['../class_fat_file.html#a43c8a1cabcae673e43c590f5db44c65a',1,'FatFile::printModifyDateTime()'],['../class_fs_base_file.html#a0f2f813496fa156f9808a5d33c2d8746',1,'FsBaseFile::printModifyDateTime()']]], - ['printname_789',['printName',['../class_ex_fat_file.html#a095c0a865e5e5b6463c3dc0c90680635',1,'ExFatFile::printName()'],['../class_fat_file.html#afe18a787fb8640e2d2483370c770f82f',1,'FatFile::printName(print_t *pr)'],['../class_fat_file.html#ad1cbc3aeb0f5193b7a26595966da9621',1,'FatFile::printName()'],['../class_fs_base_file.html#a178a1cbe2bce19758a55bd00fa262732',1,'FsBaseFile::printName()']]], - ['printsderror_790',['printSdError',['../class_sd_base.html#a6a8ba118e754b2b9fa0f34410163e228',1,'SdBase']]], - ['printsfn_791',['printSFN',['../class_fat_file.html#a791cd7aade71f609aab62ec018aea3c0',1,'FatFile']]], - ['put_792',['put',['../classostream.html#a11aad8a1efd284ccfa91cbfb78d089bd',1,'ostream']]], - ['putc_793',['putc',['../class_stdio_stream.html#adf9e552212aad6fc2284da0ee62d04dc',1,'StdioStream']]], - ['putcrlf_794',['putCRLF',['../class_stdio_stream.html#a09ccc4b6cabc3502c1052e85d94e84ef',1,'StdioStream']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.html deleted file mode 100644 index 0dc9f86c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.js deleted file mode 100644 index f5090bbd..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/functions_f.js +++ /dev/null @@ -1,29 +0,0 @@ -var searchData= -[ - ['rdstate_795',['rdstate',['../classios.html#afe4d084ba0d2704a27525147d1463c36',1,'ios']]], - ['read_796',['read',['../class_minimum_serial.html#a4890dd60f2ffb61eba0821cc80d411ad',1,'MinimumSerial::read()'],['../class_ex_fat_file.html#a77f4fea0aae0c8bae926fdfbba260a55',1,'ExFatFile::read()'],['../class_ex_fat_file.html#a5ae5477efe55179cf07e173c62654313',1,'ExFatFile::read(void *buf, size_t count)'],['../class_fat_file.html#a60ae55ff6fe158c2340071d702a363c5',1,'FatFile::read()'],['../class_fat_file.html#aba893af8107a18017482d2311b066187',1,'FatFile::read(void *buf, size_t count)'],['../class_fat_cache.html#a9c3d0dfa0d987f2c8dbad2d35024b56b',1,'FatCache::read()'],['../class_stream_file.html#a249a5d428f303e2a8e7c3ae476e74829',1,'StreamFile::read()'],['../class_fs_base_file.html#acbe2d203d212a50871db77a9b2ba01f6',1,'FsBaseFile::read()'],['../class_fs_base_file.html#ae8d8cb4cceda9d56e8dae692d04a46e6',1,'FsBaseFile::read(void *buf, size_t count)']]], - ['readcid_797',['readCID',['../class_sd_card_interface.html#ab61ea0c742074271de0552c46be8ae51',1,'SdCardInterface::readCID()'],['../class_sdio_card.html#a2490b07ee400aaf799ea5c37052041bf',1,'SdioCard::readCID()'],['../class_sd_spi_card.html#aa073dc42828164883db1b9faeff909ea',1,'SdSpiCard::readCID()']]], - ['readcsd_798',['readCSD',['../class_sd_card_interface.html#a8aaf7a014423034652f2a1ded1aaa127',1,'SdCardInterface::readCSD()'],['../class_sdio_card.html#a72bbb4fda29fb6313981a63ea2f43d5f',1,'SdioCard::readCSD()'],['../class_sd_spi_card.html#a9fbea9525e70f6e3602fe5153a5a1290',1,'SdSpiCard::readCSD()']]], - ['readdata_799',['readData',['../class_sdio_card.html#a9dc1cd99d0136e514faaecf56a6318d2',1,'SdioCard::readData()'],['../class_sd_spi_card.html#a3a1d1b4b4ceb42fcd41aaf6649482770',1,'SdSpiCard::readData()']]], - ['readdir_800',['readDir',['../class_fat_file.html#a29502cd34ef186763d2196daef27df1f',1,'FatFile']]], - ['readline_801',['readline',['../class_arduino_in_stream.html#ad4c60f813b8df6dd1d6696a3458de09c',1,'ArduinoInStream']]], - ['readocr_802',['readOCR',['../class_sd_card_interface.html#abb2742e6e81d18552308519a0dfb72a6',1,'SdCardInterface::readOCR()'],['../class_sdio_card.html#adc583f7a27f57ce55ce474b1379b9303',1,'SdioCard::readOCR()'],['../class_sd_spi_card.html#ab446e49338b3ce834a750ac6dae35f61',1,'SdSpiCard::readOCR()']]], - ['readsector_803',['readSector',['../class_block_device_interface.html#a537ffdf8645666ee60d9bee0d7e3d17e',1,'BlockDeviceInterface::readSector()'],['../class_sdio_card.html#a77ae4fbe24bb04b74af5d388d4139dde',1,'SdioCard::readSector()'],['../class_sd_spi_card.html#adbdb4df6d74ffa21df7f19a46c781f17',1,'SdSpiCard::readSector()']]], - ['readsectors_804',['readSectors',['../class_block_device_interface.html#aeee2944296d4aaabd00ee7be90596c5c',1,'BlockDeviceInterface::readSectors()'],['../class_sdio_card.html#a1ed4229446a5a2fe815d460b027243b9',1,'SdioCard::readSectors()'],['../class_sd_spi_card.html#a248a56a6b15182c4d558f497c99fbf15',1,'SdSpiCard::readSectors()']]], - ['readsingle_805',['readSingle',['../class_sd_spi_card.html#a6eb6241369637ca07c0d1c3fe303750d',1,'SdSpiCard']]], - ['readstart_806',['readStart',['../class_sdio_card.html#a9fde1fb0e6603e7140cac16395815df0',1,'SdioCard::readStart(uint32_t sector)'],['../class_sdio_card.html#a54732c9d38998ddd42b72b720e0ee54c',1,'SdioCard::readStart(uint32_t sector, uint32_t count)'],['../class_sd_spi_card.html#a6f10180a070fa01834cef47e70649a8e',1,'SdSpiCard::readStart()']]], - ['readstatus_807',['readStatus',['../class_sd_spi_card.html#a91d0413599efe0d63c8c2dfe4a12d9ae',1,'SdSpiCard']]], - ['readstop_808',['readStop',['../class_sdio_card.html#a5bd3f206d790149340783135d08eb701',1,'SdioCard::readStop()'],['../class_sd_spi_card.html#afdac7c399fa1ba3f904cf503526e007e',1,'SdSpiCard::readStop()']]], - ['receive_809',['receive',['../class_sd_spi_arduino_driver.html#a8d6bc852a52e9d69c4b1e48ee062e8d1',1,'SdSpiArduinoDriver::receive()'],['../class_sd_spi_arduino_driver.html#a4f5be313b836ca937a5b5be6432987ec',1,'SdSpiArduinoDriver::receive(uint8_t *buf, size_t count)'],['../class_sd_spi_base_class.html#a537c71fb2cdb8a825215c0faeb6f7dbd',1,'SdSpiBaseClass::receive()=0'],['../class_sd_spi_base_class.html#a45693c18a8bb44ec9e5b9b1dee39b393',1,'SdSpiBaseClass::receive(uint8_t *buf, size_t count)=0'],['../class_sd_spi_soft_driver.html#a189c85920acdcb3ad90b68a998ffeb2a',1,'SdSpiSoftDriver::receive()=0'],['../class_sd_spi_soft_driver.html#a94c6dc242a83a91be44f994a67a7f583',1,'SdSpiSoftDriver::receive(uint8_t *buf, size_t count)'],['../class_soft_spi_driver.html#a0c2a84b8b0f7b4eaa9d970aa3f31a6d8',1,'SoftSpiDriver::receive()']]], - ['remove_810',['remove',['../class_ex_fat_file.html#a8e88c8e79551a72cc98310038514c47a',1,'ExFatFile::remove()'],['../class_ex_fat_file.html#ad10417a851dba3d40a78eb2c0eb11fff',1,'ExFatFile::remove(const ExChar_t *path)'],['../class_ex_fat_volume.html#a58061d05f5dc5a52706cdd61a1a86e80',1,'ExFatVolume::remove(const ExChar_t *path)'],['../class_ex_fat_volume.html#adc22ad4ce966654944b18d31fc6ac5ee',1,'ExFatVolume::remove(const String &path)'],['../class_fat_file.html#ac837a537fbcca14c7aa390c5fc9f4e7c',1,'FatFile::remove()'],['../class_fat_file.html#a75d3276f0b02b03e863afafe5731fedb',1,'FatFile::remove(const char *path)'],['../class_fat_volume.html#abb11d05ef407775bcdb9b14a6c608433',1,'FatVolume::remove(const char *path)'],['../class_fat_volume.html#a994411f55df474be6be87f06100c2c39',1,'FatVolume::remove(const String &path)'],['../class_fs_base_file.html#a8d21f9df86e846e34c3bb11cf7db21bc',1,'FsBaseFile::remove()'],['../class_fs_base_file.html#a64feff69c4f09e56247c7f9dc7c74f34',1,'FsBaseFile::remove(const char *path)'],['../class_fs_volume.html#aaaa53cfc48602b3d1524508944bd112e',1,'FsVolume::remove(const char *path)'],['../class_fs_volume.html#a069e1d9b3a6bba07b7edc5dcde434e0c',1,'FsVolume::remove(const String &path)']]], - ['rename_811',['rename',['../class_ex_fat_file.html#aab50b2646035f76834c75230d2b55c64',1,'ExFatFile::rename(const ExChar_t *newPath)'],['../class_ex_fat_file.html#aea570a3b6afbe633d874803b137a46b8',1,'ExFatFile::rename(ExFatFile *dirFile, const ExChar_t *newPath)'],['../class_ex_fat_volume.html#a8dcd1b108167803a24f7314f5fce6bc4',1,'ExFatVolume::rename(const ExChar_t *oldPath, const ExChar_t *newPath)'],['../class_ex_fat_volume.html#a1396c06f6c5e138889125d2f62cdbdcb',1,'ExFatVolume::rename(const String &oldPath, const String &newPath)'],['../class_fat_file.html#a4cebcac13c1f4c9de7a055ae73133599',1,'FatFile::rename(const char *newPath)'],['../class_fat_file.html#a4b42f2454ff462555c07ea094a92a1e0',1,'FatFile::rename(FatFile *dirFile, const char *newPath)'],['../class_fat_volume.html#a5e4ea6c91569dc435c7aacd7ba704911',1,'FatVolume::rename(const char *oldPath, const char *newPath)'],['../class_fat_volume.html#aa7015c0f694261780081c79c05d0882d',1,'FatVolume::rename(const String &oldPath, const String &newPath)'],['../class_fs_base_file.html#af532d87177e86995a053503eb9152115',1,'FsBaseFile::rename(const char *newPath)'],['../class_fs_base_file.html#a4e4347f6e89bf0b487824dbdc5b82068',1,'FsBaseFile::rename(FsBaseFile *dirFile, const char *newPath)'],['../class_fs_volume.html#aae3be08aff89f5a113cfa0b89c4a6004',1,'FsVolume::rename(const char *oldPath, const char *newPath)'],['../class_fs_volume.html#a7da5cf51eceaa2ea8799be05c3bf9258',1,'FsVolume::rename(const String &oldPath, const String &newPath)']]], - ['rewind_812',['rewind',['../class_ex_fat_file.html#a3c1d3ef65284ffb13ed3ceee472adf9a',1,'ExFatFile::rewind()'],['../class_fat_file.html#a5aac6e0b3cb08fc8b8668e916a8b0ca5',1,'FatFile::rewind()'],['../class_stdio_stream.html#ad985866675193d2ee1dde9e27b0d08da',1,'StdioStream::rewind()'],['../class_fs_base_file.html#a22f8ef845d610493ebe314e19ddda561',1,'FsBaseFile::rewind()']]], - ['rewinddirectory_813',['rewindDirectory',['../class_stream_file.html#a91e8cfbde27d6879b4f51d2ceb2a9f06',1,'StreamFile::rewindDirectory()'],['../class_fs_base_file.html#a56bfeb031562a6fb30e057670e6b326d',1,'FsBaseFile::rewindDirectory()']]], - ['right_814',['right',['../ios_8h.html#aee80fd600c5c58a2bebbd48afdcf8280',1,'ios.h']]], - ['rmdir_815',['rmdir',['../class_ex_fat_file.html#a0165e0fde12a53e419bd92cd37f9cfed',1,'ExFatFile::rmdir()'],['../class_ex_fat_volume.html#ab9e3e7d9538c905ca60b834e244943ee',1,'ExFatVolume::rmdir(const ExChar_t *path)'],['../class_ex_fat_volume.html#af0adfad817e085d676479fefbb343197',1,'ExFatVolume::rmdir(const String &path)'],['../class_fat_file.html#a9515bac181d33e7f0125e88fa2ccd283',1,'FatFile::rmdir()'],['../class_fat_volume.html#af1181990bcece7dbb7d19293dd4fe11a',1,'FatVolume::rmdir(const char *path)'],['../class_fat_volume.html#a105f437fb649b57ed3823f8ff1a2f37e',1,'FatVolume::rmdir(const String &path)'],['../class_fs_base_file.html#ac47870fd89b0849cda33f2780918a286',1,'FsBaseFile::rmdir()'],['../class_fs_volume.html#ad2457b491bf85495140fd4a8ca743513',1,'FsVolume::rmdir(const char *path)'],['../class_fs_volume.html#a32cdbc9c2d29ed95b2a7ff8d117dadc8',1,'FsVolume::rmdir(const String &path)']]], - ['rmrfstar_816',['rmRfStar',['../class_fat_file.html#ac780a80526f86d3def701ecdc99d8bfe',1,'FatFile']]], - ['rootdirectorycluster_817',['rootDirectoryCluster',['../class_ex_fat_partition.html#ac7ddc5d4efd1651816f1284980b6f790',1,'ExFatPartition']]], - ['rootdirentrycount_818',['rootDirEntryCount',['../class_fat_partition.html#a6ba99b9711269b5ab6ca091b88e81288',1,'FatPartition']]], - ['rootdirstart_819',['rootDirStart',['../class_fat_partition.html#a5d005e0f6fd4b84da8a5ebdea03aaf85',1,'FatPartition']]], - ['rootlength_820',['rootLength',['../class_ex_fat_partition.html#a9412bd687edc99266c88f8aa87f01c51',1,'ExFatPartition']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/mag_sel.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/mag_sel.png deleted file mode 100644 index 39c0ed52..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/mag_sel.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.html deleted file mode 100644 index 93c99f9d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.js deleted file mode 100644 index faf6c77d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/namespaces_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['fsdatetime_568',['FsDateTime',['../namespace_fs_date_time.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/nomatches.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/nomatches.html deleted file mode 100644 index 43773208..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/nomatches.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - -
    -
    No Matches
    -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.html deleted file mode 100644 index 32cbf498..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.js deleted file mode 100644 index ab055001..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/pages_0.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['arduino_20_25sdfat_20library_1046',['Arduino %SdFat Library',['../index.html',1,'']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.html deleted file mode 100644 index 530c782f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.js deleted file mode 100644 index 734377a9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['exfatfile_985',['ExFatFile',['../class_ex_fat_partition.html#a0ea68fb710b4ca007419acbf84ca6908',1,'ExFatPartition']]], - ['exfatvolume_986',['ExFatVolume',['../class_ex_fat_file.html#a064869383f7639b113eb0aaf0b84335c',1,'ExFatFile']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.html deleted file mode 100644 index 8bf9e071..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.js deleted file mode 100644 index f3e33b66..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/related_1.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['fatcache_987',['FatCache',['../class_fat_partition.html#a1e97a7aed860b898c403cb29455b3fe7',1,'FatPartition']]], - ['fatfile_988',['FatFile',['../class_fat_partition.html#a18fb15a715ea85037ab802286853103e',1,'FatPartition']]], - ['fatvolume_989',['FatVolume',['../class_fat_file.html#a6ca3f436167f187097347a20ea221555',1,'FatFile']]], - ['fsbasefile_990',['FsBaseFile',['../class_fs_volume.html#a1655636bca63e3ac7e7ab6a8d112a2f0',1,'FsVolume']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.css b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.css deleted file mode 100644 index 3cf9df94..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.css +++ /dev/null @@ -1,271 +0,0 @@ -/*---------------- Search Box */ - -#FSearchBox { - float: left; -} - -#MSearchBox { - white-space : nowrap; - float: none; - margin-top: 8px; - right: 0px; - width: 170px; - height: 24px; - z-index: 102; -} - -#MSearchBox .left -{ - display:block; - position:absolute; - left:10px; - width:20px; - height:19px; - background:url('search_l.png') no-repeat; - background-position:right; -} - -#MSearchSelect { - display:block; - position:absolute; - width:20px; - height:19px; -} - -.left #MSearchSelect { - left:4px; -} - -.right #MSearchSelect { - right:5px; -} - -#MSearchField { - display:block; - position:absolute; - height:19px; - background:url('search_m.png') repeat-x; - border:none; - width:115px; - margin-left:20px; - padding-left:4px; - color: #909090; - outline: none; - font: 9pt Arial, Verdana, sans-serif; - -webkit-border-radius: 0px; -} - -#FSearchBox #MSearchField { - margin-left:15px; -} - -#MSearchBox .right { - display:block; - position:absolute; - right:10px; - top:8px; - width:20px; - height:19px; - background:url('search_r.png') no-repeat; - background-position:left; -} - -#MSearchClose { - display: none; - position: absolute; - top: 4px; - background : none; - border: none; - margin: 0px 4px 0px 0px; - padding: 0px 0px; - outline: none; -} - -.left #MSearchClose { - left: 6px; -} - -.right #MSearchClose { - right: 2px; -} - -.MSearchBoxActive #MSearchField { - color: #000000; -} - -/*---------------- Search filter selection */ - -#MSearchSelectWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #90A5CE; - background-color: #F9FAFC; - z-index: 10001; - padding-top: 4px; - padding-bottom: 4px; - -moz-border-radius: 4px; - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); -} - -.SelectItem { - font: 8pt Arial, Verdana, sans-serif; - padding-left: 2px; - padding-right: 12px; - border: 0px; -} - -span.SelectionMark { - margin-right: 4px; - font-family: monospace; - outline-style: none; - text-decoration: none; -} - -a.SelectItem { - display: block; - outline-style: none; - color: #000000; - text-decoration: none; - padding-left: 6px; - padding-right: 12px; -} - -a.SelectItem:focus, -a.SelectItem:active { - color: #000000; - outline-style: none; - text-decoration: none; -} - -a.SelectItem:hover { - color: #FFFFFF; - background-color: #3D578C; - outline-style: none; - text-decoration: none; - cursor: pointer; - display: block; -} - -/*---------------- Search results window */ - -iframe#MSearchResults { - width: 60ex; - height: 15em; -} - -#MSearchResultsWindow { - display: none; - position: absolute; - left: 0; top: 0; - border: 1px solid #000; - background-color: #EEF1F7; - z-index:10000; -} - -/* ----------------------------------- */ - - -#SRIndex { - clear:both; - padding-bottom: 15px; -} - -.SREntry { - font-size: 10pt; - padding-left: 1ex; -} - -.SRPage .SREntry { - font-size: 8pt; - padding: 1px 5px; -} - -body.SRPage { - margin: 5px 2px; -} - -.SRChildren { - padding-left: 3ex; padding-bottom: .5em -} - -.SRPage .SRChildren { - display: none; -} - -.SRSymbol { - font-weight: bold; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRScope { - display: block; - color: #425E97; - font-family: Arial, Verdana, sans-serif; - text-decoration: none; - outline: none; -} - -a.SRSymbol:focus, a.SRSymbol:active, -a.SRScope:focus, a.SRScope:active { - text-decoration: underline; -} - -span.SRScope { - padding-left: 4px; -} - -.SRPage .SRStatus { - padding: 2px 5px; - font-size: 8pt; - font-style: italic; -} - -.SRResult { - display: none; -} - -DIV.searchresults { - margin-left: 10px; - margin-right: 10px; -} - -/*---------------- External search page results */ - -.searchresult { - background-color: #F0F3F8; -} - -.pages b { - color: white; - padding: 5px 5px 3px 5px; - background-image: url("../tab_a.png"); - background-repeat: repeat-x; - text-shadow: 0 1px 1px #000000; -} - -.pages { - line-height: 17px; - margin-left: 4px; - text-decoration: none; -} - -.hl { - font-weight: bold; -} - -#searchresults { - margin-bottom: 20px; -} - -.searchpages { - margin-top: 10px; -} - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.js deleted file mode 100644 index a554ab9c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/search.js +++ /dev/null @@ -1,814 +0,0 @@ -/* - @licstart The following is the entire license notice for the - JavaScript code in this file. - - Copyright (C) 1997-2017 by Dimitri van Heesch - - 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. - - @licend The above is the entire license notice - for the JavaScript code in this file - */ -function convertToId(search) -{ - var result = ''; - for (i=0;i do a search - { - this.Search(); - } - } - - this.OnSearchSelectKey = function(evt) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==40 && this.searchIndex0) // Up - { - this.searchIndex--; - this.OnSelectItem(this.searchIndex); - } - else if (e.keyCode==13 || e.keyCode==27) - { - this.OnSelectItem(this.searchIndex); - this.CloseSelectionWindow(); - this.DOMSearchField().focus(); - } - return false; - } - - // --------- Actions - - // Closes the results window. - this.CloseResultsWindow = function() - { - this.DOMPopupSearchResultsWindow().style.display = 'none'; - this.DOMSearchClose().style.display = 'none'; - this.Activate(false); - } - - this.CloseSelectionWindow = function() - { - this.DOMSearchSelectWindow().style.display = 'none'; - } - - // Performs a search. - this.Search = function() - { - this.keyTimeout = 0; - - // strip leading whitespace - var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); - - var code = searchValue.toLowerCase().charCodeAt(0); - var idxChar = searchValue.substr(0, 1).toLowerCase(); - if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair - { - idxChar = searchValue.substr(0, 2); - } - - var resultsPage; - var resultsPageWithSearch; - var hasResultsPage; - - var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); - if (idx!=-1) - { - var hexCode=idx.toString(16); - resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html'; - resultsPageWithSearch = resultsPage+'?'+escape(searchValue); - hasResultsPage = true; - } - else // nothing available for this search term - { - resultsPage = this.resultsPath + '/nomatches.html'; - resultsPageWithSearch = resultsPage; - hasResultsPage = false; - } - - window.frames.MSearchResults.location = resultsPageWithSearch; - var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); - - if (domPopupSearchResultsWindow.style.display!='block') - { - var domSearchBox = this.DOMSearchBox(); - this.DOMSearchClose().style.display = 'inline'; - if (this.insideFrame) - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - domPopupSearchResultsWindow.style.position = 'relative'; - domPopupSearchResultsWindow.style.display = 'block'; - var width = document.body.clientWidth - 8; // the -8 is for IE :-( - domPopupSearchResultsWindow.style.width = width + 'px'; - domPopupSearchResults.style.width = width + 'px'; - } - else - { - var domPopupSearchResults = this.DOMPopupSearchResults(); - var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; - var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; - domPopupSearchResultsWindow.style.display = 'block'; - left -= domPopupSearchResults.offsetWidth; - domPopupSearchResultsWindow.style.top = top + 'px'; - domPopupSearchResultsWindow.style.left = left + 'px'; - } - } - - this.lastSearchValue = searchValue; - this.lastResultsPage = resultsPage; - } - - // -------- Activation Functions - - // Activates or deactivates the search panel, resetting things to - // their default values if necessary. - this.Activate = function(isActive) - { - if (isActive || // open it - this.DOMPopupSearchResultsWindow().style.display == 'block' - ) - { - this.DOMSearchBox().className = 'MSearchBoxActive'; - - var searchField = this.DOMSearchField(); - - if (searchField.value == this.searchLabel) // clear "Search" term upon entry - { - searchField.value = ''; - this.searchActive = true; - } - } - else if (!isActive) // directly remove the panel - { - this.DOMSearchBox().className = 'MSearchBoxInactive'; - this.DOMSearchField().value = this.searchLabel; - this.searchActive = false; - this.lastSearchValue = '' - this.lastResultsPage = ''; - } - } -} - -// ----------------------------------------------------------------------- - -// The class that handles everything on the search results page. -function SearchResults(name) -{ - // The number of matches from the last run of . - this.lastMatchCount = 0; - this.lastKey = 0; - this.repeatOn = false; - - // Toggles the visibility of the passed element ID. - this.FindChildElement = function(id) - { - var parentElement = document.getElementById(id); - var element = parentElement.firstChild; - - while (element && element!=parentElement) - { - if (element.nodeName == 'DIV' && element.className == 'SRChildren') - { - return element; - } - - if (element.nodeName == 'DIV' && element.hasChildNodes()) - { - element = element.firstChild; - } - else if (element.nextSibling) - { - element = element.nextSibling; - } - else - { - do - { - element = element.parentNode; - } - while (element && element!=parentElement && !element.nextSibling); - - if (element && element!=parentElement) - { - element = element.nextSibling; - } - } - } - } - - this.Toggle = function(id) - { - var element = this.FindChildElement(id); - if (element) - { - if (element.style.display == 'block') - { - element.style.display = 'none'; - } - else - { - element.style.display = 'block'; - } - } - } - - // Searches for the passed string. If there is no parameter, - // it takes it from the URL query. - // - // Always returns true, since other documents may try to call it - // and that may or may not be possible. - this.Search = function(search) - { - if (!search) // get search word from URL - { - search = window.location.search; - search = search.substring(1); // Remove the leading '?' - search = unescape(search); - } - - search = search.replace(/^ +/, ""); // strip leading spaces - search = search.replace(/ +$/, ""); // strip trailing spaces - search = search.toLowerCase(); - search = convertToId(search); - - var resultRows = document.getElementsByTagName("div"); - var matches = 0; - - var i = 0; - while (i < resultRows.length) - { - var row = resultRows.item(i); - if (row.className == "SRResult") - { - var rowMatchName = row.id.toLowerCase(); - rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' - - if (search.length<=rowMatchName.length && - rowMatchName.substr(0, search.length)==search) - { - row.style.display = 'block'; - matches++; - } - else - { - row.style.display = 'none'; - } - } - i++; - } - document.getElementById("Searching").style.display='none'; - if (matches == 0) // no results - { - document.getElementById("NoMatches").style.display='block'; - } - else // at least one result - { - document.getElementById("NoMatches").style.display='none'; - } - this.lastMatchCount = matches; - return true; - } - - // return the first item with index index or higher that is visible - this.NavNext = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index++; - } - return focusItem; - } - - this.NavPrev = function(index) - { - var focusItem; - while (1) - { - var focusName = 'Item'+index; - focusItem = document.getElementById(focusName); - if (focusItem && focusItem.parentNode.parentNode.style.display=='block') - { - break; - } - else if (!focusItem) // last element - { - break; - } - focusItem=null; - index--; - } - return focusItem; - } - - this.ProcessKeys = function(e) - { - if (e.type == "keydown") - { - this.repeatOn = false; - this.lastKey = e.keyCode; - } - else if (e.type == "keypress") - { - if (!this.repeatOn) - { - if (this.lastKey) this.repeatOn = true; - return false; // ignore first keypress after keydown - } - } - else if (e.type == "keyup") - { - this.lastKey = 0; - this.repeatOn = false; - } - return this.lastKey!=0; - } - - this.Nav = function(evt,itemIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - var newIndex = itemIndex-1; - var focusItem = this.NavPrev(newIndex); - if (focusItem) - { - var child = this.FindChildElement(focusItem.parentNode.parentNode.id); - if (child && child.style.display == 'block') // children visible - { - var n=0; - var tmpElem; - while (1) // search for last child - { - tmpElem = document.getElementById('Item'+newIndex+'_c'+n); - if (tmpElem) - { - focusItem = tmpElem; - } - else // found it! - { - break; - } - n++; - } - } - } - if (focusItem) - { - focusItem.focus(); - } - else // return focus to search field - { - parent.document.getElementById("MSearchField").focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = itemIndex+1; - var focusItem; - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem && elem.style.display == 'block') // children visible - { - focusItem = document.getElementById('Item'+itemIndex+'_c0'); - } - if (!focusItem) focusItem = this.NavNext(newIndex); - if (focusItem) focusItem.focus(); - } - else if (this.lastKey==39) // Right - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'block'; - } - else if (this.lastKey==37) // Left - { - var item = document.getElementById('Item'+itemIndex); - var elem = this.FindChildElement(item.parentNode.parentNode.id); - if (elem) elem.style.display = 'none'; - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } - - this.NavChild = function(evt,itemIndex,childIndex) - { - var e = (evt) ? evt : window.event; // for IE - if (e.keyCode==13) return true; - if (!this.ProcessKeys(e)) return false; - - if (this.lastKey==38) // Up - { - if (childIndex>0) - { - var newIndex = childIndex-1; - document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); - } - else // already at first child, jump to parent - { - document.getElementById('Item'+itemIndex).focus(); - } - } - else if (this.lastKey==40) // Down - { - var newIndex = childIndex+1; - var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); - if (!elem) // last child, jump to parent next parent - { - elem = this.NavNext(itemIndex+1); - } - if (elem) - { - elem.focus(); - } - } - else if (this.lastKey==27) // Escape - { - parent.searchBox.CloseResultsWindow(); - parent.document.getElementById("MSearchField").focus(); - } - else if (this.lastKey==13) // Enter - { - return true; - } - return false; - } -} - -function setKeyActions(elem,action) -{ - elem.setAttribute('onkeydown',action); - elem.setAttribute('onkeypress',action); - elem.setAttribute('onkeyup',action); -} - -function setClassAttr(elem,attr) -{ - elem.setAttribute('class',attr); - elem.setAttribute('className',attr); -} - -function createResults() -{ - var results = document.getElementById("SRResults"); - for (var e=0; e - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_0.js deleted file mode 100644 index 690392b8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['file_964',['File',['../_sd_fat_8h.html#aa0ffd23c3e43af0bcbd2fb4d62f3286d',1,'SdFat.h']]], - ['fmtflags_965',['fmtflags',['../classios__base.html#ac9a54e52cef4f01ac0afd8ae896a3413',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.html deleted file mode 100644 index 0cfdad74..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.js deleted file mode 100644 index e27a46fb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_1.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['iostate_966',['iostate',['../classios__base.html#aef19291eeae0f072ac42c6ba1fe3033c',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.html deleted file mode 100644 index d633f0ce..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.js deleted file mode 100644 index 219293b2..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_2.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['off_5ftype_967',['off_type',['../classios__base.html#a45de7cca0d01da781f4b886179c65c22',1,'ios_base']]], - ['openmode_968',['openmode',['../classios__base.html#aaa192ec0dccc43050715553a34644523',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.html deleted file mode 100644 index 6a6421d3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.js deleted file mode 100644 index 00b846e6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_3.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['pos_5ft_969',['pos_t',['../ios_8h.html#aae8adaedc486a4b2f67576fdeaf0a585',1,'ios.h']]], - ['pos_5ftype_970',['pos_type',['../classios__base.html#abe85cf1f181b8bce8022f05ab76aae7f',1,'ios_base']]], - ['print_5ft_971',['print_t',['../_sys_call_8h.html#ac62f6449331cfe1a71f29be30efe7890',1,'SysCall.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.html deleted file mode 100644 index 517e61d3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.js deleted file mode 100644 index efd42d57..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/typedefs_4.js +++ /dev/null @@ -1,12 +0,0 @@ -var searchData= -[ - ['sdbasefile_972',['SdBaseFile',['../_sd_fat_8h.html#a3991b0f70199d1a17dbb837bb041e89c',1,'SdFat.h']]], - ['sdcspin_5ft_973',['SdCsPin_t',['../_sd_fat_config_8h.html#a7a489fb14a59adf251794342604fc5ea',1,'SdFatConfig.h']]], - ['sdfat_974',['SdFat',['../_sd_fat_8h.html#a6e295d38f798fdc044c3282818cdb064',1,'SdFat.h']]], - ['sdmillis_5ft_975',['SdMillis_t',['../_sys_call_8h.html#a94fe72e6e55572f63ac9d8fbad429980',1,'SysCall.h']]], - ['sdspidriver_976',['SdSpiDriver',['../_sd_spi_arduino_driver_8h.html#a737a41f87fd0d1824d87d83a1f976c14',1,'SdSpiDriver(): SdSpiArduinoDriver.h'],['../_sd_spi_soft_driver_8h.html#a8990c69a7a6a738c2e74dc155a98430b',1,'SdSpiDriver(): SdSpiSoftDriver.h']]], - ['spiport_5ft_977',['SpiPort_t',['../_sd_spi_driver_8h.html#a472d56ea7cb52ec5d68b3067baa000c3',1,'SdSpiDriver.h']]], - ['stream_5ft_978',['stream_t',['../_sys_call_8h.html#a708fe172ce8f40fdb50a2df8c567d07a',1,'SysCall.h']]], - ['streambasefile_979',['StreamBaseFile',['../ios_8h.html#a77934df7b6e6d581c762dd387e2b5162',1,'ios.h']]], - ['streamsize_980',['streamsize',['../classios__base.html#a82836e1d3cc603fba8f0b54d323a2dff',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.html deleted file mode 100644 index a2a3ae62..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.js deleted file mode 100644 index e47a4d04..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_0.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['_5f_5fbrkval_887',['__brkval',['../_free_stack_8h.html#ad193a2cc121e0d4614a1c21eb463fb56',1,'FreeStack.h']]], - ['_5f_5fbss_5fend_888',['__bss_end',['../_free_stack_8h.html#adbad17f740c2d7f2bc4833681c93c932',1,'FreeStack.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.html deleted file mode 100644 index b243c423..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.js deleted file mode 100644 index 27270f44..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_1.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['adjustfield_889',['adjustfield',['../classios__base.html#adaaf735381254aa096ebe3605e8bbd0a',1,'ios_base']]], - ['always1_890',['always1',['../struct_c_i_d.html#ae9d4ba51ed4102255aa87bb92882f119',1,'CID']]], - ['app_891',['app',['../classios__base.html#a8380aac3c405730708888fdc68905820',1,'ios_base']]], - ['ate_892',['ate',['../classios__base.html#aa434355c165500065276d955d8b36e99',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.html deleted file mode 100644 index 65dd8af3..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.js deleted file mode 100644 index 8c7ad7e7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_10.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['trunc_960',['trunc',['../classios__base.html#ae62b8972f37509819e1384214071194b',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.html deleted file mode 100644 index f95ad58a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.js deleted file mode 100644 index 229ca593..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_11.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['ungetc_5fbuf_5fsize_961',['UNGETC_BUF_SIZE',['../_stdio_stream_8h.html#a785dd413c0d7b05f95df82d3453ecacd',1,'StdioStream.h']]], - ['uppercase_962',['uppercase',['../classios__base.html#ade3db1fe3249e87f4c47a9a8916793d9',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.html deleted file mode 100644 index aa74a8d6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.js deleted file mode 100644 index 118c50b5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_12.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['w_963',['w',['../structsetw.html#ab48d915a24d3f3365c9eb76e138a6f4e',1,'setw']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.html deleted file mode 100644 index 647df20f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.js deleted file mode 100644 index 519902be..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_2.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['badbit_893',['badbit',['../classios__base.html#ac8c2c8f2f6bc9e6ce101c20e88ebce35',1,'ios_base']]], - ['basefield_894',['basefield',['../classios__base.html#a75ce5482aa207d7aa0265d138b50a102',1,'ios_base']]], - ['binary_895',['binary',['../classios__base.html#ac99947c17c2936d15243671366605602',1,'ios_base']]], - ['boolalpha_896',['boolalpha',['../classios__base.html#afa74acd95d4bbc7cc3551251aac2bf00',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.html deleted file mode 100644 index 9dc9b89e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.js deleted file mode 100644 index b909cef7..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_3.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['c_897',['c',['../structsetfill.html#a42ffb4e6135c1274ae827cfed7793a82',1,'setfill']]], - ['cache_5ffor_5fread_898',['CACHE_FOR_READ',['../class_fs_cache.html#a1df1d63f86fcf36e1ae08a48a05ead8b',1,'FsCache::CACHE_FOR_READ()'],['../class_fat_cache.html#ab4b446515ff9a0cebc747630ddd10c93',1,'FatCache::CACHE_FOR_READ()']]], - ['cache_5ffor_5fwrite_899',['CACHE_FOR_WRITE',['../class_fs_cache.html#ade321e6538ffc77c7f36ea200decaa6f',1,'FsCache::CACHE_FOR_WRITE()'],['../class_fat_cache.html#a81cb572f33443bd6aee9aa33ec395d0f',1,'FatCache::CACHE_FOR_WRITE()']]], - ['cache_5foption_5fno_5fread_900',['CACHE_OPTION_NO_READ',['../class_fs_cache.html#ab694436995afb87d6e31693b47811243',1,'FsCache::CACHE_OPTION_NO_READ()'],['../class_fat_cache.html#adf974f55e53ee0aaa85abb0d7d67181c',1,'FatCache::CACHE_OPTION_NO_READ()']]], - ['cache_5freserve_5ffor_5fwrite_901',['CACHE_RESERVE_FOR_WRITE',['../class_fs_cache.html#ae960459db6fda0de3d67768d3b59331d',1,'FsCache::CACHE_RESERVE_FOR_WRITE()'],['../class_fat_cache.html#a49d2896ff525ab77852f76df5c2a09c2',1,'FatCache::CACHE_RESERVE_FOR_WRITE()']]], - ['cache_5fstatus_5fdirty_902',['CACHE_STATUS_DIRTY',['../class_fs_cache.html#a9d83a0401f452c0572c4c4f869b698ab',1,'FsCache::CACHE_STATUS_DIRTY()'],['../class_fat_cache.html#aac8c38e5c545d0f80b13d816117f626e',1,'FatCache::CACHE_STATUS_DIRTY()']]], - ['cache_5fstatus_5fmask_903',['CACHE_STATUS_MASK',['../class_fs_cache.html#abb6b6426373bb591f027ac29eca4bacb',1,'FsCache::CACHE_STATUS_MASK()'],['../class_fat_cache.html#ab70dc4a2e387f0e9bf392044c702ae32',1,'FatCache::CACHE_STATUS_MASK()']]], - ['cache_5fstatus_5fmirror_5ffat_904',['CACHE_STATUS_MIRROR_FAT',['../class_fat_cache.html#a45236e1c0a2a098f08d3add0e4b1467a',1,'FatCache']]], - ['callback_905',['callback',['../namespace_fs_date_time.html#ab4e1acabf30bc682af20e1cc93330a6a',1,'FsDateTime']]], - ['callback2_906',['callback2',['../namespace_fs_date_time.html#a1c19b53a8b6c93d38a4bb2f2981a4efa',1,'FsDateTime']]], - ['cluster_907',['cluster',['../struct_ex_fat_pos__t.html#aef933f72a904d60398285bd0d833ee24',1,'ExFatPos_t::cluster()'],['../struct_dir_pos__t.html#a11898149ae53f0b189c6b13590c60a5f',1,'DirPos_t::cluster()'],['../struct_fat_pos__t.html#a7b50657b0debaf0e6231af2c74a655fe',1,'FatPos_t::cluster()']]], - ['crc_908',['crc',['../struct_c_i_d.html#aa10cfc5aef8e979e47009474dfa3d940',1,'CID']]], - ['cspin_909',['csPin',['../class_sd_spi_config.html#a0c1797197fbd4e4c4499daf4b51628e6',1,'SdSpiConfig']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.html deleted file mode 100644 index 78cc2c70..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.js deleted file mode 100644 index 41a59db5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_4.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['data_910',['data',['../unioncache__t.html#ae675b7a3a87d809070de111d1d1f1d81',1,'cache_t']]], - ['dec_911',['dec',['../classios__base.html#a2826aed005e7c1f6858060cddae7971a',1,'ios_base']]], - ['dir_912',['dir',['../unioncache__t.html#a04a7472d08f2545d6db7804c82c99d7c',1,'cache_t']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.html deleted file mode 100644 index dfa35588..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.js deleted file mode 100644 index 85b5c529..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_5.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['eofbit_913',['eofbit',['../classios__base.html#af75072b7ef2a931c77a2cb8e7ccda460',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.html deleted file mode 100644 index cd462bde..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.js deleted file mode 100644 index 6a0c3f6b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_6.js +++ /dev/null @@ -1,16 +0,0 @@ -var searchData= -[ - ['failbit_914',['failbit',['../classios__base.html#a36157154001bcce17827db6786e35efd',1,'ios_base']]], - ['fat16_915',['fat16',['../unioncache__t.html#a8f3a4e9392a7d8ace954fc44c57df887',1,'cache_t']]], - ['fat32_916',['fat32',['../unioncache__t.html#a57e16421bf460d1ba6cb9ce9a23a4a83',1,'cache_t']]], - ['fat_5ftype_5fexfat_917',['FAT_TYPE_EXFAT',['../_ex_fat_partition_8h.html#ad74089b317bc77bd1e8cbb56fef8046a',1,'ExFatPartition.h']]], - ['fat_5ftype_5ffat12_918',['FAT_TYPE_FAT12',['../_fat_partition_8h.html#a2914ab2ce1d4cff984ad93b922e99d50',1,'FatPartition.h']]], - ['fat_5ftype_5ffat16_919',['FAT_TYPE_FAT16',['../_fat_partition_8h.html#a586e7b4151f14bd56b78a836855c0f55',1,'FatPartition.h']]], - ['fat_5ftype_5ffat32_920',['FAT_TYPE_FAT32',['../_fat_partition_8h.html#a63da6e74b3bce481580263cebb591d5e',1,'FatPartition.h']]], - ['flags_921',['flags',['../structfname__t.html#a39c69edff13165c6e03b308104e7286d',1,'fname_t']]], - ['fname_5fflag_5flc_5fbase_922',['FNAME_FLAG_LC_BASE',['../_fat_file_8h.html#a79e43960e1b4eecf274f5faea9c3168c',1,'FatFile.h']]], - ['fname_5fflag_5flc_5fext_923',['FNAME_FLAG_LC_EXT',['../_fat_file_8h.html#a135b7572768b09661aa38afaceec7296',1,'FatFile.h']]], - ['fname_5fflag_5flost_5fchars_924',['FNAME_FLAG_LOST_CHARS',['../_fat_file_8h.html#acd45286b7dfc5ba68be18c8c3a9d298d',1,'FatFile.h']]], - ['fname_5fflag_5fmixed_5fcase_925',['FNAME_FLAG_MIXED_CASE',['../_fat_file_8h.html#a63994c21f3b723a55247f063a1b01c9c',1,'FatFile.h']]], - ['fname_5fflag_5fneed_5flfn_926',['FNAME_FLAG_NEED_LFN',['../_fat_file_8h.html#a1a041207a19d2fd9a1e2739343ccb29b',1,'FatFile.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.html deleted file mode 100644 index 47994b80..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.js deleted file mode 100644 index a1c647da..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_7.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['goodbit_927',['goodbit',['../classios__base.html#a07a00996a6e525b88bdfe7935d5ead05',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.html deleted file mode 100644 index a50ee8f5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.js deleted file mode 100644 index 25e88236..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_8.js +++ /dev/null @@ -1,4 +0,0 @@ -var searchData= -[ - ['hex_928',['hex',['../classios__base.html#a3608e51eb0a80ea94ddadd5b713a3750',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.html deleted file mode 100644 index 82db8aed..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.js deleted file mode 100644 index 4a217bc0..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_9.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['in_929',['in',['../classios__base.html#ae5432e3c269064480652c4602f5f74ad',1,'ios_base']]], - ['internal_930',['internal',['../classios__base.html#afc720b7f6f461ec8e9cf5505059e5d7c',1,'ios_base']]], - ['iscontiguous_931',['isContiguous',['../struct_dir_pos__t.html#a7bea047144551b24c5aa301dc8dd44d7',1,'DirPos_t']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.html deleted file mode 100644 index fd8f0d75..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.js deleted file mode 100644 index bcb7af69..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_a.js +++ /dev/null @@ -1,6 +0,0 @@ -var searchData= -[ - ['left_932',['left',['../classios__base.html#ad364df9af2cfde1f40bd8e10c62bb215',1,'ios_base']]], - ['len_933',['len',['../struct_ex_name__t.html#a4c1c36c08b96a553854ac16c8309cd93',1,'ExName_t::len()'],['../structfname__t.html#a471184cc4c2671526d7d6fb80b2fe20c',1,'fname_t::len()']]], - ['lfn_934',['lfn',['../struct_ex_name__t.html#afcdcceaf5309a7b6e21ddbf15e5b83cb',1,'ExName_t::lfn()'],['../structfname__t.html#a76ffd7abd5b7d3acf90b329c905770fd',1,'fname_t::lfn()']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.html deleted file mode 100644 index 577a4b71..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.js deleted file mode 100644 index bcbeeb63..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_b.js +++ /dev/null @@ -1,8 +0,0 @@ -var searchData= -[ - ['maxsck_935',['maxSck',['../class_sd_spi_config.html#ac1afd080e2baa2b6eb81331ed5180f37',1,'SdSpiConfig']]], - ['mdt_5fmonth_936',['mdt_month',['../struct_c_i_d.html#a60e35d4b824da135dc2a9197c5544929',1,'CID']]], - ['mdt_5fyear_5fhigh_937',['mdt_year_high',['../struct_c_i_d.html#a6b16c5e74b48af39036aa831fca4cb46',1,'CID']]], - ['mdt_5fyear_5flow_938',['mdt_year_low',['../struct_c_i_d.html#afe44a84b416bea68dea9bad27c172c3d',1,'CID']]], - ['mid_939',['mid',['../struct_c_i_d.html#aa77436aa64a8a0e80573ade765039d2f',1,'CID']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.html deleted file mode 100644 index 0b92edbb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.js deleted file mode 100644 index 6eb6da0d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_c.js +++ /dev/null @@ -1,7 +0,0 @@ -var searchData= -[ - ['oct_940',['oct',['../classios__base.html#a4155540f8d3ffdb8d25a2f50ee4df08f',1,'ios_base']]], - ['oid_941',['oid',['../struct_c_i_d.html#a12cb950aa46c62c8af1e530006f97031',1,'CID']]], - ['options_942',['options',['../class_sd_spi_config.html#a6292855eeea89636ad2b4da9675dbc96',1,'SdSpiConfig']]], - ['out_943',['out',['../classios__base.html#a4c1d517774c0d11af3424e90395f26ae',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.html deleted file mode 100644 index 8b53e604..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.js deleted file mode 100644 index 34afaf4b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_d.js +++ /dev/null @@ -1,9 +0,0 @@ -var searchData= -[ - ['p_944',['p',['../structsetprecision.html#a7cb7bb355a303fa39a8035615bde9348',1,'setprecision']]], - ['pnm_945',['pnm',['../struct_c_i_d.html#a6484cd56fc4bacfa815c12d8682129ba',1,'CID']]], - ['position_946',['position',['../struct_ex_fat_pos__t.html#abfab79daf5a2df281ebf3c5dad204f23',1,'ExFatPos_t::position()'],['../struct_dir_pos__t.html#a6cef96844ecd8e9972df860bacc04f24',1,'DirPos_t::position()'],['../struct_fat_pos__t.html#a8e14c6f2705777502b543452743eaa26',1,'FatPos_t::position()']]], - ['prv_5fm_947',['prv_m',['../struct_c_i_d.html#a142fd792bb74d7af1f0fb62833ae053b',1,'CID']]], - ['prv_5fn_948',['prv_n',['../struct_c_i_d.html#ae50f389a50daf99d15d1ea7ce2d426cf',1,'CID']]], - ['psn_949',['psn',['../struct_c_i_d.html#ada215f8541fa46078461d8da9574fc5e',1,'CID']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.html deleted file mode 100644 index abb7aa17..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.js deleted file mode 100644 index 607fd47f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_e.js +++ /dev/null @@ -1,5 +0,0 @@ -var searchData= -[ - ['reserved_950',['reserved',['../struct_c_i_d.html#a7d489455802a3a9728a5cec60927a7c7',1,'CID']]], - ['right_951',['right',['../classios__base.html#aec064a12730b5d87e718c1864e29ac64',1,'ios_base']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.html deleted file mode 100644 index 5458b946..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.html +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - -
    -
    Loading...
    -
    - -
    Searching...
    -
    No Matches
    - -
    - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.js b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.js deleted file mode 100644 index 9e0c093f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/search/variables_f.js +++ /dev/null @@ -1,11 +0,0 @@ -var searchData= -[ - ['seqpos_952',['seqPos',['../structfname__t.html#a96b7c779dec8dd568be3290451078a4e',1,'fname_t']]], - ['sfn_953',['sfn',['../structfname__t.html#a37ed0c108b1feb81be4f8c041a4336bd',1,'fname_t']]], - ['showbase_954',['showbase',['../classios__base.html#a7e3373ab307feecfc228bc9bdb29cd01',1,'ios_base']]], - ['showpoint_955',['showpoint',['../classios__base.html#ac9bb172682e157f037bd7fb82a236ee6',1,'ios_base']]], - ['showpos_956',['showpos',['../classios__base.html#a7bfa4a883933105d10f8ce2693cb9f21',1,'ios_base']]], - ['skipws_957',['skipws',['../classios__base.html#a64977c777d6e45826d1be9763f17f824',1,'ios_base']]], - ['spiport_958',['spiPort',['../class_sd_spi_config.html#aedaada290c35b55d36671ca377620480',1,'SdSpiConfig']]], - ['stream_5fbuf_5fsize_959',['STREAM_BUF_SIZE',['../_stdio_stream_8h.html#ad9a6150ef11e2616c1a99bc777df17d3',1,'StdioStream.h']]] -]; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/splitbar.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/splitbar.png deleted file mode 100644 index fe895f2c..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/splitbar.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d-members.html deleted file mode 100644 index 36e86596..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d-members.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    CID Member List
    -
    -
    - -

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

    - - - - - - - - - - - - - -
    always1CID
    crcCID
    mdt_monthCID
    mdt_year_highCID
    mdt_year_lowCID
    midCID
    oidCID
    pnmCID
    prv_mCID
    prv_nCID
    psnCID
    reservedCID
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d.html deleted file mode 100644 index 2d7f2fc5..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_c_i_d.html +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - -SdFat: CID Class Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    CID Class Reference
    -
    -
    - -

    Card IDentification (CID) register. - More...

    - -

    #include <SdCardInfo.h>

    - - - - - - - - - - - - - - - - - - - - - - - - - - -

    -Public Attributes

    unsigned char always1: 1
     
    unsigned char crc: 7
     
    unsigned char mdt_month: 4
     
    unsigned char mdt_year_high: 4
     
    unsigned char mdt_year_low: 4
     
    unsigned char mid
     
    char oid [2]
     
    char pnm [5]
     
    unsigned char prv_m: 4
     
    unsigned char prv_n: 4
     
    uint32_t psn
     
    unsigned char reserved: 4
     
    -

    Detailed Description

    -

    Card IDentification (CID) register.

    -

    Member Data Documentation

    - -

    ◆ always1

    - -
    -
    - - - - -
    unsigned char CID::always1
    -
    -

    not used always 1

    - -
    -
    - -

    ◆ crc

    - -
    -
    - - - - -
    unsigned char CID::crc
    -
    -

    CRC7 checksum

    - -
    -
    - -

    ◆ mdt_month

    - -
    -
    - - - - -
    unsigned char CID::mdt_month
    -
    -

    Manufacturing date month

    - -
    -
    - -

    ◆ mdt_year_high

    - -
    -
    - - - - -
    unsigned char CID::mdt_year_high
    -
    -

    Manufacturing date year high digit

    - -
    -
    - -

    ◆ mdt_year_low

    - -
    -
    - - - - -
    unsigned char CID::mdt_year_low
    -
    -

    Manufacturing date year low digit

    - -
    -
    - -

    ◆ mid

    - -
    -
    - - - - -
    unsigned char CID::mid
    -
    -

    Manufacturer ID

    - -
    -
    - -

    ◆ oid

    - -
    -
    - - - - -
    char CID::oid[2]
    -
    -

    OEM/Application ID

    - -
    -
    - -

    ◆ pnm

    - -
    -
    - - - - -
    char CID::pnm[5]
    -
    -

    Product name

    - -
    -
    - -

    ◆ prv_m

    - -
    -
    - - - - -
    unsigned char CID::prv_m
    -
    -

    Product revision least significant digit

    - -
    -
    - -

    ◆ prv_n

    - -
    -
    - - - - -
    unsigned char CID::prv_n
    -
    -

    Product revision most significant digit

    - -
    -
    - -

    ◆ psn

    - -
    -
    - - - - -
    uint32_t CID::psn
    -
    -

    Product serial number

    - -
    -
    - -

    ◆ reserved

    - -
    -
    - - - - -
    unsigned char CID::reserved
    -
    -

    not used

    - -
    -
    -
    The documentation for this class was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/SdCard/SdCardInfo.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t-members.html deleted file mode 100644 index 64fa507f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    DirPos_t Member List
    -
    -
    - -

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

    - - - - -
    clusterDirPos_t
    isContiguousDirPos_t
    positionDirPos_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t.html deleted file mode 100644 index 360e5341..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_dir_pos__t.html +++ /dev/null @@ -1,145 +0,0 @@ - - - - - - - -SdFat: DirPos_t Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    DirPos_t Struct Reference
    -
    -
    - -

    Internal type for position in directory file. - More...

    - -

    #include <ExFatTypes.h>

    - - - - - - - - -

    -Public Attributes

    uint32_t cluster
     
    bool isContiguous
     
    uint32_t position
     
    -

    Detailed Description

    -

    Internal type for position in directory file.

    -

    Member Data Documentation

    - -

    ◆ cluster

    - -
    -
    - - - - -
    uint32_t DirPos_t::cluster
    -
    -

    current cluster

    - -
    -
    - -

    ◆ isContiguous

    - -
    -
    - - - - -
    bool DirPos_t::isContiguous
    -
    -

    directory is contiguous

    - -
    -
    - -

    ◆ position

    - -
    -
    - - - - -
    uint32_t DirPos_t::position
    -
    -

    offset

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/ExFatLib/ExFatTypes.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t-members.html deleted file mode 100644 index 0760b3cc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    ExFatPos_t Member List
    -
    -
    - -

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

    - - - - -
    clusterExFatPos_t
    ExFatPos_t() (defined in ExFatPos_t)ExFatPos_tinline
    positionExFatPos_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t.html deleted file mode 100644 index 6905b936..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_fat_pos__t.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -SdFat: ExFatPos_t Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    ExFatPos_t Struct Reference
    -
    -
    - -

    Internal type for file position - do not use in user apps. - More...

    - -

    #include <ExFatFile.h>

    - - - - - - -

    -Public Attributes

    uint32_t cluster
     
    uint64_t position
     
    -

    Detailed Description

    -

    Internal type for file position - do not use in user apps.

    -

    Member Data Documentation

    - -

    ◆ cluster

    - -
    -
    - - - - -
    uint32_t ExFatPos_t::cluster
    -
    -

    cluster for position

    - -
    -
    - -

    ◆ position

    - -
    -
    - - - - -
    uint64_t ExFatPos_t::position
    -
    -

    stream position

    - -
    -
    -
    The documentation for this struct was generated from the following file: -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t-members.html deleted file mode 100644 index b170184e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t-members.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    ExName_t Member List
    -
    -
    - -

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

    - - - -
    lenExName_t
    lfnExName_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t.html deleted file mode 100644 index 53dfde3c..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_ex_name__t.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -SdFat: ExName_t Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    ExName_t Struct Reference
    -
    -
    - -

    Internal type for file name - do not use in user apps. - More...

    - -

    #include <ExFatFile.h>

    - - - - - - -

    -Public Attributes

    size_t len
     
    const ExChar_t * lfn
     
    -

    Detailed Description

    -

    Internal type for file name - do not use in user apps.

    -

    Member Data Documentation

    - -

    ◆ len

    - -
    -
    - - - - -
    size_t ExName_t::len
    -
    -

    length of Long File Name

    - -
    -
    - -

    ◆ lfn

    - -
    -
    - - - - -
    const ExChar_t* ExName_t::lfn
    -
    -

    Long File Name start.

    - -
    -
    -
    The documentation for this struct was generated from the following file: -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t-members.html deleted file mode 100644 index 1539d52f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t-members.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    FatPos_t Member List
    -
    -
    - -

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

    - - - - -
    clusterFatPos_t
    FatPos_t() (defined in FatPos_t)FatPos_tinline
    positionFatPos_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t.html deleted file mode 100644 index d2a2fb3f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/struct_fat_pos__t.html +++ /dev/null @@ -1,128 +0,0 @@ - - - - - - - -SdFat: FatPos_t Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    FatPos_t Struct Reference
    -
    -
    - -

    Internal type for file position - do not use in user apps. - More...

    - -

    #include <FatFile.h>

    - - - - - - -

    -Public Attributes

    uint32_t cluster
     
    uint32_t position
     
    -

    Detailed Description

    -

    Internal type for file position - do not use in user apps.

    -

    Member Data Documentation

    - -

    ◆ cluster

    - -
    -
    - - - - -
    uint32_t FatPos_t::cluster
    -
    -

    cluster for position

    - -
    -
    - -

    ◆ position

    - -
    -
    - - - - -
    uint32_t FatPos_t::position
    -
    -

    stream position

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/FatLib/FatFile.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t-members.html deleted file mode 100644 index 083b39d8..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t-members.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    fname_t Member List
    -
    -
    - -

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

    - - - - - - -
    flagsfname_t
    lenfname_t
    lfnfname_t
    seqPosfname_t
    sfnfname_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t.html deleted file mode 100644 index dba4425d..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structfname__t.html +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - -SdFat: fname_t Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    fname_t Struct Reference
    -
    -
    - -

    Internal type for Short File Name - do not use in user apps. - More...

    - -

    #include <FatFile.h>

    - - - - - - - - - - - - -

    -Public Attributes

    uint8_t flags
     
    size_t len
     
    const char * lfn
     
    uint8_t seqPos
     
    uint8_t sfn [11]
     
    -

    Detailed Description

    -

    Internal type for Short File Name - do not use in user apps.

    -

    Member Data Documentation

    - -

    ◆ flags

    - -
    -
    - - - - -
    uint8_t fname_t::flags
    -
    -

    Flags for base and extension character case and LFN.

    - -
    -
    - -

    ◆ len

    - -
    -
    - - - - -
    size_t fname_t::len
    -
    -

    length of Long File Name

    - -
    -
    - -

    ◆ lfn

    - -
    -
    - - - - -
    const char* fname_t::lfn
    -
    -

    Long File Name start.

    - -
    -
    - -

    ◆ seqPos

    - -
    -
    - - - - -
    uint8_t fname_t::seqPos
    -
    -

    position for sequence number

    - -
    -
    - -

    ◆ sfn

    - -
    -
    - - - - -
    uint8_t fname_t::sfn[11]
    -
    -

    Short File Name

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/FatLib/FatFile.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill-members.html deleted file mode 100644 index 6651d03b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill-members.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    setfill Member List
    -
    -
    - -

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

    - - - -
    csetfill
    setfill(char arg)setfillinlineexplicit
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill.html deleted file mode 100644 index 82c0538a..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetfill.html +++ /dev/null @@ -1,151 +0,0 @@ - - - - - - - -SdFat: setfill Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    setfill Struct Reference
    -
    -
    - -

    type for setfill manipulator - More...

    - -

    #include <iostream.h>

    - - - - -

    -Public Member Functions

     setfill (char arg)
     
    - - - -

    -Public Attributes

    char c
     
    -

    Detailed Description

    -

    type for setfill manipulator

    -

    Constructor & Destructor Documentation

    - -

    ◆ setfill()

    - -
    -
    - - - - - -
    - - - - - - - - -
    setfill::setfill (char arg)
    -
    -inlineexplicit
    -
    -

    constructor

    -
    Parameters
    - - -
    [in]argnew fill character
    -
    -
    - -
    -
    -

    Member Data Documentation

    - -

    ◆ c

    - -
    -
    - - - - -
    char setfill::c
    -
    -

    fill character

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/iostream/iostream.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision-members.html deleted file mode 100644 index a7a4d0bf..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision-members.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    setprecision Member List
    -
    -
    - -

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

    - - - -
    psetprecision
    setprecision(unsigned int arg)setprecisioninlineexplicit
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision.html deleted file mode 100644 index 3e6fe8b9..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetprecision.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - -SdFat: setprecision Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    setprecision Struct Reference
    -
    -
    - -

    type for setprecision manipulator - More...

    - -

    #include <iostream.h>

    - - - - -

    -Public Member Functions

     setprecision (unsigned int arg)
     
    - - - -

    -Public Attributes

    unsigned int p
     
    -

    Detailed Description

    -

    type for setprecision manipulator

    -

    Constructor & Destructor Documentation

    - -

    ◆ setprecision()

    - -
    -
    - - - - - -
    - - - - - - - - -
    setprecision::setprecision (unsigned int arg)
    -
    -inlineexplicit
    -
    -

    constructor

    Parameters
    - - -
    [in]argnew precision
    -
    -
    - -
    -
    -

    Member Data Documentation

    - -

    ◆ p

    - -
    -
    - - - - -
    unsigned int setprecision::p
    -
    -

    precision

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/iostream/iostream.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw-members.html deleted file mode 100644 index 3aa8d611..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw-members.html +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    setw Member List
    -
    -
    - -

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

    - - - -
    setw(unsigned arg)setwinlineexplicit
    wsetw
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw.html deleted file mode 100644 index 1cb631dc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/structsetw.html +++ /dev/null @@ -1,150 +0,0 @@ - - - - - - - -SdFat: setw Struct Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    - -
    - -

    type for setw manipulator - More...

    - -

    #include <iostream.h>

    - - - - -

    -Public Member Functions

     setw (unsigned arg)
     
    - - - -

    -Public Attributes

    unsigned w
     
    -

    Detailed Description

    -

    type for setw manipulator

    -

    Constructor & Destructor Documentation

    - -

    ◆ setw()

    - -
    -
    - - - - - -
    - - - - - - - - -
    setw::setw (unsigned arg)
    -
    -inlineexplicit
    -
    -

    constructor

    Parameters
    - - -
    [in]argnew width
    -
    -
    - -
    -
    -

    Member Data Documentation

    - -

    ◆ w

    - -
    -
    - - - - -
    unsigned setw::w
    -
    -

    width

    - -
    -
    -
    The documentation for this struct was generated from the following file:
      -
    • Arduino/libraries/SdFat/src/iostream/iostream.h
    • -
    -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_off.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_off.png deleted file mode 100644 index 3b443fc6..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_off.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_on.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_on.png deleted file mode 100644 index e08320fb..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/sync_on.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_a.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_a.png deleted file mode 100644 index 3b725c41..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_a.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_b.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_b.png deleted file mode 100644 index e2b4a863..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_b.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_h.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_h.png deleted file mode 100644 index fd5cb705..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_h.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_s.png b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_s.png deleted file mode 100644 index ab478c95..00000000 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tab_s.png and /dev/null differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tabs.css b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tabs.css deleted file mode 100644 index 85a0cd5b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/tabs.css +++ /dev/null @@ -1 +0,0 @@ -.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t-members.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t-members.html deleted file mode 100644 index 29edb0f6..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t-members.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - -SdFat: Member List - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    -
    -
    cache_t Member List
    -
    -
    - -

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

    - - - - - -
    datacache_t
    dircache_t
    fat16cache_t
    fat32cache_t
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t.html b/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t.html deleted file mode 100644 index 8c8999fc..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/html/unioncache__t.html +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - -SdFat: cache_t Union Reference - - - - - - - - - -
    -
    - - - - - - -
    -
    SdFat -
    -
    -
    - - - - - - - - -
    -
    - - -
    - -
    - -
    -
    - -
    -
    cache_t Union Reference
    -
    -
    - -

    Cache for an raw data sector. - More...

    - -

    #include <FatPartition.h>

    - - - - - - - - - - -

    -Public Attributes

    uint8_t data [512]
     
    DirFat_t dir [16]
     
    uint16_t fat16 [256]
     
    uint32_t fat32 [128]
     
    -

    Detailed Description

    -

    Cache for an raw data sector.

    -

    Member Data Documentation

    - -

    ◆ data

    - -
    -
    - - - - -
    uint8_t cache_t::data[512]
    -
    -

    Used to access cached file data sectors.

    - -
    -
    - -

    ◆ dir

    - -
    -
    - - - - -
    DirFat_t cache_t::dir[16]
    -
    -

    Used to access cached directory entries.

    - -
    -
    - -

    ◆ fat16

    - -
    -
    - - - - -
    uint16_t cache_t::fat16[256]
    -
    -

    Used to access cached FAT16 entries.

    - -
    -
    - -

    ◆ fat32

    - -
    -
    - - - - -
    uint32_t cache_t::fat32[128]
    -
    -

    Used to access cached FAT32 entries.

    - -
    -
    -
    The documentation for this union was generated from the following file: -
    - - - - diff --git a/extra-libraries/ESP8266/ESP8266SdFat/doc/mainpage.h b/extra-libraries/ESP8266/ESP8266SdFat/doc/mainpage.h index 0c361f7c..19312b7b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/doc/mainpage.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/doc/mainpage.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -31,19 +31,19 @@ This is a major new version of SdFat. It is mostly backward compatible with SdFat Version 1 for FAT16/FAT32 cards. You should edit SdFatConfig.h to select features. The default version of -SdFatConfig.h is suitable for UNO and other small AVR boards. +SdFatConfig.h is suitable for UNO and other small AVR boards. \section Intro Introduction - -The Arduino %SdFat library supports FAT16, FAT32, and exFAT file systems + +The Arduino %SdFat library supports FAT16, FAT32, and exFAT file systems on Standard SD, SDHC, and SDXC cards. - + In %SdFat version 1, SdFat and File are the main classes. In %SdFat version 2, SdFat and File are defined by typedefs in terms of the -following classes. +following classes. -The file system classes in the %SdFat library are SdFat32, SdExFat, and SdFs. +The file system classes in the %SdFat library are SdFat32, SdExFat, and SdFs. SdFat32 supports FAT16 and FAT32. SdExFat supports exFAT, SdFs supports FAT16, FAT32, and exFAT. @@ -69,7 +69,7 @@ boards. #endif // defined(__AVR__) && FLASHEND < 0X8000 \endcode -It is possible to use option three, support or FAT16/FAT32 and exFat +It is possible to use option three, support or FAT16/FAT32 and exFat on an Uno or other AVR board with 32KB flash and 2KB SRAM but memory will be very limited. @@ -79,7 +79,7 @@ Uno memory use for a simple data logger is: > > option 2, exFAT, 14942 bytes of flash and 895 bytes of SRAM. > -> option 3, FAT16/FAT32 and exFAT, 21834 bytes of flash and 908 bytes of SRAM. +> option 3, FAT16/FAT32 and exFAT, 21834 bytes of flash and 908 bytes of SRAM. Please read documentation under the above classes tab for more information. @@ -113,8 +113,8 @@ multi-block write. Relative paths in %SdFat are resolved in a manner similar to Windows. -Each instance of SdFat32, SdExFat, and SdFs has a current directory. -This directory is called the volume working directory, vwd. +Each instance of SdFat32, SdExFat, and SdFs has a current directory. +This directory is called the volume working directory, vwd. Initially this directory is the root directory for the volume. The volume working directory is changed by calling the chdir(path). @@ -149,9 +149,9 @@ will open "/music/BigBand.wav" on sd2. \section Install Installation -You must manually install %SdFat by renaming the download folder %SdFat +You must manually install %SdFat by renaming the download folder %SdFat and copy the %SdFat folder to the Arduino libraries folder in your -sketchbook folder. +sketchbook folder. It will be necessary to unzip and rename the folder if you download a zip file from GitHub. @@ -249,11 +249,9 @@ DirectoryFunctions - Use of chdir(), ls(), mkdir(), and rmdir(). examplesV1 folder - Examples from SdFat V1 for compatibility tests. -%ExFatFormatter - Produces optimal exFAT format for smaller SD cards. - ExFatLogger - A data-logger optimized for exFAT features. -ExFatUnicodeTest - Test program for Unicode file names. +MinimumSizeSdReader - Example of small file reader for FAT16/FAT32. OpenNext - Open all files in the root dir and print their filename. @@ -275,10 +273,16 @@ SoftwareSpi - Demo of limited Software SPI support in SdFat V2. STM32Test - Example use of two SPI ports on an STM32 board. +TeensyDmaAdcLogger - Fast logger using DMA ADC. + TeensyRtcTimestamp - %File timestamps for Teensy3. TeensySdioDemo - Demo of SDIO and SPI modes for the Teensy 3.5/3.6 built-in SD. +TeensySdioLogger - Fast logger using a ring buffer. + +UnicodeFilenames - Test program for Unicode file names. + UserChipSelectFunction - Useful for port expanders or replacement of the standard GPIO functions. UserSPIDriver - An example of an external SPI driver. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.h b/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.h index 054f1994..55f26747 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.h @@ -3,7 +3,8 @@ const size_t BLOCK_SIZE = 64; //------------------------------------------------------------------------------ // First block of file. -const size_t PIN_NUM_DIM = BLOCK_SIZE - 3*sizeof(uint32_t) - 2*sizeof(uint8_t); +const size_t PIN_NUM_DIM = + BLOCK_SIZE - 3 * sizeof(uint32_t) - 2 * sizeof(uint8_t); struct metadata_t { uint32_t adcFrequency; // ADC clock frequency uint32_t cpuFrequency; // CPU clock frequency @@ -14,15 +15,16 @@ struct metadata_t { }; //------------------------------------------------------------------------------ // Data block for 8-bit ADC mode. -const size_t DATA_DIM8 = (BLOCK_SIZE - 2*sizeof(uint16_t))/sizeof(uint8_t); +const size_t DATA_DIM8 = (BLOCK_SIZE - 2 * sizeof(uint16_t)) / sizeof(uint8_t); struct block8_t { uint16_t count; // count of data values uint16_t overrun; // count of overruns since last block - uint8_t data[DATA_DIM8]; + uint8_t data[DATA_DIM8]; }; //------------------------------------------------------------------------------ // Data block for 10-bit ADC mode. -const size_t DATA_DIM16 = (BLOCK_SIZE - 2*sizeof(uint16_t))/sizeof(uint16_t); +const size_t DATA_DIM16 = + (BLOCK_SIZE - 2 * sizeof(uint16_t)) / sizeof(uint16_t); struct block16_t { unsigned short count; // count of data values unsigned short overrun; // count of overruns since last block diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.ino index ce013eeb..6c70af8b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/AvrAdcLogger/AvrAdcLogger.ino @@ -20,12 +20,11 @@ */ #ifdef __AVR__ #include -#include "SdFat.h" + +#include "AvrAdcLogger.h" #include "BufferedPrint.h" #include "FreeStack.h" -#include "AvrAdcLogger.h" - -using namespace sdfat; +#include "SdFat.h" // Save SRAM if 328. #ifdef __AVR_ATmega328P__ @@ -36,9 +35,6 @@ MinimumSerial MinSerial; //------------------------------------------------------------------------------ // This example was designed for exFAT but will support FAT16/FAT32. // -// If an exFAT SD is required, the ExFatFormatter example will format -// smaller cards with an exFAT file system. -// // Note: Uno will not support SD_FAT_TYPE = 3. // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. @@ -78,7 +74,7 @@ const float SAMPLE_RATE = 5000; // Must be 0.25 or greater. // constant instead of being calculated from SAMPLE_RATE. SAMPLE_RATE is not // used in the code below. For example, setting SAMPLE_INTERVAL = 2.0e-4 // will result in a 200 microsecond sample interval. -const float SAMPLE_INTERVAL = 1.0/SAMPLE_RATE; +const float SAMPLE_INTERVAL = 1.0 / SAMPLE_RATE; // Setting ROUND_SAMPLE_INTERVAL non-zero will cause the sample interval to // be rounded to a a multiple of the ADC clock period and will reduce sample @@ -114,11 +110,11 @@ const size_t NAME_DIM = 40; #elif RAMEND < 0X10FF const size_t FIFO_SIZE_BYTES = 512; #elif RAMEND < 0X20FF -const size_t FIFO_SIZE_BYTES = 4*512; +const size_t FIFO_SIZE_BYTES = 4 * 512; #elif RAMEND < 0X40FF -const size_t FIFO_SIZE_BYTES = 12*512; -#else // RAMEND -const size_t FIFO_SIZE_BYTES = 16*512; +const size_t FIFO_SIZE_BYTES = 12 * 512; +#else // RAMEND +const size_t FIFO_SIZE_BYTES = 16 * 512; #endif // RAMEND //------------------------------------------------------------------------------ // ADC clock rate. @@ -141,7 +137,7 @@ const size_t FIFO_SIZE_BYTES = 16*512; #define TMP_FILE_NAME "tmp_adc.bin" // Number of analog pins to log. -const uint8_t PIN_COUNT = sizeof(PIN_LIST)/sizeof(PIN_LIST[0]); +const uint8_t PIN_COUNT = sizeof(PIN_LIST) / sizeof(PIN_LIST[0]); // Minimum ADC clock cycles per sample interval const uint16_t MIN_ADC_CYCLES = 15; @@ -154,11 +150,14 @@ const uint16_t ISR_TIMER0 = 160; //============================================================================== const uint32_t MAX_FILE_SIZE = MAX_FILE_SIZE_MiB << 20; +// Max SPI rate for AVR is 10 MHz for F_CPU 20 MHz, 8 MHz for F_CPU 16 MHz. +#define SPI_CLOCK SD_SCK_MHZ(10) + // Select fastest interface. #if ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // ENABLE_DEDICATED_SPI #if SD_FAT_TYPE == 0 @@ -183,19 +182,19 @@ file_t csvFile; char binName[] = LOG_FILE_NAME; #if RECORD_EIGHT_BITS -const size_t BLOCK_MAX_COUNT = PIN_COUNT*(DATA_DIM8/PIN_COUNT); +const size_t BLOCK_MAX_COUNT = PIN_COUNT * (DATA_DIM8 / PIN_COUNT); typedef block8_t block_t; -#else // RECORD_EIGHT_BITS -const size_t BLOCK_MAX_COUNT = PIN_COUNT*(DATA_DIM16/PIN_COUNT); +#else // RECORD_EIGHT_BITS +const size_t BLOCK_MAX_COUNT = PIN_COUNT * (DATA_DIM16 / PIN_COUNT); typedef block16_t block_t; -#endif // RECORD_EIGHT_BITS +#endif // RECORD_EIGHT_BITS // Size of FIFO in blocks. -size_t const FIFO_DIM = FIFO_SIZE_BYTES/sizeof(block_t); +size_t const FIFO_DIM = FIFO_SIZE_BYTES / sizeof(block_t); block_t* fifoData; -volatile size_t fifoCount = 0; // volatile - shared, ISR and background. -size_t fifoHead = 0; // Only accessed by ISR during logging. -size_t fifoTail = 0; // Only accessed by writer during logging. +volatile size_t fifoCount = 0; // volatile - shared, ISR and background. +size_t fifoHead = 0; // Only accessed by ISR during logging. +size_t fifoTail = 0; // Only accessed by writer during logging. //============================================================================== // Interrupt Service Routines @@ -222,7 +221,7 @@ ISR(ADC_vect) { // Read ADC data. #if RECORD_EIGHT_BITS uint8_t d = ADCH; -#else // RECORD_EIGHT_BITS +#else // RECORD_EIGHT_BITS // This will access ADCL first. uint16_t d = ADC; #endif // RECORD_EIGHT_BITS @@ -248,7 +247,7 @@ ISR(ADC_vect) { if (adcindex == 0) { timerFlag = false; } - adcindex = adcindex < (PIN_COUNT - 1) ? adcindex + 1 : 0; + adcindex = adcindex < (PIN_COUNT - 1) ? adcindex + 1 : 0; } else { timerFlag = false; } @@ -280,7 +279,7 @@ ISR(TIMER1_COMPB_vect) { } //============================================================================== // Error messages stored in flash. -#define error(msg) (Serial.println(F(msg)),errorHalt()) +#define error(msg) (Serial.println(F(msg)), errorHalt()) #define assert(e) ((e) ? (void)0 : error("assert: " #e)) //------------------------------------------------------------------------------ // @@ -339,12 +338,13 @@ void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { #error unexpected ADC prescaler bits #endif //------------------------------------------------------------------------------ -inline bool adcActive() {return (1 << ADIE) & ADCSRA;} +inline bool adcActive() { return (1 << ADIE) & ADCSRA; } //------------------------------------------------------------------------------ // initialize ADC and timer1 void adcInit(metadata_t* meta) { uint8_t adps; // prescaler bits for ADCSRA - uint32_t ticks = F_CPU*SAMPLE_INTERVAL + 0.5; // Sample interval cpu cycles. + uint32_t ticks = + F_CPU * SAMPLE_INTERVAL + 0.5; // Sample interval cpu cycles. if (ADC_REF & ~((1 << REFS0) | (1 << REFS1))) { error("Invalid ADC reference"); @@ -354,9 +354,9 @@ void adcInit(metadata_t* meta) { error("Invalid ADC prescaler"); } adps = ADC_PRESCALER; -#else // ADC_PRESCALER +#else // ADC_PRESCALER // Allow extra cpu cycles to change ADC settings if more than one pin. - int32_t adcCycles = (ticks - ISR_TIMER0)/PIN_COUNT - ISR_SETUP_ADC; + int32_t adcCycles = (ticks - ISR_TIMER0) / PIN_COUNT - ISR_SETUP_ADC; for (adps = 7; adps > 0; adps--) { if (adcCycles >= (MIN_ADC_CYCLES << adps)) { @@ -413,19 +413,19 @@ void adcInit(metadata_t* meta) { // no prescale, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS10); tshift = 0; - } else if (ticks < 0X10000*8) { + } else if (ticks < 0X10000 * 8) { // prescale 8, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11); tshift = 3; - } else if (ticks < 0X10000*64) { + } else if (ticks < 0X10000 * 64) { // prescale 64, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11) | (1 << CS10); tshift = 6; - } else if (ticks < 0X10000*256) { + } else if (ticks < 0X10000 * 256) { // prescale 256, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12); tshift = 8; - } else if (ticks < 0X10000*1024) { + } else if (ticks < 0X10000 * 1024) { // prescale 1024, CTC mode TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS12) | (1 << CS10); tshift = 10; @@ -445,7 +445,7 @@ void adcInit(metadata_t* meta) { // Sample interval in CPU clock ticks. meta->sampleInterval = ticks; meta->cpuFrequency = F_CPU; - float sampleRate = (float)meta->cpuFrequency/meta->sampleInterval; + float sampleRate = (float)meta->cpuFrequency / meta->sampleInterval; Serial.print(F("Sample pins:")); for (uint8_t i = 0; i < meta->pinCount; i++) { Serial.print(' '); @@ -455,11 +455,11 @@ void adcInit(metadata_t* meta) { Serial.print(F("ADC bits: ")); Serial.println(meta->recordEightBits ? 8 : 10); Serial.print(F("ADC clock kHz: ")); - Serial.println(meta->adcFrequency/1000); + Serial.println(meta->adcFrequency / 1000); Serial.print(F("Sample Rate: ")); Serial.println(sampleRate); Serial.print(F("Sample interval usec: ")); - Serial.println(1000000.0/sampleRate); + Serial.println(1000000.0 / sampleRate); } //------------------------------------------------------------------------------ // enable ADC and timer1 interrupts @@ -511,7 +511,7 @@ void binaryToCsv() { if (nb < 0) { error("read binFile failed"); } - size_t nd = nb/sizeof(block_t); + size_t nd = nb / sizeof(block_t); if (nd < 1) { break; } @@ -522,7 +522,8 @@ void binaryToCsv() { error("Invalid pinCount"); } bp.print(F("Interval,")); - float intervalMicros = 1.0e6*pm->sampleInterval/(float)pm->cpuFrequency; + float intervalMicros = + 1.0e6 * pm->sampleInterval / (float)pm->cpuFrequency; bp.print(intervalMicros, 4); bp.println(F(",usec")); for (uint8_t i = 0; i < PIN_COUNT; i++) { @@ -544,14 +545,15 @@ void binaryToCsv() { } for (size_t j = 0; j < pd->count; j += PIN_COUNT) { for (size_t i = 0; i < PIN_COUNT; i++) { - if (!bp.printField(pd->data[i + j], i == (PIN_COUNT-1) ? '\n' : ',')) { + if (!bp.printField(pd->data[i + j], + i == (PIN_COUNT - 1) ? '\n' : ',')) { error("printField failed"); } } } } if ((millis() - tPct) > 1000) { - uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + uint8_t pct = binFile.curPosition() / (binFile.fileSize() / 100); if (pct != lastPct) { tPct = millis(); lastPct = pct; @@ -564,7 +566,7 @@ void binaryToCsv() { error("close csvFile failed"); } Serial.print(F("Done: ")); - Serial.print(0.001*(millis() - t0)); + Serial.print(0.001 * (millis() - t0)); Serial.println(F(" Seconds")); } //------------------------------------------------------------------------------ @@ -622,7 +624,7 @@ bool createCsvFile() { error("no dot in binName"); } strcpy(dot + 1, "csv"); - if (!csvFile.open(csvName, O_WRONLY|O_CREAT|O_TRUNC)) { + if (!csvFile.open(csvName, O_WRONLY | O_CREAT | O_TRUNC)) { error("open csvFile failed"); } Serial.print(F("Writing: ")); @@ -635,7 +637,7 @@ bool createCsvFile() { void logData() { uint32_t t0; uint32_t t1; - uint32_t overruns =0; + uint32_t overruns = 0; uint32_t count = 0; uint32_t maxLatencyUsec = 0; size_t maxFifoUse = 0; @@ -679,7 +681,7 @@ void logData() { if (m > maxLatencyUsec) { maxLatencyUsec = m; } - if (tmpFifoCount >maxFifoUse) { + if (tmpFifoCount > maxFifoUse) { maxFifoUse = tmpFifoCount; } count += pBlock->count; @@ -714,7 +716,7 @@ void logData() { isrStop = true; } if (fifoCount == 0 && !adcActive()) { - break; + break; } } Serial.println(); @@ -729,9 +731,9 @@ void logData() { Serial.print(F("Max write latency usec: ")); Serial.println(maxLatencyUsec); Serial.print(F("Record time sec: ")); - Serial.println(0.001*(t1 - t0), 3); + Serial.println(0.001 * (t1 - t0), 3); Serial.print(F("Sample count: ")); - Serial.println(count/PIN_COUNT); + Serial.println(count / PIN_COUNT); Serial.print(F("Overruns: ")); Serial.println(overruns); Serial.print(F("FIFO_DIM: ")); @@ -770,13 +772,13 @@ void printData() { return; } binFile.rewind(); - if (binFile.read(&buf , sizeof(buf)) != sizeof(buf)) { + if (binFile.read(&buf, sizeof(buf)) != sizeof(buf)) { error("Read metadata failed"); } Serial.println(F("Type any character to stop")); delay(1000); while (!Serial.available() && - binFile.read(&buf , sizeof(buf)) == sizeof(buf)) { + binFile.read(&buf, sizeof(buf)) == sizeof(buf)) { if (buf.count == 0) { break; } @@ -786,7 +788,7 @@ void printData() { } for (size_t i = 0; i < buf.count; i++) { Serial.print(buf.data[i], DEC); - if ((i+1)%PIN_COUNT) { + if ((i + 1) % PIN_COUNT) { Serial.print(','); } else { Serial.println(); @@ -798,7 +800,7 @@ void printData() { //------------------------------------------------------------------------------ bool serialReadLine(char* str, size_t size) { size_t n = 0; - while(!Serial.available()) { + while (!Serial.available()) { } while (true) { int c = Serial.read(); @@ -809,7 +811,8 @@ bool serialReadLine(char* str, size_t size) { return false; } uint32_t m = millis(); - while (!Serial.available() && (millis() - m) < 100){} + while (!Serial.available() && (millis() - m) < 100) { + } if (!Serial.available()) break; } str[n] = 0; @@ -821,9 +824,11 @@ void setup(void) { pinMode(ERROR_LED_PIN, OUTPUT); } Serial.begin(9600); - while(!Serial) {} + while (!Serial) { + } Serial.println(F("Type any character to begin.")); - while(!Serial.available()) {} + while (!Serial.available()) { + } FillStack(); @@ -831,9 +836,9 @@ void setup(void) { analogRead(PIN_LIST[0]); #if !ENABLE_DEDICATED_SPI - Serial.println(F( - "\nFor best performance edit SdFatConfig.h\n" - "and set ENABLE_DEDICATED_SPI nonzero")); + Serial.println( + F("\nFor best performance edit SdFatConfig.h\n" + "and set ENABLE_DEDICATED_SPI nonzero")); #endif // !ENABLE_DEDICATED_SPI // Initialize SD. if (!sd.begin(SD_CONFIG)) { @@ -867,8 +872,8 @@ void loop(void) { Serial.println(F("p - print data to Serial")); Serial.println(F("r - record ADC data")); - while(!Serial.available()) { - SysCall::yield(); + while (!Serial.available()) { + yield(); } char c = tolower(Serial.read()); Serial.println(); @@ -898,4 +903,4 @@ void loop(void) { } #else // __AVR__ #error This program is only for AVR. -#endif // __AVR__ +#endif // __AVR__ \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/BackwardCompatibility/BackwardCompatibility.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/BackwardCompatibility/BackwardCompatibility.ino index 8952ff62..9729695d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/BackwardCompatibility/BackwardCompatibility.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/BackwardCompatibility/BackwardCompatibility.ino @@ -3,6 +3,11 @@ // // Your SD must be formatted FAT16/FAT32. // +// SD.h does not support some default SdFat features. +// To compare flash size, set USE_FAT_FILE_FLAG_CONTIGUOUS, +// ENABLE_DEDICATED_SPI, and USE_LONG_FILE_NAMES to zero also +// set SDFAT_FILE_TYPE to one in SdFat/src/SdFatCongfig.h +// // Set USE_SD_H nonzero to use SD.h. // Set USE_SD_H zero to use SdFat.h. // @@ -12,9 +17,6 @@ #include #else // USE_SD_H #include "SdFat.h" - -using namespace sdfat; - SdFat SD; #endif // USE_SD_H @@ -26,11 +28,12 @@ File myFile; void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } #if USE_SD_H Serial.println(F("Using SD.h. Set USE_SD_H zero to use SdFat.h.")); -#else // USE_SD_H +#else // USE_SD_H Serial.println(F("Using SdFat.h. Set USE_SD_H nonzero to use SD.h.")); #endif // USE_SD_H Serial.println(F("\nType any character to begin.")); @@ -78,4 +81,4 @@ void setup() { } void loop() { // nothing happens after setup -} +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/BufferedPrint/BufferedPrint.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/BufferedPrint/BufferedPrint.ino index db3d577d..5a924eb6 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/BufferedPrint/BufferedPrint.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/BufferedPrint/BufferedPrint.ino @@ -1,15 +1,12 @@ // Test and benchmark of the fast bufferedPrint class. // // Mainly for AVR but may improve print performance with other CPUs. -#include "SdFat.h" #include "BufferedPrint.h" - -using namespace sdfat; - +#include "SdFat.h" // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -22,18 +19,21 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -71,49 +71,48 @@ void benchmark() { bp.begin(&file); } uint32_t t = millis(); - switch(test) { - case 0: - Serial.println(F("Test of println(uint16_t)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println(i); - } - break; + switch (test) { + case 0: + Serial.println(F("Test of println(uint16_t)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println(i); + } + break; - case 1: - Serial.println(F("Test of printField(uint16_t, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField(i, '\n'); - } - break; + case 1: + Serial.println(F("Test of printField(uint16_t, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField(i, '\n'); + } + break; - case 2: - Serial.println(F("Test of println(uint32_t)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println(12345678UL + i); - } - break; + case 2: + Serial.println(F("Test of println(uint32_t)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println(12345678UL + i); + } + break; - case 3: - Serial.println(F("Test of printField(uint32_t, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField(12345678UL + i, '\n'); - } - break; + case 3: + Serial.println(F("Test of printField(uint32_t, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField(12345678UL + i, '\n'); + } + break; - case 4: - Serial.println(F("Test of println(double)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - file.println((double)0.01*i); - } - break; - - case 5: - Serial.println(F("Test of printField(double, char)")); - for (uint16_t i = 0; i < N_PRINT; i++) { - bp.printField((double)0.01*i, '\n'); - } - break; + case 4: + Serial.println(F("Test of println(double)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + file.println((double)0.01 * i); + } + break; + case 5: + Serial.println(F("Test of printField(double, char)")); + for (uint16_t i = 0; i < N_PRINT; i++) { + bp.printField((double)0.01 * i, '\n'); + } + break; } if (test & 1) { bp.sync(); @@ -125,13 +124,13 @@ void benchmark() { file.close(); t = millis() - t; Serial.print(F("Time ")); - Serial.print(0.001*t, 3); + Serial.print(0.001 * t, 3); Serial.println(F(" sec")); Serial.print(F("File size ")); - Serial.print(0.001*s); + Serial.print(0.001 * s); Serial.println(F(" KB")); Serial.print(F("Write ")); - Serial.print(s/t); + Serial.print(s / t); Serial.println(F(" KB/sec")); Serial.println(); } @@ -139,23 +138,23 @@ void benchmark() { //------------------------------------------------------------------------------ void testMemberFunctions() { BufferedPrint bp(&Serial); - char c = 'c'; // char + char c = 'c'; // char //#define BASIC_TYPES #ifdef BASIC_TYPES - signed char sc = -1; // signed 8-bit - unsigned char uc = 1; // unsiged 8-bit - signed short ss = -2; // signed 16-bit - unsigned short us = 2; // unsigned 16-bit - signed long sl = -4; // signed 32-bit - unsigned long ul = 4; // unsigned 32-bit -#else // BASIC_TYPES - int8_t sc = -1; // signed 8-bit - uint8_t uc = 1; // unsiged 8-bit - int16_t ss = -2; // signed 16-bit - uint16_t us = 2; // unsigned 16-bit - int32_t sl = -4; // signed 32-bit - uint32_t ul = 4; // unsigned 32-bit -#endif // BASIC_TYPES + signed char sc = -1; // signed 8-bit + unsigned char uc = 1; // unsiged 8-bit + signed short ss = -2; // signed 16-bit + unsigned short us = 2; // unsigned 16-bit + signed long sl = -4; // signed 32-bit + unsigned long ul = 4; // unsigned 32-bit +#else // BASIC_TYPES + int8_t sc = -1; // signed 8-bit + uint8_t uc = 1; // unsiged 8-bit + int16_t ss = -2; // signed 16-bit + uint16_t us = 2; // unsigned 16-bit + int32_t sl = -4; // signed 32-bit + uint32_t ul = 4; // unsigned 32-bit +#endif // BASIC_TYPES float f = -1.234; double d = -5.678; bp.println(); @@ -216,9 +215,11 @@ void testMemberFunctions() { //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } Serial.println("Type any character to begin."); - while(!Serial.available()) {} + while (!Serial.available()) { + } if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } @@ -226,10 +227,10 @@ void setup() { Serial.println(F("Test member funcions:")); testMemberFunctions(); Serial.println(); - Serial.println(F("Benchmark performance for uint16_t, uint32_t, and double:")); + Serial.println( + F("Benchmark performance for uint16_t, uint32_t, and double:")); benchmark(); Serial.println("Done"); } //------------------------------------------------------------------------------ -void loop() { -} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/DirectoryFunctions/DirectoryFunctions.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/DirectoryFunctions/DirectoryFunctions.ino index 8b570c8b..455578e9 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/DirectoryFunctions/DirectoryFunctions.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/DirectoryFunctions/DirectoryFunctions.ino @@ -4,12 +4,9 @@ #include "SdFat.h" #include "sdios.h" -using namespace sdfat; - - // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -21,19 +18,22 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN // Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(16) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS //------------------------------------------------------------------------------ @@ -66,22 +66,20 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(1000); - cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize the SD card. if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } - if (sd.exists("Folder1") - || sd.exists("Folder1/file1.txt") - || sd.exists("Folder1/File2.txt")) { + if (sd.exists("Folder1") || sd.exists("Folder1/file1.txt") || + sd.exists("Folder1/File2.txt")) { error("Please remove existing Folder1, file1.txt, and File2.txt"); } diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatFormatter/ExFatFormatter.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatFormatter/ExFatFormatter.ino deleted file mode 100644 index e8c48e23..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatFormatter/ExFatFormatter.ino +++ /dev/null @@ -1,88 +0,0 @@ -// Force exFAT formatting for all SD cards larger than 512MB. -#include "SdFat.h" - -using namespace sdfat; - - -/* - Change the value of SD_CS_PIN if you are using SPI and - your hardware does not use the default value, SS. - Common values are: - Arduino Ethernet shield: pin 4 - Sparkfun SD shield: pin 8 - Adafruit SD shields and modules: pin 10 -*/ - -// SDCARD_SS_PIN is defined for the built-in SD on some boards. -#ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN -// Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; -#endif // SDCARD_SS_PIN - -// Select fastest interface. -#if HAS_SDIO_CLASS -// SD config for Teensy 3.6 SDIO. -#define SD_CONFIG SdioConfig(FIFO_SDIO) -//#define SD_CONFIG SdioConfig(DMA_SDIO) -#elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) -#else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) -#endif // HAS_SDIO_CLASS - -SdExFat sd; -//------------------------------------------------------------------------------ -void clearSerialInput() { - uint32_t m = micros(); - do { - if (Serial.read() >= 0) { - m = micros(); - } - } while (micros() - m < 10000); -} -//------------------------------------------------------------------------------ -void errorHalt() { - sd.printSdError(&Serial); - SysCall::halt(); -} -#define error(s) (Serial.println(F(s)),errorHalt()) -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - while (!Serial) {} - Serial.println(F("Type any character to begin")); - - while (!Serial.available()) { - yield(); - } - clearSerialInput(); - Serial.println(); - Serial.println(F( - "Your SD will be formated exFAT.\r\n" - "All data on the SD will be lost.\r\n" - "Type 'Y' to continue.\r\n")); - - while (!Serial.available()) { - yield(); - } - if (Serial.read() != 'Y') { - Serial.println(F("Exiting, 'Y' not typed.")); - return; - } - if (!sd.cardBegin(SD_CONFIG)) { - error("cardBegin failed"); - } - if(!sd.format(&Serial)) { - error("format failed"); - } - if (!sd.volumeBegin()) { - error("volumeBegin failed"); - } - Serial.print(F("Bytes per cluster: ")); - Serial.println(sd.bytesPerCluster()); - Serial.println(F("Done")); -} -void loop() { -} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatLogger/ExFatLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatLogger/ExFatLogger.ino index bc1f1b51..f3a6c55d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatLogger/ExFatLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatLogger/ExFatLogger.ino @@ -1,17 +1,11 @@ // Example to demonstrate write latency for preallocated exFAT files. // I suggest you write a PC program to convert very large bin files. // -// If an exFAT SD is required, the ExFatFormatter example will format -// smaller cards with an exFAT file system. -// // The maximum data rate will depend on the quality of your SD, // the size of the FIFO, and using dedicated SPI. -#include "SdFat.h" -#include "FreeStack.h" #include "ExFatLogger.h" - -using namespace sdfat; - +#include "FreeStack.h" +#include "SdFat.h" //------------------------------------------------------------------------------ // This example was designed for exFAT but will support FAT16/FAT32. // Note: Uno will not support SD_FAT_TYPE = 3. @@ -51,7 +45,7 @@ const uint32_t LOG_INTERVAL_USEC = 2000; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -71,12 +65,17 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; // Preallocate 1GiB file. const uint32_t PREALLOCATE_SIZE_MiB = 1024UL; -// Select the fastest interface. Assumes no other SPI devices. -#if ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) -#else // ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) -#endif // ENABLE_DEDICATED_SPI +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + +// Try to select the best SD card configuration. +#if HAS_SDIO_CLASS +#define SD_CONFIG SdioConfig(FIFO_SDIO) +#elif ENABLE_DEDICATED_SPI +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) +#else // HAS_SDIO_CLASS +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) +#endif // HAS_SDIO_CLASS // Save SRAM if 328. #ifdef __AVR_ATmega328P__ @@ -128,11 +127,11 @@ void printRecord(Print* pr, data_t* data) { } } //============================================================================== -const uint64_t PREALLOCATE_SIZE = (uint64_t)PREALLOCATE_SIZE_MiB << 20; +const uint64_t PREALLOCATE_SIZE = (uint64_t)PREALLOCATE_SIZE_MiB << 20; // Max length of file name including zero byte. #define FILE_NAME_DIM 40 // Max number of records to buffer while SD is busy. -const size_t FIFO_DIM = 512*FIFO_SIZE_SECTORS/sizeof(data_t); +const size_t FIFO_DIM = 512 * FIFO_SIZE_SECTORS / sizeof(data_t); #if SD_FAT_TYPE == 0 typedef SdFat sd_t; @@ -192,22 +191,22 @@ void binaryToCsv() { data_t binData[FIFO_DIM]; if (!binFile.seekSet(512)) { - error("binFile.seek faile"); + error("binFile.seek failed"); } uint32_t tPct = millis(); printRecord(&csvFile, nullptr); while (!Serial.available() && binFile.available()) { int nb = binFile.read(binData, sizeof(binData)); - if (nb <= 0 ) { + if (nb <= 0) { error("read binFile failed"); } - size_t nr = nb/sizeof(data_t); + size_t nr = nb / sizeof(data_t); for (size_t i = 0; i < nr; i++) { printRecord(&csvFile, &binData[i]); } if ((millis() - tPct) > 1000) { - uint8_t pct = binFile.curPosition()/(binFile.fileSize()/100); + uint8_t pct = binFile.curPosition() / (binFile.fileSize() / 100); if (pct != lastPct) { tPct = millis(); lastPct = pct; @@ -222,7 +221,7 @@ void binaryToCsv() { } csvFile.close(); Serial.print(F("Done: ")); - Serial.print(0.001*(millis() - t0)); + Serial.print(0.001 * (millis() - t0)); Serial.println(F(" Seconds")); } //------------------------------------------------------------------------------ @@ -303,7 +302,7 @@ void logData() { uint16_t overrun = 0; uint16_t maxOverrun = 0; uint32_t totalOverrun = 0; - uint32_t fifoBuf[128*FIFO_SIZE_SECTORS]; + uint32_t fifoBuf[128 * FIFO_SIZE_SECTORS]; data_t* fifoData = (data_t*)fifoBuf; // Write dummy sector to start multi-block write. @@ -316,7 +315,8 @@ void logData() { Serial.println(F("Type any character to stop")); // Wait until SD is not busy. - while (sd.card()->isBusy()) {} + while (sd.card()->isBusy()) { + } // Start time for log file. uint32_t m = millis(); @@ -371,9 +371,9 @@ void logData() { if (!sd.card()->isBusy()) { size_t nw = fifoHead > fifoTail ? fifoCount : FIFO_DIM - fifoTail; // Limit write time by not writing more than 512 bytes. - const size_t MAX_WRITE = 512/sizeof(data_t); + const size_t MAX_WRITE = 512 / sizeof(data_t); if (nw > MAX_WRITE) nw = MAX_WRITE; - size_t nb = nw*sizeof(data_t); + size_t nb = nw * sizeof(data_t); uint32_t usec = micros(); if (nb != binFile.write(fifoData + fifoTail, nb)) { error("write binFile failed"); @@ -393,7 +393,7 @@ void logData() { } } Serial.print(F("\nLog time: ")); - Serial.print(0.001*(millis() - m)); + Serial.print(0.001 * (millis() - m)); Serial.println(F(" Seconds")); binFile.truncate(); binFile.sync(); @@ -470,7 +470,7 @@ void printUnusedStack() { //------------------------------------------------------------------------------ bool serialReadLine(char* str, size_t size) { size_t n = 0; - while(!Serial.available()) { + while (!Serial.available()) { yield(); } while (true) { @@ -482,7 +482,8 @@ bool serialReadLine(char* str, size_t size) { return false; } uint32_t m = millis(); - while (!Serial.available() && (millis() - m) < 100){} + while (!Serial.available() && (millis() - m) < 100) { + } if (!Serial.available()) break; } str[n] = 0; @@ -517,7 +518,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(1000); Serial.println(F("Type any character to begin")); @@ -526,9 +527,9 @@ void setup() { } FillStack(); #if !ENABLE_DEDICATED_SPI - Serial.println(F( - "\nFor best performance edit SdFatConfig.h\n" - "and set ENABLE_DEDICATED_SPI nonzero")); + Serial.println( + F("\nFor best performance edit SdFatConfig.h\n" + "and set ENABLE_DEDICATED_SPI nonzero")); #endif // !ENABLE_DEDICATED_SPI Serial.print(FIFO_DIM); @@ -568,8 +569,8 @@ void loop() { Serial.println(F("p - print data to Serial")); Serial.println(F("r - record data")); Serial.println(F("t - test without logging")); - while(!Serial.available()) { - SysCall::yield(); + while (!Serial.available()) { + yield(); } char c = tolower(Serial.read()); Serial.println(); @@ -593,4 +594,4 @@ void loop() { } else { Serial.println(F("Invalid entry")); } -} +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatUnicodeTest/ExFatUnicodeTest.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatUnicodeTest/ExFatUnicodeTest.ino deleted file mode 100644 index eb086900..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/ExFatUnicodeTest/ExFatUnicodeTest.ino +++ /dev/null @@ -1,50 +0,0 @@ -// Simple test of Unicode file name. -// Note: Unicode is only supported by the SdExFat class. -// No exFAT functions will be defined for char* paths. -// The SdFs class cannot be used. -#include "SdFat.h" - -using namespace sdfat; - -#if USE_EXFAT_UNICODE_NAMES - -// SDCARD_SS_PIN is defined for the built-in SD on some boards. -#ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN -// Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; -#endif // SDCARD_SS_PIN - -// Use SPI, SD_CS_PIN, SHARED_SPI, 50 MHz. -#define SD_CONFIG SdSpiConfig(SD_CS_PIN) - -SdExFat sd; - -ExFile file; - -void setup() { - Serial.begin(9600); - while (!Serial) { - yield(); - } - Serial.println("Type any character to begin"); - while (!Serial.available()) { - yield(); - } - if (!sd.begin(SD_CONFIG)) { - sd.initErrorHalt(&Serial); - } - if (!file.open(u"Euros \u20AC test.txt", FILE_WRITE)) { - Serial.println("file.open failed"); - return; - } - file.println("This is not Unicode"); - file.close(); - Serial.println("Done!"); -} -void loop() { -} -#else // USE_EXFAT_UNICODE_NAMES -#error USE_EXFAT_UNICODE_NAMES must be nonzero in SdFat/src/ExFatLib/ExFatCongfig.h -#endif // USE_EXFAT_UNICODE_NAMES diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino new file mode 100644 index 00000000..1e8a7e9d --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/MinimumSizeSdReader/MinimumSizeSdReader.ino @@ -0,0 +1,60 @@ +// Create a text file on the SD with this path using short 8.3 names. +#define SFN_PATH "/DIR/TEST.TXT" + +// Modify CS_PIN for your chip select pin. +#define CS_PIN SS + +// Set USE_SD_H to one for SD.h or zero for SdFat. +#define USE_SD_H 0 + +#if USE_SD_H +#include "SD.h" +File file; +#else +#include "SdFat.h" +// Setting ENABLE_DEDICATED_SPI to zero saves over 200 more bytes. +#if ENABLE_DEDICATED_SPI +#warning \ + "Set ENABLE_DEDICATED_SPI zero in SdFat/src/SdFatConfig.h for minimum size" +#endif // ENABLE_DEDICATED_SPI +// Insure FAT16/FAT32 only. +SdFat32 SD; +// FatFile does not support Stream functions, just simple read/write. +FatFile file; +#endif + +void error(const char* msg) { + Serial.println(msg); + while (true) { + } +} +void setup() { + int n; + char buf[4]; + + Serial.begin(9600); + while (!Serial) { + } + Serial.println("Type any character to begin"); + while (!Serial.available()) { + } + + if (!SD.begin(CS_PIN)) error("SD.begin"); + +#if USE_SD_H + file = SD.open(SFN_PATH); + if (!file) error("open"); +#else + // Open existing file with a path of 8.3 names. + // Directories will be opened O_RDONLY files O_RDWR. + if (!file.openExistingSFN(SFN_PATH)) error("open"); +#endif + while ((n = file.read(buf, sizeof(buf)))) { + Serial.write(buf, n); + } + // close() is only needed if you write to the file. For example, read + // config data, modify the data, rewind the file and write the data. + // file.close(); +} + +void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/OpenNext/OpenNext.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/OpenNext/OpenNext.ino index 887e94e2..16687260 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/OpenNext/OpenNext.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/OpenNext/OpenNext.ino @@ -3,12 +3,9 @@ */ #include "SdFat.h" -using namespace sdfat; - - // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -20,19 +17,22 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN // Assume built-in SD is used. -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(30) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -63,20 +63,24 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.println("Type any character to start"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize the SD. if (!sd.begin(SD_CONFIG)) { sd.initErrorHalt(&Serial); } - // Open root directory - if (!dir.open("/")){ + +} +//------------------------------------------------------------------------------ +void loop() { + // Open root directory + if (!dir.open("/")) { error("dir.open failed"); } // Open next file in root. @@ -100,6 +104,7 @@ void setup() { } else { Serial.println("Done!"); } -} -//------------------------------------------------------------------------------ -void loop() {} + dir.close(); + delay(2000); + + } diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/QuickStart/QuickStart.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/QuickStart/QuickStart.ino index a2bd9f36..eb884ab7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/QuickStart/QuickStart.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/QuickStart/QuickStart.ino @@ -1,15 +1,13 @@ // Quick hardware test for SPI card access. // #include + #include "SdFat.h" #include "sdios.h" -using namespace sdfat; - - // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 // // Set DISABLE_CHIP_SELECT to disable a second SPI device. // For example, with the Ethernet shield, set DISABLE_CHIP_SELECT @@ -71,7 +69,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("\nSPI pins:\n"); cout << F("MISO: ") << int(MISO) << endl; @@ -84,17 +82,17 @@ void setup() { if (DISABLE_CHIP_SELECT < 0) { cout << F( - "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" - "a second SPI device. For example, with the Ethernet\n" - "shield, DISABLE_CHIP_SELECT should be set to 10\n" - "to disable the Ethernet controller.\n"); + "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" + "a second SPI device. For example, with the Ethernet\n" + "shield, DISABLE_CHIP_SELECT should be set to 10\n" + "to disable the Ethernet controller.\n"); } cout << F( - "\nSD chip select is the key hardware option.\n" - "Common values are:\n" - "Arduino Ethernet shield, pin 4\n" - "Sparkfun SD shield, pin 8\n" - "Adafruit SD shields and modules, pin 10\n"); + "\nSD chip select is the key hardware option.\n" + "Common values are:\n" + "Arduino Ethernet shield, pin 4\n" + "Sparkfun SD shield, pin 8\n" + "Adafruit SD shields and modules, pin 10\n"); } bool firstTry = true; @@ -109,7 +107,7 @@ void loop() { cout << F("\nEnter the chip select pin number: "); while (!Serial.available()) { - SysCall::yield(); + yield(); } cin.readline(); if (cin >> chipSelect) { @@ -120,8 +118,8 @@ void loop() { } if (DISABLE_CHIP_SELECT < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CHIP_SELECT to disable another device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CHIP_SELECT) << endl; @@ -131,12 +129,12 @@ void loop() { if (!sd.begin(chipSelect, SPI_SPEED)) { if (sd.card()->errorCode()) { cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is chipSelect set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - "Is there a wiring/soldering problem?\n"); + "\nSD initialization failed.\n" + "Do not reformat the card!\n" + "Is the card correctly inserted?\n" + "Is chipSelect set to the correct value?\n" + "Does another SPI device need to be disabled?\n" + "Is there a wiring/soldering problem?\n"); cout << F("\nerrorCode: ") << hex << showbase; cout << int(sd.card()->errorCode()); cout << F(", errorData: ") << int(sd.card()->errorData()); @@ -145,7 +143,7 @@ void loop() { } cout << F("\nCard successfully initialized.\n"); if (sd.vol()->fatType() == 0) { - cout << F("Can't find a valid FAT16/FAT32 partition.\n"); + cout << F("Can't find a valid FAT16/FAT32/exFAT partition.\n"); reformatMsg(); return; } @@ -165,15 +163,19 @@ void loop() { cout << F("Card size: ") << sizeMB; cout << F(" MB (MB = 1,000,000 bytes)\n"); cout << endl; - cout << F("Volume is FAT") << int(sd.vol()->fatType()); + if (sd.fatType() <= 32) { + cout << F("\nVolume is FAT") << int(sd.fatType()); + } else { + cout << F("\nVolume is exFAT"); + } cout << F(", Cluster size (bytes): ") << sd.vol()->bytesPerCluster(); cout << endl << endl; cout << F("Files found (date time size name):\n"); sd.ls(LS_R | LS_DATE | LS_SIZE); - if ((sizeMB > 1100 && sd.vol()->sectorsPerCluster() < 64) - || (sizeMB < 2200 && sd.vol()->fatType() == 32)) { + if ((sizeMB > 1100 && sd.vol()->sectorsPerCluster() < 64) || + (sizeMB < 2200 && sd.vol()->fatType() == 32)) { cout << F("\nThis card should be reformatted for best performance.\n"); cout << F("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); cout << F("Only cards larger than 2 GB should be formatted FAT32.\n"); @@ -185,6 +187,6 @@ void loop() { cout << F("\nSuccess! Type any character to restart.\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } -} +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/ReadCsvFile/ReadCsvFile.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/ReadCsvFile/ReadCsvFile.ino index 78658988..7fb61cad 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/ReadCsvFile/ReadCsvFile.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/ReadCsvFile/ReadCsvFile.ino @@ -1,11 +1,8 @@ #include "SdFat.h" -using namespace sdfat; - - // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -18,18 +15,21 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -127,10 +127,10 @@ void setup() { error("open failed"); } // Write test data. - file.print(F( - "abc,123,456,7.89\r\n" - "def,-321,654,-9.87\r\n" - "ghi,333,0xff,5.55")); + file.print( + F("abc,123,456,7.89\r\n" + "def,-321,654,-9.87\r\n" + "ghi,333,0xff,5.55")); // Rewind file for read. file.rewind(); @@ -140,7 +140,7 @@ void setup() { if (n <= 0) { error("fgets failed"); } - if (line[n-1] != '\n' && n == (sizeof(line) - 1)) { + if (line[n - 1] != '\n' && n == (sizeof(line) - 1)) { error("line too long"); } if (!parseLine(line)) { @@ -152,5 +152,4 @@ void setup() { Serial.println(F("Done")); } -void loop() { -} +void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/RtcTimestampTest/RtcTimestampTest.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/RtcTimestampTest/RtcTimestampTest.ino index 2e74e7f2..3e5e5a74 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/RtcTimestampTest/RtcTimestampTest.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/RtcTimestampTest/RtcTimestampTest.ino @@ -2,9 +2,6 @@ // Set the callback with this statement. // FsDateTime::setCallback(dateTime); #include "SdFat.h" - -using namespace sdfat; - // https://github.com/adafruit/RTClib #include "RTClib.h" // Set RTC_TYPE for file timestamps. @@ -16,7 +13,7 @@ using namespace sdfat; // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -29,18 +26,21 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -59,7 +59,6 @@ FsFile file; #error Invalid SD_FAT_TYPE #endif // SD_FAT_TYPE - #if RTC_TYPE == 0 RTC_Millis rtc; #elif RTC_TYPE == 1 @@ -108,12 +107,12 @@ void getLine(char* line, size_t size) { while (true) { t = millis() + 10; while (!Serial.available()) { - if (millis() > t){ + if (millis() > t) { return; } } int c = Serial.read(); - if (i >= (size - 1) || c == '\r' || c == '\n' ) { + if (i >= (size - 1) || c == '\r' || c == '\n') { return; } line[i++] = c; @@ -134,11 +133,11 @@ void printField(Print* pr, char sep, uint8_t v) { void printNow(Print* pr) { DateTime now = rtc.now(); pr->print(now.year()); - printField(pr, '-',now.month()); - printField(pr, '-',now.day()); - printField(pr, ' ',now.hour()); - printField(pr, ':',now.minute()); - printField(pr, ':',now.second()); + printField(pr, '-', now.month()); + printField(pr, '-', now.day()); + printField(pr, ' ', now.hour()); + printField(pr, ':', now.minute()); + printField(pr, ':', now.second()); } //------------------------------------------------------------------------------ bool setRtc() { @@ -153,17 +152,17 @@ bool setRtc() { Serial.print(F("Input: ")); Serial.println(line); - y = strtol(line, &ptr, 0); + y = strtol(line, &ptr, 10); if (*ptr++ != '-' || y < 2000 || y > 2099) return error("year"); - m = strtol(ptr, &ptr, 0); + m = strtol(ptr, &ptr, 10); if (*ptr++ != '-' || m < 1 || m > 12) return error("month"); - d = strtol(ptr, &ptr, 0); + d = strtol(ptr, &ptr, 10); if (d < 1 || d > 31) return error("day"); - hh = strtol(ptr, &ptr, 0); + hh = strtol(ptr, &ptr, 10); if (*ptr++ != ':' || hh > 23) return error("hour"); - mm = strtol(ptr, &ptr, 0); + mm = strtol(ptr, &ptr, 10); if (*ptr++ != ':' || mm > 59) return error("minute"); - ss = strtol(ptr, &ptr, 0); + ss = strtol(ptr, &ptr, 10); if (ss > 59) return error("second"); rtc.adjust(DateTime(y, m, d, hh, mm, ss)); @@ -180,7 +179,7 @@ void setup() { } #if RTC_TYPE == 0 rtc.begin(DateTime(F(__DATE__), F(__TIME__))); -#else // RTC_TYPE +#else // RTC_TYPE if (!rtc.begin()) { Serial.println(F("rtc.begin failed")); return; @@ -201,7 +200,8 @@ void setup() { Serial.println(); clearSerialInput(); Serial.println(F("Type Y to set RTC, any other character to continue")); - while (!Serial.available()) {} + while (!Serial.available()) { + } if (Serial.read() != 'Y') break; if (setRtc()) break; } @@ -232,5 +232,4 @@ void setup() { Serial.println(F("Done")); } //------------------------------------------------------------------------------ -void loop() { -} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/STM32Test/STM32Test.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/STM32Test/STM32Test.ino deleted file mode 100644 index 9e39b548..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/STM32Test/STM32Test.ino +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Example use of two SPI ports on an STM32 board. - * Note SPI speed is limited to 18 MHz. - */ -#include -#include "SdFat.h" -#include "FreeStack.h" - -using namespace sdfat; - - -// Chip select PA4, shared SPI, 18 MHz, port 1. -#define SD1_CONFIG SdSpiConfig(PA4, SHARED_SPI, SD_SCK_MHZ(18), &SPI) -SdFs sd1; -FsFile file1; - -// Use mySPI2 since SPI2 is used in SPI.h as a different type. -static SPIClass mySPI2(2); -// Chip select PB21, dedicated SPI, 18 MHz, port 2. -#define SD2_CONFIG SdSpiConfig(PB12, DEDICATED_SPI, SD_SCK_MHZ(18), &mySPI2) -SdFs sd2; -FsFile file2; - -const uint8_t BUF_DIM = 100; -uint8_t buf[BUF_DIM]; - -const uint32_t FILE_SIZE = 1000000; -const uint32_t NWRITE = FILE_SIZE/BUF_DIM; -//------------------------------------------------------------------------------ -// print error msg, any SD error codes, and halt. -// store messages in flash -#define error(msg) {Serial.println(msg); errorHalt();} -void errorHalt() { - if (sd1.sdErrorCode()) { - sd1.errorHalt(); - } - sd2.errorHalt(); -} -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - Serial.print(F("FreeStack: ")); - Serial.println(FreeStack()); - - // fill buffer with known data - for (size_t i = 0; i < sizeof(buf); i++) { - buf[i] = i; - } - - Serial.println(F("type any character to start")); - while (!Serial.available()) { - SysCall::yield(); - } - - // initialize the first card - if (!sd1.begin(SD1_CONFIG)) { - error("sd1.begin"); - } - // create Dir1 on sd1 if it does not exist - if (!sd1.exists("/Dir1")) { - if (!sd1.mkdir("/Dir1")) { - error("sd1.mkdir"); - } - } - // Make Dir1 the working directory on sd1. - if (!sd1.chdir("Dir1")) { - error("dsd1.chdir"); - } - // initialize the second card - if (!sd2.begin(SD2_CONFIG)) { - error("sd2.begin"); - } -// create Dir2 on sd2 if it does not exist - if (!sd2.exists("/Dir2")) { - if (!sd2.mkdir("/Dir2")) { - error("sd2.mkdir"); - } - } - // Make Dir2 the working directory on sd2. - if (!sd2.chdir("Dir2")) { - error("sd2.chdir"); - } - // remove test.bin from /Dir1 directory of sd1 - if (sd1.exists("test.bin")) { - if (!sd1.remove("test.bin")) { - error("remove test.bin"); - } - } - // remove rename.bin from /Dir2 directory of sd2 - if (sd2.exists("rename.bin")) { - if (!sd2.remove("rename.bin")) { - error("remove rename.bin"); - } - } - // list directories. - Serial.println(F("------sd1 Dir1-------")); - sd1.ls("/", LS_R | LS_SIZE); - Serial.println(F("------sd2 Dir2-------")); - sd2.ls("/", LS_R | LS_SIZE); - Serial.println(F("---------------------")); - - // create or open /Dir1/test.bin and truncate it to zero length - if (!file1.open(&sd1, "test.bin", O_RDWR | O_CREAT | O_TRUNC)) { - error("file1.open"); - } - Serial.println(F("Writing test.bin to sd1")); - - // write data to /Dir1/test.bin on sd1 - for (uint32_t i = 0; i < NWRITE; i++) { - if (file1.write(buf, sizeof(buf)) != sizeof(buf)) { - error("file1.write"); - } - } - - // create or open /Dir2/copy.bin and truncate it to zero length - if (!file2.open(&sd2, "copy.bin", O_WRONLY | O_CREAT | O_TRUNC)) { - error("file2.open"); - } - Serial.println(F("Copying test.bin to copy.bin")); - - // copy file1 to file2 - file1.rewind(); - uint32_t t = millis(); - - while (1) { - int n = file1.read(buf, sizeof(buf)); - if (n < 0) { - error("file1.read"); - } - if (n == 0) { - break; - } - if ((int)file2.write(buf, n) != n) { - error("file2.write"); - } - } - t = millis() - t; - Serial.print(F("File size: ")); - Serial.println(file2.fileSize()); - Serial.print(F("Copy time: ")); - Serial.print(t); - Serial.println(F(" millis")); - // close test.bin - file1.close(); - // sync copy.bin so ls works. - file2.close(); - // list directories. - Serial.println(F("------sd1 -------")); - sd1.ls("/", LS_R | LS_SIZE); - Serial.println(F("------sd2 -------")); - sd2.ls("/", LS_R | LS_SIZE); - Serial.println(F("---------------------")); - Serial.println(F("Renaming copy.bin")); - // Rename copy.bin. The renamed file will be in Dir2. - if (!sd2.rename("copy.bin", "rename.bin")) { - error("rename copy.bin"); - } - file2.close(); - // list directories. - Serial.println(F("------sd1 -------")); - sd1.ls("/", LS_R | LS_SIZE); - Serial.println(F("------sd2 -------")); - sd2.ls("/", LS_R | LS_SIZE); - Serial.println(F("---------------------")); - Serial.println(F("Done")); -} -//------------------------------------------------------------------------------ -void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdErrorCodes/SdErrorCodes.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdErrorCodes/SdErrorCodes.ino index aad81f9c..458d37c7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdErrorCodes/SdErrorCodes.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdErrorCodes/SdErrorCodes.ino @@ -1,11 +1,9 @@ // Print a list of error codes, symbols, and comments. #include "SdFat.h" - -using namespace sdfat; - void setup() { Serial.begin(9600); - while (!Serial) {} + while (!Serial) { + } delay(1000); Serial.println(); Serial.println(F("Code,Symbol - failed operation")); @@ -19,4 +17,4 @@ void setup() { Serial.println(); } } -void loop() {} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdFormatter/SdFormatter.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdFormatter/SdFormatter.ino index 0b021602..6cfd37be 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdFormatter/SdFormatter.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdFormatter/SdFormatter.ino @@ -13,9 +13,6 @@ #include "SdFat.h" #include "sdios.h" -using namespace sdfat; - - /* Set DISABLE_CS_PIN to disable a second SPI device. For example, with the Ethernet shield, set DISABLE_CS_PIN @@ -34,32 +31,39 @@ const int8_t DISABLE_CS_PIN = -1; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS //============================================================================== // Serial output stream ArduinoOutStream cout(Serial); //------------------------------------------------------------------------------ uint32_t cardSectorCount = 0; -uint8_t sectorBuffer[512]; +uint8_t sectorBuffer[512]; //------------------------------------------------------------------------------ // SdCardFactory constructs and initializes the appropriate card. SdCardFactory cardFactory; // Pointer to generic SD card. SdCard* m_card = nullptr; //------------------------------------------------------------------------------ -#define sdError(msg) {cout << F("error: ") << F(msg) << endl; sdErrorHalt();} +#define sdError(msg) \ + { \ + cout << F("error: ") << F(msg) << endl; \ + sdErrorHalt(); \ + } //------------------------------------------------------------------------------ void sdErrorHalt() { if (!m_card) { @@ -73,7 +77,8 @@ void sdErrorHalt() { cout << F(" = ") << int(m_card->errorCode()) << endl; cout << F("SD errorData = ") << int(m_card->errorData()) << endl; } - SysCall::halt(); + while (true) { + } } //------------------------------------------------------------------------------ void clearSerialInput() { @@ -102,7 +107,7 @@ void eraseCard() { sdError("erase failed"); } cout << '.'; - if ((n++)%64 == 63) { + if ((n++) % 64 == 63) { cout << endl; } firstBlock += ERASE_SIZE; @@ -123,9 +128,9 @@ void formatCard() { FatFormatter fatFormatter; // Format exFAT if larger than 32GB. - bool rtn = cardSectorCount > 67108864 ? - exFatFormatter.format(m_card, sectorBuffer, &Serial) : - fatFormatter.format(m_card, sectorBuffer, &Serial); + bool rtn = cardSectorCount > 67108864 + ? exFatFormatter.format(m_card, sectorBuffer, &Serial) + : fatFormatter.format(m_card, sectorBuffer, &Serial); if (!rtn) { sdErrorHalt(); @@ -136,8 +141,8 @@ void formatCard() { void printConfig(SdSpiConfig config) { if (DISABLE_CS_PIN < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CS_PIN to disable an SPI device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CS_PIN to disable an SPI device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CS_PIN) << endl; @@ -158,32 +163,32 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } printConfig(SD_CONFIG); cout << F("\nType any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Discard any extra characters. clearSerialInput(); cout << F( - "\n" - "This program can erase and/or format SD/SDHC/SDXC cards.\n" - "\n" - "Erase uses the card's fast flash erase command.\n" - "Flash erase sets all data to 0X00 for most cards\n" - "and 0XFF for a few vendor's cards.\n" - "\n" - "Cards up to 2 GiB (GiB = 2^30 bytes) will be formated FAT16.\n" - "Cards larger than 2 GiB and up to 32 GiB will be formatted\n" - "FAT32. Cards larger than 32 GiB will be formatted exFAT.\n" - "\n" - "Warning, all data on the card will be erased.\n" - "Enter 'Y' to continue: "); + "\n" + "This program can erase and/or format SD/SDHC/SDXC cards.\n" + "\n" + "Erase uses the card's fast flash erase command.\n" + "Flash erase sets all data to 0X00 for most cards\n" + "and 0XFF for a few vendor's cards.\n" + "\n" + "Cards up to 2 GiB (GiB = 2^30 bytes) will be formated FAT16.\n" + "Cards larger than 2 GiB and up to 32 GiB will be formatted\n" + "FAT32. Cards larger than 32 GiB will be formatted exFAT.\n" + "\n" + "Warning, all data on the card will be erased.\n" + "Enter 'Y' to continue: "); while (!Serial.available()) { - SysCall::yield(); + yield(); } c = Serial.read(); cout << c << endl; @@ -207,9 +212,9 @@ void setup() { return; } - cout << F("\nCard size: ") << cardSectorCount*5.12e-7; + cout << F("\nCard size: ") << cardSectorCount * 5.12e-7; cout << F(" GB (GB = 1E9 bytes)\n"); - cout << F("Card size: ") << cardSectorCount/2097152.0; + cout << F("Card size: ") << cardSectorCount / 2097152.0; cout << F(" GiB (GiB = 2^30 bytes)\n"); cout << F("Card will be formated "); @@ -221,16 +226,16 @@ void setup() { cout << F("FAT16\n"); } cout << F( - "\n" - "Options are:\n" - "E - erase the card and skip formatting.\n" - "F - erase and then format the card. (recommended)\n" - "Q - quick format the card without erase.\n" - "\n" - "Enter option: "); + "\n" + "Options are:\n" + "E - erase the card and skip formatting.\n" + "F - erase and then format the card. (recommended)\n" + "Q - quick format the card without erase.\n" + "\n" + "Enter option: "); while (!Serial.available()) { - SysCall::yield(); + yield(); } c = Serial.read(); cout << c << endl; @@ -245,5 +250,4 @@ void setup() { formatCard(); } } -void loop() { -} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdInfo/SdInfo.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdInfo/SdInfo.ino index 597061cf..5edbbad4 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/SdInfo/SdInfo.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/SdInfo/SdInfo.ino @@ -1,11 +1,13 @@ /* * This program attempts to initialize an SD card and analyze its structure. + * The CID and CSD registers are also printed in HEX for use in online + * decoders like these. + * + * https://gurumeditation.org/1342/sd-memory-card-register-decoder/ + * https://archive.goughlui.com/static/multicid.htm */ #include "SdFat.h" #include "sdios.h" - -using namespace sdfat; - /* Set DISABLE_CS_PIN to disable a second SPI device. For example, with the Ethernet shield, set DISABLE_CS_PIN @@ -22,9 +24,9 @@ const int8_t DISABLE_CS_PIN = -1; */ // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN -const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +const uint8_t SD_CS_PIN = 4; +#else // SDCARD_SS_PIN +const uint8_t SD_CS_PIN = 4; #endif // SDCARD_SS_PIN // Try to select the best SD card configuration. @@ -38,28 +40,28 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; //------------------------------------------------------------------------------ SdFs sd; -cid_t m_cid; -csd_t m_csd; -uint32_t m_eraseSize; -uint32_t m_ocr; +cid_t cid; +csd_t csd; +scr_t scr; +uint8_t cmd6Data[64]; +uint32_t eraseSize; +uint32_t ocr; static ArduinoOutStream cout(Serial); //------------------------------------------------------------------------------ -bool cidDmp() { +void cidDmp() { cout << F("\nManufacturer ID: "); - cout << uppercase << showbase << hex << int(m_cid.mid) << dec << endl; - cout << F("OEM ID: ") << m_cid.oid[0] << m_cid.oid[1] << endl; + cout << uppercase << showbase << hex << int(cid.mid) << dec << endl; + cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { - cout << m_cid.pnm[i]; + cout << cid.pnm[i]; } - cout << F("\nVersion: "); - cout << int(m_cid.prv_n) << '.' << int(m_cid.prv_m) << endl; - cout << F("Serial number: ") << hex << m_cid.psn << dec << endl; + cout << F("\nRevision: ") << cid.prvN() << '.' << cid.prvM() << endl; + cout << F("Serial number: ") << hex << cid.psn() << dec << endl; cout << F("Manufacturing date: "); - cout << int(m_cid.mdt_month) << '/'; - cout << (2000 + m_cid.mdt_year_low + 10 * m_cid.mdt_year_high) << endl; - cout << endl; - return true; + cout << cid.mdtMonth() << '/' << cid.mdtYear() << endl; + cout << F("CID HEX: "); + hexDmp(&cid, sizeof(cid)); } //------------------------------------------------------------------------------ void clearSerialInput() { @@ -71,30 +73,26 @@ void clearSerialInput() { } while (micros() - m < 10000); } //------------------------------------------------------------------------------ -bool csdDmp() { - bool eraseSingleBlock; - if (m_csd.v1.csd_ver == 0) { - eraseSingleBlock = m_csd.v1.erase_blk_en; - m_eraseSize = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; - } else if (m_csd.v2.csd_ver == 1) { - eraseSingleBlock = m_csd.v2.erase_blk_en; - m_eraseSize = (m_csd.v2.sector_size_high << 1) | m_csd.v2.sector_size_low; - } else { - cout << F("m_csd version error\n"); - return false; - } - m_eraseSize++; - cout << F("cardSize: ") << 0.000512 * sdCardCapacity(&m_csd); +void csdDmp() { + eraseSize = csd.eraseSize(); + cout << F("\ncardSize: ") << 0.000512 * csd.capacity(); cout << F(" MB (MB = 1,000,000 bytes)\n"); - cout << F("flashEraseSize: ") << int(m_eraseSize) << F(" blocks\n"); + cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); cout << F("eraseSingleBlock: "); - if (eraseSingleBlock) { + if (csd.eraseSingleBlock()) { cout << F("true\n"); } else { cout << F("false\n"); } - return true; + cout << F("dataAfterErase: "); + if (scr.dataAfterErase()) { + cout << F("ones\n"); + } else { + cout << F("zeros\n"); + } + cout << F("CSD HEX: "); + hexDmp(&csd, sizeof(csd)); } //------------------------------------------------------------------------------ void errorPrint() { @@ -102,10 +100,19 @@ void errorPrint() { cout << F("SD errorCode: ") << hex << showbase; printSdErrorSymbol(&Serial, sd.sdErrorCode()); cout << F(" = ") << int(sd.sdErrorCode()) << endl; - cout << F("SD errorData = ") << int(sd.sdErrorData()) << endl; + cout << F("SD errorData = ") << int(sd.sdErrorData()) << dec << endl; } } //------------------------------------------------------------------------------ +void hexDmp(void* reg, uint8_t size) { + uint8_t* u8 = reinterpret_cast(reg); + cout << hex << noshowbase; + for (size_t i = 0; i < size; i++) { + cout << setw(2) << setfill('0') << int(u8[i]); + } + cout << dec << endl; +} +//------------------------------------------------------------------------------ bool mbrDmp() { MbrSector_t mbr; bool valid = true; @@ -117,18 +124,18 @@ bool mbrDmp() { cout << F("\nSD Partition Table\n"); cout << F("part,boot,bgnCHS[3],type,endCHS[3],start,length\n"); for (uint8_t ip = 1; ip < 5; ip++) { - MbrPart_t *pt = &mbr.part[ip - 1]; + MbrPart_t* pt = &mbr.part[ip - 1]; if ((pt->boot != 0 && pt->boot != 0X80) || - getLe32(pt->relativeSectors) > sdCardCapacity(&m_csd)) { + getLe32(pt->relativeSectors) > csd.capacity()) { valid = false; } cout << int(ip) << ',' << uppercase << showbase << hex; cout << int(pt->boot) << ','; - for (int i = 0; i < 3; i++ ) { + for (int i = 0; i < 3; i++) { cout << int(pt->beginCHS[i]) << ','; } cout << int(pt->type) << ','; - for (int i = 0; i < 3; i++ ) { + for (int i = 0; i < 3; i++) { cout << int(pt->endCHS[i]) << ','; } cout << dec << getLe32(pt->relativeSectors) << ','; @@ -142,25 +149,26 @@ bool mbrDmp() { //------------------------------------------------------------------------------ void dmpVol() { cout << F("\nScanning FAT, please wait.\n"); - uint32_t freeClusterCount = sd.freeClusterCount(); + int32_t freeClusterCount = sd.freeClusterCount(); if (sd.fatType() <= 32) { cout << F("\nVolume is FAT") << int(sd.fatType()) << endl; } else { cout << F("\nVolume is exFAT\n"); } cout << F("sectorsPerCluster: ") << sd.sectorsPerCluster() << endl; - cout << F("clusterCount: ") << sd.clusterCount() << endl; - cout << F("freeClusterCount: ") << freeClusterCount << endl; cout << F("fatStartSector: ") << sd.fatStartSector() << endl; cout << F("dataStartSector: ") << sd.dataStartSector() << endl; - if (sd.dataStartSector() % m_eraseSize) { - cout << F("Data area is not aligned on flash erase boundary!\n"); - cout << F("Download and use formatter from www.sdcard.org!\n"); + cout << F("clusterCount: ") << sd.clusterCount() << endl; + cout << F("freeClusterCount: "); + if (freeClusterCount >= 0) { + cout << freeClusterCount << endl; + } else { + cout << F("failed\n"); + errorPrint(); } } //------------------------------------------------------------------------------ void printCardType() { - cout << F("\nCard type: "); switch (sd.card()->type()) { @@ -173,7 +181,7 @@ void printCardType() { break; case SD_CARD_TYPE_SDHC: - if (sdCardCapacity(&m_csd) < 70000000) { + if (csd.capacity() < 70000000) { cout << F("SDHC\n"); } else { cout << F("SDXC\n"); @@ -188,8 +196,8 @@ void printCardType() { void printConfig(SdSpiConfig config) { if (DISABLE_CS_PIN < 0) { cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CS_PIN to disable an SPI device.\n"); + "\nAssuming the SD is the only SPI device.\n" + "Edit DISABLE_CS_PIN to disable an SPI device.\n"); } else { cout << F("\nDisabling SPI device on pin "); cout << int(DISABLE_CS_PIN) << endl; @@ -209,11 +217,10 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } - cout << F("SdFat version: ") << SD_FAT_VERSION << endl; + cout << F("SdFat version: ") << SD_FAT_VERSION_STR << endl; printConfig(SD_CONFIG); - } //------------------------------------------------------------------------------ void loop() { @@ -223,39 +230,45 @@ void loop() { // F stores strings in flash to save RAM cout << F("\ntype any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } uint32_t t = millis(); if (!sd.cardBegin(SD_CONFIG)) { cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is there a wiring/soldering problem?\n"); + "\nSD initialization failed.\n" + "Do not reformat the card!\n" + "Is the card correctly inserted?\n" + "Is there a wiring/soldering problem?\n"); if (isSpi(SD_CONFIG)) { cout << F( - "Is SD_CS_PIN set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - ); + "Is SD_CS_PIN set to the correct value?\n" + "Does another SPI device need to be disabled?\n"); } errorPrint(); return; } t = millis() - t; - cout << F("init time: ") << t << " ms" << endl; + cout << F("init time: ") << dec << t << " ms" << endl; - if (!sd.card()->readCID(&m_cid) || - !sd.card()->readCSD(&m_csd) || - !sd.card()->readOCR(&m_ocr)) { + if (!sd.card()->readCID(&cid) || !sd.card()->readCSD(&csd) || + !sd.card()->readOCR(&ocr) || !sd.card()->readSCR(&scr)) { cout << F("readInfo failed\n"); errorPrint(); return; } printCardType(); + cout << F("sdSpecVer: ") << 0.01 * scr.sdSpecVer() << endl; + cout << F("HighSpeedMode: "); + if (scr.sdSpecVer() > 101 && sd.card()->cardCMD6(0X00FFFFFF, cmd6Data) && + (2 & cmd6Data[13])) { + cout << F("true\n"); + } else { + cout << F("false\n"); + } cidDmp(); csdDmp(); cout << F("\nOCR: ") << uppercase << showbase; - cout << hex << m_ocr << dec << endl; + cout << hex << ocr << dec << endl; if (!mbrDmp()) { return; } diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/SoftwareSpi/SoftwareSpi.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/SoftwareSpi/SoftwareSpi.ino index 3145206e..1300cfa0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/SoftwareSpi/SoftwareSpi.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/SoftwareSpi/SoftwareSpi.ino @@ -4,14 +4,11 @@ // This example will also run on an Uno and other boards using software SPI. // #include "SdFat.h" - -using namespace sdfat; - #if SPI_DRIVER_SELECT == 2 // Must be set in SdFat/SdFatConfig.h // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 0 +#define SD_FAT_TYPE 3 // // Chip select may be constant or RAM variable. const uint8_t SD_CS_PIN = 10; @@ -19,12 +16,16 @@ const uint8_t SD_CS_PIN = 10; // Pin numbers in templates must be constants. const uint8_t SOFT_MISO_PIN = 12; const uint8_t SOFT_MOSI_PIN = 11; -const uint8_t SOFT_SCK_PIN = 13; +const uint8_t SOFT_SCK_PIN = 13; // SdFat software SPI template SoftSpiDriver softSpi; // Speed argument is ignored for software SPI. +#if ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(0), &softSpi) +#else // ENABLE_DEDICATED_SPI +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(0), &softSpi) +#endif // ENABLE_DEDICATED_SPI #if SD_FAT_TYPE == 0 SdFat sd; @@ -46,11 +47,11 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.println("Type any character to start"); while (!Serial.available()) { - SysCall::yield(); + yield(); } if (!sd.begin(SD_CONFIG)) { @@ -76,4 +77,4 @@ void setup() { void loop() {} #else // SPI_DRIVER_SELECT #error SPI_DRIVER_SELECT must be two in SdFat/SdFatConfig.h -#endif //SPI_DRIVER_SELECT +#endif // SPI_DRIVER_SELECT \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/SpiLoopBackTest/SpiLoopBackTest.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/SpiLoopBackTest/SpiLoopBackTest.ino new file mode 100644 index 00000000..88101a08 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/SpiLoopBackTest/SpiLoopBackTest.ino @@ -0,0 +1,66 @@ +// This is a simple SPI loop-back test. +// +// Connect SD_MISO to SD_MOSI +// +// Modify these defines for your configuration. +#define SD_SPI SPI +#define SD_MISO MISO +#define SD_MOSI MOSI + +#include "SPI.h" +void setup() { + uint8_t rx, tx; + Serial.begin(9600); + while (!Serial) { + yield(); + } + Serial.println(F("\nType any character to start")); + while (!Serial.available()) { + yield(); + } + Serial.print("Begin, SD_MISO: "); + Serial.print(SD_MISO), Serial.print(", SD_MOSI: "); + Serial.println(SD_MOSI); + pinMode(SD_MISO, INPUT_PULLUP); + pinMode(SD_MOSI, OUTPUT); + digitalWrite(SD_MOSI, HIGH); + if (!digitalRead(SD_MISO)) { + Serial.println("Error: SD_MISO not HIGH"); + goto fail; + } + digitalWrite(SD_MOSI, LOW); + if (digitalRead(SD_MISO)) { + Serial.println("Error: SD_MISO not LOW"); + goto fail; + } + pinMode(SD_MISO, INPUT); + pinMode(SD_MOSI, INPUT); + + // Modify if SD_SPI.begin has arguments and use this style SdFat begin call: + // sd.begin(SdSpiConfig(CS_PIN, USER_SPI_BEGIN | , &SD_SPI)); + SD_SPI.begin(); + + // Start with a 400 kHz clock. Try full speed if success for 400 kHz. + SD_SPI.beginTransaction(SPISettings(400000, MSBFIRST, SPI_MODE0)); + tx = 0; + do { + rx = SD_SPI.transfer(tx); + if (tx != rx) { + Serial.print("Error rx: 0x"); + Serial.print(rx, HEX); + Serial.print(" != tx: 0x"); + Serial.println(tx, HEX); + SD_SPI.endTransaction(); + goto fail; + } + } while (tx++ < 255); + SD_SPI.endTransaction(); + Serial.println("Success!"); + return; + +fail: + SD_SPI.endTransaction(); + Serial.println("Is SD_MISO connected to SD_MOSI?"); + Serial.println("Are SD_MISO and SD_MOSI correct?"); +} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino new file mode 100644 index 00000000..ad491f4a --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyDmaAdcLogger/TeensyDmaAdcLogger.ino @@ -0,0 +1,214 @@ +// Test of Teensy exFAT DMA ADC logger. +// This is mainly to test use of RingBuf in an ISR. +// This example only supports pins on the first ADC. +// it has only been tested on Teensy 3.6 and 4.1. +// You should modify it for serious use as a data logger. +// +#include "ADC.h" +#include "DMAChannel.h" +#include "FreeStack.h" +#include "RingBuf.h" +#include "SdFat.h" + +// Pin must be on first ADC. +#define ADC_PIN A0 + +// 400 sector RingBuf - could be larger on Teensy 4.1. +const size_t RING_BUF_SIZE = 400 * 512; + +// Preallocate 8GiB file. +const uint64_t PRE_ALLOCATE_SIZE = 8ULL << 30; + +// Use FIFO SDIO. +#define SD_CONFIG SdioConfig(FIFO_SDIO) + +ADC adc; + +DMAChannel dma(true); + +SdFs sd; + +FsFile file; + +// Ping-pong DMA buffer. +DMAMEM static uint16_t __attribute__((aligned(32))) dmaBuf[2][256]; + +// Count of DMA interrupts. +volatile size_t dmaCount; + +// RingBuf for 512 byte sectors. +RingBuf rb; + +// Shared between ISR and background. +volatile size_t maxBytesUsed; + +// Overrun error for write to RingBuf. +volatile bool overrun; +//------------------------------------------------------------------------------ +// ISR for DMA. +static void isr() { + if (!overrun) { + // Clear cache for buffer filled by DMA to insure read from DMA memory. + arm_dcache_delete((void*)dmaBuf[dmaCount & 1], 512); + // Enable RingBuf functions to be called in ISR. + rb.beginISR(); + if (rb.write(dmaBuf[dmaCount & 1], 512) == 512) { + dmaCount++; + if (rb.bytesUsed() > maxBytesUsed) { + maxBytesUsed = rb.bytesUsed(); + } + } else { + overrun = true; + } + // End use of RingBuf functions in ISR. + rb.endISR(); + } + dma.clearComplete(); + dma.clearInterrupt(); +#if defined(__IMXRT1062__) + // Handle clear interrupt glitch in Teensy 4.x! + asm("DSB"); +#endif // defined(__IMXRT1062__) +} +//------------------------------------------------------------------------------ +#if defined(__IMXRT1062__) // Teensy 4.x +#define SOURCE_SADDR ADC1_R0 +#define SOURCE_EVENT DMAMUX_SOURCE_ADC1 +#else +#define SOURCE_SADDR ADC0_RA +#define SOURCE_EVENT DMAMUX_SOURCE_ADC0 +#endif +//------------------------------------------------------------------------------ +static void init(uint8_t pin) { + dma.begin(); + dma.attachInterrupt(isr); + dma.source((volatile const signed short&)SOURCE_SADDR); + dma.destinationBuffer((volatile uint16_t*)dmaBuf, sizeof(dmaBuf)); + dma.interruptAtHalf(); + dma.interruptAtCompletion(); + dma.triggerAtHardwareEvent(SOURCE_EVENT); + dma.enable(); + adc.adc0->enableDMA(); + adc.adc0->startContinuous(pin); +} +//------------------------------------------------------------------------------ +void stopDma() { + adc.adc0->disableDMA(); + dma.disable(); +} +//------------------------------------------------------------------------------ +void printTest(Print* pr) { + if (file.fileSize() < 1024 * 2) { + return; + } + file.rewind(); + rb.begin(&file); + // Could readIn RING_BUF_SIZE bytes and write to a csv file in a loop. + if (rb.readIn(2048) != 2048) { + sd.errorHalt("rb.readIn failed"); + } + uint16_t data; + for (size_t i = 0; i < 1024; i++) { + pr->print(i); + pr->print(','); + // Test read with: template bool read(Type* data). + rb.read(&data); + pr->println(data); + } +} +//------------------------------------------------------------------------------ +void runTest(uint8_t pin) { + dmaCount = 0; + maxBytesUsed = 0; + overrun = false; + do { + delay(10); + } while (Serial.read() >= 0); + + if (!file.open("IsrLoggerTest.bin", O_CREAT | O_TRUNC | O_RDWR)) { + sd.errorHalt("file.open failed"); + } + if (!file.preAllocate(PRE_ALLOCATE_SIZE)) { + sd.errorHalt("file.preAllocate failed"); + } + rb.begin(&file); + Serial.println("Type any character to stop\n"); + + init(pin); + uint32_t samplingTime = micros(); + while (!overrun && !Serial.available()) { + size_t n = rb.bytesUsed(); + if ((n + file.curPosition()) >= (PRE_ALLOCATE_SIZE - 512)) { + Serial.println("File full - stopping"); + break; + } + if (n >= 512) { + if (rb.writeOut(512) != 512) { + Serial.println("writeOut() failed"); + file.close(); + return; + } + } + } + stopDma(); + samplingTime = micros() - samplingTime; + if (!rb.sync()) { + Serial.println("sync() failed"); + file.close(); + return; + } + if (!file.truncate()) { + sd.errorHalt("truncate failed"); + } + if (overrun) { + Serial.println("Overrun ERROR!!"); + } + Serial.print("dmsCount "); + Serial.println(dmaCount); + Serial.print("RingBufSize "); + Serial.println(RING_BUF_SIZE); + Serial.print("maxBytesUsed "); + Serial.println(maxBytesUsed); + Serial.print("fileSize "); + file.printFileSize(&Serial); + Serial.println(); + Serial.print(0.000001 * samplingTime); + Serial.println(" seconds"); + Serial.print(1.0 * file.fileSize() / samplingTime, 3); + Serial.println(" MB/sec\n"); + printTest(&Serial); + file.close(); +} +//------------------------------------------------------------------------------ +void waitSerial(const char* msg) { + do { + delay(10); + } while (Serial.read() >= 0); + Serial.println(msg); + while (!Serial.available()) { + } + Serial.println(); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + while (!Serial) { + yield(); + } + waitSerial("Type any character to begin"); + Serial.print("FreeStack: "); + Serial.println(FreeStack()); +} +//------------------------------------------------------------------------------ +void loop() { + if (!sd.begin(SD_CONFIG)) { + sd.initErrorHalt(&Serial); + } + // Try for max speed. + adc.adc0->setAveraging(1); + adc.adc0->setResolution(10); + adc.adc0->setConversionSpeed(ADC_CONVERSION_SPEED::VERY_HIGH_SPEED); + adc.adc0->setSamplingSpeed(ADC_SAMPLING_SPEED::VERY_HIGH_SPEED); + runTest(ADC_PIN); + waitSerial("Type any character to run test again"); +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino index 62d4d22e..496c1d02 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensyRtcTimestamp/TeensyRtcTimestamp.ino @@ -1,11 +1,9 @@ // Test of time-stamp callback with Teensy 3/4. // The upload time will be used to set the RTC. // You must arrange for syncing the RTC. -#include "SdFat.h" #include -using namespace sdfat; - +#include "SdFat.h" // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. @@ -22,18 +20,21 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) + // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -55,7 +56,6 @@ FsFile file; //------------------------------------------------------------------------------ // Call back for file timestamps. Only called for file create and sync(). void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { - // Return date using FS_DATE macro to format fields. *date = FS_DATE(year(), month(), day()); @@ -66,10 +66,7 @@ void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { *ms10 = second() & 1 ? 100 : 0; } //------------------------------------------------------------------------------ -time_t getTeensy3Time() -{ - return Teensy3Clock.get(); -} +time_t getTeensy3Time() { return Teensy3Clock.get(); } //------------------------------------------------------------------------------ void printField(Print* pr, char sep, uint8_t v) { if (sep) { @@ -102,7 +99,7 @@ void setup() { while (!Serial.available()) { yield(); } - if (timeStatus()!= timeSet) { + if (timeStatus() != timeSet) { Serial.println("Unable to sync with the RTC"); return; } @@ -135,5 +132,4 @@ void setup() { Serial.println(F("Done")); } //------------------------------------------------------------------------------ -void loop() { -} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioDemo/TeensySdioDemo.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioDemo/TeensySdioDemo.ino index 1505c0fa..6dfbd9d8 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioDemo/TeensySdioDemo.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioDemo/TeensySdioDemo.ino @@ -2,15 +2,12 @@ // Demonstrates yield() efficiency for SDIO modes. #include "SdFat.h" -using namespace sdfat; - - // Use built-in SD for SPI modes on Teensy 3.5/3.6. // Teensy 4.0 use first SPI port. // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -23,7 +20,7 @@ const uint8_t SD_CS_PIN = SDCARD_SS_PIN; const size_t BUF_DIM = 32768; // 8 MiB file. -const uint32_t FILE_SIZE = 256UL*BUF_DIM; +const uint32_t FILE_SIZE = 256UL * BUF_DIM; #if SD_FAT_TYPE == 0 SdFat sd; @@ -75,13 +72,12 @@ void errorHalt(const char* msg) { Serial.print(", ErrorData: 0X"); Serial.println(sd.sdErrorData(), HEX); } - while (true) {} + while (true) { + } } bool ready = false; //------------------------------------------------------------------------------ -bool sdBusy() { - return ready ? sd.card()->isBusy() : false; -} +bool sdBusy() { return ready ? sd.card()->isBusy() : false; } //------------------------------------------------------------------------------ // Replace "weak" system yield() function. void yield() { @@ -113,7 +109,7 @@ void runTest() { Serial.println("\nsize,write,read"); Serial.println("bytes,KB/sec,KB/sec"); for (size_t nb = 512; nb <= BUF_DIM; nb *= 2) { - uint32_t nRdWr = FILE_SIZE/nb; + uint32_t nRdWr = FILE_SIZE / nb; if (!file.truncate(0)) { errorHalt("truncate failed"); } @@ -124,14 +120,14 @@ void runTest() { for (uint32_t n = 0; n < nRdWr; n++) { // Set start and end of buffer. buf32[0] = n; - buf32[nb/4 - 1] = n; + buf32[nb / 4 - 1] = n; if (nb != file.write(buf, nb)) { errorHalt("write failed"); } } t = micros() - t; totalMicros += t; - Serial.print(1000.0*FILE_SIZE/t); + Serial.print(1000.0 * FILE_SIZE / t); Serial.print(','); file.rewind(); t = micros(); @@ -141,13 +137,13 @@ void runTest() { errorHalt("read failed"); } // crude check of data. - if (buf32[0] != n || buf32[nb/4 - 1] != n) { + if (buf32[0] != n || buf32[nb / 4 - 1] != n) { errorHalt("data check"); } } t = micros() - t; totalMicros += t; - Serial.println(1000.0*FILE_SIZE/t); + Serial.println(1000.0 * FILE_SIZE / t); } file.close(); Serial.print("\ntotalMicros "); @@ -158,8 +154,8 @@ void runTest() { Serial.println(yieldCalls); Serial.print("yieldMaxUsec "); Serial.println(yieldMaxUsec); -// Serial.print("kHzSdClk "); -// Serial.println(kHzSdClk()); + // Serial.print("kHzSdClk "); + // Serial.println(kHzSdClk()); Serial.println("Done"); } //------------------------------------------------------------------------------ @@ -174,22 +170,22 @@ void loop() { if (warn) { warn = false; Serial.println( - "SD cards must be power cycled to leave\n" - "SPI mode so do SDIO tests first.\n" - "\nCycle power on the card if an error occurs."); + "SD cards must be power cycled to leave\n" + "SPI mode so do SDIO tests first.\n" + "\nCycle power on the card if an error occurs."); } clearSerialInput(); Serial.println( - "\nType '1' for FIFO SDIO" - "\n '2' for DMA SDIO" - "\n '3' for Dedicated SPI" - "\n '4' for Shared SPI"); + "\nType '1' for FIFO SDIO" + "\n '2' for DMA SDIO" + "\n '3' for Dedicated SPI" + "\n '4' for Shared SPI"); while (!Serial.available()) { } char c = Serial.read(); - if (c =='1') { + if (c == '1') { if (!sd.begin(SdioConfig(FIFO_SDIO))) { errorHalt("begin failed"); } @@ -200,10 +196,15 @@ void loop() { } Serial.println("\nDMA SDIO mode - slow for small transfers."); } else if (c == '3') { +#if ENABLE_DEDICATED_SPI if (!sd.begin(SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(50)))) { errorHalt("begin failed"); } Serial.println("\nDedicated SPI mode."); +#else // ENABLE_DEDICATED_SPI + Serial.println("ENABLE_DEDICATED_SPI must be non-zero."); + return; +#endif // ENABLE_DEDICATED_SPI } else if (c == '4') { if (!sd.begin(SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(50)))) { errorHalt("begin failed"); @@ -216,4 +217,4 @@ void loop() { ready = true; runTest(); ready = false; -} +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioLogger/TeensySdioLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioLogger/TeensySdioLogger.ino new file mode 100644 index 00000000..36a51b93 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/TeensySdioLogger/TeensySdioLogger.ino @@ -0,0 +1,151 @@ +// Test Teensy SDIO with write busy in a data logger demo. +// +// The driver writes to the uSDHC controller's FIFO then returns +// while the controller writes the data to the SD. The first sector +// puts the controller in write mode and takes about 11 usec on a +// Teensy 4.1. About 5 usec is required to write a sector when the +// controller is in write mode. + +#include "RingBuf.h" +#include "SdFat.h" + +// Use Teensy SDIO +#define SD_CONFIG SdioConfig(FIFO_SDIO) + +// Interval between points for 25 ksps. +#define LOG_INTERVAL_USEC 40 + +// Size to log 10 byte lines at 25 kHz for more than ten minutes. +#define LOG_FILE_SIZE 10 * 25000 * 600 // 150,000,000 bytes. + +// Space to hold more than 800 ms of data for 10 byte lines at 25 ksps. +#define RING_BUF_CAPACITY 400 * 512 +#define LOG_FILENAME "SdioLogger.csv" + +SdFs sd; +FsFile file; + +// RingBuf for File type FsFile. +RingBuf rb; + +void logData() { + // Initialize the SD. + if (!sd.begin(SD_CONFIG)) { + sd.initErrorHalt(&Serial); + } + // Open or create file - truncate existing file. + if (!file.open(LOG_FILENAME, O_RDWR | O_CREAT | O_TRUNC)) { + Serial.println("open failed\n"); + return; + } + // File must be pre-allocated to avoid huge + // delays searching for free clusters. + if (!file.preAllocate(LOG_FILE_SIZE)) { + Serial.println("preAllocate failed\n"); + file.close(); + return; + } + // initialize the RingBuf. + rb.begin(&file); + Serial.println("Type any character to stop"); + + // Max RingBuf used bytes. Useful to understand RingBuf overrun. + size_t maxUsed = 0; + + // Min spare micros in loop. + int32_t minSpareMicros = INT32_MAX; + + // Start time. + uint32_t logTime = micros(); + // Log data until Serial input or file full. + while (!Serial.available()) { + // Amount of data in ringBuf. + size_t n = rb.bytesUsed(); + if ((n + file.curPosition()) > (LOG_FILE_SIZE - 20)) { + Serial.println("File full - quitting."); + break; + } + if (n > maxUsed) { + maxUsed = n; + } + if (n >= 512 && !file.isBusy()) { + // Not busy only allows one sector before possible busy wait. + // Write one sector from RingBuf to file. + if (512 != rb.writeOut(512)) { + Serial.println("writeOut failed"); + break; + } + } + // Time for next point. + logTime += LOG_INTERVAL_USEC; + int32_t spareMicros = logTime - micros(); + if (spareMicros < minSpareMicros) { + minSpareMicros = spareMicros; + } + if (spareMicros <= 0) { + Serial.print("Rate too fast "); + Serial.println(spareMicros); + break; + } + // Wait until time to log data. + while (micros() < logTime) { + } + + // Read ADC0 - about 17 usec on Teensy 4, Teensy 3.6 is faster. + uint16_t adc = analogRead(0); + // Print spareMicros into the RingBuf as test data. + rb.print(spareMicros); + rb.write(','); + // Print adc into RingBuf. + rb.println(adc); + if (rb.getWriteError()) { + // Error caused by too few free bytes in RingBuf. + Serial.println("WriteError"); + break; + } + } + // Write any RingBuf data to file. + rb.sync(); + file.truncate(); + file.rewind(); + // Print first twenty lines of file. + Serial.println("spareMicros,ADC0"); + for (uint8_t n = 0; n < 20 && file.available();) { + int c = file.read(); + if (c < 0) { + break; + } + Serial.write(c); + if (c == '\n') n++; + } + Serial.print("fileSize: "); + Serial.println((uint32_t)file.fileSize()); + Serial.print("maxBytesUsed: "); + Serial.println(maxUsed); + Serial.print("minSpareMicros: "); + Serial.println(minSpareMicros); + file.close(); +} +void clearSerialInput() { + for (uint32_t m = micros(); micros() - m < 10000;) { + if (Serial.read() >= 0) { + m = micros(); + } + } +} +void setup() { + Serial.begin(9600); + while (!Serial) { + } + // Go faster or log more channels. ADC quality will suffer. + // analogReadAveraging(1); +} + +void loop() { + clearSerialInput(); + Serial.println("Type any character to start"); + while (!Serial.available()) { + } + clearSerialInput(); + logData(); +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/UnicodeFilenames/UnicodeFilenames.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/UnicodeFilenames/UnicodeFilenames.ino new file mode 100644 index 00000000..a1524070 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/UnicodeFilenames/UnicodeFilenames.ino @@ -0,0 +1,97 @@ +// Simple test of Unicode filename. +// Unicode is supported as UTF-8 encoded strings. +#include "SdFat.h" + +// USE_UTF8_LONG_NAMES must be non-zero in SdFat/src/SdFatCongfig.h +#if USE_UTF8_LONG_NAMES + +#define UTF8_FOLDER u8"😀" +const char* names[] = {u8"россиянин", u8"très élégant", u8"狗.txt", nullptr}; + +// Remove files if non-zero. +#define REMOVE_UTF8_FILES 1 + +// SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, +// 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. +#define SD_FAT_TYPE 0 + +// SDCARD_SS_PIN is defined for the built-in SD on some boards. +#ifndef SDCARD_SS_PIN +const uint8_t SD_CS_PIN = SS; +#else // SDCARD_SS_PIN +// Assume built-in SD is used. +const uint8_t SD_CS_PIN = SDCARD_SS_PIN; +#endif // SDCARD_SS_PIN + +// Try to select the best SD card configuration. +#if HAS_SDIO_CLASS +#define SD_CONFIG SdioConfig(FIFO_SDIO) +#elif ENABLE_DEDICATED_SPI +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(16)) +#else // HAS_SDIO_CLASS +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(16)) +#endif // HAS_SDIO_CLASS + +#if SD_FAT_TYPE == 0 +SdFat sd; +File file; +#elif SD_FAT_TYPE == 1 +SdFat32 sd; +File32 file; +#elif SD_FAT_TYPE == 2 +SdExFat sd; +ExFile file; +#elif SD_FAT_TYPE == 3 +SdFs sd; +FsFile file; +#else // SD_FAT_TYPE +#error Invalid SD_FAT_TYPE +#endif // SD_FAT_TYPE + +void setup() { + Serial.begin(9600); + while (!Serial) { + yield(); + } + Serial.println("Type any character to begin"); + while (!Serial.available()) { + yield(); + } + if (!sd.begin(SD_CONFIG)) { + sd.initErrorHalt(&Serial); + } + if (!sd.exists(UTF8_FOLDER)) { + if (!sd.mkdir(UTF8_FOLDER)) { + Serial.println("sd.mkdir failed"); + return; + } + } + if (!sd.chdir(UTF8_FOLDER)) { + Serial.println("sd.chdir failed"); + return; + } + for (uint8_t i = 0; names[i]; i++) { + if (!file.open(names[i], O_WRONLY | O_CREAT)) { + Serial.println("file.open failed"); + return; + } + file.println(names[i]); + file.close(); + } + Serial.println("ls:"); + sd.ls("/", LS_SIZE | LS_R); +#if REMOVE_UTF8_FILES // For debug test of remove and rmdir. + for (uint8_t i = 0; names[i]; i++) { + sd.remove(names[i]); + } + sd.chdir(); + sd.rmdir(UTF8_FOLDER); + Serial.println("After remove and rmdir"); + sd.ls(LS_SIZE | LS_R); +#endif // REMOVE_UTF8_FILES + Serial.println("Done!"); +} +void loop() {} +#else // USE_UTF8_LONG_NAMES +#error USE_UTF8_LONG_NAMES must be non-zero in SdFat/src/SdFatCongfig.h +#endif // USE_UTF8_LONG_NAMES \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/UserChipSelectFunction/UserChipSelectFunction.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/UserChipSelectFunction/UserChipSelectFunction.ino index 12d2ea3a..57376d3b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/UserChipSelectFunction/UserChipSelectFunction.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/UserChipSelectFunction/UserChipSelectFunction.ino @@ -3,9 +3,6 @@ // #include "SdFat.h" -using namespace sdfat; - - // SD_CHIP_SELECT_MODE must be set to one or two in SdFat/SdFatConfig.h. // A value of one allows optional replacement and two requires replacement. #if SD_CHIP_SELECT_MODE == 1 || SD_CHIP_SELECT_MODE == 2 diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/UserSPIDriver/UserSPIDriver.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/UserSPIDriver/UserSPIDriver.ino index 4df86c3d..568db423 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/UserSPIDriver/UserSPIDriver.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/UserSPIDriver/UserSPIDriver.ino @@ -1,10 +1,7 @@ // An example of an external SPI driver. // -#include "SdFat.h" #include "SPI.h" // Only required if you use features in the SPI library. - -using namespace sdfat; - +#include "SdFat.h" #if SPI_DRIVER_SELECT == 3 // Must be set in SdFat/SdFatConfig.h @@ -19,22 +16,16 @@ using namespace sdfat; class MySpiClass : public SdSpiBaseClass { public: // Activate SPI hardware with correct speed and mode. - void activate() { - SPI.beginTransaction(m_spiSettings); - } + void activate() { SPI.beginTransaction(m_spiSettings); } // Initialize the SPI bus. void begin(SdSpiConfig config) { (void)config; SPI.begin(); } // Deactivate SPI hardware. - void deactivate() { - SPI.endTransaction(); - } + void deactivate() { SPI.endTransaction(); } // Receive a byte. - uint8_t receive() { - return SPI.transfer(0XFF); - } + uint8_t receive() { return SPI.transfer(0XFF); } // Receive multiple bytes. // Replace this function if your board has multiple byte receive. uint8_t receive(uint8_t* buf, size_t count) { @@ -44,9 +35,7 @@ class MySpiClass : public SdSpiBaseClass { return 0; } // Send a byte. - void send(uint8_t data) { - SPI.transfer(data); - } + void send(uint8_t data) { SPI.transfer(data); } // Send multiple bytes. // Replace this function if your board has multiple byte send. void send(const uint8_t* buf, size_t count) { @@ -62,8 +51,11 @@ class MySpiClass : public SdSpiBaseClass { private: SPISettings m_spiSettings; } mySpi; - +#if ENABLE_DEDICATED_SPI #define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(50), &mySpi) +#else // ENABLE_DEDICATED_SPI +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SD_SCK_MHZ(50), &mySpi) +#endif // ENABLE_DEDICATED_SPI SdFat sd; //------------------------------------------------------------------------------ @@ -73,9 +65,11 @@ void setup() { sd.initErrorHalt(&Serial); } sd.ls(&Serial, LS_SIZE); + Serial.println("Done"); } //------------------------------------------------------------------------------ void loop() {} #else // SPI_DRIVER_SELECT #error SPI_DRIVER_SELECT must be three in SdFat/SdFatConfig.h #endif // SPI_DRIVER_SELECT + diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/bench/bench.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/bench/bench.ino index 61e6b2e3..36a577c5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/bench/bench.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/bench/bench.ino @@ -2,15 +2,12 @@ * This program is a simple binary write/read benchmark. */ #include "SdFat.h" -#include "sdios.h" #include "FreeStack.h" - -using namespace sdfat; - +#include "sdios.h" // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and your hardware does not use the default value, SS. @@ -22,7 +19,7 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN @@ -61,10 +58,10 @@ const uint8_t READ_COUNT = 2; // End of configuration constants. //------------------------------------------------------------------------------ // File size in bytes. -const uint32_t FILE_SIZE = 1000000UL*FILE_SIZE_MB; +const uint32_t FILE_SIZE = 1000000UL * FILE_SIZE_MB; // Insure 4-byte alignment. -uint32_t buf32[(BUF_SIZE + 3)/4]; +uint32_t buf32[(BUF_SIZE + 3) / 4]; uint8_t* buf = (uint8_t*)buf32; #if SD_FAT_TYPE == 0 @@ -92,22 +89,19 @@ ArduinoOutStream cout(Serial); void cidDmp() { cid_t cid; if (!sd.card()->readCID(&cid)) { - error("readCID failed"); } cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; + cout << uppercase << showbase << hex << int(cid.mid) << dec << endl; cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; cout << F("Product: "); for (uint8_t i = 0; i < 5; i++) { cout << cid.pnm[i]; } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; + cout << F("\nRevision: ") << cid.prvN() << '.' << cid.prvM() << endl; + cout << F("Serial number: ") << hex << cid.psn() << dec << endl; cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; + cout << cid.mdtMonth() << '/' << cid.mdtYear() << endl; cout << endl; } //------------------------------------------------------------------------------ @@ -125,14 +119,14 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(1000); cout << F("\nUse a freshly formatted SD for best performance.\n"); if (!ENABLE_DEDICATED_SPI) { cout << F( - "\nSet ENABLE_DEDICATED_SPI nonzero in\n" - "SdFatConfig.h for best SPI performance.\n"); + "\nSet ENABLE_DEDICATED_SPI nonzero in\n" + "SdFatConfig.h for best SPI performance.\n"); } // use uppercase in hex and use 0X base prefix cout << uppercase << showbase << endl; @@ -152,7 +146,7 @@ void loop() { // F() stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } #if HAS_UNUSED_STACK cout << F("FreeStack: ") << FreeStack() << endl; @@ -167,7 +161,7 @@ void loop() { cout << F("Type is FAT") << int(sd.fatType()) << endl; } - cout << F("Card size: ") << sd.card()->sectorCount()*512E-9; + cout << F("Card size: ") << sd.card()->sectorCount() * 512E-9; cout << F(" GB (GB = 1E9 bytes)") << endl; cidDmp(); @@ -182,17 +176,17 @@ void loop() { for (size_t i = 0; i < (BUF_SIZE - 2); i++) { buf[i] = 'A' + (i % 26); } - buf[BUF_SIZE-2] = '\r'; + buf[BUF_SIZE - 2] = '\r'; } - buf[BUF_SIZE-1] = '\n'; + buf[BUF_SIZE - 1] = '\n'; cout << F("FILE_SIZE_MB = ") << FILE_SIZE_MB << endl; cout << F("BUF_SIZE = ") << BUF_SIZE << F(" bytes\n"); cout << F("Starting write test, please wait.") << endl << endl; // do write test - uint32_t n = FILE_SIZE/BUF_SIZE; - cout <= 0) { + m = micros(); + } + } while (micros() - m < 10000); +} +//------------------------------------------------------------------------------ +void setup() { + Serial.begin(9600); + + // Wait for USB Serial + while (!Serial) { + yield(); + } + delay(1000); +//------------------------------------------------------------------------------ +} +void loop() { + clearSerialInput(); + Serial.println(F("\nType any character to start\n")); + while (!Serial.available()) { + yield(); + } + // Initialize the SD card. + if (!sd.begin(SD_CONFIG)) { + sd.initErrorHalt(); + } + if (!file.open("SdBusyTest.bin", O_RDWR | O_CREAT |O_TRUNC)) { + error("file open failed"); + } + if (!file.preAllocate(FILE_SIZE)) { + error("preallocate failed"); + } + Serial.print(F("Starting write of ")); + Serial.print(FILE_SIZE_MiB); + Serial.println(F(" MiB.")); + uint32_t maxWrite = 0; + uint32_t minWrite = 99999999; + uint32_t ms = millis(); + uint32_t maxBusy = 0; + uint32_t minBusy = UINT32_MAX; + + // Write a dummy sector to start a multi-sector write. + if(file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed for first sector"); + } + + while (file.position() < FILE_SIZE) { + uint32_t m = micros(); + if (waitBusy) { + m = micros(); + while (sd.card()->isBusy()) {} + m = micros() - m; + if (m < minBusy) { + minBusy = m; + } + if (m > maxBusy) { + maxBusy = m; + } + } + m = micros(); + if (file.write(buf, sizeof(buf)) != sizeof(buf)) { + error("write failed"); + } + m = micros() - m; + if (m < minWrite) { + minWrite = m; + } + if (m > maxWrite) { + maxWrite = m; + } + } + file.close(); + ms = millis() - ms; + Serial.println(F("\nTimes in micros")); + if (waitBusy) { + Serial.print(F("minBusy: ")); + Serial.println(minBusy); + Serial.print(F("maxBusy: ")); + Serial.println(maxBusy); + } + Serial.print(F("minWrite: ")); + Serial.println(minWrite); + Serial.print(F("maxWrite: ")); + Serial.println(maxWrite); + Serial.print(1e-3*ms); + Serial.println(F(" Seconds")); + Serial.print(1.0*FILE_SIZE/ms); + Serial.println(F(" KB/sec")); + +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino new file mode 100644 index 00000000..165bf604 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/ExFatDbgDmp/ExFatDbgDmp.ino @@ -0,0 +1,51 @@ +#include "SdFat.h" +#define DUMP_RAW 0 +#define DUMP_UPCASE 0 +const uint8_t CS_PIN = SS; +//#define SD_CONFIG SdioConfig(FIFO_SDIO) +#define SD_CONFIG SdSpiConfig(CS_PIN) + +SdExFat sd; +#define error(s) sd.errorHalt(&Serial, F(s)) +void setup() { + Serial.begin(9600); + while (!Serial) { + yield(); + } + Serial.println(F("Type any character to begin")); + while (!Serial.available()) { + yield(); + } + if (!sd.begin(SD_CONFIG)){ + error("begin failed"); + } +#if DUMP_RAW + sd.dmpSector(&Serial, 0); + for (uint8_t i = 0; i < 24; i++) { + sd.dmpSector(&Serial, 0X8000 + i); + Serial.println(); + } + return; + #endif // DUMP_RAW + ExFatFile root; + if (!root.openRoot(&sd)) { + error("openRoot failed"); + } + sd.printDir(&Serial, &root); + // startSector = 0, sectorCount = 1. + sd.dmpFat(&Serial, 0, 1); + sd.dmpBitmap(&Serial); + sd.printVolInfo(&Serial); + + sd.checkUpcase(&Serial); +#if DUMP_UPCASE + sd.printUpcase(&Serial); +#endif // DUMP_UPCASE + // sd.dmpCluster(&Serial, 8, 0, 4); + Serial.println("Done"); +} + +void loop() { + // put your main code here, to run repeatedly: + +} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestGetName/TestGetName.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestGetName/TestGetName.ino new file mode 100644 index 00000000..48cfb533 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestGetName/TestGetName.ino @@ -0,0 +1,43 @@ +#include "SdFat.h" +SdFs sd; +FsFile file; +const char* name[] = { + "SFN.TXT", + "LongFilename.txt", +#if USE_UTF8_LONG_NAMES + u8"très élégant.txt", +#endif // USE_UTF8_LONG_NAMES + nullptr}; +char buf[32]; +void setup() { + Serial.begin(9600); + while (!Serial) {} + Serial.println("Type any character to begin"); + while (!Serial.available()) {} + if (!sd.begin(SS)) { + sd.initErrorHalt(); + } + for (uint8_t i = 0; name[i]; i++) { + if (!file.open(name[i], O_CREAT |O_RDWR)) { + sd.errorHalt("open"); + } + size_t len = strlen(name[i]); + size_t rtn = file.getName(buf, len); + if (rtn != 0) { + Serial.println("fail len"); + } + rtn = file.getName(buf, len + 1); + if (rtn != len) { + Serial.println("fail len + 1"); + } + Serial.print(rtn); + Serial.print(' '); + Serial.println(buf); + if (!file.remove()) { + sd.errorHalt("remove"); + } + } + Serial.println("Done"); +} + +void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestMkdir/TestMkdir.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestMkdir/TestMkdir.ino new file mode 100644 index 00000000..3101d7a4 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestMkdir/TestMkdir.ino @@ -0,0 +1,140 @@ +/* + * This sketch is a test of subdirectory and file creation. + * It also tests allocation of clusters to directories. + * + * It will create two subdirectories and create enough files + * to force the allocation of a cluster to each directory. + * + * More than 3000 files may be created on a FAT32 volume. + * + * Note: Some cards may 'stutter' others just get slow due + * to the number of flash erases this program causes. + */ +#include + +const uint8_t SD_CHIP_SELECT = SS; + +SdFat sd; +typedef File file_t; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(&Serial, F(s)) + +/* + * create enough files to force a cluster to be allocated to dir. + */ +void dirAllocTest(file_t* dir) { + char buf[32], name[32]; + file_t file; + uint16_t n; + uint32_t size = dir->dirSize(); + + // create files and write name to file + for (n = 0; ; n++){ + // make file name + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_WRONLY | O_CREAT | O_EXCL)) { + error("open for write failed"); + } + + // open end time and write start time + uint32_t t1 = millis(); + // write file name to file + file.print(name); + if (!file.close()) error("close write"); + + // write end time + uint32_t t2 = millis(); + Serial.print(F("WR ")); + Serial.print(n); + Serial.write(' '); + + // print time to create file + Serial.print(t1 - t0); + Serial.write(' '); + + // print time to write file + Serial.println(t2 - t1); + + // directory size will change when a cluster is added + if (dir->curPosition() > size) break; + } + + // read files and check content + for (uint16_t i = 0; i <= n; i++) { + sprintf(name, "%u.TXT", i); + + // open start time + uint32_t t0 = millis(); + if (!file.open(dir, name, O_RDONLY)) { + error("open for read failed"); + } + + // open end time and read start time + uint32_t t1 = millis(); + int16_t nr = file.read(buf, sizeof(buf)); + if (nr < 5) error("file.read failed"); + + // read end time + uint32_t t2 = millis(); + + // check file content + if (strlen(name) != (size_t)nr || strncmp(name, buf, nr)) { + error("content compare failed"); + } + if (!file.close()) error("close read failed"); + + Serial.print(F("RD ")); + Serial.print(i); + Serial.write(' '); + + // print open time + Serial.print(t1 - t0); + Serial.write(' '); + + // print read time + Serial.println(t2 - t1); + } +} + +void setup() { + file_t root; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try lower speed if bus errors occur. + if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) { + sd.initErrorHalt(&Serial); + } + root.openRoot(&sd); + uint32_t m = millis(); + // write files to root if not FAT16 + if (sd.fatType() != 16) { + Serial.println(F("Writing files to root")); + dirAllocTest(&root); + } + + // create sub1 and write files + file_t sub1; + if (!sub1.mkdir(&root, "SUB1")) error("makdeDir SUB1 failed"); + Serial.println(F("Writing files to SUB1")); + dirAllocTest(&sub1); + + // create sub2 and write files + file_t sub2; + if (!sub2.mkdir(&sub1, "SUB2")) error("mkdir SUB2 failed"); + Serial.println(F("Writing files to SUB2")); + dirAllocTest(&sub2); + m = millis() - m; + Serial.print(F("Done millis: ")); + Serial.println(m); +} + +void loop() { } \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestRmdir/TestRmdir.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestRmdir/TestRmdir.ino new file mode 100644 index 00000000..90e29875 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TestRmdir/TestRmdir.ino @@ -0,0 +1,99 @@ +/* + * This sketch will remove the files and directories + * created by the SdFatMakeDir.pde sketch. + * + * Performance is erratic due to the large number + * of flash erase operations caused by many random + * writes to file structures. + */ +#include + +const uint8_t SD_CHIP_SELECT = SS; + +SdFat sd; +typedef File file_t; + +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(&Serial, F(s)) + +/* + * remove all files in dir. + */ +void deleteFiles(FatFile* dir) { + char name[32]; + file_t file; + + // open and delete files + for (uint16_t n = 0; ; n++){ + sprintf(name, "%u.TXT", n); + + // open start time + uint32_t t0 = millis(); + + // assume done if open fails + if (!file.open(dir, name, O_WRONLY)) return; + + // open end time and remove start time + uint32_t t1 = millis(); + if (!file.remove()) error("file.remove failed"); + + // remove end time + uint32_t t2 = millis(); + + Serial.print(F("RM ")); + Serial.print(n); + Serial.write(' '); + + // open time + Serial.print(t1 - t0); + Serial.write(' '); + + // remove time + Serial.println(t2 - t1); + } +} + +void setup() { + file_t root; + Serial.begin(9600); + while (!Serial) {} // wait for Leonardo + Serial.println(F("Type any character to start")); + while (Serial.read() <= 0) {} + delay(200); // Catch Due reset problem + + // initialize the SD card at SPI_FULL_SPEED for best performance. + // try lower speed if bus errors occur. + if (!sd.begin(SD_CHIP_SELECT, SPI_FULL_SPEED)) { + sd.initErrorHalt(&Serial); + } + root.openRoot(&sd); + // delete files in root if not FAT16. + if (sd.fatType() != 16) { + Serial.println(F("Remove files in root")); + deleteFiles(&root); + } + + // open SUB1 and delete files + file_t sub1; + if (!sub1.open("SUB1", O_RDONLY)) error("open SUB1 failed"); + Serial.println(F("Remove files in SUB1")); + deleteFiles(&sub1); + + // open SUB2 and delete files + file_t sub2; + if (!sub2.open(&sub1, "SUB2", O_RDONLY)) error("open SUB2 failed"); + Serial.println(F("Remove files in SUB2")); + deleteFiles(&sub2); + + // remove SUB2 + if (!sub2.rmdir()) error("sub2.rmdir failed"); + Serial.println(F("SUB2 removed")); + + // remove SUB1 + if (!sub1.rmdir()) error("sub1.rmdir failed"); + Serial.println(F("SUB1 removed")); + + Serial.println(F("Done")); +} + +void loop() { } \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TimestampTest/TimestampTest.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TimestampTest/TimestampTest.ino new file mode 100644 index 00000000..520084af --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/debug/TimestampTest/TimestampTest.ino @@ -0,0 +1,162 @@ +/* + * This program tests the dateTimeCallback() function + * and the timestamp() function. + */ +#include +#include "SdFat.h" +#include "sdios.h" +SdFs sd; + +FsFile file; + +// Default SD chip select is SS pin +const uint8_t chipSelect = SS; + +// create Serial stream +ArduinoOutStream cout(Serial); +//------------------------------------------------------------------------------ +// store error strings in flash to save RAM +#define error(s) sd.errorHalt(F(s)) +//------------------------------------------------------------------------------ +/* + * date/time values for debug + * normally supplied by a real-time clock or GPS + */ +// date 1-Oct-21 +uint16_t year = 2021; +uint8_t month = 10; +uint8_t day = 1; + +// time 20:30:40 +uint8_t hour = 20; +uint8_t minute = 30; +uint8_t second = 40; +//------------------------------------------------------------------------------ +/* + * User provided date time callback function. + * See SdFile::dateTimeCallback() for usage. + */ +void dateTime(uint16_t* date, uint16_t* time) { + // User gets date and time from GPS or real-time + // clock in real callback function + + // return date using FAT_DATE macro to format fields + *date = FAT_DATE(year, month, day); + + // return time using FAT_TIME macro to format fields + *time = FAT_TIME(hour, minute, second); +} +//------------------------------------------------------------------------------ +/* + * Function to print all timestamps. + */ +void printTimestamps(FsFile& f) { + cout << F("Creation: "); + f.printCreateDateTime(&Serial); + cout << endl << F("Modify: "); + f.printModifyDateTime(&Serial); + cout << endl << F("Access: "); + f.printAccessDateTime(&Serial); + cout << endl; +} +//------------------------------------------------------------------------------ +void setup(void) { + Serial.begin(9600); + // Wait for USB Serial + while (!Serial) { + yield(); + } + cout << F("Type any character to start\n"); + while (!Serial.available()) { + yield(); + } + // Initialize at the highest speed supported by the board that is + // not over 50 MHz. Try a lower speed if SPI errors occur. + if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { + sd.initErrorHalt(); + } + + // remove files if they exist + sd.remove("callback.txt"); + sd.remove("default.txt"); + sd.remove("stamp.txt"); + + // create a new file with default timestamps + if (!file.open("default.txt", O_WRONLY | O_CREAT)) { + error("open default.txt failed"); + } + cout << F("\nOpen with default times\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test the date time callback function. + * + * dateTimeCallback() sets the function + * that is called when a file is created + * or when a file's directory entry is + * modified by sync(). + * + * The callback can be disabled by the call + * SdFile::dateTimeCallbackCancel() + */ + // set date time callback function + SdFile::dateTimeCallback(dateTime); + + // create a new file with callback timestamps + if (!file.open("callback.txt", O_WRONLY | O_CREAT)) { + error("open callback.txt failed"); + } + cout << ("\nOpen with callback times\n"); + printTimestamps(file); + + // change call back date + day += 1; + + // must add two to see change since FAT second field is 5-bits + second += 2; + + // modify file by writing a byte + file.write('t'); + + // force dir update + file.sync(); + + cout << F("\nTimes after write\n"); + printTimestamps(file); + + // close file + file.close(); + /* + * Test timestamp() function + * + * Cancel callback so sync will not + * change access/modify timestamp + */ + SdFile::dateTimeCallbackCancel(); + + // create a new file with default timestamps + if (!file.open("stamp.txt", O_WRONLY | O_CREAT)) { + error("open stamp.txt failed"); + } + // set creation date time + if (!file.timestamp(T_CREATE, 2021, 11, 10, 1, 2, 3)) { + error("set create time failed"); + } + // set write/modification date time + if (!file.timestamp(T_WRITE, 2021, 11, 11, 4, 5, 6)) { + error("set write time failed"); + } + // set access date + if (!file.timestamp(T_ACCESS, 2021, 11, 12, 7, 8, 9)) { + error("set access time failed"); + } + cout << F("\nTimes after timestamp() calls\n"); + printTimestamps(file); + + file.close(); + cout << F("\nDone\n"); +} + +void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino index 11b5f3ed..d0f21dd8 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/AnalogLogger/AnalogLogger.ino @@ -69,7 +69,7 @@ void setup() { // Wait for USB Serial. while (!Serial) { - SysCall::yield(); + yield(); } // F() stores strings in flash to save RAM cout << endl << F("FreeStack: ") << FreeStack() << endl; @@ -77,7 +77,7 @@ void setup() { #if WAIT_TO_START cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Discard input. do { @@ -193,5 +193,5 @@ void loop() { } logfile.close(); cout << F("Done!"); - SysCall::halt(); + while (true) {} } \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino index 9d6b1b5f..ea77e267 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/BaseExtCaseTest/BaseExtCaseTest.ino @@ -20,11 +20,11 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.println("type any character to start"); while (!Serial.available()) { - SysCall::yield(); + yield(); } if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { Serial.println("begin failed"); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino index 8a92300e..e90e1fc9 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/HelloWorld/HelloWorld.ino @@ -10,7 +10,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(2000); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino index c84664d3..9c7d19e3 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/SdFatSize/SdFatSize.ino @@ -15,7 +15,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } if (!sd.begin()) { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino index 56623e55..3faf28ee 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/StreamParseInt/StreamParseInt.ino @@ -13,11 +13,11 @@ void setup() { Serial.begin(9600); // Wait for USB Serial. while(!Serial) { - SysCall::yield(); + yield(); } Serial.println(F("Type any character to start")); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize the SD. if (!SD.begin(csPin)) { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/append/append.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/append/append.ino index 282668bd..3dfd8a8c 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/append/append.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/append/append.ino @@ -29,12 +29,12 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } // F() stores strings in flash to save RAM cout << endl << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/average/average.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/average/average.ino index eaa3d2da..e58714af 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/average/average.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/average/average.ino @@ -58,12 +58,12 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } // F() stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/bufstream/bufstream.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/bufstream/bufstream.ino index 27b00dd5..b4320919 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/bufstream/bufstream.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/bufstream/bufstream.ino @@ -16,7 +16,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(2000); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/cin_cout/cin_cout.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/cin_cout/cin_cout.ino index 5f8d72d8..4fb14154 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/cin_cout/cin_cout.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/cin_cout/cin_cout.ino @@ -18,7 +18,7 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } } //------------------------------------------------------------------------------ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/eventlog/eventlog.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/eventlog/eventlog.ino index 31bad67a..5bfb9566 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/eventlog/eventlog.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/eventlog/eventlog.ino @@ -38,12 +38,12 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } // F() stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } delay(400); // catch Due reset problem diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino index 05a9caac..4a99a4d1 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/fgetsRewrite/fgetsRewrite.ino @@ -89,11 +89,11 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/readlog/readlog.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/readlog/readlog.ino index 28522f98..613c3d52 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/readlog/readlog.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/#attic/readlog/readlog.ino @@ -21,7 +21,7 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino index 67cf62b6..28346288 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/AnalogBinLogger/AnalogBinLogger.ino @@ -22,6 +22,7 @@ #ifdef __AVR__ #include #include "SdFat.h" +#include "sdios.h" #include "FreeStack.h" #include "AnalogBinLogger.h" //------------------------------------------------------------------------------ @@ -648,7 +649,7 @@ void logData() { bgnErase = endErase + 1; } // Start a multiple block write. - if (!sd.card()->writeStart(bgnBlock, FILE_BLOCK_COUNT)) { + if (!sd.card()->writeStart(bgnBlock)) { error("writeBegin failed"); } // Write metadata. @@ -798,7 +799,7 @@ void loop(void) { Serial.println(F("r - record ADC data")); while(!Serial.available()) { - SysCall::yield(); + yield(); } char c = tolower(Serial.read()); if (ERROR_LED_PIN >= 0) { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino deleted file mode 100644 index 2d669f9b..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/DirectoryFunctions/DirectoryFunctions.ino +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Example use of chdir(), ls(), mkdir(), and rmdir(). - */ -#include -#include "SdFat.h" -#include "sdios.h" -// SD card chip select pin. -const uint8_t chipSelect = SS; -//------------------------------------------------------------------------------ - -// File system object. -SdFat sd; - -// Directory file. -SdFile root; - -// Use for file creation in folders. -SdFile file; - -// Create a Serial output stream. -ArduinoOutStream cout(Serial); - -// Buffer for Serial input. -char cinBuf[40]; - -// Create a serial input stream. -ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); -//============================================================================== -// Error messages stored in flash. -#define error(msg) sd.errorHalt(F(msg)) -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - delay(1000); - - cout << F("Type any character to start\n"); - // Wait for input line and discard. - cin.readline(); - cout << endl; - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - if (sd.exists("Folder1") - || sd.exists("Folder1/file1.txt") - || sd.exists("Folder1/File2.txt")) { - error("Please remove existing Folder1, file1.txt, and File2.txt"); - } - - int rootFileCount = 0; - if (!root.open("/")) { - error("open root failed"); - } - while (file.openNext(&root, O_RDONLY)) { - if (!file.isHidden()) { - rootFileCount++; - } - file.close(); - if (rootFileCount > 10) { - error("Too many files in root. Please use an empty SD."); - } - } - if (rootFileCount) { - cout << F("\nPlease use an empty SD for best results.\n\n"); - delay(1000); - } - // Create a new folder. - if (!sd.mkdir("Folder1")) { - error("Create Folder1 failed"); - } - cout << F("Created Folder1\n"); - - // Create a file in Folder1 using a path. - if (!file.open("Folder1/file1.txt", O_WRONLY | O_CREAT)) { - error("create Folder1/file1.txt failed"); - } - file.close(); - cout << F("Created Folder1/file1.txt\n"); - - // Change volume working directory to Folder1. - if (!sd.chdir("Folder1")) { - error("chdir failed for Folder1.\n"); - } - cout << F("chdir to Folder1\n"); - - // Create File2.txt in current directory. - if (!file.open("File2.txt", O_WRONLY | O_CREAT)) { - error("create File2.txt failed"); - } - file.close(); - cout << F("Created File2.txt in current directory\n"); - - cout << F("\nList of files on the SD.\n"); - sd.ls("/", LS_R); - - // Remove files from current directory. - if (!sd.remove("file1.txt") || !sd.remove("File2.txt")) { - error("remove failed"); - } - cout << F("\nfile1.txt and File2.txt removed.\n"); - - // Change current directory to root. - if (!sd.chdir()) { - error("chdir to root failed.\n"); - } - - cout << F("\nList of files on the SD.\n"); - sd.ls(LS_R); - - // Remove Folder1. - if (!sd.rmdir("Folder1")) { - error("rmdir for Folder1 failed\n"); - } - - cout << F("\nFolder1 removed.\n"); - cout << F("\nList of files on the SD.\n"); - sd.ls(LS_R); - cout << F("Done!\n"); -} -//------------------------------------------------------------------------------ -// Nothing happens in loop. -void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LongFileName/LongFileName.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LongFileName/LongFileName.ino index 92d04a05..50f4b641 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LongFileName/LongFileName.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LongFileName/LongFileName.ino @@ -72,7 +72,7 @@ void loop() { Serial.print(F("\r\nEnter File Number: ")); while (!Serial.available()) { - SysCall::yield(); + yield(); } c = Serial.read(); uint8_t i = c - '0'; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino index 40aa40d3..52c10315 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLogger/LowLatencyLogger.ino @@ -123,7 +123,7 @@ struct block_t { // void fatalBlink() { while (true) { - SysCall::yield(); + yield(); if (ERROR_LED_PIN >= 0) { digitalWrite(ERROR_LED_PIN, HIGH); delay(200); @@ -321,7 +321,7 @@ void openBinFile() { Serial.write(name, BASE_NAME_SIZE); for (int i = 0; i < 2; i++) { while (!Serial.available()) { - SysCall::yield(); + yield(); } char c = Serial.read(); Serial.write(c); @@ -566,7 +566,7 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.print(F("\nFreeStack: ")); Serial.println(FreeStack()); @@ -592,7 +592,7 @@ void setup(void) { if (sd.exists(TMP_FILE_NAME)) { Serial.println(F("\nType 'Y' to recover existing tmp file " TMP_FILE_NAME)); while (!Serial.available()) { - SysCall::yield(); + yield(); } if (Serial.read() == 'Y') { recoverTmpFile(); @@ -617,11 +617,11 @@ void loop(void) { Serial.println(F("r - record data")); Serial.println(F("t - test without logging")); while(!Serial.available()) { - SysCall::yield(); + yield(); } #if WDT_YIELD_TIME_MICROS Serial.println(F("LowLatencyLogger can not run with watchdog timer")); - SysCall::halt(); + while (true) {} #endif char c = tolower(Serial.read()); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino index 40aa40d3..52c10315 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerADXL345/LowLatencyLogger.ino @@ -123,7 +123,7 @@ struct block_t { // void fatalBlink() { while (true) { - SysCall::yield(); + yield(); if (ERROR_LED_PIN >= 0) { digitalWrite(ERROR_LED_PIN, HIGH); delay(200); @@ -321,7 +321,7 @@ void openBinFile() { Serial.write(name, BASE_NAME_SIZE); for (int i = 0; i < 2; i++) { while (!Serial.available()) { - SysCall::yield(); + yield(); } char c = Serial.read(); Serial.write(c); @@ -566,7 +566,7 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.print(F("\nFreeStack: ")); Serial.println(FreeStack()); @@ -592,7 +592,7 @@ void setup(void) { if (sd.exists(TMP_FILE_NAME)) { Serial.println(F("\nType 'Y' to recover existing tmp file " TMP_FILE_NAME)); while (!Serial.available()) { - SysCall::yield(); + yield(); } if (Serial.read() == 'Y') { recoverTmpFile(); @@ -617,11 +617,11 @@ void loop(void) { Serial.println(F("r - record data")); Serial.println(F("t - test without logging")); while(!Serial.available()) { - SysCall::yield(); + yield(); } #if WDT_YIELD_TIME_MICROS Serial.println(F("LowLatencyLogger can not run with watchdog timer")); - SysCall::halt(); + while (true) {} #endif char c = tolower(Serial.read()); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino index 40aa40d3..52c10315 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/LowLatencyLoggerMPU6050/LowLatencyLogger.ino @@ -123,7 +123,7 @@ struct block_t { // void fatalBlink() { while (true) { - SysCall::yield(); + yield(); if (ERROR_LED_PIN >= 0) { digitalWrite(ERROR_LED_PIN, HIGH); delay(200); @@ -321,7 +321,7 @@ void openBinFile() { Serial.write(name, BASE_NAME_SIZE); for (int i = 0; i < 2; i++) { while (!Serial.available()) { - SysCall::yield(); + yield(); } char c = Serial.read(); Serial.write(c); @@ -566,7 +566,7 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.print(F("\nFreeStack: ")); Serial.println(FreeStack()); @@ -592,7 +592,7 @@ void setup(void) { if (sd.exists(TMP_FILE_NAME)) { Serial.println(F("\nType 'Y' to recover existing tmp file " TMP_FILE_NAME)); while (!Serial.available()) { - SysCall::yield(); + yield(); } if (Serial.read() == 'Y') { recoverTmpFile(); @@ -617,11 +617,11 @@ void loop(void) { Serial.println(F("r - record data")); Serial.println(F("t - test without logging")); while(!Serial.available()) { - SysCall::yield(); + yield(); } #if WDT_YIELD_TIME_MICROS Serial.println(F("LowLatencyLogger can not run with watchdog timer")); - SysCall::halt(); + while (true) {} #endif char c = tolower(Serial.read()); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/OpenNext/OpenNext.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/OpenNext/OpenNext.ino deleted file mode 100644 index 542203fb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/OpenNext/OpenNext.ino +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Print size, modify date/time, and name for all files in root. - */ -#include -#include "SdFat.h" - -// SD default chip select pin. -const uint8_t chipSelect = SS; - -// file system object -SdFat sd; - -SdFile root; -SdFile file; -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - - Serial.println("Type any character to start"); - while (!Serial.available()) { - SysCall::yield(); - } - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - if (!root.open("/")) { - sd.errorHalt("open root failed"); - } - // Open next file in root. - // Warning, openNext starts at the current directory position - // so a rewind of the directory may be required. - while (file.openNext(&root, O_RDONLY)) { - file.printFileSize(&Serial); - Serial.write(' '); - file.printModifyDateTime(&Serial); - Serial.write(' '); - file.printName(&Serial); - if (file.isDir()) { - // Indicate a directory. - Serial.write('/'); - } - Serial.println(); - file.close(); - } - if (root.getError()) { - Serial.println("openNext failed"); - } else { - Serial.println("Done!"); - } -} -//------------------------------------------------------------------------------ -void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino index c475e193..ceed16b3 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/PrintBenchmark/PrintBenchmark.ino @@ -28,7 +28,7 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } } //------------------------------------------------------------------------------ @@ -44,7 +44,7 @@ void loop() { // F stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } delay(400); // catch Due reset problem diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/QuickStart/QuickStart.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/QuickStart/QuickStart.ino deleted file mode 100644 index f1141cc4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/QuickStart/QuickStart.ino +++ /dev/null @@ -1,161 +0,0 @@ -// Quick hardware test for SPI card access. -// -#include -#include "SdFat.h" -#include "sdios.h" -// -// Set DISABLE_CHIP_SELECT to disable a second SPI device. -// For example, with the Ethernet shield, set DISABLE_CHIP_SELECT -// to 10 to disable the Ethernet controller. -const int8_t DISABLE_CHIP_SELECT = -1; -// -// Test with reduced SPI speed for breadboards. SD_SCK_MHZ(4) will select -// the highest speed supported by the board that is not over 4 MHz. -// Change SPI_SPEED to SD_SCK_MHZ(50) for best performance. -#define SPI_SPEED SD_SCK_MHZ(4) -//------------------------------------------------------------------------------ -// File system object. -SdFat sd; - -// Serial streams -ArduinoOutStream cout(Serial); - -// input buffer for line -char cinBuf[40]; -ArduinoInStream cin(Serial, cinBuf, sizeof(cinBuf)); - -// SD card chip select -int chipSelect; - -void cardOrSpeed() { - cout << F("Try another SD card or reduce the SPI bus speed.\n"); - cout << F("Edit SPI_SPEED in this program to change it.\n"); -} - -void reformatMsg() { - cout << F("Try reformatting the card. For best results use\n"); - cout << F("the SdFormatter program in SdFat/examples or download\n"); - cout << F("and use SDFormatter from www.sdcard.org/downloads.\n"); -} - -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - cout << F("\nSPI pins:\n"); - cout << F("MISO: ") << int(MISO) << endl; - cout << F("MOSI: ") << int(MOSI) << endl; - cout << F("SCK: ") << int(SCK) << endl; - cout << F("SS: ") << int(SS) << endl; - - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nBe sure to edit DISABLE_CHIP_SELECT if you have\n" - "a second SPI device. For example, with the Ethernet\n" - "shield, DISABLE_CHIP_SELECT should be set to 10\n" - "to disable the Ethernet controller.\n"); - } - cout << F( - "\nSD chip select is the key hardware option.\n" - "Common values are:\n" - "Arduino Ethernet shield, pin 4\n" - "Sparkfun SD shield, pin 8\n" - "Adafruit SD shields and modules, pin 10\n"); -} - -bool firstTry = true; -void loop() { - // Read any existing Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - if (!firstTry) { - cout << F("\nRestarting\n"); - } - firstTry = false; - - cout << F("\nEnter the chip select pin number: "); - while (!Serial.available()) { - SysCall::yield(); - } - cin.readline(); - if (cin >> chipSelect) { - cout << chipSelect << endl; - } else { - cout << F("\nInvalid pin number\n"); - return; - } - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); - } else { - cout << F("\nDisabling SPI device on pin "); - cout << int(DISABLE_CHIP_SELECT) << endl; - pinMode(DISABLE_CHIP_SELECT, OUTPUT); - digitalWrite(DISABLE_CHIP_SELECT, HIGH); - } - if (!sd.begin(chipSelect, SPI_SPEED)) { - if (sd.card()->errorCode()) { - cout << F( - "\nSD initialization failed.\n" - "Do not reformat the card!\n" - "Is the card correctly inserted?\n" - "Is chipSelect set to the correct value?\n" - "Does another SPI device need to be disabled?\n" - "Is there a wiring/soldering problem?\n"); - cout << F("\nerrorCode: ") << hex << showbase; - cout << int(sd.card()->errorCode()); - cout << F(", errorData: ") << int(sd.card()->errorData()); - cout << dec << noshowbase << endl; - return; - } - if (sd.vol()->fatType() == 0) { - cout << F("Can't find a valid FAT16/FAT32 partition.\n"); - reformatMsg(); - return; - } - cout << F("begin failed, can't determine error type\n"); - return; - } - cout << F("\nCard successfully initialized.\n"); - cout << endl; - - uint32_t size = sd.card()->cardSize(); - if (size == 0) { - cout << F("Can't determine the card size.\n"); - cardOrSpeed(); - return; - } - uint32_t sizeMB = 0.000512 * size + 0.5; - cout << F("Card size: ") << sizeMB; - cout << F(" MB (MB = 1,000,000 bytes)\n"); - cout << endl; - cout << F("Volume is FAT") << int(sd.vol()->fatType()); - cout << F(", Cluster size (bytes): ") << 512L * sd.vol()->blocksPerCluster(); - cout << endl << endl; - - cout << F("Files found (date time size name):\n"); - sd.ls(LS_R | LS_DATE | LS_SIZE); - - if ((sizeMB > 1100 && sd.vol()->blocksPerCluster() < 64) - || (sizeMB < 2200 && sd.vol()->fatType() == 32)) { - cout << F("\nThis card should be reformatted for best performance.\n"); - cout << F("Use a cluster size of 32 KB for cards larger than 1 GB.\n"); - cout << F("Only cards larger than 2 GB should be formatted FAT32.\n"); - reformatMsg(); - return; - } - // Read any extra Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - cout << F("\nSuccess! Type any character to restart.\n"); - while (!Serial.available()) { - SysCall::yield(); - } -} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/RawWrite/RawWrite.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/RawWrite/RawWrite.ino index d3633d21..133f22fa 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/RawWrite/RawWrite.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/RawWrite/RawWrite.ino @@ -48,7 +48,7 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } } //------------------------------------------------------------------------------ @@ -60,7 +60,7 @@ void loop(void) { // F stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } cout << F("FreeStack: ") << FreeStack() << endl; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino index ea0e922c..8099b7ac 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvArray/ReadCsvArray.ino @@ -47,18 +47,18 @@ size_t readField(File* file, char* str, size_t size, const char* delim) { return n; } //------------------------------------------------------------------------------ -#define errorHalt(msg) {Serial.println(F(msg)); SysCall::halt();} +#define errorHalt(msg) {Serial.println(F(msg)); while (true) {}} //------------------------------------------------------------------------------ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.println("Type any character to start"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize the SD. if (!SD.begin(CS_PIN)) { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino index 4e89b67c..949bc7b0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/ReadCsvStream/ReadCsvStream.ino @@ -95,11 +95,11 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdFormatter/SdFormatter.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdFormatter/SdFormatter.ino deleted file mode 100644 index 570d9820..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdFormatter/SdFormatter.ino +++ /dev/null @@ -1,552 +0,0 @@ -/* - * This program will format an SD or SDHC card. - * Warning all data will be deleted! - * - * For SD/SDHC cards larger than 64 MB this - * program attempts to match the format - * generated by SDFormatter available here: - * - * http://www.sdcard.org/consumers/formatter/ - * - * For smaller cards this program uses FAT16 - * and SDFormatter uses FAT12. - */ -#error use new Version 2 SdFormatter -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 -// -// Change the value of chipSelect if your hardware does -// not use the default value, SS. Common values are: -// Arduino Ethernet shield: pin 4 -// Sparkfun SD shield: pin 8 -// Adafruit SD shields and modules: pin 10 -const uint8_t chipSelect = SS; - -// Initialize at highest supported speed not over 50 MHz. -// Reduce max speed if errors occur. -#define SPI_SPEED SD_SCK_MHZ(50) - -// Print extra info for debug if DEBUG_PRINT is nonzero -#define DEBUG_PRINT 0 -#include -#include "SdFat.h" -#include "sdios.h" -#if DEBUG_PRINT -#include "FreeStack.h" -#endif // DEBUG_PRINT - -// Serial output stream -ArduinoOutStream cout(Serial); - -#if USE_SDIO -// Use faster SdioCardEX -SdioCardEX card; -// SdioCard card; -#else // USE_SDIO -Sd2Card card; -#endif // USE_SDIO - -uint32_t cardSizeBlocks; -uint32_t cardCapacityMB; - -// cache for SD block -cache_t cache; - -// MBR information -uint8_t partType; -uint32_t relSector; -uint32_t partSize; - -// Fake disk geometry -uint8_t numberOfHeads; -uint8_t sectorsPerTrack; - -// FAT parameters -uint16_t reservedSectors; -uint8_t sectorsPerCluster; -uint32_t fatStart; -uint32_t fatSize; -uint32_t dataStart; - -// constants for file system structure -uint16_t const BU16 = 128; -uint16_t const BU32 = 8192; - -// strings needed in file system structures -char noName[] = "NO NAME "; -char fat16str[] = "FAT16 "; -char fat32str[] = "FAT32 "; -//------------------------------------------------------------------------------ -#define sdError(msg) {cout << F("error: ") << F(msg) << endl; sdErrorHalt();} -//------------------------------------------------------------------------------ -void sdErrorHalt() { - if (card.errorCode()) { - cout << F("SD error: ") << hex << int(card.errorCode()); - cout << ',' << int(card.errorData()) << dec << endl; - } - SysCall::halt(); -} -//------------------------------------------------------------------------------ -#if DEBUG_PRINT -void debugPrint() { - cout << F("FreeStack: ") << FreeStack() << endl; - cout << F("partStart: ") << relSector << endl; - cout << F("partSize: ") << partSize << endl; - cout << F("reserved: ") << reservedSectors << endl; - cout << F("fatStart: ") << fatStart << endl; - cout << F("fatSize: ") << fatSize << endl; - cout << F("dataStart: ") << dataStart << endl; - cout << F("clusterCount: "); - cout << ((relSector + partSize - dataStart)/sectorsPerCluster) << endl; - cout << endl; - cout << F("Heads: ") << int(numberOfHeads) << endl; - cout << F("Sectors: ") << int(sectorsPerTrack) << endl; - cout << F("Cylinders: "); - cout << cardSizeBlocks/(numberOfHeads*sectorsPerTrack) << endl; -} -#endif // DEBUG_PRINT -//------------------------------------------------------------------------------ -// write cached block to the card -uint8_t writeCache(uint32_t lbn) { - return card.writeBlock(lbn, cache.data); -} -//------------------------------------------------------------------------------ -// initialize appropriate sizes for SD capacity -void initSizes() { - if (cardCapacityMB <= 6) { - sdError("Card is too small."); - } else if (cardCapacityMB <= 16) { - sectorsPerCluster = 2; - } else if (cardCapacityMB <= 32) { - sectorsPerCluster = 4; - } else if (cardCapacityMB <= 64) { - sectorsPerCluster = 8; - } else if (cardCapacityMB <= 128) { - sectorsPerCluster = 16; - } else if (cardCapacityMB <= 1024) { - sectorsPerCluster = 32; - } else if (cardCapacityMB <= 32768) { - sectorsPerCluster = 64; - } else { - // SDXC cards - sectorsPerCluster = 128; - } - - cout << F("Blocks/Cluster: ") << int(sectorsPerCluster) << endl; - // set fake disk geometry - sectorsPerTrack = cardCapacityMB <= 256 ? 32 : 63; - - if (cardCapacityMB <= 16) { - numberOfHeads = 2; - } else if (cardCapacityMB <= 32) { - numberOfHeads = 4; - } else if (cardCapacityMB <= 128) { - numberOfHeads = 8; - } else if (cardCapacityMB <= 504) { - numberOfHeads = 16; - } else if (cardCapacityMB <= 1008) { - numberOfHeads = 32; - } else if (cardCapacityMB <= 2016) { - numberOfHeads = 64; - } else if (cardCapacityMB <= 4032) { - numberOfHeads = 128; - } else { - numberOfHeads = 255; - } -} -//------------------------------------------------------------------------------ -// zero cache and optionally set the sector signature -void clearCache(uint8_t addSig) { - memset(&cache, 0, sizeof(cache)); - if (addSig) { - cache.mbr.mbrSig0 = BOOTSIG0; - cache.mbr.mbrSig1 = BOOTSIG1; - } -} -//------------------------------------------------------------------------------ -// zero FAT and root dir area on SD -void clearFatDir(uint32_t bgn, uint32_t count) { - clearCache(false); -#if USE_SDIO - for (uint32_t i = 0; i < count; i++) { - if (!card.writeBlock(bgn + i, cache.data)) { - sdError("Clear FAT/DIR writeBlock failed"); - } - if ((i & 0XFF) == 0) { - cout << '.'; - } - } -#else // USE_SDIO - if (!card.writeStart(bgn, count)) { - sdError("Clear FAT/DIR writeStart failed"); - } - for (uint32_t i = 0; i < count; i++) { - if ((i & 0XFF) == 0) { - cout << '.'; - } - if (!card.writeData(cache.data)) { - sdError("Clear FAT/DIR writeData failed"); - } - } - if (!card.writeStop()) { - sdError("Clear FAT/DIR writeStop failed"); - } -#endif // USE_SDIO - cout << endl; -} -//------------------------------------------------------------------------------ -// return cylinder number for a logical block number -uint16_t lbnToCylinder(uint32_t lbn) { - return lbn / (numberOfHeads * sectorsPerTrack); -} -//------------------------------------------------------------------------------ -// return head number for a logical block number -uint8_t lbnToHead(uint32_t lbn) { - return (lbn % (numberOfHeads * sectorsPerTrack)) / sectorsPerTrack; -} -//------------------------------------------------------------------------------ -// return sector number for a logical block number -uint8_t lbnToSector(uint32_t lbn) { - return (lbn % sectorsPerTrack) + 1; -} -//------------------------------------------------------------------------------ -// format and write the Master Boot Record -void writeMbr() { - clearCache(true); - part_t* p = cache.mbr.part; - p->boot = 0; - uint16_t c = lbnToCylinder(relSector); - if (c > 1023) { - sdError("MBR CHS"); - } - p->beginCylinderHigh = c >> 8; - p->beginCylinderLow = c & 0XFF; - p->beginHead = lbnToHead(relSector); - p->beginSector = lbnToSector(relSector); - p->type = partType; - uint32_t endLbn = relSector + partSize - 1; - c = lbnToCylinder(endLbn); - if (c <= 1023) { - p->endCylinderHigh = c >> 8; - p->endCylinderLow = c & 0XFF; - p->endHead = lbnToHead(endLbn); - p->endSector = lbnToSector(endLbn); - } else { - // Too big flag, c = 1023, h = 254, s = 63 - p->endCylinderHigh = 3; - p->endCylinderLow = 255; - p->endHead = 254; - p->endSector = 63; - } - p->firstSector = relSector; - p->totalSectors = partSize; - if (!writeCache(0)) { - sdError("write MBR"); - } -} -//------------------------------------------------------------------------------ -// generate serial number from card size and micros since boot -uint32_t volSerialNumber() { - return (cardSizeBlocks << 8) + micros(); -} -//------------------------------------------------------------------------------ -// format the SD as FAT16 -void makeFat16() { - uint32_t nc; - for (dataStart = 2 * BU16;; dataStart += BU16) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 255)/256; - uint32_t r = BU16 + 1 + 2 * fatSize + 32; - if (dataStart < r) { - continue; - } - relSector = dataStart - r + BU16; - break; - } - // check valid cluster count for FAT16 volume - if (nc < 4085 || nc >= 65525) { - sdError("Bad cluster count"); - } - reservedSectors = 1; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + 2 * fatSize + reservedSectors + 32; - if (partSize < 32680) { - partType = 0X01; - } else if (partSize < 65536) { - partType = 0X04; - } else { - partType = 0X06; - } - // write MBR - writeMbr(); - clearCache(true); - fat_boot_t* pb = &cache.fbs; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->rootDirEntryCount = 512; - pb->mediaType = 0XF8; - pb->sectorsPerFat16 = fatSize; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->driveNumber = 0X80; - pb->bootSignature = EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); - memcpy(pb->fileSystemType, fat16str, sizeof(pb->fileSystemType)); - // write partition boot sector - if (!writeCache(relSector)) { - sdError("FAT16 write PBS failed"); - } - // clear FAT and root directory - clearFatDir(fatStart, dataStart - fatStart); - clearCache(false); - cache.fat16[0] = 0XFFF8; - cache.fat16[1] = 0XFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) - || !writeCache(fatStart + fatSize)) { - sdError("FAT16 reserve failed"); - } -} -//------------------------------------------------------------------------------ -// format the SD as FAT32 -void makeFat32() { - uint32_t nc; - relSector = BU32; - for (dataStart = 2 * BU32;; dataStart += BU32) { - nc = (cardSizeBlocks - dataStart)/sectorsPerCluster; - fatSize = (nc + 2 + 127)/128; - uint32_t r = relSector + 9 + 2 * fatSize; - if (dataStart >= r) { - break; - } - } - // error if too few clusters in FAT32 volume - if (nc < 65525) { - sdError("Bad cluster count"); - } - reservedSectors = dataStart - relSector - 2 * fatSize; - fatStart = relSector + reservedSectors; - partSize = nc * sectorsPerCluster + dataStart - relSector; - // type depends on address of end sector - // max CHS has lbn = 16450560 = 1024*255*63 - if ((relSector + partSize) <= 16450560) { - // FAT32 - partType = 0X0B; - } else { - // FAT32 with INT 13 - partType = 0X0C; - } - writeMbr(); - clearCache(true); - - fat32_boot_t* pb = &cache.fbs32; - pb->jump[0] = 0XEB; - pb->jump[1] = 0X00; - pb->jump[2] = 0X90; - for (uint8_t i = 0; i < sizeof(pb->oemId); i++) { - pb->oemId[i] = ' '; - } - pb->bytesPerSector = 512; - pb->sectorsPerCluster = sectorsPerCluster; - pb->reservedSectorCount = reservedSectors; - pb->fatCount = 2; - pb->mediaType = 0XF8; - pb->sectorsPerTrack = sectorsPerTrack; - pb->headCount = numberOfHeads; - pb->hidddenSectors = relSector; - pb->totalSectors32 = partSize; - pb->sectorsPerFat32 = fatSize; - pb->fat32RootCluster = 2; - pb->fat32FSInfo = 1; - pb->fat32BackBootBlock = 6; - pb->driveNumber = 0X80; - pb->bootSignature = EXTENDED_BOOT_SIG; - pb->volumeSerialNumber = volSerialNumber(); - memcpy(pb->volumeLabel, noName, sizeof(pb->volumeLabel)); - memcpy(pb->fileSystemType, fat32str, sizeof(pb->fileSystemType)); - // write partition boot sector and backup - if (!writeCache(relSector) - || !writeCache(relSector + 6)) { - sdError("FAT32 write PBS failed"); - } - clearCache(true); - // write extra boot area and backup - if (!writeCache(relSector + 2) - || !writeCache(relSector + 8)) { - sdError("FAT32 PBS ext failed"); - } - fat32_fsinfo_t* pf = &cache.fsinfo; - pf->leadSignature = FSINFO_LEAD_SIG; - pf->structSignature = FSINFO_STRUCT_SIG; - pf->freeCount = 0XFFFFFFFF; - pf->nextFree = 0XFFFFFFFF; - // write FSINFO sector and backup - if (!writeCache(relSector + 1) - || !writeCache(relSector + 7)) { - sdError("FAT32 FSINFO failed"); - } - clearFatDir(fatStart, 2 * fatSize + sectorsPerCluster); - clearCache(false); - cache.fat32[0] = 0x0FFFFFF8; - cache.fat32[1] = 0x0FFFFFFF; - cache.fat32[2] = 0x0FFFFFFF; - // write first block of FAT and backup for reserved clusters - if (!writeCache(fatStart) - || !writeCache(fatStart + fatSize)) { - sdError("FAT32 reserve failed"); - } -} -//------------------------------------------------------------------------------ -// flash erase all data -uint32_t const ERASE_SIZE = 262144L; -void eraseCard() { - cout << endl << F("Erasing\n"); - uint32_t firstBlock = 0; - uint32_t lastBlock; - uint16_t n = 0; - - do { - lastBlock = firstBlock + ERASE_SIZE - 1; - if (lastBlock >= cardSizeBlocks) { - lastBlock = cardSizeBlocks - 1; - } - if (!card.erase(firstBlock, lastBlock)) { - sdError("erase failed"); - } - cout << '.'; - if ((n++)%32 == 31) { - cout << endl; - } - firstBlock += ERASE_SIZE; - } while (firstBlock < cardSizeBlocks); - cout << endl; - - if (!card.readBlock(0, cache.data)) { - sdError("readBlock"); - } - cout << hex << showbase << setfill('0') << internal; - cout << F("All data set to ") << setw(4) << int(cache.data[0]) << endl; - cout << dec << noshowbase << setfill(' ') << right; - cout << F("Erase done\n"); -} -//------------------------------------------------------------------------------ -void formatCard() { - cout << endl; - cout << F("Formatting\n"); - initSizes(); - if (card.type() != SD_CARD_TYPE_SDHC) { - cout << F("FAT16\n"); - makeFat16(); - } else { - cout << F("FAT32\n"); - makeFat32(); - } -#if DEBUG_PRINT - debugPrint(); -#endif // DEBUG_PRINT - cout << F("Format done\n"); -} -//------------------------------------------------------------------------------ -void setup() { - char c; - Serial.begin(9600); - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - cout << F("Type any character to start\n"); - while (!Serial.available()) { - SysCall::yield(); - } - // Discard any extra characters. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - cout << F( - "\n" - "This program can erase and/or format SD/SDHC cards.\n" - "\n" - "Erase uses the card's fast flash erase command.\n" - "Flash erase sets all data to 0X00 for most cards\n" - "and 0XFF for a few vendor's cards.\n" - "\n" - "Cards larger than 2 GB will be formatted FAT32 and\n" - "smaller cards will be formatted FAT16.\n" - "\n" - "Warning, all data on the card will be erased.\n" - "Enter 'Y' to continue: "); - while (!Serial.available()) { - SysCall::yield(); - } - - c = Serial.read(); - cout << c << endl; - if (c != 'Y') { - cout << F("Quiting, you did not enter 'Y'.\n"); - return; - } - // Read any existing Serial data. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - cout << F( - "\n" - "Options are:\n" - "E - erase the card and skip formatting.\n" - "F - erase and then format the card. (recommended)\n" - "Q - quick format the card without erase.\n" - "\n" - "Enter option: "); - - while (!Serial.available()) { - SysCall::yield(); - } - c = Serial.read(); - cout << c << endl; - if (!strchr("EFQ", c)) { - cout << F("Quiting, invalid option entered.") << endl; - return; - } -#if USE_SDIO - if (!card.begin()) { - sdError("card.begin failed"); - } -#else // USE_SDIO - if (!card.begin(chipSelect, SPI_SPEED)) { - cout << F( - "\nSD initialization failure!\n" - "Is the SD card inserted correctly?\n" - "Is chip select correct at the top of this program?\n"); - sdError("card.begin failed"); - } -#endif - cardSizeBlocks = card.cardSize(); - if (cardSizeBlocks == 0) { - sdError("cardSize"); - } - cardCapacityMB = (cardSizeBlocks + 2047)/2048; - - cout << F("Card Size: ") << setprecision(0) << 1.048576*cardCapacityMB; - cout << F(" MB, (MB = 1,000,000 bytes)") << endl; - - if (c == 'E' || c == 'F') { - eraseCard(); - } - if (c == 'F' || c == 'Q') { - formatCard(); - } -} -//------------------------------------------------------------------------------ -void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdInfo/SdInfo.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdInfo/SdInfo.ino deleted file mode 100644 index 8549528f..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SdInfo/SdInfo.ino +++ /dev/null @@ -1,248 +0,0 @@ -/* - * This program attempts to initialize an SD card and analyze its structure. - */ -#include -#include "SdFat.h" -#include "sdios.h" -#error Use new Version 2 SdInfo -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 -/* - * SD chip select pin. Common values are: - * - * Arduino Ethernet shield, pin 4. - * SparkFun SD shield, pin 8. - * Adafruit SD shields and modules, pin 10. - * Default SD chip select is the SPI SS pin. - */ -const uint8_t SD_CHIP_SELECT = SS; -/* - * Set DISABLE_CHIP_SELECT to disable a second SPI device. - * For example, with the Ethernet shield, set DISABLE_CHIP_SELECT - * to 10 to disable the Ethernet controller. - */ -const int8_t DISABLE_CHIP_SELECT = -1; - -#if USE_SDIO -// Use faster SdioCardEX -SdFatSdioEX sd; -// SdFatSdio sd; -#else // USE_SDIO -SdFat sd; -#endif // USE_SDIO - -// serial output steam -ArduinoOutStream cout(Serial); - -// global for card size -uint32_t cardSize; - -// global for card erase size -uint32_t eraseSize; -//------------------------------------------------------------------------------ -// store error strings in flash -#define sdErrorMsg(msg) sd.errorPrint(F(msg)); -//------------------------------------------------------------------------------ -uint8_t cidDmp() { - cid_t cid; - if (!sd.card()->readCID(&cid)) { - sdErrorMsg("readCID failed"); - return false; - } - cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; - cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; - cout << F("Product: "); - for (uint8_t i = 0; i < 5; i++) { - cout << cid.pnm[i]; - } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; - cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; - cout << endl; - return true; -} -//------------------------------------------------------------------------------ -uint8_t csdDmp() { - csd_t csd; - uint8_t eraseSingleBlock; - if (!sd.card()->readCSD(&csd)) { - sdErrorMsg("readCSD failed"); - return false; - } - if (csd.v1.csd_ver == 0) { - eraseSingleBlock = csd.v1.erase_blk_en; - eraseSize = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; - } else if (csd.v2.csd_ver == 1) { - eraseSingleBlock = csd.v2.erase_blk_en; - eraseSize = (csd.v2.sector_size_high << 1) | csd.v2.sector_size_low; - } else { - cout << F("csd version error\n"); - return false; - } - eraseSize++; - cout << F("cardSize: ") << 0.000512*cardSize; - cout << F(" MB (MB = 1,000,000 bytes)\n"); - - cout << F("flashEraseSize: ") << int(eraseSize) << F(" blocks\n"); - cout << F("eraseSingleBlock: "); - if (eraseSingleBlock) { - cout << F("true\n"); - } else { - cout << F("false\n"); - } - return true; -} -//------------------------------------------------------------------------------ -// print partition table -uint8_t partDmp() { - mbr_t mbr; - if (!sd.card()->readBlock(0, (uint8_t*)&mbr)) { - sdErrorMsg("read MBR failed"); - return false; - } - for (uint8_t ip = 1; ip < 5; ip++) { - part_t *pt = &mbr.part[ip - 1]; - if ((pt->boot & 0X7F) != 0 || pt->firstSector > cardSize) { - cout << F("\nNo MBR. Assuming Super Floppy format.\n"); - return true; - } - } - cout << F("\nSD Partition Table\n"); - cout << F("part,boot,type,start,length\n"); - for (uint8_t ip = 1; ip < 5; ip++) { - part_t *pt = &mbr.part[ip - 1]; - cout << int(ip) << ',' << hex << int(pt->boot) << ',' << int(pt->type); - cout << dec << ',' << pt->firstSector <<',' << pt->totalSectors << endl; - } - return true; -} -//------------------------------------------------------------------------------ -void volDmp() { - cout << F("\nVolume is FAT") << int(sd.vol()->fatType()) << endl; - cout << F("blocksPerCluster: ") << int(sd.vol()->blocksPerCluster()) << endl; - cout << F("clusterCount: ") << sd.vol()->clusterCount() << endl; - cout << F("freeClusters: "); - uint32_t volFree = sd.vol()->freeClusterCount(); - cout << volFree << endl; - float fs = 0.000512*volFree*sd.vol()->blocksPerCluster(); - cout << F("freeSpace: ") << fs << F(" MB (MB = 1,000,000 bytes)\n"); - cout << F("fatStartBlock: ") << sd.vol()->fatStartBlock() << endl; - cout << F("fatCount: ") << int(sd.vol()->fatCount()) << endl; - cout << F("blocksPerFat: ") << sd.vol()->blocksPerFat() << endl; - cout << F("rootDirStart: ") << sd.vol()->rootDirStart() << endl; - cout << F("dataStartBlock: ") << sd.vol()->dataStartBlock() << endl; - if (sd.vol()->dataStartBlock() % eraseSize) { - cout << F("Data area is not aligned on flash erase boundaries!\n"); - cout << F("Download and use formatter from www.sdcard.org!\n"); - } -} -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - - // use uppercase in hex and use 0X base prefix - cout << uppercase << showbase << endl; - - // F stores strings in flash to save RAM - cout << F("SdFat version: ") << SD_FAT_VERSION << endl; -#if !USE_SDIO - if (DISABLE_CHIP_SELECT < 0) { - cout << F( - "\nAssuming the SD is the only SPI device.\n" - "Edit DISABLE_CHIP_SELECT to disable another device.\n"); - } else { - cout << F("\nDisabling SPI device on pin "); - cout << int(DISABLE_CHIP_SELECT) << endl; - pinMode(DISABLE_CHIP_SELECT, OUTPUT); - digitalWrite(DISABLE_CHIP_SELECT, HIGH); - } - cout << F("\nAssuming the SD chip select pin is: ") <= 0); - - // F stores strings in flash to save RAM - cout << F("\ntype any character to start\n"); - while (!Serial.available()) { - SysCall::yield(); - } - - uint32_t t = millis(); -#if USE_SDIO - if (!sd.cardBegin()) { - sdErrorMsg("\ncardBegin failed"); - return; - } -#else // USE_SDIO - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.cardBegin(SD_CHIP_SELECT, SD_SCK_MHZ(50))) { - sdErrorMsg("cardBegin failed"); - return; - } - #endif // USE_SDIO - t = millis() - t; - - cardSize = sd.card()->cardSize(); - if (cardSize == 0) { - sdErrorMsg("cardSize failed"); - return; - } - cout << F("\ninit time: ") << t << " ms" << endl; - cout << F("\nCard type: "); - switch (sd.card()->type()) { - case SD_CARD_TYPE_SD1: - cout << F("SD1\n"); - break; - - case SD_CARD_TYPE_SD2: - cout << F("SD2\n"); - break; - - case SD_CARD_TYPE_SDHC: - if (cardSize < 70000000) { - cout << F("SDHC\n"); - } else { - cout << F("SDXC\n"); - } - break; - - default: - cout << F("Unknown\n"); - } - if (!cidDmp()) { - return; - } - if (!csdDmp()) { - return; - } - uint32_t ocr; - if (!sd.card()->readOCR(&ocr)) { - sdErrorMsg("\nreadOCR failed"); - return; - } - cout << F("OCR: ") << hex << ocr << dec << endl; - if (!partDmp()) { - return; - } - if (!sd.fsBegin()) { - sdErrorMsg("\nFile System initialization failed.\n"); - return; - } - volDmp(); -} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino deleted file mode 100644 index a3907939..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/SoftwareSpi/SoftwareSpi.ino +++ /dev/null @@ -1,59 +0,0 @@ -// An example of the SdFatSoftSpi template class. -// This example is for an Adafruit Data Logging Shield on a Mega. -// Software SPI is required on Mega since this shield connects to pins 10-13. -// This example will also run on an Uno and other boards using software SPI. -// -#include -#include "SdFat.h" -#error See Version 2 software SPI example -#if ENABLE_SOFTWARE_SPI_CLASS // Must be set in SdFat/SdFatConfig.h -// -// Pin numbers in templates must be constants. -const uint8_t SOFT_MISO_PIN = 12; -const uint8_t SOFT_MOSI_PIN = 11; -const uint8_t SOFT_SCK_PIN = 13; -// -// Chip select may be constant or RAM variable. -const uint8_t SD_CHIP_SELECT_PIN = 10; - -// SdFat software SPI template -SdFatSoftSpi sd; - -// Test file. -SdFile file; - -void setup() { - Serial.begin(9600); - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - Serial.println("Type any character to start"); - while (!Serial.available()) { - SysCall::yield(); - } - - if (!sd.begin(SD_CHIP_SELECT_PIN)) { - sd.initErrorHalt(); - } - - if (!file.open("SoftSPI.txt", O_RDWR | O_CREAT)) { - sd.errorHalt(F("open failed")); - } - file.println(F("This line was printed using software SPI.")); - - file.rewind(); - - while (file.available()) { - Serial.write(file.read()); - } - - file.close(); - - Serial.println(F("Done.")); -} -//------------------------------------------------------------------------------ -void loop() {} -#else // ENABLE_SOFTWARE_SPI_CLASS -#error ENABLE_SOFTWARE_SPI_CLASS must be set non-zero in SdFat/SdFatConfig.h -#endif //ENABLE_SOFTWARE_SPI_CLASS \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/StdioBench/StdioBench.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/StdioBench/StdioBench.ino index 9412d628..c937520a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/StdioBench/StdioBench.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/StdioBench/StdioBench.ino @@ -32,12 +32,12 @@ void setup() { Serial.begin(9600); while (!Serial) { - SysCall::yield(); + yield(); } Serial.println(F("Type any character to start")); while (!Serial.available()) { - SysCall::yield(); + yield(); } Serial.println(F("Starting test")); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino deleted file mode 100644 index 1c5214f4..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TeensySdioDemo/TeensySdioDemo.ino +++ /dev/null @@ -1,169 +0,0 @@ -// Simple performance test for Teensy 3.5/3.6 SDHC. -// Demonstrates yield() efficiency. - -// Warning SdFatSdio and SdFatSdioEX normally should -// not both be used in a program. -// Each has its own cache and member variables. - -#include "SdFat.h" -#error See Version 2 SDIO example -// 32 KiB buffer. -const size_t BUF_DIM = 32768; - -// 8 MiB file. -const uint32_t FILE_SIZE = 256UL*BUF_DIM; - -SdFatSdio sd; - -SdFatSdioEX sdEx; - -File file; - -uint8_t buf[BUF_DIM]; - -// buffer as uint32_t -uint32_t* buf32 = (uint32_t*)buf; - -// Total usec in read/write calls. -uint32_t totalMicros = 0; -// Time in yield() function. -uint32_t yieldMicros = 0; -// Number of yield calls. -uint32_t yieldCalls = 0; -// Max busy time for single yield call. -uint32_t yieldMaxUsec = 0; -// Control access to the two versions of SdFat. -bool useEx = false; -//----------------------------------------------------------------------------- -bool sdBusy() { - return useEx ? sdEx.card()->isBusy() : sd.card()->isBusy(); -} -//----------------------------------------------------------------------------- -void errorHalt(const char* msg) { - if (useEx) { - sdEx.errorHalt(msg); - } else { - sd.errorHalt(msg); - } -} -//------------------------------------------------------------------------------ -uint32_t kHzSdClk() { - return useEx ? sdEx.card()->kHzSdClk() : sd.card()->kHzSdClk(); -} -//------------------------------------------------------------------------------ -// Replace "weak" system yield() function. -void yield() { - // Only count cardBusy time. - if (!sdBusy()) { - return; - } - uint32_t m = micros(); - yieldCalls++; - while (sdBusy()) { - // Do something here. - } - m = micros() - m; - if (m > yieldMaxUsec) { - yieldMaxUsec = m; - } - yieldMicros += m; -} -//----------------------------------------------------------------------------- -void runTest() { - // Zero Stats - totalMicros = 0; - yieldMicros = 0; - yieldCalls = 0; - yieldMaxUsec = 0; - if (!file.open("TeensyDemo.bin", O_RDWR | O_CREAT)) { - errorHalt("open failed"); - } - Serial.println("\nsize,write,read"); - Serial.println("bytes,KB/sec,KB/sec"); - for (size_t nb = 512; nb <= BUF_DIM; nb *= 2) { - file.truncate(0); - uint32_t nRdWr = FILE_SIZE/nb; - Serial.print(nb); - Serial.print(','); - uint32_t t = micros(); - for (uint32_t n = 0; n < nRdWr; n++) { - // Set start and end of buffer. - buf32[0] = n; - buf32[nb/4 - 1] = n; - if (nb != file.write(buf, nb)) { - errorHalt("write failed"); - } - } - t = micros() - t; - totalMicros += t; - Serial.print(1000.0*FILE_SIZE/t); - Serial.print(','); - file.rewind(); - t = micros(); - - for (uint32_t n = 0; n < nRdWr; n++) { - if ((int)nb != file.read(buf, nb)) { - errorHalt("read failed"); - } - // crude check of data. - if (buf32[0] != n || buf32[nb/4 - 1] != n) { - errorHalt("data check"); - } - } - t = micros() - t; - totalMicros += t; - Serial.println(1000.0*FILE_SIZE/t); - } - file.close(); - Serial.print("\ntotalMicros "); - Serial.println(totalMicros); - Serial.print("yieldMicros "); - Serial.println(yieldMicros); - Serial.print("yieldCalls "); - Serial.println(yieldCalls); - Serial.print("yieldMaxUsec "); - Serial.println(yieldMaxUsec); - Serial.print("kHzSdClk "); - Serial.println(kHzSdClk()); - Serial.println("Done"); -} -//----------------------------------------------------------------------------- -void setup() { - Serial.begin(9600); - while (!Serial) { - } - Serial.println("SdFatSdioEX uses extended multi-block transfers without DMA."); - Serial.println("SdFatSdio uses a traditional DMA SDIO implementation."); - Serial.println("Note the difference is speed and busy yield time.\n"); -} -//----------------------------------------------------------------------------- -void loop() { - do { - delay(10); - } while (Serial.available() && Serial.read()); - - Serial.println("Type '1' for SdFatSdioEX or '2' for SdFatSdio"); - while (!Serial.available()) { - } - char c = Serial.read(); - if (c != '1' && c != '2') { - Serial.println("Invalid input"); - return; - } - if (c =='1') { - useEx = true; - if (!sdEx.begin()) { - sd.initErrorHalt("SdFatSdioEX begin() failed"); - } - // make sdEx the current volume. - sdEx.chvol(); - } else { - useEx = false; - if (!sd.begin()) { - sd.initErrorHalt("SdFatSdio begin() failed"); - } - // make sd the current volume. - sd.chvol(); - } - runTest(); -} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/Timestamp/Timestamp.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/Timestamp/Timestamp.ino index 19b232cd..0926f3a0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/Timestamp/Timestamp.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/Timestamp/Timestamp.ino @@ -64,11 +64,11 @@ void setup(void) { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TwoCards/TwoCards.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TwoCards/TwoCards.ino index 79fe6548..35f0ee91 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TwoCards/TwoCards.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/TwoCards/TwoCards.ino @@ -27,7 +27,7 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.print(F("FreeStack: ")); @@ -40,7 +40,7 @@ void setup() { Serial.println(F("type any character to start")); while (!Serial.available()) { - SysCall::yield(); + yield(); } // disable sd2 while initializing sd1 diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino index 558bc5f4..5c92d639 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/VolumeFreeSpace/VolumeFreeSpace.ino @@ -38,7 +38,7 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } if (!MAINTAIN_FREE_CLUSTER_COUNT) { cout << F("Please edit SdFatConfig.h and set\n"); @@ -48,7 +48,7 @@ void setup() { // F stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is // not over 50 MHz. Try a lower speed if SPI errors occur. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/bench/bench.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/bench/bench.ino deleted file mode 100644 index d8739847..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/bench/bench.ino +++ /dev/null @@ -1,222 +0,0 @@ -/* - * This program is a simple binary write/read benchmark. - */ -#include -#include "SdFat.h" -#include "sdios.h" -#include "FreeStack.h" - -// Set USE_SDIO to zero for SPI card access. -#define USE_SDIO 0 - -// SD chip select pin -const uint8_t chipSelect = SS; - -// Size of read/write. -const size_t BUF_SIZE = 512; - -// File size in MB where MB = 1,000,000 bytes. -const uint32_t FILE_SIZE_MB = 5; - -// Write pass count. -const uint8_t WRITE_COUNT = 2; - -// Read pass count. -const uint8_t READ_COUNT = 2; -//============================================================================== -// End of configuration constants. -//------------------------------------------------------------------------------ -// File size in bytes. -const uint32_t FILE_SIZE = 1000000UL*FILE_SIZE_MB; - -uint8_t buf[BUF_SIZE]; - -// file system -#if USE_SDIO -// Traditional DMA version. -// SdFatSdio sd; -// Faster version. -SdFatSdioEX sd; -#else // USE_SDIO -SdFat sd; -#endif // USE_SDIO - -// Set ENABLE_EXTENDED_TRANSFER_CLASS to use extended SD I/O. -// Requires dedicated use of the SPI bus. -// SdFatEX sd; - -// Set ENABLE_SOFTWARE_SPI_CLASS to use software SPI. -// Args are misoPin, mosiPin, sckPin. -// SdFatSoftSpi<6, 7, 5> sd; - -// test file -SdFile file; - -// Serial output stream -ArduinoOutStream cout(Serial); -//------------------------------------------------------------------------------ -// Store error strings in flash to save RAM. -#define error(s) sd.errorHalt(F(s)) -//------------------------------------------------------------------------------ -void cidDmp() { - cid_t cid; - if (!sd.card()->readCID(&cid)) { - error("readCID failed"); - } - cout << F("\nManufacturer ID: "); - cout << hex << int(cid.mid) << dec << endl; - cout << F("OEM ID: ") << cid.oid[0] << cid.oid[1] << endl; - cout << F("Product: "); - for (uint8_t i = 0; i < 5; i++) { - cout << cid.pnm[i]; - } - cout << F("\nVersion: "); - cout << int(cid.prv_n) << '.' << int(cid.prv_m) << endl; - cout << F("Serial number: ") << hex << cid.psn << dec << endl; - cout << F("Manufacturing date: "); - cout << int(cid.mdt_month) << '/'; - cout << (2000 + cid.mdt_year_low + 10 * cid.mdt_year_high) << endl; - cout << endl; -} -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - delay(1000); - cout << F("\nUse a freshly formatted SD for best performance.\n"); - - // use uppercase in hex and use 0X base prefix - cout << uppercase << showbase << endl; -} -//------------------------------------------------------------------------------ -void loop() { - float s; - uint32_t t; - uint32_t maxLatency; - uint32_t minLatency; - uint32_t totalLatency; - - // Discard any input. - do { - delay(10); - } while (Serial.available() && Serial.read() >= 0); - - // F( stores strings in flash to save RAM - cout << F("Type any character to start\n"); - while (!Serial.available()) { - SysCall::yield(); - } - cout << F("chipSelect: ") << int(chipSelect) << endl; - cout << F("FreeStack: ") << FreeStack() << endl; - -#if USE_SDIO - if (!sd.begin()) { - sd.initErrorHalt(); - } -#else // USE_SDIO - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } -#endif // USE_SDIO - cout << F("Type is FAT") << int(sd.vol()->fatType()) << endl; - cout << F("Card size: ") << sd.card()->cardSize()*512E-9; - cout << F(" GB (GB = 1E9 bytes)") << endl; - - cidDmp(); - - // open or create file - truncate existing file. - if (!file.open("bench.dat", O_RDWR | O_CREAT | O_TRUNC)) { - error("open failed"); - } - - // fill buf with known data - for (size_t i = 0; i < (BUF_SIZE-2); i++) { - buf[i] = 'A' + (i % 26); - } - buf[BUF_SIZE-2] = '\r'; - buf[BUF_SIZE-1] = '\n'; - - cout << F("File size ") << FILE_SIZE_MB << F(" MB\n"); - cout << F("Buffer size ") << BUF_SIZE << F(" bytes\n"); - cout << F("Starting write test, please wait.") << endl << endl; - - // do write test - uint32_t n = FILE_SIZE/sizeof(buf); - cout < m) { - minLatency = m; - } - totalLatency += m; - } - file.sync(); - t = millis() - t; - s = file.fileSize(); - cout << s/t <<',' << maxLatency << ',' << minLatency; - cout << ',' << totalLatency/n << endl; - } - cout << endl << F("Starting read test, please wait.") << endl; - cout << endl < m) { - minLatency = m; - } - totalLatency += m; - if (buf[BUF_SIZE-1] != '\n') { - error("data check"); - } - } - s = file.fileSize(); - t = millis() - t; - cout << s/t <<',' << maxLatency << ',' << minLatency; - cout << ',' << totalLatency/n << endl; - } - cout << endl << F("Done") << endl; - file.close(); -} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/dataLogger/dataLogger.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/dataLogger/dataLogger.ino index 69926fe9..c859bcdb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/dataLogger/dataLogger.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/dataLogger/dataLogger.ino @@ -70,13 +70,13 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(1000); Serial.println(F("Type any character to start")); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is @@ -145,6 +145,6 @@ void loop() { // Close file and stop. file.close(); Serial.println(F("Done")); - SysCall::halt(); + while (true) {} } } \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/fgets/fgets.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/fgets/fgets.ino index 8d4a2451..29979dcc 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/fgets/fgets.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/fgets/fgets.ino @@ -64,12 +64,12 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } delay(400); // catch Due reset problem diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/formatting/formatting.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/formatting/formatting.ino index 90a43e48..7a6bb045 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/formatting/formatting.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/formatting/formatting.ino @@ -45,7 +45,7 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } delay(2000); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/getline/getline.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/getline/getline.ino index 88c68a97..17a928fd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/getline/getline.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/getline/getline.ino @@ -58,13 +58,13 @@ void setup(void) { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } // F stores strings in flash to save RAM cout << F("Type any character to start\n"); while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/rename/rename.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/rename/rename.ino deleted file mode 100644 index 7ad745fb..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/rename/rename.ino +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This program demonstrates use of SdFile::rename() - * and SdFat::rename(). - */ -#include -#include "SdFat.h" -#include "sdios.h" - -// SD chip select pin -const uint8_t chipSelect = SS; - -// file system -SdFat sd; - -// Serial print stream -ArduinoOutStream cout(Serial); -//------------------------------------------------------------------------------ -// store error strings in flash to save RAM -#define error(s) sd.errorHalt(F(s)) -//------------------------------------------------------------------------------ -void setup() { - Serial.begin(9600); - - // Wait for USB Serial - while (!Serial) { - SysCall::yield(); - } - cout << F("Insert an empty SD. Type any character to start.") << endl; - while (!Serial.available()) { - SysCall::yield(); - } - - // Initialize at the highest speed supported by the board that is - // not over 50 MHz. Try a lower speed if SPI errors occur. - if (!sd.begin(chipSelect, SD_SCK_MHZ(50))) { - sd.initErrorHalt(); - } - - // Remove file/dirs from previous run. - if (sd.exists("dir2/DIR3/NAME3.txt")) { - cout << F("Removing /dir2/DIR3/NAME3.txt") << endl; - if (!sd.remove("dir2/DIR3/NAME3.txt") || - !sd.rmdir("dir2/DIR3/") || - !sd.rmdir("dir2/")) { - error("remove/rmdir failed"); - } - } - // create a file and write one line to the file - SdFile file("Name1.txt", O_WRONLY | O_CREAT); - if (!file.isOpen()) { - error("Name1.txt"); - } - file.println("A test line for Name1.txt"); - - // rename the file name2.txt and add a line. - if (!file.rename("name2.txt")) { - error("name2.txt"); - } - file.println("A test line for name2.txt"); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - // make a new directory - "Dir1" - if (!sd.mkdir("Dir1")) { - error("Dir1"); - } - - // move file into Dir1, rename it NAME3.txt and add a line - if (!file.rename("Dir1/NAME3.txt")) { - error("NAME3.txt"); - } - file.println("A line for Dir1/NAME3.txt"); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - // make directory "dir2" - if (!sd.mkdir("dir2")) { - error("dir2"); - } - - // close file before rename(oldPath, newPath) - file.close(); - - // move Dir1 into dir2 and rename it DIR3 - if (!sd.rename("Dir1", "dir2/DIR3")) { - error("dir2/DIR3"); - } - - // open file for append in new location and add a line - if (!file.open("dir2/DIR3/NAME3.txt", O_WRONLY | O_APPEND)) { - error("dir2/DIR3/NAME3.txt"); - } - file.println("A line for dir2/DIR3/NAME3.txt"); - file.close(); - - // list files - cout << F("------") << endl; - sd.ls(LS_R); - - cout << F("Done") << endl; -} -void loop() {} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/v1v2.txt b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/v1v2.txt deleted file mode 100644 index a148d195..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/v1v2.txt +++ /dev/null @@ -1,66 +0,0 @@ -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/STM32Test/STM32Test.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/STM32Test/STM32Test.ino" -8c8 -< ---- -> #error See new Version 2 STM32 example -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/SdFormatter/SdFormatter.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/SdFormatter/SdFormatter.ino" -14c14 -< ---- -> #error use new Version 2 SdFormatter -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/SdInfo/SdInfo.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/SdInfo/SdInfo.ino" -7c7 -< ---- -> #error Use new Version 2 SdInfo -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/SoftwareSpi/SoftwareSpi.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/SoftwareSpi/SoftwareSpi.ino" -7a8 -> #error See Version 2 software SPI example -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/StdioBench/StdioBench.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/StdioBench/StdioBench.ino" -3a4 -> #include "sdios.h" -27c28 -< uint32_t printSize; ---- -> uint32_t printSize = 0; -29c30 -< uint32_t printTime; ---- -> uint32_t printTime = 0; -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/TeensySdioDemo/TeensySdioDemo.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/TeensySdioDemo/TeensySdioDemo.ino" -9c9 -< ---- -> #error See Version 2 SDIO example -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/Timestamp/Timestamp.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/Timestamp/Timestamp.ino" -8d7 -< -55,59d53 -< dir_t d; -< if (!f.dirEntry(&d)) { -< error("f.dirEntry failed"); -< } -< -61,73c55,59 -< f.printFatDate(d.creationDate); -< cout << ' '; -< f.printFatTime(d.creationTime); -< cout << endl; -< -< cout << F("Modify: "); -< f.printFatDate(d.lastWriteDate); -< cout <<' '; -< f.printFatTime(d.lastWriteTime); -< cout << endl; -< -< cout << F("Access: "); -< f.printFatDate(d.lastAccessDate); ---- -> f.printCreateDateTime(&Serial); -> cout << endl << F("Modify: "); -> f.printModifyDateTime(&Serial); -> cout << endl << F("Access: "); -> f.printAccessDateTime(&Serial); -diff -rb "C:\\Users\\bill\\Documents\\Arduino\\libraries\\SdFat\\examples/wipe/wipe.ino" "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\SdFat\\examples\\examplesV1/wipe/wipe.ino" -1a2 -> #error wipe is not supported in SdFat V2. Use bool format(print_t* pr = nullptr). diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/wipe/wipe.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/wipe/wipe.ino index b6341417..e79e1d4f 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/wipe/wipe.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/examplesV1/wipe/wipe.ino @@ -11,11 +11,11 @@ void setup() { Serial.begin(9600); // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } Serial.println("Type 'Y' to wipe all data."); while (!Serial.available()) { - SysCall::yield(); + yield(); } c = Serial.read(); if (c != 'Y') { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/examples/rename/rename.ino b/extra-libraries/ESP8266/ESP8266SdFat/examples/rename/rename.ino index 1918ec37..3995fce5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/examples/rename/rename.ino +++ b/extra-libraries/ESP8266/ESP8266SdFat/examples/rename/rename.ino @@ -4,12 +4,9 @@ #include "SdFat.h" #include "sdios.h" -using namespace sdfat; - - // SD_FAT_TYPE = 0 for SdFat/File as defined in SdFatConfig.h, // 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. -#define SD_FAT_TYPE 1 +#define SD_FAT_TYPE 3 /* Change the value of SD_CS_PIN if you are using SPI and @@ -23,19 +20,21 @@ using namespace sdfat; // SDCARD_SS_PIN is defined for the built-in SD on some boards. #ifndef SDCARD_SS_PIN const uint8_t SD_CS_PIN = SS; -#else // SDCARD_SS_PIN +#else // SDCARD_SS_PIN // Assume built-in SD is used. const uint8_t SD_CS_PIN = SDCARD_SS_PIN; #endif // SDCARD_SS_PIN +// Try max SPI clock for an SD. Reduce SPI_CLOCK if errors occur. +#define SPI_CLOCK SD_SCK_MHZ(50) // Try to select the best SD card configuration. #if HAS_SDIO_CLASS #define SD_CONFIG SdioConfig(FIFO_SDIO) #elif ENABLE_DEDICATED_SPI -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, DEDICATED_SPI, SPI_CLOCK) #else // HAS_SDIO_CLASS -#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI) +#define SD_CONFIG SdSpiConfig(SD_CS_PIN, SHARED_SPI, SPI_CLOCK) #endif // HAS_SDIO_CLASS #if SD_FAT_TYPE == 0 @@ -65,11 +64,11 @@ void setup() { // Wait for USB Serial while (!Serial) { - SysCall::yield(); + yield(); } cout << F("Insert an empty SD. Type any character to start.") << endl; while (!Serial.available()) { - SysCall::yield(); + yield(); } // Initialize at the highest speed supported by the board that is @@ -81,8 +80,7 @@ void setup() { // Remove file/dirs from previous run. if (sd.exists("dir2/DIR3/NAME3.txt")) { cout << F("Removing /dir2/DIR3/NAME3.txt") << endl; - if (!sd.remove("dir2/DIR3/NAME3.txt") || - !sd.rmdir("dir2/DIR3/") || + if (!sd.remove("dir2/DIR3/NAME3.txt") || !sd.rmdir("dir2/DIR3/") || !sd.rmdir("dir2/")) { error("remove/rmdir failed"); } @@ -144,4 +142,4 @@ void setup() { cout << F("Done") << endl; } -void loop() {} +void loop() {} \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/AvrPrintStimmer.cpp b/extra-libraries/ESP8266/ESP8266SdFat/extras/AvrPrintStimmer.cpp new file mode 100644 index 00000000..188db166 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/AvrPrintStimmer.cpp @@ -0,0 +1,567 @@ +/* + Print.cpp - Base class that provides print() and println() + Copyright (c) 2008 David A. Mellis. All right reserved. + many modifications, by Paul Stoffregen + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Modified 23 November 2006 by David A. Mellis + */ + +#include +#include +#include +#include +#include +#include "Arduino.h" // (was wiring.h) + +#include "Print.h" + + +#if ARDUINO >= 100 +#else +void Print::write(const char *str) +{ + write((const uint8_t *)str, strlen(str)); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::write(const uint8_t *buffer, size_t size) +{ + size_t count = 0; + while (size--) count += write(*buffer++); + return count; +} +#else +void Print::write(const uint8_t *buffer, size_t size) +{ + while (size--) write(*buffer++); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(const String &s) +{ + uint8_t buffer[33]; + size_t count = 0; + unsigned int index = 0; + unsigned int len = s.length(); + while (len > 0) { + s.getBytes(buffer, sizeof(buffer), index); + unsigned int nbytes = len; + if (nbytes > sizeof(buffer)-1) nbytes = sizeof(buffer)-1; + index += nbytes; + len -= nbytes; + count += write(buffer, nbytes); + } + return count; +} +#else +void Print::print(const String &s) +{ + unsigned int len = s.length(); + for (unsigned int i=0; i < len; i++) { + write(s[i]); + } +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(const __FlashStringHelper *ifsh) +{ + uint8_t buffer[32]; + size_t count = 0; + const char PROGMEM *p = (const char PROGMEM *)ifsh; + unsigned int len = strlen_P(p); + while (len > 0) { + unsigned int nbytes = len; + if (nbytes > sizeof(buffer)) nbytes = sizeof(buffer); + memcpy_P(buffer, p, nbytes); + p += nbytes; + len -= nbytes; + count += write(buffer, nbytes); + } + return count; +} +#else +void Print::print(const __FlashStringHelper *ifsh) +{ + const char PROGMEM *p = (const char PROGMEM *)ifsh; + while (1) { + unsigned char c = pgm_read_byte(p++); + if (c == 0) return; + write(c); + } +} +#endif + + +#if ARDUINO >= 100 +size_t Print::print(long n) +{ + uint8_t sign=0; + + if (n < 0) { + sign = 1; + n = -n; + } + return printNumber(n, sign, 10); +} +#else +void Print::print(long n) +{ + uint8_t sign=0; + + if (n < 0) { + sign = 1; + n = -n; + } + printNumber(n, sign, 10); +} +#endif + + +#if ARDUINO >= 100 +size_t Print::println(void) +{ + uint8_t buf[2]={'\r', '\n'}; + return write(buf, 2); +} +#else +void Print::println(void) +{ + uint8_t buf[2]={'\r', '\n'}; + write(buf, 2); +} +#endif + + +//#define USE_HACKER_DELIGHT_OPTIMIZATION +#define USE_STIMMER_OPTIMIZATION +#define USE_BENCHMARK_CODE + + +#ifdef USE_HACKER_DELIGHT_OPTIMIZATION +// Adapted from Hacker's Delight (Henry Warren, ISBN 0321842685) www.hackersdelight.org +// by Rob Tillaart, Tom Carpenter, "genom2" with input from others... +// http://forum.arduino.cc/index.php?topic=167414.0 +// +#define divmod10_asm(in32, tmp32, mod8) \ +asm volatile ( \ + "mov %2, %A0 \n\t" /* mod = in */ \ + "ori %A0, 1 \n\t" /* q = in | 1 */ \ + "movw %A1, %A0 \n\t" /* x = q */ \ + "movw %C1, %C0 \n\t" \ + "lsr %D1 \n\t" /* x = x >> 2 */ \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "sub %A0, %A1 \n\t" /* q = q - x */ \ + "sbc %B0, %B1 \n\t" \ + "sbc %C0, %C1 \n\t" \ + "sbc %D0, %D1 \n\t" \ + "movw %A1, %A0 \n\t" /* x = q */ \ + "movw %C1, %C0 \n\t" \ + "lsr %D1 \n\t" /* x = x >> 4 */ \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "lsr %D1 \n\t" \ + "ror %C1 \n\t" \ + "ror %B1 \n\t" \ + "ror %A1 \n\t" \ + "add %A1, %A0 \n\t" /* x = x + q */ \ + "adc %B1, %B0 \n\t" \ + "adc %C1, %C0 \n\t" \ + "adc %D1, %D0 \n\t" \ + "movw %A0, %A1 \n\t" /* q = x */ \ + "movw %C0, %C1 \n\t" \ + "add %A0, %B1 \n\t" /* q = q + (x >> 8) */ \ + "adc %B0, %C1 \n\t" \ + "adc %C0, %D1 \n\t" \ + "adc %D0, r1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "mov %A0, %B0 \n\t" /* q = q >> 8 */ \ + "mov %B0, %C0 \n\t" \ + "mov %C0, %D0 \n\t" \ + "eor %D0, %D0 \n\t" \ + "add %A0, %A1 \n\t" /* q = q + x */ \ + "adc %B0, %B1 \n\t" \ + "adc %C0, %C1 \n\t" \ + "adc %D0, %D1 \n\t" \ + "andi %A0, 0xF8 \n\t" /* q = q & ~0x7 */ \ + "sub %2, %A0 \n\t" /* mod = mod - q */ \ + "lsr %D0 \n\t" /* q = q >> 2 */ \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + "lsr %D0 \n\t" \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + "sub %2, %A0 \n\t" /* mod = mod - q */ \ + "lsr %D0 \n\t" /* q = q >> 1 */ \ + "ror %C0 \n\t" \ + "ror %B0 \n\t" \ + "ror %A0 \n\t" \ + : "+d" (in32), "=r" (tmp32), "=r" (mod8) : : "r0" \ +) +#endif // USE_HACKER_DELIGHT_OPTIMIZATION + +#ifdef USE_STIMMER_OPTIMIZATION +// http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 +#define divmod10_asm32(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " mul %D0,%2 \n\t" \ + " clr %D0 \n\t" \ + " add %C0,r0 \n\t" \ + " adc %D0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,%D0 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,%D0 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%D0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " lsr %D0 \n\t" \ + " ror %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm24(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " lsr %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm16(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " lsr %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") + +#define divmod10_asm8(in32, mod8, tmp8) \ +asm volatile ( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,r1 \n\t" \ + " lsr %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + :"+r"(in32),"=d"(mod8),"=d"(tmp8) : : "r0") +#endif // USE_STIMMER_OPTIMIZATION + + + +#ifdef USE_BENCHMARK_CODE +uint32_t usec_print = 0; +#endif + + +#if ARDUINO >= 100 +size_t Print::printNumberDec(unsigned long n, uint8_t sign) +#else +void Print::printNumberDec(unsigned long n, uint8_t sign) +#endif +{ + uint8_t digit, buf[11], *p; + uint32_t tmp32; + uint8_t tmp8; + +#ifdef USE_BENCHMARK_CODE + uint32_t usec = micros(); +#endif + p = buf + (sizeof(buf)-1); + + #if defined(USE_STIMMER_OPTIMIZATION) + + while(n & 0xff000000){divmod10_asm32(n, digit, tmp8);*--p = digit + '0';} + while(n & 0xff0000){divmod10_asm24(n, digit, tmp8);*--p = digit + '0';} + while(n & 0xff00){divmod10_asm16(n, digit, tmp8);*--p = digit + '0';} + while((n & 0xff)>9){divmod10_asm8(n, digit, tmp8);*--p = digit + '0';} + *--p = n + '0'; + + #else + do { + #if defined(USE_HACKER_DELIGHT_OPTIMIZATION) + divmod10_asm(n, tmp32, digit); + #else + tmp32 = n; + n = n / 10; + digit = tmp32 - n * 10; + #endif + *--p = digit + '0'; + } while (n); + #endif + if (sign) *--p = '-'; +#ifdef USE_BENCHMARK_CODE + usec_print += micros() - usec; +#endif +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberHex(unsigned long n) +#else +void Print::printNumberHex(unsigned long n) +#endif +{ + uint8_t digit, buf[8], *p; + + p = buf + (sizeof(buf)-1); + do { + digit = n & 15; + *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; + n >>= 4; + } while (n); +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberBin(unsigned long n) +#else +void Print::printNumberBin(unsigned long n) +#endif +{ + uint8_t buf[32], *p; + + p = buf + (sizeof(buf)-1); + do { + *--p = '0' + ((uint8_t)n & 1); + n >>= 1; + } while (n); +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + +#if ARDUINO >= 100 +size_t Print::printNumberAny(unsigned long n, uint8_t base) +#else +void Print::printNumberAny(unsigned long n, uint8_t base) +#endif +{ + uint8_t digit, buf[21], *p; + uint32_t tmp; + //uint32_t usec; + + //usec = micros(); + p = buf + (sizeof(buf)-1); + do { + tmp = n; + n = n / base; + digit = tmp - n * base; + *--p = (digit < 10) ? '0' + digit : 'A' + digit - 10; + } while (n); + //usec_print += micros() - usec; +#if ARDUINO >= 100 + return write(p, sizeof(buf)-1 - (p - buf)); +#else + write(p, sizeof(buf)-1 - (p - buf)); +#endif +} + + + + +#if ARDUINO >= 100 +size_t Print::printFloat(double number, uint8_t digits) +#else +void Print::printFloat(double number, uint8_t digits) +#endif +{ + uint8_t sign=0; +#if ARDUINO >= 100 + size_t count=0; +#endif + + // Handle negative numbers + if (number < 0.0) { + sign = 1; + number = -number; + } + + // Round correctly so that print(1.999, 2) prints as "2.00" + double rounding = 0.5; + for (uint8_t i=0; i= 100 + count += printNumber(int_part, sign, 10); +#else + printNumber(int_part, sign, 10); +#endif + + // Print the decimal point, but only if there are digits beyond + if (digits > 0) { + uint8_t n, buf[8], count=1; + buf[0] = '.'; + + // Extract digits from the remainder one at a time + if (digits > sizeof(buf) - 1) digits = sizeof(buf) - 1; + + while (digits-- > 0) { + remainder *= 10.0; + n = (uint8_t)(remainder); + buf[count++] = '0' + n; + remainder -= n; + } +#if ARDUINO >= 100 + count += write(buf, count); +#else + write(buf, count); +#endif + } +#if ARDUINO >= 100 + return count; +#endif +} + + diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip index bb8e5440..72b3069c 100644 Binary files a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip and b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/USB_Host_Shield_2.0.zip differ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/UsbHostShieldDiff.txt b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/UsbHostShieldDiff.txt index bbe0f1d4..fdc70d78 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/UsbHostShieldDiff.txt +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/UsbHostShieldDiff.txt @@ -1,6 +1,4 @@ - - -+++ "C:\\Users\\bill\\Documents\\ArduinoSdFat\\libraries\\USB_Host_Shield_2.0/masstorage.cpp" 2020-02-20 06:02:48.567008200 -0800 +master/masstorage.cpp" 2022-10-18 08:48:03.639503200 -0700 @@ -796,6 +796,7 @@ buf[i] = 0x00; } @@ -9,3 +7,4 @@ uint8_t rc = ModeSense6(lun, 0, 0x3f, 0, 192, buf); if(!rc) { WriteOk[lun] = ((buf[2] & 0x80) == 0); + diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/readme.txt b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/readme.txt index 0d7b60bd..07b26fe2 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/readme.txt +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/USB_Host_Shield/readme.txt @@ -1,4 +1,4 @@ -This zip file was downloaded on 2/20/2020 from +This zip file was downloaded on 10/18/2022 from https://github.com/felis/USB_Host_Shield_2.0 diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.cpp b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.cpp similarity index 93% rename from extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.cpp rename to extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.cpp index 2e2c6fa2..87cd5e1b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.cpp @@ -23,12 +23,9 @@ * DEALINGS IN THE SOFTWARE. */ #include "PrintBasic.h" +#if ENABLE_ARDUINO_FEATURES == 0 #include - -namespace sdfat { - - size_t PrintBasic::print(long n, uint8_t base) { if (n < 0 && base == 10) { return print('-') + printNum(-n, base); @@ -36,14 +33,14 @@ size_t PrintBasic::print(long n, uint8_t base) { return printNum(n, base); } size_t PrintBasic::printNum(unsigned long n, uint8_t base) { - const uint8_t DIM = 8*sizeof(long); + const uint8_t DIM = 8 * sizeof(long); char buf[DIM]; char *str = &buf[DIM]; if (base < 2) return 0; do { - char c = n%base; + char c = n % base; n /= base; *--str = c + (c < 10 ? '0' : 'A' - 10); } while (n); @@ -70,7 +67,7 @@ size_t PrintBasic::printDouble(double n, uint8_t prec) { } double round = 0.5; - for (uint8_t i = 0; i < prec; ++i) { + for (uint8_t i = 0; i < prec; ++i) { round *= 0.1; } @@ -91,6 +88,4 @@ size_t PrintBasic::printDouble(double n, uint8_t prec) { } return rtn; } - - -}; // namespace sdfat +#endif // ENABLE_ARDUINO_FEATURES == 0 diff --git a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.h b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.h similarity index 72% rename from extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.h rename to extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.h index ed44ec1e..55cb60a5 100644 --- a/extra-libraries/ESP32/SdFat-2.1.2/extras/attic/PrintBasic.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintBasic.h @@ -28,18 +28,21 @@ * \file * \brief Stream/Print like replacement for non-Arduino systems. */ -#include #include +#include #include -#ifdef F -#warning F() macro defined for non Arduino System -#elif defined(__AVR__) +#include "../SdFatConfig.h" + +#ifndef F +#if defined(__AVR__) #include class __FlashStringHelper; -#define F(str) (reinterpret_cast(PSTR(str))) -#else // F +#define F(string_literal) \ + (reinterpret_cast(PSTR(string_literal))) +#else // defined(__AVR__) #define F(str) (str) +#endif // defined(__AVR__) #endif // F #ifdef BIN @@ -54,63 +57,44 @@ class PrintBasic { public: PrintBasic() : m_error(0) {} - void clearWriteError() { - setWriteError(0); - } - int getWriteError() { - return m_error; - } - size_t print(char c) { - return write(c); - } - size_t print(const char* str) { - return write(str); - } + void clearWriteError() { setWriteError(0); } + int getWriteError() { return m_error; } + size_t print(char c) { return write(c); } + size_t print(const char *str) { return write(str); } size_t print(const __FlashStringHelper *str) { #ifdef __AVR__ - PGM_P p = reinterpret_cast(str); - size_t n = 0; - for (uint8_t c; (c = pgm_read_byte(p + n)) && write(c); n++) {} - return n; -#else // __AVR__ - return print(reinterpret_cast(str)); + PGM_P p = reinterpret_cast(str); + size_t n = 0; + for (uint8_t c; (c = pgm_read_byte(p + n)) && write(c); n++) { + } + return n; +#else // __AVR__ + return print(reinterpret_cast(str)); #endif // __AVR__ } size_t println(const __FlashStringHelper *str) { #ifdef __AVR__ return print(str) + println(); -#else // __AVR__ +#else // __AVR__ return println(reinterpret_cast(str)); #endif // __AVR__ } - size_t print(double n, uint8_t prec = 2) { - return printDouble(n, prec); - } + size_t print(double n, uint8_t prec = 2) { return printDouble(n, prec); } size_t print(signed char n, uint8_t base = 10) { return print((long)n, base); } size_t print(unsigned char n, uint8_t base = 10) { return print((unsigned long)n, base); } - size_t print(int n, uint8_t base = 10) { - return print((long)n, base); - } + size_t print(int n, uint8_t base = 10) { return print((long)n, base); } size_t print(unsigned int n, uint8_t base = 10) { return print((unsigned long)n, base); } size_t print(long n, uint8_t base = 10); - size_t print(unsigned long n, uint8_t base = 10) { - return printNum(n, base); - } - size_t println() { - return write("\r\n"); - } - size_t println(char c) { - return write(c) + println(); - } - size_t println(const char* str) { - return print(str) + println(); - } + size_t print(unsigned long n, uint8_t base = 10) { return printNum(n, base); } + size_t println() { return write("\r\n"); } + size_t println(char c) { return write(c) + println(); } + size_t println(const char *str) { return print(str) + println(); } size_t println(double n, uint8_t prec = 2) { return print(n, prec) + println(); } @@ -132,12 +116,10 @@ class PrintBasic { size_t println(unsigned long n, uint8_t base = 10) { return print(n, base) + println(); } - size_t write(const char *str) { - return write(str, strlen(str)); - } + size_t write(const char *str) { return write(str, strlen(str)); } virtual size_t write(uint8_t b) = 0; - virtual size_t write(const uint8_t* buffer, size_t size) { + virtual size_t write(const uint8_t *buffer, size_t size) { size_t i; for (i = 0; i < size; i++) { if (!write(buffer[i])) break; @@ -145,13 +127,11 @@ class PrintBasic { return i; } size_t write(const char *buffer, size_t size) { - return write((const uint8_t*)buffer, size); + return write(reinterpret_cast(buffer), size); } protected: - void setWriteError(int err = 1) { - m_error = err; - } + void setWriteError(int err = 1) { m_error = err; } private: size_t printDouble(double n, uint8_t prec); diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintTemplates.h b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintTemplates.h similarity index 99% rename from extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintTemplates.h rename to extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintTemplates.h index 839a6d72..e6f75b54 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintTemplates.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/PrintTemplates.h @@ -30,11 +30,6 @@ */ #include #include "FmtNumber.h" - - -namespace sdfat { - - /** test for digit */ #define isDigit(d) ('0' <= (d) && (d) <= '9') /** control for supported floating formats */ @@ -382,7 +377,7 @@ int vmprintf(F* file, const char *fmt, va_list ap) { break; default: - *--str = c;; + *--str = c; break; } ns = ptr - str; @@ -473,7 +468,7 @@ int vmprintf(F file, const __FlashStringHelper *ifsh, va_list ap) { break; default: - *--str = c;; + *--str = c; break; } ns = ptr - str; @@ -502,9 +497,4 @@ int mprintf(F* file, const __FlashStringHelper *ifsh, ...) { va_end(ap); return rtn; } - - -}; // namespace sdfat - - #endif // PrintTemplates_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCallBareUno.cpp b/extra-libraries/ESP8266/ESP8266SdFat/extras/attic/SysCallBareUno.cpp similarity index 100% rename from extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCallBareUno.cpp rename to extra-libraries/ESP8266/ESP8266SdFat/extras/attic/SysCallBareUno.cpp diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/cpplint.py b/extra-libraries/ESP8266/ESP8266SdFat/extras/cpplint.py index 4a82bde4..704618f5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/extras/cpplint.py +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/cpplint.py @@ -67,7 +67,7 @@ Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...] [file] ... The style guidelines this tries to follow are those in - https://google-styleguide.googlecode.com/svn/trunk/cppguide.xml + https://google.github.io/styleguide/cppguide.html Every problem is given a confidence score from 1-5, with 5 meaning we are certain of the problem, and 1 meaning it could be a legitimate construct. diff --git a/extra-libraries/ESP8266/ESP8266SdFat/extras/fmt_src.bat b/extra-libraries/ESP8266/ESP8266SdFat/extras/fmt_src.bat new file mode 100644 index 00000000..7ddecdfe --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/extras/fmt_src.bat @@ -0,0 +1,11 @@ +clang-format --style=Google -i *.cpp *.h +rem clang-format --style=Google -i DigitalIO/*.h +rem clang-format --style=Google -i DigitalIO/boards/*.h +clang-format --style=Google -i common/*.cpp common/*.h +clang-format --style=Google -i ExFatLib/*.cpp ExFatLib/*.h +clang-format --style=Google -i FatLib/*.cpp FatLib/*.h +clang-format --style=Google -i FsLib/*.cpp FsLib/*.h +clang-format --style=Google -i iostream/*.cpp iostream/*.h +clang-format --style=Google -i SdCard/*.cpp SdCard/*.h +clang-format --style=Google -i SpiDriver/*.cpp SpiDriver/*.h +pause diff --git a/extra-libraries/ESP8266/ESP8266SdFat/library.properties b/extra-libraries/ESP8266/ESP8266SdFat/library.properties index bbdfd2ff..12abc4f5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/library.properties +++ b/extra-libraries/ESP8266/ESP8266SdFat/library.properties @@ -1,10 +1,10 @@ -name=ESP8266SdFat -version=2.0.2 +name=SdFat +version=2.2.3 license=MIT author=Bill Greiman maintainer=Bill Greiman -sentence=FAT16/FAT32/exFAT file system. -paragraph=FAT16/FAT32/exFAT file system. +sentence=Provides access to SD memory cards. +paragraph=The SdFat library supports FAT16, FAT32, and exFAT file systems on Standard SD, SDHC, and SDXC cards. category=Data Storage url=https://github.com/greiman/SdFat repository=https://github.com/greiman/SdFat.git diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/BufferedPrint.h b/extra-libraries/ESP8266/ESP8266SdFat/src/BufferedPrint.h index 5bb26494..5145babb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/BufferedPrint.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/BufferedPrint.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,17 +28,15 @@ * \file * \brief Fast buffered print. */ +#ifdef __AVR__ +#include +#endif // __AVR__ #include "common/FmtNumber.h" - - -namespace sdfat { - - /** * \class BufferedPrint * \brief Fast buffered print template. */ -template +template class BufferedPrint { public: BufferedPrint() : m_wr(nullptr), m_in(0) {} @@ -54,7 +52,7 @@ class BufferedPrint { m_in = 0; } /** Flush the buffer - same as sync() with no status return. */ - void flush() {sync();} + void flush() { sync(); } /** Print a character followed by a field terminator. * \param[in] c character to print. * \param[in] term The field terminator. Use '\\n' for CR LF. @@ -77,7 +75,7 @@ class BufferedPrint { * \param[in] term The field terminator. Use '\\n' for CR LF. * \return true for success or false if an error occurs. */ - size_t printField(const __FlashStringHelper *fsh, char term) { + size_t printField(const __FlashStringHelper* fsh, char term) { #ifdef __AVR__ size_t rtn = 0; PGM_P p = reinterpret_cast(fsh); @@ -98,8 +96,8 @@ class BufferedPrint { rtn += write(str, buf + sizeof(buf) - str); } return rtn; -#else // __AVR__ - return printField(reinterpret_cast(fsh), term); +#else // __AVR__ + return printField(reinterpret_cast(fsh), term); #endif // __AVR__ } /** Print a string followed by a field terminator. @@ -144,7 +142,7 @@ class BufferedPrint { * \param[in] prec Number of digits after decimal point. * \return true for success or false if an error occurs. */ - size_t printField(float f, char term, uint8_t prec = 2) { + size_t printField(float f, char term, uint8_t prec = 2) { return printField(static_cast(f), term, prec); } /** Print an integer value for 8, 16, and 32 bit signed and unsigned types. @@ -152,7 +150,7 @@ class BufferedPrint { * \param[in] term The field terminator. Use '\\n' for CR LF. * \return true for success or false if an error occurs. */ - template + template size_t printField(Type n, char term) { const uint8_t DIM = sizeof(Type) <= 2 ? 8 : 13; char buf[DIM]; @@ -189,9 +187,7 @@ class BufferedPrint { * \param[in] prec Number of digits after decimal point. * \return true for success or false if an error occurs. */ - size_t print(double d, uint8_t prec = 2) { - return printField(d, 0, prec); - } + size_t print(double d, uint8_t prec = 2) { return printField(d, 0, prec); } /** Print a double followed by CR LF. * \param[in] d The number to be printed. * \param[in] prec Number of digits after decimal point. @@ -220,7 +216,7 @@ class BufferedPrint { * \param[in] v item to print. * \return true for success or false if an error occurs. */ - template + template size_t print(Type v) { return printField(v, 0); } @@ -228,7 +224,7 @@ class BufferedPrint { * \param[in] v item to print. * \return true for success or false if an error occurs. */ - template + template size_t println(Type v) { return printField(v, '\n'); } @@ -243,7 +239,7 @@ class BufferedPrint { m_in = 0; return true; } - /** Write data to an open file. + /** Write data to an open file. * \param[in] src Pointer to the location of the data to be written. * * \param[in] n Number of bytes to write. @@ -271,9 +267,4 @@ class BufferedPrint { // Insure room for double. uint8_t m_buf[BUF_DIM < 24 ? 24 : BUF_DIM]; // NOLINT }; - - -}; // namespace sdfat - - #endif // BufferedPrint_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/DigitalPin.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/DigitalPin.h index ac3287b8..d44bb575 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/DigitalPin.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/DigitalPin.h @@ -225,11 +225,6 @@ void fastDigitalWrite(uint8_t pin, bool value) { } } #elif defined(ESP8266) - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** Set pin value * @param[in] pin Arduino pin number @@ -265,11 +260,6 @@ bool fastDigitalRead(uint8_t pin) { } return 0; } - - -}; // namespace sdfat - - #else // CORE_TEENSY //------------------------------------------------------------------------------ inline void fastDigitalWrite(uint8_t pin, bool value) { diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/SoftSPI.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/SoftSPI.h index d36a7ac6..6dd58dff 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/SoftSPI.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/SoftSPI.h @@ -28,11 +28,6 @@ #ifndef SoftSPI_h #define SoftSPI_h #include "DigitalPin.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** Nop for timing. */ #define nop asm volatile ("nop\n\t") @@ -162,10 +157,5 @@ class SoftSPI { } //---------------------------------------------------------------------------- }; - - -}; // namespace sdfat - - #endif // SoftSPI_h /** @} */ diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h index a120426c..67a8ec29 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/AvrDevelopersGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef AvrDevelopersGpioPinMap_h #define AvrDevelopersGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(B, 0), // D0 GPIO_PIN(B, 1), // D1 @@ -39,9 +34,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(A, 1), // D30 GPIO_PIN(A, 0) // D31 }; - - -}; // namespace sdfat - - -#endif // AvrDevelopersGpioPinMap_h +#endif // AvrDevelopersGpioPinMap_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/BobuinoGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/BobuinoGpioPinMap.h index 7b641664..2d199445 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/BobuinoGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/BobuinoGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef BobuinoGpioPinMap_h #define BobuinoGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(B, 0), // D0 GPIO_PIN(B, 1), // D1 @@ -39,9 +34,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(A, 6), // D30 GPIO_PIN(A, 7) // D31 }; - - -}; // namespace sdfat - - -#endif // BobuinoGpioPinMap_h +#endif // BobuinoGpioPinMap_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/LeonardoGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/LeonardoGpioPinMap.h index 5756454c..73544e66 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/LeonardoGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/LeonardoGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef LeonardoGpioPinMap_h #define LeonardoGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(D, 2), // D0 GPIO_PIN(D, 3), // D1 @@ -37,9 +32,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(B, 6), // D28 GPIO_PIN(D, 6) // D29 }; - - -}; // namespace sdfat - - #endif // LeonardoGpioPinMap_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/MegaGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/MegaGpioPinMap.h index 97164e02..c0413431 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/MegaGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/MegaGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef MegaGpioPinMap_h #define MegaGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(E, 0), // D0 GPIO_PIN(E, 1), // D1 @@ -77,9 +72,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(K, 6), // D68 GPIO_PIN(K, 7) // D69 }; - - -}; // namespace sdfat - - #endif // MegaGpioPinMap_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h index c5439566..bf040d93 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/SleepingBeautyGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef SleepingBeautyGpioPinMap_h #define SleepingBeautyGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(D, 0), // D0 GPIO_PIN(D, 1), // D1 @@ -39,9 +34,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(A, 6), // D30 GPIO_PIN(A, 7) // D31 }; - - -}; // namespace sdfat - - -#endif // SleepingBeautyGpioPinMap_h +#endif // SleepingBeautyGpioPinMap_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Standard1284GpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Standard1284GpioPinMap.h index 9959ce90..d38ff0cd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Standard1284GpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Standard1284GpioPinMap.h @@ -1,10 +1,5 @@ #ifndef Standard1284GpioPinMap_h #define Standard1284GpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(B, 0), // D0 GPIO_PIN(B, 1), // D1 @@ -39,8 +34,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(A, 6), // D30 GPIO_PIN(A, 7) // D31 }; - - -}; // namespace sdfat - -#endif // Standard1284GpioPinMap_h +#endif // Standard1284GpioPinMap_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2GpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2GpioPinMap.h index ba052001..00aa437d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2GpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2GpioPinMap.h @@ -1,10 +1,5 @@ #ifndef Teensy2GpioPinMap_h #define Teensy2GpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(B, 0), // D0 GPIO_PIN(B, 1), // D1 @@ -32,9 +27,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(D, 5), // D23 GPIO_PIN(E, 6), // D24 }; - - -}; // namespace sdfat - - #endif // Teensy2GpioPinMap_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2ppGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2ppGpioPinMap.h index 96dddc78..68c51d72 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2ppGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/Teensy2ppGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef Teensypp2GpioPinMap_h #define Teensypp2GpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(D, 0), // D0 GPIO_PIN(D, 1), // D1 @@ -53,9 +48,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(F, 6), // D44 GPIO_PIN(F, 7), // D45 }; - - -}; // namespace sdfat - - #endif // Teensypp2GpioPinMap_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/UnoGpioPinMap.h b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/UnoGpioPinMap.h index 9680d2fc..21ec75dd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/UnoGpioPinMap.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/DigitalIO/boards/UnoGpioPinMap.h @@ -1,10 +1,5 @@ #ifndef UnoGpioPinMap_h #define UnoGpioPinMap_h - - -namespace sdfat { - - static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(D, 0), // D0 GPIO_PIN(D, 1), // D1 @@ -27,9 +22,4 @@ static const GpioPinMap_t GpioPinMap[] = { GPIO_PIN(C, 4), // D18 GPIO_PIN(C, 5) // D19 }; - - -}; // namespace sdfat - - -#endif // UnoGpioPinMap_h +#endif // UnoGpioPinMap_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatConfig.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatConfig.h index 08ffd188..a512314c 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatConfig.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatConfig.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,11 +24,10 @@ */ #ifndef ExFatConfig_h #define ExFatConfig_h -#include "../SdFatConfig.h" -#ifndef USE_EXFAT_UNICODE_NAMES -#define USE_EXFAT_UNICODE_NAMES 0 -#endif // USE_EXFAT_UNICODE_NAMES -#ifndef READ_ONLY -#define READ_ONLY 0 -#endif // READ_ONLY +#include "SdFatConfig.h" + +#ifndef EXFAT_READ_ONLY +#define EXFAT_READ_ONLY 0 +#endif // EXFAT_READ_ONLY + #endif // ExFatConfig_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatDbg.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatDbg.cpp index ce5b7b4f..02cc1bf7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatDbg.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatDbg.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,15 +22,10 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +#include "../common/upcase.h" +#include "ExFatLib.h" #include "ExFatVolume.h" -#include "upcase.h" -#include "ExFatFile.h" #ifndef DOXYGEN_SHOULD_SKIP_THIS - - -namespace sdfat { - - //------------------------------------------------------------------------------ static void printHex(print_t* pr, uint8_t h); static void printHex(print_t* pr, uint16_t val); @@ -56,9 +51,23 @@ static uint16_t exFatDirChecksum(const void* dir, uint16_t checksum) { } return checksum; } + //------------------------------------------------------------------------------ -static void printDateTime(print_t* pr, - uint32_t timeDate, uint8_t ms, int8_t tz) { +static uint16_t hashDir(DirName_t* dir, uint16_t hash) { + for (uint8_t i = 0; i < 30; i += 2) { + uint16_t u = getLe16(dir->unicode + i); + if (!u) { + break; + } + uint16_t c = toUpcase(u); + hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); + hash = ((hash << 15) | (hash >> 1)) + (c >> 8); + } + return hash; +} +//------------------------------------------------------------------------------ +static void printDateTime(print_t* pr, uint32_t timeDate, uint8_t ms, + int8_t tz) { fsPrintDateTime(pr, timeDate, ms, tz); pr->println(); } @@ -84,11 +93,11 @@ static void printDirFile(print_t* pr, DirFile_t* dir) { pr->print(F("attributes: 0x")); pr->println(getLe16(dir->attributes), HEX); pr->print(F("createTime: ")); - printDateTime(pr, getLe32(dir->createTime), - dir->createTimeMs, dir->createTimezone); + printDateTime(pr, getLe32(dir->createTime), dir->createTimeMs, + dir->createTimezone); pr->print(F("modifyTime: ")); - printDateTime(pr, getLe32(dir->modifyTime), - dir->modifyTimeMs, dir->modifyTimezone); + printDateTime(pr, getLe32(dir->modifyTime), dir->modifyTimeMs, + dir->modifyTimezone); pr->print(F("accessTime: ")); printDateTime(pr, getLe32(dir->accessTime), 0, dir->accessTimezone); } @@ -100,7 +109,7 @@ static void printDirLabel(print_t* pr, DirLabel_t* dir) { pr->println(dir->labelLength); pr->print(F("unicode: ")); for (size_t i = 0; i < dir->labelLength; i++) { - pr->write(dir->unicode[2*i]); + pr->write(dir->unicode[2 * i]); } pr->println(); } @@ -110,8 +119,15 @@ static void printDirName(print_t* pr, DirName_t* dir) { pr->println(dir->type, HEX); pr->print(F("unicode: ")); for (size_t i = 0; i < 30; i += 2) { - if (dir->unicode[i] == 0) break; - pr->write(dir->unicode[i]); + uint16_t c = getLe16(dir->unicode + i); + if (c == 0) break; + if (c < 128) { + pr->print(static_cast(c)); + } else { + pr->print("0x"); + pr->print(c, HEX); + } + pr->print(' '); } pr->println(); } @@ -136,7 +152,7 @@ static void printDirStream(print_t* pr, DirStream_t* dir) { static void printDirUpcase(print_t* pr, DirUpcase_t* dir) { pr->print(F("dirUpcase: 0x")); pr->println(dir->type, HEX); - pr->print(F("checksum: 0x")); + pr->print(F("checksum: 0x")); pr->println(getLe32(dir->checksum), HEX); pr->print(F("firstCluster: ")); pr->println(getLe32(dir->firstCluster)); @@ -176,7 +192,7 @@ static void printExFatBoot(print_t* pr, pbs_t* pbs) { pr->print(F("FileSystemRevision: 0x")); pr->println(getLe32(ebs->fileSystemRevision), HEX); pr->print(F("VolumeFlags: 0x")); - pr->println(getLe16(ebs->volumeFlags) , HEX); + pr->println(getLe16(ebs->volumeFlags), HEX); pr->print(F("BytesPerSectorShift: ")); pr->println(ebs->bytesPerSectorShift); pr->print(F("SectorsPerClusterShift: ")); @@ -199,7 +215,7 @@ static void printHex(print_t* pr, uint8_t h) { static void printHex(print_t* pr, uint16_t val) { bool space = true; for (uint8_t i = 0; i < 4; i++) { - uint8_t h = (val >> (12 - 4*i)) & 15; + uint8_t h = (val >> (12 - 4 * i)) & 15; if (h || i == 3) { space = false; } @@ -214,7 +230,7 @@ static void printHex(print_t* pr, uint16_t val) { static void printHex(print_t* pr, uint32_t val) { bool space = true; for (uint8_t i = 0; i < 8; i++) { - uint8_t h = (val >> (28 - 4*i)) & 15; + uint8_t h = (val >> (28 - 4 * i)) & 15; if (h || i == 7) { space = false; } @@ -228,7 +244,7 @@ static void printHex(print_t* pr, uint32_t val) { //------------------------------------------------------------------------------ static void printHex64(print_t* pr, uint64_t n) { char buf[17]; - char *str = &buf[sizeof(buf) - 1]; + char* str = &buf[sizeof(buf) - 1]; *str = '\0'; do { uint8_t h = n & 15; @@ -240,12 +256,12 @@ static void printHex64(print_t* pr, uint64_t n) { //------------------------------------------------------------------------------ static void println64(print_t* pr, uint64_t n) { char buf[21]; - char *str = &buf[sizeof(buf) - 1]; + char* str = &buf[sizeof(buf) - 1]; *str = '\0'; do { uint64_t m = n; n /= 10; - *--str = m - 10*n + '0'; + *--str = m - 10 * n + '0'; } while (n); pr->println(str); } @@ -278,7 +294,7 @@ void ExFatPartition::checkUpcase(print_t* pr) { uint8_t* upcase = nullptr; uint32_t size = 0; uint32_t sector = clusterStartSector(m_rootDirectoryCluster); - uint8_t* cache = dataCacheGet(sector, FsCache::CACHE_FOR_READ); + uint8_t* cache = dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { pr->println(F("read root failed")); return; @@ -297,15 +313,15 @@ void ExFatPartition::checkUpcase(print_t* pr) { pr->println(F("upcase not found")); return; } - for (size_t i = 0; i < size/2; i++) { - if ((i%256) == 0) { - upcase = dataCacheGet(sector++, FsCache::CACHE_FOR_READ); + for (size_t i = 0; i < size / 2; i++) { + if ((i % 256) == 0) { + upcase = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!upcase) { pr->println(F("read upcase failed")); return; } } - uint16_t v = getLe16(&upcase[2*(i & 0XFF)]); + uint16_t v = getLe16(&upcase[2 * (i & 0XFF)]); if (skip) { pr->print("skip "); pr->print(u); @@ -318,7 +334,7 @@ void ExFatPartition::checkUpcase(print_t* pr) { for (uint16_t k = 0; k < v; k++) { uint16_t x = toUpcase(u + k); if (x != (u + k)) { - printHex(pr, (uint16_t)(u+k)); + printHex(pr, (uint16_t)(u + k)); pr->write(','); printHex(pr, x); pr->println("<<<<<<<<<<<<<<<<<<<<"); @@ -347,8 +363,8 @@ void ExFatPartition::dmpBitmap(print_t* pr) { dmpSector(pr, m_clusterHeapStartSector); } //------------------------------------------------------------------------------ -void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, - uint32_t offset, uint32_t count) { +void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, uint32_t offset, + uint32_t count) { uint32_t sector = clusterStartSector(cluster) + offset; for (uint32_t i = 0; i < count; i++) { pr->print(F("\nSector: ")); @@ -359,17 +375,17 @@ void ExFatPartition::dmpCluster(print_t* pr, uint32_t cluster, //------------------------------------------------------------------------------ void ExFatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { uint32_t sector = m_fatStartSector + start; - uint32_t cluster = 128*start; + uint32_t cluster = 128 * start; pr->println(F("FAT:")); for (uint32_t i = 0; i < count; i++) { - uint8_t* cache = dataCacheGet(sector + i, FsCache::CACHE_FOR_READ); + uint8_t* cache = dataCachePrepare(sector + i, FsCache::CACHE_FOR_READ); if (!cache) { pr->println(F("cache read failed")); return; } uint32_t* fat = reinterpret_cast(cache); for (size_t k = 0; k < 128; k++) { - if (0 == cluster%8) { + if (0 == cluster % 8) { if (k) { pr->println(); } @@ -384,13 +400,13 @@ void ExFatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } //------------------------------------------------------------------------------ void ExFatPartition::dmpSector(print_t* pr, uint32_t sector) { - uint8_t* cache = dataCacheGet(sector, FsCache::CACHE_FOR_READ); + uint8_t* cache = dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { pr->println(F("dmpSector failed")); return; } - for (uint16_t i = 0; i < 512; i++) { - if (i%32 == 0) { + for (uint16_t i = 0; i < m_bytesPerSector; i++) { + if (i % 32 == 0) { if (i) { pr->println(); } @@ -410,27 +426,27 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { uint16_t calcHash = 0; uint16_t nameHash = 0; uint16_t setChecksum = 0; - uint16_t calcChecksum = 0;; - uint8_t nameLength = 0; - uint8_t setCount = 0; - uint8_t nUnicode; + uint16_t calcChecksum = 0; + uint8_t nameLength = 0; + uint8_t setCount = 0; + uint8_t nUnicode; #define RAW_ROOT #ifndef RAW_ROOT while (1) { - uint8_t buf[32]; - if (file->read(buf, 32) != 32) { + uint8_t buf[FS_DIR_SIZE]; + if (file->read(buf, FS_DIR_SIZE) != FS_DIR_SIZE) { break; } dir = reinterpret_cast(buf); -#else // RAW_ROOT +#else // RAW_ROOT (void)file; uint32_t nDir = 1UL << (m_sectorsPerClusterShift + 4); uint32_t sector = clusterStartSector(m_rootDirectoryCluster); for (uint32_t iDir = 0; iDir < nDir; iDir++) { - size_t i = iDir%16; + size_t i = iDir % 16; if (i == 0) { - uint8_t* cache = dataCacheGet(sector++, FsCache::CACHE_FOR_READ); + uint8_t* cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!cache) { return false; } @@ -439,7 +455,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { dir++; } #endif // RAW_ROOT - if (dir->type == 0) { + if (dir->type == EXFAT_TYPE_END_DIR) { break; } pr->println(); @@ -475,16 +491,15 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { calcHash = 0; break; - case EXFAT_TYPE_NAME: + case EXFAT_TYPE_NAME: dirName = reinterpret_cast(dir); printDirName(pr, dirName); calcChecksum = exFatDirChecksum(dir, calcChecksum); nUnicode = nameLength > 15 ? 15 : nameLength; - calcHash = exFatHashName(reinterpret_cast - (dirName->unicode), nUnicode, calcHash); + calcHash = hashDir(dirName, calcHash); nameLength -= nUnicode; setCount--; - if (nameLength == 0 || setCount == 0) { + if (nameLength == 0 || setCount == 0) { pr->print(F("setChecksum: 0x")); pr->print(setChecksum, HEX); if (setChecksum != calcChecksum) { @@ -505,7 +520,7 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { break; default: - if (dir->type & 0x80) { + if (dir->type & EXFAT_TYPE_USED) { pr->print(F("Unknown dirType: 0x")); } else { pr->print(F("Unused dirType: 0x")); @@ -521,10 +536,9 @@ bool ExFatPartition::printDir(print_t* pr, ExFatFile* file) { //------------------------------------------------------------------------------ void ExFatPartition::printFat(print_t* pr) { uint32_t next; - int8_t status; pr->println(F("FAT:")); for (uint32_t cluster = 0; cluster < 16; cluster++) { - status = fatGet(cluster, &next); + int8_t status = fatGet(cluster, &next); pr->print(cluster, HEX); pr->write(' '); if (status == 0) { @@ -541,7 +555,7 @@ void ExFatPartition::printUpcase(print_t* pr) { uint32_t checksum = 0; DirUpcase_t* dir; sector = clusterStartSector(m_rootDirectoryCluster); - upcase = dataCacheGet(sector, FsCache::CACHE_FOR_READ); + upcase = dataCachePrepare(sector, FsCache::CACHE_FOR_READ); dir = reinterpret_cast(upcase); if (!dir) { pr->println(F("read root dir failed")); @@ -558,20 +572,20 @@ void ExFatPartition::printUpcase(print_t* pr) { pr->println(F("upcase not found")); return; } - for (uint16_t i = 0; i < size/2; i++) { - if ((i%256) == 0) { - upcase = dataCacheGet(sector++, FsCache::CACHE_FOR_READ); + for (uint16_t i = 0; i < size / 2; i++) { + if ((i % 256) == 0) { + upcase = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!upcase) { pr->println(F("read upcase failed")); return; } } - if (i%16 == 0) { + if (i % 16 == 0) { pr->println(); printHex(pr, i); } pr->write(' '); - uint16_t uc = getLe16(&upcase[2*(i & 0XFF)]); + uint16_t uc = getLe16(&upcase[2 * (i & 0XFF)]); printHex(pr, uc); checksum = upcaseChecksum(uc, checksum); } @@ -582,7 +596,7 @@ void ExFatPartition::printUpcase(print_t* pr) { } //------------------------------------------------------------------------------ bool ExFatPartition::printVolInfo(print_t* pr) { - uint8_t* cache = dataCacheGet(0, FsCache::CACHE_FOR_READ); + uint8_t* cache = dataCachePrepare(0, FsCache::CACHE_FOR_READ); if (!cache) { pr->println(F("read mbr failed")); return false; @@ -595,7 +609,7 @@ bool ExFatPartition::printVolInfo(print_t* pr) { pr->print(F("bad partition size")); return false; } - cache = dataCacheGet(volStart, FsCache::CACHE_FOR_READ); + cache = dataCachePrepare(volStart, FsCache::CACHE_FOR_READ); if (!cache) { pr->println(F("read pbs failed")); return false; @@ -603,9 +617,4 @@ bool ExFatPartition::printVolInfo(print_t* pr) { printExFatBoot(pr, reinterpret_cast(cache)); return true; } - - -}; // namespace sdfat - - #endif // DOXYGEN_SHOULD_SKIP_THIS diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.cpp index 9b78cbcb..1301d4c0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,14 +24,53 @@ */ #define DBG_FILE "ExFatFile.cpp" #include "../common/DebugMacros.h" -#include "ExFatFile.h" -#include "ExFatVolume.h" -#include "upcase.h" - - -namespace sdfat { - +#include "../common/FsUtf.h" +#include "ExFatLib.h" +//------------------------------------------------------------------------------ +/** test for legal character. + * + * \param[in] c character to be tested. + * + * \return true for legal character else false. + */ +inline bool lfnLegalChar(uint8_t c) { +#if USE_UTF8_LONG_NAMES + return !lfnReservedChar(c); +#else // USE_UTF8_LONG_NAMES + return !(lfnReservedChar(c) || c & 0X80); +#endif // USE_UTF8_LONG_NAMES +} +//------------------------------------------------------------------------------ +bool ExFatFile::attrib(uint8_t bits) { + if (!isFileOrSubDir() || (bits & FS_ATTRIB_USER_SETTABLE) != bits) { + DBG_FAIL_MACRO; + goto fail; + } + // Don't allow read-only to be set if the file is open for write. + if ((bits & FS_ATTRIB_READ_ONLY) && isWritable()) { + DBG_FAIL_MACRO; + goto fail; + } + m_attributes = (m_attributes & ~FS_ATTRIB_USER_SETTABLE) | bits; + // insure sync() will update dir entry + m_flags |= FILE_FLAG_DIR_DIRTY; + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + return true; +fail: + return false; +} +//------------------------------------------------------------------------------ +uint8_t* ExFatFile::dirCache(uint8_t set, uint8_t options) { + DirPos_t pos = m_dirPos; + if (m_vol->dirSeek(&pos, FS_DIR_SIZE * set) != 1) { + return nullptr; + } + return m_vol->dirCache(&pos, options); +} //------------------------------------------------------------------------------ bool ExFatFile::close() { bool rtn = sync(); @@ -48,13 +87,13 @@ bool ExFatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { *bgnSector = firstSector(); } if (endSector) { - *endSector = firstSector() + - ((m_validLength - 1) >> m_vol->bytesPerSectorShift()); + *endSector = + firstSector() + ((m_validLength - 1) >> m_vol->bytesPerSectorShift()); } return true; } //------------------------------------------------------------------------------ -void ExFatFile::fgetpos(fspos_t* pos) { +void ExFatFile::fgetpos(fspos_t* pos) const { pos->position = m_curPosition; pos->cluster = m_curCluster; } @@ -87,7 +126,7 @@ int ExFatFile::fgets(char* str, int num, char* delim) { return n; } //------------------------------------------------------------------------------ -uint32_t ExFatFile::firstSector() { +uint32_t ExFatFile::firstSector() const { return m_firstCluster ? m_vol->clusterStartSector(m_firstCluster) : 0; } //------------------------------------------------------------------------------ @@ -97,8 +136,8 @@ void ExFatFile::fsetpos(const fspos_t* pos) { } //------------------------------------------------------------------------------ bool ExFatFile::getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -107,13 +146,13 @@ bool ExFatFile::getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->accessTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -122,13 +161,13 @@ bool ExFatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->createTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { - DirFile_t* df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); + DirFile_t* df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_READ)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -137,55 +176,21 @@ bool ExFatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(df->modifyTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -size_t ExFatFile::getName(ExChar_t* name, size_t length) { - DirName_t* dn; - DirPos_t pos = m_dirPos; - size_t n = 0; - if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; - } - for (uint8_t is = 1; is < m_setCount; is++) { - if (m_vol->dirSeek(&pos, is == 1 ? 64: 32) != 1) { - DBG_FAIL_MACRO; - goto fail; - } - dn = reinterpret_cast - (m_vol->dirCache(&pos, FsCache::CACHE_FOR_READ)); - if (!dn || dn->type != EXFAT_TYPE_NAME) { - DBG_FAIL_MACRO; - goto fail; - } - for (uint8_t in = 0; in < 15; in++) { - if ((n + 1) >= length) { - goto done; - } - uint16_t c = getLe16(dn->unicode + 2*in); - name[n++] = sizeof(ExChar_t) > 1 || c < 0X7F ? c : '?'; - } - } - done: - name[n] = 0; - return n; - - fail: - *name = 0; - return 0; -} +bool ExFatFile::isBusy() { return m_vol->isBusy(); } //------------------------------------------------------------------------------ -bool ExFatFile::open(const ExChar_t* path, int oflag) { +bool ExFatFile::open(const char* path, oflag_t oflag) { return open(ExFatVolume::cwv(), path, oflag); } //------------------------------------------------------------------------------ -bool ExFatFile::open(ExFatVolume* vol, const ExChar_t* path, int oflag) { +bool ExFatFile::open(ExFatVolume* vol, const char* path, oflag_t oflag) { return vol && open(vol->vwd(), path, oflag); } //------------------------------------------------------------------------------ -bool ExFatFile::open(ExFatFile* dirFile, const ExChar_t* path, oflag_t oflag) { +bool ExFatFile::open(ExFatFile* dirFile, const char* path, oflag_t oflag) { ExFatFile tmpDir; ExName_t fname; // error if already open @@ -214,22 +219,28 @@ bool ExFatFile::open(ExFatFile* dirFile, const ExChar_t* path, oflag_t oflag) { if (*path == 0) { break; } - if (!open(dirFile, &fname, O_RDONLY)) { - DBG_FAIL_MACRO; + if (!openPrivate(dirFile, &fname, O_RDONLY)) { + DBG_WARN_MACRO; goto fail; } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); dirFile = &tmpDir; close(); } - return open(dirFile, &fname, oflag); + return openPrivate(dirFile, &fname, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ +bool ExFatFile::open(uint32_t index, oflag_t oflag) { + ExFatVolume* vol = ExFatVolume::cwv(); + return vol ? open(vol->vwd(), index, oflag) : false; +} +//------------------------------------------------------------------------------ bool ExFatFile::open(ExFatFile* dirFile, uint32_t index, oflag_t oflag) { - if (dirFile->seekSet(32*index) && openNext(dirFile, oflag)) { + if (dirFile->seekSet(FS_DIR_SIZE * index) && openNext(dirFile, oflag)) { if (dirIndex() == index) { return true; } @@ -239,41 +250,50 @@ bool ExFatFile::open(ExFatFile* dirFile, uint32_t index, oflag_t oflag) { return false; } //------------------------------------------------------------------------------ +bool ExFatFile::openCwd() { + if (isOpen() || !ExFatVolume::cwv()) { + DBG_FAIL_MACRO; + goto fail; + } + // *this = *ExFatVolume::cwv()->vwd(); + this->copy(ExFatVolume::cwv()->vwd()); + rewind(); + return true; + +fail: + return false; +} +//------------------------------------------------------------------------------ bool ExFatFile::openNext(ExFatFile* dir, oflag_t oflag) { if (isOpen() || !dir->isDir() || (dir->curPosition() & 0X1F)) { DBG_FAIL_MACRO; goto fail; } - return openRootFile(dir, nullptr, 0, oflag); + return openPrivate(dir, nullptr, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, - uint8_t nameLength, oflag_t oflag) { +bool ExFatFile::openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag) { int n; - uint8_t nameOffset = 0; - uint8_t nCmp; uint8_t modeFlags; - uint16_t nameHash = 0; - uint32_t curCluster __attribute__((unused)); uint8_t* cache __attribute__((unused)); DirPos_t freePos __attribute__((unused)); - - DirFile_t* dirFile; + DirFile_t* dirFile; DirStream_t* dirStream; - DirName_t* dirName; - uint8_t buf[32]; + DirName_t* dirName; + uint8_t buf[FS_DIR_SIZE]; uint8_t freeCount = 0; - uint8_t freeNeed; + uint8_t freeNeed = 3; bool inSet = false; - // error if already open + // error if already open, no access mode, or no directory. if (isOpen() || !dir->isDir()) { DBG_FAIL_MACRO; goto fail; } + switch (oflag & O_ACCMODE) { case O_RDONLY: modeFlags = FILE_FLAG_READ; @@ -289,32 +309,39 @@ bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, goto fail; } modeFlags |= oflag & O_APPEND ? FILE_FLAG_APPEND : 0; - if (name) { - nameHash = exFatHashName(name, nameLength, 0); + + if (fname) { + freeNeed = 2 + (fname->nameLength + 14) / 15; dir->rewind(); } - freeNeed = 2 + (nameLength + 14)/15; while (1) { - n = dir->read(buf, 32); + n = dir->read(buf, FS_DIR_SIZE); if (n == 0) { goto create; } - if (n != 32) { + if (n != FS_DIR_SIZE) { DBG_FAIL_MACRO; goto fail; } - if (!(buf[0] & 0x80)) { + if (!(buf[0] & EXFAT_TYPE_USED)) { + // Unused entry. if (freeCount == 0) { - freePos.position = dir->curPosition() - 32; + freePos.position = dir->curPosition() - FS_DIR_SIZE; freePos.cluster = dir->curCluster(); } if (freeCount < freeNeed) { freeCount++; } - if (!buf[0]) { - goto create; + if (buf[0] == EXFAT_TYPE_END_DIR) { + if (fname) { + goto create; + } + // Likely openNext call. + DBG_WARN_MACRO; + goto fail; } + inSet = false; } else if (!inSet) { if (freeCount < freeNeed) { freeCount = 0; @@ -323,66 +350,49 @@ bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, continue; } inSet = true; - } - switch (buf[0]) { - case EXFAT_TYPE_FILE: - memset(this, 0, sizeof(ExFatFile)); - dirFile = reinterpret_cast(buf); - m_setCount = dirFile->setCount; - m_attributes = getLe16(dirFile->attributes) & FILE_ATTR_COPY; - if (!(m_attributes & EXFAT_ATTRIB_DIRECTORY)) { - m_attributes |= FILE_ATTR_FILE; - } - m_vol = dir->volume(); - - m_dirPos.cluster = dir->curCluster(); - m_dirPos.position = dir->curPosition() - 32; - m_dirPos.isContiguous = dir->isContiguous(); - break; - - case EXFAT_TYPE_STREAM: - dirStream = reinterpret_cast(buf); - m_flags = modeFlags; - if (dirStream->flags & EXFAT_FLAG_CONTIGUOUS) { - m_flags |= FILE_FLAG_CONTIGUOUS; - } - nameOffset = 0; - m_validLength = getLe64(dirStream->validLength); - m_firstCluster = getLe32(dirStream->firstCluster); - m_dataLength = getLe64(dirStream->dataLength); - if (!name) { - goto found; - } - if (nameLength != dirStream->nameLength || - nameHash != getLe16(dirStream->nameHash)) { - inSet = false; - break; - } - break; - - case EXFAT_TYPE_NAME: - dirName = reinterpret_cast(buf); - nCmp = nameLength - nameOffset; - if (nCmp > 15) { - nCmp = 15; - } - if (!exFatCmpName(dirName, name, nameOffset, nCmp)) { - inSet = false; - break; - } - nameOffset += nCmp; - - if (nameOffset == nameLength) { - goto found; - } - break; - - default: - break; + memset(this, 0, sizeof(ExFatFile)); + dirFile = reinterpret_cast(buf); + m_setCount = dirFile->setCount; + m_attributes = getLe16(dirFile->attributes) & FS_ATTRIB_COPY; + if (!(m_attributes & FS_ATTRIB_DIRECTORY)) { + m_attributes |= FILE_ATTR_FILE; + } + m_vol = dir->volume(); + m_dirPos.cluster = dir->curCluster(); + m_dirPos.position = dir->curPosition() - FS_DIR_SIZE; + m_dirPos.isContiguous = dir->isContiguous(); + } else if (buf[0] == EXFAT_TYPE_STREAM) { + dirStream = reinterpret_cast(buf); + m_flags = modeFlags; + if (dirStream->flags & EXFAT_FLAG_CONTIGUOUS) { + m_flags |= FILE_FLAG_CONTIGUOUS; + } + m_validLength = getLe64(dirStream->validLength); + m_firstCluster = getLe32(dirStream->firstCluster); + m_dataLength = getLe64(dirStream->dataLength); + if (!fname) { + goto found; + } + fname->reset(); + if (fname->nameLength != dirStream->nameLength || + fname->nameHash != getLe16(dirStream->nameHash)) { + inSet = false; + } + } else if (buf[0] == EXFAT_TYPE_NAME) { + dirName = reinterpret_cast(buf); + if (!cmpName(dirName, fname)) { + inSet = false; + continue; + } + if (fname->atEnd()) { + goto found; + } + } else { + inSet = false; } } - found: +found: // Don't open if create only. if (oflag & O_EXCL) { DBG_FAIL_MACRO; @@ -390,13 +400,13 @@ bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, } // Write, truncate, or at end is an error for a directory or read-only file. if ((oflag & (O_TRUNC | O_AT_END)) || (m_flags & FILE_FLAG_WRITE)) { - if (isSubDir() || isReadOnly() || READ_ONLY) { + if (isSubDir() || isReadOnly() || EXFAT_READ_ONLY) { DBG_FAIL_MACRO; goto fail; } } -#if !READ_ONLY +#if !EXFAT_READ_ONLY if (oflag & O_TRUNC) { if (!(m_flags & FILE_FLAG_WRITE)) { DBG_FAIL_MACRO; @@ -410,59 +420,56 @@ bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, DBG_FAIL_MACRO; goto fail; } -#endif // READ_ONLY + if (isWritable()) { + m_attributes |= FS_ATTRIB_ARCHIVE; + } +#endif // !EXFAT_READ_ONLY return true; - create: -#if READ_ONLY +create: +#if EXFAT_READ_ONLY DBG_FAIL_MACRO; goto fail; -#else // READ_ONLY +#else // EXFAT_READ_ONLY // don't create unless O_CREAT and write - if (!(oflag & O_CREAT) || !(modeFlags & FILE_FLAG_WRITE) || !name) { - DBG_FAIL_MACRO; + if (!(oflag & O_CREAT) || !(modeFlags & FILE_FLAG_WRITE) || !fname) { + DBG_WARN_MACRO; goto fail; } while (freeCount < freeNeed) { - n = dir->read(buf, 32); + n = dir->read(buf, FS_DIR_SIZE); if (n == 0) { - curCluster = dir->m_curCluster; + uint32_t saveCurCluster = dir->m_curCluster; if (!dir->addDirCluster()) { DBG_FAIL_MACRO; goto fail; } - dir->m_curCluster = curCluster; + dir->m_curCluster = saveCurCluster; continue; } - if (n != 32) { + if (n != FS_DIR_SIZE) { DBG_FAIL_MACRO; goto fail; } if (freeCount == 0) { - freePos.position = dir->curPosition() - 32; + freePos.position = dir->curPosition() - FS_DIR_SIZE; freePos.cluster = dir->curCluster(); } freeCount++; } - freePos.isContiguous = dir->isContiguous(); memset(this, 0, sizeof(ExFatFile)); m_vol = dir->volume(); - m_attributes = FILE_ATTR_FILE; + m_attributes = FILE_ATTR_FILE | FS_ATTRIB_ARCHIVE; m_dirPos = freePos; + fname->reset(); for (uint8_t i = 0; i < freeNeed; i++) { - if (i) { - if (1 != m_vol->dirSeek(&freePos, 32)) { - DBG_FAIL_MACRO; - goto fail; - } - } - cache = m_vol->dirCache(&freePos, FsCache::CACHE_FOR_WRITE); + cache = dirCache(i, FsCache::CACHE_FOR_WRITE); if (!cache || (cache[0] & 0x80)) { DBG_FAIL_MACRO; goto fail; } - memset(cache, 0 , 32); + memset(cache, 0, FS_DIR_SIZE); if (i == 0) { dirFile = reinterpret_cast(cache); dirFile->type = EXFAT_TYPE_FILE; @@ -480,37 +487,35 @@ bool ExFatFile::openRootFile(ExFatFile* dir, const ExChar_t* name, setLe16(dirFile->createDate, FS_DEFAULT_DATE); setLe16(dirFile->modifyDate, FS_DEFAULT_DATE); setLe16(dirFile->accessDate, FS_DEFAULT_DATE); - if (FS_DEFAULT_TIME) { - setLe16(dirFile->createTime, FS_DEFAULT_TIME); - setLe16(dirFile->modifyTime, FS_DEFAULT_TIME); - setLe16(dirFile->accessTime, FS_DEFAULT_TIME); - } + if (FS_DEFAULT_TIME) { + setLe16(dirFile->createTime, FS_DEFAULT_TIME); + setLe16(dirFile->modifyTime, FS_DEFAULT_TIME); + setLe16(dirFile->accessTime, FS_DEFAULT_TIME); + } } } else if (i == 1) { dirStream = reinterpret_cast(cache); dirStream->type = EXFAT_TYPE_STREAM; - dirStream->flags = EXFAT_FLAG_ALWAYS1 | EXFAT_FLAG_CONTIGUOUS; - m_flags = modeFlags | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; - - dirStream->nameLength = nameLength; - setLe16(dirStream->nameHash, nameHash); + dirStream->flags = EXFAT_FLAG_ALWAYS1; + m_flags = modeFlags | FILE_FLAG_DIR_DIRTY; + dirStream->nameLength = fname->nameLength; + setLe16(dirStream->nameHash, fname->nameHash); } else { dirName = reinterpret_cast(cache); dirName->type = EXFAT_TYPE_NAME; - nameOffset = 15*(i - 2); - nCmp = nameLength - nameOffset; - if (nCmp > 15) { - nCmp = 15; - } - for (size_t k = 0; k < nCmp; k++) { - setLe16(dirName->unicode + 2*k, name[k + nameOffset]); + for (size_t k = 0; k < 15; k++) { + if (fname->atEnd()) { + break; + } + uint16_t u = fname->get16(); + setLe16(dirName->unicode + 2 * k, u); } } } return sync(); -#endif // READ_ONLY - fail: +#endif // EXFAT_READ_ONLY +fail: // close file m_attributes = FILE_ATTR_CLOSED; m_flags = 0; @@ -528,57 +533,45 @@ bool ExFatFile::openRoot(ExFatVolume* vol) { m_flags = FILE_FLAG_READ; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::parsePathName(const ExChar_t* path, - ExName_t* fname, const ExChar_t** ptr) { - ExChar_t c; - int end; - int len = 0; - +bool ExFatFile::parsePathName(const char* path, ExName_t* fname, + const char** ptr) { // Skip leading spaces. while (*path == ' ') { path++; } - fname->lfn = path; - - for (len = 0; ; len++) { - c = path[len]; - if (c == 0 || isDirSeparator(c)) { - break; - } + fname->begin = path; + fname->end = path; + while (*path && !isDirSeparator(*path)) { + uint8_t c = *path++; if (!lfnLegalChar(c)) { - return false; + DBG_FAIL_MACRO; + goto fail; + } + if (c != '.' && c != ' ') { + // Need to trim trailing dots spaces. + fname->end = path; } } // Advance to next path component. - for (end = len; path[end] == ' ' || isDirSeparator(path[end]); end++) {} - *ptr = &path[end]; + for (; *path == ' ' || isDirSeparator(*path); path++) { + } + *ptr = path; + return hashName(fname); - // Back over spaces and dots. - while (len) { - c = path[len - 1]; - if (c != '.' && c != ' ') { - break; - } - len--; - } - // Max length of LFN is 255. - if (len > EXFAT_MAX_NAME_LENGTH) { - return false; - } - fname->len = len; - return true; +fail: + return false; } //------------------------------------------------------------------------------ int ExFatFile::peek() { - uint64_t curPosition = m_curPosition; - uint32_t curCluster = m_curCluster; + uint64_t saveCurPosition = m_curPosition; + uint32_t saveCurCluster = m_curCluster; int c = read(); - m_curPosition = curPosition; - m_curCluster = curCluster; + m_curPosition = saveCurPosition; + m_curCluster = saveCurCluster; return c; } //------------------------------------------------------------------------------ @@ -606,8 +599,8 @@ int ExFatFile::read(void* buf, size_t count) { sectorOffset = clusterOffset & m_vol->sectorMask(); if (clusterOffset == 0) { if (m_curPosition == 0) { - m_curCluster = isRoot() - ? m_vol->rootDirectoryCluster() : m_firstCluster; + m_curCluster = + isRoot() ? m_vol->rootDirectoryCluster() : m_firstCluster; } else if (isContiguous()) { m_curCluster++; } else { @@ -628,14 +621,14 @@ int ExFatFile::read(void* buf, size_t count) { } sector = m_vol->clusterStartSector(m_curCluster) + (clusterOffset >> m_vol->bytesPerSectorShift()); - if (sectorOffset != 0 || toRead < m_vol->bytesPerSector() - || sector == m_vol->dataCacheSector()) { + if (sectorOffset != 0 || toRead < m_vol->bytesPerSector() || + sector == m_vol->dataCacheSector()) { n = m_vol->bytesPerSector() - sectorOffset; if (n > toRead) { n = toRead; } // read sector to cache and copy data to caller - cache = m_vol->dataCacheGet(sector, FsCache::CACHE_FOR_READ); + cache = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -643,25 +636,16 @@ int ExFatFile::read(void* buf, size_t count) { uint8_t* src = cache + sectorOffset; memcpy(dst, src, n); #if USE_MULTI_SECTOR_IO - } else if (toRead >= 2*m_vol->bytesPerSector()) { + } else if (toRead >= 2 * m_vol->bytesPerSector()) { uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); // Limit reads to current cluster. - uint32_t maxNs = m_vol->sectorsPerCluster() - - (clusterOffset >> m_vol->bytesPerSectorShift()); + uint32_t maxNs = m_vol->sectorsPerCluster() - + (clusterOffset >> m_vol->bytesPerSectorShift()); if (ns > maxNs) { ns = maxNs; } n = ns << m_vol->bytesPerSectorShift(); - // Check for cache sector in read range. - if (sector <= m_vol->dataCacheSector() - && m_vol->dataCacheSector() < (sector + ns)) { - // Flush cache if cache sector is in the range. - if (!m_vol->dataCacheSync()) { - DBG_FAIL_MACRO; - goto fail; - } - } - if (!m_vol->readSectors(sector, dst, ns)) { + if (!m_vol->cacheSafeRead(sector, dst, ns)) { DBG_FAIL_MACRO; goto fail; } @@ -669,7 +653,7 @@ int ExFatFile::read(void* buf, size_t count) { } else { // read single sector n = m_vol->bytesPerSector(); - if (!m_vol->readSector(sector, dst)) { + if (!m_vol->cacheSafeRead(sector, dst)) { DBG_FAIL_MACRO; goto fail; } @@ -680,12 +664,12 @@ int ExFatFile::read(void* buf, size_t count) { } return count - toRead; - fail: +fail: m_error |= READ_ERROR; return -1; } //------------------------------------------------------------------------------ -bool ExFatFile::remove(const ExChar_t* path) { +bool ExFatFile::remove(const char* path) { ExFatFile file; if (!file.open(this, path, O_WRONLY)) { DBG_FAIL_MACRO; @@ -693,7 +677,7 @@ bool ExFatFile::remove(const ExChar_t* path) { } return file.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -743,14 +727,11 @@ bool ExFatFile::seekSet(uint64_t pos) { } } - done: +done: m_curPosition = pos; return true; - fail: +fail: m_curCluster = tmp; return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.h index 48e7ccd5..93c52510 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,63 +30,28 @@ */ #include #include -#include "ExFatConfig.h" -#include "../common/FsDateTime.h" -#include "../common/FsStructs.h" -#include "../common/FsApiConstants.h" + #include "../common/FmtNumber.h" -#include "ExFatTypes.h" +#include "../common/FsApiConstants.h" +#include "../common/FsDateTime.h" +#include "../common/FsName.h" #include "ExFatPartition.h" - -namespace sdfat { - - class ExFatVolume; - //------------------------------------------------------------------------------ /** Expression for path name separator. */ #define isDirSeparator(c) ((c) == '/') //------------------------------------------------------------------------------ -/** test for legal character. - * - * \param[in] c character to be tested. - * - * \return true for legal character else false. - */ -inline bool lfnLegalChar(ExChar_t c) { - if (c == '/' || c == '\\' || c == '"' || c == '*' || - c == ':' || c == '<' || c == '>' || c == '?' || c == '|') { - return false; - } -#if USE_EXFAT_UNICODE_NAMES - return 0X1F < c; -#else // USE_EXFAT_UNICODE_NAMES - return 0X1F < c && c < 0X7F; -#endif // USE_EXFAT_UNICODE_NAMES -} -//------------------------------------------------------------------------------ /** - * \struct ExName_t + * \class ExName_t * \brief Internal type for file name - do not use in user apps. */ -struct ExName_t { - /** length of Long File Name */ - size_t len; - /** Long File Name start. */ - const ExChar_t* lfn; -}; -//------------------------------------------------------------------------------ -/** - * \struct ExFatPos_t - * \brief Internal type for file position - do not use in user apps. - */ -struct ExFatPos_t { - /** stream position */ - uint64_t position; - /** cluster for position */ - uint32_t cluster; - ExFatPos_t() : position(0), cluster(0) {} +class ExName_t : public FsName { + public: + /** Length of UTF-16 name */ + size_t nameLength; + /** Hash for UTF-16 name */ + uint16_t nameHash; }; //------------------------------------------------------------------------------ /** @@ -96,29 +61,108 @@ struct ExFatPos_t { class ExFatFile { public: /** Create an instance. */ - ExFatFile() : m_attributes(FILE_ATTR_CLOSED), m_error(0), m_flags(0) {} + ExFatFile() {} + /** Create a file object and open it in the current working directory. + * + * \param[in] path A path for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). + */ + ExFatFile(const char* path, oflag_t oflag) { open(path, oflag); } + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const ExFatFile* from) { + if (from != this) { +#if FILE_COPY_CONSTRUCTOR_SELECT + *this = *from; +#else // FILE_COPY_CONSTRUCTOR_SELECT + memcpy(this, from, sizeof(ExFatFile)); +#endif // FILE_COPY_CONSTRUCTOR_SELECT + } + } + /** move from to this. + * \param[in] from Source file. + */ + void move(ExFatFile* from) { + if (from != this) { + copy(from); + from->m_attributes = FILE_ATTR_CLOSED; + } + } + +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC + /** Copy constructor. + * \param[in] from Move from file. + * + */ + ExFatFile(const ExFatFile& from) = default; + /** Copy assignment operator. + * \param[in] from Move from file. + * \return Copied file. + */ + ExFatFile& operator=(const ExFatFile& from) = default; +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + ExFatFile(const ExFatFile& from) = default; + ExFatFile& operator=(const ExFatFile& from) = default; + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + ExFatFile(const ExFatFile& from) = delete; + ExFatFile& operator=(const ExFatFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from Move from file. + */ + ExFatFile(ExFatFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from Move from file. + * \return Moved file. + */ + ExFatFile& operator=(ExFatFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + ExFatFile(ExFatFile&& from) = delete; + ExFatFile& operator=(ExFatFile&& from) = delete; +#endif + + /** Destructor */ #if DESTRUCTOR_CLOSES_FILE ~ExFatFile() { if (isOpen()) { close(); } } +#else // DESTRUCTOR_CLOSES_FILE + ~ExFatFile() = default; #endif // DESTRUCTOR_CLOSES_FILE /** The parenthesis operator. - * - * \return true if a file is open. - */ - operator bool() { - return isOpen(); - } - /** \return The number of bytes available from the current position - * to EOF for normal files. Zero is returned for directory files. + * + * \return true if a file is open. */ - uint64_t available64() { - return isFile() ? fileSize() - curPosition() : 0; - } + operator bool() { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { return isFileOrSubDir() ? m_attributes & FS_ATTRIB_COPY : -1; } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits); /** \return The number of bytes available from the current position * to EOF for normal files. INT_MAX is returned for very large files. * @@ -131,6 +175,14 @@ class ExFatFile { uint64_t n = available64(); return n > INT_MAX ? INT_MAX : n; } + /** \return The number of bytes available from the current position + * to EOF for normal files. Zero is returned for directory files. + */ + uint64_t available64() { return isFile() ? fileSize() - curPosition() : 0; } + /** Clear all error bits. */ + void clearError() { m_error = 0; } + /** Clear writeError. */ + void clearWriteError() { m_error &= ~WRITE_ERROR; } /** Close a file and force cached data and directory information * to be written to the storage device. * @@ -140,40 +192,41 @@ class ExFatFile { /** Check for contiguous file and return its raw sector range. * * \param[out] bgnSector the first sector address for the file. - * \param[out] endSector the last sector address for the file. + * \param[out] endSector the last sector address for the file. * * Parameters may be nullptr. * * \return true for success or false for failure. */ bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const { return m_curCluster; } /** \return The current position for a file or directory. */ - uint64_t curPosition() const {return m_curPosition;} - + uint64_t curPosition() const { return m_curPosition; } /** \return Total data length for file. */ - uint64_t dataLength() {return m_dataLength;} + uint64_t dataLength() const { return m_dataLength; } /** \return Directory entry index. */ - uint32_t dirIndex() {return m_dirPos.position/32;} + uint32_t dirIndex() const { return m_dirPos.position / FS_DIR_SIZE; } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. * * The calling instance must be an open directory file. * - * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory + * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory * dirFile. * * \return true if the file exists else false. */ - bool exists(const ExChar_t* path) { + bool exists(const char* path) { ExFatFile file; return file.open(this, path, O_RDONLY); } /** get position for streams * \param[out] pos struct to receive position */ - void fgetpos(fspos_t* pos); - /** + void fgetpos(fspos_t* pos) const; + /** * Get a string from a file. * * fgets() reads bytes from a file into the array pointed to by \a str, until @@ -196,31 +249,15 @@ class ExFatFile { */ int fgets(char* str, int num, char* delim = nullptr); /** \return The total number of bytes in a file. */ - uint64_t fileSize() {return m_validLength;} + uint64_t fileSize() const { return m_validLength; } /** \return Address of first sector or zero for empty file. */ - uint32_t firstSector(); + uint32_t firstSector() const; /** Set position for streams * \param[in] pos struct with value for new position */ void fsetpos(const fspos_t* pos); /** Arduino name for sync() */ - void flush() {sync();} - /** - * Get a file's name followed by a zero byte. - * - * \param[out] name An array of characters for the file's name. - * \param[in] size The size of the array in characters. - * \return the name length. - */ - size_t getName(ExChar_t* name, size_t size); - /** Clear all error bits. */ - void clearError() { - m_error = 0; - } - /** Clear writeError. */ - void clearWriteError() { - m_error &= ~WRITE_ERROR; - } + void flush() { sync(); } /** Get a file's access date and time. * * \param[out] pdate Packed date for directory entry. @@ -238,9 +275,7 @@ class ExFatFile { */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); /** \return All error bits. */ - uint8_t getError() { - return isOpen() ? m_error : 0XFF; - } + uint8_t getError() const { return isOpen() ? m_error : 0XFF; } /** Get a file's modify date and time. * * \param[out] pdate Packed date for directory entry. @@ -249,30 +284,68 @@ class ExFatFile { * \return true for success or false for failure. */ bool getModifyDateTime(uint16_t* pdate, uint16_t* ptime); - /** \return value of writeError */ - bool getWriteError() { - return isOpen() ? m_error & WRITE_ERROR : true; + /** + * Get a file's name followed by a zero. + * + * \param[out] name An array of characters for the file's name. + * \param[in] size The size of the array in characters. + * \return length for success or zero for failure. + */ + size_t getName(char* name, size_t size) { +#if USE_UTF8_LONG_NAMES + return getName8(name, size); +#else // USE_UTF8_LONG_NAMES + return getName7(name, size); +#endif // USE_UTF8_LONG_NAMES } + /** + * Get a file's ASCII name followed by a zero. + * + * \param[out] name An array of characters for the file's name. + * \param[in] size The size of the array in characters. + * \return the name length. + */ + size_t getName7(char* name, size_t size); + /** + * Get a file's UTF-8 name followed by a zero. + * + * \param[out] name An array of characters for the file's name. + * \param[in] size The size of the array in characters. + * \return the name length. + */ + size_t getName8(char* name, size_t size); + /** \return value of writeError */ + bool getWriteError() const { return isOpen() ? m_error & WRITE_ERROR : true; } + /** + * Check for FsBlockDevice busy. + * + * \return true if busy else false. + */ + bool isBusy(); /** \return True if the file is contiguous. */ - bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} + bool isContiguous() const { return m_flags & FILE_FLAG_CONTIGUOUS; } /** \return True if this is a directory. */ - bool isDir() const {return m_attributes & FILE_ATTR_DIR;} + bool isDir() const { return m_attributes & FILE_ATTR_DIR; } /** \return True if this is a normal file. */ - bool isFile() const {return m_attributes & FILE_ATTR_FILE;} + bool isFile() const { return m_attributes & FILE_ATTR_FILE; } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { return isFile() || isSubDir(); } /** \return True if this is a hidden. */ - bool isHidden() const {return m_attributes & FILE_ATTR_HIDDEN;} + bool isHidden() const { return m_attributes & FS_ATTRIB_HIDDEN; } /** \return true if the file is open. */ - bool isOpen() const {return m_attributes;} + bool isOpen() const { return m_attributes; } /** \return True if file is read-only */ - bool isReadOnly() const {return m_attributes & FILE_ATTR_READ_ONLY;} - /** \return True if this is a subdirectory. */ - bool isSubDir() const {return m_attributes & FILE_ATTR_SUBDIR;} + bool isReadOnly() const { return m_attributes & FS_ATTRIB_READ_ONLY; } /** \return True if this is the root directory. */ - bool isRoot() const {return m_attributes & FILE_ATTR_ROOT;} + bool isRoot() const { return m_attributes & FILE_ATTR_ROOT; } + /** \return True file is readable. */ + bool isReadable() const { return m_flags & FILE_FLAG_READ; } + /** \return True if this is a sub-directory. */ + bool isSubDir() const { return m_attributes & FILE_ATTR_SUBDIR; } + /** \return True if this is a system file. */ + bool isSystem() const { return m_attributes & FS_ATTRIB_SYSTEM; } /** \return True file is writable. */ - bool isReadable() const {return m_flags & FILE_FLAG_READ;} - /** \return True file is writable. */ - bool isWritable() const {return m_flags & FILE_FLAG_WRITE;} + bool isWritable() const { return m_flags & FILE_FLAG_WRITE; } /** List directory contents. * * \param[in] pr Print stream for list. @@ -289,10 +362,10 @@ class ExFatFile { * * LS_SIZE - %Print file size. * - * LS_R - Recursive list of subdirectories. + * LS_R - Recursive list of sub-directories. * * \param[in] indent Amount of space before file name. Used for recursive - * list to indicate subdirectory level. + * list to indicate sub-directory level. * * \return true for success or false for failure. */ @@ -308,7 +381,7 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool mkdir(ExFatFile* parent, const ExChar_t* path, bool pFlag = true); + bool mkdir(ExFatFile* parent, const char* path, bool pFlag = true); /** Open a file or directory by name. * * \param[in] dirFile An open directory containing the file to be opened. @@ -353,7 +426,7 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool open(ExFatFile* dirFile, const ExChar_t* path, oflag_t oflag); + bool open(ExFatFile* dirFile, const char* path, oflag_t oflag = O_RDONLY); /** Open a file in the volume working directory. * * \param[in] vol Volume where the file is located. @@ -365,7 +438,7 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool open(ExFatVolume* vol, const ExChar_t* path, int oflag); + bool open(ExFatVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file by index. * * \param[in] dirFile An open ExFatFile instance for the directory. @@ -374,12 +447,39 @@ class ExFatFile { * opened. The value for \a index is (directory file position)/32. * * \param[in] oflag bitwise-inclusive OR of open flags. - * See see ExFatFile::open(ExFatFile*, const ExChar_t*, uint8_t). + * See see ExFatFile::open(ExFatFile*, const char*, uint8_t). * * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(ExFatFile* dirFile, uint32_t index, oflag_t oflag); + bool open(ExFatFile* dirFile, uint32_t index, oflag_t oflag = O_RDONLY); + /** Open a file by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag bitwise-inclusive OR of open flags. + * See see FatFile::open(FatFile*, const char*, uint8_t). + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ + bool open(uint32_t index, oflag_t oflag = O_RDONLY); + /** Open a file in the current working directory. + * + * \param[in] path A path with a valid name for a file to be opened. + * + * \param[in] oflag bitwise-inclusive OR of open flags. + * See see ExFatFile::open(ExFatFile*, const char*, uint8_t). + * + * \return true for success or false for failure. + */ + bool open(const char* path, oflag_t oflag = O_RDONLY); + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); /** Open the next file or subdirectory in a directory. * * \param[in] dirFile An open instance for the directory @@ -391,16 +491,6 @@ class ExFatFile { * \return true for success or false for failure. */ bool openNext(ExFatFile* dirFile, oflag_t oflag = O_RDONLY); - /** Open a file in the current working directory. - * - * \param[in] path A path with a valid name for a file to be opened. - * - * \param[in] oflag bitwise-inclusive OR of open flags. - * See see ExFatFile::open(ExFatFile*, const char*, uint8_t). - * - * \return true for success or false for failure. - */ - bool open(const ExChar_t* path, int oflag = O_RDONLY); /** Open a volume's root directory. * * \param[in] vol The FAT volume containing the root directory to be opened. @@ -424,6 +514,20 @@ class ExFatFile { * \return true for success or false for failure. */ bool preAllocate(uint64_t length); + /** Print a file's access date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printAccessDateTime(print_t* pr); + /** Print a file's creation date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printCreateDateTime(print_t* pr); /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. @@ -459,7 +563,7 @@ class ExFatFile { template size_t printField(Type value, char term) { char sign = 0; - char buf[3*sizeof(Type) + 3]; + char buf[3 * sizeof(Type) + 3]; char* str = buf + sizeof(buf); if (term) { @@ -487,21 +591,6 @@ class ExFatFile { * \return The number of bytes printed. */ size_t printFileSize(print_t* pr); - /** Print a file's access date and time - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printAccessDateTime(print_t* pr); - /** Print a file's creation date and time - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printCreateDateTime(print_t* pr); - /** Print a file's modify date and time * * \param[in] pr Print stream for output. @@ -510,12 +599,32 @@ class ExFatFile { */ size_t printModifyDateTime(print_t* pr); /** Print a file's name + * + * \param[in] pr Print stream for output. + * + * \return length for success or zero for failure. + */ + size_t printName(print_t* pr) { +#if USE_UTF8_LONG_NAMES + return printName8(pr); +#else // USE_UTF8_LONG_NAMES + return printName7(pr); +#endif // USE_UTF8_LONG_NAMES + } + /** Print a file's ASCII name * * \param[in] pr Print stream for output. * * \return true for success or false for failure. */ - size_t printName(print_t* pr); + size_t printName7(print_t* pr); + /** Print a file's UTF-8 name + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printName8(print_t* pr); /** Read the next byte from a file. * * \return For success read returns the next byte in the file as an int. @@ -562,26 +671,24 @@ class ExFatFile { * * \return true for success or false for failure. */ - bool remove(const ExChar_t* path); - /** Rename a file or subdirectory. + bool remove(const char* path); + /** Rename a file or subdirectory. * * \param[in] newPath New path name for the file/directory. * * \return true for success or false for failure. */ - bool rename(const ExChar_t* newPath); - /** Rename a file or subdirectory. + bool rename(const char* newPath); + /** Rename a file or subdirectory. * * \param[in] dirFile Directory for the new path. * \param[in] newPath New path name for the file/directory. * * \return true for success or false for failure. */ - bool rename(ExFatFile* dirFile, const ExChar_t* newPath); + bool rename(ExFatFile* dirFile, const char* newPath); /** Set the file's current position to zero. */ - void rewind() { - seekSet(0); - } + void rewind() { seekSet(0); } /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the @@ -599,9 +706,7 @@ class ExFatFile { * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int64_t offset) { - return seekSet(m_curPosition + offset); - } + bool seekCur(int64_t offset) { return seekSet(m_curPosition + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. @@ -617,6 +722,8 @@ class ExFatFile { * \return true for success or false for failure. */ bool seekSet(uint64_t pos); + /** \return directory set count */ + uint8_t setCount() const { return m_setCount; } /** The sync() call causes all modified data and directory fields * to be written to the storage device. * @@ -668,32 +775,28 @@ class ExFatFile { * \return true for success or false for failure. */ bool truncate(); - /** Truncate a file to a specified length. The current file position + /** Truncate a file to a specified length. The current file position * will be set to end of file. * * \param[in] length The desired length for the file. * * \return true for success or false for failure. */ - bool truncate(uint64_t length) { - return seekSet(length) && truncate(); - } + bool truncate(uint64_t length) { return seekSet(length) && truncate(); } /** \return The valid number of bytes in a file. */ - uint64_t validLength() {return m_validLength;} + uint64_t validLength() const { return m_validLength; } /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use getWriteError to check for errors. * \return count of characters written for success or -1 for failure. */ - size_t write(const char* str) { - return write(str, strlen(str)); - } + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a single byte. * \param[in] b The byte to be written. * \return +1 for success or zero for failure. */ - size_t write(uint8_t b) {return write(&b, 1);} + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -704,102 +807,87 @@ class ExFatFile { * \param[in] count Number of bytes to write. * * \return For success write() returns the number of bytes written, always - * \a count. + * \a count. If an error occurs, write() returns zero and writeError is set. */ size_t write(const void* buf, size_t count); - //============================================================================ -#if USE_EXFAT_UNICODE_NAMES - // Not Implemented when Unicode is selected. - bool exists(const char* path); - size_t getName(char *name, size_t size); - bool mkdir(ExFatFile* parent, const char* path, bool pFlag = true); - bool open(ExFatVolume* vol, const char* path, int oflag); - bool open(ExFatFile* dir, const char* path, int oflag); - bool open(const char* path, int oflag = O_RDONLY); - bool remove(const char* path); - bool rename(const char* newPath); - bool rename(ExFatFile* dirFile, const char* newPath); -#endif // USE_EXFAT_UNICODE_NAMES +//------------------------------------------------------------------------------ +#if ENABLE_ARDUINO_SERIAL + /** List directory contents. + * + * \param[in] flags The inclusive OR of + * + * LS_DATE - %Print file modification date + * + * LS_SIZE - %Print file size. + * + * LS_R - Recursive list of subdirectories. + * + * \return true for success or false for failure. + */ + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } + /** Print a file's name. + * + * \return length for success or zero for failure. + */ + size_t printName() { return ExFatFile::printName(&Serial); } +#endif // ENABLE_ARDUINO_SERIAL private: /** ExFatVolume allowed access to private members. */ friend class ExFatVolume; bool addCluster(); bool addDirCluster(); - uint8_t setCount() {return m_setCount;} + bool cmpName(const DirName_t* dirName, ExName_t* fname); + uint8_t* dirCache(uint8_t set, uint8_t options); + bool hashName(ExName_t* fname); bool mkdir(ExFatFile* parent, ExName_t* fname); - bool openRootFile(ExFatFile* dir, - const ExChar_t* name, uint8_t nameLength, oflag_t oflag); - bool open(ExFatFile* dirFile, ExName_t* fname, oflag_t oflag) { - return openRootFile(dirFile, fname->lfn, fname->len, oflag); - } - bool parsePathName(const ExChar_t* path, - ExName_t* fname, const ExChar_t** ptr); - uint32_t curCluster() const {return m_curCluster;} - ExFatVolume* volume() const {return m_vol;} + + bool openPrivate(ExFatFile* dir, ExName_t* fname, oflag_t oflag); + bool parsePathName(const char* path, ExName_t* fname, const char** ptr); + ExFatVolume* volume() const { return m_vol; } bool syncDir(); //---------------------------------------------------------------------------- static const uint8_t WRITE_ERROR = 0X1; - static const uint8_t READ_ERROR = 0X2; + static const uint8_t READ_ERROR = 0X2; /** This file has not been opened. */ static const uint8_t FILE_ATTR_CLOSED = 0; - /** File is read-only. */ - static const uint8_t FILE_ATTR_READ_ONLY = EXFAT_ATTRIB_READ_ONLY; - /** File should be hidden in directory listings. */ - static const uint8_t FILE_ATTR_HIDDEN = EXFAT_ATTRIB_HIDDEN; - /** Entry is for a system file. */ - static const uint8_t FILE_ATTR_SYSTEM = EXFAT_ATTRIB_SYSTEM; /** Entry for normal data file */ static const uint8_t FILE_ATTR_FILE = 0X08; /** Entry is for a subdirectory */ - static const uint8_t FILE_ATTR_SUBDIR = EXFAT_ATTRIB_DIRECTORY; - static const uint8_t FILE_ATTR_ARCHIVE = EXFAT_ATTRIB_ARCHIVE; + static const uint8_t FILE_ATTR_SUBDIR = FS_ATTRIB_DIRECTORY; /** Root directory */ static const uint8_t FILE_ATTR_ROOT = 0X40; /** Directory type bits */ static const uint8_t FILE_ATTR_DIR = FILE_ATTR_SUBDIR | FILE_ATTR_ROOT; - /** Attributes to copy from directory entry */ - static const uint8_t FILE_ATTR_COPY = EXFAT_ATTRIB_READ_ONLY | - EXFAT_ATTRIB_HIDDEN | EXFAT_ATTRIB_SYSTEM | - EXFAT_ATTRIB_DIRECTORY | EXFAT_ATTRIB_ARCHIVE; static const uint8_t FILE_FLAG_READ = 0X01; static const uint8_t FILE_FLAG_WRITE = 0X02; static const uint8_t FILE_FLAG_APPEND = 0X08; - static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; + static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80; - - uint64_t m_curPosition; - uint64_t m_dataLength; - uint64_t m_validLength; - uint32_t m_curCluster; - uint32_t m_firstCluster; - ExFatVolume* m_vol; - DirPos_t m_dirPos; - uint8_t m_setCount; - uint8_t m_attributes; - uint8_t m_error; - uint8_t m_flags; + uint64_t m_curPosition; + uint64_t m_dataLength; + uint64_t m_validLength; + uint32_t m_curCluster; + uint32_t m_firstCluster; + ExFatVolume* m_vol; + DirPos_t m_dirPos; + uint8_t m_setCount; + uint8_t m_attributes = FILE_ATTR_CLOSED; + uint8_t m_error = 0; + uint8_t m_flags = 0; }; - -}; // namespace sdfat - - #include "../common/ArduinoFiles.h" - -namespace sdfat { - - /** * \class ExFile * \brief exFAT file with Arduino Stream. */ class ExFile : public StreamFile { public: - /** Opens the next file or folder in a directory. + /** Opens the next file or folder in a directory. * * \param[in] oflag open flags. * \return a FatStream object. @@ -810,9 +898,4 @@ class ExFile : public StreamFile { return tmpFile; } }; - - -}; // namespace sdfat - - #endif // ExFatFile_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFilePrint.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFilePrint.cpp index b76d33ff..38dd0f9e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFilePrint.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFilePrint.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,14 +24,8 @@ */ #define DBG_FILE "ExFatFilePrint.cpp" #include "../common/DebugMacros.h" -#include "ExFatFile.h" -#include "upcase.h" -#include "ExFatVolume.h" - - -namespace sdfat { - - +#include "../common/FsUtf.h" +#include "ExFatLib.h" //------------------------------------------------------------------------------ bool ExFatFile::ls(print_t* pr) { ExFatFile file; @@ -57,7 +51,7 @@ bool ExFatFile::ls(print_t* pr) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -100,7 +94,7 @@ bool ExFatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -125,13 +119,13 @@ size_t ExFatFile::printCreateDateTime(print_t* pr) { size_t ExFatFile::printFileSize(print_t* pr) { uint64_t n = m_validLength; char buf[21]; - char *str = &buf[sizeof(buf) - 1]; - char *bgn = str - 12; + char* str = &buf[sizeof(buf) - 1]; + char* bgn = str - 12; *str = '\0'; do { uint64_t m = n; n /= 10; - *--str = m - 10*n + '0'; + *--str = m - 10 * n + '0'; } while (n); while (str > bgn) { *--str = ' '; @@ -148,42 +142,85 @@ size_t ExFatFile::printModifyDateTime(print_t* pr) { return 0; } //------------------------------------------------------------------------------ -size_t ExFatFile::printName(print_t* pr) { +size_t ExFatFile::printName7(print_t* pr) { DirName_t* dn; - DirPos_t pos = m_dirPos; size_t n = 0; uint8_t in; uint8_t buf[15]; if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; + DBG_FAIL_MACRO; + goto fail; } - for (uint8_t is = 1; is < m_setCount; is++) { - if (m_vol->dirSeek(&pos, is == 1 ? 64: 32) != 1) { - DBG_FAIL_MACRO; - goto fail; - } - dn = reinterpret_cast - (m_vol->dirCache(&pos, FsCache::CACHE_FOR_READ)); + for (uint8_t is = 2; is <= m_setCount; is++) { + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); if (!dn || dn->type != EXFAT_TYPE_NAME) { DBG_FAIL_MACRO; goto fail; } for (in = 0; in < 15; in++) { - uint16_t c = getLe16(dn->unicode + 2*in); + uint16_t c = getLe16(dn->unicode + 2 * in); if (!c) { - break;; + break; } - buf[in] = c < 0X7f ? c : '?'; + buf[in] = c < 0X7F ? c : '?'; n++; } pr->write(buf, in); } return n; - fail: +fail: return 0; } +//------------------------------------------------------------------------------ +size_t ExFatFile::printName8(print_t* pr) { + DirName_t* dn; + uint16_t hs = 0; + uint32_t cp; + size_t n = 0; + uint8_t in; + char buf[5]; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t is = 2; is <= m_setCount; is++) { + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); + if (!dn || dn->type != EXFAT_TYPE_NAME) { + DBG_FAIL_MACRO; + goto fail; + } + for (in = 0; in < 15; in++) { + uint16_t c = getLe16(dn->unicode + 2 * in); + if (hs) { + if (!FsUtf::isLowSurrogate(c)) { + DBG_FAIL_MACRO; + goto fail; + } + cp = FsUtf::u16ToCp(hs, c); + hs = 0; + } else if (!FsUtf::isSurrogate(c)) { + if (c == 0) { + break; + } + cp = c; + } else if (FsUtf::isHighSurrogate(c)) { + hs = c; + continue; + } else { + DBG_FAIL_MACRO; + goto fail; + } + char* str = FsUtf::cpToMb(cp, buf, buf + sizeof(buf)); + if (!str) { + DBG_FAIL_MACRO; + goto fail; + } + n += pr->write(reinterpret_cast(buf), str - buf); + } + } + return n; - -}; // namespace sdfat +fail: + return 0; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFileWrite.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFileWrite.cpp index 73afa7df..91977e0d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFileWrite.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFileWrite.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,18 +24,11 @@ */ #define DBG_FILE "ExFatFileWrite.cpp" #include "../common/DebugMacros.h" -#include "ExFatFile.h" -#include "ExFatVolume.h" -#include "upcase.h" - - -namespace sdfat { - - +#include "ExFatLib.h" //============================================================================== -#if READ_ONLY -bool ExFatFile::mkdir(ExFatFile* parent, const ExChar_t* path, bool pFlag) { - (void) parent; +#if EXFAT_READ_ONLY +bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { + (void)parent; (void)path; (void)pFlag; return false; @@ -44,28 +37,24 @@ bool ExFatFile::preAllocate(uint64_t length) { (void)length; return false; } -bool ExFatFile::rename(const ExChar_t* newPath) { +bool ExFatFile::rename(const char* newPath) { (void)newPath; return false; } -bool ExFatFile::rename(ExFatFile* dirFile, const ExChar_t* newPath) { +bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { (void)dirFile; (void)newPath; return false; } -bool ExFatFile::sync() { - return false; -} -bool ExFatFile::truncate() { - return false; -} +bool ExFatFile::sync() { return false; } +bool ExFatFile::truncate() { return false; } size_t ExFatFile::write(const void* buf, size_t nbyte) { (void)buf; (void)nbyte; return false; } //============================================================================== -#else // READ_ONLY +#else // EXFAT_READ_ONLY //------------------------------------------------------------------------------ static uint16_t exFatDirChecksum(const uint8_t* data, uint16_t checksum) { bool skip = data[0] == EXFAT_TYPE_FILE; @@ -76,7 +65,7 @@ static uint16_t exFatDirChecksum(const uint8_t* data, uint16_t checksum) { } //------------------------------------------------------------------------------ bool ExFatFile::addCluster() { - uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); + uint32_t find = m_vol->bitmapFind(m_curCluster ? m_curCluster + 1 : 0, 1); if (find < 2) { DBG_FAIL_MACRO; goto fail; @@ -116,11 +105,11 @@ bool ExFatFile::addCluster() { } } - done: +done: m_curCluster = find; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -137,31 +126,28 @@ bool ExFatFile::addDirCluster() { DBG_FAIL_MACRO; goto fail; } - cache = m_vol->cacheClear(); - if (!cache) { - DBG_FAIL_MACRO; - goto fail; - } - memset(cache, 0, m_vol->bytesPerSector()); sector = m_vol->clusterStartSector(m_curCluster); for (uint32_t i = 0; i < m_vol->sectorsPerCluster(); i++) { - if (!m_vol->writeSector(sector + i, cache)) { + cache = + m_vol->dataCachePrepare(sector + i, FsCache::CACHE_RESERVE_FOR_WRITE); + if (!cache) { DBG_FAIL_MACRO; goto fail; } + memset(cache, 0, m_vol->bytesPerSector()); } if (!isRoot()) { m_flags |= FILE_FLAG_DIR_DIRTY; - m_dataLength += m_vol->bytesPerCluster(); + m_dataLength += m_vol->bytesPerCluster(); m_validLength += m_vol->bytesPerCluster(); } return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::mkdir(ExFatFile* parent, const ExChar_t* path, bool pFlag) { +bool ExFatFile::mkdir(ExFatFile* parent, const char* path, bool pFlag) { ExName_t fname; ExFatFile tmpDir; @@ -187,19 +173,20 @@ bool ExFatFile::mkdir(ExFatFile* parent, const ExChar_t* path, bool pFlag) { if (!*path) { break; } - if (!open(parent, &fname, O_RDONLY)) { + if (!openPrivate(parent, &fname, O_RDONLY)) { if (!pFlag || !mkdir(parent, &fname)) { DBG_FAIL_MACRO; goto fail; } } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); parent = &tmpDir; close(); } return mkdir(parent, &fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -209,13 +196,12 @@ bool ExFatFile::mkdir(ExFatFile* parent, ExName_t* fname) { goto fail; } // create a normal file - if (!open(parent, fname, O_CREAT | O_EXCL | O_RDWR)) { + if (!openPrivate(parent, fname, O_CREAT | O_EXCL | O_RDWR)) { DBG_FAIL_MACRO; goto fail; } // convert file to directory - - m_attributes = FILE_ATTR_SUBDIR; + m_attributes = FILE_ATTR_SUBDIR | FS_ATTRIB_ARCHIVE; // allocate and zero first cluster if (!addDirCluster()) { @@ -229,7 +215,7 @@ bool ExFatFile::mkdir(ExFatFile* parent, ExName_t* fname) { m_flags = FILE_FLAG_READ | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -259,12 +245,11 @@ bool ExFatFile::preAllocate(uint64_t length) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::remove() { - DirPos_t pos = m_dirPos; uint8_t* cache; if (!isWritable()) { DBG_FAIL_MACRO; @@ -286,12 +271,8 @@ bool ExFatFile::remove() { } } - for (uint8_t i = 0; i <= m_setCount; i++) { - if (i && m_vol->dirSeek(&pos, 32) != 1) { - DBG_FAIL_MACRO; - goto fail; - } - cache = m_vol->dirCache(&pos, FsCache::CACHE_FOR_WRITE); + for (uint8_t is = 0; is <= m_setCount; is++) { + cache = dirCache(is, FsCache::CACHE_FOR_WRITE); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -306,15 +287,15 @@ bool ExFatFile::remove() { // Write entry to device. return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool ExFatFile::rename(const ExChar_t* newPath) { +bool ExFatFile::rename(const char* newPath) { return rename(m_vol->vwd(), newPath); } //------------------------------------------------------------------------------ -bool ExFatFile::rename(ExFatFile* dirFile, const ExChar_t* newPath) { +bool ExFatFile::rename(ExFatFile* dirFile, const char* newPath) { ExFatFile file; ExFatFile oldFile; @@ -332,7 +313,8 @@ bool ExFatFile::rename(ExFatFile* dirFile, const ExChar_t* newPath) { DBG_FAIL_MACRO; goto fail; } - oldFile = *this; + // oldFile = *this; + oldFile.copy(this); m_dirPos = file.m_dirPos; m_setCount = file.m_setCount; m_flags |= FILE_FLAG_DIR_DIRTY; @@ -346,13 +328,13 @@ bool ExFatFile::rename(ExFatFile* dirFile, const ExChar_t* newPath) { oldFile.m_attributes = FILE_ATTR_FILE; return oldFile.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ bool ExFatFile::rmdir() { int n; - uint8_t dir[32]; + uint8_t dir[FS_DIR_SIZE]; // must be open subdirectory if (!isSubDir()) { DBG_FAIL_MACRO; @@ -362,11 +344,11 @@ bool ExFatFile::rmdir() { // make sure directory is empty while (1) { - n = read(dir, 32); + n = read(dir, FS_DIR_SIZE); if (n == 0) { break; } - if (n != 32 || dir[0] & 0X80) { + if (n != FS_DIR_SIZE || dir[0] & 0X80) { DBG_FAIL_MACRO; goto fail; } @@ -379,7 +361,7 @@ bool ExFatFile::rmdir() { m_flags |= FILE_FLAG_WRITE; return remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -398,7 +380,7 @@ bool ExFatFile::sync() { } return true; - fail: +fail: m_error |= WRITE_ERROR; return false; } @@ -408,12 +390,9 @@ bool ExFatFile::syncDir() { DirStream_t* ds; uint8_t* cache; uint16_t checksum = 0; - uint8_t setCount = 0; - DirPos_t pos = m_dirPos; - - for (uint8_t i = 0;; i++) { - cache = m_vol->dirCache(&pos, FsCache::CACHE_FOR_READ); + for (uint8_t is = 0; is <= m_setCount; is++) { + cache = dirCache(is, FsCache::CACHE_FOR_READ); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -421,8 +400,7 @@ bool ExFatFile::syncDir() { switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); - setCount = df->setCount; - setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); + setLe16(df->attributes, m_attributes & FS_ATTRIB_COPY); if (FsDateTime::callback) { uint16_t date, time; uint8_t ms10; @@ -458,14 +436,9 @@ bool ExFatFile::syncDir() { break; } checksum = exFatDirChecksum(cache, checksum); - if (i == setCount) break; - if (m_vol->dirSeek(&pos, 32) != 1) { - DBG_FAIL_MACRO; - goto fail; - } } - df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); + df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -477,32 +450,24 @@ bool ExFatFile::syncDir() { } return true; - fail: +fail: m_error |= WRITE_ERROR; return false; } //------------------------------------------------------------------------------ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, - uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + uint8_t day, uint8_t hour, uint8_t minute, + uint8_t second) { DirFile_t* df; uint8_t* cache; uint16_t checksum = 0; - uint8_t setCount = 0; uint16_t date; uint16_t time; uint8_t ms10; - DirPos_t pos; - if (!isFile() - || year < 1980 - || year > 2107 - || month < 1 - || month > 12 - || day < 1 - || day > 31 - || hour > 23 - || minute > 59 - || second > 59) { + if (!isFileOrSubDir() || year < 1980 || year > 2107 || month < 1 || + month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || + second > 59) { DBG_FAIL_MACRO; goto fail; } @@ -515,10 +480,9 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, date = FS_DATE(year, month, day); time = FS_TIME(hour, minute, second); ms10 = second & 1 ? 100 : 0; - pos = m_dirPos; - for (uint8_t i = 0;; i++) { - cache = m_vol->dirCache(&pos, FsCache::CACHE_FOR_READ); + for (uint8_t is = 0; is <= m_setCount; is++) { + cache = dirCache(is, FsCache::CACHE_FOR_READ); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -526,8 +490,7 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, switch (cache[0]) { case EXFAT_TYPE_FILE: df = reinterpret_cast(cache); - setCount = df->setCount; - setLe16(df->attributes, m_attributes & FILE_ATTR_COPY); + setLe16(df->attributes, m_attributes & FS_ATTRIB_COPY); m_vol->dataCacheDirty(); if (flags & T_ACCESS) { setLe16(df->accessTime, time); @@ -557,14 +520,9 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, break; } checksum = exFatDirChecksum(cache, checksum); - if (i == setCount) break; - if (m_vol->dirSeek(&pos, 32) != 1) { - DBG_FAIL_MACRO; - goto fail; - } } - df = reinterpret_cast - (m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); + df = reinterpret_cast( + m_vol->dirCache(&m_dirPos, FsCache::CACHE_FOR_WRITE)); if (!df) { DBG_FAIL_MACRO; goto fail; @@ -576,7 +534,7 @@ bool ExFatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -588,7 +546,7 @@ bool ExFatFile::truncate() { goto fail; } if (m_firstCluster == 0) { - return true; + return true; } if (isContiguous()) { uint32_t nc = 1 + ((m_dataLength - 1) >> m_vol->bytesPerClusterShift()); @@ -635,7 +593,7 @@ bool ExFatFile::truncate() { m_flags |= FILE_FLAG_DIR_DIRTY; return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -727,7 +685,7 @@ size_t ExFatFile::write(const void* buf, size_t nbyte) { // rewrite part of sector cacheOption = FsCache::CACHE_FOR_WRITE; } - cache = m_vol->dataCacheGet(sector, cacheOption); + cache = m_vol->dataCachePrepare(sector, cacheOption); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -742,34 +700,24 @@ size_t ExFatFile::write(const void* buf, size_t nbyte) { } } #if USE_MULTI_SECTOR_IO - } else if (toWrite >= 2*m_vol->bytesPerSector()) { + } else if (toWrite >= 2 * m_vol->bytesPerSector()) { // use multiple sector write command uint32_t ns = toWrite >> m_vol->bytesPerSectorShift(); // Limit writes to current cluster. - uint32_t maxNs = m_vol->sectorsPerCluster() - - (clusterOffset >> m_vol->bytesPerSectorShift()); + uint32_t maxNs = m_vol->sectorsPerCluster() - + (clusterOffset >> m_vol->bytesPerSectorShift()); if (ns > maxNs) { ns = maxNs; } n = ns << m_vol->bytesPerSectorShift(); - // Check for cache sector in write range. - if (sector <= m_vol->dataCacheSector() - && m_vol->dataCacheSector() < (sector + ns)) { - // Invalidate cache if cache sector is in the range. - m_vol->dataCacheInvalidate(); - } - if (!m_vol->writeSectors(sector, src, ns)) { + if (!m_vol->cacheSafeWrite(sector, src, ns)) { DBG_FAIL_MACRO; goto fail; } #endif // USE_MULTI_SECTOR_IO } else { - // use single sector write command n = m_vol->bytesPerSector(); - if (m_vol->dataCacheSector() == sector) { - m_vol->dataCacheInvalidate(); - } - if (!m_vol->writeSector(sector, src)) { + if (!m_vol->cacheSafeWrite(sector, src)) { DBG_FAIL_MACRO; goto fail; } @@ -792,12 +740,9 @@ size_t ExFatFile::write(const void* buf, size_t nbyte) { } return nbyte; - fail: +fail: // return for write error m_error |= WRITE_ERROR; - return -1; + return 0; } -#endif // READ_ONLY - - -}; // namespace sdfat +#endif // EXFAT_READ_ONLY diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.cpp index 18d982c0..2710dddb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,18 +24,14 @@ */ #define DBG_FILE "ExFatFormatter.cpp" #include "../common/DebugMacros.h" -#include "ExFatFormatter.h" - - -namespace sdfat { - - +#include "../common/upcase.h" +#include "ExFatLib.h" //------------------------------------------------------------------------------ // Formatter assumes 512 byte sectors. const uint32_t BOOT_BACKUP_OFFSET = 12; const uint16_t BYTES_PER_SECTOR = 512; const uint16_t SECTOR_MASK = BYTES_PER_SECTOR - 1; -const uint8_t BYTES_PER_SECTOR_SHIFT = 9; +const uint8_t BYTES_PER_SECTOR_SHIFT = 9; const uint16_t MINIMUM_UPCASE_SKIP = 512; const uint32_t BITMAP_CLUSTER = 2; const uint32_t UPCASE_CLUSTER = 3; @@ -45,14 +41,16 @@ const uint32_t ROOT_CLUSTER = 4; #if !PRINT_FORMAT_PROGRESS #define writeMsg(pr, str) #elif defined(__AVR__) -#define writeMsg(pr, str) if (pr) pr->print(F(str)) +#define writeMsg(pr, str) \ + if (pr) pr->print(F(str)) #else // PRINT_FORMAT_PROGRESS -#define writeMsg(pr, str) if (pr) pr->write(str) +#define writeMsg(pr, str) \ + if (pr) pr->write(str) #endif // PRINT_FORMAT_PROGRESS //------------------------------------------------------------------------------ -bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { +bool ExFatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { #if !PRINT_FORMAT_PROGRESS -(void)pr; + (void)pr; #endif // !PRINT_FORMAT_PROGRESS MbrSector_t* mbr; ExFatPbs_t* pbs; @@ -85,14 +83,15 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { goto fail; } // Determine partition layout. - for (m = 1, vs = 0; m && sectorCount > m; m <<= 1, vs++) {} - sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11)/2; + for (m = 1, vs = 0; m && sectorCount > m; m <<= 1, vs++) { + } + sectorsPerClusterShift = vs < 29 ? 8 : (vs - 11) / 2; sectorsPerCluster = 1UL << sectorsPerClusterShift; - fatLength = 1UL << (vs < 27 ? 13 : (vs + 1)/2); + fatLength = 1UL << (vs < 27 ? 13 : (vs + 1) / 2); fatOffset = fatLength; - partitionOffset = 2*fatLength; - clusterHeapOffset = 2*fatLength; - clusterCount = (sectorCount - 4*fatLength) >> sectorsPerClusterShift; + partitionOffset = 2 * fatLength; + clusterHeapOffset = 2 * fatLength; + clusterCount = (sectorCount - 4 * fatLength) >> sectorsPerClusterShift; volumeLength = clusterHeapOffset + (clusterCount << sectorsPerClusterShift); // make Master Boot Record. Use fake CHS. @@ -156,8 +155,8 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { checksum = exFatChecksum(checksum, secBuf[i]); } sector = partitionOffset; - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -169,8 +168,8 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { checksum = exFatChecksum(checksum, secBuf[i]); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -182,8 +181,8 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i++) { checksum = exFatChecksum(checksum, secBuf[i]); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } @@ -193,24 +192,24 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { for (size_t i = 0; i < BYTES_PER_SECTOR; i += 4) { setLe32(secBuf + i, checksum); } - if (!dev->writeSector(sector, secBuf) || - !dev->writeSector(sector + BOOT_BACKUP_OFFSET , secBuf)) { + if (!dev->writeSector(sector, secBuf) || + !dev->writeSector(sector + BOOT_BACKUP_OFFSET, secBuf)) { DBG_FAIL_MACRO; goto fail; } // Initialize FAT. writeMsg(pr, "Writing FAT "); sector = partitionOffset + fatOffset; - ns = ((clusterCount + 2)*4 + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; + ns = ((clusterCount + 2) * 4 + BYTES_PER_SECTOR - 1) / BYTES_PER_SECTOR; memset(secBuf, 0, BYTES_PER_SECTOR); // Allocate two reserved clusters, bitmap, upcase, and root clusters. secBuf[0] = 0XF8; - for (size_t i = 0; i < 20; i++) { + for (size_t i = 1; i < 20; i++) { secBuf[i] = 0XFF; } for (uint32_t i = 0; i < ns; i++) { - if (i%(ns/32) == 0) { + if (i % (ns / 32) == 0) { writeMsg(pr, "."); } if (!dev->writeSector(sector + i, secBuf)) { @@ -224,8 +223,8 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { writeMsg(pr, "\r\n"); // Write cluster two, bitmap. sector = partitionOffset + clusterHeapOffset; - bitmapSize = (clusterCount + 7)/8; - ns = (bitmapSize + BYTES_PER_SECTOR - 1)/BYTES_PER_SECTOR; + bitmapSize = (clusterCount + 7) / 8; + ns = (bitmapSize + BYTES_PER_SECTOR - 1) / BYTES_PER_SECTOR; if (ns > sectorsPerCluster) { DBG_FAIL_MACRO; goto fail; @@ -248,28 +247,28 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { DBG_FAIL_MACRO; goto fail; } - if (m_upcaseSize > BYTES_PER_SECTOR*sectorsPerCluster) { + if (m_upcaseSize > BYTES_PER_SECTOR * sectorsPerCluster) { DBG_FAIL_MACRO; goto fail; } // Initialize first sector of root. writeMsg(pr, "Writing root\r\n"); ns = sectorsPerCluster; - sector = partitionOffset + clusterHeapOffset + 2*sectorsPerCluster; + sector = partitionOffset + clusterHeapOffset + 2 * sectorsPerCluster; memset(secBuf, 0, BYTES_PER_SECTOR); // Unused Label entry. label = reinterpret_cast(secBuf); label->type = EXFAT_TYPE_LABEL & 0X7F; - // bitmap directory entry. + // bitmap directory entry. dbm = reinterpret_cast(secBuf + 32); dbm->type = EXFAT_TYPE_BITMAP; setLe32(dbm->firstCluster, BITMAP_CLUSTER); setLe64(dbm->size, bitmapSize); // upcase directory entry. - dup = reinterpret_cast(secBuf +64); + dup = reinterpret_cast(secBuf + 64); dup->type = EXFAT_TYPE_UPCASE; setLe32(dup->checksum, m_upcaseChecksum); setLe32(dup->firstCluster, UPCASE_CLUSTER); @@ -288,7 +287,7 @@ bool ExFatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { writeMsg(pr, "Format done\r\n"); return true; - fail: +fail: writeMsg(pr, "Format failed\r\n"); return false; } @@ -338,7 +337,8 @@ bool ExFatFormatter::writeUpcase(uint32_t sector) { } ch++; } else { - for (n = ch + 1; n < 0X10000 && n == toUpcase(n); n++) {} + for (n = ch + 1; n < 0X10000 && n == toUpcase(n); n++) { + } ns = n - ch; if (ns >= MINIMUM_UPCASE_SKIP) { if (!writeUpcaseUnicode(0XFFFF) || !writeUpcaseUnicode(ns)) { @@ -362,9 +362,6 @@ bool ExFatFormatter::writeUpcase(uint32_t sector) { } return true; - fail: +fail: return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.h index f1692589..16ec8908 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,21 +24,15 @@ */ #ifndef ExFatFormatter_h #define ExFatFormatter_h -#include "ExFatConfig.h" -#include "../common/SysCall.h" -#include "../common/BlockDevice.h" -#include "upcase.h" - - -namespace sdfat { - - +#include "../common/FsBlockDevice.h" /** * \class ExFatFormatter * \brief Format an exFAT volume. */ class ExFatFormatter { public: + /** Constructor. */ + ExFatFormatter() = default; /** * Format an exFAT volume. * @@ -48,7 +42,8 @@ class ExFatFormatter { * * \return true for success or false for failure. */ - bool format(BlockDevice* dev, uint8_t* secBuf, print_t* pr = nullptr); + bool format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr = nullptr); + private: bool syncUpcase(); bool writeUpcase(uint32_t sector); @@ -57,12 +52,7 @@ class ExFatFormatter { uint32_t m_upcaseSector; uint32_t m_upcaseChecksum; uint32_t m_upcaseSize; - BlockDevice* m_dev; + FsBlockDevice* m_dev; uint8_t* m_secBuf; }; - - -}; // namespace sdfat - - #endif // ExFatFormatter_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatLib.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatLib.h index a004180a..26f7e708 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatLib.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,7 +24,6 @@ */ #ifndef ExFatLib_h #define ExFatLib_h -#include "ExFatVolume.h" -#include "ExFatFile.h" #include "ExFatFormatter.h" +#include "ExFatVolume.h" #endif // ExFatLib_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatName.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatName.cpp new file mode 100644 index 00000000..70df62d8 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatName.cpp @@ -0,0 +1,189 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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 DBG_FILE "ExFatName.cpp" +#include "../common/DebugMacros.h" +#include "../common/FsUtf.h" +#include "../common/upcase.h" +#include "ExFatLib.h" +//------------------------------------------------------------------------------ +static char toUpper(char c) { return 'a' <= c && c <= 'z' ? c - 'a' + 'A' : c; } +//------------------------------------------------------------------------------ +inline uint16_t exFatHash(char c, uint16_t hash) { + uint8_t u = toUpper(c); + hash = ((hash << 15) | (hash >> 1)) + u; + hash = ((hash << 15) | (hash >> 1)); + return hash; +} +//------------------------------------------------------------------------------ +inline uint16_t exFatHash(uint16_t u, uint16_t hash) { + uint16_t c = toUpcase(u); + hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); + hash = ((hash << 15) | (hash >> 1)) + (c >> 8); + return hash; +} +//------------------------------------------------------------------------------ +bool ExFatFile::cmpName(const DirName_t* dirName, ExName_t* fname) { + for (uint8_t i = 0; i < 15; i++) { + uint16_t u = getLe16(dirName->unicode + 2 * i); + if (fname->atEnd()) { + return u == 0; + } +#if USE_UTF8_LONG_NAMES + uint16_t cp = fname->get16(); + if (toUpcase(cp) != toUpcase(u)) { + return false; + } +#else // USE_UTF8_LONG_NAMES + char c = fname->getch(); + if (u >= 0x7F || toUpper(c) != toUpper(u)) { + return false; + } +#endif // USE_UTF8_LONG_NAMES + } + return true; +} +//------------------------------------------------------------------------------ +size_t ExFatFile::getName7(char* name, size_t count) { + DirName_t* dn; + size_t n = 0; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t is = 2; is <= m_setCount; is++) { + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); + if (!dn || dn->type != EXFAT_TYPE_NAME) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t in = 0; in < 15; in++) { + uint16_t c = getLe16(dn->unicode + 2 * in); + if (c == 0) { + goto done; + } + if ((n + 1) >= count) { + DBG_FAIL_MACRO; + goto fail; + } + name[n++] = c < 0X7F ? c : '?'; + } + } +done: + name[n] = 0; + return n; + +fail: + *name = 0; + return 0; +} +//------------------------------------------------------------------------------ +size_t ExFatFile::getName8(char* name, size_t count) { + char* end = name + count; + char* str = name; + char* ptr; + DirName_t* dn; + uint16_t hs = 0; + uint32_t cp; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t is = 2; is <= m_setCount; is++) { + dn = reinterpret_cast(dirCache(is, FsCache::CACHE_FOR_READ)); + if (!dn || dn->type != EXFAT_TYPE_NAME) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t in = 0; in < 15; in++) { + uint16_t c = getLe16(dn->unicode + 2 * in); + if (hs) { + if (!FsUtf::isLowSurrogate(c)) { + DBG_FAIL_MACRO; + goto fail; + } + cp = FsUtf::u16ToCp(hs, c); + hs = 0; + } else if (!FsUtf::isSurrogate(c)) { + if (c == 0) { + goto done; + } + cp = c; + } else if (FsUtf::isHighSurrogate(c)) { + hs = c; + continue; + } else { + DBG_FAIL_MACRO; + goto fail; + } + // Save space for zero byte. + ptr = FsUtf::cpToMb(cp, str, end - 1); + if (!ptr) { + DBG_FAIL_MACRO; + goto fail; + } + str = ptr; + } + } +done: + *str = '\0'; + return str - name; + +fail: + *name = 0; + return 0; +} +//------------------------------------------------------------------------------ +bool ExFatFile::hashName(ExName_t* fname) { + uint16_t hash = 0; + fname->reset(); +#if USE_UTF8_LONG_NAMES + fname->nameLength = 0; + while (!fname->atEnd()) { + uint16_t u = fname->get16(); + if (u == 0XFFFF) { + DBG_FAIL_MACRO; + goto fail; + } + hash = exFatHash(u, hash); + fname->nameLength++; + } +#else // USE_UTF8_LONG_NAMES + while (!fname->atEnd()) { + // Convert to byte for smaller exFatHash. + char c = fname->getch(); + hash = exFatHash(c, hash); + } + fname->nameLength = fname->end - fname->begin; +#endif // USE_UTF8_LONG_NAMES + fname->nameHash = hash; + if (!fname->nameLength || fname->nameLength > EXFAT_MAX_NAME_LENGTH) { + DBG_FAIL_MACRO; + goto fail; + } + return true; + +fail: + return false; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.cpp index fd128cd2..2d22b11f 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,59 +24,8 @@ */ #define DBG_FILE "ExFatPartition.cpp" #include "../common/DebugMacros.h" -#include "ExFatVolume.h" -#include "../common/FsStructs.h" - - -namespace sdfat { - - +#include "ExFatLib.h" //------------------------------------------------------------------------------ -uint8_t* FsCache::get(uint32_t sector, uint8_t option) { - if (!m_blockDev) { - DBG_FAIL_MACRO; - goto fail; - } - if (m_sector != sector) { - if (!sync()) { - DBG_FAIL_MACRO; - goto fail; - } - if (!(option & CACHE_OPTION_NO_READ)) { - if (!m_blockDev->readSector(sector, m_cacheBuffer)) { - DBG_FAIL_MACRO; - goto fail; - } - } - m_status = 0; - m_sector = sector; - } - m_status |= option & CACHE_STATUS_MASK; - return m_cacheBuffer; - - fail: - return nullptr; -} -//------------------------------------------------------------------------------ -void FsCache::invalidate() { - m_status = 0; - m_sector = 0XFFFFFFFF; -} -//------------------------------------------------------------------------------ -bool FsCache::sync() { - if (m_status & CACHE_STATUS_DIRTY) { - if (!m_blockDev->writeSector(m_sector, m_cacheBuffer)) { - DBG_FAIL_MACRO; - goto fail; - } - m_status &= ~CACHE_STATUS_DIRTY; - } - return true; - - fail: - return false; -} -//============================================================================== // return 0 if error, 1 if no space, else start cluster. uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { uint32_t start = cluster ? cluster - 2 : m_bitmapStart; @@ -90,9 +39,9 @@ uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { uint8_t* cache; uint8_t mask = 1 << (start & 7); while (true) { - uint32_t sector = m_clusterHeapStartSector + - (endAlloc >> (m_bytesPerSectorShift + 3)); - cache = bitmapCacheGet(sector, FsCache::CACHE_FOR_READ); + uint32_t sector = + m_clusterHeapStartSector + (endAlloc >> (m_bytesPerSectorShift + 3)); + cache = bitmapCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { return 0; } @@ -126,8 +75,8 @@ uint32_t ExFatPartition::bitmapFind(uint32_t cluster, uint32_t count) { return 0; } //------------------------------------------------------------------------------ -bool ExFatPartition::bitmapModify(uint32_t cluster, - uint32_t count, bool value) { +bool ExFatPartition::bitmapModify(uint32_t cluster, uint32_t count, + bool value) { uint32_t sector; uint32_t start = cluster - 2; size_t i; @@ -139,7 +88,7 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, goto fail; } if (value) { - if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { + if (start <= m_bitmapStart && m_bitmapStart < (start + count)) { m_bitmapStart = (start + count) < m_clusterCount ? start + count : 0; } } else { @@ -148,11 +97,10 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, } } mask = 1 << (start & 7); - sector = m_clusterHeapStartSector + - (start >> (m_bytesPerSectorShift + 3)); + sector = m_clusterHeapStartSector + (start >> (m_bytesPerSectorShift + 3)); i = (start >> 3) & m_sectorMask; while (true) { - cache = bitmapCacheGet(sector++, FsCache::CACHE_FOR_WRITE); + cache = bitmapCachePrepare(sector++, FsCache::CACHE_FOR_WRITE); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -173,7 +121,7 @@ bool ExFatPartition::bitmapModify(uint32_t cluster, i = 0; } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -181,7 +129,7 @@ uint32_t ExFatPartition::chainSize(uint32_t cluster) { uint32_t n = 0; int8_t status; do { - status = fatGet(cluster, & cluster); + status = fatGet(cluster, &cluster); if (status < 0) return 0; n++; } while (status); @@ -191,7 +139,7 @@ uint32_t ExFatPartition::chainSize(uint32_t cluster) { uint8_t* ExFatPartition::dirCache(DirPos_t* pos, uint8_t options) { uint32_t sector = clusterStartSector(pos->cluster); sector += (m_clusterMask & pos->position) >> m_bytesPerSectorShift; - uint8_t* cache = dataCacheGet(sector, options); + uint8_t* cache = dataCachePrepare(sector, options); return cache ? cache + (pos->position & m_sectorMask) : nullptr; } //------------------------------------------------------------------------------ @@ -214,7 +162,8 @@ int8_t ExFatPartition::dirSeek(DirPos_t* pos, uint32_t offset) { return 1; } //------------------------------------------------------------------------------ -uint8_t ExFatPartition::fatGet(uint32_t cluster, uint32_t* value) { +// return -1 error, 0 EOC, 1 OK +int8_t ExFatPartition::fatGet(uint32_t cluster, uint32_t* value) { uint8_t* cache; uint32_t next; uint32_t sector; @@ -225,12 +174,11 @@ uint8_t ExFatPartition::fatGet(uint32_t cluster, uint32_t* value) { } sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); - cache = dataCacheGet(sector, FsCache::CACHE_FOR_READ); + cache = dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!cache) { return -1; } next = getLe32(cache + ((cluster << 2) & m_sectorMask)); - if (next == EXFAT_EOC) { return 0; } @@ -246,7 +194,7 @@ bool ExFatPartition::fatPut(uint32_t cluster, uint32_t value) { goto fail; } sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); - cache = dataCacheGet(sector, FsCache::CACHE_FOR_WRITE); + cache = dataCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!cache) { DBG_FAIL_MACRO; goto fail; @@ -254,7 +202,7 @@ bool ExFatPartition::fatPut(uint32_t cluster, uint32_t value) { setLe32(cache + ((cluster << 2) & m_sectorMask), value); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -272,7 +220,7 @@ bool ExFatPartition::freeChain(uint32_t cluster) { DBG_FAIL_MACRO; goto fail; } - if ((cluster + 1) != next || status == 0) { + if (status == 0 || (cluster + 1) != next) { if (!bitmapModify(start, cluster - start + 1, 0)) { DBG_FAIL_MACRO; goto fail; @@ -284,26 +232,26 @@ bool ExFatPartition::freeChain(uint32_t cluster) { return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -uint32_t ExFatPartition::freeClusterCount() { +int32_t ExFatPartition::freeClusterCount() { uint32_t nc = 0; uint32_t sector = m_clusterHeapStartSector; uint32_t usedCount = 0; uint8_t* cache; while (true) { - cache = dataCacheGet(sector++, FsCache::CACHE_FOR_READ); + cache = dataCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!cache) { - return 0; + return -1; } for (size_t i = 0; i < m_bytesPerSector; i++) { if (cache[i] == 0XFF) { - usedCount+= 8; + usedCount += 8; } else if (cache[i]) { - for (uint8_t mask = 1; mask ; mask <<=1) { + for (uint8_t mask = 1; mask; mask <<= 1) { if ((mask & cache[i])) { usedCount++; } @@ -317,37 +265,39 @@ uint32_t ExFatPartition::freeClusterCount() { } } //------------------------------------------------------------------------------ -bool ExFatPartition::init(BlockDevice* dev, uint8_t part) { - uint32_t volStart = 0; - uint8_t* cache; +bool ExFatPartition::init(FsBlockDevice* dev, uint8_t part, uint32_t volStart) { pbs_t* pbs; BpbExFat_t* bpb; MbrSector_t* mbr; - MbrPart_t* mp; - m_fatType = 0; m_blockDev = dev; cacheInit(m_blockDev); - cache = dataCacheGet(0, FsCache::CACHE_FOR_READ); - if (part > 4 || !cache) { - DBG_FAIL_MACRO; - goto fail; - } - if (part >= 1) { - mbr = reinterpret_cast(cache); - mp = &mbr->part[part - 1]; - if ((mp->boot != 0 && mp->boot != 0X80) || mp->type == 0) { + // if part == 0 assume super floppy with FAT boot sector in sector zero + // if part > 0 assume mbr volume with partition table + if (part) { + if (part > 4) { + DBG_FAIL_MACRO; + goto fail; + } + mbr = reinterpret_cast( + dataCachePrepare(0, FsCache::CACHE_FOR_READ)); + if (!mbr) { + DBG_FAIL_MACRO; + goto fail; + } + MbrPart_t* mp = mbr->part + part - 1; + if (mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { DBG_FAIL_MACRO; goto fail; } volStart = getLe32(mp->relativeSectors); - cache = dataCacheGet(volStart, FsCache::CACHE_FOR_READ); - if (!cache) { - DBG_FAIL_MACRO; - goto fail; - } } - pbs = reinterpret_cast(cache); + pbs = reinterpret_cast( + dataCachePrepare(volStart, FsCache::CACHE_FOR_READ)); + if (!pbs) { + DBG_FAIL_MACRO; + goto fail; + } if (strncmp(pbs->oemName, "EXFAT", 5)) { DBG_FAIL_MACRO; goto fail; @@ -371,7 +321,7 @@ bool ExFatPartition::init(BlockDevice* dev, uint8_t part) { m_fatType = FAT_TYPE_EXFAT; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -379,6 +329,3 @@ uint32_t ExFatPartition::rootLength() { uint32_t nc = chainSize(m_rootDirectoryCluster); return nc << bytesPerClusterShift(); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.h index 3a6e7bea..b7ecf757 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatPartition.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,92 +28,30 @@ * \file * \brief ExFatPartition include file. */ +#include "../common/FsBlockDevice.h" +#include "../common/FsCache.h" +#include "../common/FsStructs.h" #include "../common/SysCall.h" -#include "../common/BlockDevice.h" -#include "ExFatConfig.h" -#include "ExFatTypes.h" - - -namespace sdfat { - - +/** Set EXFAT_READ_ONLY non-zero for read only */ +#ifndef EXFAT_READ_ONLY +#define EXFAT_READ_ONLY 0 +#endif // EXFAT_READ_ONLY /** Type for exFAT partition */ const uint8_t FAT_TYPE_EXFAT = 64; class ExFatFile; -//============================================================================== +//------------------------------------------------------------------------------ /** - * \class FsCache - * \brief Sector cache. + * \struct DirPos_t + * \brief Internal type for position in directory file. */ -class FsCache { - public: - /** Cached sector is dirty */ - static const uint8_t CACHE_STATUS_DIRTY = 1; - /** Cache sector status bits */ - static const uint8_t CACHE_STATUS_MASK = CACHE_STATUS_DIRTY; - /** Sync existing sector but do not read new sector. */ - static const uint8_t CACHE_OPTION_NO_READ = 2; - /** Cache sector for read. */ - static const uint8_t CACHE_FOR_READ = 0; - /** Cache sector for write. */ - static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY; - /** Reserve cache sector for write - do not read from sector device. */ - static const uint8_t CACHE_RESERVE_FOR_WRITE - = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; - - FsCache() : m_blockDev(nullptr) { - invalidate(); - } - - /** \return Cache sector address. */ - uint8_t* cacheBuffer() { - return m_cacheBuffer; - } - /** \return Clear the cache and returns a pointer to the cache. */ - uint8_t* clear() { - if (isDirty() && !sync()) { - return nullptr; - } - invalidate(); - return m_cacheBuffer; - } - /** Set current sector dirty. */ - void dirty() { - m_status |= CACHE_STATUS_DIRTY; - } - /** Initialize the cache. - * \param[in] blockDev Block device for this partition. - */ - void init(BlockDevice* blockDev) { - m_blockDev = blockDev; - invalidate(); - } - /** Invalidate current cache sector. */ - void invalidate(); - /** \return dirty status */ - bool isDirty() { - return m_status & CACHE_STATUS_DIRTY; - } - /** \return Logical sector number for cached sector. */ - uint32_t sector() { - return m_sector; - } - /** Fill cache with sector data. - * \param[in] sector Sector to read. - * \param[in] option mode for cached sector. - * \return Address of cached sector. */ - uint8_t* get(uint32_t sector, uint8_t option); - /** Write current sector if dirty. - * \return true for success or false for failure. - */ - bool sync(); - - private: - uint8_t m_status; - BlockDevice* m_blockDev; - uint32_t m_sector; - uint8_t m_cacheBuffer[512]; +struct DirPos_t { + /** current cluster */ + uint32_t cluster; + /** offset */ + uint32_t position; + /** directory is contiguous */ + bool isContiguous; }; //============================================================================== /** @@ -122,65 +60,76 @@ class FsCache { */ class ExFatPartition { public: - ExFatPartition() : m_fatType(0) {} + ExFatPartition() = default; /** \return the number of bytes in a cluster. */ - uint32_t bytesPerCluster() const {return m_bytesPerCluster;} + uint32_t bytesPerCluster() const { return m_bytesPerCluster; } /** \return the power of two for bytesPerCluster. */ uint8_t bytesPerClusterShift() const { return m_bytesPerSectorShift + m_sectorsPerClusterShift; } /** \return the number of bytes in a sector. */ - uint16_t bytesPerSector() const {return m_bytesPerSector;} + uint16_t bytesPerSector() const { return m_bytesPerSector; } /** \return the power of two for bytesPerSector. */ - uint8_t bytesPerSectorShift() const {return m_bytesPerSectorShift;} + uint8_t bytesPerSectorShift() const { return m_bytesPerSectorShift; } /** Clear the cache and returns a pointer to the cache. Not for normal apps. * \return A pointer to the cache buffer or zero if an error occurs. */ - uint8_t* cacheClear() { - return m_dataCache.clear(); - } + uint8_t* cacheClear() { return m_dataCache.clear(); } /** \return the cluster count for the partition. */ - uint32_t clusterCount() const {return m_clusterCount;} + uint32_t clusterCount() const { return m_clusterCount; } /** \return the cluster heap start sector. */ - uint32_t clusterHeapStartSector() const {return m_clusterHeapStartSector;} + uint32_t clusterHeapStartSector() const { return m_clusterHeapStartSector; } + /** End access to volume + * \return pointer to sector size buffer for format. + */ + uint8_t* end() { + m_fatType = 0; + return cacheClear(); + } /** \return the FAT length in sectors */ - uint32_t fatLength() const {return m_fatLength;} + uint32_t fatLength() const { return m_fatLength; } /** \return the FAT start sector number. */ - uint32_t fatStartSector() const {return m_fatStartSector;} + uint32_t fatStartSector() const { return m_fatStartSector; } /** \return Type FAT_TYPE_EXFAT for exFAT partition or zero for error. */ - uint8_t fatType() const {return m_fatType;} - /** \return the free cluster count. */ - uint32_t freeClusterCount(); + uint8_t fatType() const { return m_fatType; } + /** \return free cluster count or -1 if an error occurs. */ + int32_t freeClusterCount(); /** Initialize a exFAT partition. * \param[in] dev The blockDevice for the partition. * \param[in] part The partition to be used. Legal values for \a part are * 1-4 to use the corresponding partition on a device formatted with * a MBR, Master Boot Record, or zero if the device is formatted as - * a super floppy with the FAT boot sector in sector zero. + * a super floppy with the FAT boot sector in sector volStart. + * \param[in] volStart location of volume if part is zero. * * \return true for success or false for failure. */ - bool init(BlockDevice* dev, uint8_t part); + bool init(FsBlockDevice* dev, uint8_t part, uint32_t volStart = 0); + /** + * Check for device busy. + * + * \return true if busy else false. + */ + bool isBusy() { return m_blockDev->isBusy(); } /** \return the root directory start cluster number. */ - uint32_t rootDirectoryCluster() const {return m_rootDirectoryCluster;} + uint32_t rootDirectoryCluster() const { return m_rootDirectoryCluster; } /** \return the root directory length. */ uint32_t rootLength(); /** \return the number of sectors in a cluster. */ - uint32_t sectorsPerCluster() const {return 1UL << m_sectorsPerClusterShift;} + uint32_t sectorsPerCluster() const { return 1UL << m_sectorsPerClusterShift; } #ifndef DOXYGEN_SHOULD_SKIP_THIS - // Use sectorsPerCluster(). blocksPerCluster() will be removed in the future. - uint32_t blocksPerCluster() __attribute__ ((deprecated)) {return sectorsPerCluster();} //NOLINT + uint32_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** \return the power of two for sectors per cluster. */ - uint8_t sectorsPerClusterShift() const {return m_sectorsPerClusterShift;} + uint8_t sectorsPerClusterShift() const { return m_sectorsPerClusterShift; } //---------------------------------------------------------------------------- #ifndef DOXYGEN_SHOULD_SKIP_THIS void checkUpcase(print_t* pr); bool printDir(print_t* pr, ExFatFile* file); void dmpBitmap(print_t* pr); - void dmpCluster(print_t* pr, uint32_t cluster, - uint32_t offset, uint32_t count); + void dmpCluster(print_t* pr, uint32_t cluster, uint32_t offset, + uint32_t count); void dmpFat(print_t* pr, uint32_t start, uint32_t count); void dmpSector(print_t* pr, uint32_t sector); bool printVolInfo(print_t* pr); @@ -195,14 +144,14 @@ class ExFatPartition { bool bitmapModify(uint32_t cluster, uint32_t count, bool value); //---------------------------------------------------------------------------- // Cache functions. - uint8_t* bitmapCacheGet(uint32_t sector, uint8_t option) { + uint8_t* bitmapCachePrepare(uint32_t sector, uint8_t option) { #if USE_EXFAT_BITMAP_CACHE - return m_bitmapCache.get(sector, option); -#else // USE_EXFAT_BITMAP_CACHE - return m_dataCache.get(sector, option); + return m_bitmapCache.prepare(sector, option); +#else // USE_EXFAT_BITMAP_CACHE + return m_dataCache.prepare(sector, option); #endif // USE_EXFAT_BITMAP_CACHE } - void cacheInit(BlockDevice* dev) { + void cacheInit(FsBlockDevice* dev) { #if USE_EXFAT_BITMAP_CACHE m_bitmapCache.init(dev); #endif // USE_EXFAT_BITMAP_CACHE @@ -211,32 +160,42 @@ class ExFatPartition { bool cacheSync() { #if USE_EXFAT_BITMAP_CACHE return m_bitmapCache.sync() && m_dataCache.sync() && syncDevice(); -#else // USE_EXFAT_BITMAP_CACHE +#else // USE_EXFAT_BITMAP_CACHE return m_dataCache.sync() && syncDevice(); #endif // USE_EXFAT_BITMAP_CACHE } - void dataCacheDirty() {m_dataCache.dirty();} - void dataCacheInvalidate() {m_dataCache.invalidate();} - uint8_t* dataCacheGet(uint32_t sector, uint8_t option) { - return m_dataCache.get(sector, option); + void dataCacheDirty() { m_dataCache.dirty(); } + void dataCacheInvalidate() { m_dataCache.invalidate(); } + uint8_t* dataCachePrepare(uint32_t sector, uint8_t option) { + return m_dataCache.prepare(sector, option); } - uint32_t dataCacheSector() {return m_dataCache.sector();} - bool dataCacheSync() {return m_dataCache.sync();} + uint32_t dataCacheSector() { return m_dataCache.sector(); } + bool dataCacheSync() { return m_dataCache.sync(); } //---------------------------------------------------------------------------- - uint32_t clusterMask() {return m_clusterMask;} + uint32_t clusterMask() const { return m_clusterMask; } uint32_t clusterStartSector(uint32_t cluster) { return m_clusterHeapStartSector + ((cluster - 2) << m_sectorsPerClusterShift); } uint8_t* dirCache(DirPos_t* pos, uint8_t options); int8_t dirSeek(DirPos_t* pos, uint32_t offset); - uint8_t fatGet(uint32_t cluster, uint32_t* value); + int8_t fatGet(uint32_t cluster, uint32_t* value); bool fatPut(uint32_t cluster, uint32_t value); uint32_t chainSize(uint32_t cluster); bool freeChain(uint32_t cluster); - uint16_t sectorMask() {return m_sectorMask;} - bool syncDevice() { - return m_blockDev->syncDevice(); + uint16_t sectorMask() const { return m_sectorMask; } + bool syncDevice() { return m_blockDev->syncDevice(); } + bool cacheSafeRead(uint32_t sector, uint8_t* dst) { + return m_dataCache.cacheSafeRead(sector, dst); + } + bool cacheSafeWrite(uint32_t sector, const uint8_t* src) { + return m_dataCache.cacheSafeWrite(sector, src); + } + bool cacheSafeRead(uint32_t sector, uint8_t* dst, size_t count) { + return m_dataCache.cacheSafeRead(sector, dst, count); + } + bool cacheSafeWrite(uint32_t sector, const uint8_t* src, size_t count) { + return m_dataCache.cacheSafeWrite(sector, src, count); } bool readSector(uint32_t sector, uint8_t* dst) { return m_blockDev->readSector(sector, dst); @@ -244,23 +203,15 @@ class ExFatPartition { bool writeSector(uint32_t sector, const uint8_t* src) { return m_blockDev->writeSector(sector, src); } -#if USE_MULTI_SECTOR_IO - bool readSectors(uint32_t sector, uint8_t* dst, size_t count) { - return m_blockDev->readSectors(sector, dst, count); - } - bool writeSectors(uint32_t sector, const uint8_t* src, size_t count) { - return m_blockDev->writeSectors(sector, src, count); - } -#endif // USE_MULTI_SECTOR_IO //---------------------------------------------------------------------------- - static const uint8_t m_bytesPerSectorShift = 9; - static const uint16_t m_bytesPerSector = 512; - static const uint16_t m_sectorMask = 0x1FF; + static const uint8_t m_bytesPerSectorShift = 9; + static const uint16_t m_bytesPerSector = 1 << m_bytesPerSectorShift; + static const uint16_t m_sectorMask = m_bytesPerSector - 1; //---------------------------------------------------------------------------- #if USE_EXFAT_BITMAP_CACHE - FsCache m_bitmapCache; + FsCache m_bitmapCache; #endif // USE_EXFAT_BITMAP_CACHE - FsCache m_dataCache; + FsCache m_dataCache; uint32_t m_bitmapStart; uint32_t m_fatStartSector; uint32_t m_fatLength; @@ -269,13 +220,8 @@ class ExFatPartition { uint32_t m_rootDirectoryCluster; uint32_t m_clusterMask; uint32_t m_bytesPerCluster; - BlockDevice* m_blockDev; - uint8_t m_fatType; - uint8_t m_sectorsPerClusterShift; + FsBlockDevice* m_blockDev; + uint8_t m_fatType = 0; + uint8_t m_sectorsPerClusterShift; }; - - -}; // namespace sdfat - - #endif // ExFatPartition_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.cpp index eddc7f70..10e7f9a3 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,28 +22,25 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "ExFatVolume.h" - - -namespace sdfat { - - +#define DBG_FILE "ExFatVolume.cpp" +#include "../common/DebugMacros.h" +#include "ExFatLib.h" ExFatVolume* ExFatVolume::m_cwv = nullptr; //----------------------------------------------------------------------------- -bool ExFatVolume::chdir(const ExChar_t* path) { +bool ExFatVolume::chdir(const char* path) { ExFatFile dir; if (!dir.open(vwd(), path, O_RDONLY)) { + DBG_FAIL_MACRO; goto fail; } if (!dir.isDir()) { + DBG_FAIL_MACRO; goto fail; } - m_vwd = dir; + // m_vwd = dir; + m_vwd.copy(&dir); return true; - fail: +fail: return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.h index 5666f853..335cba6e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,13 +24,7 @@ */ #ifndef ExFatVolume_h #define ExFatVolume_h -#include "ExFatPartition.h" #include "ExFatFile.h" - - -namespace sdfat { - - //============================================================================== /** * \class ExFatVolume @@ -38,23 +32,43 @@ namespace sdfat { */ class ExFatVolume : public ExFatPartition { public: - ExFatVolume() { + ExFatVolume() {} + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + ExFatFile tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib() : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + ExFatFile tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib(bits) : false; } /** * Initialize an FatVolume object. * \param[in] dev Device block driver. * \param[in] setCwv Set current working volume if true. - * \param[in] part partition to initialize. + * \param[in] part Partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(BlockDevice* dev, bool setCwv = true, uint8_t part = 1) { - if (!init(dev, part)) { + bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0) { + if (!init(dev, part, volStart)) { return false; } if (!chdir()) { return false; } - if (setCwv) { + if (setCwv || !m_cwv) { m_cwv = this; } return true; @@ -72,11 +86,10 @@ class ExFatVolume : public ExFatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const ExChar_t* path); - /** \return current working volume. */ - static ExFatVolume* cwv() {return m_cwv;} + bool chdir(const char* path); + /** Change global working volume to this volume. */ - void chvol() {m_cwv = this;} + void chvol() { m_cwv = this; } /** * Test for the existence of a file. @@ -85,11 +98,10 @@ class ExFatVolume : public ExFatPartition { * * \return true if the file exists else false. */ - bool exists(const ExChar_t* path) { + bool exists(const char* path) { ExFatFile tmp; return tmp.open(this, path, O_RDONLY); } - //---------------------------------------------------------------------------- /** List the directory contents of the root directory. * @@ -105,9 +117,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(print_t* pr, uint8_t flags = 0) { - return m_vwd.ls(pr, flags); - } + bool ls(print_t* pr, uint8_t flags = 0) { return m_vwd.ls(pr, flags); } /** List the contents of a directory. * * \param[in] pr Print stream for list. @@ -124,7 +134,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(print_t* pr, const ExChar_t* path, uint8_t flags) { + bool ls(print_t* pr, const char* path, uint8_t flags) { ExFatFile dir; return dir.open(this, path, O_RDONLY) && dir.ls(pr, flags); } @@ -136,7 +146,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool mkdir(const ExChar_t* path, bool pFlag = true) { + bool mkdir(const char* path, bool pFlag = true) { ExFatFile sub; return sub.mkdir(vwd(), path, pFlag); } @@ -146,7 +156,7 @@ class ExFatVolume : public ExFatPartition { * \param[in] oflag open flags. * \return a ExFile object. */ - ExFile open(const ExChar_t* path, oflag_t oflag = O_RDONLY) { + ExFile open(const char* path, oflag_t oflag = O_RDONLY) { ExFile tmpFile; tmpFile.open(this, path, oflag); return tmpFile; @@ -157,7 +167,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool remove(const ExChar_t* path) { + bool remove(const char* path) { ExFatFile tmp; return tmp.open(this, path, O_WRONLY) && tmp.remove(); } @@ -175,7 +185,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool rename(const ExChar_t* oldPath, const ExChar_t* newPath) { + bool rename(const char* oldPath, const char* newPath) { ExFatFile file; return file.open(vwd(), oldPath, O_RDONLY) && file.rename(vwd(), newPath); } @@ -187,7 +197,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool rmdir(const ExChar_t* path) { + bool rmdir(const char* path) { ExFatFile sub; return sub.open(this, path, O_RDONLY) && sub.rmdir(); } @@ -199,7 +209,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool truncate(const ExChar_t* path, uint64_t length) { + bool truncate(const char* path, uint64_t length) { ExFatFile file; if (!file.open(this, path, O_WRONLY)) { return false; @@ -211,10 +221,8 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls() { - return ls(&Serial); - } - /** List the directory contents of the volume root to Serial. + bool ls() { return ls(&Serial); } + /** List the directory contents of the volume root to Serial. * * \param[in] flags The inclusive OR of * @@ -226,9 +234,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -243,7 +249,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool ls(const ExChar_t* path, uint8_t flags = 0) { + bool ls(const char* path, uint8_t flags = 0) { return ls(&Serial, path, flags); } #endif // ENABLE_ARDUINO_SERIAL @@ -253,18 +259,14 @@ class ExFatVolume : public ExFatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } + bool chdir(const String& path) { return chdir(path.c_str()); } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String &path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. @@ -273,7 +275,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool mkdir(const String &path, bool pFlag = true) { + bool mkdir(const String& path, bool pFlag = true) { return mkdir(path.c_str(), pFlag); } /** open a file @@ -282,7 +284,7 @@ class ExFatVolume : public ExFatPartition { * \param[in] oflag open oflag flags. * \return a ExFile object. */ - ExFile open(const String &path, oflag_t oflag = O_RDONLY) { + ExFile open(const String& path, oflag_t oflag = O_RDONLY) { return open(path.c_str(), oflag); } /** Remove a file from the volume root directory. @@ -291,9 +293,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool remove(const String& path) { - return remove(path.c_str()); - } + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -319,9 +319,7 @@ class ExFatVolume : public ExFatPartition { * * \return true for success or false for failure. */ - bool rmdir(const String& path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Truncate a file to a specified length. The current file position * will be at the new EOF. * @@ -334,25 +332,12 @@ class ExFatVolume : public ExFatPartition { return truncate(path.c_str(), length); } #endif // ENABLE_ARDUINO_STRING - //============================================================================ -#if USE_EXFAT_UNICODE_NAMES - // Not implemented when Unicode is selected. - bool exists(const char* path); - bool mkdir(const char* path, bool pFlag = true); - bool remove(const char* path); - bool rename(const char* oldPath, const char* newPath); - bool rmdir(const char* path); -#endif // USE_EXFAT_UNICODE_NAMES private: friend ExFatFile; - ExFatFile* vwd() {return &m_vwd;} - ExFatFile m_vwd; + static ExFatVolume* cwv() { return m_cwv; } + ExFatFile* vwd() { return &m_vwd; } static ExFatVolume* m_cwv; + ExFatFile m_vwd; }; - - -}; // namespace sdfat - - #endif // ExFatVolume_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.cpp deleted file mode 100644 index 2ecc5b5e..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/** - * Copyright (c) 2011-2020 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#include "upcase.h" - -#ifdef __AVR__ -#include -#define TABLE_MEM PROGMEM -#define readTable8(sym) pgm_read_byte(&sym) -#define readTable16(sym) pgm_read_word(&sym) -#else // __AVR__ -#define TABLE_MEM -#define readTable8(sym) (sym) -#define readTable16(sym) (sym) -#endif // __AVR__ - - -namespace sdfat { - - -struct map16 { - uint16_t base; - int8_t off; - uint8_t count; -}; -typedef struct map16 map16_t; - -struct pair16 { - uint16_t key; - uint16_t val; -}; -typedef struct pair16 pair16_t; -//------------------------------------------------------------------------------ -static const map16_t mapTable[] TABLE_MEM = { - {0X0061, -32, 26}, - {0X00E0, -32, 23}, - {0X00F8, -32, 7 }, - {0X0100, 1, 48}, - {0X0132, 1, 6}, - {0X0139, 1, 16}, - {0X014A, 1, 46}, - {0X0179, 1, 6}, - {0X0182, 1, 4}, - {0X01A0, 1, 6}, - {0X01B3, 1, 4}, - {0X01CD, 1, 16}, - {0X01DE, 1, 18}, - {0X01F8, 1, 40}, - {0X0222, 1, 18}, - {0X0246, 1, 10}, - {0X03AD, -37, 3}, - {0X03B1, -32, 17}, - {0X03C3, -32, 9}, - {0X03D8, 1, 24}, - {0X0430, -32, 32}, - {0X0450, -80, 16}, - {0X0460, 1, 34}, - {0X048A, 1, 54}, - {0X04C1, 1, 14}, - {0X04D0, 1, 68}, - {0X0561, -48, 38}, - {0X1E00, 1, 150}, - {0X1EA0, 1, 90}, - {0X1F00, 8, 8}, - {0X1F10, 8, 6}, - {0X1F20, 8, 8}, - {0X1F30, 8, 8}, - {0X1F40, 8, 6}, - {0X1F60, 8, 8}, - {0X1F70, 74, 2}, - {0X1F72, 86, 4}, - {0X1F76, 100, 2}, - {0X1F7A, 112, 2}, - {0X1F7C, 126, 2}, - {0X1F80, 8, 8}, - {0X1F90, 8, 8}, - {0X1FA0, 8, 8}, - {0X1FB0, 8, 2}, - {0X1FD0, 8, 2}, - {0X1FE0, 8, 2}, - {0X2170, -16, 16}, - {0X24D0, -26, 26}, - {0X2C30, -48, 47}, - {0X2C67, 1, 6}, - {0X2C80, 1, 100}, - {0X2D00, 0, 38}, - {0XFF41, -32, 26}, -}; -const size_t MAP_DIM = sizeof(mapTable)/sizeof(map16_t); -//------------------------------------------------------------------------------ -static const pair16_t lookupTable[] TABLE_MEM = { - {0X00FF, 0X0178}, - {0X0180, 0X0243}, - {0X0188, 0X0187}, - {0X018C, 0X018B}, - {0X0192, 0X0191}, - {0X0195, 0X01F6}, - {0X0199, 0X0198}, - {0X019A, 0X023D}, - {0X019E, 0X0220}, - {0X01A8, 0X01A7}, - {0X01AD, 0X01AC}, - {0X01B0, 0X01AF}, - {0X01B9, 0X01B8}, - {0X01BD, 0X01BC}, - {0X01BF, 0X01F7}, - {0X01C6, 0X01C4}, - {0X01C9, 0X01C7}, - {0X01CC, 0X01CA}, - {0X01DD, 0X018E}, - {0X01F3, 0X01F1}, - {0X01F5, 0X01F4}, - {0X023A, 0X2C65}, - {0X023C, 0X023B}, - {0X023E, 0X2C66}, - {0X0242, 0X0241}, - {0X0253, 0X0181}, - {0X0254, 0X0186}, - {0X0256, 0X0189}, - {0X0257, 0X018A}, - {0X0259, 0X018F}, - {0X025B, 0X0190}, - {0X0260, 0X0193}, - {0X0263, 0X0194}, - {0X0268, 0X0197}, - {0X0269, 0X0196}, - {0X026B, 0X2C62}, - {0X026F, 0X019C}, - {0X0272, 0X019D}, - {0X0275, 0X019F}, - {0X027D, 0X2C64}, - {0X0280, 0X01A6}, - {0X0283, 0X01A9}, - {0X0288, 0X01AE}, - {0X0289, 0X0244}, - {0X028A, 0X01B1}, - {0X028B, 0X01B2}, - {0X028C, 0X0245}, - {0X0292, 0X01B7}, - {0X037B, 0X03FD}, - {0X037C, 0X03FE}, - {0X037D, 0X03FF}, - {0X03AC, 0X0386}, - {0X03C2, 0X03A3}, - {0X03CC, 0X038C}, - {0X03CD, 0X038E}, - {0X03CE, 0X038F}, - {0X03F2, 0X03F9}, - {0X03F8, 0X03F7}, - {0X03FB, 0X03FA}, - {0X04CF, 0X04C0}, - {0X1D7D, 0X2C63}, - {0X1F51, 0X1F59}, - {0X1F53, 0X1F5B}, - {0X1F55, 0X1F5D}, - {0X1F57, 0X1F5F}, - {0X1F78, 0X1FF8}, - {0X1F79, 0X1FF9}, - {0X1FB3, 0X1FBC}, - {0X1FCC, 0X1FC3}, - {0X1FE5, 0X1FEC}, - {0X1FFC, 0X1FF3}, - {0X214E, 0X2132}, - {0X2184, 0X2183}, - {0X2C61, 0X2C60}, - {0X2C76, 0X2C75}, -}; -const size_t LOOKUP_DIM = sizeof(lookupTable)/sizeof(pair16_t); -//------------------------------------------------------------------------------ -static size_t searchPair16(const pair16_t* table, size_t size, uint16_t key) { - size_t left = 0; - size_t right = size; - size_t mid; - while (right - left > 1) { - mid = left + (right - left)/2; - if (readTable16(table[mid].key) <= key) { - left = mid; - } else { - right = mid; - } - } - return left; -} -//------------------------------------------------------------------------------ -static char toUpper(char c) { - return c - ('a' <= c && c <= 'z' ? 'a' - 'A' : 0); -} -//------------------------------------------------------------------------------ -bool exFatCmpName(const DirName_t* unicode, - const ExChar16_t* name, size_t offset, size_t n) { - uint16_t u; - for (size_t i = 0; i < n; i++) { - u = getLe16(unicode->unicode + 2*i); - if (toUpcase(name[i + offset]) != toUpcase(u)) { - return false; - } - } - return true; -} -//------------------------------------------------------------------------------ -bool exFatCmpName(const DirName_t* unicode, - const char* name, size_t offset, size_t n) { - uint16_t u; - for (size_t i = 0; i < n; i++) { - u = getLe16(unicode->unicode + 2*i); - if (u >= 0x7F || toUpper(name[i + offset]) != toUpper(u)) { - return false; - } - } - return true; -} -//------------------------------------------------------------------------------ -uint16_t exFatHashName(const ExChar16_t* name, size_t n, uint16_t hash) { - for (size_t i = 0; i < n; i++) { - uint16_t c = toUpcase(name[i]); - hash = ((hash << 15) | (hash >> 1)) + (c & 0XFF); - hash = ((hash << 15) | (hash >> 1)) + (c >> 8); - } - return hash; -} -//------------------------------------------------------------------------------ -uint16_t exFatHashName(const char* name, size_t n, uint16_t hash) { - for (size_t i = 0; i < n; i++) { - uint8_t c = name[i]; - if ('a' <= c && c <= 'z') { - c -= 'a' - 'A'; - } - hash = ((hash << 15) | (hash >> 1)) + c; - hash = ((hash << 15) | (hash >> 1)); - } - return hash; -} -//------------------------------------------------------------------------------ -uint16_t toUpcase(uint16_t chr) { - uint16_t i, first; - // Optimize for simple ASCII. - if (chr < 127) { - return chr - ('a' <= chr && chr <= 'z' ? 'a' - 'A' : 0); - } - i = searchPair16(reinterpret_cast(mapTable), MAP_DIM, chr); - first = readTable16(mapTable[i].base); - if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { - int8_t off = readTable8(mapTable[i].off); - if (off == 1) { - return chr - ((chr - first) & 1); - } - return chr + (off ? off : -0x1C60); - } - i = searchPair16(lookupTable, LOOKUP_DIM, chr); - if (readTable16(lookupTable[i].key) == chr) { - return readTable16(lookupTable[i].val); - } - return chr; -} -//------------------------------------------------------------------------------ -uint32_t upcaseChecksum(uint16_t uc, uint32_t sum) { - sum = (sum << 31) + (sum >> 1) + (uc & 0XFF); - sum = (sum << 31) + (sum >> 1) + (uc >> 8); - return sum; -} - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.h b/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.h deleted file mode 100644 index 78481744..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/upcase.h +++ /dev/null @@ -1,46 +0,0 @@ -/** - * Copyright (c) 2011-2020 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#ifndef upcase_h -#define upcase_h -#include "ExFatFile.h" - - -namespace sdfat { - - -bool exFatCmpName(const DirName_t* unicode, - const char* name, size_t offset, size_t n); -bool exFatCmpName(const DirName_t* unicode, - const ExChar16_t* name, size_t offset, size_t n); -uint16_t exFatHashName(const char* name, size_t n, uint16_t hash); -uint16_t exFatHashName(const ExChar16_t* name, size_t n, uint16_t hash); -uint16_t toUpcase(uint16_t chr); -uint32_t upcaseChecksum(uint16_t unicode, uint32_t checksum); - - -}; // namespace sdfat - - -#endif // upcase_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatDbg.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatDbg.cpp index 32c4145a..47d46f92 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatDbg.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatDbg.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,14 +22,19 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "FatVolume.h" -#include "FatFile.h" +#include "FatLib.h" #ifndef DOXYGEN_SHOULD_SKIP_THIS - - -namespace sdfat { - - +//------------------------------------------------------------------------------ +static uint16_t getLfnChar(DirLfn_t* ldir, uint8_t i) { + if (i < 5) { + return getLe16(ldir->unicode1 + 2 * i); + } else if (i < 11) { + return getLe16(ldir->unicode2 + 2 * (i - 5)); + } else if (i < 13) { + return getLe16(ldir->unicode3 + 2 * (i - 11)); + } + return 0; +} //------------------------------------------------------------------------------ static void printHex(print_t* pr, uint8_t h) { if (h < 16) { @@ -38,10 +43,22 @@ static void printHex(print_t* pr, uint8_t h) { pr->print(h, HEX); } //------------------------------------------------------------------------------ +static void printHex(print_t* pr, uint8_t w, uint16_t h) { + char buf[5]; + char* ptr = buf + sizeof(buf); + *--ptr = 0; + for (uint8_t i = 0; i < w; i++) { + char c = h & 0XF; + *--ptr = c < 10 ? c + '0' : c + 'A' - 10; + h >>= 4; + } + pr->write(ptr); +} +//------------------------------------------------------------------------------ static void printHex(print_t* pr, uint16_t val) { bool space = true; for (uint8_t i = 0; i < 4; i++) { - uint8_t h = (val >> (12 - 4*i)) & 15; + uint8_t h = (val >> (12 - 4 * i)) & 15; if (h || i == 3) { space = false; } @@ -56,7 +73,7 @@ static void printHex(print_t* pr, uint16_t val) { static void printHex(print_t* pr, uint32_t val) { bool space = true; for (uint8_t i = 0; i < 8; i++) { - uint8_t h = (val >> (28 - 4*i)) & 15; + uint8_t h = (val >> (28 - 4 * i)) & 15; if (h || i == 7) { space = false; } @@ -68,38 +85,117 @@ static void printHex(print_t* pr, uint32_t val) { } } //------------------------------------------------------------------------------ -static void printDir(print_t* pr, DirFat_t* dir) { - if (!dir->name[0] || dir->name[0] == FAT_NAME_DELETED) { - pr->println(F("Not Used")); - } else if (isFileOrSubdir(dir)) { - pr->print(F("name: ")); +template +static void printHexLn(print_t* pr, Uint val) { + printHex(pr, val); + pr->println(); +} +//------------------------------------------------------------------------------ +static bool printFatDir(print_t* pr, DirFat_t* dir) { + DirLfn_t* ldir = reinterpret_cast(dir); + if (!dir->name[0]) { + pr->println(F("Unused")); + return false; + } else if (dir->name[0] == FAT_NAME_DELETED) { + pr->println(F("Deleted")); + } else if (isFatFileOrSubdir(dir)) { + pr->print(F("SFN: ")); + for (uint8_t i = 0; i < 11; i++) { + printHex(pr, dir->name[i]); + pr->write(' '); + } + pr->write(' '); pr->write(dir->name, 11); pr->println(); - uint32_t fc = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) - | getLe16(dir->firstClusterLow); + pr->print(F("attributes: 0X")); + printHexLn(pr, dir->attributes); + pr->print(F("caseFlags: 0X")); + printHexLn(pr, dir->caseFlags); + uint32_t fc = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) | + getLe16(dir->firstClusterLow); pr->print(F("firstCluster: ")); pr->println(fc, HEX); pr->print(F("fileSize: ")); pr->println(getLe32(dir->fileSize)); - } else if (isLongName(dir)) { - pr->println(F("LFN")); + } else if (isFatLongName(dir)) { + pr->print(F("LFN: ")); + for (uint8_t i = 0; i < 13; i++) { + uint16_t c = getLfnChar(ldir, i); + if (15 < c && c < 128) { + pr->print(static_cast(c)); + } else { + pr->print("0X"); + pr->print(c, HEX); + } + pr->print(' '); + } + pr->println(); + pr->print(F("order: 0X")); + pr->println(ldir->order, HEX); + pr->print(F("attributes: 0X")); + pr->println(ldir->attributes, HEX); + pr->print(F("checksum: 0X")); + pr->println(ldir->checksum, HEX); } else { pr->println(F("Other")); } + pr->println(); + return true; } //------------------------------------------------------------------------------ -void FatPartition::dmpDirSector(print_t* pr, uint32_t sector) { - DirFat_t dir[16]; - if (!readSector(sector, reinterpret_cast(dir))) { - pr->println(F("dmpDir failed")); +void FatFile::dmpFile(print_t* pr, uint32_t pos, size_t n) { + char text[17]; + text[16] = 0; + if (n >= 0XFFF0) { + n = 0XFFF0; + } + if (!seekSet(pos)) { return; } - for (uint8_t i = 0; i < 16; i++) { - printDir(pr, dir + i); + for (size_t i = 0; i <= n; i++) { + if ((i & 15) == 0) { + if (i) { + pr->write(' '); + pr->write(text); + if (i == n) { + break; + } + } + pr->write('\r'); + pr->write('\n'); + if (i >= n) { + break; + } + printHex(pr, 4, i); + pr->write(' '); + } + int16_t h = read(); + if (h < 0) { + break; + } + pr->write(' '); + printHex(pr, 2, h); + text[i & 15] = ' ' <= h && h < 0X7F ? h : '.'; } + pr->write('\r'); + pr->write('\n'); } //------------------------------------------------------------------------------ -void FatPartition::dmpRootDir(print_t* pr) { +bool FatPartition::dmpDirSector(print_t* pr, uint32_t sector) { + DirFat_t dir[16]; + if (!cacheSafeRead(sector, reinterpret_cast(dir))) { + pr->println(F("dmpDir failed")); + return false; + } + for (uint8_t i = 0; i < 16; i++) { + if (!printFatDir(pr, dir + i)) { + return false; + } + } + return true; +} +//------------------------------------------------------------------------------ +bool FatPartition::dmpRootDir(print_t* pr, uint32_t n) { uint32_t sector; if (fatType() == 16) { sector = rootDirStart(); @@ -107,19 +203,19 @@ void FatPartition::dmpRootDir(print_t* pr) { sector = clusterStartSector(rootDirStart()); } else { pr->println(F("dmpRootDir failed")); - return; + return false; } - dmpDirSector(pr, sector); + return dmpDirSector(pr, sector + n); } //------------------------------------------------------------------------------ void FatPartition::dmpSector(print_t* pr, uint32_t sector, uint8_t bits) { - uint8_t data[512]; - if (!readSector(sector, data)) { + uint8_t data[FatPartition::m_bytesPerSector]; + if (!cacheSafeRead(sector, data)) { pr->println(F("dmpSector failed")); return; } - for (uint16_t i = 0; i < 512;) { - if (i%32 == 0) { + for (uint16_t i = 0; i < m_bytesPerSector;) { + if (i % 32 == 0) { if (i) { pr->println(); } @@ -147,15 +243,15 @@ void FatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } pr->println(F("FAT:")); uint32_t sector = m_fatStartSector + start; - uint32_t cluster = nf*start; + uint32_t cluster = nf * start; for (uint32_t i = 0; i < count; i++) { - cache_t* pc = cacheFetchFat(sector + i, FatCache::CACHE_FOR_READ); + uint8_t* pc = fatCachePrepare(sector + i, FsCache::CACHE_FOR_READ); if (!pc) { pr->println(F("cache read failed")); return; } for (size_t k = 0; k < nf; k++) { - if (0 == cluster%8) { + if (0 == cluster % 8) { if (k) { pr->println(); } @@ -163,13 +259,10 @@ void FatPartition::dmpFat(print_t* pr, uint32_t start, uint32_t count) { } cluster++; pr->write(' '); - uint32_t v = fatType() == 32 ? pc->fat32[k] : pc->fat16[k]; + uint32_t v = fatType() == 32 ? getLe32(pc + 4 * k) : getLe16(pc + 2 * k); printHex(pr, v); } pr->println(); } } - - -}; // namespace sdfat #endif // DOXYGEN_SHOULD_SKIP_THIS diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.cpp index e51e6f34..d23efeed 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,13 +24,7 @@ */ #define DBG_FILE "FatFile.cpp" #include "../common/DebugMacros.h" -#include "FatFile.h" -#include "FatVolume.h" - - -namespace sdfat { - - +#include "FatLib.h" //------------------------------------------------------------------------------ // Add a cluster to a file. bool FatFile::addCluster() { @@ -48,9 +42,9 @@ bool FatFile::addCluster() { m_flags |= FILE_FLAG_DIR_DIRTY; return true; - fail: +fail: return false; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS m_flags |= FILE_FLAG_DIR_DIRTY; return m_vol->allocateCluster(m_curCluster, &m_curCluster); #endif // USE_FAT_FILE_FLAG_CONTIGUOUS @@ -60,14 +54,14 @@ bool FatFile::addCluster() { // Return with first sector of cluster in the cache. bool FatFile::addDirCluster() { uint32_t sector; - cache_t* pc; + uint8_t* pc; if (isRootFixed()) { DBG_FAIL_MACRO; goto fail; } // max folder size - if (m_curPosition >= 512UL*4095) { + if (m_curPosition >= 512UL * 4095) { DBG_FAIL_MACRO; goto fail; } @@ -76,39 +70,57 @@ bool FatFile::addDirCluster() { goto fail; } sector = m_vol->clusterStartSector(m_curCluster); - pc = m_vol->cacheFetchData(sector, FatCache::CACHE_RESERVE_FOR_WRITE); - if (!pc) { - DBG_FAIL_MACRO; - goto fail; - } - memset(pc, 0, m_vol->bytesPerSector()); - // zero rest of clusters - for (uint8_t i = 1; i < m_vol->sectorsPerCluster(); i++) { - if (!m_vol->writeSector(sector + i, pc->data)) { + for (uint8_t i = 0; i < m_vol->sectorsPerCluster(); i++) { + pc = m_vol->dataCachePrepare(sector + i, FsCache::CACHE_RESERVE_FOR_WRITE); + if (!pc) { DBG_FAIL_MACRO; goto fail; } + memset(pc, 0, m_vol->bytesPerSector()); } // Set position to EOF to avoid inconsistent curCluster/curPosition. m_curPosition += m_vol->bytesPerCluster(); return true; - fail: +fail: + return false; +} +//------------------------------------------------------------------------------ +bool FatFile::attrib(uint8_t bits) { + if (!isFileOrSubDir() || (bits & FS_ATTRIB_USER_SETTABLE) != bits) { + DBG_FAIL_MACRO; + goto fail; + } + // Don't allow read-only to be set if the file is open for write. + if ((bits & FS_ATTRIB_READ_ONLY) && isWritable()) { + DBG_FAIL_MACRO; + goto fail; + } + m_attributes = (m_attributes & ~FS_ATTRIB_USER_SETTABLE) | bits; + // insure sync() will update dir entry + m_flags |= FILE_FLAG_DIR_DIRTY; + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + return true; + +fail: return false; } //------------------------------------------------------------------------------ // cache a file's directory entry // return pointer to cached entry or null for failure DirFat_t* FatFile::cacheDirEntry(uint8_t action) { - cache_t* pc; - pc = m_vol->cacheFetchData(m_dirSector, action); - if (!pc) { + uint8_t* pc = m_vol->dataCachePrepare(m_dirSector, action); + DirFat_t* dir = reinterpret_cast(pc); + if (!dir) { DBG_FAIL_MACRO; goto fail; } - return pc->dir + (m_dirIndex & 0XF); + return dir + (m_dirIndex & 0XF); - fail: +fail: return nullptr; } //------------------------------------------------------------------------------ @@ -125,7 +137,7 @@ bool FatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { DBG_FAIL_MACRO; goto fail; } - for (uint32_t c = m_firstCluster; ; c++) { + for (uint32_t c = m_firstCluster;; c++) { uint32_t next; int8_t fg = m_vol->fatGet(c, &next); if (fg < 0) { @@ -146,14 +158,14 @@ bool FatFile::contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { *bgnSector = m_vol->clusterStartSector(m_firstCluster); } if (endSector) { - *endSector = m_vol->clusterStartSector(c) - + m_vol->sectorsPerCluster() - 1; + *endSector = + m_vol->clusterStartSector(c) + m_vol->sectorsPerCluster() - 1; } return true; } } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -166,12 +178,12 @@ bool FatFile::createContiguous(const char* path, uint32_t size) { return true; } close(); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::createContiguous(FatFile* dirFile, - const char* path, uint32_t size) { +bool FatFile::createContiguous(FatFile* dirFile, const char* path, + uint32_t size) { if (!open(dirFile, path, O_CREAT | O_EXCL | O_RDWR)) { DBG_FAIL_MACRO; goto fail; @@ -180,7 +192,7 @@ bool FatFile::createContiguous(FatFile* dirFile, return true; } close(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -192,7 +204,7 @@ bool FatFile::dirEntry(DirFat_t* dst) { goto fail; } // read entry - dir = cacheDirEntry(FatCache::CACHE_FOR_READ); + dir = cacheDirEntry(FsCache::CACHE_FOR_READ); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -201,7 +213,7 @@ bool FatFile::dirEntry(DirFat_t* dst) { memcpy(dst, dir, sizeof(DirFat_t)); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -211,7 +223,7 @@ uint32_t FatFile::dirSize() { return 0; } if (isRootFixed()) { - return 32*m_vol->rootDirEntryCount(); + return FS_DIR_SIZE * m_vol->rootDirEntryCount(); } uint16_t n = 0; uint32_t c = isRoot32() ? m_vol->rootDirStart() : m_firstCluster; @@ -222,7 +234,7 @@ uint32_t FatFile::dirSize() { } n += m_vol->sectorsPerCluster(); } while (fg); - return 512UL*n; + return 512UL * n; } //------------------------------------------------------------------------------ int FatFile::fgets(char* str, int num, char* delim) { @@ -253,7 +265,7 @@ int FatFile::fgets(char* str, int num, char* delim) { return n; } //------------------------------------------------------------------------------ -void FatFile::fgetpos(fspos_t* pos) { +void FatFile::fgetpos(fspos_t* pos) const { pos->position = m_curPosition; pos->cluster = m_curCluster; } @@ -276,7 +288,7 @@ bool FatFile::getAccessDate(uint16_t* pdate) { *pdate = getLe16(dir.accessDate); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -290,7 +302,7 @@ bool FatFile::getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(dir.createTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -304,12 +316,14 @@ bool FatFile::getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { *ptime = getLe16(dir.modifyTime); return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ +bool FatFile::isBusy() { return m_vol->isBusy(); } +//------------------------------------------------------------------------------ bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { - fname_t fname; + FatName_t fname; FatFile tmpDir; if (isOpen() || !parent->isDir()) { @@ -340,21 +354,22 @@ bool FatFile::mkdir(FatFile* parent, const char* path, bool pFlag) { goto fail; } } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); parent = &tmpDir; close(); } return mkdir(parent, &fname); - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::mkdir(FatFile* parent, fname_t* fname) { +bool FatFile::mkdir(FatFile* parent, FatName_t* fname) { uint32_t sector; DirFat_t dot; DirFat_t* dir; - cache_t* pc; + uint8_t* pc; if (!parent->isDir()) { DBG_FAIL_MACRO; @@ -383,13 +398,13 @@ bool FatFile::mkdir(FatFile* parent, fname_t* fname) { goto fail; } // cache entry - should already be in cache due to sync() call - dir = cacheDirEntry(FatCache::CACHE_FOR_WRITE); + dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); if (!dir) { DBG_FAIL_MACRO; goto fail; } - // change directory entry attribute - dir->attributes = FAT_ATTRIB_DIRECTORY; + // change directory entry attribute + dir->attributes = FS_ATTRIB_DIRECTORY; // make entry for '.' memcpy(&dot, dir, sizeof(dot)); @@ -400,23 +415,24 @@ bool FatFile::mkdir(FatFile* parent, fname_t* fname) { // cache sector for '.' and '..' sector = m_vol->clusterStartSector(m_firstCluster); - pc = m_vol->cacheFetchData(sector, FatCache::CACHE_FOR_WRITE); - if (!pc) { + pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_WRITE); + dir = reinterpret_cast(pc); + if (!dir) { DBG_FAIL_MACRO; goto fail; } // copy '.' to sector - memcpy(&pc->dir[0], &dot, sizeof(dot)); + memcpy(&dir[0], &dot, sizeof(dot)); // make entry for '..' dot.name[1] = '.'; setLe16(dot.firstClusterLow, parent->m_firstCluster & 0XFFFF); setLe16(dot.firstClusterHigh, parent->m_firstCluster >> 16); // copy '..' to sector - memcpy(&pc->dir[1], &dot, sizeof(dot)); + memcpy(&dir[1], &dot, sizeof(dot)); // write first sector return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -430,7 +446,7 @@ bool FatFile::open(FatVolume* vol, const char* path, oflag_t oflag) { //------------------------------------------------------------------------------ bool FatFile::open(FatFile* dirFile, const char* path, oflag_t oflag) { FatFile tmpDir; - fname_t fname; + FatName_t fname; // error if already open if (isOpen() || !dirFile->isDir()) { @@ -459,30 +475,32 @@ bool FatFile::open(FatFile* dirFile, const char* path, oflag_t oflag) { break; } if (!open(dirFile, &fname, O_RDONLY)) { - DBG_FAIL_MACRO; + DBG_WARN_MACRO; goto fail; } - tmpDir = *this; + // tmpDir = *this; + tmpDir.copy(this); dirFile = &tmpDir; close(); } return open(dirFile, &fname, oflag); - fail: +fail: return false; } //------------------------------------------------------------------------------ +bool FatFile::open(uint16_t index, oflag_t oflag) { + FatVolume* vol = FatVolume::cwv(); + return vol ? open(vol->vwd(), index, oflag) : false; +} +//------------------------------------------------------------------------------ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { if (index) { // Find start of LFN. DirLfn_t* ldir; uint8_t n = index < 20 ? index : 20; for (uint8_t i = 1; i <= n; i++) { - if (!dirFile->seekSet(32UL*(index - i))) { - DBG_FAIL_MACRO; - goto fail; - } - ldir = reinterpret_cast(dirFile->readDirCache()); + ldir = reinterpret_cast(dirFile->cacheDir(index - i)); if (!ldir) { DBG_FAIL_MACRO; goto fail; @@ -491,7 +509,7 @@ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { break; } if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { - if (!dirFile->seekSet(32UL*(index - i))) { + if (!dirFile->seekSet(32UL * (index - i))) { DBG_FAIL_MACRO; goto fail; } @@ -512,7 +530,7 @@ bool FatFile::open(FatFile* dirFile, uint16_t index, oflag_t oflag) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -529,12 +547,12 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, dir += 0XF & dirIndex; // Must be file or subdirectory. - if (!isFileOrSubdir(dir)) { + if (!isFatFileOrSubdir(dir)) { DBG_FAIL_MACRO; goto fail; } - m_attributes = dir->attributes & FILE_ATTR_COPY; - if (isFileDir(dir)) { + m_attributes = dir->attributes & FS_ATTRIB_COPY; + if (isFatFile(dir)) { m_attributes |= FILE_ATTR_FILE; } m_lfnOrd = lfnOrd; @@ -566,21 +584,21 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, DBG_FAIL_MACRO; goto fail; } + m_attributes |= FS_ATTRIB_ARCHIVE; } m_flags |= (oflag & O_APPEND ? FILE_FLAG_APPEND : 0); m_dirSector = m_vol->cacheSectorNumber(); // copy first cluster number for directory fields - firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) - | getLe16(dir->firstClusterLow); + firstCluster = ((uint32_t)getLe16(dir->firstClusterHigh) << 16) | + getLe16(dir->firstClusterLow); if (oflag & O_TRUNC) { if (firstCluster && !m_vol->freeChain(firstCluster)) { DBG_FAIL_MACRO; goto fail; } - // need to update directory entry m_flags |= FILE_FLAG_DIR_DIRTY; } else { @@ -593,12 +611,38 @@ bool FatFile::openCachedEntry(FatFile* dirFile, uint16_t dirIndex, } return true; - fail: +fail: m_attributes = FILE_ATTR_CLOSED; m_flags = 0; return false; } //------------------------------------------------------------------------------ +bool FatFile::openCluster(FatFile* file) { + if (file->m_dirCluster == 0) { + return openRoot(file->m_vol); + } + memset(this, 0, sizeof(FatFile)); + m_attributes = FILE_ATTR_SUBDIR; + m_flags = FILE_FLAG_READ; + m_vol = file->m_vol; + m_firstCluster = file->m_dirCluster; + return true; +} +//------------------------------------------------------------------------------ +bool FatFile::openCwd() { + if (isOpen() || !FatVolume::cwv()) { + DBG_FAIL_MACRO; + goto fail; + } + // *this = *FatVolume::cwv()->vwd(); + this->copy(FatVolume::cwv()->vwd()); + rewind(); + return true; + +fail: + return false; +} +//------------------------------------------------------------------------------ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { uint8_t checksum = 0; DirLfn_t* ldir; @@ -612,7 +656,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { } while (1) { // read entry into cache - index = dirFile->curPosition()/32; + index = dirFile->curPosition() / FS_DIR_SIZE; DirFat_t* dir = dirFile->readDirCache(); if (!dir) { if (dirFile->getError()) { @@ -627,7 +671,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { // skip empty slot or '.' or '..' if (dir->name[0] == '.' || dir->name[0] == FAT_NAME_DELETED) { lfnOrd = 0; - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (lfnOrd && checksum != lfnChecksum(dir->name)) { DBG_FAIL_MACRO; goto fail; @@ -637,7 +681,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { goto fail; } return true; - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { lfnOrd = ldir->order & 0X1F; @@ -648,7 +692,7 @@ bool FatFile::openNext(FatFile* dirFile, oflag_t oflag) { } } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -663,28 +707,37 @@ bool FatFile::openRoot(FatVolume* vol) { m_vol = vol; switch (vol->fatType()) { #if FAT12_SUPPORT - case 12: + case 12: #endif // FAT12_SUPPORT - case 16: - m_attributes = FILE_ATTR_ROOT_FIXED; - break; + case 16: + m_attributes = FILE_ATTR_ROOT_FIXED; + break; - case 32: - m_attributes = FILE_ATTR_ROOT32; - break; + case 32: + m_attributes = FILE_ATTR_ROOT32; + break; - default: - DBG_FAIL_MACRO; - goto fail; + default: + DBG_FAIL_MACRO; + goto fail; } // read only m_flags = FILE_FLAG_READ; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ +int FatFile::peek() { + uint32_t saveCurPosition = m_curPosition; + uint32_t saveCurCluster = m_curCluster; + int c = read(); + m_curPosition = saveCurPosition; + m_curCluster = saveCurCluster; + return c; +} +//------------------------------------------------------------------------------ bool FatFile::preAllocate(uint32_t length) { uint32_t need; if (!length || !isWritable() || m_firstCluster) { @@ -702,25 +755,16 @@ bool FatFile::preAllocate(uint32_t length) { #if USE_FAT_FILE_FLAG_CONTIGUOUS // Mark contiguous and insure sync() will update dir entry m_flags |= FILE_FLAG_PREALLOCATE | FILE_FLAG_CONTIGUOUS | FILE_FLAG_DIR_DIRTY; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS // insure sync() will update dir entry m_flags |= FILE_FLAG_DIR_DIRTY; #endif // USE_FAT_FILE_FLAG_CONTIGUOUS return sync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ -int FatFile::peek() { - uint32_t curPosition = m_curPosition; - uint32_t curCluster = m_curCluster; - int c = read(); - m_curPosition = curPosition; - m_curCluster = curCluster; - return c; -} -//------------------------------------------------------------------------------ int FatFile::read(void* buf, size_t nbyte) { int8_t fg; uint8_t sectorOfCluster = 0; @@ -728,8 +772,7 @@ int FatFile::read(void* buf, size_t nbyte) { uint16_t offset; size_t toRead; uint32_t sector; // raw device sector number - cache_t* pc; - + uint8_t* pc; // error if not open for read if (!isReadable()) { DBG_FAIL_MACRO; @@ -742,7 +785,8 @@ int FatFile::read(void* buf, size_t nbyte) { nbyte = tmp32; } } else if (isRootFixed()) { - uint16_t tmp16 = 32*m_vol->m_rootDirEntryCount - (uint16_t)m_curPosition; + uint16_t tmp16 = + FS_DIR_SIZE * m_vol->m_rootDirEntryCount - (uint16_t)m_curPosition; if (nbyte > tmp16) { nbyte = tmp16; } @@ -752,8 +796,8 @@ int FatFile::read(void* buf, size_t nbyte) { size_t n; offset = m_curPosition & m_vol->sectorMask(); // offset in sector if (isRootFixed()) { - sector = m_vol->rootDirStart() - + (m_curPosition >> m_vol->bytesPerSectorShift()); + sector = m_vol->rootDirStart() + + (m_curPosition >> m_vol->bytesPerSectorShift()); } else { sectorOfCluster = m_vol->sectorOfCluster(m_curPosition); if (offset == 0 && sectorOfCluster == 0) { @@ -783,23 +827,23 @@ int FatFile::read(void* buf, size_t nbyte) { } sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; } - if (offset != 0 || toRead < m_vol->bytesPerSector() - || sector == m_vol->cacheSectorNumber()) { + if (offset != 0 || toRead < m_vol->bytesPerSector() || + sector == m_vol->cacheSectorNumber()) { // amount to be read from current sector n = m_vol->bytesPerSector() - offset; if (n > toRead) { n = toRead; } // read sector to cache and copy data to caller - pc = m_vol->cacheFetchData(sector, FatCache::CACHE_FOR_READ); + pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } - uint8_t* src = pc->data + offset; + uint8_t* src = pc + offset; memcpy(dst, src, n); #if USE_MULTI_SECTOR_IO - } else if (toRead >= 2*m_vol->bytesPerSector()) { + } else if (toRead >= 2 * m_vol->bytesPerSector()) { uint32_t ns = toRead >> m_vol->bytesPerSectorShift(); if (!isRootFixed()) { uint32_t mb = m_vol->sectorsPerCluster() - sectorOfCluster; @@ -808,16 +852,7 @@ int FatFile::read(void* buf, size_t nbyte) { } } n = ns << m_vol->bytesPerSectorShift(); - // Check for cache sector in read range. - if (sector <= m_vol->cacheSectorNumber() - && m_vol->cacheSectorNumber() < (sector + ns)) { - // Flush cache if cache sector is in the range. - if (!m_vol->cacheSyncData()) { - DBG_FAIL_MACRO; - goto fail; - } - } - if (!m_vol->readSectors(sector, dst, ns)) { + if (!m_vol->cacheSafeRead(sector, dst, ns)) { DBG_FAIL_MACRO; goto fail; } @@ -825,7 +860,7 @@ int FatFile::read(void* buf, size_t nbyte) { } else { // read single sector n = m_vol->bytesPerSector(); - if (!m_vol->readSector(sector, dst)) { + if (!m_vol->cacheSafeRead(sector, dst)) { DBG_FAIL_MACRO; goto fail; } @@ -836,20 +871,19 @@ int FatFile::read(void* buf, size_t nbyte) { } return nbyte - toRead; - fail: +fail: m_error |= READ_ERROR; return -1; } //------------------------------------------------------------------------------ int8_t FatFile::readDir(DirFat_t* dir) { - int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0X1F & m_curPosition)) { return -1; } while (1) { - n = read(dir, sizeof(DirFat_t)); + int16_t n = read(dir, sizeof(DirFat_t)); if (n != sizeof(DirFat_t)) { return n == 0 ? 0 : -1; } @@ -862,33 +896,34 @@ int8_t FatFile::readDir(DirFat_t* dir) { continue; } // return if normal file or subdirectory - if (isFileOrSubdir(dir)) { + if (isFatFileOrSubdir(dir)) { return n; } } } //------------------------------------------------------------------------------ -// Read next directory entry into the cache -// Assumes file is correctly positioned +// Read next directory entry into the cache. +// Assumes file is correctly positioned. DirFat_t* FatFile::readDirCache(bool skipReadOk) { + DBG_HALT_IF(m_curPosition & 0X1F); uint8_t i = (m_curPosition >> 5) & 0XF; if (i == 0 || !skipReadOk) { int8_t n = read(&n, 1); - if (n != 1) { + if (n != 1) { if (n != 0) { DBG_FAIL_MACRO; } goto fail; } - m_curPosition += 31; + m_curPosition += FS_DIR_SIZE - 1; } else { - m_curPosition += 32; + m_curPosition += FS_DIR_SIZE; } // return pointer to entry return reinterpret_cast(m_vol->cacheAddress()) + i; - fail: +fail: return nullptr; } //------------------------------------------------------------------------------ @@ -900,7 +935,7 @@ bool FatFile::remove(const char* path) { } return file.remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -913,7 +948,7 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { uint32_t dirCluster = 0; FatFile file; FatFile oldFile; - cache_t* pc; + uint8_t* pc; DirFat_t* dir; // Must be an open file or subdirectory. @@ -933,8 +968,9 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } // sync() and cache directory entry sync(); - oldFile = *this; - dir = cacheDirEntry(FatCache::CACHE_FOR_READ); + // oldFile = *this; + oldFile.copy(this); + dir = cacheDirEntry(FsCache::CACHE_FOR_READ); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -967,7 +1003,7 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { file.m_flags = 0; // cache new directory entry - dir = cacheDirEntry(FatCache::CACHE_FOR_WRITE); + dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -981,12 +1017,13 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { if (dirCluster) { // get new dot dot uint32_t sector = m_vol->clusterStartSector(dirCluster); - pc = m_vol->cacheFetchData(sector, FatCache::CACHE_FOR_READ); - if (!pc) { + pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_READ); + dir = reinterpret_cast(pc); + if (!dir) { DBG_FAIL_MACRO; goto fail; } - memcpy(&entry, &pc->dir[1], sizeof(entry)); + memcpy(&entry, &dir[1], sizeof(entry)); // free unused cluster if (!m_vol->freeChain(dirCluster)) { @@ -995,12 +1032,13 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } // store new dot dot sector = m_vol->clusterStartSector(m_firstCluster); - pc = m_vol->cacheFetchData(sector, FatCache::CACHE_FOR_WRITE); - if (!pc) { + pc = m_vol->dataCachePrepare(sector, FsCache::CACHE_FOR_WRITE); + dir = reinterpret_cast(pc); + if (!dir) { DBG_FAIL_MACRO; goto fail; } - memcpy(&pc->dir[1], &entry, sizeof(entry)); + memcpy(&dir[1], &entry, sizeof(entry)); } // Remove old directory entry; oldFile.m_firstCluster = 0; @@ -1012,7 +1050,7 @@ bool FatFile::rename(FatFile* dirFile, const char* newPath) { } return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1044,7 +1082,7 @@ bool FatFile::rmdir() { continue; } // error not empty - if (isFileOrSubdir(dir)) { + if (isFatFileOrSubdir(dir)) { DBG_FAIL_MACRO; goto fail; } @@ -1054,7 +1092,7 @@ bool FatFile::rmdir() { m_flags |= FILE_FLAG_WRITE; return remove(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1068,7 +1106,7 @@ bool FatFile::rmRfStar() { rewind(); while (1) { // remember position - index = m_curPosition/32; + index = m_curPosition / FS_DIR_SIZE; DirFat_t* dir = readDirCache(); if (!dir) { @@ -1090,7 +1128,7 @@ bool FatFile::rmRfStar() { } // skip if part of long file name or volume label in root - if (!isFileOrSubdir(dir)) { + if (!isFatFileOrSubdir(dir)) { continue; } @@ -1113,8 +1151,8 @@ bool FatFile::rmRfStar() { } } // position to next entry if required - if (m_curPosition != (32UL*(index + 1))) { - if (!seekSet(32UL*(index + 1))) { + if (m_curPosition != (32UL * (index + 1))) { + if (!seekSet(32UL * (index + 1))) { DBG_FAIL_MACRO; goto fail; } @@ -1129,7 +1167,7 @@ bool FatFile::rmRfStar() { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1157,7 +1195,7 @@ bool FatFile::seekSet(uint32_t pos) { goto fail; } } else if (isRootFixed()) { - if (pos <= 32*m_vol->rootDirEntryCount()) { + if (pos <= FS_DIR_SIZE * m_vol->rootDirEntryCount()) { goto done; } DBG_FAIL_MACRO; @@ -1188,12 +1226,12 @@ bool FatFile::seekSet(uint32_t pos) { } } - done: +done: m_curPosition = pos; m_flags &= ~FILE_FLAG_PREALLOCATE; return true; - fail: +fail: m_curCluster = tmp; return false; } @@ -1205,17 +1243,17 @@ bool FatFile::sync() { return true; } if (m_flags & FILE_FLAG_DIR_DIRTY) { - DirFat_t* dir = cacheDirEntry(FatCache::CACHE_FOR_WRITE); + DirFat_t* dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); // check for deleted by another open file object if (!dir || dir->name[0] == FAT_NAME_DELETED) { DBG_FAIL_MACRO; goto fail; } + dir->attributes = m_attributes & FS_ATTRIB_COPY; // do not set filesize for dir files if (isFile()) { setLe32(dir->fileSize, m_fileSize); } - // update first cluster fields setLe16(dir->firstClusterLow, m_firstCluster & 0XFFFF); setLe16(dir->firstClusterHigh, m_firstCluster >> 16); @@ -1235,27 +1273,21 @@ bool FatFile::sync() { } DBG_FAIL_MACRO; - fail: +fail: m_error |= WRITE_ERROR; return false; } //------------------------------------------------------------------------------ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, - uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { + uint8_t day, uint8_t hour, uint8_t minute, + uint8_t second) { uint16_t dirDate; uint16_t dirTime; DirFat_t* dir; - if (!isFile() - || year < 1980 - || year > 2107 - || month < 1 - || month > 12 - || day < 1 - || day > 31 - || hour > 23 - || minute > 59 - || second > 59) { + if (!isFileOrSubDir() || year < 1980 || year > 2107 || month < 1 || + month > 12 || day < 1 || day > 31 || hour > 23 || minute > 59 || + second > 59) { DBG_FAIL_MACRO; goto fail; } @@ -1264,7 +1296,7 @@ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, DBG_FAIL_MACRO; goto fail; } - dir = cacheDirEntry(FatCache::CACHE_FOR_WRITE); + dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -1286,7 +1318,7 @@ bool FatFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, } return m_vol->cacheSync(); - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -1298,7 +1330,7 @@ bool FatFile::truncate() { goto fail; } if (m_firstCluster == 0) { - return true; + return true; } if (m_curCluster) { toFree = 0; @@ -1328,21 +1360,16 @@ bool FatFile::truncate() { // need to update directory entry m_flags |= FILE_FLAG_DIR_DIRTY; + return sync(); - if (!sync()) { - DBG_FAIL_MACRO; - goto fail; - } - return true; - - fail: +fail: return false; } //------------------------------------------------------------------------------ size_t FatFile::write(const void* buf, size_t nbyte) { // convert void* to uint8_t* - must be before goto statements const uint8_t* src = reinterpret_cast(buf); - cache_t* pc; + uint8_t* pc; uint8_t cacheOption; // number of bytes left to write - must be before goto statements size_t nToWrite = nbyte; @@ -1382,7 +1409,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { goto fail; } } -#else // USE_FAT_FILE_FLAG_CONTIGUOUS +#else // USE_FAT_FILE_FLAG_CONTIGUOUS int8_t fg = m_vol->fatGet(m_curCluster, &m_curCluster); if (fg < 0) { DBG_FAIL_MACRO; @@ -1410,8 +1437,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } } // sector for data write - uint32_t sector = m_vol->clusterStartSector(m_curCluster) - + sectorOfCluster; + uint32_t sector = m_vol->clusterStartSector(m_curCluster) + sectorOfCluster; if (sectorOffset != 0 || nToWrite < m_vol->bytesPerSector()) { // partial sector - must use cache @@ -1423,19 +1449,19 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } if (sectorOffset == 0 && - (m_curPosition >= m_fileSize || m_flags & FILE_FLAG_PREALLOCATE)) { + (m_curPosition >= m_fileSize || m_flags & FILE_FLAG_PREALLOCATE)) { // start of new sector don't need to read into cache - cacheOption = FatCache::CACHE_RESERVE_FOR_WRITE; + cacheOption = FsCache::CACHE_RESERVE_FOR_WRITE; } else { // rewrite part of sector - cacheOption = FatCache::CACHE_FOR_WRITE; + cacheOption = FsCache::CACHE_FOR_WRITE; } - pc = m_vol->cacheFetchData(sector, cacheOption); + pc = m_vol->dataCachePrepare(sector, cacheOption); if (!pc) { DBG_FAIL_MACRO; goto fail; } - uint8_t* dst = pc->data + sectorOffset; + uint8_t* dst = pc + sectorOffset; memcpy(dst, src, n); if (m_vol->bytesPerSector() == (n + sectorOffset)) { // Force write if sector is full - improves large writes. @@ -1445,7 +1471,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } } #if USE_MULTI_SECTOR_IO - } else if (nToWrite >= 2*m_vol->bytesPerSector()) { + } else if (nToWrite >= 2 * m_vol->bytesPerSector()) { // use multiple sector write command uint32_t maxSectors = m_vol->sectorsPerCluster() - sectorOfCluster; uint32_t nSector = nToWrite >> m_vol->bytesPerSectorShift(); @@ -1453,13 +1479,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { nSector = maxSectors; } n = nSector << m_vol->bytesPerSectorShift(); - // Check for cache sector in write range. - if (sector <= m_vol->cacheSectorNumber() - && m_vol->cacheSectorNumber() < (sector + nSector)) { - // Invalidate cache if cache sector is in the range. - m_vol->cacheInvalidate(); - } - if (!m_vol->writeSectors(sector, src, nSector)) { + if (!m_vol->cacheSafeWrite(sector, src, nSector)) { DBG_FAIL_MACRO; goto fail; } @@ -1467,10 +1487,7 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } else { // use single sector write command n = m_vol->bytesPerSector(); - if (m_vol->cacheSectorNumber() == sector) { - m_vol->cacheInvalidate(); - } - if (!m_vol->writeSector(sector, src)) { + if (!m_vol->cacheSafeWrite(sector, src)) { DBG_FAIL_MACRO; goto fail; } @@ -1489,32 +1506,8 @@ size_t FatFile::write(const void* buf, size_t nbyte) { } return nbyte; - fail: +fail: // return for write error m_error |= WRITE_ERROR; - return -1; + return 0; } - -//------------------------------------------------------- -// EFP3 - Match upstream Arduino hack -int FatFile::availableSpaceForWrite() { - // error if not a normal file or is read-only - if (!isWritable() || m_vol->m_blockDev->isBusy()) { - return 0; - } - // seek to end of file if append flag - if ((m_flags & FILE_FLAG_APPEND)) { - if (!seekSet(m_fileSize)) { - return 0; - } - } - uint8_t sectorOfCluster = m_vol->sectorOfCluster(m_curPosition); - uint16_t sectorOffset = m_curPosition & m_vol->sectorMask(); - if (sectorOfCluster == 0 && sectorOffset == 0) { - return 0; - } - return m_vol->bytesPerSector() - sectorOffset - 1; -} -//------------------------------------------------------- - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.h index b87b1983..62977559 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,53 +28,16 @@ * \file * \brief FatFile class */ -#include -#include #include -#include "FatLibConfig.h" +#include +#include + #include "../common/FmtNumber.h" #include "../common/FsApiConstants.h" #include "../common/FsDateTime.h" -#include "../common/FsStructs.h" +#include "../common/FsName.h" #include "FatPartition.h" - - -namespace sdfat { - - class FatVolume; - - -}; // namespace sdfat - - -//------------------------------------------------------------------------------ -// Stuff to store strings in AVR flash. -#ifdef __AVR__ -#include -#else // __AVR__ -#ifndef PSTR -/** store literal string in flash for ARM */ -#define PSTR(x) (x) -#endif // PSTR -#ifndef pgm_read_byte -/** read 8-bits from flash for ARM */ -#define pgm_read_byte(addr) (*(const unsigned char*)(addr)) -#endif // pgm_read_byte -#ifndef pgm_read_word -/** read 16-bits from flash for ARM */ -#define pgm_read_word(addr) (*(const uint16_t*)(addr)) -#endif // pgm_read_word -#ifndef PROGMEM -/** store in flash for ARM */ -#define PROGMEM -#endif // PROGMEM -#endif // __AVR__ - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** * \struct FatPos_t @@ -85,35 +48,54 @@ struct FatPos_t { uint32_t position; /** cluster for position */ uint32_t cluster; - FatPos_t() : position(0), cluster(0) {} }; //------------------------------------------------------------------------------ /** Expression for path name separator. */ #define isDirSeparator(c) ((c) == '/') //------------------------------------------------------------------------------ /** - * \struct fname_t - * \brief Internal type for Short File Name - do not use in user apps. + * \class FatLfn_t + * \brief Internal type for Long File Name - do not use in user apps. */ -struct fname_t { + +class FatLfn_t : public FsName { + public: + /** UTF-16 length of Long File Name */ + size_t len; + /** Position for sequence number. */ + uint8_t seqPos; /** Flags for base and extension character case and LFN. */ uint8_t flags; - /** length of Long File Name */ - size_t len; - /** Long File Name start. */ - const char* lfn; - /** position for sequence number */ - uint8_t seqPos; /** Short File Name */ uint8_t sfn[11]; }; +/** + * \class FatSfn_t + * \brief Internal type for Short 8.3 File Name - do not use in user apps. + */ +class FatSfn_t { + public: + /** Flags for base and extension character case and LFN. */ + uint8_t flags; + /** Short File Name */ + uint8_t sfn[11]; +}; + +#if USE_LONG_FILE_NAMES +/** Internal class for file names */ +typedef FatLfn_t FatName_t; +#else // USE_LONG_FILE_NAMES +/** Internal class for file names */ +typedef FatSfn_t FatName_t; +#endif // USE_LONG_FILE_NAMES + /** Derived from a LFN with loss or conversion of characters. */ const uint8_t FNAME_FLAG_LOST_CHARS = 0X01; /** Base-name or extension has mixed case. */ const uint8_t FNAME_FLAG_MIXED_CASE = 0X02; /** LFN entries are required for file name. */ const uint8_t FNAME_FLAG_NEED_LFN = - FNAME_FLAG_LOST_CHARS | FNAME_FLAG_MIXED_CASE; + FNAME_FLAG_LOST_CHARS | FNAME_FLAG_MIXED_CASE; /** Filename base-name is all lower case */ const uint8_t FNAME_FLAG_LC_BASE = FAT_CASE_LC_BASE; /** Filename extension is all lower case. */ @@ -126,8 +108,7 @@ const uint8_t FNAME_FLAG_LC_EXT = FAT_CASE_LC_EXT; class FatFile { public: /** Create an instance. */ - FatFile() : m_attributes(FILE_ATTR_CLOSED), m_error(0), m_flags(0) {} - + FatFile() {} /** Create a file object and open it in the current working directory. * * \param[in] path A path for a file to be opened. @@ -135,37 +116,233 @@ class FatFile { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). */ - FatFile(const char* path, oflag_t oflag) { - m_attributes = FILE_ATTR_CLOSED; - m_error = 0; - open(path, oflag); + FatFile(const char* path, oflag_t oflag) { open(path, oflag); } + + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const FatFile* from) { + if (from != this) { +#if FILE_COPY_CONSTRUCTOR_SELECT + *this = *from; +#else // FILE_COPY_CONSTRUCTOR_SELECT + memcpy(this, from, sizeof(FatFile)); +#endif // FILE_COPY_CONSTRUCTOR_SELECT + } } + /** move from to this. + * \param[in] from Source file. + */ + void move(FatFile* from) { + if (from != this) { + copy(from); + from->m_attributes = FILE_ATTR_CLOSED; + } + } + +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC + /** Copy constructor. + * \param[in] from Move from file. + * + */ + FatFile(const FatFile& from) = default; + /** Copy assignment operator. + * \param[in] from Move from file. + * \return Copied file. + */ + FatFile& operator=(const FatFile& from) = default; +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + FatFile(const FatFile& from) = default; + FatFile& operator=(const FatFile& from) = default; + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + FatFile(const FatFile& from) = delete; + FatFile& operator=(const FatFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from Move from file. + */ + FatFile(FatFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from Move from file. + * \return Moved file. + */ + FatFile& operator=(FatFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + FatFile(FatFile&& from) = delete; + FatFile& operator=(FatFile&& from) = delete; +#endif + /** Destructor */ #if DESTRUCTOR_CLOSES_FILE ~FatFile() { if (isOpen()) { close(); } } +#else // DESTRUCTOR_CLOSES_FILE + ~FatFile() = default; #endif // DESTRUCTOR_CLOSES_FILE + /** The parenthesis operator. * * \return true if a file is open. */ - operator bool() { - return isOpen(); + operator bool() const { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { + return isFileOrSubDir() ? m_attributes & FS_ATTRIB_USER_SETTABLE : -1; + } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits); + /** \return The number of bytes available from the current position + * to EOF for normal files. INT_MAX is returned for very large files. + * + * available32() is recomended for very large files. + * + * Zero is returned for directory files. + * + */ + int available() const { + uint32_t n = available32(); + return n > INT_MAX ? INT_MAX : n; + } + /** \return The number of bytes available from the current position + * to EOF for normal files. Zero is returned for directory files. + */ + uint32_t available32() const { + return isFile() ? fileSize() - curPosition() : 0; } - /** Arduino name for sync() */ - void flush() {sync();} /** Clear all error bits. */ - void clearError() { - m_error = 0; - } + void clearError() { m_error = 0; } /** Set writeError to zero */ - void clearWriteError() { - m_error &= ~WRITE_ERROR; - } + void clearWriteError() { m_error &= ~WRITE_ERROR; } + /** Close a file and force cached data and directory information + * to be written to the storage device. + * + * \return true for success or false for failure. + */ + bool close(); + /** Check for contiguous file and return its raw sector range. + * + * \param[out] bgnSector the first sector address for the file. + * \param[out] endSector the last sector address for the file. + * + * Set the contiguous flag if the file is contiguous. + * The parameters may be nullptr to only set the flag. + * \return true for success or false for failure. + */ + bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector); + /** Create and open a new contiguous file of a specified size. + * + * \param[in] dirFile The directory where the file will be created. + * \param[in] path A path with a valid file name. + * \param[in] size The desired file size. + * + * \return true for success or false for failure. + */ + bool createContiguous(FatFile* dirFile, const char* path, uint32_t size); + /** Create and open a new contiguous file of a specified size. + * + * \param[in] path A path with a valid file name. + * \param[in] size The desired file size. + * + * \return true for success or false for failure. + */ + bool createContiguous(const char* path, uint32_t size); + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const { return m_curCluster; } + + /** \return The current position for a file or directory. */ + uint32_t curPosition() const { return m_curPosition; } + /** Return a file's directory entry. + * + * \param[out] dir Location for return of the file's directory entry. + * + * \return true for success or false for failure. + */ + bool dirEntry(DirFat_t* dir); /** \return Directory entry index. */ - uint16_t dirIndex() {return m_dirIndex;} + uint16_t dirIndex() const { return m_dirIndex; } + /** \return The number of bytes allocated to a directory or zero + * if an error occurs. + */ + uint32_t dirSize(); + /** Dump file in Hex + * \param[in] pr Print stream for list. + * \param[in] pos Start position in file. + * \param[in] n number of locations to dump. + */ + void dmpFile(print_t* pr, uint32_t pos, size_t n); + /** Test for the existence of a file in a directory + * + * \param[in] path Path of the file to be tested for. + * + * The calling instance must be an open directory file. + * + * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory + * dirFile. + * + * \return True if the file exists. + */ + bool exists(const char* path) { + FatFile file; + return file.open(this, path, O_RDONLY); + } + /** get position for streams + * \param[out] pos struct to receive position + */ + void fgetpos(fspos_t* pos) const; + /** + * Get a string from a file. + * + * fgets() reads bytes from a file into the array pointed to by \a str, until + * \a num - 1 bytes are read, or a delimiter is read and transferred to + * \a str, or end-of-file is encountered. The string is then terminated + * with a null byte. + * + * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' + * terminates the string for Windows text files which use CRLF for newline. + * + * \param[out] str Pointer to the array where the string is stored. + * \param[in] num Maximum number of characters to be read + * (including the final null byte). Usually the length + * of the array \a str is used. + * \param[in] delim Optional set of delimiters. The default is "\n". + * + * \return For success fgets() returns the length of the string in \a str. + * If no data is read, fgets() returns zero for EOF or -1 if an error + * occurred. + */ + int fgets(char* str, int num, char* delim = nullptr); + /** \return The total number of bytes in a file. */ + uint32_t fileSize() const { return m_fileSize; } + /** \return first sector of file or zero for empty file. */ + uint32_t firstBlock() const { return firstSector(); } + /** \return Address of first sector or zero for empty file. */ + uint32_t firstSector() const; + /** Arduino name for sync() */ + void flush() { sync(); } + /** set position for streams + * \param[in] pos struct with value for new position + */ + void fsetpos(const fspos_t* pos); /** Get a file's access date. * * \param[out] pdate Packed date for directory entry. @@ -198,9 +375,7 @@ class FatFile { */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime); /** \return All error bits. */ - uint8_t getError() { - return m_error; - } + uint8_t getError() const { return m_error; } /** Get a file's modify date and time. * * \param[out] pdate Packed date for directory entry. @@ -209,239 +384,83 @@ class FatFile { * \return true for success or false for failure. */ bool getModifyDateTime(uint16_t* pdate, uint16_t* ptime); - /** \return value of writeError */ - bool getWriteError() { - return isOpen() ? m_error & WRITE_ERROR : true; - } - /** get position for streams - * \param[out] pos struct to receive position - */ - void fgetpos(fspos_t* pos); - /** set position for streams - * \param[in] pos struct with value for new position - */ - void fsetpos(const fspos_t* pos); - /** \return The number of bytes available from the current position - * to EOF for normal files. Zero is returned for directory files. - */ - uint32_t available32() { - return isFile() ? fileSize() - curPosition() : 0; - } - /** \return The number of bytes available from the current position - * to EOF for normal files. INT_MAX is returned for very large files. - * - * available64() is recomended for very large files. - * - * Zero is returned for directory files. - * - */ - int available() { - uint32_t n = available32(); - return n > INT_MAX ? INT_MAX : n; - } - /** Close a file and force cached data and directory information - * to be written to the storage device. - * - * \return true for success or false for failure. - */ - bool close(); - /** Check for contiguous file and return its raw sector range. - * - * \param[out] bgnSector the first sector address for the file. - * \param[out] endSector the last sector address for the file. - * - * Set the contiguous flag if the file is contiguous. - * The parameters may be nullptr to only set the flag. - * \return true for success or false for failure. - */ - bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector); - - /** Create and open a new contiguous file of a specified size. - * - * \param[in] dirFile The directory where the file will be created. - * \param[in] path A path with a valid file name. - * \param[in] size The desired file size. - * - * \return true for success or false for failure. - */ - bool createContiguous(FatFile* dirFile, - const char* path, uint32_t size); - /** Create and open a new contiguous file of a specified size. - * - * \param[in] path A path with a valid file name. - * \param[in] size The desired file size. - * - * \return true for success or false for failure. - */ - bool createContiguous(const char* path, uint32_t size); - - /** \return The current cluster number for a file or directory. */ - uint32_t curCluster() const {return m_curCluster;} - - /** \return The current position for a file or directory. */ - uint32_t curPosition() const { - return m_curPosition; - } - - /** Return a file's directory entry. - * - * \param[out] dir Location for return of the file's directory entry. - * - * \return true for success or false for failure. - */ - bool dirEntry(DirFat_t* dir); - /** \return The number of bytes allocated to a directory or zero - * if an error occurs. - */ - uint32_t dirSize(); - /** Dump file in Hex - * \param[in] pr Print stream for list. - * \param[in] pos Start position in file. - * \param[in] n number of locations to dump. - */ - void dmpFile(print_t* pr, uint32_t pos, size_t n); - /** Test for the existence of a file in a directory - * - * \param[in] path Path of the file to be tested for. - * - * The calling instance must be an open directory file. - * - * dirFile.exists("TOFIND.TXT") searches for "TOFIND.TXT" in the directory - * dirFile. - * - * \return True if the file exists. - */ - bool exists(const char* path) { - FatFile file; - return file.open(this, path, O_RDONLY); - } - /** - * Get a string from a file. - * - * fgets() reads bytes from a file into the array pointed to by \a str, until - * \a num - 1 bytes are read, or a delimiter is read and transferred to - * \a str, or end-of-file is encountered. The string is then terminated - * with a null byte. - * - * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' - * terminates the string for Windows text files which use CRLF for newline. - * - * \param[out] str Pointer to the array where the string is stored. - * \param[in] num Maximum number of characters to be read - * (including the final null byte). Usually the length - * of the array \a str is used. - * \param[in] delim Optional set of delimiters. The default is "\n". - * - * \return For success fgets() returns the length of the string in \a str. - * If no data is read, fgets() returns zero for EOF or -1 if an error - * occurred. - */ - int fgets(char* str, int num, char* delim = nullptr); - - /** \return The total number of bytes in a file. */ - uint32_t fileSize() const { - return m_fileSize; - } - /** \return first sector of file or zero for empty file. */ - uint32_t firstBlock() const {return firstSector();} - /** \return Address of first sector or zero for empty file. */ - uint32_t firstSector() const; /** * Get a file's name followed by a zero byte. * * \param[out] name An array of characters for the file's name. * \param[in] size The size of the array in bytes. The array - * must be at least 13 bytes long. The file's name will be - * truncated if the file's name is too long. - * \return true for success or false for failure. + * must be at least 13 bytes long. + * \return length for success or zero for failure. */ - bool getName(char* name, size_t size); + size_t getName(char* name, size_t size); + /** + * Get a file's ASCII name followed by a zero. + * + * \param[out] name An array of characters for the file's name. + * \param[in] size The size of the array in characters. + * \return length for success or zero for failure. + */ + size_t getName7(char* name, size_t size); + /** + * Get a file's UTF-8 name followed by a zero. + * + * \param[out] name An array of characters for the file's name. + * \param[in] size The size of the array in characters. + * \return length for success or zero for failure. + */ + size_t getName8(char* name, size_t size); +#ifndef DOXYGEN_SHOULD_SKIP_THIS + size_t __attribute__((error("use getSFN(name, size)"))) getSFN(char* name); +#endif // DOXYGEN_SHOULD_SKIP_THIS /** * Get a file's Short File Name followed by a zero byte. * * \param[out] name An array of characters for the file's name. - * The array must be at least 13 bytes long. + * The array should be at least 13 bytes long. + * \param[in] size size of name array. * \return true for success or false for failure. */ - bool getSFN(char* name); + size_t getSFN(char* name, size_t size); + /** \return value of writeError */ + bool getWriteError() const { return isOpen() ? m_error & WRITE_ERROR : true; } + /** + * Check for device busy. + * + * \return true if busy else false. + */ + bool isBusy(); #if USE_FAT_FILE_FLAG_CONTIGUOUS - /** \return True if the file is contiguous. */ - bool isContiguous() const {return m_flags & FILE_FLAG_CONTIGUOUS;} + /** \return True if the file is contiguous. */ + bool isContiguous() const { return m_flags & FILE_FLAG_CONTIGUOUS; } #endif // USE_FAT_FILE_FLAG_CONTIGUOUS /** \return True if this is a directory. */ - bool isDir() const { - return m_attributes & FILE_ATTR_DIR; - } + bool isDir() const { return m_attributes & FILE_ATTR_DIR; } /** \return True if this is a normal file. */ - bool isFile() const { - return m_attributes & FILE_ATTR_FILE; - } + bool isFile() const { return m_attributes & FILE_ATTR_FILE; } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { return isFile() || isSubDir(); } /** \return True if this is a hidden file. */ - bool isHidden() const { - return m_attributes & FILE_ATTR_HIDDEN; - } + bool isHidden() const { return m_attributes & FS_ATTRIB_HIDDEN; } /** \return true if this file has a Long File Name. */ - bool isLFN() const { - return m_lfnOrd; - } + bool isLFN() const { return m_lfnOrd; } /** \return True if this is an open file/directory. */ - bool isOpen() const { - return m_attributes; - } - /** \return True if this is the root directory. */ - bool isRoot() const { - return m_attributes & FILE_ATTR_ROOT; - } - /** \return True if this is the FAT32 root directory. */ - bool isRoot32() const { - return m_attributes & FILE_ATTR_ROOT32; - } - /** \return True if this is the FAT12 of FAT16 root directory. */ - bool isRootFixed() const { - return m_attributes & FILE_ATTR_ROOT_FIXED; - } + bool isOpen() const { return m_attributes; } + /** \return True file is readable. */ + bool isReadable() const { return m_flags & FILE_FLAG_READ; } /** \return True if file is read-only */ - bool isReadOnly() const { - return m_attributes & FILE_ATTR_READ_ONLY; - } - /** \return True if this is a subdirectory. */ - bool isSubDir() const { - return m_attributes & FILE_ATTR_SUBDIR; - } + bool isReadOnly() const { return m_attributes & FS_ATTRIB_READ_ONLY; } + /** \return True if this is the root directory. */ + bool isRoot() const { return m_attributes & FILE_ATTR_ROOT; } + /** \return True if this is the FAT32 root directory. */ + bool isRoot32() const { return m_attributes & FILE_ATTR_ROOT32; } + /** \return True if this is the FAT12 of FAT16 root directory. */ + bool isRootFixed() const { return m_attributes & FILE_ATTR_ROOT_FIXED; } + /** \return True if this is a sub-directory. */ + bool isSubDir() const { return m_attributes & FILE_ATTR_SUBDIR; } /** \return True if this is a system file. */ - bool isSystem() const { - return m_attributes & FILE_ATTR_SYSTEM; - } + bool isSystem() const { return m_attributes & FS_ATTRIB_SYSTEM; } /** \return True file is writable. */ - bool isReadable() const { - return m_flags & FILE_FLAG_READ; - } - /** \return True file is writable. */ - bool isWritable() const { - return m_flags & FILE_FLAG_WRITE; - } - /** Check for a legal 8.3 character. - * \param[in] c Character to be checked. - * \return true for a legal 8.3 character. - */ - static bool legal83Char(uint8_t c) { - if (c == '"' || c == '|') { - return false; - } - // *+,./ - if (0X2A <= c && c <= 0X2F && c != 0X2D) { - return false; - } - // :;<=>? - if (0X3A <= c && c <= 0X3F) { - return false; - } - // [\] - if (0X5B <= c && c <= 0X5D) { - return false; - } - return 0X20 < c && c < 0X7F; - } + bool isWritable() const { return m_flags & FILE_FLAG_WRITE; } /** List directory contents. * * \param[in] pr Print stream for list. @@ -472,7 +491,6 @@ class FatFile { * \return true for success or false for failure. */ bool mkdir(FatFile* dir, const char* path, bool pFlag = true); - /** Open a file in the volume root directory. * * \param[in] vol Volume where the file is located. @@ -484,7 +502,7 @@ class FatFile { * * \return true for success or false for failure. */ - bool open(FatVolume* vol, const char* path, oflag_t oflag); + bool open(FatVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file by index. * * \param[in] dirFile An open FatFile instance for the directory. @@ -498,7 +516,19 @@ class FatFile { * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(FatFile* dirFile, uint16_t index, oflag_t oflag); + bool open(FatFile* dirFile, uint16_t index, oflag_t oflag = O_RDONLY); + /** Open a file by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag bitwise-inclusive OR of open flags. + * See see FatFile::open(FatFile*, const char*, uint8_t). + * + * See open() by path for definition of flags. + * \return true for success or false for failure. + */ + bool open(uint16_t index, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] dirFile An open FatFile instance for the directory containing @@ -506,7 +536,7 @@ class FatFile { * * \param[in] path A path with a valid name for a file to be opened. * - * \param[in] oflag Values for \a oflag are constructed by a + * \param[in] oflag Values for \a oflag are constructed by a * bitwise-inclusive OR of flags from the following list. * Only one of O_RDONLY, O_READ, O_WRONLY, O_WRITE, or * O_RDWR is allowed. @@ -544,7 +574,7 @@ class FatFile { * * \return true for success or false for failure. */ - bool open(FatFile* dirFile, const char* path, oflag_t oflag); + bool open(FatFile* dirFile, const char* path, oflag_t oflag = O_RDONLY); /** Open a file in the current working volume. * * \param[in] path A path with a valid name for a file to be opened. @@ -555,6 +585,21 @@ class FatFile { * \return true for success or false for failure. */ bool open(const char* path, oflag_t oflag = O_RDONLY); + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); + /** Open existing file wih Short 8.3 names. + * \param[in] path with short 8.3 names. + * + * the purpose of this function is to save flash on Uno + * and other small boards. + * + * Directories will be opened O_RDONLY, files O_RDWR. + * \return true for success or false for failure. + */ + bool openExistingSFN(const char* path); /** Open the next file or subdirectory in a directory. * * \param[in] dirFile An open FatFile instance for the directory @@ -573,12 +618,13 @@ class FatFile { * \return true for success or false for failure. */ bool openRoot(FatVolume* vol); + /** Return the next available byte without consuming it. * * \return The byte if no error and not at eof else -1; */ int peek(); - /** Allocate contiguous clusters to an empty file. + /** Allocate contiguous clusters to an empty file. * * The file must be empty with no clusters allocated. * @@ -588,13 +634,27 @@ class FatFile { * \return true for success or false for failure. */ bool preAllocate(uint32_t length); + /** Print a file's access date + * + * \param[in] pr Print stream for output. + * + * \return The number of characters printed. + */ + size_t printAccessDate(print_t* pr); + /** Print a file's access date + * + * \param[in] pr Print stream for output. + * + * \return The number of characters printed. + */ + size_t printAccessDateTime(print_t* pr) { return printAccessDate(pr); } /** Print a file's creation date and time * * \param[in] pr Print stream for output. * * \return The number of bytes printed. */ - size_t printCreateDateTime(print_t* pr); + size_t printCreateDateTime(print_t* pr); /** %Print a directory date field. * * Format is yyyy-mm-dd. @@ -646,7 +706,7 @@ class FatFile { template size_t printField(Type value, char term) { char sign = 0; - char buf[3*sizeof(Type) + 3]; + char buf[3 * sizeof(Type) + 3]; char* str = buf + sizeof(buf); if (term) { @@ -669,22 +729,14 @@ class FatFile { } return write(str, &buf[sizeof(buf)] - str); } - /** Print a file's access date + /** Print a file's size. * * \param[in] pr Print stream for output. * - * \return The number of characters printed. + * \return The number of characters printed is returned + * for success and zero is returned for failure. */ - size_t printAccessDate(print_t* pr); - /** Print a file's access date - * - * \param[in] pr Print stream for output. - * - * \return The number of characters printed. - */ - size_t printAccessDateTime(print_t* pr) { - return printAccessDate(pr); - } + size_t printFileSize(print_t* pr); /** Print a file's modify date and time * * \param[in] pr Print stream for output. @@ -696,17 +748,23 @@ class FatFile { * * \param[in] pr Print stream for output. * - * \return true for success or false for failure. + * \return length for success or zero for failure. */ size_t printName(print_t* pr); - /** Print a file's size. + /** Print a file's ASCII name * * \param[in] pr Print stream for output. * - * \return The number of characters printed is returned - * for success and zero is returned for failure. + * \return true for success or false for failure. */ - size_t printFileSize(print_t* pr); + size_t printName7(print_t* pr); + /** Print a file's UTF-8 name + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printName8(print_t* pr); /** Print a file's Short File Name. * * \param[in] pr Print stream for output. @@ -773,10 +831,6 @@ class FatFile { * \return true for success or false for failure. */ bool remove(const char* path); - /** Set the file's current position to zero. */ - void rewind() { - seekSet(0); - } /** Rename a file or subdirectory. * \note the renamed file will be moved to the current volume working * directory. @@ -794,6 +848,8 @@ class FatFile { * \return true for success or false for failure. */ bool rename(FatFile* dirFile, const char* newPath); + /** Set the file's current position to zero. */ + void rewind() { seekSet(0UL); } /** Remove a directory file. * * The directory file will be removed only if it is empty and is not the @@ -826,9 +882,7 @@ class FatFile { * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int32_t offset) { - return seekSet(m_curPosition + offset); - } + bool seekCur(int32_t offset) { return seekSet(m_curPosition + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. @@ -844,14 +898,12 @@ class FatFile { * \return true for success or false for failure. */ bool seekSet(uint32_t pos); - /** The sync() call causes all modified data and directory fields * to be written to the storage device. * * \return true for success or false for failure. */ bool sync(); - /** Set a file's timestamps in its directory entry. * * \param[in] flags Values for \a flags are constructed by a bitwise-inclusive @@ -901,25 +953,18 @@ class FatFile { * * \return true for success or false for failure. */ - bool truncate(uint32_t length) { - return seekSet(length) && truncate(); - } - + bool truncate(uint32_t length) { return seekSet(length) && truncate(); } /** Write a string to a file. Used by the Arduino Print class. * \param[in] str Pointer to the string. * Use getWriteError to check for errors. * \return count of characters written for success or -1 for failure. */ - size_t write(const char* str) { - return write(str, strlen(str)); - } + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a single byte. * \param[in] b The byte to be written. * \return +1 for success or -1 for failure. */ - size_t write(uint8_t b) { - return write(&b, 1); - } + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -930,15 +975,10 @@ class FatFile { * \param[in] count Number of bytes to write. * * \return For success write() returns the number of bytes written, always - * \a count. If an error occurs, write() returns -1. Possible errors - * include write() is called before a file has been opened, write is called - * for a read-only file, device is full, a corrupt file system or an I/O - * error. + * \a count. If an error occurs, write() returns zero and writeError is set. * */ size_t write(const void* buf, size_t count); - - int availableSpaceForWrite(); //------------------------------------------------------------------------------ #if ENABLE_ARDUINO_SERIAL /** List directory contents. @@ -953,16 +993,12 @@ class FatFile { * * \return true for success or false for failure. */ - bool ls(uint8_t flags = 0) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } /** Print a file's name. * - * \return true for success or false for failure. + * \return length for success or zero for failure. */ - size_t printName() { - return FatFile::printName(&Serial); - } + size_t printName() { return FatFile::printName(&Serial); } #endif // ENABLE_ARDUINO_SERIAL private: @@ -971,40 +1007,46 @@ class FatFile { /** This file has not been opened. */ static const uint8_t FILE_ATTR_CLOSED = 0; - /** File is read-only. */ - static const uint8_t FILE_ATTR_READ_ONLY = FAT_ATTRIB_READ_ONLY; - /** File should be hidden in directory listings. */ - static const uint8_t FILE_ATTR_HIDDEN = FAT_ATTRIB_HIDDEN; - /** Entry is for a system file. */ - static const uint8_t FILE_ATTR_SYSTEM = FAT_ATTRIB_SYSTEM; /** Entry for normal data file */ static const uint8_t FILE_ATTR_FILE = 0X08; /** Entry is for a subdirectory */ - static const uint8_t FILE_ATTR_SUBDIR = FAT_ATTRIB_DIRECTORY; + static const uint8_t FILE_ATTR_SUBDIR = FS_ATTRIB_DIRECTORY; /** A FAT12 or FAT16 root directory */ - static const uint8_t FILE_ATTR_ROOT_FIXED = 0X20; + static const uint8_t FILE_ATTR_ROOT_FIXED = 0X40; /** A FAT32 root directory */ - static const uint8_t FILE_ATTR_ROOT32 = 0X40; + static const uint8_t FILE_ATTR_ROOT32 = 0X80; /** Entry is for root. */ - static const uint8_t FILE_ATTR_ROOT = - FILE_ATTR_ROOT_FIXED | FILE_ATTR_ROOT32; + static const uint8_t FILE_ATTR_ROOT = FILE_ATTR_ROOT_FIXED | FILE_ATTR_ROOT32; /** Directory type bits */ static const uint8_t FILE_ATTR_DIR = FILE_ATTR_SUBDIR | FILE_ATTR_ROOT; - /** Attributes to copy from directory entry */ - static const uint8_t FILE_ATTR_COPY = - FAT_ATTRIB_READ_ONLY | FAT_ATTRIB_HIDDEN | - FAT_ATTRIB_SYSTEM | FAT_ATTRIB_DIRECTORY; // private functions + bool addCluster(); bool addDirCluster(); + DirFat_t* cacheDir(uint16_t index) { + return seekSet(32UL * index) ? readDirCache() : nullptr; + } DirFat_t* cacheDirEntry(uint8_t action); - static uint8_t lfnChecksum(uint8_t* name); - bool lfnUniqueSfn(fname_t* fname); + bool cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); + bool createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd); + uint16_t getLfnChar(DirLfn_t* ldir, uint8_t i); + uint8_t lfnChecksum(const uint8_t* name) { + uint8_t sum = 0; + for (uint8_t i = 0; i < 11; i++) { + sum = (((sum & 1) << 7) | (sum >> 1)) + name[i]; + } + return sum; + } + static bool makeSFN(FatLfn_t* fname); + bool makeUniqueSfn(FatLfn_t* fname); bool openCluster(FatFile* file); - static bool parsePathName(const char* str, fname_t* fname, const char** ptr); - bool mkdir(FatFile* parent, fname_t* fname); - bool open(FatFile* dirFile, fname_t* fname, oflag_t oflag); + bool parsePathName(const char* str, FatLfn_t* fname, const char** ptr); + bool parsePathName(const char* str, FatSfn_t* fname, const char** ptr); + bool mkdir(FatFile* parent, FatName_t* fname); + bool open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag); + bool open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag); + bool openSFN(FatSfn_t* fname); bool openCachedEntry(FatFile* dirFile, uint16_t cacheIndex, oflag_t oflag, uint8_t lfnOrd); DirFat_t* readDirCache(bool skipReadOk = false); @@ -1016,45 +1058,36 @@ class FatFile { // treat curPosition as valid length. static const uint8_t FILE_FLAG_PREALLOCATE = 0X20; // file is contiguous - static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; + static const uint8_t FILE_FLAG_CONTIGUOUS = 0X40; // sync of directory entry required static const uint8_t FILE_FLAG_DIR_DIRTY = 0X80; // private data static const uint8_t WRITE_ERROR = 0X1; - static const uint8_t READ_ERROR = 0X2; + static const uint8_t READ_ERROR = 0X2; - uint8_t m_attributes; // File attributes - uint8_t m_error; // Error bits. - uint8_t m_flags; // See above for definition of m_flags bits - uint8_t m_lfnOrd; - uint16_t m_dirIndex; // index of directory entry in dir file - FatVolume* m_vol; // volume where file is located - uint32_t m_dirCluster; - uint32_t m_curCluster; // cluster for current file position - uint32_t m_curPosition; // current file position - uint32_t m_dirSector; // sector for this files directory entry - uint32_t m_fileSize; // file size in bytes - uint32_t m_firstCluster; // first cluster of file + uint8_t m_attributes = FILE_ATTR_CLOSED; + uint8_t m_error = 0; // Error bits. + uint8_t m_flags = 0; // See above for definition of m_flags bits + uint8_t m_lfnOrd; + uint16_t m_dirIndex; // index of directory entry in dir file + FatVolume* m_vol; // volume where file is located + uint32_t m_dirCluster; + uint32_t m_curCluster; // cluster for current file position + uint32_t m_curPosition; // current file position + uint32_t m_dirSector; // sector for this files directory entry + uint32_t m_fileSize; // file size in bytes + uint32_t m_firstCluster; // first cluster of file }; - -}; // namespace sdfat - - #include "../common/ArduinoFiles.h" - - -namespace sdfat { - - /** * \class File32 * \brief FAT16/FAT32 file with Arduino Stream. */ class File32 : public StreamFile { public: - /** Opens the next file or folder in a directory. + /** Opens the next file or folder in a directory. * * \param[in] oflag open flags. * \return a FatStream object. @@ -1065,9 +1098,4 @@ class File32 : public StreamFile { return tmpFile; } }; - - -}; // namespace sdfat - - #endif // FatFile_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileLFN.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileLFN.cpp index ef069652..6844a573 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileLFN.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileLFN.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,260 +24,174 @@ */ #define DBG_FILE "FatFileLFN.cpp" #include "../common/DebugMacros.h" -#include "FatFile.h" -#include "FatVolume.h" - - -namespace sdfat { - - -//------------------------------------------------------------------------------ -// -uint8_t FatFile::lfnChecksum(uint8_t* name) { - uint8_t sum = 0; - for (uint8_t i = 0; i < 11; i++) { - sum = (((sum & 1) << 7) | ((sum & 0xfe) >> 1)) + name[i]; - } - return sum; -} +#include "../common/FsUtf.h" +#include "../common/upcase.h" +#include "FatLib.h" #if USE_LONG_FILE_NAMES //------------------------------------------------------------------------------ -// Saves about 90 bytes of flash on 328 over tolower(). -inline char lfnToLower(char c) { - return 'A' <= c && c <= 'Z' ? c + 'a' - 'A' : c; -} +static bool isLower(char c) { return 'a' <= c && c <= 'z'; } //------------------------------------------------------------------------------ -// Daniel Bernstein University of Illinois at Chicago. -// Original had + instead of ^ -static uint16_t Bernstein(uint16_t hash, const char *str, size_t len) { - for (size_t i = 0; i < len; i++) { - // hash = hash * 33 ^ str[i]; - hash = ((hash << 5) + hash) ^ str[i]; - } - return hash; -} +static bool isUpper(char c) { return 'A' <= c && c <= 'Z'; } //------------------------------------------------------------------------------ -/** - * Fetch a 16-bit long file name character. - * - * \param[in] ldir Pointer to long file name directory entry. - * \param[in] i Index of character. - * \return The 16-bit character. - */ -static uint16_t lfnGetChar(DirLfn_t* ldir, uint8_t i) { - if (i < 5) { - return getLe16(ldir->unicode1 + 2*i); - } else if (i < 11) { - return getLe16(ldir->unicode2 + 2*i - 10); - } else if (i < 13) { - return getLe16(ldir->unicode3 + 2*i - 22); - } - return 0; -} -//------------------------------------------------------------------------------ -static bool lfnGetName(DirLfn_t* ldir, char* name, size_t n) { - uint8_t i; - size_t k = 13*((ldir->order & 0X1F) - 1); - for (i = 0; i < 13; i++) { - uint16_t c = lfnGetChar(ldir, i); - if (c == 0 || k >= n) { - break; - } - name[k++] = c >= 0X7F ? '?' : c; - } - // Terminate with zero byte if name fits. - if (k < n && (ldir->order & FAT_ORDER_LAST_LONG_ENTRY)) { - name[k] = 0; - } - // Truncate if name is too long. - name[n - 1] = 0; - return true; -} -//------------------------------------------------------------------------------ -inline bool lfnLegalChar(uint8_t c) { - if (c == '/' || c == '\\' || c == '"' || c == '*' || - c == ':' || c == '<' || c == '>' || c == '?' || c == '|') { - return false; - } - return 0X1F < c && c < 0X7F; -} +// A bit smaller than toupper in AVR 328. +inline char toUpper(char c) { return isLower(c) ? c - 'a' + 'A' : c; } //------------------------------------------------------------------------------ /** * Store a 16-bit long file name character. * * \param[in] ldir Pointer to long file name directory entry. * \param[in] i Index of character. - * \param[in] c The 16-bit character. + * \param[in] c The 16-bit character. */ -static void lfnPutChar(DirLfn_t* ldir, uint8_t i, uint16_t c) { +static void putLfnChar(DirLfn_t* ldir, uint8_t i, uint16_t c) { if (i < 5) { - setLe16(ldir->unicode1 + 2*i, c); + setLe16(ldir->unicode1 + 2 * i, c); } else if (i < 11) { - setLe16(ldir->unicode2 + 2*i -10, c); + setLe16(ldir->unicode2 + 2 * (i - 5), c); } else if (i < 13) { - setLe16(ldir->unicode3 + 2*i - 22, c); - } -} -//------------------------------------------------------------------------------ -static void lfnPutName(DirLfn_t* ldir, const char* name, size_t n) { - size_t k = 13*((ldir->order & 0X1F) - 1); - for (uint8_t i = 0; i < 13; i++, k++) { - uint16_t c = k < n ? name[k] : k == n ? 0 : 0XFFFF; - lfnPutChar(ldir, i, c); + setLe16(ldir->unicode3 + 2 * (i - 11), c); } } //============================================================================== -bool FatFile::getName(char* name, size_t size) { - FatFile dirFile; +bool FatFile::cmpName(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { + // FatFile dir = *this; + FatFile dir; + dir.copy(this); DirLfn_t* ldir; - if (!isOpen() || size < 13) { - DBG_FAIL_MACRO; - goto fail; - } - if (!isLFN()) { - return getSFN(name); - } - if (!dirFile.openCluster(this)) { - DBG_FAIL_MACRO; - goto fail; - } - for (uint8_t order = 1; order <= m_lfnOrd; order++) { - if (!dirFile.seekSet(32UL*(m_dirIndex - order))) { - DBG_FAIL_MACRO; - goto fail; - } - ldir = reinterpret_cast(dirFile.readDirCache()); + fname->reset(); + for (uint8_t order = 1; order <= lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(index - order)); if (!ldir) { DBG_FAIL_MACRO; goto fail; } - if (ldir->attributes != FAT_ATTRIB_LONG_NAME) { - DBG_FAIL_MACRO; - goto fail; - } - if (order != (ldir->order & 0X1F)) { - DBG_FAIL_MACRO; - goto fail; - } - if (!lfnGetName(ldir, name, size)) { - DBG_FAIL_MACRO; - goto fail; - } - if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { - return true; + // These should be checked in caller. + DBG_HALT_IF(ldir->attributes != FAT_ATTRIB_LONG_NAME); + DBG_HALT_IF(order != (ldir->order & 0X1F)); + for (uint8_t i = 0; i < 13; i++) { + uint16_t u = getLfnChar(ldir, i); + if (fname->atEnd()) { + return u == 0; + } +#if USE_UTF8_LONG_NAMES + uint16_t cp = fname->get16(); + // Make sure caller checked for valid UTF-8. + DBG_HALT_IF(cp == 0XFFFF); + if (toUpcase(u) != toUpcase(cp)) { + return false; + } +#else // USE_UTF8_LONG_NAMES + if (u > 0X7F || toUpper(u) != toUpper(fname->getch())) { + return false; + } +#endif // USE_UTF8_LONG_NAMES } } - // Fall into fail. - DBG_FAIL_MACRO; + return true; - fail: - name[0] = 0; +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::openCluster(FatFile* file) { - if (file->m_dirCluster == 0) { - return openRoot(file->m_vol); +bool FatFile::createLFN(uint16_t index, FatLfn_t* fname, uint8_t lfnOrd) { + // FatFile dir = *this; + FatFile dir; + dir.copy(this); + DirLfn_t* ldir; + uint8_t checksum = lfnChecksum(fname->sfn); + uint8_t fc = 0; + fname->reset(); + + for (uint8_t order = 1; order <= lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(index - order)); + if (!ldir) { + DBG_FAIL_MACRO; + goto fail; + } + dir.m_vol->cacheDirty(); + ldir->order = order == lfnOrd ? FAT_ORDER_LAST_LONG_ENTRY | order : order; + ldir->attributes = FAT_ATTRIB_LONG_NAME; + ldir->mustBeZero1 = 0; + ldir->checksum = checksum; + setLe16(ldir->mustBeZero2, 0); + for (uint8_t i = 0; i < 13; i++) { + uint16_t cp; + if (fname->atEnd()) { + cp = fc++ ? 0XFFFF : 0; + } else { + cp = fname->get16(); + // Verify caller checked for valid UTF-8. + DBG_HALT_IF(cp == 0XFFFF); + } + putLfnChar(ldir, i, cp); + } } - memset(this, 0, sizeof(FatFile)); - m_attributes = FILE_ATTR_SUBDIR; - m_flags = FILE_FLAG_READ; - m_vol = file->m_vol; - m_firstCluster = file->m_dirCluster; return true; + +fail: + return false; } //------------------------------------------------------------------------------ -bool FatFile::parsePathName(const char* path, - fname_t* fname, const char** ptr) { - char c; +bool FatFile::makeSFN(FatLfn_t* fname) { bool is83; + // char c; + uint8_t c; uint8_t bit = FAT_CASE_LC_BASE; uint8_t lc = 0; uint8_t uc = 0; uint8_t i = 0; uint8_t in = 7; - int end; - int len = 0; - int si; - int dot; + const char* dot; + const char* end = fname->end; + const char* ptr = fname->begin; - // Skip leading spaces. - while (*path == ' ') { - path++; - } - fname->lfn = path; + // Assume not zero length. + DBG_HALT_IF(end == ptr); + // Assume blanks removed from start and end. + DBG_HALT_IF(*ptr == ' ' || *(end - 1) == ' ' || *(end - 1) == '.'); - for (len = 0; ; len++) { - c = path[len]; - if (c == 0 || isDirSeparator(c)) { - break; - } - if (!lfnLegalChar(c)) { - DBG_FAIL_MACRO; - goto fail; - } - } - // Advance to next path component. - for (end = len; path[end] == ' ' || isDirSeparator(path[end]); end++) {} - *ptr = &path[end]; - - // Back over spaces and dots. - while (len) { - c = path[len - 1]; - if (c != '.' && c != ' ') { - break; - } - len--; - } - // Max length of LFN is 255. - if (len > 255) { - DBG_FAIL_MACRO; - goto fail; - } - fname->len = len; // Blank file short name. for (uint8_t k = 0; k < 11; k++) { fname->sfn[k] = ' '; } - // skip leading spaces and dots. - for (si = 0; path[si] == '.' || path[si] == ' '; si++) {} - // Not 8.3 if leading dot or space. - is83 = !si; + // Not 8.3 if starts with dot. + is83 = *ptr == '.' ? false : true; + // Skip leading dots. + for (; *ptr == '.'; ptr++) { + } + // Find last dot. + for (dot = end - 1; dot > ptr && *dot != '.'; dot--) { + } - // find last dot. - for (dot = len - 1; dot >= 0 && path[dot] != '.'; dot--) {} - for (; si < len; si++) { - c = path[si]; - if (c == ' ' || (c == '.' && dot != si)) { - is83 = false; - continue; - } - if (!legal83Char(c) && si != dot) { - is83 = false; - c = '_'; - } - if (si == dot || i > in) { - if (in == 10) { - // Done - extension longer than three characters. - is83 = false; - break; - } - if (si != dot) { - is83 = false; - } - // Break if no dot and base-name is longer than eight characters. - if (si > dot) { - break; - } - si = dot; - in = 10; // Max index for full 8.3 name. - i = 8; // Place for extension. + for (; ptr < end; ptr++) { + c = *ptr; + if (c == '.' && ptr == dot) { + in = 10; // Max index for full 8.3 name. + i = 8; // Place for extension. bit = FAT_CASE_LC_EXT; // bit for extension. } else { - if ('a' <= c && c <= 'z') { + if (sfnReservedChar(c)) { + is83 = false; + // Skip UTF-8 trailing characters. + if ((c & 0XC0) == 0X80) { + continue; + } + c = '_'; + } + if (i > in) { + is83 = false; + if (in == 10 || ptr > dot) { + // Done - extension longer than three characters or no extension. + break; + } + // Skip to dot. + ptr = dot - 1; + continue; + } + if (isLower(c)) { c += 'A' - 'a'; lc |= bit; - } else if ('A' <= c && c <= 'Z') { + } else if (isUpper(c)) { uc |= bit; } fname->sfn[i++] = c; @@ -287,12 +201,11 @@ bool FatFile::parsePathName(const char* path, } } if (fname->sfn[0] == ' ') { - DBG_FAIL_MACRO; + DBG_HALT_MACRO; goto fail; } - if (is83) { - fname->flags = lc & uc ? FNAME_FLAG_MIXED_CASE : lc; + fname->flags = (lc & uc) ? FNAME_FLAG_MIXED_CASE : lc; } else { fname->flags = FNAME_FLAG_LOST_CHARS; fname->sfn[fname->seqPos] = '~'; @@ -300,37 +213,91 @@ bool FatFile::parsePathName(const char* path, } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { +bool FatFile::makeUniqueSfn(FatLfn_t* fname) { + const uint8_t FIRST_HASH_SEQ = 2; // min value is 2 + uint8_t pos = fname->seqPos; + DirFat_t* dir; + uint16_t hex = 0; + + DBG_HALT_IF(!(fname->flags & FNAME_FLAG_LOST_CHARS)); + DBG_HALT_IF(fname->sfn[pos] != '~' && fname->sfn[pos + 1] != '1'); + + for (uint8_t seq = FIRST_HASH_SEQ; seq < 100; seq++) { + DBG_WARN_IF(seq > FIRST_HASH_SEQ); + hex += millis(); + if (pos > 3) { + // Make space in name for ~HHHH. + pos = 3; + } + for (uint8_t i = pos + 4; i > pos; i--) { + uint8_t h = hex & 0XF; + fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; + hex >>= 4; + } + fname->sfn[pos] = '~'; + rewind(); + while (1) { + dir = readDirCache(true); + if (!dir) { + if (!getError()) { + // At EOF and name not found if no error. + goto done; + } + DBG_FAIL_MACRO; + goto fail; + } + if (dir->name[0] == FAT_NAME_FREE) { + goto done; + } + if (isFatFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { + // Name found - try another. + break; + } + } + } + // fall inti fail - too many tries. + DBG_FAIL_MACRO; + +fail: + return false; + +done: + return true; +} +//------------------------------------------------------------------------------ +bool FatFile::open(FatFile* dirFile, FatLfn_t* fname, oflag_t oflag) { bool fnameFound = false; uint8_t lfnOrd = 0; - uint8_t freeNeed; uint8_t freeFound = 0; + uint8_t freeNeed; uint8_t order = 0; uint8_t checksum = 0; uint8_t ms10; - uint16_t freeIndex = 0; + uint8_t nameOrd; uint16_t curIndex; uint16_t date; + uint16_t freeIndex = 0; + uint16_t freeTotal; uint16_t time; DirFat_t* dir; DirLfn_t* ldir; - size_t len = fname->len; + auto vol = dirFile->m_vol; if (!dirFile->isDir() || isOpen()) { DBG_FAIL_MACRO; goto fail; } // Number of directory entries needed. - freeNeed = fname->flags & FNAME_FLAG_NEED_LFN ? 1 + (len + 12)/13 : 1; - + nameOrd = (fname->len + 12) / 13; + freeNeed = (fname->flags & FNAME_FLAG_NEED_LFN) ? 1 + nameOrd : 1; dirFile->rewind(); while (1) { - curIndex = dirFile->m_curPosition/32; - dir = dirFile->readDirCache(true); + curIndex = dirFile->m_curPosition / FS_DIR_SIZE; + dir = dirFile->readDirCache(); if (!dir) { if (dirFile->getError()) { DBG_FAIL_MACRO; @@ -357,40 +324,26 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { // skip empty slot or '.' or '..' if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == '.') { lfnOrd = 0; - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (!lfnOrd) { - if ((ldir->order & FAT_ORDER_LAST_LONG_ENTRY) == 0) { + order = ldir->order & 0X1F; + if (order != nameOrd || + (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) == 0) { continue; } - lfnOrd = order = ldir->order & 0X1F; + lfnOrd = nameOrd; checksum = ldir->checksum; } else if (ldir->order != --order || checksum != ldir->checksum) { lfnOrd = 0; continue; } - size_t k = 13*(order - 1); - if (k >= len) { - // Not found. - lfnOrd = 0; - continue; - } - for (uint8_t i = 0; i < 13; i++) { - uint16_t u = lfnGetChar(ldir, i); - if (k == len) { - if (u != 0) { - // Not found. - lfnOrd = 0; - } - break; - } - if (u > 255 || lfnToLower(u) != lfnToLower(fname->lfn[k++])) { - // Not found. + if (order == 1) { + if (!dirFile->cmpName(curIndex + 1, fname, lfnOrd)) { lfnOrd = 0; - break; } } - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (lfnOrd) { if (1 == order && lfnChecksum(dir->name) == checksum) { goto found; @@ -409,7 +362,7 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } } - found: +found: // Don't open if create only. if (oflag & O_EXCL) { DBG_FAIL_MACRO; @@ -417,17 +370,16 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } goto open; - create: +create: // don't create unless O_CREAT and write mode if (!(oflag & O_CREAT) || !isWriteMode(oflag)) { - DBG_FAIL_MACRO; + DBG_WARN_MACRO; goto fail; } - // If at EOF start in next cluster. + // Keep found entries or start at current index if no free entries found. if (freeFound == 0) { freeIndex = curIndex; } - while (freeFound < freeNeed) { dir = dirFile->readDirCache(); if (!dir) { @@ -440,44 +392,28 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } freeFound++; } - while (freeFound < freeNeed) { + // Loop handles the case of huge filename and cluster size one. + freeTotal = freeFound; + while (freeTotal < freeNeed) { // Will fail if FAT16 root. if (!dirFile->addDirCluster()) { DBG_FAIL_MACRO; goto fail; } - // Done if more than one sector per cluster. Max freeNeed is 21. - if (dirFile->m_vol->sectorsPerCluster() > 1) { - break; - } - freeFound += 16; + // 16-bit freeTotal needed for large cluster size. + freeTotal += vol->dirEntriesPerCluster(); } if (fnameFound) { - if (!dirFile->lfnUniqueSfn(fname)) { + if (!dirFile->makeUniqueSfn(fname)) { goto fail; } } - if (!dirFile->seekSet(32UL*freeIndex)) { - DBG_FAIL_MACRO; - goto fail; - } lfnOrd = freeNeed - 1; - for (order = lfnOrd ; order ; order--) { - ldir = reinterpret_cast(dirFile->readDirCache()); - if (!ldir) { - DBG_FAIL_MACRO; - goto fail; - } - dirFile->m_vol->cacheDirty(); - ldir->order = order == lfnOrd ? FAT_ORDER_LAST_LONG_ENTRY | order : order; - ldir->attributes = FAT_ATTRIB_LONG_NAME; - ldir->mustBeZero1 = 0; - ldir->checksum = lfnChecksum(fname->sfn); - setLe16(ldir->mustBeZero2, 0); - lfnPutName(ldir, fname->lfn, len); + curIndex = freeIndex + lfnOrd; + if (!dirFile->createLFN(curIndex, fname, lfnOrd)) { + goto fail; } - curIndex = dirFile->m_curPosition/32; - dir = dirFile->readDirCache(); + dir = dirFile->cacheDir(curIndex); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -487,7 +423,7 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { memcpy(dir->name, fname->sfn, 11); // Set base-name and extension lower case bits. - dir->caseFlags = (FAT_CASE_LC_BASE | FAT_CASE_LC_EXT) & fname->flags; + dir->caseFlags = (FAT_CASE_LC_BASE | FAT_CASE_LC_EXT) & fname->flags; // Set timestamps. if (FsDateTime::callback) { @@ -506,9 +442,9 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } } // Force write of entry to device. - dirFile->m_vol->cacheDirty(); + vol->cacheDirty(); - open: +open: // open entry in cache. if (!openCachedEntry(dirFile, curIndex, oflag, lfnOrd)) { DBG_FAIL_MACRO; @@ -516,55 +452,59 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -size_t FatFile::printName(print_t* pr) { - FatFile dirFile; - DirLfn_t* ldir; - size_t n = 0; - uint16_t u; - uint8_t buf[13]; - uint8_t i; - - if (!isLFN()) { - return printSFN(pr); +bool FatFile::parsePathName(const char* path, FatLfn_t* fname, + const char** ptr) { + size_t len = 0; + // Skip leading spaces. + while (*path == ' ') { + path++; } - if (!dirFile.openCluster(this)) { + fname->begin = path; + fname->len = 0; + while (*path && !isDirSeparator(*path)) { +#if USE_UTF8_LONG_NAMES + uint32_t cp; + // Allow end = path + 4 since path is zero terminated. + path = FsUtf::mbToCp(path, path + 4, &cp); + if (!path) { + DBG_FAIL_MACRO; + goto fail; + } + len += cp <= 0XFFFF ? 1 : 2; + if (cp < 0X80 && lfnReservedChar(cp)) { + DBG_FAIL_MACRO; + goto fail; + } +#else // USE_UTF8_LONG_NAMES + uint8_t cp = *path++; + if (cp >= 0X80 || lfnReservedChar(cp)) { + DBG_FAIL_MACRO; + goto fail; + } + len++; +#endif // USE_UTF8_LONG_NAMES + if (cp != '.' && cp != ' ') { + // Need to trim trailing dots spaces. + fname->len = len; + fname->end = path; + } + } + if (!fname->len || fname->len > FAT_MAX_LFN_LENGTH) { DBG_FAIL_MACRO; goto fail; } - for (uint8_t order = 1; order <= m_lfnOrd; order++) { - if (!dirFile.seekSet(32UL*(m_dirIndex - order))) { - DBG_FAIL_MACRO; - goto fail; - } - ldir = reinterpret_cast(dirFile.readDirCache()); - if (!ldir) { - DBG_FAIL_MACRO; - goto fail; - } - if (ldir->attributes != FAT_ATTRIB_LONG_NAME || - order != (ldir->order & 0X1F)) { - DBG_FAIL_MACRO; - goto fail; - } - for (i = 0; i < 13; i++) { - u = lfnGetChar(ldir, i); - if (u == 0) { - // End of name. - break; - } - buf[i] = u < 0X7F ? u : '?'; - n++; - } - pr->write(buf, i); + // Advance to next path component. + for (; *path == ' ' || isDirSeparator(*path); path++) { } - return n; + *ptr = path; + return makeSFN(fname); - fail: - return 0; +fail: + return false; } //------------------------------------------------------------------------------ bool FatFile::remove() { @@ -585,7 +525,7 @@ bool FatFile::remove() { goto fail; } // Cache directory entry. - dir = cacheDirEntry(FatCache::CACHE_FOR_WRITE); + dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -613,18 +553,13 @@ bool FatFile::remove() { goto fail; } for (uint8_t order = 1; order <= m_lfnOrd; order++) { - if (!dirFile.seekSet(32UL*(m_dirIndex - order))) { - DBG_FAIL_MACRO; - goto fail; - } - ldir = reinterpret_cast(dirFile.readDirCache()); + ldir = reinterpret_cast(dirFile.cacheDir(m_dirIndex - order)); if (!ldir) { DBG_FAIL_MACRO; goto fail; } if (ldir->attributes != FAT_ATTRIB_LONG_NAME || - order != (ldir->order & 0X1F) || - checksum != ldir->checksum) { + order != (ldir->order & 0X1F) || checksum != ldir->checksum) { DBG_FAIL_MACRO; goto fail; } @@ -642,66 +577,7 @@ bool FatFile::remove() { // Fall into fail. DBG_FAIL_MACRO; - fail: +fail: return false; } -//------------------------------------------------------------------------------ -bool FatFile::lfnUniqueSfn(fname_t* fname) { - const uint8_t FIRST_HASH_SEQ = 2; // min value is 2 - uint8_t pos = fname->seqPos;; - DirFat_t* dir; - uint16_t hex; - - DBG_HALT_IF(!(fname->flags & FNAME_FLAG_LOST_CHARS)); - DBG_HALT_IF(fname->sfn[pos] != '~' && fname->sfn[pos + 1] != '1'); - - for (uint8_t seq = 2; seq < 100; seq++) { - if (seq < FIRST_HASH_SEQ) { - fname->sfn[pos + 1] = '0' + seq; - } else { - DBG_PRINT_IF(seq > FIRST_HASH_SEQ); - hex = Bernstein(seq + fname->len, fname->lfn, fname->len); - if (pos > 3) { - // Make space in name for ~HHHH. - pos = 3; - } - for (uint8_t i = pos + 4 ; i > pos; i--) { - uint8_t h = hex & 0XF; - fname->sfn[i] = h < 10 ? h + '0' : h + 'A' - 10; - hex >>= 4; - } - } - fname->sfn[pos] = '~'; - rewind(); - while (1) { - dir = readDirCache(true); - if (!dir) { - if (!getError()) { - // At EOF and name not found if no error. - goto done; - } - DBG_FAIL_MACRO; - goto fail; - } - if (dir->name[0] == FAT_NAME_FREE) { - goto done; - } - if (isFileOrSubdir(dir) && !memcmp(fname->sfn, dir->name, 11)) { - // Name found - try another. - break; - } - } - } - // fall inti fail - too many tries. - DBG_FAIL_MACRO; - - fail: - return false; - - done: - return true; -} #endif // #if USE_LONG_FILE_NAMES - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFilePrint.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFilePrint.cpp index 7b19292f..34f65946 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFilePrint.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFilePrint.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,62 +25,8 @@ #include #define DBG_FILE "FatFilePrint.cpp" #include "../common/DebugMacros.h" -#include "FatFile.h" +#include "FatLib.h" - -namespace sdfat { - - -//------------------------------------------------------------------------------ -static void printHex(print_t* pr, uint8_t w, uint16_t h) { - char buf[5]; - char* ptr = buf + sizeof(buf); - *--ptr = 0; - for (uint8_t i = 0; i < w; i++) { - char c = h & 0XF; - *--ptr = c < 10 ? c + '0' : c + 'A' - 10; - h >>= 4; - } - pr->write(ptr); -} -//------------------------------------------------------------------------------ -void FatFile::dmpFile(print_t* pr, uint32_t pos, size_t n) { - char text[17]; - text[16] = 0; - if (n >= 0XFFF0) { - n = 0XFFF0; - } - if (!seekSet(pos)) { - return; - } - for (size_t i = 0; i <= n; i++) { - if ((i & 15) == 0) { - if (i) { - pr->write(' '); - pr->write(text); - if (i == n) { - break; - } - } - pr->write('\r'); - pr->write('\n'); - if (i >= n) { - break; - } - printHex(pr, 4, i); - pr->write(' '); - } - int16_t h = read(); - if (h < 0) { - break; - } - pr->write(' '); - printHex(pr, 2, h); - text[i&15] = ' ' <= h && h < 0X7F ? h : '.'; - } - pr->write('\r'); - pr->write('\n'); -} //------------------------------------------------------------------------------ bool FatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) { FatFile file; @@ -121,7 +67,7 @@ bool FatFile::ls(print_t* pr, uint8_t flags, uint8_t indent) { } return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -153,7 +99,7 @@ size_t FatFile::printModifyDateTime(print_t* pr) { //------------------------------------------------------------------------------ size_t FatFile::printFileSize(print_t* pr) { char buf[11]; - char *ptr = buf + sizeof(buf); + char* ptr = buf + sizeof(buf); *--ptr = 0; ptr = fmtBase10(ptr, fileSize()); while (ptr > buf) { @@ -161,6 +107,3 @@ size_t FatFile::printFileSize(print_t* pr) { } return pr->write(buf); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileSFN.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileSFN.cpp index 11697038..3a5f6934 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileSFN.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFileSFN.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,132 +24,11 @@ */ #define DBG_FILE "FatFileSFN.cpp" #include "../common/DebugMacros.h" -#include "../common/FsStructs.h" -#include "FatFile.h" -#include "FatVolume.h" - - -namespace sdfat { - - -//------------------------------------------------------------------------------ -bool FatFile::getSFN(char* name) { - uint8_t j = 0; - uint8_t lcBit = FAT_CASE_LC_BASE; - DirFat_t* dir; - - if (!isOpen()) { - DBG_FAIL_MACRO; - goto fail; - } - if (isRoot()) { - name[0] = '/'; - name[1] = '\0'; - return true; - } - // cache entry - dir = reinterpret_cast(cacheDirEntry(FatCache::CACHE_FOR_READ)); - if (!dir) { - DBG_FAIL_MACRO; - goto fail; - } - // format name - for (uint8_t i = 0; i < 11; i++) { - if (dir->name[i] == ' ') { - continue; - } - if (i == 8) { - // Position bit for extension. - lcBit = FAT_CASE_LC_EXT; - name[j++] = '.'; - } - char c = dir->name[i]; - if ('A' <= c && c <= 'Z' && (lcBit & dir->caseFlags)) { - c += 'a' - 'A'; - } - name[j++] = c; - } - name[j] = 0; - return true; - - fail: - return false; -} -//------------------------------------------------------------------------------ -size_t FatFile::printSFN(print_t* pr) { - char name[13]; - if (!getSFN(name)) { - DBG_FAIL_MACRO; - goto fail; - } - return pr->write(name); - - fail: - return 0; -} -#if !USE_LONG_FILE_NAMES -//------------------------------------------------------------------------------ -bool FatFile::getName(char* name, size_t size) { - return size < 13 ? 0 : getSFN(name); -} -//------------------------------------------------------------------------------ -// format directory name field from a 8.3 name string -bool FatFile::parsePathName(const char* path, fname_t* fname, - const char** ptr) { - uint8_t uc = 0; - uint8_t lc = 0; - uint8_t bit = FNAME_FLAG_LC_BASE; - // blank fill name and extension - for (uint8_t i = 0; i < 11; i++) { - fname->sfn[i] = ' '; - } - - for (uint8_t i = 0, n = 7;; path++) { - uint8_t c = *path; - if (c == 0 || isDirSeparator(c)) { - // Done. - break; - } - if (c == '.' && n == 7) { - n = 10; // max index for full 8.3 name - i = 8; // place for extension - - // bit for extension. - bit = FNAME_FLAG_LC_EXT; - } else { - if (!legal83Char(c) || i > n) { - DBG_FAIL_MACRO; - goto fail; - } - if ('a' <= c && c <= 'z') { - c += 'A' - 'a'; - lc |= bit; - } else if ('A' <= c && c <= 'Z') { - uc |= bit; - } - fname->sfn[i++] = c; - } - } - // must have a file name, extension is optional - if (fname->sfn[0] == ' ') { - DBG_FAIL_MACRO; - goto fail; - } - // Set base-name and extension bits. - fname->flags = lc & uc ? 0 : lc; - while (isDirSeparator(*path)) { - path++; - } - *ptr = path; - return true; - - fail: - return false; -} +#include "FatLib.h" //------------------------------------------------------------------------------ // open with filename in fname #define SFN_OPEN_USES_CHKSUM 0 -bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { +bool FatFile::open(FatFile* dirFile, FatSfn_t* fname, oflag_t oflag) { uint16_t date; uint16_t time; uint8_t ms10; @@ -158,33 +37,32 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { uint8_t checksum; #endif // SFN_OPEN_USES_CHKSUM uint8_t lfnOrd = 0; - uint16_t emptyIndex; + uint16_t emptyIndex = 0; uint16_t index = 0; DirFat_t* dir; DirLfn_t* ldir; dirFile->rewind(); - while (1) { - if (!emptyFound) { - emptyIndex = index; - } - dir = reinterpret_cast(dirFile->readDirCache(true)); + while (true) { + dir = dirFile->readDirCache(true); if (!dir) { - if (dirFile->getError()) { + if (dirFile->getError()) { DBG_FAIL_MACRO; goto fail; } // At EOF if no error. break; } - if (dir->name[0] == FAT_NAME_FREE) { - emptyFound = true; - break; - } - if (dir->name[0] == FAT_NAME_DELETED) { + if (dir->name[0] == FAT_NAME_DELETED || dir->name[0] == FAT_NAME_FREE) { + if (!emptyFound) { + emptyIndex = index; + emptyFound = true; + } + if (dir->name[0] == FAT_NAME_FREE) { + break; + } lfnOrd = 0; - emptyFound = true; - } else if (isFileOrSubdir(dir)) { + } else if (isFatFileOrSubdir(dir)) { if (!memcmp(fname->sfn, dir->name, 11)) { // don't open existing file if O_EXCL if (oflag & O_EXCL) { @@ -205,7 +83,7 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { } else { lfnOrd = 0; } - } else if (isLongName(dir)) { + } else if (isFatLongName(dir)) { ldir = reinterpret_cast(dir); if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { lfnOrd = ldir->order & 0X1F; @@ -231,11 +109,7 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { goto fail; } } - if (!dirFile->seekSet(32UL*index)) { - DBG_FAIL_MACRO; - goto fail; - } - dir = reinterpret_cast(dirFile->readDirCache()); + dir = reinterpret_cast(dirFile->cacheDir(index)); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -269,14 +143,145 @@ bool FatFile::open(FatFile* dirFile, fname_t* fname, oflag_t oflag) { // open entry in cache. return openCachedEntry(dirFile, index, oflag, 0); - fail: +fail: return false; } //------------------------------------------------------------------------------ -size_t FatFile::printName(print_t* pr) { - return printSFN(pr); +bool FatFile::openExistingSFN(const char* path) { + FatSfn_t fname; + auto vol = FatVolume::cwv(); + while (*path == '/') { + path++; + } + if (*path == 0) { + return openRoot(vol); + } + // *this = *vol->vwd(); + this->copy(vol->vwd()); + do { + if (!parsePathName(path, &fname, &path)) { + DBG_FAIL_MACRO; + goto fail; + } + if (!openSFN(&fname)) { + DBG_FAIL_MACRO; + goto fail; + } + } while (*path); + return true; + +fail: + return false; } //------------------------------------------------------------------------------ +bool FatFile::openSFN(FatSfn_t* fname) { + DirFat_t dir; + DirLfn_t* ldir; + auto vol = m_vol; + uint8_t lfnOrd = 0; + if (!isDir()) { + DBG_FAIL_MACRO; + goto fail; + } + while (true) { + if (read(&dir, sizeof(dir)) != sizeof(dir)) { + DBG_FAIL_MACRO; + goto fail; + } + if (dir.name[0] == 0) { + DBG_FAIL_MACRO; + goto fail; + } + if (isFatFileOrSubdir(&dir) && memcmp(fname->sfn, dir.name, 11) == 0) { + uint16_t saveDirIndex = (m_curPosition - sizeof(dir)) >> 5; + uint32_t saveDirCluster = m_firstCluster; + memset(this, 0, sizeof(FatFile)); + m_attributes = dir.attributes & FS_ATTRIB_COPY; + m_flags = FILE_FLAG_READ; + if (isFatFile(&dir)) { + m_attributes |= FILE_ATTR_FILE; + if (!isReadOnly()) { + m_attributes |= FS_ATTRIB_ARCHIVE; + m_flags |= FILE_FLAG_WRITE; + } + } + m_lfnOrd = lfnOrd; + m_firstCluster = (uint32_t)getLe16(dir.firstClusterHigh) << 16; + m_firstCluster |= getLe16(dir.firstClusterLow); + m_fileSize = getLe32(dir.fileSize); + m_vol = vol; + m_dirCluster = saveDirCluster; + m_dirSector = m_vol->cacheSectorNumber(); + m_dirIndex = saveDirIndex; + return true; + } else if (isFatLongName(&dir)) { + ldir = reinterpret_cast(&dir); + if (ldir->order & FAT_ORDER_LAST_LONG_ENTRY) { + lfnOrd = ldir->order & 0X1F; + } + } else { + lfnOrd = 0; + } + } + +fail: + return false; +} +//------------------------------------------------------------------------------ +// format directory name field from a 8.3 name string +bool FatFile::parsePathName(const char* path, FatSfn_t* fname, + const char** ptr) { + uint8_t uc = 0; + uint8_t lc = 0; + uint8_t bit = FNAME_FLAG_LC_BASE; + // blank fill name and extension + for (uint8_t i = 0; i < 11; i++) { + fname->sfn[i] = ' '; + } + for (uint8_t i = 0, n = 7;; path++) { + uint8_t c = *path; + if (c == 0 || isDirSeparator(c)) { + // Done. + break; + } + if (c == '.' && n == 7) { + n = 10; // max index for full 8.3 name + i = 8; // place for extension + + // bit for extension. + bit = FNAME_FLAG_LC_EXT; + } else { + if (sfnReservedChar(c) || i > n) { + DBG_FAIL_MACRO; + goto fail; + } + if ('a' <= c && c <= 'z') { + c += 'A' - 'a'; + lc |= bit; + } else if ('A' <= c && c <= 'Z') { + uc |= bit; + } + fname->sfn[i++] = c; + } + } + // must have a file name, extension is optional + if (fname->sfn[0] == ' ') { + DBG_FAIL_MACRO; + goto fail; + } + // Set base-name and extension bits. + fname->flags = (lc & uc) ? 0 : lc; + while (isDirSeparator(*path)) { + path++; + } + *ptr = path; + return true; + +fail: + return false; +} +#if !USE_LONG_FILE_NAMES +//------------------------------------------------------------------------------ bool FatFile::remove() { DirFat_t* dir; // Can't remove if LFN or not open for write. @@ -290,7 +295,7 @@ bool FatFile::remove() { goto fail; } // Cache directory entry. - dir = reinterpret_cast(cacheDirEntry(FatCache::CACHE_FOR_WRITE)); + dir = cacheDirEntry(FsCache::CACHE_FOR_WRITE); if (!dir) { DBG_FAIL_MACRO; goto fail; @@ -305,10 +310,7 @@ bool FatFile::remove() { // Write entry to device. return m_vol->cacheSync(); - fail: +fail: return false; } #endif // !USE_LONG_FILE_NAMES - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.cpp index c476bfbc..5ea5b4be 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,41 +22,38 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "FatFormatter.h" - - -namespace sdfat { - - +#include "FatLib.h" // Set nonzero to use calculated CHS in MBR. Should not be required. -#define USE_LBA_TO_CHS 0 +#define USE_LBA_TO_CHS 1 // Constants for file system structure optimized for flash. uint16_t const BU16 = 128; uint16_t const BU32 = 8192; // Assume 512 byte sectors. const uint16_t BYTES_PER_SECTOR = 512; -const uint16_t SECTORS_PER_MB = 0X100000/BYTES_PER_SECTOR; +const uint16_t SECTORS_PER_MB = 0X100000 / BYTES_PER_SECTOR; const uint16_t FAT16_ROOT_ENTRY_COUNT = 512; const uint16_t FAT16_ROOT_SECTOR_COUNT = - 32*FAT16_ROOT_ENTRY_COUNT/BYTES_PER_SECTOR; + 32 * FAT16_ROOT_ENTRY_COUNT / BYTES_PER_SECTOR; //------------------------------------------------------------------------------ #define PRINT_FORMAT_PROGRESS 1 #if !PRINT_FORMAT_PROGRESS #define writeMsg(str) #elif defined(__AVR__) -#define writeMsg(str) if (m_pr) m_pr->print(F(str)) +#define writeMsg(str) \ + if (m_pr) m_pr->print(F(str)) #else // PRINT_FORMAT_PROGRESS -#define writeMsg(str) if (m_pr) m_pr->write(str) +#define writeMsg(str) \ + if (m_pr) m_pr->write(str) #endif // PRINT_FORMAT_PROGRESS //------------------------------------------------------------------------------ -bool FatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { +bool FatFormatter::format(FsBlockDevice* dev, uint8_t* secBuf, print_t* pr) { bool rtn; m_dev = dev; m_secBuf = secBuf; m_pr = pr; m_sectorCount = m_dev->sectorCount(); - m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1)/SECTORS_PER_MB; + m_capacityMB = (m_sectorCount + SECTORS_PER_MB - 1) / SECTORS_PER_MB; if (m_capacityMB <= 6) { writeMsg("Card is too small.\r\n"); @@ -77,7 +74,7 @@ bool FatFormatter::format(BlockDevice* dev, uint8_t* secBuf, print_t* pr) { // SDXC cards m_sectorsPerCluster = 128; } - rtn = m_sectorCount < 0X400000 ? makeFat16() :makeFat32(); + rtn = m_sectorCount < 0X400000 ? makeFat16() : makeFat32(); if (rtn) { writeMsg("Format Done\r\n"); } else { @@ -92,9 +89,9 @@ bool FatFormatter::initFatDir(uint8_t fatType, uint32_t sectorCount) { writeMsg("Writing FAT "); for (uint32_t i = 1; i < sectorCount; i++) { if (!m_dev->writeSector(m_fatStart + i, m_secBuf)) { - return false; + return false; } - if ((i%(sectorCount/32)) == 0) { + if ((i % (sectorCount / 32)) == 0) { writeMsg("."); } } @@ -136,13 +133,12 @@ void FatFormatter::initPbs() { //------------------------------------------------------------------------------ bool FatFormatter::makeFat16() { uint32_t nc; - uint32_t r; PbsFat_t* pbs = reinterpret_cast(m_secBuf); - for (m_dataStart = 2*BU16; ; m_dataStart += BU16) { - nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; - m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/2) - 1)/(BYTES_PER_SECTOR/2); - r = BU16 + 1 + 2*m_fatSize + FAT16_ROOT_SECTOR_COUNT; + for (m_dataStart = 2 * BU16;; m_dataStart += BU16) { + nc = (m_sectorCount - m_dataStart) / m_sectorsPerCluster; + m_fatSize = (nc + 2 + (BYTES_PER_SECTOR / 2) - 1) / (BYTES_PER_SECTOR / 2); + uint32_t r = BU16 + 1 + 2 * m_fatSize + FAT16_ROOT_SECTOR_COUNT; if (m_dataStart >= r) { m_relativeSectors = m_dataStart - r + BU16; break; @@ -155,8 +151,8 @@ bool FatFormatter::makeFat16() { } m_reservedSectorCount = 1; m_fatStart = m_relativeSectors + m_reservedSectorCount; - m_totalSectors = nc*m_sectorsPerCluster - + 2*m_fatSize + m_reservedSectorCount + 32; + m_totalSectors = + nc * m_sectorsPerCluster + 2 * m_fatSize + m_reservedSectorCount + 32; if (m_totalSectors < 65536) { m_partType = 0X04; } else { @@ -188,15 +184,14 @@ bool FatFormatter::makeFat16() { //------------------------------------------------------------------------------ bool FatFormatter::makeFat32() { uint32_t nc; - uint32_t r; PbsFat_t* pbs = reinterpret_cast(m_secBuf); FsInfo_t* fsi = reinterpret_cast(m_secBuf); m_relativeSectors = BU32; - for (m_dataStart = 2*BU32; ; m_dataStart += BU32) { - nc = (m_sectorCount - m_dataStart)/m_sectorsPerCluster; - m_fatSize = (nc + 2 + (BYTES_PER_SECTOR/4) - 1)/(BYTES_PER_SECTOR/4); - r = m_relativeSectors + 9 + 2*m_fatSize; + for (m_dataStart = 2 * BU32;; m_dataStart += BU32) { + nc = (m_sectorCount - m_dataStart) / m_sectorsPerCluster; + m_fatSize = (nc + 2 + (BYTES_PER_SECTOR / 4) - 1) / (BYTES_PER_SECTOR / 4); + uint32_t r = m_relativeSectors + 9 + 2 * m_fatSize; if (m_dataStart >= r) { break; } @@ -206,9 +201,9 @@ bool FatFormatter::makeFat32() { writeMsg("Bad cluster count\r\n"); return false; } - m_reservedSectorCount = m_dataStart - m_relativeSectors - 2*m_fatSize; + m_reservedSectorCount = m_dataStart - m_relativeSectors - 2 * m_fatSize; m_fatStart = m_relativeSectors + m_reservedSectorCount; - m_totalSectors = nc*m_sectorsPerCluster + m_dataStart - m_relativeSectors; + m_totalSectors = nc * m_sectorsPerCluster + m_dataStart - m_relativeSectors; // type depends on address of end sector // max CHS has lba = 16450560 = 1024*255*63 if ((m_relativeSectors + m_totalSectors) <= 16450560) { @@ -237,14 +232,14 @@ bool FatFormatter::makeFat32() { pbs->bpb.bpb32.volumeType[2] = 'T'; pbs->bpb.bpb32.volumeType[3] = '3'; pbs->bpb.bpb32.volumeType[4] = '2'; - if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 6, m_secBuf)) { return false; } // write extra boot area and backup - memset(m_secBuf, 0 , BYTES_PER_SECTOR); + memset(m_secBuf, 0, BYTES_PER_SECTOR); setLe32(fsi->trailSignature, FSINFO_TRAIL_SIGNATURE); - if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors + 2, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 8, m_secBuf)) { return false; } @@ -253,11 +248,11 @@ bool FatFormatter::makeFat32() { setLe32(fsi->structSignature, FSINFO_STRUCT_SIGNATURE); setLe32(fsi->freeCount, 0XFFFFFFFF); setLe32(fsi->nextFree, 0XFFFFFFFF); - if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || + if (!m_dev->writeSector(m_relativeSectors + 1, m_secBuf) || !m_dev->writeSector(m_relativeSectors + 7, m_secBuf)) { return false; } - return initFatDir(32, 2*m_fatSize + m_sectorsPerCluster); + return initFatDir(32, 2 * m_fatSize + m_sectorsPerCluster); } //------------------------------------------------------------------------------ bool FatFormatter::writeMbr() { @@ -267,8 +262,8 @@ bool FatFormatter::writeMbr() { #if USE_LBA_TO_CHS lbaToMbrChs(mbr->part->beginCHS, m_capacityMB, m_relativeSectors); lbaToMbrChs(mbr->part->endCHS, m_capacityMB, - m_relativeSectors + m_totalSectors -1); -#else // USE_LBA_TO_CHS + m_relativeSectors + m_totalSectors - 1); +#else // USE_LBA_TO_CHS mbr->part->beginCHS[0] = 1; mbr->part->beginCHS[1] = 1; mbr->part->beginCHS[2] = 0; @@ -283,6 +278,3 @@ bool FatFormatter::writeMbr() { setLe16(mbr->signature, MBR_SIGNATURE); return m_dev->writeSector(0, m_secBuf); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.h index a572001a..d48a1fab 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,21 +24,16 @@ */ #ifndef FatFormatter_h #define FatFormatter_h -#include "FatFile.h" +#include "../common/FsBlockDevice.h" #include "../common/SysCall.h" -#include "../common/BlockDevice.h" -#include "../common/FsStructs.h" - - -namespace sdfat { - - /** * \class FatFormatter * \brief Format a FAT volume. */ class FatFormatter { public: + /** Constructor. */ + FatFormatter() = default; /** * Format a FAT volume. * @@ -48,7 +43,7 @@ class FatFormatter { * * \return true for success or false for failure. */ - bool format(BlockDevice* dev, uint8_t* secBuffer, print_t* pr = nullptr); + bool format(FsBlockDevice* dev, uint8_t* secBuffer, print_t* pr = nullptr); private: bool initFatDir(uint8_t fatType, uint32_t sectorCount); @@ -63,16 +58,11 @@ class FatFormatter { uint32_t m_relativeSectors; uint32_t m_sectorCount; uint32_t m_totalSectors; - BlockDevice* m_dev; - print_t*m_pr; + FsBlockDevice* m_dev; + print_t* m_pr; uint8_t* m_secBuf; uint16_t m_reservedSectorCount; uint8_t m_partType; uint8_t m_sectorsPerCluster; }; - - -}; // namespace sdfat - - #endif // FatFormatter_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLib.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLib.h index ceaa348c..057d4041 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLib.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,7 +24,6 @@ */ #ifndef FatLib_h #define FatLib_h -#include "FatVolume.h" -#include "FatLibConfig.h" #include "FatFormatter.h" +#include "FatVolume.h" #endif // FatLib_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatName.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatName.cpp new file mode 100644 index 00000000..4a4dbff2 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatName.cpp @@ -0,0 +1,356 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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 DBG_FILE "FatName.cpp" +#include "../common/DebugMacros.h" +#include "../common/FsUtf.h" +#include "FatLib.h" +//------------------------------------------------------------------------------ +uint16_t FatFile::getLfnChar(DirLfn_t* ldir, uint8_t i) { + if (i < 5) { + return getLe16(ldir->unicode1 + 2 * i); + } else if (i < 11) { + return getLe16(ldir->unicode2 + 2 * (i - 5)); + } else if (i < 13) { + return getLe16(ldir->unicode3 + 2 * (i - 11)); + } + DBG_HALT_IF(i >= 13); + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::getName(char* name, size_t size) { +#if !USE_LONG_FILE_NAMES + return getSFN(name, size); +#elif USE_UTF8_LONG_NAMES + return getName8(name, size); +#else + return getName7(name, size); +#endif // !USE_LONG_FILE_NAMES +} +//------------------------------------------------------------------------------ +size_t FatFile::getName7(char* name, size_t size) { + FatFile dir; + DirLfn_t* ldir; + size_t n = 0; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!isLFN()) { + return getSFN(name, size); + } + if (!dir.openCluster(this)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t order = 1; order <= m_lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(m_dirIndex - order)); + if (!ldir) { + DBG_FAIL_MACRO; + goto fail; + } + if (ldir->attributes != FAT_ATTRIB_LONG_NAME || + order != (ldir->order & 0X1F)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t i = 0; i < 13; i++) { + uint16_t c = getLfnChar(ldir, i); + if (c == 0) { + goto done; + } + if ((n + 1) >= size) { + DBG_FAIL_MACRO; + goto fail; + } + name[n++] = c >= 0X7F ? '?' : c; + } + } +done: + name[n] = 0; + return n; + +fail: + name[0] = '\0'; + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::getName8(char* name, size_t size) { + char* end = name + size; + char* str = name; + char* ptr; + FatFile dir; + DirLfn_t* ldir; + uint16_t hs = 0; + uint32_t cp; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!isLFN()) { + return getSFN(name, size); + } + if (!dir.openCluster(this)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t order = 1; order <= m_lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(m_dirIndex - order)); + if (!ldir) { + DBG_FAIL_MACRO; + goto fail; + } + if (ldir->attributes != FAT_ATTRIB_LONG_NAME || + order != (ldir->order & 0X1F)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t i = 0; i < 13; i++) { + uint16_t c = getLfnChar(ldir, i); + if (hs) { + if (!FsUtf::isLowSurrogate(c)) { + DBG_FAIL_MACRO; + goto fail; + } + cp = FsUtf::u16ToCp(hs, c); + hs = 0; + } else if (!FsUtf::isSurrogate(c)) { + if (c == 0) { + goto done; + } + cp = c; + } else if (FsUtf::isHighSurrogate(c)) { + hs = c; + continue; + } else { + DBG_FAIL_MACRO; + goto fail; + } + // Save space for zero byte. + ptr = FsUtf::cpToMb(cp, str, end - 1); + if (!ptr) { + DBG_FAIL_MACRO; + goto fail; + } + str = ptr; + } + } +done: + *str = '\0'; + return str - name; + +fail: + *name = 0; + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::getSFN(char* name, size_t size) { + char c; + uint8_t j = 0; + uint8_t lcBit = FAT_CASE_LC_BASE; + uint8_t* ptr; + DirFat_t* dir; + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (isRoot()) { + if (size < 2) { + DBG_FAIL_MACRO; + goto fail; + } + name[0] = '/'; + name[1] = '\0'; + return 1; + } + // cache entry + dir = cacheDirEntry(FsCache::CACHE_FOR_READ); + if (!dir) { + DBG_FAIL_MACRO; + goto fail; + } + ptr = dir->name; + // format name + for (uint8_t i = 0; i < 12; i++) { + if (i == 8) { + if (*ptr == ' ') { + break; + } + lcBit = FAT_CASE_LC_EXT; + c = '.'; + } else { + c = *ptr++; + if ('A' <= c && c <= 'Z' && (lcBit & dir->caseFlags)) { + c += 'a' - 'A'; + } + if (c == ' ') { + continue; + } + } + if ((j + 1u) >= size) { + DBG_FAIL_MACRO; + goto fail; + } + name[j++] = c; + } + name[j] = '\0'; + return j; + +fail: + name[0] = '\0'; + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::printName(print_t* pr) { +#if !USE_LONG_FILE_NAMES + return printSFN(pr); +#elif USE_UTF8_LONG_NAMES + return printName8(pr); +#else // USE_LONG_FILE_NAMES + return printName7(pr); +#endif // !USE_LONG_FILE_NAMES +} +//------------------------------------------------------------------------------ +size_t FatFile::printName7(print_t* pr) { + FatFile dir; + DirLfn_t* ldir; + size_t n = 0; + uint8_t buf[13]; + uint8_t i; + + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!isLFN()) { + return printSFN(pr); + } + if (!dir.openCluster(this)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t order = 1; order <= m_lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(m_dirIndex - order)); + if (!ldir) { + DBG_FAIL_MACRO; + goto fail; + } + if (ldir->attributes != FAT_ATTRIB_LONG_NAME || + order != (ldir->order & 0X1F)) { + DBG_FAIL_MACRO; + goto fail; + } + for (i = 0; i < 13; i++) { + uint16_t u = getLfnChar(ldir, i); + if (u == 0) { + // End of name. + break; + } + buf[i] = u < 0X7F ? u : '?'; + n++; + } + pr->write(buf, i); + } + return n; + +fail: + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::printName8(print_t* pr) { + FatFile dir; + DirLfn_t* ldir; + uint16_t hs = 0; + uint32_t cp; + size_t n = 0; + char buf[5]; + char* end = buf + sizeof(buf); + if (!isOpen()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!isLFN()) { + return printSFN(pr); + } + if (!dir.openCluster(this)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t order = 1; order <= m_lfnOrd; order++) { + ldir = reinterpret_cast(dir.cacheDir(m_dirIndex - order)); + if (!ldir) { + DBG_FAIL_MACRO; + goto fail; + } + if (ldir->attributes != FAT_ATTRIB_LONG_NAME || + order != (ldir->order & 0X1F)) { + DBG_FAIL_MACRO; + goto fail; + } + for (uint8_t i = 0; i < 13; i++) { + uint16_t c = getLfnChar(ldir, i); + if (hs) { + if (!FsUtf::isLowSurrogate(c)) { + DBG_FAIL_MACRO; + goto fail; + } + cp = FsUtf::u16ToCp(hs, c); + hs = 0; + } else if (!FsUtf::isSurrogate(c)) { + if (c == 0) { + break; + } + cp = c; + } else if (FsUtf::isHighSurrogate(c)) { + hs = c; + continue; + } else { + DBG_FAIL_MACRO; + goto fail; + } + char* str = FsUtf::cpToMb(cp, buf, end); + if (!str) { + DBG_FAIL_MACRO; + goto fail; + } + n += pr->write(reinterpret_cast(buf), str - buf); + } + } + return n; + +fail: + return 0; +} +//------------------------------------------------------------------------------ +size_t FatFile::printSFN(print_t* pr) { + char name[13]; + if (!getSFN(name, sizeof(name))) { + DBG_FAIL_MACRO; + goto fail; + } + return pr->write(name); + +fail: + return 0; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.cpp index 53304de1..f6d20437 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,58 +25,7 @@ #include #define DBG_FILE "FatPartition.cpp" #include "../common/DebugMacros.h" -#include "../common/FsStructs.h" -#include "FatPartition.h" - - -namespace sdfat { - - -//------------------------------------------------------------------------------ -cache_t* FatCache::read(uint32_t sector, uint8_t option) { - if (m_lbn != sector) { - if (!sync()) { - DBG_FAIL_MACRO; - goto fail; - } - if (!(option & CACHE_OPTION_NO_READ)) { - if (!m_part->readSector(sector, m_buffer.data)) { - DBG_FAIL_MACRO; - goto fail; - } - } - m_status = 0; - m_lbn = sector; - } - m_status |= option & CACHE_STATUS_MASK; - return &m_buffer; - - fail: - - return nullptr; -} -//------------------------------------------------------------------------------ -bool FatCache::sync() { - if (m_status & CACHE_STATUS_DIRTY) { - if (!m_part->writeSector(m_lbn, m_buffer.data)) { - DBG_FAIL_MACRO; - goto fail; - } - // mirror second FAT - if (m_status & CACHE_STATUS_MIRROR_FAT) { - uint32_t sector = m_lbn + m_part->sectorsPerFat(); - if (!m_part->writeSector(sector, m_buffer.data)) { - DBG_FAIL_MACRO; - goto fail; - } - } - m_status &= ~CACHE_STATUS_DIRTY; - } - return true; - - fail: - return false; -} +#include "FatLib.h" //------------------------------------------------------------------------------ bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { uint32_t find; @@ -89,15 +38,7 @@ bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { find = m_allocSearchStart; setStart = true; } - // Following loop may iterate over up to 268 million clusters, so we need to allow - // the OS/hardware to do its work occasionally during the search or a WDT error will - // occur on the ESP8266. - int yieldCnt = 5000; while (1) { - if (!(--yieldCnt)) { - yieldCnt = 5000; - SysCall::yield(); - } find++; if (find > m_lastCluster) { if (setStart) { @@ -143,7 +84,7 @@ bool FatPartition::allocateCluster(uint32_t current, uint32_t* next) { *next = find; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -159,15 +100,7 @@ bool FatPartition::allocContiguous(uint32_t count, uint32_t* firstCluster) { endCluster = bgnCluster = m_allocSearchStart + 1; // search the FAT for free clusters - // Following loop may iterate over up to 268 million clusters, so we need to allow - // the OS/hardware to do its work occasionally during the search or a WDT error will - // occur on the ESP8266. - int yieldCnt = 5000; while (1) { - if (!(--yieldCnt)) { - yieldCnt = 5000; - SysCall::yield(); - } if (endCluster > m_lastCluster) { // Can't find space. DBG_FAIL_MACRO; @@ -216,19 +149,15 @@ bool FatPartition::allocContiguous(uint32_t count, uint32_t* firstCluster) { *firstCluster = bgnCluster; return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ -uint32_t FatPartition::clusterStartSector(uint32_t cluster) const { - return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); -} -//------------------------------------------------------------------------------ // Fetch a FAT entry - return -1 error, 0 EOC, else 1. int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { uint32_t sector; uint32_t next; - cache_t* pc; + uint8_t* pc; // error if reserved cluster of beyond FAT if (cluster < 2 || cluster > m_lastCluster) { @@ -238,44 +167,44 @@ int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { if (fatType() == 32) { sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_READ); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } - next = getLe32(reinterpret_cast - (&pc->fat32[cluster & (m_sectorMask >> 2)])); + uint16_t offset = (cluster << 2) & m_sectorMask; + next = getLe32(pc + offset); } else if (fatType() == 16) { cluster &= 0XFFFF; - sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_READ); + sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1)); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } - next = getLe16(reinterpret_cast - (&pc->fat16[cluster & (m_sectorMask >> 1)])); + uint16_t offset = (cluster << 1) & m_sectorMask; + next = getLe16(pc + offset); } else if (FAT12_SUPPORT && fatType() == 12) { uint16_t index = cluster; index += index >> 1; sector = m_fatStartSector + (index >> m_bytesPerSectorShift); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_READ); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } index &= m_sectorMask; - uint16_t tmp = pc->data[index]; + uint16_t tmp = pc[index]; index++; if (index == m_bytesPerSector) { - pc = cacheFetchFat(sector + 1, FatCache::CACHE_FOR_READ); + pc = fatCachePrepare(sector + 1, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } index = 0; } - tmp |= pc->data[index] << 8; + tmp |= pc[index] << 8; next = cluster & 1 ? tmp >> 4 : tmp & 0XFFF; } else { DBG_FAIL_MACRO; @@ -287,14 +216,14 @@ int8_t FatPartition::fatGet(uint32_t cluster, uint32_t* value) { *value = next; return 1; - fail: +fail: return -1; } //------------------------------------------------------------------------------ // Store a FAT entry bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { uint32_t sector; - cache_t* pc; + uint8_t* pc; // error if reserved cluster of beyond FAT if (cluster < 2 || cluster > m_lastCluster) { @@ -304,26 +233,26 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { if (fatType() == 32) { sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 2)); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_WRITE); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!pc) { DBG_FAIL_MACRO; goto fail; } - setLe32(reinterpret_cast - (&pc->fat32[cluster & (m_sectorMask >> 2)]), value); + uint16_t offset = (cluster << 2) & m_sectorMask; + setLe32(pc + offset, value); return true; } if (fatType() == 16) { cluster &= 0XFFFF; - sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1) ); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_WRITE); + sector = m_fatStartSector + (cluster >> (m_bytesPerSectorShift - 1)); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!pc) { DBG_FAIL_MACRO; goto fail; } - setLe16(reinterpret_cast - (&pc->fat16[cluster & (m_sectorMask >> 1)]), value); + uint16_t offset = (cluster << 1) & m_sectorMask; + setLe16(pc + offset, value); return true; } @@ -331,7 +260,7 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { uint16_t index = cluster; index += index >> 1; sector = m_fatStartSector + (index >> m_bytesPerSectorShift); - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_WRITE); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!pc) { DBG_FAIL_MACRO; goto fail; @@ -339,15 +268,15 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { index &= m_sectorMask; uint8_t tmp = value; if (cluster & 1) { - tmp = (pc->data[index] & 0XF) | tmp << 4; + tmp = (pc[index] & 0XF) | tmp << 4; } - pc->data[index] = tmp; + pc[index] = tmp; index++; if (index == m_bytesPerSector) { sector++; index = 0; - pc = cacheFetchFat(sector, FatCache::CACHE_FOR_WRITE); + pc = fatCachePrepare(sector, FsCache::CACHE_FOR_WRITE); if (!pc) { DBG_FAIL_MACRO; goto fail; @@ -355,16 +284,16 @@ bool FatPartition::fatPut(uint32_t cluster, uint32_t value) { } tmp = value >> 4; if (!(cluster & 1)) { - tmp = ((pc->data[index] & 0XF0)) | tmp >> 4; + tmp = ((pc[index] & 0XF0)) | tmp >> 4; } - pc->data[index] = tmp; + pc[index] = tmp; return true; } else { DBG_FAIL_MACRO; goto fail; } - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -393,7 +322,7 @@ bool FatPartition::freeChain(uint32_t cluster) { return true; - fail: +fail: return false; } //------------------------------------------------------------------------------ @@ -423,24 +352,26 @@ int32_t FatPartition::freeClusterCount() { } else if (fatType() == 16 || fatType() == 32) { sector = m_fatStartSector; while (todo) { - cache_t* pc = cacheFetchFat(sector++, FatCache::CACHE_FOR_READ); + uint8_t* pc = fatCachePrepare(sector++, FsCache::CACHE_FOR_READ); if (!pc) { DBG_FAIL_MACRO; goto fail; } - n = fatType() == 16 ? m_bytesPerSector/2 : m_bytesPerSector/4; + n = fatType() == 16 ? m_bytesPerSector / 2 : m_bytesPerSector / 4; if (todo < n) { n = todo; } if (fatType() == 16) { + uint16_t* p16 = reinterpret_cast(pc); for (uint16_t i = 0; i < n; i++) { - if (pc->fat16[i] == 0) { + if (p16[i] == 0) { free++; } } } else { + uint32_t* p32 = reinterpret_cast(pc); for (uint16_t i = 0; i < n; i++) { - if (pc->fat32[i] == 0) { + if (p32[i] == 0) { free++; } } @@ -455,14 +386,13 @@ int32_t FatPartition::freeClusterCount() { setFreeClusterCount(free); return free; - fail: +fail: return -1; } //------------------------------------------------------------------------------ -bool FatPartition::init(BlockDevice* dev, uint8_t part) { - uint32_t clusterCount; +bool FatPartition::init(FsBlockDevice* dev, uint8_t part, uint32_t volStart) { + uint32_t countOfClusters; uint32_t totalSectors; - uint32_t volumeStartSector = 0; m_blockDev = dev; pbs_t* pbs; BpbFat32_t* bpb; @@ -470,9 +400,9 @@ bool FatPartition::init(BlockDevice* dev, uint8_t part) { uint8_t tmp; m_fatType = 0; m_allocSearchStart = 1; - m_cache.init(this); + m_cache.init(dev); #if USE_SEPARATE_FAT_CACHE - m_fatCache.init(this); + m_fatCache.init(dev); #endif // USE_SEPARATE_FAT_CACHE // if part == 0 assume super floppy with FAT boot sector in sector zero // if part > 0 assume mbr volume with partition table @@ -481,21 +411,27 @@ bool FatPartition::init(BlockDevice* dev, uint8_t part) { DBG_FAIL_MACRO; goto fail; } - mbr = reinterpret_cast - (cacheFetchData(0, FatCache::CACHE_FOR_READ)); - MbrPart_t* mp = mbr->part + part - 1; - - if (!mbr || mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { + mbr = reinterpret_cast( + dataCachePrepare(0, FsCache::CACHE_FOR_READ)); + if (!mbr) { DBG_FAIL_MACRO; goto fail; } - volumeStartSector = getLe32(mp->relativeSectors); + MbrPart_t* mp = mbr->part + part - 1; + if (mp->type == 0 || (mp->boot != 0 && mp->boot != 0X80)) { + DBG_FAIL_MACRO; + goto fail; + } + volStart = getLe32(mp->relativeSectors); + } + pbs = reinterpret_cast( + dataCachePrepare(volStart, FsCache::CACHE_FOR_READ)); + if (!pbs) { + DBG_FAIL_MACRO; + goto fail; } - pbs = reinterpret_cast - (cacheFetchData(volumeStartSector, FatCache::CACHE_FOR_READ)); bpb = reinterpret_cast(pbs->bpb); - - if (!pbs || bpb->fatCount != 2 || getLe16(bpb->bytesPerSector) != 512) { + if (bpb->fatCount != 2 || getLe16(bpb->bytesPerSector) != m_bytesPerSector) { DBG_FAIL_MACRO; goto fail; } @@ -514,7 +450,7 @@ bool FatPartition::init(BlockDevice* dev, uint8_t part) { if (m_sectorsPerFat == 0) { m_sectorsPerFat = getLe32(bpb->sectorsPerFat32); } - m_fatStartSector = volumeStartSector + getLe16(bpb->reservedSectorCount); + m_fatStartSector = volStart + getLe16(bpb->reservedSectorCount); // count for FAT16 zero for FAT32 m_rootDirEntryCount = getLe16(bpb->rootDirEntryCount); @@ -522,8 +458,10 @@ bool FatPartition::init(BlockDevice* dev, uint8_t part) { // directory start for FAT16 dataStart for FAT32 m_rootDirStart = m_fatStartSector + 2 * m_sectorsPerFat; // data start for FAT16 and FAT32 - m_dataStartSector = m_rootDirStart + - ((32 * m_rootDirEntryCount + m_bytesPerSector - 1)/m_bytesPerSector); + m_dataStartSector = + m_rootDirStart + + ((FS_DIR_SIZE * m_rootDirEntryCount + m_bytesPerSector - 1) / + m_bytesPerSector); // total sectors for FAT16 or FAT32 totalSectors = getLe16(bpb->totalSectors16); @@ -531,32 +469,33 @@ bool FatPartition::init(BlockDevice* dev, uint8_t part) { totalSectors = getLe32(bpb->totalSectors32); } // total data sectors - clusterCount = totalSectors - (m_dataStartSector - volumeStartSector); + countOfClusters = totalSectors - (m_dataStartSector - volStart); // divide by cluster size to get cluster count - clusterCount >>= m_sectorsPerClusterShift; - m_lastCluster = clusterCount + 1; + countOfClusters >>= m_sectorsPerClusterShift; + m_lastCluster = countOfClusters + 1; // Indicate unknown number of free clusters. setFreeClusterCount(-1); // FAT type is determined by cluster count - if (clusterCount < 4085) { + if (countOfClusters < 4085) { m_fatType = 12; if (!FAT12_SUPPORT) { DBG_FAIL_MACRO; goto fail; } - } else if (clusterCount < 65525) { + } else if (countOfClusters < 65525) { m_fatType = 16; } else { m_rootDirStart = getLe32(bpb->fat32RootCluster); m_fatType = 32; } + m_cache.setMirrorOffset(m_sectorsPerFat); +#if USE_SEPARATE_FAT_CACHE + m_fatCache.setMirrorOffset(m_sectorsPerFat); +#endif // USE_SEPARATE_FAT_CACHE return true; - fail: +fail: return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.h index 35371e53..076573d0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatPartition.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,14 +29,11 @@ * \brief FatPartition class */ #include -#include "FatLibConfig.h" -#include "../common/SysCall.h" -#include "../common/BlockDevice.h" + +#include "../common/FsBlockDevice.h" +#include "../common/FsCache.h" #include "../common/FsStructs.h" - - -namespace sdfat { - +#include "../common/SysCall.h" /** Type for FAT12 partition */ const uint8_t FAT_TYPE_FAT12 = 12; @@ -47,90 +44,6 @@ const uint8_t FAT_TYPE_FAT16 = 16; /** Type for FAT12 partition */ const uint8_t FAT_TYPE_FAT32 = 32; -//------------------------------------------------------------------------------ -// Forward declaration of FatPartition. -class FatPartition; -//------------------------------------------------------------------------------ -/** - * \brief Cache for an raw data sector. - */ -union cache_t { - /** Used to access cached file data sectors. */ - uint8_t data[512]; - /** Used to access cached FAT16 entries. */ - uint16_t fat16[256]; - /** Used to access cached FAT32 entries. */ - uint32_t fat32[128]; - /** Used to access cached directory entries. */ - DirFat_t dir[16]; -}; -//============================================================================== -/** - * \class FatCache - * \brief Sector cache. - */ -class FatCache { - public: - /** Cached sector is dirty */ - static const uint8_t CACHE_STATUS_DIRTY = 1; - /** Cashed sector is FAT entry and must be mirrored in second FAT. */ - static const uint8_t CACHE_STATUS_MIRROR_FAT = 2; - /** Cache sector status bits */ - static const uint8_t CACHE_STATUS_MASK - = CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT; - /** Sync existing sector but do not read new sector. */ - static const uint8_t CACHE_OPTION_NO_READ = 4; - /** Cache sector for read. */ - static const uint8_t CACHE_FOR_READ = 0; - /** Cache sector for write. */ - static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY; - /** Reserve cache sector for write - do not read from sector device. */ - static const uint8_t CACHE_RESERVE_FOR_WRITE - = CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; - /** \return Cache sector address. */ - cache_t* buffer() { - return &m_buffer; - } - /** Set current sector dirty. */ - void dirty() { - m_status |= CACHE_STATUS_DIRTY; - } - /** Initialize the cache. - * \param[in] vol FatPartition that owns this FatCache. - */ - void init(FatPartition *vol) { - m_part = vol; - invalidate(); - } - /** Invalidate current cache sector. */ - void invalidate() { - m_status = 0; - m_lbn = 0XFFFFFFFF; - } - /** \return dirty status */ - bool isDirty() { - return m_status & CACHE_STATUS_DIRTY; - } - /** \return Logical sector number for cached sector. */ - uint32_t sector() { - return m_lbn; - } - /** Read a sector into the cache. - * \param[in] sector Sector to read. - * \param[in] option mode for cached sector. - * \return Address of cached sector. */ - cache_t* read(uint32_t sector, uint8_t option); - /** Write current sector if dirty. - * \return true for success or false for failure. - */ - bool sync(); - - private: - uint8_t m_status; - FatPartition* m_part; - uint32_t m_lbn; - cache_t m_buffer; -}; //============================================================================== /** * \class FatPartition @@ -140,102 +53,78 @@ class FatPartition { public: /** Create an instance of FatPartition */ - FatPartition() : m_fatType(0) {} + FatPartition() = default; /** \return The shift count required to multiply by bytesPerCluster. */ - uint8_t bytesPerClusterShift() { + uint8_t bytesPerClusterShift() const { return m_sectorsPerClusterShift + m_bytesPerSectorShift; } /** \return Number of bytes in a cluster. */ - uint16_t bytesPerCluster() { + uint16_t bytesPerCluster() const { return m_bytesPerSector << m_sectorsPerClusterShift; } /** \return Number of bytes per sector. */ - uint16_t bytesPerSector() { - return m_bytesPerSector; - } + uint16_t bytesPerSector() const { return m_bytesPerSector; } /** \return The shift count required to multiply by bytesPerCluster. */ - uint8_t bytesPerSectorShift() { - return m_bytesPerSectorShift; + uint8_t bytesPerSectorShift() const { return m_bytesPerSectorShift; } + /** \return Number of directory entries per cluster. */ + uint16_t dirEntriesPerCluster() const { + return m_sectorsPerCluster * (m_bytesPerSector / FS_DIR_SIZE); } /** \return Mask for sector offset. */ - uint16_t sectorMask() { - return m_sectorMask; - } + uint16_t sectorMask() const { return m_sectorMask; } /** \return The volume's cluster size in sectors. */ - uint8_t sectorsPerCluster() const { - return m_sectorsPerCluster; - } + uint8_t sectorsPerCluster() const { return m_sectorsPerCluster; } #ifndef DOXYGEN_SHOULD_SKIP_THIS - // Use sectorsPerCluster(). blocksPerCluster() will be removed in the future. - uint8_t blocksPerCluster() __attribute__ ((deprecated)) {return sectorsPerCluster();} //NOLINT + uint8_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** \return The number of sectors in one FAT. */ - uint32_t sectorsPerFat() const { - return m_sectorsPerFat; - } + uint32_t sectorsPerFat() const { return m_sectorsPerFat; } /** Clear the cache and returns a pointer to the cache. Not for normal apps. * \return A pointer to the cache buffer or zero if an error occurs. */ - cache_t* cacheClear() { - if (!cacheSync()) { - return nullptr; - } - m_cache.invalidate(); - return m_cache.buffer(); - } + uint8_t* cacheClear() { return m_cache.clear(); } /** \return The total number of clusters in the volume. */ - uint32_t clusterCount() const { - return m_lastCluster - 1; - } + uint32_t clusterCount() const { return m_lastCluster - 1; } /** \return The shift count required to multiply by sectorsPerCluster. */ - uint8_t sectorsPerClusterShift() const { - return m_sectorsPerClusterShift; - } + uint8_t sectorsPerClusterShift() const { return m_sectorsPerClusterShift; } /** \return The logical sector number for the start of file data. */ - uint32_t dataStartSector() const { - return m_dataStartSector; + uint32_t dataStartSector() const { return m_dataStartSector; } + /** End access to volume + * \return pointer to sector size buffer for format. + */ + uint8_t* end() { + m_fatType = 0; + return cacheClear(); } /** \return The number of File Allocation Tables. */ - uint8_t fatCount() { - return 2; - } + uint8_t fatCount() const { return 2; } /** \return The logical sector number for the start of the first FAT. */ - uint32_t fatStartSector() const { - return m_fatStartSector; - } + uint32_t fatStartSector() const { return m_fatStartSector; } /** \return The FAT type of the volume. Values are 12, 16 or 32. */ - uint8_t fatType() const { - return m_fatType; - } - /** Volume free space in clusters. - * - * \return Count of free clusters for success or -1 if an error occurs. - */ + uint8_t fatType() const { return m_fatType; } + /** \return free cluster count or -1 if an error occurs. */ int32_t freeClusterCount(); /** Initialize a FAT partition. * - * \param[in] dev BlockDevice for this partition. + * \param[in] dev FsBlockDevice for this partition. * \param[in] part The partition to be used. Legal values for \a part are * 1-4 to use the corresponding partition on a device formatted with * a MBR, Master Boot Record, or zero if the device is formatted as - * a super floppy with the FAT boot sector in sector zero. + * a super floppy with the FAT boot sector in sector volStart. + * \param[in] volStart location of volume if part is zero. * * \return true for success or false for failure. */ - bool init(BlockDevice* dev, uint8_t part = 1); + bool init(FsBlockDevice* dev, uint8_t part = 1, uint32_t volStart = 0); /** \return The number of entries in the root directory for FAT16 volumes. */ - uint16_t rootDirEntryCount() const { - return m_rootDirEntryCount; - } + uint16_t rootDirEntryCount() const { return m_rootDirEntryCount; } /** \return The logical sector number for the start of the root directory on FAT16 volumes or the first cluster number on FAT32 volumes. */ - uint32_t rootDirStart() const { - return m_rootDirStart; - } + uint32_t rootDirStart() const { return m_rootDirStart; } /** \return The number of sectors in the volume */ uint32_t volumeSectorCount() const { - return sectorsPerCluster()*clusterCount(); + return sectorsPerCluster() * clusterCount(); } /** Debug access to FAT table * @@ -243,135 +132,107 @@ class FatPartition { * \param[out] v value of entry * \return -1 error, 0 EOC, else 1. */ - int8_t dbgFat(uint32_t n, uint32_t* v) { - return fatGet(n, v); - } + int8_t dbgFat(uint32_t n, uint32_t* v) { return fatGet(n, v); } + /** + * Check for FsBlockDevice busy. + * + * \return true if busy else false. + */ + bool isBusy() { return m_blockDev->isBusy(); } //---------------------------------------------------------------------------- #ifndef DOXYGEN_SHOULD_SKIP_THIS - void dmpDirSector(print_t* pr, uint32_t sector); + bool dmpDirSector(print_t* pr, uint32_t sector); void dmpFat(print_t* pr, uint32_t start, uint32_t count); - void dmpRootDir(print_t* pr); + bool dmpRootDir(print_t* pr, uint32_t n = 0); void dmpSector(print_t* pr, uint32_t sector, uint8_t bits = 8); #endif // DOXYGEN_SHOULD_SKIP_THIS //---------------------------------------------------------------------------- private: - /** FatCache allowed access to private members. */ - friend class FatCache; /** FatFile allowed access to private members. */ friend class FatFile; //---------------------------------------------------------------------------- - static const uint8_t m_bytesPerSectorShift = 9; - static const uint16_t m_bytesPerSector = 512; - static const uint16_t m_sectorMask = 0x1FF; + static const uint8_t m_bytesPerSectorShift = 9; + static const uint16_t m_bytesPerSector = 1 << m_bytesPerSectorShift; + static const uint16_t m_sectorMask = m_bytesPerSector - 1; //---------------------------------------------------------------------------- - BlockDevice* m_blockDev; // sector device - uint8_t m_sectorsPerCluster; // Cluster size in sectors. - uint8_t m_clusterSectorMask; // Mask to extract sector of cluster. - uint8_t m_sectorsPerClusterShift; // Cluster count to sector count shift. - uint8_t m_fatType; // Volume type (12, 16, OR 32). - uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir. - uint32_t m_allocSearchStart; // Start cluster for alloc search. - uint32_t m_sectorsPerFat; // FAT size in sectors - uint32_t m_dataStartSector; // First data sector number. - uint32_t m_fatStartSector; // Start sector for first FAT. - uint32_t m_lastCluster; // Last cluster number in FAT. - uint32_t m_rootDirStart; // Start sector FAT16, cluster FAT32. + FsBlockDevice* m_blockDev; // sector device + uint8_t m_sectorsPerCluster; // Cluster size in sectors. + uint8_t m_clusterSectorMask; // Mask to extract sector of cluster. + uint8_t m_sectorsPerClusterShift; // Cluster count to sector count shift. + uint8_t m_fatType = 0; // Volume type (12, 16, OR 32). + uint16_t m_rootDirEntryCount; // Number of entries in FAT16 root dir. + uint32_t m_allocSearchStart; // Start cluster for alloc search. + uint32_t m_sectorsPerFat; // FAT size in sectors + uint32_t m_dataStartSector; // First data sector number. + uint32_t m_fatStartSector; // Start sector for first FAT. + uint32_t m_lastCluster; // Last cluster number in FAT. + uint32_t m_rootDirStart; // Start sector FAT16, cluster FAT32. //---------------------------------------------------------------------------- // sector I/O functions. - bool readSector(uint32_t sector, uint8_t* dst) { - return m_blockDev->readSector(sector, dst); + bool cacheSafeRead(uint32_t sector, uint8_t* dst) { + return m_cache.cacheSafeRead(sector, dst); } - bool syncDevice() { - return m_blockDev->syncDevice(); + bool cacheSafeRead(uint32_t sector, uint8_t* dst, size_t count) { + return m_cache.cacheSafeRead(sector, dst, count); } - bool writeSector(uint32_t sector, const uint8_t* src) { - return m_blockDev->writeSector(sector, src); + bool cacheSafeWrite(uint32_t sector, const uint8_t* dst) { + return m_cache.cacheSafeWrite(sector, dst); } -#if USE_MULTI_SECTOR_IO - bool readSectors(uint32_t sector, uint8_t* dst, size_t ns) { - return m_blockDev->readSectors(sector, dst, ns); + bool cacheSafeWrite(uint32_t sector, const uint8_t* dst, size_t count) { + return m_cache.cacheSafeWrite(sector, dst, count); } - bool writeSectors(uint32_t sector, const uint8_t* src, size_t ns) { - return m_blockDev->writeSectors(sector, src, ns); - } -#endif // USE_MULTI_SECTOR_IO + bool syncDevice() { return m_blockDev->syncDevice(); } #if MAINTAIN_FREE_CLUSTER_COUNT - int32_t m_freeClusterCount; // Count of free clusters in volume. - void setFreeClusterCount(int32_t value) { - m_freeClusterCount = value; - } + int32_t m_freeClusterCount; // Count of free clusters in volume. + void setFreeClusterCount(int32_t value) { m_freeClusterCount = value; } void updateFreeClusterCount(int32_t change) { if (m_freeClusterCount >= 0) { m_freeClusterCount += change; } } -#else // MAINTAIN_FREE_CLUSTER_COUNT - void setFreeClusterCount(int32_t value) { - (void)value; - } - void updateFreeClusterCount(int32_t change) { - (void)change; - } +#else // MAINTAIN_FREE_CLUSTER_COUNT + void setFreeClusterCount(int32_t value) { (void)value; } + void updateFreeClusterCount(int32_t change) { (void)change; } #endif // MAINTAIN_FREE_CLUSTER_COUNT - -// sector caches - FatCache m_cache; + // sector caches + FsCache m_cache; + FsCache* dataCache() { return &m_cache; } #if USE_SEPARATE_FAT_CACHE - FatCache m_fatCache; - cache_t* cacheFetchFat(uint32_t sector, uint8_t options) { - return m_fatCache.read(sector, - options | FatCache::CACHE_STATUS_MIRROR_FAT); + FsCache m_fatCache; + uint8_t* fatCachePrepare(uint32_t sector, uint8_t options) { + options |= FsCache::CACHE_STATUS_MIRROR_FAT; + return m_fatCache.prepare(sector, options); } bool cacheSync() { return m_cache.sync() && m_fatCache.sync() && syncDevice(); } -#else // USE_SEPARATE_FAT_CACHE - cache_t* cacheFetchFat(uint32_t sector, uint8_t options) { - return cacheFetchData(sector, - options | FatCache::CACHE_STATUS_MIRROR_FAT); - } - bool cacheSync() { - return m_cache.sync() && syncDevice(); +#else // USE_SEPARATE_FAT_CACHE + uint8_t* fatCachePrepare(uint32_t sector, uint8_t options) { + options |= FsCache::CACHE_STATUS_MIRROR_FAT; + return dataCachePrepare(sector, options); } + bool cacheSync() { return m_cache.sync() && syncDevice(); } #endif // USE_SEPARATE_FAT_CACHE - cache_t* cacheFetchData(uint32_t sector, uint8_t options) { - return m_cache.read(sector, options); - } - void cacheInvalidate() { - m_cache.invalidate(); - } - bool cacheSyncData() { - return m_cache.sync(); - } - cache_t* cacheAddress() { - return m_cache.buffer(); - } - uint32_t cacheSectorNumber() { - return m_cache.sector(); - } - void cacheDirty() { - m_cache.dirty(); + uint8_t* dataCachePrepare(uint32_t sector, uint8_t options) { + return m_cache.prepare(sector, options); } + bool cacheSyncData() { return m_cache.sync(); } + uint8_t* cacheAddress() { return m_cache.cacheBuffer(); } + uint32_t cacheSectorNumber() { return m_cache.sector(); } + void cacheDirty() { m_cache.dirty(); } //---------------------------------------------------------------------------- bool allocateCluster(uint32_t current, uint32_t* next); bool allocContiguous(uint32_t count, uint32_t* firstCluster); uint8_t sectorOfCluster(uint32_t position) const { return (position >> 9) & m_clusterSectorMask; } - uint32_t clusterStartSector(uint32_t cluster) const; + uint32_t clusterStartSector(uint32_t cluster) const { + return m_dataStartSector + ((cluster - 2) << m_sectorsPerClusterShift); + } int8_t fatGet(uint32_t cluster, uint32_t* value); bool fatPut(uint32_t cluster, uint32_t value); - bool fatPutEOC(uint32_t cluster) { - return fatPut(cluster, 0x0FFFFFFF); - } + bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); - bool isEOC(uint32_t cluster) const { - return cluster > m_lastCluster; - } + bool isEOC(uint32_t cluster) const { return cluster > m_lastCluster; } }; - - -}; // namespace sdfat - - #endif // FatPartition diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.cpp index 4aa66277..3003546a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,28 +22,25 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "FatVolume.h" - - -namespace sdfat { - - +#define DBG_FILE "FatVolume.cpp" +#include "../common/DebugMacros.h" +#include "FatLib.h" FatVolume* FatVolume::m_cwv = nullptr; //------------------------------------------------------------------------------ -bool FatVolume::chdir(const char *path) { +bool FatVolume::chdir(const char* path) { FatFile dir; if (!dir.open(vwd(), path, O_RDONLY)) { + DBG_FAIL_MACRO; goto fail; } if (!dir.isDir()) { + DBG_FAIL_MACRO; goto fail; } - m_vwd = dir; + // m_vwd = dir; + m_vwd.copy(&dir); return true; - fail: +fail: return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.h index be6e5d15..daf64c39 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,13 +24,7 @@ */ #ifndef FatVolume_h #define FatVolume_h -#include "FatPartition.h" #include "FatFile.h" - - -namespace sdfat { - - /** * \file * \brief FatVolume class @@ -40,31 +34,51 @@ namespace sdfat { * \class FatVolume * \brief Integration class for the FatLib library. */ -class FatVolume : public FatPartition { +class FatVolume : public FatPartition { public: + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + File32 tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib() : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + File32 tmpFile; + return tmpFile.open(this, path, O_RDONLY) ? tmpFile.attrib(bits) : false; + } /** * Initialize an FatVolume object. * \param[in] dev Device block driver. * \param[in] setCwv Set current working volume if true. * \param[in] part partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(BlockDevice* dev, bool setCwv = true, uint8_t part = 1) { - if (!init(dev, part)) { + bool begin(FsBlockDevice* dev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0) { + if (!init(dev, part, volStart)) { return false; } if (!chdir()) { return false; } - if (setCwv) { + if (setCwv || !m_cwv) { m_cwv = this; } return true; } /** Change global current working volume to this volume. */ - void chvol() {m_cwv = this;} - /** \return current working volume. */ - static FatVolume* cwv() {return m_cwv;} + void chvol() { m_cwv = this; } + /** * Set volume working directory to root. * \return true for success or false for failure. @@ -78,8 +92,7 @@ class FatVolume : public FatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const char *path); - + bool chdir(const char* path); //---------------------------------------------------------------------------- /** * Test for the existence of a file. @@ -107,9 +120,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool ls(print_t* pr, uint8_t flags = 0) { - return m_vwd.ls(pr, flags); - } + bool ls(print_t* pr, uint8_t flags = 0) { return m_vwd.ls(pr, flags); } //---------------------------------------------------------------------------- /** List the contents of a directory. * @@ -151,7 +162,7 @@ class FatVolume : public FatPartition { * \param[in] oflag open flags. * \return a File32 object. */ - File32 open(const char *path, oflag_t oflag = O_RDONLY) { + File32 open(const char* path, oflag_t oflag = O_RDONLY) { File32 tmpFile; tmpFile.open(this, path, oflag); return tmpFile; @@ -182,7 +193,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool rename(const char *oldPath, const char *newPath) { + bool rename(const char* oldPath, const char* newPath) { FatFile file; return file.open(vwd(), oldPath, O_RDONLY) && file.rename(vwd(), newPath); } @@ -213,7 +224,7 @@ class FatVolume : public FatPartition { return file.open(this, path, O_WRONLY) && file.truncate(length); } #if ENABLE_ARDUINO_SERIAL - /** List the directory contents of the root directory to Serial. + /** List the directory contents of the root directory to Serial. * * \param[in] flags The inclusive OR of * @@ -225,9 +236,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool ls(uint8_t flags = 0) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags = 0) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -253,19 +262,15 @@ class FatVolume : public FatPartition { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } - /** + bool chdir(const String& path) { return chdir(path.c_str()); } + /** * Test for the existence of a file. * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String& path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid name for the subdirectory. @@ -284,7 +289,7 @@ class FatVolume : public FatPartition { * \return a File32 object. */ File32 open(const String& path, oflag_t oflag = O_RDONLY) { - return open(path.c_str(), oflag ); + return open(path.c_str(), oflag); } /** Remove a file from the volume root directory. * @@ -292,9 +297,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool remove(const String& path) { - return remove(path.c_str()); - } + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -320,9 +323,7 @@ class FatVolume : public FatPartition { * * \return true for success or false for failure. */ - bool rmdir(const String& path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Truncate a file to a specified length. The current file position * will be at the new EOF. * @@ -337,14 +338,10 @@ class FatVolume : public FatPartition { #endif // ENABLE_ARDUINO_STRING private: - FatFile* vwd() {return &m_vwd;} friend FatFile; - FatFile m_vwd; + static FatVolume* cwv() { return m_cwv; } + FatFile* vwd() { return &m_vwd; } static FatVolume* m_cwv; + FatFile m_vwd; }; - - -}; // namespace sdfat - - #endif // FatVolume_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.cpp index a8018d13..d90959e9 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,11 +24,6 @@ */ #define FREE_STACK_CPP #include "FreeStack.h" - - -namespace sdfat { - - #if defined(HAS_UNUSED_STACK) && HAS_UNUSED_STACK //------------------------------------------------------------------------------ inline char* stackBegin() { @@ -44,7 +39,7 @@ inline char* stackBegin() { } //------------------------------------------------------------------------------ inline char* stackPointer() { -#if defined(__AVR__) +#if defined(__AVR__) return reinterpret_cast(SP); #elif defined(__arm__) register uint32_t sp asm("sp"); @@ -83,6 +78,3 @@ int UnusedStack() { return n; } #endif // defined(HAS_UNUSED_STACK) && HAS_UNUSED_STACK - - -}; // namepace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.h index 7901407b..60729fac 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FreeStack.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -34,7 +34,7 @@ /** Indicate FillStack() and UnusedStack() are available. */ #define HAS_UNUSED_STACK 1 /** boundary between stack and heap. */ -extern char *__brkval; +extern char* __brkval; /** End of bss section.*/ extern char __bss_end; /** Amount of free stack space. @@ -48,9 +48,7 @@ inline int FreeStack() { #define HAS_UNUSED_STACK 0 #elif defined(PLATFORM_ID) // Particle board #include "Arduino.h" -inline int FreeStack() { - return System.freeMemory(); -} +inline int FreeStack() { return System.freeMemory(); } #elif defined(__IMXRT1062__) #define HAS_UNUSED_STACK 1 extern uint8_t _ebss; @@ -65,29 +63,11 @@ inline int FreeStack() { register uint32_t sp asm("sp"); return reinterpret_cast(sp) - reinterpret_cast(sbrk(0)); } -#elif defined(ESP8266) - - -#include - -namespace sdfat { - - -inline int FreeStack() { - int free = (int)ESP.getFreeContStack(); - ESP.resetFreeContStack(); - return free; -} - - -}; // namespace sdfat - - #else // defined(__AVR__) || defined(DOXYGEN) #ifndef FREE_STACK_CPP #warning FreeStack is not defined for this system. #endif // FREE_STACK_CPP - +inline int FreeStack() { return 0; } #endif // defined(__AVR__) || defined(DOXYGEN) #if defined(HAS_UNUSED_STACK) || defined(DOXYGEN) /** Fill stack with 0x55 pattern */ @@ -104,17 +84,7 @@ void FillStack(); int UnusedStack(); #else // HAS_UNUSED_STACK #define HAS_UNUSED_STACK 0 - - -namespace sdfat { - - inline void FillStack() {} -inline int UnusedStack() {return 0;} - - -}; // namespace sdfat - - +inline int UnusedStack() { return 0; } #endif // defined(HAS_UNUSED_STACK) #endif // FreeStack_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.cpp index 633fc14b..4ac76131 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,47 +23,43 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsLib.h" - - -namespace sdfat { - - +#if FILE_COPY_CONSTRUCTOR_SELECT //------------------------------------------------------------------------------ -FsBaseFile::FsBaseFile(const FsBaseFile& from) { - m_fFile = nullptr; - m_xFile = nullptr; - if (from.m_fFile) { - m_fFile = new (m_fileMem) FatFile; - *m_fFile = *from.m_fFile; - } else if (from.m_xFile) { - m_xFile = new (m_fileMem) ExFatFile; - *m_xFile = *from.m_xFile; +FsBaseFile::FsBaseFile(const FsBaseFile& from) { copy(&from); } +//------------------------------------------------------------------------------ +FsBaseFile& FsBaseFile::operator=(const FsBaseFile& from) { + copy(&from); + return *this; +} +#endif // FILE_COPY_CONSTRUCTOR_SELECT +//------------------------------------------------------------------------------ +void FsBaseFile::copy(const FsBaseFile* from) { + if (from != this) { + m_fFile = nullptr; + m_xFile = nullptr; + if (from->m_fFile) { + m_fFile = new (m_fileMem) FatFile; + m_fFile->copy(from->m_fFile); + } else if (from->m_xFile) { + m_xFile = new (m_fileMem) ExFatFile; + m_xFile->copy(from->m_xFile); + } } } //------------------------------------------------------------------------------ -FsBaseFile& FsBaseFile::operator=(const FsBaseFile& from) { - if (this == &from) return *this; - close(); - if (from.m_fFile) { - m_fFile = new (m_fileMem) FatFile; - *m_fFile = *from.m_fFile; - } else if (from.m_xFile) { - m_xFile = new (m_fileMem) ExFatFile; - *m_xFile = *from.m_xFile; +void FsBaseFile::move(FsBaseFile* from) { + if (from != this) { + copy(from); + from->m_fFile = nullptr; + from->m_xFile = nullptr; } - return *this; } //------------------------------------------------------------------------------ bool FsBaseFile::close() { - if (m_fFile && m_fFile->close()) { - m_fFile = nullptr; - return true; - } - if (m_xFile && m_xFile->close()) { - m_xFile = nullptr; - return true; - } - return false; + bool rtn = m_fFile ? m_fFile->close() : m_xFile ? m_xFile->close() : true; + m_fFile = nullptr; + m_xFile = nullptr; + return rtn; } //------------------------------------------------------------------------------ bool FsBaseFile::mkdir(FsBaseFile* dir, const char* path, bool pFlag) { @@ -95,7 +91,6 @@ bool FsBaseFile::open(FsVolume* vol, const char* path, oflag_t oflag) { return true; } m_fFile = nullptr; - return false; } else if (vol->m_xVol) { m_xFile = new (m_fileMem) ExFatFile; if (m_xFile && m_xFile->open(vol->m_xVol, path, oflag)) { @@ -142,6 +137,24 @@ bool FsBaseFile::open(FsBaseFile* dir, uint32_t index, oflag_t oflag) { return false; } //------------------------------------------------------------------------------ +bool FsBaseFile::openCwd() { + close(); + if (FsVolume::m_cwv && FsVolume::m_cwv->m_fVol) { + m_fFile = new (m_fileMem) FatFile; + if (m_fFile->openCwd()) { + return true; + } + m_fFile = nullptr; + } else if (FsVolume::m_cwv && FsVolume::m_cwv->m_xVol) { + m_xFile = new (m_fileMem) ExFatFile; + if (m_xFile->openCwd()) { + return true; + } + m_xFile = nullptr; + } + return false; +} +//------------------------------------------------------------------------------ bool FsBaseFile::openNext(FsBaseFile* dir, oflag_t oflag) { close(); if (dir->m_fFile) { @@ -160,6 +173,27 @@ bool FsBaseFile::openNext(FsBaseFile* dir, oflag_t oflag) { return false; } //------------------------------------------------------------------------------ +bool FsBaseFile::openRoot(FsVolume* vol) { + if (!vol) { + return false; + } + close(); + if (vol->m_fVol) { + m_fFile = new (m_fileMem) FatFile; + if (m_fFile && m_fFile->openRoot(vol->m_fVol)) { + return true; + } + m_fFile = nullptr; + } else if (vol->m_xVol) { + m_xFile = new (m_fileMem) ExFatFile; + if (m_xFile && m_xFile->openRoot(vol->m_xVol)) { + return true; + } + m_xFile = nullptr; + } + return false; +} +//------------------------------------------------------------------------------ bool FsBaseFile::remove() { if (m_fFile) { if (m_fFile->remove()) { @@ -189,6 +223,3 @@ bool FsBaseFile::rmdir() { } return false; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.h index d8df5cfb..c8df331e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFile.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,25 +28,39 @@ * \file * \brief FsBaseFile include file. */ -#include "FsNew.h" -#include "FatLib/FatLib.h" #include "ExFatLib/ExFatLib.h" - - -namespace sdfat { - - +#include "FatLib/FatLib.h" +#include "FsNew.h" +#include "FsVolume.h" /** * \class FsBaseFile * \brief FsBaseFile class. */ class FsBaseFile { public: - FsBaseFile() : m_fFile(nullptr), m_xFile(nullptr) {} - - ~FsBaseFile() {close();} - /** Copy constructor. + /** Create an instance. */ + FsBaseFile() = default; + /** Create a file object and open it in the current working directory. * + * \param[in] path A path for a file to be opened. + * + * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive + * OR of open flags. see FatFile::open(FatFile*, const char*, uint8_t). + */ + FsBaseFile(const char* path, oflag_t oflag) { open(path, oflag); } + + /** Copy from to this. + * \param[in] from Source file. + */ + void copy(const FsBaseFile* from); + + /** move from to this. + * \param[in] from Source file. + */ + void move(FsBaseFile* from); + +#if FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PUBLIC + /** Copy constructor. * \param[in] from Object used to initialize this instance. */ FsBaseFile(const FsBaseFile& from); @@ -55,19 +69,84 @@ class FsBaseFile { * \return assigned object. */ FsBaseFile& operator=(const FsBaseFile& from); +#elif FILE_COPY_CONSTRUCTOR_SELECT == FILE_COPY_CONSTRUCTOR_PRIVATE + + private: + FsBaseFile(const FsBaseFile& from); + FsBaseFile& operator=(const FsBaseFile& from); + + public: +#else // FILE_COPY_CONSTRUCTOR_SELECT + FsBaseFile(const FsBaseFile& from) = delete; + FsBaseFile& operator=(const FsBaseFile& from) = delete; +#endif // FILE_COPY_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT + /** Move constructor. + * \param[in] from File to move. + */ + FsBaseFile(FsBaseFile&& from) { move(&from); } + /** Move assignment operator. + * \param[in] from File to move. + * \return Assigned file. + */ + FsBaseFile& operator=(FsBaseFile&& from) { + move(&from); + return *this; + } +#else // FILE_MOVE_CONSTRUCTOR_SELECT + FsBaseFile(FsBaseFile&& from) = delete; + FsBaseFile& operator=(FsBaseFile&& from) = delete; +#endif // FILE_MOVE_CONSTRUCTOR_SELECT + +#if DESTRUCTOR_CLOSES_FILE + ~FsBaseFile() { + if (isOpen()) { + close(); + } + } +#else // DESTRUCTOR_CLOSES_FILE + ~FsBaseFile() = default; +#endif // DESTRUCTOR_CLOSES_FILE + /** The parenthesis operator. - * - * \return true if a file is open. - */ - operator bool() {return isOpen();} + * + * \return true if a file is open. + */ + operator bool() const { return isOpen(); } + /** + * \return user settable file attributes for success else -1. + */ + int attrib() { + return m_fFile ? m_fFile->attrib() : m_xFile ? m_xFile->attrib() : -1; + } + /** Set file attributes + * + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \note attrib() will fail for set read-only if the file is open for write. + * \return true for success or false for failure. + */ + bool attrib(uint8_t bits) { + return m_fFile ? m_fFile->attrib(bits) + : m_xFile ? m_xFile->attrib(bits) + : false; + } /** \return number of bytes available from the current position to EOF * or INT_MAX if more than INT_MAX bytes are available. */ - int available() { - return m_fFile ? m_fFile->available() : - m_xFile ? m_xFile->available() : 0; + int available() const { + return m_fFile ? m_fFile->available() : m_xFile ? m_xFile->available() : 0; + } + /** \return The number of bytes available from the current position + * to EOF for normal files. Zero is returned for directory files. + */ + uint64_t available64() const { + return m_fFile ? m_fFile->available32() + : m_xFile ? m_xFile->available64() + : 0; } - /** Clear writeError. */ void clearWriteError() { if (m_fFile) m_fFile->clearWriteError(); @@ -90,18 +169,29 @@ class FsBaseFile { * \return true for success or false for failure. */ bool contiguousRange(uint32_t* bgnSector, uint32_t* endSector) { - return m_fFile ? m_fFile->contiguousRange(bgnSector, endSector) : - m_xFile ? m_xFile->contiguousRange(bgnSector, endSector) : false; + return m_fFile ? m_fFile->contiguousRange(bgnSector, endSector) + : m_xFile ? m_xFile->contiguousRange(bgnSector, endSector) + : false; + } + /** \return The current cluster number for a file or directory. */ + uint32_t curCluster() const { + return m_fFile ? m_fFile->curCluster() + : m_xFile ? m_xFile->curCluster() + : 0; } /** \return The current position for a file or directory. */ - uint64_t curPosition() { - return m_fFile ? m_fFile->curPosition() : - m_xFile ? m_xFile->curPosition() : 0; + uint64_t curPosition() const { + return m_fFile ? m_fFile->curPosition() + : m_xFile ? m_xFile->curPosition() + : 0; + } + /** \return Total allocated length for file. */ + uint64_t dataLength() const { + return m_fFile ? m_fFile->fileSize() : m_xFile ? m_xFile->dataLength() : 0; } /** \return Directory entry index. */ - uint32_t dirIndex() { - return m_fFile ? m_fFile->dirIndex() : - m_xFile ? m_xFile->dirIndex() : 0; + uint32_t dirIndex() const { + return m_fFile ? m_fFile->dirIndex() : m_xFile ? m_xFile->dirIndex() : 0; } /** Test for the existence of a file in a directory * @@ -115,23 +205,24 @@ class FsBaseFile { * \return true if the file exists else false. */ bool exists(const char* path) { - return m_fFile ? m_fFile->exists(path) : - m_xFile ? m_xFile->exists(path) : false; + return m_fFile ? m_fFile->exists(path) + : m_xFile ? m_xFile->exists(path) + : false; } /** get position for streams * \param[out] pos struct to receive position */ - void fgetpos(fspos_t* pos) { + void fgetpos(fspos_t* pos) const { if (m_fFile) m_fFile->fgetpos(pos); if (m_xFile) m_xFile->fgetpos(pos); } - /** + /** * Get a string from a file. * * fgets() reads bytes from a file into the array pointed to by \a str, until - * \a num - 1 bytes are read, or a delimiter is read and transferred to \a str, - * or end-of-file is encountered. The string is then terminated - * with a null byte. + * \a num - 1 bytes are read, or a delimiter is read and transferred to \a + * str, or end-of-file is encountered. The string is then terminated with a + * null byte. * * fgets() deletes CR, '\\r', from the string. This insures only a '\\n' * terminates the string for Windows text files which use CRLF for newline. @@ -143,24 +234,26 @@ class FsBaseFile { * \param[in] delim Optional set of delimiters. The default is "\n". * * \return For success fgets() returns the length of the string in \a str. - * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. + * If no data is read, fgets() returns zero for EOF or -1 if an error + * occurred. */ int fgets(char* str, int num, char* delim = nullptr) { - return m_fFile ? m_fFile->fgets(str, num, delim) : - m_xFile ? m_xFile->fgets(str, num, delim) : -1; + return m_fFile ? m_fFile->fgets(str, num, delim) + : m_xFile ? m_xFile->fgets(str, num, delim) + : -1; } /** \return The total number of bytes in a file. */ - uint64_t fileSize() { - return m_fFile ? m_fFile->fileSize() : - m_xFile ? m_xFile->fileSize() : 0; + uint64_t fileSize() const { + return m_fFile ? m_fFile->fileSize() : m_xFile ? m_xFile->fileSize() : 0; } /** \return Address of first sector or zero for empty file. */ - uint32_t firstSector() { - return m_fFile ? m_fFile->firstSector() : - m_xFile ? m_xFile->firstSector() : 0; + uint32_t firstSector() const { + return m_fFile ? m_fFile->firstSector() + : m_xFile ? m_xFile->firstSector() + : 0; } /** Ensure that any bytes written to the file are saved to the SD card. */ - void flush() {sync();} + void flush() { sync(); } /** set position for streams * \param[in] pos struct with value for new position */ @@ -176,8 +269,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getAccessDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getAccessDateTime(pdate, ptime) : - m_xFile ? m_xFile->getAccessDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getAccessDateTime(pdate, ptime) + : m_xFile ? m_xFile->getAccessDateTime(pdate, ptime) + : false; } /** Get a file's create date and time. * @@ -187,13 +281,13 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getCreateDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getCreateDateTime(pdate, ptime) : - m_xFile ? m_xFile->getCreateDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getCreateDateTime(pdate, ptime) + : m_xFile ? m_xFile->getCreateDateTime(pdate, ptime) + : false; } /** \return All error bits. */ - uint8_t getError() { - return m_fFile ? m_fFile->getError() : - m_xFile ? m_xFile->getError() : 0XFF; + uint8_t getError() const { + return m_fFile ? m_fFile->getError() : m_xFile ? m_xFile->getError() : 0XFF; } /** Get a file's Modify date and time. * @@ -203,8 +297,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool getModifyDateTime(uint16_t* pdate, uint16_t* ptime) { - return m_fFile ? m_fFile->getModifyDateTime(pdate, ptime) : - m_xFile ? m_xFile->getModifyDateTime(pdate, ptime) : false; + return m_fFile ? m_fFile->getModifyDateTime(pdate, ptime) + : m_xFile ? m_xFile->getModifyDateTime(pdate, ptime) + : false; } /** * Get a file's name followed by a zero byte. @@ -217,44 +312,84 @@ class FsBaseFile { */ size_t getName(char* name, size_t len) { *name = 0; - return m_fFile ? m_fFile->getName(name, len) : - m_xFile ? m_xFile->getName(name, len) : 0; + return m_fFile ? m_fFile->getName(name, len) + : m_xFile ? m_xFile->getName(name, len) + : 0; } /** \return value of writeError */ - bool getWriteError() { - return m_fFile ? m_fFile->getWriteError() : - m_xFile ? m_xFile->getWriteError() : true; + bool getWriteError() const { + return m_fFile ? m_fFile->getWriteError() + : m_xFile ? m_xFile->getWriteError() + : true; + } + /** + * Check for FsBlockDevice busy. + * + * \return true if busy else false. + */ + bool isBusy() { + return m_fFile ? m_fFile->isBusy() : m_xFile ? m_xFile->isBusy() : true; } /** \return True if the file is contiguous. */ - bool isContiguous() { + bool isContiguous() const { #if USE_FAT_FILE_FLAG_CONTIGUOUS - return m_fFile ? m_fFile->isContiguous() : - m_xFile ? m_xFile->isContiguous() : false; -#else // USE_FAT_FILE_FLAG_CONTIGUOUS + return m_fFile ? m_fFile->isContiguous() + : m_xFile ? m_xFile->isContiguous() + : false; +#else // USE_FAT_FILE_FLAG_CONTIGUOUS return m_xFile ? m_xFile->isContiguous() : false; #endif // USE_FAT_FILE_FLAG_CONTIGUOUS } /** \return True if this is a directory else false. */ - bool isDir() { - return m_fFile ? m_fFile->isDir() : - m_xFile ? m_xFile->isDir() : false; + bool isDir() const { + return m_fFile ? m_fFile->isDir() : m_xFile ? m_xFile->isDir() : false; } /** This function reports if the current file is a directory or not. * \return true if the file is a directory. */ - bool isDirectory() {return isDir();} + bool isDirectory() const { return isDir(); } + /** \return True if this is a normal file. */ + bool isFile() const { + return m_fFile ? m_fFile->isFile() : m_xFile ? m_xFile->isFile() : false; + } + /** \return True if this is a normal file or sub-directory. */ + bool isFileOrSubDir() const { + return m_fFile ? m_fFile->isFileOrSubDir() + : m_xFile ? m_xFile->isFileOrSubDir() + : false; + } /** \return True if this is a hidden file else false. */ - bool isHidden() { - return m_fFile ? m_fFile->isHidden() : - m_xFile ? m_xFile->isHidden() : false; + bool isHidden() const { + return m_fFile ? m_fFile->isHidden() + : m_xFile ? m_xFile->isHidden() + : false; } /** \return True if this is an open file/directory else false. */ - bool isOpen() {return m_fFile || m_xFile;} - /** \return True if this is a subdirectory file else false. */ - bool isSubDir() { - return m_fFile ? m_fFile->isSubDir() : - m_xFile ? m_xFile->isSubDir() : false; + bool isOpen() const { return m_fFile || m_xFile; } + /** \return True file is readable. */ + bool isReadable() const { + return m_fFile ? m_fFile->isReadable() + : m_xFile ? m_xFile->isReadable() + : false; + } + /** \return True if file is read-only */ + bool isReadOnly() const { + return m_fFile ? m_fFile->isReadOnly() + : m_xFile ? m_xFile->isReadOnly() + : false; + } + /** \return True if this is a sub-directory file else false. */ + bool isSubDir() const { + return m_fFile ? m_fFile->isSubDir() + : m_xFile ? m_xFile->isSubDir() + : false; + } + /** \return True file is writable. */ + bool isWritable() const { + return m_fFile ? m_fFile->isWritable() + : m_xFile ? m_xFile->isWritable() + : false; } #if ENABLE_ARDUINO_SERIAL /** List directory contents. @@ -266,14 +401,13 @@ class FsBaseFile { * LS_SIZE - %Print file size. * * LS_R - Recursive list of subdirectories. + * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } - /** List directory contents. */ - bool ls() { - return ls(&Serial); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } + /** List directory contents. + * \return true for success or false for failure. + */ + bool ls() { return ls(&Serial); } #endif // ENABLE_ARDUINO_SERIAL /** List directory contents. * @@ -282,8 +416,7 @@ class FsBaseFile { * \return true for success or false for failure. */ bool ls(print_t* pr) { - return m_fFile ? m_fFile->ls(pr) : - m_xFile ? m_xFile->ls(pr) : false; + return m_fFile ? m_fFile->ls(pr) : m_xFile ? m_xFile->ls(pr) : false; } /** List directory contents. * @@ -299,8 +432,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool ls(print_t* pr, uint8_t flags) { - return m_fFile ? m_fFile->ls(pr, flags) : - m_xFile ? m_xFile->ls(pr, flags) : false; + return m_fFile ? m_fFile->ls(pr, flags) + : m_xFile ? m_xFile->ls(pr, flags) + : false; } /** Make a new directory. * @@ -314,14 +448,6 @@ class FsBaseFile { * \return true for success or false for failure. */ bool mkdir(FsBaseFile* dir, const char* path, bool pFlag = true); - /** No longer implemented due to Long File Names. - * - * Use getName(char* name, size_t size). - * \return a pointer to replacement suggestion. - */ - const char* name() const { - return "use getName()"; - } /** Open a file or directory by name. * * \param[in] dir An open file instance for the directory containing @@ -350,10 +476,12 @@ class FsBaseFile { * O_CREAT - If the file exists, this flag has no effect except as noted * under O_EXCL below. Otherwise, the file shall be created * - * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file exists. + * O_EXCL - If O_CREAT and O_EXCL are set, open() shall fail if the file + * exists. * * O_TRUNC - If the file exists and is a regular file, and the file is - * successfully opened and is not read only, its length shall be truncated to 0. + * successfully opened and is not read only, its length shall be truncated to + * 0. * * WARNING: A given file must not be opened by more than one file object * or file corruption may occur. @@ -377,7 +505,7 @@ class FsBaseFile { * See open() by path for definition of flags. * \return true for success or false for failure. */ - bool open(FsBaseFile* dir, uint32_t index, oflag_t oflag); + bool open(FsBaseFile* dir, uint32_t index, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] vol Volume where the file is located. @@ -389,7 +517,7 @@ class FsBaseFile { * * \return true for success or false for failure. */ - bool open(FsVolume* vol, const char* path, oflag_t oflag); + bool open(FsVolume* vol, const char* path, oflag_t oflag = O_RDONLY); /** Open a file or directory by name. * * \param[in] path A path for a file to be opened. @@ -402,70 +530,46 @@ class FsBaseFile { bool open(const char* path, oflag_t oflag = O_RDONLY) { return FsVolume::m_cwv && open(FsVolume::m_cwv, path, oflag); } + /** Open a file or directory by index in the current working directory. + * + * \param[in] index The \a index of the directory entry for the file to be + * opened. The value for \a index is (directory file position)/32. + * + * \param[in] oflag Values for \a oflag are constructed by a + * bitwise-inclusive OR of open flags. + * + * \return true for success or false for failure. + */ + bool open(uint32_t index, oflag_t oflag = O_RDONLY) { + FsBaseFile cwd; + return cwd.openCwd() && open(&cwd, index, oflag); + } + /** Open the current working directory. + * + * \return true for success or false for failure. + */ + bool openCwd(); /** Opens the next file or folder in a directory. * \param[in] dir directory containing files. * \param[in] oflag open flags. * \return a file object. */ bool openNext(FsBaseFile* dir, oflag_t oflag = O_RDONLY); + /** Open a volume's root directory. + * + * \param[in] vol The SdFs volume containing the root directory to be opened. + * + * \return true for success or false for failure. + */ + bool openRoot(FsVolume* vol); + /** \return the current file position. */ + uint64_t position() const { return curPosition(); } /** Return the next available byte without consuming it. * * \return The byte if no error and not at eof else -1; */ int peek() { - return m_fFile ? m_fFile->peek() : - m_xFile ? m_xFile->peek() : -1; - } - /** Print a file's access date and time - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printAccessDateTime(print_t* pr) { - return m_fFile ? m_fFile->printAccessDateTime(pr) : - m_xFile ? m_xFile->printAccessDateTime(pr) : 0; - } - /** Print a file's creation date and time - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printCreateDateTime(print_t* pr) { - return m_fFile ? m_fFile->printCreateDateTime(pr) : - m_xFile ? m_xFile->printCreateDateTime(pr) : 0; - } - /** Print a file's modify date and time - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printModifyDateTime(print_t* pr) { - return m_fFile ? m_fFile->printModifyDateTime(pr) : - m_xFile ? m_xFile->printModifyDateTime(pr) : 0; - } - /** Print a file's name - * - * \param[in] pr Print stream for output. - * - * \return true for success or false for failure. - */ - size_t printName(print_t* pr) { - return m_fFile ? m_fFile->printName(pr) : - m_xFile ? m_xFile->printName(pr) : 0; - } - /** Print a file's size. - * - * \param[in] pr Print stream for output. - * - * \return The number of characters printed is returned - * for success and zero is returned for failure. - */ - size_t printFileSize(print_t* pr) { - return m_fFile ? m_fFile->printFileSize(pr) : - m_xFile ? m_xFile->printFileSize(pr) : 0; + return m_fFile ? m_fFile->peek() : m_xFile ? m_xFile->peek() : -1; } /** Allocate contiguous clusters to an empty file. * @@ -479,20 +583,42 @@ class FsBaseFile { * \return true for success or false for failure. */ bool preAllocate(uint64_t length) { - return m_fFile ? length < (1ULL << 32) && m_fFile->preAllocate(length) : - m_xFile ? m_xFile->preAllocate(length) : false; + return m_fFile ? length < (1ULL << 32) && m_fFile->preAllocate(length) + : m_xFile ? m_xFile->preAllocate(length) + : false; } - /** \return the current file position. */ - uint64_t position() {return curPosition();} - /** Print a number followed by a field terminator. + /** Print a file's access date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printAccessDateTime(print_t* pr) { + return m_fFile ? m_fFile->printAccessDateTime(pr) + : m_xFile ? m_xFile->printAccessDateTime(pr) + : 0; + } + /** Print a file's creation date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printCreateDateTime(print_t* pr) { + return m_fFile ? m_fFile->printCreateDateTime(pr) + : m_xFile ? m_xFile->printCreateDateTime(pr) + : 0; + } + /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. * \param[in] prec Number of digits after decimal point. * \return The number of bytes written or -1 if an error occurs. */ size_t printField(double value, char term, uint8_t prec = 2) { - return m_fFile ? m_fFile->printField(value, term, prec) : - m_xFile ? m_xFile->printField(value, term, prec) : 0; + return m_fFile ? m_fFile->printField(value, term, prec) + : m_xFile ? m_xFile->printField(value, term, prec) + : 0; } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. @@ -501,17 +627,52 @@ class FsBaseFile { * \return The number of bytes written or -1 if an error occurs. */ size_t printField(float value, char term, uint8_t prec = 2) { - return printField(static_cast(value), term, prec); + return printField(static_cast(value), term, prec); } /** Print a number followed by a field terminator. * \param[in] value The number to be printed. * \param[in] term The field terminator. Use '\\n' for CR LF. * \return The number of bytes written or -1 if an error occurs. */ - template + template size_t printField(Type value, char term) { - return m_fFile ? m_fFile->printField(value, term) : - m_xFile ? m_xFile->printField(value, term) : 0; + return m_fFile ? m_fFile->printField(value, term) + : m_xFile ? m_xFile->printField(value, term) + : 0; + } + /** Print a file's size. + * + * \param[in] pr Print stream for output. + * + * \return The number of characters printed is returned + * for success and zero is returned for failure. + */ + size_t printFileSize(print_t* pr) { + return m_fFile ? m_fFile->printFileSize(pr) + : m_xFile ? m_xFile->printFileSize(pr) + : 0; + } + /** Print a file's modify date and time + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printModifyDateTime(print_t* pr) { + return m_fFile ? m_fFile->printModifyDateTime(pr) + : m_xFile ? m_xFile->printModifyDateTime(pr) + : 0; + } + /** Print a file's name + * + * \param[in] pr Print stream for output. + * + * \return true for success or false for failure. + */ + size_t printName(print_t* pr) { + return m_fFile ? m_fFile->printName(pr) + : m_xFile ? m_xFile->printName(pr) + : 0; } /** Read the next byte from a file. * @@ -536,8 +697,9 @@ class FsBaseFile { * or an I/O error occurred. */ int read(void* buf, size_t count) { - return m_fFile ? m_fFile->read(buf, count) : - m_xFile ? m_xFile->read(buf, count) : -1; + return m_fFile ? m_fFile->read(buf, count) + : m_xFile ? m_xFile->read(buf, count) + : -1; } /** Remove a file. * @@ -550,7 +712,7 @@ class FsBaseFile { * \return true for success or false for failure. */ bool remove(); - /** Remove a file. + /** Remove a file. * * The directory entry and all data for the file are deleted. * @@ -565,8 +727,9 @@ class FsBaseFile { * \return true for success or false for failure. */ bool remove(const char* path) { - return m_fFile ? m_fFile->remove(path) : - m_xFile ? m_xFile->remove(path) : false; + return m_fFile ? m_fFile->remove(path) + : m_xFile ? m_xFile->remove(path) + : false; } /** Rename a file or subdirectory. * @@ -575,19 +738,21 @@ class FsBaseFile { * \return true for success or false for failure. */ bool rename(const char* newPath) { - return m_fFile ? m_fFile->rename(newPath) : - m_xFile ? m_xFile->rename(newPath) : false; + return m_fFile ? m_fFile->rename(newPath) + : m_xFile ? m_xFile->rename(newPath) + : false; } /** Rename a file or subdirectory. * - * \param[in] dirFile Directory for the new path. + * \param[in] dir Directory for the new path. * \param[in] newPath New path name for the file/directory. * * \return true for success or false for failure. */ - bool rename(FsBaseFile* dirFile, const char* newPath) { - return m_fFile ? m_fFile->rename(dirFile->m_fFile, newPath) : - m_xFile ? m_xFile->rename(dirFile->m_xFile, newPath) : false; + bool rename(FsBaseFile* dir, const char* newPath) { + return m_fFile && dir->m_fFile ? m_fFile->rename(dir->m_fFile, newPath) + : m_xFile && dir->m_xFile ? m_xFile->rename(dir->m_xFile, newPath) + : false; } /** Set the file's current position to zero. */ void rewind() { @@ -617,22 +782,18 @@ class FsBaseFile { * \param[in] pos the new file position. * \return true for success or false for failure. */ - bool seek(uint64_t pos) {return seekSet(pos);} + bool seek(uint64_t pos) { return seekSet(pos); } /** Set the files position to current position + \a pos. See seekSet(). * \param[in] offset The new position in bytes from the current position. * \return true for success or false for failure. */ - bool seekCur(int64_t offset) { - return seekSet(curPosition() + offset); - } + bool seekCur(int64_t offset) { return seekSet(curPosition() + offset); } /** Set the files position to end-of-file + \a offset. See seekSet(). * Can't be used for directory files since file size is not defined. * \param[in] offset The new position in bytes from end-of-file. * \return true for success or false for failure. */ - bool seekEnd(int64_t offset = 0) { - return seekSet(fileSize() + offset); - } + bool seekEnd(int64_t offset = 0) { return seekSet(fileSize() + offset); } /** Sets a file's position. * * \param[in] pos The new position in bytes from the beginning of the file. @@ -640,19 +801,19 @@ class FsBaseFile { * \return true for success or false for failure. */ bool seekSet(uint64_t pos) { - return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet(pos) : - m_xFile ? m_xFile->seekSet(pos) : false; + return m_fFile ? pos < (1ULL << 32) && m_fFile->seekSet((uint32_t)pos) + : m_xFile ? m_xFile->seekSet(pos) + : false; } /** \return the file's size. */ - uint64_t size() {return fileSize();} + uint64_t size() const { return fileSize(); } /** The sync() call causes all modified data and directory fields * to be written to the storage device. * * \return true for success or false for failure. */ bool sync() { - return m_fFile ? m_fFile->sync() : - m_xFile ? m_xFile->sync() : false; + return m_fFile ? m_fFile->sync() : m_xFile ? m_xFile->sync() : false; } /** Set a file's timestamps in its directory entry. * @@ -688,20 +849,20 @@ class FsBaseFile { */ bool timestamp(uint8_t flags, uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second) { - return m_fFile ? - m_fFile->timestamp(flags, year, month, day, hour, minute, second) : - m_xFile ? - m_xFile->timestamp(flags, year, month, day, hour, minute, second) : - false; + return m_fFile ? m_fFile->timestamp(flags, year, month, day, hour, minute, + second) + : m_xFile ? m_xFile->timestamp(flags, year, month, day, hour, minute, + second) + : false; } - /** Truncate a file to the current position. * * \return true for success or false for failure. */ bool truncate() { - return m_fFile ? m_fFile->truncate() : - m_xFile ? m_xFile->truncate() : false; + return m_fFile ? m_fFile->truncate() + : m_xFile ? m_xFile->truncate() + : false; } /** Truncate a file to a specified length. * The current file position will be set to end of file. @@ -711,15 +872,22 @@ class FsBaseFile { * \return true for success or false for failure. */ bool truncate(uint64_t length) { - return m_fFile ? length < (1ULL << 32) && m_fFile->truncate(length) : - m_xFile ? m_xFile->truncate(length) : false; + return m_fFile ? length < (1ULL << 32) && m_fFile->truncate(length) + : m_xFile ? m_xFile->truncate(length) + : false; } + /** Write a string to a file. Used by the Arduino Print class. + * \param[in] str Pointer to the string. + * Use getWriteError to check for errors. + * \return count of characters written for success or -1 for failure. + */ + size_t write(const char* str) { return write(str, strlen(str)); } /** Write a byte to a file. Required by the Arduino Print class. * \param[in] b the byte to be written. * Use getWriteError to check for errors. * \return 1 for success and 0 for failure. */ - size_t write(uint8_t b) {return write(&b, 1);} + size_t write(uint8_t b) { return write(&b, 1); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -730,20 +898,18 @@ class FsBaseFile { * \param[in] count Number of bytes to write. * * \return For success write() returns the number of bytes written, always - * \a nbyte. If an error occurs, write() returns -1. Possible errors - * include write() is called before a file has been opened, write is called - * for a read-only file, device is full, a corrupt file system or an - * I/O error. + * \a nbyte. If an error occurs, write() returns zero and writeError is set. */ size_t write(const void* buf, size_t count) { - return m_fFile ? m_fFile->write(buf, count) : - m_xFile ? m_xFile->write(buf, count) : 0; + return m_fFile ? m_fFile->write(buf, count) + : m_xFile ? m_xFile->write(buf, count) + : 0; } private: newalign_t m_fileMem[FS_ALIGN_DIM(ExFatFile, FatFile)]; - FatFile* m_fFile; - ExFatFile* m_xFile; + FatFile* m_fFile = nullptr; + ExFatFile* m_xFile = nullptr; }; /** * \class FsFile @@ -762,9 +928,4 @@ class FsFile : public StreamFile { return tmpFile; } }; - - -}; // namespace sdfat - - #endif // FsFile_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatTypes.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFormatter.h similarity index 55% rename from extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatTypes.h rename to extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFormatter.h index 1abb95a3..96266edd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/ExFatLib/ExFatTypes.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsFormatter.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,44 +22,38 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#ifndef ExFatTypes_h -#define ExFatTypes_h -#include "ExFatConfig.h" - - -namespace sdfat { - - -#if __cplusplus < 201103 -#warning no char16_t -typedef uint16_t ExChar16_t; -// #error C++11 Support required -#else // __cplusplus < 201103 -typedef char16_t ExChar16_t; -#endif // __cplusplus < 201103 - -#if USE_EXFAT_UNICODE_NAMES -/** exFAT API character type */ -typedef ExChar16_t ExChar_t; -#else // USE_EXFAT_UNICODE_NAMES -/** exFAT API character type */ -typedef char ExChar_t; -#endif // USE_EXFAT_UNICODE_NAMES +#ifndef FsFormatter_h +#define FsFormatter_h +#include "ExFatLib/ExFatLib.h" +#include "FatLib/FatLib.h" /** - * \struct DirPos_t - * \brief Internal type for position in directory file. + * \class FsFormatter + * \brief Format a exFAT/FAT volume. */ -struct DirPos_t { - /** current cluster */ - uint32_t cluster; - /** offset */ - uint32_t position; - /** directory is contiguous */ - bool isContiguous; +class FsFormatter { + public: + /** Constructor. */ + FsFormatter() = default; + /** + * Format a FAT volume. + * + * \param[in] dev Block device for volume. + * \param[in] secBuffer buffer for writing to volume. + * \param[in] pr Print device for progress output. + * + * \return true for success or false for failure. + */ + bool format(FsBlockDevice* dev, uint8_t* secBuffer, print_t* pr = nullptr) { + uint32_t sectorCount = dev->sectorCount(); + if (sectorCount == 0) { + return false; + } + return sectorCount <= 67108864 ? m_fFmt.format(dev, secBuffer, pr) + : m_xFmt.format(dev, secBuffer, pr); + } + + private: + FatFormatter m_fFmt; + ExFatFormatter m_xFmt; }; - - -}; // namespace sdfat - - -#endif // ExFatTypes_h +#endif // FsFormatter_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsLib.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsLib.h index a39f620b..97eeb07d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsLib.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsLib.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,6 +28,7 @@ * \file * \brief FsLib include file. */ -#include "FsVolume.h" #include "FsFile.h" +#include "FsFormatter.h" +#include "FsVolume.h" #endif // FsLib_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.cpp index f0867ac7..b9063978 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,8 +23,7 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsNew.h" - -void* operator new(size_t size, sdfat::newalign_t* ptr) { +void* operator new(size_t size, newalign_t* ptr) { (void)size; return ptr; } diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.h index 5e6a5fc4..1b19f865 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsNew.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -27,10 +27,6 @@ #include #include - -namespace sdfat { - - /** 32-bit alignment */ typedef uint32_t newalign_t; @@ -40,21 +36,11 @@ typedef uint32_t newalign_t; /** Dimension of aligned area. */ #define NEW_ALIGN_DIM(n) \ - (((size_t)(n) + sizeof(newalign_t) - 1U)/sizeof(newalign_t)) + (((size_t)(n) + sizeof(newalign_t) - 1U) / sizeof(newalign_t)) /** Dimension of aligned area for etype or ftype class. */ #define FS_ALIGN_DIM(etype, ftype) NEW_ALIGN_DIM(FS_SIZE(etype, ftype)) - -}; // namespace sdfat - - -// This placement new can't be inside a namespace, per C++ standard. Hope this breaks nothing else. - /** Custom new placement operator */ -void* operator new(size_t size, sdfat::newalign_t* ptr); - - - - +void* operator new(size_t size, newalign_t* ptr); #endif // FsNew_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.cpp index 6416d9bb..a578ff30 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,31 +23,27 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsLib.h" - - -namespace sdfat { - - FsVolume* FsVolume::m_cwv = nullptr; //------------------------------------------------------------------------------ -bool FsVolume::begin(BlockDevice* blockDev) { - m_blockDev = blockDev; +bool FsVolume::begin(FsBlockDevice* blockDev, bool setCwv, uint8_t part, + uint32_t volStart) { m_fVol = nullptr; m_xVol = new (m_volMem) ExFatVolume; - if (m_xVol && m_xVol->begin(m_blockDev, false)) { + if (m_xVol && m_xVol->begin(blockDev, false, part, volStart)) { goto done; } m_xVol = nullptr; m_fVol = new (m_volMem) FatVolume; - if (m_fVol && m_fVol->begin(m_blockDev, false)) { + if (m_fVol && m_fVol->begin(blockDev, false, part, volStart)) { goto done; } - m_cwv = nullptr; m_fVol = nullptr; return false; - done: - m_cwv = this; +done: + if (setCwv || !m_cwv) { + m_cwv = this; + } return true; } //------------------------------------------------------------------------------ @@ -56,17 +52,14 @@ bool FsVolume::ls(print_t* pr, const char* path, uint8_t flags) { return dir.open(this, path, O_RDONLY) && dir.ls(pr, flags); } //------------------------------------------------------------------------------ -FsFile FsVolume::open(const char *path, oflag_t oflag) { +FsFile FsVolume::open(const char* path, oflag_t oflag) { FsFile tmpFile; tmpFile.open(this, path, oflag); return tmpFile; } #if ENABLE_ARDUINO_STRING //------------------------------------------------------------------------------ -FsFile FsVolume::open(const String &path, oflag_t oflag) { - return open(path.c_str(), oflag ); +FsFile FsVolume::open(const String& path, oflag_t oflag) { + return open(path.c_str(), oflag); } #endif // ENABLE_ARDUINO_STRING - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.h b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.h index b09c3bdb..7a386e0b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/FsLib/FsVolume.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,13 +28,9 @@ * \file * \brief FsVolume include file. */ -#include "FsNew.h" -#include "../FatLib/FatLib.h" #include "../ExFatLib/ExFatLib.h" - - -namespace sdfat { - +#include "../FatLib/FatLib.h" +#include "FsNew.h" class FsFile; /** @@ -43,75 +39,84 @@ class FsFile; */ class FsVolume { public: - FsVolume() : m_fVol(nullptr), m_xVol(nullptr) {} - - ~FsVolume() {end();} + FsVolume() = default; + ~FsVolume() { end(); } + /** Get file's user settable attributes. + * \param[in] path path to file. + * \return user settable file attributes for success else -1. + */ + int attrib(const char* path) { + return m_fVol ? m_fVol->attrib(path) : m_xVol ? m_xVol->attrib(path) : -1; + } + /** Set file's user settable attributes. + * \param[in] path path to file. + * \param[in] bits bit-wise or of selected attributes: FS_ATTRIB_READ_ONLY, + * FS_ATTRIB_HIDDEN, FS_ATTRIB_SYSTEM, FS_ATTRIB_ARCHIVE. + * + * \return true for success or false for failure. + */ + bool attrib(const char* path, uint8_t bits) { + return m_fVol ? m_fVol->attrib(path, bits) + : m_xVol ? m_xVol->attrib(path, bits) + : false; + } /** * Initialize an FatVolume object. * \param[in] blockDev Device block driver. + * \param[in] setCwv Set current working volume if true. + * \param[in] part partition to initialize. + * \param[in] volStart Start sector of volume if part is zero. * \return true for success or false for failure. */ - bool begin(BlockDevice* blockDev); - /** \return the number of bytes in a cluster. */ - uint32_t bytesPerCluster() { - return m_fVol ? m_fVol->bytesPerCluster() : - m_xVol ? m_xVol->bytesPerCluster() : 0; - } - /** \return current working volume. */ - static FsVolume* cwv() {return m_cwv;} - /** Change global working volume to this volume. */ - void chvol() {m_cwv = this;} - /** \return The total number of clusters in the volume. */ - uint32_t clusterCount() { - return m_fVol ? m_fVol->clusterCount() : - m_xVol ? m_xVol->clusterCount() : 0; - } - /** \return The logical sector number for the start of file data. */ - uint32_t dataStartSector() const { - return m_fVol ? m_fVol->dataStartSector() : - m_xVol ? m_xVol->clusterHeapStartSector() : 0; - } - /** \return The logical sector number for the start of the first FAT. */ - uint32_t fatStartSector() const { - return m_fVol ? m_fVol->fatStartSector() : - m_xVol ? m_xVol->fatStartSector() : 0; - } - /** \return the free cluster count. */ - uint32_t freeClusterCount() { - return m_fVol ? m_fVol->freeClusterCount() : - m_xVol ? m_xVol->freeClusterCount() : 0; - } - /** \return The volume's cluster size in sectors. */ - uint32_t sectorsPerCluster() const { - return m_fVol ? m_fVol->sectorsPerCluster() : - m_xVol ? m_xVol->sectorsPerCluster() : 0; - } + bool begin(FsBlockDevice* blockDev, bool setCwv = true, uint8_t part = 1, + uint32_t volStart = 0); #ifndef DOXYGEN_SHOULD_SKIP_THIS - // Use sectorsPerCluster(). blocksPerCluster() will be removed in the future. - uint32_t blocksPerCluster() __attribute__ ((deprecated)) {return sectorsPerCluster();} //NOLINT + uint32_t __attribute__((error("use sectorsPerCluster()"))) blocksPerCluster(); #endif // DOXYGEN_SHOULD_SKIP_THIS + /** \return the number of bytes in a cluster. */ + uint32_t bytesPerCluster() const { + return m_fVol ? m_fVol->bytesPerCluster() + : m_xVol ? m_xVol->bytesPerCluster() + : 0; + } /** * Set volume working directory to root. * \return true for success or false for failure. */ bool chdir() { - return m_fVol ? m_fVol->chdir() : - m_xVol ? m_xVol->chdir() : false; + return m_fVol ? m_fVol->chdir() : m_xVol ? m_xVol->chdir() : false; } /** * Set volume working directory. * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const char* path) { - return m_fVol ? m_fVol->chdir(path) : - m_xVol ? m_xVol->chdir(path) : false; + bool chdir(const char* path) { + return m_fVol ? m_fVol->chdir(path) : m_xVol ? m_xVol->chdir(path) : false; } - /** free dynamic memory and end access to volume */ - void end() { + /** Change global working volume to this volume. */ + void chvol() { m_cwv = this; } + /** \return The total number of clusters in the volume. */ + uint32_t clusterCount() const { + return m_fVol ? m_fVol->clusterCount() + : m_xVol ? m_xVol->clusterCount() + : 0; + } + /** \return The logical sector number for the start of file data. */ + uint32_t dataStartSector() const { + return m_fVol ? m_fVol->dataStartSector() + : m_xVol ? m_xVol->clusterHeapStartSector() + : 0; + } + /** End access to volume + * \return pointer to sector size buffer for format. + */ + uint8_t* end() { m_fVol = nullptr; m_xVol = nullptr; + static_assert(sizeof(m_volMem) >= 512, "m_volMem too small"); + return reinterpret_cast(m_volMem); } /** Test for the existence of a file in a directory * @@ -120,15 +125,35 @@ class FsVolume { * \return true if the file exists else false. */ bool exists(const char* path) { - return m_fVol ? m_fVol->exists(path) : - m_xVol ? m_xVol->exists(path) : false; + return m_fVol ? m_fVol->exists(path) + : m_xVol ? m_xVol->exists(path) + : false; + } + /** \return The logical sector number for the start of the first FAT. */ + uint32_t fatStartSector() const { + return m_fVol ? m_fVol->fatStartSector() + : m_xVol ? m_xVol->fatStartSector() + : 0; } /** \return Partition type, FAT_TYPE_EXFAT, FAT_TYPE_FAT32, * FAT_TYPE_FAT16, or zero for error. */ uint8_t fatType() const { - return m_fVol ? m_fVol->fatType() : - m_xVol ? m_xVol->fatType() : 0; + return m_fVol ? m_fVol->fatType() : m_xVol ? m_xVol->fatType() : 0; + } + /** \return free cluster count or -1 if an error occurs. */ + int32_t freeClusterCount() const { + return m_fVol ? m_fVol->freeClusterCount() + : m_xVol ? m_xVol->freeClusterCount() + : -1; + } + /** + * Check for device busy. + * + * \return true if busy else false. + */ + bool isBusy() { + return m_fVol ? m_fVol->isBusy() : m_xVol ? m_xVol->isBusy() : false; } /** List directory contents. * @@ -137,8 +162,7 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr) { - return m_fVol ? m_fVol->ls(pr) : - m_xVol ? m_xVol->ls(pr) : false; + return m_fVol ? m_fVol->ls(pr) : m_xVol ? m_xVol->ls(pr) : false; } /** List directory contents. * @@ -154,8 +178,9 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr, uint8_t flags) { - return m_fVol ? m_fVol->ls(pr, flags) : - m_xVol ? m_xVol->ls(pr, flags) : false; + return m_fVol ? m_fVol->ls(pr, flags) + : m_xVol ? m_xVol->ls(pr, flags) + : false; } /** List the directory contents of a directory. * @@ -174,7 +199,7 @@ class FsVolume { * \return true for success or false for failure. */ bool ls(print_t* pr, const char* path, uint8_t flags); - /** Make a subdirectory in the volume root directory. + /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. * @@ -182,9 +207,10 @@ class FsVolume { * * \return true for success or false for failure. */ - bool mkdir(const char *path, bool pFlag = true) { - return m_fVol ? m_fVol->mkdir(path, pFlag) : - m_xVol ? m_xVol->mkdir(path, pFlag) : false; + bool mkdir(const char* path, bool pFlag = true) { + return m_fVol ? m_fVol->mkdir(path, pFlag) + : m_xVol ? m_xVol->mkdir(path, pFlag) + : false; } /** open a file * @@ -194,14 +220,15 @@ class FsVolume { */ FsFile open(const char* path, oflag_t oflag = O_RDONLY); /** Remove a file from the volume root directory. - * - * \param[in] path A path with a valid 8.3 DOS name for the file. - * + * + * \param[in] path A path with a valid 8.3 DOS name for the file. + * * \return true for success or false for failure. - */ - bool remove(const char *path) { - return m_fVol ? m_fVol->remove(path) : - m_xVol ? m_xVol->remove(path) : false; + */ + bool remove(const char* path) { + return m_fVol ? m_fVol->remove(path) + : m_xVol ? m_xVol->remove(path) + : false; } /** Rename a file or subdirectory. * @@ -217,9 +244,10 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rename(const char *oldPath, const char *newPath) { - return m_fVol ? m_fVol->rename(oldPath, newPath) : - m_xVol ? m_xVol->rename(oldPath, newPath) : false; + bool rename(const char* oldPath, const char* newPath) { + return m_fVol ? m_fVol->rename(oldPath, newPath) + : m_xVol ? m_xVol->rename(oldPath, newPath) + : false; } /** Remove a subdirectory from the volume's root directory. * @@ -229,17 +257,20 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rmdir(const char *path) { - return m_fVol ? m_fVol->rmdir(path) : - m_xVol ? m_xVol->rmdir(path) : false; + bool rmdir(const char* path) { + return m_fVol ? m_fVol->rmdir(path) : m_xVol ? m_xVol->rmdir(path) : false; + } + /** \return The volume's cluster size in sectors. */ + uint32_t sectorsPerCluster() const { + return m_fVol ? m_fVol->sectorsPerCluster() + : m_xVol ? m_xVol->sectorsPerCluster() + : 0; } #if ENABLE_ARDUINO_SERIAL /** List directory contents. * \return true for success or false for failure. */ - bool ls() { - return ls(&Serial); - } + bool ls() { return ls(&Serial); } /** List directory contents. * * \param[in] flags The inclusive OR of @@ -252,9 +283,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool ls(uint8_t flags) { - return ls(&Serial, flags); - } + bool ls(uint8_t flags) { return ls(&Serial, flags); } /** List the directory contents of a directory to Serial. * * \param[in] path directory to list. @@ -281,18 +310,14 @@ class FsVolume { * \param[in] path Path for volume working directory. * \return true for success or false for failure. */ - bool chdir(const String& path) { - return chdir(path.c_str()); - } + bool chdir(const String& path) { return chdir(path.c_str()); } /** Test for the existence of a file in a directory * * \param[in] path Path of the file to be tested for. * * \return true if the file exists else false. */ - bool exists(const String &path) { - return exists(path.c_str()); - } + bool exists(const String& path) { return exists(path.c_str()); } /** Make a subdirectory in the volume root directory. * * \param[in] path A path with a valid 8.3 DOS name for the subdirectory. @@ -301,7 +326,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool mkdir(const String &path, bool pFlag = true) { + bool mkdir(const String& path, bool pFlag = true) { return mkdir(path.c_str(), pFlag); } /** open a file @@ -310,16 +335,14 @@ class FsVolume { * \param[in] oflag open flags. * \return a FsBaseFile object. */ - FsFile open(const String &path, oflag_t oflag = O_RDONLY); + FsFile open(const String& path, oflag_t oflag = O_RDONLY); /** Remove a file from the volume root directory. - * - * \param[in] path A path with a valid 8.3 DOS name for the file. - * + * + * \param[in] path A path with a valid 8.3 DOS name for the file. + * * \return true for success or false for failure. - */ - bool remove(const String &path) { - return remove(path.c_str()); - } + */ + bool remove(const String& path) { return remove(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -345,9 +368,7 @@ class FsVolume { * * \return true for success or false for failure. */ - bool rmdir(const String &path) { - return rmdir(path.c_str()); - } + bool rmdir(const String& path) { return rmdir(path.c_str()); } /** Rename a file or subdirectory. * * \param[in] oldPath Path name to the file or subdirectory to be renamed. @@ -364,20 +385,18 @@ class FsVolume { */ #endif // ENABLE_ARDUINO_STRING + protected: + newalign_t m_volMem[FS_ALIGN_DIM(ExFatVolume, FatVolume)]; + private: /** FsBaseFile allowed access to private members. */ friend class FsBaseFile; - static FsVolume* m_cwv; + static FsVolume* cwv() { return m_cwv; } FsVolume(const FsVolume& from); FsVolume& operator=(const FsVolume& from); - newalign_t m_volMem[FS_ALIGN_DIM(ExFatVolume, FatVolume)]; - FatVolume* m_fVol; - ExFatVolume* m_xVol; - BlockDevice* m_blockDev; + + static FsVolume* m_cwv; + FatVolume* m_fVol = nullptr; + ExFatVolume* m_xVol = nullptr; }; - - -}; // namespace sdfat - - #endif // FsVolume_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.cpp index 1d163d0e..6a9259a9 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,19 +22,11 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "common/SysCall.h" -#if defined(UDR0) || defined(DOXYGEN) #include "MinimumSerial.h" - - -namespace sdfat { - - -const uint16_t MIN_2X_BAUD = F_CPU/(4*(2*0XFFF + 1)) + 1; +#if defined(UDR0) || defined(DOXYGEN) +const uint16_t MIN_2X_BAUD = F_CPU / (4 * (2 * 0XFFF + 1)) + 1; //------------------------------------------------------------------------------ -int MinimumSerial::available() { - return UCSR0A & (1 << RXC0) ? 1 : 0; -} +int MinimumSerial::available() { return UCSR0A & (1 << RXC0) ? 1 : 0; } //------------------------------------------------------------------------------ void MinimumSerial::begin(uint32_t baud) { uint16_t baud_setting; @@ -58,7 +50,8 @@ void MinimumSerial::begin(uint32_t baud) { } //------------------------------------------------------------------------------ void MinimumSerial::flush() { - while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) { + } } //------------------------------------------------------------------------------ int MinimumSerial::read() { @@ -69,12 +62,9 @@ int MinimumSerial::read() { } //------------------------------------------------------------------------------ size_t MinimumSerial::write(uint8_t b) { - while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) {} + while (((1 << UDRIE0) & UCSR0B) || !(UCSR0A & (1 << UDRE0))) { + } UDR0 = b; return 1; } - -}; // namepace sdfat - - #endif // defined(UDR0) || defined(DOXYGEN) diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.h b/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.h index 7ed21d7b..7e232a31 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/MinimumSerial.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,18 +22,13 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ - /** +/** * \file * \brief Minimal AVR Serial driver. */ #ifndef MinimumSerial_h #define MinimumSerial_h #include "common/SysCall.h" - - -namespace sdfat { - - //============================================================================== /** * \class MinimumSerial @@ -42,7 +37,7 @@ namespace sdfat { class MinimumSerial : public print_t { public: /** \return true for hardware serial */ - operator bool() {return true;} + operator bool() { return true; } /** * \return one if data is available. */ @@ -69,9 +64,4 @@ class MinimumSerial : public print_t { size_t write(uint8_t b); using print_t::write; }; - - -}; // namespace sdfat - - #endif // MinimumSerial_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/RingBuf.h b/extra-libraries/ESP8266/ESP8266SdFat/src/RingBuf.h new file mode 100644 index 00000000..f796768c --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/RingBuf.h @@ -0,0 +1,400 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef RingBuf_h +#define RingBuf_h +/** + * \file + * \brief Ring buffer for data loggers. + */ +#include "common/FmtNumber.h" +#include "common/SysCall.h" + +#ifndef DOXYGEN_SHOULD_SKIP_THIS +// Teensy 3.5/3.6 has hard fault at 0x20000000 for unaligned memcpy. +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) +inline bool is_aligned(const void* ptr, uintptr_t alignment) { + auto iptr = reinterpret_cast(ptr); + return !(iptr % alignment); +} +inline void memcpyBuf(void* dst, const void* src, size_t len) { + const uint8_t* b = reinterpret_cast(0X20000000UL); + uint8_t* d = reinterpret_cast(dst); + const uint8_t* s = reinterpret_cast(src); + if ((is_aligned(d, 4) && is_aligned(s, 4) && (len & 3) == 0) || + !((d < b && b <= (d + len)) || (s < b && b <= (s + len)))) { + memcpy(dst, src, len); + } else { + while (len--) { + *d++ = *s++; + } + } +} +#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) +inline void memcpyBuf(void* dst, const void* src, size_t len) { + memcpy(dst, src, len); +} +#endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) +#endif // DOXYGEN_SHOULD_SKIP_THIS +/** + * \class RingBuf + * \brief Ring buffer for data loggers and data transmitters. + * + * This ring buffer may be used in ISRs. Use beginISR(), endISR(), write() + * and print() in the ISR and use writeOut() in non-interrupt code + * to write data to a file. + * + * Use beginISR(), endISR() and read() in an ISR with readIn() in non-interrupt + * code to provide file data to an ISR. + */ +template +class RingBuf : public Print { + public: + /** + * RingBuf Constructor. + */ + RingBuf() { begin(nullptr); } + /** + * Initialize RingBuf. + * \param[in] file Underlying file. + */ + void begin(F* file) { + m_file = file; + m_count = 0; + m_head = 0; + m_tail = 0; + m_inISR = false; + clearWriteError(); + } + /** + * Disable protection of m_count by noInterrupts()/interrupts. + */ + void beginISR() { m_inISR = true; } + /** + * \return the RingBuf free space in bytes. + */ + size_t bytesFree() const { return Size - bytesUsed(); } + /** + * \return the RingBuf used space in bytes. + */ + size_t bytesUsed() const { + if (m_inISR) { + return m_count; + } else { + noInterrupts(); + size_t rtn = m_count; + interrupts(); + return rtn; + } + } + /** + * Enable protection of m_count by noInterrupts()/interrupts. + */ + void endISR() { m_inISR = false; } +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // See write(), read(), beginISR() and endISR(). + size_t __attribute__((error("use write(buf, count), beginISR(), endISR()"))) + memcpyIn(const void* buf, size_t count); + size_t __attribute__((error("use read(buf, count), beginISR(), endISR()"))) + memcpyOut(void* buf, size_t count); +#endif // DOXYGEN_SHOULD_SKIP_THIS + /** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written. + */ + size_t printField(double value, char term, uint8_t prec = 2) { + char buf[24]; + char* str = buf + sizeof(buf); + if (term) { + *--str = term; + if (term == '\n') { + *--str = '\r'; + } + } + str = fmtDouble(str, value, prec, false); + return write(str, buf + sizeof(buf) - str); + } + /** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \param[in] prec Number of digits after decimal point. + * \return The number of bytes written or -1 if an error occurs. + */ + size_t printField(float value, char term, uint8_t prec = 2) { + return printField(static_cast(value), term, prec); + } + /** Print a number followed by a field terminator. + * \param[in] value The number to be printed. + * \param[in] term The field terminator. Use '\\n' for CR LF. + * \return The number of bytes written or -1 if an error occurs. + */ + template + size_t printField(Type value, char term) { + char sign = 0; + char buf[3 * sizeof(Type) + 3]; + char* str = buf + sizeof(buf); + + if (term) { + *--str = term; + if (term == '\n') { + *--str = '\r'; + } + } + if (value < 0) { + value = -value; + sign = '-'; + } + if (sizeof(Type) < 4) { + str = fmtBase10(str, (uint16_t)value); + } else { + str = fmtBase10(str, (uint32_t)value); + } + if (sign) { + *--str = sign; + } + return write((const uint8_t*)str, &buf[sizeof(buf)] - str); + } + /** Read data from RingBuf. + * \param[out] buf destination for data. + * \param[in] count number of bytes to read. + * \return Actual count of bytes read. + */ + size_t read(void* buf, size_t count) { + size_t n = bytesFree(); + if (count > n) { + count = n; + } + uint8_t* dst = reinterpret_cast(buf); + n = minSize(Size - m_tail, count); + if (n == count) { + memcpyBuf(dst, m_buf + m_tail, n); + m_tail = advance(m_tail, n); + } else { + memcpyBuf(dst, m_buf + m_tail, n); + memcpyBuf(dst + n, m_buf, count - n); + m_tail = count - n; + } + adjustCount(-count); + return count; + } + /** + * Efficient read for small types. + * + * \param[in] data location for data item. + * \return true for success else false. + */ + template + bool read(Type* data) { + if (bytesUsed() < sizeof(Type)) { + return false; + } + uint8_t* ptr = reinterpret_cast(data); + for (size_t i = 0; i < sizeof(Type); i++) { + ptr[i] = m_buf[m_tail]; + m_tail = advance(m_tail); + } + adjustCount(-sizeof(Type)); + return true; + } + /** + * Read data into the RingBuf from the underlying file. + * the number of bytes read may be less than count if + * bytesFree is less than count. + * + * This function must not be used in an ISR. + * + * \param[in] count number of bytes to be read. + * \return Number of bytes actually read or negative for read error. + */ + int readIn(size_t count) { + size_t n = bytesFree(); + if (count > n) { + count = n; + } + n = minSize(Size - m_head, count); + auto rtn = m_file->read(m_buf + m_head, n); + if (rtn <= 0) { + return rtn; + } + size_t nread = rtn; + if (n < count && nread == n) { + rtn = m_file->read(m_buf, count - n); + if (rtn > 0) { + nread += rtn; + } + } + m_head = advance(m_head, nread); + adjustCount(nread); + return nread; + } + /** + * Write all data in the RingBuf to the underlying file. + * \return true for success. + */ + bool sync() { + size_t n = bytesUsed(); + return n ? writeOut(n) == n : true; + } + /** + * Copy data to the RingBuf from buf. + * + * No data will be copied if count is greater than bytesFree. + * Use getWriteError() to check for print errors and + * clearWriteError() to clear the error. + * + * \param[in] buf Location of data to be written. + * \param[in] count number of bytes to be written. + * \return Number of bytes actually written. + */ + size_t write(const void* buf, size_t count) { + if (bytesFree() < count) { + setWriteError(); + return 0; + } + const uint8_t* src = (const uint8_t*)buf; + size_t n = minSize(Size - m_head, count); + if (n == count) { + memcpyBuf(m_buf + m_head, src, n); + m_head = advance(m_head, n); + } else { + memcpyBuf(m_buf + m_head, src, n); + memcpyBuf(m_buf, src + n, count - n); + m_head = count - n; + } + adjustCount(count); + return count; + } + /** + * Copy str to RingBuf. + * + * \param[in] str Location of data to be written. + * \return Number of bytes actually written. + */ + size_t write(const char* str) { return Print::write(str); } + /** + * Override virtual function in Print for efficiency. + * + * \param[in] buf Location of data to be written. + * \param[in] count number of bytes to be written. + * \return Number of bytes actually written. + */ + size_t write(const uint8_t* buf, size_t count) override { + return write((const void*)buf, count); + } + /** + * Efficient write for small types. + * \param[in] data Item to be written. + * \return Number of bytes actually written. + */ + template + size_t write(Type data) { + uint8_t* ptr = reinterpret_cast(&data); + if (bytesFree() < sizeof(Type)) { + setWriteError(); + return 0; + } + for (size_t i = 0; i < sizeof(Type); i++) { + m_buf[m_head] = ptr[i]; + m_head = advance(m_head); + } + adjustCount(sizeof(Type)); + return sizeof(Type); + } + /** + * Required function for Print. + * \param[in] data Byte to be written. + * \return Number of bytes actually written. + * + * Try to force devirtualization by using final and always_inline. + */ + size_t write(uint8_t data) final __attribute__((always_inline)) { + // Use this if above does not compile size_t write(uint8_t data) final { + return write(data); + } + /** + * Write data to file from RingBuf buffer. + * \param[in] count number of bytes to be written. + * + * The number of bytes written may be less than count if + * bytesUsed is less than count or if an error occurs. + * + * This function must only be used in non-interrupt code. + * + * \return Number of bytes actually written. + */ + size_t writeOut(size_t count) { + size_t n = bytesUsed(); // Protected from interrupts; + if (count > n) { + count = n; + } + n = minSize(Size - m_tail, count); + auto rtn = m_file->write(m_buf + m_tail, n); + if (rtn <= 0) { + return 0; + } + size_t nwrite = rtn; + if (n < count && nwrite == n) { + rtn = m_file->write(m_buf, count - n); + if (rtn > 0) { + nwrite += rtn; + } + } + m_tail = advance(m_tail, nwrite); + adjustCount(-nwrite); + return nwrite; + } + + private: + uint8_t __attribute__((aligned(4))) m_buf[Size]; + F* m_file; + volatile size_t m_count; + size_t m_head; + size_t m_tail; + volatile bool m_inISR; + + void adjustCount(int amount) { + if (m_inISR) { + m_count += amount; + } else { + noInterrupts(); + m_count += amount; + interrupts(); + } + } + size_t advance(size_t index) { + if (!((Size - 1) & Size)) { + return (index + 1) & (Size - 1); + } + return index + 1 < Size ? index + 1 : 0; + } + size_t advance(size_t index, size_t n) { + index += n; + return index < Size ? index : index - Size; + } + // avoid macro MIN + size_t minSize(size_t a, size_t b) { return a < b ? a : b; } +}; +#endif // RingBuf_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCard.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCard.h index 8a96c610..86697bbd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCard.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,18 +22,19 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Top level include for SPI and SDIO cards. + */ #ifndef SdCard_h #define SdCard_h -#include "SdioCard.h" #include "SdSpiCard.h" - - -namespace sdfat { - - +#include "SdioCard.h" #if HAS_SDIO_CLASS +/** Type for both SPI and SDIO cards. */ typedef SdCardInterface SdCard; -#else // HAS_SDIO_CLASS +#else // HAS_SDIO_CLASS +/** Type for SPI card. */ typedef SdSpiCard SdCard; #endif // HAS_SDIO_CLASS /** Determine card configuration type. @@ -41,13 +42,19 @@ typedef SdSpiCard SdCard; * \param[in] cfg Card configuration. * \return true if SPI. */ -inline bool isSpi(SdSpiConfig cfg) {(void)cfg; return true;} +inline bool isSpi(SdSpiConfig cfg) { + (void)cfg; + return true; +} /** Determine card configuration type. * * \param[in] cfg Card configuration. * \return true if SPI. */ -inline bool isSpi(SdioConfig cfg) {(void)cfg; return false;} +inline bool isSpi(SdioConfig cfg) { + (void)cfg; + return false; +} /** * \class SdCardFactory * \brief Setup a SPI card or SDIO card. @@ -57,11 +64,10 @@ class SdCardFactory { /** Initialize SPI card. * * \param[in] config SPI configuration. - * \return generic card pointer. + * \return generic card pointer or nullptr if failure. */ SdCard* newCard(SdSpiConfig config) { - m_spiCard.begin(config); - return &m_spiCard; + return m_spiCard.begin(config) ? &m_spiCard : nullptr; } /** Initialize SDIO card. * @@ -70,9 +76,8 @@ class SdCardFactory { */ SdCard* newCard(SdioConfig config) { #if HAS_SDIO_CLASS - m_sdioCard.begin(config); - return &m_sdioCard; -#else // HAS_SDIO_CLASS + return m_sdioCard.begin(config) ? &m_sdioCard : nullptr; +#else // HAS_SDIO_CLASS (void)config; return nullptr; #endif // HAS_SDIO_CLASS @@ -84,9 +89,4 @@ class SdCardFactory { #endif // HAS_SDIO_CLASS SdSpiCard m_spiCard; }; - - -}; // namespace sdfat - - #endif // SdCard_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.cpp index 6abb5214..f3a52f2a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,31 +23,30 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdCardInfo.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ #undef SD_CARD_ERROR -#define SD_CARD_ERROR(e, m) case SD_CARD_ERROR_##e: pr->print(F(#e)); break; +#define SD_CARD_ERROR(e, m) \ + case SD_CARD_ERROR_##e: \ + pr->print(F(#e)); \ + break; void printSdErrorSymbol(print_t* pr, uint8_t code) { pr->print(F("SD_CARD_ERROR_")); switch (code) { SD_ERROR_CODE_LIST - default: pr->print(F("UNKNOWN")); + default: + pr->print(F("UNKNOWN")); } } //------------------------------------------------------------------------------ #undef SD_CARD_ERROR -#define SD_CARD_ERROR(e, m) case SD_CARD_ERROR_##e: pr->print(F(m)); break; +#define SD_CARD_ERROR(e, m) \ + case SD_CARD_ERROR_##e: \ + pr->print(F(m)); \ + break; void printSdErrorText(print_t* pr, uint8_t code) { - switch - (code) { + switch (code) { SD_ERROR_CODE_LIST - default: pr->print(F("Unknown error")); + default: + pr->print(F("Unknown error")); } } - - -}; // namespce sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.h index 791d25da..9ef7f75b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInfo.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,94 +22,107 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Definitions for SD cards. + */ #ifndef SdCardInfo_h #define SdCardInfo_h #include + #include "../common/SysCall.h" - - -namespace sdfat { - - // Based on the document: // // SD Specifications // Part 1 // Physical Layer // Simplified Specification -// Version 5.00 -// Aug 10, 2016 +// Version 8.00 +// Sep 23, 2020 // // https://www.sdcard.org/downloads/pls/ +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +// SD registers are big endian. +#error bit fields in structures assume little endian processor. +#endif // __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ //------------------------------------------------------------------------------ // SD card errors // See the SD Specification for command info. -#define SD_ERROR_CODE_LIST\ - SD_CARD_ERROR(NONE, "No error")\ - SD_CARD_ERROR(CMD0, "Card reset failed")\ - SD_CARD_ERROR(CMD2, "SDIO read CID")\ - SD_CARD_ERROR(CMD3, "SDIO publish RCA")\ - SD_CARD_ERROR(CMD6, "Switch card function")\ - SD_CARD_ERROR(CMD7, "SDIO card select")\ - SD_CARD_ERROR(CMD8, "Send and check interface settings")\ - SD_CARD_ERROR(CMD9, "Read CSD data")\ - SD_CARD_ERROR(CMD10, "Read CID data")\ - SD_CARD_ERROR(CMD12, "Stop multiple block read")\ - SD_CARD_ERROR(CMD13, "Read card status")\ - SD_CARD_ERROR(CMD17, "Read single block")\ - SD_CARD_ERROR(CMD18, "Read multiple blocks")\ - SD_CARD_ERROR(CMD24, "Write single block")\ - SD_CARD_ERROR(CMD25, "Write multiple blocks")\ - SD_CARD_ERROR(CMD32, "Set first erase block")\ - SD_CARD_ERROR(CMD33, "Set last erase block")\ - SD_CARD_ERROR(CMD38, "Erase selected blocks")\ - SD_CARD_ERROR(CMD58, "Read OCR register")\ - SD_CARD_ERROR(CMD59, "Set CRC mode")\ - SD_CARD_ERROR(ACMD6, "Set SDIO bus width")\ - SD_CARD_ERROR(ACMD13, "Read extended status")\ - SD_CARD_ERROR(ACMD23, "Set pre-erased count")\ - SD_CARD_ERROR(ACMD41, "Activate card initialization")\ - SD_CARD_ERROR(READ_TOKEN, "Bad read data token")\ - SD_CARD_ERROR(READ_CRC, "Read CRC error")\ - SD_CARD_ERROR(READ_FIFO, "SDIO fifo read timeout")\ - SD_CARD_ERROR(READ_REG, "Read CID or CSD failed.")\ - SD_CARD_ERROR(READ_START, "Bad readStart argument")\ - SD_CARD_ERROR(READ_TIMEOUT, "Read data timeout")\ - SD_CARD_ERROR(STOP_TRAN, "Multiple block stop failed")\ - SD_CARD_ERROR(WRITE_DATA, "Write data not accepted")\ - SD_CARD_ERROR(WRITE_FIFO, "SDIO fifo write timeout")\ - SD_CARD_ERROR(WRITE_START, "Bad writeStart argument")\ - SD_CARD_ERROR(WRITE_PROGRAMMING, "Flash programming")\ - SD_CARD_ERROR(WRITE_TIMEOUT, "Write timeout")\ - SD_CARD_ERROR(DMA, "DMA transfer failed")\ - SD_CARD_ERROR(ERASE, "Card did not accept erase commands")\ - SD_CARD_ERROR(ERASE_SINGLE_SECTOR, "Card does not support erase")\ - SD_CARD_ERROR(ERASE_TIMEOUT, "Erase command timeout")\ - SD_CARD_ERROR(INIT_NOT_CALLED, "Card has not been initialized")\ - SD_CARD_ERROR(INVALID_CARD_CONFIG, "Invalid card config")\ +/** Define error codes and brief description. */ +#define SD_ERROR_CODE_LIST \ + SD_CARD_ERROR(NONE, "No error") \ + SD_CARD_ERROR(CMD0, "Card reset failed") \ + SD_CARD_ERROR(CMD2, "SDIO read CID") \ + SD_CARD_ERROR(CMD3, "SDIO publish RCA") \ + SD_CARD_ERROR(CMD6, "Switch card function") \ + SD_CARD_ERROR(CMD7, "SDIO card select") \ + SD_CARD_ERROR(CMD8, "Send and check interface settings") \ + SD_CARD_ERROR(CMD9, "Read CSD data") \ + SD_CARD_ERROR(CMD10, "Read CID data") \ + SD_CARD_ERROR(CMD12, "Stop multiple block transmission") \ + SD_CARD_ERROR(CMD13, "Read card status") \ + SD_CARD_ERROR(CMD17, "Read single block") \ + SD_CARD_ERROR(CMD18, "Read multiple blocks") \ + SD_CARD_ERROR(CMD24, "Write single block") \ + SD_CARD_ERROR(CMD25, "Write multiple blocks") \ + SD_CARD_ERROR(CMD32, "Set first erase block") \ + SD_CARD_ERROR(CMD33, "Set last erase block") \ + SD_CARD_ERROR(CMD38, "Erase selected blocks") \ + SD_CARD_ERROR(CMD58, "Read OCR register") \ + SD_CARD_ERROR(CMD59, "Set CRC mode") \ + SD_CARD_ERROR(ACMD6, "Set SDIO bus width") \ + SD_CARD_ERROR(ACMD13, "Read extended status") \ + SD_CARD_ERROR(ACMD23, "Set pre-erased count") \ + SD_CARD_ERROR(ACMD41, "Activate card initialization") \ + SD_CARD_ERROR(ACMD51, "Read SCR data") \ + SD_CARD_ERROR(READ_TOKEN, "Bad read data token") \ + SD_CARD_ERROR(READ_CRC, "Read CRC error") \ + SD_CARD_ERROR(READ_FIFO, "SDIO fifo read timeout") \ + SD_CARD_ERROR(READ_REG, "Read CID or CSD failed.") \ + SD_CARD_ERROR(READ_START, "Bad readStart argument") \ + SD_CARD_ERROR(READ_TIMEOUT, "Read data timeout") \ + SD_CARD_ERROR(STOP_TRAN, "Multiple block stop failed") \ + SD_CARD_ERROR(TRANSFER_COMPLETE, "SDIO transfer complete") \ + SD_CARD_ERROR(WRITE_DATA, "Write data not accepted") \ + SD_CARD_ERROR(WRITE_FIFO, "SDIO fifo write timeout") \ + SD_CARD_ERROR(WRITE_START, "Bad writeStart argument") \ + SD_CARD_ERROR(WRITE_PROGRAMMING, "Flash programming") \ + SD_CARD_ERROR(WRITE_TIMEOUT, "Write timeout") \ + SD_CARD_ERROR(DMA, "DMA transfer failed") \ + SD_CARD_ERROR(ERASE, "Card did not accept erase commands") \ + SD_CARD_ERROR(ERASE_SINGLE_SECTOR, "Card does not support erase") \ + SD_CARD_ERROR(ERASE_TIMEOUT, "Erase command timeout") \ + SD_CARD_ERROR(INIT_NOT_CALLED, "Card has not been initialized") \ + SD_CARD_ERROR(INVALID_CARD_CONFIG, "Invalid card config") \ SD_CARD_ERROR(FUNCTION_NOT_SUPPORTED, "Unsupported SDIO command") - enum { -#define SD_CARD_ERROR(e, m) SD_CARD_ERROR_##e, +/** Macro for generation of error codes using an enum. */ +#define SD_CARD_ERROR(e, m) SD_CARD_ERROR_##e, SD_ERROR_CODE_LIST #undef SD_CARD_ERROR - SD_CARD_ERROR_UNKNOWN + SD_CARD_ERROR_UNKNOWN }; +/** Print the enum symbol for an error code. + * \param[in] pr Print stream. + * \param[in] code enum value for error. + */ void printSdErrorSymbol(print_t* pr, uint8_t code); +/** Print text for an error code. + * \param[in] pr Print stream. + * \param[in] code enum value for error. + */ void printSdErrorText(print_t* pr, uint8_t code); //------------------------------------------------------------------------------ // card types /** Standard capacity V1 SD card */ -const uint8_t SD_CARD_TYPE_SD1 = 1; +const uint8_t SD_CARD_TYPE_SD1 = 1; /** Standard capacity V2 SD card */ -const uint8_t SD_CARD_TYPE_SD2 = 2; +const uint8_t SD_CARD_TYPE_SD2 = 2; /** High Capacity SD card */ const uint8_t SD_CARD_TYPE_SDHC = 3; //------------------------------------------------------------------------------ // SD operation timeouts -/** CMD0 retry count */ -const uint8_t SD_CMD0_RETRY = 10; /** command timeout ms */ const uint16_t SD_CMD_TIMEOUT = 300; /** erase timeout ms */ @@ -175,6 +188,8 @@ const uint8_t ACMD23 = 0X17; /** SD_SEND_OP_COMD - Sends host capacity support information and activates the card's initialization process */ const uint8_t ACMD41 = 0X29; +/** Reads the SD Configuration Register (SCR). */ +const uint8_t ACMD51 = 0X33; //============================================================================== // CARD_STATUS /** The command's argument was out of the allowed range for this card. */ @@ -184,7 +199,7 @@ const uint32_t CARD_STATUS_ADDRESS_ERROR = 1UL << 30; /** The transferred sector length is not allowed for this card. */ const uint32_t CARD_STATUS_SECTOR_LEN_ERROR = 1UL << 29; /** An error in the sequence of erase commands occurred. */ -const uint32_t CARD_STATUS_ERASE_SEQ_ERROR = 1UL <<28; +const uint32_t CARD_STATUS_ERASE_SEQ_ERROR = 1UL << 28; /** An invalid selection of write-sectors for erase occurred. */ const uint32_t CARD_STATUS_ERASE_PARAM = 1UL << 27; /** Set when the host attempts to write to a protected sector. */ @@ -205,7 +220,7 @@ const uint32_t CARD_STATUS_CC_ERROR = 1UL << 20; const uint32_t CARD_STATUS_ERROR = 1UL << 19; // bits 19, 18, and 17 reserved. /** Permanent WP set or attempt to change read only values of CSD. */ -const uint32_t CARD_STATUS_CSD_OVERWRITE = 1UL <<16; +const uint32_t CARD_STATUS_CSD_OVERWRITE = 1UL << 16; /** partial address space was erased due to write protect. */ const uint32_t CARD_STATUS_WP_ERASE_SKIP = 1UL << 15; /** The command has been executed without using the internal ECC. */ @@ -258,243 +273,205 @@ const uint8_t DATA_RES_MASK = 0X1F; const uint8_t DATA_RES_ACCEPTED = 0X05; //============================================================================== /** - * \class CID - * \brief Card IDentification (CID) register. + * \class cid_t + * \brief Card Identification (CID) register. */ -typedef struct CID { +struct cid_t { // byte 0 /** Manufacturer ID */ - unsigned char mid; + uint8_t mid; // byte 1-2 - /** OEM/Application ID */ + /** OEM/Application ID. */ char oid[2]; // byte 3-7 - /** Product name */ + /** Product name. */ char pnm[5]; // byte 8 - /** Product revision least significant digit */ - unsigned char prv_m : 4; - /** Product revision most significant digit */ - unsigned char prv_n : 4; + /** Product revision - n.m two 4-bit nibbles. */ + uint8_t prv; // byte 9-12 - /** Product serial number */ - uint32_t psn; - // byte 13 - /** Manufacturing date year high digit */ - unsigned char mdt_year_high : 4; - /** not used */ - unsigned char reserved : 4; - // byte 14 - /** Manufacturing date month */ - unsigned char mdt_month : 4; - /** Manufacturing date year low digit */ - unsigned char mdt_year_low : 4; + /** Product serial 32-bit number Big Endian format. */ + uint8_t psn8[4]; + // byte 13-14 + /** Manufacturing date big endian - four nibbles RYYM Reserved Year Month. */ + uint8_t mdt[2]; // byte 15 - /** not used always 1 */ - unsigned char always1 : 1; - /** CRC7 checksum */ - unsigned char crc : 7; -} __attribute__((packed)) cid_t; - -//============================================================================== -#ifndef DOXYGEN_SHOULD_SKIP_THIS -/** - * \class CSDV1 - * \brief CSD register for version 1.00 cards . - */ -typedef struct CSDV1 { - // byte 0 - unsigned char reserved1 : 6; - unsigned char csd_ver : 2; - // byte 1 - unsigned char taac; - // byte 2 - unsigned char nsac; - // byte 3 - unsigned char tran_speed; - // byte 4 - unsigned char ccc_high; - // byte 5 - unsigned char read_bl_len : 4; - unsigned char ccc_low : 4; - // byte 6 - unsigned char c_size_high : 2; - unsigned char reserved2 : 2; - unsigned char dsr_imp : 1; - unsigned char read_blk_misalign : 1; - unsigned char write_blk_misalign : 1; - unsigned char read_bl_partial : 1; - // byte 7 - unsigned char c_size_mid; - // byte 8 - unsigned char vdd_r_curr_max : 3; - unsigned char vdd_r_curr_min : 3; - unsigned char c_size_low : 2; - // byte 9 - unsigned char c_size_mult_high : 2; - unsigned char vdd_w_cur_max : 3; - unsigned char vdd_w_curr_min : 3; - // byte 10 - unsigned char sector_size_high : 6; - unsigned char erase_blk_en : 1; - unsigned char c_size_mult_low : 1; - // byte 11 - unsigned char wp_grp_size : 7; - unsigned char sector_size_low : 1; - // byte 12 - unsigned char write_bl_len_high : 2; - unsigned char r2w_factor : 3; - unsigned char reserved3 : 2; - unsigned char wp_grp_enable : 1; - // byte 13 - unsigned char reserved4 : 5; - unsigned char write_partial : 1; - unsigned char write_bl_len_low : 2; - // byte 14 - unsigned char reserved5: 2; - unsigned char file_format : 2; - unsigned char tmp_write_protect : 1; - unsigned char perm_write_protect : 1; - unsigned char copy : 1; - /** Indicates the file format on the card */ - unsigned char file_format_grp : 1; - // byte 15 - unsigned char always1 : 1; - unsigned char crc : 7; -} __attribute__((packed)) csd1_t; -//============================================================================== -/** - * \class CSDV2 - * \brief CSD register for version 2.00 cards. - */ -typedef struct CSDV2 { - // byte 0 - unsigned char reserved1 : 6; - unsigned char csd_ver : 2; - // byte 1 - /** fixed to 0X0E */ - unsigned char taac; - // byte 2 - /** fixed to 0 */ - unsigned char nsac; - // byte 3 - unsigned char tran_speed; - // byte 4 - unsigned char ccc_high; - // byte 5 - /** This field is fixed to 9h, which indicates READ_BL_LEN=512 Byte */ - unsigned char read_bl_len : 4; - unsigned char ccc_low : 4; - // byte 6 - /** not used */ - unsigned char reserved2 : 4; - unsigned char dsr_imp : 1; - /** fixed to 0 */ - unsigned char read_blk_misalign : 1; - /** fixed to 0 */ - unsigned char write_blk_misalign : 1; - /** fixed to 0 - no partial read */ - unsigned char read_bl_partial : 1; - // byte 7 - /** high part of card size */ - unsigned char c_size_high : 6; - /** not used */ - unsigned char reserved3 : 2; - // byte 8 - /** middle part of card size */ - unsigned char c_size_mid; - // byte 9 - /** low part of card size */ - unsigned char c_size_low; - // byte 10 - /** sector size is fixed at 64 KB */ - unsigned char sector_size_high : 6; - /** fixed to 1 - erase single is supported */ - unsigned char erase_blk_en : 1; - /** not used */ - unsigned char reserved4 : 1; - // byte 11 - unsigned char wp_grp_size : 7; - /** sector size is fixed at 64 KB */ - unsigned char sector_size_low : 1; - // byte 12 - /** write_bl_len fixed for 512 byte sectors */ - unsigned char write_bl_len_high : 2; - /** fixed value of 2 */ - unsigned char r2w_factor : 3; - /** not used */ - unsigned char reserved5 : 2; - /** fixed value of 0 - no write protect groups */ - unsigned char wp_grp_enable : 1; - // byte 13 - unsigned char reserved6 : 5; - /** always zero - no partial sector read*/ - unsigned char write_partial : 1; - /** write_bl_len fixed for 512 byte sectors */ - unsigned char write_bl_len_low : 2; - // byte 14 - unsigned char reserved7: 2; - /** Do not use always 0 */ - unsigned char file_format : 2; - unsigned char tmp_write_protect : 1; - unsigned char perm_write_protect : 1; - unsigned char copy : 1; - /** Do not use always 0 */ - unsigned char file_format_grp : 1; - // byte 15 - /** not used always 1 */ - unsigned char always1 : 1; - /** checksum */ - unsigned char crc : 7; -} __attribute__((packed)) csd2_t; + /** CRC7 bits 1-7 checksum, bit 0 always 1 */ + uint8_t crc; + // Extract big endian fields. + /** \return major revision number. */ + int prvN() const { return prv >> 4; } + /** \return minor revision number. */ + int prvM() const { return prv & 0XF; } + /** \return Manufacturing Year. */ + int mdtYear() const { return 2000 + ((mdt[0] & 0XF) << 4) + (mdt[1] >> 4); } + /** \return Manufacturing Month. */ + int mdtMonth() const { return mdt[1] & 0XF; } + /** \return Product Serial Number. */ + uint32_t psn() const { + return (uint32_t)psn8[0] << 24 | (uint32_t)psn8[1] << 16 | + (uint32_t)psn8[2] << 8 | (uint32_t)psn8[3]; + } +} __attribute__((packed)); //============================================================================== /** * \class csd_t * \brief Union of old and new style CSD register. */ -union csd_t { - csd1_t v1; - csd2_t v2; -}; -//----------------------------------------------------------------------------- -inline uint32_t sdCardCapacity(csd_t* csd) { - if (csd->v1.csd_ver == 0) { - uint8_t read_bl_len = csd->v1.read_bl_len; - uint16_t c_size = (csd->v1.c_size_high << 10) - | (csd->v1.c_size_mid << 2) | csd->v1.c_size_low; - uint8_t c_size_mult = (csd->v1.c_size_mult_high << 1) - | csd->v1.c_size_mult_low; - return (uint32_t)(c_size + 1) << (c_size_mult + read_bl_len - 7); - } else if (csd->v2.csd_ver == 1) { - return (((uint32_t)csd->v2.c_size_high << 16) + - ((uint16_t)csd->v2.c_size_mid << 8) + csd->v2.c_size_low + 1) << 10; - } else { - return 0; +struct csd_t { + /** union of all CSD versions */ + uint8_t csd[16]; + // Extract big endian fields. + /** \return Capacity in sectors */ + uint32_t capacity() const { + uint32_t c_size; + uint8_t ver = csd[0] >> 6; + if (ver == 0) { + c_size = (uint32_t)(csd[6] & 3) << 10; + c_size |= (uint32_t)csd[7] << 2 | csd[8] >> 6; + uint8_t c_size_mult = (csd[9] & 3) << 1 | csd[10] >> 7; + uint8_t read_bl_len = csd[5] & 15; + return (c_size + 1) << (c_size_mult + read_bl_len + 2 - 9); + } else if (ver == 1) { + c_size = (uint32_t)(csd[7] & 63) << 16; + c_size |= (uint32_t)csd[8] << 8; + c_size |= csd[9]; + return (c_size + 1) << 10; + } else { + return 0; + } } -} -//----------------------------------------------------------------------------- + /** \return true if erase granularity is single block. */ + bool eraseSingleBlock() const { return csd[10] & 0X40; } + /** \return erase size in 512 byte blocks if eraseSingleBlock is false. */ + int eraseSize() const { return ((csd[10] & 0X3F) << 1 | csd[11] >> 7) + 1; } + /** \return true if the contents is copied or true if original. */ + bool copy() const { return csd[14] & 0X40; } + /** \return true if the entire card is permanently write protected. */ + bool permWriteProtect() const { return csd[14] & 0X20; } + /** \return true if the entire card is temporarily write protected. */ + bool tempWriteProtect() const { return csd[14] & 0X10; } +}; +//============================================================================== +/** + * \class scr_t + * \brief SCR register. + */ +struct scr_t { + /** Bytes 0-3 SD Association, bytes 4-7 reserved for manufacturer. */ + uint8_t scr[8]; + /** \return SCR_STRUCTURE field - must be zero.*/ + uint8_t srcStructure() const { return scr[0] >> 4; } + /** \return SD_SPEC field 0 - v1.0 or V1.01, 1 - 1.10, 2 - V2.00 or greater */ + uint8_t sdSpec() const { return scr[0] & 0XF; } + /** \return false if all zero, true if all one. */ + bool dataAfterErase() const { return scr[1] & 0X80; } + /** \return CPRM Security Version. */ + uint8_t sdSecurity() const { return (scr[1] >> 4) & 0X7; } + /** \return 0101b. */ + uint8_t sdBusWidths() const { return scr[1] & 0XF; } + /** \return true if V3.0 or greater. */ + bool sdSpec3() const { return scr[2] & 0X80; } + /** \return if true and sdSpecX is zero V4.xx. */ + bool sdSpec4() const { return scr[2] & 0X4; } + /** \return nonzero for version 5 or greater if sdSpec == 2, + sdSpec3 == true. Version is return plus four.*/ + uint8_t sdSpecX() const { return (scr[2] & 0X3) << 2 | scr[3] >> 6; } + /** \return bit map for support CMD58/59, CMD48/49, CMD23, and CMD20 */ + uint8_t cmdSupport() const { return scr[3] & 0XF; } + /** \return SD spec version */ + int16_t sdSpecVer() const { + if (sdSpec() > 2) { + return -1; + } else if (sdSpec() < 2) { + return sdSpec() ? 110 : 101; + } else if (!sdSpec3()) { + return 200; + } else if (!sdSpec4() && !sdSpecX()) { + return 300; + } + return 400 + 100 * sdSpecX(); + } +}; +//============================================================================== +/** + * \class sds_t + * \brief SD Status. + */ // fields are big endian -typedef struct SdStatus { +struct sds_t { + /** byte 0, bit 7-6 width, bit 5 secured mode, bits 4-0 reserved. */ uint8_t busWidthSecureMode; + /** byte 1 reserved */ uint8_t reserved1; + /** byte 2-3 zero for SD rd/wr memory card. */ uint8_t sdCardType[2]; + /** byte 4-7 size of protected area big endian */ uint8_t sizeOfProtectedArea[4]; - uint8_t speedClass; + /** byte 8 speed class. */ + uint8_t speed; + /** byte 9 performance move */ uint8_t performanceMove; + /** byte 10 AU size code. */ uint8_t auSize; + /** byte 11-12 erase size big endian */ uint8_t eraseSize[2]; + /** byte 13 erase timeout and erase offset */ uint8_t eraseTimeoutOffset; - uint8_t uhsSpeedAuSize; - uint8_t videoSpeed; + /** byte 14 */ + uint8_t uhsClassAuSize; + /** byte 15 */ + uint8_t videoSpeedClass; + /** byte 16-17 */ uint8_t vscAuSize[2]; + /** byte 18-21 */ uint8_t susAddr[3]; - uint8_t reserved2[3]; + /** byte 21 */ + uint8_t appPerfClass; + /** byte 22 */ + uint8_t perfEnhance; + /** byte 23 */ + uint8_t discardFule; + /** byte 24 */ uint8_t reservedManufacturer[40]; -} SdStatus_t; -#endif // DOXYGEN_SHOULD_SKIP_THIS - - -}; // namespace sdfat - + /** \return appClass. */ + int appClass() { return appPerfClass; } + /** \return AU size in KB. or zero for error. */ + uint32_t auSizeKB() { + // 0XF mask and uint16_t array helps compiler optimize size on Uno. + uint8_t val = (auSize >> 4) & 0XF; + static const uint16_t au[] = {0, 16, 32, 64, 128, + 256, 512, 1024, 2048, 4096, + 8192, 12288, 16384, 24576, 32768}; + return val < 0XF ? au[val] : 65536UL; + } + /** \return current bus width or -1 for error. */ + uint8_t busWidth() const { + uint8_t w = busWidthSecureMode >> 6; + return w == 2 ? 4 : w == 0 ? 1 : -1; + } + /** \return true is discard operation is supported else true. */ + bool discard() const { return discardFule & 2; } + /** \return eraseSize in AUs. */ + uint16_t eraseSizeAU() const { + return (uint16_t)eraseSize[0] << 8 | (uint16_t)eraseSize[1]; + } + /** \return eraseTimeout seconds. */ + uint8_t eraseTimeout() const { return eraseTimeoutOffset >> 2; } + /** \return eraseOffset seconds. */ + uint8_t eraseOffset() const { return eraseTimeoutOffset & 3; } + /** \return true if full user logical erase is supported else false. */ + bool fule() const { return discardFule & 1; } + /** \return true for secure mode else false. */ + bool secureMode() const { return busWidthSecureMode & 0X20; } + /** \return speed class or -1 for error. */ + int speedClass() const { + return speed < 4 ? 2 * speed : speed == 4 ? 10 : -1; + } + /** \return UHS Speed Grade. */ + int uhsClass() const { return uhsClassAuSize >> 4; } + /** \return Video Speed */ + int videoClass() { return videoSpeedClass; } +}; #endif // SdCardInfo_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInterface.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInterface.h index 5bb9b507..586fbdd3 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInterface.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdCardInterface.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,22 +22,28 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Abstract interface for an SD card. + */ #ifndef SdCardInterface_h #define SdCardInterface_h -#include "../common/BlockDeviceInterface.h" +#include "../common/FsBlockDeviceInterface.h" #include "SdCardInfo.h" - - -namespace sdfat { - - /** * \class SdCardInterface * \brief Abstract interface for an SD card. */ -class SdCardInterface : public BlockDeviceInterface { +class SdCardInterface : public FsBlockDeviceInterface { public: - /** Erase a range of sectors. + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. + * + * \return true for success or false for failure. + */ + virtual bool cardCMD6(uint32_t arg, uint8_t* status) = 0; + /** Erase a range of sectors. * * \param[in] firstSector The address of the first sector in the range. * \param[in] lastSector The address of the last sector in the range. @@ -49,8 +55,20 @@ class SdCardInterface : public BlockDeviceInterface { virtual uint8_t errorCode() const = 0; /** \return error data. */ virtual uint32_t errorData() const = 0; - /** \return true if card is busy. */ - virtual bool isBusy() = 0; + /** \return false by default */ + virtual bool hasDedicatedSpi() { return false; } + /** \return false by default */ + bool virtual isDedicatedSpi() { return false; } + /** \return false by default */ + bool virtual isSpi() { return false; } + /** Set SPI sharing state + * \param[in] value desired state. + * \return false by default. + */ + virtual bool setDedicatedSpi(bool value) { + (void)value; + return false; + } /** * Read a card's CID register. * @@ -59,7 +77,7 @@ class SdCardInterface : public BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readCID(cid_t* cid) = 0; - /** + /** * Read a card's CSD register. * * \param[out] csd pointer to area for returned data. @@ -73,15 +91,19 @@ class SdCardInterface : public BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readOCR(uint32_t* ocr) = 0; - /** - * Determine the size of an SD flash memory card. + /** Read SCR register. * - * \return The number of 512 byte data sectors in the card - * or zero if an error occurs. + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. */ - virtual uint32_t sectorCount() = 0; + virtual bool readSCR(scr_t* scr) = 0; + /** Return the 64 byte SD Status register. + * \param[out] sds location for 64 status bytes. + * \return true for success or false for failure. + */ + virtual bool readSDS(sds_t* sds) = 0; /** \return card status. */ - virtual uint32_t status() {return 0XFFFFFFFF;} + virtual uint32_t status() { return 0XFFFFFFFF; } /** Return the card type: SD V1, SD V2 or SDHC/SDXC * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC. */ @@ -104,8 +126,4 @@ class SdCardInterface : public BlockDeviceInterface { */ virtual bool writeStop() = 0; }; - - -}; // namespace sdfat - #endif // SdCardInterface_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.cpp index 4052cd3d..e924336c 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,118 +23,18 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiCard.h" - - -namespace sdfat { - - - //============================================================================== -// Debug aids -#define DBG_PROFILE_STATS 0 -#if DBG_PROFILE_STATS +class Timeout { + public: + Timeout() {} + explicit Timeout(uint16_t ms) { set(ms); } + uint16_t millis16() { return millis(); } + void set(uint16_t ms) { m_endTime = ms + millis16(); } + bool timedOut() { return (int16_t)(m_endTime - millis16()) < 0; } -#define DBG_TAG_LIST\ - DBG_TAG(DBG_CMD0_TIME, "CMD0 time")\ - DBG_TAG(DBG_ACMD41_TIME, "ACMD41 time")\ - DBG_TAG(DBG_CMD_BUSY, "cmd busy")\ - DBG_TAG(DBG_ERASE_BUSY, "erase busy")\ - DBG_TAG(DBG_WAIT_READ, "wait read")\ - DBG_TAG(DBG_WRITE_FLASH, "write flash")\ - DBG_TAG(DBG_WRITE_BUSY, "write busy")\ - DBG_TAG(DBG_WRITE_STOP, "write stop")\ - DBG_TAG(DBG_ACMD41_COUNT, "ACMD41 count")\ - DBG_TAG(DBG_CMD0_COUNT, "CMD0 count") - -#define DBG_TIME_DIM DBG_ACMD41_COUNT - -enum DbgTag { - #define DBG_TAG(tag, str) tag, - DBG_TAG_LIST - DBG_COUNT_DIM - #undef DBG_TAG + private: + uint16_t m_endTime; }; - -static uint32_t dbgCount[DBG_COUNT_DIM]; -static uint32_t dbgBgnTime[DBG_TIME_DIM]; -static uint32_t dbgMaxTime[DBG_TIME_DIM]; -static uint32_t dbgMinTime[DBG_TIME_DIM]; -static uint32_t dbgTotalTime[DBG_TIME_DIM]; -//------------------------------------------------------------------------------ -static void dbgBeginTime(DbgTag tag) { - dbgBgnTime[tag] = micros(); -} -//------------------------------------------------------------------------------ -static void dbgClearStats() { - for (int i = 0; i < DBG_COUNT_DIM; i++) { - dbgCount[i] = 0; - if (i < DBG_TIME_DIM) { - dbgMaxTime[i] = 0; - dbgMinTime[i] = 9999999; - dbgTotalTime[i] = 0; - } - } -} -//------------------------------------------------------------------------------ -static void dbgEndTime(DbgTag tag) { - uint32_t m = micros() - dbgBgnTime[tag]; - dbgTotalTime[tag] += m; - if (m > dbgMaxTime[tag]) { - dbgMaxTime[tag] = m; - } - if (m < dbgMinTime[tag]) { - dbgMinTime[tag] = m; - } - dbgCount[tag]++; -} -//------------------------------------------------------------------------------ -static void dbgEventCount(DbgTag tag) { - dbgCount[tag]++; -} -//------------------------------------------------------------------------------ -static void dbgPrintTagText(uint8_t tag) { - #define DBG_TAG(e, m) case e: Serial.print(F(m)); break; - switch (tag) { - DBG_TAG_LIST - } - #undef DBG_TAG -} -//------------------------------------------------------------------------------ -static void dbgPrintStats() { - Serial.println(); - Serial.println(F("=======================")); - Serial.println(F("item,event,min,max,avg")); - Serial.println(F("tag,count,usec,usec,usec")); - for (int i = 0; i < DBG_COUNT_DIM; i++) { - if (dbgCount[i]) { - dbgPrintTagText(i); - Serial.print(','); - Serial.print(dbgCount[i]); - if (i < DBG_TIME_DIM) { - Serial.print(','); - Serial.print(dbgMinTime[i]); - Serial.print(','); - Serial.print(dbgMaxTime[i]); - Serial.print(','); - Serial.print(dbgTotalTime[i]/dbgCount[i]); - } - Serial.println(); - } - } - Serial.println(F("=======================")); - Serial.println(); -} -#undef DBG_TAG_LIST -#define DBG_BEGIN_TIME(tag) dbgBeginTime(tag) -#define DBG_END_TIME(tag) dbgEndTime(tag) -#define DBG_EVENT_COUNT(tag) dbgEventCount(tag) -#else // DBG_PROFILE_STATS -#define DBG_BEGIN_TIME(tag) -#define DBG_END_TIME(tag) -#define DBG_EVENT_COUNT(tag) -static void dbgClearStats() {} -static void dbgPrintStats() {} -#endif // DBG_PROFILE_STATS //============================================================================== #if USE_SD_CRC // CRC functions @@ -174,48 +74,44 @@ static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { // uses the x^16,x^12,x^5,x^1 polynomial. #ifdef __AVR__ static const uint16_t crctab[] PROGMEM = { -#else // __AVR__ +#else // __AVR__ static const uint16_t crctab[] = { #endif // __AVR__ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, - 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, - 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, - 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, - 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, - 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, - 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, - 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, - 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, - 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, - 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, - 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, - 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, - 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, - 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, - 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, - 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, - 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, - 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, - 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, - 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, - 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, - 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, - 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, - 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, - 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, - 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, - 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, - 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; + 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, + 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, + 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, + 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, + 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, + 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, + 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, + 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, + 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, + 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, + 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, + 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, + 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, + 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, + 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, + 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, + 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, + 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, + 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, + 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, + 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, + 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, + 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, + 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, + 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, + 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, + 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, + 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, + 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0}; static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { #ifdef __AVR__ crc = pgm_read_word(&crctab[(crc >> 8 ^ data[i]) & 0XFF]) ^ (crc << 8); -#else // __AVR__ +#else // __AVR__ crc = crctab[(crc >> 8 ^ data[i]) & 0XFF] ^ (crc << 8); #endif // __AVR__ } @@ -224,12 +120,15 @@ static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { #endif // CRC_CCITT #endif // USE_SD_CRC //============================================================================== -// SdSpiCard member functions +// SharedSpiCard member functions //------------------------------------------------------------------------------ -bool SdSpiCard::begin(SdSpiConfig spiConfig) { - SdMillis_t t0 = SysCall::curTimeMS(); +bool SharedSpiCard::begin(SdSpiConfig spiConfig) { + uint8_t cardType; + uint32_t arg; + Timeout timeout; + // Restore state to creator. + initSharedSpiCard(); m_errorCode = SD_CARD_ERROR_NONE; - m_type = 0; m_csPin = spiConfig.csPin; #if SPI_DRIVER_SELECT >= 2 m_spiDriverPtr = spiConfig.spiPort; @@ -240,88 +139,71 @@ bool SdSpiCard::begin(SdSpiConfig spiConfig) { #endif // SPI_DRIVER_SELECT sdCsInit(m_csPin); spiUnselect(); - spiSetSckSpeed(1000UL*SD_MAX_INIT_RATE_KHZ); + spiSetSckSpeed(1000UL * SD_MAX_INIT_RATE_KHZ); spiBegin(spiConfig); - uint32_t arg; -#if ENABLE_DEDICATED_SPI - m_sharedSpi = !(spiConfig.options & DEDICATED_SPI); - m_spiActive = false; - m_curState = IDLE_STATE; -#else // ENABLE_DEDICATED_SPI - if (spiConfig.options & DEDICATED_SPI) { - error(SD_CARD_ERROR_INVALID_CARD_CONFIG); - goto fail; - } -#endif // ENABLE_DEDICATED_SPI + m_beginCalled = true; spiStart(); // must supply min of 74 clock cycles with CS high. spiUnselect(); for (uint8_t i = 0; i < 10; i++) { - spiSend(0XFF); + spiReceive(); } spiSelect(); - DBG_BEGIN_TIME(DBG_CMD0_TIME); - // command to go idle in SPI mode - for (uint8_t i = 1;; i++) { - DBG_EVENT_COUNT(DBG_CMD0_COUNT); + timeout.set(SD_INIT_TIMEOUT); + while (true) { + // command to go idle in SPI mode if (cardCommand(CMD0, 0) == R1_IDLE_STATE) { break; } - if (i == SD_CMD0_RETRY) { + if (timeout.timedOut()) { error(SD_CARD_ERROR_CMD0); goto fail; } - // stop multi-block write - spiSend(STOP_TRAN_TOKEN); - // finish block transfer - for (int i = 0; i < 520; i++) { - spiReceive(); - } } - DBG_END_TIME(DBG_CMD0_TIME); #if USE_SD_CRC if (cardCommand(CMD59, 1) != R1_IDLE_STATE) { error(SD_CARD_ERROR_CMD59); goto fail; } #endif // USE_SD_CRC - // check SD version - if (!(cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND)) { - type(SD_CARD_TYPE_SD2); + while (true) { + if (cardCommand(CMD8, 0x1AA) & R1_ILLEGAL_COMMAND) { + cardType = SD_CARD_TYPE_SD1; + break; + } + // Skip first three bytes. for (uint8_t i = 0; i < 4; i++) { m_status = spiReceive(); } - if (m_status != 0XAA) { + if (m_status == 0XAA) { + cardType = SD_CARD_TYPE_SD2; + break; + } + if (timeout.timedOut()) { error(SD_CARD_ERROR_CMD8); goto fail; } - } else { - type(SD_CARD_TYPE_SD1); } // initialize card and send host supports SDHC if SD2 - arg = type() == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; - DBG_BEGIN_TIME(DBG_ACMD41_TIME); + arg = cardType == SD_CARD_TYPE_SD2 ? 0X40000000 : 0; while (cardAcmd(ACMD41, arg) != R1_READY_STATE) { - DBG_EVENT_COUNT(DBG_ACMD41_COUNT); // check for timeout - if (isTimedOut(t0, SD_INIT_TIMEOUT)) { + if (timeout.timedOut()) { error(SD_CARD_ERROR_ACMD41); goto fail; } } - DBG_END_TIME(DBG_ACMD41_TIME); - // if SD2 read OCR register to check for SDHC card - if (type() == SD_CARD_TYPE_SD2) { + if (cardType == SD_CARD_TYPE_SD2) { if (cardCommand(CMD58, 0)) { error(SD_CARD_ERROR_CMD58); goto fail; } if ((spiReceive() & 0XC0) == 0XC0) { - type(SD_CARD_TYPE_SDHC); + cardType = SD_CARD_TYPE_SDHC; } // Discard rest of ocr - contains allowed voltage range. for (uint8_t i = 0; i < 3; i++) { @@ -330,26 +212,42 @@ bool SdSpiCard::begin(SdSpiConfig spiConfig) { } spiStop(); spiSetSckSpeed(spiConfig.maxSck); + m_type = cardType; return true; - fail: +fail: + spiStop(); + return false; +} +//------------------------------------------------------------------------------ +bool SharedSpiCard::cardCMD6(uint32_t arg, uint8_t* status) { + if (cardCommand(CMD6, arg)) { + error(SD_CARD_ERROR_CMD6); + goto fail; + } + if (!readData(status, 64)) { + goto fail; + } + spiStop(); + return true; + +fail: spiStop(); return false; } //------------------------------------------------------------------------------ // send command and return error code. Return zero for OK -uint8_t SdSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { +uint8_t SharedSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { + if (!syncDevice()) { + return 0XFF; + } // select card if (!m_spiActive) { spiStart(); } - // wait if busy unless CMD0 - if (cmd != CMD0) { - DBG_BEGIN_TIME(DBG_CMD_BUSY); - waitNotBusy(SD_CMD_TIMEOUT); - DBG_END_TIME(DBG_CMD_BUSY); + if (cmd != CMD0 && cmd != CMD12 && !waitReady(SD_CMD_TIMEOUT)) { + return 0XFF; } - #if USE_SD_CRC // form message uint8_t buf[6]; @@ -364,7 +262,7 @@ uint8_t SdSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { // send message spiSend(buf, 6); -#else // USE_SD_CRC +#else // USE_SD_CRC // send command spiSend(cmd | 0x40); @@ -382,107 +280,92 @@ uint8_t SdSpiCard::cardCommand(uint8_t cmd, uint32_t arg) { spiReceive(); // there are 1-8 fill bytes before response. fill bytes should be 0XFF. - for (uint8_t i = 0; ((m_status = spiReceive()) & 0X80) && i < 10; i++) { - } + uint8_t n = 0; + do { + m_status = spiReceive(); + } while (m_status & 0X80 && ++n < 10); return m_status; } //------------------------------------------------------------------------------ -void SdSpiCard::dbgClearStats() {sdfat::dbgClearStats();} +void SharedSpiCard::end() { + if (m_beginCalled) { + syncDevice(); + spiEnd(); + m_beginCalled = false; + } +} //------------------------------------------------------------------------------ -void SdSpiCard::dbgPrintStats() {sdfat::dbgPrintStats();} -//------------------------------------------------------------------------------ -bool SdSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { +bool SharedSpiCard::erase(uint32_t firstSector, uint32_t lastSector) { csd_t csd; if (!readCSD(&csd)) { goto fail; } // check for single sector erase - if (!csd.v1.erase_blk_en) { + if (!csd.eraseSingleBlock()) { // erase size mask - uint8_t m = (csd.v1.sector_size_high << 1) | csd.v1.sector_size_low; + uint8_t m = csd.eraseSize() - 1; if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { // error card can't erase specified area error(SD_CARD_ERROR_ERASE_SINGLE_SECTOR); goto fail; } } - if (m_type != SD_CARD_TYPE_SDHC) { + if (type() != SD_CARD_TYPE_SDHC) { firstSector <<= 9; lastSector <<= 9; } - if (cardCommand(CMD32, firstSector) - || cardCommand(CMD33, lastSector) - || cardCommand(CMD38, 0)) { + if (cardCommand(CMD32, firstSector) || cardCommand(CMD33, lastSector) || + cardCommand(CMD38, 0)) { error(SD_CARD_ERROR_ERASE); goto fail; } - DBG_BEGIN_TIME(DBG_ERASE_BUSY); - if (!waitNotBusy(SD_ERASE_TIMEOUT)) { + if (!waitReady(SD_ERASE_TIMEOUT)) { error(SD_CARD_ERROR_ERASE_TIMEOUT); goto fail; } - DBG_END_TIME(DBG_ERASE_BUSY); spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::eraseSingleSectorEnable() { +bool SharedSpiCard::eraseSingleSectorEnable() { csd_t csd; - return readCSD(&csd) ? csd.v1.erase_blk_en : false; + return readCSD(&csd) ? csd.eraseSingleBlock() : false; } //------------------------------------------------------------------------------ -bool SdSpiCard::isBusy() { - bool rtn = true; +bool SharedSpiCard::isBusy() { + if (m_state == READ_STATE) { + return false; + } bool spiActive = m_spiActive; if (!spiActive) { spiStart(); } - for (uint8_t i = 0; i < 8; i++) { - if (0XFF == spiReceive()) { - rtn = false; - break; - } - } + bool rtn = 0XFF != spiReceive(); if (!spiActive) { spiStop(); } return rtn; } //------------------------------------------------------------------------------ -bool SdSpiCard::isTimedOut(SdMillis_t startMS, SdMillis_t timeoutMS) { -#if WDT_YIELD_TIME_MILLIS - static SdMillis_t last; - if ((SysCall::curTimeMS() - last) > WDT_YIELD_TIME_MILLIS) { - SysCall::yield(); - last = SysCall::curTimeMS(); - } -#endif // WDT_YIELD_TIME_MILLIS - return (SysCall::curTimeMS() - startMS) > timeoutMS; -} +bool SharedSpiCard::readData(uint8_t* dst) { return readData(dst, 512); } //------------------------------------------------------------------------------ -bool SdSpiCard::readData(uint8_t* dst) { - return readData(dst, 512); -} -//------------------------------------------------------------------------------ -bool SdSpiCard::readData(uint8_t* dst, size_t count) { +bool SharedSpiCard::readData(uint8_t* dst, size_t count) { #if USE_SD_CRC uint16_t crc; #endif // USE_SD_CRC - DBG_BEGIN_TIME(DBG_WAIT_READ); // wait for start sector token - SdMillis_t t0 = SysCall::curTimeMS(); + Timeout timeout(SD_READ_TIMEOUT); while ((m_status = spiReceive()) == 0XFF) { - if (isTimedOut(t0, SD_READ_TIMEOUT)) { + if (timeout.timedOut()) { error(SD_CARD_ERROR_READ_TIMEOUT); goto fail; } } - DBG_END_TIME(DBG_WAIT_READ); if (m_status != DATA_START_SECTOR) { error(SD_CARD_ERROR_READ_TOKEN); goto fail; @@ -500,40 +383,42 @@ bool SdSpiCard::readData(uint8_t* dst, size_t count) { error(SD_CARD_ERROR_READ_CRC); goto fail; } -#else // USE_SD_CRC +#else // USE_SD_CRC // discard crc spiReceive(); spiReceive(); #endif // USE_SD_CRC return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::readOCR(uint32_t* ocr) { +bool SharedSpiCard::readOCR(uint32_t* ocr) { uint8_t* p = reinterpret_cast(ocr); - syncDevice(); if (cardCommand(CMD58, 0)) { error(SD_CARD_ERROR_CMD58); goto fail; } for (uint8_t i = 0; i < 4; i++) { +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ p[3 - i] = spiReceive(); +#else // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + p[i] = spiReceive(); +#endif // __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ } spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ /** read CID or CSR register */ -bool SdSpiCard::readRegister(uint8_t cmd, void* buf) { +bool SharedSpiCard::readRegister(uint8_t cmd, void* buf) { uint8_t* dst = reinterpret_cast(buf); - syncDevice(); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); goto fail; @@ -544,12 +429,29 @@ bool SdSpiCard::readRegister(uint8_t cmd, void* buf) { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::readSingle(uint32_t sector, uint8_t* dst) { +bool SharedSpiCard::readSCR(scr_t* scr) { + uint8_t* dst = reinterpret_cast(scr); + if (cardAcmd(ACMD51, 0)) { + error(SD_CARD_ERROR_ACMD51); + goto fail; + } + if (!readData(dst, sizeof(scr_t))) { + goto fail; + } + spiStop(); + return true; + +fail: + spiStop(); + return false; +} +//------------------------------------------------------------------------------ +bool SharedSpiCard::readSector(uint32_t sector, uint8_t* dst) { // use address if not SDHC card if (type() != SD_CARD_TYPE_SDHC) { sector <<= 9; @@ -564,12 +466,26 @@ bool SdSpiCard::readSingle(uint32_t sector, uint8_t* dst) { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::readStart(uint32_t sector) { +bool SharedSpiCard::readSectors(uint32_t sector, uint8_t* dst, size_t ns) { + if (!readStart(sector)) { + goto fail; + } + for (size_t i = 0; i < ns; i++, dst += 512) { + if (!readData(dst, 512)) { + goto fail; + } + } + return readStop(); +fail: + return false; +} +//------------------------------------------------------------------------------ +bool SharedSpiCard::readStart(uint32_t sector) { if (type() != SD_CARD_TYPE_SDHC) { sector <<= 9; } @@ -577,64 +493,34 @@ bool SdSpiCard::readStart(uint32_t sector) { error(SD_CARD_ERROR_CMD18); goto fail; } -// spiStop(); + m_state = READ_STATE; return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::readStatus(uint8_t* status) { +bool SharedSpiCard::readSDS(sds_t* sds) { + uint8_t* dst = reinterpret_cast(sds); // retrun is R2 so read extra status byte. if (cardAcmd(ACMD13, 0) || spiReceive()) { error(SD_CARD_ERROR_ACMD13); goto fail; } - if (!readData(status, 64)) { + if (!readData(dst, sizeof(sds_t))) { goto fail; } spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::readSectors(uint32_t sector, uint8_t* dst, size_t ns) { -#if ENABLE_DEDICATED_SPI - if (m_curState != READ_STATE || sector != m_curSector) { - if (!syncDevice()) { - return false; - } - if (!SdSpiCard::readStart(sector)) { - return false; - } - m_curSector = sector; - m_curState = READ_STATE; - } - for (size_t i = 0; i < ns; i++, dst += 512) { - if (!readData(dst, 512)) { - return false; - } - } - m_curSector += ns; - return m_sharedSpi ? syncDevice() : true; -#else // ENABLE_DEDICATED_SPI - if (!readStart(sector)) { - return false; - } - for (size_t i = 0; i < ns; i++, dst += 512) { - if (!readData(dst, 512)) { - return false; - } - } - return readStop(); -#endif // ENABLE_DEDICATED_SPI -} -//------------------------------------------------------------------------------ -bool SdSpiCard::readStop() { +bool SharedSpiCard::readStop() { + m_state = IDLE_STATE; if (cardCommand(CMD12, 0)) { error(SD_CARD_ERROR_CMD12); goto fail; @@ -642,94 +528,79 @@ bool SdSpiCard::readStop() { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -uint32_t SdSpiCard::sectorCount() { +uint32_t SharedSpiCard::sectorCount() { csd_t csd; - return readCSD(&csd) ? sdCardCapacity(&csd) : 0; + return readCSD(&csd) ? csd.capacity() : 0; } //------------------------------------------------------------------------------ -void SdSpiCard::spiStart() { +void SharedSpiCard::spiStart() { + SPI_ASSERT_NOT_ACTIVE; if (!m_spiActive) { spiActivate(); - spiSelect(); m_spiActive = true; + spiSelect(); + // Dummy byte to drive MISO busy status. + spiSend(0XFF); } } //------------------------------------------------------------------------------ -void SdSpiCard::spiStop() { +void SharedSpiCard::spiStop() { + SPI_ASSERT_ACTIVE; if (m_spiActive) { spiUnselect(); + // Insure MISO goes to low Z. spiSend(0XFF); spiDeactivate(); m_spiActive = false; } } //------------------------------------------------------------------------------ -bool SdSpiCard::syncDevice() { -#if ENABLE_DEDICATED_SPI - if (m_curState == READ_STATE) { - if (!SdSpiCard::readStop()) { - return false; - } - } else if (m_curState == WRITE_STATE) { - if (!SdSpiCard::writeStop()) { - return false; - } +bool SharedSpiCard::syncDevice() { + if (m_state == WRITE_STATE) { + return writeStop(); + } + if (m_state == READ_STATE) { + return readStop(); } - m_curState = IDLE_STATE; -#endif // ENABLE_DEDICATED_SPI return true; } //------------------------------------------------------------------------------ -// wait for card to go not busy -bool SdSpiCard::waitNotBusy(SdMillis_t timeoutMS) { - SdMillis_t t0 = SysCall::curTimeMS(); -#if WDT_YIELD_TIME_MILLIS - // Call isTimedOut first to insure yield is called. - while (!isTimedOut(t0, timeoutMS)) { - if (spiReceive() == 0XFF) { - return true; - } - } - return false; -#else // WDT_YIELD_TIME_MILLIS - // Check not busy first since yield is not called in isTimedOut. +bool SharedSpiCard::waitReady(uint16_t ms) { + Timeout timeout(ms); while (spiReceive() != 0XFF) { - if (isTimedOut(t0, timeoutMS)) { + if (timeout.timedOut()) { return false; } } return true; -#endif // WDT_YIELD_TIME_MILLIS } //------------------------------------------------------------------------------ -bool SdSpiCard::writeData(const uint8_t* src) { +bool SharedSpiCard::writeData(const uint8_t* src) { // wait for previous write to finish - DBG_BEGIN_TIME(DBG_WRITE_BUSY); - if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + if (!waitReady(SD_WRITE_TIMEOUT)) { error(SD_CARD_ERROR_WRITE_TIMEOUT); goto fail; } - DBG_END_TIME(DBG_WRITE_BUSY); if (!writeData(WRITE_MULTIPLE_TOKEN, src)) { goto fail; } return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ // send one sector of data for write sector or write multiple sectors -bool SdSpiCard::writeData(uint8_t token, const uint8_t* src) { +bool SharedSpiCard::writeData(uint8_t token, const uint8_t* src) { #if USE_SD_CRC uint16_t crc = CRC_CCITT(src, 512); -#else // USE_SD_CRC +#else // USE_SD_CRC uint16_t crc = 0XFFFF; #endif // USE_SD_CRC spiSend(token); @@ -744,12 +615,12 @@ bool SdSpiCard::writeData(uint8_t token, const uint8_t* src) { } return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::writeSingle(uint32_t sector, const uint8_t* src) { +bool SharedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { // use address if not SDHC card if (type() != SD_CARD_TYPE_SDHC) { sector <<= 9; @@ -764,12 +635,10 @@ bool SdSpiCard::writeSingle(uint32_t sector, const uint8_t* src) { #if CHECK_FLASH_PROGRAMMING // wait for flash programming to complete - DBG_BEGIN_TIME(DBG_WRITE_FLASH); - if (!waitNotBusy(SD_WRITE_TIMEOUT)) { + if (!waitReady(SD_WRITE_TIMEOUT)) { error(SD_CARD_ERROR_WRITE_PROGRAMMING); goto fail; } - DBG_END_TIME(DBG_WRITE_FLASH); // response is r2 so get and check two bytes for nonzero if (cardCommand(CMD13, 0) || spiReceive()) { error(SD_CARD_ERROR_CMD13); @@ -780,31 +649,13 @@ bool SdSpiCard::writeSingle(uint32_t sector, const uint8_t* src) { spiStop(); return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::writeSectors(uint32_t sector, const uint8_t* src, size_t ns) { - #if ENABLE_DEDICATED_SPI - if (m_curState != WRITE_STATE || m_curSector != sector) { - if (!syncDevice()) { - return false; - } - if (!writeStart(sector)) { - return false; - } - m_curSector = sector; - m_curState = WRITE_STATE; - } - for (size_t i = 0; i < ns; i++, src += 512) { - if (!writeData(src)) { - return false; - } - } - m_curSector += ns; - return m_sharedSpi ? syncDevice() : true; -#else // ENABLE_DEDICATED_SPI +bool SharedSpiCard::writeSectors(uint32_t sector, const uint8_t* src, + size_t ns) { if (!writeStart(sector)) { goto fail; } @@ -815,13 +666,12 @@ bool SdSpiCard::writeSectors(uint32_t sector, const uint8_t* src, size_t ns) { } return writeStop(); - fail: +fail: spiStop(); return false; -#endif // ENABLE_DEDICATED_SPI } //------------------------------------------------------------------------------ -bool SdSpiCard::writeStart(uint32_t sector) { +bool SharedSpiCard::writeStart(uint32_t sector) { // use address if not SDHC card if (type() != SD_CARD_TYPE_SDHC) { sector <<= 9; @@ -830,49 +680,91 @@ bool SdSpiCard::writeStart(uint32_t sector) { error(SD_CARD_ERROR_CMD25); goto fail; } + m_state = WRITE_STATE; return true; - fail: +fail: spiStop(); return false; } //------------------------------------------------------------------------------ -bool SdSpiCard::writeStart(uint32_t blockNumber, uint32_t eraseCount) { - // send pre-erase count - if (cardAcmd(ACMD23, eraseCount)) { - error(SD_CARD_ERROR_ACMD23); +bool SharedSpiCard::writeStop() { + if (!waitReady(SD_WRITE_TIMEOUT)) { goto fail; } - // use address if not SDHC card - if (type() != SD_CARD_TYPE_SDHC) { - blockNumber <<= 9; - } - if (cardCommand(CMD25, blockNumber)) { - error(SD_CARD_ERROR_CMD25); - goto fail; - } - return true; - - fail: - spiStop(); - return false; -} -//------------------------------------------------------------------------------ -bool SdSpiCard::writeStop() { - DBG_BEGIN_TIME(DBG_WRITE_STOP); - if (!waitNotBusy(SD_WRITE_TIMEOUT)) { - goto fail; - } - DBG_END_TIME(DBG_WRITE_STOP); spiSend(STOP_TRAN_TOKEN); spiStop(); + m_state = IDLE_STATE; return true; - fail: +fail: error(SD_CARD_ERROR_STOP_TRAN); spiStop(); return false; } +//============================================================================== +bool DedicatedSpiCard::begin(SdSpiConfig spiConfig) { + if (!SharedSpiCard::begin(spiConfig)) { + return false; + } + m_dedicatedSpi = spiOptionDedicated(spiConfig.options); + return true; +} +//------------------------------------------------------------------------------ +bool DedicatedSpiCard::readSector(uint32_t sector, uint8_t* dst) { + return readSectors(sector, dst, 1); +} +//------------------------------------------------------------------------------ +bool DedicatedSpiCard::readSectors(uint32_t sector, uint8_t* dst, size_t ns) { + if (sdState() != READ_STATE || sector != m_curSector) { + if (!readStart(sector)) { + goto fail; + } + m_curSector = sector; + } + for (size_t i = 0; i < ns; i++, dst += 512) { + if (!readData(dst)) { + goto fail; + } + } + m_curSector += ns; + return m_dedicatedSpi ? true : readStop(); +fail: + return false; +} +//------------------------------------------------------------------------------ +bool DedicatedSpiCard::setDedicatedSpi(bool value) { + if (!syncDevice()) { + return false; + } + m_dedicatedSpi = value; + return true; +} +//------------------------------------------------------------------------------ +bool DedicatedSpiCard::writeSector(uint32_t sector, const uint8_t* src) { + if (m_dedicatedSpi) { + return writeSectors(sector, src, 1); + } + return SharedSpiCard::writeSector(sector, src); +} +//------------------------------------------------------------------------------ +bool DedicatedSpiCard::writeSectors(uint32_t sector, const uint8_t* src, + size_t ns) { + if (sdState() != WRITE_STATE || m_curSector != sector) { + if (!writeStart(sector)) { + goto fail; + } + m_curSector = sector; + } + for (size_t i = 0; i < ns; i++, src += 512) { + if (!writeData(src)) { + goto fail; + } + } + m_curSector += ns; + return m_dedicatedSpi ? true : writeStop(); -}; // namespace sdfat +fail: + return false; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.h index befd2b65..4b1477c3 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdSpiCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,61 +24,79 @@ */ /** * \file - * \brief SdSpiCard class for V2 SD/SDHC cards + * \brief Classes for SPI access to SD/SDHC cards. */ #ifndef SdSpiCard_h #define SdSpiCard_h #include + +#include "../SpiDriver/SdSpiDriver.h" #include "../common/SysCall.h" #include "SdCardInfo.h" #include "SdCardInterface.h" -#include "../SpiDriver/SdSpiDriver.h" - -#ifdef HOST_MOCK -extern uint64_t _sdCardSizeB; -extern uint8_t *_sdCard; -#endif - - -namespace sdfat { - - +/** Verify correct SPI active if non-zero. */ +#define CHECK_SPI_ACTIVE 0 +#if CHECK_SPI_ACTIVE +/** Check SPI active. */ +#define SPI_ASSERT_ACTIVE \ + { \ + if (!m_spiActive) { \ + Serial.print(F("SPI_ASSERT_ACTIVE")); \ + Serial.println(__LINE__); \ + while (true) \ + ; \ + } \ + } +#define SPI_ASSERT_NOT_ACTIVE \ + { \ + if (m_spiActive) { \ + Serial.print(F("SPI_ASSERT_NOT_ACTIVE")); \ + Serial.println(__LINE__); \ + while (true) \ + ; \ + } \ + } +#else // CHECK_SPI_ACTIVE +/** Check for SPI active. */ +#define SPI_ASSERT_ACTIVE +/** Check for SPI not active. */ +#define SPI_ASSERT_NOT_ACTIVE +#endif // CHECK_SPI_ACTIVE //============================================================================== /** - * \class SdSpiCard - * \brief Raw access to SD and SDHC flash memory cards via SPI protocol. + * \class SharedSpiCard + * \brief Raw access to SD and SDHC flash memory cards via shared SPI port. */ #if HAS_SDIO_CLASS -class SdSpiCard : public SdCardInterface { +class SharedSpiCard : public SdCardInterface { #elif USE_BLOCK_DEVICE_INTERFACE -class SdSpiCard : public BlockDeviceInterface { -#else // HAS_SDIO_CLASS -class SdSpiCard { +class SharedSpiCard : public FsBlockDeviceInterface { +#else // HAS_SDIO_CLASS +class SharedSpiCard { #endif // HAS_SDIO_CLASS -#ifndef HOST_MOCK public: - /** Construct an instance of SdSpiCard. */ - SdSpiCard() : m_errorCode(SD_CARD_ERROR_INIT_NOT_CALLED), m_type(0) {} + /** SD is in idle state */ + static const uint8_t IDLE_STATE = 0; + /** SD is in multi-sector read state. */ + static const uint8_t READ_STATE = 1; + /** SD is in multi-sector write state. */ + static const uint8_t WRITE_STATE = 2; + /** Construct an instance of SharedSpiCard. */ + SharedSpiCard() { initSharedSpiCard(); } /** Initialize the SD card. * \param[in] spiConfig SPI card configuration. * \return true for success or false for failure. */ bool begin(SdSpiConfig spiConfig); - /** Clear debug stats. */ - void dbgClearStats(); - /** Print debug stats. */ - void dbgPrintStats(); - /** - * Determine the size of an SD flash memory card. + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. * - * \return The number of 512 byte data sectors in the card - * or zero if an error occurs. + * \return true for success or false for failure. */ - uint32_t sectorCount(); -#ifndef DOXYGEN_SHOULD_SKIP_THIS - // Use sectorCount(). cardSize() will be removed in the future. - uint32_t cardSize() __attribute__ ((deprecated)) {return sectorCount();} -#endif // DOXYGEN_SHOULD_SKIP_THIS + bool cardCMD6(uint32_t arg, uint8_t* status); + /** End use of card */ + void end(); /** Erase a range of sectors. * * \param[in] firstSector The address of the first sector in the range. @@ -103,56 +121,28 @@ class SdSpiCard { * \param[in] code value for error code. */ void error(uint8_t code) { + // (void)code; m_errorCode = code; } /** - * \return code for the last error. See SdCardInfo.h for a list of error codes. + * \return code for the last error. See SdCardInfo.h for a list of error + * codes. */ - uint8_t errorCode() const { - return m_errorCode; - } + uint8_t errorCode() const { return m_errorCode; } /** \return error data for last error. */ - uint32_t errorData() const { - return m_status; - } + uint32_t errorData() const { return m_status; } + /** \return false for shared class. */ + bool hasDedicatedSpi() { return false; } /** * Check for busy. MISO low indicates the card is busy. * * \return true if busy else false. */ bool isBusy(); - - /** - * Read a 512 byte sector from an SD card. - * - * \param[in] sector Logical sector to be read. - * \param[out] dst Pointer to the location that will receive the data. - * \return true for success or false for failure. - */ - bool readSector(uint32_t sector, uint8_t* dst) { -#if ENABLE_DEDICATED_SPI - return readSectors(sector, dst, 1); -#else // ENABLE_DEDICATED_SPI - return readSingle(sector, dst); -#endif // ENABLE_DEDICATED_SPI - } - /** - * Read a 512 byte sector from an SD card. - * - * \param[in] sector Logical sector to be read. - * \param[out] dst Pointer to the location that will receive the data. - * \return true for success or false for failure. - */ - bool readSingle(uint32_t sector, uint8_t* dst); - /** - * Read multiple 512 byte sectors from an SD card. - * - * \param[in] sector Logical sector to be read. - * \param[in] ns Number of sectors to be read. - * \param[out] dst Pointer to the location that will receive the data. - * \return true for success or false for failure. - */ - bool readSectors(uint32_t sector, uint8_t* dst, size_t ns); + /** \return false, can't be in dedicated state. */ + bool isDedicatedSpi() { return false; } + /** \return true if card is on SPI bus. */ + bool isSpi() { return true; } /** * Read a card's CID register. The CID contains card identification * information such as Manufacturer ID, Product name, Product serial @@ -162,9 +152,7 @@ class SdSpiCard { * * \return true for success or false for failure. */ - bool readCID(cid_t* cid) { - return readRegister(CMD10, cid); - } + bool readCID(cid_t* cid) { return readRegister(CMD10, cid); } /** * Read a card's CSD register. The CSD contains Card-Specific Data that * provides information regarding access to the card's contents. @@ -173,9 +161,7 @@ class SdSpiCard { * * \return true for success or false for failure. */ - bool readCSD(csd_t* csd) { - return readRegister(CMD9, csd); - } + bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } /** Read one data sector in a multiple sector read sequence * * \param[out] dst Pointer to the location for the data to be read. @@ -189,6 +175,30 @@ class SdSpiCard { * \return true for success or false for failure. */ bool readOCR(uint32_t* ocr); + /** Read SCR register. + * + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. + */ + bool readSCR(scr_t* scr); + /** + * Read a 512 byte sector from an SD card. + * + * \param[in] sector Logical sector to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool readSector(uint32_t sector, uint8_t* dst); + /** + * Read multiple 512 byte sectors from an SD card. + * + * \param[in] sector Logical sector to be read. + * \param[in] ns Number of sectors to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool readSectors(uint32_t sector, uint8_t* dst, size_t ns); + /** Start a read multiple sector sequence. * * \param[in] sector Address of first sector in sequence. @@ -199,46 +209,56 @@ class SdSpiCard { * \return true for success or false for failure. */ bool readStart(uint32_t sector); - /** Return the 64 byte card status + /** Return the 64 byte SD Status register. * \param[out] status location for 64 status bytes. * \return true for success or false for failure. */ - bool readStatus(uint8_t* status); + bool readSDS(sds_t* status); /** End a read multiple sectors sequence. * * \return true for success or false for failure. */ bool readStop(); + /** \return SD multi-sector read/write state */ + uint8_t sdState() { return m_state; } + /** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data sectors in the card + * or zero if an error occurs. + */ + uint32_t sectorCount(); +#ifndef DOXYGEN_SHOULD_SKIP_THIS + // Use sectorCount(). cardSize() will be removed in the future. + uint32_t __attribute__((error("use sectorCount()"))) cardSize(); +#endif // DOXYGEN_SHOULD_SKIP_THIS + /** Set SPI sharing state + * \param[in] value desired state. + * \return false for shared card + */ + bool setDedicatedSpi(bool value) { + (void)value; + return false; + } + /** end a mult-sector transfer. + * + * \return true for success or false for failure. + */ + bool stopTransfer(); /** \return success if sync successful. Not for user apps. */ bool syncDevice(); /** Return the card type: SD V1, SD V2 or SDHC/SDXC * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC/SDXC. */ - uint8_t type() const { - return m_type; - } + uint8_t type() const { return m_type; } /** - * Writes a 512 byte sector to an SD card. + * Write a 512 byte sector to an SD card. * * \param[in] sector Logical sector to be written. * \param[in] src Pointer to the location of the data to be written. * \return true for success or false for failure. */ - bool writeSector(uint32_t sector, const uint8_t* src) { -#if ENABLE_DEDICATED_SPI - return writeSectors(sector, src, 1); -#else // ENABLE_DEDICATED_SPI - return writeSingle(sector, src); -#endif // ENABLE_DEDICATED_SPI - } - /** - * Writes a 512 byte sector to an SD card. - * - * \param[in] sector Logical sector to be written. - * \param[in] src Pointer to the location of the data to be written. - * \return true for success or false for failure. - */ - bool writeSingle(uint32_t sector, const uint8_t* src); + bool writeSector(uint32_t sector, const uint8_t* src); /** * Write multiple 512 byte sectors to an SD card. * @@ -264,26 +284,11 @@ class SdSpiCard { */ bool writeStart(uint32_t sector); - /** Start a write multiple sector sequence with pre-erase. - * - * \param[in] sector Address of first sector in sequence. - * \param[in] eraseCount The number of sectors to be pre-erased. - * - * \note This function is used with writeData() and writeStop() - * for optimized multiple sector writes. - * - * \return true for success or false for failure. - */ - bool writeStart(uint32_t sector, uint32_t eraseCount); /** End a write multiple sectors sequence. * * \return true for success or false for failure. */ bool writeStop(); - /** Set CS low and activate the card. */ - void spiStart(); - /** Set CS high and deactivate the card. */ - void spiStop(); private: // private functions @@ -292,150 +297,147 @@ class SdSpiCard { return cardCommand(cmd, arg); } uint8_t cardCommand(uint8_t cmd, uint32_t arg); - bool isTimedOut(SdMillis_t startMS, SdMillis_t timeoutMS); bool readData(uint8_t* dst, size_t count); bool readRegister(uint8_t cmd, void* buf); - void spiSelect() { - sdCsWrite(m_csPin, false); - } - void type(uint8_t value) { - m_type = value; - } - void spiUnselect() { - sdCsWrite(m_csPin, true); - } - bool waitNotBusy(SdMillis_t timeoutMS); + void spiSelect() { sdCsWrite(m_csPin, false); } + void spiStart(); + void spiStop(); + void spiUnselect() { sdCsWrite(m_csPin, true); } + bool waitReady(uint16_t ms); bool writeData(uint8_t token, const uint8_t* src); - #if SPI_DRIVER_SELECT < 2 - void spiActivate() { - m_spiDriver.activate(); - } - void spiBegin(SdSpiConfig spiConfig) { - m_spiDriver.begin(spiConfig); - } - void spiDeactivate() { - m_spiDriver.deactivate(); - } + void spiActivate() { m_spiDriver.activate(); } + void spiBegin(SdSpiConfig spiConfig) { m_spiDriver.begin(spiConfig); } + void spiDeactivate() { m_spiDriver.deactivate(); } + void spiEnd() { m_spiDriver.end(); } uint8_t spiReceive() { + SPI_ASSERT_ACTIVE; return m_spiDriver.receive(); } uint8_t spiReceive(uint8_t* buf, size_t n) { - return m_spiDriver.receive(buf, n); + SPI_ASSERT_ACTIVE; + return m_spiDriver.receive(buf, n); } void spiSend(uint8_t data) { + SPI_ASSERT_ACTIVE; m_spiDriver.send(data); } void spiSend(const uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; m_spiDriver.send(buf, n); } - void spiSetSckSpeed(uint32_t maxSck) { - m_spiDriver.setSckSpeed(maxSck); - } + void spiSetSckSpeed(uint32_t maxSck) { m_spiDriver.setSckSpeed(maxSck); } SdSpiDriver m_spiDriver; #else // SPI_DRIVER_SELECT < 2 - void spiActivate() { - m_spiDriverPtr->activate(); - } - void spiBegin(SdSpiConfig spiConfig) { - m_spiDriverPtr->begin(spiConfig); - } - void spiDeactivate() { - m_spiDriverPtr->deactivate(); - } + void spiActivate() { m_spiDriverPtr->activate(); } + void spiBegin(SdSpiConfig spiConfig) { m_spiDriverPtr->begin(spiConfig); } + void spiDeactivate() { m_spiDriverPtr->deactivate(); } + void spiEnd() { m_spiDriverPtr->end(); } uint8_t spiReceive() { + SPI_ASSERT_ACTIVE; return m_spiDriverPtr->receive(); } uint8_t spiReceive(uint8_t* buf, size_t n) { - return m_spiDriverPtr->receive(buf, n); + SPI_ASSERT_ACTIVE; + return m_spiDriverPtr->receive(buf, n); } void spiSend(uint8_t data) { + SPI_ASSERT_ACTIVE; m_spiDriverPtr->send(data); } void spiSend(const uint8_t* buf, size_t n) { + SPI_ASSERT_ACTIVE; m_spiDriverPtr->send(buf, n); } - void spiSetSckSpeed(uint32_t maxSck) { - m_spiDriverPtr->setSckSpeed(maxSck); - } + void spiSetSckSpeed(uint32_t maxSck) { m_spiDriverPtr->setSckSpeed(maxSck); } SdSpiDriver* m_spiDriverPtr; + #endif // SPI_DRIVER_SELECT < 2 -#if ENABLE_DEDICATED_SPI - static const uint8_t IDLE_STATE = 0; - static const uint8_t READ_STATE = 1; - static const uint8_t WRITE_STATE = 2; - uint32_t m_curSector; - uint8_t m_curState; - bool m_sharedSpi; -#endif // ENABLE_DEDICATED_SPI + void initSharedSpiCard() { + m_beginCalled = false; + m_csPin = 0; + m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; + m_spiActive = false; + m_state = IDLE_STATE; + m_status = 0; + m_type = 0; + } + bool m_beginCalled; SdCsPin_t m_csPin; uint8_t m_errorCode; - bool m_spiActive; + bool m_spiActive; + uint8_t m_state; uint8_t m_status; uint8_t m_type; -#else // HOST_MOCK - public: - SdSpiCard() : m_errorCode(SD_CARD_ERROR_INIT_NOT_CALLED), m_type(0) { - } - ~SdSpiCard() { } - bool begin(SdSpiConfig spiConfig) { - m_errorCode = 0; - m_status = 0; - (void)spiConfig; - return true; - } - uint32_t cardSize() { return _sdCardSizeB / 512LL; } - bool erase(uint32_t firstBlock, uint32_t lastBlock) { - memset(_sdCard + firstBlock * 512, 0, (lastBlock - firstBlock) * 512); - return true; - } - bool eraseSingleBlockEnable() { return true; } - void error(uint8_t code) { m_errorCode = code; } - int errorCode() const { return m_errorCode; } - int errorData() const { return m_status; } - bool isBusy() { return false; } - bool readSector(uint32_t sector, uint8_t* dst) { - return readSectors(sector, dst, 1); - } - bool readSectors(uint32_t sector, uint8_t* dst, size_t ns) { - if ((int)(sector + ns) > (int) (_sdCardSizeB / 512LL)) return false; - memcpy(dst, _sdCard + sector * 512, 512 * ns); - return true; - } - - bool readCID(cid_t* cid) { return true; } - bool readCSD(csd_t* csd) { return true; } - bool readOCR(uint32_t* ocr) { return true; } - bool readStatus(uint8_t* status) { return true; } - bool readStop() { return true; } - bool syncBlocks() { return true; } - int type() const { return m_type; } - bool writeSector(uint32_t sector, const uint8_t* src) { - return writeSectors(sector, src, 1); - } - bool writeSectors(uint32_t sector, const uint8_t* src, size_t ns) { - if ((int)(sector + ns) > (int) (_sdCardSizeB / 512LL)) return false; - memcpy(_sdCard + sector * 512, src, 512 * ns); - return true; - } - - uint32_t sectorCount() { return _sdCardSizeB / 512LL; } - bool syncDevice() { return true; } - - bool writeStop() { return true; } - void spiStart() { } - void spiStop() { } - -private: - int m_errorCode; - int m_status; - int m_type; -#endif - }; +//============================================================================== +/** + * \class DedicatedSpiCard + * \brief Raw access to SD and SDHC flash memory cards via dedicate SPI port. + */ +class DedicatedSpiCard : public SharedSpiCard { + public: + /** Construct an instance of DedicatedSpiCard. */ + DedicatedSpiCard() = default; + /** Initialize the SD card. + * \param[in] spiConfig SPI card configuration. + * \return true for success or false for failure. + */ + bool begin(SdSpiConfig spiConfig); + /** \return true, can be in dedicaded state. */ + bool hasDedicatedSpi() { return true; } + /** \return true if in dedicated SPI state. */ + bool isDedicatedSpi() { return m_dedicatedSpi; } + /** + * Read a 512 byte sector from an SD card. + * + * \param[in] sector Logical sector to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool readSector(uint32_t sector, uint8_t* dst); + /** + * Read multiple 512 byte sectors from an SD card. + * + * \param[in] sector Logical sector to be read. + * \param[in] ns Number of sectors to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool readSectors(uint32_t sector, uint8_t* dst, size_t ns); + /** Set SPI sharing state + * \param[in] value desired state. + * \return true for success else false; + */ + bool setDedicatedSpi(bool value); + /** + * Write a 512 byte sector to an SD card. + * + * \param[in] sector Logical sector to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return true for success or false for failure. + */ + bool writeSector(uint32_t sector, const uint8_t* src); + /** + * Write multiple 512 byte sectors to an SD card. + * + * \param[in] sector Logical sector to be written. + * \param[in] ns Number of sectors to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return true for success or false for failure. + */ + bool writeSectors(uint32_t sector, const uint8_t* src, size_t ns); - -}; // namespace sdfat - - + private: + uint32_t m_curSector = 0; + bool m_dedicatedSpi = false; +}; +//============================================================================== +#if ENABLE_DEDICATED_SPI +/** typedef for dedicated SPI. */ +typedef DedicatedSpiCard SdSpiCard; +#else +/** typedef for shared SPI. */ +typedef SharedSpiCard SdSpiCard; +#endif #endif // SdSpiCard_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioCard.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioCard.h index 97466d48..eb032e4a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioCard.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioCard.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,16 +22,17 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +/** + * \file + * \brief Classes for SDIO cards. + */ #ifndef SdioCard_h #define SdioCard_h #include "../common/SysCall.h" #include "SdCardInterface.h" - - -namespace sdfat { - - +/** Use programmed I/O with FIFO. */ #define FIFO_SDIO 0 +/** Use programmed I/O with DMA. */ #define DMA_SDIO 1 /** * \class SdioConfig @@ -39,18 +40,19 @@ namespace sdfat { */ class SdioConfig { public: - SdioConfig() : m_options(FIFO_SDIO) {} + SdioConfig() {} /** * SdioConfig constructor. * \param[in] opt SDIO options. */ explicit SdioConfig(uint8_t opt) : m_options(opt) {} /** \return SDIO card options. */ - uint8_t options() {return m_options;} + uint8_t options() { return m_options; } /** \return true if DMA_SDIO. */ - bool useDma() {return m_options & DMA_SDIO;} + bool useDma() { return m_options & DMA_SDIO; } + private: - uint8_t m_options; + uint8_t m_options = FIFO_SDIO; }; //------------------------------------------------------------------------------ /** @@ -64,20 +66,20 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool begin(SdioConfig sdioConfig); - /** Disable an SDIO card. - * \return false - not implemented. - */ - bool end() {return false;} - /** - * Determine the size of an SD flash memory card. + /** CMD6 Switch mode: Check Function Set Function. + * \param[in] arg CMD6 argument. + * \param[out] status return status data. * - * \return The number of 512 byte data sectors in the card - * or zero if an error occurs. + * \return true for success or false for failure. */ - uint32_t sectorCount(); + bool cardCMD6(uint32_t arg, uint8_t* status); + /** Disable an SDIO card. + * not implemented. + */ + void end() {} + #ifndef DOXYGEN_SHOULD_SKIP_THIS - // Use sectorCount(). cardSize() will be removed in the future. - uint32_t cardSize() __attribute__ ((deprecated)) {return sectorCount();} + uint32_t __attribute__((error("use sectorCount()"))) cardSize(); #endif // DOXYGEN_SHOULD_SKIP_THIS /** Erase a range of sectors. * @@ -93,7 +95,8 @@ class SdioCard : public SdCardInterface { */ bool erase(uint32_t firstSector, uint32_t lastSector); /** - * \return code for the last error. See SdCardInfo.h for a list of error codes. + * \return code for the last error. See SdCardInfo.h for a list of error + * codes. */ uint8_t errorCode() const; /** \return error data for last error. */ @@ -157,26 +160,27 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool readOCR(uint32_t* ocr); + /** Read SCR register. + * + * \param[out] scr Value of SCR register. + * \return true for success or false for failure. + */ + bool readSCR(scr_t* scr); + /** Return the 64 byte SD Status register. + * \param[out] sds location for 64 status bytes. + * \return true for success or false for failure. + */ + bool readSDS(sds_t* sds); /** Start a read multiple sectors sequence. * * \param[in] sector Address of first sector in sequence. * * \note This function is used with readData() and readStop() for optimized - * multiple sector reads. SPI chipSelect must be low for the entire sequence. + * multiple sector reads. * * \return true for success or false for failure. */ bool readStart(uint32_t sector); - /** Start a read multiple sectors sequence. - * - * \param[in] sector Address of first sector in sequence. - * \param[in] count Maximum sector count. - * \note This function is used with readData() and readStop() for optimized - * multiple sector reads. SPI chipSelect must be low for the entire sequence. - * - * \return true for success or false for failure. - */ - bool readStart(uint32_t sector, uint32_t count); /** End a read multiple sectors sequence. * * \return true for success or false for failure. @@ -184,6 +188,21 @@ class SdioCard : public SdCardInterface { bool readStop(); /** \return SDIO card status. */ uint32_t status(); + /** + * Determine the size of an SD flash memory card. + * + * \return The number of 512 byte data sectors in the card + * or zero if an error occurs. + */ + uint32_t sectorCount(); + /** + * Send CMD12 to stop read or write. + * + * \param[in] blocking If true, wait for command complete. + * + * \return true for success or false for failure. + */ + bool stopTransmission(bool blocking); /** \return success if sync successful. Not for user apps. */ bool syncDevice(); /** Return the card type: SD V1, SD V2 or SDHC @@ -222,16 +241,6 @@ class SdioCard : public SdCardInterface { * \return true for success or false for failure. */ bool writeStart(uint32_t sector); - /** Start a write multiple sectors sequence. - * - * \param[in] sector Address of first sector in sequence. - * \param[in] count Maximum sector count. - * \note This function is used with writeData() and writeStop() - * for optimized multiple sector writes. - * - * \return true for success or false for failure. - */ - bool writeStart(uint32_t sector, uint32_t count); /** End a write multiple sectors sequence. * @@ -245,10 +254,6 @@ class SdioCard : public SdCardInterface { static const uint8_t WRITE_STATE = 2; uint32_t m_curSector; SdioConfig m_sdioConfig; - uint8_t m_curState; + uint8_t m_curState = IDLE_STATE; }; - - -}; // namespace sdfat - #endif // SdioCard_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.cpp index eeb3a0d9..c4b81330 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,19 +24,12 @@ */ #if defined(__MK64FX512__) || defined(__MK66FX1M0__) || defined(__IMXRT1062__) #include "SdioTeensy.h" + #include "SdCardInfo.h" #include "SdioCard.h" - - -namespace sdfat { - - //============================================================================== // limit of K66 due to errata KINETIS_K_0N65N. -const uint32_t MAX_SDHC_COUNT = 0XFFFF; - -// Max RU is 1024 sectors. -const uint32_t RU_MASK = 0X03FF; +const uint32_t MAX_BLKCNT = 0XFFFF; //============================================================================== #define SDHC_PROCTL_DTW_4BIT 0x01 const uint32_t FIFO_WML = 16; @@ -44,39 +37,34 @@ const uint32_t CMD8_RETRIES = 3; const uint32_t BUSY_TIMEOUT_MICROS = 1000000; //============================================================================== const uint32_t SDHC_IRQSTATEN_MASK = - SDHC_IRQSTATEN_DMAESEN | SDHC_IRQSTATEN_AC12ESEN | - SDHC_IRQSTATEN_DEBESEN | SDHC_IRQSTATEN_DCESEN | - SDHC_IRQSTATEN_DTOESEN | SDHC_IRQSTATEN_CIESEN | - SDHC_IRQSTATEN_CEBESEN | SDHC_IRQSTATEN_CCESEN | - SDHC_IRQSTATEN_CTOESEN | SDHC_IRQSTATEN_DINTSEN | - SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN; + SDHC_IRQSTATEN_DMAESEN | SDHC_IRQSTATEN_AC12ESEN | SDHC_IRQSTATEN_DEBESEN | + SDHC_IRQSTATEN_DCESEN | SDHC_IRQSTATEN_DTOESEN | SDHC_IRQSTATEN_CIESEN | + SDHC_IRQSTATEN_CEBESEN | SDHC_IRQSTATEN_CCESEN | SDHC_IRQSTATEN_CTOESEN | + SDHC_IRQSTATEN_DINTSEN | SDHC_IRQSTATEN_TCSEN | SDHC_IRQSTATEN_CCSEN; const uint32_t SDHC_IRQSTAT_CMD_ERROR = - SDHC_IRQSTAT_CIE | SDHC_IRQSTAT_CEBE | - SDHC_IRQSTAT_CCE | SDHC_IRQSTAT_CTOE; + SDHC_IRQSTAT_CIE | SDHC_IRQSTAT_CEBE | SDHC_IRQSTAT_CCE | SDHC_IRQSTAT_CTOE; -const uint32_t SDHC_IRQSTAT_DATA_ERROR = - SDHC_IRQSTAT_AC12E | SDHC_IRQSTAT_DEBE | - SDHC_IRQSTAT_DCE | SDHC_IRQSTAT_DTOE; +const uint32_t SDHC_IRQSTAT_DATA_ERROR = SDHC_IRQSTAT_AC12E | + SDHC_IRQSTAT_DEBE | SDHC_IRQSTAT_DCE | + SDHC_IRQSTAT_DTOE; const uint32_t SDHC_IRQSTAT_ERROR = - SDHC_IRQSTAT_DMAE | SDHC_IRQSTAT_CMD_ERROR | - SDHC_IRQSTAT_DATA_ERROR; + SDHC_IRQSTAT_DMAE | SDHC_IRQSTAT_CMD_ERROR | SDHC_IRQSTAT_DATA_ERROR; const uint32_t SDHC_IRQSIGEN_MASK = - SDHC_IRQSIGEN_DMAEIEN | SDHC_IRQSIGEN_AC12EIEN | - SDHC_IRQSIGEN_DEBEIEN | SDHC_IRQSIGEN_DCEIEN | - SDHC_IRQSIGEN_DTOEIEN | SDHC_IRQSIGEN_CIEIEN | - SDHC_IRQSIGEN_CEBEIEN | SDHC_IRQSIGEN_CCEIEN | - SDHC_IRQSIGEN_CTOEIEN | SDHC_IRQSIGEN_TCIEN; + SDHC_IRQSIGEN_DMAEIEN | SDHC_IRQSIGEN_AC12EIEN | SDHC_IRQSIGEN_DEBEIEN | + SDHC_IRQSIGEN_DCEIEN | SDHC_IRQSIGEN_DTOEIEN | SDHC_IRQSIGEN_CIEIEN | + SDHC_IRQSIGEN_CEBEIEN | SDHC_IRQSIGEN_CCEIEN | SDHC_IRQSIGEN_CTOEIEN | + SDHC_IRQSIGEN_TCIEN; //============================================================================== const uint32_t CMD_RESP_NONE = SDHC_XFERTYP_RSPTYP(0); -const uint32_t CMD_RESP_R1 = SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | - SDHC_XFERTYP_RSPTYP(2); +const uint32_t CMD_RESP_R1 = + SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(2); -const uint32_t CMD_RESP_R1b = SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | - SDHC_XFERTYP_RSPTYP(3); +const uint32_t CMD_RESP_R1b = + SDHC_XFERTYP_CICEN | SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(3); const uint32_t CMD_RESP_R2 = SDHC_XFERTYP_CCCEN | SDHC_XFERTYP_RSPTYP(1); @@ -94,26 +82,23 @@ const uint32_t DATA_READ_DMA = DATA_READ | SDHC_XFERTYP_DMAEN; const uint32_t DATA_READ_MULTI_DMA = DATA_READ_DMA | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_AC12EN | SDHC_XFERTYP_BCEN; -const uint32_t DATA_READ_MULTI_PGM = DATA_READ | SDHC_XFERTYP_MSBSEL | - SDHC_XFERTYP_BCEN; +const uint32_t DATA_READ_MULTI_PGM = + DATA_READ | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_BCEN; const uint32_t DATA_WRITE_DMA = SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_DMAEN; const uint32_t DATA_WRITE_MULTI_DMA = DATA_WRITE_DMA | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_AC12EN | SDHC_XFERTYP_BCEN; -const uint32_t DATA_WRITE_MULTI_PGM = SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_MSBSEL | - SDHC_XFERTYP_BCEN; +const uint32_t DATA_WRITE_MULTI_PGM = + SDHC_XFERTYP_DPSEL | SDHC_XFERTYP_MSBSEL | SDHC_XFERTYP_BCEN; #elif defined(__IMXRT1062__) // Use low bits for SDHC_MIX_CTRL since bits 15-0 of SDHC_XFERTYP are reserved. -const uint32_t SDHC_MIX_CTRL_MASK = SDHC_MIX_CTRL_DMAEN | SDHC_MIX_CTRL_BCEN | - SDHC_MIX_CTRL_AC12EN | - SDHC_MIX_CTRL_DDR_EN | - SDHC_MIX_CTRL_DTDSEL | - SDHC_MIX_CTRL_MSBSEL | - SDHC_MIX_CTRL_NIBBLE_POS | - SDHC_MIX_CTRL_AC23EN; +const uint32_t SDHC_MIX_CTRL_MASK = + SDHC_MIX_CTRL_DMAEN | SDHC_MIX_CTRL_BCEN | SDHC_MIX_CTRL_AC12EN | + SDHC_MIX_CTRL_DDR_EN | SDHC_MIX_CTRL_DTDSEL | SDHC_MIX_CTRL_MSBSEL | + SDHC_MIX_CTRL_NIBBLE_POS | SDHC_MIX_CTRL_AC23EN; const uint32_t DATA_READ = SDHC_MIX_CTRL_DTDSEL | SDHC_XFERTYP_DPSEL; @@ -124,7 +109,6 @@ const uint32_t DATA_READ_MULTI_DMA = DATA_READ_DMA | SDHC_MIX_CTRL_MSBSEL | const uint32_t DATA_READ_MULTI_PGM = DATA_READ | SDHC_MIX_CTRL_MSBSEL; - const uint32_t DATA_WRITE_DMA = SDHC_XFERTYP_DPSEL | SDHC_MIX_CTRL_DMAEN; const uint32_t DATA_WRITE_MULTI_DMA = DATA_WRITE_DMA | SDHC_MIX_CTRL_MSBSEL | @@ -136,16 +120,22 @@ const uint32_t DATA_WRITE_MULTI_PGM = SDHC_XFERTYP_DPSEL | SDHC_MIX_CTRL_MSBSEL; const uint32_t ACMD6_XFERTYP = SDHC_XFERTYP_CMDINX(ACMD6) | CMD_RESP_R1; +const uint32_t ACMD13_XFERTYP = + SDHC_XFERTYP_CMDINX(ACMD13) | CMD_RESP_R1 | DATA_READ_DMA; + const uint32_t ACMD41_XFERTYP = SDHC_XFERTYP_CMDINX(ACMD41) | CMD_RESP_R3; +const uint32_t ACMD51_XFERTYP = + SDHC_XFERTYP_CMDINX(ACMD51) | CMD_RESP_R1 | DATA_READ_DMA; + const uint32_t CMD0_XFERTYP = SDHC_XFERTYP_CMDINX(CMD0) | CMD_RESP_NONE; const uint32_t CMD2_XFERTYP = SDHC_XFERTYP_CMDINX(CMD2) | CMD_RESP_R2; const uint32_t CMD3_XFERTYP = SDHC_XFERTYP_CMDINX(CMD3) | CMD_RESP_R6; -const uint32_t CMD6_XFERTYP = SDHC_XFERTYP_CMDINX(CMD6) | CMD_RESP_R1 | - DATA_READ_DMA; +const uint32_t CMD6_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD6) | CMD_RESP_R1 | DATA_READ_DMA; const uint32_t CMD7_XFERTYP = SDHC_XFERTYP_CMDINX(CMD7) | CMD_RESP_R1b; @@ -157,28 +147,28 @@ const uint32_t CMD10_XFERTYP = SDHC_XFERTYP_CMDINX(CMD10) | CMD_RESP_R2; const uint32_t CMD11_XFERTYP = SDHC_XFERTYP_CMDINX(CMD11) | CMD_RESP_R1; -const uint32_t CMD12_XFERTYP = SDHC_XFERTYP_CMDINX(CMD12) | CMD_RESP_R1b | - SDHC_XFERTYP_CMDTYP(3); +const uint32_t CMD12_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD12) | CMD_RESP_R1b | SDHC_XFERTYP_CMDTYP(3); const uint32_t CMD13_XFERTYP = SDHC_XFERTYP_CMDINX(CMD13) | CMD_RESP_R1; -const uint32_t CMD17_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD17) | CMD_RESP_R1 | - DATA_READ_DMA; +const uint32_t CMD17_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD17) | CMD_RESP_R1 | DATA_READ_DMA; -const uint32_t CMD18_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | - DATA_READ_MULTI_DMA; +const uint32_t CMD18_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | DATA_READ_MULTI_DMA; -const uint32_t CMD18_PGM_XFERTYP = SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | - DATA_READ_MULTI_PGM; +const uint32_t CMD18_PGM_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD18) | CMD_RESP_R1 | DATA_READ_MULTI_PGM; -const uint32_t CMD24_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD24) | CMD_RESP_R1 | - DATA_WRITE_DMA; +const uint32_t CMD24_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD24) | CMD_RESP_R1 | DATA_WRITE_DMA; -const uint32_t CMD25_DMA_XFERTYP = SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | - DATA_WRITE_MULTI_DMA; +const uint32_t CMD25_DMA_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | DATA_WRITE_MULTI_DMA; -const uint32_t CMD25_PGM_XFERTYP = SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | - DATA_WRITE_MULTI_PGM; +const uint32_t CMD25_PGM_XFERTYP = + SDHC_XFERTYP_CMDINX(CMD25) | CMD_RESP_R1 | DATA_WRITE_MULTI_PGM; const uint32_t CMD32_XFERTYP = SDHC_XFERTYP_CMDINX(CMD32) | CMD_RESP_R1; @@ -206,6 +196,7 @@ static bool (*m_busyFcn)() = 0; static bool m_initDone = false; static bool m_version2; static bool m_highCapacity; +static bool m_transferActive = false; static uint8_t m_errorCode = SD_CARD_ERROR_INIT_NOT_CALLED; static uint32_t m_errorLine = 0; static uint32_t m_rca; @@ -215,26 +206,100 @@ static uint32_t m_sdClkKhz = 0; static uint32_t m_ocr; static cid_t m_cid; static csd_t m_csd; +static scr_t m_scr; +static sds_t m_sds; //============================================================================== -#define DBG_TRACE Serial.print("TRACE."); Serial.println(__LINE__); delay(200); +#define DBG_TRACE \ + Serial.print("TRACE."); \ + Serial.println(__LINE__); \ + delay(200); #define USE_DEBUG_MODE 0 #if USE_DEBUG_MODE -#define DBG_IRQSTAT() if (SDHC_IRQSTAT) {Serial.print(__LINE__);\ - Serial.print(" IRQSTAT "); Serial.println(SDHC_IRQSTAT, HEX);} - +#define DBG_IRQSTAT() \ + if (SDHC_IRQSTAT) { \ + Serial.print(__LINE__); \ + Serial.print(" IRQSTAT "); \ + Serial.println(SDHC_IRQSTAT, HEX); \ + } static void printRegs(uint32_t line) { - Serial.print(line); - Serial.print(" SDHC_BLKATTR "); - Serial.print(SDHC_BLKATTR, HEX); - Serial.print(" XFERTYP "); - Serial.print(SDHC_XFERTYP, HEX); - Serial.print(" PRSSTAT "); - Serial.print(SDHC_PRSSTAT, HEX); - Serial.print(" PROCTL "); - Serial.print(SDHC_PROCTL, HEX); - Serial.print(" IRQSTAT "); - Serial.print(SDHC_IRQSTAT, HEX); - Serial.print(" m_irqstat "); + uint32_t blkattr = SDHC_BLKATTR; + uint32_t xfertyp = SDHC_XFERTYP; + uint32_t prsstat = SDHC_PRSSTAT; + uint32_t proctl = SDHC_PROCTL; + uint32_t irqstat = SDHC_IRQSTAT; + Serial.print("\nLINE: "); + Serial.println(line); + Serial.print("BLKATTR "); + Serial.println(blkattr, HEX); + Serial.print("XFERTYP "); + Serial.print(xfertyp, HEX); + Serial.print(" CMD"); + Serial.print(xfertyp >> 24); + Serial.print(" TYP"); + Serial.print((xfertyp >> 2) & 3); + if (xfertyp & SDHC_XFERTYP_DPSEL) { + Serial.print(" DPSEL"); + } + Serial.println(); + Serial.print("PRSSTAT "); + Serial.print(prsstat, HEX); + if (prsstat & SDHC_PRSSTAT_BREN) { + Serial.print(" BREN"); + } + if (prsstat & SDHC_PRSSTAT_BWEN) { + Serial.print(" BWEN"); + } + if (prsstat & SDHC_PRSSTAT_RTA) { + Serial.print(" RTA"); + } + if (prsstat & SDHC_PRSSTAT_WTA) { + Serial.print(" WTA"); + } + if (prsstat & SDHC_PRSSTAT_SDOFF) { + Serial.print(" SDOFF"); + } + if (prsstat & SDHC_PRSSTAT_PEROFF) { + Serial.print(" PEROFF"); + } + if (prsstat & SDHC_PRSSTAT_HCKOFF) { + Serial.print(" HCKOFF"); + } + if (prsstat & SDHC_PRSSTAT_IPGOFF) { + Serial.print(" IPGOFF"); + } + if (prsstat & SDHC_PRSSTAT_SDSTB) { + Serial.print(" SDSTB"); + } + if (prsstat & SDHC_PRSSTAT_DLA) { + Serial.print(" DLA"); + } + if (prsstat & SDHC_PRSSTAT_CDIHB) { + Serial.print(" CDIHB"); + } + if (prsstat & SDHC_PRSSTAT_CIHB) { + Serial.print(" CIHB"); + } + Serial.println(); + Serial.print("PROCTL "); + Serial.print(proctl, HEX); + if (proctl & SDHC_PROCTL_SABGREQ) Serial.print(" SABGREQ"); + Serial.print(" EMODE"); + Serial.print((proctl >> 4) & 3); + Serial.print(" DWT"); + Serial.print((proctl >> 1) & 3); + Serial.println(); + Serial.print("IRQSTAT "); + Serial.print(irqstat, HEX); + if (irqstat & SDHC_IRQSTAT_BGE) { + Serial.print(" BGE"); + } + if (irqstat & SDHC_IRQSTAT_TC) { + Serial.print(" TC"); + } + if (irqstat & SDHC_IRQSTAT_CC) { + Serial.print(" CC"); + } + Serial.print("\nm_irqstat "); Serial.println(m_irqstat, HEX); } #else // USE_DEBUG_MODE @@ -268,12 +333,12 @@ static void sdIrs() { //------------------------------------------------------------------------------ static void enableGPIO(bool enable) { const uint32_t PORT_CLK = PORT_PCR_MUX(4) | PORT_PCR_DSE; - const uint32_t PORT_CMD_DATA = PORT_CLK | PORT_PCR_PE | PORT_PCR_PS; + const uint32_t PORT_CMD_DATA = PORT_CLK | PORT_PCR_PE | PORT_PCR_PS; const uint32_t PORT_PUP = PORT_PCR_MUX(1) | PORT_PCR_PE | PORT_PCR_PS; PORTE_PCR0 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D1 PORTE_PCR1 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D0 - PORTE_PCR2 = enable ? PORT_CLK : PORT_PUP; // SDHC_CLK + PORTE_PCR2 = enable ? PORT_CLK : PORT_PUP; // SDHC_CLK PORTE_PCR3 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_CMD PORTE_PCR4 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D3 PORTE_PCR5 = enable ? PORT_CMD_DATA : PORT_PUP; // SDHC_D2 @@ -287,7 +352,7 @@ static void initClock() { // Enable SDHC clock. SIM_SCGC3 |= SIM_SCGC3_SDHC; } -static uint32_t baseClock() { return F_CPU;} +static uint32_t baseClock() { return F_CPU; } #elif defined(__IMXRT1062__) //------------------------------------------------------------------------------ @@ -304,14 +369,14 @@ static void gpioMux(uint8_t mode) { static void enableGPIO(bool enable) { const uint32_t CLOCK_MASK = IOMUXC_SW_PAD_CTL_PAD_PKE | #if defined(ARDUINO_TEENSY41) - IOMUXC_SW_PAD_CTL_PAD_DSE(1) | -#else // defined(ARDUINO_TEENSY41) + IOMUXC_SW_PAD_CTL_PAD_DSE(7) | +#else // defined(ARDUINO_TEENSY41) IOMUXC_SW_PAD_CTL_PAD_DSE(4) | ///// WHG #endif // defined(ARDUINO_TEENSY41) IOMUXC_SW_PAD_CTL_PAD_SPEED(2); - const uint32_t DATA_MASK = CLOCK_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE | - IOMUXC_SW_PAD_CTL_PAD_PUS(1); + const uint32_t DATA_MASK = + CLOCK_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE | IOMUXC_SW_PAD_CTL_PAD_PUS(1); if (enable) { gpioMux(0); IOMUXC_SW_PAD_CTL_PAD_GPIO_SD_B0_04 = DATA_MASK; // DAT2 @@ -335,20 +400,20 @@ static void initClock() { /* Enable USDHC clock. */ CCM_CCGR6 |= CCM_CCGR6_USDHC1(CCM_CCGR_ON); CCM_CSCDR1 &= ~(CCM_CSCDR1_USDHC1_CLK_PODF_MASK); - CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL; // PLL2PFD0 -// CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((7)); / &0x7 WHG + CCM_CSCMR1 |= CCM_CSCMR1_USDHC1_CLK_SEL; // PLL2PFD0 + // CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((7)); / &0x7 WHG CCM_CSCDR1 |= CCM_CSCDR1_USDHC1_CLK_PODF((1)); } //------------------------------------------------------------------------------ static uint32_t baseClock() { uint32_t divider = ((CCM_CSCDR1 >> 11) & 0x7) + 1; - return (528000000U * 3)/((CCM_ANALOG_PFD_528 & 0x3F)/6)/divider; + return (528000000U * 3) / ((CCM_ANALOG_PFD_528 & 0x3F) / 6) / divider; } #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) //============================================================================== // Static functions. static bool cardAcmd(uint32_t rca, uint32_t xfertyp, uint32_t arg) { - return cardCommand(CMD55_XFERTYP, rca) && cardCommand (xfertyp, arg); + return cardCommand(CMD55_XFERTYP, rca) && cardCommand(xfertyp, arg); } //------------------------------------------------------------------------------ static bool cardCommand(uint32_t xfertyp, uint32_t arg) { @@ -372,21 +437,38 @@ static bool cardCommand(uint32_t xfertyp, uint32_t arg) { m_irqstat = SDHC_IRQSTAT; SDHC_IRQSTAT = m_irqstat; - return (m_irqstat & SDHC_IRQSTAT_CC) && - !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); + return (m_irqstat & SDHC_IRQSTAT_CC) && !(m_irqstat & SDHC_IRQSTAT_CMD_ERROR); } //------------------------------------------------------------------------------ -static bool cardCMD6(uint32_t arg, uint8_t* status) { - // CMD6 returns 64 bytes. +static bool cardACMD13(sds_t* scr) { + // ACMD13 returns 64 bytes. if (waitTimeout(isBusyCMD13)) { return sdError(SD_CARD_ERROR_CMD13); } enableDmaIrs(); - SDHC_DSADDR = (uint32_t)status; + SDHC_DSADDR = (uint32_t)scr; SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; - if (!cardCommand(CMD6_XFERTYP, arg)) { - return sdError(SD_CARD_ERROR_CMD6); + if (!cardAcmd(m_rca, ACMD13_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_ACMD13); + } + if (!waitDmaStatus()) { + return sdError(SD_CARD_ERROR_DMA); + } + return true; +} +//------------------------------------------------------------------------------ +static bool cardACMD51(scr_t* scr) { + // ACMD51 returns 8 bytes. + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + enableDmaIrs(); + SDHC_DSADDR = (uint32_t)scr; + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(8); + SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; + if (!cardAcmd(m_rca, ACMD51_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_ACMD51); } if (!waitDmaStatus()) { return sdError(SD_CARD_ERROR_DMA); @@ -405,9 +487,9 @@ static void initSDHC() { // Disable GPIO clock. enableGPIO(false); -#if defined (__IMXRT1062__) +#if defined(__IMXRT1062__) SDHC_MIX_CTRL |= 0x80000000; -#endif +#endif // (__IMXRT1062__) // Reset SDHC. Use default Water Mark Level of 16. SDHC_SYSCTL |= SDHC_SYSCTL_RSTA | SDHC_SYSCTL_SDCLKFS(0x80); @@ -424,7 +506,7 @@ static void initSDHC() { SDHC_IRQSTATEN = SDHC_IRQSTATEN_MASK; attachInterruptVector(IRQ_SDHC, sdIrs); - NVIC_SET_PRIORITY(IRQ_SDHC, 6*16); + NVIC_SET_PRIORITY(IRQ_SDHC, 6 * 16); NVIC_ENABLE_IRQ(IRQ_SDHC); // Send 80 clocks to card. @@ -438,39 +520,29 @@ static uint32_t statusCMD13() { } //------------------------------------------------------------------------------ static bool isBusyCMD13() { - if (!cardCommand(CMD13_XFERTYP, m_rca)) { - // Caller will timeout. - return true; - } - return !(SDHC_CMDRSP0 & CARD_STATUS_READY_FOR_DATA); + return !(statusCMD13() & CARD_STATUS_READY_FOR_DATA); } //------------------------------------------------------------------------------ static bool isBusyCommandComplete() { return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_CC | SDHC_IRQSTAT_CMD_ERROR)); } //------------------------------------------------------------------------------ -static bool isBusyCommandInhibit() { - return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; -} +static bool isBusyCommandInhibit() { return SDHC_PRSSTAT & SDHC_PRSSTAT_CIHB; } //------------------------------------------------------------------------------ -static bool isBusyDMA() { - return m_dmaBusy; -} +static bool isBusyDat() { return SDHC_PRSSTAT & (1 << 24) ? false : true; } //------------------------------------------------------------------------------ -static bool isBusyFifoRead() { - return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); -} +static bool isBusyDMA() { return m_dmaBusy; } //------------------------------------------------------------------------------ -static bool isBusyFifoWrite() { - return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN); -} +static bool isBusyFifoRead() { return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BREN); } +//------------------------------------------------------------------------------ +static bool isBusyFifoWrite() { return !(SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN); } //------------------------------------------------------------------------------ static bool isBusyTransferComplete() { return !(SDHC_IRQSTAT & (SDHC_IRQSTAT_TC | SDHC_IRQSTAT_ERROR)); } //------------------------------------------------------------------------------ -static bool rdWrSectors(uint32_t xfertyp, - uint32_t sector, uint8_t* buf, size_t n) { +static bool rdWrSectors(uint32_t xfertyp, uint32_t sector, uint8_t* buf, + size_t n) { if ((3 & (uint32_t)buf) || n == 0) { return sdError(SD_CARD_ERROR_DMA); } @@ -478,10 +550,10 @@ static bool rdWrSectors(uint32_t xfertyp, return sdError(SD_CARD_ERROR_CMD13); } enableDmaIrs(); - SDHC_DSADDR = (uint32_t)buf; + SDHC_DSADDR = (uint32_t)buf; SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(n) | SDHC_BLKATTR_BLKSIZE(512); SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; - if (!cardCommand(xfertyp, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(xfertyp, m_highCapacity ? sector : 512 * sector)) { return false; } return waitDmaStatus(); @@ -495,7 +567,7 @@ static bool readReg16(uint32_t xfertyp, void* data) { } uint32_t sr[] = {SDHC_CMDRSP0, SDHC_CMDRSP1, SDHC_CMDRSP2, SDHC_CMDRSP3}; for (int i = 0; i < 15; i++) { - d[14 - i] = sr[i/4] >> 8*(i%4); + d[14 - i] = sr[i / 4] >> 8 * (i % 4); } d[15] = 0; return true; @@ -506,16 +578,17 @@ static void setSdclk(uint32_t kHzMax) { const uint32_t SDCLKFS_LIMIT = 0X100; uint32_t dvs = 1; uint32_t sdclkfs = 1; - uint32_t maxSdclk = 1000*kHzMax; + uint32_t maxSdclk = 1000 * kHzMax; uint32_t base = baseClock(); - while ((base/(sdclkfs*DVS_LIMIT) > maxSdclk) && (sdclkfs < SDCLKFS_LIMIT)) { + while ((base / (sdclkfs * DVS_LIMIT) > maxSdclk) && + (sdclkfs < SDCLKFS_LIMIT)) { sdclkfs <<= 1; } - while ((base/(sdclkfs*dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { + while ((base / (sdclkfs * dvs) > maxSdclk) && (dvs < DVS_LIMIT)) { dvs++; } - m_sdClkKhz = base/(1000*sdclkfs*dvs); + m_sdClkKhz = base / (1000 * sdclkfs * dvs); sdclkfs >>= 1; dvs--; #if defined(__MK64FX512__) || defined(__MK66FX1M0__) @@ -524,11 +597,12 @@ static void setSdclk(uint32_t kHzMax) { #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) // Change dividers. - uint32_t sysctl = SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK - | SDHC_SYSCTL_DVS_MASK | SDHC_SYSCTL_SDCLKFS_MASK); + uint32_t sysctl = + SDHC_SYSCTL & ~(SDHC_SYSCTL_DTOCV_MASK | SDHC_SYSCTL_DVS_MASK | + SDHC_SYSCTL_SDCLKFS_MASK); - SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) - | SDHC_SYSCTL_SDCLKFS(sdclkfs); + SDHC_SYSCTL = sysctl | SDHC_SYSCTL_DTOCV(0x0E) | SDHC_SYSCTL_DVS(dvs) | + SDHC_SYSCTL_SDCLKFS(sdclkfs); // Wait until the SDHC clock is stable. while (!(SDHC_PRSSTAT & SDHC_PRSSTAT_SDSTB)) { @@ -541,20 +615,25 @@ static void setSdclk(uint32_t kHzMax) { } //------------------------------------------------------------------------------ static bool transferStop() { + // This fix allows CDIHB to be cleared in Tennsy 3.x without a reset. + SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; if (!cardCommand(CMD12_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD12); } - if (yieldTimeout(isBusyCMD13)) { + if (yieldTimeout(isBusyDat)) { return sdError(SD_CARD_ERROR_CMD13); } - // Save registers before reset DAT lines. - uint32_t irqsststen = SDHC_IRQSTATEN; - uint32_t proctl = SDHC_PROCTL & ~SDHC_PROCTL_SABGREQ; - // Do reset to clear CDIHB. Should be a better way! - SDHC_SYSCTL |= SDHC_SYSCTL_RSTD; - // Restore registers. - SDHC_IRQSTATEN = irqsststen; - SDHC_PROCTL = proctl; + if (SDHC_PRSSTAT & SDHC_PRSSTAT_CDIHB) { + // This should not happen after above fix. + // Save registers before reset DAT lines. + uint32_t irqsststen = SDHC_IRQSTATEN; + uint32_t proctl = SDHC_PROCTL & ~SDHC_PROCTL_SABGREQ; + // Do reset to clear CDIHB. Should be a better way! + SDHC_SYSCTL |= SDHC_SYSCTL_RSTD; + // Restore registers. + SDHC_IRQSTATEN = irqsststen; + SDHC_PROCTL = proctl; + } return true; } //------------------------------------------------------------------------------ @@ -567,7 +646,7 @@ static bool yieldTimeout(bool (*fcn)()) { m_busyFcn = 0; return true; } - SysCall::yield(); + yield(); } m_busyFcn = 0; return false; // Caller will set errorCode. @@ -590,6 +669,20 @@ static bool waitTimeout(bool (*fcn)()) { } return false; // Caller will set errorCode. } +//------------------------------------------------------------------------------ +static bool waitTransferComplete() { + if (!m_transferActive) { + return true; + } + bool timeOut = waitTimeout(isBusyTransferComplete); + m_transferActive = false; + m_irqstat = SDHC_IRQSTAT; + SDHC_IRQSTAT = m_irqstat; + if (timeOut || (m_irqstat & SDHC_IRQSTAT_ERROR)) { + return sdError(SD_CARD_ERROR_TRANSFER_COMPLETE); + } + return true; +} //============================================================================== // Start of SdioCard member functions. //============================================================================== @@ -617,12 +710,16 @@ bool SdioCard::begin(SdioConfig sdioConfig) { m_version2 = true; break; } + SDHC_SYSCTL |= SDHC_SYSCTL_RSTA; + while (SDHC_SYSCTL & SDHC_SYSCTL_RSTA) { + } } + // Must support 3.2-3.4 Volts arg = m_version2 ? 0X40300000 : 0x00300000; int m = micros(); do { if (!cardAcmd(0, ACMD41_XFERTYP, arg) || - ((micros() - m) > BUSY_TIMEOUT_MICROS)) { + ((micros() - m) > BUSY_TIMEOUT_MICROS)) { return sdError(SD_CARD_ERROR_ACMD41); } } while ((SDHC_CMDRSP0 & 0x80000000) == 0); @@ -658,14 +755,32 @@ bool SdioCard::begin(SdioConfig sdioConfig) { SDHC_WML = SDHC_WML_RDWML(FIFO_WML) | SDHC_WML_WRWML(FIFO_WML); + if (!cardACMD51(&m_scr)) { + return false; + } + if (!cardACMD13(&m_sds)) { + return false; + } // Determine if High Speed mode is supported and set frequency. // Check status[16] for error 0XF or status[16] for new mode 0X1. uint8_t status[64]; - if (cardCMD6(0X00FFFFFF, status) && (2 & status[13]) && - cardCMD6(0X80FFFFF1, status) && (status[16] & 0XF) == 1) { - kHzSdClk = 50000; - } else { - kHzSdClk = 25000; + kHzSdClk = 25000; + if (m_scr.sdSpec() > 0) { + // card is 1.10 or greater - must support CMD6 + if (!cardCMD6(0X00FFFFFF, status)) { + return false; + } + if (2 & status[13]) { + // Card supports High Speed mode - switch mode. + if (!cardCMD6(0X80FFFFF1, status)) { + return false; + } + if ((status[16] & 0XF) == 1) { + kHzSdClk = 50000; + } else { + return sdError(SD_CARD_ERROR_CMD6); + } + } } // Disable GPIO. enableGPIO(false); @@ -679,11 +794,32 @@ bool SdioCard::begin(SdioConfig sdioConfig) { return true; } //------------------------------------------------------------------------------ +bool SdioCard::cardCMD6(uint32_t arg, uint8_t* status) { + // CMD6 returns 64 bytes. + if (waitTimeout(isBusyCMD13)) { + return sdError(SD_CARD_ERROR_CMD13); + } + enableDmaIrs(); + SDHC_DSADDR = (uint32_t)status; + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(1) | SDHC_BLKATTR_BLKSIZE(64); + SDHC_IRQSIGEN = SDHC_IRQSIGEN_MASK; + if (!cardCommand(CMD6_XFERTYP, arg)) { + return sdError(SD_CARD_ERROR_CMD6); + } + if (!waitDmaStatus()) { + return sdError(SD_CARD_ERROR_DMA); + } + return true; +} +//------------------------------------------------------------------------------ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { + if (m_curState != IDLE_STATE && !syncDevice()) { + return false; + } // check for single sector erase - if (!m_csd.v1.erase_blk_en) { + if (!m_csd.eraseSingleBlock()) { // erase size mask - uint8_t m = (m_csd.v1.sector_size_high << 1) | m_csd.v1.sector_size_low; + uint8_t m = m_csd.eraseSize() - 1; if ((firstSector & m) != 0 || ((lastSector + 1) & m) != 0) { // error card can't erase specified area return sdError(SD_CARD_ERROR_ERASE_SINGLE_SECTOR); @@ -697,7 +833,7 @@ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { return sdError(SD_CARD_ERROR_CMD32); } if (!cardCommand(CMD33_XFERTYP, lastSector)) { - return sdError(SD_CARD_ERROR_CMD33); + return sdError(SD_CARD_ERROR_CMD33); } if (!cardCommand(CMD38_XFERTYP, 0)) { return sdError(SD_CARD_ERROR_CMD38); @@ -708,33 +844,45 @@ bool SdioCard::erase(uint32_t firstSector, uint32_t lastSector) { return true; } //------------------------------------------------------------------------------ -uint8_t SdioCard::errorCode() const { - return m_errorCode; -} +uint8_t SdioCard::errorCode() const { return m_errorCode; } //------------------------------------------------------------------------------ -uint32_t SdioCard::errorData() const { - return m_irqstat; -} +uint32_t SdioCard::errorData() const { return m_irqstat; } //------------------------------------------------------------------------------ -uint32_t SdioCard::errorLine() const { - return m_errorLine; -} +uint32_t SdioCard::errorLine() const { return m_errorLine; } //------------------------------------------------------------------------------ bool SdioCard::isBusy() { - return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); + if (m_sdioConfig.useDma()) { + return m_busyFcn ? m_busyFcn() : m_initDone && isBusyCMD13(); + } else { + if (m_transferActive) { + if (isBusyTransferComplete()) { + return true; + } +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + if ((SDHC_BLKATTR & 0XFFFF0000) != 0) { + return false; + } + m_transferActive = false; + stopTransmission(false); + return true; +#else // defined(__MK64FX512__) || defined(__MK66FX1M0__) + return false; +#endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) + } + // Use DAT0 low as busy. + return SDHC_PRSSTAT & (1 << 24) ? false : true; + } } //------------------------------------------------------------------------------ -uint32_t SdioCard::kHzSdClk() { - return m_sdClkKhz; -} +uint32_t SdioCard::kHzSdClk() { return m_sdClkKhz; } //------------------------------------------------------------------------------ bool SdioCard::readCID(cid_t* cid) { - memcpy(cid, &m_cid, 16); + memcpy(cid, &m_cid, sizeof(cid_t)); return true; } //------------------------------------------------------------------------------ bool SdioCard::readCSD(csd_t* csd) { - memcpy(csd, &m_csd, 16); + memcpy(csd, &m_csd, sizeof(csd_t)); return true; } //------------------------------------------------------------------------------ @@ -752,7 +900,7 @@ bool SdioCard::readData(uint8_t* dst) { if (waitTimeout(isBusyFifoRead)) { return sdError(SD_CARD_ERROR_READ_FIFO); } - for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { + for (uint32_t iw = 0; iw < 512 / (4 * FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BREN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { @@ -773,6 +921,16 @@ bool SdioCard::readOCR(uint32_t* ocr) { return true; } //------------------------------------------------------------------------------ +bool SdioCard::readSCR(scr_t* scr) { + memcpy(scr, &m_scr, sizeof(scr_t)); + return true; +} +//------------------------------------------------------------------------------ +bool SdioCard::readSDS(sds_t* sds) { + memcpy(sds, &m_sds, sizeof(sds_t)); + return true; +} +//------------------------------------------------------------------------------ bool SdioCard::readSector(uint32_t sector, uint8_t* dst) { if (m_sdioConfig.useDma()) { uint8_t aligned[512]; @@ -786,6 +944,9 @@ bool SdioCard::readSector(uint32_t sector, uint8_t* dst) { memcpy(dst, aligned, 512); } } else { + if (!waitTransferComplete()) { + return false; + } if (m_curState != READ_STATE || sector != m_curSector) { if (!syncDevice()) { return false; @@ -826,7 +987,7 @@ bool SdioCard::readSectors(uint32_t sector, uint8_t* dst, size_t n) { } } else { for (size_t i = 0; i < n; i++) { - if (!readSector(sector + i, dst + i*512UL)) { + if (!readSector(sector + i, dst + i * 512UL)) { return false; } } @@ -844,51 +1005,60 @@ bool SdioCard::readStart(uint32_t sector) { #if defined(__IMXRT1062__) // Infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); -#else // defined(__IMXRT1062__) +#else // defined(__IMXRT1062__) // Errata - can't do infinite transfer. - SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(0XFFFF) | SDHC_BLKATTR_BLKSIZE(512); + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(MAX_BLKCNT) | SDHC_BLKATTR_BLKSIZE(512); #endif // defined(__IMXRT1062__) - if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(CMD18_PGM_XFERTYP, m_highCapacity ? sector : 512 * sector)) { return sdError(SD_CARD_ERROR_CMD18); } return true; } //------------------------------------------------------------------------------ -bool SdioCard::readStop() { - return transferStop(); -} +bool SdioCard::readStop() { return transferStop(); } //------------------------------------------------------------------------------ -uint32_t SdioCard::sectorCount() { - return sdCardCapacity(&m_csd); -} +uint32_t SdioCard::sectorCount() { return m_csd.capacity(); } //------------------------------------------------------------------------------ -uint32_t SdioCard::status() { - return statusCMD13(); -} +uint32_t SdioCard::status() { return statusCMD13(); } //------------------------------------------------------------------------------ -bool SdioCard::syncDevice() { - if (m_curState == READ_STATE) { - m_curState = IDLE_STATE; - if (!readStop()) { - return false; - } - } else if (m_curState == WRITE_STATE) { - m_curState = IDLE_STATE; - if (!writeStop()) { - return false; +bool SdioCard::stopTransmission(bool blocking) { + m_curState = IDLE_STATE; + // This fix allows CDIHB to be cleared in Tennsy 3.x without a reset. + SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; + if (!cardCommand(CMD12_XFERTYP, 0)) { + return sdError(SD_CARD_ERROR_CMD12); + } + if (blocking) { + if (yieldTimeout(isBusyDat)) { + return sdError(SD_CARD_ERROR_CMD13); } } return true; } //------------------------------------------------------------------------------ +bool SdioCard::syncDevice() { + if (!waitTransferComplete()) { + return false; + } + if (m_curState != IDLE_STATE) { + return stopTransmission(true); + } + return true; +} +//------------------------------------------------------------------------------ uint8_t SdioCard::type() const { - return m_version2 ? m_highCapacity ? - SD_CARD_TYPE_SDHC : SD_CARD_TYPE_SD2 : SD_CARD_TYPE_SD1; + return !m_initDone ? 0 + : !m_version2 ? SD_CARD_TYPE_SD1 + : !m_highCapacity ? SD_CARD_TYPE_SD2 + : SD_CARD_TYPE_SDHC; } //------------------------------------------------------------------------------ bool SdioCard::writeData(const uint8_t* src) { DBG_IRQSTAT(); + if (!waitTransferComplete()) { + return false; + } const uint32_t* p32 = reinterpret_cast(src); if (!(SDHC_PRSSTAT & SDHC_PRSSTAT_WTA)) { SDHC_PROCTL &= ~SDHC_PROCTL_SABGREQ; @@ -898,7 +1068,7 @@ bool SdioCard::writeData(const uint8_t* src) { if (waitTimeout(isBusyFifoWrite)) { return sdError(SD_CARD_ERROR_WRITE_FIFO); } - for (uint32_t iw = 0 ; iw < 512/(4*FIFO_WML); iw++) { + for (uint32_t iw = 0; iw < 512 / (4 * FIFO_WML); iw++) { while (0 == (SDHC_PRSSTAT & SDHC_PRSSTAT_BWEN)) { } for (uint32_t i = 0; i < FIFO_WML; i++) { @@ -906,12 +1076,8 @@ bool SdioCard::writeData(const uint8_t* src) { } p32 += FIFO_WML; } - if (waitTimeout(isBusyTransferComplete)) { - return sdError(SD_CARD_ERROR_WRITE_TIMEOUT); - } - m_irqstat = SDHC_IRQSTAT; - SDHC_IRQSTAT = m_irqstat; - return (m_irqstat & SDHC_IRQSTAT_TC) && !(m_irqstat & SDHC_IRQSTAT_ERROR); + m_transferActive = true; + return true; } //------------------------------------------------------------------------------ bool SdioCard::writeSector(uint32_t sector, const uint8_t* src) { @@ -924,15 +1090,26 @@ bool SdioCard::writeSector(uint32_t sector, const uint8_t* src) { } else { ptr = const_cast(src); } - if (!rdWrSectors(CMD24_DMA_XFERTYP, sector, ptr, 1)) { + if (!rdWrSectors(CMD24_DMA_XFERTYP, sector, ptr, 1)) { return sdError(SD_CARD_ERROR_CMD24); } } else { + if (!waitTransferComplete()) { + return false; + } +#if defined(__MK64FX512__) || defined(__MK66FX1M0__) + // End transfer with CMD12 if required. + if ((SDHC_BLKATTR & 0XFFFF0000) == 0) { + if (!syncDevice()) { + return false; + } + } +#endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) if (m_curState != WRITE_STATE || m_curSector != sector) { if (!syncDevice()) { return false; } - if (!writeStart(sector )) { + if (!writeStart(sector)) { return false; } m_curSector = sector; @@ -942,14 +1119,6 @@ bool SdioCard::writeSector(uint32_t sector, const uint8_t* src) { return false; } m_curSector++; -#if defined(__MK64FX512__) || defined(__MK66FX1M0__) - // End transfer with CMD12 if required. - if ((SDHC_BLKATTR & 0XFFFF0000) == 0) { - if (!syncDevice()) { - return false; - } - } -#endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) } return true; } @@ -970,7 +1139,7 @@ bool SdioCard::writeSectors(uint32_t sector, const uint8_t* src, size_t n) { } } else { for (size_t i = 0; i < n; i++) { - if (!writeSector(sector + i, src + i*512UL)) { + if (!writeSector(sector + i, src + i * 512UL)) { return false; } } @@ -987,22 +1156,15 @@ bool SdioCard::writeStart(uint32_t sector) { #if defined(__IMXRT1062__) // Infinite transfer. SDHC_BLKATTR = SDHC_BLKATTR_BLKSIZE(512); -#else // defined(__IMXRT1062__) +#else // defined(__IMXRT1062__) // Errata - can't do infinite transfer. - SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(0XFFFF) | SDHC_BLKATTR_BLKSIZE(512); + SDHC_BLKATTR = SDHC_BLKATTR_BLKCNT(MAX_BLKCNT) | SDHC_BLKATTR_BLKSIZE(512); #endif // defined(__IMXRT1062__) - if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512*sector)) { + if (!cardCommand(CMD25_PGM_XFERTYP, m_highCapacity ? sector : 512 * sector)) { return sdError(SD_CARD_ERROR_CMD25); } return true; } //------------------------------------------------------------------------------ -bool SdioCard::writeStop() { - return transferStop(); -} - - -}; // namespace sdfat - - +bool SdioCard::writeStop() { return transferStop(); } #endif // defined(__MK64FX512__) defined(__MK66FX1M0__) defined(__IMXRT1062__) diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.h index 69573dc1..5d97e569 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdCard/SdioTeensy.h @@ -1,277 +1,530 @@ +/** + * \file + * \brief Definitions for Teensy HDHC. + */ + #ifndef SdioTeensy_h #define SdioTeensy_h // From Paul's SD.h driver. #if defined(__IMXRT1062__) -#define MAKE_REG_MASK(m,s) (((uint32_t)(((uint32_t)(m) << s)))) -#define MAKE_REG_GET(x,m,s) (((uint32_t)(((uint32_t)(x)>>s) & m))) -#define MAKE_REG_SET(x,m,s) (((uint32_t)(((uint32_t)(x) & m) << s))) +#define MAKE_REG_MASK(m, s) (((uint32_t)(((uint32_t)(m) << s)))) +#define MAKE_REG_GET(x, m, s) (((uint32_t)(((uint32_t)(x) >> s) & m))) +#define MAKE_REG_SET(x, m, s) (((uint32_t)(((uint32_t)(x)&m) << s))) -#define SDHC_BLKATTR_BLKSIZE_MASK MAKE_REG_MASK(0x1FFF,0) //uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size Mask -#define SDHC_BLKATTR_BLKSIZE(n) MAKE_REG_SET(n,0x1FFF,0) //uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size -#define SDHC_BLKATTR_BLKCNT_MASK MAKE_REG_MASK(0x1FFF,16) //((uint32_t)0x1FFF<<16) -#define SDHC_BLKATTR_BLKCNT(n) MAKE_REG_SET(n,0x1FFF,16) //(uint32_t)(((n) & 0x1FFF)<<16) // Blocks Count For Current Transfer +#define SDHC_BLKATTR_BLKSIZE_MASK \ + MAKE_REG_MASK( \ + 0x1FFF, 0) // uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size Mask +#define SDHC_BLKATTR_BLKSIZE(n) \ + MAKE_REG_SET(n, 0x1FFF, \ + 0) // uint32_t)(((n) & 0x1FFF)<<0) // Transfer Block Size +#define SDHC_BLKATTR_BLKCNT_MASK \ + MAKE_REG_MASK(0x1FFF, 16) //((uint32_t)0x1FFF<<16) +#define SDHC_BLKATTR_BLKCNT(n) \ + MAKE_REG_SET(n, 0x1FFF, 16) //(uint32_t)(((n) & 0x1FFF)<<16) // Blocks Count + // For Current Transfer -#define SDHC_XFERTYP_CMDINX(n) MAKE_REG_SET(n,0x3F,24) //(uint32_t)(((n) & 0x3F)<<24)// Command Index -#define SDHC_XFERTYP_CMDTYP(n) MAKE_REG_SET(n,0x3,22) //(uint32_t)(((n) & 0x3)<<22) // Command Type -#define SDHC_XFERTYP_DPSEL MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data Present Select -#define SDHC_XFERTYP_CICEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Command Index Check Enable -#define SDHC_XFERTYP_CCCEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command CRC Check Enable -#define SDHC_XFERTYP_RSPTYP(n) MAKE_REG_SET(n,0x3,16) //(uint32_t)(((n) & 0x3)<<16) // Response Type Select -#define SDHC_XFERTYP_MSBSEL MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Multi/Single Block Select -#define SDHC_XFERTYP_DTDSEL MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Data Transfer Direction Select -#define SDHC_XFERTYP_AC12EN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Auto CMD12 Enable -#define SDHC_XFERTYP_BCEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Block Count Enable -#define SDHC_XFERTYP_DMAEN MAKE_REG_MASK(0x3,0) //((uint32_t)0x00000001) // DMA Enable +#define SDHC_XFERTYP_CMDINX(n) \ + MAKE_REG_SET(n, 0x3F, 24) //(uint32_t)(((n) & 0x3F)<<24)// Command Index +#define SDHC_XFERTYP_CMDTYP(n) \ + MAKE_REG_SET(n, 0x3, 22) //(uint32_t)(((n) & 0x3)<<22) // Command Type +#define SDHC_XFERTYP_DPSEL \ + MAKE_REG_MASK(0x1, 21) //((uint32_t)0x00200000) // Data Present Select +#define SDHC_XFERTYP_CICEN \ + MAKE_REG_MASK(0x1, \ + 20) //((uint32_t)0x00100000) // Command Index Check Enable +#define SDHC_XFERTYP_CCCEN \ + MAKE_REG_MASK(0x1, \ + 19) //((uint32_t)0x00080000) // Command CRC Check Enable +#define SDHC_XFERTYP_RSPTYP(n) \ + MAKE_REG_SET(n, 0x3, \ + 16) //(uint32_t)(((n) & 0x3)<<16) // Response Type Select +#define SDHC_XFERTYP_MSBSEL \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Multi/Single Block Select +#define SDHC_XFERTYP_DTDSEL \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Data Transfer Direction Select +#define SDHC_XFERTYP_AC12EN \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Auto CMD12 Enable +#define SDHC_XFERTYP_BCEN \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Block Count Enable +#define SDHC_XFERTYP_DMAEN \ + MAKE_REG_MASK(0x3, 0) //((uint32_t)0x00000001) // DMA Enable -#define SDHC_PRSSTAT_DLSL_MASK MAKE_REG_MASK(0xFF,24) //((uint32_t)0xFF000000) // DAT Line Signal Level -#define SDHC_PRSSTAT_CLSL MAKE_REG_MASK(0x1,23) //((uint32_t)0x00800000) // CMD Line Signal Level -#define SDHC_PRSSTAT_WPSPL MAKE_REG_MASK(0x1,19) // -#define SDHC_PRSSTAT_CDPL MAKE_REG_MASK(0x1,18) // -#define SDHC_PRSSTAT_CINS MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Card Inserted -#define SDHC_PRSSTAT_TSCD MAKE_REG_MASK(0x1,15) -#define SDHC_PRSSTAT_RTR MAKE_REG_MASK(0x1,12) -#define SDHC_PRSSTAT_BREN MAKE_REG_MASK(0x1,11) //((uint32_t)0x00000800) // Buffer Read Enable -#define SDHC_PRSSTAT_BWEN MAKE_REG_MASK(0x1,10) //((uint32_t)0x00000400) // Buffer Write Enable -#define SDHC_PRSSTAT_RTA MAKE_REG_MASK(0x1,9) //((uint32_t)0x00000200) // Read Transfer Active -#define SDHC_PRSSTAT_WTA MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Write Transfer Active -#define SDHC_PRSSTAT_SDOFF MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // SD Clock Gated Off Internally -#define SDHC_PRSSTAT_PEROFF MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // SDHC clock Gated Off Internally -#define SDHC_PRSSTAT_HCKOFF MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // System Clock Gated Off Internally -#define SDHC_PRSSTAT_IPGOFF MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Bus Clock Gated Off Internally -#define SDHC_PRSSTAT_SDSTB MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // SD Clock Stable -#define SDHC_PRSSTAT_DLA MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Data Line Active -#define SDHC_PRSSTAT_CDIHB MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Command Inhibit (DAT) -#define SDHC_PRSSTAT_CIHB MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Inhibit (CMD) +#define SDHC_PRSSTAT_DLSL_MASK \ + MAKE_REG_MASK(0xFF, 24) //((uint32_t)0xFF000000) // DAT Line Signal Level +#define SDHC_PRSSTAT_CLSL \ + MAKE_REG_MASK(0x1, 23) //((uint32_t)0x00800000) // CMD Line Signal Level +#define SDHC_PRSSTAT_WPSPL MAKE_REG_MASK(0x1, 19) // +#define SDHC_PRSSTAT_CDPL MAKE_REG_MASK(0x1, 18) // +#define SDHC_PRSSTAT_CINS \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Card Inserted +#define SDHC_PRSSTAT_TSCD MAKE_REG_MASK(0x1, 15) +#define SDHC_PRSSTAT_RTR MAKE_REG_MASK(0x1, 12) +#define SDHC_PRSSTAT_BREN \ + MAKE_REG_MASK(0x1, 11) //((uint32_t)0x00000800) // Buffer Read Enable +#define SDHC_PRSSTAT_BWEN \ + MAKE_REG_MASK(0x1, 10) //((uint32_t)0x00000400) // Buffer Write Enable +#define SDHC_PRSSTAT_RTA \ + MAKE_REG_MASK(0x1, 9) //((uint32_t)0x00000200) // Read Transfer Active +#define SDHC_PRSSTAT_WTA \ + MAKE_REG_MASK(0x1, 8) //((uint32_t)0x00000100) // Write Transfer Active +#define SDHC_PRSSTAT_SDOFF \ + MAKE_REG_MASK( \ + 0x1, 7) //((uint32_t)0x00000080) // SD Clock Gated Off Internally +#define SDHC_PRSSTAT_PEROFF \ + MAKE_REG_MASK( \ + 0x1, 6) //((uint32_t)0x00000040) // SDHC clock Gated Off Internally +#define SDHC_PRSSTAT_HCKOFF \ + MAKE_REG_MASK( \ + 0x1, 5) //((uint32_t)0x00000020) // System Clock Gated Off Internally +#define SDHC_PRSSTAT_IPGOFF \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Bus Clock Gated Off Internally +#define SDHC_PRSSTAT_SDSTB \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // SD Clock Stable +#define SDHC_PRSSTAT_DLA \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Data Line Active +#define SDHC_PRSSTAT_CDIHB \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Command Inhibit (DAT) +#define SDHC_PRSSTAT_CIHB \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Command Inhibit (CMD) -#define SDHC_PROTCT_NONEXACT_BLKRD MAKE_REG_MASK(0x1,30) // -#define SDHC_PROTCT_BURST_LENEN(n) MAKE_REG_SET(n,0x7,12) // -#define SDHC_PROCTL_WECRM MAKE_REG_MASK(0x1,26) //((uint32_t)0x04000000) // Wakeup Event Enable On SD Card Removal -#define SDHC_PROCTL_WECINS MAKE_REG_MASK(0x1,25) //((uint32_t)0x02000000) // Wakeup Event Enable On SD Card Insertion -#define SDHC_PROCTL_WECINT MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Wakeup Event Enable On Card Interrupt -#define SDHC_PROCTL_RD_DONE_NOBLK MAKE_REG_MASK(0x1,20) // -#define SDHC_PROCTL_IABG MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Interrupt At Block Gap -#define SDHC_PROCTL_RWCTL MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Read Wait Control -#define SDHC_PROCTL_CREQ MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Continue Request -#define SDHC_PROCTL_SABGREQ MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Stop At Block Gap Request -#define SDHC_PROCTL_DMAS(n) MAKE_REG_SET(n,0x3,8) //(uint32_t)(((n) & 0x3)<<8) // DMA Select -#define SDHC_PROCTL_CDSS MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Detect Signal Selection -#define SDHC_PROCTL_CDTL MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Detect Test Level -#define SDHC_PROCTL_EMODE(n) MAKE_REG_SET(n,0x3,4) //(uint32_t)(((n) & 0x3)<<4) // Endian Mode -#define SDHC_PROCTL_EMODE_MASK MAKE_REG_MASK(0x3,4) //(uint32_t)((0x3)<<4) // Endian Mode -#define SDHC_PROCTL_D3CD MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DAT3 As Card Detection Pin -#define SDHC_PROCTL_DTW(n) MAKE_REG_SET(n,0x3,1) //(uint32_t)(((n) & 0x3)<<1) // Data Transfer Width, 0=1bit, 1=4bit, 2=8bit -#define SDHC_PROCTL_DTW_MASK MAKE_REG_MASK(0x3,1) //((uint32_t)0x00000006) -#define SDHC_PROCTL_LCTL MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // LED Control +#define SDHC_PROTCT_NONEXACT_BLKRD MAKE_REG_MASK(0x1, 30) // +#define SDHC_PROTCT_BURST_LENEN(n) MAKE_REG_SET(n, 0x7, 12) // +#define SDHC_PROCTL_WECRM \ + MAKE_REG_MASK(0x1, 26) //((uint32_t)0x04000000) // Wakeup Event Enable On + // SD Card Removal +#define SDHC_PROCTL_WECINS \ + MAKE_REG_MASK(0x1, 25) //((uint32_t)0x02000000) // Wakeup Event Enable On + // SD Card Insertion +#define SDHC_PROCTL_WECINT \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Wakeup Event Enable On + // Card Interrupt +#define SDHC_PROCTL_RD_DONE_NOBLK MAKE_REG_MASK(0x1, 20) // +#define SDHC_PROCTL_IABG \ + MAKE_REG_MASK(0x1, 19) //((uint32_t)0x00080000) // Interrupt At Block Gap +#define SDHC_PROCTL_RWCTL \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Read Wait Control +#define SDHC_PROCTL_CREQ \ + MAKE_REG_MASK(0x1, 17) //((uint32_t)0x00020000) // Continue Request +#define SDHC_PROCTL_SABGREQ \ + MAKE_REG_MASK(0x1, \ + 16) //((uint32_t)0x00010000) // Stop At Block Gap Request +#define SDHC_PROCTL_DMAS(n) \ + MAKE_REG_SET(n, 0x3, 8) //(uint32_t)(((n) & 0x3)<<8) // DMA Select +#define SDHC_PROCTL_CDSS \ + MAKE_REG_MASK(0x1, \ + 7) //((uint32_t)0x00000080) // Card Detect Signal Selection +#define SDHC_PROCTL_CDTL \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Card Detect Test Level +#define SDHC_PROCTL_EMODE(n) \ + MAKE_REG_SET(n, 0x3, 4) //(uint32_t)(((n) & 0x3)<<4) // Endian Mode +#define SDHC_PROCTL_EMODE_MASK \ + MAKE_REG_MASK(0x3, 4) //(uint32_t)((0x3)<<4) // Endian Mode +#define SDHC_PROCTL_D3CD \ + MAKE_REG_MASK(0x1, \ + 3) //((uint32_t)0x00000008) // DAT3 As Card Detection Pin +#define SDHC_PROCTL_DTW(n) \ + MAKE_REG_SET(n, 0x3, 1) //(uint32_t)(((n) & 0x3)<<1) // Data Transfer Width, + // 0=1bit, 1=4bit, 2=8bit +#define SDHC_PROCTL_DTW_MASK MAKE_REG_MASK(0x3, 1) //((uint32_t)0x00000006) +#define SDHC_PROCTL_LCTL \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // LED Control -#define SDHC_SYSCTL_RSTT MAKE_REG_MASK(0x1,28) // -#define SDHC_SYSCTL_INITA MAKE_REG_MASK(0x1,27) //((uint32_t)0x08000000) // Initialization Active -#define SDHC_SYSCTL_RSTD MAKE_REG_MASK(0x1,26) //((uint32_t)0x04000000) // Software Reset For DAT Line -#define SDHC_SYSCTL_RSTC MAKE_REG_MASK(0x1,25) //((uint32_t)0x02000000) // Software Reset For CMD Line -#define SDHC_SYSCTL_RSTA MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Software Reset For ALL -#define SDHC_SYSCTL_DTOCV(n) MAKE_REG_SET(n,0xF,16) //(uint32_t)(((n) & 0xF)<<16) // Data Timeout Counter Value -#define SDHC_SYSCTL_DTOCV_MASK MAKE_REG_MASK(0xF,16) //((uint32_t)0x000F0000) -#define SDHC_SYSCTL_SDCLKFS(n) MAKE_REG_SET(n,0xFF,8) //(uint32_t)(((n) & 0xFF)<<8) // SDCLK Frequency Select -#define SDHC_SYSCTL_SDCLKFS_MASK MAKE_REG_MASK(0xFF,8) //((uint32_t)0x0000FF00) -#define SDHC_SYSCTL_DVS(n) MAKE_REG_SET(n,0xF,4) //(uint32_t)(((n) & 0xF)<<4) // Divisor -#define SDHC_SYSCTL_DVS_MASK MAKE_REG_MASK(0xF,4) //((uint32_t)0x000000F0) +#define SDHC_SYSCTL_RSTT MAKE_REG_MASK(0x1, 28) // +#define SDHC_SYSCTL_INITA \ + MAKE_REG_MASK(0x1, 27) //((uint32_t)0x08000000) // Initialization Active +#define SDHC_SYSCTL_RSTD \ + MAKE_REG_MASK( \ + 0x1, 26) //((uint32_t)0x04000000) // Software Reset For DAT Line +#define SDHC_SYSCTL_RSTC \ + MAKE_REG_MASK( \ + 0x1, 25) //((uint32_t)0x02000000) // Software Reset For CMD Line +#define SDHC_SYSCTL_RSTA \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Software Reset For ALL +#define SDHC_SYSCTL_DTOCV(n) \ + MAKE_REG_SET( \ + n, 0xF, \ + 16) //(uint32_t)(((n) & 0xF)<<16) // Data Timeout Counter Value +#define SDHC_SYSCTL_DTOCV_MASK MAKE_REG_MASK(0xF, 16) //((uint32_t)0x000F0000) +#define SDHC_SYSCTL_SDCLKFS(n) \ + MAKE_REG_SET(n, 0xFF, \ + 8) //(uint32_t)(((n) & 0xFF)<<8) // SDCLK Frequency Select +#define SDHC_SYSCTL_SDCLKFS_MASK \ + MAKE_REG_MASK(0xFF, 8) //((uint32_t)0x0000FF00) +#define SDHC_SYSCTL_DVS(n) \ + MAKE_REG_SET(n, 0xF, 4) //(uint32_t)(((n) & 0xF)<<4) // Divisor +#define SDHC_SYSCTL_DVS_MASK MAKE_REG_MASK(0xF, 4) //((uint32_t)0x000000F0) -#define SDHC_SYSCTL_SDCLKEN ((uint32_t)0x00000008) // SD Clock Enable -#define SDHC_SYSCTL_PEREN ((uint32_t)0x00000004) // Peripheral Clock Enable -#define SDHC_SYSCTL_HCKEN ((uint32_t)0x00000002) // System Clock Enable -#define SDHC_SYSCTL_IPGEN ((uint32_t)0x00000001) // IPG Clock Enable +#define SDHC_SYSCTL_SDCLKEN ((uint32_t)0x00000008) // SD Clock Enable +#define SDHC_SYSCTL_PEREN ((uint32_t)0x00000004) // Peripheral Clock Enable +#define SDHC_SYSCTL_HCKEN ((uint32_t)0x00000002) // System Clock Enable +#define SDHC_SYSCTL_IPGEN ((uint32_t)0x00000001) // IPG Clock Enable -#define SDHC_IRQSTAT_DMAE MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error -#define SDHC_IRQSTAT_TNE MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSTAT_AC12E MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error -#define SDHC_IRQSTAT_DEBE MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error -#define SDHC_IRQSTAT_DCE MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error -#define SDHC_IRQSTAT_DTOE MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error -#define SDHC_IRQSTAT_CIE MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error -#define SDHC_IRQSTAT_CEBE MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error -#define SDHC_IRQSTAT_CCE MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error -#define SDHC_IRQSTAT_CTOE MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error -#define SDHC_IRQSTAT_TP MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSTAT_RTE MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSTAT_CINT MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt -#define SDHC_IRQSTAT_CRM MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal -#define SDHC_IRQSTAT_CINS MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion -#define SDHC_IRQSTAT_BRR MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready -#define SDHC_IRQSTAT_BWR MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready -#define SDHC_IRQSTAT_DINT MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt -#define SDHC_IRQSTAT_BGE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event -#define SDHC_IRQSTAT_TC MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete -#define SDHC_IRQSTAT_CC MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete +#define SDHC_IRQSTAT_DMAE \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // DMA Error +#define SDHC_IRQSTAT_TNE MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSTAT_AC12E \ + MAKE_REG_MASK(0x1, 24) //((uint32_t)0x01000000) // Auto CMD12 Error +#define SDHC_IRQSTAT_DEBE \ + MAKE_REG_MASK(0x1, 22) //((uint32_t)0x00400000) // Data End Bit Error +#define SDHC_IRQSTAT_DCE \ + MAKE_REG_MASK(0x1, 21) //((uint32_t)0x00200000) // Data CRC Error +#define SDHC_IRQSTAT_DTOE \ + MAKE_REG_MASK(0x1, 20) //((uint32_t)0x00100000) // Data Timeout Error +#define SDHC_IRQSTAT_CIE \ + MAKE_REG_MASK(0x1, 19) //((uint32_t)0x00080000) // Command Index Error +#define SDHC_IRQSTAT_CEBE \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Command End Bit Error +#define SDHC_IRQSTAT_CCE \ + MAKE_REG_MASK(0x1, 17) //((uint32_t)0x00020000) // Command CRC Error +#define SDHC_IRQSTAT_CTOE \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Command Timeout Error +#define SDHC_IRQSTAT_TP MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSTAT_RTE MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSTAT_CINT \ + MAKE_REG_MASK(0x1, 8) //((uint32_t)0x00000100) // Card Interrupt +#define SDHC_IRQSTAT_CRM \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Card Removal +#define SDHC_IRQSTAT_CINS \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Card Insertion +#define SDHC_IRQSTAT_BRR \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Buffer Read Ready +#define SDHC_IRQSTAT_BWR \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Buffer Write Ready +#define SDHC_IRQSTAT_DINT \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // DMA Interrupt +#define SDHC_IRQSTAT_BGE \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Block Gap Event +#define SDHC_IRQSTAT_TC \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Transfer Complete +#define SDHC_IRQSTAT_CC \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Command Complete -#define SDHC_IRQSTATEN_DMAESEN MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error Status Enable -#define SDHC_IRQSTATEN_TNESEN MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSTATEN_AC12ESEN MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error Status Enable -#define SDHC_IRQSTATEN_DEBESEN MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error Status Enable -#define SDHC_IRQSTATEN_DCESEN MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error Status Enable -#define SDHC_IRQSTATEN_DTOESEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error Status Enable -#define SDHC_IRQSTATEN_CIESEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error Status Enable -#define SDHC_IRQSTATEN_CEBESEN MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error Status Enable -#define SDHC_IRQSTATEN_CCESEN MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error Status Enable -#define SDHC_IRQSTATEN_CTOESEN MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error Status Enable -#define SDHC_IRQSTATEN_TPSEN MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSTATEN_RTESEN MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSTATEN_CINTSEN MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt Status Enable -#define SDHC_IRQSTATEN_CRMSEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal Status Enable -#define SDHC_IRQSTATEN_CINSEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion Status Enable -#define SDHC_IRQSTATEN_BRRSEN MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready Status Enable -#define SDHC_IRQSTATEN_BWRSEN MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready Status Enable -#define SDHC_IRQSTATEN_DINTSEN MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt Status Enable -#define SDHC_IRQSTATEN_BGESEN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event Status Enable -#define SDHC_IRQSTATEN_TCSEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete Status Enable -#define SDHC_IRQSTATEN_CCSEN MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete Status Enable +#define SDHC_IRQSTATEN_DMAESEN \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // DMA Error Status Enable +#define SDHC_IRQSTATEN_TNESEN MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSTATEN_AC12ESEN \ + MAKE_REG_MASK( \ + 0x1, 24) //((uint32_t)0x01000000) // Auto CMD12 Error Status Enable +#define SDHC_IRQSTATEN_DEBESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 22) //((uint32_t)0x00400000) // Data End Bit Error Status Enable +#define SDHC_IRQSTATEN_DCESEN \ + MAKE_REG_MASK( \ + 0x1, 21) //((uint32_t)0x00200000) // Data CRC Error Status Enable +#define SDHC_IRQSTATEN_DTOESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 20) //((uint32_t)0x00100000) // Data Timeout Error Status Enable +#define SDHC_IRQSTATEN_CIESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 19) //((uint32_t)0x00080000) // Command Index Error Status Enable +#define SDHC_IRQSTATEN_CEBESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 18) //((uint32_t)0x00040000) // Command End Bit Error Status Enable +#define SDHC_IRQSTATEN_CCESEN \ + MAKE_REG_MASK( \ + 0x1, 17) //((uint32_t)0x00020000) // Command CRC Error Status Enable +#define SDHC_IRQSTATEN_CTOESEN \ + MAKE_REG_MASK( \ + 0x1, \ + 16) //((uint32_t)0x00010000) // Command Timeout Error Status Enable +#define SDHC_IRQSTATEN_TPSEN MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSTATEN_RTESEN MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSTATEN_CINTSEN \ + MAKE_REG_MASK(0x1, \ + 8) //((uint32_t)0x00000100) // Card Interrupt Status Enable +#define SDHC_IRQSTATEN_CRMSEN \ + MAKE_REG_MASK(0x1, \ + 7) //((uint32_t)0x00000080) // Card Removal Status Enable +#define SDHC_IRQSTATEN_CINSEN \ + MAKE_REG_MASK(0x1, \ + 6) //((uint32_t)0x00000040) // Card Insertion Status Enable +#define SDHC_IRQSTATEN_BRRSEN \ + MAKE_REG_MASK( \ + 0x1, 5) //((uint32_t)0x00000020) // Buffer Read Ready Status Enable +#define SDHC_IRQSTATEN_BWRSEN \ + MAKE_REG_MASK( \ + 0x1, 4) //((uint32_t)0x00000010) // Buffer Write Ready Status Enable +#define SDHC_IRQSTATEN_DINTSEN \ + MAKE_REG_MASK(0x1, \ + 3) //((uint32_t)0x00000008) // DMA Interrupt Status Enable +#define SDHC_IRQSTATEN_BGESEN \ + MAKE_REG_MASK( \ + 0x1, 2) //((uint32_t)0x00000004) // Block Gap Event Status Enable +#define SDHC_IRQSTATEN_TCSEN \ + MAKE_REG_MASK( \ + 0x1, 1) //((uint32_t)0x00000002) // Transfer Complete Status Enable +#define SDHC_IRQSTATEN_CCSEN \ + MAKE_REG_MASK( \ + 0x1, 0) //((uint32_t)0x00000001) // Command Complete Status Enable -#define SDHC_IRQSIGEN_DMAEIEN MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // DMA Error Interrupt Enable -#define SDHC_IRQSIGEN_TNEIEN MAKE_REG_MASK(0x1,26) // -#define SDHC_IRQSIGEN_AC12EIEN MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Auto CMD12 Error Interrupt Enable -#define SDHC_IRQSIGEN_DEBEIEN MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Data End Bit Error Interrupt Enable -#define SDHC_IRQSIGEN_DCEIEN MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Data CRC Error Interrupt Enable -#define SDHC_IRQSIGEN_DTOEIEN MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Data Timeout Error Interrupt Enable -#define SDHC_IRQSIGEN_CIEIEN MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Command Index Error Interrupt Enable -#define SDHC_IRQSIGEN_CEBEIEN MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Command End Bit Error Interrupt Enable -#define SDHC_IRQSIGEN_CCEIEN MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Command CRC Error Interrupt Enable -#define SDHC_IRQSIGEN_CTOEIEN MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Command Timeout Error Interrupt Enable -#define SDHC_IRQSIGEN_TPIEN MAKE_REG_MASK(0x1,14) // -#define SDHC_IRQSIGEN_RTEIEN MAKE_REG_MASK(0x1,12) // -#define SDHC_IRQSIGEN_CINTIEN MAKE_REG_MASK(0x1,8) //((uint32_t)0x00000100) // Card Interrupt Interrupt Enable -#define SDHC_IRQSIGEN_CRMIEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Card Removal Interrupt Enable -#define SDHC_IRQSIGEN_CINSIEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Card Insertion Interrupt Enable -#define SDHC_IRQSIGEN_BRRIEN MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Buffer Read Ready Interrupt Enable -#define SDHC_IRQSIGEN_BWRIEN MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Buffer Write Ready Interrupt Enable -#define SDHC_IRQSIGEN_DINTIEN MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // DMA Interrupt Interrupt Enable -#define SDHC_IRQSIGEN_BGEIEN MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Block Gap Event Interrupt Enable -#define SDHC_IRQSIGEN_TCIEN MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Transfer Complete Interrupt Enable -#define SDHC_IRQSIGEN_CCIEN MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Command Complete Interrupt Enable +#define SDHC_IRQSIGEN_DMAEIEN \ + MAKE_REG_MASK(0x1, \ + 28) //((uint32_t)0x10000000) // DMA Error Interrupt Enable +#define SDHC_IRQSIGEN_TNEIEN MAKE_REG_MASK(0x1, 26) // +#define SDHC_IRQSIGEN_AC12EIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 24) //((uint32_t)0x01000000) // Auto CMD12 Error Interrupt Enable +#define SDHC_IRQSIGEN_DEBEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 22) //((uint32_t)0x00400000) // Data End Bit Error Interrupt Enable +#define SDHC_IRQSIGEN_DCEIEN \ + MAKE_REG_MASK( \ + 0x1, 21) //((uint32_t)0x00200000) // Data CRC Error Interrupt Enable +#define SDHC_IRQSIGEN_DTOEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 20) //((uint32_t)0x00100000) // Data Timeout Error Interrupt Enable +#define SDHC_IRQSIGEN_CIEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 19) //((uint32_t)0x00080000) // Command Index Error Interrupt Enable +#define SDHC_IRQSIGEN_CEBEIEN \ + MAKE_REG_MASK(0x1, 18) //((uint32_t)0x00040000) // Command End Bit Error + // Interrupt Enable +#define SDHC_IRQSIGEN_CCEIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 17) //((uint32_t)0x00020000) // Command CRC Error Interrupt Enable +#define SDHC_IRQSIGEN_CTOEIEN \ + MAKE_REG_MASK(0x1, 16) //((uint32_t)0x00010000) // Command Timeout Error + // Interrupt Enable +#define SDHC_IRQSIGEN_TPIEN MAKE_REG_MASK(0x1, 14) // +#define SDHC_IRQSIGEN_RTEIEN MAKE_REG_MASK(0x1, 12) // +#define SDHC_IRQSIGEN_CINTIEN \ + MAKE_REG_MASK( \ + 0x1, 8) //((uint32_t)0x00000100) // Card Interrupt Interrupt Enable +#define SDHC_IRQSIGEN_CRMIEN \ + MAKE_REG_MASK( \ + 0x1, 7) //((uint32_t)0x00000080) // Card Removal Interrupt Enable +#define SDHC_IRQSIGEN_CINSIEN \ + MAKE_REG_MASK( \ + 0x1, 6) //((uint32_t)0x00000040) // Card Insertion Interrupt Enable +#define SDHC_IRQSIGEN_BRRIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 5) //((uint32_t)0x00000020) // Buffer Read Ready Interrupt Enable +#define SDHC_IRQSIGEN_BWRIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 4) //((uint32_t)0x00000010) // Buffer Write Ready Interrupt Enable +#define SDHC_IRQSIGEN_DINTIEN \ + MAKE_REG_MASK( \ + 0x1, 3) //((uint32_t)0x00000008) // DMA Interrupt Interrupt Enable +#define SDHC_IRQSIGEN_BGEIEN \ + MAKE_REG_MASK( \ + 0x1, 2) //((uint32_t)0x00000004) // Block Gap Event Interrupt Enable +#define SDHC_IRQSIGEN_TCIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 1) //((uint32_t)0x00000002) // Transfer Complete Interrupt Enable +#define SDHC_IRQSIGEN_CCIEN \ + MAKE_REG_MASK( \ + 0x1, \ + 0) //((uint32_t)0x00000001) // Command Complete Interrupt Enable -#define SDHC_AC12ERR_SMPLCLK_SEL MAKE_REG_MASK(0x1,23) // -#define SDHC_AC12ERR_EXEC_TUNING MAKE_REG_MASK(0x1,22) // -#define SDHC_AC12ERR_CNIBAC12E MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Command Not Issued By Auto CMD12 Error -#define SDHC_AC12ERR_AC12IE MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Auto CMD12 Index Error -#define SDHC_AC12ERR_AC12CE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // Auto CMD12 CRC Error -#define SDHC_AC12ERR_AC12EBE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Auto CMD12 End Bit Error -#define SDHC_AC12ERR_AC12TOE MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Auto CMD12 Timeout Error -#define SDHC_AC12ERR_AC12NE MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Auto CMD12 Not Executed +#define SDHC_AC12ERR_SMPLCLK_SEL MAKE_REG_MASK(0x1, 23) // +#define SDHC_AC12ERR_EXEC_TUNING MAKE_REG_MASK(0x1, 22) // +#define SDHC_AC12ERR_CNIBAC12E \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Command Not Issued By + // Auto CMD12 Error +#define SDHC_AC12ERR_AC12IE \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Auto CMD12 Index Error +#define SDHC_AC12ERR_AC12CE \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // Auto CMD12 CRC Error +#define SDHC_AC12ERR_AC12EBE \ + MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) // Auto CMD12 End Bit Error +#define SDHC_AC12ERR_AC12TOE \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Auto CMD12 Timeout Error +#define SDHC_AC12ERR_AC12NE \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Auto CMD12 Not Executed -#define SDHC_HTCAPBLT_VS18 MAKE_REG_MASK(0x1,26) // -#define SDHC_HTCAPBLT_VS30 MAKE_REG_MASK(0x1,25) // -#define SDHC_HTCAPBLT_VS33 MAKE_REG_MASK(0x1,24) // -#define SDHC_HTCAPBLT_SRS MAKE_REG_MASK(0x1,23) // -#define SDHC_HTCAPBLT_DMAS MAKE_REG_MASK(0x1,22) // -#define SDHC_HTCAPBLT_HSS MAKE_REG_MASK(0x1,21) // -#define SDHC_HTCAPBLT_ADMAS MAKE_REG_MASK(0x1,20) // -#define SDHC_HTCAPBLT_MBL_VAL MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x7,16) // -#define SDHC_HTCAPBLT_RETUN_MODE MAKE_REG_GET((USDHC1_HOST_CTRL_CAP),0x3,14) // -#define SDHC_HTCAPBLT_TUNE_SDR50 MAKE_REG_MASK(0x1,13) // -#define SDHC_HTCAPBLT_TIME_RETUN(n) MAKE_REG_SET(n,0xF,8) // +#define SDHC_HTCAPBLT_VS18 MAKE_REG_MASK(0x1, 26) // +#define SDHC_HTCAPBLT_VS30 MAKE_REG_MASK(0x1, 25) // +#define SDHC_HTCAPBLT_VS33 MAKE_REG_MASK(0x1, 24) // +#define SDHC_HTCAPBLT_SRS MAKE_REG_MASK(0x1, 23) // +#define SDHC_HTCAPBLT_DMAS MAKE_REG_MASK(0x1, 22) // +#define SDHC_HTCAPBLT_HSS MAKE_REG_MASK(0x1, 21) // +#define SDHC_HTCAPBLT_ADMAS MAKE_REG_MASK(0x1, 20) // +#define SDHC_HTCAPBLT_MBL_VAL MAKE_REG_GET((USDHC1_HOST_CTRL_CAP), 0x7, 16) // +#define SDHC_HTCAPBLT_RETUN_MODE \ + MAKE_REG_GET((USDHC1_HOST_CTRL_CAP), 0x3, 14) // +#define SDHC_HTCAPBLT_TUNE_SDR50 MAKE_REG_MASK(0x1, 13) // +#define SDHC_HTCAPBLT_TIME_RETUN(n) MAKE_REG_SET(n, 0xF, 8) // -#define SDHC_WML_WR_BRSTLEN_MASK MAKE_REG_MASK(0x1F,24) // -#define SDHC_WML_RD_BRSTLEN_MASK MAKE_REG_MASK(0x1F,8) // -#define SDHC_WML_WR_WML_MASK MAKE_REG_MASK(0xFF,16) // -#define SDHC_WML_RD_WML_MASK MAKE_REG_MASK(0xFF,0) // -#define SDHC_WML_WR_BRSTLEN(n) MAKE_REG_SET(n,0x1F,24) //(uint32_t)(((n) & 0x7F)<<16) // Write Burst Len -#define SDHC_WML_RD_BRSTLEN(n) MAKE_REG_SET(n,0x1F,8) //(uint32_t)(((n) & 0x7F)<<0) // Read Burst Len -#define SDHC_WML_WR_WML(n) MAKE_REG_SET(n,0xFF,16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level -#define SDHC_WML_RD_WML(n) MAKE_REG_SET(n,0xFF,0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level -#define SDHC_WML_WRWML(n) MAKE_REG_SET(n,0xFF,16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level -#define SDHC_WML_RDWML(n) MAKE_REG_SET(n,0xFF,0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level +#define SDHC_WML_WR_BRSTLEN_MASK MAKE_REG_MASK(0x1F, 24) // +#define SDHC_WML_RD_BRSTLEN_MASK MAKE_REG_MASK(0x1F, 8) // +#define SDHC_WML_WR_WML_MASK MAKE_REG_MASK(0xFF, 16) // +#define SDHC_WML_RD_WML_MASK MAKE_REG_MASK(0xFF, 0) // +#define SDHC_WML_WR_BRSTLEN(n) \ + MAKE_REG_SET(n, 0x1F, 24) //(uint32_t)(((n) & 0x7F)<<16) // Write Burst Len +#define SDHC_WML_RD_BRSTLEN(n) \ + MAKE_REG_SET(n, 0x1F, 8) //(uint32_t)(((n) & 0x7F)<<0) // Read Burst Len +#define SDHC_WML_WR_WML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level +#define SDHC_WML_RD_WML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level +#define SDHC_WML_WRWML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 16) //(uint32_t)(((n) & 0x7F)<<16) // Write Watermark Level +#define SDHC_WML_RDWML(n) \ + MAKE_REG_SET(n, 0xFF, \ + 0) //(uint32_t)(((n) & 0x7F)<<0) // Read Watermark Level // Teensy 4.0 only -#define SDHC_MIX_CTRL_DMAEN MAKE_REG_MASK(0x1,0) // -#define SDHC_MIX_CTRL_BCEN MAKE_REG_MASK(0x1,1) // -#define SDHC_MIX_CTRL_AC12EN MAKE_REG_MASK(0x1,2) // -#define SDHC_MIX_CTRL_DDR_EN MAKE_REG_MASK(0x1,3) // -#define SDHC_MIX_CTRL_DTDSEL MAKE_REG_MASK(0x1,4) // -#define SDHC_MIX_CTRL_MSBSEL MAKE_REG_MASK(0x1,5) // -#define SDHC_MIX_CTRL_NIBBLE_POS MAKE_REG_MASK(0x1,6) // -#define SDHC_MIX_CTRL_AC23EN MAKE_REG_MASK(0x1,7) // +#define SDHC_MIX_CTRL_DMAEN MAKE_REG_MASK(0x1, 0) // +#define SDHC_MIX_CTRL_BCEN MAKE_REG_MASK(0x1, 1) // +#define SDHC_MIX_CTRL_AC12EN MAKE_REG_MASK(0x1, 2) // +#define SDHC_MIX_CTRL_DDR_EN MAKE_REG_MASK(0x1, 3) // +#define SDHC_MIX_CTRL_DTDSEL MAKE_REG_MASK(0x1, 4) // +#define SDHC_MIX_CTRL_MSBSEL MAKE_REG_MASK(0x1, 5) // +#define SDHC_MIX_CTRL_NIBBLE_POS MAKE_REG_MASK(0x1, 6) // +#define SDHC_MIX_CTRL_AC23EN MAKE_REG_MASK(0x1, 7) // -#define SDHC_FEVT_CINT MAKE_REG_MASK(0x1,31) //((uint32_t)0x80000000) // Force Event Card Interrupt -#define SDHC_FEVT_DMAE MAKE_REG_MASK(0x1,28) //((uint32_t)0x10000000) // Force Event DMA Error -#define SDHC_FEVT_AC12E MAKE_REG_MASK(0x1,24) //((uint32_t)0x01000000) // Force Event Auto CMD12 Error -#define SDHC_FEVT_DEBE MAKE_REG_MASK(0x1,22) //((uint32_t)0x00400000) // Force Event Data End Bit Error -#define SDHC_FEVT_DCE MAKE_REG_MASK(0x1,21) //((uint32_t)0x00200000) // Force Event Data CRC Error -#define SDHC_FEVT_DTOE MAKE_REG_MASK(0x1,20) //((uint32_t)0x00100000) // Force Event Data Timeout Error -#define SDHC_FEVT_CIE MAKE_REG_MASK(0x1,19) //((uint32_t)0x00080000) // Force Event Command Index Error -#define SDHC_FEVT_CEBE MAKE_REG_MASK(0x1,18) //((uint32_t)0x00040000) // Force Event Command End Bit Error -#define SDHC_FEVT_CCE MAKE_REG_MASK(0x1,17) //((uint32_t)0x00020000) // Force Event Command CRC Error -#define SDHC_FEVT_CTOE MAKE_REG_MASK(0x1,16) //((uint32_t)0x00010000) // Force Event Command Timeout Error -#define SDHC_FEVT_CNIBAC12E MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // Force Event Command Not Executed By Auto Command 12 Error -#define SDHC_FEVT_AC12IE MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Force Event Auto Command 12 Index Error -#define SDHC_FEVT_AC12EBE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) // Force Event Auto Command 12 End Bit Error -#define SDHC_FEVT_AC12CE MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) // Force Event Auto Command 12 CRC Error -#define SDHC_FEVT_AC12TOE MAKE_REG_MASK(0x1,1) //((uint32_t)0x00000002) // Force Event Auto Command 12 Time Out Error -#define SDHC_FEVT_AC12NE MAKE_REG_MASK(0x1,0) //((uint32_t)0x00000001) // Force Event Auto Command 12 Not Executed +#define SDHC_FEVT_CINT \ + MAKE_REG_MASK(0x1, \ + 31) //((uint32_t)0x80000000) // Force Event Card Interrupt +#define SDHC_FEVT_DMAE \ + MAKE_REG_MASK(0x1, 28) //((uint32_t)0x10000000) // Force Event DMA Error +#define SDHC_FEVT_AC12E \ + MAKE_REG_MASK( \ + 0x1, 24) //((uint32_t)0x01000000) // Force Event Auto CMD12 Error +#define SDHC_FEVT_DEBE \ + MAKE_REG_MASK( \ + 0x1, 22) //((uint32_t)0x00400000) // Force Event Data End Bit Error +#define SDHC_FEVT_DCE \ + MAKE_REG_MASK(0x1, \ + 21) //((uint32_t)0x00200000) // Force Event Data CRC Error +#define SDHC_FEVT_DTOE \ + MAKE_REG_MASK( \ + 0x1, 20) //((uint32_t)0x00100000) // Force Event Data Timeout Error +#define SDHC_FEVT_CIE \ + MAKE_REG_MASK( \ + 0x1, 19) //((uint32_t)0x00080000) // Force Event Command Index Error +#define SDHC_FEVT_CEBE \ + MAKE_REG_MASK( \ + 0x1, \ + 18) //((uint32_t)0x00040000) // Force Event Command End Bit Error +#define SDHC_FEVT_CCE \ + MAKE_REG_MASK( \ + 0x1, 17) //((uint32_t)0x00020000) // Force Event Command CRC Error +#define SDHC_FEVT_CTOE \ + MAKE_REG_MASK( \ + 0x1, \ + 16) //((uint32_t)0x00010000) // Force Event Command Timeout Error +#define SDHC_FEVT_CNIBAC12E \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // Force Event Command Not + // Executed By Auto Command 12 Error +#define SDHC_FEVT_AC12IE \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Force Event Auto Command + // 12 Index Error +#define SDHC_FEVT_AC12EBE \ + MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) // Force Event Auto Command + // 12 End Bit Error +#define SDHC_FEVT_AC12CE \ + MAKE_REG_MASK( \ + 0x1, \ + 2) //((uint32_t)0x00000004) // Force Event Auto Command 12 CRC Error +#define SDHC_FEVT_AC12TOE \ + MAKE_REG_MASK(0x1, 1) //((uint32_t)0x00000002) // Force Event Auto Command + // 12 Time Out Error +#define SDHC_FEVT_AC12NE \ + MAKE_REG_MASK(0x1, 0) //((uint32_t)0x00000001) // Force Event Auto Command + // 12 Not Executed -#define SDHC_ADMAES_ADMADCE MAKE_REG_MASK(0x1,3) //((uint32_t)0x00000008) -#define SDHC_ADMAES_ADMALME MAKE_REG_MASK(0x1,2) //((uint32_t)0x00000004) -#define SDHC_ADMAES_ADMAES_MASK MAKE_REG_MASK(0x3,0) //((uint32_t)0x00000003) +#define SDHC_ADMAES_ADMADCE MAKE_REG_MASK(0x1, 3) //((uint32_t)0x00000008) +#define SDHC_ADMAES_ADMALME MAKE_REG_MASK(0x1, 2) //((uint32_t)0x00000004) +#define SDHC_ADMAES_ADMAES_MASK MAKE_REG_MASK(0x3, 0) //((uint32_t)0x00000003) -#define SDHC_MMCBOOT_BOOTBLKCNT(n) MAKE_REG_MASK(0xFF,16) //(uint32_t)(((n) & 0xFFF)<<16) // stop at block gap value of automatic mode -#define SDHC_MMCBOOT_AUTOSABGEN MAKE_REG_MASK(0x1,7) //((uint32_t)0x00000080) // enable auto stop at block gap function -#define SDHC_MMCBOOT_BOOTEN MAKE_REG_MASK(0x1,6) //((uint32_t)0x00000040) // Boot Mode Enable -#define SDHC_MMCBOOT_BOOTMODE MAKE_REG_MASK(0x1,5) //((uint32_t)0x00000020) // Boot Mode Select -#define SDHC_MMCBOOT_BOOTACK MAKE_REG_MASK(0x1,4) //((uint32_t)0x00000010) // Boot Ack Mode Select -#define SDHC_MMCBOOT_DTOCVACK(n) MAKE_REG_MASK(0xF,0) //(uint32_t)(((n) & 0xF)<<0) // Boot ACK Time Out Counter Value -//#define SDHC_HOSTVER (*(volatile uint32_t*)0x400B10FC) // Host Controller Version +#define SDHC_MMCBOOT_BOOTBLKCNT(n) \ + MAKE_REG_MASK(0xFF, 16) //(uint32_t)(((n) & 0xFFF)<<16) // stop at block gap + // value of automatic mode +#define SDHC_MMCBOOT_AUTOSABGEN \ + MAKE_REG_MASK(0x1, 7) //((uint32_t)0x00000080) // enable auto stop at + // block gap function +#define SDHC_MMCBOOT_BOOTEN \ + MAKE_REG_MASK(0x1, 6) //((uint32_t)0x00000040) // Boot Mode Enable +#define SDHC_MMCBOOT_BOOTMODE \ + MAKE_REG_MASK(0x1, 5) //((uint32_t)0x00000020) // Boot Mode Select +#define SDHC_MMCBOOT_BOOTACK \ + MAKE_REG_MASK(0x1, 4) //((uint32_t)0x00000010) // Boot Ack Mode Select +#define SDHC_MMCBOOT_DTOCVACK(n) \ + MAKE_REG_MASK( \ + 0xF, \ + 0) //(uint32_t)(((n) & 0xF)<<0) // Boot ACK Time Out Counter Value +// #define SDHC_HOSTVER (*(volatile uint32_t*)0x400B10FC) // Host Controller +// Version #define CCM_ANALOG_PFD_528_PFD0_FRAC_MASK 0x3f -#define CCM_ANALOG_PFD_528_PFD0_FRAC(n) ((n) & CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) -#define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3f<<8) -#define CCM_ANALOG_PFD_528_PFD1_FRAC(n) (((n)<<8) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) -#define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3f<<16) -#define CCM_ANALOG_PFD_528_PFD2_FRAC(n) (((n)<<16) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD0_FRAC(n) ((n)&CCM_ANALOG_PFD_528_PFD0_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD1_FRAC_MASK (0x3f << 8) +#define CCM_ANALOG_PFD_528_PFD1_FRAC(n) \ + (((n) << 8) & CCM_ANALOG_PFD_528_PFD1_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD2_FRAC_MASK (0x3f << 16) +#define CCM_ANALOG_PFD_528_PFD2_FRAC(n) \ + (((n) << 16) & CCM_ANALOG_PFD_528_PFD2_FRAC_MASK) #define CCM_ANALOG_PFD_528_PFD3_FRAC_MASK ((0x3f<<24) -#define CCM_ANALOG_PFD_528_PFD3_FRAC(n) (((n)<<24) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) +#define CCM_ANALOG_PFD_528_PFD3_FRAC(n) \ + (((n) << 24) & CCM_ANALOG_PFD_528_PFD3_FRAC_MASK) -#define SDHC_DSADDR (USDHC1_DS_ADDR ) // DMA System Address register -#define SDHC_BLKATTR (USDHC1_BLK_ATT) // Block Attributes register -#define SDHC_CMDARG (USDHC1_CMD_ARG) // Command Argument register -#define SDHC_XFERTYP (USDHC1_CMD_XFR_TYP) // Transfer Type register -#define SDHC_CMDRSP0 (USDHC1_CMD_RSP0) // Command Response 0 -#define SDHC_CMDRSP1 (USDHC1_CMD_RSP1) // Command Response 1 -#define SDHC_CMDRSP2 (USDHC1_CMD_RSP2) // Command Response 2 -#define SDHC_CMDRSP3 (USDHC1_CMD_RSP3) // Command Response 3 -#define SDHC_DATPORT (USDHC1_DATA_BUFF_ACC_PORT) // Buffer Data Port register -#define SDHC_PRSSTAT (USDHC1_PRES_STATE) // Present State register -#define SDHC_PROCTL (USDHC1_PROT_CTRL) // Protocol Control register -#define SDHC_SYSCTL (USDHC1_SYS_CTRL) // System Control register -#define SDHC_IRQSTAT (USDHC1_INT_STATUS) // Interrupt Status register -#define SDHC_IRQSTATEN (USDHC1_INT_STATUS_EN) // Interrupt Status Enable register -#define SDHC_IRQSIGEN (USDHC1_INT_SIGNAL_EN) // Interrupt Signal Enable register -#define SDHC_AC12ERR (USDHC1_AUTOCMD12_ERR_STATUS) // Auto CMD12 Error Status Register -#define SDHC_HTCAPBLT (USDHC1_HOST_CTRL_CAP) // Host Controller Capabilities -#define SDHC_WML (USDHC1_WTMK_LVL) // Watermark Level Register -#define SDHC_MIX_CTRL (USDHC1_MIX_CTRL) // Mixer Control -#define SDHC_FEVT (USDHC1_FORCE_EVENT) // Force Event register -#define SDHC_ADMAES (USDHC1_ADMA_ERR_STATUS) // ADMA Error Status register -#define SDHC_ADSADDR (USDHC1_ADMA_SYS_ADDR) // ADMA System Addressregister -#define SDHC_VENDOR (USDHC1_VEND_SPEC) // Vendor Specific register -#define SDHC_MMCBOOT (USDHC1_MMC_BOOT) // MMC Boot register -#define SDHC_VENDOR2 (USDHC2_VEND_SPEC2) // Vendor Specific2 register +#define SDHC_DSADDR (USDHC1_DS_ADDR) // DMA System Address register +#define SDHC_BLKATTR (USDHC1_BLK_ATT) // Block Attributes register +#define SDHC_CMDARG (USDHC1_CMD_ARG) // Command Argument register +#define SDHC_XFERTYP (USDHC1_CMD_XFR_TYP) // Transfer Type register +#define SDHC_CMDRSP0 (USDHC1_CMD_RSP0) // Command Response 0 +#define SDHC_CMDRSP1 (USDHC1_CMD_RSP1) // Command Response 1 +#define SDHC_CMDRSP2 (USDHC1_CMD_RSP2) // Command Response 2 +#define SDHC_CMDRSP3 (USDHC1_CMD_RSP3) // Command Response 3 +#define SDHC_DATPORT (USDHC1_DATA_BUFF_ACC_PORT) // Buffer Data Port register +#define SDHC_PRSSTAT (USDHC1_PRES_STATE) // Present State register +#define SDHC_PROCTL (USDHC1_PROT_CTRL) // Protocol Control register +#define SDHC_SYSCTL (USDHC1_SYS_CTRL) // System Control register +#define SDHC_IRQSTAT (USDHC1_INT_STATUS) // Interrupt Status register +#define SDHC_IRQSTATEN \ + (USDHC1_INT_STATUS_EN) // Interrupt Status Enable register +#define SDHC_IRQSIGEN \ + (USDHC1_INT_SIGNAL_EN) // Interrupt Signal Enable register +#define SDHC_AC12ERR \ + (USDHC1_AUTOCMD12_ERR_STATUS) // Auto CMD12 Error Status Register +#define SDHC_HTCAPBLT (USDHC1_HOST_CTRL_CAP) // Host Controller Capabilities +#define SDHC_WML (USDHC1_WTMK_LVL) // Watermark Level Register +#define SDHC_MIX_CTRL (USDHC1_MIX_CTRL) // Mixer Control +#define SDHC_FEVT (USDHC1_FORCE_EVENT) // Force Event register +#define SDHC_ADMAES (USDHC1_ADMA_ERR_STATUS) // ADMA Error Status register +#define SDHC_ADSADDR (USDHC1_ADMA_SYS_ADDR) // ADMA System Addressregister +#define SDHC_VENDOR (USDHC1_VEND_SPEC) // Vendor Specific register +#define SDHC_MMCBOOT (USDHC1_MMC_BOOT) // MMC Boot register +#define SDHC_VENDOR2 (USDHC2_VEND_SPEC2) // Vendor Specific2 register // -#define IRQ_SDHC IRQ_SDHC1 +#define IRQ_SDHC IRQ_SDHC1 #define SDHC_MAX_DVS (0xF + 1U) #define SDHC_MAX_CLKFS (0xFF + 1U) #define SDHC_PREV_DVS(x) ((x) -= 1U) #define SDHC_PREV_CLKFS(x, y) ((x) >>= (y)) -#define CCM_CSCDR1_USDHC1_CLK_PODF_MASK (0x7<<11) -#define CCM_CSCDR1_USDHC1_CLK_PODF(n) (((n)&0x7)<<11) +#define CCM_CSCDR1_USDHC1_CLK_PODF_MASK (0x7 << 11) +#define CCM_CSCDR1_USDHC1_CLK_PODF(n) (((n)&0x7) << 11) -#define IOMUXC_SW_PAD_CTL_PAD_SRE ((0x1<)<0) -#define IOMUXC_SW_PAD_CTL_PAD_PKE ((0x1)<<12) -#define IOMUXC_SW_PAD_CTL_PAD_PUE ((0x1)<<13) -#define IOMUXC_SW_PAD_CTL_PAD_HYS ((0x1)<<16) -#define IOMUXC_SW_PAD_CTL_PAD_SPEED(n) (((n)&0x3)<<6) -#define IOMUXC_SW_PAD_CTL_PAD_PUS(n) (((n)&0x3)<<14) -#define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK ((0x3)<<14) -#define IOMUXC_SW_PAD_CTL_PAD_DSE(n) (((n)&0x7)<<3) -#define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK ((0x7)<<3) +#define IOMUXC_SW_PAD_CTL_PAD_SRE ((0x1 <) < 0) +#define IOMUXC_SW_PAD_CTL_PAD_PKE ((0x1) << 12) +#define IOMUXC_SW_PAD_CTL_PAD_PUE ((0x1) << 13) +#define IOMUXC_SW_PAD_CTL_PAD_HYS ((0x1) << 16) +#define IOMUXC_SW_PAD_CTL_PAD_SPEED(n) (((n)&0x3) << 6) +#define IOMUXC_SW_PAD_CTL_PAD_PUS(n) (((n)&0x3) << 14) +#define IOMUXC_SW_PAD_CTL_PAD_PUS_MASK ((0x3) << 14) +#define IOMUXC_SW_PAD_CTL_PAD_DSE(n) (((n)&0x7) << 3) +#define IOMUXC_SW_PAD_CTL_PAD_DSE_MASK ((0x7) << 3) #endif // defined(__IMXRT1062__) #endif // SdioTeensy_h \ No newline at end of file diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdFat.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdFat.h index 49e543a8..d804a613 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdFat.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdFat.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,32 +24,30 @@ */ #ifndef SdFat_h #define SdFat_h +#define DISABLE_FS_H_WARNING 1 /** * \file * \brief main SdFs include file. */ -#include "common/SysCall.h" -#include "SdCard/SdCard.h" #include "ExFatLib/ExFatLib.h" #include "FatLib/FatLib.h" #include "FsLib/FsLib.h" +#include "SdCard/SdCard.h" +#include "common/SysCall.h" #if INCLUDE_SDIOS #include "sdios.h" #endif // INCLUDE_SDIOS - - -namespace sdfat { - - //------------------------------------------------------------------------------ -/** SdFat version */ -#define SD_FAT_VERSION_STR "2.0.2" +/** SdFat version for cpp use. */ +#define SD_FAT_VERSION 20203 +/** SdFat version as string. */ +#define SD_FAT_VERSION_STR "2.2.3" //============================================================================== /** * \class SdBase * \brief base SD file system template class. */ -template +template class SdBase : public Vol { public: //---------------------------------------------------------------------------- @@ -83,7 +81,7 @@ class SdBase : public Vol { * \return true for success or false for failure. */ bool begin(SdSpiConfig spiConfig) { - return cardBegin(spiConfig) && Vol::begin(m_card); + return cardBegin(spiConfig) && volumeBegin(); } //--------------------------------------------------------------------------- /** Initialize SD card and file system for SDIO mode. @@ -92,11 +90,11 @@ class SdBase : public Vol { * \return true for success or false for failure. */ bool begin(SdioConfig sdioConfig) { - return cardBegin(sdioConfig) && Vol::begin(m_card); + return cardBegin(sdioConfig) && volumeBegin(); } //---------------------------------------------------------------------------- /** \return Pointer to SD card object. */ - SdCard* card() {return m_card;} + SdCard* card() { return m_card; } //---------------------------------------------------------------------------- /** Initialize SD card in SPI mode. * @@ -118,6 +116,14 @@ class SdBase : public Vol { return m_card && !m_card->errorCode(); } //---------------------------------------------------------------------------- + /** End use of card. */ + void end() { + Vol::end(); + if (m_card) { + m_card->end(); + } + } + //---------------------------------------------------------------------------- /** %Print error info and halt. * * \param[in] pr Print destination. @@ -131,7 +137,8 @@ class SdBase : public Vol { } else if (!Vol::fatType()) { pr->println(F("Check SD format.")); } - SysCall::halt(); + while (true) { + } } //---------------------------------------------------------------------------- /** %Print error info and halt. @@ -156,13 +163,52 @@ class SdBase : public Vol { errorHalt(pr); } //---------------------------------------------------------------------------- + /** Format SD card + * + * \param[in] pr Print destination. + * \return true for success else false. + */ + bool format(print_t* pr = nullptr) { + Fmt fmt; + uint8_t* mem = Vol::end(); + if (!mem) { + return false; + } + bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); + if (switchSpi && !setDedicatedSpi(true)) { + return false; + } + bool rtn = fmt.format(card(), mem, pr); + if (switchSpi && !setDedicatedSpi(false)) { + return false; + } + return rtn; + } + //---------------------------------------------------------------------------- + /** \return the free cluster count. */ + uint32_t freeClusterCount() { + bool switchSpi = hasDedicatedSpi() && !isDedicatedSpi(); + if (switchSpi && !setDedicatedSpi(true)) { + return 0; + } + uint32_t rtn = Vol::freeClusterCount(); + if (switchSpi && !setDedicatedSpi(false)) { + return 0; + } + return rtn; + } + //---------------------------------------------------------------------------- + /** \return true if can be in dedicated SPI state */ + bool hasDedicatedSpi() { return m_card ? m_card->hasDedicatedSpi() : false; } + //---------------------------------------------------------------------------- /** %Print error info and halt. * * \param[in] pr Print destination. */ void initErrorHalt(print_t* pr) { initErrorPrint(pr); - SysCall::halt(); + while (true) { + } } //---------------------------------------------------------------------------- /** %Print error info and halt. @@ -180,7 +226,7 @@ class SdBase : public Vol { * \param[in] pr Print destination. * \param[in] msg Message to print. */ - void initErrorHalt(Print* pr, const __FlashStringHelper* msg) { + void initErrorHalt(print_t* pr, const __FlashStringHelper* msg) { pr->println(msg); initErrorHalt(pr); } @@ -189,7 +235,7 @@ class SdBase : public Vol { * * \param[in] pr Print destination. */ - void initErrorPrint(Print* pr) { + void initErrorPrint(print_t* pr) { pr->println(F("begin() failed")); if (sdErrorCode()) { pr->println(F("Do not reformat the SD.")); @@ -200,6 +246,9 @@ class SdBase : public Vol { errorPrint(pr); } //---------------------------------------------------------------------------- + /** \return true if in dedicated SPI state. */ + bool isDedicatedSpi() { return m_card ? m_card->isDedicatedSpi() : false; } + //---------------------------------------------------------------------------- /** %Print volume FAT/exFAT type. * * \param[in] pr Print destination. @@ -244,7 +293,7 @@ class SdBase : public Vol { * \param[in] pr Print destination. * \param[in] msg Message to print. */ - void errorPrint(Print* pr, const __FlashStringHelper* msg) { + void errorPrint(print_t* pr, const __FlashStringHelper* msg) { pr->print(F("error: ")); pr->println(msg); errorPrint(pr); @@ -265,7 +314,7 @@ class SdBase : public Vol { pr->print(sdErrorCode(), HEX); pr->print(F(",0x")); pr->println(sdErrorData(), HEX); - } else if (!Vol::cwv()) { + } else if (!Vol::fatType()) { pr->println(F("Check SD format.")); } } @@ -279,60 +328,67 @@ class SdBase : public Vol { } //---------------------------------------------------------------------------- /** \return SD card error data. */ - uint8_t sdErrorData() {return m_card ? m_card->errorData() : 0;} + uint8_t sdErrorData() { return m_card ? m_card->errorData() : 0; } + //---------------------------------------------------------------------------- + /** Set SPI sharing state + * \param[in] value desired state. + * \return true for success else false; + */ + bool setDedicatedSpi(bool value) { + if (m_card) { + return m_card->setDedicatedSpi(value); + } + return false; + } //---------------------------------------------------------------------------- /** \return pointer to base volume */ - Vol* vol() {return reinterpret_cast(this);} + Vol* vol() { return reinterpret_cast(this); } //---------------------------------------------------------------------------- /** Initialize file system after call to cardBegin. * * \return true for success or false for failure. */ bool volumeBegin() { - return Vol::begin(m_card); + return Vol::begin(m_card) || Vol::begin(m_card, true, 0); } #if ENABLE_ARDUINO_SERIAL /** Print error details after begin() fails. */ - void initErrorPrint() { - initErrorPrint(&Serial); - } + void initErrorPrint() { initErrorPrint(&Serial); } //---------------------------------------------------------------------------- /** %Print msg to Serial and halt. * * \param[in] msg Message to print. */ - void errorHalt(const __FlashStringHelper* msg) { - errorHalt(&Serial, msg); - } + void errorHalt(const __FlashStringHelper* msg) { errorHalt(&Serial, msg); } //---------------------------------------------------------------------------- /** %Print error info to Serial and halt. */ - void errorHalt() {errorHalt(&Serial);} + void errorHalt() { errorHalt(&Serial); } //---------------------------------------------------------------------------- /** %Print error info and halt. * * \param[in] msg Message to print. */ - void errorHalt(const char* msg) {errorHalt(&Serial, msg);} + void errorHalt(const char* msg) { errorHalt(&Serial, msg); } //---------------------------------------------------------------------------- /** %Print error info and halt. */ - void initErrorHalt() {initErrorHalt(&Serial);} + void initErrorHalt() { initErrorHalt(&Serial); } //---------------------------------------------------------------------------- /** %Print msg, any SD error code. * * \param[in] msg Message to print. */ - void errorPrint(const char* msg) {errorPrint(&Serial, msg);} - /** %Print msg, any SD error code. + void errorPrint(const char* msg) { errorPrint(&Serial, msg); } + /** %Print msg, any SD error code. * * \param[in] msg Message to print. */ - void errorPrint(const __FlashStringHelper* msg) {errorPrint(&Serial, msg);} + void errorPrint(const __FlashStringHelper* msg) { errorPrint(&Serial, msg); } //---------------------------------------------------------------------------- /** %Print error info and halt. * * \param[in] msg Message to print. */ - void initErrorHalt(const char* msg) {initErrorHalt(&Serial, msg);} + void initErrorHalt(const char* msg) { initErrorHalt(&Serial, msg); } //---------------------------------------------------------------------------- /** %Print error info and halt. * @@ -344,7 +400,7 @@ class SdBase : public Vol { #endif // ENABLE_ARDUINO_SERIAL //---------------------------------------------------------------------------- private: - SdCard* m_card; + SdCard* m_card = nullptr; SdCardFactory m_cardFactory; }; //------------------------------------------------------------------------------ @@ -352,75 +408,60 @@ class SdBase : public Vol { * \class SdFat32 * \brief SD file system class for FAT volumes. */ -class SdFat32 : public SdBase { +class SdFat32 : public SdBase { public: - /** Format a SD card FAT32/FAT16. - * - * \param[in] pr Optional Print information. - * \return true for success or false for failure. - */ - bool format(print_t* pr = nullptr) { - FatFormatter fmt; - uint8_t* cache = reinterpret_cast(cacheClear()); - if (!cache) { - return false; - } - return fmt.format(card(), cache, pr); - } }; //------------------------------------------------------------------------------ /** * \class SdExFat * \brief SD file system class for exFAT volumes. */ -class SdExFat : public SdBase { +class SdExFat : public SdBase { public: - /** Format a SD card exFAT. - * - * \param[in] pr Optional Print information. - * \return true for success or false for failure. - */ - bool format(print_t* pr = nullptr) { - ExFatFormatter fmt; - uint8_t* cache = reinterpret_cast(cacheClear()); - if (!cache) { - return false; - } - return fmt.format(card(), cache, pr); - } }; //------------------------------------------------------------------------------ /** * \class SdFs * \brief SD file system class for FAT16, FAT32, and exFAT volumes. */ -class SdFs : public SdBase { +class SdFs : public SdBase { + public: }; //------------------------------------------------------------------------------ -#if SDFAT_FILE_TYPE == 1 +#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) /** Select type for SdFat. */ typedef SdFat32 SdFat; -/** Select type for File. */ -#if USE_TYPE_FILE -typedef File32 File; -#endif /** Select type for SdBaseFile. */ typedef FatFile SdBaseFile; #elif SDFAT_FILE_TYPE == 2 typedef SdExFat SdFat; -#if USE_TYPE_FILE -typedef ExFile File; -#endif typedef ExFatFile SdBaseFile; #elif SDFAT_FILE_TYPE == 3 typedef SdFs SdFat; -#if USE_TYPE_FILE -typedef FsFile File; -#endif typedef FsBaseFile SdBaseFile; #else // SDFAT_FILE_TYPE #error Invalid SDFAT_FILE_TYPE #endif // SDFAT_FILE_TYPE +// +// Only define File if FS.h is not included. +// Line with test for __has_include must not have operators or parentheses. +#if defined __has_include +#if __has_include() +#define HAS_INCLUDE_FS_H +#endif // __has_include() +#endif // defined __has_include +#ifndef HAS_INCLUDE_FS_H +#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) +/** Select type for File. */ +typedef File32 File; +#elif SDFAT_FILE_TYPE == 2 +typedef ExFile File; +#elif SDFAT_FILE_TYPE == 3 +typedef FsFile File; +#endif // SDFAT_FILE_TYPE +#elif !defined(DISABLE_FS_H_WARNING) +#warning File not defined because __has_include(FS.h) +#endif // HAS_INCLUDE_FS_H /** * \class SdFile * \brief FAT16/FAT32 file with Print. @@ -432,9 +473,7 @@ class SdFile : public PrintFile { * \param[in] path path for file. * \param[in] oflag open flags. */ - SdFile(const char* path, oflag_t oflag) { - open(path, oflag); - } + SdFile(const char* path, oflag_t oflag) { open(path, oflag); } /** Set the date/time callback function * * \param[in] dateTime The user's call back function. The callback @@ -461,18 +500,11 @@ class SdFile : public PrintFile { * sync() maintains the last access date and last modify date/time. * */ - static void dateTimeCallback( - void (*dateTime)(uint16_t* date, uint16_t* time)) { + static void dateTimeCallback(void (*dateTime)(uint16_t* date, + uint16_t* time)) { FsDateTime::setCallback(dateTime); } /** Cancel the date/time callback function. */ - static void dateTimeCallbackCancel() { - FsDateTime::clearCallback(); - } + static void dateTimeCallbackCancel() { FsDateTime::clearCallback(); } }; - - -}; // namespace sdfat - - #endif // SdFat_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SdFatConfig.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SdFatConfig.h index 83f3b2cf..4e6e547f 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SdFatConfig.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SdFatConfig.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2024 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -32,6 +32,62 @@ #ifdef __AVR__ #include #endif // __AVR__ +// +// To try UTF-8 encoded filenames. +// #define USE_UTF8_LONG_NAMES 1 +// +// For minimum flash size use these settings: +// #define USE_FAT_FILE_FLAG_CONTIGUOUS 0 +// #define ENABLE_DEDICATED_SPI 0 +// #define USE_LONG_FILE_NAMES 0 +// #define SDFAT_FILE_TYPE 1 +// #define CHECK_FLASH_PROGRAMMING 0 // May cause SD to sleep at high current. +// +// Options can be set in a makefile or an IDE like platformIO +// if they are in a #ifndef/#endif block below. +//------------------------------------------------------------------------------ +/* + * Options for file class constructors, assignment operators and destructors. + * + * By default file copy constructors and copy assignment operators are + * private to prevent multiple copies of a instance for a file. + * + * File move constructors and move assignment operators are public to permit + * return of a file instance for compilers that aren't able to use copy elision. + * + */ +/** File copy constructors and copy assignment operators are deleted */ +#define FILE_COPY_CONSTRUCTOR_DELETED 0 +/** File copy constructors and copy assignment operators are private */ +#define FILE_COPY_CONSTRUCTOR_PRIVATE 1 +/** File copy constructors and copy assignment operators are public */ +#define FILE_COPY_CONSTRUCTOR_PUBLIC 2 + +#ifndef FILE_COPY_CONSTRUCTOR_SELECT +/** Specify kind of file copy constructors and copy assignment operators */ +#define FILE_COPY_CONSTRUCTOR_SELECT FILE_COPY_CONSTRUCTOR_PUBLIC +#endif // FILE_COPY_CONSTRUCTOR_SELECT +/** File move constructors and move assignment operators are deleted. */ +#define FILE_MOVE_CONSTRUCTOR_DELETED 0 +/** File move constructors and move assignment operators are public. */ +#define FILE_MOVE_CONSTRUCTOR_PUBLIC 1 + +#ifndef FILE_MOVE_CONSTRUCTOR_SELECT +/** Specify kind of file move constructors and move assignment operators */ +#define FILE_MOVE_CONSTRUCTOR_SELECT FILE_MOVE_CONSTRUCTOR_PUBLIC +#endif // FILE_MOVE_CONSTRUCTOR_SELECT + +#if FILE_MOVE_CONSTRUCTOR_SELECT != FILE_MOVE_CONSTRUCTOR_PUBLIC && \ + FILE_COPY_CONSTRUCTOR_SELECT != FILE_COPY_CONSTRUCTOR_PUBLIC +#error "No public move or copy assign operators" +#endif // FILE_MOVE_CONSTRUCTOR_SELECT && FILE_MOVE_CONSTRUCTOR_SELECT +/** + * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. */ +#ifndef DESTRUCTOR_CLOSES_FILE +#define DESTRUCTOR_CLOSES_FILE 0 +#endif // DESTRUCTOR_CLOSES_FILE +//------------------------------------------------------------------------------ + /** For Debug - must be one */ #define ENABLE_ARDUINO_FEATURES 1 /** For Debug - must be one */ @@ -39,9 +95,6 @@ /** For Debug - must be one */ #define ENABLE_ARDUINO_STRING 1 //------------------------------------------------------------------------------ -/** Set USE_BLOCK_DEVICE_INTERFACE nonzero to use generic block device */ -#define USE_BLOCK_DEVICE_INTERFACE 0 -//------------------------------------------------------------------------------ #if ENABLE_ARDUINO_FEATURES #include "Arduino.h" #ifdef PLATFORM_ID @@ -49,23 +102,6 @@ #include "application.h" #endif // PLATFORM_ID #endif // ENABLE_ARDUINO_FEATURES - -#define USE_TYPE_FILE 1 -namespace sdfat { - - -//------------------------------------------------------------------------------ -/** - * Set INCLUDE_SDIOS nonzero to include sdios.h in SdFat.h. - * sdios.h provides C++ style IO Streams. - */ -#define INCLUDE_SDIOS 0 -//------------------------------------------------------------------------------ -/** - * Set USE_FAT_FILE_FLAG_CONTIGUOUS nonzero to optimize access to - * contiguous files. - */ -#define USE_FAT_FILE_FLAG_CONTIGUOUS 1 //------------------------------------------------------------------------------ /** * File types for SdFat, File, SdFile, SdBaseFile, fstream, @@ -75,25 +111,33 @@ namespace sdfat { * * 1 for FAT16/FAT32, 2 for exFAT, 3 for FAT16/FAT32 and exFAT. */ +#ifndef SDFAT_FILE_TYPE #if defined(__AVR__) && FLASHEND < 0X8000 // 32K AVR boards. #define SDFAT_FILE_TYPE 1 -#elif defined(__arm__) -// ARM boards usually have plenty of memory -#define SDFAT_FILE_TYPE 3 #else // defined(__AVR__) && FLASHEND < 0X8000 // All other boards. -#define SDFAT_FILE_TYPE 1 +#define SDFAT_FILE_TYPE 3 #endif // defined(__AVR__) && FLASHEND < 0X8000 +#endif // SDFAT_FILE_TYPE //------------------------------------------------------------------------------ /** - * Set ENABLE_DEDICATED_SPI to enable dedicated use of the SPI bus. + * Set USE_FAT_FILE_FLAG_CONTIGUOUS nonzero to optimize access to + * contiguous files. A small amount of flash is flash is used. + */ +#ifndef USE_FAT_FILE_FLAG_CONTIGUOUS +#define USE_FAT_FILE_FLAG_CONTIGUOUS 1 +#endif // USE_FAT_FILE_FLAG_CONTIGUOUS +//------------------------------------------------------------------------------ +/** + * Set ENABLE_DEDICATED_SPI non-zero to enable dedicated use of the SPI bus. * Selecting dedicated SPI in SdSpiConfig() will produce better * performance by using very large multi-block transfers to and * from the SD card. * - * Enabling dedicated SPI will cost some extra flash and RAM. + * Enabling dedicated SPI will cost extra flash and RAM. */ +#ifndef ENABLE_DEDICATED_SPI #if defined(__AVR__) && FLASHEND < 0X8000 // 32K AVR boards. #define ENABLE_DEDICATED_SPI 1 @@ -101,7 +145,9 @@ namespace sdfat { // All other boards. #define ENABLE_DEDICATED_SPI 1 #endif // defined(__AVR__) && FLASHEND < 0X8000 -//----------------------------------------------------------------------------- +#endif // ENABLE_DEDICATED_SPI +//------------------------------------------------------------------------------ +// Driver options /** * If the symbol SPI_DRIVER_SELECT is: * @@ -114,7 +160,63 @@ namespace sdfat { * * 3 - An external SPI driver derived from SdSpiBaseClass is always used. */ +#ifndef SPI_DRIVER_SELECT #define SPI_DRIVER_SELECT 0 +#endif // SPI_DRIVER_SELECT +/** + * If USE_SPI_ARRAY_TRANSFER is one and the standard SPI library is + * use, the array transfer function, transfer(buf, count), will be used. + * This option will allocate a 512 byte temporary buffer for send. + * This may be faster for some boards. Do not use this with AVR boards. + * + * Warning: the next options are often fastest but only available for some + * non-Arduino board packages. + * + * If USE_SPI_ARRAY_TRANSFER is two use transfer(nullptr, buf, count) for + * receive and transfer(buf, nullptr, count) for send. + * + * If USE_SPI_ARRAY_TRANSFER is three use transfer(nullptr, buf, count) for + * receive and transfer(buf, rxTmp, count) for send. Try this with Adafruit + * SAMD51. + * + * If USE_SPI_ARRAY_TRANSFER is four use transfer(txTmp, buf, count) for + * receive and transfer(buf, rxTmp, count) for send. Try this with STM32. + */ +#ifndef USE_SPI_ARRAY_TRANSFER +#define USE_SPI_ARRAY_TRANSFER 0 +#endif // USE_SPI_ARRAY_TRANSFER +//------------------------------------------------------------------------------ +/** + * SD maximum initialization clock rate. + */ +#ifndef SD_MAX_INIT_RATE_KHZ +#define SD_MAX_INIT_RATE_KHZ 400 +#endif // SD_MAX_INIT_RATE_KHZ +/** + * Set USE_BLOCK_DEVICE_INTERFACE nonzero to use a generic block device. + * This allow use of an external FsBlockDevice driver that is derived from + * the FsBlockDeviceInterface like this: + * + * class UsbMscDriver : public FsBlockDeviceInterface { + * ... code for USB mass storage class driver. + * }; + * + * UsbMscDriver usbMsc; + * FsVolume key; + * ... + * + * // Init USB MSC driver. + * if (!usbMsc.begin()) { + * ... handle driver init failure. + * } + * // Init FAT/exFAT volume. + * if (!key.begin(&usbMsc)) { + * ... handle FAT/exFAT failure. + * } + */ +#ifndef USE_BLOCK_DEVICE_INTERFACE +#define USE_BLOCK_DEVICE_INTERFACE 0 +#endif // USE_BLOCK_DEVICE_INTERFACE //------------------------------------------------------------------------------ /** * SD_CHIP_SELECT_MODE defines how the functions @@ -129,15 +231,12 @@ namespace sdfat { * * 2 - No internal definition and must be defined in the application. */ +#ifndef SD_CHIP_SELECT_MODE #define SD_CHIP_SELECT_MODE 0 +#endif // SD_CHIP_SELECT_MODE /** Type for card chip select pin. */ typedef uint8_t SdCsPin_t; //------------------------------------------------------------------------------ -/** - * SD maximum initialization clock rate. - */ -#define SD_MAX_INIT_RATE_KHZ 400 -//------------------------------------------------------------------------------ /** * Set USE_LONG_FILE_NAMES nonzero to use long file names (LFN) in FAT16/FAT32. * exFAT always uses long file names. @@ -158,7 +257,37 @@ typedef uint8_t SdCsPin_t; * * (asterisk) * */ +#ifndef USE_LONG_FILE_NAMES #define USE_LONG_FILE_NAMES 1 +#endif // USE_LONG_FILE_NAMES +/** + * Set USE_UTF8_LONG_NAMES nonzero to use UTF-8 file names. Use of UTF-8 names + * will require significantly more flash memory and a small amount of extra + * RAM. + * + * UTF-8 filenames allow encoding of 1,112,064 code points in Unicode using + * one to four one-byte (8-bit) code units. + * + * As of Version 13.0, the Unicode Standard defines 143,859 characters. + * + * getName() will return UTF-8 strings and printName() will write UTF-8 strings. + */ +#ifndef USE_UTF8_LONG_NAMES +#define USE_UTF8_LONG_NAMES 0 +#endif // USE_UTF8_LONG_NAMES + +#if USE_UTF8_LONG_NAMES && !USE_LONG_FILE_NAMES +#error "USE_UTF8_LONG_NAMES requires USE_LONG_FILE_NAMES to be non-zero." +#endif // USE_UTF8_LONG_NAMES && !USE_LONG_FILE_NAMES +//------------------------------------------------------------------------------ +/** + * Set MAINTAIN_FREE_CLUSTER_COUNT nonzero to keep the count of free clusters + * updated. This will increase the speed of the freeClusterCount() call + * after the first call. Extra flash will be required. + */ +#ifndef MAINTAIN_FREE_CLUSTER_COUNT +#define MAINTAIN_FREE_CLUSTER_COUNT 0 +#endif // MAINTAIN_FREE_CLUSTER_COUNT //------------------------------------------------------------------------------ /** * Set the default file time stamp when a RTC callback is not used. @@ -186,14 +315,9 @@ typedef uint8_t SdCsPin_t; * Some cards will not sleep in low power mode unless CHECK_FLASH_PROGRAMMING * is non-zero. */ +#ifndef CHECK_FLASH_PROGRAMMING #define CHECK_FLASH_PROGRAMMING 1 -//------------------------------------------------------------------------------ -/** - * Set MAINTAIN_FREE_CLUSTER_COUNT nonzero to keep the count of free clusters - * updated. This will increase the speed of the freeClusterCount() call - * after the first call. Extra flash will be required. - */ -#define MAINTAIN_FREE_CLUSTER_COUNT 0 +#endif // CHECK_FLASH_PROGRAMMING //------------------------------------------------------------------------------ /** * To enable SD card CRC checking for SPI, set USE_SD_CRC nonzero. @@ -204,12 +328,15 @@ typedef uint8_t SdCsPin_t; * Set USE_SD_CRC to 2 to used a larger table driven CRC-CCITT function. This * function is faster for AVR but may be slower for ARM and other processors. */ +#ifndef USE_SD_CRC #define USE_SD_CRC 0 +#endif // USE_SD_CRC //------------------------------------------------------------------------------ /** If the symbol USE_FCNTL_H is nonzero, open flags for access modes O_RDONLY, * O_WRONLY, O_RDWR and the open modifiers O_APPEND, O_CREAT, O_EXCL, O_SYNC * will be defined by including the system file fcntl.h. */ +#ifndef USE_FCNTL_H #if defined(__AVR__) // AVR fcntl.h does not define open flags. #define USE_FCNTL_H 0 @@ -224,32 +351,23 @@ typedef uint8_t SdCsPin_t; #else // defined(__AVR__) #define USE_FCNTL_H 0 #endif // defined(__AVR__) +#endif // USE_FCNTL_H //------------------------------------------------------------------------------ /** - * Handle Watchdog Timer for WiFi modules. - * - * Yield will be called before accessing the SPI bus if it has been more - * than WDT_YIELD_TIME_MILLIS milliseconds since the last yield call by SdFat. + * Set INCLUDE_SDIOS nonzero to include sdios.h in SdFat.h. + * sdios.h provides C++ style IO Streams. */ -#if defined(PLATFORM_ID) || defined(ESP8266) -// If Particle device or ESP8266 call yield. -#define WDT_YIELD_TIME_MILLIS 100 -#else // defined(PLATFORM_ID) || defined(ESP8266) -#define WDT_YIELD_TIME_MILLIS 0 -#endif // defined(PLATFORM_ID) || defined(ESP8266) +#ifndef INCLUDE_SDIOS +#define INCLUDE_SDIOS 0 +#endif // INCLUDE_SDIOS //------------------------------------------------------------------------------ /** * Set FAT12_SUPPORT nonzero to enable use if FAT12 volumes. * FAT12 has not been well tested and requires additional flash. */ +#ifndef FAT12_SUPPORT #define FAT12_SUPPORT 0 -//------------------------------------------------------------------------------ -/** - * Set DESTRUCTOR_CLOSES_FILE nonzero to close a file in its destructor. - * - * Causes use of lots of heap in ARM. - */ -#define DESTRUCTOR_CLOSES_FILE 0 +#endif // FAT12_SUPPORT //------------------------------------------------------------------------------ /** * Call flush for endl if ENDL_CALLS_FLUSH is nonzero @@ -268,14 +386,16 @@ typedef uint8_t SdCsPin_t; * If ENDL_CALLS_FLUSH is zero, you must call flush and/or close to force * all data to be written to the SD. */ +#ifndef ENDL_CALLS_FLUSH #define ENDL_CALLS_FLUSH 0 +#endif // ENDL_CALLS_FLUSH //------------------------------------------------------------------------------ /** * Set USE_SIMPLE_LITTLE_ENDIAN nonzero for little endian processors * with no memory alignment restrictions. */ -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && !defined(__SAMD21G18A__)\ - && !defined(__MKL26Z64__) && !defined(ESP8266) +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ && \ + (defined(__AVR__) || defined(__ARM_FEATURE_UNALIGNED)) #define USE_SIMPLE_LITTLE_ENDIAN 1 #else // __BYTE_ORDER_ #define USE_SIMPLE_LITTLE_ENDIAN 0 @@ -322,11 +442,11 @@ typedef uint8_t SdCsPin_t; #endif // BUILTIN_SDCARD // SPI for built-in card. #ifndef SDCARD_SPI -#define SDCARD_SPI SPI1 +#define SDCARD_SPI SPI1 #define SDCARD_MISO_PIN 59 #define SDCARD_MOSI_PIN 61 -#define SDCARD_SCK_PIN 60 -#define SDCARD_SS_PIN 62 +#define SDCARD_SCK_PIN 60 +#define SDCARD_SS_PIN 62 #endif // SDCARD_SPI #define HAS_SDIO_CLASS 1 #endif // defined(__MK64FX512__) || defined(__MK66FX1M0__) @@ -337,13 +457,13 @@ typedef uint8_t SdCsPin_t; /** * Determine the default SPI configuration. */ -#if defined(ARDUINO_ARCH_APOLLO3)\ - || defined(__AVR__)\ - || defined(ESP8266) || defined(ESP32)\ - || defined(PLATFORM_ID)\ - || defined(ARDUINO_SAM_DUE)\ - || defined(__STM32F1__) || defined(__STM32F4__)\ - || (defined(CORE_TEENSY) && defined(__arm__)) +#if defined(ARDUINO_ARCH_APOLLO3) || \ + (defined(__AVR__) && defined(SPDR) && defined(SPSR) && defined(SPIF)) || \ + (defined(__AVR__) && defined(SPI0) && defined(SPI_RXCIF_bm)) || \ + defined(ESP8266) || defined(ESP32) || defined(PLATFORM_ID) || \ + defined(ARDUINO_SAM_DUE) || defined(STM32_CORE_VERSION) || \ + defined(__STM32F1__) || defined(__STM32F4__) || \ + (defined(CORE_TEENSY) && defined(__arm__)) #define SD_HAS_CUSTOM_SPI 1 #else // SD_HAS_CUSTOM_SPI // Use standard SPI library. @@ -355,16 +475,4 @@ typedef uint8_t SdCsPin_t; #define HAS_SDIO_CLASS 0 #endif // HAS_SDIO_CLASS - -#ifdef HOST_MOCK -#undef INCLUDE_SDIOS -#define INCLUDE_SDIOS 0 -#undef SS -#define SS 0 -#endif - - -}; // namespace sdfat - - #endif // SdFatConfig_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArduinoDriver.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArduinoDriver.h index 9fa3c31e..a571f9fb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArduinoDriver.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArduinoDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -32,17 +32,14 @@ #if SPI_DRIVER_SELECT == 0 && SD_HAS_CUSTOM_SPI #define SD_USE_CUSTOM_SPI #endif // SPI_DRIVER_SELECT == 0 && SD_HAS_CUSTOM_SPI - - -namespace sdfat { - - /** * \class SdSpiArduinoDriver * \brief Optimized SPI class for access to SD and SDHC flash memory cards. */ class SdSpiArduinoDriver { public: + /** Constructor. */ + SdSpiArduinoDriver() = default; /** Activate SPI hardware. */ void activate(); /** Initialize the SPI bus. @@ -60,12 +57,12 @@ class SdSpiArduinoDriver { */ uint8_t receive(); /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ uint8_t receive(uint8_t* buf, size_t count); /** Send a byte. * @@ -87,16 +84,11 @@ class SdSpiArduinoDriver { } private: - SPIClass *m_spi; + SPIClass* m_spi = nullptr; SPISettings m_spiSettings; }; /** Typedef for use of SdSpiArduinoDriver */ typedef SdSpiArduinoDriver SdSpiDriver; - - -}; // namespace sdfat - - //------------------------------------------------------------------------------ #ifndef SD_USE_CUSTOM_SPI #include "SdSpiLibDriver.h" diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArtemis.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArtemis.cpp index 9a2683ef..8f6efdd1 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArtemis.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiArtemis.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,16 +23,9 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" - - -namespace sdfat { - - #if defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_ARCH_APOLLO3) //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -43,40 +36,34 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { - m_spi->transferIn(buf, count); + memset(buf, 0XFF, count); + m_spi->transfer(buf, count); return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { // If not a multiple of four. Command with CRC used six byte send. - while (count%4) { + while (count % 4) { send(*buf++); count--; } // Convert byte array to 4 byte array. - uint32_t myArray[count/4]; // NOLINT - for (int x = 0; x < count/4; x++) { + uint32_t myArray[count / 4]; // NOLINT + for (int x = 0; x < count / 4; x++) { myArray[x] = ((uint32_t)buf[(x * 4) + 3] << (8 * 3)) | ((uint32_t)buf[(x * 4) + 2] << (8 * 2)) | ((uint32_t)buf[(x * 4) + 1] << (8 * 1)) | ((uint32_t)buf[(x * 4) + 0] << (8 * 0)); } - m_spi->transfer(reinterpret_cast(myArray), count); + m_spi->transfer(reinterpret_cast(myArray), count); } #endif // defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_ARCH_APOLLO3) - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiAvr.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiAvr.h index c0633775..731bf8f7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiAvr.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiAvr.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,73 +24,101 @@ */ #ifndef SdSpiAvr_h #define SdSpiAvr_h - - -namespace sdfat { - - // Use of in-line for AVR to save flash. -#define nop asm volatile ("nop\n\t") +#define nop asm volatile("nop\n\t") +//------------------------------------------------------------------------------ +inline void SdSpiArduinoDriver::activate() { + SPI.beginTransaction(m_spiSettings); +} //------------------------------------------------------------------------------ inline void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { (void)spiConfig; SPI.begin(); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::activate() { - SPI.beginTransaction(m_spiSettings); -} +inline void SdSpiArduinoDriver::deactivate() { SPI.endTransaction(); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::deactivate() { - SPI.endTransaction(); -} +inline void SdSpiArduinoDriver::end() { SPI.end(); } //------------------------------------------------------------------------------ -inline uint8_t SdSpiArduinoDriver::receive() { - return SPI.transfer(0XFF); -} +inline uint8_t SdSpiArduinoDriver::receive() { return SPI.transfer(0XFF); } //------------------------------------------------------------------------------ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { if (count == 0) { return 0; } - uint8_t* pr = buf; +#ifdef SPSR SPDR = 0XFF; - while (--count > 0) { - while (!(SPSR & _BV(SPIF))) {} + while (--count) { + // nops optimize loop for 16MHz CPU 8 MHz SPI + nop; + nop; + while (!(SPSR & _BV(SPIF))) { + } uint8_t in = SPDR; SPDR = 0XFF; - *pr++ = in; - // nops to optimize loop for 16MHz CPU 8 MHz SPI - nop; - nop; + *buf++ = in; } - while (!(SPSR & _BV(SPIF))) {} - *pr = SPDR; + while (!(SPSR & _BV(SPIF))) { + } + *buf = SPDR; +#elif defined(SPI_RXCIF_bm) + SPI0.DATA = 0XFF; + while (--count) { + // nops optimize loop for ATmega4809 16MHz CPU 8 MHz SPI + nop; + nop; + nop; + nop; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } + uint8_t in = SPI0.DATA; + SPI0.DATA = 0XFF; + *buf++ = in; + } + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } + *buf = SPI0.DATA; +#else // SPSR +#error Unsupported AVR CPU - edit SdFatConfig.h to use standard SPI library. +#endif // SPSR return 0; } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(uint8_t data) { - SPI.transfer(data); -} +inline void SdSpiArduinoDriver::send(uint8_t data) { SPI.transfer(data); } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +inline void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { if (count == 0) { return; } +#ifdef SPSR SPDR = *buf++; - while (--count > 0) { + while (--count) { uint8_t b = *buf++; - while (!(SPSR & (1 << SPIF))) {} + // nops optimize loop for 16MHz CPU 8 MHz SPI + nop; + nop; + while (!(SPSR & (1 << SPIF))) { + } SPDR = b; - // nops to optimize loop for 16MHz CPU 8 MHz SPI - nop; - nop; } - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } +#elif defined(SPI_RXCIF_bm) + SPI0.DATA = *buf++; + while (--count) { + uint8_t b = *buf++; + // nops optimize loop for ATmega4809 16MHz CPU 8 MHz SPI + nop; + nop; + nop; + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } + SPI0.DATA = b; + } + while (!(SPI0.INTFLAGS & SPI_RXCIF_bm)) { + } +#else // SPSR +#error Unsupported AVR CPU - edit SdFatConfig.h to use standard SPI library. +#endif // SPSR } - - -}; // namespace sdfat - - #endif // SdSpiAvr_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBareUnoDriver.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBareUnoDriver.h index 99ba6bed..5c3eda34 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBareUnoDriver.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBareUnoDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,8 +30,9 @@ */ #include + #include "../common/SysCall.h" -#define nop asm volatile ("nop\n\t") +#define nop asm volatile("nop\n\t") #ifndef HIGH #define HIGH 1 #endif // HIGH @@ -79,10 +80,10 @@ inline void unoPinMode(uint8_t pin, uint8_t mode) { sei(); } -#define UNO_SS 10 +#define UNO_SS 10 #define UNO_MOSI 11 #define UNO_MISO 12 -#define UNO_SCK 13 +#define UNO_SCK 13 //------------------------------------------------------------------------------ /** * \class SdSpiDriverBareUno @@ -92,10 +93,6 @@ class SdSpiDriverBareUno { public: /** Activate SPI hardware. */ void activate() {} - /** deactivate SPI driver. */ - void end() {} - /** Deactivate SPI hardware. */ - void deactivate() {} /** Initialize the SPI bus. * * \param[in] spiConfig SD card configuration. @@ -112,20 +109,22 @@ class SdSpiDriverBareUno { unoPinMode(UNO_SCK, OUTPUT); unoPinMode(UNO_MOSI, OUTPUT); } + /** Deactivate SPI hardware. */ + void deactivate() {} + /** deactivate SPI driver. */ + void end() {} /** Receive a byte. * * \return The byte. */ - uint8_t receive() { - return transfer(0XFF); - } + uint8_t receive() { return transfer(0XFF); } /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ uint8_t receive(uint8_t* buf, size_t count) { if (count == 0) { return 0; @@ -133,7 +132,8 @@ class SdSpiDriverBareUno { uint8_t* pr = buf; SPDR = 0XFF; while (--count > 0) { - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } uint8_t in = SPDR; SPDR = 0XFF; *pr++ = in; @@ -141,7 +141,8 @@ class SdSpiDriverBareUno { nop; nop; } - while (!(SPSR & _BV(SPIF))) {} + while (!(SPSR & _BV(SPIF))) { + } *pr = SPDR; return 0; } @@ -149,9 +150,7 @@ class SdSpiDriverBareUno { * * \param[in] data Byte to send */ - void send(uint8_t data) { - transfer(data); - } + void send(uint8_t data) { transfer(data); } /** Send multiple bytes. * * \param[in] buf Buffer for data to be sent. @@ -164,18 +163,18 @@ class SdSpiDriverBareUno { SPDR = *buf++; while (--count > 0) { uint8_t b = *buf++; - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } SPDR = b; // nops to optimize loop for 16MHz CPU 8 MHz SPI nop; nop; } - while (!(SPSR & (1 << SPIF))) {} + while (!(SPSR & (1 << SPIF))) { + } } /** Set CS low. */ - void select() { - unoDigitalWrite(m_csPin, LOW); - } + void select() { unoDigitalWrite(m_csPin, LOW); } /** Save high speed SPISettings after SD initialization. * * \param[in] spiConfig SPI options. @@ -186,13 +185,12 @@ class SdSpiDriverBareUno { } static uint8_t transfer(uint8_t data) { SPDR = data; - while (!(SPSR & _BV(SPIF))) {} // wait + while (!(SPSR & _BV(SPIF))) { + } // wait return SPDR; } /** Set CS high. */ - void unselect() { - unoDigitalWrite(m_csPin, HIGH); - } + void unselect() { unoDigitalWrite(m_csPin, HIGH); } private: SdCsPin_t m_csPin; diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBaseClass.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBaseClass.h index 346cdb6d..505e2f60 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBaseClass.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiBaseClass.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,11 +28,6 @@ */ #ifndef SdSpiBaseClass_h #define SdSpiBaseClass_h - - -namespace sdfat { - - /** * \class SdSpiBaseClass * \brief Base class for external SPI drivers @@ -48,18 +43,20 @@ class SdSpiBaseClass { virtual void begin(SdSpiConfig config) = 0; /** Deactivate SPI hardware. */ virtual void deactivate() {} + /** deactivate SPI driver. */ + virtual void end() {} /** Receive a byte. * * \return The byte. */ virtual uint8_t receive() = 0; /** Receive multiple bytes. - * - * \param[out] buf Buffer to receive the data. - * \param[in] count Number of bytes to receive. - * - * \return Zero for no error or nonzero error code. - */ + * + * \param[out] buf Buffer to receive the data. + * \param[in] count Number of bytes to receive. + * + * \return Zero for no error or nonzero error code. + */ virtual uint8_t receive(uint8_t* buf, size_t count) = 0; /** Send a byte. * @@ -76,11 +73,6 @@ class SdSpiBaseClass { * * \param[in] maxSck Maximum SCK frequency. */ - virtual void setSckSpeed(uint32_t maxSck) {(void)maxSck;} + virtual void setSckSpeed(uint32_t maxSck) { (void)maxSck; } }; - - -}; // namespace sdfat - - #endif // SdSpiBaseClass_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiChipSelect.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiChipSelect.cpp index 9cd10a4d..f7927f2c 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiChipSelect.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiChipSelect.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,34 +23,18 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" - - -namespace sdfat { - - #if ENABLE_ARDUINO_FEATURES #if SD_CHIP_SELECT_MODE == 0 //------------------------------------------------------------------------------ -void sdCsInit(SdCsPin_t pin) { - pinMode(pin, OUTPUT); -} +void sdCsInit(SdCsPin_t pin) { pinMode(pin, OUTPUT); } //------------------------------------------------------------------------------ -void sdCsWrite(SdCsPin_t pin, bool level) { - digitalWrite(pin, level); -} +void sdCsWrite(SdCsPin_t pin, bool level) { digitalWrite(pin, level); } #elif SD_CHIP_SELECT_MODE == 1 //------------------------------------------------------------------------------ -__attribute__((weak)) -void sdCsInit(SdCsPin_t pin) { - pinMode(pin, OUTPUT); -} +__attribute__((weak)) void sdCsInit(SdCsPin_t pin) { pinMode(pin, OUTPUT); } //------------------------------------------------------------------------------ -__attribute__((weak)) -void sdCsWrite(SdCsPin_t pin, bool level) { +__attribute__((weak)) void sdCsWrite(SdCsPin_t pin, bool level) { digitalWrite(pin, level); } #endif // SD_CHIP_SELECT_MODE == 0 #endif // ENABLE_ARDUINO_FEATURES - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDriver.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDriver.h index 6fbe6406..c43055b7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDriver.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,6 @@ #ifndef SdSpiDriver_h #define SdSpiDriver_h #include "../common/SysCall.h" - - -namespace sdfat { - - /** * Initialize SD chip select pin. * @@ -47,16 +42,34 @@ void sdCsInit(SdCsPin_t pin); * \param[in] level SD card chip select level. */ void sdCsWrite(SdCsPin_t pin, bool level); - - -}; // namespace sdfat - - +//------------------------------------------------------------------------------ +/** SPI bus is share with other devices. */ +const uint8_t SHARED_SPI = 0; +#if ENABLE_DEDICATED_SPI +/** The SD is the only device on the SPI bus. */ +const uint8_t DEDICATED_SPI = 1; +/** + * \param[in] opt option field of SdSpiConfig. + * \return true for dedicated SPI. + */ +inline bool spiOptionDedicated(uint8_t opt) { return opt & DEDICATED_SPI; } +#else // ENABLE_DEDICATED_SPI +/** + * \param[in] opt option field of SdSpiConfig. + * \return true for dedicated SPI. + */ +inline bool spiOptionDedicated(uint8_t opt) { + (void)opt; + return false; +} +#endif // ENABLE_DEDICATED_SPI +/** The user will call begin. Useful for custom SPI configurations. */ +const uint8_t USER_SPI_BEGIN = 2; //------------------------------------------------------------------------------ /** SPISettings for SCK frequency in Hz. */ #define SD_SCK_HZ(maxSpeed) (maxSpeed) /** SPISettings for SCK frequency in MHz. */ -#define SD_SCK_MHZ(maxMhz) (1000000UL*(maxMhz)) +#define SD_SCK_MHZ(maxMhz) (1000000UL * (maxMhz)) // SPI divisor constants - obsolete. /** Set SCK to max rate. */ #define SPI_FULL_SPEED SD_SCK_MHZ(50) @@ -73,86 +86,37 @@ void sdCsWrite(SdCsPin_t pin, bool level); /** Set SCK rate to 500 kHz for AVR. */ #define SPI_SIXTEENTH_SPEED SD_SCK_HZ(500000) //------------------------------------------------------------------------------ -/** The SD is the only device on the SPI bus. */ -#define DEDICATED_SPI 0X80 -/** SPI bus is share with other devices. */ -#define SHARED_SPI 0 #if SPI_DRIVER_SELECT < 2 #include "SPI.h" - - -namespace sdfat { - - /** Port type for Arduino SPI hardware driver. */ typedef SPIClass SpiPort_t; - - -}; // namespace sdfat - - #elif SPI_DRIVER_SELECT == 2 - - -namespace sdfat { - - class SdSpiSoftDriver; /** Port type for software SPI driver. */ typedef SdSpiSoftDriver SpiPort_t; - - -}; // namespace sdfat - - #elif SPI_DRIVER_SELECT == 3 - - -namespace sdfat { - - class SdSpiBaseClass; /** Port type for extrernal SPI driver. */ -typedef SdSpiBaseClass SpiPort_t; - - -}; // namespace sdfat - - -#else // SPI_DRIVER_SELECT - - -namespace sdfat { - - -typedef void* SpiPort_t; - - -}; // namespace sdfat - - +typedef SdSpiBaseClass SpiPort_t; +#else // SPI_DRIVER_SELECT +typedef void* SpiPort_t; #endif // SPI_DRIVER_SELECT //------------------------------------------------------------------------------ - - -namespace sdfat { - - /** * \class SdSpiConfig * \brief SPI card configuration. */ class SdSpiConfig { public: - /** SdSpiConfig constructor. + /** SdSpiConfig constructor. * * \param[in] cs Chip select pin. * \param[in] opt Options. * \param[in] maxSpeed Maximum SCK frequency. * \param[in] port The SPI port to use. */ - SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t* port) : - csPin(cs), options(opt), maxSck(maxSpeed), spiPort(port) {} + SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed, SpiPort_t* port) + : csPin(cs), options(opt), maxSck(maxSpeed), spiPort(port) {} /** SdSpiConfig constructor. * @@ -160,53 +124,36 @@ class SdSpiConfig { * \param[in] opt Options. * \param[in] maxSpeed Maximum SCK frequency. */ - SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed) : - csPin(cs), options(opt), maxSck(maxSpeed), spiPort(nullptr) {} + SdSpiConfig(SdCsPin_t cs, uint8_t opt, uint32_t maxSpeed) + : csPin(cs), options(opt), maxSck(maxSpeed) {} /** SdSpiConfig constructor. * * \param[in] cs Chip select pin. * \param[in] opt Options. */ - SdSpiConfig(SdCsPin_t cs, uint8_t opt) : - csPin(cs), options(opt), maxSck(SD_SCK_MHZ(50)), spiPort(nullptr) {} + SdSpiConfig(SdCsPin_t cs, uint8_t opt) : csPin(cs), options(opt) {} /** SdSpiConfig constructor. * * \param[in] cs Chip select pin. */ - explicit SdSpiConfig(SdCsPin_t cs) : csPin(cs), options(SHARED_SPI), - maxSck(SD_SCK_MHZ(50)), spiPort(nullptr) {} + explicit SdSpiConfig(SdCsPin_t cs) : csPin(cs) {} /** Chip select pin. */ const SdCsPin_t csPin; /** Options */ - const uint8_t options; + const uint8_t options = SHARED_SPI; /** Max SCK frequency */ - const uint32_t maxSck; + const uint32_t maxSck = SD_SCK_MHZ(50); /** SPI port */ - SpiPort_t* spiPort; + SpiPort_t* spiPort = nullptr; }; - - -}; // namespace sdfat - - #if SPI_DRIVER_SELECT < 2 #include "SdSpiArduinoDriver.h" #elif SPI_DRIVER_SELECT == 2 #include "SdSpiSoftDriver.h" #elif SPI_DRIVER_SELECT == 3 #include "SdSpiBaseClass.h" - - -namespace sdfat { - - typedef SdSpiBaseClass SdSpiDriver; - - -}; // namespace sdfat - - #else // SPI_DRIVER_SELECT #error Invalid SPI_DRIVER_SELECT #endif // SPI_DRIVER_SELECT diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDue.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDue.cpp index 274b4ed2..73fc4c64 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDue.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiDue.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,11 +23,6 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" - - -namespace sdfat { - - #if defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_SAM_DUE) /* Use SAM3X DMAC if nonzero */ #define USE_SAM3X_DMAC 1 @@ -38,22 +33,18 @@ namespace sdfat { /* chip select register number */ #define SPI_CHIP_SEL 3 /* DMAC receive channel */ -#define SPI_DMAC_RX_CH 1 +#define SPI_DMAC_RX_CH 1 /* DMAC transmit channel */ -#define SPI_DMAC_TX_CH 0 +#define SPI_DMAC_TX_CH 0 /* DMAC Channel HW Interface Number for SPI TX. */ -#define SPI_TX_IDX 1 +#define SPI_TX_IDX 1 /* DMAC Channel HW Interface Number for SPI RX. */ -#define SPI_RX_IDX 2 +#define SPI_RX_IDX 2 //------------------------------------------------------------------------------ /* Disable DMA Controller. */ -static void dmac_disable() { - DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); -} +static void dmac_disable() { DMAC->DMAC_EN &= (~DMAC_EN_ENABLE); } /* Enable DMA Controller. */ -static void dmac_enable() { - DMAC->DMAC_EN = DMAC_EN_ENABLE; -} +static void dmac_enable() { DMAC->DMAC_EN = DMAC_EN_ENABLE; } /* Disable DMA Channel. */ static void dmac_channel_disable(uint32_t ul_num) { DMAC->DMAC_CHDR = DMAC_CHDR_DIS0 << ul_num; @@ -67,38 +58,20 @@ static bool dmac_channel_transfer_done(uint32_t ul_num) { return (DMAC->DMAC_CHSR & (DMAC_CHSR_ENA0 << ul_num)) ? false : true; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { - (void)spiConfig; - SPI.begin(); -#if USE_SAM3X_DMAC - pmc_enable_periph_clk(ID_DMAC); - dmac_disable(); - DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED; - dmac_enable(); -#if USE_SAM3X_BUS_MATRIX_FIX - MATRIX->MATRIX_WPMR = 0x4d415400; - MATRIX->MATRIX_MCFG[1] = 1; - MATRIX->MATRIX_MCFG[2] = 1; - MATRIX->MATRIX_SCFG[0] = 0x01000010; - MATRIX->MATRIX_SCFG[1] = 0x01000010; - MATRIX->MATRIX_SCFG[7] = 0x01000010; -#endif // USE_SAM3X_BUS_MATRIX_FIX -#endif // USE_SAM3X_DMAC -} -//------------------------------------------------------------------------------ // start RX DMA static void spiDmaRX(uint8_t* dst, uint16_t count) { dmac_channel_disable(SPI_DMAC_RX_CH); DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_SADDR = (uint32_t)&SPI0->SPI_RDR; DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DADDR = (uint32_t)dst; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLA = + count | DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CTRLB = + DMAC_CTRLB_SRC_DSCR | DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_PER2MEM_DMA_FC | DMAC_CTRLB_SRC_INCR_FIXED | DMAC_CTRLB_DST_INCR_INCREMENTING; - DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = DMAC_CFG_SRC_PER(SPI_RX_IDX) | - DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ASAP_CFG; + DMAC->DMAC_CH_NUM[SPI_DMAC_RX_CH].DMAC_CFG = + DMAC_CFG_SRC_PER(SPI_RX_IDX) | DMAC_CFG_SRC_H2SEL | DMAC_CFG_SOD | + DMAC_CFG_FIFOCFG_ASAP_CFG; dmac_channel_enable(SPI_DMAC_RX_CH); } //------------------------------------------------------------------------------ @@ -113,16 +86,17 @@ static void spiDmaTX(const uint8_t* src, uint16_t count) { dmac_channel_disable(SPI_DMAC_TX_CH); DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_SADDR = (uint32_t)src; DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DADDR = (uint32_t)&SPI0->SPI_TDR; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = count | - DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_DSCR = 0; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLA = + count | DMAC_CTRLA_SRC_WIDTH_BYTE | DMAC_CTRLA_DST_WIDTH_BYTE; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = DMAC_CTRLB_SRC_DSCR | - DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CTRLB = + DMAC_CTRLB_SRC_DSCR | DMAC_CTRLB_DST_DSCR | DMAC_CTRLB_FC_MEM2PER_DMA_FC | src_incr | DMAC_CTRLB_DST_INCR_FIXED; - DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = DMAC_CFG_DST_PER(SPI_TX_IDX) | - DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | DMAC_CFG_FIFOCFG_ALAP_CFG; + DMAC->DMAC_CH_NUM[SPI_DMAC_TX_CH].DMAC_CFG = + DMAC_CFG_DST_PER(SPI_TX_IDX) | DMAC_CFG_DST_H2SEL | DMAC_CFG_SOD | + DMAC_CFG_FIFOCFG_ALAP_CFG; dmac_channel_enable(SPI_DMAC_TX_CH); } @@ -146,35 +120,55 @@ void SdSpiArduinoDriver::activate() { pSpi->SPI_CR |= SPI_CR_SPIEN; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - SPI.endTransaction(); +void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { + (void)spiConfig; + SPI.begin(); +#if USE_SAM3X_DMAC + pmc_enable_periph_clk(ID_DMAC); + dmac_disable(); + DMAC->DMAC_GCFG = DMAC_GCFG_ARB_CFG_FIXED; + dmac_enable(); +#if USE_SAM3X_BUS_MATRIX_FIX + MATRIX->MATRIX_WPMR = 0x4d415400; + MATRIX->MATRIX_MCFG[1] = 1; + MATRIX->MATRIX_MCFG[2] = 1; + MATRIX->MATRIX_SCFG[0] = 0x01000010; + MATRIX->MATRIX_SCFG[1] = 0x01000010; + MATRIX->MATRIX_SCFG[7] = 0x01000010; +#endif // USE_SAM3X_BUS_MATRIX_FIX +#endif // USE_SAM3X_DMAC } //------------------------------------------------------------------------------ +void SdSpiArduinoDriver::deactivate() { SPI.endTransaction(); } +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::end() { SPI.end(); } +//------------------------------------------------------------------------------ static inline uint8_t spiTransfer(uint8_t b) { Spi* pSpi = SPI0; pSpi->SPI_TDR = b; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) { + } b = pSpi->SPI_RDR; return b; } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return spiTransfer(0XFF); -} +uint8_t SdSpiArduinoDriver::receive() { return spiTransfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { Spi* pSpi = SPI0; int rtn = 0; #if USE_SAM3X_DMAC // clear overrun error - while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) {pSpi->SPI_RDR;} + while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) { + pSpi->SPI_RDR; + } spiDmaRX(buf, count); spiDmaTX(0, count); uint32_t m = millis(); while (!dmac_channel_transfer_done(SPI_DMAC_RX_CH)) { - if ((millis() - m) > SAM3X_DMA_TIMEOUT) { + if ((millis() - m) > SAM3X_DMA_TIMEOUT) { dmac_channel_disable(SPI_DMAC_RX_CH); dmac_channel_disable(SPI_DMAC_TX_CH); rtn = 2; @@ -184,37 +178,39 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { if (pSpi->SPI_SR & SPI_SR_OVRES) { rtn |= 1; } -#else // USE_SAM3X_DMAC +#else // USE_SAM3X_DMAC for (size_t i = 0; i < count; i++) { pSpi->SPI_TDR = 0XFF; - while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_RDRF) == 0) { + } buf[i] = pSpi->SPI_RDR; } #endif // USE_SAM3X_DMAC return rtn; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - spiTransfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { spiTransfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { Spi* pSpi = SPI0; #if USE_SAM3X_DMAC spiDmaTX(buf, count); - while (!dmac_channel_transfer_done(SPI_DMAC_TX_CH)) {} -#else // #if USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + while (!dmac_channel_transfer_done(SPI_DMAC_TX_CH)) { + } +#else // #if USE_SAM3X_DMAC + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) { + } for (size_t i = 0; i < count; i++) { pSpi->SPI_TDR = buf[i]; - while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_TDRE) == 0) { + } } #endif // #if USE_SAM3X_DMAC - while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) {} + while ((pSpi->SPI_SR & SPI_SR_TXEMPTY) == 0) { + } // leave RDR empty - while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) {pSpi->SPI_RDR;} + while (pSpi->SPI_SR & (SPI_SR_OVRES | SPI_SR_RDRF)) { + pSpi->SPI_RDR; + } } #endif // defined(SD_USE_CUSTOM_SPI) && defined(ARDUINO_SAM_DUE) - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiESP.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiESP.cpp index 6ba868d2..27a51803 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiESP.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiESP.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,68 +24,63 @@ */ #include "SdSpiDriver.h" - - -namespace sdfat { - - #if defined(SD_USE_CUSTOM_SPI) && (defined(ESP8266) || defined(ESP32)) #define ESP_UNALIGN_OK 1 //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - ::SPI.beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { - (void)spiConfig; - ::SPI.begin(); + if (spiConfig.spiPort) { + m_spi = spiConfig.spiPort; +#if defined(SDCARD_SPI) && defined(SDCARD_SS_PIN) + } else if (spiConfig.csPin == SDCARD_SS_PIN) { + m_spi = &SDCARD_SPI; +#endif // defined(SDCARD_SPI) && defined(SDCARD_SS_PIN) + } else { + m_spi = &SPI; + } + m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - ::SPI.endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return ::SPI.transfer(0XFF); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if ESP_UNALIGN_OK - ::SPI.transferBytes(nullptr, buf, count); -#else // ESP_UNALIGN_OK + m_spi->transferBytes(nullptr, buf, count); +#else // ESP_UNALIGN_OK // Adjust to 32-bit alignment. while ((reinterpret_cast(buf) & 0X3) && count) { - *buf++ = ::SPI.transfer(0xff); + *buf++ = m_spi->transfer(0xff); count--; } // Do multiple of four byte transfers. - size_t n4 = 4*(count/4); + size_t n4 = 4 * (count / 4); if (n4) { - ::SPI.transferBytes(nullptr, buf, n4); + m_spi->transferBytes(nullptr, buf, n4); } // Transfer up to three remaining bytes. for (buf += n4, count -= n4; count; count--) { - *buf++ = ::SPI.transfer(0xff); + *buf++ = m_spi->transfer(0xff); } #endif // ESP_UNALIGN_OK return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - ::SPI.transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if !ESP_UNALIGN_OK // Adjust to 32-bit alignment. while ((reinterpret_cast(buf) & 0X3) && count) { - ::SPI.transfer(*buf++); + SPI.transfer(*buf++); count--; } #endif // #if ESP_UNALIGN_OK - ::SPI.transferBytes(const_cast(buf), nullptr, count); + + m_spi->transferBytes(const_cast(buf), nullptr, count); } -#endif // defined(SD_USE_CUSTOM_SPI) && defined(ESP8266) - - -}; // namespace sdfat +#endif // defined(SD_USE_CUSTOM_SPI) && (defined(ESP8266) || defined(ESP32)) diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiLibDriver.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiLibDriver.h index ca38a94e..44a7a2d5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiLibDriver.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiLibDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,11 +28,6 @@ */ #ifndef SdSpiLibDriver_h #define SdSpiLibDriver_h - - -namespace sdfat { - - //------------------------------------------------------------------------------ inline void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); @@ -48,36 +43,72 @@ inline void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { } else { m_spi = &SPI; } - m_spi->begin(); + if (!(spiConfig.options & USER_SPI_BEGIN)) { + m_spi->begin(); + } } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +inline void SdSpiArduinoDriver::end() { m_spi->end(); } //------------------------------------------------------------------------------ -inline uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer( 0XFF); -} +inline void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } +//------------------------------------------------------------------------------ +inline uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ inline uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { +#if USE_SPI_ARRAY_TRANSFER == 0 for (size_t i = 0; i < count; i++) { buf[i] = m_spi->transfer(0XFF); } +#elif USE_SPI_ARRAY_TRANSFER == 1 + memset(buf, 0XFF, count); + m_spi->transfer(buf, count); +#elif USE_SPI_ARRAY_TRANSFER < 4 + m_spi->transfer(nullptr, buf, count); +#elif USE_SPI_ARRAY_TRANSFER == 4 + uint8_t txTmp[512]; + memset(txTmp, 0XFF, sizeof(txTmp)); + while (count) { + size_t n = count <= sizeof(txTmp) ? count : sizeof(txTmp); + m_spi->transfer(txTmp, buf, n); + buf += n; + count -= n; + } +#else // USE_SPI_ARRAY_TRANSFER == 0 +#error invalid USE_SPI_ARRAY_TRANSFER +#endif // USE_SPI_ARRAY_TRANSFER == 0 return 0; } //------------------------------------------------------------------------------ -inline void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +inline void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ inline void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { +#if USE_SPI_ARRAY_TRANSFER == 0 for (size_t i = 0; i < count; i++) { m_spi->transfer(buf[i]); } +#elif USE_SPI_ARRAY_TRANSFER == 1 + uint8_t tmp[512]; + while (count > 0) { + size_t n = count <= sizeof(tmp) ? count : sizeof(tmp); + memcpy(tmp, buf, n); + m_spi->transfer(tmp, n); + count -= n; + buf += n; + } +#elif USE_SPI_ARRAY_TRANSFER == 2 + // Some systems do not allow const uint8_t*. + m_spi->transfer(const_cast(buf), nullptr, count); +#elif USE_SPI_ARRAY_TRANSFER < 5 + uint8_t rxTmp[512]; + while (count > 0) { + size_t n = count <= sizeof(rxTmp) ? count : sizeof(rxTmp); + // Some systems do not allow const uint8_t*. + m_spi->transfer(const_cast(buf), rxTmp, n); + buf += n; + count -= n; + } +#else // if USE_SPI_ARRAY_TRANSFER == 0 +#error invalid USE_SPI_ARRAY_TRANSFER +#endif // USE_SPI_ARRAY_TRANSFER == 0 } - - -}; // namespace sdfat - - #endif // SdSpiLibDriver_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiParticle.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiParticle.cpp index bbaa8e33..ecf6f52e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiParticle.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiParticle.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,11 +23,6 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" - - -namespace sdfat { - - #if defined(SD_USE_CUSTOM_SPI) && defined(PLATFORM_ID) static volatile bool SPI_DMA_TransferCompleted = false; //----------------------------------------------------------------------------- @@ -35,9 +30,7 @@ static void SD_SPI_DMA_TransferComplete_Callback() { SPI_DMA_TransferCompleted = true; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -48,34 +41,29 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { SPI_DMA_TransferCompleted = false; m_spi->transfer(nullptr, buf, count, SD_SPI_DMA_TransferComplete_Callback); - while (!SPI_DMA_TransferCompleted) {} + while (!SPI_DMA_TransferCompleted) { + } return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { SPI_DMA_TransferCompleted = false; m_spi->transfer(const_cast(buf), nullptr, count, - SD_SPI_DMA_TransferComplete_Callback); + SD_SPI_DMA_TransferComplete_Callback); - while (!SPI_DMA_TransferCompleted) {} + while (!SPI_DMA_TransferCompleted) { + } } #endif // defined(SD_USE_CUSTOM_SPI) && defined(PLATFORM_ID) - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32.cpp index 26dbe87d..544c2dfb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,14 +22,9 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ +// Driver for: https://github.com/rogerclarkmelbourne/Arduino_STM32 #include "SdSpiDriver.h" - - -namespace sdfat { - - -#if defined(SD_USE_CUSTOM_SPI)\ - && (defined(__STM32F1__) || defined(__STM32F4__)) +#if defined(SD_USE_CUSTOM_SPI) && (defined(__STM32F1__) || defined(__STM32F4__)) #if defined(__STM32F1__) #define USE_STM32_DMA 1 #elif defined(__STM32F4__) @@ -38,9 +33,7 @@ namespace sdfat { #error Unknown STM32 type #endif // defined(__STM32F1__) //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -51,35 +44,28 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if USE_STM32_DMA return m_spi->dmaTransfer(nullptr, buf, count); -#else // USE_STM32_DMA +#else // USE_STM32_DMA m_spi->read(buf, count); return 0; #endif // USE_STM32_DMA } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if USE_STM32_DMA m_spi->dmaTransfer(const_cast(buf), nullptr, count); -#else // USE_STM32_DMA +#else // USE_STM32_DMA m_spi->write(const_cast(buf), count); #endif // USE_STM32_DMA } #endif // defined(SD_USE_CUSTOM_SPI) && defined(__STM32F1__) - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32Core.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32Core.cpp new file mode 100644 index 00000000..8b7da947 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSTM32Core.cpp @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +// Driver for: https://github.com/stm32duino/Arduino_Core_STM32 +#include "SdSpiDriver.h" +#if defined(SD_USE_CUSTOM_SPI) && defined(STM32_CORE_VERSION) +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { + if (spiConfig.spiPort) { + m_spi = spiConfig.spiPort; + } else { + m_spi = &SPI; + } + m_spi->begin(); +} +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { + // Must send 0XFF - SD looks at send data for command. + memset(buf, 0XFF, count); + m_spi->transfer(buf, count); + return 0; +} +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } +//------------------------------------------------------------------------------ +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { + // Avoid stack overflow if bad count. This should cause a write error. + if (count > 512) { + return; + } + // Not easy to avoid receive so use tmp RX buffer. + uint8_t rxBuf[512]; + // Discard const - STM32 not const correct. + m_spi->transfer(const_cast(buf), rxBuf, count); +} +#endif // defined(SD_USE_CUSTOM_SPI) && defined(STM32_CORE_VERSION) diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSoftDriver.h b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSoftDriver.h index 275ace59..c681ca4a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSoftDriver.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiSoftDriver.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,6 @@ #ifndef SdSpiSoftDriver_h #define SdSpiSoftDriver_h #include "../DigitalIO/SoftSPI.h" - - -namespace sdfat { - - /** * \class SdSpiSoftDriver * \brief Base class for external soft SPI. @@ -54,6 +49,8 @@ class SdSpiSoftDriver { } /** Deactivate SPI hardware. */ void deactivate() {} + /** deactivate SPI driver. */ + void end() {} /** Receive a byte. * * \return The byte. @@ -91,39 +88,33 @@ class SdSpiSoftDriver { * * \param[in] maxSck Maximum SCK frequency. */ - void setSckSpeed(uint32_t maxSck) { - (void)maxSck; - } + void setSckSpeed(uint32_t maxSck) { (void)maxSck; } }; //------------------------------------------------------------------------------ /** * \class SoftSpiDriver * \brief Class for external soft SPI. */ -template +template class SoftSpiDriver : public SdSpiSoftDriver { public: /** Initialize the SPI bus. */ - void begin() {m_spi.begin();} + void begin() { m_spi.begin(); } /** Receive a byte. * * \return The byte. */ - uint8_t receive() {return m_spi.receive();} + uint8_t receive() { return m_spi.receive(); } /** Send a byte. * * \param[in] data Byte to send */ - void send(uint8_t data) {m_spi.send(data);} + void send(uint8_t data) { m_spi.send(data); } + private: SoftSPI m_spi; }; /** Typedef for use of SdSoftSpiDriver */ typedef SdSpiSoftDriver SdSpiDriver; - - -}; // namespace sdfat - - #endif // SdSpiSoftDriver_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiTeensy3.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiTeensy3.cpp index adf5f299..6c8e045b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiTeensy3.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/SpiDriver/SdSpiTeensy3.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,17 +23,10 @@ * DEALINGS IN THE SOFTWARE. */ #include "SdSpiDriver.h" - - -namespace sdfat { - - -#if defined(SD_USE_CUSTOM_SPI) && defined(__arm__) && defined(CORE_TEENSY) +#if defined(SD_USE_CUSTOM_SPI) && defined(__arm__) && defined(CORE_TEENSY) #define USE_BLOCK_TRANSFER 1 //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::activate() { - m_spi->beginTransaction(m_spiSettings); -} +void SdSpiArduinoDriver::activate() { m_spi->beginTransaction(m_spiSettings); } //------------------------------------------------------------------------------ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { if (spiConfig.spiPort) { @@ -51,19 +44,17 @@ void SdSpiArduinoDriver::begin(SdSpiConfig spiConfig) { m_spi->begin(); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::deactivate() { - m_spi->endTransaction(); -} +void SdSpiArduinoDriver::deactivate() { m_spi->endTransaction(); } //------------------------------------------------------------------------------ -uint8_t SdSpiArduinoDriver::receive() { - return m_spi->transfer(0XFF); -} +void SdSpiArduinoDriver::end() { m_spi->end(); } +//------------------------------------------------------------------------------ +uint8_t SdSpiArduinoDriver::receive() { return m_spi->transfer(0XFF); } //------------------------------------------------------------------------------ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { #if USE_BLOCK_TRANSFER memset(buf, 0XFF, count); m_spi->transfer(buf, count); -#else // USE_BLOCK_TRANSFER +#else // USE_BLOCK_TRANSFER for (size_t i = 0; i < count; i++) { buf[i] = m_spi->transfer(0XFF); } @@ -71,11 +62,9 @@ uint8_t SdSpiArduinoDriver::receive(uint8_t* buf, size_t count) { return 0; } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(uint8_t data) { - m_spi->transfer(data); -} +void SdSpiArduinoDriver::send(uint8_t data) { m_spi->transfer(data); } //------------------------------------------------------------------------------ -void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { +void SdSpiArduinoDriver::send(const uint8_t* buf, size_t count) { #if USE_BLOCK_TRANSFER uint32_t tmp[128]; if (0 < count && count <= 512) { @@ -89,6 +78,3 @@ void SdSpiArduinoDriver::send(const uint8_t* buf , size_t count) { } } #endif // defined(SD_USE_CUSTOM_SPI) && defined(__arm__) &&defined(CORE_TEENSY) - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/ArduinoFiles.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/ArduinoFiles.h index e0234177..e5a06d64 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/ArduinoFiles.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/ArduinoFiles.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,12 +24,7 @@ */ #ifndef ArduinoFiles_h #define ArduinoFiles_h -#include "../SdFatConfig.h" - - -namespace sdfat { - - +#include "SysCall.h" //------------------------------------------------------------------------------ /** Arduino SD.h style flag for open for read. */ #ifndef FILE_READ @@ -44,7 +39,7 @@ namespace sdfat { * \class PrintFile * \brief PrintFile class. */ -template +template class PrintFile : public print_t, public BaseFile { public: using BaseFile::clearWriteError; @@ -55,16 +50,14 @@ class PrintFile : public print_t, public BaseFile { * \param[in] b byte to write. * \return one for success. */ - size_t write(uint8_t b) { - return BaseFile::write(&b, 1); - } + size_t write(uint8_t b) { return BaseFile::write(&b, 1); } }; //------------------------------------------------------------------------------ /** * \class StreamFile * \brief StreamFile class. */ -template +template class StreamFile : public stream_t, public BaseFile { public: using BaseFile::clearWriteError; @@ -77,46 +70,29 @@ class StreamFile : public stream_t, public BaseFile { /** \return number of bytes available from the current position to EOF * or INT_MAX if more than INT_MAX bytes are available. */ - int available() { - return BaseFile::available(); - } + int available() { return BaseFile::available(); } /** Ensure that any bytes written to the file are saved to the SD card. */ - void flush() { - BaseFile::sync(); - } + void flush() { BaseFile::sync(); } /** This function reports if the current file is a directory or not. - * \return true if the file is a directory. - */ - bool isDirectory() { - return BaseFile::isDir(); - } - /** No longer implemented due to Long File Names. - * - * Use getName(char* name, size_t size). - * \return a pointer to replacement suggestion. + * \return true if the file is a directory. */ - const char* name() const { - return "use getName()"; - } + bool isDirectory() { return BaseFile::isDir(); } +#ifndef DOXYGEN_SHOULD_SKIP_THIS + char* __attribute__((error("use getName(name, size)"))) name(); +#endif // DOXYGEN_SHOULD_SKIP_THIS /** Return the next available byte without consuming it. * * \return The byte if no error and not at eof else -1; */ - int peek() { - return BaseFile::peek(); - } + int peek() { return BaseFile::peek(); } /** \return the current file position. */ - PosType position() { - return BaseFile::curPosition(); - } + PosType position() { return BaseFile::curPosition(); } /** Read the next byte from a file. * * \return For success return the next byte in the file as an int. * If an error occurs or end of file is reached return -1. */ - int read() { - return BaseFile::read(); - } + int read() { return BaseFile::read(); } /** Rewind a file if it is a directory */ void rewindDirectory() { if (BaseFile::isDir()) { @@ -130,21 +106,15 @@ class StreamFile : public stream_t, public BaseFile { * \param[in] pos the new file position. * \return true for success or false for failure. */ - bool seek(PosType pos) { - return BaseFile::seekSet(pos); - } + bool seek(PosType pos) { return BaseFile::seekSet(pos); } /** \return the file's size. */ - PosType size() { - return BaseFile::fileSize(); - } + PosType size() { return BaseFile::fileSize(); } /** Write a byte to a file. Required by the Arduino Print class. * \param[in] b the byte to be written. * Use getWriteError to check for errors. * \return 1 for success and 0 for failure. */ - size_t write(uint8_t b) { - return BaseFile::write(b); - } + size_t write(uint8_t b) { return BaseFile::write(b); } /** Write data to an open file. * * \note Data is moved to the cache but may not be written to the @@ -161,9 +131,4 @@ class StreamFile : public stream_t, public BaseFile { return BaseFile::write(buffer, size); } }; - - -}; // namespace sdfat - - #endif // ArduinoFiles_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/CompileDateTime.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/CompileDateTime.h index 7de3a7f7..7cc041eb 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/CompileDateTime.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/CompileDateTime.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,61 +24,46 @@ */ #ifndef CompileDateTime_h #define CompileDateTime_h - - -namespace sdfat { - - +#include // Note - these functions will compile to a few bytes // since they are evaluated at compile time. /** \return year field of the __DATE__ macro. */ constexpr uint16_t compileYear() { - return 1000*(__DATE__[7] - '0') - + 100*(__DATE__[8] - '0') - + 10*(__DATE__[9] - '0') - + (__DATE__[10] - '0'); -} -/** \return true if str equals the month field of the __DATE__ macro. */ -constexpr bool compileMonthIs(const char* str) { - return __DATE__[0] == str[0] - && __DATE__[1] == str[1] - && __DATE__[2] == str[2]; + return 1000 * (__DATE__[7] - '0') + 100 * (__DATE__[8] - '0') + + 10 * (__DATE__[9] - '0') + (__DATE__[10] - '0'); } /** \return month field of the __DATE__ macro. */ constexpr uint8_t compileMonth() { - return compileMonthIs("Jan") ? 1 : - compileMonthIs("Feb") ? 2 : - compileMonthIs("Mar") ? 3 : - compileMonthIs("Apr") ? 4 : - compileMonthIs("May") ? 5 : - compileMonthIs("Jun") ? 6 : - compileMonthIs("Jul") ? 7 : - compileMonthIs("Aug") ? 8 : - compileMonthIs("Sep") ? 9 : - compileMonthIs("Oct") ? 10 : - compileMonthIs("Nov") ? 11 : - compileMonthIs("Dec") ? 12 : 0; + return __DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n' ? 1 + : __DATE__[0] == 'F' && __DATE__[1] == 'e' && __DATE__[2] == 'b' ? 2 + : __DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r' ? 3 + : __DATE__[0] == 'A' && __DATE__[1] == 'p' && __DATE__[2] == 'r' ? 4 + : __DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y' ? 5 + : __DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n' ? 6 + : __DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l' ? 7 + : __DATE__[0] == 'A' && __DATE__[1] == 'u' && __DATE__[2] == 'g' ? 8 + : __DATE__[0] == 'S' && __DATE__[1] == 'e' && __DATE__[2] == 'p' ? 9 + : __DATE__[0] == 'O' && __DATE__[1] == 'c' && __DATE__[2] == 't' ? 10 + : __DATE__[0] == 'N' && __DATE__[1] == 'o' && __DATE__[2] == 'v' ? 11 + : __DATE__[0] == 'D' && __DATE__[1] == 'e' && __DATE__[2] == 'c' ? 12 + : 0; } /** \return day field of the __DATE__ macro. */ constexpr uint8_t compileDay() { - return 10*(__DATE__[4] == ' ' ? 0 : __DATE__[4] - '0') + (__DATE__[5] - '0'); + return 10 * ((__DATE__[4] == ' ' ? '0' : __DATE__[4]) - '0') + + (__DATE__[5] - '0'); } /** \return hour field of the __TIME__ macro. */ constexpr uint8_t compileHour() { - return 10*(__TIME__[0] - '0') + __TIME__[1] - '0'; + return 10 * (__TIME__[0] - '0') + __TIME__[1] - '0'; } /** \return minute field of the __TIME__ macro. */ constexpr uint8_t compileMinute() { - return 10*(__TIME__[3] - '0') + __TIME__[4] - '0'; + return 10 * (__TIME__[3] - '0') + __TIME__[4] - '0'; } /** \return second field of the __TIME__ macro. */ constexpr uint8_t compileSecond() { - return 10*(__TIME__[6] - '0') + __TIME__[7] - '0'; + return 10 * (__TIME__[6] - '0') + __TIME__[7] - '0'; } - - -}; //namespace sdfat - - #endif // CompileDateTime_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/DebugMacros.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/DebugMacros.h index 804074a8..653cc86e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/DebugMacros.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/DebugMacros.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,7 +24,9 @@ */ #ifndef DebugMacros_h #define DebugMacros_h -#include "../SdFatConfig.h" +#include "SysCall.h" + +// 0 - disable, 1 - fail, halt 2 - fail, halt, warn #define USE_DBG_MACROS 0 #if USE_DBG_MACROS @@ -33,30 +35,47 @@ #error DBG_FILE not defined #endif // DBG_FILE - -namespace sdfat { - - -static void dbgPrint(uint16_t line) { +__attribute__((unused)) static void dbgFail(uint16_t line) { Serial.print(F("DBG_FAIL: ")); Serial.print(F(DBG_FILE)); Serial.write('.'); Serial.println(line); } +__attribute__((unused)) static void dbgHalt(uint16_t line) { + Serial.print(F("DBG_HALT: ")); + Serial.print(F(DBG_FILE)); + Serial.write('.'); + Serial.println(line); + while (true) { + } +} +#define DBG_FAIL_MACRO dbgFail(__LINE__) +#define DBG_HALT_MACRO dbgHalt(__LINE__) +#define DBG_HALT_IF(b) \ + if (b) { \ + dbgHalt(__LINE__); \ + } - -}; // namespace sdfat - - -#define DBG_PRINT_IF(b) if (b) {Serial.print(F(__FILE__));\ - Serial.println(__LINE__);} -#define DBG_HALT_IF(b) if (b) { Serial.print(F("DBG_HALT "));\ - Serial.print(F(__FILE__)); Serial.println(__LINE__);\ - while (true) {}} -#define DBG_FAIL_MACRO dbgPrint(__LINE__); #else // USE_DBG_MACROS #define DBG_FAIL_MACRO -#define DBG_PRINT_IF(b) +#define DBG_HALT_MACRO #define DBG_HALT_IF(b) #endif // USE_DBG_MACROS + +#if USE_DBG_MACROS > 1 +__attribute__((unused)) static void dbgWarn(uint16_t line) { + Serial.print(F("DBG_WARN: ")); + Serial.print(F(DBG_FILE)); + Serial.write('.'); + Serial.println(line); +} +#define DBG_WARN_MACRO dbgWarn(__LINE__) +#define DBG_WARN_IF(b) \ + if (b) { \ + dbgWarn(__LINE__); \ + } +#else // USE_DBG_MACROS > 1 +#define DBG_WARN_MACRO +#define DBG_WARN_IF(b) +#endif // USE_DBG_MACROS > 1 #endif // DebugMacros_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.cpp index 6e02fff9..906d8ee0 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -40,80 +40,84 @@ // (we add 1 because we will be using the floor of the result later) // divmod10_asm16 and divmod10_asm32 are public domain code by Stimmer. // http://forum.arduino.cc/index.php?topic=167414.msg1293679#msg1293679 -#define divmod10_asm16(in32, mod8, tmp8) \ -asm volatile( \ - " ldi %2,51 \n\t" \ - " mul %A0,%2 \n\t" \ - " clr %A0 \n\t" \ - " add r0,%2 \n\t" \ - " adc %A0,r1 \n\t" \ - " mov %1,r0 \n\t" \ - " mul %B0,%2 \n\t" \ - " clr %B0 \n\t" \ - " add %A0,r0 \n\t" \ - " adc %B0,r1 \n\t" \ - " clr r1 \n\t" \ - " add %1,%A0 \n\t" \ - " adc %A0,%B0 \n\t" \ - " adc %B0,r1 \n\t" \ - " add %1,%B0 \n\t" \ - " adc %A0,r1 \n\t" \ - " adc %B0,r1 \n\t" \ - " lsr %B0 \n\t" \ - " ror %A0 \n\t" \ - " ror %1 \n\t" \ - " ldi %2,10 \n\t" \ - " mul %1,%2 \n\t" \ - " mov %1,r1 \n\t" \ - " clr r1 \n\t" \ - :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") +#define divmod10_asm16(in32, mod8, tmp8) \ + asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " lsr %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + : "+r"(in32), "=d"(mod8), "=d"(tmp8) \ + : \ + : "r0") -#define divmod10_asm32(in32, mod8, tmp8) \ -asm volatile( \ - " ldi %2,51 \n\t" \ - " mul %A0,%2 \n\t" \ - " clr %A0 \n\t" \ - " add r0,%2 \n\t" \ - " adc %A0,r1 \n\t" \ - " mov %1,r0 \n\t" \ - " mul %B0,%2 \n\t" \ - " clr %B0 \n\t" \ - " add %A0,r0 \n\t" \ - " adc %B0,r1 \n\t" \ - " mul %C0,%2 \n\t" \ - " clr %C0 \n\t" \ - " add %B0,r0 \n\t" \ - " adc %C0,r1 \n\t" \ - " mul %D0,%2 \n\t" \ - " clr %D0 \n\t" \ - " add %C0,r0 \n\t" \ - " adc %D0,r1 \n\t" \ - " clr r1 \n\t" \ - " add %1,%A0 \n\t" \ - " adc %A0,%B0 \n\t" \ - " adc %B0,%C0 \n\t" \ - " adc %C0,%D0 \n\t" \ - " adc %D0,r1 \n\t" \ - " add %1,%B0 \n\t" \ - " adc %A0,%C0 \n\t" \ - " adc %B0,%D0 \n\t" \ - " adc %C0,r1 \n\t" \ - " adc %D0,r1 \n\t" \ - " add %1,%D0 \n\t" \ - " adc %A0,r1 \n\t" \ - " adc %B0,r1 \n\t" \ - " adc %C0,r1 \n\t" \ - " adc %D0,r1 \n\t" \ - " lsr %D0 \n\t" \ - " ror %C0 \n\t" \ - " ror %B0 \n\t" \ - " ror %A0 \n\t" \ - " ror %1 \n\t" \ - " ldi %2,10 \n\t" \ - " mul %1,%2 \n\t" \ - " mov %1,r1 \n\t" \ - " clr r1 \n\t" \ - :"+r"(in32), "=d"(mod8), "=d"(tmp8) : : "r0") +#define divmod10_asm32(in32, mod8, tmp8) \ + asm volatile( \ + " ldi %2,51 \n\t" \ + " mul %A0,%2 \n\t" \ + " clr %A0 \n\t" \ + " add r0,%2 \n\t" \ + " adc %A0,r1 \n\t" \ + " mov %1,r0 \n\t" \ + " mul %B0,%2 \n\t" \ + " clr %B0 \n\t" \ + " add %A0,r0 \n\t" \ + " adc %B0,r1 \n\t" \ + " mul %C0,%2 \n\t" \ + " clr %C0 \n\t" \ + " add %B0,r0 \n\t" \ + " adc %C0,r1 \n\t" \ + " mul %D0,%2 \n\t" \ + " clr %D0 \n\t" \ + " add %C0,r0 \n\t" \ + " adc %D0,r1 \n\t" \ + " clr r1 \n\t" \ + " add %1,%A0 \n\t" \ + " adc %A0,%B0 \n\t" \ + " adc %B0,%C0 \n\t" \ + " adc %C0,%D0 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%B0 \n\t" \ + " adc %A0,%C0 \n\t" \ + " adc %B0,%D0 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " add %1,%D0 \n\t" \ + " adc %A0,r1 \n\t" \ + " adc %B0,r1 \n\t" \ + " adc %C0,r1 \n\t" \ + " adc %D0,r1 \n\t" \ + " lsr %D0 \n\t" \ + " ror %C0 \n\t" \ + " ror %B0 \n\t" \ + " ror %A0 \n\t" \ + " ror %1 \n\t" \ + " ldi %2,10 \n\t" \ + " mul %1,%2 \n\t" \ + " mov %1,r1 \n\t" \ + " clr r1 \n\t" \ + : "+r"(in32), "=d"(mod8), "=d"(tmp8) \ + : \ + : "r0") //------------------------------------------------------------------------------ /* // C++ code is based on this version of divmod10 by robtillaart. @@ -134,13 +138,12 @@ void divmod10(uint32_t in, uint32_t &div, uint32_t &mod) q = q >> 3; // determine error - uint32_t r = in - ((q << 3) + (q << 1)); // r = in - q*10; + uint32_t r = in - ((q << 3) + (q << 1)); // r = in - q*10; div = q + (r > 9); if (r > 9) mod = r - 10; else mod = r; } -// Hackers delight function is here: -// http://www.hackersdelight.org/hdcodetxt/divuc.c.txt +// See: https://github.com/hcs0/Hackers-Delight // Code below uses 8/10 = 0.1100 1100 1100 1100 1100 1100 1100 1100. // 15 ops including the multiply, or 17 elementary ops. unsigned divu10(unsigned n) { @@ -156,11 +159,6 @@ unsigned divu10(unsigned n) { // return q + (r > 9); } */ - - -namespace sdfat { - - //------------------------------------------------------------------------------ // Format 16-bit unsigned char* fmtBase10(char* str, uint16_t n) { @@ -168,7 +166,7 @@ char* fmtBase10(char* str, uint16_t n) { #ifdef USE_STIMMER uint8_t tmp8, r; divmod10_asm16(n, r, tmp8); -#else // USE_STIMMER +#else // USE_STIMMER uint16_t t = n; n = (n >> 1) + (n >> 2); n = n + (n >> 4); @@ -193,7 +191,7 @@ char* fmtBase10(char* str, uint32_t n) { #ifdef USE_STIMMER uint8_t tmp8, r; divmod10_asm32(n, r, tmp8); -#else // USE_STIMMER +#else // USE_STIMMER uint32_t t = n; n = (n >> 1) + (n >> 2); n = n + (n >> 4); @@ -237,7 +235,7 @@ char* fmtUnsigned(char* str, uint32_t num, uint8_t base, bool caps) { if (base == 10) return fmtBase10(str, (uint32_t)num); #endif // USE_FMT_BASE10 do { - int c = num%base; + int c = num % base; *--str = c + (c < 10 ? '0' : caps ? 'A' - 10 : 'a' - 10); } while (num /= base); return str; @@ -245,11 +243,11 @@ char* fmtUnsigned(char* str, uint32_t num, uint8_t base, bool caps) { //----------------------------------------------------------------------------- static const double powTen[] = {1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9}; -static const double rnd[] = - {5e-1, 5e-2, 5e-3, 5e-4, 5e-5, 5e-6, 5e-7, 5e-8, 5e-9, 5e-10}; -static const size_t MAX_PREC = sizeof(powTen)/sizeof(powTen[0]); +static const double rnd[] = {5e-1, 5e-2, 5e-3, 5e-4, 5e-5, + 5e-6, 5e-7, 5e-8, 5e-9, 5e-10}; +static const size_t MAX_PREC = sizeof(powTen) / sizeof(powTen[0]); -char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { +char* fmtDouble(char* str, double num, uint8_t prec, bool altFmt) { bool neg = num < 0; if (neg) { num = -num; @@ -281,7 +279,7 @@ char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { uint32_t ul = num; if (prec) { char* s = str - prec; - uint32_t f = (num - ul)*powTen[prec - 1]; + uint32_t f = (num - ul) * powTen[prec - 1]; str = fmtBase10(str, f); while (str > s) { *--str = '0'; @@ -304,8 +302,8 @@ char *fmtDouble(char *str, double num, uint8_t prec, bool altFmt) { * \param[in] expChar Use exp format if non zero. * \return Pointer to first character of result. */ -char* fmtDouble(char* str, double value, - uint8_t prec, bool altFmt, char expChar) { +char* fmtDouble(char* str, double value, uint8_t prec, bool altFmt, + char expChar) { if (expChar != 'e' && expChar != 'E') { expChar = 0; } @@ -353,11 +351,11 @@ char* fmtDouble(char* str, double value, exp++; } } else if (value < 1.0L) { - while (value < 1e-16L) { + while (value < 1e-16L) { value *= 1e16L; exp -= 16; } - while (value < 1e-4L) { + while (value < 1e-4L) { value *= 1e4L; exp -= 4; } @@ -390,13 +388,13 @@ char* fmtDouble(char* str, double value, uint32_t whole = value; if (prec) { char* tmp = str - prec; - uint32_t fraction = (value - whole)*powTen[prec - 1]; + uint32_t fraction = (value - whole) * powTen[prec - 1]; str = fmtBase10(str, fraction); while (str > tmp) { *--str = '0'; } } - if (prec || altFmt)*--str = '.'; + if (prec || altFmt) *--str = '.'; str = fmtBase10(str, whole); if (neg) { *--str = '-'; @@ -410,14 +408,14 @@ char* fmtDouble(char* str, double value, #ifdef __AVR__ static const float m[] PROGMEM = {1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32}; static const float p[] PROGMEM = {1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32}; -#else // __AVR__ +#else // __AVR__ static const float m[] = {1e-1, 1e-2, 1e-4, 1e-8, 1e-16, 1e-32}; static const float p[] = {1e+1, 1e+2, 1e+4, 1e+8, 1e+16, 1e+32}; #endif // __AVR__ #endif // DOXYGEN_SHOULD_SKIP_THIS // scale float v by power of ten. return v*10^n float scale10(float v, int8_t n) { - const float *s; + const float* s; if (n < 0) { n = -n; s = m; @@ -430,7 +428,7 @@ float scale10(float v, int8_t n) { if (n & 1) { v *= pgm_read_float(&s[i]); } -#else // __AVR__ +#else // __AVR__ if (n & 1) { v *= s[i]; } @@ -455,7 +453,8 @@ float scanFloat(const char* str, const char** ptr) { *ptr = str; } - while (isSpace((c = *str++))) {} + while (isSpace((c = *str++))) { + } neg = c == '-'; if (c == '-' || c == '+') { c = *str++; @@ -469,7 +468,7 @@ float scanFloat(const char* str, const char** ptr) { if (isDigit(c)) { digit = true; if (nd < 9) { - fract = 10*fract + c - '0'; + fract = 10 * fract + c - '0'; nd++; if (dot) { fracExp--; @@ -504,7 +503,7 @@ float scanFloat(const char* str, const char** ptr) { if (exp > EXP_LIMIT) { goto fail; } - exp = 10*exp + c - '0'; + exp = 10 * exp + c - '0'; successPtr = str; c = *str++; } @@ -516,9 +515,6 @@ float scanFloat(const char* str, const char** ptr) { v = scale10(static_cast(fract), fracExp); return neg ? -v : v; - fail: +fail: return 0; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.h index f02d4244..7f435232 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FmtNumber.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,28 +25,15 @@ #ifndef FmtNumber_h #define FmtNumber_h #include -#include #include - - -namespace sdfat { - - -inline bool isDigit(char c) { - return '0' <= (c) && (c) <= '9'; -} -inline bool isSpace(char c) { - return (c) == ' ' || (0X9 <= (c) && (c) <= 0XD); -} +#include +inline bool isDigit(char c) { return '0' <= (c) && (c) <= '9'; } +inline bool isSpace(char c) { return (c) == ' ' || (0X9 <= (c) && (c) <= 0XD); } char* fmtBase10(char* str, uint16_t n); char* fmtBase10(char* str, uint32_t n); -char* fmtDouble(char *str, double d, uint8_t prec, bool altFmt); +char* fmtDouble(char* str, double d, uint8_t prec, bool altFmt); char* fmtDouble(char* str, double d, uint8_t prec, bool altFmt, char expChar); char* fmtHex(char* str, uint32_t n); char* fmtSigned(char* str, int32_t n, uint8_t base, bool caps); char* fmtUnsigned(char* str, uint32_t n, uint8_t base, bool caps); - -}; // namespace sdfat - - #endif // FmtNumber_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsApiConstants.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsApiConstants.h index 6c5fa079..3fcc20ca 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsApiConstants.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsApiConstants.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,15 +24,9 @@ */ #ifndef FsApiConstants_h #define FsApiConstants_h -#include "../SdFatConfig.h" - +#include "SysCall.h" #if USE_FCNTL_H #include - - -namespace sdfat { - - /* values for GNU Arm Embedded Toolchain. * O_RDONLY: 0x0 * O_WRONLY: 0x1 @@ -48,79 +42,23 @@ namespace sdfat { /** Use O_NONBLOCK for open at EOF */ #define O_AT_END O_NONBLOCK ///< Open at EOF. typedef int oflag_t; +#else // USE_FCNTL_H +#define O_RDONLY 0X00 ///< Open for reading only. +#define O_WRONLY 0X01 ///< Open for writing only. +#define O_RDWR 0X02 ///< Open for reading and writing. +#define O_AT_END 0X04 ///< Open at EOF. +#define O_APPEND 0X08 ///< Set append mode. +#define O_CREAT 0x10 ///< Create file if it does not exist. +#define O_TRUNC 0x20 ///< Truncate file to zero length. +#define O_EXCL 0x40 ///< Fail if the file exists. +#define O_SYNC 0x80 ///< Synchronized write I/O operations. - -}; // namespace sdfat - - -#else // USE_FCNTL_H - -#include - -namespace sdfat { - -#ifdef O_RDONLY -#undef O_RDONLY -#endif // O_RDONLY -#ifdef O_RDWR -#undef O_RDWR -#endif // O_RDWR -#ifdef O_WRONLY -#undef O_WRONLY -#endif // O_WRONLY -//------------------------------------------------------------------------------ -// use the gnu style oflag in open() -/** open() oflag for reading */ -const uint8_t O_READ = 0X01; -/** open() oflag - same as O_IN */ -const uint8_t O_RDONLY = O_READ; -/** open() oflag for write */ -const uint8_t O_WRITE = 0X02; -/** open() oflag - same as O_WRITE */ -const uint8_t O_WRONLY = O_WRITE; -/** open() oflag for reading and writing */ -const uint8_t O_RDWR = (O_READ | O_WRITE); -/** open() oflag mask for access modes */ -const uint8_t O_ACCMODE = (O_READ | O_WRITE); -/** The file offset shall be set to the end of the file prior to each write. */ -const uint8_t O_APPEND = 0X04; -/** synchronous writes - call sync() after each write */ -const uint8_t O_SYNC = 0X08; -/** truncate the file to zero length */ -const uint8_t O_TRUNC = 0X10; -/** set the initial position at the end of the file */ -const uint8_t O_AT_END = 0X20; -/** create the file if nonexistent */ -const uint8_t O_CREAT = 0X40; -/** If O_CREAT and O_EXCL are set, open() shall fail if the file exists */ -const uint8_t O_EXCL = 0X80; -#if 0 -#define O_RDONLY 0X00 ///< Open for reading only. -#define O_WRONLY 0X01 ///< Open for writing only. -#define O_RDWR 0X02 ///< Open for reading and writing. -#define O_AT_END 0X04 ///< Open at EOF. -#define O_APPEND 0X08 ///< Set append mode. -#define O_CREAT 0x10 ///< Create file if it does not exist. -#define O_TRUNC 0x20 ///< Truncate file to zero length. -#define O_EXCL 0x40 ///< Fail if the file exists. -#define O_SYNC 0x80 ///< Synchronized write I/O operations. - -#define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) ///< Mask for access mode. -#endif +#define O_ACCMODE (O_RDONLY | O_WRONLY | O_RDWR) ///< Mask for access mode. typedef uint8_t oflag_t; +#endif // USE_FCNTL_H - -}; // namespace sdfat - - -#endif // USE_FCNTL_H - - -namespace sdfat { - - -#define O_READ O_RDONLY -#define O_WRITE O_WRONLY +#define O_READ O_RDONLY +#define O_WRITE O_WRONLY inline bool isWriteMode(oflag_t oflag) { oflag &= O_ACCMODE; @@ -144,9 +82,4 @@ const uint8_t T_ACCESS = 1; const uint8_t T_CREATE = 2; /** Set the file's write date and time */ const uint8_t T_WRITE = 4; - - -}; // namespace sdfat - - #endif // FsApiConstants_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDevice.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDevice.h similarity index 84% rename from extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDevice.h rename to extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDevice.h index 2d9e1fc3..e89c5b02 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDevice.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDevice.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,22 +22,12 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#ifndef BlockDevice_h -#define BlockDevice_h +#ifndef FsBlockDevice_h +#define FsBlockDevice_h #include "SdCard/SdCard.h" - - -namespace sdfat { - - #if HAS_SDIO_CLASS || USE_BLOCK_DEVICE_INTERFACE -typedef BlockDeviceInterface BlockDevice; +typedef FsBlockDeviceInterface FsBlockDevice; #else -typedef SdCard BlockDevice; +typedef SdCard FsBlockDevice; #endif - - -}; // namespace sdfat - - -#endif // BlockDevice_h +#endif // FsBlockDevice_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDeviceInterface.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDeviceInterface.h similarity index 84% rename from extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDeviceInterface.h rename to extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDeviceInterface.h index f272e2b3..93913181 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/BlockDeviceInterface.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsBlockDeviceInterface.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,25 +24,28 @@ */ /** * \file - * \brief BlockDeviceInterface include file. + * \brief FsBlockDeviceInterface include file. */ -#ifndef BlockDeviceInterface_h -#define BlockDeviceInterface_h -#include +#ifndef FsBlockDeviceInterface_h +#define FsBlockDeviceInterface_h #include -#include "../SdFatConfig.h" - - -namespace sdfat { - - +#include /** - * \class BlockDeviceInterface - * \brief BlockDeviceInterface class. + * \class FsBlockDeviceInterface + * \brief FsBlockDeviceInterface class. */ -class BlockDeviceInterface { +class FsBlockDeviceInterface { public: - virtual ~BlockDeviceInterface() {} + virtual ~FsBlockDeviceInterface() {} + + /** end use of device */ + virtual void end() {} + /** + * Check for FsBlockDevice busy. + * + * \return true if busy else false. + */ + virtual bool isBusy() = 0; /** * Read a sector. * @@ -51,7 +54,7 @@ class BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readSector(uint32_t sector, uint8_t* dst) = 0; -#if USE_MULTI_SECTOR_IO + /** * Read multiple sectors. * @@ -61,7 +64,7 @@ class BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool readSectors(uint32_t sector, uint8_t* dst, size_t ns) = 0; -#endif // USE_MULTI_SECTOR_IO + /** \return device size in sectors. */ virtual uint32_t sectorCount() = 0; @@ -78,7 +81,7 @@ class BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool writeSector(uint32_t sector, const uint8_t* src) = 0; -#if USE_MULTI_SECTOR_IO + /** * Write multiple sectors. * @@ -88,11 +91,5 @@ class BlockDeviceInterface { * \return true for success or false for failure. */ virtual bool writeSectors(uint32_t sector, const uint8_t* src, size_t ns) = 0; -#endif // USE_MULTI_SECTOR_IO }; - - -}; // namespace sdfat - - -#endif // BlockDeviceInterface_h +#endif // FsBlockDeviceInterface_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.cpp new file mode 100644 index 00000000..031c42ee --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.cpp @@ -0,0 +1,75 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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 DBG_FILE "FsCache.cpp" +#include "FsCache.h" + +#include "DebugMacros.h" +//------------------------------------------------------------------------------ +uint8_t* FsCache::prepare(uint32_t sector, uint8_t option) { + if (!m_blockDev) { + DBG_FAIL_MACRO; + goto fail; + } + if (m_sector != sector) { + if (!sync()) { + DBG_FAIL_MACRO; + goto fail; + } + if (!(option & CACHE_OPTION_NO_READ)) { + if (!m_blockDev->readSector(sector, m_buffer)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_status = 0; + m_sector = sector; + } + m_status |= option & CACHE_STATUS_MASK; + return m_buffer; + +fail: + return nullptr; +} +//------------------------------------------------------------------------------ +bool FsCache::sync() { + if (m_status & CACHE_STATUS_DIRTY) { + if (!m_blockDev->writeSector(m_sector, m_buffer)) { + DBG_FAIL_MACRO; + goto fail; + } + // mirror second FAT + if (m_status & CACHE_STATUS_MIRROR_FAT) { + if (!m_blockDev->writeSector(m_sector + m_mirrorOffset, m_buffer)) { + DBG_FAIL_MACRO; + goto fail; + } + } + m_status &= ~CACHE_STATUS_DIRTY; + } + return true; + +fail: + return false; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.h new file mode 100644 index 00000000..54778012 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsCache.h @@ -0,0 +1,176 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef FsCache_h +#define FsCache_h +/** + * \file + * \brief Common cache code for exFAT and FAT. + */ +#include "FsBlockDevice.h" +#include "SysCall.h" +/** + * \class FsCache + * \brief Sector cache. + */ +class FsCache { + public: + /** Cached sector is dirty */ + static const uint8_t CACHE_STATUS_DIRTY = 1; + /** Cashed sector is FAT entry and must be mirrored in second FAT. */ + static const uint8_t CACHE_STATUS_MIRROR_FAT = 2; + /** Cache sector status bits */ + static const uint8_t CACHE_STATUS_MASK = + CACHE_STATUS_DIRTY | CACHE_STATUS_MIRROR_FAT; + /** Sync existing sector but do not read new sector. */ + static const uint8_t CACHE_OPTION_NO_READ = 4; + /** Cache sector for read. */ + static const uint8_t CACHE_FOR_READ = 0; + /** Cache sector for write. */ + static const uint8_t CACHE_FOR_WRITE = CACHE_STATUS_DIRTY; + /** Reserve cache sector for write - do not read from sector device. */ + static const uint8_t CACHE_RESERVE_FOR_WRITE = + CACHE_STATUS_DIRTY | CACHE_OPTION_NO_READ; + //---------------------------------------------------------------------------- + /** Cobstructor. */ + FsCache() { init(nullptr); } + /** \return Cache buffer address. */ + uint8_t* cacheBuffer() { return m_buffer; } + /** + * Cache safe read of a sector. + * + * \param[in] sector Logical sector to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool cacheSafeRead(uint32_t sector, uint8_t* dst) { + if (isCached(sector)) { + memcpy(dst, m_buffer, 512); + return true; + } + return m_blockDev->readSector(sector, dst); + } + /** + * Cache safe read of multiple sectors. + * + * \param[in] sector Logical sector to be read. + * \param[in] count Number of sectors to be read. + * \param[out] dst Pointer to the location that will receive the data. + * \return true for success or false for failure. + */ + bool cacheSafeRead(uint32_t sector, uint8_t* dst, size_t count) { + if (isCached(sector, count) && !sync()) { + return false; + } + return m_blockDev->readSectors(sector, dst, count); + } + /** + * Cache safe write of a sectors. + * + * \param[in] sector Logical sector to be written. + * \param[in] src Pointer to the location of the data to be written. + * \return true for success or false for failure. + */ + bool cacheSafeWrite(uint32_t sector, const uint8_t* src) { + if (isCached(sector)) { + invalidate(); + } + return m_blockDev->writeSector(sector, src); + } + /** + * Cache safe write of multiple sectors. + * + * \param[in] sector Logical sector to be written. + * \param[in] src Pointer to the location of the data to be written. + * \param[in] count Number of sectors to be written. + * \return true for success or false for failure. + */ + bool cacheSafeWrite(uint32_t sector, const uint8_t* src, size_t count) { + if (isCached(sector, count)) { + invalidate(); + } + return m_blockDev->writeSectors(sector, src, count); + } + /** \return Clear the cache and returns a pointer to the cache. */ + uint8_t* clear() { + if (isDirty() && !sync()) { + return nullptr; + } + invalidate(); + return m_buffer; + } + /** Set current sector dirty. */ + void dirty() { m_status |= CACHE_STATUS_DIRTY; } + /** Initialize the cache. + * \param[in] blockDev Block device for this cache. + */ + void init(FsBlockDevice* blockDev) { + m_blockDev = blockDev; + invalidate(); + } + /** Invalidate current cache sector. */ + void invalidate() { + m_status = 0; + m_sector = 0XFFFFFFFF; + } + /** Check if a sector is in the cache. + * \param[in] sector Sector to checked. + * \return true if the sector is cached. + */ + bool isCached(uint32_t sector) const { return sector == m_sector; } + /** Check if the cache contains a sector from a range. + * \param[in] sector Start sector of the range. + * \param[in] count Number of sectors in the range. + * \return true if a sector in the range is cached. + */ + bool isCached(uint32_t sector, size_t count) { + return sector <= m_sector && m_sector < (sector + count); + } + /** \return dirty status */ + bool isDirty() { return m_status & CACHE_STATUS_DIRTY; } + /** Prepare cache to access sector. + * \param[in] sector Sector to read. + * \param[in] option mode for cached sector. + * \return Address of cached sector. + */ + uint8_t* prepare(uint32_t sector, uint8_t option); + /** \return Logical sector number for cached sector. */ + uint32_t sector() { return m_sector; } + /** Set the offset to the second FAT for mirroring. + * \param[in] offset Sector offset to second FAT. + */ + void setMirrorOffset(uint32_t offset) { m_mirrorOffset = offset; } + /** Write current sector if dirty. + * \return true for success or false for failure. + */ + bool sync(); + + private: + uint8_t m_status; + FsBlockDevice* m_blockDev; + uint32_t m_sector; + uint32_t m_mirrorOffset; + uint8_t m_buffer[512]; +}; +#endif // FsCache_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.cpp index 512314b3..be3736b6 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,13 +22,10 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include "SysCall.h" #include "FsDateTime.h" + #include "FmtNumber.h" - - -namespace sdfat { - +#include "SysCall.h" static void dateTimeMs10(uint16_t* date, uint16_t* time, uint8_t* ms10) { *ms10 = 0; @@ -37,19 +34,17 @@ static void dateTimeMs10(uint16_t* date, uint16_t* time, uint8_t* ms10) { //------------------------------------------------------------------------------ /** Date time callback. */ namespace FsDateTime { - void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10) = nullptr; - void (*callback2)(uint16_t* date, uint16_t* time) = nullptr; - void clearCallback() { - callback = nullptr; - } - void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)) { - callback = dateTimeMs10; - callback2 = dateTime; - } - void setCallback( - void (*dateTime)(uint16_t* date, uint16_t* time, uint8_t* ms10)) { - callback = dateTime; - } +void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10) = nullptr; +void (*callback2)(uint16_t* date, uint16_t* time) = nullptr; +void clearCallback() { callback = nullptr; } +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)) { + callback = dateTimeMs10; + callback2 = dateTime; +} +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time, + uint8_t* ms10)) { + callback = dateTime; +} } // namespace FsDateTime //------------------------------------------------------------------------------ static char* fsFmtField(char* str, uint16_t n, char sep) { @@ -78,15 +73,14 @@ char* fsFmtTime(char* str, uint16_t time) { } //------------------------------------------------------------------------------ char* fsFmtTime(char* str, uint16_t time, uint8_t sec100) { - str = fsFmtField(str, sec100%100, 0); - str = fsFmtField(str, 2*(time & 31) + sec100/100, '.'); + str = fsFmtField(str, 2 * (time & 31) + (sec100 < 100 ? 0 : 1), 0); *--str = ':'; return fsFmtTime(str, time); } //------------------------------------------------------------------------------ char* fsFmtTimeZone(char* str, int8_t tz) { - char sign; if (tz & 0X80) { + char sign; if (tz & 0X40) { sign = '-'; tz = -tz; @@ -95,8 +89,8 @@ char* fsFmtTimeZone(char* str, int8_t tz) { tz &= 0X7F; } if (tz) { - str = fsFmtField(str, 15*(tz%4), 0); - str = fsFmtField(str, tz/4, ':'); + str = fsFmtField(str, 15 * (tz % 4), 0); + str = fsFmtField(str, tz / 4, ':'); *--str = sign; } *--str = 'C'; @@ -108,12 +102,12 @@ char* fsFmtTimeZone(char* str, int8_t tz) { //------------------------------------------------------------------------------ size_t fsPrintDate(print_t* pr, uint16_t date) { // Allow YYYY-MM-DD - char buf[sizeof("YYYY-MM-DD") -1]; + char buf[sizeof("YYYY-MM-DD") - 1]; char* str = buf + sizeof(buf); if (date) { str = fsFmtDate(str, date); } else { - do { + do { *--str = ' '; } while (str > buf); } @@ -122,7 +116,7 @@ size_t fsPrintDate(print_t* pr, uint16_t date) { //------------------------------------------------------------------------------ size_t fsPrintDateTime(print_t* pr, uint16_t date, uint16_t time) { // Allow YYYY-MM-DD hh:mm - char buf[sizeof("YYYY-MM-DD hh:mm") -1]; + char buf[sizeof("YYYY-MM-DD hh:mm") - 1]; char* str = buf + sizeof(buf); if (date) { str = fsFmtTime(str, time); @@ -140,10 +134,10 @@ size_t fsPrintDateTime(print_t* pr, uint32_t dateTime) { return fsPrintDateTime(pr, dateTime >> 16, dateTime & 0XFFFF); } //------------------------------------------------------------------------------ -size_t fsPrintDateTime(print_t* pr, - uint32_t dateTime, uint8_t s100, int8_t tz) { - // Allow YYYY-MM-DD hh:mm:ss.ss UTC+hh:mm - char buf[sizeof("YYYY-MM-DD hh:mm:ss.ss UTC+hh:mm") -1]; +size_t fsPrintDateTime(print_t* pr, uint32_t dateTime, uint8_t s100, + int8_t tz) { + // Allow YYYY-MM-DD hh:mm:ss UTC+hh:mm + char buf[sizeof("YYYY-MM-DD hh:mm:ss UTC+hh:mm") - 1]; char* str = buf + sizeof(buf); if (tz) { str = fsFmtTimeZone(str, tz); @@ -157,15 +151,15 @@ size_t fsPrintDateTime(print_t* pr, //------------------------------------------------------------------------------ size_t fsPrintTime(print_t* pr, uint16_t time) { // Allow hh:mm - char buf[sizeof("hh:mm") -1]; + char buf[sizeof("hh:mm") - 1]; char* str = buf + sizeof(buf); str = fsFmtTime(str, time); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); } //------------------------------------------------------------------------------ size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100) { - // Allow hh:mm:ss.ss - char buf[sizeof("hh:mm:ss.ss") -1]; + // Allow hh:mm:ss + char buf[sizeof("hh:mm:ss") - 1]; char* str = buf + sizeof(buf); str = fsFmtTime(str, time, sec100); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); @@ -173,11 +167,8 @@ size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100) { //------------------------------------------------------------------------------ size_t fsPrintTimeZone(print_t* pr, int8_t tz) { // Allow UTC+hh:mm - char buf[sizeof("UTC+hh:mm") -1]; + char buf[sizeof("UTC+hh:mm") - 1]; char* str = buf + sizeof(buf); str = fsFmtTimeZone(str, tz); return pr->write(reinterpret_cast(str), buf + sizeof(buf) - str); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.h index f489c71b..3080c14b 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsDateTime.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,13 +25,10 @@ #ifndef FsDateTime_h #define FsDateTime_h #include + #include "CompileDateTime.h" #include "SysCall.h" - -namespace sdfat { - - /** Backward compatible definition. */ #define FAT_DATE(y, m, d) FS_DATE(y, m, d) @@ -40,74 +37,74 @@ namespace sdfat { /** Date time callback */ namespace FsDateTime { - /** Date time callback. */ - extern void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10); - /** Date time callback. */ - extern void (*callback2)(uint16_t* date, uint16_t* time); - /** Cancel callback. */ - void clearCallback(); - /** Set the date/time callback function. - * - * \param[in] dateTime The user's call back function. The callback. - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here. - * - * // Return date using FS_DATE macro to format fields. - * *date = FS_DATE(year, month, day); - * - * // Return time using FS_TIME macro to format fields. - * *time = FS_TIME(hour, minute, second); - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - */ - void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)); - /** Set the date/time callback function. - * - * \param[in] dateTime The user's call back function. The callback - * function is of the form: - * - * \code - * void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { - * uint16_t year; - * uint8_t month, day, hour, minute, second; - * - * // User gets date and time from GPS or real-time clock here. - * - * // Return date using FS_DATE macro to format fields - * *date = FS_DATE(year, month, day); - * - * // Return time using FS_TIME macro to format fields - * *time = FS_TIME(hour, minute, second); - * - * // Return tenths of milliseconds since last even second. - * // The granularity of the seconds part of FS_TIME is 2 seconds so - * // this field is a count of tenths of a second and its valid value - * // range is 0-199 inclusive. - * // For a simple RTC return 100*(seconds & 1). - * *ms10 = - * } - * \endcode - * - * Sets the function that is called when a file is created or when - * a file's directory entry is modified by sync(). All timestamps, - * access, creation, and modify, are set when a file is created. - * sync() maintains the last access date and last modify date/time. - * - */ - void setCallback( - void (*dateTime)(uint16_t* date, uint16_t* time, uint8_t* ms10)); +/** Date time callback. */ +extern void (*callback)(uint16_t* date, uint16_t* time, uint8_t* ms10); +/** Date time callback. */ +extern void (*callback2)(uint16_t* date, uint16_t* time); +/** Cancel callback. */ +void clearCallback(); +/** Set the date/time callback function. + * + * \param[in] dateTime The user's call back function. The callback. + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here. + * + * // Return date using FS_DATE macro to format fields. + * *date = FS_DATE(year, month, day); + * + * // Return time using FS_TIME macro to format fields. + * *time = FS_TIME(hour, minute, second); + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + */ +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time)); +/** Set the date/time callback function. + * + * \param[in] dateTime The user's call back function. The callback + * function is of the form: + * + * \code + * void dateTime(uint16_t* date, uint16_t* time, uint8_t* ms10) { + * uint16_t year; + * uint8_t month, day, hour, minute, second; + * + * // User gets date and time from GPS or real-time clock here. + * + * // Return date using FS_DATE macro to format fields + * *date = FS_DATE(year, month, day); + * + * // Return time using FS_TIME macro to format fields + * *time = FS_TIME(hour, minute, second); + * + * // Return the time since the last even second in units of 10 ms. + * // The granularity of the seconds part of FS_TIME is 2 seconds so + * // this field is a count of hundredth of a second and its valid + * // range is 0-199 inclusive. + * // For a simple RTC return 100*(seconds & 1). + * *ms10 = + * } + * \endcode + * + * Sets the function that is called when a file is created or when + * a file's directory entry is modified by sync(). All timestamps, + * access, creation, and modify, are set when a file is created. + * sync() maintains the last access date and last modify date/time. + * + */ +void setCallback(void (*dateTime)(uint16_t* date, uint16_t* time, + uint8_t* ms10)); } // namespace FsDateTime /** date field for directory entry @@ -119,8 +116,8 @@ namespace FsDateTime { */ static inline uint16_t FS_DATE(uint16_t year, uint8_t month, uint8_t day) { year -= 1980; - return year > 127 || month > 12 || day > 31 ? 0 : - year << 9 | month << 5 | day; + return year > 127 || month > 12 || day > 31 ? 0 + : year << 9 | month << 5 | day; } /** year part of FAT directory date field * \param[in] fatDate Date in packed dir format. @@ -143,9 +140,7 @@ static inline uint8_t FS_MONTH(uint16_t fatDate) { * * \return Extracted day [1,31] */ -static inline uint8_t FS_DAY(uint16_t fatDate) { - return fatDate & 0X1F; -} +static inline uint8_t FS_DAY(uint16_t fatDate) { return fatDate & 0X1F; } /** time field for directory entry * \param[in] hour [0,23] * \param[in] minute [0,59] @@ -154,17 +149,16 @@ static inline uint8_t FS_DAY(uint16_t fatDate) { * \return Packed time for directory entry. */ static inline uint16_t FS_TIME(uint8_t hour, uint8_t minute, uint8_t second) { - return hour > 23 || minute > 59 || second > 59 ? 0 : - hour << 11 | minute << 5 | second >> 1; + return hour > 23 || minute > 59 || second > 59 + ? 0 + : hour << 11 | minute << 5 | second >> 1; } /** hour part of FAT directory time field * \param[in] fatTime Time in packed dir format. * * \return Extracted hour [0,23] */ -static inline uint8_t FS_HOUR(uint16_t fatTime) { - return fatTime >> 11; -} +static inline uint8_t FS_HOUR(uint16_t fatTime) { return fatTime >> 11; } /** minute part of FAT directory time field * \param[in] fatTime Time in packed dir format. * @@ -181,7 +175,7 @@ static inline uint8_t FS_MINUTE(uint16_t fatTime) { * \return Extracted second [0,58] */ static inline uint8_t FS_SECOND(uint16_t fatTime) { - return 2*(fatTime & 0X1F); + return 2 * (fatTime & 0X1F); } char* fsFmtDate(char* str, uint16_t date); char* fsFmtTime(char* str, uint16_t time); @@ -194,9 +188,4 @@ size_t fsPrintDateTime(print_t* pr, uint32_t dateTime, uint8_t s100, int8_t tz); size_t fsPrintTime(print_t* pr, uint16_t time); size_t fsPrintTime(print_t* pr, uint16_t time, uint8_t sec100); size_t fsPrintTimeZone(print_t* pr, int8_t tz); - - -}; // namespace sdfat - - #endif // FsDateTime_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.cpp new file mode 100644 index 00000000..d75d642b --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.cpp @@ -0,0 +1,55 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#include "FsName.h" + +#include "FsUtf.h" +#if USE_UTF8_LONG_NAMES +uint16_t FsName::get16() { + uint16_t rtn; + if (ls) { + rtn = ls; + ls = 0; + } else if (next >= end) { + rtn = 0; + } else { + uint32_t cp; + const char* ptr = FsUtf::mbToCp(next, end, &cp); + if (!ptr) { + goto fail; + } + next = ptr; + if (cp <= 0XFFFF) { + rtn = cp; + } else { + ls = FsUtf::lowSurrogate(cp); + rtn = FsUtf::highSurrogate(cp); + } + } + return rtn; + +fail: + return 0XFFFF; +} +#endif // USE_UTF8_LONG_NAMES diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.h new file mode 100644 index 00000000..93753aae --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsName.h @@ -0,0 +1,65 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef FsName_h +#define FsName_h +#include + +#include "SysCall.h" +/** + * \file + * \brief FsName class. + */ +/** + * \class FsName + * \brief Handle UTF-8 file names. + */ +class FsName { + public: + /** Beginning of LFN. */ + const char* begin; + /** Next LFN character of end. */ + const char* next; + /** Position one beyond last LFN character. */ + const char* end; +#if !USE_UTF8_LONG_NAMES + /** \return true if at end. */ + bool atEnd() { return next == end; } + /** Reset to start of LFN. */ + void reset() { next = begin; } + /** \return next char of LFN. */ + char getch() { return atEnd() ? 0 : *next++; } + /** \return next UTF-16 unit of LFN. */ + uint16_t get16() { return atEnd() ? 0 : *next++; } +#else // !USE_UTF8_LONG_NAMES + uint16_t ls = 0; + bool atEnd() { return !ls && next == end; } + void reset() { + next = begin; + ls = 0; // lowSurrogate + } + uint16_t get16(); +#endif // !USE_UTF8_LONG_NAMES +}; +#endif // FsName_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.cpp index fa335d5a..294dbe25 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,11 +23,6 @@ * DEALINGS IN THE SOFTWARE. */ #include "FsStructs.h" - - -namespace sdfat { - - // bgnLba = relSector; // endLba = relSector + partSize - 1; void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba) { @@ -67,6 +62,3 @@ void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba) { chs[1] = ((c >> 2) & 0XC0) | s; chs[2] = c; } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.h index 0a0f0b66..4ea662dd 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsStructs.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -24,15 +24,17 @@ */ #ifndef FsStructs_h #define FsStructs_h +#include #include - - -namespace sdfat { - - -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// See: +// https://learn.microsoft.com/en-us/windows/win32/fileio/file-systems +// https://learn.microsoft.com/en-us/windows/win32/fileio/exfat-specification +// https://download.microsoft.com/download/1/6/1/161ba512-40e2-4cc9-843a-923143f3456c/fatgen103.doc +// https://github.com/MicrosoftDocs/win32/blob/docs/desktop-src/FileIO/exfat-specification.md +//------------------------------------------------------------------------------ void lbaToMbrChs(uint8_t* chs, uint32_t capacityMB, uint32_t lba); -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ #if !defined(USE_SIMPLE_LITTLE_ENDIAN) || USE_SIMPLE_LITTLE_ENDIAN // assumes CPU is little-endian and handles alignment issues. inline uint16_t getLe16(const uint8_t* src) { @@ -47,47 +49,39 @@ inline uint64_t getLe64(const uint8_t* src) { inline void setLe16(uint8_t* dst, uint16_t src) { *reinterpret_cast(dst) = src; } - inline void setLe32(uint8_t* dst, uint32_t src) { *reinterpret_cast(dst) = src; } inline void setLe64(uint8_t* dst, uint64_t src) { *reinterpret_cast(dst) = src; } -#else // USE_SIMPLE_LITTLE_ENDIAN +#else // USE_SIMPLE_LITTLE_ENDIAN inline uint16_t getLe16(const uint8_t* src) { - return (uint16_t)src[0] << 0 | - (uint16_t)src[1] << 8; + return (uint16_t)src[0] << 0 | (uint16_t)src[1] << 8; } inline uint32_t getLe32(const uint8_t* src) { - return (uint32_t)src[0] << 0 | - (uint32_t)src[1] << 8 | - (uint32_t)src[2] << 16 | - (uint32_t)src[3] << 24; + return (uint32_t)src[0] << 0 | (uint32_t)src[1] << 8 | + (uint32_t)src[2] << 16 | (uint32_t)src[3] << 24; } inline uint64_t getLe64(const uint8_t* src) { - return (uint64_t)src[0] << 0 | - (uint64_t)src[1] << 8 | - (uint64_t)src[2] << 16 | - (uint64_t)src[3] << 24 | - (uint64_t)src[4] << 32 | - (uint64_t)src[5] << 40 | - (uint64_t)src[6] << 48 | - (uint64_t)src[7] << 56; + return (uint64_t)src[0] << 0 | (uint64_t)src[1] << 8 | + (uint64_t)src[2] << 16 | (uint64_t)src[3] << 24 | + (uint64_t)src[4] << 32 | (uint64_t)src[5] << 40 | + (uint64_t)src[6] << 48 | (uint64_t)src[7] << 56; } inline void setLe16(uint8_t* dst, uint16_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; } inline void setLe32(uint8_t* dst, uint32_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; dst[2] = src >> 16; dst[3] = src >> 24; } inline void setLe64(uint8_t* dst, uint64_t src) { - dst[0] = src >> 0; - dst[1] = src >> 8; + dst[0] = src >> 0; + dst[1] = src >> 8; dst[2] = src >> 16; dst[3] = src >> 24; dst[4] = src >> 32; @@ -96,7 +90,29 @@ inline void setLe64(uint8_t* dst, uint64_t src) { dst[7] = src >> 56; } #endif // USE_SIMPLE_LITTLE_ENDIAN -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ +// Size of FAT and exFAT directory structures. +const size_t FS_DIR_SIZE = 32; +//------------------------------------------------------------------------------ +// Reserved characters for exFAT names and FAT LFN. +inline bool lfnReservedChar(uint8_t c) { + return c < 0X20 || c == '"' || c == '*' || c == '/' || c == ':' || c == '<' || + c == '>' || c == '?' || c == '\\' || c == '|'; +} +//------------------------------------------------------------------------------ +// Reserved characters for FAT short 8.3 names. +inline bool sfnReservedChar(uint8_t c) { + if (c == '"' || c == '|' || c == '[' || c == '\\' || c == ']') { + return true; + } + // *+,./ or :;<=>? + if ((0X2A <= c && c <= 0X2F && c != 0X2D) || (0X3A <= c && c <= 0X3F)) { + return true; + } + // Reserved if not in range (0X20, 0X7F). + return !(0X20 < c && c < 0X7F); +} +//------------------------------------------------------------------------------ const uint16_t MBR_SIGNATURE = 0xAA55; const uint16_t PBR_SIGNATURE = 0xAA55; @@ -108,96 +124,96 @@ typedef struct mbrPartition { uint8_t relativeSectors[4]; uint8_t totalSectors[4]; } MbrPart_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct masterBootRecordSector { - uint8_t bootCode[446]; + uint8_t bootCode[446]; MbrPart_t part[4]; - uint8_t signature[2]; + uint8_t signature[2]; } MbrSector_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct partitionBootSector { - uint8_t jmpInstruction[3]; - char oemName[8]; - uint8_t bpb[109]; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t jmpInstruction[3]; + char oemName[8]; + uint8_t bpb[109]; + uint8_t bootCode[390]; + uint8_t signature[2]; } pbs_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct { uint8_t type; uint8_t data[31]; } DirGeneric_t; -//============================================================================= +//============================================================================== typedef struct { uint64_t position; uint32_t cluster; } fspos_t; -//============================================================================= +//============================================================================== const uint8_t EXTENDED_BOOT_SIGNATURE = 0X29; typedef struct biosParameterBlockFat16 { - uint8_t bytesPerSector[2]; - uint8_t sectorsPerCluster; - uint8_t reservedSectorCount[2]; - uint8_t fatCount; - uint8_t rootDirEntryCount[2]; - uint8_t totalSectors16[2]; - uint8_t mediaType; - uint8_t sectorsPerFat16[2]; - uint8_t sectorsPerTrtack[2]; - uint8_t headCount[2]; - uint8_t hidddenSectors[4]; - uint8_t totalSectors32[4]; + uint8_t bytesPerSector[2]; + uint8_t sectorsPerCluster; + uint8_t reservedSectorCount[2]; + uint8_t fatCount; + uint8_t rootDirEntryCount[2]; + uint8_t totalSectors16[2]; + uint8_t mediaType; + uint8_t sectorsPerFat16[2]; + uint8_t sectorsPerTrtack[2]; + uint8_t headCount[2]; + uint8_t hidddenSectors[4]; + uint8_t totalSectors32[4]; - uint8_t physicalDriveNumber; - uint8_t extReserved; - uint8_t extSignature; - uint8_t volumeSerialNumber[4]; - uint8_t volumeLabel[11]; - uint8_t volumeType[8]; + uint8_t physicalDriveNumber; + uint8_t extReserved; + uint8_t extSignature; + uint8_t volumeSerialNumber[4]; + uint8_t volumeLabel[11]; + uint8_t volumeType[8]; } BpbFat16_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct biosParameterBlockFat32 { - uint8_t bytesPerSector[2]; - uint8_t sectorsPerCluster; - uint8_t reservedSectorCount[2]; - uint8_t fatCount; - uint8_t rootDirEntryCount[2]; - uint8_t totalSectors16[2]; - uint8_t mediaType; - uint8_t sectorsPerFat16[2]; - uint8_t sectorsPerTrtack[2]; - uint8_t headCount[2]; - uint8_t hidddenSectors[4]; - uint8_t totalSectors32[4]; + uint8_t bytesPerSector[2]; + uint8_t sectorsPerCluster; + uint8_t reservedSectorCount[2]; + uint8_t fatCount; + uint8_t rootDirEntryCount[2]; + uint8_t totalSectors16[2]; + uint8_t mediaType; + uint8_t sectorsPerFat16[2]; + uint8_t sectorsPerTrtack[2]; + uint8_t headCount[2]; + uint8_t hidddenSectors[4]; + uint8_t totalSectors32[4]; - uint8_t sectorsPerFat32[4]; - uint8_t fat32Flags[2]; - uint8_t fat32Version[2]; - uint8_t fat32RootCluster[4]; - uint8_t fat32FSInfoSector[2]; - uint8_t fat32BackBootSector[2]; - uint8_t fat32Reserved[12]; + uint8_t sectorsPerFat32[4]; + uint8_t fat32Flags[2]; + uint8_t fat32Version[2]; + uint8_t fat32RootCluster[4]; + uint8_t fat32FSInfoSector[2]; + uint8_t fat32BackBootSector[2]; + uint8_t fat32Reserved[12]; - uint8_t physicalDriveNumber; - uint8_t extReserved; - uint8_t extSignature; - uint8_t volumeSerialNumber[4]; - uint8_t volumeLabel[11]; - uint8_t volumeType[8]; + uint8_t physicalDriveNumber; + uint8_t extReserved; + uint8_t extSignature; + uint8_t volumeSerialNumber[4]; + uint8_t volumeLabel[11]; + uint8_t volumeType[8]; } BpbFat32_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct partitionBootSectorFat { - uint8_t jmpInstruction[3]; - char oemName[8]; + uint8_t jmpInstruction[3]; + char oemName[8]; union { uint8_t bpb[109]; BpbFat16_t bpb16; BpbFat32_t bpb32; } bpb; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t bootCode[390]; + uint8_t signature[2]; } PbsFat_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint32_t FSINFO_LEAD_SIGNATURE = 0X41615252; const uint32_t FSINFO_STRUCT_SIGNATURE = 0x61417272; const uint32_t FSINFO_TRAIL_SIGNATURE = 0xAA550000; @@ -210,17 +226,25 @@ typedef struct FsInfoSector { uint8_t reserved2[12]; uint8_t trailSignature[4]; } FsInfo_t; -//----------------------------------------------------------------------------- -/** name[0] value for entry that is free after being "deleted" */ -const uint8_t FAT_NAME_DELETED = 0XE5; +//============================================================================== +/** Attributes common to FAT and exFAT */ +const uint8_t FS_ATTRIB_READ_ONLY = 0x01; +const uint8_t FS_ATTRIB_HIDDEN = 0x02; +const uint8_t FS_ATTRIB_SYSTEM = 0x04; +const uint8_t FS_ATTRIB_DIRECTORY = 0x10; +const uint8_t FS_ATTRIB_ARCHIVE = 0x20; +// Attributes that users can change. +const uint8_t FS_ATTRIB_USER_SETTABLE = FS_ATTRIB_READ_ONLY | FS_ATTRIB_HIDDEN | + FS_ATTRIB_SYSTEM | FS_ATTRIB_ARCHIVE; +// Attributes to copy when a file is opened. +const uint8_t FS_ATTRIB_COPY = FS_ATTRIB_USER_SETTABLE | FS_ATTRIB_DIRECTORY; +//============================================================================== /** name[0] value for entry that is free and no allocated entries follow */ const uint8_t FAT_NAME_FREE = 0X00; -const uint8_t FAT_ATTRIB_READ_ONLY = 0x01; -const uint8_t FAT_ATTRIB_HIDDEN = 0x02; -const uint8_t FAT_ATTRIB_SYSTEM = 0x04; -const uint8_t FAT_ATTRIB_LABEL = 0x08; -const uint8_t FAT_ATTRIB_DIRECTORY = 0x10; -const uint8_t FAT_ATTRIB_ARCHIVE = 0x20; +/** name[0] value for entry that is free after being "deleted" */ +const uint8_t FAT_NAME_DELETED = 0XE5; +// Directory attribute of volume label. +const uint8_t FAT_ATTRIB_LABEL = 0x08; const uint8_t FAT_ATTRIB_LONG_NAME = 0X0F; /** Filename base-name is all lower case */ const uint8_t FAT_CASE_LC_BASE = 0X08; @@ -228,56 +252,58 @@ const uint8_t FAT_CASE_LC_BASE = 0X08; const uint8_t FAT_CASE_LC_EXT = 0X10; typedef struct { - uint8_t name[11]; - uint8_t attributes; - uint8_t caseFlags; - uint8_t createTimeMs; - uint8_t createTime[2]; - uint8_t createDate[2]; - uint8_t accessDate[2]; - uint8_t firstClusterHigh[2]; - uint8_t modifyTime[2]; - uint8_t modifyDate[2]; - uint8_t firstClusterLow[2]; - uint8_t fileSize[4]; + uint8_t name[11]; + uint8_t attributes; + uint8_t caseFlags; + uint8_t createTimeMs; + uint8_t createTime[2]; + uint8_t createDate[2]; + uint8_t accessDate[2]; + uint8_t firstClusterHigh[2]; + uint8_t modifyTime[2]; + uint8_t modifyDate[2]; + uint8_t firstClusterLow[2]; + uint8_t fileSize[4]; } DirFat_t; -static inline bool isFileDir(const DirFat_t* dir) { - return (dir->attributes & (FAT_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == 0; +static inline bool isFatFile(const DirFat_t* dir) { + return (dir->attributes & (FS_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == 0; } -static inline bool isFileOrSubdir(const DirFat_t* dir) { +static inline bool isFatFileOrSubdir(const DirFat_t* dir) { return (dir->attributes & FAT_ATTRIB_LABEL) == 0; } -static inline uint8_t isLongName(const DirFat_t* dir) { +static inline uint8_t isFatLongName(const DirFat_t* dir) { return dir->attributes == FAT_ATTRIB_LONG_NAME; } -static inline bool isSubdir(const DirFat_t* dir) { - return (dir->attributes & (FAT_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) - == FAT_ATTRIB_DIRECTORY; +static inline bool isFatSubdir(const DirFat_t* dir) { + return (dir->attributes & (FS_ATTRIB_DIRECTORY | FAT_ATTRIB_LABEL)) == + FS_ATTRIB_DIRECTORY; } -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ /** * Order mask that indicates the entry is the last long dir entry in a * set of long dir entries. All valid sets of long dir entries must * begin with an entry having this mask. */ const uint8_t FAT_ORDER_LAST_LONG_ENTRY = 0X40; +/** Max long file name length */ +const uint8_t FAT_MAX_LFN_LENGTH = 255; typedef struct { - uint8_t order; - uint8_t unicode1[10]; - uint8_t attributes; - uint8_t mustBeZero1; - uint8_t checksum; - uint8_t unicode2[12]; - uint8_t mustBeZero2[2]; - uint8_t unicode3[4]; + uint8_t order; + uint8_t unicode1[10]; + uint8_t attributes; + uint8_t mustBeZero1; + uint8_t checksum; + uint8_t unicode2[12]; + uint8_t mustBeZero2[2]; + uint8_t unicode3[4]; } DirLfn_t; -//============================================================================= +//============================================================================== inline uint32_t exFatChecksum(uint32_t sum, uint8_t data) { return (sum << 31) + (sum >> 1) + data; } -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct biosParameterBlockExFat { uint8_t mustBeZero[53]; uint8_t partitionOffset[8]; @@ -297,98 +323,93 @@ typedef struct biosParameterBlockExFat { uint8_t percentInUse; uint8_t reserved[7]; } BpbExFat_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ typedef struct ExFatBootSector { - uint8_t jmpInstruction[3]; - char oemName[8]; - BpbExFat_t bpb; - uint8_t bootCode[390]; - uint8_t signature[2]; + uint8_t jmpInstruction[3]; + char oemName[8]; + BpbExFat_t bpb; + uint8_t bootCode[390]; + uint8_t signature[2]; } ExFatPbs_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint32_t EXFAT_EOC = 0XFFFFFFFF; const uint8_t EXFAT_TYPE_BITMAP = 0X81; typedef struct { - uint8_t type; - uint8_t flags; - uint8_t reserved[18]; - uint8_t firstCluster[4]; - uint8_t size[8]; + uint8_t type; + uint8_t flags; + uint8_t reserved[18]; + uint8_t firstCluster[4]; + uint8_t size[8]; } DirBitmap_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint8_t EXFAT_TYPE_UPCASE = 0X82; typedef struct { - uint8_t type; - uint8_t reserved1[3]; - uint8_t checksum[4]; - uint8_t reserved2[12]; - uint8_t firstCluster[4]; - uint8_t size[8]; + uint8_t type; + uint8_t reserved1[3]; + uint8_t checksum[4]; + uint8_t reserved2[12]; + uint8_t firstCluster[4]; + uint8_t size[8]; } DirUpcase_t; -//----------------------------------------------------------------------------- +//------------------------------------------------------------------------------ const uint8_t EXFAT_TYPE_LABEL = 0X83; typedef struct { - uint8_t type; - uint8_t labelLength; - uint8_t unicode[22]; - uint8_t reserved[8]; + uint8_t type; + uint8_t labelLength; + uint8_t unicode[22]; + uint8_t reserved[8]; } DirLabel_t; -//----------------------------------------------------------------------------- -const uint8_t EXFAT_TYPE_FILE = 0X85; -const uint8_t EXFAT_ATTRIB_READ_ONLY = 0x01; -const uint8_t EXFAT_ATTRIB_HIDDEN = 0x02; -const uint8_t EXFAT_ATTRIB_SYSTEM = 0x04; -const uint8_t EXFAT_ATTRIB_RESERVED = 0x08; -const uint8_t EXFAT_ATTRIB_DIRECTORY = 0x10; -const uint8_t EXFAT_ATTRIB_ARCHIVE = 0x20; +//------------------------------------------------------------------------------ +// Last entry in directory. +const uint8_t EXFAT_TYPE_END_DIR = 0X00; +// Entry is used if bit is set. +const uint8_t EXFAT_TYPE_USED = 0X80; +const uint8_t EXFAT_TYPE_FILE = 0X85; +// File attribute reserved since used for FAT volume label. +const uint8_t EXFAT_ATTRIB_RESERVED = 0x08; typedef struct { - uint8_t type; - uint8_t setCount; - uint8_t setChecksum[2]; - uint8_t attributes[2]; - uint8_t reserved1[2]; - uint8_t createTime[2]; - uint8_t createDate[2]; - uint8_t modifyTime[2]; - uint8_t modifyDate[2]; - uint8_t accessTime[2]; - uint8_t accessDate[2]; - uint8_t createTimeMs; - uint8_t modifyTimeMs; - uint8_t createTimezone; - uint8_t modifyTimezone; - uint8_t accessTimezone; - uint8_t reserved2[7]; + uint8_t type; + uint8_t setCount; + uint8_t setChecksum[2]; + uint8_t attributes[2]; + uint8_t reserved1[2]; + uint8_t createTime[2]; + uint8_t createDate[2]; + uint8_t modifyTime[2]; + uint8_t modifyDate[2]; + uint8_t accessTime[2]; + uint8_t accessDate[2]; + uint8_t createTimeMs; + uint8_t modifyTimeMs; + uint8_t createTimezone; + uint8_t modifyTimezone; + uint8_t accessTimezone; + uint8_t reserved2[7]; } DirFile_t; -const uint8_t EXFAT_TYPE_STREAM = 0XC0; -const uint8_t EXFAT_FLAG_ALWAYS1 = 0x01; +const uint8_t EXFAT_TYPE_STREAM = 0XC0; +const uint8_t EXFAT_FLAG_ALWAYS1 = 0x01; const uint8_t EXFAT_FLAG_CONTIGUOUS = 0x02; typedef struct { - uint8_t type; - uint8_t flags; - uint8_t reserved1; - uint8_t nameLength; - uint8_t nameHash[2]; - uint8_t reserved2[2]; - uint8_t validLength[8]; - uint8_t reserved3[4]; - uint8_t firstCluster[4]; - uint8_t dataLength[8]; + uint8_t type; + uint8_t flags; + uint8_t reserved1; + uint8_t nameLength; + uint8_t nameHash[2]; + uint8_t reserved2[2]; + uint8_t validLength[8]; + uint8_t reserved3[4]; + uint8_t firstCluster[4]; + uint8_t dataLength[8]; } DirStream_t; const uint8_t EXFAT_TYPE_NAME = 0XC1; const uint8_t EXFAT_MAX_NAME_LENGTH = 255; typedef struct { - uint8_t type; - uint8_t mustBeZero; - uint8_t unicode[30]; + uint8_t type; + uint8_t mustBeZero; + uint8_t unicode[30]; } DirName_t; - - -}; // namespace sdfat - - #endif // FsStructs_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.cpp new file mode 100644 index 00000000..7b7ef143 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.cpp @@ -0,0 +1,114 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#include "FsUtf.h" +namespace FsUtf { +//---------------------------------------------------------------------------- +char* cpToMb(uint32_t cp, char* str, const char* end) { + size_t n = end - str; + if (cp < 0X80) { + if (n < 1) goto fail; + *(str++) = static_cast(cp); + } else if (cp < 0X800) { + if (n < 2) goto fail; + *(str++) = static_cast((cp >> 6) | 0XC0); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } else if (cp < 0X10000) { + if (n < 3) goto fail; + *(str++) = static_cast((cp >> 12) | 0XE0); + *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } else { + if (n < 4) goto fail; + *(str++) = static_cast((cp >> 18) | 0XF0); + *(str++) = static_cast(((cp >> 12) & 0X3F) | 0X80); + *(str++) = static_cast(((cp >> 6) & 0X3F) | 0X80); + *(str++) = static_cast((cp & 0X3F) | 0X80); + } + return str; + +fail: + return nullptr; +} +//---------------------------------------------------------------------------- +// to do? improve error check +const char* mbToCp(const char* str, const char* end, uint32_t* rtn) { + size_t n; + uint32_t cp; + if (str >= end) { + return nullptr; + } + uint8_t ch = str[0]; + if ((ch & 0X80) == 0) { + *rtn = ch; + return str + 1; + } + if ((ch & 0XE0) == 0XC0) { + cp = ch & 0X1F; + n = 2; + } else if ((ch & 0XF0) == 0XE0) { + cp = ch & 0X0F; + n = 3; + } else if ((ch & 0XF8) == 0XF0) { + cp = ch & 0X07; + n = 4; + } else { + return nullptr; + } + if ((str + n) > end) { + return nullptr; + } + for (size_t i = 1; i < n; i++) { + ch = str[i]; + if ((ch & 0XC0) != 0X80) { + return nullptr; + } + cp <<= 6; + cp |= ch & 0X3F; + } + // Don't allow over long as ASCII. + if (cp < 0X80 || !isValidCp(cp)) { + return nullptr; + } + *rtn = cp; + return str + n; +} +//---------------------------------------------------------------------------- +const char* mbToU16(const char* str, const char* end, uint16_t* hs, + uint16_t* ls) { + uint32_t cp; + const char* ptr = mbToCp(str, end, &cp); + if (!ptr) { + return nullptr; + } + if (cp <= 0XFFFF) { + *hs = cp; + *ls = 0; + } else { + *hs = highSurrogate(cp); + *ls = lowSurrogate(cp); + } + return ptr; +} +} // namespace FsUtf diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.h new file mode 100644 index 00000000..8d4e9701 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/FsUtf.h @@ -0,0 +1,101 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#ifndef FsUtf_h +#define FsUtf_h +/** + * \file + * \brief Unicode Transformation Format functions. + */ +#include +#include +namespace FsUtf { +/** High surrogate for a code point. + * \param{in} cp code point. + * \return high surrogate. + */ +inline uint16_t highSurrogate(uint32_t cp) { + return (cp >> 10) + (0XD800 - (0X10000 >> 10)); +} +/** Low surrogate for a code point. + * \param{in} cp code point. + * \return low surrogate. + */ +inline uint16_t lowSurrogate(uint32_t cp) { return (cp & 0X3FF) + 0XDC00; } +/** Check for a valid code point. + * \param[in] cp code point. + * \return true if valid else false. + */ +inline bool isValidCp(uint32_t cp) { + return cp <= 0x10FFFF && (cp < 0XD800 || cp > 0XDFFF); +} +/** Check for UTF-16 surrogate. + * \param[in] c UTF-16 unit. + * \return true if c is a surrogate else false. + */ +inline bool isSurrogate(uint16_t c) { return 0XD800 <= c && c <= 0XDFFF; } +/** Check for UTF-16 high surrogate. + * \param[in] c UTF-16 unit.. + * \return true if c is a high surrogate else false. + */ +inline bool isHighSurrogate(uint16_t c) { return 0XD800 <= c && c <= 0XDBFF; } +/** Check for UTF-16 low surrogate. + * \param[in] c UTF-16 unit.. + * \return true if c is a low surrogate else false. + */ +inline bool isLowSurrogate(uint16_t c) { return 0XDC00 <= c && c <= 0XDFFF; } +/** Convert UFT-16 surrogate pair to code point. + * \param[in] hs high surrogate. + * \param[in] ls low surrogate. + * \return code point. + */ +inline uint32_t u16ToCp(uint16_t hs, uint16_t ls) { + return 0X10000 + (((hs & 0X3FF) << 10) | (ls & 0X3FF)); +} +/** Encodes a 32 bit code point as a UTF-8 sequence. + * \param[in] cp code point to encode. + * \param[out] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * \return location one beyond last encoded character. + */ +char* cpToMb(uint32_t cp, char* str, const char* end); +/** Get next code point from a UTF-8 sequence. + * \param[in] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * May be nullptr if str is zero terminated. + * \param[out] rtn location for the code point. + * \return location of next UTF-8 character in str of nullptr for error. + */ +const char* mbToCp(const char* str, const char* end, uint32_t* rtn); +/** Get next code point from a UTF-8 sequence as UTF-16. + * \param[in] str location for UTF-8 sequence. + * \param[in] end location following last character of str. + * \param[out] hs location for the code point or high surrogate. + * \param[out] ls location for zero or high surrogate. + * \return location of next UTF-8 character in str of nullptr for error. + */ +const char* mbToU16(const char* str, const char* end, uint16_t* hs, + uint16_t* ls); +} // namespace FsUtf +#endif // FsUtf_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.h deleted file mode 100644 index 65342534..00000000 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/PrintBasic.h +++ /dev/null @@ -1,186 +0,0 @@ -/** - * Copyright (c) 2011-2020 Bill Greiman - * This file is part of the SdFat library for SD memory cards. - * - * MIT License - * - * 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. - */ -#ifndef PrintBasic_h -#define PrintBasic_h -/** - * \file - * \brief Stream/Print like replacement for non-Arduino systems. - */ -#include -#include -#include - - -namespace sdfat { - - -class __FlashStringHelper; - - -}; // namespace sdfat - - -#ifdef F -//#warning F() macro defined for non Arduino System -#elif defined(__AVR__) -#include -#define F(str) (reinterpret_cast(PSTR(str))) -#else // F -#define F(str) (str) -#endif // F - -#ifdef BIN -#undef BIN -#endif // BIN -#define BIN 2 -#define OCT 8 -#define DEC 10 -#define HEX 16 - - -namespace sdfat { - - -class PrintBasic { - public: - PrintBasic() : m_error(0) {} - - void clearWriteError() { - setWriteError(0); - } - int getWriteError() { - return m_error; - } - size_t print(char c) { - return write(c); - } - size_t print(const char* str) { - return write(str); - } - size_t print(const __FlashStringHelper *str) { -#ifdef __AVR__ - PGM_P p = reinterpret_cast(str); - size_t n = 0; - for (uint8_t c; (c = pgm_read_byte(p + n)) && write(c); n++) {} - return n; -#else // __AVR__ - return print(reinterpret_cast(str)); -#endif // __AVR__ - } - size_t println(const __FlashStringHelper *str) { -#ifdef __AVR__ - return print(str) + println(); -#else // __AVR__ - return println(reinterpret_cast(str)); -#endif // __AVR__ - } - size_t print(double n, uint8_t prec = 2) { - return printDouble(n, prec); - } - size_t print(signed char n, uint8_t base = 10) { - return print((long)n, base); - } - size_t print(unsigned char n, uint8_t base = 10) { - return print((unsigned long)n, base); - } - size_t print(int n, uint8_t base = 10) { - return print((long)n, base); - } - size_t print(unsigned int n, uint8_t base = 10) { - return print((unsigned long)n, base); - } - size_t print(long n, uint8_t base = 10); - size_t print(unsigned long n, uint8_t base = 10) { - return printNum(n, base); - } - size_t println() { - return write("\r\n"); - } - size_t println(char c) { - return write(c) + println(); - } - size_t println(const char* str) { - return print(str) + println(); - } - size_t println(double n, uint8_t prec = 2) { - return print(n, prec) + println(); - } - size_t println(signed char n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t println(unsigned char n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t println(int n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t println(unsigned int n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t println(long n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t println(unsigned long n, uint8_t base = 10) { - return print(n, base) + println(); - } - size_t write(const char *str) { - return write(str, strlen(str)); - } - virtual size_t write(uint8_t b) = 0; - - virtual size_t write(const uint8_t* buffer, size_t size) { - size_t i; - for (i = 0; i < size; i++) { - if (!write(buffer[i])) break; - } - return i; - } - size_t write(const char *buffer, size_t size) { - return write((const uint8_t*)buffer, size); - } - - protected: - void setWriteError(int err = 1) { - m_error = err; - } - - private: - size_t printDouble(double n, uint8_t prec); - size_t printNum(unsigned long n, uint8_t base); - int m_error; -}; -//------------------------------------------------------------------------------ -class StreamBasic : public PrintBasic { - public: - virtual int available() = 0; - virtual int peek() = 0; - virtual int read() = 0; -}; - - -}; // namespace sdfat - - -#endif // PrintBasic_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCall.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCall.h index a2026fa0..709dfae1 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCall.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/SysCall.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,40 +28,16 @@ */ #ifndef SysCall_h #define SysCall_h -#include #include +#include + #include "../SdFatConfig.h" - - -namespace sdfat { - - #if __cplusplus < 201103 #warning nullptr defined /** Define nullptr if not C++11 */ #define nullptr NULL #endif // __cplusplus < 201103 //------------------------------------------------------------------------------ -/** Type for millis. */ -typedef uint16_t SdMillis_t; -//------------------------------------------------------------------------------ -/** - * \class SysCall - * \brief SysCall - Class to wrap system calls. - */ -class SysCall { - public: - /** \return the time in milliseconds. */ - static SdMillis_t curTimeMS(); - /** Halt execution of this thread. */ - static void halt() { - while (1) { - yield(); - } - } - /** Yield to other threads. */ - static void yield(); -}; #if ENABLE_ARDUINO_FEATURES #if defined(ARDUINO) /** Use Arduino Print. */ @@ -77,44 +53,11 @@ typedef Stream stream_t; #define F(str) (str) #endif // F //------------------------------------------------------------------------------ -/** \return the time in milliseconds. */ -inline SdMillis_t SysCall::curTimeMS() { - return millis(); -} -//------------------------------------------------------------------------------ -#if defined(PLATFORM_ID) // Only defined if a Particle device -inline void SysCall::yield() { - // Recommended to only call Particle.process() if system threading is disabled - if (system_thread_get_state(NULL) == spark::feature::DISABLED) { - Particle.process(); - } -} -#elif defined(ARDUINO) -inline void SysCall::yield() { - // Use the external Arduino yield() function. -#if defined(ESP8266) - // SdFat uses `SysCall::yield()` from within OS callbacks, a no-no. - // Use delay(0) instead, which is safe under all circumstances - ::delay(0); -#else - ::yield(); -#endif -} -#else // defined(PLATFORM_ID) -inline void SysCall::yield() {} -#endif // defined(PLATFORM_ID) -//------------------------------------------------------------------------------ #else // ENABLE_ARDUINO_FEATURES #include "PrintBasic.h" /** If not Arduino */ typedef PrintBasic print_t; /** If not Arduino */ typedef PrintBasic stream_t; -inline void SysCall::yield() {} #endif // ENABLE_ARDUINO_FEATURES - - -}; // namespace sdfat - - #endif // SysCall_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.cpp new file mode 100644 index 00000000..fb1e2175 --- /dev/null +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.cpp @@ -0,0 +1,133 @@ +/** + * Copyright (c) 2011-2022 Bill Greiman + * This file is part of the SdFat library for SD memory cards. + * + * MIT License + * + * 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. + */ +#include "upcase.h" + +#include +#ifdef __AVR__ +#include +#define TABLE_MEM PROGMEM +#define readTable8(sym) pgm_read_byte(&sym) +#define readTable16(sym) pgm_read_word(&sym) +#else // __AVR__ +#define TABLE_MEM +#define readTable8(sym) (sym) +#define readTable16(sym) (sym) +#endif // __AVR__ + +struct map16 { + uint16_t base; + int8_t off; + uint8_t count; +}; +typedef struct map16 map16_t; + +struct pair16 { + uint16_t key; + uint16_t val; +}; +typedef struct pair16 pair16_t; +//------------------------------------------------------------------------------ +static const map16_t mapTable[] TABLE_MEM = { + {0X0061, -32, 26}, {0X00E0, -32, 23}, {0X00F8, -32, 7}, {0X0100, 1, 48}, + {0X0132, 1, 6}, {0X0139, 1, 16}, {0X014A, 1, 46}, {0X0179, 1, 6}, + {0X0182, 1, 4}, {0X01A0, 1, 6}, {0X01B3, 1, 4}, {0X01CD, 1, 16}, + {0X01DE, 1, 18}, {0X01F8, 1, 40}, {0X0222, 1, 18}, {0X0246, 1, 10}, + {0X03AD, -37, 3}, {0X03B1, -32, 17}, {0X03C3, -32, 9}, {0X03D8, 1, 24}, + {0X0430, -32, 32}, {0X0450, -80, 16}, {0X0460, 1, 34}, {0X048A, 1, 54}, + {0X04C1, 1, 14}, {0X04D0, 1, 68}, {0X0561, -48, 38}, {0X1E00, 1, 150}, + {0X1EA0, 1, 90}, {0X1F00, 8, 8}, {0X1F10, 8, 6}, {0X1F20, 8, 8}, + {0X1F30, 8, 8}, {0X1F40, 8, 6}, {0X1F60, 8, 8}, {0X1F70, 74, 2}, + {0X1F72, 86, 4}, {0X1F76, 100, 2}, {0X1F7A, 112, 2}, {0X1F7C, 126, 2}, + {0X1F80, 8, 8}, {0X1F90, 8, 8}, {0X1FA0, 8, 8}, {0X1FB0, 8, 2}, + {0X1FD0, 8, 2}, {0X1FE0, 8, 2}, {0X2170, -16, 16}, {0X24D0, -26, 26}, + {0X2C30, -48, 47}, {0X2C67, 1, 6}, {0X2C80, 1, 100}, {0X2D00, 0, 38}, + {0XFF41, -32, 26}, +}; +const size_t MAP_DIM = sizeof(mapTable) / sizeof(map16_t); +//------------------------------------------------------------------------------ +static const pair16_t lookupTable[] TABLE_MEM = { + {0X00FF, 0X0178}, {0X0180, 0X0243}, {0X0188, 0X0187}, {0X018C, 0X018B}, + {0X0192, 0X0191}, {0X0195, 0X01F6}, {0X0199, 0X0198}, {0X019A, 0X023D}, + {0X019E, 0X0220}, {0X01A8, 0X01A7}, {0X01AD, 0X01AC}, {0X01B0, 0X01AF}, + {0X01B9, 0X01B8}, {0X01BD, 0X01BC}, {0X01BF, 0X01F7}, {0X01C6, 0X01C4}, + {0X01C9, 0X01C7}, {0X01CC, 0X01CA}, {0X01DD, 0X018E}, {0X01F3, 0X01F1}, + {0X01F5, 0X01F4}, {0X023A, 0X2C65}, {0X023C, 0X023B}, {0X023E, 0X2C66}, + {0X0242, 0X0241}, {0X0253, 0X0181}, {0X0254, 0X0186}, {0X0256, 0X0189}, + {0X0257, 0X018A}, {0X0259, 0X018F}, {0X025B, 0X0190}, {0X0260, 0X0193}, + {0X0263, 0X0194}, {0X0268, 0X0197}, {0X0269, 0X0196}, {0X026B, 0X2C62}, + {0X026F, 0X019C}, {0X0272, 0X019D}, {0X0275, 0X019F}, {0X027D, 0X2C64}, + {0X0280, 0X01A6}, {0X0283, 0X01A9}, {0X0288, 0X01AE}, {0X0289, 0X0244}, + {0X028A, 0X01B1}, {0X028B, 0X01B2}, {0X028C, 0X0245}, {0X0292, 0X01B7}, + {0X037B, 0X03FD}, {0X037C, 0X03FE}, {0X037D, 0X03FF}, {0X03AC, 0X0386}, + {0X03C2, 0X03A3}, {0X03CC, 0X038C}, {0X03CD, 0X038E}, {0X03CE, 0X038F}, + {0X03F2, 0X03F9}, {0X03F8, 0X03F7}, {0X03FB, 0X03FA}, {0X04CF, 0X04C0}, + {0X1D7D, 0X2C63}, {0X1F51, 0X1F59}, {0X1F53, 0X1F5B}, {0X1F55, 0X1F5D}, + {0X1F57, 0X1F5F}, {0X1F78, 0X1FF8}, {0X1F79, 0X1FF9}, {0X1FB3, 0X1FBC}, + {0X1FCC, 0X1FC3}, {0X1FE5, 0X1FEC}, {0X1FFC, 0X1FF3}, {0X214E, 0X2132}, + {0X2184, 0X2183}, {0X2C61, 0X2C60}, {0X2C76, 0X2C75}, +}; +const size_t LOOKUP_DIM = sizeof(lookupTable) / sizeof(pair16_t); +//------------------------------------------------------------------------------ +static size_t searchPair16(const pair16_t* table, size_t size, uint16_t key) { + size_t left = 0; + size_t right = size; + while (right - left > 1) { + size_t mid = left + (right - left) / 2; + if (readTable16(table[mid].key) <= key) { + left = mid; + } else { + right = mid; + } + } + return left; +} +//------------------------------------------------------------------------------ +uint16_t toUpcase(uint16_t chr) { + uint16_t i, first; + // Optimize for simple ASCII. + if (chr < 127) { + return chr - ('a' <= chr && chr <= 'z' ? 'a' - 'A' : 0); + } + i = searchPair16(reinterpret_cast(mapTable), MAP_DIM, chr); + first = readTable16(mapTable[i].base); + if (first <= chr && (chr - first) < readTable8(mapTable[i].count)) { + int8_t off = readTable8(mapTable[i].off); + if (off == 1) { + return chr - ((chr - first) & 1); + } + return chr + (off ? off : -0x1C60); + } + i = searchPair16(lookupTable, LOOKUP_DIM, chr); + if (readTable16(lookupTable[i].key) == chr) { + return readTable16(lookupTable[i].val); + } + return chr; +} +//------------------------------------------------------------------------------ +uint32_t upcaseChecksum(uint16_t uc, uint32_t sum) { + sum = (sum << 31) + (sum >> 1) + (uc & 0XFF); + sum = (sum << 31) + (sum >> 1) + (uc >> 8); + return sum; +} diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLibConfig.h b/extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.h similarity index 84% rename from extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLibConfig.h rename to extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.h index 08f7966f..1a8ece9a 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/FatLib/FatLibConfig.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/common/upcase.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,11 +22,9 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -/** - * \file - * \brief configuration definitions - */ -#ifndef FatLibConfig_h -#define FatLibConfig_h -#include "SdFatConfig.h" -#endif // FatLibConfig_h +#ifndef upcase_h +#define upcase_h +#include +uint16_t toUpcase(uint16_t chr); +uint32_t upcaseChecksum(uint16_t unicode, uint32_t checksum); +#endif // upcase_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ArduinoStream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ArduinoStream.h index fbb09ea6..8dfc3225 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ArduinoStream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ArduinoStream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -28,13 +28,7 @@ * \file * \brief ArduinoInStream and ArduinoOutStream classes */ -#include "SdFatConfig.h" #include "bufstream.h" - - -namespace sdfat { - - //============================================================================== /** * \class ArduinoInStream @@ -48,7 +42,7 @@ class ArduinoInStream : public ibufstream { * \param[in] buf buffer for input line * \param[in] size size of input buffer */ - ArduinoInStream(Stream &hws, char* buf, size_t size) { + ArduinoInStream(Stream& hws, char* buf, size_t size) { m_hw = &hws; m_line = buf; m_size = size; @@ -59,7 +53,7 @@ class ArduinoInStream : public ibufstream { uint32_t t; m_line[0] = '\0'; while (!m_hw->available()) { - SysCall::yield(); + yield(); } while (1) { @@ -76,7 +70,7 @@ class ArduinoInStream : public ibufstream { m_line[i++] = m_hw->read(); m_line[i] = '\0'; } -done: + done: init(m_line); } @@ -101,7 +95,7 @@ done: } private: - char *m_line; + char* m_line; size_t m_size; Stream* m_hw; }; @@ -116,7 +110,7 @@ class ArduinoOutStream : public ostream { * * \param[in] pr Print object for this ArduinoOutStream. */ - explicit ArduinoOutStream(Print& pr) : m_pr(&pr) {} + explicit ArduinoOutStream(print_t& pr) : m_pr(&pr) {} protected: /// @cond SHOW_PROTECTED @@ -130,9 +124,7 @@ class ArduinoOutStream : public ostream { } m_pr->write(c); } - void putstr(const char* str) { - m_pr->write(str); - } + void putstr(const char* str) { m_pr->write(str); } bool seekoff(off_type off, seekdir way) { (void)off; (void)way; @@ -142,20 +134,11 @@ class ArduinoOutStream : public ostream { (void)pos; return false; } - bool sync() { - return true; - } - pos_type tellpos() { - return 0; - } + bool sync() { return true; } + pos_type tellpos() { return 0; } /// @endcond private: ArduinoOutStream() {} - Print* m_pr; + print_t* m_pr; }; - - -}; // namespace sdfat - - #endif // ArduinoStream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.cpp index bc9a7e75..1433e3d7 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,12 +23,10 @@ * DEALINGS IN THE SOFTWARE. */ #include "StdioStream.h" +#ifdef __AVR__ +#include +#endif // __AVR__ #include "../common/FmtNumber.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ int StdioStream::fclose() { int rtn = 0; @@ -60,11 +58,11 @@ int StdioStream::fflush() { //------------------------------------------------------------------------------ char* StdioStream::fgets(char* str, size_t num, size_t* len) { char* s = str; - size_t n; if (num-- == 0) { return 0; } while (num) { + size_t n; if ((n = m_r) == 0) { if (!fillBuf()) { if (s == str) { @@ -103,43 +101,43 @@ bool StdioStream::fopen(const char* path, const char* mode) { oflag_t oflag; uint8_t m; switch (*mode++) { - case 'a': - m = O_WRONLY; - oflag = O_CREAT | O_APPEND; - m_status = S_SWR; - break; - - case 'r': - m = O_RDONLY; - oflag = 0; - m_status = S_SRD; - break; - - case 'w': - m = O_WRONLY; - oflag = O_CREAT | O_TRUNC; - m_status = S_SWR; - break; - - default: - goto fail; - } - while (*mode) { - switch (*mode++) { - case '+': - m_status = S_SRW; - m = O_RDWR; + case 'a': + m = O_WRONLY; + oflag = O_CREAT | O_APPEND; + m_status = S_SWR; break; - case 'b': + case 'r': + m = O_RDONLY; + oflag = 0; + m_status = S_SRD; break; - case 'x': - oflag |= O_EXCL; + case 'w': + m = O_WRONLY; + oflag = O_CREAT | O_TRUNC; + m_status = S_SWR; break; default: goto fail; + } + while (*mode) { + switch (*mode++) { + case '+': + m_status = S_SRW; + m = O_RDWR; + break; + + case 'b': + break; + + case 'x': + oflag |= O_EXCL; + break; + + default: + goto fail; } } oflag |= m; @@ -151,7 +149,7 @@ bool StdioStream::fopen(const char* path, const char* mode) { m_p = m_buf; return true; - fail: +fail: m_status = 0; return false; } @@ -163,7 +161,7 @@ int StdioStream::fputs(const char* str) { //------------------------------------------------------------------------------ size_t StdioStream::fread(void* ptr, size_t size, size_t count) { uint8_t* dst = reinterpret_cast(ptr); - size_t total = size*count; + size_t total = size * count; if (total == 0) { return 0; } @@ -174,7 +172,7 @@ size_t StdioStream::fread(void* ptr, size_t size, size_t count) { m_p += m_r; need -= m_r; if (!fillBuf()) { - return (total - need)/size; + return (total - need) / size; } } memcpy(dst, m_p, need); @@ -191,37 +189,40 @@ int StdioStream::fseek(int32_t offset, int origin) { } } switch (origin) { - case SEEK_CUR: - pos = ftell(); - if (pos < 0) { - goto fail; - } - pos += offset; - if (!StreamBaseFile::seekCur(pos)) { - goto fail; - } - break; + case SEEK_CUR: + pos = ftell(); + if (pos < 0) { + goto fail; + } + pos += offset; + if (!StreamBaseFile::seekCur(pos)) { + goto fail; + } + break; - case SEEK_SET: - if (!StreamBaseFile::seekSet(offset)) { - goto fail; - } - break; + case SEEK_SET: + if (offset < 0) { + goto fail; + } + if (!StreamBaseFile::seekSet((uint32_t)offset)) { + goto fail; + } + break; - case SEEK_END: - if (!StreamBaseFile::seekEnd(offset)) { - goto fail; - } - break; + case SEEK_END: + if (!StreamBaseFile::seekEnd(offset)) { + goto fail; + } + break; - default: - goto fail; + default: + goto fail; } m_r = 0; m_p = m_buf; return 0; - fail: +fail: return EOF; } //------------------------------------------------------------------------------ @@ -239,7 +240,7 @@ int32_t StdioStream::ftell() { } //------------------------------------------------------------------------------ size_t StdioStream::fwrite(const void* ptr, size_t size, size_t count) { - return write(ptr, count*size) < 0 ? EOF : count; + return write(ptr, count * size) < 0 ? EOF : count; } //------------------------------------------------------------------------------ int StdioStream::write(const void* buf, size_t count) { @@ -262,8 +263,9 @@ int StdioStream::write(const void* buf, size_t count) { } //------------------------------------------------------------------------------ #if (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) -size_t StdioStream::print(const __FlashStringHelper *str) { - const char *p = (const char*)str; +size_t StdioStream::print(const __FlashStringHelper* str) { +#ifdef __AVR__ + PGM_P p = reinterpret_cast(str); uint8_t c; while ((c = pgm_read_byte(p))) { if (putc(c) < 0) { @@ -271,13 +273,16 @@ size_t StdioStream::print(const __FlashStringHelper *str) { } p++; } - return p - (const char*)str; + return p - reinterpret_cast(str); +#else // __AVR__ + return print(reinterpret_cast(str)); +#endif // __AVR__ } #endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) //------------------------------------------------------------------------------ int StdioStream::printDec(float value, uint8_t prec) { char buf[24]; - char *ptr = fmtDouble(buf + sizeof(buf), value, prec, false); + char* ptr = fmtDouble(buf + sizeof(buf), value, prec, false); return write(ptr, buf + sizeof(buf) - ptr); } //------------------------------------------------------------------------------ @@ -309,7 +314,7 @@ int StdioStream::printDec(int16_t n) { //------------------------------------------------------------------------------ int StdioStream::printDec(uint16_t n) { char buf[5]; - char *ptr = fmtBase10(buf + sizeof(buf), n); + char* ptr = fmtBase10(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } @@ -329,14 +334,14 @@ int StdioStream::printDec(int32_t n) { //------------------------------------------------------------------------------ int StdioStream::printDec(uint32_t n) { char buf[10]; - char *ptr = fmtBase10(buf + sizeof(buf), n); + char* ptr = fmtBase10(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } //------------------------------------------------------------------------------ int StdioStream::printHex(uint32_t n) { char buf[8]; - char *ptr = fmtHex(buf + sizeof(buf), n); + char* ptr = fmtHex(buf + sizeof(buf), n); uint8_t len = buf + sizeof(buf) - ptr; return write(ptr, len); } @@ -347,7 +352,7 @@ bool StdioStream::rewind() { return false; } } - StreamBaseFile::seekSet(0); + StreamBaseFile::seekSet(0UL); m_r = 0; return true; } @@ -382,8 +387,7 @@ int StdioStream::fillGet() { //------------------------------------------------------------------------------ // private bool StdioStream::fillBuf() { - if (!(m_status & - S_SRD)) { // check for S_ERR and S_EOF ??///////////////// + if (!(m_status & S_SRD)) { // check for S_ERR and S_EOF ??///////////////// if (!(m_status & S_SRW)) { m_status |= S_ERR; return false; @@ -410,8 +414,7 @@ bool StdioStream::fillBuf() { //------------------------------------------------------------------------------ // private bool StdioStream::flushBuf() { - if (!(m_status & - S_SWR)) { // check for S_ERR ??//////////////////////// + if (!(m_status & S_SWR)) { if (!(m_status & S_SRW)) { m_status |= S_ERR; return false; @@ -440,20 +443,3 @@ int StdioStream::flushPut(uint8_t c) { m_w--; return *m_p++ = c; } -//------------------------------------------------------------------------------ -char* StdioStream::fmtSpace(uint8_t len) { - if (m_w < len) { - if (!flushBuf() || m_w < len) { - return 0; - } - } - if (len > m_w) { - return 0; - } - m_p += len; - m_w -= len; - return reinterpret_cast(m_p); -} - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.h index 863e2aa6..276c7790 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StdioStream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,24 +29,15 @@ * \brief StdioStream class */ #include + #include "ios.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** Total size of stream buffer. The entire buffer is used for output. - * During input UNGETC_BUF_SIZE of this space is reserved for ungetc. - */ + * During input UNGETC_BUF_SIZE of this space is reserved for ungetc. + */ const uint8_t STREAM_BUF_SIZE = 64; /** Amount of buffer allocated for ungetc during input. */ const uint8_t UNGETC_BUF_SIZE = 2; - - -}; // namespace sdfat - - //------------------------------------------------------------------------------ // Get rid of any macros defined in . #include @@ -73,7 +64,7 @@ const uint8_t UNGETC_BUF_SIZE = 2; #undef getchar #undef gets #undef perror -//#undef printf // NOLINT +// #undef printf // NOLINT #undef putc #undef putchar #undef puts @@ -83,7 +74,7 @@ const uint8_t UNGETC_BUF_SIZE = 2; #undef scanf #undef setbuf #undef setvbuf -//#undef sprintf // NOLINT +// #undef sprintf // NOLINT #undef sscanf #undef tmpfile #undef tmpnam @@ -105,7 +96,7 @@ const uint8_t UNGETC_BUF_SIZE = 2; /** Seek relative to current position. */ #define SEEK_CUR 1 #endif // SEEK_CUR -#ifndef SEEK_END +#ifndef SEEK_END /** Seek relative to end-of-file. */ #define SEEK_END 2 #endif // SEEK_END @@ -113,11 +104,6 @@ const uint8_t UNGETC_BUF_SIZE = 2; /** Seek relative to start-of-file. */ #define SEEK_SET 0 #endif // SEEK_SET - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** \class StdioStream * \brief StdioStream implements a minimal stdio stream. @@ -129,16 +115,10 @@ class StdioStream : private StreamBaseFile { /** Constructor * */ - StdioStream() { - m_w = m_r = 0; - m_p = m_buf; - m_status = 0; - } + StdioStream() : m_buf{0} {} //---------------------------------------------------------------------------- /** Clear the stream's end-of-file and error indicators. */ - void clearerr() { - m_status &= ~(S_ERR | S_EOF); - } + void clearerr() { m_status &= ~(S_ERR | S_EOF); } //---------------------------------------------------------------------------- /** Close a stream. * @@ -156,16 +136,12 @@ class StdioStream : private StreamBaseFile { /** Test the stream's end-of-file indicator. * \return non-zero if and only if the end-of-file indicator is set. */ - int feof() { - return (m_status & S_EOF) != 0; - } + int feof() { return (m_status & S_EOF) != 0; } //---------------------------------------------------------------------------- /** Test the stream's error indicator. * \return return non-zero if and only if the error indicator is set. */ - int ferror() { - return (m_status & S_ERR) != 0; - } + int ferror() { return (m_status & S_ERR) != 0; } //---------------------------------------------------------------------------- /** Flush the stream. * @@ -186,9 +162,7 @@ class StdioStream : private StreamBaseFile { * set and the fgetc function returns EOF. Otherwise, the fgetc function * returns the next character from the input stream. */ - int fgetc() { - return m_r-- == 0 ? fillGet() : *m_p++; - } + int fgetc() { return m_r-- == 0 ? fillGet() : *m_p++; } //---------------------------------------------------------------------------- /** Get a string from a stream. * @@ -284,9 +258,7 @@ class StdioStream : private StreamBaseFile { * has written. Otherwise, it returns EOF and sets the error indicator for * the stream. */ - int fputc(int c) { - return m_w-- == 0 ? flushPut(c) : *m_p++ = c; - } + int fputc(int c) { return m_w-- == 0 ? flushPut(c) : *m_p++ = c; } //---------------------------------------------------------------------------- /** Write a string to a stream. * @@ -355,7 +327,7 @@ class StdioStream : private StreamBaseFile { * less than count, an error has occurred. If size or count is zero, * fwrite returns zero. */ - size_t fwrite(const void * ptr, size_t size, size_t count); + size_t fwrite(const void* ptr, size_t size, size_t count); //---------------------------------------------------------------------------- /** Get a byte from the stream. * @@ -367,8 +339,7 @@ class StdioStream : private StreamBaseFile { * set and the fgetc function returns EOF. Otherwise, the fgetc function * returns the next character from the input stream. */ - inline __attribute__((always_inline)) - int getc() { + inline __attribute__((always_inline)) int getc() { return m_r-- == 0 ? fillGet() : *m_p++; } //---------------------------------------------------------------------------- @@ -383,8 +354,7 @@ class StdioStream : private StreamBaseFile { * has written. Otherwise, it returns EOF and sets the error indicator for * the stream. */ - inline __attribute__((always_inline)) - int putc(int c) { + inline __attribute__((always_inline)) int putc(int c) { return m_w-- == 0 ? flushPut(c) : *m_p++ = c; } //---------------------------------------------------------------------------- @@ -392,8 +362,7 @@ class StdioStream : private StreamBaseFile { * * \return two, the number of bytes written, for success or -1 for failure. */ - inline __attribute__((always_inline)) - int putCRLF() { + inline __attribute__((always_inline)) int putCRLF() { if (m_w < 2) { if (!flushBuf()) { return -1; @@ -409,9 +378,7 @@ class StdioStream : private StreamBaseFile { * \param[in] c the character to write. * \return the number of bytes written. */ - size_t print(char c) { - return putc(c) < 0 ? 0 : 1; - } + size_t print(char c) { return putc(c) < 0 ? 0 : 1; } //---------------------------------------------------------------------------- /** Write a string. * @@ -431,7 +398,7 @@ class StdioStream : private StreamBaseFile { * * \return the number of bytes written. */ - size_t print(const __FlashStringHelper *str); + size_t print(const __FlashStringHelper* str); #endif // (defined(ARDUINO) && ENABLE_ARDUINO_FEATURES) || defined(DOXYGEN) //---------------------------------------------------------------------------- /** Print a floating point number. @@ -459,7 +426,7 @@ class StdioStream : private StreamBaseFile { return n > 0 ? n : 0; } //---------------------------------------------------------------------------- - /** Print a number. + /** Print a number. * * \param[in] val the number to be printed. * @@ -475,9 +442,7 @@ class StdioStream : private StreamBaseFile { * * \return two, the number of bytes written, for success or zero for failure. */ - size_t println() { - return putCRLF() > 0 ? 2 : 0; - } + size_t println() { return putCRLF() > 0 ? 2 : 0; } //---------------------------------------------------------------------------- /** Print a floating point number followed by CR/LF. * @@ -538,9 +503,7 @@ class StdioStream : private StreamBaseFile { * \param[in] n number to be print. * \return The number of bytes written or -1 if an error occurs. */ - int printDec(unsigned char n) { - return printDec((uint16_t)n); - } + int printDec(unsigned char n) { return printDec((uint16_t)n); } //---------------------------------------------------------------------------- /** Print a int16_t * \param[in] n number to be printed. @@ -628,7 +591,7 @@ class StdioStream : private StreamBaseFile { */ int printHexln(uint32_t n) { int rtn = printHex(n); - return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2; + return rtn < 0 || putCRLF() != 2 ? -1 : rtn + 2; } //---------------------------------------------------------------------------- /** Set position of a stream to the beginning. @@ -662,7 +625,6 @@ class StdioStream : private StreamBaseFile { int fillGet(); bool flushBuf(); int flushPut(uint8_t c); - char* fmtSpace(uint8_t len); int write(const void* buf, size_t count); //---------------------------------------------------------------------------- // S_SRD and S_WR are never simultaneously asserted @@ -672,16 +634,11 @@ class StdioStream : private StreamBaseFile { static const uint8_t S_EOF = 0x10; // found EOF static const uint8_t S_ERR = 0x20; // found error //---------------------------------------------------------------------------- - uint8_t m_status; - uint8_t* m_p; - uint8_t m_r; - uint8_t m_w; - uint8_t m_buf[STREAM_BUF_SIZE]; + uint8_t m_buf[STREAM_BUF_SIZE]; + uint8_t m_status = 0; + uint8_t* m_p = m_buf; + uint8_t m_r = 0; + uint8_t m_w = 0; }; //------------------------------------------------------------------------------ - - -}; // namespace sdfat - - #endif // StdioStream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StreamBaseClass.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StreamBaseClass.cpp index 3f6c6750..ca2a3396 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StreamBaseClass.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/StreamBaseClass.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -23,11 +23,6 @@ * DEALINGS IN THE SOFTWARE. */ #include "fstream.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ int16_t StreamBaseClass::getch() { uint8_t c; @@ -57,35 +52,35 @@ void StreamBaseClass::open(const char* path, ios::openmode mode) { oflag_t oflag; clearWriteError(); switch (mode & (app | in | out | trunc)) { - case app | in: - case app | in | out: - oflag = O_RDWR | O_APPEND | O_CREAT; - break; + case app | in: + case app | in | out: + oflag = O_RDWR | O_APPEND | O_CREAT; + break; - case app: - case app | out: - oflag = O_WRONLY | O_APPEND | O_CREAT; - break; + case app: + case app | out: + oflag = O_WRONLY | O_APPEND | O_CREAT; + break; - case in: - oflag = O_RDONLY; - break; + case in: + oflag = O_RDONLY; + break; - case in | out: - oflag = O_RDWR | O_CREAT; - break; + case in | out: + oflag = O_RDWR | O_CREAT; + break; - case in | out | trunc: - oflag = O_RDWR | O_TRUNC | O_CREAT; - break; + case in | out | trunc: + oflag = O_RDWR | O_TRUNC | O_CREAT; + break; - case out: - case out | trunc: - oflag = O_WRONLY | O_TRUNC | O_CREAT; - break; + case out: + case out | trunc: + oflag = O_WRONLY | O_TRUNC | O_CREAT; + break; - default: - goto fail; + default: + goto fail; } if (mode & ios::ate) { oflag |= O_AT_END; @@ -97,7 +92,7 @@ void StreamBaseClass::open(const char* path, ios::openmode mode) { clear(); return; - fail: +fail: StreamBaseFile::close(); setstate(failbit); return; @@ -138,20 +133,20 @@ void StreamBaseClass::putstr(const char* str) { bool StreamBaseClass::seekoff(off_type off, seekdir way) { pos_type pos; switch (way) { - case beg: - pos = off; - break; + case beg: + pos = off; + break; - case cur: - pos = StreamBaseFile::curPosition() + off; - break; + case cur: + pos = StreamBaseFile::curPosition() + off; + break; - case end: - pos = StreamBaseFile::fileSize() + off; - break; + case end: + pos = StreamBaseFile::fileSize() + off; + break; - default: - return false; + default: + return false; } return seekpos(pos); } @@ -160,9 +155,4 @@ int StreamBaseClass::write(const void* buf, size_t n) { return StreamBaseFile::write(buf, n); } //------------------------------------------------------------------------------ -void StreamBaseClass::write(char c) { - StreamBaseFile::write(&c, 1); -} - - -}; // namespace sdfat +void StreamBaseClass::write(char c) { StreamBaseFile::write(&c, 1); } diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/bufstream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/bufstream.h index 5b5e426b..a7e75053 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/bufstream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/bufstream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,12 +29,8 @@ * \brief \ref ibufstream and \ref obufstream classes */ #include + #include "iostream.h" - - -namespace sdfat { - - //============================================================================== /** * \class ibufstream @@ -43,14 +39,12 @@ namespace sdfat { class ibufstream : public istream { public: /** Constructor */ - ibufstream() : m_buf(nullptr), m_len(0) {} + ibufstream() {} /** Constructor * \param[in] str pointer to string to be parsed * Warning: The string will not be copied so must stay in scope. */ - explicit ibufstream(const char* str) { - init(str); - } + explicit ibufstream(const char* str) { init(str); } /** Initialize an ibufstream * \param[in] str pointer to string to be parsed * Warning: The string will not be copied so must stay in scope. @@ -71,9 +65,7 @@ class ibufstream : public istream { setstate(eofbit); return -1; } - void getpos(pos_t* pos) { - pos->position = m_pos; - } + void getpos(pos_t* pos) { pos->position = m_pos; } bool seekoff(off_type off, seekdir way) { (void)off; (void)way; @@ -86,16 +78,12 @@ class ibufstream : public istream { } return false; } - void setpos(pos_t* pos) { - m_pos = pos->position; - } - pos_type tellpos() { - return m_pos; - } + void setpos(pos_t* pos) { m_pos = pos->position; } + pos_type tellpos() { return m_pos; } /// @endcond private: - const char* m_buf; - size_t m_len; + const char* m_buf = nullptr; + size_t m_len = 0; size_t m_pos; }; //============================================================================== @@ -106,44 +94,38 @@ class ibufstream : public istream { class obufstream : public ostream { public: /** constructor */ - obufstream() : m_in(0) {} + obufstream() {} /** Constructor * \param[in] buf buffer for formatted string * \param[in] size buffer size */ - obufstream(char *buf, size_t size) { - init(buf, size); - } + obufstream(char* buf, size_t size) { init(buf, size); } /** Initialize an obufstream * \param[in] buf buffer for formatted string * \param[in] size buffer size */ - void init(char *buf, size_t size) { + void init(char* buf, size_t size) { m_buf = buf; buf[0] = '\0'; m_size = size; m_in = 0; } /** \return a pointer to the buffer */ - char* buf() { - return m_buf; - } + char* buf() { return m_buf; } /** \return the length of the formatted string */ - size_t length() { - return m_in; - } + size_t length() { return m_in; } protected: /// @cond SHOW_PROTECTED void putch(char c) { - if (m_in >= (m_size - 1)) { + if ((m_in + 1) >= m_size) { setstate(badbit); return; } m_buf[m_in++] = c; m_buf[m_in] = '\0'; } - void putstr(const char *str) { + void putstr(const char* str) { while (*str) { putch(*str++); } @@ -161,22 +143,12 @@ class obufstream : public ostream { m_buf[m_in] = '\0'; return true; } - bool sync() { - return true; - } - - pos_type tellpos() { - return m_in; - } + bool sync() { return true; } + pos_type tellpos() { return m_in; } /// @endcond private: - char *m_buf; - size_t m_size; - size_t m_in; + char* m_buf = nullptr; + size_t m_size = 0; + size_t m_in = 0; }; - - -}; // namespace sdfat - - #endif // bufstream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/fstream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/fstream.h index f3959d24..e6e222e2 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/fstream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/fstream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,6 @@ #ifndef fstream_h #define fstream_h #include "iostream.h" - - -namespace sdfat { - - //------------------------------------------------------------------------------ /** * \class StreamBaseClass @@ -41,38 +36,28 @@ namespace sdfat { */ class StreamBaseClass : protected StreamBaseFile, virtual public ios { protected: - void clearWriteError() { - StreamBaseFile::clearWriteError(); - } + void clearWriteError() { StreamBaseFile::clearWriteError(); } /* Internal do not use * \return mode */ int16_t getch(); - bool getWriteError() { - return StreamBaseFile::getWriteError(); - } + bool getWriteError() { return StreamBaseFile::getWriteError(); } void open(const char* path, ios::openmode mode); /** Internal do not use * \return mode */ - ios::openmode getmode() { - return m_mode; - } + ios::openmode getmode() { return m_mode; } void putch(char c); - void putstr(const char *str); + void putstr(const char* str); bool seekoff(off_type off, seekdir way); /** Internal do not use * \param[in] pos */ - bool seekpos(pos_type pos) { - return StreamBaseFile::seekSet(pos); - } + bool seekpos(pos_type pos) { return StreamBaseFile::seekSet(pos); } /** Internal do not use * \param[in] mode */ - void setmode(ios::openmode mode) { - m_mode = mode; - } + void setmode(ios::openmode mode) { m_mode = mode; } int write(const void* buf, size_t n); void write(char c); @@ -84,7 +69,7 @@ class StreamBaseClass : protected StreamBaseFile, virtual public ios { * \class fstream * \brief file input/output stream. */ -class fstream : public iostream, StreamBaseClass { +class fstream : public iostream, StreamBaseClass { public: using iostream::peek; fstream() {} @@ -108,9 +93,7 @@ class fstream : public iostream, StreamBaseClass { /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** Open a fstream * \param[in] path path to open * \param[in] mode open mode @@ -137,54 +120,36 @@ class fstream : public iostream, StreamBaseClass { StreamBaseClass::open(path, mode); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } protected: /// @cond SHOW_PROTECTED /** Internal - do not use * \return */ - int16_t getch() { - return StreamBaseClass::getch(); - } + int16_t getch() { return StreamBaseClass::getch(); } /** Internal - do not use - * \param[out] pos - */ - void getpos(pos_t* pos) { - StreamBaseFile::fgetpos(pos); - } + * \param[out] pos + */ + void getpos(pos_t* pos) { StreamBaseFile::fgetpos(pos); } /** Internal - do not use * \param[in] c */ - void putch(char c) { - StreamBaseClass::putch(c); - } + void putch(char c) { StreamBaseClass::putch(c); } /** Internal - do not use * \param[in] str */ - void putstr(const char *str) { - StreamBaseClass::putstr(str); - } + void putstr(const char* str) { StreamBaseClass::putstr(str); } /** Internal - do not use * \param[in] pos */ bool seekoff(off_type off, seekdir way) { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } - void setpos(pos_t* pos) { - StreamBaseFile::fsetpos(pos); - } - bool sync() { - return StreamBaseClass::sync(); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool seekpos(pos_type pos) { return StreamBaseClass::seekpos(pos); } + void setpos(pos_t* pos) { StreamBaseFile::fsetpos(pos); } + bool sync() { return StreamBaseClass::sync(); } + pos_type tellpos() { return StreamBaseFile::curPosition(); } /// @endcond }; //============================================================================== @@ -192,7 +157,7 @@ class fstream : public iostream, StreamBaseClass { * \class ifstream * \brief file input stream. */ -class ifstream : public istream, StreamBaseClass { +class ifstream : public istream, StreamBaseClass { public: using istream::peek; ifstream() {} @@ -200,22 +165,16 @@ class ifstream : public istream, StreamBaseClass { * \param[in] path file to open * \param[in] mode open mode */ - explicit ifstream(const char* path, openmode mode = in) { - open(path, mode); - } + explicit ifstream(const char* path, openmode mode = in) { open(path, mode); } #if DESTRUCTOR_CLOSES_FILE ~ifstream() {} #endif // DESTRUCTOR_CLOSES_FILE /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } /** Open an ifstream * \param[in] path file to open * \param[in] mode open mode @@ -231,30 +190,20 @@ class ifstream : public istream, StreamBaseClass { /** Internal - do not use * \return */ - int16_t getch() { - return StreamBaseClass::getch(); - } + int16_t getch() override { return StreamBaseClass::getch(); } /** Internal - do not use * \param[out] pos */ - void getpos(pos_t* pos) { - StreamBaseFile::fgetpos(pos); - } + void getpos(pos_t* pos) override { StreamBaseFile::fgetpos(pos); } /** Internal - do not use * \param[in] pos */ - bool seekoff(off_type off, seekdir way) { + bool seekoff(off_type off, seekdir way) override { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } - void setpos(pos_t* pos) { - StreamBaseFile::fsetpos(pos); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool seekpos(pos_type pos) override { return StreamBaseClass::seekpos(pos); } + void setpos(pos_t* pos) override { StreamBaseFile::fsetpos(pos); } + pos_type tellpos() override { return StreamBaseFile::curPosition(); } /// @endcond }; //============================================================================== @@ -262,16 +211,14 @@ class ifstream : public istream, StreamBaseClass { * \class ofstream * \brief file output stream. */ -class ofstream : public ostream, StreamBaseClass { +class ofstream : public ostream, StreamBaseClass { public: ofstream() {} /** Constructor with open * \param[in] path file to open * \param[in] mode open mode */ - explicit ofstream(const char* path, openmode mode = out) { - open(path, mode); - } + explicit ofstream(const char* path, openmode mode = out) { open(path, mode); } #if DESTRUCTOR_CLOSES_FILE ~ofstream() {} #endif // DESTRUCTOR_CLOSES_FILE @@ -285,9 +232,7 @@ class ofstream : public ostream, StreamBaseClass { /** Close a file and force cached data and directory information * to be written to the storage device. */ - void close() { - StreamBaseClass::close(); - } + void close() { StreamBaseClass::close(); } /** Open an ofstream * \param[in] path file to open * \param[in] mode open mode @@ -298,9 +243,7 @@ class ofstream : public ostream, StreamBaseClass { StreamBaseClass::open(path, mode | out); } /** \return True if stream is open else false. */ - bool is_open() { - return StreamBaseFile::isOpen(); - } + bool is_open() { return StreamBaseFile::isOpen(); } protected: /// @cond SHOW_PROTECTED @@ -308,33 +251,18 @@ class ofstream : public ostream, StreamBaseClass { * Internal do not use * \param[in] c */ - void putch(char c) { - StreamBaseClass::putch(c); - } - void putstr(const char* str) { - StreamBaseClass::putstr(str); - } - bool seekoff(off_type off, seekdir way) { + void putch(char c) override { StreamBaseClass::putch(c); } + void putstr(const char* str) override { StreamBaseClass::putstr(str); } + bool seekoff(off_type off, seekdir way) override { return StreamBaseClass::seekoff(off, way); } - bool seekpos(pos_type pos) { - return StreamBaseClass::seekpos(pos); - } + bool seekpos(pos_type pos) override { return StreamBaseClass::seekpos(pos); } /** * Internal do not use * \param[in] b */ - bool sync() { - return StreamBaseClass::sync(); - } - pos_type tellpos() { - return StreamBaseFile::curPosition(); - } + bool sync() override { return StreamBaseClass::sync(); } + pos_type tellpos() override { return StreamBaseFile::curPosition(); } /// @endcond }; - - -}; // namespace sdfat - - #endif // fstream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ios.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ios.h index 16b93e4a..50eb58fe 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ios.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ios.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -25,11 +25,6 @@ #ifndef ios_h #define ios_h #include "../FsLib/FsLib.h" - - -namespace sdfat { - - /** * \file * \brief \ref ios_base and \ref ios classes @@ -38,7 +33,7 @@ namespace sdfat { /** For internal use in c++ streams */ typedef fspos_t pos_t; //============================================================================== -#if SDFAT_FILE_TYPE == 1 +#if SDFAT_FILE_TYPE == 1 || defined(DOXYGEN) /** Set File type for iostreams. */ typedef FatFile StreamBaseFile; #elif SDFAT_FILE_TYPE == 2 @@ -75,7 +70,7 @@ class ios_base { typedef uint32_t pos_type; /** type for relative seek offset */ typedef int32_t off_type; -#else // SDFAT_FILE_TYPE +#else // SDFAT_FILE_TYPE /** * unsigned size that can represent maximum file size. * (violates spec - should be signed) @@ -98,36 +93,36 @@ class ios_base { /** type for format flags */ typedef unsigned int fmtflags; /** left adjust fields */ - static const fmtflags left = 0x0001; + static const fmtflags left = 0x0001; /** right adjust fields */ - static const fmtflags right = 0x0002; + static const fmtflags right = 0x0002; /** fill between sign/base prefix and number */ - static const fmtflags internal = 0x0004; + static const fmtflags internal = 0x0004; /** base 10 flag*/ - static const fmtflags dec = 0x0008; + static const fmtflags dec = 0x0008; /** base 16 flag */ - static const fmtflags hex = 0x0010; + static const fmtflags hex = 0x0010; /** base 8 flag */ - static const fmtflags oct = 0x0020; + static const fmtflags oct = 0x0020; // static const fmtflags fixed = 0x0040; // static const fmtflags scientific = 0x0080; /** use strings true/false for bool */ - static const fmtflags boolalpha = 0x0100; + static const fmtflags boolalpha = 0x0100; /** use prefix 0X for hex and 0 for oct */ - static const fmtflags showbase = 0x0200; + static const fmtflags showbase = 0x0200; /** always show '.' for floating numbers */ - static const fmtflags showpoint = 0x0400; + static const fmtflags showpoint = 0x0400; /** show + sign for nonnegative numbers */ - static const fmtflags showpos = 0x0800; + static const fmtflags showpos = 0x0800; /** skip initial white space */ - static const fmtflags skipws = 0x1000; + static const fmtflags skipws = 0x1000; // static const fmtflags unitbuf = 0x2000; /** use uppercase letters in number representations */ - static const fmtflags uppercase = 0x4000; + static const fmtflags uppercase = 0x4000; /** mask for adjustfield */ static const fmtflags adjustfield = left | right | internal; /** mask for basefield */ - static const fmtflags basefield = dec | hex | oct; + static const fmtflags basefield = dec | hex | oct; // static const fmtflags floatfield = scientific | fixed; //---------------------------------------------------------------------------- /** typedef for iostream open mode */ @@ -135,24 +130,25 @@ class ios_base { // Openmode flags. /** seek to end before each write */ - static const openmode app = 0X4; + static const openmode app = 0X4; /** open and seek to end immediately after opening */ - static const openmode ate = 0X8; + static const openmode ate = 0X8; /** perform input and output in binary mode (as opposed to text mode) */ static const openmode binary = 0X10; /** open for input */ - static const openmode in = 0X20; + static const openmode in = 0X20; /** open for output */ - static const openmode out = 0X40; + static const openmode out = 0X40; /** truncate an existing stream when opening */ - static const openmode trunc = 0X80; + static const openmode trunc = 0X80; //---------------------------------------------------------------------------- - ios_base() : m_fill(' '), m_fmtflags(dec | right | skipws) - , m_precision(2), m_width(0) {} + ios_base() + : m_fill(' '), + m_fmtflags(dec | right | skipws), + m_precision(2), + m_width(0) {} /** \return fill character */ - char fill() { - return m_fill; - } + char fill() { return m_fill; } /** Set fill character * \param[in] c new fill character * \return old fill character @@ -163,9 +159,7 @@ class ios_base { return r; } /** \return format flags */ - fmtflags flags() const { - return m_fmtflags; - } + fmtflags flags() const { return m_fmtflags; } /** set format flags * \param[in] fl new flag * \return old flags @@ -176,9 +170,7 @@ class ios_base { return tmp; } /** \return precision */ - int precision() const { - return m_precision; - } + int precision() const { return m_precision; } /** set precision * \param[in] n new precision * \return old precision @@ -211,13 +203,9 @@ class ios_base { /** clear format flags * \param[in] fl flags to be cleared */ - void unsetf(fmtflags fl) { - m_fmtflags &= ~fl; - } + void unsetf(fmtflags fl) { m_fmtflags &= ~fl; } /** \return width */ - unsigned width() { - return m_width; - } + unsigned width() { return m_width; } /** set width * \param[in] n new width * \return old width @@ -394,26 +382,20 @@ inline ios_base& uppercase(ios_base& str) { class ios : public ios_base { public: /** Create ios with no error flags set */ - ios() : m_iostate(0) {} + ios() {} /** \return null pointer if fail() is true. */ operator const void*() const { return !fail() ? reinterpret_cast(this) : nullptr; } /** \return true if fail() else false. */ - bool operator!() const { - return fail(); - } + bool operator!() const { return fail(); } /** \return false if fail() else true. */ - explicit operator bool() const {return !fail();} + explicit operator bool() const { return !fail(); } /** \return The iostate flags for this file. */ - iostate rdstate() const { - return m_iostate; - } + iostate rdstate() const { return m_iostate; } /** \return True if no iostate flags are set else false. */ - bool good() const { - return m_iostate == goodbit; - } + bool good() const { return m_iostate == goodbit; } /** \return true if end of file has been reached else false. * * Warning: An empty file returns false before the first read. @@ -421,38 +403,23 @@ class ios : public ios_base { * Moral: eof() is only useful in combination with fail(), to find out * whether EOF was the cause for failure */ - bool eof() const { - return m_iostate & eofbit; - } + bool eof() const { return m_iostate & eofbit; } /** \return true if any iostate bit other than eof are set else false. */ - bool fail() const { - return m_iostate & (failbit | badbit); - } + bool fail() const { return m_iostate & (failbit | badbit); } /** \return true if bad bit is set else false. */ - bool bad() const { - return m_iostate & badbit; - } + bool bad() const { return m_iostate & badbit; } /** Clear iostate bits. * * \param[in] state The flags you want to set after clearing all flags. **/ - void clear(iostate state = goodbit) { - m_iostate = state; - } + void clear(iostate state = goodbit) { m_iostate = state; } /** Set iostate bits. * * \param[in] state Bitts to set. **/ - void setstate(iostate state) { - m_iostate |= state; - } + void setstate(iostate state) { m_iostate |= state; } private: - iostate m_iostate; + iostate m_iostate = 0; }; - - -}; // namespace sdfat - - #endif // ios_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/iostream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/iostream.h index d182114a..697f478f 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/iostream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/iostream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,16 +30,11 @@ */ #include "istream.h" #include "ostream.h" - - -namespace sdfat { - - /** Skip white space * \param[in] is the Stream * \return The stream */ -inline istream& ws(istream& is) { +inline istream &ws(istream &is) { is.skipWhite(); return is; } @@ -47,7 +42,7 @@ inline istream& ws(istream& is) { * \param[in] os The Stream * \return The stream */ -inline ostream& endl(ostream& os) { +inline ostream &endl(ostream &os) { os.put('\n'); #if ENDL_CALLS_FLUSH os.flush(); @@ -58,7 +53,7 @@ inline ostream& endl(ostream& os) { * \param[in] os The stream * \return The stream */ -inline ostream& flush(ostream& os) { +inline ostream &flush(ostream &os) { os.flush(); return os; } @@ -80,7 +75,7 @@ struct setfill { * \param[in] arg set setfill object * \return the stream */ -inline ostream &operator<< (ostream &os, const setfill &arg) { +inline ostream &operator<<(ostream &os, const setfill &arg) { os.fill(arg.c); return os; } @@ -110,7 +105,7 @@ struct setprecision { * \param[in] arg set setprecision object * \return the stream */ -inline ostream &operator<< (ostream &os, const setprecision &arg) { +inline ostream &operator<<(ostream &os, const setprecision &arg) { os.precision(arg.p); return os; } @@ -140,7 +135,7 @@ struct setw { * \param[in] arg set setw object * \return the stream */ -inline ostream &operator<< (ostream &os, const setw &arg) { +inline ostream &operator<<(ostream &os, const setw &arg) { os.width(arg.w); return os; } @@ -158,11 +153,5 @@ inline istream &operator>>(istream &is, const setw &arg) { * \class iostream * \brief Input/Output stream */ -class iostream : public istream, public ostream { -}; - - -}; // namespace sdfat - - +class iostream : public istream, public ostream {}; #endif // iostream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.cpp index 6f37905e..48a2044d 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,14 +22,13 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include -#include #include "istream.h" - -namespace sdfat { - - +#ifdef __AVR__ +#include +#endif // __AVR__ +#include +#include //------------------------------------------------------------------------------ int istream::get() { int c; @@ -51,12 +50,11 @@ istream& istream::get(char& c) { return *this; } //------------------------------------------------------------------------------ -istream& istream::get(char *str, streamsize n, char delim) { - int c; +istream& istream::get(char* str, streamsize n, char delim) { pos_t pos; m_gcount = 0; - while ((m_gcount + 1) < n) { - c = getch(&pos); + while ((m_gcount + 1) < n) { + int c = getch(&pos); if (c < 0) { break; } @@ -75,7 +73,7 @@ istream& istream::get(char *str, streamsize n, char delim) { return *this; } //------------------------------------------------------------------------------ -void istream::getBool(bool *b) { +void istream::getBool(bool* b) { if ((flags() & boolalpha) == 0) { getNumber(b); return; @@ -83,7 +81,7 @@ void istream::getBool(bool *b) { #ifdef __AVR__ PGM_P truePtr = PSTR("true"); PGM_P falsePtr = PSTR("false"); -#else // __AVR__ +#else // __AVR__ const char* truePtr = "true"; const char* falsePtr = "false"; #endif // __AVR @@ -97,7 +95,7 @@ void istream::getBool(bool *b) { #ifdef __AVR__ falseOk = falseOk && c == pgm_read_byte(falsePtr + i); trueOk = trueOk && c == pgm_read_byte(truePtr + i); -#else // __AVR__ +#else // __AVR__ falseOk = falseOk && c == falsePtr[i]; trueOk = trueOk && c == truePtr[i]; #endif // __AVR__ @@ -154,8 +152,8 @@ bool istream::getDouble(double* value) { while (1) { if (isdigit(c)) { got_digit = true; - if (frac < uint32_max/10) { - frac = frac * 10 + (c - '0'); + if (frac < uint32_max / 10) { + frac = frac * 10 + (c - '0'); if (got_dot) { fracExp--; } @@ -202,13 +200,13 @@ bool istream::getDouble(double* value) { if (exp & 1) { if (expNeg) { // check for underflow - if (v < FLT_MIN * pow10 && frac != 0) { + if (v < DBL_MIN * pow10 && frac != 0) { goto fail; } v /= pow10; } else { // check for overflow - if (v > FLT_MAX / pow10) { + if (v > DBL_MAX / pow10) { goto fail; } v *= pow10; @@ -221,7 +219,7 @@ bool istream::getDouble(double* value) { *value = neg ? -v : v; return true; - fail: +fail: // error restore position to last good place setpos(&endPos); setstate(failbit); @@ -229,15 +227,14 @@ bool istream::getDouble(double* value) { } //------------------------------------------------------------------------------ -istream& istream::getline(char *str, streamsize n, char delim) { +istream& istream::getline(char* str, streamsize n, char delim) { pos_t pos; - int c; m_gcount = 0; if (n > 0) { str[0] = '\0'; } while (1) { - c = getch(&pos); + int c = getch(&pos); if (c < 0) { break; } @@ -245,7 +242,7 @@ istream& istream::getline(char *str, streamsize n, char delim) { m_gcount++; break; } - if ((m_gcount + 1) >= n) { + if ((m_gcount + 1) >= n) { setpos(&pos); setstate(failbit); break; @@ -315,14 +312,14 @@ bool istream::getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num) { } setpos(&endPos); if (any > 0 || (have_zero && any >= 0)) { - *num = neg ? -val : val; + *num = neg ? -val : val; return true; } setstate(failbit); return false; } //------------------------------------------------------------------------------ -void istream::getStr(char *str) { +void istream::getStr(char* str) { pos_t pos; uint16_t i = 0; uint16_t m = width() ? width() - 1 : 0XFFFE; @@ -350,10 +347,9 @@ void istream::getStr(char *str) { } //------------------------------------------------------------------------------ istream& istream::ignore(streamsize n, int delim) { - int c; m_gcount = 0; while (m_gcount < n) { - c = getch(); + int c = getch(); if (c < 0) { break; } @@ -398,6 +394,3 @@ void istream::skipWhite() { } while (isspace(c)); setpos(&pos); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.h index 0868458f..1a959c82 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/istream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -30,24 +30,18 @@ */ #include "ios.h" - -namespace sdfat { - - /** * \class istream * \brief Input Stream */ class istream : public virtual ios { public: - istream() {} + istream() = default; /** call manipulator * \param[in] pf function to call * \return the stream */ - istream& operator>>(istream& (*pf)(istream& str)) { - return pf(*this); - } + istream& operator>>(istream& (*pf)(istream& str)) { return pf(*this); } /** call manipulator * \param[in] pf function to call * \return the stream @@ -69,7 +63,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(char *str) { + istream& operator>>(char* str) { getStr(str); return *this; } @@ -87,7 +81,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(signed char *str) { + istream& operator>>(signed char* str) { getStr(reinterpret_cast(str)); return *this; } @@ -105,7 +99,7 @@ class istream : public virtual ios { * \param[out] str location to store the string. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>>(unsigned char *str) { + istream& operator>>(unsigned char* str) { getStr(reinterpret_cast(str)); return *this; } @@ -132,7 +126,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(short& arg) { // NOLINT + istream& operator>>(short& arg) { // NOLINT getNumber(&arg); return *this; } @@ -141,7 +135,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned short& arg) { // NOLINT + istream& operator>>(unsigned short& arg) { // NOLINT getNumber(&arg); return *this; } @@ -150,7 +144,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(int& arg) { + istream& operator>>(int& arg) { getNumber(&arg); return *this; } @@ -159,7 +153,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned int& arg) { + istream& operator>>(unsigned int& arg) { getNumber(&arg); return *this; } @@ -168,7 +162,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(long& arg) { // NOLINT + istream& operator>>(long& arg) { // NOLINT getNumber(&arg); return *this; } @@ -177,16 +171,16 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>>(unsigned long& arg) { // NOLINT + istream& operator>>(unsigned long& arg) { // NOLINT getNumber(&arg); return *this; } /** - * Extract a value of type double. - * \param[out] arg location to store the value. - * \return Is always *this. Failure is indicated by the state of *this. - */ - istream &operator>> (double& arg) { + * Extract a value of type double. + * \param[out] arg location to store the value. + * \return Is always *this. Failure is indicated by the state of *this. + */ + istream& operator>>(double& arg) { getDouble(&arg); return *this; } @@ -195,7 +189,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream &operator>> (float& arg) { + istream& operator>>(float& arg) { double v; getDouble(&v); arg = v; @@ -206,7 +200,7 @@ class istream : public virtual ios { * \param[out] arg location to store the value. * \return Is always *this. Failure is indicated by the state of *this. */ - istream& operator>> (void*& arg) { + istream& operator>>(void*& arg) { uint32_t val; getNumber(&val); arg = reinterpret_cast(val); @@ -216,9 +210,7 @@ class istream : public virtual ios { * \return The number of characters extracted by the last unformatted * input function. */ - streamsize gcount() const { - return m_gcount; - } + streamsize gcount() const { return m_gcount; } /** * Extract a character if one is available. * @@ -248,7 +240,7 @@ class istream : public virtual ios { * * \return always returns *this. A failure is indicated by the stream state. */ - istream& get(char *str, streamsize n, char delim = '\n'); + istream& get(char* str, streamsize n, char delim = '\n'); /** * Extract characters * @@ -265,7 +257,7 @@ class istream : public virtual ios { * * \return always returns *this. A failure is indicated by the stream state. */ - istream& getline(char *str, streamsize n, char delim = '\n'); + istream& getline(char* str, streamsize n, char delim = '\n'); /** * Extract characters and discard them. * @@ -289,14 +281,12 @@ class istream : public virtual ios { * */ int peek(); -// istream& read(char *str, streamsize count); -// streamsize readsome(char *str, streamsize count); + // istream& read(char *str, streamsize count); + // streamsize readsome(char *str, streamsize count); /** * \return the stream position */ - pos_type tellg() { - return tellpos(); - } + pos_type tellg() { return tellpos(); } /** * Set the stream position * \param[in] pos The absolute position in which to move the read pointer. @@ -327,9 +317,9 @@ class istream : public virtual ios { protected: /// @cond SHOW_PROTECTED /** - * Internal - do not use - * \return - */ + * Internal - do not use + * \return + */ virtual int16_t getch() = 0; /** * Internal - do not use @@ -356,15 +346,16 @@ class istream : public virtual ios { /// @endcond private: - void getBool(bool *b); + void getBool(bool* b); void getChar(char* ch); bool getDouble(double* value); - template void getNumber(T* value); + template + void getNumber(T* value); bool getNumber(uint32_t posMax, uint32_t negMax, uint32_t* num); - void getStr(char *str); + void getStr(char* str); int16_t readSkip(); - size_t m_gcount; + size_t m_gcount = 0; }; //------------------------------------------------------------------------------ template @@ -385,9 +376,4 @@ void istream::getNumber(T* value) { } } } - - -}; // namespace sdfat - - #endif // istream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.cpp b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.cpp index ac642627..7f946bd5 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.cpp +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.cpp @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -22,13 +22,11 @@ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ -#include #include "ostream.h" - - -namespace sdfat { - - +#ifdef __AVR__ +#include +#endif // __AVR__ +#include #ifndef PSTR #define PSTR(x) x #endif // PSTR @@ -132,22 +130,28 @@ void ostream::putDouble(double n) { //------------------------------------------------------------------------------ void ostream::putNum(int32_t n) { bool neg = n < 0 && flagsToBase() == 10; - putNum ((uint32_t)(neg ? -n : n), neg); + putNum((uint32_t)(neg ? -n : n), neg); } //------------------------------------------------------------------------------ void ostream::putNum(int64_t n) { bool neg = n < 0 && flagsToBase() == 10; - putNum ((uint64_t)(neg ? -n : n), neg); + putNum((uint64_t)(neg ? -n : n), neg); } //------------------------------------------------------------------------------ -void ostream::putPgm(const char* str) { +void ostream::putPgm(const char *str) { +#ifndef __AVR__ + putStr(str); +#else // __AVR__ + uint8_t c; int n; - for (n = 0; pgm_read_byte(&str[n]); n++) {} + for (n = 0; pgm_read_byte(&str[n]); n++) { + } fill_not_left(n); - for (uint8_t c; (c = pgm_read_byte(str)); str++) { + for (n = 0; (c = pgm_read_byte(&str[n])); n++) { putch(c); } do_fill(n); +#endif // __AVR__ } //------------------------------------------------------------------------------ void ostream::putStr(const char *str) { @@ -156,6 +160,3 @@ void ostream::putStr(const char *str) { putstr(str); do_fill(n); } - - -}; // namespace sdfat diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.h b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.h index 6bbaded2..7dc8eb0e 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/iostream/ostream.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,11 +29,6 @@ * \brief \ref ostream class */ #include "ios.h" - - -namespace sdfat { - - //============================================================================== /** * \class ostream @@ -47,14 +42,12 @@ class ostream : public virtual ios { * \param[in] pf function to call * \return the stream */ - ostream& operator<< (ostream& (*pf)(ostream& str)) { - return pf(*this); - } + ostream &operator<<(ostream &(*pf)(ostream &str)) { return pf(*this); } /** call manipulator * \param[in] pf function to call * \return the stream */ - ostream& operator<< (ios_base& (*pf)(ios_base& str)) { + ostream &operator<<(ios_base &(*pf)(ios_base &str)) { pf(*this); return *this; } @@ -62,7 +55,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (bool arg) { + ostream &operator<<(bool arg) { putBool(arg); return *this; } @@ -70,7 +63,7 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const char *arg) { + ostream &operator<<(const char *arg) { putStr(arg); return *this; } @@ -78,16 +71,16 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const signed char *arg) { - putStr((const char*)arg); + ostream &operator<<(const signed char *arg) { + putStr(reinterpret_cast(arg)); return *this; } /** Output string * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const unsigned char *arg) { - putStr((const char*)arg); + ostream &operator<<(const unsigned char *arg) { + putStr(reinterpret_cast(arg)); return *this; } #if ENABLE_ARDUINO_STRING @@ -95,7 +88,7 @@ class ostream : public virtual ios { * \param[in] arg string to output * \return the stream */ - ostream &operator<< (const String& arg) { + ostream &operator<<(const String &arg) { putStr(arg.c_str()); return *this; } @@ -104,7 +97,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (char arg) { + ostream &operator<<(char arg) { putChar(arg); return *this; } @@ -112,7 +105,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (signed char arg) { + ostream &operator<<(signed char arg) { putChar(static_cast(arg)); return *this; } @@ -120,7 +113,7 @@ class ostream : public virtual ios { * \param[in] arg character to output * \return the stream */ - ostream &operator<< (unsigned char arg) { + ostream &operator<<(unsigned char arg) { putChar(static_cast(arg)); return *this; } @@ -128,7 +121,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (double arg) { + ostream &operator<<(double arg) { putDouble(arg); return *this; } @@ -136,7 +129,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (float arg) { + ostream &operator<<(float arg) { putDouble(arg); return *this; } @@ -144,7 +137,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (short arg) { // NOLINT + ostream &operator<<(short arg) { // NOLINT putNum((int32_t)arg); return *this; } @@ -152,7 +145,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned short arg) { // NOLINT + ostream &operator<<(unsigned short arg) { // NOLINT putNum((uint32_t)arg); return *this; } @@ -160,7 +153,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (int arg) { + ostream &operator<<(int arg) { putNum((int32_t)arg); return *this; } @@ -168,7 +161,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned int arg) { + ostream &operator<<(unsigned int arg) { putNum((uint32_t)arg); return *this; } @@ -176,7 +169,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (long arg) { // NOLINT + ostream &operator<<(long arg) { // NOLINT putNum((int32_t)arg); return *this; } @@ -184,7 +177,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned long arg) { // NOLINT + ostream &operator<<(unsigned long arg) { // NOLINT putNum((uint32_t)arg); return *this; } @@ -192,7 +185,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (long long arg) { // NOLINT + ostream &operator<<(long long arg) { // NOLINT putNum((int64_t)arg); return *this; } @@ -200,7 +193,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream &operator<< (unsigned long long arg) { // NOLINT + ostream &operator<<(unsigned long long arg) { // NOLINT putNum((uint64_t)arg); return *this; } @@ -208,7 +201,7 @@ class ostream : public virtual ios { * \param[in] arg value to output * \return the stream */ - ostream& operator<< (const void* arg) { + ostream &operator<<(const void *arg) { putNum(reinterpret_cast(arg)); return *this; } @@ -216,8 +209,8 @@ class ostream : public virtual ios { * \param[in] arg pointing to flash string * \return the stream */ - ostream &operator<< (const __FlashStringHelper *arg) { - putPgm(reinterpret_cast(arg)); + ostream &operator<<(const __FlashStringHelper *arg) { + putPgm(reinterpret_cast(arg)); return *this; } /** @@ -229,17 +222,17 @@ class ostream : public virtual ios { * \param[in] ch The character * \return A reference to the ostream object. */ - ostream& put(char ch) { + ostream &put(char ch) { putch(ch); return *this; } -// ostream& write(char *str, streamsize count); + // ostream& write(char *str, streamsize count); /** * Flushes the buffer associated with this stream. The flush function * calls the sync function of the associated file. * \return A reference to the ostream object. */ - ostream& flush() { + ostream &flush() { if (!sync()) { setstate(badbit); } @@ -248,15 +241,13 @@ class ostream : public virtual ios { /** * \return the stream position */ - pos_type tellp() { - return tellpos(); - } + pos_type tellp() { return tellpos(); } /** * Set the stream position * \param[in] pos The absolute position in which to move the write pointer. * \return Is always *this. Failure is indicated by the state of *this. */ - ostream& seekp(pos_type pos) { + ostream &seekp(pos_type pos) { if (!seekpos(pos)) { setstate(failbit); } @@ -270,7 +261,7 @@ class ostream : public virtual ios { * \param[in] way One of ios::beg, ios::cur, or ios::end. * \return Is always *this. Failure is indicated by the state of *this. */ - ostream& seekp(off_type off, seekdir way) { + ostream &seekp(off_type off, seekdir way) { if (!seekoff(off, way)) { setstate(failbit); } @@ -297,14 +288,14 @@ class ostream : public virtual ios { void putDouble(double n); void putNum(int32_t n); void putNum(int64_t n); - void putNum(uint32_t n) {putNum(n, false);} - void putNum(uint64_t n) {putNum(n, false);} - void putPgm(const char* str); - void putStr(const char* str); + void putNum(uint32_t n) { putNum(n, false); } + void putNum(uint64_t n) { putNum(n, false); } + void putPgm(const char *str); + void putStr(const char *str); - template - char* fmtNum(T n, char *ptr, uint8_t base) { - char a = flags() & uppercase ? 'A' - 10 : 'a' - 10; + template + char *fmtNum(T n, char *ptr, uint8_t base) { + char a = (flags() & uppercase) ? 'A' - 10 : 'a' - 10; do { T m = n; n /= base; @@ -314,12 +305,12 @@ class ostream : public virtual ios { return ptr; } - template + template void putNum(T n, bool neg) { - char buf[(8*sizeof(T) + 2)/3 + 2]; - char* ptr = buf + sizeof(buf) - 1; - char* num; - char* str; + char buf[(8 * sizeof(T) + 2) / 3 + 2]; + char *ptr = buf + sizeof(buf) - 1; + char *num; + char *str; uint8_t base = flagsToBase(); *ptr = '\0'; str = num = fmtNum(n, ptr, base); @@ -350,9 +341,4 @@ class ostream : public virtual ios { do_fill(len); } }; - - -}; // namespace sdfat - - #endif // ostream_h diff --git a/extra-libraries/ESP8266/ESP8266SdFat/src/sdios.h b/extra-libraries/ESP8266/ESP8266SdFat/src/sdios.h index 28017046..d86a0b01 100644 --- a/extra-libraries/ESP8266/ESP8266SdFat/src/sdios.h +++ b/extra-libraries/ESP8266/ESP8266SdFat/src/sdios.h @@ -1,5 +1,5 @@ /** - * Copyright (c) 2011-2020 Bill Greiman + * Copyright (c) 2011-2022 Bill Greiman * This file is part of the SdFat library for SD memory cards. * * MIT License @@ -29,6 +29,6 @@ * \brief C++ IO Streams features. */ #include "iostream/ArduinoStream.h" -#include "iostream/fstream.h" #include "iostream/StdioStream.h" +#include "iostream/fstream.h" #endif // sdios_h diff --git a/libraries/ESP32SSDP-1.2.1/.github/FUNDING.yml b/libraries/ESP32SSDP-1.2.1/.github/FUNDING.yml deleted file mode 100644 index 5425dcfd..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/FUNDING.yml +++ /dev/null @@ -1,11 +0,0 @@ -# These are supported funding model platforms - -#github: luc-github -#open_collective: # Replace with a single Open Collective username -#ko_fi: # Replace with a single Ko-fi username -#tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -#community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: ESP3D -#issuehunt: # Replace with a single IssueHunt username -#otechie: # Replace with a single Otechie username -#custom: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=Y8FFE7NA4LJWQ diff --git a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/bug_report.md b/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 2504bd12..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "[BUG]" -labels: bug -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Firmware:** -- ESP core version: [2.5.2] -- Library Version:[e.g 2.1b4] -- Wifi mode:[e.g. STA] - -**Board used (please complete the following information):** - - MCU: [e.g. ESP32] - - Name:[e.g. NodeMCU2s] - - Flash size: [e.g. 4M: 2M/2M] - -**Additional context** -Add any other context about the problem here. -Wiring, decoded stack, etc... diff --git a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/config.yml b/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 3ba13e0c..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1 +0,0 @@ -blank_issues_enabled: false diff --git a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/question-template.md b/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/question-template.md deleted file mode 100644 index be599fe4..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/question-template.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: Question template -about: Ask your question, if not bug neither feature request. -title: "[Question]" -labels: question -assignees: '' - ---- - -What is your question ? diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/build-ssdp.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/build-ssdp.sh deleted file mode 100644 index 1ef6e3b2..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/build-ssdp.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar - -#arduino or PlatformIO -ide=$1 - -# Make sure we are inside the github workspace -cd $GITHUB_WORKSPACE -#export paths -export PATH="$HOME/arduino_ide:$PATH" -export ARDUINO_IDE_PATH="$HOME/arduino_ide" -if [[ "$ide" == "arduino" ]]; -then - echo "Arduino" - fqbn=esp32:esp32:esp32:PartitionScheme=min_spiffs,FlashFreq=80,PSRAM=disabled,CPUFreq=240,FlashMode=qio,FlashSize=4M,DebugLevel=none - arduino-builder -hardware "$ARDUINO_IDE_PATH/hardware" -tools "$ARDUINO_IDE_PATH/tools-builder" -tools "$ARDUINO_IDE_PATH/tools" -libraries "$ARDUINO_IDE_PATH/libraries" -fqbn=$fqbn -compile -logger=human -core-api-version=10810 ./examples/SSDP/SSDP.ino -else - echo "PlatformIO" - cp -r ./src/ESP32SSDP.cpp ./examples/SSDP/ - cp -r ./src/ESP32SSDP.h ./examples/SSDP/ - cp ./test/platformio.ini ./examples/ - cd examples - platformio run -e esp32dev -fi diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/final-check.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/final-check.sh deleted file mode 100644 index 6299f85a..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/final-check.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar -# Make sure we are inside the github workspace -cd $GITHUB_WORKSPACE -echo $STEPS_CONTEXT -step=$1 -status=$2 - -if [[ "$status" == "success" ]]; -then - echo "Success build" - exit 0 - else - echo "Build failed" - exit 1 -fi - - diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/install-arduino.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/install-arduino.sh deleted file mode 100644 index a107f052..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/install-arduino.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar - -wget http://downloads.arduino.cc/arduino-1.8.13-linux64.tar.xz - -tar xf arduino-1.8.13-linux64.tar.xz - -mv arduino-1.8.13 $HOME/arduino_ide - diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/install-esp32.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/install-esp32.sh deleted file mode 100644 index 63c529d9..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/install-esp32.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar - -#install pyserial -echo "Installing Python Serial ..." -pip install pyserial - -echo "Clone esp32 core" -cd $HOME/arduino_ide/hardware -mkdir esp32 -cd esp32 -git clone https://github.com/espressif/arduino-esp32.git esp32 -cd esp32 -git submodule update --init -cd tools -python get.py diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/install-platformio.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/install-platformio.sh deleted file mode 100644 index a54fdc0e..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/install-platformio.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar - -pip install -U platformio -platformio update - diff --git a/libraries/ESP32SSDP-1.2.1/.github/ci/prepare-libs.sh b/libraries/ESP32SSDP-1.2.1/.github/ci/prepare-libs.sh deleted file mode 100644 index e4464b7b..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/ci/prepare-libs.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# Exit immediately if a command exits with a non-zero status. -set -e -# Enable the globstar shell option -shopt -s globstar -ls $HOME -# Make sure we are inside the github workspace -cd $GITHUB_WORKSPACE -mkdir -p $HOME/arduino_ide/libraries/SSDP -cp -R ./src $HOME/arduino_ide/libraries/SSDP -cp ./library.properties $HOME/arduino_ide/libraries/SSDP - diff --git a/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci-dev.yml b/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci-dev.yml deleted file mode 100644 index 5b36dbd3..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci-dev.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: build-ci-dev - -on: - pull_request: - branches: - - Dev - push: - branches: - - Dev - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - architecture: "x64" - - name: Install Arduino - run: bash ./.github/ci/install-arduino.sh - - name: Install platformIO - run: bash ./.github/ci/install-platformio.sh - - name: Install ESP32 - run: bash ./.github/ci/install-esp32.sh - - name: Setup libraries - run: bash ./.github/ci/prepare-libs.sh - - name: Build ESP32 arduino - id: esp32_1 - run: bash ./.github/ci/build-ssdp.sh arduino - continue-on-error: true - - name: Build platformIO - id: pio_1 - run: bash ./.github/ci/build-ssdp.sh pio - continue-on-error: true - - name: Final check - env: - STEPS_CONTEXT: ${{ toJson(steps) }} - if: steps.pio_1.outcome == 'failure' || steps.esp32_1.outcome == 'failure' - run: bash ./.github/ci/final-check.sh "GLOBAL" "failure" - - name: Final confirmation - env: - STEPS_CONTEXT: ${{ toJson(steps) }} - if: steps.pio_1.outcome == 'success' && steps.esp32_1.outcome == 'success' - run: bash ./.github/ci/final-check.sh "GLOBAL" "success" diff --git a/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci.yml b/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci.yml deleted file mode 100644 index f04a6f9c..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/workflows/build-ci.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: build-ci - -on: - pull_request: - branches: - - master - push: - branches: - - master - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.x - uses: actions/setup-python@v2 - with: - python-version: "3.x" - architecture: "x64" - - name: Install Arduino - run: bash ./.github/ci/install-arduino.sh - - name: Install platformIO - run: bash ./.github/ci/install-platformio.sh - - name: Install ESP32 - run: bash ./.github/ci/install-esp32.sh - - name: Setup libraries - run: bash ./.github/ci/prepare-libs.sh - - name: Build ESP32 arduino - id: esp32_1 - run: bash ./.github/ci/build-ssdp.sh arduino - continue-on-error: true - - name: Build platformIO - id: pio_1 - run: bash ./.github/ci/build-ssdp.sh pio - continue-on-error: true - - name: Final check - env: - STEPS_CONTEXT: ${{ toJson(steps) }} - if: steps.pio_1.outcome == 'failure' || steps.esp32_1.outcome == 'failure' - run: bash ./.github/ci/final-check.sh "GLOBAL" "failure" - - name: Final confirmation - env: - STEPS_CONTEXT: ${{ toJson(steps) }} - if: steps.pio_1.outcome == 'success' && steps.esp32_1.outcome == 'success' - run: bash ./.github/ci/final-check.sh "GLOBAL" "success" diff --git a/libraries/ESP32SSDP-1.2.1/.github/workflows/greetings.yml b/libraries/ESP32SSDP-1.2.1/.github/workflows/greetings.yml deleted file mode 100644 index 6a8dcbee..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/workflows/greetings.yml +++ /dev/null @@ -1,13 +0,0 @@ -name: Greetings - -on: [issues] - -jobs: - greeting: - runs-on: ubuntu-latest - steps: - - uses: actions/first-interaction@v1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-message: 'Thank your for submiting, please be sure you followed template or your issue may be dismissed.' - pr-message: 'Thank you for your contribution, be patient, review can take a time.' diff --git a/libraries/ESP32SSDP-1.2.1/.github/workflows/wiki.yml b/libraries/ESP32SSDP-1.2.1/.github/workflows/wiki.yml deleted file mode 100644 index 4171fe72..00000000 --- a/libraries/ESP32SSDP-1.2.1/.github/workflows/wiki.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Deploy Wiki - -on: - push: - paths: - # Trigger only when wiki directory changes - - 'wiki/**' - branches: - # And only on master branch - - wiki - -jobs: - deploy-wiki: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Push Wiki Changes - uses: Andrew-Chen-Wang/github-wiki-action@v2 - env: - # Make sure you have that / at the end. We use rsync - # WIKI_DIR's default is wiki/ - WIKI_DIR: wiki/ - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - GH_MAIL: ${{ secrets.MY_EMAIL }} - GH_NAME: ${{ github.repository_owner }} - EXCLUDED_FILES: "a/ b.md" diff --git a/libraries/ESP32SSDP-1.2.1/examples/SSDP/SSDP.ino b/libraries/ESP32SSDP-1.2.1/examples/SSDP/SSDP.ino deleted file mode 100644 index fdb06860..00000000 --- a/libraries/ESP32SSDP-1.2.1/examples/SSDP/SSDP.ino +++ /dev/null @@ -1,105 +0,0 @@ -#include -#include -#include - -const char* ssid = "********"; -const char* password = "********"; - -WebServer HTTP(80); - -void setup() -{ - Serial.begin(115200); - Serial.println(); - Serial.println("Starting WiFi..."); - - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); - if(WiFi.waitForConnectResult() == WL_CONNECTED) { - - Serial.printf("Starting HTTP...\n"); - HTTP.on("/index.html", HTTP_GET, []() { - HTTP.send(200, "text/plain", "Hello World!"); - }); - HTTP.on("/description.xml", HTTP_GET, []() { - SSDP.schema(HTTP.client()); - }); - HTTP.begin(); - - //set schema xml url, nees to match http handler - //"ssdp/schema.xml" if not set - SSDP.setSchemaURL("description.xml"); - //set port - //80 if not set - SSDP.setHTTPPort(80); - //set device name - //Null string if not set - SSDP.setName("Philips hue clone"); - //set Serial Number - //Null string if not set - SSDP.setSerialNumber("001788102201"); - //set device url - //Null string if not set - SSDP.setURL("index.html"); - //set model name - //Null string if not set - SSDP.setModelName("Philips hue bridge 2012"); - //set model description - //Null string if not set - SSDP.setModelDescription("This device can be controled by WiFi"); - //set model number - //Null string if not set - SSDP.setModelNumber("929000226503"); - //set model url - //Null string if not set - SSDP.setModelURL("http://www.meethue.com"); - //set model manufacturer name - //Null string if not set - SSDP.setManufacturer("Royal Philips Electronics"); - //set model manufacturer url - //Null string if not set - SSDP.setManufacturerURL("http://www.philips.com"); - //set device type - //"urn:schemas-upnp-org:device:Basic:1" if not set - SSDP.setDeviceType("rootdevice"); //to appear as root device, other examples: MediaRenderer, MediaServer ... - //set server name - //"Arduino/1.0" if not set - SSDP.setServerName("SSDPServer/1.0"); - //set UUID, you can use https://www.uuidgenerator.net/ - //use 38323636-4558-4dda-9188-cda0e6 + 4 last bytes of mac address if not set - //use SSDP.setUUID("daa26fa3-d2d4-4072-bc7a-a1b88ab4234a", false); for full UUID - SSDP.setUUID("daa26fa3-d2d4-4072-bc7a"); - //Set icons list, NB: optional, this is ignored under windows - SSDP.setIcons( "" - "image/png" - "48" - "48" - "24" - "icon48.png" - ""); - //Set service list, NB: optional for simple device - SSDP.setServices( "" - "urn:schemas-upnp-org:service:SwitchPower:1" - "urn:upnp-org:serviceId:SwitchPower:1" - "/SwitchPower1.xml" - "/SwitchPower/Control" - "/SwitchPower/Event" - ""); - - Serial.printf("Starting SSDP...\n"); - SSDP.begin(); - - Serial.printf("Ready!\n"); - } else { - Serial.printf("WiFi Failed\n"); - while(1) { - delay(100); - } - } -} - -void loop() -{ - HTTP.handleClient(); - delay(1); -} diff --git a/libraries/ESP32SSDP-1.2.1/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino b/libraries/ESP32SSDP-1.2.1/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino deleted file mode 100644 index 354413d1..00000000 --- a/libraries/ESP32SSDP-1.2.1/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino +++ /dev/null @@ -1,103 +0,0 @@ -#include "ESPAsyncWebServer.h" -#include "ESP32SSDP.h" - -const char* ssid = "********"; -const char* password = "********"; - -AsyncWebServer webserver(80); - -void setup() -{ - Serial.begin(115200); - Serial.println(); - Serial.println("Starting WiFi..."); - - WiFi.mode(WIFI_STA); - WiFi.begin(ssid, password); - if(WiFi.waitForConnectResult() == WL_CONNECTED) { - - Serial.printf("Starting HTTP...\n"); - webserver.on("/index.html", HTTP_GET, [&](AsyncWebServerRequest *request) { - request->send(200, "text/plain", "Hello World!"); - }); - webserver.on("/description.xml", HTTP_GET, [&](AsyncWebServerRequest *request) { - request->send(200, "text/xml", SSDP.schema(false)); - }); - webserver.begin(); - - //set schema xml url, nees to match http handler - //"ssdp/schema.xml" if not set - SSDP.setSchemaURL("description.xml"); - //set port - //80 if not set - SSDP.setHTTPPort(80); - //set device name - //Null string if not set - SSDP.setName("Philips hue clone"); - //set Serial Number - //Null string if not set - SSDP.setSerialNumber("001788102201"); - //set device url - //Null string if not set - SSDP.setURL("index.html"); - //set model name - //Null string if not set - SSDP.setModelName("Philips hue bridge 2012"); - //set model description - //Null string if not set - SSDP.setModelDescription("This device can be controled by WiFi"); - //set model number - //Null string if not set - SSDP.setModelNumber("929000226503"); - //set model url - //Null string if not set - SSDP.setModelURL("http://www.meethue.com"); - //set model manufacturer name - //Null string if not set - SSDP.setManufacturer("Royal Philips Electronics"); - //set model manufacturer url - //Null string if not set - SSDP.setManufacturerURL("http://www.philips.com"); - //set device type - //"urn:schemas-upnp-org:device:Basic:1" if not set - SSDP.setDeviceType("rootdevice"); //to appear as root device, other examples: MediaRenderer, MediaServer ... - //set server name - //"Arduino/1.0" if not set - SSDP.setServerName("SSDPServer/1.0"); - //set UUID, you can use https://www.uuidgenerator.net/ - //use 38323636-4558-4dda-9188-cda0e6 + 4 last bytes of mac address if not set - //use SSDP.setUUID("daa26fa3-d2d4-4072-bc7a-a1b88ab4234a", false); for full UUID - SSDP.setUUID("daa26fa3-d2d4-4072-bc7a"); - //Set icons list, NB: optional, this is ignored under windows - SSDP.setIcons( "" - "image/png" - "48" - "48" - "24" - "icon48.png" - ""); - //Set service list, NB: optional for simple device - SSDP.setServices( "" - "urn:schemas-upnp-org:service:SwitchPower:1" - "urn:upnp-org:serviceId:SwitchPower:1" - "/SwitchPower1.xml" - "/SwitchPower/Control" - "/SwitchPower/Event" - ""); - - Serial.printf("Starting SSDP...\n"); - SSDP.begin(); - - Serial.printf("Ready!\n"); - } else { - Serial.printf("WiFi Failed\n"); - while(1) { - delay(100); - } - } -} - -void loop() -{ - delay(1); -} diff --git a/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.cpp b/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.cpp deleted file mode 100644 index 9a912f0c..00000000 --- a/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.cpp +++ /dev/null @@ -1,734 +0,0 @@ -/* -ESP32 Simple Service Discovery -Copyright (c) 2015 Hristo Gochkov - -Original (Arduino) version by Filippo Sallemi, July 23, 2014. -Can be found at: https://github.com/nomadnt/uSSDP - -License (MIT license): - 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. - -*/ -#ifdef ARDUINO_ARCH_ESP32 -#include -#include "ESP32SSDP.h" -#include -#include - -//#define DEBUG_SSDP Serial -//#define DEBUG_VERBOSE_SSDP -//#define DEBUG_WITH_MARLIN -#if defined (DEBUG_WITH_MARLIN) -class FlushableHardwareSerial : public HardwareSerial -{ -public: - FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {} -}; -extern FlushableHardwareSerial flushableSerial; -#define DEBUG_SSDP flushableSerial -#endif //endif DEBUG_WITH_MARLIN - - -#define SSDP_INTERVAL 1200 -#define SSDP_PORT 1900 -#define SSDP_METHOD_SIZE 10 -#define SSDP_URI_SIZE 2 -#define SSDP_BUFFER_SIZE 64 -#define SSDP_MULTICAST_TTL 2 -static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250); -#define SSDP_UUID_ROOT "38323636-4558-4dda-9188-cda0e6" - - -static const char _ssdp_response_template[] PROGMEM = - "HTTP/1.1 200 OK\r\n" - "EXT:\r\n"; - -static const char _ssdp_notify_template[] PROGMEM = - "NOTIFY * HTTP/1.1\r\n" - "HOST: 239.255.255.250:1900\r\n" - "NTS: ssdp:alive\r\n"; - -static const char _ssdp_packet_template[] PROGMEM = - "%s" // _ssdp_response_template / _ssdp_notify_template - "CACHE-CONTROL: max-age=%u\r\n" // _interval - "SERVER: %s UPNP/1.1 %s/%s\r\n" // _servername, _modelName, _modelNumber - "USN: uuid:%s%s\r\n" // _uuid, _usn_suffix - "%s: %s\r\n" // "NT" or "ST", _deviceType - "LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, _schemaURL - "\r\n"; - -/*This need to be removed as part as deprecated, headers should be handled outside of library*/ -static const char _ssdp_schema_header[] PROGMEM = - "HTTP/1.1 200 OK\r\n" - "Content-Type: text/xml\r\n" - "Connection: close\r\n" - "Access-Control-Allow-Origin: *\r\n" - "\r\n"; - -static const char _ssdp_schema_template[] PROGMEM = - "" - "" - "" - "1" - "0" - "" - "http://%u.%u.%u.%u:%u/" // WiFi.localIP(), _port - "" - "urn:schemas-upnp-org:device:%s:1" - "%s" - "%s" - "%s" - "%s" - "%s" - "%s" - "%s" - "%s" - "%s" - "uuid:%s" - "%s" - "%s" - "" - "\r\n" - "\r\n"; - -SSDPClass::SSDPClass() : - _replySlots{NULL}, - _respondToAddr{0,0,0,0} -{ - _port = 80; - _ttl = SSDP_MULTICAST_TTL; - _interval = SSDP_INTERVAL; - _respondToPort = 0; - _pending = false; - _stmatch = false; - _delay=0; - _process_time = 0; - _notify_time = 0; - _uuid[0] = '\0'; - _usn_suffix[0] = '\0'; - _respondType[0] = '\0'; - _modelNumber[0] = '\0'; - sprintf(_deviceType, "Basic"); - _friendlyName[0] = '\0'; - _presentationURL[0] = '\0'; - _serialNumber[0] = '\0'; - _modelName[0] = '\0'; - _modelURL[0] = '\0'; - _manufacturer[0] = '\0'; - _manufacturerURL[0] = '\0'; - _servername = "Arduino/1.0"; - sprintf(_schemaURL, "ssdp/schema.xml"); - _schema = nullptr; -} - -SSDPClass::~SSDPClass() -{ - end(); -} - -void SSDPClass::end() -{ - if (_schema) { - free(_schema); - _schema = nullptr; - } -#if defined( DEBUG_SSDP) && defined (DEBUG_VERBOSE_SSDP) - DEBUG_SSDP.printf_P(PSTR("SSDP end ... ")); -#endif -} - -IPAddress SSDPClass::localIP() -{ - tcpip_adapter_ip_info_t ip; - if (WiFi.getMode() == WIFI_STA) { - if (tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip)) { - return IPAddress(); - } - } else if (WiFi.getMode() == WIFI_OFF) { - if (tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)) { - return IPAddress(); - } - } - return IPAddress(ip.ip.addr); -} - -void SSDPClass::setUUID(const char *uuid, bool rootonly) -{ - //no sanity check is done - TBD - if (rootonly) { - uint32_t chipId = ((uint16_t) (ESP.getEfuseMac() >> 32)); - sprintf(_uuid, "%s%02x%02x%02x", - uuid, - (uint16_t) ((chipId >> 16) & 0xff), - (uint16_t) ((chipId >> 8) & 0xff), - (uint16_t) chipId & 0xff ); - } else { - strlcpy(_uuid, uuid,sizeof(_uuid)); - } -} - -bool SSDPClass::begin() -{ - _pending = false; - _stmatch = false; - end(); - if (strlen(_uuid) == 0) { - setUUID(SSDP_UUID_ROOT); - } -#if defined (DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) - DEBUG_SSDP.printf("SSDP UUID: %s\n", (char *)_uuid); -#endif - if(_udp.connected()) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("Already connected, abort begin"); -#endif - return false; - } - - _udp.onPacket([](void * arg, AsyncUDPPacket& packet) { - ((SSDPClass*)(arg))->_onPacket(packet); - }, this); - - if (!_udp.listenMulticast(IPAddress(SSDP_MULTICAST_ADDR),SSDP_PORT, _ttl)) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("Error begin"); -#endif - return false; - } - - return true; -} - -void SSDPClass::_send(ssdp_method_t method) -{ - char buffer[1460]; - IPAddress ip = localIP(); - - char * valueBuffer = (char *)malloc(strlen_P(_ssdp_notify_template)+1); - if (!valueBuffer) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("Error not enough memory for valueBuffer creation"); -#endif - return; - } - strcpy_P(valueBuffer, (method == NONE)?_ssdp_response_template:_ssdp_notify_template); - - int len = snprintf_P(buffer, sizeof(buffer)-1, - _ssdp_packet_template, - valueBuffer, - _interval, - _servername.c_str(), - _modelName, _modelNumber, - _uuid, _usn_suffix, - (method == NONE)?"ST":"NT", - _respondType, - ip[0], ip[1], ip[2], ip[3], _port, _schemaURL - ); - if(len <= 0) { - free(valueBuffer); -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("Error not enough memory for using valueBuffer"); -#endif - return; - } - IPAddress remoteAddr; - uint16_t remotePort; - if(method == NONE) { - remoteAddr = _respondToAddr; - remotePort = _respondToPort; -#ifdef DEBUG_SSDP - DEBUG_SSDP.print("Sending Response to "); -#endif - } else { - remoteAddr = IPAddress(SSDP_MULTICAST_ADDR); - remotePort = SSDP_PORT; -#ifdef DEBUG_SSDP - DEBUG_SSDP.print("Sending Notify to "); -#endif - } -#ifdef DEBUG_SSDP - DEBUG_SSDP.print(remoteAddr); - DEBUG_SSDP.print(":"); - DEBUG_SSDP.println(remotePort); -#endif - _udp.writeTo((const uint8_t *)buffer, len, remoteAddr, remotePort); -#if defined (DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) - DEBUG_SSDP.println("*************************TX*************************"); - DEBUG_SSDP.println(buffer); - DEBUG_SSDP.println("****************************************************"); -#endif - free(valueBuffer); -} - -const char * SSDPClass::getSchema() -{ - uint len = strlen(_ssdp_schema_template) - + 21 //(IP = 15) + 1 (:) + 5 (port) - + SSDP_DEVICE_TYPE_SIZE - + SSDP_FRIENDLY_NAME_SIZE - + SSDP_SCHEMA_URL_SIZE - + SSDP_SERIAL_NUMBER_SIZE - + SSDP_MODEL_NAME_SIZE - + _modelDescription.length() - + SSDP_MODEL_VERSION_SIZE - + SSDP_MODEL_URL_SIZE - + SSDP_MANUFACTURER_SIZE - + SSDP_MANUFACTURER_URL_SIZE - + SSDP_UUID_SIZE - + _services.length() - + _icons.length(); - if (_schema) { - free (_schema); - _schema = nullptr; - } - _schema = (char *)malloc(len+1); - if (_schema) { - IPAddress ip = localIP(); - sprintf(_schema, _ssdp_schema_template, - ip[0], ip[1], ip[2], ip[3], _port, - _deviceType, - _friendlyName, - _presentationURL, - _serialNumber, - _modelName, - _modelDescription.c_str(), - _modelNumber, - _modelURL, - _manufacturer, - _manufacturerURL, - _uuid, - _services.c_str(), - _icons.c_str() - ); - } else { -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("not enough memory for schema"); -#endif - } - return _schema; -} -/*This function is now deprecated and will be removed in future release*/ -/*Please use getSchema() instead */ -void SSDPClass::schema(WiFiClient client, bool sendHeaders) -{ - if(sendHeaders) { - client.print(_ssdp_schema_header); - } - client.print(getSchema()); -} - -/*This function is now deprecated and will be removed in future release*/ -/*Please use getSchema() instead */ -const char * SSDPClass::schema(bool includeheader) -{ - return getSchema(); -} - -void SSDPClass::_onPacket(AsyncUDPPacket& packet) -{ - if (packet.length()== 0) { - return; - } - int nbBytes =0; - char * packetBuffer = nullptr; - - if(!_pending ) { - ssdp_method_t method = NONE; - nbBytes= packet.length(); - - typedef enum {METHOD, URI, PROTO, KEY, VALUE, ABORT} states; - states state = METHOD; - typedef enum {STRIP, START, SKIP, MAN, ST, MX} headers; - headers header = STRIP; - - uint8_t cursor = 0; - uint8_t cr = 0; - - char buffer[SSDP_BUFFER_SIZE] = {0}; - packetBuffer = new char[nbBytes +1]; - if (packetBuffer == nullptr) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("not enough memory for the packet"); -#endif - return; - } - int process_pos = 0; - strncpy(packetBuffer,(const char*)packet.data(),nbBytes); - packetBuffer[nbBytes]='\0'; - _respondToAddr = packet.remoteIP(); - _respondToPort = packet.remotePort(); - -#if defined( DEBUG_SSDP) && defined (DEBUG_VERBOSE_SSDP) - if (nbBytes) { - DEBUG_SSDP.println("*************************RX*************************"); - DEBUG_SSDP.print(packet.remoteIP()); - DEBUG_SSDP.print(":"); - DEBUG_SSDP.println(packet.remotePort()); - DEBUG_SSDP.println(packetBuffer); - DEBUG_SSDP.println("****************************************************"); - } -#endif - while(process_pos < nbBytes) { - - char c = packetBuffer[process_pos]; - process_pos++; - (c == '\r' || c == '\n') ? cr++ : cr = 0; - switch(state) { - case METHOD: - if(c == ' ') { - if(strcmp(buffer, "M-SEARCH") == 0) { - method = SEARCH; - } - - if(method == NONE) { - state = ABORT; - } else { - state = URI; - } - cursor = 0; - - } else if(cursor < SSDP_METHOD_SIZE - 1) { - buffer[cursor++] = c; - buffer[cursor] = '\0'; - } - break; - case URI: - if(c == ' ') { - if(strcmp(buffer, "*")) { - state = ABORT; - } else { - state = PROTO; - } - cursor = 0; - } else if(cursor < SSDP_URI_SIZE - 1) { - buffer[cursor++] = c; - buffer[cursor] = '\0'; - } - break; - case PROTO: - if(cr == 2) { - state = KEY; - cursor = 0; - } - break; - case KEY: - // end of HTTP request parsing. If we find a match start reply delay. - if(cr == 4) { - if (_stmatch) { - _pending = true; - _process_time = millis(); - } - } else if(c == ':') { - cursor = 0; - state = VALUE; - } else if(c != '\r' && c != '\n' && c != ' ' && cursor < SSDP_BUFFER_SIZE - 1) { - buffer[cursor++] = c; - buffer[cursor] = '\0'; - } - break; - case VALUE: - if(cr == 2) { - switch(header) { - case START: -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("***********************"); -#endif - case STRIP: - case SKIP: - break; - case MAN: -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("MAN: %s\n", (char *)buffer); -#endif - break; - case ST: - // save the search term for the reply and clear usn suffix. - strlcpy(_respondType, buffer, sizeof(_respondType)); - _usn_suffix[0] = '\0'; -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("ST: '%s'\n",buffer); -#endif - // if looking for all or root reply with upnp:rootdevice - if(strcmp(buffer, "ssdp:all")==0 || strcmp(buffer, "upnp:rootdevice")==0) { - _stmatch = true; - // set USN suffix - strlcpy(_usn_suffix, "::upnp:rootdevice", sizeof(_usn_suffix)); -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("the search type matches all and root"); -#endif - state = KEY; - } else - // if the search type matches our type, we should respond instead of ABORT - if(strcasecmp(buffer, _deviceType) == 0) { - _stmatch = true; - // set USN suffix to the device type - strlcpy(_usn_suffix, "::", sizeof(_usn_suffix)); - strlcat(_usn_suffix, _deviceType, sizeof(_usn_suffix)); -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("the search type matches our type"); -#endif - state = KEY; - } else { - state = ABORT; -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("REJECT. The search type does not match our type"); - DEBUG_SSDP.println("***********************"); - -#endif - } - break; - case MX: - // delay in ms from 0 to MX*1000 where MX is in seconds with limits. - _delay = (short)random(0, atoi(buffer) * 1000L); - if (_delay > SSDP_MAX_DELAY) { - _delay = SSDP_MAX_DELAY; - } - break; - } - - if(state != ABORT) { - state = KEY; - header = STRIP; - cursor = 0; - } - } else if(c != '\r' && c != '\n') { - if(header == STRIP) { - if(c == ' ') { - break; - } else { - header = START; - } - } - if(header == START) { - if(strncmp(buffer, "MA", 2) == 0) { - header = MAN; - } else if(strcmp(buffer, "ST") == 0) { - header = ST; - } else if(strcmp(buffer, "MX") == 0) { - header = MX; - } else { - header = SKIP; - } - } - - if(cursor < SSDP_BUFFER_SIZE - 1) { - buffer[cursor++] = c; - buffer[cursor] = '\0'; - } - } - break; - case ABORT: - _pending = false; - _delay = 0; - break; - } - } - } - if(packetBuffer) { - delete packetBuffer; - } - // save reply in reply queue if one is pending - if(_pending) { - int i; - // Many UPNP hosts send out mulitple M-SEARCH packets at the same time to mitigate - // packet loss. Just reply to one for a given host:port. - for (i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { - if (_replySlots[i]) { - if (_replySlots[i]->_respondToPort == _respondToPort && - _replySlots[i]->_respondToAddr == _respondToAddr - ) { - // keep original delay - _delay = _replySlots[i]->_delay; - _process_time = _replySlots[i]->_process_time; -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("Remove duplicate SSDP reply in slot %i.\n", i); -#endif - delete _replySlots[i]; - _replySlots[i] = 0; - } - } - } - // save packet to available reply queue slot - for (i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { - if (!_replySlots[i]) { -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("Saving deferred SSDP reply to queue slot %i.\n", i); - DEBUG_SSDP.println("***********************"); - -#endif - _replySlots[i] = new ssdp_reply_slot_item_t; - if (_replySlots[i]) { - _replySlots[i]->_process_time = _process_time; - _replySlots[i]->_delay = _delay; - _replySlots[i]->_respondToAddr = _respondToAddr; - _replySlots[i]->_respondToPort = _respondToPort; - strlcpy(_replySlots[i]->_respondType, _respondType, sizeof(_replySlots[i]->_respondType)); - strlcpy(_replySlots[i]->_usn_suffix, _usn_suffix, sizeof(_replySlots[i]->_usn_suffix)); - } - break; - } - } -#ifdef DEBUG_SSDP - if (i == SSDP_MAX_REPLY_SLOTS) { - DEBUG_SSDP.println("SSDP reply queue is full dropping packet."); - } -#endif - _pending = false; - _delay = 0; - } - // send any packets that are pending and overdue. - unsigned long t = millis(); - bool sent = false; - for (int i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { - if (_replySlots[i]) { - // millis delay with overflow protection. - if (t - _replySlots[i]->_process_time > _replySlots[i]->_delay) { - // reply ready. restore and send. - _respondToAddr = _replySlots[i]->_respondToAddr; - _respondToPort = _replySlots[i]->_respondToPort; - strlcpy(_respondType, _replySlots[i]->_respondType, sizeof(_respondType)); - strlcpy(_usn_suffix, _replySlots[i]->_usn_suffix, sizeof(_usn_suffix)); -#ifdef DEBUG_SSDP - DEBUG_SSDP.printf("Slot(%d) ", i); - DEBUG_SSDP.println("Send None"); -#endif - _send(NONE); - sent = true; - delete _replySlots[i]; - _replySlots[i] = 0; -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("***********************"); -#endif - } - } - } -#if defined (DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) - uint8_t rcount = 0; - DEBUG_SSDP.print("SSDP reply queue status: ["); - for (int i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { - DEBUG_SSDP.print(_replySlots[i] ? "X" : "-" ); - } - DEBUG_SSDP.println("]"); -#endif - if(_notify_time == 0 || (millis() - _notify_time) > (_interval * 1000L)) { - _notify_time = millis(); - // send notify with our root device type - strlcpy(_respondType, "upnp:rootdevice", sizeof(_respondType)); - strlcpy(_usn_suffix, "::upnp:rootdevice", sizeof(_usn_suffix)); -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("Send Notify"); -#endif - _send(NOTIFY); - sent = true; -#ifdef DEBUG_SSDP - DEBUG_SSDP.println("***********************"); -#endif - } - if (!sent) { -#if defined (DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) - DEBUG_SSDP.println("Do not sent"); -#endif - } -} - -void SSDPClass::setSchemaURL(const char *url) -{ - strlcpy(_schemaURL, url, sizeof(_schemaURL)); -} - -void SSDPClass::setHTTPPort(uint16_t port) -{ - _port = port; -} - -void SSDPClass::setDeviceType(const char *deviceType) -{ - strlcpy(_deviceType, deviceType, sizeof(_deviceType)); -} - -void SSDPClass::setName(const char *name) -{ - strlcpy(_friendlyName, name, sizeof(_friendlyName)); -} - -void SSDPClass::setURL(const char *url) -{ - strlcpy(_presentationURL, url, sizeof(_presentationURL)); -} - -void SSDPClass::setSerialNumber(const char *serialNumber) -{ - strlcpy(_serialNumber, serialNumber, sizeof(_serialNumber)); -} - -void SSDPClass::setSerialNumber(const uint32_t serialNumber) -{ - snprintf(_serialNumber, sizeof(uint32_t)*2+1, "%08X", serialNumber); -} - -void SSDPClass::setModelName(const char *name) -{ - strlcpy(_modelName, name, sizeof(_modelName)); -} - -void SSDPClass::setModelDescription(const char *desc) -{ - _modelDescription = desc; -} -void SSDPClass::setServerName(const char *name) -{ - _servername = name; -} - -void SSDPClass::setModelNumber(const char *num) -{ - strlcpy(_modelNumber, num, sizeof(_modelNumber)); -} - -void SSDPClass::setModelURL(const char *url) -{ - strlcpy(_modelURL, url, sizeof(_modelURL)); -} - -void SSDPClass::setManufacturer(const char *name) -{ - strlcpy(_manufacturer, name, sizeof(_manufacturer)); -} - -void SSDPClass::setManufacturerURL(const char *url) -{ - strlcpy(_manufacturerURL, url, sizeof(_manufacturerURL)); -} - -void SSDPClass::setTTL(const uint8_t ttl) -{ - _ttl = ttl; -} - -void SSDPClass::setInterval(uint32_t interval) -{ - _interval = interval; -} - - -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP) -SSDPClass SSDP; -#endif - -#endif diff --git a/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.h b/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.h deleted file mode 100644 index 788229f0..00000000 --- a/libraries/ESP32SSDP-1.2.1/src/ESP32SSDP.h +++ /dev/null @@ -1,196 +0,0 @@ -/* -ESP32 Simple Service Discovery -Copyright (c) 2015 Hristo Gochkov - -Original (Arduino) version by Filippo Sallemi, July 23, 2014. -Can be found at: https://github.com/nomadnt/uSSDP - -License (MIT license): - 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. - -*/ -#ifdef ARDUINO_ARCH_ESP32 -#ifndef ESP32SSDP_H -#define ESP32SSDP_H - -#include -#include -#include - -#define SSDP_UUID_SIZE 37 -#define SSDP_SCHEMA_URL_SIZE 64 -#define SSDP_DEVICE_TYPE_SIZE 64 -#define SSDP_FRIENDLY_NAME_SIZE 64 -#define SSDP_SERIAL_NUMBER_SIZE 32 -#define SSDP_PRESENTATION_URL_SIZE 128 -#define SSDP_MODEL_NAME_SIZE 64 -#define SSDP_MODEL_URL_SIZE 128 -#define SSDP_MODEL_VERSION_SIZE 32 -#define SSDP_MANUFACTURER_SIZE 64 -#define SSDP_MANUFACTURER_URL_SIZE 128 -#define SSDP_MAX_REPLY_SLOTS 5 -#define SSDP_MAX_DELAY 10000 - -typedef enum { - NONE, - SEARCH, - NOTIFY -} ssdp_method_t; - -typedef struct { - unsigned long _process_time; - short _delay; - IPAddress _respondToAddr; - uint16_t _respondToPort; - char _respondType[SSDP_DEVICE_TYPE_SIZE]; - char _usn_suffix[SSDP_DEVICE_TYPE_SIZE]; -} ssdp_reply_slot_item_t; - -class SSDPClass -{ -public: - SSDPClass(); - ~SSDPClass(); - - bool begin(); - void end(); - - void schema(WiFiClient client, bool sendHeaders = true) __attribute__((deprecated)); - const char * schema(bool includeheader = true) __attribute__((deprecated)); - const char * getSchema(); - - void setDeviceType(const String& deviceType) - { - setDeviceType(deviceType.c_str()); - } - void setDeviceType(const char *deviceType); - void setName(const String& name) - { - setName(name.c_str()); - } - void setName(const char *name); - void setURL(const String& url) - { - setURL(url.c_str()); - } - void setURL(const char *url); - void setSchemaURL(const String& url) - { - setSchemaURL(url.c_str()); - } - void setSchemaURL(const char *url); - void setSerialNumber(const String& serialNumber) - { - setSerialNumber(serialNumber.c_str()); - } - void setSerialNumber(const char *serialNumber); - void setSerialNumber(const uint32_t serialNumber); - void setModelName(const String& name) - { - setModelName(name.c_str()); - } - void setModelName(const char *name); - void setModelNumber(const String& num) - { - setModelNumber(num.c_str()); - } - void setModelNumber(const char *num); - void setModelURL(const String& url) - { - setModelURL(url.c_str()); - } - void setModelDescription(const String& desc) - { - setModelDescription(desc.c_str()); - } - void setModelDescription(const char *desc); - void setServerName(const String& name) - { - setServerName(name.c_str()); - } - void setServerName(const char *name); - void setModelURL(const char *url); - void setManufacturer(const String& name) - { - setManufacturer(name.c_str()); - } - void setManufacturer(const char *name); - void setManufacturerURL(const String& url) - { - setManufacturerURL(url.c_str()); - } - void setManufacturerURL(const char *url); - void setHTTPPort(uint16_t port); - void setTTL(uint8_t ttl); - void setInterval(uint32_t interval); - void setUUID(const char * uuid, bool rootonly = true); - void setServices(const char * services) - { - _services = services; - } - void setIcons(const char * icons) - { - _icons = icons; - } - -protected: - - void _onPacket(AsyncUDPPacket& packet); - void _send(ssdp_method_t method); - IPAddress localIP(); - uint16_t _port; - uint32_t _ttl; - uint32_t _interval; - AsyncUDP _udp; - ssdp_reply_slot_item_t *_replySlots[SSDP_MAX_REPLY_SLOTS]; - IPAddress _respondToAddr; - uint16_t _respondToPort; - - bool _pending; - bool _stmatch; - short _delay; - unsigned long _process_time; - unsigned long _notify_time; - - char _respondType[SSDP_DEVICE_TYPE_SIZE]; - char _schemaURL[SSDP_SCHEMA_URL_SIZE]; - char _uuid[SSDP_UUID_SIZE]; - char _usn_suffix[SSDP_DEVICE_TYPE_SIZE]; - char _deviceType[SSDP_DEVICE_TYPE_SIZE]; - char _friendlyName[SSDP_FRIENDLY_NAME_SIZE]; - char _serialNumber[SSDP_SERIAL_NUMBER_SIZE]; - char _presentationURL[SSDP_PRESENTATION_URL_SIZE]; - char _manufacturer[SSDP_MANUFACTURER_SIZE]; - char _manufacturerURL[SSDP_MANUFACTURER_URL_SIZE]; - char _modelName[SSDP_MODEL_NAME_SIZE]; - char _modelURL[SSDP_MODEL_URL_SIZE]; - char _modelNumber[SSDP_MODEL_VERSION_SIZE]; - String _modelDescription; - String _servername; - char * _schema; - String _services; - String _icons; -}; - -#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP) -extern SSDPClass SSDP; -#endif - -#endif -#endif diff --git a/libraries/ESP32SSDP-1.2.1/.all-contributorsrc b/libraries/ESP32SSDP-2.0.2/.all-contributorsrc similarity index 100% rename from libraries/ESP32SSDP-1.2.1/.all-contributorsrc rename to libraries/ESP32SSDP-2.0.2/.all-contributorsrc diff --git a/libraries/ESP32SSDP-1.2.1/.astylerc b/libraries/ESP32SSDP-2.0.2/.astylerc similarity index 100% rename from libraries/ESP32SSDP-1.2.1/.astylerc rename to libraries/ESP32SSDP-2.0.2/.astylerc diff --git a/libraries/ESP32SSDP-1.2.1/.gitignore b/libraries/ESP32SSDP-2.0.2/.gitignore similarity index 100% rename from libraries/ESP32SSDP-1.2.1/.gitignore rename to libraries/ESP32SSDP-2.0.2/.gitignore diff --git a/libraries/ESP32SSDP-1.2.1/LICENSE b/libraries/ESP32SSDP-2.0.2/LICENSE similarity index 100% rename from libraries/ESP32SSDP-1.2.1/LICENSE rename to libraries/ESP32SSDP-2.0.2/LICENSE diff --git a/libraries/ESP32SSDP-1.2.1/README.md b/libraries/ESP32SSDP-2.0.2/README.md similarity index 65% rename from libraries/ESP32SSDP-1.2.1/README.md rename to libraries/ESP32SSDP-2.0.2/README.md index d1bc9ee1..54bfd99b 100644 --- a/libraries/ESP32SSDP-1.2.1/README.md +++ b/libraries/ESP32SSDP-2.0.2/README.md @@ -3,11 +3,12 @@ ESP32 Simple Service Discovery Copyright (c) 2015 Hristo Gochkov [![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) Original (Arduino) version by Filippo Sallemi, July 23, 2014. Can be -found at: https://github.com/nomadnt/uSSDP +found at: https://github.com/nomadnt/uSSDP -[Latest stable release ![Release Version](https://img.shields.io/github/release/luc-github/ESP32SSDP.svg?style=plastic) ![Release Date](https://img.shields.io/github/release-date/luc-github/ESP32SSDP.svg?style=plastic)](https://github.com/luc-github/ESP32SSDP/releases/latest/) [![github-ci](https://github.com/luc-github/ESP32SSDP/workflows/build-ci/badge.svg)](https://github.com/luc-github/ESP32SSDP/actions/workflows/build-ci.yml) +Version 2.x for ESP32 V3.0.0 and later. + +[Latest stable release ![Release Version](https://img.shields.io/github/release/luc-github/ESP32SSDP.svg?style=plastic) ![Release Date](https://img.shields.io/github/release-date/luc-github/ESP32SSDP.svg?style=plastic)](https://github.com/luc-github/ESP32SSDP/releases/latest/) [![github-ci](https://github.com/luc-github/ESP32SSDP/workflows/build-ci-v2/badge.svg)](https://github.com/luc-github/ESP32SSDP/actions/workflows/build-ci-v2.yml) [![ESP32 Core Version](https://img.shields.io/badge/ESP32-v3.0.0-yellow?style=plastic&label=ESP32)](https://github.com/espressif/arduino-esp32/releases/tag/3.0.0) -[Latest development version ![Development Version](https://img.shields.io/badge/devt-yellow?style=plastic) ![GitHub last commit (branch)](https://img.shields.io/github/last-commit/luc-github/ESP32SSDP/Dev?style=plastic)](https://github.com/luc-github/ESP32SSDP/tree/devt) [![github-ci](https://github.com/luc-github/ESP32SSDP/workflows/build-ci-dev/badge.svg)](https://github.com/luc-github/ESP32SSDP/actions/workflows/build-ci-dev.yml) The IDF component version can be found here: https://github.com/luc-github/SSDP_IDF @@ -22,16 +23,21 @@ 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. +> [!WARNING] +>### Disclaimer +> The software is provided 'as is,' without any warranty of any kind, expressed or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. 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. +>It is essential that you carefully read and understand this disclaimer before using this software and its components. If you do not agree with any part of this disclaimer, please refrain from using the software. + +> [!NOTE] +>### Be Noted +> This version is an update for ESP32 V3.0.0 and later which is a breaking change, so this version of the library is not compatible with the previous versions of the ESP32 core. The previous version of the library is available in the branch [V1.x](https://github.com/luc-github/ESP32SSDP/tree/V1.x). +> The deprecated functions of 1.x version have been removed. + ## Contributors ✨ + + Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): @@ -52,4 +58,4 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d -This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! diff --git a/libraries/ESP32SSDP-1.2.1/examples/SSDP/Readme.md b/libraries/ESP32SSDP-2.0.2/examples/SSDP/Readme.md similarity index 100% rename from libraries/ESP32SSDP-1.2.1/examples/SSDP/Readme.md rename to libraries/ESP32SSDP-2.0.2/examples/SSDP/Readme.md diff --git a/libraries/ESP32SSDP-2.0.2/examples/SSDP/SSDP.ino b/libraries/ESP32SSDP-2.0.2/examples/SSDP/SSDP.ino new file mode 100644 index 00000000..aa4e9a5c --- /dev/null +++ b/libraries/ESP32SSDP-2.0.2/examples/SSDP/SSDP.ino @@ -0,0 +1,104 @@ +#include +#include +#include + +const char* ssid = "********"; +const char* password = "********"; + +WebServer HTTP(80); + +void setup() { + Serial.begin(115200); + Serial.println(); + Serial.println("Starting WiFi..."); + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() == WL_CONNECTED) { + Serial.printf("Starting HTTP...\n"); + HTTP.on("/index.html", HTTP_GET, + []() { HTTP.send(200, "text/plain", "Hello World!"); }); + HTTP.on("/description.xml", HTTP_GET, []() { HTTP.send(200, "text/xml", SSDP.getSchema());}); + HTTP.begin(); + + // set schema xml url, nees to match http handler + //"ssdp/schema.xml" if not set + SSDP.setSchemaURL("description.xml"); + // set port + // 80 if not set + SSDP.setHTTPPort(80); + // set device name + // Null string if not set + SSDP.setName("Philips hue clone"); + // set Serial Number + // Null string if not set + SSDP.setSerialNumber("001788102201"); + // set device url + // Null string if not set + SSDP.setURL("index.html"); + // set model name + // Null string if not set + SSDP.setModelName("Philips hue bridge 2012"); + // set model description + // Null string if not set + SSDP.setModelDescription("This device can be controled by WiFi"); + // set model number + // Null string if not set + SSDP.setModelNumber("929000226503"); + // set model url + // Null string if not set + SSDP.setModelURL("http://www.meethue.com"); + // set model manufacturer name + // Null string if not set + SSDP.setManufacturer("Royal Philips Electronics"); + // set model manufacturer url + // Null string if not set + SSDP.setManufacturerURL("http://www.philips.com"); + // set device type + //"urn:schemas-upnp-org:device:Basic:1" if not set + SSDP.setDeviceType( + "rootdevice"); // to appear as root device, other examples: + // MediaRenderer, MediaServer ... + // set server name + //"Arduino/1.0" if not set + SSDP.setServerName("SSDPServer/1.0"); + // set UUID, you can use https://www.uuidgenerator.net/ + // use 38323636-4558-4dda-9188-cda0e6 + 4 last bytes of mac address if not + // set use SSDP.setUUID("daa26fa3-d2d4-4072-bc7a-a1b88ab4234a", false); for + // full UUID + SSDP.setUUID("daa26fa3-d2d4-4072-bc7a"); + // Set icons list, NB: optional, this is ignored under windows + SSDP.setIcons( + "" + "image/png" + "48" + "48" + "24" + "icon48.png" + ""); + // Set service list, NB: optional for simple device + SSDP.setServices( + "" + "urn:schemas-upnp-org:service:SwitchPower:1" + "urn:upnp-org:serviceId:SwitchPower:1" + "/SwitchPower1.xml" + "/SwitchPower/Control" + "/SwitchPower/Event" + ""); + + Serial.printf("Starting SSDP...\n"); + SSDP.begin(); + + Serial.printf("Ready!\n"); + } else { + Serial.printf("WiFi Failed\n"); + while (1) { + delay(100); + } + } +} + +void loop() { + HTTP.handleClient(); + delay(1); +} diff --git a/libraries/ESP32SSDP-1.2.1/examples/SSDPAsyncWebserver/Readme.md b/libraries/ESP32SSDP-2.0.2/examples/SSDPAsyncWebserver/Readme.md similarity index 100% rename from libraries/ESP32SSDP-1.2.1/examples/SSDPAsyncWebserver/Readme.md rename to libraries/ESP32SSDP-2.0.2/examples/SSDPAsyncWebserver/Readme.md diff --git a/libraries/ESP32SSDP-2.0.2/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino b/libraries/ESP32SSDP-2.0.2/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino new file mode 100644 index 00000000..de838833 --- /dev/null +++ b/libraries/ESP32SSDP-2.0.2/examples/SSDPAsyncWebserver/SSDPAsyncWebserver.ino @@ -0,0 +1,104 @@ +#include "ESP32SSDP.h" +#include "ESPAsyncWebServer.h" + +const char* ssid = "********"; +const char* password = "********"; + +AsyncWebServer webserver(80); + +void setup() { + Serial.begin(115200); + Serial.println(); + Serial.println("Starting WiFi..."); + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, password); + if (WiFi.waitForConnectResult() == WL_CONNECTED) { + Serial.printf("Starting HTTP...\n"); + webserver.on("/index.html", HTTP_GET, [&](AsyncWebServerRequest* request) { + request->send(200, "text/plain", "Hello World!"); + }); + webserver.on("/description.xml", HTTP_GET, + [&](AsyncWebServerRequest* request) { + request->send(200, "text/xml", SSDP.getSchema()); + }); + webserver.begin(); + + // set schema xml url, nees to match http handler + //"ssdp/schema.xml" if not set + SSDP.setSchemaURL("description.xml"); + // set port + // 80 if not set + SSDP.setHTTPPort(80); + // set device name + // Null string if not set + SSDP.setName("Philips hue clone"); + // set Serial Number + // Null string if not set + SSDP.setSerialNumber("001788102201"); + // set device url + // Null string if not set + SSDP.setURL("index.html"); + // set model name + // Null string if not set + SSDP.setModelName("Philips hue bridge 2012"); + // set model description + // Null string if not set + SSDP.setModelDescription("This device can be controled by WiFi"); + // set model number + // Null string if not set + SSDP.setModelNumber("929000226503"); + // set model url + // Null string if not set + SSDP.setModelURL("http://www.meethue.com"); + // set model manufacturer name + // Null string if not set + SSDP.setManufacturer("Royal Philips Electronics"); + // set model manufacturer url + // Null string if not set + SSDP.setManufacturerURL("http://www.philips.com"); + // set device type + //"urn:schemas-upnp-org:device:Basic:1" if not set + SSDP.setDeviceType( + "rootdevice"); // to appear as root device, other examples: + // MediaRenderer, MediaServer ... + // set server name + //"Arduino/1.0" if not set + SSDP.setServerName("SSDPServer/1.0"); + // set UUID, you can use https://www.uuidgenerator.net/ + // use 38323636-4558-4dda-9188-cda0e6 + 4 last bytes of mac address if not + // set use SSDP.setUUID("daa26fa3-d2d4-4072-bc7a-a1b88ab4234a", false); for + // full UUID + SSDP.setUUID("daa26fa3-d2d4-4072-bc7a"); + // Set icons list, NB: optional, this is ignored under windows + SSDP.setIcons( + "" + "image/png" + "48" + "48" + "24" + "icon48.png" + ""); + // Set service list, NB: optional for simple device + SSDP.setServices( + "" + "urn:schemas-upnp-org:service:SwitchPower:1" + "urn:upnp-org:serviceId:SwitchPower:1" + "/SwitchPower1.xml" + "/SwitchPower/Control" + "/SwitchPower/Event" + ""); + + Serial.printf("Starting SSDP...\n"); + SSDP.begin(); + + Serial.printf("Ready!\n"); + } else { + Serial.printf("WiFi Failed\n"); + while (1) { + delay(100); + } + } +} + +void loop() { delay(1); } diff --git a/libraries/ESP32SSDP-1.2.1/keywords.txt b/libraries/ESP32SSDP-2.0.2/keywords.txt similarity index 100% rename from libraries/ESP32SSDP-1.2.1/keywords.txt rename to libraries/ESP32SSDP-2.0.2/keywords.txt diff --git a/libraries/ESP32SSDP-1.2.1/library.properties b/libraries/ESP32SSDP-2.0.2/library.properties similarity index 93% rename from libraries/ESP32SSDP-1.2.1/library.properties rename to libraries/ESP32SSDP-2.0.2/library.properties index 1964ae95..4cf7928d 100644 --- a/libraries/ESP32SSDP-1.2.1/library.properties +++ b/libraries/ESP32SSDP-2.0.2/library.properties @@ -1,5 +1,5 @@ name=ESP32SSDP -version=1.2.1 +version=2.0.2 author=Me-No-Dev maintainer=luc-github sentence=Simple SSDP library for ESP32 diff --git a/libraries/ESP32SSDP-1.2.1/set_style.bat b/libraries/ESP32SSDP-2.0.2/set_style.bat similarity index 100% rename from libraries/ESP32SSDP-1.2.1/set_style.bat rename to libraries/ESP32SSDP-2.0.2/set_style.bat diff --git a/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.cpp b/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.cpp new file mode 100644 index 00000000..0f3163bd --- /dev/null +++ b/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.cpp @@ -0,0 +1,687 @@ +/* +ESP32 Simple Service Discovery +Copyright (c) 2015 Hristo Gochkov + +Original (Arduino) version by Filippo Sallemi, July 23, 2014. +Can be found at: https://github.com/nomadnt/uSSDP + +License (MIT license): + 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. + +*/ +#ifdef ARDUINO_ARCH_ESP32 +#include "ESP32SSDP.h" + +#include +#include + +#include + +// #define DEBUG_SSDP Serial +// #define DEBUG_VERBOSE_SSDP +// #define DEBUG_WITH_MARLIN +#if defined(DEBUG_WITH_MARLIN) +class FlushableHardwareSerial : public HardwareSerial { + public: + FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {} +}; +extern FlushableHardwareSerial flushableSerial; +#define DEBUG_SSDP flushableSerial +#endif // endif DEBUG_WITH_MARLIN + +#define SSDP_INTERVAL 1200 +#define SSDP_PORT 1900 +#define SSDP_METHOD_SIZE 10 +#define SSDP_URI_SIZE 2 +#define SSDP_BUFFER_SIZE 64 +#define SSDP_MULTICAST_TTL 2 +static const IPAddress SSDP_MULTICAST_ADDR(239, 255, 255, 250); +#define SSDP_UUID_ROOT "38323636-4558-4dda-9188-cda0e6" + +esp_netif_t *get_esp_interface_netif(esp_interface_t interface); + +static const char _ssdp_response_template[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "EXT:\r\n"; + +static const char _ssdp_notify_template[] PROGMEM = + "NOTIFY * HTTP/1.1\r\n" + "HOST: 239.255.255.250:1900\r\n" + "NTS: ssdp:alive\r\n"; + +static const char _ssdp_packet_template[] PROGMEM = + "%s" // _ssdp_response_template / _ssdp_notify_template +#if (ESP_ARDUINO_VERSION_MAJOR < 3) + "CACHE-CONTROL: max-age=%u\r\n" // _interval +#else + "CACHE-CONTROL: max-age=%lu\r\n" // _interval +#endif //(ESP_ARDUINO_VERSION_MAJOR < 3) + "SERVER: %s UPNP/1.1 %s/%s\r\n" // _servername, _modelName, _modelNumber + "USN: uuid:%s%s\r\n" // _uuid, _usn_suffix + "%s: %s\r\n" // "NT" or "ST", _deviceType + "LOCATION: http://%u.%u.%u.%u:%u/%s\r\n" // WiFi.localIP(), _port, + // _schemaURL + "\r\n"; + +/*This need to be removed as part as deprecated, headers should be handled + * outside of library*/ +static const char _ssdp_schema_header[] PROGMEM = + "HTTP/1.1 200 OK\r\n" + "Content-Type: text/xml\r\n" + "Connection: close\r\n" + "Access-Control-Allow-Origin: *\r\n" + "\r\n"; + +static const char _ssdp_schema_template[] PROGMEM = + "" + "" + "" + "1" + "0" + "" + "http://%u.%u.%u.%u:%u/" // WiFi.localIP(), _port + "" + "urn:schemas-upnp-org:device:%s:1" + "%s" + "%s" + "%s" + "%s" + "%s" + "%s" + "%s" + "%s" + "%s" + "uuid:%s" + "%s" + "%s" + "" + "\r\n" + "\r\n"; + +SSDPClass::SSDPClass() : _replySlots{NULL}, _respondToAddr{0, 0, 0, 0} { + _port = 80; + _ttl = SSDP_MULTICAST_TTL; + _interval = SSDP_INTERVAL; + _respondToPort = 0; + _pending = false; + _stmatch = false; + _delay = 0; + _process_time = 0; + _notify_time = 0; + _uuid[0] = '\0'; + _usn_suffix[0] = '\0'; + _respondType[0] = '\0'; + _modelNumber[0] = '\0'; + sprintf(_deviceType, "Basic"); + _friendlyName[0] = '\0'; + _presentationURL[0] = '\0'; + _serialNumber[0] = '\0'; + _modelName[0] = '\0'; + _modelURL[0] = '\0'; + _manufacturer[0] = '\0'; + _manufacturerURL[0] = '\0'; + _servername = "Arduino/1.0"; + sprintf(_schemaURL, "ssdp/schema.xml"); + _schema = nullptr; +} + +SSDPClass::~SSDPClass() { end(); } + +void SSDPClass::end() { + if (_schema) { + free(_schema); + _schema = nullptr; + } + if (_udp.connected()) { + _udp.close(); + } +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf_P(PSTR("SSDP end ... ")); +#endif +} + +IPAddress SSDPClass::localIP() { + +#if (ESP_ARDUINO_VERSION_MAJOR < 3) + // Arduino ESP32 2.x board version + tcpip_adapter_ip_info_t ip; + if (WiFi.getMode() == WIFI_STA) { + if (tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_STA, &ip)) { + return IPAddress(); + } + } else if (WiFi.getMode() == WIFI_OFF) { + if (tcpip_adapter_get_ip_info(TCPIP_ADAPTER_IF_ETH, &ip)) { + return IPAddress(); + } + } + +#else + // Arduino ESP32 3.x board version + esp_netif_ip_info_t ip; + if (WiFi.getMode() == WIFI_STA) { + if (esp_netif_get_ip_info(get_esp_interface_netif(ESP_IF_WIFI_STA), &ip)) { + return IPAddress(); + } + } else if (WiFi.getMode() == WIFI_OFF) { + if (esp_netif_get_ip_info(get_esp_interface_netif(ESP_IF_ETH), &ip)) { + return IPAddress(); + } + } + +#endif + + return IPAddress(ip.ip.addr); +} + + +void SSDPClass::setUUID(const char *uuid, bool rootonly) { + // no sanity check is done - TBD + if (rootonly) { + uint32_t chipId = ((uint16_t)(ESP.getEfuseMac() >> 32)); + sprintf(_uuid, "%s%02x%02x%02x", uuid, (uint16_t)((chipId >> 16) & 0xff), + (uint16_t)((chipId >> 8) & 0xff), (uint16_t)chipId & 0xff); + } else { + strlcpy(_uuid, uuid, sizeof(_uuid)); + } +} + +bool SSDPClass::begin() { + _pending = false; + _stmatch = false; + end(); + if (strlen(_uuid) == 0) { + setUUID(SSDP_UUID_ROOT); + } +#if defined(DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) + DEBUG_SSDP.printf("SSDP UUID: %s\n", (char *)_uuid); +#endif + if (_udp.connected()) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("Already connected, abort begin"); +#endif + return true; + } + + _udp.onPacket( + [](void *arg, AsyncUDPPacket &packet) { + ((SSDPClass *)(arg))->_onPacket(packet); + }, + this); + + if (!_udp.listenMulticast(IPAddress(SSDP_MULTICAST_ADDR), SSDP_PORT, _ttl)) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("Error begin"); +#endif + return false; + } + + return true; +} + +void SSDPClass::_send(ssdp_method_t method) { + char buffer[1460]; + IPAddress ip = localIP(); + + char valueBuffer[strlen_P(_ssdp_notify_template) + 1]; + strcpy_P(valueBuffer, + (method == NONE) ? _ssdp_response_template : _ssdp_notify_template); + + int len = + snprintf_P(buffer, sizeof(buffer), _ssdp_packet_template, valueBuffer, + _interval, _servername.c_str(), _modelName, _modelNumber, + _uuid, _usn_suffix, (method == NONE) ? "ST" : "NT", + _respondType, ip[0], ip[1], ip[2], ip[3], _port, _schemaURL); + if (len < 0) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("Error not enough memory for using valueBuffer"); +#endif + return; + } + IPAddress remoteAddr; + uint16_t remotePort; + if (method == NONE) { + remoteAddr = _respondToAddr; + remotePort = _respondToPort; +#ifdef DEBUG_SSDP + DEBUG_SSDP.print("Sending Response to "); +#endif + } else { + remoteAddr = IPAddress(SSDP_MULTICAST_ADDR); + remotePort = SSDP_PORT; +#ifdef DEBUG_SSDP + DEBUG_SSDP.print("Sending Notify to "); +#endif + } +#ifdef DEBUG_SSDP + DEBUG_SSDP.print(remoteAddr); + DEBUG_SSDP.print(":"); + DEBUG_SSDP.println(remotePort); +#endif + _udp.writeTo((const uint8_t *)buffer, len, remoteAddr, remotePort); +#if defined(DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) + DEBUG_SSDP.println("*************************TX*************************"); + DEBUG_SSDP.println(buffer); + DEBUG_SSDP.println("****************************************************"); +#endif +} + +const char *SSDPClass::getSchema() { + uint len = strlen(_ssdp_schema_template) + 21 //(IP = 15) + 1 (:) + 5 (port) + + SSDP_DEVICE_TYPE_SIZE + SSDP_FRIENDLY_NAME_SIZE + + SSDP_SCHEMA_URL_SIZE + SSDP_SERIAL_NUMBER_SIZE + + SSDP_MODEL_NAME_SIZE + _modelDescription.length() + + SSDP_MODEL_VERSION_SIZE + SSDP_MODEL_URL_SIZE + + SSDP_MANUFACTURER_SIZE + SSDP_MANUFACTURER_URL_SIZE + + SSDP_UUID_SIZE + _services.length() + _icons.length(); + if (_schema) { + free(_schema); + _schema = nullptr; + } + _schema = (char *)malloc(len + 1); + if (_schema) { + IPAddress ip = localIP(); + sprintf(_schema, _ssdp_schema_template, ip[0], ip[1], ip[2], ip[3], _port, + _deviceType, _friendlyName, _presentationURL, _serialNumber, + _modelName, _modelDescription.c_str(), _modelNumber, _modelURL, + _manufacturer, _manufacturerURL, _uuid, _services.c_str(), + _icons.c_str()); + } else { +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("not enough memory for schema"); +#endif + } + return _schema; +} + +void SSDPClass::_onPacket(AsyncUDPPacket &packet) { + if (packet.length() == 0) { + return; + } + int nbBytes = 0; + char *packetBuffer = nullptr; + + if (!_pending) { + ssdp_method_t method = NONE; + nbBytes = packet.length(); + + typedef enum { METHOD, URI, PROTO, KEY, VALUE, ABORT } states; + states state = METHOD; + typedef enum { STRIP, START, SKIP, MAN, ST, MX } headers; + headers header = STRIP; + + uint8_t cursor = 0; + uint8_t cr = 0; + + char buffer[SSDP_BUFFER_SIZE] = {0}; + packetBuffer = new char[nbBytes + 1]; + if (packetBuffer == nullptr) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("not enough memory for the packet"); +#endif + return; + } + int process_pos = 0; + strncpy(packetBuffer, (const char *)packet.data(), nbBytes); + packetBuffer[nbBytes] = '\0'; + _respondToAddr = packet.remoteIP(); + _respondToPort = packet.remotePort(); + +#if defined(DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) + if (nbBytes) { + DEBUG_SSDP.println( + "*************************RX*************************"); + DEBUG_SSDP.print(packet.remoteIP()); + DEBUG_SSDP.print(":"); + DEBUG_SSDP.println(packet.remotePort()); + DEBUG_SSDP.println(packetBuffer); + DEBUG_SSDP.println( + "****************************************************"); + } +#endif + while (process_pos < nbBytes) { + char c = packetBuffer[process_pos]; + process_pos++; + (c == '\r' || c == '\n') ? cr++ : cr = 0; + switch (state) { + case METHOD: + if (c == ' ') { + if (strcmp(buffer, "M-SEARCH") == 0) { + method = SEARCH; + } + + if (method == NONE) { + state = ABORT; + } else { + state = URI; + } + cursor = 0; + + } else if (cursor < SSDP_METHOD_SIZE - 1) { + buffer[cursor++] = c; + buffer[cursor] = '\0'; + } + break; + case URI: + if (c == ' ') { + if (strcmp(buffer, "*")) { + state = ABORT; + } else { + state = PROTO; + } + cursor = 0; + } else if (cursor < SSDP_URI_SIZE - 1) { + buffer[cursor++] = c; + buffer[cursor] = '\0'; + } + break; + case PROTO: + if (cr == 2) { + state = KEY; + cursor = 0; + } + break; + case KEY: + // end of HTTP request parsing. If we find a match start reply delay. + if (cr == 4) { + if (_stmatch) { + _pending = true; + _process_time = millis(); + } + } else if (c == ':') { + cursor = 0; + state = VALUE; + } else if (c != '\r' && c != '\n' && c != ' ' && + cursor < SSDP_BUFFER_SIZE - 1) { + buffer[cursor++] = c; + buffer[cursor] = '\0'; + } + break; + case VALUE: + if (cr == 2) { + switch (header) { + case START: +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("***********************"); +#endif + case STRIP: + case SKIP: + break; + case MAN: +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("MAN: %s\n", (char *)buffer); +#endif + break; + case ST: + // save the search term for the reply and clear usn suffix. + strlcpy(_respondType, buffer, sizeof(_respondType)); + _usn_suffix[0] = '\0'; +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("ST: '%s'\n", buffer); +#endif + // if looking for all or root reply with upnp:rootdevice + if (strcmp(buffer, "ssdp:all") == 0 || + strcmp(buffer, "upnp:rootdevice") == 0) { + _stmatch = true; + // set USN suffix + strlcpy(_usn_suffix, "::upnp:rootdevice", + sizeof(_usn_suffix)); +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("the search type matches all and root"); +#endif + state = KEY; + } else + // if the search type matches our type, we should respond + // instead of ABORT + if (strcasecmp(buffer, _deviceType) == 0) { + _stmatch = true; + // set USN suffix to the device type + strlcpy(_usn_suffix, "::", sizeof(_usn_suffix)); + strlcat(_usn_suffix, _deviceType, sizeof(_usn_suffix)); +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("the search type matches our type"); +#endif + state = KEY; + } else { + state = ABORT; +#ifdef DEBUG_SSDP + DEBUG_SSDP.println( + "REJECT. The search type does not match our type"); + DEBUG_SSDP.println("***********************"); + +#endif + } + break; + case MX: + // delay in ms from 0 to MX*1000 where MX is in seconds with + // limits. + _delay = (short)random(0, atoi(buffer) * 1000L); + if (_delay > SSDP_MAX_DELAY) { + _delay = SSDP_MAX_DELAY; + } + break; + } + + if (state != ABORT) { + state = KEY; + header = STRIP; + cursor = 0; + } + } else if (c != '\r' && c != '\n') { + if (header == STRIP) { + if (c == ' ') { + break; + } else { + header = START; + } + } + if (header == START) { + if (strncmp(buffer, "MA", 2) == 0) { + header = MAN; + } else if (strcmp(buffer, "ST") == 0) { + header = ST; + } else if (strcmp(buffer, "MX") == 0) { + header = MX; + } else { + header = SKIP; + } + } + + if (cursor < SSDP_BUFFER_SIZE - 1) { + buffer[cursor++] = c; + buffer[cursor] = '\0'; + } + } + break; + case ABORT: + _pending = false; + _delay = 0; + break; + } + } + } + if (packetBuffer) { + delete[] packetBuffer; + } + // save reply in reply queue if one is pending + if (_pending) { + int i; + // Many UPNP hosts send out mulitple M-SEARCH packets at the same time to + // mitigate packet loss. Just reply to one for a given host:port. + for (i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { + if (_replySlots[i]) { + if (_replySlots[i]->_respondToPort == _respondToPort && + _replySlots[i]->_respondToAddr == _respondToAddr) { + // keep original delay + _delay = _replySlots[i]->_delay; + _process_time = _replySlots[i]->_process_time; +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("Remove duplicate SSDP reply in slot %i.\n", i); +#endif + delete _replySlots[i]; + _replySlots[i] = 0; + } + } + } + // save packet to available reply queue slot + for (i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { + if (!_replySlots[i]) { +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("Saving deferred SSDP reply to queue slot %i.\n", i); + DEBUG_SSDP.println("***********************"); + +#endif + _replySlots[i] = new ssdp_reply_slot_item_t; + if (_replySlots[i]) { + _replySlots[i]->_process_time = _process_time; + _replySlots[i]->_delay = _delay; + _replySlots[i]->_respondToAddr = _respondToAddr; + _replySlots[i]->_respondToPort = _respondToPort; + strlcpy(_replySlots[i]->_respondType, _respondType, + sizeof(_replySlots[i]->_respondType)); + strlcpy(_replySlots[i]->_usn_suffix, _usn_suffix, + sizeof(_replySlots[i]->_usn_suffix)); + } + break; + } + } +#ifdef DEBUG_SSDP + if (i == SSDP_MAX_REPLY_SLOTS) { + DEBUG_SSDP.println("SSDP reply queue is full dropping packet."); + } +#endif + _pending = false; + _delay = 0; + } + // send any packets that are pending and overdue. + unsigned long t = millis(); + bool sent = false; + for (int i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { + if (_replySlots[i]) { + // millis delay with overflow protection. + if (t - _replySlots[i]->_process_time > _replySlots[i]->_delay) { + // reply ready. restore and send. + _respondToAddr = _replySlots[i]->_respondToAddr; + _respondToPort = _replySlots[i]->_respondToPort; + strlcpy(_respondType, _replySlots[i]->_respondType, + sizeof(_respondType)); + strlcpy(_usn_suffix, _replySlots[i]->_usn_suffix, sizeof(_usn_suffix)); +#ifdef DEBUG_SSDP + DEBUG_SSDP.printf("Slot(%d) ", i); + DEBUG_SSDP.println("Send None"); +#endif + _send(NONE); + sent = true; + delete _replySlots[i]; + _replySlots[i] = 0; +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("***********************"); +#endif + } + } + } +#if defined(DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) + uint8_t rcount = 0; + DEBUG_SSDP.print("SSDP reply queue status: ["); + for (int i = 0; i < SSDP_MAX_REPLY_SLOTS; i++) { + DEBUG_SSDP.print(_replySlots[i] ? "X" : "-"); + } + DEBUG_SSDP.println("]"); +#endif + if (_notify_time == 0 || (millis() - _notify_time) > (_interval * 1000L)) { + _notify_time = millis(); + // send notify with our root device type + strlcpy(_respondType, "upnp:rootdevice", sizeof(_respondType)); + strlcpy(_usn_suffix, "::upnp:rootdevice", sizeof(_usn_suffix)); +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("Send Notify"); +#endif + _send(NOTIFY); + sent = true; +#ifdef DEBUG_SSDP + DEBUG_SSDP.println("***********************"); +#endif + } + if (!sent) { +#if defined(DEBUG_SSDP) && defined(DEBUG_VERBOSE_SSDP) + DEBUG_SSDP.println("Do not sent"); +#endif + } +} + +void SSDPClass::setSchemaURL(const char *url) { + strlcpy(_schemaURL, url, sizeof(_schemaURL)); +} + +void SSDPClass::setHTTPPort(uint16_t port) { _port = port; } + +void SSDPClass::setDeviceType(const char *deviceType) { + strlcpy(_deviceType, deviceType, sizeof(_deviceType)); +} + +void SSDPClass::setName(const char *name) { + strlcpy(_friendlyName, name, sizeof(_friendlyName)); +} + +void SSDPClass::setURL(const char *url) { + strlcpy(_presentationURL, url, sizeof(_presentationURL)); +} + +void SSDPClass::setSerialNumber(const char *serialNumber) { + strlcpy(_serialNumber, serialNumber, sizeof(_serialNumber)); +} + +void SSDPClass::setSerialNumber(const uint32_t serialNumber) { + snprintf(_serialNumber, sizeof(uint32_t) * 2 + 1, "%08X", + (unsigned int)serialNumber); +} + +void SSDPClass::setModelName(const char *name) { + strlcpy(_modelName, name, sizeof(_modelName)); +} + +void SSDPClass::setModelDescription(const char *desc) { + _modelDescription = desc; +} +void SSDPClass::setServerName(const char *name) { _servername = name; } + +void SSDPClass::setModelNumber(const char *num) { + strlcpy(_modelNumber, num, sizeof(_modelNumber)); +} + +void SSDPClass::setModelURL(const char *url) { + strlcpy(_modelURL, url, sizeof(_modelURL)); +} + +void SSDPClass::setManufacturer(const char *name) { + strlcpy(_manufacturer, name, sizeof(_manufacturer)); +} + +void SSDPClass::setManufacturerURL(const char *url) { + strlcpy(_manufacturerURL, url, sizeof(_manufacturerURL)); +} + +void SSDPClass::setTTL(const uint8_t ttl) { _ttl = ttl; } + +void SSDPClass::setInterval(uint32_t interval) { _interval = interval; } + +#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP) +SSDPClass SSDP; +#endif + +#endif diff --git a/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.h b/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.h new file mode 100644 index 00000000..2dca83fa --- /dev/null +++ b/libraries/ESP32SSDP-2.0.2/src/ESP32SSDP.h @@ -0,0 +1,154 @@ +/* +ESP32 Simple Service Discovery +Copyright (c) 2015 Hristo Gochkov + +Original (Arduino) version by Filippo Sallemi, July 23, 2014. +Can be found at: https://github.com/nomadnt/uSSDP + +License (MIT license): + 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. + +*/ +#ifdef ARDUINO_ARCH_ESP32 +#ifndef ESP32SSDP_H +#define ESP32SSDP_H + +#include +#include +#include + +#define SSDP_UUID_SIZE 37 +#define SSDP_SCHEMA_URL_SIZE 64 +#define SSDP_DEVICE_TYPE_SIZE 64 +#define SSDP_FRIENDLY_NAME_SIZE 64 +#define SSDP_SERIAL_NUMBER_SIZE 32 +#define SSDP_PRESENTATION_URL_SIZE 128 +#define SSDP_MODEL_NAME_SIZE 64 +#define SSDP_MODEL_URL_SIZE 128 +#define SSDP_MODEL_VERSION_SIZE 32 +#define SSDP_MANUFACTURER_SIZE 64 +#define SSDP_MANUFACTURER_URL_SIZE 128 +#define SSDP_MAX_REPLY_SLOTS 5 +#define SSDP_MAX_DELAY 10000 + +typedef struct { + unsigned long _process_time; + short _delay; + IPAddress _respondToAddr; + uint16_t _respondToPort; + char _respondType[SSDP_DEVICE_TYPE_SIZE]; + char _usn_suffix[SSDP_DEVICE_TYPE_SIZE]; +} ssdp_reply_slot_item_t; + +class SSDPClass { + public: + SSDPClass(); + ~SSDPClass(); + + bool begin(); + void end(); + + const char* getSchema(); + + void setDeviceType(const String& deviceType) { + setDeviceType(deviceType.c_str()); + } + void setDeviceType(const char* deviceType); + void setName(const String& name) { setName(name.c_str()); } + void setName(const char* name); + void setURL(const String& url) { setURL(url.c_str()); } + void setURL(const char* url); + void setSchemaURL(const String& url) { setSchemaURL(url.c_str()); } + void setSchemaURL(const char* url); + void setSerialNumber(const String& serialNumber) { + setSerialNumber(serialNumber.c_str()); + } + void setSerialNumber(const char* serialNumber); + void setSerialNumber(const uint32_t serialNumber); + void setModelName(const String& name) { setModelName(name.c_str()); } + void setModelName(const char* name); + void setModelNumber(const String& num) { setModelNumber(num.c_str()); } + void setModelNumber(const char* num); + void setModelURL(const String& url) { setModelURL(url.c_str()); } + void setModelDescription(const String& desc) { + setModelDescription(desc.c_str()); + } + void setModelDescription(const char* desc); + void setServerName(const String& name) { setServerName(name.c_str()); } + void setServerName(const char* name); + void setModelURL(const char* url); + void setManufacturer(const String& name) { setManufacturer(name.c_str()); } + void setManufacturer(const char* name); + void setManufacturerURL(const String& url) { + setManufacturerURL(url.c_str()); + } + void setManufacturerURL(const char* url); + void setHTTPPort(uint16_t port); + void setTTL(uint8_t ttl); + void setInterval(uint32_t interval); + void setUUID(const char* uuid, bool rootonly = true); + void setServices(const char* services) { _services = services; } + void setIcons(const char* icons) { _icons = icons; } + + protected: + typedef enum { NONE, SEARCH, NOTIFY } ssdp_method_t; + + void _onPacket(AsyncUDPPacket& packet); + void _send(ssdp_method_t method); + IPAddress localIP(); + uint16_t _port; + uint32_t _ttl; + uint32_t _interval; + AsyncUDP _udp; + ssdp_reply_slot_item_t* _replySlots[SSDP_MAX_REPLY_SLOTS]; + IPAddress _respondToAddr; + uint16_t _respondToPort; + + bool _pending; + bool _stmatch; + short _delay; + unsigned long _process_time; + unsigned long _notify_time; + + char _respondType[SSDP_DEVICE_TYPE_SIZE]; + char _schemaURL[SSDP_SCHEMA_URL_SIZE]; + char _uuid[SSDP_UUID_SIZE]; + char _usn_suffix[SSDP_DEVICE_TYPE_SIZE]; + char _deviceType[SSDP_DEVICE_TYPE_SIZE]; + char _friendlyName[SSDP_FRIENDLY_NAME_SIZE]; + char _serialNumber[SSDP_SERIAL_NUMBER_SIZE]; + char _presentationURL[SSDP_PRESENTATION_URL_SIZE]; + char _manufacturer[SSDP_MANUFACTURER_SIZE]; + char _manufacturerURL[SSDP_MANUFACTURER_URL_SIZE]; + char _modelName[SSDP_MODEL_NAME_SIZE]; + char _modelURL[SSDP_MODEL_URL_SIZE]; + char _modelNumber[SSDP_MODEL_VERSION_SIZE]; + String _modelDescription; + String _servername; + char* _schema; + String _services; + String _icons; +}; + +#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_SSDP) +extern SSDPClass SSDP; +#endif + +#endif +#endif diff --git a/libraries/ESP32SSDP-1.2.1/test/platformio.ini b/libraries/ESP32SSDP-2.0.2/test/platformio.ini similarity index 100% rename from libraries/ESP32SSDP-1.2.1/test/platformio.ini rename to libraries/ESP32SSDP-2.0.2/test/platformio.ini diff --git a/libraries/ESP32SSDP-2.0.2/tools/format_sources.py b/libraries/ESP32SSDP-2.0.2/tools/format_sources.py new file mode 100644 index 00000000..13777e3c --- /dev/null +++ b/libraries/ESP32SSDP-2.0.2/tools/format_sources.py @@ -0,0 +1,50 @@ +#!/usr/bin/python + +import os +import subprocess + +def format_sources(): + """ + Formats the source code files in the ESP3D project using clang-format with Google style. + + This script recursively searches for C, C++, H, and INO files in the ESP3D project directory + and its subdirectories. It then applies the clang-format tool to each file, using the Google + style for formatting. + + Note: Make sure you have clang-format installed and available in your system's PATH. + + Returns: + None + """ + # Base directory of the script + script_path = os.path.abspath(__file__) + + # Extract dir path + script_dir = os.path.dirname(script_path) + + # Build path of sources dir: ../esp3d + src_dir = os.path.abspath(os.path.normpath(os.path.join(script_dir, '..', 'src'))) + examples_dir = os.path.abspath(os.path.normpath(os.path.join(script_dir, '..', 'examples'))) + + # Parse all c, h, cpp, and ino files in all directories and subdirectories + file_paths = [] + for base_dir in [src_dir, examples_dir]: + for root, dirs, files in os.walk(base_dir): + for file in files: + if file.endswith(('.c', '.cpp', '.h', '.ino')): + file_path = os.path.join(root, file) + file_paths.append(os.path.abspath(os.path.normpath(file_path))) + + # Now format all files one by one with clang-format + for file_path in file_paths: + tmpPath = '"' + file_path + '"' + print("Formatting " + tmpPath, end="") + try: + command = ['clang-format', '-i', '--style=Google', file_path] + subprocess.run(command, check=False) + print(" => Ok") + except subprocess.CalledProcessError as e: + print(f'=> Error: {e}') + +# Call the format_sources function to format the source code +format_sources() diff --git a/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/feature_request.md b/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 0d89f881..00000000 --- a/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "[FEATURE REQUEST]" -labels: Feature request -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/libraries/EspLuaEngine-1.0.1/.github/stale.yml b/libraries/EspLuaEngine-1.0.1/.github/stale.yml deleted file mode 100644 index 8e77b2e0..00000000 --- a/libraries/EspLuaEngine-1.0.1/.github/stale.yml +++ /dev/null @@ -1,49 +0,0 @@ -# Configuration for probot-stale - https://github.com/probot/stale - -# Number of days of inactivity before an Issue or Pull Request becomes stale -daysUntilStale: 21 - -# Number of days of inactivity before an Issue or Pull Request with the stale label is closed. -# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale. -daysUntilClose: 3 - -# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled) -onlyLabels: [] - -# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable -exemptLabels: - - pinned - - security - - "Under Investigation" - - "Work in progress" - - Planned - - "Feedback Welcome" - -# Set to true to ignore issues in a project (defaults to false) -exemptProjects: false - -# Set to true to ignore issues in a milestone (defaults to false) -exemptMilestones: false - -# Set to true to ignore issues with an assignee (defaults to false) -exemptAssignees: false - -# Label to use when marking as stale -staleLabel: stale - -# Comment to post when marking as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when removing the stale label. -unmarkComment: > - This issue has been removed from the stale queue. Please ensure activity to keep it openin the future. -# Comment to post when closing a stale Issue or Pull Request. -closeComment: > - This stale issue has been automatically closed. Thank you for your contributions. -# Limit the number of actions per hour, from 1-30. Default is 30 -limitPerRun: 30 - -# Limit to only `issues` or `pulls` -only: issues diff --git a/libraries/EspLuaEngine-1.0.1/API.md b/libraries/EspLuaEngine-1.0.1/API.md deleted file mode 100644 index 8bef69fc..00000000 --- a/libraries/EspLuaEngine-1.0.1/API.md +++ /dev/null @@ -1,53 +0,0 @@ -# EspLuaEngine for ESP32 - -## 📚 API Reference - -### `EspLuaEngine()` -Constructor. Initializes a new Lua state and loads standard libraries. - -### `~EspLuaEngine()` -Destructor. Closes the Lua state and frees resources. - -### `bool executeScript(const char* script)` -Executes a Lua script. -- **Parameters:** - - `script`: A null-terminated string containing the Lua code to execute. -- **Returns:** `true` if the script executes successfully, `false` otherwise. -- **Note:** This is a blocking function. For long-running scripts, consider integrating it into a separate task to allow the rest of your firmware to continue running. - - -### `bool registerFunction(const char* name, lua_CFunction function)` -Registers a C function to be callable from Lua scripts. -- **Parameters:** - - `name`: The name to use for the function in Lua. - - `function`: A pointer to the C function to register. -- **Returns:** `true` if the function is successfully registered, `false` otherwise. - -### `template bool registerConstant(const char* name, T value)` -Registers a constant value that can be accessed from Lua scripts. -- **Parameters:** - - `name`: The name to use for the constant in Lua. - - `value`: The value of the constant. Supported types include `lua_Number`, `const char*`, `bool`, `int`, and `unsigned char`. -- **Returns:** `true` if the constant is successfully registered, `false` otherwise. - -## 🔧 Usage Examples - -```cpp -EspLuaEngine lua; - -// Register a custom function -lua.registerFunction("myFunction", l_myCustomFunction); - -// Register constants -lua.registerConstant("PI", 3.14159); -lua.registerConstant("PROJECT_NAME", "MyESP32Project"); -lua.registerConstant("DEBUG_MODE", true); - -// Execute a Lua script -lua.executeScript(R"( - print("PI is: " .. PI) - print("Project: " .. PROJECT_NAME) - myFunction() -)"); -``` - diff --git a/libraries/EspLuaEngine-1.0.1/.github/FUNDING.yml b/libraries/EspLuaEngine-1.0.2/.github/FUNDING.yml similarity index 100% rename from libraries/EspLuaEngine-1.0.1/.github/FUNDING.yml rename to libraries/EspLuaEngine-1.0.2/.github/FUNDING.yml diff --git a/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/bug_report.md b/libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/bug_report.md similarity index 100% rename from libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/bug_report.md rename to libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/bug_report.md diff --git a/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/config.yml b/libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/config.yml rename to libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/config.yml diff --git a/libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/feature_request.md b/libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/feature_request.md similarity index 100% rename from libraries/ESP32SSDP-1.2.1/.github/ISSUE_TEMPLATE/feature_request.md rename to libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/feature_request.md diff --git a/libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/question-template.md b/libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/question-template.md similarity index 100% rename from libraries/EspLuaEngine-1.0.1/.github/ISSUE_TEMPLATE/question-template.md rename to libraries/EspLuaEngine-1.0.2/.github/ISSUE_TEMPLATE/question-template.md diff --git a/libraries/ESP32SSDP-1.2.1/.github/stale.yml b/libraries/EspLuaEngine-1.0.2/.github/stale.yml similarity index 100% rename from libraries/ESP32SSDP-1.2.1/.github/stale.yml rename to libraries/EspLuaEngine-1.0.2/.github/stale.yml diff --git a/libraries/EspLuaEngine-1.0.2/API.md b/libraries/EspLuaEngine-1.0.2/API.md new file mode 100644 index 00000000..7951a744 --- /dev/null +++ b/libraries/EspLuaEngine-1.0.2/API.md @@ -0,0 +1,142 @@ +# EspLuaEngine for ESP32 + +## 📚 API Reference + +### `EspLuaEngine()` +Constructor. Initializes a new Lua state and loads standard libraries. + +### `~EspLuaEngine()` +Destructor. Closes the Lua state and frees resources. + +### `bool executeScript(const char* script)` +Executes a Lua script. +- **Parameters:** + - `script`: A null-terminated string containing the Lua code to execute. +- **Returns:** `true` if the script executes successfully, `false` otherwise. +- **Note:** This function is non-blocking and supports pause and stop operations. + +### `bool registerFunction(const char* name, lua_CFunction function, void* userData = nullptr)` +Registers a C function to be callable from Lua scripts. +- **Parameters:** + - `name`: The name to use for the function in Lua. + - `function`: A pointer to the C function to register. + - `userData`: Optional user data to be passed to the function. +- **Returns:** `true` if the function is successfully registered, `false` otherwise. + +### `template bool registerConstant(const char* name, T value)` +Registers a constant value that can be accessed from Lua scripts. +- **Parameters:** + - `name`: The name to use for the constant in Lua. + - `value`: The value of the constant. Supported types include `lua_Number`, `const char*`, `bool`, `int`, and `unsigned char`. +- **Returns:** `true` if the constant is successfully registered, `false` otherwise. + +### `void resetState()` +Resets the Lua state, clearing all registered functions and constants. + +### `void setPauseFunction(PauseFunction func)` +Sets a custom function to be called when execution is paused. +- **Parameters:** + - `func`: A function of type `std::function` to be called during pauses. + +### `void pauseExecution()` +Pauses the execution of the current script. + +### `void resumeExecution()` +Resumes the execution of a paused script. + +### `void stopExecution()` +Stops the execution of the current script. + +### `bool isPaused()` +Checks if the script execution is currently paused. +- **Returns:** `true` if paused, `false` otherwise. + +### `bool isRunning()` +Checks if a script is currently running. +- **Returns:** `true` if running, `false` otherwise. + +### `Status getStatus()` +Gets the current status of the EspLuaEngine. +- **Returns:** An enum of type `EspLuaEngine::Status` with possible values: + - `Idle`: No script is currently running. + - `Running`: A script is currently executing. + - `Paused`: Script execution is paused. + +### `bool hasError()` +Checks if an error occurred during the last script execution. +- **Returns:** `true` if an error occurred, `false` otherwise. + +### `const char* getLastError()` +Gets the last error message. +- **Returns:** A string containing the last error message, or an empty string if no error occurred. + +### `lua_State* getLuaState()` +Gets the underlying Lua state. +- **Returns:** A pointer to the `lua_State` object. + +## 🔧 Usage Examples + +```cpp +EspLuaEngine lua; + +// Register a custom function +lua.registerFunction("myFunction", l_myCustomFunction); + +// Register constants +lua.registerConstant("PI", 3.14159); +lua.registerConstant("PROJECT_NAME", "MyESP32Project"); +lua.registerConstant("DEBUG_MODE", true); + +// Execute a Lua script +if (lua.executeScript(R"( + print("PI is: " .. PI) + print("Project: " .. PROJECT_NAME) + myFunction() +)")) { + Serial.println("Script executed successfully"); +} else { + Serial.print("Error executing script: "); + Serial.println(lua.getLastError()); +} + +// Pause and resume execution +lua.pauseExecution(); +// Do something while paused +lua.resumeExecution(); + +// Check status +if (lua.getStatus() == EspLuaEngine::Status::Running) { + Serial.println("Script is running"); +} + +// Stop execution +lua.stopExecution(); + +// Reset state +lua.resetState(); +``` + + +## 📝 Notes + +- The EspLuaEngine now supports non-blocking script execution with pause and stop capabilities. +- Use `setPauseFunction()` to define custom behavior during pauses. +- Always check for errors after executing a script using `hasError()` and `getLastError()`. +- The engine supports multitasking environments, making it suitable for complex ESP32 projects. +- **Important note for ESP8266 users:** While state monitoring and control are straightforward on ESP32 due to its task management capabilities, implementation on ESP8266 may require additional libraries or the use of an interrupt system. Currently, this functionality is not fully supported on ESP8266 platforms. + +## 🚀 Platform-Specific Considerations + +### ESP32 +On ESP32, the EspLuaEngine takes full advantage of the FreeRTOS task management system, allowing for efficient multitasking and state control without additional setup. + +### ESP8266 +For ESP8266 users: + +- The current implementation may not fully support all state monitoring and control features. +- To achieve similar functionality as on ESP32, you might need to: + 1. Implement a custom interrupt-based system for state checks. + 2. Use additional libraries for task management (e.g., `TaskScheduler`). + 3. Carefully manage your main loop to prevent blocking while allowing for state checks. + +Please note that these advanced features on ESP8266 are not officially supported in the current version of EspLuaEngine and may require custom modifications to the library. diff --git a/libraries/EspLuaEngine-1.0.1/LICENSE b/libraries/EspLuaEngine-1.0.2/LICENSE similarity index 100% rename from libraries/EspLuaEngine-1.0.1/LICENSE rename to libraries/EspLuaEngine-1.0.2/LICENSE diff --git a/libraries/EspLuaEngine-1.0.1/README.md b/libraries/EspLuaEngine-1.0.2/README.md similarity index 100% rename from libraries/EspLuaEngine-1.0.1/README.md rename to libraries/EspLuaEngine-1.0.2/README.md diff --git a/libraries/EspLuaEngine-1.0.1/cleanLua.py b/libraries/EspLuaEngine-1.0.2/cleanLua.py similarity index 100% rename from libraries/EspLuaEngine-1.0.1/cleanLua.py rename to libraries/EspLuaEngine-1.0.2/cleanLua.py diff --git a/libraries/EspLuaEngine-1.0.1/examples/HelloWorld/HelloWorld.ino b/libraries/EspLuaEngine-1.0.2/examples/HelloWorld/HelloWorld.ino similarity index 100% rename from libraries/EspLuaEngine-1.0.1/examples/HelloWorld/HelloWorld.ino rename to libraries/EspLuaEngine-1.0.2/examples/HelloWorld/HelloWorld.ino diff --git a/libraries/EspLuaEngine-1.0.1/examples/files/files.ino b/libraries/EspLuaEngine-1.0.2/examples/files/files.ino similarity index 100% rename from libraries/EspLuaEngine-1.0.1/examples/files/files.ino rename to libraries/EspLuaEngine-1.0.2/examples/files/files.ino diff --git a/libraries/EspLuaEngine-1.0.1/examples/gpio/gpio.ino b/libraries/EspLuaEngine-1.0.2/examples/gpio/gpio.ino similarity index 100% rename from libraries/EspLuaEngine-1.0.1/examples/gpio/gpio.ino rename to libraries/EspLuaEngine-1.0.2/examples/gpio/gpio.ino diff --git a/libraries/EspLuaEngine-1.0.1/examples/userData/userData.ino b/libraries/EspLuaEngine-1.0.2/examples/userData/userData.ino similarity index 100% rename from libraries/EspLuaEngine-1.0.1/examples/userData/userData.ino rename to libraries/EspLuaEngine-1.0.2/examples/userData/userData.ino diff --git a/libraries/EspLuaEngine-1.0.1/library.properties b/libraries/EspLuaEngine-1.0.2/library.properties similarity index 95% rename from libraries/EspLuaEngine-1.0.1/library.properties rename to libraries/EspLuaEngine-1.0.2/library.properties index b0798c59..b6de53d1 100644 --- a/libraries/EspLuaEngine-1.0.1/library.properties +++ b/libraries/EspLuaEngine-1.0.2/library.properties @@ -1,5 +1,5 @@ name=EspLuaEngine -version=1.0.1 +version=1.0.2 author=Luc LEBOSSE maintainer=Luc LEBOSSE sentence=Lua engine for ESP diff --git a/libraries/EspLuaEngine-1.0.1/portingLua.md b/libraries/EspLuaEngine-1.0.2/portingLua.md similarity index 100% rename from libraries/EspLuaEngine-1.0.1/portingLua.md rename to libraries/EspLuaEngine-1.0.2/portingLua.md diff --git a/libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.cpp b/libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.cpp similarity index 67% rename from libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.cpp rename to libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.cpp index 9f0ad58d..cbaf423d 100644 --- a/libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.cpp +++ b/libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.cpp @@ -19,9 +19,28 @@ */ #include "EspLuaEngine.h" +#define ESP_LUA_NB_LINES_BEFORE_HOOK 1000 -#include +#if defined(ARDUINO_ARCH_ESP32) +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#endif // defined(ARDUINO_ARCH_ESP32) +#if defined(ARDUINO_ARCH_ESP8266) +// #define DEBUG_ESP_LUA_ENGINE Serial +#if defined(DEBUG_ESP_LUA_ENGINE) +#define log_e(format, ...) \ + DEBUG_ESP_LUA_ENGINE.printf("E: " format "\n", ##__VA_ARGS__) +#define log_v(format, ...) \ + DEBUG_ESP_LUA_ENGINE.printf("V: " format "\n", ##__VA_ARGS__) +#else +#define log_e(format, ...) +#define log_v(format, ...) +#endif // defined(DEBUG_ESP_LUA_ENGINE) +#endif // defined(ARDUINO_ARCH_ESP8266) + +EspLuaEngine::PauseFunction EspLuaEngine::_pauseFunction = nullptr; +String EspLuaEngine::_lastError; /*Public methods*/ @@ -40,15 +59,112 @@ EspLuaEngine::~EspLuaEngine() { } } -bool EspLuaEngine::executeScript(const char* script) { - if (luaL_dostring(_lua_state, script) != LUA_OK) { - log_e("%s", lua_tostring(_lua_state, -1)); - lua_pop(_lua_state, 1); - return false; - } - return true; +void EspLuaEngine::setPauseFunction(PauseFunction func) { + _pauseFunction = func; } +void EspLuaEngine::_defaultPauseFunction() { +#if defined(ARDUINO_ARCH_ESP32) + vTaskDelay(ESP_LUA_CHECK_INTERVAL); +#endif // defined(ARDUINO_ARCH_ESP32) +#if defined(ARDUINO_ARCH_ESP8266) + delay(ESP_LUA_CHECK_INTERVAL); +#endif // defined(ARDUINO_ARCH_ESP8266) +} + +void EspLuaEngine::hookFunction(lua_State* L, lua_Debug* ar) { + if (_isPaused.load()) { + while (_isPaused.load() && _isRunning.load()) { + if (_pauseFunction) { + _pauseFunction(); + } else { + _defaultPauseFunction(); + } + } + } + if (!_isRunning.load()) { + if (_lastError.length() == 0) _lastError = "Execution stopped"; + luaL_error(L, "Execution stopped"); + } +} + +void EspLuaEngine::resetState() { + if (_lua_state) { + lua_close(_lua_state); + _lua_state = luaL_newstate(); + if (_lua_state) { + _loadLibraries(); + } else { + log_e("Error: Impossible to create a new Lua state"); + } + } +} + +bool EspLuaEngine::executeScript(const char* script) { + _lastError=""; // Clear the error message + _isPaused.store(false); + _isRunning.store(true); + + // Configure the hook function + lua_sethook(_lua_state, hookFunction, LUA_MASKCOUNT, + ESP_LUA_NB_LINES_BEFORE_HOOK); + + bool success = true; + + // Compile the script + if (luaL_loadstring(_lua_state, script) != LUA_OK) { + if (_lastError.length() == 0) _lastError = lua_tostring(_lua_state, -1); + log_e("Error loading script: %s", _lastError.c_str()); + lua_pop(_lua_state, 1); + success = false; + } else { + // Execute the script + if (lua_pcall(_lua_state, 0, 0, 0) != LUA_OK) { + if (_lastError.length() == 0) _lastError = lua_tostring(_lua_state, -1); + log_e("Error executing script: %s", _lastError.c_str()); + lua_pop(_lua_state, 1); + success = false; + } + } + + // Disable the hook function + lua_sethook(_lua_state, nullptr, 0, 0); + _isRunning.store(false); + _isPaused.store(false); + + return success; +} + +void EspLuaEngine::pauseExecution() { + if (_isRunning.load()) { + _isPaused.store(true); + } +} + +void EspLuaEngine::resumeExecution() { _isPaused.store(false); } + +void EspLuaEngine::stopExecution() { + _isRunning.store(false); + _isPaused.store(false); + if (_lastError.length() == 0) _lastError = "Execution stopped by user"; +} + +bool EspLuaEngine::isRunning() { return _isRunning.load(); } + +bool EspLuaEngine::isPaused() { return _isPaused.load(); } + +EspLuaEngine::Status EspLuaEngine::getStatus() { + if (_isPaused.load()) { + return Status::Paused; + } else if (_isRunning.load()) { + return Status::Running; + } else { + return Status::Idle; + } +} + +bool EspLuaEngine::hasError() { return _lastError.length() > 0; } + bool EspLuaEngine::registerFunction(const char* name, lua_CFunction function, void* userData) { if (!_checkPreconditions(name) || !function) { @@ -222,4 +338,4 @@ bool EspLuaEngine::_makeReadOnly(const char* name) { lua_setmetatable(_lua_state, -2); lua_pop(_lua_state, 2); return true; -} \ No newline at end of file +} diff --git a/libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.h b/libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.h similarity index 62% rename from libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.h rename to libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.h index 1cc7cbd5..edc7e476 100644 --- a/libraries/EspLuaEngine-1.0.1/src/EspLuaEngine.h +++ b/libraries/EspLuaEngine-1.0.2/src/EspLuaEngine.h @@ -20,22 +20,62 @@ #pragma once #define LUA_USE_C89 +#include + +#include +#include + #include "lua-5.4.7/src/lua.hpp" +#if defined(ARDUINO_ARCH_ESP32) +#define ESP_LUA_CHECK_INTERVAL pdMS_TO_TICKS(10) +#endif // defined(ARDUINO_ARCH_ESP32) + +#if defined(ARDUINO_ARCH_ESP8266) +#define ESP_LUA_CHECK_INTERVAL 10 +#endif // defined(ARDUINO_ARCH_ESP8266) + + class EspLuaEngine { public: + enum class Status { + Idle, + Running, + Paused, + }; EspLuaEngine(); ~EspLuaEngine(); + using PauseFunction = std::function; + bool executeScript(const char* script); bool registerFunction(const char* name, lua_CFunction function, void* userData = nullptr); template bool registerConstant(const char* name, T value); lua_State* getLuaState() { return _lua_state; } + const char* getLastError() { return _lastError.c_str(); } + void resetState(); + + void setPauseFunction(PauseFunction func); + + static void pauseExecution(); + static void resumeExecution(); + static void stopExecution(); + bool isPaused(); + bool isRunning(); + Status getStatus(); + bool hasError(); private: lua_State* _lua_state; + static PauseFunction _pauseFunction; + static String _lastError; + static inline std::atomic _isPaused{false}; + static inline std::atomic _isRunning{false}; + + static void hookFunction(lua_State* L, lua_Debug* ar); + static void _defaultPauseFunction(); void _loadLibraries(); bool _checkPreconditions(const char* name); bool _verifyGlobal(const char* name, int type); @@ -46,3 +86,5 @@ class EspLuaEngine { bool _registerConstantImpl(const char* name, bool value); bool _registerConstantImpl(const char* name, int value); }; + +using EspLuaStatus = EspLuaEngine::Status; diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/Makefile b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/Makefile similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/Makefile rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/Makefile diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/README b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/README similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/README rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/README diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/OSIApproved_100X125.png b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/OSIApproved_100X125.png similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/OSIApproved_100X125.png rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/OSIApproved_100X125.png diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/contents.html b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/contents.html similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/contents.html rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/contents.html diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/index.css b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/index.css similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/index.css rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/index.css diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/logo.gif b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/logo.gif similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/logo.gif rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/logo.gif diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/lua.1 b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/lua.1 similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/lua.1 rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/lua.1 diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/lua.css b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/lua.css similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/lua.css rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/lua.css diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/luac.1 b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/luac.1 similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/luac.1 rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/luac.1 diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/manual.css b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/manual.css similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/manual.css rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/manual.css diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/manual.html b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/manual.html similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/manual.html rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/manual.html diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/readme.html b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/readme.html similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/doc/readme.html rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/doc/readme.html diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/Makefile b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/Makefile similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/Makefile rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/Makefile diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lapi.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lapi.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lapi.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lapi.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lapi.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lapi.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lapi.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lapi.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lauxlib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lauxlib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lauxlib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lauxlib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lauxlib.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lauxlib.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lauxlib.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lauxlib.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lbaselib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lbaselib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lbaselib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lbaselib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcode.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcode.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcode.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcode.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcode.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcode.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcode.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcode.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcorolib.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcorolib.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lcorolib.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lcorolib.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lctype.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lctype.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lctype.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lctype.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lctype.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lctype.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lctype.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lctype.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldblib.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldblib.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldblib.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldblib.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldebug.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldebug.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldebug.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldebug.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldebug.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldebug.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldebug.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldebug.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldo.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldo.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldo.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldo.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldo.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldo.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldo.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldo.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldump.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldump.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ldump.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ldump.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lfunc.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lfunc.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lfunc.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lfunc.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lfunc.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lfunc.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lfunc.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lfunc.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lgc.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lgc.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lgc.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lgc.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lgc.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lgc.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lgc.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lgc.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/linit.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/linit.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/linit.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/linit.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/liolib.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/liolib.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/liolib.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/liolib.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ljumptab.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ljumptab.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ljumptab.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ljumptab.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llex.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llex.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llex.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llex.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llex.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llex.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llex.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llex.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llimits.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llimits.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/llimits.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/llimits.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmathlib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmathlib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmathlib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmathlib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmem.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmem.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmem.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmem.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmem.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmem.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lmem.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lmem.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/loadlib.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/loadlib.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/loadlib.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/loadlib.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lobject.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lobject.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lobject.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lobject.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lobject.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lobject.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lobject.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lobject.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopcodes.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopcodes.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopcodes.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopcodes.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopcodes.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopcodes.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopcodes.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopcodes.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopnames.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopnames.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lopnames.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lopnames.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/loslib.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/loslib.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/loslib.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/loslib.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lparser.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lparser.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lparser.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lparser.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lparser.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lparser.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lparser.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lparser.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lprefix.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lprefix.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lprefix.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lprefix.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstate.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstate.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstate.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstate.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstate.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstate.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstate.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstate.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstring.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstring.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstring.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstring.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstring.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstring.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstring.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstring.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstrlib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstrlib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lstrlib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lstrlib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltable.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltable.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltable.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltable.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltable.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltable.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltable.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltable.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltablib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltablib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltablib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltablib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltm.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltm.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltm.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltm.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltm.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltm.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/ltm.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/ltm.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.hpp b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.hpp similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lua.hpp rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lua.hpp diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/luac.c.disabled b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/luac.c.disabled similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/luac.c.disabled rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/luac.c.disabled diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/luaconf.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/luaconf.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/luaconf.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/luaconf.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lualib.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lualib.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lualib.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lualib.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lundump.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lundump.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lundump.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lundump.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lundump.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lundump.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lundump.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lundump.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lutf8lib.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lutf8lib.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lutf8lib.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lutf8lib.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lvm.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lvm.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lvm.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lvm.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lvm.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lvm.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lvm.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lvm.h diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lzio.c b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lzio.c similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lzio.c rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lzio.c diff --git a/libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lzio.h b/libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lzio.h similarity index 100% rename from libraries/EspLuaEngine-1.0.1/src/lua-5.4.7/src/lzio.h rename to libraries/EspLuaEngine-1.0.2/src/lua-5.4.7/src/lzio.h diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio b/libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio deleted file mode 100644 index bca2dc6d..00000000 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio +++ /dev/null @@ -1,76 +0,0 @@ -// Raspberry Pi Pico PIO program to output data to a TFT -// controller via a 16 bit 8080 style data path. - -// Original sourced from: -// https://github.com/zapta/pio_tft - -// Side set: 1 output pin, TFT_WR. Active low. -// Data set: 16 consecutive output pins, TFT_D0 .. TFT_D15 - -.program tft_io -.side_set 1 opt ; The TFT_WR output. - -// The C++ code switches between the different SM routines -// by waiting for the SM to be idle and setting its PC. -// The default SM routine is a 16 bit transfer - -// Do a block fill of N+1 pixels. -public block_fill: - // Fetch colour value. - pull side 1 - // Move colour to x. - mov x, osr - // Fetch pixel count N (sends N+1 pixels). - pull - // Move pixel count to y. - mov y, osr -next: - // Copy colour value into osr, colour in LS 16 bits. - mov osr, x side 1 - // Output colour 16 bits, unwanted top 16 bits shifted through. - out pins, 32 side 0 [1] - // Decrement pixel count and loop. - jmp y--, next side 1 - -.wrap_target -// Transmit an 8 bit value (LS 8 bits of 32 bits). -public start_8: -// Transmit a 16 bit value (LS 16 bits of 32 bits). -public start_tx: - // Fetch the next 32 bit value from the TX FIFO and set TFT_WR high. - pull side 1 - // Write the 16 bits and set WR low. This also - // shifts the unused top 16 bits through. - out pins, 32 side 0 [1] - // Set WR high and jump back to start. - jmp start_tx side 1 - -// Transmit a set window command sequence. -public set_addr_window: - // Loop count in x (to send caset, paset and ramwr commands). - set x, 2 side 1 -pull_cmd: - // Set TFT_DC low. - set pins, 0 - // Fetch caset, paset or ramwr. - pull - // Output LS byte (caset, paset or ramwr), discarding top 16 bits, set TFT_WR low. - out pins, 32 side 0 - // Jump to end if 3rd cmd byte ramwr sent (x == 0) - jmp !x, end_set_addr - // pull next start and end coordinates, TFT_WR high. - pull side 1 - // Set TFT_DC high. - set pins, 1 -send_xy: - // Output byte, TFT_WR low. - out pins, 8 side 0 [1] - // Loop until 4 bytes sent, TFT_WR high. - jmp !osre, send_xy side 1 [1] -end_set_addr: // Jump here since delay needed before DC change - // Loop back for next command and write last command. - jmp x--, pull_cmd side 1 - // Set DC high. - set pins, 1 - // Auto-wrap back to start_tx. -.wrap \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio b/libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio deleted file mode 100644 index 86704fd3..00000000 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio +++ /dev/null @@ -1,92 +0,0 @@ -// Raspberry Pi Pico PIO program to output data to a TFT -// controller via a 8 bit 8080 style data path. - -// Original sourced from: -// https://github.com/zapta/pio_tft - -// Side set: 1 output pin, TFT_WR. Active low. -// Data set: 8 consecutive output pins, TFT_D0 .. TFT_D7 - -.program tft_io -.side_set 1 opt ; The TFT_WR output. - -// The C++ code switches between the different SM routines -// by waiting for the SM to be idle and setting its PC. -// The default SM routine is a 16 bit transfer - -// Do a block fill of N+1 pixels. -public block_fill: - // Fetch colour value. - pull side 1 - // Move colour to x. - mov x, osr - // Fetch pixel count N (sends N+1 pixels). - pull - // Move pixel count to y. - mov y, osr -next: - // Copy colour value into osr, colour in LS 16 bits. - mov osr, x side 1 - // Output colour 8 MS bits, unwanted top 16 bits shifted through. - out pins, 24 side 0 [1] - // Write first colour byte. - nop side 1 [1] - // Write second colour byte. - out pins, 8 side 0 [1] - // Decrement pixel count and loop. - jmp y--, next side 1 - -.wrap_target -// Transmit a 16 bit value (LS 16 bits of 32 bits). -public start_tx: - // Fetch the next 32 bit value from the TX FIFO and set TFT_WR high. - pull side 1 - // Write the first byte (MSB) and set WR low. This also - // shifts the unused top 16 bits through. - out pins, 24 side 0 [1] - // Set WR high and delay to next byte. - nop side 1 [1] - // Output the second byte and set TFT_WRITE low. - out pins, 8 side 0 [1] - // Set WR high and jump back to start. - jmp start_tx side 1 - -// Transmit an 8 bit value (LS 8 bits of 32 bits). -public start_8: - // Fetch the next 32 bit value from the TX FIFO and set TFT_WR high. - pull side 1 - // Write the first byte (LSB) and sets WR low. This also - // shifts the unused top 24 bits through. - out pins, 32 side 0 [1] - // Jump to start - jmp start_tx side 1 - -// Transmit a set window command sequence. -public set_addr_window: - // Loop count in x (to send caset, paset and ramwr commands). - set x, 2 side 1 -pull_cmd: - // Set TFT_DC low. - set pins, 0 - // Fetch caset, paset or ramwr. - pull - // Output LS byte (caset, paset or ramwr), discarding top 24 bits, set TFT_WR low. - out pins, 32 side 0 - // Jump to end if 3rd cmd byte ramwr sent (x == 0) - jmp !x, end_set_addr - // pull next start and end coordinates, TFT_WR high. - pull side 1 - // Set TFT_DC high. - set pins, 1 -send_xy: - // Output byte, TFT_WR low. - out pins, 8 side 0 [1] - // Loop until 4 bytes sent, TFT_WR high. - jmp !osre, send_xy side 1 [1] -end_set_addr: - // Loop back for next command and write last command. - jmp x--, pull_cmd side 1 - // Set DC high. - set pins, 1 - // Auto-wrap back to start_tx. -.wrap \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio b/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio deleted file mode 100644 index 8515a3ac..00000000 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio +++ /dev/null @@ -1,89 +0,0 @@ -// Raspberry Pi Pico PIO program to output data to a TFT -// controller via a SPI output data path. - -//"Set" set: 1 output pin, TFT_DC -// Side set: 1 output pin, TFT_SCLK -// Data set: 1 output pin, TFT_MOSI - -.program tft_io -.side_set 1 opt ; The TFT_SCLK output. - -// The C++ code switches between the 8 bits and 16 bits loops -// by waiting for the SM to be idle and setting its PC. -// - -// 8 bit transfer -public start_8: - // Pull the next 32 bit value from the TX FIFO. - pull side 0 - // Lose the top 24 bits, send 1st bit - out pins, 25 - // Now send remaining bits - jmp spi_out side 1 - -public set_addr_window: - // Loop count in x for caset, paset and ramwr - set x, 2 side 0 -pull_cmd: - // Set DC low - set pins, 0 - // Fetch and output LS byte (caset, paset or ramwr), discarding top 24 bits, set WR low - pull side 0 - out pins, 25 - nop side 1 -next_cmd_bit: - out pins, 1 side 0 - jmp !osre, next_cmd_bit side 1 - // Set DC high - set pins, 1 side 0 - // Finish if 3rd cmd byte ramwr sent (x == 0) - jmp !x, start_tx - pull -next_xy: - // send 32 bit start and end coordinates - out pins, 1 side 0 - jmp !osre, next_xy side 1 - // Loop back for next command - jmp x--, pull_cmd side 0 - // End - jmp start_tx - -public block_fill: - // Fetch colour value - pull side 0 - // Move colour to x - mov x, osr - // Fetch pixel count - pull - // Move pixel count to y - mov y, osr -next_16: - // Copy colour value back into osr - mov osr, x side 0 - // Lose the top 16 bits, send 1st bit - out pins, 17 side 0 - nop side 1 -next_bit: - // Output next 15 colour bits - out pins, 1 side 0 - // Set TFT_SCLK high and jump for next bit - jmp !osre, next_bit side 1 - // Decrement count and loop - jmp y--, next_16 side 0 - // Now drop back to 16 bit output - -.wrap_target -public start_tx: - // Pull the next 32 bit value from the TX FIFO. - // Send the bottom 16 bits - pull side 0 - // Drop the first 16 bits, write first bit - out pins, 17 side 0 - nop side 1 -spi_out: - // Output the next 15 bits - out pins, 1 side 0 - // Set TFT_SCLK high and jump for next bit - jmp !osre, spi_out side 1 - // Return to start -.wrap diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio b/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio deleted file mode 100644 index 25df4c00..00000000 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio +++ /dev/null @@ -1,89 +0,0 @@ -// Raspberry Pi Pico PIO program to output 18 bit data to a TFT -// controller via a SPI output data path. - -//"Set" set: 1 output pin, TFT_DC -// Side set: 1 output pin, TFT_SCLK -// Data set: 1 output pin, TFT_MOSI - -.program tft_io -.side_set 1 opt ; The TFT_SCLK output. - -// The C++ code switches between the 8 bits and 16 bits loops -// by waiting for the SM to be idle and setting its PC. -// - -// 8 bit transfer -public start_8: - // Pull the next 32 bit value from the TX FIFO. - pull side 0 - // Lose the top 24 bits, send 1st bit - out pins, 25 - // Now send remaining bits - jmp spi_out side 1 - -public set_addr_window: - // Loop count in x for caset, paset and ramwr - set x, 2 side 0 -pull_cmd: - // Set DC low - set pins, 0 - // Fetch and output LS byte (caset, paset or ramwr), discarding top 24 bits, set WR low - pull side 0 - out pins, 25 - nop side 1 -next_cmd_bit: - out pins, 1 side 0 - jmp !osre, next_cmd_bit side 1 - // Set DC high - set pins, 1 side 0 - // Finish if 3rd cmd byte ramwr sent (x == 0) - jmp !x, start_tx - pull -next_xy: - // send 32 bit start and end coordinates - out pins, 1 side 0 - jmp !osre, next_xy side 1 - // Loop back for next command - jmp x--, pull_cmd side 0 - // End - jmp start_tx - -public block_fill: - // Fetch colour value - pull side 0 - // Move colour to x - mov x, osr - // Fetch pixel count - pull - // Move pixel count to y - mov y, osr -next_16: - // Copy colour value back into osr - mov osr, x side 0 - // Lose the top 8 bits, send 1st bit - out pins, 9 side 0 - nop side 1 -next_bit: - // Output next remaining bits - out pins, 1 side 0 - // Set TFT_SCLK high and jump for next bit - jmp !osre, next_bit side 1 - // Decrement count and loop - jmp y--, next_16 side 0 - // Now drop back to 16 bit output - -.wrap_target -public start_tx: - // Pull the next 32 bit value from the TX FIFO. - // Send the bottom 24 bits - pull side 0 - // Drop the first 8 bits, write first bit - out pins, 9 side 0 - nop side 1 -spi_out: - // Output the remaining bits - out pins, 1 side 0 - // Set TFT_SCLK high and jump for next bit - jmp !osre, spi_out side 1 - // Return to start -.wrap diff --git a/libraries/TFT_eSPI-2.4.72/README.txt b/libraries/TFT_eSPI-2.4.72/README.txt deleted file mode 100644 index 17ff25fa..00000000 --- a/libraries/TFT_eSPI-2.4.72/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -This is a stand-alone library that contains both graphics functions -and the TFT chip driver library. It supports the ESP8266, ESP32 and -STM32 processors with performance optimised code. Other Arduino IDE -compatible boards are also supported but the library then uses -generic functions which will be slower. The library uses 32 bit -variables extensively so this will affect performance on 8 and 16 -bit processors. diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Init.h b/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Init.h deleted file mode 100644 index 4d388367..00000000 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Init.h +++ /dev/null @@ -1,429 +0,0 @@ - -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x01); - -//GAMMA SETING RED -writeRegister(0xD100, 0x00); -writeRegister(0xD101, 0x00); -writeRegister(0xD102, 0x1b); -writeRegister(0xD103, 0x44); -writeRegister(0xD104, 0x62); -writeRegister(0xD105, 0x00); -writeRegister(0xD106, 0x7b); -writeRegister(0xD107, 0xa1); -writeRegister(0xD108, 0xc0); -writeRegister(0xD109, 0xee); -writeRegister(0xD10A, 0x55); -writeRegister(0xD10B, 0x10); -writeRegister(0xD10C, 0x2c); -writeRegister(0xD10D, 0x43); -writeRegister(0xD10E, 0x57); -writeRegister(0xD10F, 0x55); -writeRegister(0xD110, 0x68); -writeRegister(0xD111, 0x78); -writeRegister(0xD112, 0x87); -writeRegister(0xD113, 0x94); -writeRegister(0xD114, 0x55); -writeRegister(0xD115, 0xa0); -writeRegister(0xD116, 0xac); -writeRegister(0xD117, 0xb6); -writeRegister(0xD118, 0xc1); -writeRegister(0xD119, 0x55); -writeRegister(0xD11A, 0xcb); -writeRegister(0xD11B, 0xcd); -writeRegister(0xD11C, 0xd6); -writeRegister(0xD11D, 0xdf); -writeRegister(0xD11E, 0x95); -writeRegister(0xD11F, 0xe8); -writeRegister(0xD120, 0xf1); -writeRegister(0xD121, 0xfa); -writeRegister(0xD122, 0x02); -writeRegister(0xD123, 0xaa); -writeRegister(0xD124, 0x0b); -writeRegister(0xD125, 0x13); -writeRegister(0xD126, 0x1d); -writeRegister(0xD127, 0x26); -writeRegister(0xD128, 0xaa); -writeRegister(0xD129, 0x30); -writeRegister(0xD12A, 0x3c); -writeRegister(0xD12B, 0x4A); -writeRegister(0xD12C, 0x63); -writeRegister(0xD12D, 0xea); -writeRegister(0xD12E, 0x79); -writeRegister(0xD12F, 0xa6); -writeRegister(0xD130, 0xd0); -writeRegister(0xD131, 0x20); -writeRegister(0xD132, 0x0f); -writeRegister(0xD133, 0x8e); -writeRegister(0xD134, 0xff); -//GAMMA SETING GREEN -writeRegister(0xD200, 0x00); -writeRegister(0xD201, 0x00); -writeRegister(0xD202, 0x1b); -writeRegister(0xD203, 0x44); -writeRegister(0xD204, 0x62); -writeRegister(0xD205, 0x00); -writeRegister(0xD206, 0x7b); -writeRegister(0xD207, 0xa1); -writeRegister(0xD208, 0xc0); -writeRegister(0xD209, 0xee); -writeRegister(0xD20A, 0x55); -writeRegister(0xD20B, 0x10); -writeRegister(0xD20C, 0x2c); -writeRegister(0xD20D, 0x43); -writeRegister(0xD20E, 0x57); -writeRegister(0xD20F, 0x55); -writeRegister(0xD210, 0x68); -writeRegister(0xD211, 0x78); -writeRegister(0xD212, 0x87); -writeRegister(0xD213, 0x94); -writeRegister(0xD214, 0x55); -writeRegister(0xD215, 0xa0); -writeRegister(0xD216, 0xac); -writeRegister(0xD217, 0xb6); -writeRegister(0xD218, 0xc1); -writeRegister(0xD219, 0x55); -writeRegister(0xD21A, 0xcb); -writeRegister(0xD21B, 0xcd); -writeRegister(0xD21C, 0xd6); -writeRegister(0xD21D, 0xdf); -writeRegister(0xD21E, 0x95); -writeRegister(0xD21F, 0xe8); -writeRegister(0xD220, 0xf1); -writeRegister(0xD221, 0xfa); -writeRegister(0xD222, 0x02); -writeRegister(0xD223, 0xaa); -writeRegister(0xD224, 0x0b); -writeRegister(0xD225, 0x13); -writeRegister(0xD226, 0x1d); -writeRegister(0xD227, 0x26); -writeRegister(0xD228, 0xaa); -writeRegister(0xD229, 0x30); -writeRegister(0xD22A, 0x3c); -writeRegister(0xD22B, 0x4a); -writeRegister(0xD22C, 0x63); -writeRegister(0xD22D, 0xea); -writeRegister(0xD22E, 0x79); -writeRegister(0xD22F, 0xa6); -writeRegister(0xD230, 0xd0); -writeRegister(0xD231, 0x20); -writeRegister(0xD232, 0x0f); -writeRegister(0xD233, 0x8e); -writeRegister(0xD234, 0xff); - -//GAMMA SETING BLUE -writeRegister(0xD300, 0x00); -writeRegister(0xD301, 0x00); -writeRegister(0xD302, 0x1b); -writeRegister(0xD303, 0x44); -writeRegister(0xD304, 0x62); -writeRegister(0xD305, 0x00); -writeRegister(0xD306, 0x7b); -writeRegister(0xD307, 0xa1); -writeRegister(0xD308, 0xc0); -writeRegister(0xD309, 0xee); -writeRegister(0xD30A, 0x55); -writeRegister(0xD30B, 0x10); -writeRegister(0xD30C, 0x2c); -writeRegister(0xD30D, 0x43); -writeRegister(0xD30E, 0x57); -writeRegister(0xD30F, 0x55); -writeRegister(0xD310, 0x68); -writeRegister(0xD311, 0x78); -writeRegister(0xD312, 0x87); -writeRegister(0xD313, 0x94); -writeRegister(0xD314, 0x55); -writeRegister(0xD315, 0xa0); -writeRegister(0xD316, 0xac); -writeRegister(0xD317, 0xb6); -writeRegister(0xD318, 0xc1); -writeRegister(0xD319, 0x55); -writeRegister(0xD31A, 0xcb); -writeRegister(0xD31B, 0xcd); -writeRegister(0xD31C, 0xd6); -writeRegister(0xD31D, 0xdf); -writeRegister(0xD31E, 0x95); -writeRegister(0xD31F, 0xe8); -writeRegister(0xD320, 0xf1); -writeRegister(0xD321, 0xfa); -writeRegister(0xD322, 0x02); -writeRegister(0xD323, 0xaa); -writeRegister(0xD324, 0x0b); -writeRegister(0xD325, 0x13); -writeRegister(0xD326, 0x1d); -writeRegister(0xD327, 0x26); -writeRegister(0xD328, 0xaa); -writeRegister(0xD329, 0x30); -writeRegister(0xD32A, 0x3c); -writeRegister(0xD32B, 0x4A); -writeRegister(0xD32C, 0x63); -writeRegister(0xD32D, 0xea); -writeRegister(0xD32E, 0x79); -writeRegister(0xD32F, 0xa6); -writeRegister(0xD330, 0xd0); -writeRegister(0xD331, 0x20); -writeRegister(0xD332, 0x0f); -writeRegister(0xD333, 0x8e); -writeRegister(0xD334, 0xff); - - -//GAMMA SETING RED -writeRegister(0xD400, 0x00); -writeRegister(0xD401, 0x00); -writeRegister(0xD402, 0x1b); -writeRegister(0xD403, 0x44); -writeRegister(0xD404, 0x62); -writeRegister(0xD405, 0x00); -writeRegister(0xD406, 0x7b); -writeRegister(0xD407, 0xa1); -writeRegister(0xD408, 0xc0); -writeRegister(0xD409, 0xee); -writeRegister(0xD40A, 0x55); -writeRegister(0xD40B, 0x10); -writeRegister(0xD40C, 0x2c); -writeRegister(0xD40D, 0x43); -writeRegister(0xD40E, 0x57); -writeRegister(0xD40F, 0x55); -writeRegister(0xD410, 0x68); -writeRegister(0xD411, 0x78); -writeRegister(0xD412, 0x87); -writeRegister(0xD413, 0x94); -writeRegister(0xD414, 0x55); -writeRegister(0xD415, 0xa0); -writeRegister(0xD416, 0xac); -writeRegister(0xD417, 0xb6); -writeRegister(0xD418, 0xc1); -writeRegister(0xD419, 0x55); -writeRegister(0xD41A, 0xcb); -writeRegister(0xD41B, 0xcd); -writeRegister(0xD41C, 0xd6); -writeRegister(0xD41D, 0xdf); -writeRegister(0xD41E, 0x95); -writeRegister(0xD41F, 0xe8); -writeRegister(0xD420, 0xf1); -writeRegister(0xD421, 0xfa); -writeRegister(0xD422, 0x02); -writeRegister(0xD423, 0xaa); -writeRegister(0xD424, 0x0b); -writeRegister(0xD425, 0x13); -writeRegister(0xD426, 0x1d); -writeRegister(0xD427, 0x26); -writeRegister(0xD428, 0xaa); -writeRegister(0xD429, 0x30); -writeRegister(0xD42A, 0x3c); -writeRegister(0xD42B, 0x4A); -writeRegister(0xD42C, 0x63); -writeRegister(0xD42D, 0xea); -writeRegister(0xD42E, 0x79); -writeRegister(0xD42F, 0xa6); -writeRegister(0xD430, 0xd0); -writeRegister(0xD431, 0x20); -writeRegister(0xD432, 0x0f); -writeRegister(0xD433, 0x8e); -writeRegister(0xD434, 0xff); - -//GAMMA SETING GREEN -writeRegister(0xD500, 0x00); -writeRegister(0xD501, 0x00); -writeRegister(0xD502, 0x1b); -writeRegister(0xD503, 0x44); -writeRegister(0xD504, 0x62); -writeRegister(0xD505, 0x00); -writeRegister(0xD506, 0x7b); -writeRegister(0xD507, 0xa1); -writeRegister(0xD508, 0xc0); -writeRegister(0xD509, 0xee); -writeRegister(0xD50A, 0x55); -writeRegister(0xD50B, 0x10); -writeRegister(0xD50C, 0x2c); -writeRegister(0xD50D, 0x43); -writeRegister(0xD50E, 0x57); -writeRegister(0xD50F, 0x55); -writeRegister(0xD510, 0x68); -writeRegister(0xD511, 0x78); -writeRegister(0xD512, 0x87); -writeRegister(0xD513, 0x94); -writeRegister(0xD514, 0x55); -writeRegister(0xD515, 0xa0); -writeRegister(0xD516, 0xac); -writeRegister(0xD517, 0xb6); -writeRegister(0xD518, 0xc1); -writeRegister(0xD519, 0x55); -writeRegister(0xD51A, 0xcb); -writeRegister(0xD51B, 0xcd); -writeRegister(0xD51C, 0xd6); -writeRegister(0xD51D, 0xdf); -writeRegister(0xD51E, 0x95); -writeRegister(0xD51F, 0xe8); -writeRegister(0xD520, 0xf1); -writeRegister(0xD521, 0xfa); -writeRegister(0xD522, 0x02); -writeRegister(0xD523, 0xaa); -writeRegister(0xD524, 0x0b); -writeRegister(0xD525, 0x13); -writeRegister(0xD526, 0x1d); -writeRegister(0xD527, 0x26); -writeRegister(0xD528, 0xaa); -writeRegister(0xD529, 0x30); -writeRegister(0xD52A, 0x3c); -writeRegister(0xD52B, 0x4a); -writeRegister(0xD52C, 0x63); -writeRegister(0xD52D, 0xea); -writeRegister(0xD52E, 0x79); -writeRegister(0xD52F, 0xa6); -writeRegister(0xD530, 0xd0); -writeRegister(0xD531, 0x20); -writeRegister(0xD532, 0x0f); -writeRegister(0xD533, 0x8e); -writeRegister(0xD534, 0xff); - -//GAMMA SETING BLUE -writeRegister(0xD600, 0x00); -writeRegister(0xD601, 0x00); -writeRegister(0xD602, 0x1b); -writeRegister(0xD603, 0x44); -writeRegister(0xD604, 0x62); -writeRegister(0xD605, 0x00); -writeRegister(0xD606, 0x7b); -writeRegister(0xD607, 0xa1); -writeRegister(0xD608, 0xc0); -writeRegister(0xD609, 0xee); -writeRegister(0xD60A, 0x55); -writeRegister(0xD60B, 0x10); -writeRegister(0xD60C, 0x2c); -writeRegister(0xD60D, 0x43); -writeRegister(0xD60E, 0x57); -writeRegister(0xD60F, 0x55); -writeRegister(0xD610, 0x68); -writeRegister(0xD611, 0x78); -writeRegister(0xD612, 0x87); -writeRegister(0xD613, 0x94); -writeRegister(0xD614, 0x55); -writeRegister(0xD615, 0xa0); -writeRegister(0xD616, 0xac); -writeRegister(0xD617, 0xb6); -writeRegister(0xD618, 0xc1); -writeRegister(0xD619, 0x55); -writeRegister(0xD61A, 0xcb); -writeRegister(0xD61B, 0xcd); -writeRegister(0xD61C, 0xd6); -writeRegister(0xD61D, 0xdf); -writeRegister(0xD61E, 0x95); -writeRegister(0xD61F, 0xe8); -writeRegister(0xD620, 0xf1); -writeRegister(0xD621, 0xfa); -writeRegister(0xD622, 0x02); -writeRegister(0xD623, 0xaa); -writeRegister(0xD624, 0x0b); -writeRegister(0xD625, 0x13); -writeRegister(0xD626, 0x1d); -writeRegister(0xD627, 0x26); -writeRegister(0xD628, 0xaa); -writeRegister(0xD629, 0x30); -writeRegister(0xD62A, 0x3c); -writeRegister(0xD62B, 0x4A); -writeRegister(0xD62C, 0x63); -writeRegister(0xD62D, 0xea); -writeRegister(0xD62E, 0x79); -writeRegister(0xD62F, 0xa6); -writeRegister(0xD630, 0xd0); -writeRegister(0xD631, 0x20); -writeRegister(0xD632, 0x0f); -writeRegister(0xD633, 0x8e); -writeRegister(0xD634, 0xff); - -//AVDD VOLTAGE SETTING -writeRegister(0xB000, 0x05); -writeRegister(0xB001, 0x05); -writeRegister(0xB002, 0x05); -//AVEE VOLTAGE SETTING -writeRegister(0xB100, 0x05); -writeRegister(0xB101, 0x05); -writeRegister(0xB102, 0x05); - -//AVDD Boosting -writeRegister(0xB600, 0x34); -writeRegister(0xB601, 0x34); -writeRegister(0xB603, 0x34); -//AVEE Boosting -writeRegister(0xB700, 0x24); -writeRegister(0xB701, 0x24); -writeRegister(0xB702, 0x24); -//VCL Boosting -writeRegister(0xB800, 0x24); -writeRegister(0xB801, 0x24); -writeRegister(0xB802, 0x24); -//VGLX VOLTAGE SETTING -writeRegister(0xBA00, 0x14); -writeRegister(0xBA01, 0x14); -writeRegister(0xBA02, 0x14); -//VCL Boosting -writeRegister(0xB900, 0x24); -writeRegister(0xB901, 0x24); -writeRegister(0xB902, 0x24); -//Gamma Voltage -writeRegister(0xBc00, 0x00); -writeRegister(0xBc01, 0xa0);//vgmp=5.0 -writeRegister(0xBc02, 0x00); -writeRegister(0xBd00, 0x00); -writeRegister(0xBd01, 0xa0);//vgmn=5.0 -writeRegister(0xBd02, 0x00); -//VCOM Setting -writeRegister(0xBe01, 0x3d);//3 -//ENABLE PAGE 0 -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x00); -//Vivid Color Function Control -writeRegister(0xB400, 0x10); -//Z-INVERSION -writeRegister(0xBC00, 0x05); -writeRegister(0xBC01, 0x05); -writeRegister(0xBC02, 0x05); - -//*************** add on 20111021**********************// -writeRegister(0xB700, 0x22);//GATE EQ CONTROL -writeRegister(0xB701, 0x22);//GATE EQ CONTROL -writeRegister(0xC80B, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC80C, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC80F, 0x2A);//DISPLAY TIMING CONTROL -writeRegister(0xC810, 0x2A);//DISPLAY TIMING CONTROL -//*************** add on 20111021**********************// -//PWM_ENH_OE =1 -writeRegister(0xd000, 0x01); -//DM_SEL =1 -writeRegister(0xb300, 0x10); -//VBPDA=07h -writeRegister(0xBd02, 0x07); -//VBPDb=07h -writeRegister(0xBe02, 0x07); -//VBPDc=07h -writeRegister(0xBf02, 0x07); -//ENABLE PAGE 2 -writeRegister(0xF000, 0x55); -writeRegister(0xF001, 0xAA); -writeRegister(0xF002, 0x52); -writeRegister(0xF003, 0x08); -writeRegister(0xF004, 0x02); -//SDREG0 =0 -writeRegister(0xc301, 0xa9); -//DS=14 -writeRegister(0xfe01, 0x94); -//OSC =60h -writeRegister(0xf600, 0x60); -//TE ON -writeRegister(0x3500, 0x00); -//SLEEP OUT -writecommand(0x1100); -delay(100); -//DISPLY ON -writecommand(0x2900); -delay(100); - -writeRegister(0x3A00, 0x55); -writeRegister(0x3600, 0xA3); diff --git a/libraries/TFT_eSPI-2.4.72/TFT_eSPI.h b/libraries/TFT_eSPI-2.4.72/TFT_eSPI.h deleted file mode 100644 index d364b4a6..00000000 --- a/libraries/TFT_eSPI-2.4.72/TFT_eSPI.h +++ /dev/null @@ -1,1043 +0,0 @@ -/*************************************************** - Arduino TFT graphics library targeted at ESP8266 - and ESP32 based boards. - - This is a stand-alone library that contains the - hardware driver, the graphics functions and the - proportional fonts. - - The built-in fonts 4, 6, 7 and 8 are Run Length - Encoded (RLE) to reduce the FLASH footprint. - - Last review/edit by Bodmer: 04/02/22 - ****************************************************/ - -// Stop fonts etc being loaded multiple times -#ifndef _TFT_eSPIH_ -#define _TFT_eSPIH_ - -#define TFT_ESPI_VERSION "2.4.72" - -// Bit level feature flags -// Bit 0 set: viewport capability -#define TFT_ESPI_FEATURES 1 - -/*************************************************************************************** -** Section 1: Load required header files -***************************************************************************************/ - -// Standard support -#include -#include -#include - -/*************************************************************************************** -** Section 2: Load library and processor specific header -*files -***************************************************************************************/ -// Include header file that defines the fonts loaded, the TFT drivers -// available and the pins to be used, etc, etc -#ifdef CONFIG_TFT_eSPI_ESPIDF -#include "TFT_config.h" -#endif -#include - -// Handle FLASH based storage e.g. PROGMEM -#if defined(ARDUINO_ARCH_RP2040) -#undef pgm_read_byte -#define pgm_read_byte(addr) (*(const unsigned char *)(addr)) -#undef pgm_read_word -#define pgm_read_word(addr) \ - ({ \ - typeof(addr) _addr = (addr); \ - *(const unsigned short *)(_addr); \ - }) -#undef pgm_read_dword -#define pgm_read_dword(addr) \ - ({ \ - typeof(addr) _addr = (addr); \ - *(const unsigned long *)(_addr); \ - }) -#elif defined(__AVR__) -#include -#elif defined(ESP8266) || defined(ESP32) -#include -#else -#define PROGMEM -#endif - -// Include the processor specific drivers -#if defined(CONFIG_IDF_TARGET_ESP32S3) -#include "Processors/TFT_eSPI_ESP32_S3.h" -#elif defined(CONFIG_IDF_TARGET_ESP32C3) -#include "Processors/TFT_eSPI_ESP32_C3.h" -#elif defined(ESP32) -#include "Processors/TFT_eSPI_ESP32.h" -#elif defined(ESP8266) -#include "Processors/TFT_eSPI_ESP8266.h" -#elif defined(STM32) -#include "Processors/TFT_eSPI_STM32.h" -#elif defined(ARDUINO_ARCH_RP2040) -#include "Processors/TFT_eSPI_RP2040.h" -#else -#include "Processors/TFT_eSPI_Generic.h" -#endif - -/*************************************************************************************** -** Section 3: Interface setup -***************************************************************************************/ -#ifndef TAB_COLOUR -#define TAB_COLOUR 0 -#endif - -// If the SPI frequency is not defined, set a default -#ifndef SPI_FREQUENCY -#define SPI_FREQUENCY 20000000 -#endif - -// If the SPI read frequency is not defined, set a default -#ifndef SPI_READ_FREQUENCY -#define SPI_READ_FREQUENCY 10000000 -#endif - -// Some ST7789 boards do not work with Mode 0 -#ifndef TFT_SPI_MODE -#if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER) -#define TFT_SPI_MODE SPI_MODE3 -#else -#define TFT_SPI_MODE SPI_MODE0 -#endif -#endif - -// If the XPT2046 SPI frequency is not defined, set a default -#ifndef SPI_TOUCH_FREQUENCY -#define SPI_TOUCH_FREQUENCY 2500000 -#endif - -#ifndef SPI_BUSY_CHECK -#define SPI_BUSY_CHECK -#endif - -/*************************************************************************************** -** Section 4: Setup fonts -***************************************************************************************/ -// Use GLCD font in error case where user requests a smooth font file -// that does not exist (this is a temporary fix to stop ESP32 reboot) -#ifdef SMOOTH_FONT -#ifndef LOAD_GLCD -#define LOAD_GLCD -#endif -#endif - -// Only load the fonts defined in User_Setup.h (to save space) -// Set flag so RLE rendering code is optionally compiled -#ifdef LOAD_GLCD -#include -#endif - -#ifdef LOAD_FONT2 -#include -#endif - -#ifdef LOAD_FONT4 -#include -#define LOAD_RLE -#endif - -#ifdef LOAD_FONT6 -#include -#ifndef LOAD_RLE -#define LOAD_RLE -#endif -#endif - -#ifdef LOAD_FONT7 -#include -#ifndef LOAD_RLE -#define LOAD_RLE -#endif -#endif - -#ifdef LOAD_FONT8 -#include -#ifndef LOAD_RLE -#define LOAD_RLE -#endif -#elif defined LOAD_FONT8N // Optional narrower version -#define LOAD_FONT8 -#include -#ifndef LOAD_RLE -#define LOAD_RLE -#endif -#endif - -#ifdef LOAD_GFXFF -// We can include all the free fonts and they will only be built into -// the sketch if they are used -#include -// Call up any user custom fonts -#include -#endif // #ifdef LOAD_GFXFF - -// Create a null default font in case some fonts not used (to prevent crash) -const uint8_t widtbl_null[1] = {0}; -PROGMEM const uint8_t chr_null[1] = {0}; -PROGMEM const uint8_t *const chrtbl_null[1] = {chr_null}; - -// This is a structure to conveniently hold information on the default fonts -// Stores pointer to font character image address table, width table and height -typedef struct { - const uint8_t *chartbl; - const uint8_t *widthtbl; - uint8_t height; - uint8_t baseline; -} fontinfo; - -// Now fill the structure -const PROGMEM fontinfo fontdata[] = { -#ifdef LOAD_GLCD - {(const uint8_t *)font, widtbl_null, 0, 0}, -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, -#endif - // GLCD font (Font 1) does not have all parameters - {(const uint8_t *)chrtbl_null, widtbl_null, 8, 7}, - -#ifdef LOAD_FONT2 - {(const uint8_t *)chrtbl_f16, widtbl_f16, chr_hgt_f16, baseline_f16}, -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, -#endif - - // Font 3 current unused - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, - -#ifdef LOAD_FONT4 - {(const uint8_t *)chrtbl_f32, widtbl_f32, chr_hgt_f32, baseline_f32}, -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, -#endif - - // Font 5 current unused - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, - -#ifdef LOAD_FONT6 - {(const uint8_t *)chrtbl_f64, widtbl_f64, chr_hgt_f64, baseline_f64}, -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, -#endif - -#ifdef LOAD_FONT7 - {(const uint8_t *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s, baseline_f7s}, -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0}, -#endif - -#ifdef LOAD_FONT8 - {(const uint8_t *)chrtbl_f72, widtbl_f72, chr_hgt_f72, baseline_f72} -#else - {(const uint8_t *)chrtbl_null, widtbl_null, 0, 0} -#endif -}; - -/*************************************************************************************** -** Section 5: Font datum enumeration -***************************************************************************************/ -// These enumerate the text plotting alignment (reference datum point) -#define TL_DATUM 0 // Top left (default) -#define TC_DATUM 1 // Top centre -#define TR_DATUM 2 // Top right -#define ML_DATUM 3 // Middle left -#define CL_DATUM 3 // Centre left, same as above -#define MC_DATUM 4 // Middle centre -#define CC_DATUM 4 // Centre centre, same as above -#define MR_DATUM 5 // Middle right -#define CR_DATUM 5 // Centre right, same as above -#define BL_DATUM 6 // Bottom left -#define BC_DATUM 7 // Bottom centre -#define BR_DATUM 8 // Bottom right -#define L_BASELINE \ - 9 // Left character baseline (Line the 'A' character would sit on) -#define C_BASELINE 10 // Centre character baseline -#define R_BASELINE 11 // Right character baseline - -/*************************************************************************************** -** Section 6: Colour enumeration -***************************************************************************************/ -// Default color definitions -#define TFT_BLACK 0x0000 /* 0, 0, 0 */ -#define TFT_NAVY 0x000F /* 0, 0, 128 */ -#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ -#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ -#define TFT_MAROON 0x7800 /* 128, 0, 0 */ -#define TFT_PURPLE 0x780F /* 128, 0, 128 */ -#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ -#define TFT_LIGHTGREY 0xD69A /* 211, 211, 211 */ -#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ -#define TFT_BLUE 0x001F /* 0, 0, 255 */ -#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ -#define TFT_CYAN 0x07FF /* 0, 255, 255 */ -#define TFT_RED 0xF800 /* 255, 0, 0 */ -#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ -#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ -#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ -#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ -#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ -#define TFT_PINK 0xFE19 /* 255, 192, 203 */ // Lighter pink, was 0xFC9F -#define TFT_BROWN 0x9A60 /* 150, 75, 0 */ -#define TFT_GOLD 0xFEA0 /* 255, 215, 0 */ -#define TFT_SILVER 0xC618 /* 192, 192, 192 */ -#define TFT_SKYBLUE 0x867D /* 135, 206, 235 */ -#define TFT_VIOLET 0x915C /* 180, 46, 226 */ - -// Next is a special 16 bit colour value that encodes to 8 bits -// and will then decode back to the same 16 bit value. -// Convenient for 8 bit and 16 bit transparent sprites. -#define TFT_TRANSPARENT 0x0120 // This is actually a dark green - -// Default palette for 4 bit colour sprites -static const uint16_t default_4bit_palette[] PROGMEM = { - TFT_BLACK, // 0 ^ - TFT_BROWN, // 1 | - TFT_RED, // 2 | - TFT_ORANGE, // 3 | - TFT_YELLOW, // 4 Colours 0-9 follow the resistor colour code! - TFT_GREEN, // 5 | - TFT_BLUE, // 6 | - TFT_PURPLE, // 7 | - TFT_DARKGREY, // 8 | - TFT_WHITE, // 9 v - TFT_CYAN, // 10 Blue+green mix - TFT_MAGENTA, // 11 Blue+red mix - TFT_MAROON, // 12 Darker red colour - TFT_DARKGREEN, // 13 Darker green colour - TFT_NAVY, // 14 Darker blue colour - TFT_PINK // 15 -}; - -/*************************************************************************************** -** Section 7: Diagnostic support -***************************************************************************************/ -// #define TFT_eSPI_DEBUG // Switch on debug support serial messages (not -// used yet) #define TFT_eSPI_FNx_DEBUG // Switch on debug support for function -// "x" (not used yet) - -// This structure allows sketches to retrieve the user setup parameters at -// runtime by calling getSetup(), zero impact on code size unless used, mainly -// for diagnostics -typedef struct { - String version = TFT_ESPI_VERSION; - String setup_info; // Setup reference name available to use in a user setup - uint32_t setup_id; // ID available to use in a user setup - int32_t esp; // Processor code - uint8_t trans; // SPI transaction support - uint8_t serial; // Serial (SPI) or parallel - uint8_t port; // SPI port - uint8_t overlap; // ESP8266 overlap mode - uint8_t interface; // Interface type - - uint16_t tft_driver; // Hexadecimal code - uint16_t tft_width; // Rotation 0 width and height - uint16_t tft_height; - - uint8_t r0_x_offset; // Display offsets, not all used yet - uint8_t r0_y_offset; - uint8_t r1_x_offset; - uint8_t r1_y_offset; - uint8_t r2_x_offset; - uint8_t r2_y_offset; - uint8_t r3_x_offset; - uint8_t r3_y_offset; - - int8_t pin_tft_mosi; // SPI pins - int8_t pin_tft_miso; - int8_t pin_tft_clk; - int8_t pin_tft_cs; - - int8_t pin_tft_dc; // Control pins - int8_t pin_tft_rd; - int8_t pin_tft_wr; - int8_t pin_tft_rst; - - int8_t pin_tft_d0; // Parallel port pins - int8_t pin_tft_d1; - int8_t pin_tft_d2; - int8_t pin_tft_d3; - int8_t pin_tft_d4; - int8_t pin_tft_d5; - int8_t pin_tft_d6; - int8_t pin_tft_d7; - - int8_t pin_tft_led; - int8_t pin_tft_led_on; - - int8_t pin_tch_cs; // Touch chip select pin - - int16_t tft_spi_freq; // TFT write SPI frequency - int16_t tft_rd_freq; // TFT read SPI frequency - int16_t tch_spi_freq; // Touch controller read/write SPI frequency -} setup_t; - -/*************************************************************************************** -** Section 8: Class member and support functions -***************************************************************************************/ -// Swap any type -template -static inline void swap_coord(T &a, T &b) { - T t = a; - a = b; - b = t; -} - -// Callback prototype for smooth font pixel colour read -typedef uint16_t (*getColorCallback)(uint16_t x, uint16_t y); - -// Class functions and variables -class TFT_eSPI : public Print { - friend class TFT_eSprite; // Sprite class has access to protected members - - //--------------------------------------- public - //------------------------------------// - public: - TFT_eSPI(int16_t _W = TFT_WIDTH, int16_t _H = TFT_HEIGHT); - - // init() and begin() are equivalent, begin() included for backwards - // compatibility Sketch defined tab colour option is for ST7735 displays only - void init(uint8_t tc = TAB_COLOUR), begin(uint8_t tc = TAB_COLOUR); - - // These are virtual so the TFT_eSprite class can override them with sprite - // specific functions - virtual void drawPixel(int32_t x, int32_t y, uint32_t color), - drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, - uint8_t size), - drawLine(int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color), - drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color), - drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color), - fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); - - virtual int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, - uint8_t font), - drawChar(uint16_t uniCode, int32_t x, int32_t y), height(void), - width(void); - - // Read the colour of a pixel at x,y and return value in 565 format - virtual uint16_t readPixel(int32_t x, int32_t y); - - virtual void setWindow(int32_t xs, int32_t ys, int32_t xe, - int32_t ye); // Note: start + end coordinates - - // Push (aka write pixel) colours to the set window - virtual void pushColor(uint16_t color); - - // These are non-inlined to enable override - virtual void begin_nin_write(); - virtual void end_nin_write(); - - void setRotation( - uint8_t r); // Set the display image orientation to 0, 1, 2 or 3 - uint8_t getRotation(void); // Read the current rotation - - void invertDisplay(bool i); // Tell TFT to invert all displayed colours - - // The TFT_eSprite class inherits the following functions (not all are useful - // to Sprite class - void setAddrWindow(int32_t xs, int32_t ys, int32_t w, - int32_t h); // Note: start coordinates + width and height - - // Viewport commands, see "Viewport_Demo" sketch - void setViewport(int32_t x, int32_t y, int32_t w, int32_t h, - bool vpDatum = true); - bool checkViewport(int32_t x, int32_t y, int32_t w, int32_t h); - int32_t getViewportX(void); - int32_t getViewportY(void); - int32_t getViewportWidth(void); - int32_t getViewportHeight(void); - bool getViewportDatum(void); - void frameViewport(uint16_t color, int32_t w); - void resetViewport(void); - - // Clip input window to viewport bounds, return false if whole area is out of - // bounds - bool clipAddrWindow(int32_t *x, int32_t *y, int32_t *w, int32_t *h); - // Clip input window area to viewport bounds, return false if whole area is - // out of bounds - bool clipWindow(int32_t *xs, int32_t *ys, int32_t *xe, int32_t *ye); - - // Push (aka write pixel) colours to the TFT (use setAddrWindow() first) - void pushColor(uint16_t color, uint32_t len), // Deprecated, use pushBlock() - pushColors(uint16_t *data, uint32_t len, - bool swap = true), // With byte swap option - pushColors(uint8_t *data, uint32_t len); // Deprecated, use pushPixels() - - // Write a solid block of a single colour - void pushBlock(uint16_t color, uint32_t len); - - // Write a set of pixels stored in memory, use setSwapBytes(true/false) - // function to correct endianess - void pushPixels(const void *data_in, uint32_t len); - -// Support for half duplex (bi-directional SDA) SPI bus where MOSI must be -// switched to input -#ifdef TFT_SDA_READ -#if defined(TFT_eSPI_ENABLE_8_BIT_READ) - uint8_t tft_Read_8(void); // Read 8 bit value from TFT command register -#endif - void begin_SDA_Read(void); // Begin a read on a half duplex (bi-directional - // SDA) SPI bus - sets MOSI to input - void end_SDA_Read(void); // Restore MOSI to output -#endif - - // Graphics drawing - void fillScreen(uint32_t color), - drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), - drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, - uint32_t color), - fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, - uint32_t color); - - void fillRectVGradient(int16_t x, int16_t y, int16_t w, int16_t h, - uint32_t color1, uint32_t color2); - void fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, - uint32_t color1, uint32_t color2); - - // Draw a pixel blended with the pixel colour on the TFT or sprite, return - // blended colour If bg_color is not included the background pixel colour will - // be read from TFT or sprite - uint16_t drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, - uint32_t bg_color = 0x00FFFFFF); - - // Draw a small anti-aliased filled circle at ax,ay with radius r (uses - // drawWideLine) If bg_color is not included the background pixel colour will - // be read from TFT or sprite - void drawSpot(float ax, float ay, float r, uint32_t fg_color, - uint32_t bg_color = 0x00FFFFFF); - - // Draw an anti-aliased filled circle at x, y with radius r - // If bg_color is not included the background pixel colour will be read from - // TFT or sprite - void fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, - uint32_t bg_color = 0x00FFFFFF); - - void fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, - int32_t radius, uint32_t color, - uint32_t bg_color = 0x00FFFFFF); - - // Draw an anti-aliased wide line from ax,ay to bx,by width wd with radiused - // ends (radius is wd/2) If bg_color is not included the background pixel - // colour will be read from TFT or sprite - void drawWideLine(float ax, float ay, float bx, float by, float wd, - uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); - - // Draw an anti-aliased wide line from ax,ay to bx,by with different width at - // each end aw, bw and with radiused ends If bg_color is not included the - // background pixel colour will be read from TFT or sprite - void drawWedgeLine(float ax, float ay, float bx, float by, float aw, float bw, - uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); - - void drawCircle(int32_t x, int32_t y, int32_t r, uint32_t color), - drawCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, - uint32_t color), - fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color), - fillCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, - int32_t delta, uint32_t color), - - drawEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), - fillEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), - - // Corner 1 Corner 2 Corner 3 - drawTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, - int32_t y3, uint32_t color), - fillTriangle(int32_t x1, int32_t y1, int32_t x2, int32_t y2, int32_t x3, - int32_t y3, uint32_t color); - - // Image rendering - // Swap the byte order for pushImage() and pushPixels() - corrects endianness - void setSwapBytes(bool swap); - bool getSwapBytes(void); - - // Draw bitmap - void drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, - int16_t h, uint16_t fgcolor), - drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, - int16_t h, uint16_t fgcolor, uint16_t bgcolor), - drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, - int16_t h, uint16_t fgcolor), - drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, - int16_t h, uint16_t fgcolor, uint16_t bgcolor), - setBitmapColor( - uint16_t fgcolor, - uint16_t bgcolor); // Define the 2 colours for 1bpp sprites - - // Set TFT pivot point (use when rendering rotated sprites) - void setPivot(int16_t x, int16_t y); - int16_t getPivotX(void), // Get pivot x - getPivotY(void); // Get pivot y - - // The next functions can be used as a pair to copy screen blocks (or - // horizontal/vertical lines) to another location Read a block of pixels to a - // data buffer, buffer is 16 bit and the size must be at least w * h - void readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); - // Write a block of pixels to the screen which have been read by readRect() - void pushRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); - - // These are used to render images or sprites stored in RAM arrays (used by - // Sprite class for 16bpp Sprites) - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, - uint16_t transparent); - - // These are used to render images stored in FLASH (PROGMEM) - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, - const uint16_t *data, uint16_t transparent); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, - const uint16_t *data); - - // These are used by Sprite class pushSprite() member function for 1, 4 and 8 - // bits per pixel (bpp) colours They are not intended to be used with user - // sketches (but could be) Set bpp8 true for 8bpp sprites, false otherwise. - // The cmap pointer must be specified for 4bpp - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, - bool bpp8 = true, uint16_t *cmap = nullptr); - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, - uint8_t transparent, bool bpp8 = true, - uint16_t *cmap = nullptr); - // FLASH version - void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, - const uint8_t *data, bool bpp8, uint16_t *cmap = nullptr); - // This next function has been used successfully to dump the TFT screen to a - // PC for documentation purposes It reads a screen area and returns the 3 RGB - // 8 bit colour values of each pixel in the buffer Set w and h to 1 to read 1 - // pixel's colour. The data buffer must be at least w * h * 3 bytes - void readRectRGB(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data); - - // Text rendering - value returned is the pixel width of the rendered text - int16_t drawNumber(long intNumber, int32_t x, int32_t y, - uint8_t font), // Draw integer using specified font number - drawNumber(long intNumber, int32_t x, - int32_t y), // Draw integer using current font - - // Decimal is the number of decimal places to render - // Use with setTextDatum() to position values on TFT, and setTextPadding() - // to blank old displayed values - drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y, - uint8_t font), // Draw float using specified font number - drawFloat(float floatNumber, uint8_t decimal, int32_t x, - int32_t y), // Draw float using current font - - // Handle char arrays - // Use with setTextDatum() to position string on TFT, and setTextPadding() - // to blank old displayed strings - drawString(const char *string, int32_t x, int32_t y, - uint8_t font), // Draw string using specified font number - drawString(const char *string, int32_t x, - int32_t y), // Draw string using current font - drawString(const String &string, int32_t x, int32_t y, - uint8_t font), // Draw string using specified font number - drawString(const String &string, int32_t x, - int32_t y), // Draw string using current font - - drawCentreString( - const char *string, int32_t x, int32_t y, - uint8_t font), // Deprecated, use setTextDatum() and drawString() - drawRightString( - const char *string, int32_t x, int32_t y, - uint8_t font), // Deprecated, use setTextDatum() and drawString() - drawCentreString( - const String &string, int32_t x, int32_t y, - uint8_t font), // Deprecated, use setTextDatum() and drawString() - drawRightString( - const String &string, int32_t x, int32_t y, - uint8_t font); // Deprecated, use setTextDatum() and drawString() - - // Text rendering and font handling support funtions - void setCursor(int16_t x, int16_t y), // Set cursor for tft.print() - setCursor(int16_t x, int16_t y, - uint8_t font); // Set cursor and font number for tft.print() - - int16_t getCursorX( - void), // Read current cursor x position (moves with tft.print()) - getCursorY(void); // Read current cursor y position - - void setTextColor(uint16_t color), // Set character (glyph) color only - // (background not over-written) - setTextColor(uint16_t fgcolor, uint16_t bgcolor, - bool bgfill = false), // Set character (glyph) foreground - // and background colour, optional - // background fill for smooth fonts - setTextSize(uint8_t size); // Set character size multiplier (this - // increases pixel size) - - void setTextWrap(bool wrapX, - bool wrapY = false); // Turn on/off wrapping of text in TFT - // width and/or height - - void setTextDatum(uint8_t datum); // Set text datum position (default is top - // left), see Section 6 above - uint8_t getTextDatum(void); - - void setTextPadding( - uint16_t x_width); // Set text padding (background blanking/over-write) - // width in pixels - uint16_t getTextPadding(void); // Get text padding - -#ifdef LOAD_GFXFF - void setFreeFont(const GFXfont *f = NULL), // Select the GFX Free Font - setTextFont(uint8_t font); // Set the font number to use in future -#else - void setFreeFont( - uint8_t font), // Not used, historical fix to prevent an error - setTextFont(uint8_t font); // Set the font number to use in future -#endif - - int16_t textWidth( - const char *string, - uint8_t font), // Returns pixel width of string in specified font - textWidth( - const char *string), // Returns pixel width of string in current font - textWidth(const String &string, - uint8_t font), // As above for String types - textWidth(const String &string), - fontHeight( - int16_t font), // Returns pixel height of string in specified font - fontHeight(void); // Returns pixel width of string in current font - - // Used by library and Smooth font class to extract Unicode point codes from a - // UTF8 encoded string - uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining), - decodeUTF8(uint8_t c); - - // Support function to UTF8 decode and draw characters piped through print - // stream - size_t write(uint8_t); - // size_t write(const uint8_t *buf, size_t len); - - // Used by Smooth font class to fetch a pixel colour for the anti-aliasing - void setCallback(getColorCallback getCol); - - uint16_t fontsLoaded( - void); // Each bit in returned value represents a font type that is - // loaded - used for debug/error handling only - - // Low level read/write - void spiwrite(uint8_t); // legacy support only -#ifndef RM68120_DRIVER - void writecommand( - uint8_t c); // Send a command, function resets DC/RS high ready for data -#else - void writecommand( - uint16_t c); // Send a command, function resets DC/RS high ready for data - void writeRegister(uint16_t c, - uint8_t d); // Write data to 16 bit command register -#endif - void writedata(uint8_t d); // Send data with DC/RS set high - - void commandList(const uint8_t *addr); // Send a initialisation sequence to - // TFT stored in FLASH - - uint8_t readcommand8(uint8_t cmd_function, - uint8_t index = 0); // read 8 bits from TFT - uint16_t readcommand16(uint8_t cmd_function, - uint8_t index = 0); // read 16 bits from TFT - uint32_t readcommand32(uint8_t cmd_function, - uint8_t index = 0); // read 32 bits from TFT - - // Colour conversion - // Convert 8 bit red, green and blue to 16 bits - uint16_t color565(uint8_t red, uint8_t green, uint8_t blue); - - // Convert 8 bit colour to 16 bits - uint16_t color8to16(uint8_t color332); - // Convert 16 bit colour to 8 bits - uint8_t color16to8(uint16_t color565); - - // Convert 16 bit colour to/from 24 bit, R+G+B concatenated into LS 24 bits - uint32_t color16to24(uint16_t color565); - uint32_t color24to16(uint32_t color888); - - // Alpha blend 2 colours, see generic "alphaBlend_Test" example - // alpha = 0 = 100% background colour - // alpha = 255 = 100% foreground colour - uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc); - // 16 bit colour alphaBlend with alpha dither (dither reduces colour banding) - uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc, - uint8_t dither); - // 24 bit colour alphaBlend with optional alpha dither - uint32_t alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, - uint8_t dither = 0); - - // DMA support functions - these are currently just for SPI writes when using - // the ESP32 or STM32 processors Bear in mind DMA will only be of benefit in - // particular circumstances and can be tricky to manage by noobs. The - // functions have however been designed to be noob friendly and avoid a few - // DMA behaviour "gotchas". - // - // At best you will get a 2x TFT rendering performance improvement when using - // DMA because this library handles the SPI bus so efficiently during normal - // (non DMA) transfers. The best performance improvement scenario is the DMA - // transfer time is exactly the same as the time it takes for the processor to - // prepare the next image buffer and initiate another DMA transfer. - // - // DMA transfer to the TFT is done while the processor moves on to handle - // other tasks. Bear this in mind and watch out for "gotchas" like the image - // buffer going out of scope as the processor leaves a function or its content - // being changed while the DMA engine is reading it. - // - // The compiler MAY change the implied scope of a buffer which has been set - // aside by creating an array. For example a buffer defined before a - // "for-next" loop may get de-allocated when the loop ends. To avoid this use, - // for example, malloc() and free() to take control of when the buffer space - // is available and ensure it is not released until DMA is complete. - // - // Clearly you should not modify a buffer that is being DMA'ed to the TFT - // until the DMA is over. Use the dmaBusy() function to check this. Use - // tft.startWrite() before invoking DMA so the TFT chip select stays low. If - // you use tft.endWrite() before DMA is complete then the endWrite function - // will wait for the DMA to complete, so this may defeat any DMA performance - // benefit. - // - - bool initDMA( - bool ctrl_cs = - false); // Initialise the DMA engine and attach to SPI bus - - // typically used in setup() Parameter "true" enables DMA - // engine control of TFT chip select (ESP32 only) For ESP32 - // only, TFT reads will not work if parameter is true - void deInitDMA(void); // De-initialise the DMA engine and detach from SPI bus - // - typically not used - - // Push an image to the TFT using DMA, buffer is optional and grabs (double - // buffers) a copy of the image Use the buffer if the image data will get - // over-written or destroyed while DMA is in progress If swapping colour bytes - // is defined, and the double buffer option is NOT used, then the bytes in the - // original data image will be swapped by the function before DMA is - // initiated. The function will wait for the last DMA to complete if it is - // called while a previous DMA is still in progress, this simplifies the - // sketch and helps avoid "gotchas". - void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, - uint16_t *buffer = nullptr); - -#if defined(ESP32) // ESP32 only at the moment - // For case where pointer is a const and the image data must not be modified - // (clipped or byte swapped) - void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, - uint16_t const *data); -#endif - // Push a block of pixels into a window set up using setAddrWindow() - void pushPixelsDMA(uint16_t *image, uint32_t len); - - // Check if the DMA is complete - use while(tft.dmaBusy); for a blocking wait - bool dmaBusy(void); // returns true if DMA is still in progress - void dmaWait(void); // wait until DMA is complete - - bool DMA_Enabled = false; // Flag for DMA enabled state - uint8_t spiBusyCheck = 0; // Number of ESP32 transfer buffers to check - - // Bare metal functions - void startWrite(void); // Begin SPI transaction - void writeColor(uint16_t color, uint32_t len); // Deprecated, use pushBlock() - void endWrite(void); // End SPI transaction - - // Set/get an arbitrary library configuration attribute or option - // Use to switch ON/OFF capabilities such as UTF8 decoding - each - // attribute has a unique ID id = 0: reserved - may be used in future to - // reset all attributes to a default state id = 1: Turn on (a=true) or - // off (a=false) GLCD cp437 font character error correction id = 2: Turn - // on (a=true) or off (a=false) UTF8 decoding id = 3: Enable or disable - // use of ESP32 PSRAM (if available) -#define CP437_SWITCH 1 -#define UTF8_SWITCH 2 -#define PSRAM_ENABLE 3 - void setAttribute(uint8_t id = 0, uint8_t a = 0); // Set attribute value - uint8_t getAttribute(uint8_t id = 0); // Get attribute value - - // Used for diagnostic sketch to see library setup adopted by compiler, see - // Section 7 above - void getSetup( - setup_t &tft_settings); // Sketch provides the instance to populate - bool verifySetupID(uint32_t id); - - // Global variables - static SPIClass &getSPIinstance(void); // Get SPI class handle - - uint32_t textcolor, textbgcolor; // Text foreground and background colours - - uint32_t bitmap_fg, - bitmap_bg; // Bitmap foreground (bit=1) and background (bit=0) colours - - uint8_t textfont, // Current selected font number - textsize, // Current font size multiplier - textdatum, // Text reference datum - rotation; // Display rotation (0-3) - - uint8_t decoderState = 0; // UTF8 decoder state - not for user access - uint16_t decoderBuffer; // Unicode code-point buffer - not for user access - - //--------------------------------------- private - //------------------------------------// - private: - // Legacy begin and end prototypes - deprecated TODO: delete - void spi_begin(); - void spi_end(); - - void spi_begin_read(); - void spi_end_read(); - - // New begin and end prototypes - // begin/end a TFT write transaction - // For SPI bus the transmit clock rate is set - inline void begin_tft_write() __attribute__((always_inline)); - inline void end_tft_write() __attribute__((always_inline)); - - // begin/end a TFT read transaction - // For SPI bus: begin lowers SPI clock rate, end reinstates transmit clock - // rate - inline void begin_tft_read() __attribute__((always_inline)); - inline void end_tft_read() __attribute__((always_inline)); - - // Initialise the data bus GPIO and hardware interfaces - void initBus(void); - - // Temporary library development function TODO: remove need for this - void pushSwapBytePixels(const void *data_in, uint32_t len); - - // Same as setAddrWindow but exits with CGRAM in read mode - void readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); - - // Byte read prototype - uint8_t readByte(void); - - // GPIO parallel bus input/output direction control - void busDir(uint32_t mask, uint8_t mode); - - // Single GPIO input/output direction control - void gpioMode(uint8_t gpio, uint8_t mode); - - // Helper function: calculate distance of a point from a finite length line - // between two points - float wedgeLineDistance(float pax, float pay, float bax, float bay, float dr); - - // Display variant settings - uint8_t tabcolor, // ST7735 screen protector "tab" colour (now invalid) - colstart = 0, - rowstart = 0; // Screen display area to CGRAM area coordinate offsets - - // Port and pin masks for control signals (ESP826 only) - TODO: remove need - // for this - volatile uint32_t *dcport, *csport; - uint32_t cspinmask, dcpinmask, wrpinmask, sclkpinmask; - -#if defined(ESP32_PARALLEL) - // Bit masks for ESP32 parallel bus interface - uint32_t xclr_mask, xdir_mask; // Port set/clear and direction control masks - - // Lookup table for ESP32 parallel bus interface uses 1kbyte RAM, - uint32_t xset_mask[256]; // Makes Sprite rendering test 33% faster, for - // slower macro equivalent see commented out #define - // set_mask(C) within TFT_eSPI_ESP32.h -#endif - - // uint32_t lastColor = 0xFFFF; // Last colour - used to minimise bit shifting - // overhead - - getColorCallback getColor = nullptr; // Smooth font callback function pointer - - bool locked, inTransaction, - lockTransaction; // SPI transaction and mutex lock flags - - //-------------------------------------- protected - //----------------------------------// - protected: - // int32_t win_xe, win_ye; // Window end coords - not needed - - int32_t _init_width, - _init_height; // Display w/h as input, used by setRotation() - int32_t _width, _height; // Display w/h as modified by current rotation - int32_t addr_row, - addr_col; // Window position - used to minimise window commands - - int16_t _xPivot; // TFT x pivot point coordinate for rotated Sprites - int16_t _yPivot; // TFT x pivot point coordinate for rotated Sprites - - // Viewport variables - int32_t _vpX, _vpY, _vpW, - _vpH; // Note: x start, y start, x end + 1, y end + 1 - int32_t _xDatum; - int32_t _yDatum; - int32_t _xWidth; - int32_t _yHeight; - bool _vpDatum; - bool _vpOoB; - - int32_t cursor_x, cursor_y, padX; // Text cursor x,y and padding setting - int32_t bg_cursor_x; // Background fill cursor - int32_t last_cursor_x; // Previous text cursor position when fill used - - uint32_t fontsloaded; // Bit field of fonts loaded - - uint8_t glyph_ab, // Smooth font glyph delta Y (height) above baseline - glyph_bb; // Smooth font glyph delta Y (height) below baseline - - bool isDigits; // adjust bounding box for numbers to reduce visual jiggling - bool textwrapX, textwrapY; // If set, 'wrap' text at right and optionally - // bottom edge of display - bool _swapBytes; // Swap the byte order for TFT pushImage() - - bool _booted; // init() or begin() has already run once - - // User sketch manages these via set/getAttribute() - bool _cp437; // If set, use correct CP437 charset (default is ON) - bool _utf8; // If set, use UTF-8 decoder in print stream 'write()' function - // (default ON) - bool _psram_enable; // Enable PSRAM use for library functions (TBD) and - // Sprites - - uint32_t _lastColor; // Buffered value of last colour used - - bool _fillbg; // Fill background flag (just for for smooth fonts at the - // moment) - -#if defined(SSD1963_DRIVER) - uint16_t Cswap; // Swap buffer for SSD1963 - uint8_t r6, g6, b6; // RGB buffer for SSD1963 -#endif - -#ifdef LOAD_GFXFF - GFXfont *gfxFont; -#endif - -/*************************************************************************************** -** Section 9: TFT_eSPI class conditional extensions -***************************************************************************************/ -// Load the Touch extension -#ifdef TOUCH_CS -#if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) -#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) -#error >>>>------>> Touch functions not supported in 8/16 bit parallel mode or with RP2040 PIO. -#endif -#else -#include "Extensions/Touch.h" // Loaded if TOUCH_CS is defined by user -#endif -#else -#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - // #warning >>>>------>> TOUCH_CS pin not defined, TFT_eSPI - // touch functions will not be available! -#endif -#endif - -// Load the Anti-aliased font extension -#ifdef SMOOTH_FONT -#include "Extensions/Smooth_font.h" // Loaded if SMOOTH_FONT is defined by user -#endif - -}; // End of class TFT_eSPI - -/*************************************************************************************** -** Section 10: Additional extension classes -***************************************************************************************/ -// Load the Button Class -#include "Extensions/Button.h" - -// Load the Sprite Class -#include "Extensions/Sprite.h" - -#endif // ends #ifndef _TFT_eSPIH_ diff --git a/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.vlw b/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.vlw deleted file mode 100644 index 2872fd55..00000000 Binary files a/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.vlw and /dev/null differ diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup17_ePaper.h b/libraries/TFT_eSPI-2.4.72/User_Setups/Setup17_ePaper.h deleted file mode 100644 index c86b08a0..00000000 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup17_ePaper.h +++ /dev/null @@ -1,41 +0,0 @@ -// See SetupX_Template.h for all options available -#define USER_SETUP_ID 17 - -#define EPD_DRIVER // ePaper driver - - -// READ THIS READ THIS READ THIS READ THIS READ THIS READ THIS -// Install the ePaper library for your own display size and type -// from here: -// https://github.com/Bodmer/EPD_Libraries - -// Note: Pin allocations for the ePaper signals are defined in -// the ePaper library's epdif.h file. There follows the default -// pins already included in epdif.h file for the ESP8266: - -/////////////////////////////////////////////////////////////////// -// For ESP8266 connect as follows: // -// Display 3.3V to NodeMCU 3V3 // -// Display GND to NodeMCU GND // -// // -// Display GPIO NodeMCU pin // -// BUSY 5 D1 // -// RESET 4 D2 // -// DC 0 D3 // -// CS 2 D4 // -// CLK 14 D5 // -// D6 (MISO not connected to display) // -// DIN 13 D7 // -// // -/////////////////////////////////////////////////////////////////// - - -#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH -#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters -#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters -#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm -#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. -#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. -#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts - -#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI-2.4.72/.gitattributes b/libraries/TFT_eSPI-2.5.43/.gitattributes similarity index 100% rename from libraries/TFT_eSPI-2.4.72/.gitattributes rename to libraries/TFT_eSPI-2.5.43/.gitattributes diff --git a/libraries/TFT_eSPI-2.4.72/.github/ISSUE_TEMPLATE/issue-template.md b/libraries/TFT_eSPI-2.5.43/.github/ISSUE_TEMPLATE/issue-template.md similarity index 67% rename from libraries/TFT_eSPI-2.4.72/.github/ISSUE_TEMPLATE/issue-template.md rename to libraries/TFT_eSPI-2.5.43/.github/ISSUE_TEMPLATE/issue-template.md index 90b1e064..9855d3ff 100644 --- a/libraries/TFT_eSPI-2.4.72/.github/ISSUE_TEMPLATE/issue-template.md +++ b/libraries/TFT_eSPI-2.5.43/.github/ISSUE_TEMPLATE/issue-template.md @@ -7,6 +7,8 @@ assignees: '' --- +Only raise issues for problems with the library and/or provided examples. Post questions, comments and useful tips etc in the "Discussions" section. + To minimise effort to resolve issues the following should be provided as a minimum: 1. A description of the problem and the conditions that cause it to occur 2. IDE (e.g. Arduino or PlatformIO) @@ -22,9 +24,11 @@ Plus further information as appropriate to the problem: 3. A zip file containing a simple and complete example sketch that demonstrates the problem but needs no special hardware sensors or libraries. 4. Screen shot pictures showing the problem (just drag and drop in message window) -The idea is to provide sufficient information so I can setup the exact same (or sufficiently similar) scenario to investigate and resolve the issue. +The idea is to provide sufficient information so I can setup the exact same (or sufficiently similar) scenario to investigate and resolve the issue without having a tedious ping-pong of Q&A. -Put three ticks ( ` character on key next to "1" key) at the start and end of short pasted code segments to avoid format/markup anomolies and to use a monspaced font. Example: +DO NOT paste code directly into the issue. To correctly format code put three ticks ( ` character on key next to "1" key) at the start and end of short pasted code segments to avoid format/markup anomolies. [See here:](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#quoting-code) + +Example output: ``` Serial.begin(115200); diff --git a/libraries/TFT_eSPI-2.4.72/.gitignore b/libraries/TFT_eSPI-2.5.43/.gitignore similarity index 92% rename from libraries/TFT_eSPI-2.4.72/.gitignore rename to libraries/TFT_eSPI-2.5.43/.gitignore index cd2946ad..55bda4cb 100644 --- a/libraries/TFT_eSPI-2.4.72/.gitignore +++ b/libraries/TFT_eSPI-2.5.43/.gitignore @@ -17,6 +17,11 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk +# Arduino debug +debug.cfg +debug_custom.json +*.svd + # ========================= # Operating System Files # ========================= diff --git a/libraries/TFT_eSPI-2.4.72/CMakeLists.txt b/libraries/TFT_eSPI-2.5.43/CMakeLists.txt similarity index 100% rename from libraries/TFT_eSPI-2.4.72/CMakeLists.txt rename to libraries/TFT_eSPI-2.5.43/CMakeLists.txt diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Button.cpp b/libraries/TFT_eSPI-2.5.43/Extensions/Button.cpp similarity index 98% rename from libraries/TFT_eSPI-2.4.72/Extensions/Button.cpp rename to libraries/TFT_eSPI-2.5.43/Extensions/Button.cpp index 475c631f..9c93098f 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Button.cpp +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Button.cpp @@ -8,6 +8,8 @@ TFT_eSPI_Button::TFT_eSPI_Button(void) { _yd = 0; _textdatum = MC_DATUM; _label[9] = '\0'; + currstate = false; + laststate = false; } // Classic initButton() function: pass center & size diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Button.h b/libraries/TFT_eSPI-2.5.43/Extensions/Button.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Extensions/Button.h rename to libraries/TFT_eSPI-2.5.43/Extensions/Button.h index 7e0c5097..3a0e2d56 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Button.h +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Button.h @@ -6,8 +6,8 @@ // within button ***************************************************************************************/ -class TFT_eSPI_Button : public TFT_eSPI { - +class TFT_eSPI_Button +{ public: TFT_eSPI_Button(void); // "Classic" initButton() uses centre & size diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Smooth_font.cpp b/libraries/TFT_eSPI-2.5.43/Extensions/Smooth_font.cpp similarity index 96% rename from libraries/TFT_eSPI-2.4.72/Extensions/Smooth_font.cpp rename to libraries/TFT_eSPI-2.5.43/Extensions/Smooth_font.cpp index d1915a48..c67204ac 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Smooth_font.cpp +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Smooth_font.cpp @@ -48,7 +48,7 @@ void TFT_eSPI::loadFont(String fontName, bool flash) 6. Descent in pixels from baseline to bottom of "p" Next are gCount sets of values for each glyph, each set comprises 7 int32t parameters (28 bytes): - 1. Glyph Unicode stored as a 32 bit value + 1. Glyph Unicode stored as a 32-bit value 2. Height of bitmap bounding box 3. Width of bitmap bounding box 4. gxAdvance for cursor (setWidth in Processing) @@ -57,7 +57,7 @@ void TFT_eSPI::loadFont(String fontName, bool flash) 7. padding value, typically 0 The bitmaps start next at 24 + (28 * gCount) bytes from the start of the file. - Each pixel is 1 byte, an 8 bit Alpha value which represents the transparency from + Each pixel is 1 byte, an 8-bit Alpha value which represents the transparency from 0xFF foreground colour, 0x00 background. The library uses a linear interpolation between the foreground and background RGB component colours. e.g. pixelRed = ((fgRed * alpha) + (bgRed * (255 - alpha))/255 @@ -158,7 +158,7 @@ void TFT_eSPI::loadMetrics(void) #if defined (ESP32) && defined (CONFIG_SPIRAM_SUPPORT) if ( psramFound() ) { - gUnicode = (uint16_t*)ps_malloc( gFont.gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF) + gUnicode = (uint16_t*)ps_malloc( gFont.gCount * 2); // Unicode 16-bit Basic Multilingual Plane (0-FFFF) gHeight = (uint8_t*)ps_malloc( gFont.gCount ); // Height of glyph gWidth = (uint8_t*)ps_malloc( gFont.gCount ); // Width of glyph gxAdvance = (uint8_t*)ps_malloc( gFont.gCount ); // xAdvance - to move x cursor @@ -169,7 +169,7 @@ void TFT_eSPI::loadMetrics(void) else #endif { - gUnicode = (uint16_t*)malloc( gFont.gCount * 2); // Unicode 16 bit Basic Multilingual Plane (0-FFFF) + gUnicode = (uint16_t*)malloc( gFont.gCount * 2); // Unicode 16-bit Basic Multilingual Plane (0-FFFF) gHeight = (uint8_t*)malloc( gFont.gCount ); // Height of glyph gWidth = (uint8_t*)malloc( gFont.gCount ); // Width of glyph gxAdvance = (uint8_t*)malloc( gFont.gCount ); // xAdvance - to move x cursor @@ -308,7 +308,7 @@ void TFT_eSPI::unloadFont( void ) /*************************************************************************************** ** Function name: readInt32 -** Description: Get a 32 bit integer from the font file +** Description: Get a 32-bit integer from the font file *************************************************************************************x*/ uint32_t TFT_eSPI::readInt32(void) { @@ -316,18 +316,18 @@ uint32_t TFT_eSPI::readInt32(void) #ifdef FONT_FS_AVAILABLE if (fs_font) { - val = fontFile.read() << 24; - val |= fontFile.read() << 16; - val |= fontFile.read() << 8; - val |= fontFile.read(); + val = (uint32_t)fontFile.read() << 24; + val |= (uint32_t)fontFile.read() << 16; + val |= (uint32_t)fontFile.read() << 8; + val |= (uint32_t)fontFile.read(); } else #endif { - val = pgm_read_byte(fontPtr++) << 24; - val |= pgm_read_byte(fontPtr++) << 16; - val |= pgm_read_byte(fontPtr++) << 8; - val |= pgm_read_byte(fontPtr++); + val = (uint32_t)pgm_read_byte(fontPtr++) << 24; + val |= (uint32_t)pgm_read_byte(fontPtr++) << 16; + val |= (uint32_t)pgm_read_byte(fontPtr++) << 8; + val |= (uint32_t)pgm_read_byte(fontPtr++); } return val; diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Smooth_font.h b/libraries/TFT_eSPI-2.5.43/Extensions/Smooth_font.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Extensions/Smooth_font.h rename to libraries/TFT_eSPI-2.5.43/Extensions/Smooth_font.h diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Sprite.cpp b/libraries/TFT_eSPI-2.5.43/Extensions/Sprite.cpp similarity index 98% rename from libraries/TFT_eSPI-2.4.72/Extensions/Sprite.cpp rename to libraries/TFT_eSPI-2.5.43/Extensions/Sprite.cpp index baaa0578..af841cc1 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Sprite.cpp +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Sprite.cpp @@ -47,7 +47,7 @@ TFT_eSprite::TFT_eSprite(TFT_eSPI *tft) ** Function name: createSprite ** Description: Create a sprite (bitmap) of defined width and height ***************************************************************************************/ -// cast returned value to (uint8_t*) for 8 bit or (uint16_t*) for 16 bit colours +// cast returned value to (uint8_t*) for 8-bit or (uint16_t*) for 16-bit colours void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) { @@ -88,8 +88,6 @@ void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) _img8_2 = _img8 + (w * h + 1); } - if ( (_bpp == 4) && (_colorMap == nullptr)) createPalette(default_4bit_palette); - // This is to make it clear what pointer size is expected to be used // but casting in the user sketch is needed due to the use of void* if ( (_bpp == 1) && (frames > 1) ) @@ -101,6 +99,8 @@ void* TFT_eSprite::createSprite(int16_t w, int16_t h, uint8_t frames) if (_img8) { _created = true; + if ( (_bpp == 4) && (_colorMap == nullptr)) createPalette(default_4bit_palette); + rotation = 0; setViewport(0, 0, _dwidth, _dheight); setPivot(_iwidth/2, _iheight/2); @@ -223,10 +223,7 @@ void* TFT_eSprite::callocSprite(int16_t w, int16_t h, uint8_t frames) ***************************************************************************************/ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) { - if (_colorMap != nullptr) - { - free(_colorMap); - } + if (!_created) return; if (colorMap == nullptr) { @@ -236,7 +233,7 @@ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) } // Allocate and clear memory for 16 color map - _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); if (colors > 16) colors = 16; @@ -254,6 +251,8 @@ void TFT_eSprite::createPalette(uint16_t colorMap[], uint8_t colors) ***************************************************************************************/ void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) { + if (!_created) return; + if (colorMap == nullptr) { // Create a color map using the default FLASH map @@ -261,7 +260,7 @@ void TFT_eSprite::createPalette(const uint16_t colorMap[], uint8_t colors) } // Allocate and clear memory for 16 color map - _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); + if (_colorMap == nullptr) _colorMap = (uint16_t *)calloc(16, sizeof(uint16_t)); if (colors > 16) colors = 16; @@ -310,13 +309,9 @@ void* TFT_eSprite::setColorDepth(int8_t b) else if ( b > 1 ) _bpp = 4; else _bpp = 1; - // Can't change an existing sprite's colour depth so delete it - if (_created) free(_img8_1); - - // If it existed, re-create the sprite with the new colour depth - if (_created) - { - _created = false; + // Can't change an existing sprite's colour depth so delete and create a new one + if (_created) { + deleteSprite(); return createSprite(_dwidth, _dheight); } @@ -380,7 +375,7 @@ void TFT_eSprite::deleteSprite(void) if (_colorMap != nullptr) { free(_colorMap); - _colorMap = nullptr; + _colorMap = nullptr; } if (_created) @@ -781,7 +776,7 @@ bool TFT_eSprite::pushToSprite(TFT_eSprite *dspr, int32_t x, int32_t y, uint16_t if (transp == rp) { if (pixel_count) { - dspr->pushImage(ox, y, pixel_count, 1, sline_buffer, _bpp); + dspr->pushImage(ox, y, pixel_count, 1, sline_buffer); ox += pixel_count; pixel_count = 0; } @@ -1109,7 +1104,7 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_ } else if (_bpp == 4) { - // The image is assumed to be 4 bit, where each byte corresponds to two pixels. + // The image is assumed to be 4-bit, where each byte corresponds to two pixels. // much faster when aligned to a byte boundary, because the alternative is slower, requiring // tedious bit operations. @@ -1257,8 +1252,8 @@ void TFT_eSprite::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const u // Intentionally not constrained to viewport area, does not manage 1bpp rotations void TFT_eSprite::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) { - if (x0 > x1) swap_coord(x0, x1); - if (y0 > y1) swap_coord(y0, y1); + if (x0 > x1) transpose(x0, x1); + if (y0 > y1) transpose(y0, y1); int32_t w = width(); int32_t h = height(); @@ -1360,10 +1355,10 @@ void TFT_eSprite::writeColor(uint16_t color) { if (!_created ) return; - // Write 16 bit RGB 565 encoded colour to RAM + // Write 16-bit RGB 565 encoded colour to RAM if (_bpp == 16) _img [_xptr + _yptr * _iwidth] = color; - // Write 8 bit RGB 332 encoded colour to RAM + // Write 8-bit RGB 332 encoded colour to RAM else if (_bpp == 8) _img8[_xptr + _yptr * _iwidth] = (uint8_t) color; else if (_bpp == 4) @@ -1700,13 +1695,13 @@ void TFT_eSprite::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint3 bool steep = abs(y1 - y0) > abs(x1 - x0); if (steep) { - swap_coord(x0, y0); - swap_coord(x1, y1); + transpose(x0, y0); + transpose(x1, y1); } if (x0 > x1) { - swap_coord(x0, x1); - swap_coord(y0, y1); + transpose(x0, x1); + transpose(y0, y1); } int32_t dx = x1 - x0, dy = abs(y1 - y0);; @@ -1990,10 +1985,6 @@ void TFT_eSprite::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uin { if ( _vpOoB || !_created ) return; - if ((x >= _vpW - _xDatum) || // Clip right - (y >= _vpH - _yDatum)) // Clip bottom - return; - if (c < 32) return; #ifdef LOAD_GLCD //>>>>>>>>>>>>>>>>>> @@ -2002,10 +1993,17 @@ void TFT_eSprite::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uin #endif //>>>>>>>>>>>>>>>>>> + if ((x >= _vpW - _xDatum) || // Clip right + (y >= _vpH - _yDatum)) // Clip bottom + return; + if (((x + 6 * size - 1) < (_vpX - _xDatum)) || // Clip left ((y + 8 * size - 1) < (_vpY - _yDatum))) // Clip top return; + if (c > 255) return; + if (!_cp437 && c > 175) c++; + bool fillbg = (bg != color); if ((size==1) && fillbg) @@ -2140,7 +2138,7 @@ void TFT_eSprite::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uin /*************************************************************************************** ** Function name: drawChar -** Description: draw a unicode glyph into the sprite +** Description: draw a Unicode glyph into the sprite ***************************************************************************************/ // TODO: Rationalise with TFT_eSPI // Any UTF-8 decoding must be done before calling drawChar() @@ -2292,7 +2290,7 @@ int16_t TFT_eSprite::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t fo uint8_t tnp = 0; // Temporary copy of np for while loop uint8_t ts = textsize - 1; // Temporary copy of textsize - // 16 bit pixel count so maximum font size is equivalent to 180x180 pixels in area + // 16-bit pixel count so maximum font size is equivalent to 180x180 pixels in area // w is total number of pixels to plot to fill character block while (pc < w) { line = pgm_read_byte((uint8_t *)flash_address); @@ -2417,6 +2415,8 @@ void TFT_eSprite::drawGlyph(uint16_t code) { uint16_t fg = textcolor; uint16_t bg = textbgcolor; + bool getBG = false; + if (fg == bg) getBG = true; // Check if cursor has moved if (last_cursor_x != cursor_x) @@ -2551,7 +2551,7 @@ void TFT_eSprite::drawGlyph(uint16_t code) else drawFastHLine( fxs, y + cy, fl, fg); fl = 0; } - if (getColor) bg = getColor(x + cx, y + cy); + if (getBG) bg = readPixel(x + cx, y + cy); drawPixel(x + cx, y + cy, alphaBlend(pixel, fg, bg)); } else diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Sprite.h b/libraries/TFT_eSPI-2.5.43/Extensions/Sprite.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/Extensions/Sprite.h rename to libraries/TFT_eSPI-2.5.43/Extensions/Sprite.h index 5f3e59ef..67e29de7 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Sprite.h +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Sprite.h @@ -13,12 +13,12 @@ class TFT_eSprite : public TFT_eSPI { ~TFT_eSprite(void); // Create a sprite of width x height pixels, return a pointer to the RAM area - // Sketch can cast returned value to (uint16_t*) for 16 bit depth if needed + // Sketch can cast returned value to (uint16_t*) for 16-bit depth if needed // RAM required is: // - 1 bit per pixel for 1 bit colour depth - // - 1 nibble per pixel for 4 bit colour (with palette table) - // - 1 byte per pixel for 8 bit colour (332 RGB format) - // - 2 bytes per pixel for 16 bit color depth (565 RGB format) + // - 1 nibble per pixel for 4-bit colour (with palette table) + // - 1 byte per pixel for 8-bit colour (332 RGB format) + // - 2 bytes per pixel for 16-bit color depth (565 RGB format) void* createSprite(int16_t width, int16_t height, uint8_t frames = 1); // Returns a pointer to the sprite or nullptr if not created, user must cast to pointer type @@ -39,7 +39,7 @@ class TFT_eSprite : public TFT_eSPI { void* setColorDepth(int8_t b); int8_t getColorDepth(void); - // Set the palette for a 4 bit depth sprite. Only the first 16 colours in the map are used. + // Set the palette for a 4-bit depth sprite. Only the first 16 colours in the map are used. void createPalette(uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in RAM void createPalette(const uint16_t *palette = nullptr, uint8_t colors = 16); // Palette in FLASH @@ -61,14 +61,14 @@ class TFT_eSprite : public TFT_eSPI { // Fill Sprite with a colour fillSprite(uint32_t color), - // Define a window to push 16 bit colour pixels into in a raster order + // Define a window to push 16-bit colour pixels into in a raster order // Colours are converted to the set Sprite colour bit depth setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1), // Push a color (aka singe pixel) to the sprite's set window area pushColor(uint16_t color), // Push len colors (pixels) to the sprite's set window area pushColor(uint16_t color, uint32_t len), - // Push a pixel pre-formatted as a 1, 4, 8 or 16 bit colour (avoids conversion overhead) + // Push a pixel pre-formatted as a 1, 4, 8 or 16-bit colour (avoids conversion overhead) writeColor(uint16_t color), // Set the scroll zone, top left corner at x,y with defined width and height @@ -139,7 +139,7 @@ class TFT_eSprite : public TFT_eSPI { height(void); // Functions associated with anti-aliased fonts - // Draw a single unicode character using the loaded font + // Draw a single Unicode character using the loaded font void drawGlyph(uint16_t code); // Print string to sprite using loaded font at cursor position void printToSprite(String string); @@ -162,13 +162,13 @@ class TFT_eSprite : public TFT_eSPI { protected: uint8_t _bpp; // bits per pixel (1, 4, 8 or 16) - uint16_t *_img; // pointer to 16 bit sprite - uint8_t *_img8; // pointer to 1 and 8 bit sprite frame 1 or frame 2 - uint8_t *_img4; // pointer to 4 bit sprite (uses color map) + uint16_t *_img; // pointer to 16-bit sprite + uint8_t *_img8; // pointer to 1 and 8-bit sprite frame 1 or frame 2 + uint8_t *_img4; // pointer to 4-bit sprite (uses color map) uint8_t *_img8_1; // pointer to frame 1 uint8_t *_img8_2; // pointer to frame 2 - uint16_t *_colorMap; // color map pointer: 16 entries, used with 4 bit color map. + uint16_t *_colorMap; // color map pointer: 16 entries, used with 4-bit color map. int32_t _sinra; // Sine of rotation angle in fixed point int32_t _cosra; // Cosine of rotation angle in fixed point diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Touch.cpp b/libraries/TFT_eSPI-2.5.43/Extensions/Touch.cpp similarity index 98% rename from libraries/TFT_eSPI-2.4.72/Extensions/Touch.cpp rename to libraries/TFT_eSPI-2.5.43/Extensions/Touch.cpp index 3b20a83d..3d3ed825 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Touch.cpp +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Touch.cpp @@ -10,6 +10,11 @@ // See license in root directory. +// Define a default pressure threshold +#ifndef Z_THRESHOLD + #define Z_THRESHOLD 350 // Touch pressure threshold for validating touches +#endif + /*************************************************************************************** ** Function name: begin_touch_read_write - was spi_begin_touch ** Description: Start transaction and select touch controller @@ -107,6 +112,8 @@ uint16_t TFT_eSPI::getTouchRawZ(void){ end_touch_read_write(); + if (tz == 4095) tz = 0; + return (uint16_t)tz; } @@ -159,7 +166,6 @@ uint8_t TFT_eSPI::validTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ ** Function name: getTouch ** Description: read callibrated position. Return false if not pressed. ***************************************************************************************/ -#define Z_THRESHOLD 350 // Touch pressure threshold for validating touches uint8_t TFT_eSPI::getTouch(uint16_t *x, uint16_t *y, uint16_t threshold){ uint16_t x_tmp, y_tmp; diff --git a/libraries/TFT_eSPI-2.4.72/Extensions/Touch.h b/libraries/TFT_eSPI-2.5.43/Extensions/Touch.h similarity index 85% rename from libraries/TFT_eSPI-2.4.72/Extensions/Touch.h rename to libraries/TFT_eSPI-2.5.43/Extensions/Touch.h index d6916972..9bb81fc8 100644 --- a/libraries/TFT_eSPI-2.4.72/Extensions/Touch.h +++ b/libraries/TFT_eSPI-2.5.43/Extensions/Touch.h @@ -11,7 +11,10 @@ // Get the screen touch coordinates, returns true if screen has been touched // if the touch coordinates are off screen then x and y are not updated // The returned value can be treated as a bool type, false or 0 means touch not detected - // In future the function may return an 8 "quality" (jitter) value. + // In future the function may return an 8-bit "quality" (jitter) value. + // The threshold value is optional, this must be higher than the bias level for z (pressure) + // reported by Test_Touch_Controller when the screen is NOT touched. When touched the z value + // must be higher than the threshold for a touch to be detected. uint8_t getTouch(uint16_t *x, uint16_t *y, uint16_t threshold = 600); // Run screen calibration and test, report calibration values to the serial port diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Custom/Orbitron_Light_24.h b/libraries/TFT_eSPI-2.5.43/Fonts/Custom/Orbitron_Light_24.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Custom/Orbitron_Light_24.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Custom/Orbitron_Light_24.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Custom/Orbitron_Light_32.h b/libraries/TFT_eSPI-2.5.43/Fonts/Custom/Orbitron_Light_32.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Custom/Orbitron_Light_32.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Custom/Orbitron_Light_32.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Custom/Roboto_Thin_24.h b/libraries/TFT_eSPI-2.5.43/Fonts/Custom/Roboto_Thin_24.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Custom/Roboto_Thin_24.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Custom/Roboto_Thin_24.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Custom/Satisfy_24.h b/libraries/TFT_eSPI-2.5.43/Fonts/Custom/Satisfy_24.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Custom/Satisfy_24.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Custom/Satisfy_24.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Custom/Yellowtail_32.h b/libraries/TFT_eSPI-2.5.43/Fonts/Custom/Yellowtail_32.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Custom/Yellowtail_32.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Custom/Yellowtail_32.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font16.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font16.c similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font16.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font16.c diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font16.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font16.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font16.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font16.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font32rle.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font32rle.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font32rle.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font32rle.c index f163986c..7a8119b0 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/Font32rle.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/Font32rle.c @@ -1,6 +1,6 @@ // Font 4 // -// This font has been 8 bit Run Length Encoded to save FLASH space +// This font has been 8-bit Run Length Encoded to save FLASH space // // This font contains 96 ASCII characters diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font32rle.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font32rle.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font32rle.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font32rle.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font64rle.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font64rle.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font64rle.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font64rle.c index 9d1415b0..a80e6ea7 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/Font64rle.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/Font64rle.c @@ -1,6 +1,6 @@ // Font 6 is intended to display numbers and time // -// This font has been 8 bit Run Length Encoded to save FLASH space +// This font has been 8-bit Run Length Encoded to save FLASH space // // This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : - . a p m // The Pipe character | is a narrow space to aid formatting diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font64rle.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font64rle.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font64rle.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font64rle.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font72rle.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font72rle.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font72rle.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font72rle.c index 7f5da5df..478411aa 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/Font72rle.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/Font72rle.c @@ -1,6 +1,6 @@ // Font 8 // -// This font has been 8 bit Run Length Encoded to save FLASH space +// This font has been 8-bit Run Length Encoded to save FLASH space // // It is a Arial 75 pixel height font intended to display large numbers // This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 0 : - . diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font72rle.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font72rle.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font72rle.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font72rle.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font72x53rle.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font72x53rle.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font72x53rle.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font72x53rle.c index 71c2c4f6..ae8d00cb 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/Font72x53rle.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/Font72x53rle.c @@ -1,6 +1,6 @@ // Font 8 // -// This font has been 8 bit Run Length Encoded to save FLASH space +// This font has been 8-bit Run Length Encoded to save FLASH space // // It is a Arial 75 pixel height font intended to display large numbers // Width for numerals reduced from 55 to 53 (to fit in 160 pixel screens) diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font72x53rle.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font72x53rle.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font72x53rle.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font72x53rle.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font7srle.c b/libraries/TFT_eSPI-2.5.43/Fonts/Font7srle.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font7srle.c rename to libraries/TFT_eSPI-2.5.43/Fonts/Font7srle.c index 7c6f929b..7d54a6fa 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/Font7srle.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/Font7srle.c @@ -1,6 +1,6 @@ // Font 7 // -// This font has been 8 bit Run Length Encoded to save FLASH space +// This font has been 8-bit Run Length Encoded to save FLASH space // // This is a 7 segment font intended to display numbers and time // This font only contains characters [space] 0 1 2 3 4 5 6 7 8 9 : . - diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/Font7srle.h b/libraries/TFT_eSPI-2.5.43/Fonts/Font7srle.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/Font7srle.h rename to libraries/TFT_eSPI-2.5.43/Fonts/Font7srle.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMono9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMono9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBold9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBold9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoBoldOblique9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeMonoOblique9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeMonoOblique9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSans9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSans9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBold9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBold9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansBoldOblique9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSansOblique9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSansOblique9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerif9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerif9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBold9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBold9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifBoldItalic9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic12pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic12pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic12pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic12pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic18pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic18pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic18pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic18pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic24pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic24pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic24pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic24pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic9pt7b.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic9pt7b.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/FreeSerifItalic9pt7b.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/FreeSerifItalic9pt7b.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/TomThumb.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/TomThumb.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/TomThumb.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/TomThumb.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/gfxfont.h b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/gfxfont.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/gfxfont.h rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/gfxfont.h diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/license.txt b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/license.txt similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/license.txt rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/license.txt diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/print.txt b/libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/print.txt similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/GFXFF/print.txt rename to libraries/TFT_eSPI-2.5.43/Fonts/GFXFF/print.txt diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/TrueType/Not_yet_supported.txt b/libraries/TFT_eSPI-2.5.43/Fonts/TrueType/Not_yet_supported.txt similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Fonts/TrueType/Not_yet_supported.txt rename to libraries/TFT_eSPI-2.5.43/Fonts/TrueType/Not_yet_supported.txt diff --git a/libraries/TFT_eSPI-2.4.72/Fonts/glcdfont.c b/libraries/TFT_eSPI-2.5.43/Fonts/glcdfont.c similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Fonts/glcdfont.c rename to libraries/TFT_eSPI-2.5.43/Fonts/glcdfont.c index 882a133b..95c1c98a 100644 --- a/libraries/TFT_eSPI-2.4.72/Fonts/glcdfont.c +++ b/libraries/TFT_eSPI-2.5.43/Fonts/glcdfont.c @@ -182,8 +182,9 @@ static const unsigned char font[] PROGMEM = { 0x00, 0x00, 0x7B, 0x00, 0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08, - 0xAA, 0x00, 0x55, 0x00, 0xAA, - 0xAA, 0x55, 0xAA, 0x55, 0xAA, + 0x55, 0x00, 0x55, 0x00, 0x55, // #176 (25% block) missing in old code + 0xAA, 0x55, 0xAA, 0x55, 0xAA, // 50% block + 0xFF, 0x55, 0xFF, 0x55, 0xFF, // 75% block 0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14, 0x14, 0x14, 0xFF, 0x00, diff --git a/libraries/TFT_eSPI-2.4.72/Kconfig b/libraries/TFT_eSPI-2.5.43/Kconfig similarity index 89% rename from libraries/TFT_eSPI-2.4.72/Kconfig rename to libraries/TFT_eSPI-2.5.43/Kconfig index b4efe203..2e21c90f 100644 --- a/libraries/TFT_eSPI-2.4.72/Kconfig +++ b/libraries/TFT_eSPI-2.5.43/Kconfig @@ -150,12 +150,16 @@ menu "TFT_eSPI" endchoice - config TFT_PARALLEL_8_BIT - bool "Enable 8-bit parallel mode (otherwise SPI is assumed)" - default "n" - depends on IDF_TARGET_ESP32 + choice TFT_INTERFACE + prompt "LCD Interface" + default TFT_SPI help - Use 8-bit parallel bus to send data to the LCD. If not set SPI will be used. + Communication interface between the microcontroller and the LCD. + config TFT_SPI + bool "SPI" + config TFT_PARALLEL_8_BIT + bool "Parallel (8-bit)" + endchoice menu "Display Data pins" depends on TFT_PARALLEL_8_BIT @@ -211,12 +215,28 @@ menu "TFT_eSPI" endmenu menu "Display SPI config" - depends on !TFT_PARALLEL_8_BIT + depends on TFT_SPI + + choice TFT_SPI_PORT + prompt "SPI port" + default TFT_VSPI_PORT + help + The ESP32 has 2 free SPI ports i.e. VSPI (SPI2) and HSPI (SPI3), + the VSPI is the default. If the VSPI port is in use and pins are + not accessible (e.g. TTGO T-Beam) then use the HSPI port for the + TFT display. + config TFT_VSPI_PORT + bool "VSPI (SPI2)" + config TFT_HSPI_PORT + bool "HSPI (SPI3)" + endchoice + config TFT_MISO int "TFT MISO pin" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Master In Slave Out pin. Can be labelled as SDO in some displays @@ -226,6 +246,7 @@ menu "TFT_eSPI" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Master Out Slave In pin. Can be labelled as SDA or SDI in some displays @@ -235,6 +256,7 @@ menu "TFT_eSPI" default -1 range -1 32 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Labelled in some displays as WR @@ -272,6 +294,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config TFT_DC int "TFT Data/Command pin" @@ -285,6 +308,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config ENABLE_BL bool "Enable backlight control" @@ -296,6 +320,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 help Pin for the backlight control signal @@ -364,6 +389,7 @@ menu "TFT_eSPI" default -1 range -1 33 if IDF_TARGET_ESP32 range -1 45 if IDF_TARGET_ESP32S2 + range -1 48 if IDF_TARGET_ESP32S3 config SPI_TOUCH_FREQUENCY int "SPI frequency for XPT2046 chip (Hz)" @@ -372,4 +398,10 @@ menu "TFT_eSPI" endif endmenu + menu "Other settings" + config DISABLE_WARNINGS + bool "Disable Library warnings" + default n + endmenu + endmenu diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.c similarity index 93% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.c index 5534f056..faf30343 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.c @@ -41,11 +41,11 @@ #endif #else #ifdef USE_HSPI_PORT - #define DMA_CHANNEL 2 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI3_HOST; // Draws once then freezes #else // use FSPI port - #define DMA_CHANNEL 1 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = (spi_host_device_t) SPI2_HOST; // Draws once then freezes #endif #endif #endif @@ -64,29 +64,35 @@ //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - VSPI port only, FPSI port only for S2 +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + #else // S2 + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); + #endif SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - VSPI port only, FPSI port only for S2 +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + #ifdef CONFIG_IDF_TARGET_ESP32 + pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); + #else // S2 + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); + #endif SET_BUS_WRITE_MODE; } + //////////////////////////////////////////////////////////////////////////////////////// #endif // #if defined (TFT_SDA_READ) //////////////////////////////////////////////////////////////////////////////////////// @@ -94,7 +100,7 @@ void TFT_eSPI::end_SDA_Read(void) /*************************************************************************************** ** Function name: read byte - supports class functions -** Description: Read a byte from ESP32 8 bit data port +** Description: Read a byte from ESP32 8-bit data port ***************************************************************************************/ // Parallel bus MUST be set to input before calling this function! uint8_t TFT_eSPI::readByte(void) @@ -409,7 +415,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -422,7 +428,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint32_t r = (color & 0xF800)>>8; uint32_t g = (color & 0x07E0)<<5; uint32_t b = (color & 0x001F)<<19; - // Concatenate 4 pixels into three 32 bit blocks + // Concatenate 4 pixels into three 32-bit blocks uint32_t r0 = r<<24 | b | g | r; uint32_t r1 = r0>>8 | g<<16; uint32_t r2 = r1>>8 | b<<8; @@ -506,7 +512,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8 bit parallel +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -761,6 +767,17 @@ void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) else {DC_C;} } +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + /*************************************************************************************** ** Function name: initDMA ** Description: Initialise the DMA engine - returns true if init OK @@ -776,6 +793,12 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .sclk_io_num = TFT_SCLK, .quadwp_io_num = -1, .quadhd_io_num = -1, + #ifdef xCONFIG_IDF_TARGET_ESP32S2 + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + #endif .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size .flags = 0, .intr_flags = 0 @@ -798,7 +821,11 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .flags = SPI_DEVICE_NO_DUMMY, //0, .queue_size = 1, .pre_cb = 0, //dc_callback, //Callback to handle D/C line - .post_cb = 0 + #ifdef CONFIG_IDF_TARGET_ESP32 + .post_cb = 0 + #else + .post_cb = dma_end_callback + #endif }; ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); ESP_ERROR_CHECK(ret); diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.h similarity index 81% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.h index c0dc893a..ad60e3dd 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32.h @@ -11,6 +11,7 @@ // Include processor specific header #include "soc/spi_reg.h" #include "driver/spi_master.h" +#include "hal/gpio_ll.h" #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) #define CONFIG_IDF_TARGET_ESP32 @@ -86,14 +87,14 @@ SPI3_HOST = 2 // Initialise processor specific SPI functions, used by init() #define INIT_TFT_DATA_BUS // Not used -// Define a generic flag for 8 bit parallel +// Define a generic flag for 8-bit parallel #if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility #if !defined (TFT_PARALLEL_8_BIT) #define TFT_PARALLEL_8_BIT // Generic parallel flag #endif #endif -// Ensure ESP32 specific flag is defined for 8 bit parallel +// Ensure ESP32 specific flag is defined for 8-bit parallel #if defined (TFT_PARALLEL_8_BIT) #if !defined (ESP32_PARALLEL) #define ESP32_PARALLEL @@ -139,6 +140,7 @@ SPI3_HOST = 2 #define FONT_FS_AVAILABLE #endif + //////////////////////////////////////////////////////////////////////////////////////// // Define the DC (TFT Data/Command or Register Select (RS))pin drive code //////////////////////////////////////////////////////////////////////////////////////// @@ -151,6 +153,9 @@ SPI3_HOST = 2 #if (TFT_DC >= 0) && (TFT_DC < 32) #define DC_C GPIO.out_w1tc = (1 << TFT_DC) #define DC_D GPIO.out_w1ts = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC- 32)) #else #define DC_C #define DC_D @@ -350,16 +355,16 @@ SPI3_HOST = 2 } \ // Mask for the 8 data bits to set pin directions - #define dir_mask ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) + #define GPIO_DIR_MASK ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) #if (TFT_WR >= 32) // Data bits and the write line are cleared sequentially - #define clr_mask (dir_mask); WR_L + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L #elif (TFT_WR >= 0) // Data bits and the write line are cleared to 0 in one step (1.25x faster) - #define clr_mask (dir_mask | (1 << TFT_WR)) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) #else - #define clr_mask + #define GPIO_OUT_CLR_MASK #endif // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM @@ -371,53 +376,53 @@ SPI3_HOST = 2 //*/ // Write 8 bits to TFT - #define tft_Write_8(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)(C)); WR_H + #define tft_Write_8(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t)(C)); WR_H #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + // Write 18-bit color to TFT + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else #ifdef PSEUDO_16_BIT // One write strobe for both bytes - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H - #define tft_Write_16S(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H #else // Write 16 bits to TFT - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H - // 16 bit write with swapped bytes - #define tft_Write_16S(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H #endif #endif // Write 32 bits to TFT - #define tft_Write_32(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 24)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 16)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_32(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H - // Write two concatenated 16 bit values to TFT - #define tft_Write_32C(C,D) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 0)); WR_H + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 0)); WR_H - // Write 16 bit value twice to TFT - used by drawPixel() - #define tft_Write_32D(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H // Read pin #ifdef TFT_RD @@ -442,12 +447,12 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi.transfer(C) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ spi.transfer(((C) & 0x07E0)>>3); \ spi.transfer(((C) & 0x001F)<<3) @@ -455,7 +460,7 @@ SPI3_HOST = 2 // Future option for transfer without wait #define tft_Write_16N(C) tft_Write_16(C) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ spi.transfer(((C) & 0x1F00)>>5) @@ -463,10 +468,10 @@ SPI3_HOST = 2 // Write 32 bits to TFT #define tft_Write_32(C) spi.write32(C) - // Write two concatenated 16 bit values to TFT + // Write two concatenated 16-bit values to TFT #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) - // Write 16 bit value twice to TFT + // Write 16-bit value twice to TFT #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) //////////////////////////////////////////////////////////////////////////////////////// @@ -474,7 +479,7 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// #elif defined (RPI_DISPLAY_TYPE) - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead #define TFT_WRITE_BITS(D, B) \ WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ @@ -485,7 +490,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait @@ -509,7 +514,7 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// #else /* Old macros - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead #define TFT_WRITE_BITS(D, B) \ WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ @@ -520,7 +525,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Write 16 bits @@ -544,7 +549,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.c similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.c index 4e1b15b8..8c97a5fe 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.c @@ -66,27 +66,24 @@ //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); SET_BUS_WRITE_MODE; } //////////////////////////////////////////////////////////////////////////////////////// @@ -96,7 +93,7 @@ void TFT_eSPI::end_SDA_Read(void) /*************************************************************************************** ** Function name: read byte - supports class functions -** Description: Read a byte from ESP32 8 bit data port +** Description: Read a byte from ESP32 8-bit data port ***************************************************************************************/ // Parallel bus MUST be set to input before calling this function! uint8_t TFT_eSPI::readByte(void) @@ -439,7 +436,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -452,7 +449,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint32_t r = (color & 0xF800)>>8; uint32_t g = (color & 0x07E0)<<5; uint32_t b = (color & 0x001F)<<19; - // Concatenate 4 pixels into three 32 bit blocks + // Concatenate 4 pixels into three 32-bit blocks uint32_t r0 = r<<24 | b | g | r; uint32_t r1 = r0>>8 | g<<16; uint32_t r2 = r1>>8 | b<<8; @@ -543,7 +540,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8 bit parallel +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -809,6 +806,10 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .sclk_io_num = TFT_SCLK, .quadwp_io_num = -1, .quadhd_io_num = -1, + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size .flags = 0, .intr_flags = 0 diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.h similarity index 81% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.h index 7cc2ac6c..6fa18585 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_C3.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_C3.h @@ -17,6 +17,7 @@ // Include processor specific header #include "soc/spi_reg.h" #include "driver/spi_master.h" +#include "hal/gpio_ll.h" #if !defined(CONFIG_IDF_TARGET_ESP32C3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) #define CONFIG_IDF_TARGET_ESP32 @@ -78,14 +79,14 @@ SPI3_HOST = 2 // Initialise processor specific SPI functions, used by init() #define INIT_TFT_DATA_BUS // Not used -// Define a generic flag for 8 bit parallel +// Define a generic flag for 8-bit parallel #if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility #if !defined (TFT_PARALLEL_8_BIT) #define TFT_PARALLEL_8_BIT // Generic parallel flag #endif #endif -// Ensure ESP32 specific flag is defined for 8 bit parallel +// Ensure ESP32 specific flag is defined for 8-bit parallel #if defined (TFT_PARALLEL_8_BIT) #if !defined (ESP32_PARALLEL) #define ESP32_PARALLEL @@ -143,6 +144,9 @@ SPI3_HOST = 2 #if (TFT_DC >= 0) && (TFT_DC < 32) #define DC_C GPIO.out_w1tc.val = (1 << TFT_DC) #define DC_D GPIO.out_w1ts.val = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out_w1ts.val = (1 << (TFT_DC- 32)) #else #define DC_C #define DC_D @@ -342,16 +346,16 @@ SPI3_HOST = 2 } \ // Mask for the 8 data bits to set pin directions - #define dir_mask ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) + #define GPIO_DIR_MASK ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) #if (TFT_WR >= 32) // Data bits and the write line are cleared sequentially - #define clr_mask (dir_mask); WR_L + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L #elif (TFT_WR >= 0) // Data bits and the write line are cleared to 0 in one step (1.25x faster) - #define clr_mask (dir_mask | (1 << TFT_WR)) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) #else - #define clr_mask + #define GPIO_OUT_CLR_MASK #endif // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM @@ -363,53 +367,53 @@ SPI3_HOST = 2 //*/ // Write 8 bits to TFT - #define tft_Write_8(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t)(C)); WR_H + #define tft_Write_8(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t)(C)); WR_H #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT - #define tft_Write_16(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + // Write 18-bit color to TFT + #define tft_Write_16(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else #ifdef PSEUDO_16_BIT // One write strobe for both bytes - #define tft_Write_16(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H - #define tft_Write_16S(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H + #define tft_Write_16(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H #else // Write 16 bits to TFT - #define tft_Write_16(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H - // 16 bit write with swapped bytes - #define tft_Write_16S(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H #endif #endif // Write 32 bits to TFT - #define tft_Write_32(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 24)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 16)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_32(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H - // Write two concatenated 16 bit values to TFT - #define tft_Write_32C(C,D) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 0)); WR_H + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((D) >> 0)); WR_H - // Write 16 bit value twice to TFT - used by drawPixel() - #define tft_Write_32D(C) GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc.val = clr_mask; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO.out_w1tc.val = GPIO_OUT_CLR_MASK; GPIO.out_w1ts.val = set_mask((uint8_t) ((C) >> 0)); WR_H // Read pin #ifdef TFT_RD @@ -434,12 +438,12 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi.transfer(C) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ spi.transfer(((C) & 0x07E0)>>3); \ spi.transfer(((C) & 0x001F)<<3) @@ -447,7 +451,7 @@ SPI3_HOST = 2 // Future option for transfer without wait #define tft_Write_16N(C) tft_Write_16(C) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ spi.transfer(((C) & 0x1F00)>>5) @@ -455,10 +459,10 @@ SPI3_HOST = 2 // Write 32 bits to TFT #define tft_Write_32(C) spi.write32(C) - // Write two concatenated 16 bit values to TFT + // Write two concatenated 16-bit values to TFT #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) - // Write 16 bit value twice to TFT + // Write 16-bit value twice to TFT #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) //////////////////////////////////////////////////////////////////////////////////////// @@ -466,7 +470,7 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// #elif defined (RPI_DISPLAY_TYPE) - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead #define TFT_WRITE_BITS(D, B) \ WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ @@ -477,7 +481,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait @@ -501,7 +505,7 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// #else /* Old macros - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead #define TFT_WRITE_BITS(D, B) \ WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ @@ -512,7 +516,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Write 16 bits @@ -544,7 +548,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.c similarity index 87% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.c index c17be8a3..d689e72a 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.c @@ -43,50 +43,38 @@ #endif #else #ifdef USE_HSPI_PORT - #define DMA_CHANNEL 2 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI3_HOST; #else // use FSPI port - #define DMA_CHANNEL 1 - spi_host_device_t spi_host = (spi_host_device_t) DMA_CHANNEL; // Draws once then freezes + #define DMA_CHANNEL SPI_DMA_CH_AUTO + spi_host_device_t spi_host = SPI2_HOST; #endif #endif #endif -#if !defined (TFT_PARALLEL_8_BIT) - // Volatile for register reads: - volatile uint32_t* _spi_cmd = (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)); - volatile uint32_t* _spi_user = (volatile uint32_t*)(SPI_USER_REG(SPI_PORT)); - // Register writes only: - volatile uint32_t* _spi_mosi_dlen = (volatile uint32_t*)(SPI_MOSI_DLEN_REG(SPI_PORT)); - volatile uint32_t* _spi_w = (volatile uint32_t*)(SPI_W0_REG(SPI_PORT)); -#endif - //////////////////////////////////////////////////////////////////////////////////////// #if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** -** Function name: beginSDA -** Description: Detach SPI from pin to permit software SPI +** Function name: beginSDA - FPSI port only +** Description: Detach MOSI and attach MISO to SDA for reads ***************************************************************************************/ void TFT_eSPI::begin_SDA_Read(void) { - pinMatrixOutDetach(TFT_MOSI, false, false); - pinMode(TFT_MOSI, INPUT); - pinMatrixInAttach(TFT_MOSI, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_INPUT); + pinMatrixInAttach(TFT_MOSI, FSPIQ_IN_IDX, false); SET_BUS_READ_MODE; } /*************************************************************************************** -** Function name: endSDA -** Description: Attach SPI pins after software SPI +** Function name: endSDA - FPSI port only +** Description: Attach MOSI to SDA and detach MISO for writes ***************************************************************************************/ void TFT_eSPI::end_SDA_Read(void) { - pinMode(TFT_MOSI, OUTPUT); - pinMatrixOutAttach(TFT_MOSI, VSPID_OUT_IDX, false, false); - pinMode(TFT_MISO, INPUT); - pinMatrixInAttach(TFT_MISO, VSPIQ_IN_IDX, false); + gpio_set_direction((gpio_num_t)TFT_MOSI, GPIO_MODE_OUTPUT); + pinMatrixOutAttach(TFT_MOSI, FSPID_OUT_IDX, false, false); SET_BUS_WRITE_MODE; } //////////////////////////////////////////////////////////////////////////////////////// @@ -96,7 +84,7 @@ void TFT_eSPI::end_SDA_Read(void) /*************************************************************************************** ** Function name: read byte - supports class functions -** Description: Read a byte from ESP32 8 bit data port +** Description: Read a byte from ESP32 8-bit data port ***************************************************************************************/ // Parallel bus MUST be set to input before calling this function! uint8_t TFT_eSPI::readByte(void) @@ -105,21 +93,20 @@ uint8_t TFT_eSPI::readByte(void) #if defined (TFT_PARALLEL_8_BIT) RD_L; - uint32_t reg; // Read all GPIO pins 0-31 - reg = gpio_input_get(); // Read three times to allow for bus access time - reg = gpio_input_get(); - reg = gpio_input_get(); // Data should be stable now - RD_H; + b = gpio_get_level((gpio_num_t)TFT_D0); // Read three times to allow for bus access time + b = gpio_get_level((gpio_num_t)TFT_D0); + b = gpio_get_level((gpio_num_t)TFT_D0); // Data should be stable now // Check GPIO bits used and build value - b = (((reg>>TFT_D0)&1) << 0); - b |= (((reg>>TFT_D1)&1) << 1); - b |= (((reg>>TFT_D2)&1) << 2); - b |= (((reg>>TFT_D3)&1) << 3); - b |= (((reg>>TFT_D4)&1) << 4); - b |= (((reg>>TFT_D5)&1) << 5); - b |= (((reg>>TFT_D6)&1) << 6); - b |= (((reg>>TFT_D7)&1) << 7); + b = (gpio_get_level((gpio_num_t)TFT_D0) << 0); + b |= (gpio_get_level((gpio_num_t)TFT_D1) << 1); + b |= (gpio_get_level((gpio_num_t)TFT_D2) << 2); + b |= (gpio_get_level((gpio_num_t)TFT_D3) << 3); + b |= (gpio_get_level((gpio_num_t)TFT_D4) << 4); + b |= (gpio_get_level((gpio_num_t)TFT_D5) << 5); + b |= (gpio_get_level((gpio_num_t)TFT_D6) << 6); + b |= (gpio_get_level((gpio_num_t)TFT_D7) << 7); + RD_H; #endif return b; @@ -439,7 +426,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -452,7 +439,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint32_t r = (color & 0xF800)>>8; uint32_t g = (color & 0x07E0)<<5; uint32_t b = (color & 0x001F)<<19; - // Concatenate 4 pixels into three 32 bit blocks + // Concatenate 4 pixels into three 32-bit blocks uint32_t r0 = r<<24 | b | g | r; uint32_t r1 = r0>>8 | g<<16; uint32_t r2 = r1>>8 | b<<8; @@ -543,7 +530,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8 bit parallel +#elif defined (TFT_PARALLEL_8_BIT) // Now the code for ESP32 8-bit parallel //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -653,6 +640,18 @@ void TFT_eSPI::pushPixelsDMA(uint16_t* image, uint32_t len) for (uint32_t i = 0; i < len; i++) (image[i] = image[i] << 8 | image[i] >> 8); } + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(image, 0x400); + len -= 0x400; image+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; + esp_err_t ret; static spi_transaction_t trans; @@ -679,11 +678,23 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t { if ((w == 0) || (h == 0) || (!DMA_Enabled)) return; + uint16_t *buffer = (uint16_t*)image; uint32_t len = w*h; dmaWait(); setAddrWindow(x, y, w, h); + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; esp_err_t ret; static spi_transaction_t trans; @@ -691,7 +702,7 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t memset(&trans, 0, sizeof(spi_transaction_t)); trans.user = (void *)1; - trans.tx_buffer = image; //Data pointer + trans.tx_buffer = buffer; //Data pointer trans.length = len * 16; //Data length, in bits trans.flags = 0; //SPI_TRANS_USE_TXDATA flag @@ -761,6 +772,18 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t setAddrWindow(x, y, dw, dh); + // DMA byte count for transmit is 64Kbytes maximum, so to avoid this constraint + // small transfers are performed using a blocking call until DMA capacity is reached. + // User sketch can prevent blocking by managing pixel count and splitting into blocks + // of 32768 pixels maximum. (equivalent to an area of ~320 x 100 pixels) + bool temp = _swapBytes; + _swapBytes = false; + while(len>0x4000) { // Transfer 16-bit pixels in blocks if len*2 over 65536 bytes + pushPixels(buffer, 0x400); + len -= 0x400; buffer+= 0x400; // Arbitrarily send 1K pixel blocks (2Kbytes) + } + _swapBytes = temp; + esp_err_t ret; static spi_transaction_t trans; @@ -784,7 +807,7 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // The DMA functions here work with SPI only (not parallel) /*************************************************************************************** ** Function name: dc_callback -** Description: Toggles DC line during transaction +** Description: Toggles DC line during transaction (not used) ***************************************************************************************/ extern "C" void dc_callback(); @@ -794,6 +817,17 @@ void IRAM_ATTR dc_callback(spi_transaction_t *spi_tx) else {DC_C;} } +/*************************************************************************************** +** Function name: dma_end_callback +** Description: Clear DMA run flag to stop retransmission loop +***************************************************************************************/ +extern "C" void dma_end_callback(); + +void IRAM_ATTR dma_end_callback(spi_transaction_t *spi_tx) +{ + WRITE_PERI_REG(SPI_DMA_CONF_REG(spi_host), 0); +} + /*************************************************************************************** ** Function name: initDMA ** Description: Initialise the DMA engine - returns true if init OK @@ -809,7 +843,11 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .sclk_io_num = TFT_SCLK, .quadwp_io_num = -1, .quadhd_io_num = -1, - .max_transfer_sz = TFT_WIDTH * TFT_HEIGHT * 2 + 8, // TFT screen size + .data4_io_num = -1, + .data5_io_num = -1, + .data6_io_num = -1, + .data7_io_num = -1, + .max_transfer_sz = 65536, // ESP32 S3 max size is 64Kbytes .flags = 0, .intr_flags = 0 }; @@ -829,9 +867,9 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) .input_delay_ns = 0, .spics_io_num = pin, .flags = SPI_DEVICE_NO_DUMMY, //0, - .queue_size = 1, - .pre_cb = 0, //dc_callback, //Callback to handle D/C line - .post_cb = 0 + .queue_size = 1, // Not using queues + .pre_cb = 0, //dc_callback, //Callback to handle D/C line (not used) + .post_cb = dma_end_callback //Callback to end transmission }; ret = spi_bus_initialize(spi_host, &buscfg, DMA_CHANNEL); ESP_ERROR_CHECK(ret); diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.h similarity index 73% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.h index 4ec4e20e..c1a9e101 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP32_S3.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP32_S3.h @@ -7,16 +7,13 @@ #ifndef _TFT_eSPI_ESP32H_ #define _TFT_eSPI_ESP32H_ -#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) - #warning >>>>------>> DMA is not supported on the ESP32 S3 (possible future update) -#endif - // Processor ID reported by getSetup() #define PROCESSOR_ID 0x32 // Include processor specific header #include "soc/spi_reg.h" #include "driver/spi_master.h" +#include "hal/gpio_ll.h" #if !defined(CONFIG_IDF_TARGET_ESP32S3) && !defined(CONFIG_IDF_TARGET_ESP32S2) && !defined(CONFIG_IDF_TARGET_ESP32) #define CONFIG_IDF_TARGET_ESP32 @@ -96,22 +93,31 @@ SPI3_HOST = 2 // Initialise processor specific SPI functions, used by init() #define INIT_TFT_DATA_BUS // Not used -// Define a generic flag for 8 bit parallel +// Define a generic flag for 8-bit parallel #if defined (ESP32_PARALLEL) // Specific to ESP32 for backwards compatibility #if !defined (TFT_PARALLEL_8_BIT) #define TFT_PARALLEL_8_BIT // Generic parallel flag #endif #endif -// Ensure ESP32 specific flag is defined for 8 bit parallel +// Ensure ESP32 specific flag is defined for 8-bit parallel #if defined (TFT_PARALLEL_8_BIT) #if !defined (ESP32_PARALLEL) #define ESP32_PARALLEL #endif #endif +#if !defined(DISABLE_ALL_LIBRARY_WARNINGS) && defined (ESP32_PARALLEL) + #warning >>>>------>> DMA is not supported in parallel mode +#endif + // Processor specific code used by SPI bus transaction startWrite and endWrite functions #if !defined (ESP32_PARALLEL) + #define _spi_cmd (volatile uint32_t*)(SPI_CMD_REG(SPI_PORT)) + #define _spi_user (volatile uint32_t*)(SPI_USER_REG(SPI_PORT)) + #define _spi_mosi_dlen (volatile uint32_t*)(SPI_MOSI_DLEN_REG(SPI_PORT)) + #define _spi_w (volatile uint32_t*)(SPI_W0_REG(SPI_PORT)) + #if (TFT_SPI_MODE == SPI_MODE1) || (TFT_SPI_MODE == SPI_MODE2) #define SET_BUS_WRITE_MODE *_spi_user = SPI_USR_MOSI | SPI_CK_OUT_EDGE #define SET_BUS_READ_MODE *_spi_user = SPI_USR_MOSI | SPI_USR_MISO | SPI_DOUTDIN | SPI_CK_OUT_EDGE @@ -161,6 +167,9 @@ SPI3_HOST = 2 #if (TFT_DC >= 0) && (TFT_DC < 32) #define DC_C GPIO.out_w1tc = (1 << TFT_DC) #define DC_D GPIO.out_w1ts = (1 << TFT_DC) + #elif (TFT_DC >= 32) + #define DC_C GPIO.out1_w1tc.val = (1 << (TFT_DC- 32)) + #define DC_D GPIO.out1_w1ts.val = (1 << (TFT_DC- 32)) #else #define DC_C #define DC_D @@ -343,33 +352,53 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// #if defined (TFT_PARALLEL_8_BIT) + #if (TFT_D0 >= 32) // If D0 is a high GPIO assume all other data bits are high GPIO + #define MASK_OFFSET 32 + #define GPIO_CLR_REG GPIO.out1_w1tc.val + #define GPIO_SET_REG GPIO.out1_w1ts.val + #else + #define MASK_OFFSET 0 + #define GPIO_CLR_REG GPIO.out_w1tc + #define GPIO_SET_REG GPIO.out_w1ts + #endif + // Create a bit set lookup table for data bus - wastes 1kbyte of RAM but speeds things up dramatically // can then use e.g. GPIO.out_w1ts = set_mask(0xFF); to set data bus to 0xFF #define PARALLEL_INIT_TFT_DATA_BUS \ for (int32_t c = 0; c<256; c++) \ { \ xset_mask[c] = 0; \ - if ( c & 0x01 ) xset_mask[c] |= (1 << TFT_D0); \ - if ( c & 0x02 ) xset_mask[c] |= (1 << TFT_D1); \ - if ( c & 0x04 ) xset_mask[c] |= (1 << TFT_D2); \ - if ( c & 0x08 ) xset_mask[c] |= (1 << TFT_D3); \ - if ( c & 0x10 ) xset_mask[c] |= (1 << TFT_D4); \ - if ( c & 0x20 ) xset_mask[c] |= (1 << TFT_D5); \ - if ( c & 0x40 ) xset_mask[c] |= (1 << TFT_D6); \ - if ( c & 0x80 ) xset_mask[c] |= (1 << TFT_D7); \ - } \ + if ( c & 0x01 ) xset_mask[c] |= (1 << (TFT_D0-MASK_OFFSET)); \ + if ( c & 0x02 ) xset_mask[c] |= (1 << (TFT_D1-MASK_OFFSET)); \ + if ( c & 0x04 ) xset_mask[c] |= (1 << (TFT_D2-MASK_OFFSET)); \ + if ( c & 0x08 ) xset_mask[c] |= (1 << (TFT_D3-MASK_OFFSET)); \ + if ( c & 0x10 ) xset_mask[c] |= (1 << (TFT_D4-MASK_OFFSET)); \ + if ( c & 0x20 ) xset_mask[c] |= (1 << (TFT_D5-MASK_OFFSET)); \ + if ( c & 0x40 ) xset_mask[c] |= (1 << (TFT_D6-MASK_OFFSET)); \ + if ( c & 0x80 ) xset_mask[c] |= (1 << (TFT_D7-MASK_OFFSET)); \ + } \ // Mask for the 8 data bits to set pin directions - #define dir_mask ((1 << TFT_D0) | (1 << TFT_D1) | (1 << TFT_D2) | (1 << TFT_D3) | (1 << TFT_D4) | (1 << TFT_D5) | (1 << TFT_D6) | (1 << TFT_D7)) + #define GPIO_DIR_MASK ((1 << (TFT_D0-MASK_OFFSET)) | (1 << (TFT_D1-MASK_OFFSET)) | (1 << (TFT_D2-MASK_OFFSET)) | (1 << (TFT_D3-MASK_OFFSET)) | (1 << (TFT_D4-MASK_OFFSET)) | (1 << (TFT_D5-MASK_OFFSET)) | (1 << (TFT_D6-MASK_OFFSET)) | (1 << (TFT_D7-MASK_OFFSET))) #if (TFT_WR >= 32) - // Data bits and the write line are cleared sequentially - #define clr_mask (dir_mask); WR_L + #if (TFT_D0 >= 32) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << (TFT_WR-32))) + #elif (TFT_D0 >= 0) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #endif #elif (TFT_WR >= 0) - // Data bits and the write line are cleared to 0 in one step (1.25x faster) - #define clr_mask (dir_mask | (1 << TFT_WR)) + #if (TFT_D0 >= 32) + // Data bits and the write line are cleared sequentially + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK); WR_L + #elif (TFT_D0 >= 0) + // Data bits and the write line are cleared to 0 in one step (1.25x faster) + #define GPIO_OUT_CLR_MASK (GPIO_DIR_MASK | (1 << TFT_WR)) + #endif #else - #define clr_mask + #define GPIO_OUT_CLR_MASK #endif // A lookup table is used to set the different bit patterns, this uses 1kByte of RAM @@ -381,53 +410,53 @@ SPI3_HOST = 2 //*/ // Write 8 bits to TFT - #define tft_Write_8(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t)(C)); WR_H + #define tft_Write_8(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t)(C)); WR_H #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H + // Write 18-bit color to TFT + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0xF800)>> 8)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x07E0)>> 3)); WR_H; \ + GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) (((C) & 0x001F)<< 3)); WR_H - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else #ifdef PSEUDO_16_BIT // One write strobe for both bytes - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H - #define tft_Write_16S(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + #define tft_Write_16(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16S(C) GPIO.out_w1tc = GPIO_OUT_CLR_MASK; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H #else // Write 16 bits to TFT - #define tft_Write_16(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_16(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H - // 16 bit write with swapped bytes - #define tft_Write_16S(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H + // 16-bit write with swapped bytes + #define tft_Write_16S(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H #endif #endif // Write 32 bits to TFT - #define tft_Write_32(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 24)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 16)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + #define tft_Write_32(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 24)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 16)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H - // Write two concatenated 16 bit values to TFT - #define tft_Write_32C(C,D) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((D) >> 0)); WR_H + // Write two concatenated 16-bit values to TFT + #define tft_Write_32C(C,D) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((D) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((D) >> 0)); WR_H - // Write 16 bit value twice to TFT - used by drawPixel() - #define tft_Write_32D(C) GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 8)); WR_H; \ - GPIO.out_w1tc = clr_mask; GPIO.out_w1ts = set_mask((uint8_t) ((C) >> 0)); WR_H + // Write 16-bit value twice to TFT - used by drawPixel() + #define tft_Write_32D(C) GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 8)); WR_H; \ + GPIO_CLR_REG = GPIO_OUT_CLR_MASK; GPIO_SET_REG = set_mask((uint8_t) ((C) >> 0)); WR_H // Read pin #ifdef TFT_RD @@ -452,12 +481,12 @@ SPI3_HOST = 2 //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi.transfer(C) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ spi.transfer(((C) & 0x07E0)>>3); \ spi.transfer(((C) & 0x001F)<<3) @@ -465,7 +494,7 @@ SPI3_HOST = 2 // Future option for transfer without wait #define tft_Write_16N(C) tft_Write_16(C) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ spi.transfer(((C) & 0x1F00)>>5) @@ -473,29 +502,29 @@ SPI3_HOST = 2 // Write 32 bits to TFT #define tft_Write_32(C) spi.write32(C) - // Write two concatenated 16 bit values to TFT + // Write two concatenated 16-bit values to TFT #define tft_Write_32C(C,D) spi.write32((C)<<16 | (D)) - // Write 16 bit value twice to TFT + // Write 16-bit value twice to TFT #define tft_Write_32D(C) spi.write32((C)<<16 | (C)) //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to an Raspberry Pi TFT //////////////////////////////////////////////////////////////////////////////////////// #elif defined (RPI_DISPLAY_TYPE) - - // ESP32 low level SPI writes for 8, 16 and 32 bit values + // ESP32-S3 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead - #define TFT_WRITE_BITS(D, B) \ - WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ - SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ - while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); + #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ + *_spi_w = D; \ + *_spi_cmd = SPI_UPDATE; \ + while (*_spi_cmd & SPI_UPDATE); \ + *_spi_cmd = SPI_USR; \ + while (*_spi_cmd & SPI_USR); // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS((C)<<8, 16) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait @@ -518,34 +547,6 @@ SPI3_HOST = 2 // Macros for all other SPI displays //////////////////////////////////////////////////////////////////////////////////////// #else -/* Old macros - // ESP32 low level SPI writes for 8, 16 and 32 bit values - // to avoid the function call overhead - #define TFT_WRITE_BITS(D, B) \ - WRITE_PERI_REG(SPI_MOSI_DLEN_REG(SPI_PORT), B-1); \ - WRITE_PERI_REG(SPI_W0_REG(SPI_PORT), D); \ - SET_PERI_REG_MASK(SPI_CMD_REG(SPI_PORT), SPI_USR); \ - while (READ_PERI_REG(SPI_CMD_REG(SPI_PORT))&SPI_USR); - - // Write 8 bits - #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - - // Write 16 bits with corrected endianness for 16 bit colours - #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) - - // Write 16 bits - #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) - - // Write 32 bits - #define tft_Write_32(C) TFT_WRITE_BITS(C, 32) - - // Write two address coordinates - #define tft_Write_32C(C,D) TFT_WRITE_BITS((uint16_t)((D)<<8 | (D)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) - - // Write same value twice - #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) -//*/ -//* Replacement slimmer macros #if !defined(CONFIG_IDF_TARGET_ESP32S3) #define TFT_WRITE_BITS(D, B) *_spi_mosi_dlen = B-1; \ *_spi_w = D; \ @@ -562,7 +563,7 @@ SPI3_HOST = 2 // Write 8 bits #define tft_Write_8(C) TFT_WRITE_BITS(C, 8) - // Write 16 bits with corrected endianness for 16 bit colours + // Write 16 bits with corrected endianness for 16-bit colours #define tft_Write_16(C) TFT_WRITE_BITS((C)<<8 | (C)>>8, 16) // Future option for transfer without wait @@ -570,13 +571,13 @@ SPI3_HOST = 2 #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ *_spi_w = ((C)<<8 | (C)>>8); \ *_spi_cmd = SPI_USR; -#else + #else #define tft_Write_16N(C) *_spi_mosi_dlen = 16-1; \ *_spi_w = ((C)<<8 | (C)>>8); \ *_spi_cmd = SPI_UPDATE; \ while (*_spi_cmd & SPI_UPDATE); \ *_spi_cmd = SPI_USR; -#endif + #endif // Write 16 bits #define tft_Write_16S(C) TFT_WRITE_BITS(C, 16) @@ -590,7 +591,6 @@ SPI3_HOST = 2 // Write same value twice #define tft_Write_32D(C) TFT_WRITE_BITS((uint16_t)((C)<<8 | (C)>>8)<<16 | (uint16_t)((C)<<8 | (C)>>8), 32) -//*/ #endif #ifndef tft_Write_16N diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.c similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.c index 83939f9d..b49380a9 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.c @@ -109,7 +109,7 @@ void TFT_eSPI::pushSwapBytePixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -122,7 +122,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint8_t r = (color & 0xF800)>>8; uint8_t g = (color & 0x07E0)>>3; uint8_t b = (color & 0x001F)<<3; - // Concatenate 4 pixels into three 32 bit blocks + // Concatenate 4 pixels into three 32-bit blocks uint32_t r0 = r<<24 | b<<16 | g<<8 | r; uint32_t r1 = g<<24 | r<<16 | b<<8 | g; uint32_t r2 = b<<24 | g<<16 | r<<8 | b; diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.h similarity index 96% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.h index 24d8fffd..1aacc1ee 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_ESP8266.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_ESP8266.h @@ -19,7 +19,7 @@ #define DMA_BUSY_CHECK // DMA not available, leave blank // Initialise processor specific SPI functions, used by init() -#if (!defined (SUPPORT_TRANSACTIONS) && defined (ESP8266)) +#if (!defined (SUPPORT_TRANSACTIONS) && defined (ARDUINO_ARCH_ESP8266)) #define INIT_TFT_DATA_BUS \ spi.setBitOrder(MSBFIRST); \ spi.setDataMode(TFT_SPI_MODE); \ @@ -117,17 +117,17 @@ //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi.transfer(C) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ spi.transfer(((C) & 0x07E0)>>3); \ spi.transfer(((C) & 0x001F)<<3) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ spi.transfer(((C) & 0x1F00)>>5) @@ -148,7 +148,7 @@ // Command is 16 bits #define CMD_BITS 16 - // ESP8266 low level SPI writes for 8, 16 and 32 bit values + // ESP8266 low level SPI writes for 8, 16 and 32-bit values // to avoid the function call overhead #define TFT_WRITE_BITS(D, B) \ SPI1U1 = ((B-1) << SPILMOSI); \ diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.c similarity index 98% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.c index 14eda108..1c2287b3 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.c @@ -172,7 +172,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -216,7 +216,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#else // Standard SPI 16 bit colour TFT +#else // Standard SPI 16-bit colour TFT //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.h index 8b316552..df7981d3 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_Generic.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_Generic.h @@ -3,7 +3,7 @@ //////////////////////////////////////////////////// // This is a generic driver for Arduino boards, it supports SPI interface displays -// 8 bit parallel interface to TFT is not supported for generic processors +// 8-bit parallel interface to TFT is not supported for generic processors #ifndef _TFT_eSPI_GENERICH_ #define _TFT_eSPI_GENERICH_ @@ -94,17 +94,17 @@ //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi.transfer(C) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) spi.transfer(((C) & 0xF800)>>8); \ spi.transfer(((C) & 0x07E0)>>3); \ spi.transfer(((C) & 0x001F)<<3) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) spi.transfer((C) & 0xF8); \ spi.transfer(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ spi.transfer(((C) & 0x1F00)>>5) @@ -121,7 +121,7 @@ // Macros to write commands/pixel colour data to other displays //////////////////////////////////////////////////////////////////////////////////////// #else - #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers #define tft_Write_8(C) spi.transfer(C); spi.transfer(C) #define tft_Write_16(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) #define tft_Write_16S(C) spi.transfer((uint8_t)((C)>>0));spi.transfer((uint8_t)((C)>>8)) @@ -143,7 +143,7 @@ spi.transfer(0); spi.transfer((C)>>0) #else - #ifdef __AVR__ // AVR processors do not have 16 bit transfer + #ifdef __AVR__ // AVR processors do not have 16-bit transfer #define tft_Write_8(C) {SPDR=(C); while (!(SPSR&_BV(SPIF)));} #define tft_Write_16(C) tft_Write_8((uint8_t)((C)>>8));tft_Write_8((uint8_t)((C)>>0)) #define tft_Write_16S(C) tft_Write_8((uint8_t)((C)>>0));tft_Write_8((uint8_t)((C)>>8)) diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.c similarity index 93% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.c index 4e3ab4fa..e046c7a3 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.c @@ -18,21 +18,26 @@ SPIClassRP2040 spi = SPIClassRP2040(SPI_X, TFT_MISO, -1, TFT_SCLK, TFT_MOSI); #endif -#else // PIO interface used (8 bit parallel or SPI) +#else // PIO interface used (8-bit parallel or SPI) #ifdef RP2040_PIO_SPI #if defined (SPI_18BIT_DRIVER) - // SPI PIO code for 18 bit colour transmit + // SPI PIO code for 18-bit colour transmit #include "pio_SPI_18bit.pio.h" #else - // SPI PIO code for 16 bit colour transmit + // SPI PIO code for 16-bit colour transmit #include "pio_SPI.pio.h" #endif #elif defined (TFT_PARALLEL_8_BIT) - // SPI PIO code for 8 bit parallel interface (16 bit colour) - #include "pio_8bit_parallel.pio.h" + #if defined (SSD1963_DRIVER) + // PIO code for 8-bit parallel interface (18-bit colour) + #include "pio_8bit_parallel_18bpp.pio.h" + #else + // PIO code for 8-bit parallel interface (16-bit colour) + #include "pio_8bit_parallel.pio.h" + #endif #else // must be TFT_PARALLEL_16_BIT - // SPI PIO code for 16 bit parallel interface (16 bit colour) + // PIO code for 16-bit parallel interface (16-bit colour) #include "pio_16bit_parallel.pio.h" #endif @@ -123,24 +128,12 @@ void TFT_eSPI::end_SDA_Read(void) #ifdef RP2040_PIO_SPI void pioinit(uint32_t clock_freq) { - // Find a free SM on one of the PIO's - tft_pio = pio0; - - /* - pio_sm = pio_claim_unused_sm(tft_pio, false); // false means don't panic - // Try pio1 if SM not found - if (pio_sm < 0) { - tft_pio = pio1; - pio_sm = pio_claim_unused_sm(tft_pio, true); // panic this time if no SM is free - } - */ - // Find enough free space on one of the PIO's tft_pio = pio0; if (!pio_can_add_program(tft_pio, &tft_io_program)) { tft_pio = pio1; if (!pio_can_add_program(tft_pio, &tft_io_program)) { - Serial.println("No room for PIO program!"); + // Serial.println("No room for PIO program!"); return; } } @@ -192,29 +185,21 @@ void pioinit(uint32_t clock_freq) { pio_instr_set_dc = pio_encode_set((pio_src_dest)0, 1); pio_instr_clr_dc = pio_encode_set((pio_src_dest)0, 0); } -#else // 8 or 16 bit parallel +#else // 8 or 16-bit parallel void pioinit(uint16_t clock_div, uint16_t fract_div) { - // Find a free SM on one of the PIO's - tft_pio = pio0; - pio_sm = pio_claim_unused_sm(tft_pio, false); // false means don't panic - // Try pio1 if SM not found - if (pio_sm < 0) { - tft_pio = pio1; - pio_sm = pio_claim_unused_sm(tft_pio, true); // panic this time if no SM is free - } -/* // Find enough free space on one of the PIO's tft_pio = pio0; - if (!pio_can_add_program(tft_pio, &tft_io_program) { + if (!pio_can_add_program(tft_pio, &tft_io_program)) { tft_pio = pio1; - if (!pio_can_add_program(tft_pio, &tft_io_program) { - Serial.println("No room for PIO program!"); - while(1) delay(100); + if (!pio_can_add_program(tft_pio, &tft_io_program)) { + // Serial.println("No room for PIO program!"); return; } } -*/ + + pio_sm = pio_claim_unused_sm(tft_pio, false); + #if defined (TFT_PARALLEL_8_BIT) uint8_t bits = 8; #else // must be TFT_PARALLEL_16_BIT @@ -279,7 +264,7 @@ void pioinit(uint16_t clock_div, uint16_t fract_div) { // PIO handles pixel block fill writes void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) { -#if defined (SPI_18BIT_DRIVER) +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) uint32_t col = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); if (len) { WAIT_FOR_STALL; @@ -327,7 +312,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ ** Description: Write a sequence of pixels ***************************************************************************************/ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ -#if defined (SPI_18BIT_DRIVER) +#if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) uint16_t *data = (uint16_t*)data_in; if (_swapBytes) { while ( len-- ) { @@ -473,7 +458,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -486,12 +471,12 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) uint16_t g = (color & 0x07E0)>>3; uint16_t b = (color & 0x001F)<<3; - // If more than 32 pixels then change to 16 bit transfers with concatenated pixels + // If more than 32 pixels then change to 16-bit transfers with concatenated pixels if (len > 32) { uint32_t rg = r<<8 | g; uint32_t br = b<<8 | r; uint32_t gb = g<<8 | b; - // Must wait before changing to 16 bit + // Must wait before changing to 16-bit while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); while ( len > 1 ) { @@ -500,7 +485,7 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = gb; len -= 2; } - // Must wait before changing back to 8 bit + // Must wait before changing back to 8-bit while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); } @@ -531,7 +516,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ } //////////////////////////////////////////////////////////////////////////////////////// -#else // Standard SPI 16 bit colour TFT +#else // Standard SPI 16-bit colour TFT //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -577,7 +562,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len){ //////////////////////////////////////////////////////////////////////////////////////// -#ifdef RP2040_DMA // DMA functions for 16 bit SPI and 8 bit parallel displays +#ifdef RP2040_DMA // DMA functions for 16-bit SPI and 8/16-bit parallel displays //////////////////////////////////////////////////////////////////////////////////////// /* These are created in header file: diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.h similarity index 81% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.h index 35ec19f9..f10058fe 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_RP2040.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_RP2040.h @@ -3,7 +3,7 @@ //////////////////////////////////////////////////// // This is a generic driver for Arduino boards, it supports SPI interface displays -// 8 bit parallel interface to TFT is not supported for generic processors +// 8-bit parallel interface to TFT is not supported for generic processors #ifndef _TFT_eSPI_RP2040H_ #define _TFT_eSPI_RP2040H_ @@ -49,7 +49,7 @@ // Processor specific code used by SPI bus transaction begin/end_tft_write functions #define SET_BUS_WRITE_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)(TFT_SPI_MODE >> 1), (spi_cpha_t)(TFT_SPI_MODE & 0x1), SPI_MSB_FIRST) - #define SET_BUS_READ_MODE // spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) + #define SET_BUS_READ_MODE spi_set_format(SPI_X, 8, (spi_cpol_t)0, (spi_cpha_t)0, SPI_MSB_FIRST) #else // Processor specific code used by SPI bus transaction begin/end_tft_write functions #define SET_BUS_WRITE_MODE @@ -65,9 +65,20 @@ #define DMA_BUSY_CHECK #endif +// Handle high performance MHS RPi display type +#if defined (MHS_DISPLAY_TYPE) && !defined (RPI_DISPLAY_TYPE) + #define RPI_DISPLAY_TYPE +#endif + #if !defined (RP2040_PIO_INTERFACE) // SPI - // Initialise processor specific SPI functions, used by init() - #define INIT_TFT_DATA_BUS // Not used + + #if defined (MHS_DISPLAY_TYPE) // High speed RPi TFT type always needs 16-bit transfers + // This swaps to 16-bit mode, used for commands so wait avoids clash with DC timing + #define INIT_TFT_DATA_BUS hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS) + #else + // Initialise processor specific SPI functions, used by init() + #define INIT_TFT_DATA_BUS // Not used + #endif // Wait for tx to end, flush rx FIFO, clear rx overrun #define SPI_BUSY_CHECK while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ @@ -82,9 +93,18 @@ // Different controllers have different minimum write cycle periods, so the PIO clock is changed accordingly // The PIO clock is a division of the CPU clock so scales when the processor is overclocked - // PIO write frequency = (CPU clock/(4 * DIV_UNITS)) - #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RP2040_PIO_SPI) - #if defined (TFT_PARALLEL_16_BIT) + // PIO write frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) + // The write cycle periods below assume a 125MHz CPU clock speed + #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) + #if defined (RP2040_PIO_CLK_DIV) + #if (RP2040_PIO_CLK_DIV > 0) + #define DIV_UNITS RP2040_PIO_CLK_DIV + #define DIV_FRACT 0 + #else + #define DIV_UNITS 3 + #define DIV_FRACT 0 + #endif + #elif defined (TFT_PARALLEL_16_BIT) // Different display drivers have different minimum write cycle times #if defined (HX8357C_DRIVER) || defined (SSD1963_DRIVER) #define DIV_UNITS 1 // 32ns write cycle time SSD1963, HX8357C (maybe HX8357D?) @@ -94,14 +114,9 @@ #define DIV_UNITS 3 // 96ns write cycle time #endif #define DIV_FRACT 0 - #else // 8 bit parallel mode - #ifdef ILI9481_DRIVER - #define DIV_UNITS 1 - #define DIV_FRACT 160 // Note: Fractional values done with clock period dithering - #else - #define DIV_UNITS 1 - #define DIV_FRACT 0 - #endif + #else // 8-bit parallel mode default 64ns write cycle time + #define DIV_UNITS 2 + #define DIV_FRACT 0 // Note: Fractional values done with clock period dithering #endif #endif @@ -137,7 +152,7 @@ #if !defined (RP2040_PIO_INTERFACE)// SPI //#define DC_C sio_hw->gpio_clr = (1ul << TFT_DC) //#define DC_D sio_hw->gpio_set = (1ul << TFT_DC) - #if defined (RPI_DISPLAY_TYPE) + #if defined (RPI_DISPLAY_TYPE) && !defined (MHS_DISPLAY_TYPE) #define DC_C digitalWrite(TFT_DC, LOW); #define DC_D digitalWrite(TFT_DC, HIGH); #else @@ -150,8 +165,13 @@ #define DC_C WAIT_FOR_STALL; \ tft_pio->sm[pio_sm].instr = pio_instr_clr_dc - // Flush has happened before this and mode changed back to 16 bit - #define DC_D tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #ifndef RM68120_DRIVER + // Flush has happened before this and mode changed back to 16-bit + #define DC_D tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #else + // Need to wait for stall since RM68120 commands are 16-bit + #define DC_D WAIT_FOR_STALL; tft_pio->sm[pio_sm].instr = pio_instr_set_dc + #endif #endif #endif @@ -163,7 +183,7 @@ #define CS_H // No macro allocated so it generates no code #else #if !defined (RP2040_PIO_INTERFACE) // SPI - #if defined (RPI_DISPLAY_TYPE) + #if defined (RPI_DISPLAY_TYPE) && !defined (MHS_DISPLAY_TYPE) #define CS_L digitalWrite(TFT_CS, LOW); #define CS_H digitalWrite(TFT_CS, HIGH); #else @@ -237,7 +257,7 @@ //////////////////////////////////////////////////////////////////////////////////////// #if !defined (RP2040_PIO_INTERFACE) // SPI - #if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour + #if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour // Write 8 bits to TFT #define tft_Write_8(C) spi_get_hw(SPI_X)->dr = (uint32_t)(C); \ @@ -247,17 +267,17 @@ #define tft_Write_8N(B) while (!spi_is_writable(SPI_X)){}; \ spi_get_hw(SPI_X)->dr = (uint8_t)(B) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16(C) tft_Write_8N(((C) & 0xF800)>>8); \ tft_Write_8N(((C) & 0x07E0)>>3); \ tft_Write_8N(((C) & 0x001F)<<3) - // Convert 16 bit colour to 18 bit and write in 3 bytes + // Convert 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16N(C) tft_Write_8N(((C) & 0xF800)>>8); \ tft_Write_8N(((C) & 0x07E0)>>3); \ tft_Write_8N(((C) & 0x001F)<<3) - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes + // Convert swapped byte 16-bit colour to 18-bit and write in 3 bytes #define tft_Write_16S(C) tft_Write_8N((C) & 0xF8); \ tft_Write_8N(((C) & 0xE000)>>11 | ((C) & 0x07)<<5); \ tft_Write_8N(((C) & 0x1F00)>>5) @@ -283,7 +303,28 @@ // Macros to write commands/pixel colour data to other displays //////////////////////////////////////////////////////////////////////////////////////// #else - #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers + #if defined (MHS_DISPLAY_TYPE) // High speed RPi TFT type always needs 16-bit transfers + // This swaps to 16-bit mode, used for commands so wait avoids clash with DC timing + #define tft_Write_8(C) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); \ + spi_get_hw(SPI_X)->dr = (uint32_t)((C) | ((C)<<8)); \ + while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ + + // Note: the following macros do not wait for the end of transmission + + #define tft_Write_16(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16N(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_16S(C) while (!spi_is_writable(SPI_X)){}; spi_get_hw(SPI_X)->dr = (uint32_t)(C)<<8 | (C)>>8 + + #define tft_Write_32(C) spi_get_hw(SPI_X)->dr = (uint32_t)((C)>>16); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #define tft_Write_32C(C,D) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(D) + + #define tft_Write_32D(C) spi_get_hw(SPI_X)->dr = (uint32_t)(C); spi_get_hw(SPI_X)->dr = (uint32_t)(C) + + #elif defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers #define tft_Write_8(C) spi.transfer(C); spi.transfer(C) #define tft_Write_16(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) #define tft_Write_16N(C) spi.transfer((uint8_t)((C)>>8));spi.transfer((uint8_t)((C)>>0)) @@ -307,7 +348,7 @@ #elif defined (ILI9225_DRIVER) // Needs gaps between commands + data bytes, so use slower transfer functions - // Warning: these all end in 8 bit SPI mode! + // Warning: these all end in 8-bit SPI mode! #define tft_Write_8(C) spi.transfer(C); #define tft_Write_16(C) spi.transfer16(C) @@ -324,7 +365,7 @@ #else - // This swaps to 8 bit mode, then back to 16 bit mode + // This swaps to 8-bit mode, then back to 16-bit mode #define tft_Write_8(C) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; \ hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); \ spi_get_hw(SPI_X)->dr = (uint32_t)(C); \ @@ -348,7 +389,7 @@ #endif // RPI_DISPLAY_TYPE #endif -#else // Parallel 8 bit or PIO SPI +#else // Parallel 8-bit or PIO SPI // Wait for the PIO to stall (SM pull request finds no data in TX FIFO) // This is used to detect when the SM is idle and hence ready for a jump instruction @@ -370,17 +411,17 @@ #define TX_FIFO tft_pio->txf[pio_sm] // Temporary - to be deleted - #define dir_mask 0 + #define GPIO_DIR_MASK 0 - #if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour - // This writes 8 bits, then switches back to 16 bit mode automatically + #if defined (SPI_18BIT_DRIVER) || defined (SSD1963_DRIVER) // 18-bit colour (3 bytes) + // This writes 8 bits, then switches back to 16-bit mode automatically // Have already waited for pio stalled (last data write complete) when DC switched to command mode // The wait for stall allows DC to be changed immediately afterwards #define tft_Write_8(C) tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ TX_FIFO = (C); \ WAIT_FOR_STALL - // Used to send last byte for 32 bit macros below since PIO sends 24 bits + // Used to send last byte for 32-bit macros below since PIO sends 24 bits #define tft_Write_8L(C) WAIT_FOR_STALL; \ tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ TX_FIFO = (C) @@ -400,14 +441,14 @@ #define tft_Write_32D(C) WAIT_FOR_FIFO_FREE(2); TX_FIFO = (((C)<<8) | ((C)>>8)); tft_Write_8L(C) #else // PIO interface, SPI or parallel - // This writes 8 bits, then switches back to 16 bit mode automatically + // This writes 8 bits, then switches back to 16-bit mode automatically // Have already waited for pio stalled (last data write complete) when DC switched to command mode // The wait for stall allows DC to be changed immediately afterwards #if defined (TFT_PARALLEL_8_BIT) || defined (RP2040_PIO_SPI) #define tft_Write_8(C) tft_pio->sm[pio_sm].instr = pio_instr_jmp8; \ TX_FIFO = (C); \ WAIT_FOR_STALL - #else // For 16 bit parallel 16 bits are always sent + #else // For 16-bit parallel 16 bits are always sent #define tft_Write_8(C) TX_FIFO = (C); \ WAIT_FOR_STALL #endif diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.c b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.c similarity index 90% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.c rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.c index 9fcd0137..a74dcbc2 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.c +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.c @@ -24,9 +24,6 @@ DMA_HandleTypeDef dmaHal; #endif - // Buffer for SPI transmit byte padding and byte order manipulation - uint8_t spiBuffer[8]; - //////////////////////////////////////////////////////////////////////////////////////// #if defined (TFT_SDA_READ) && !defined (TFT_PARALLEL_8_BIT) //////////////////////////////////////////////////////////////////////////////////////// @@ -76,7 +73,7 @@ void TFT_eSPI::end_SDA_Read(void) //////////////////////////////////////////////////////////////////////////////////////// -#if defined (TFT_PARALLEL_8_BIT) // Code for STM32 8 bit parallel +#if defined (TFT_PARALLEL_8_BIT) // Code for STM32 8-bit parallel //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -286,7 +283,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) } //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -296,34 +293,19 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) #define BUF_SIZE 240*3 void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) { - uint8_t col[BUF_SIZE]; + //uint8_t col[BUF_SIZE]; // Always using swapped bytes is a peculiarity of this function... //color = color>>8 | color<<8; uint8_t r = (color & 0xF800)>>8; // Red uint8_t g = (color & 0x07E0)>>3; // Green uint8_t b = (color & 0x001F)<<3; // Blue - if (len=BUF_SIZE/3 ) ; - // Send remaining pixels - if (len) HAL_SPI_Transmit(&spiHal, col, len*3, HAL_MAX_DELAY); //*/ + SPI_BUSY_CHECK; } /*************************************************************************************** ** Function name: pushPixels - for STM32 and 3 byte RGB display @@ -333,30 +315,29 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) { uint16_t *data = (uint16_t*)data_in; - if(_swapBytes) { + if(!_swapBytes) { while ( len-- ) { // Split out the colours - spiBuffer[0] = (*data & 0xF8); // Red - spiBuffer[1] = (*data & 0xE000)>>11 | (*data & 0x07)<<5; // Green - spiBuffer[2] = (*data & 0x1F00)>>5; // Blue + TX_FIFO = (*data & 0xF8); // Red + TX_FIFO = (*data & 0xE000)>>11 | (*data & 0x07)<<5; // Green + TX_FIFO = (*data & 0x1F00)>>5; // Blue data++; - HAL_SPI_Transmit(&spiHal, spiBuffer, 3, HAL_MAX_DELAY); } } else { while ( len-- ) { // Split out the colours - spiBuffer[0] = (*data & 0xF800)>>8; // Red - spiBuffer[1] = (*data & 0x07E0)>>3; // Green - spiBuffer[2] = (*data & 0x001F)<<3; // Blue + TX_FIFO = (*data & 0xF800)>>8; // Red + TX_FIFO = (*data & 0x07E0)>>3; // Green + TX_FIFO = (*data & 0x001F)<<3; // Blue data++; - HAL_SPI_Transmit(&spiHal, spiBuffer, 3, HAL_MAX_DELAY); } } + SPI_BUSY_CHECK; } //////////////////////////////////////////////////////////////////////////////////////// -#else // Standard SPI 16 bit colour TFT All Tested +#else // Standard SPI 16-bit colour TFT All Tested //////////////////////////////////////////////////////////////////////////////////////// /*************************************************************************************** @@ -364,6 +345,7 @@ void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) ** Description: Write a block of pixels of the same colour ***************************************************************************************/ #define BUF_SIZE 480 +/* void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) { uint16_t col[BUF_SIZE]; @@ -381,7 +363,47 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) len -= BUF_SIZE; } while ( len>=BUF_SIZE ) ; // Send remaining pixels - if (len) HAL_SPI_Transmit(&spiHal, (uint8_t*)col, len<<1, HAL_MAX_DELAY); //*/ + if (len) HAL_SPI_Transmit(&spiHal, (uint8_t*)col, len<<1, HAL_MAX_DELAY); +} + //*/ +void TFT_eSPI::pushBlock(uint16_t color, uint32_t len){ + // Loop unrolling improves speed dramatically graphics test 0.634s => 0.374s + while (len>31) { + #if !defined (SSD1963_DRIVER) + // 32D macro writes 16 bits twice + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=32; + } + + while (len>7) { + #if !defined (SSD1963_DRIVER) + tft_Write_32D(color); tft_Write_32D(color); + tft_Write_32D(color); tft_Write_32D(color); + #else + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); tft_Write_16(color); + #endif + len-=8; + } + + while (len--) {tft_Write_16(color);} } @@ -392,26 +414,23 @@ void TFT_eSPI::pushBlock(uint16_t color, uint32_t len) void TFT_eSPI::pushPixels(const void* data_in, uint32_t len) { uint16_t *data = (uint16_t*)data_in; + if(_swapBytes) { - uint16_t col[BUF_SIZE]; // Buffer for swapped bytes - while ( len>=BUF_SIZE ) { - for (uint32_t i = 0; i < BUF_SIZE; i++) { col[i] = (*data>>8) | (*data<<8); data++; } - HAL_SPI_Transmit(&spiHal, (uint8_t*)col, BUF_SIZE<<1, HAL_MAX_DELAY); - len -= BUF_SIZE; + while ( len-- ) { + TX_FIFO = (uint8_t)(*data>>8); + TX_FIFO = (uint8_t)(*data); + data++; } - for (uint32_t i = 0; i < len; i++) { col[i] = (*data>>8) | (*data<<8); data++; } - HAL_SPI_Transmit(&spiHal, (uint8_t*)col, len<<1, HAL_MAX_DELAY); } else { - // HAL byte count for transmit is only 16 bits maximum so to avoid this constraint - // transfers of small blocks are performed until HAL capacity is reached. - while(len>0x7FFF) { // Transfer 16 bit pixels in blocks if len*2 over 65534 bytes - HAL_SPI_Transmit(&spiHal, (uint8_t*)data, 0x800<<1, HAL_MAX_DELAY); - len -= 0x800; data+= 0x800; // Arbitrarily use 2KByte blocks + while ( len-- ) { + // Split out the colours + TX_FIFO = (uint8_t)(*data); + TX_FIFO = (uint8_t)(*data>>8); + data++; } - // Send remaining pixels (max 65534 bytes) - HAL_SPI_Transmit(&spiHal, (uint8_t*)data, len<<1, HAL_MAX_DELAY); } + SPI_BUSY_CHECK; } //////////////////////////////////////////////////////////////////////////////////////// @@ -527,7 +546,7 @@ void TFT_eSPI::pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t // small transfers are performed using a blocking call until DMA capacity is reached. // User sketch can prevent blocking by managing pixel count and splitting into blocks // of 32767 pixels maximum. (equivalent to an area of ~320 x 100 pixels) - while(len>0x7FFF) { // Transfer 16 bit pixels in blocks if len*2 over 65534 bytes + while(len>0x7FFF) { // Transfer 16-bit pixels in blocks if len*2 over 65534 bytes HAL_SPI_Transmit(&spiHal, (uint8_t*)buffer, 0x800<<1, HAL_MAX_DELAY); len -= 0x800; buffer+= 0x800; // Arbitrarily send 1K pixel blocks (2Kbytes) } @@ -598,6 +617,8 @@ bool TFT_eSPI::initDMA(bool ctrl_cs) HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); // Enable DMA end interrupt handler #elif (TFT_SPI_PORT == 2) HAL_NVIC_EnableIRQ(DMA1_Stream4_IRQn); // Enable DMA end interrupt handler + #elif (TFT_SPI_PORT == 3) + HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn); #endif __HAL_LINKDMA(&spiHal, hdmatx, dmaHal); // Attach DMA engine to SPI peripheral diff --git a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.h b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.h similarity index 91% rename from libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.h rename to libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.h index 2b23a585..73a22cbf 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/TFT_eSPI_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/TFT_eSPI_STM32.h @@ -151,6 +151,15 @@ #define TFT_SPI_PORT 1 #endif + #if (TFT_SPI_PORT == 1) + #define SPIX SPI1 + #elif (TFT_SPI_PORT == 2) + #define SPIX SPI2 + #elif (TFT_SPI_PORT == 3) + #define SPIX SPI3 + #elif (TFT_SPI_PORT == 4) + #define SPIX SPI4 + #endif // Global define is _VARIANT_ARDUINO_STM32_, see board package stm32_def.h for specific variants #if defined (STM32F2xx) || defined (STM32F4xx) || defined (STM32F7xx) @@ -226,8 +235,8 @@ #define DC_PORT digitalPinToPort(TFT_DC) #define DC_PIN_MASK digitalPinToBitMask(TFT_DC) // Use bit set reset register - #define DC_C DC_PORT->BSRR = DC_PIN_MASK<<16 - #define DC_D DC_PORT->BSRR = DC_PIN_MASK + #define DC_C DC_DELAY; DC_PORT->BSRR = DC_PIN_MASK<<16 + #define DC_D DC_DELAY; DC_PORT->BSRR = DC_PIN_MASK #endif //////////////////////////////////////////////////////////////////////////////////////// @@ -306,7 +315,7 @@ #if defined (TFT_PARALLEL_8_BIT) // Mask for the 8 data bits to set pin directions (not used) - #define dir_mask 0 + #define GPIO_DIR_MASK 0 #define PARALLEL_INIT_TFT_DATA_BUS // None @@ -401,7 +410,7 @@ #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) - // Create bit set/reset mask for top byte of 16 bit value B + // Create bit set/reset mask for top byte of 16-bit value B #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) @@ -420,7 +429,7 @@ #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT (untested) + // Write 18-bit color to TFT (untested) #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ GPIOA->BSRR = D0_BSR_MASK(r6) | D2_BSR_MASK(r6) | D7_BSR_MASK(r6); \ WR_L; \ @@ -438,7 +447,7 @@ GPIOB->BSRR = D3_BSR_MASK(b6) | D4_BSR_MASK(b6) | D5_BSR_MASK(b6) | D6_BSR_MASK(b6); \ WR_STB // Need to slow down strobe - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else @@ -454,7 +463,7 @@ GPIOB->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ WR_STB // Need to slow down strobe - // 16 bit write with swapped bytes + // 16-bit write with swapped bytes #define tft_Write_16S(C) GPIOA->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D7_BSR_MASK(C); \ WR_L; \ GPIOC->BSRR = D1_BSR_MASK(C); \ @@ -541,7 +550,7 @@ #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) - // Create bit set/reset mask for top byte of 16 bit value B + // Create bit set/reset mask for top byte of 16-bit value B #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) @@ -561,7 +570,7 @@ #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT (untested) + // Write 18-bit color to TFT (untested) #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ GPIOF->BSRR = D0_BSR_MASK(r6) | D2_BSR_MASK(r6) | D4_BSR_MASK(r6) | D7_BSR_MASK(r6); \ WR_L; \ @@ -579,7 +588,7 @@ GPIOE->BSRR = D3_BSR_MASK(b6) | D5_BSR_MASK(b6) | D6_BSR_MASK(b6); \ WR_STB // Need to slow down strobe - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else @@ -596,7 +605,7 @@ GPIOE->BSRR = D3_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ WR_STB - // 16 bit write with swapped bytes + // 16-bit write with swapped bytes #define tft_Write_16S(C) GPIOF->BSRR = D0_BSR_MASK(C) | D2_BSR_MASK(C) | D4_BSR_MASK(C) | D7_BSR_MASK(C); \ WR_L; \ GPIOD->BSRR = D1_BSR_MASK(C); \ @@ -659,7 +668,7 @@ #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) - // Create bit set/reset mask for top byte of 16 bit value B + // Create bit set/reset mask for top byte of 16-bit value B #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) @@ -692,7 +701,7 @@ GPIOE->BSRR = D3_BSR_MASK(C) | D4_BSR_MASK(C) | D5_BSR_MASK(C) | D6_BSR_MASK(C); \ WR_STB - // 16 bit write with swapped bytes + // 16-bit write with swapped bytes #define tft_Write_16S(C) GPIOF->BSRR = D0_BSR_MASK(C); \ GPIOG->BSRR = D2_BSR_MASK(C) | D7_BSR_MASK(C); \ WR_L; \ @@ -743,14 +752,14 @@ #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT (untested) + // Write 18-bit color to TFT (untested) #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ GPIOX->BSRR = (0x00FF0000 | (uint8_t)(r6)); WR_L; WR_STB; \ GPIOX->BSRR = (0x00FF0000 | (uint8_t)(g6)); WR_L; WR_STB; \ GPIOX->BSRR = (0x00FF0000 | (uint8_t)(b6)); WR_L; WR_STB - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else @@ -759,7 +768,7 @@ #define tft_Write_16(C) GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>8)); WR_L; WR_STB; \ GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>0)); WR_L; WR_STB - // 16 bit write with swapped bytes + // 16-bit write with swapped bytes #define tft_Write_16S(C) GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>0)); WR_L; WR_STB; \ GPIOX->BSRR = (0x00FF0000 | (uint8_t)(C>>8)); WR_L; WR_STB #endif @@ -832,7 +841,7 @@ #define D5_BSR_MASK(B) ((D5_PIN_MASK<<16)>>(((B)>> 1)&0x10)) #define D6_BSR_MASK(B) ((D6_PIN_MASK<<16)>>(((B)>> 2)&0x10)) #define D7_BSR_MASK(B) ((D7_PIN_MASK<<16)>>(((B)>> 3)&0x10)) - // Create bit set/reset mask for top byte of 16 bit value B + // Create bit set/reset mask for top byte of 16-bit value B #define D8_BSR_MASK(B) ((D0_PIN_MASK<<16)>>(((B)>> 4)&0x10)) #define D9_BSR_MASK(B) ((D1_PIN_MASK<<16)>>(((B)>> 5)&0x10)) #define D10_BSR_MASK(B) ((D2_PIN_MASK<<16)>>(((B)>> 6)&0x10)) @@ -857,7 +866,7 @@ #if defined (SSD1963_DRIVER) - // Write 18 bit color to TFT (untested) + // Write 18-bit color to TFT (untested) #define tft_Write_16(C) r6 = (((C) & 0xF800)>> 8); g6 = (((C) & 0x07E0)>> 3); b6 = (((C) & 0x001F)<< 3); \ D0_PIN_PORT->BSRR = D8_BSR_MASK(r6); \ D1_PIN_PORT->BSRR = D9_BSR_MASK(r6); \ @@ -890,7 +899,7 @@ D7_PIN_PORT->BSRR = D7_BSR_MASK(b6); \ WR_STB - // 18 bit color write with swapped bytes + // 18-bit color write with swapped bytes #define tft_Write_16S(C) Cswap = ((C) >>8 | (C) << 8); tft_Write_16(Cswap) #else @@ -917,7 +926,7 @@ D7_PIN_PORT->BSRR = D7_BSR_MASK(C); \ WR_STB - // 16 bit write with swapped bytes + // 16-bit write with swapped bytes #define tft_Write_16S(C) D0_PIN_PORT->BSRR = D0_BSR_MASK(C); \ D1_PIN_PORT->BSRR = D1_BSR_MASK(C); \ D2_PIN_PORT->BSRR = D2_BSR_MASK(C); \ @@ -960,66 +969,58 @@ //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI ILI948x TFT //////////////////////////////////////////////////////////////////////////////////////// -#elif defined (SPI_18BIT_DRIVER) // SPI 18 bit colour +#elif defined (SPI_18BIT_DRIVER) // SPI 18-bit colour - // Write 8 bits to TFT - #define tft_Write_8(C) \ - { spiBuffer[0] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 1, 10); } + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) - // Convert 16 bit colour to 18 bit and write in 3 bytes - #define tft_Write_16(C) \ - { spiBuffer[0] = ((C) & 0xF800)>>8; spiBuffer[1] = ((C) & 0x07E0)>>3; spiBuffer[2] = ((C) & 0x001F)<<3; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 3, 10); } + //#define tft_Write_8(C) spi.transfer(C) + #define tft_Write_8(C) TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = ((C) & 0xF800)>>8; TX_FIFO = ((C) & 0x07E0)>>3; TX_FIFO = ((C) & 0x001F)<<3; SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C) & 0xF8; TX_FIFO = ((C) & 0xE000)>>11 | ((C) & 0x07)<<5; TX_FIFO = ((C) & 0x1F00)>>5; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = ((C) & 0xF800)>>8; TX_FIFO = ((C) & 0x07E0)>>3; TX_FIFO = ((C) & 0x001F)<<3 - // Convert swapped byte 16 bit colour to 18 bit and write in 3 bytes - #define tft_Write_16S(C) \ - { spiBuffer[0] = (C) & 0xF8; spiBuffer[1] = ((C) & 0xE000)>>11 | ((C) & 0x07)<<5; spiBuffer[2] = ((C) & 0x1F00)>>5; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 3, 10); } - - // Write 32 bits to TFT #define tft_Write_32(C) \ - { spiBuffer[0] = (C)>>24; spiBuffer[1] = (C)>>16; spiBuffer[2] = (C)>>8; spiBuffer[3] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK - // Write two address coordinates #define tft_Write_32C(C,D) \ - { spiBuffer[0] = (C)>>8; spiBuffer[1] = C; spiBuffer[2] = (D)>>8; spiBuffer[3] = D; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + TX_FIFO = (D)>>8; TX_FIFO = (D); SPI_BUSY_CHECK - // Write same value twice #define tft_Write_32D(C) \ - { spiBuffer[0] = spiBuffer[2] = (C)>>8; spiBuffer[1] = spiBuffer[3] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK //////////////////////////////////////////////////////////////////////////////////////// // Macros to write commands/pixel colour data to a SPI Raspberry Pi TFT //////////////////////////////////////////////////////////////////////////////////////// #elif defined (RPI_DISPLAY_TYPE) - #define tft_Write_8(C) \ - { spiBuffer[0] = 0; spiBuffer[1] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 2, 10); } + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) - #define tft_Write_16(C) \ - { spiBuffer[0] = (C)>>8; spiBuffer[1] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 2, 10); } - - #define tft_Write_16S(C) \ - { spiBuffer[0] = C; spiBuffer[1] = (C)>>8; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 2, 10); } + //#define tft_Write_8(C) spi.transfer(C) + #define tft_Write_8(C) TX_FIFO = (0); TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C); TX_FIFO = (C)>>8; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = (C)>>8; TX_FIFO = (C) #define tft_Write_32(C) \ - { spiBuffer[0] = (C)>>24; spiBuffer[1] = (C)>>16; spiBuffer[2] = (C)>>8; spiBuffer[3] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK #define tft_Write_32C(C,D) \ - { spiBuffer[1] = ((C)>>8); spiBuffer[3] = (C); spiBuffer[5] = ((D)>>8); spiBuffer[7] = D; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 8, 10); } + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); \ + TX_FIFO = (0); TX_FIFO = (D)>>8; TX_FIFO = (0); TX_FIFO = (D); SPI_BUSY_CHECK #define tft_Write_32D(C) \ - { spiBuffer[1] = ((C)>>8); spiBuffer[3] = (C); spiBuffer[5] = ((C)>>8); spiBuffer[7] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 8, 10); } + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); \ + TX_FIFO = (0); TX_FIFO = (C)>>8; TX_FIFO = (0); TX_FIFO = (C); SPI_BUSY_CHECK //////////////////////////////////////////////////////////////////////////////////////// // Macros for all other SPI displays @@ -1027,37 +1028,37 @@ #else - #if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER) - // Temporary workaround for issue #510 part 2 - #define tft_Write_8(C) spi.transfer(C) - #else - #define tft_Write_8(C) \ - { spiBuffer[0] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 1, 10); delayMicroseconds(1);} - #endif + //#define DC_DELAY delayMicroseconds(1) // Premature BSY clear Hardware bug? - #define tft_Write_16(C) \ - { spiBuffer[0] = (C)>>8; spiBuffer[1] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 2, 10); } + #define SPI_TXE_CHECK while(!__HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_TXE)){} + //BSY check must allow for APB clock delay by checking TXE flag first + #define SPI_BUSY_CHECK SPI_TXE_CHECK; while( __HAL_SPI_GET_FLAG(&spiHal, SPI_FLAG_BSY)){} + #define TX_FIFO SPI_TXE_CHECK; *((__IO uint8_t *)&SPIX->DR) - #define tft_Write_16S(C) \ - { spiBuffer[0] = C; spiBuffer[1] = (C)>>8; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 2, 10); } + #define tft_Write_8(C) TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16(C) TX_FIFO = (C)>>8; TX_FIFO = (C); SPI_BUSY_CHECK + #define tft_Write_16S(C) TX_FIFO = (C); TX_FIFO = (C)>>8; SPI_BUSY_CHECK + #define tft_Write_16N(C) TX_FIFO = (C)>>8; TX_FIFO = (C) #define tft_Write_32(C) \ - { spiBuffer[0] = (C)>>24; spiBuffer[1] = (C)>>16; spiBuffer[2] = (C)>>8; spiBuffer[3] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>24; TX_FIFO = (C)>>16; \ + tft_Write_16((uint16_t) ((C)>>0)) #define tft_Write_32C(C,D) \ - { spiBuffer[0] = (C)>>8; spiBuffer[1] = C; spiBuffer[2] = (D)>>8; spiBuffer[3] = D; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + tft_Write_16((uint16_t) (D)) #define tft_Write_32D(C) \ - { spiBuffer[0] = spiBuffer[2] = (C)>>8; spiBuffer[1] = spiBuffer[3] = C; \ - HAL_SPI_Transmit(&spiHal, spiBuffer, 4, 10); } + TX_FIFO = (C)>>8; TX_FIFO = (C); \ + tft_Write_16((uint16_t) (C)) #endif +#ifndef DC_DELAY + //#define DC_DELAY delayMicroseconds(1) // Premature BSY clear hardware bug? + #define DC_DELAY +#endif + #ifndef tft_Write_16N #define tft_Write_16N tft_Write_16 #endif diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio.h b/libraries/TFT_eSPI-2.5.43/Processors/pio_16bit_parallel.pio.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio.h rename to libraries/TFT_eSPI-2.5.43/Processors/pio_16bit_parallel.pio.h index 6d792f0c..655c1b13 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_16bit_parallel.pio.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/pio_16bit_parallel.pio.h @@ -1,5 +1,6 @@ // -------------------------------------------------- // // This file is autogenerated by pioasm; do not edit! // +// 16-bit parallel // // -------------------------------------------------- // #pragma once @@ -14,7 +15,6 @@ #define tft_io_wrap_target 7 #define tft_io_wrap 20 - #define tft_io_offset_block_fill 0u #define tft_io_offset_start_8 7u #define tft_io_offset_start_tx 7u diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio.h b/libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel.pio.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio.h rename to libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel.pio.h index 5bae33ea..b5d6a8cd 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_8bit_parallel.pio.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel.pio.h @@ -1,5 +1,6 @@ // -------------------------------------------------- // // This file is autogenerated by pioasm; do not edit! // +// 8-bit parallel // // -------------------------------------------------- // #pragma once diff --git a/libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel_18bpp.pio.h b/libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel_18bpp.pio.h new file mode 100644 index 00000000..b2aaff45 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/Processors/pio_8bit_parallel_18bpp.pio.h @@ -0,0 +1,73 @@ +// -------------------------------------------------- // +// This file is autogenerated by pioasm; do not edit! // +// -------------------------------------------------- // + +#pragma once + +#if !PICO_NO_HARDWARE +#include "hardware/pio.h" +#endif + +// ------ // +// tft_io // +// ------ // + +#define tft_io_wrap_target 11 +#define tft_io_wrap 31 + +#define tft_io_offset_block_fill 0u +#define tft_io_offset_start_tx 11u +#define tft_io_offset_start_8 18u +#define tft_io_offset_set_addr_window 21u + +static const uint16_t tft_io_program_instructions[] = { + 0x98a0, // 0: pull block side 1 + 0xa027, // 1: mov x, osr + 0x80a0, // 2: pull block + 0xa047, // 3: mov y, osr + 0xb8e1, // 4: mov osr, x side 1 + 0x7110, // 5: out pins, 16 side 0 [1] + 0xb942, // 6: nop side 1 [1] + 0x7108, // 7: out pins, 8 side 0 [1] + 0xb942, // 8: nop side 1 [1] + 0x7108, // 9: out pins, 8 side 0 [1] + 0x1884, // 10: jmp y--, 4 side 1 + // .wrap_target + 0x98a0, // 11: pull block side 1 + 0x7110, // 12: out pins, 16 side 0 [1] + 0xb942, // 13: nop side 1 [1] + 0x7108, // 14: out pins, 8 side 0 [1] + 0xb942, // 15: nop side 1 [1] + 0x7108, // 16: out pins, 8 side 0 [1] + 0x180b, // 17: jmp 11 side 1 + 0x98a0, // 18: pull block side 1 + 0x7100, // 19: out pins, 32 side 0 [1] + 0x180b, // 20: jmp 11 side 1 + 0xf822, // 21: set x, 2 side 1 + 0xe000, // 22: set pins, 0 + 0x80a0, // 23: pull block + 0x7000, // 24: out pins, 32 side 0 + 0x003e, // 25: jmp !x, 30 + 0x98a0, // 26: pull block side 1 + 0xe001, // 27: set pins, 1 + 0x7108, // 28: out pins, 8 side 0 [1] + 0x19fc, // 29: jmp !osre, 28 side 1 [1] + 0x1856, // 30: jmp x--, 22 side 1 + 0xe001, // 31: set pins, 1 + // .wrap +}; + +#if !PICO_NO_HARDWARE +static const struct pio_program tft_io_program = { + .instructions = tft_io_program_instructions, + .length = 32, + .origin = -1, +}; + +static inline pio_sm_config tft_io_program_get_default_config(uint offset) { + pio_sm_config c = pio_get_default_sm_config(); + sm_config_set_wrap(&c, offset + tft_io_wrap_target, offset + tft_io_wrap); + sm_config_set_sideset(&c, 2, true, false); + return c; +} +#endif diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio.h b/libraries/TFT_eSPI-2.5.43/Processors/pio_SPI.pio.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio.h rename to libraries/TFT_eSPI-2.5.43/Processors/pio_SPI.pio.h index 6aa724d1..0848529b 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI.pio.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/pio_SPI.pio.h @@ -1,5 +1,6 @@ // -------------------------------------------------- // // This file is autogenerated by pioasm; do not edit! // +// 8 + 16-bit SPI - no auto colour conversion // // -------------------------------------------------- // #pragma once diff --git a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio.h b/libraries/TFT_eSPI-2.5.43/Processors/pio_SPI_18bit.pio.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio.h rename to libraries/TFT_eSPI-2.5.43/Processors/pio_SPI_18bit.pio.h index bd13a660..09bbfeb0 100644 --- a/libraries/TFT_eSPI-2.4.72/Processors/pio_SPI_18bit.pio.h +++ b/libraries/TFT_eSPI-2.5.43/Processors/pio_SPI_18bit.pio.h @@ -1,5 +1,6 @@ // -------------------------------------------------- // // This file is autogenerated by pioasm; do not edit! // +// 8 + 18-bit SPI - no auto colour conversion // // -------------------------------------------------- // #pragma once diff --git a/libraries/TFT_eSPI-2.4.72/README.md b/libraries/TFT_eSPI-2.5.43/README.md similarity index 58% rename from libraries/TFT_eSPI-2.4.72/README.md rename to libraries/TFT_eSPI-2.5.43/README.md index 6e5200ee..0c0c15bc 100644 --- a/libraries/TFT_eSPI-2.4.72/README.md +++ b/libraries/TFT_eSPI-2.5.43/README.md @@ -1,10 +1,28 @@ A ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) facility has been added for Q&A etc. Use the ["Issues"](https://github.com/Bodmer/TFT_eSPI/issues) tab only for problems with the library. Thanks! # News -1. Support has been added in v2.4.70 for the RP2040 with 16 bit parallel displays. This has been tested and the screen update performance is very good (4ms to clear 320 x 480 screen with HC8357C). The use of the RP2040 PIO makes it easy to change the write cycle timing for different displays. DMA with 16 bit transfers is also supported. +1. The Create_font Processing sketch has been updated to automatically create a complete C header file. The automatic opening of the font folder can also be disabled within the Processing sketch. (Thanks to Pierre-Loup Martin). -2. Support for HX8357B and HX8357C screens has been added (only tested with RP2040 and 16 bit parallel interface) +2. New board setup files have been added for the Seeed XIAO with round display, LilyGo T-Embed S3, LilyGo_T_QT_Pro_S3, ESP32 S3 Box and ESP32_S3_Box_Lite. The "RPi" interface style boards are now supported with the ESP32 S3. -3. Support for the ESP32-S2, ESP32-S3 and ESP32-C3 has been added (DMA not supported at the moment). Tested with v2.0.3 RC1 of the ESP32 board package. Example setups: +3. New functions have been added to draw smooth (antialiased) arcs, circles, and rounded rectangle outlines. New sketches are provided in the "Smooth Graphics" examples folder. Arcs can be drawn with or without anti-aliasing (which will then render faster). The arc ends can be straight or rounded. The arc drawing algorithm uses an optimised fixed point sqrt() function to improve performance on processors that do not have a hardware Floating Point Unit (e.g. RP2040). Here are two demo images, on the left smooth (anti-aliased) arcs with rounded ends, the image to the right is the same resolution (grabbed from the same 240x240 TFT) with the smoothing diasbled (no anti-aliasing): + + ![arcs](https://github.com/Bodmer/Github-images/blob/main/aa_arc_240x240.png) ![pixelated_arcs](https://github.com/Bodmer/Github-images/blob/main/no_aa_arc_240x240.png) + + Here the smooth arcs have been used to create anti-aliased meter gauges on a 320x240 TFT: + + ![arcs](https://github.com/Bodmer/Github-images/blob/main/xarc_meters_320x240.png) + +4. An excellent new compatible library is available which can render TrueType fonts on a TFT screen (or into a sprite). This has been developed by [takkaO](https://github.com/takkaO/OpenFontRender). The library provides access to compact font files, with fully scaleable anti-aliased glyphs. Left, middle and right justified text can also be printed to the screen. I have added TFT_eSPI specific examples to the OpenFontRender library and tested on RP2040 and ESP32 processors, the ESP8266 does not have sufficient RAM due to the glyph render complexity. Here is a demo screen where a single 12kbyte font file binary was used to render fully anti-aliased glyphs of gradually increasing size on a 320x480 TFT screen: + + ![ttf_font_demo](https://i.imgur.com/bKkilIb.png) + +5. New GUI examples have been added for sliders, buttons, graphs and meters. These examples require a new support library here: + + [TFT_eWidget](https://github.com/Bodmer/TFT_eWidget) + +6. Support has been added in v2.4.70 for the RP2040 with 16-bit parallel displays. This has been tested and the screen update performance is very good (4ms to clear 320 x 480 screen with HC8357C). The use of the RP2040 PIO makes it easy to change the write cycle timing for different displays. DMA with 16-bit transfers is also supported. + +7. Support for the ESP32-S2, ESP32-S3 and ESP32-C3 has been added (DMA only on ESP32 S3 at the moment). Tested with v2.0.3 RC1 of the ESP32 board package. Example setups: [Setup70_ESP32_S2_ILI9341.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70_ESP32_S2_ILI9341.h) @@ -14,20 +32,18 @@ A ["Discussions"](https://github.com/Bodmer/TFT_eSPI/discussions) facility has b [Setup70d_ILI9488_S3_Parallel.h](https://github.com/Bodmer/TFT_eSPI/blob/master/User_Setups/Setup70d_ILI9488_S3_Parallel.h) -4. Smooth fonts can now be rendered direct to the TFT with very little flicker for quickly changing values. This is achieved by a line-by-line and block-by-block update of the glyph area without drawing pixels twice. This is a "breaking" change for some sketches because a new true/false parameter is needed to render the background. The default is false if the parameter is missing, Examples: +8. Smooth fonts can now be rendered direct to the TFT with very little flicker for quickly changing values. This is achieved by a line-by-line and block-by-block update of the glyph area without drawing pixels twice. This is a "breaking" change for some sketches because a new true/false parameter is needed to render the background. The default is false if the parameter is missing, Examples: tft.setTextColor(TFT_WHITE, TFT_BLUE, true); spr.setTextColor(TFT_BLUE, TFT_BLACK, true); Note: background rendering for Smooth fonts is also now available when using the print stream e.g. with: tft.println("Hello World"); -5. New anti-aliased graphics functions to draw lines, wedge shaped lines, circles and rounded rectangles. [Examples are included](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics). Examples have also been added to [display PNG compressed images](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images) (note: requires ~40kbytes RAM). +9. New anti-aliased graphics functions to draw lines, wedge shaped lines, circles and rounded rectangles. [Examples are included](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/Smooth%20Graphics). Examples have also been added to [display PNG compressed images](https://github.com/Bodmer/TFT_eSPI/tree/master/examples/PNG%20Images) (note: requires ~40kbytes RAM). -6. Frank Boesing has created an extension library for TFT_eSPI that allows a large range of ready-built fonts to be used. Frank's library (adapted to permit rendering in sprites as well as TFT) can be [downloaded here](https://github.com/Bodmer/TFT_eSPI_ext). More than 3300 additional Fonts are [available here](https://github.com/FrankBoesing/fonts/tree/master/ofl). The TFT_eSPI_ext library contains examples that demonstrate the use of the fonts. +10. Users of PowerPoint experienced with running macros may be interested in the [pptm sketch generator here](https://github.com/Bodmer/PowerPoint_to_sketch), this converts graphics and tables drawn in PowerPoint slides into an Arduino sketch that renders the graphics on a 480x320 TFT. This is based on VB macros [created by Kris Kasprzak here](https://github.com/KrisKasprzak/Powerpoint-ILI9341_t3). -7. Users of PowerPoint experienced with running macros may be interested in the [pptm sketch generator here](https://github.com/Bodmer/PowerPoint_to_sketch), this converts graphics and tables drawn in PowerPoint slides into an Arduino sketch that renders the graphics on a 480x320 TFT. This is based on VB macros [created by Kris Kasprzak here](https://github.com/KrisKasprzak/Powerpoint-ILI9341_t3). - -8. The library contains two new functions for rectangles filled with a horizontal or vertical coloured gradient: +11. The library contains two new functions for rectangles filled with a horizontal or vertical coloured gradient: tft.fillRectHGradient(x, y, w, h, color1, color2); @@ -35,36 +51,48 @@ Note: background rendering for Smooth fonts is also now available when using the ![Gradient](https://i.imgur.com/atR0DmP.png) -9. The RP2040 8 bit parallel interface uses the PIO. The PIO now manages the "setWindow" and "block fill" actions, releasing the processor for other tasks when areas of the screen are being filled with a colour. The PIO can optionally be used for SPI interface displays if #define RP2040_PIO_SPI is put in the setup file. Touch screens and pixel read operations are not supported when the PIO interface is used. +12. The RP2040 8-bit parallel interface uses the PIO. The PIO now manages the "setWindow" and "block fill" actions, releasing the processor for other tasks when areas of the screen are being filled with a colour. The PIO can optionally be used for SPI interface displays if #define RP2040_PIO_SPI is put in the setup file. Touch screens and pixel read operations are not supported when the PIO interface is used. The RP2040 PIO features only work with [Earle Philhower's board package](https://github.com/earlephilhower/arduino-pico), NOT the Arduino Mbed version. The use of PIO for SPI allows the RP2040 to be over-clocked (up to 250MHz works on my boards) in Earle's board package whilst still maintaining high SPI clock rates. -10. DMA can now be used with the Raspberry Pi Pico (RP2040) when used with both 8 bit parallel and 16 bit colour SPI displays. See "Bouncy_Circles" sketch. - - ["Bouncing circles"](https://www.youtube.com/watch?v=njFXIzCTQ_Q&lc=UgymaUIwOIuihvYh-Qt4AaABAg) - -11. The library now supports the Raspberry Pi Pico with both the [official Arduino board package](https://github.com/arduino/ArduinoCore-mbed) and the one provided by [Earle Philhower](https://github.com/earlephilhower/arduino-pico). The setup file "Setup60_RP2040_ILI9341.h" has been used for tests with an ILI9341 display. At the moment only SPI interface displays have been tested. SPI port 0 is the default but SPI port 1 can be specifed in the setup file if those SPI pins are used. - - ["Rotating cube demo"](https://www.youtube.com/watch?v=4fPxEN9ImVE) - -12. The library now provides a "viewport" capability. See "Viewport_Demo" and "Viewport_graphicstest" examples. When a viewport is defined graphics will only appear within that window. The coordinate datum by default moves to the top left corner of the viewport, but can optionally remain at top left corner of TFT. The GUIslice library will make use of this feature to speed up the rendering of GUI objects ([see #769](https://github.com/Bodmer/TFT_eSPI/issues/769)). - - # TFT_eSPI -An Arduino IDE compatible graphics and fonts library for 32 bit processors. The library is targeted at 32 bit processors, it has been performance optimised for STM32, ESP8266 and ESP32 types. The library can be loaded using the Arduino IDE's Library Manager. Direct Memory Access (DMA) can be used with the ESP32, RP2040 and STM32 processors with SPI interface displays to improve rendering performance. DMA with a parallel interface is only supported with the RP2040. +A feature rich Arduino IDE compatible graphics and fonts library for 32-bit processors. The library is targeted at 32-bit processors, it has been performance optimised for RP2040, STM32, ESP8266 and ESP32 types, other 32-bit processors may be used but will use the slower generic Arduino interface calls. The library can be loaded using the Arduino IDE's Library Manager. Direct Memory Access (DMA) can be used with the ESP32, RP2040 and STM32 processors with SPI interface displays to improve rendering performance. DMA with a parallel interface (8 and 16-bit) is only supported with the RP2040. -Optimised drivers are incorporated for the following processors: +The updates for the ESP32 S2/C3/S3 means that the library requires the ESP32 Arduino board package 2.x.x or later. + +The screen controller, interface pins and library configuration settings must be defined inside the library. They can NOT be defined in the Arduino sketch. See the User_Setup_Select.h file for details. This approach has significant advantages, it keeps the examples clean from long configuration options and once the setup is defined any example can be run without modification. PlatformIO users can define these settings on a per project basis within a platformio.ini file, see Docs folder in library. + +Lots of example sketches are provided which demonstrate using the functions in the library. Due to the popularity of the library there are lots of online tutorials for TFT_eSPI that have been created by enthusiastic users. + +Optimised drivers have been tested with the following processors: * RP2040, e.g. Raspberry Pi Pico * ESP32 and ESP32-S2, ESP32-C3, ESP32-S3 * ESP8266 * STM32F1xx, STM32F2xx, STM32F4xx, STM32F767 (higher RAM processors recommended) -Generic (non-optimised Arduino function calls) are used by the library for other processors. +The library supports the following interface types for these processors: -"Four wire" SPI and 8 bit parallel interfaces are supported. Due to lack of GPIO pins the 8 bit parallel interface is NOT supported on the ESP8266. 8 bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with the STM32 Nucleo 64/144 range or the UNO format ESP32 (see below for ESP32). +| Processor | 4 wire SPI | 8-bit parallel | 16-bit parallel | DMA support | +|-----------| :---: | :---: | :---: | :---: | +| RP2040 | Yes | Yes | Yes | Yes (all) | +| ESP32 | Yes | Yes | No | Yes (SPI only) | +| ESP32 C3 | Yes | No | No | No | +| ESP32 S2 | Yes | No | No | No | +| ESP32 S3 | Yes | Yes | No | Yes (SPI only) | +| ESP8266 | Yes | No | No | No | +| STM32Fxxx | Yes | Yes | No | Yes (SPI only) | +| Other | Yes | No | No | No | + +For other (generic) processors only SPI interface displays are supported and the slower Arduino SPI library functions are used by the library. Higher clock speed processors such as used for the Teensy 3.x and 4.x boards will still provide a very good performance with the generic Arduino SPI functions. + +4 wire SPI means the display must have SPI interface comaptible signals and a "Data/Command" control signal, this signal line is sometimes labelled DC, RS or A0. + +Due to lack of GPIO pins the 8-bit parallel interface is NOT supported on the ESP8266. 8-bit parallel interface TFTs (e.g. UNO format mcufriend shields) can used with the STM32Fxxx Nucleo 64/144 range or the UNO format ESP32 (see below for ESP32). + +Support for the XPT2046 touch screen controller is built into the library and can be used with SPI interface displays. Third party touch support libraries are also available when using a display parallel interface. Displays using the following controllers are supported: @@ -76,42 +104,40 @@ Displays using the following controllers are supported: * ILI9481 (DMA not supported with SPI) * ILI9486 (DMA not supported with SPI) * ILI9488 (DMA not supported with SPI) -* HX8357B (16 bit parallel tested with RP2040) -* HX8357C (16 bit parallel tested with RP2040) +* HX8357B (16-bit parallel tested with RP2040) +* HX8357C (16-bit parallel tested with RP2040) * HX8357D * R61581 * RM68120 (support files added but untested) * RM68140 * S6D02A1 * SSD1351 -* SSD1963 +* SSD1963 (this controller only has a parallel interface option) * ST7735 * ST7789 * ST7796 ILI9341 and ST7796 SPI based displays are recommended as starting point for experimenting with this library. -The library supports some TFT displays designed for the Raspberry Pi (RPi) that are based on a ILI9486 or ST7796 driver chip with a 480 x 320 pixel screen. The ILI9486 RPi display must be of the Waveshare design and use a 16 bit serial interface based on the 74HC04, 74HC4040 and 2 x 74HC4094 logic chips. Note that due to design variations between these displays not all RPi displays will work with this library, so purchasing a RPi display of these types solely for use with this library is not recommended. +The library supports some TFT displays designed for the Raspberry Pi (RPi) that are based on a ILI9486 or ST7796 driver chip with a 480 x 320 pixel screen. The ILI9486 RPi display must be of the Waveshare design and use a 16-bit serial interface based on the 74HC04, 74HC4040 and 2 x 74HC4094 logic chips. Note that due to design variations between these displays not all RPi displays will work with this library, so purchasing a RPi display of these types solely for use with this library is NOT recommended. -A "good" RPi display is the [MHS-4.0 inch Display-B type ST7796](http://www.lcdwiki.com/MHS-4.0inch_Display-B) which provides good performance. This has a dedicated controller and can be clocked at up to 80MHz with the ESP32 (55MHz with STM32 and 40MHz with ESP8266). The [MHS-3.5 inch RPi ILI9486](http://www.lcdwiki.com/MHS-3.5inch_RPi_Display) based display is also supported. +A "good" RPi display is the [MHS-4.0 inch Display-B type ST7796](http://www.lcdwiki.com/MHS-4.0inch_Display-B) which provides good performance. This has a dedicated controller and can be clocked at up to 80MHz with the ESP32 (125MHz with overclocked RP2040, 55MHz with STM32 and 40MHz with ESP8266). The [MHS-3.5 inch RPi ILI9486](http://www.lcdwiki.com/MHS-3.5inch_RPi_Display) based display is also supported, however the MHS ILI9341 based display of the same type does NOT work with this library. Some displays permit the internal TFT screen RAM to be read, a few of the examples use this feature. The TFT_Screen_Capture example allows full screens to be captured and sent to a PC, this is handy to create program documentation. -The library supports Waveshare 2 and 3 colour ePaper displays using full frame buffers. This addition is relatively immature and thus only one example has been provided. - The library includes a "Sprite" class, this enables flicker free updates of complex graphics. Direct writes to the TFT with graphics functions are still available, so existing sketches do not need to be changed. # Sprites -A Sprite is notionally an invisible graphics screen that is kept in the processors RAM. Graphics can be drawn into the Sprite just as they can be drawn directly to the screen. Once the Sprite is completed it can be plotted onto the screen in any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. Sprites by default use 16 bit colours, the bit depth can be set to 8 bits (256 colours) , or 1 bit (any 2 colours) to reduce the RAM needed. On an ESP8266 the largest 16 bit colour Sprite that can be created is about 160x128 pixels, this consumes 40Kbytes of RAM. On an ESP32 the workspace RAM is more limited than the datasheet implies so a 16 bit colour Sprite is limited to about 200x200 pixels (~80Kbytes), an 8 bit sprite to 320x240 pixels (~76kbytes). A 1 bit per pixel Sprite requires only 9600 bytes for a full 320 x 240 screen buffer, this is ideal for supporting use with 2 colour bitmap fonts. +A Sprite is notionally an invisible graphics screen that is kept in the processors RAM. Graphics can be drawn into the Sprite just as they can be drawn directly to the screen. Once the Sprite is completed it can be plotted onto the screen in any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. Sprites by default use 16-bit colours, the bit depth can be set to 8 bits (256 colours) , or 1 bit (any 2 colours) to reduce the RAM needed. On an ESP8266 the largest 16-bit colour Sprite that can be created is about 160x128 pixels, this consumes 40Kbytes of RAM. On an ESP32 the workspace RAM is more limited than the datasheet implies so a 16-bit colour Sprite is limited to about 200x200 pixels (~80Kbytes), an 8-bit sprite to 320x240 pixels (~76kbytes). A 1 bit per pixel Sprite requires only 9600 bytes for a full 320 x 240 screen buffer, this is ideal for supporting use with 2 colour bitmap fonts. -One or more sprites can be created, a sprite can be any pixel width and height, limited only by available RAM. The RAM needed for a 16 bit colour depth Sprite is (2 x width x height) bytes, for a Sprite with 8 bit colour depth the RAM needed is (width x height) bytes. Sprites can be created and deleted dynamically as needed in the sketch, this means RAM can be freed up after the Sprite has been plotted on the screen, more RAM intensive WiFi based code can then be run and normal graphics operations still work. +One or more sprites can be created, a sprite can be any pixel width and height, limited only by available RAM. The RAM needed for a 16-bit colour depth Sprite is (2 x width x height) bytes, for a Sprite with 8-bit colour depth the RAM needed is (width x height) bytes. Sprites can be created and deleted dynamically as needed in the sketch, this means RAM can be freed up after the Sprite has been plotted on the screen, more RAM intensive WiFi based code can then be run and normal graphics operations still work. Drawing graphics into a sprite is very fast, for those familiar with the Adafruit "graphicstest" example, this whole test completes in 18ms in a 160x128 sprite. Examples of sprite use can be found in the "examples/Sprite" folder. Sprites can be plotted to the TFT with one colour being specified as "transparent", see Transparent_Sprite_Demo example. -If an ESP32 board has SPIRAM (i.e. PSRAM) fitted then Sprites will use the PSRAM memory and large full screen buffer Sprites can be created. Full screen Sprites take longer to render (~45ms for a 320 x 240 16 bit Sprite), so bear that in mind. +If an ESP32 board has SPIRAM (i.e. PSRAM) fitted then Sprites will use the PSRAM memory and large full screen buffer Sprites can be created. Full screen Sprites take longer to render (~45ms for a 320 x 240 16-bit Sprite), so bear that in mind. The "Animated_dial" example shows how dials can be created using a rotated Sprite for the needle. To run this example the TFT interface must support reading from the screen RAM (not all do). The dial rim and scale is a jpeg image, created using a paint program. @@ -131,7 +157,7 @@ The library supports SPI overlap on the ESP8266 so the TFT screen can share MOSI # Fonts -The library contains proportional fonts, different sizes can be enabled/disabled at compile time to optimise the use of FLASH memory. Anti-aliased (smooth) font files in vlw format stored in SPIFFS are supported. Any 16 bit Unicode character can be included and rendered, this means many language specific characters can be rendered to the screen. +The library contains proportional fonts, different sizes can be enabled/disabled at compile time to optimise the use of FLASH memory. Anti-aliased (smooth) font files in vlw format stored in SPIFFS are supported. Any 16-bit Unicode character can be included and rendered, this means many language specific characters can be rendered to the screen. The library is based on the Adafruit GFX and Adafruit driver libraries and the aim is to retain compatibility. Significant additions have been made to the library to boost the speed for the different processors (it is typically 3 to 10 times faster) and to add new features. The new graphics functions include different size proportional fonts and formatting features. There are lots of example sketches to demonstrate the different features and included functions. @@ -140,7 +166,7 @@ Configuration of the library font selections, pins used to interface with the TF # Anti-aliased Fonts -Anti-aliased (smooth) font files in "vlw" format are generated by the free [Processing IDE](https://processing.org/) using a sketch included in the library Tools folder. This sketch with the Processing IDE can be used to generate font files from your computer's font set or any TrueType (.ttf) font, the font file can include **any** combination of 16 bit Unicode characters. This means Greek, Japanese and any other UCS-2 glyphs can be used. Character arrays and Strings in UTF-8 format are supported. +Anti-aliased (smooth) font files in "vlw" format are generated by the free [Processing IDE](https://processing.org/) using a sketch included in the library Tools folder. This sketch with the Processing IDE can be used to generate font files from your computer's font set or any TrueType (.ttf) font, the font file can include **any** combination of 16-bit Unicode characters. This means Greek, Japanese and any other UCS-2 glyphs can be used. Character arrays and Strings in UTF-8 format are supported. The .vlw files must be uploaded to the processors FLASH filing system (SPIFFS, LittleFS or SD card) for use. Alternatively the .vlw files can be converted to C arrays (see "Smooth Font -> FLASH_Array" examples) and stored directly in FLASH as part of the compile process. The array based approach is convenient, provides performance improvements and is suitable where: either use of a filing system is undesirable, or the processor type (e.g. STM32) does not support a FLASH based filing system. @@ -162,9 +188,9 @@ Anti-aliased fonts can also be drawn over a gradient background with a callback Anti-aliased fonts cannot be scaled with setTextSize so you need to create a font for each size you need. See examples. -# 8 bit parallel support +# 8-bit parallel support -The common 8 bit "Mcufriend" shields are supported for the STM Nucleo 64/144 boards and ESP32 UNO style board. The STM32 "Blue/Black Pill" boards can also be used with 8 bit parallel displays. +The common 8-bit "Mcufriend" shields are supported for the STM Nucleo 64/144 boards and ESP32 UNO style board. The STM32 "Blue/Black Pill" boards can also be used with 8-bit parallel displays. The ESP32 board I have been using for testing has the following pinout: @@ -199,10 +225,3 @@ You can take this one step further and have your own setup select file and then #include <../TFT_eSPI_Setups/my_setup_select.h> ``` To select a new setup you then edit your own my_setup_select.h file (which will not get overwritten during an upgrade). - -# ePaper displays - -The library was intended to support only TFT displays but using a Sprite as a 1 bit per pixel screen buffer permits support for the Waveshare 2 and 3 colour SPI ePaper displays. This addition to the library is experimental and only one example is provided. Further examples will be added. - -![Example](https://i.imgur.com/L2tV129.jpg?1) - diff --git a/libraries/TFT_eSPI-2.5.43/README.txt b/libraries/TFT_eSPI-2.5.43/README.txt new file mode 100644 index 00000000..45eb4fbd --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/README.txt @@ -0,0 +1,7 @@ +This is a stand-alone library that contains both graphics functions +and the TFT chip driver library. It supports the ESP8266, ESP32, +STM32 and RP2040 processors with performance optimised code. Other +Arduino IDE compatible boards are also supported but the library +then uses generic functions which will be slower. The library uses +32-bit variables extensively so this will affect performance on 8 +and 16-bit processors. diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/EPD_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/EPD_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/EPD_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/EPD_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Defines.h similarity index 86% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Defines.h index b6c56483..4cb10952 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Defines.h @@ -4,7 +4,7 @@ #define TFT_WIDTH 240 #endif #ifndef TFT_HEIGHT - #define TFT_HEIGHT 320 + #define TFT_HEIGHT 240 #endif // Delay between some initialisation commands @@ -14,6 +14,15 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_SLPIN 0x10 +#define TFT_SLPOUT 0x11 + +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -29,6 +38,3 @@ #define TFT_MAD_BGR 0x08 #define TFT_MAD_MH 0x04 #define TFT_MAD_RGB 0x00 - -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Rotation.h similarity index 62% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Rotation.h index a4c8f3ec..48724e73 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/GC9A01_Rotation.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/GC9A01_Rotation.h @@ -9,20 +9,48 @@ writedata(TFT_MAD_BGR); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif break; case 1: // Landscape (Portrait + 90) writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_BGR); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif break; case 2: // Inverter portrait writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_BGR); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 2; + rowstart = 1; + } +#endif break; case 3: // Inverted landscape writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_BGR); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 128) + { + colstart = 1; + rowstart = 2; + } +#endif break; } diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Init.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Init.h index b5f8c2ea..7ca937c1 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the HX8357B driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357B_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357B_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Init.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Init.h index 35cde5c3..807cadbe 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the HX8357C driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357C_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357C_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Init.h similarity index 96% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Init.h index 9b5f05a9..0e49d3f7 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the HX8357D driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format @@ -94,7 +94,7 @@ writedata(0x01); writecommand(HX8357_COLMOD); - writedata(0x55); // 16 bit + writedata(0x55); // 16-bit writecommand(HX8357_MADCTL); writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/HX8357D_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/HX8357D_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Defines.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Defines.h index 4abaa1dc..f1c63396 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Defines.h @@ -42,6 +42,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -57,6 +63,3 @@ #define TFT_MAD_BGR 0x08 #define TFT_MAD_MH 0x04 #define TFT_MAD_RGB 0x00 - -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9163_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9163_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9225_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9225_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Defines.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Defines.h index 70e17624..94ce1ef5 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Defines.h @@ -40,6 +40,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -66,10 +72,6 @@ #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR #endif -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 - - // All ILI9341 specific commands some are used by init() #define ILI9341_NOP 0x00 #define ILI9341_SWRESET 0x01 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Init.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Init.h index 05a703ef..05a5dda3 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the ILI9341 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9341_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9341_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Init.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Init.h index 3ac9965b..a5f19b89 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the ILI9481 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format @@ -64,9 +64,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -153,9 +153,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -242,9 +242,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -327,9 +327,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -415,9 +415,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -527,9 +527,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -605,9 +605,9 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) @@ -700,9 +700,9 @@ writecommand(0x3a); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9481_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9481_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Defines.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Defines.h index 31996e41..fcec0b86 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Defines.h @@ -39,6 +39,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -56,6 +62,3 @@ #define TFT_MAD_SS 0x02 #define TFT_MAD_GS 0x01 #define TFT_MAD_RGB 0x00 - -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Init.h similarity index 66% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Init.h index 899c47f8..db0f7aa3 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the ILI9486 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format @@ -16,13 +16,19 @@ writecommand(0x3A); #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour interface + writedata(0x55); // 16-bit colour interface #else - writedata(0x66); // 18 bit colour interface + writedata(0x66); // 18-bit colour interface #endif - writecommand(0xC2); - writedata(0x44); + writecommand(0xC0); // 1100.0000 Power Control 1 + writedata(0x0E); // 0001.0111 ... VRH1 + writedata(0x0E); // 0001.0101 ... VRH2 + writecommand(0xC1); // 1100.0001 Power Control 2 + writedata(0x41); // 0100.0001 . SAP BT + writedata(0x00); // 0000.0000 ..... VC + writecommand(0xC2); // 1100.0010 Power Control 3 + writedata(0x55); // nb. was 0x44 0101.0101 . DCA1 . DCA0 writecommand(0xC5); writedata(0x00); diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9486_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9486_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Init.h similarity index 92% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Init.h index d487187d..c1b20b6d 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the ILI9488 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format @@ -59,9 +59,9 @@ writecommand(0x3A); // Pixel Interface Format #if defined (TFT_PARALLEL_8_BIT) || defined (TFT_PARALLEL_16_BIT) || defined (RPI_DISPLAY_TYPE) - writedata(0x55); // 16 bit colour for parallel + writedata(0x55); // 16-bit colour for parallel #else - writedata(0x66); // 18 bit colour for SPI + writedata(0x66); // 18-bit colour for SPI #endif writecommand(0xB0); // Interface Mode Control diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ILI9488_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ILI9488_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Init.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Init.h index 929d680a..1e9adeee 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the R61581 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/R61581_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/R61581_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Defines.h similarity index 51% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Defines.h index d9fed9ac..50ed5a47 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Defines.h @@ -14,24 +14,32 @@ #define TFT_INIT_DELAY 0x80 // Not used unless commandlist invoked // Generic commands used by TFT_eSPI.cpp -#define TFT_NOP 0x0000 -#define TFT_SWRST 0x0100 +#define TFT_NOP 0x0000 +#define TFT_SWRST 0x0100 -#define TFT_CASET 0x2A00 -#define TFT_PASET 0x2B00 -#define TFT_RAMWR 0x2C00 +#define TFT_INVOFF 0x2000 +#define TFT_INVON 0x2100 -#define TFT_RAMRD 0x2E00 -#define TFT_IDXRD 0xDD00 // ILI9341 only, indexed control register read +#define TFT_DISPOFF 0x2800 +#define TFT_DISPON 0x2900 -#define TFT_MADCTL 0x3600 -#define TFT_MAD_MY 0x80 -#define TFT_MAD_MX 0x40 -#define TFT_MAD_MV 0x20 -#define TFT_MAD_ML 0x10 -#define TFT_MAD_BGR 0x08 -#define TFT_MAD_MH 0x04 -#define TFT_MAD_RGB 0x00 +#define TFT_CASET 0x2A00 +#define TFT_PASET 0x2B00 +#define TFT_RAMWR 0x2C00 + +#define TFT_RAMRD 0x2E00 +#define TFT_IDXRD 0xDD00 // ILI9341 only, indexed control register read + +#define TFT_MADCTL 0x3600 +#define TFT_MAD_MY 0x80 +#define TFT_MAD_MX 0x40 +#define TFT_MAD_MV 0x20 +#define TFT_MAD_ML 0x10 +#define TFT_MAD_BGR 0x08 +#define TFT_MAD_RGB 0x00 +#define TFT_MAD_MH 0x04 +#define TFT_MAD_H_FLIP 0x02 +#define TFT_MAD_V_FLIP 0x01 #ifdef TFT_RGB_ORDER #if (TFT_RGB_ORDER == 1) @@ -42,6 +50,3 @@ #else #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB #endif - -#define TFT_INVOFF 0x2000 -#define TFT_INVON 0x2100 diff --git a/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Init.h new file mode 100644 index 00000000..5b7e8f4a --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Init.h @@ -0,0 +1,269 @@ +// Initialisation for RM68120 + +//ENABLE PAGE 1 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x01); + +//GAMMA SETING RED +writeRegister8(0xD400, 0x00); +writeRegister8(0xD401, 0x00); +writeRegister8(0xD402, 0x1b); +writeRegister8(0xD403, 0x44); +writeRegister8(0xD404, 0x62); +writeRegister8(0xD405, 0x00); +writeRegister8(0xD406, 0x7b); +writeRegister8(0xD407, 0xa1); +writeRegister8(0xD408, 0xc0); +writeRegister8(0xD409, 0xee); +writeRegister8(0xD40A, 0x55); +writeRegister8(0xD40B, 0x10); +writeRegister8(0xD40C, 0x2c); +writeRegister8(0xD40D, 0x43); +writeRegister8(0xD40E, 0x57); +writeRegister8(0xD40F, 0x55); +writeRegister8(0xD410, 0x68); +writeRegister8(0xD411, 0x78); +writeRegister8(0xD412, 0x87); +writeRegister8(0xD413, 0x94); +writeRegister8(0xD414, 0x55); +writeRegister8(0xD415, 0xa0); +writeRegister8(0xD416, 0xac); +writeRegister8(0xD417, 0xb6); +writeRegister8(0xD418, 0xc1); +writeRegister8(0xD419, 0x55); +writeRegister8(0xD41A, 0xcb); +writeRegister8(0xD41B, 0xcd); +writeRegister8(0xD41C, 0xd6); +writeRegister8(0xD41D, 0xdf); +writeRegister8(0xD41E, 0x95); +writeRegister8(0xD41F, 0xe8); +writeRegister8(0xD420, 0xf1); +writeRegister8(0xD421, 0xfa); +writeRegister8(0xD422, 0x02); +writeRegister8(0xD423, 0xaa); +writeRegister8(0xD424, 0x0b); +writeRegister8(0xD425, 0x13); +writeRegister8(0xD426, 0x1d); +writeRegister8(0xD427, 0x26); +writeRegister8(0xD428, 0xaa); +writeRegister8(0xD429, 0x30); +writeRegister8(0xD42A, 0x3c); +writeRegister8(0xD42B, 0x4A); +writeRegister8(0xD42C, 0x63); +writeRegister8(0xD42D, 0xea); +writeRegister8(0xD42E, 0x79); +writeRegister8(0xD42F, 0xa6); +writeRegister8(0xD430, 0xd0); +writeRegister8(0xD431, 0x20); +writeRegister8(0xD432, 0x0f); +writeRegister8(0xD433, 0x8e); +writeRegister8(0xD434, 0xff); + +//GAMMA SETING GREEN +writeRegister8(0xD500, 0x00); +writeRegister8(0xD501, 0x00); +writeRegister8(0xD502, 0x1b); +writeRegister8(0xD503, 0x44); +writeRegister8(0xD504, 0x62); +writeRegister8(0xD505, 0x00); +writeRegister8(0xD506, 0x7b); +writeRegister8(0xD507, 0xa1); +writeRegister8(0xD508, 0xc0); +writeRegister8(0xD509, 0xee); +writeRegister8(0xD50A, 0x55); +writeRegister8(0xD50B, 0x10); +writeRegister8(0xD50C, 0x2c); +writeRegister8(0xD50D, 0x43); +writeRegister8(0xD50E, 0x57); +writeRegister8(0xD50F, 0x55); +writeRegister8(0xD510, 0x68); +writeRegister8(0xD511, 0x78); +writeRegister8(0xD512, 0x87); +writeRegister8(0xD513, 0x94); +writeRegister8(0xD514, 0x55); +writeRegister8(0xD515, 0xa0); +writeRegister8(0xD516, 0xac); +writeRegister8(0xD517, 0xb6); +writeRegister8(0xD518, 0xc1); +writeRegister8(0xD519, 0x55); +writeRegister8(0xD51A, 0xcb); +writeRegister8(0xD51B, 0xcd); +writeRegister8(0xD51C, 0xd6); +writeRegister8(0xD51D, 0xdf); +writeRegister8(0xD51E, 0x95); +writeRegister8(0xD51F, 0xe8); +writeRegister8(0xD520, 0xf1); +writeRegister8(0xD521, 0xfa); +writeRegister8(0xD522, 0x02); +writeRegister8(0xD523, 0xaa); +writeRegister8(0xD524, 0x0b); +writeRegister8(0xD525, 0x13); +writeRegister8(0xD526, 0x1d); +writeRegister8(0xD527, 0x26); +writeRegister8(0xD528, 0xaa); +writeRegister8(0xD529, 0x30); +writeRegister8(0xD52A, 0x3c); +writeRegister8(0xD52B, 0x4a); +writeRegister8(0xD52C, 0x63); +writeRegister8(0xD52D, 0xea); +writeRegister8(0xD52E, 0x79); +writeRegister8(0xD52F, 0xa6); +writeRegister8(0xD530, 0xd0); +writeRegister8(0xD531, 0x20); +writeRegister8(0xD532, 0x0f); +writeRegister8(0xD533, 0x8e); +writeRegister8(0xD534, 0xff); + +//GAMMA SETING BLUE +writeRegister8(0xD600, 0x00); +writeRegister8(0xD601, 0x00); +writeRegister8(0xD602, 0x1b); +writeRegister8(0xD603, 0x44); +writeRegister8(0xD604, 0x62); +writeRegister8(0xD605, 0x00); +writeRegister8(0xD606, 0x7b); +writeRegister8(0xD607, 0xa1); +writeRegister8(0xD608, 0xc0); +writeRegister8(0xD609, 0xee); +writeRegister8(0xD60A, 0x55); +writeRegister8(0xD60B, 0x10); +writeRegister8(0xD60C, 0x2c); +writeRegister8(0xD60D, 0x43); +writeRegister8(0xD60E, 0x57); +writeRegister8(0xD60F, 0x55); +writeRegister8(0xD610, 0x68); +writeRegister8(0xD611, 0x78); +writeRegister8(0xD612, 0x87); +writeRegister8(0xD613, 0x94); +writeRegister8(0xD614, 0x55); +writeRegister8(0xD615, 0xa0); +writeRegister8(0xD616, 0xac); +writeRegister8(0xD617, 0xb6); +writeRegister8(0xD618, 0xc1); +writeRegister8(0xD619, 0x55); +writeRegister8(0xD61A, 0xcb); +writeRegister8(0xD61B, 0xcd); +writeRegister8(0xD61C, 0xd6); +writeRegister8(0xD61D, 0xdf); +writeRegister8(0xD61E, 0x95); +writeRegister8(0xD61F, 0xe8); +writeRegister8(0xD620, 0xf1); +writeRegister8(0xD621, 0xfa); +writeRegister8(0xD622, 0x02); +writeRegister8(0xD623, 0xaa); +writeRegister8(0xD624, 0x0b); +writeRegister8(0xD625, 0x13); +writeRegister8(0xD626, 0x1d); +writeRegister8(0xD627, 0x26); +writeRegister8(0xD628, 0xaa); +writeRegister8(0xD629, 0x30); +writeRegister8(0xD62A, 0x3c); +writeRegister8(0xD62B, 0x4A); +writeRegister8(0xD62C, 0x63); +writeRegister8(0xD62D, 0xea); +writeRegister8(0xD62E, 0x79); +writeRegister8(0xD62F, 0xa6); +writeRegister8(0xD630, 0xd0); +writeRegister8(0xD631, 0x20); +writeRegister8(0xD632, 0x0f); +writeRegister8(0xD633, 0x8e); +writeRegister8(0xD634, 0xff); + +//AVDD VOLTAGE SETTING +writeRegister8(0xB000, 0x05); +writeRegister8(0xB001, 0x05); +writeRegister8(0xB002, 0x05); +//AVEE VOLTAGE SETTING +writeRegister8(0xB100, 0x05); +writeRegister8(0xB101, 0x05); +writeRegister8(0xB102, 0x05); + +//AVDD Boosting +writeRegister8(0xB600, 0x34); +writeRegister8(0xB601, 0x34); +writeRegister8(0xB603, 0x34); +//AVEE Boosting +writeRegister8(0xB700, 0x24); +writeRegister8(0xB701, 0x24); +writeRegister8(0xB702, 0x24); +//VCL Boosting +writeRegister8(0xB800, 0x24); +writeRegister8(0xB801, 0x24); +writeRegister8(0xB802, 0x24); +//VGLX VOLTAGE SETTING +writeRegister8(0xBA00, 0x14); +writeRegister8(0xBA01, 0x14); +writeRegister8(0xBA02, 0x14); +//VCL Boosting +writeRegister8(0xB900, 0x24); +writeRegister8(0xB901, 0x24); +writeRegister8(0xB902, 0x24); +//Gamma Voltage +writeRegister8(0xBc00, 0x00); +writeRegister8(0xBc01, 0xa0);//vgmp=5.0 +writeRegister8(0xBc02, 0x00); +writeRegister8(0xBd00, 0x00); +writeRegister8(0xBd01, 0xa0);//vgmn=5.0 +writeRegister8(0xBd02, 0x00); +//VCOM Setting +writeRegister8(0xBe01, 0x3d);//3 + +//ENABLE PAGE 0 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x00); +//Vivid Color Function Control +writeRegister8(0xB400, 0x10); +//Z-INVERSION +writeRegister8(0xBC00, 0x05); +writeRegister8(0xBC01, 0x05); +writeRegister8(0xBC02, 0x05); +//*************** add on 20111021**********************// +writeRegister8(0xB700, 0x22);//GATE EQ CONTROL +writeRegister8(0xB701, 0x22);//GATE EQ CONTROL +writeRegister8(0xC80B, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80C, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC80F, 0x2A);//DISPLAY TIMING CONTROL +writeRegister8(0xC810, 0x2A);//DISPLAY TIMING CONTROL +//*************** add on 20111021**********************// +//PWM_ENH_OE =1 +writeRegister8(0xd000, 0x01); +//DM_SEL =1 +writeRegister8(0xb300, 0x10); +//VBPDA=07h +writeRegister8(0xBd02, 0x07); +//VBPDb=07h +writeRegister8(0xBe02, 0x07); +//VBPDc=07h +writeRegister8(0xBf02, 0x07); + +//ENABLE PAGE 2 +writeRegister8(0xF000, 0x55); +writeRegister8(0xF001, 0xAA); +writeRegister8(0xF002, 0x52); +writeRegister8(0xF003, 0x08); +writeRegister8(0xF004, 0x02); +//SDREG0 =0 +writeRegister8(0xc301, 0xa9); +//DS=14 +writeRegister8(0xfe01, 0x94); +//OSC =60h +writeRegister8(0xf600, 0x60); +//TE ON +writeRegister8(0x3500, 0x00); +writeRegister8(0xFFFF, 0xFF); + +//SLEEP OUT +writecommand(0x1100); +delay(100); +//DISPLY ON +writecommand(0x2900); +delay(100); + +writeRegister16(0x3A00, 0x55); +writeRegister8(0x3600, TFT_MAD_COLOR_ORDER); diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Rotation.h similarity index 65% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Rotation.h index 26ebb492..492493ab 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68120_Rotation.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68120_Rotation.h @@ -2,28 +2,28 @@ // This is the command sequence that rotates the RM68120 driver coordinate frame rotation = m % 4; // Limit the range of values to 0-3 + uint8_t reg = 0; - writecommand(TFT_MADCTL); switch (rotation) { case 0: - writedata(TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_COLOR_ORDER; _width = _init_width; _height = _init_height; break; case 1: - writedata(TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MV | TFT_MAD_MX | TFT_MAD_COLOR_ORDER; _width = _init_height; _height = _init_width; break; case 2: - writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; _width = _init_width; _height = _init_height; break; case 3: - writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); + reg = TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER; _width = _init_height; _height = _init_width; break; - } + writeRegister16(TFT_MADCTL, reg); \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Init.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Init.h index e5df339f..cc447195 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the RM68140 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/RM68140_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/RM68140_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Defines.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Defines.h index 96aea859..7806eb8b 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Defines.h @@ -35,6 +35,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -50,6 +56,3 @@ #define TFT_MAD_BGR 0x08 #define TFT_MAD_MH 0x04 #define TFT_MAD_RGB 0x00 - -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/S6D02A1_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/S6D02A1_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Defines.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Defines.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1351_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1351_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Defines.h similarity index 96% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Defines.h index 1c3e9132..f3ca7d4a 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Defines.h @@ -26,6 +26,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -51,6 +57,3 @@ #else #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR #endif - -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Init.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Init.h index f7859617..87d4ee6e 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Init.h @@ -62,7 +62,7 @@ writedata(0x21 | TFT_MAD_COLOR_ORDER); writecommand(0xF0); //pixel data interface - writedata(0x00); //8 bit bus + writedata(0x00); //8-bit bus delay(1); @@ -166,7 +166,7 @@ writedata(0x21 | TFT_MAD_COLOR_ORDER); writecommand(0xF0); //pixel data interface - writedata(0x00); //8 bit bus + writedata(0x00); //8-bit bus delay(1); @@ -270,7 +270,7 @@ writedata(0x21 | TFT_MAD_COLOR_ORDER); // -- Set rotation writecommand(0xF0); //pixel data interface - writedata(0x00); //8 bit bus + writedata(0x00); //8-bit bus delay(10); @@ -371,7 +371,7 @@ //writedata(0x0050); //16-bit/pixel writecommand(0xF0); //pixel data interface - writedata(0x00); //000 = 8 bit bus, 011 = 16 bit, 110 = 9 bit + writedata(0x00); //000 = 8-bit bus, 011 = 16-bit, 110 = 9-bit writecommand(0xBC); writedata(0x40); //contrast value diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/SSD1963_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/SSD1963_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Defines.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Defines.h index 1e02c1d5..b02ee15e 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Defines.h @@ -17,6 +17,7 @@ #define INITR_GREENTAB128 0x5 // Use if you only get part of 128x128 screen in rotation 0 & 1 #define INITR_GREENTAB160x80 0x6 // Use if you only get part of 128x128 screen in rotation 0 & 1 #define INITR_REDTAB160x80 0x7 // Added for https://www.aliexpress.com/item/ShengYang-1pcs-IPS-0-96-inch-7P-SPI-HD-65K-Full-Color-OLED-Module-ST7735-Drive/32918394604.html +#define INITR_ROBOTLCD 0x8 #define INITB 0xB @@ -44,6 +45,10 @@ #define TAB_COLOUR INITR_GREENTAB160x80 #define CGRAM_OFFSET +#elif defined (ST7735_ROBOTLCD) + #define TAB_COLOUR INITR_ROBOTLCD + #define CGRAM_OFFSET + #elif defined (ST7735_REDTAB160x80) #define TAB_COLOUR INITR_REDTAB160x80 #define CGRAM_OFFSET @@ -90,6 +95,12 @@ #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -107,7 +118,7 @@ #define TFT_MAD_RGB 0x00 #ifndef TFT_RGB_ORDER - #if defined(INITR_BLACKTAB) || defined(INITR_GREENTAB2) || defined(INITB) + #if defined(ST7735_BLACKTAB) || defined(ST7735_GREENTAB2) || defined(ST7735_INITB) #define TFT_MAD_COLOR_ORDER TFT_MAD_RGB #else #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR @@ -120,9 +131,6 @@ #endif #endif -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 - // ST7735 specific commands used in init #define ST7735_NOP 0x00 #define ST7735_SWRESET 0x01 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Init.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Init.h index 08e29135..3b525f28 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Init.h @@ -123,6 +123,17 @@ 0x00, 0x00, // XSTART = 0 0x00, 0x9F }, // XEND = 159 + // Frame control init for RobotLCD, taken from https://github.com/arduino-libraries/TFT, Adafruit_ST7735.cpp l. 263, commit 61b8a7e + Rcmd3RobotLCD[] = { + 3, + ST7735_FRMCTR1, 2 , // 1: Frame rate ctrl - normal mode, 2 args + 0x0B, 0x14, + ST7735_FRMCTR2, 2 , // 2: Frame rate ctrl - idle mode, 2 args + 0x0B, 0x14, + ST7735_FRMCTR3, 4 , // 3: Frame rate ctrl - partial mode, 4 args + 0x0B, 0x14, + 0x0B, 0x14 }, + Rcmd3[] = { // Init for 7735R, part 3 (red or green tab) 4, // 4 commands in list: ST7735_GMCTRP1, 16 , // 1: 16 args, no delay: @@ -181,6 +192,11 @@ colstart = 26; rowstart = 1; } + else if (tabcolor == INITR_ROBOTLCD) + { + commandList(Rcmd2green); + commandList(Rcmd3RobotLCD); + } else if (tabcolor == INITR_REDTAB160x80) { commandList(Rcmd2green); diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7735_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7735_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Defines.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Defines.h index b2e53223..917e602c 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Defines.h @@ -34,6 +34,12 @@ #endif #endif +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + #if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240) #ifndef CGRAM_OFFSET #define CGRAM_OFFSET diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Init.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Init.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Rotation.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_2_Rotation.h diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Defines.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Defines.h index b0ef25e6..f1b21f30 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Defines.h @@ -34,6 +34,12 @@ #endif #endif +#if (TFT_HEIGHT == 320) && (TFT_WIDTH == 170) + #ifndef CGRAM_OFFSET + #define CGRAM_OFFSET + #endif +#endif + #if (TFT_HEIGHT == 300) && (TFT_WIDTH == 240) #ifndef CGRAM_OFFSET #define CGRAM_OFFSET diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Init.h similarity index 51% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Init.h index 4855f082..b2ed7ebf 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Init.h @@ -1,11 +1,13 @@ // This is the command sequence that initialises the ST7789 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format +#ifndef INIT_SEQUENCE_3 { + fillScreen(TFT_RED); writecommand(ST7789_SLPOUT); // Sleep out delay(120); @@ -23,7 +25,7 @@ writecommand(ST7789_RAMCTRL); writedata(0x00); - writedata(0xE0); // 5 to 6 bit conversion: r0 = r5, b0 = b5 + writedata(0xE0); // 5 to 6-bit conversion: r0 = r5, b0 = b5 writecommand(ST7789_COLMOD); writedata(0x55); @@ -103,7 +105,7 @@ writedata(0x00); writedata(0x00); writedata(0x00); - writedata(0xE5); // 239 + writedata(0xEF); // 239 writecommand(ST7789_RASET); // Row address set writedata(0x00); @@ -126,3 +128,111 @@ pinMode(TFT_BL, OUTPUT); #endif } + + +#else +// TTGO ESP32 S3 T-Display +{ + writecommand(ST7789_SLPOUT); // Sleep out + delay(120); + + writecommand(ST7789_NORON); // Normal display mode on + + //------------------------------display and color format setting--------------------------------// + writecommand(ST7789_MADCTL); + writedata(TFT_MAD_COLOR_ORDER); + + // writecommand(ST7789_RAMCTRL); + // writedata(0x00); + // writedata(0xE0); // 5 to 6-bit conversion: r0 = r5, b0 = b5 + + writecommand(ST7789_COLMOD); + writedata(0x55); + delay(10); + + //--------------------------------ST7789V Frame rate setting----------------------------------// + writecommand(ST7789_PORCTRL); + writedata(0x0b); + writedata(0x0b); + writedata(0x00); + writedata(0x33); + writedata(0x33); + + writecommand(ST7789_GCTRL); // Voltages: VGH / VGL + writedata(0x75); + + //---------------------------------ST7789V Power setting--------------------------------------// + writecommand(ST7789_VCOMS); + writedata(0x28); // JLX240 display datasheet + + writecommand(ST7789_LCMCTRL); + writedata(0x2C); + + writecommand(ST7789_VDVVRHEN); + writedata(0x01); + + writecommand(ST7789_VRHS); // voltage VRHS + writedata(0x1F); + + writecommand(ST7789_FRCTR2); + writedata(0x13); + + writecommand(ST7789_PWCTRL1); + writedata(0xa7); + + writecommand(ST7789_PWCTRL1); + writedata(0xa4); + writedata(0xa1); + + writecommand(0xD6); + writedata(0xa1); + + //--------------------------------ST7789V gamma setting---------------------------------------// + writecommand(ST7789_PVGAMCTRL); + writedata(0xf0); + writedata(0x05); + writedata(0x0a); + writedata(0x06); + writedata(0x06); + writedata(0x03); + writedata(0x2b); + writedata(0x32); + writedata(0x43); + writedata(0x36); + writedata(0x11); + writedata(0x10); + writedata(0x2b); + writedata(0x32); + + writecommand(ST7789_NVGAMCTRL); + writedata(0xf0); + writedata(0x08); + writedata(0x0c); + writedata(0x0b); + writedata(0x09); + writedata(0x24); + writedata(0x2b); + writedata(0x22); + writedata(0x43); + writedata(0x38); + writedata(0x15); + writedata(0x16); + writedata(0x2f); + writedata(0x37); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + end_tft_write(); + delay(120); + begin_tft_write(); + + writecommand(ST7789_DISPON); //Display on + delay(120); + +#ifdef TFT_BL + // Turn on the back-light LED + digitalWrite(TFT_BL, HIGH); + pinMode(TFT_BL, OUTPUT); +#endif +} +#endif \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Rotation.h similarity index 50% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Rotation.h index 5bb8131f..df5860c7 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7789_2_Rotation.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7789_Rotation.h @@ -138,143 +138,3 @@ _height = _init_width; break; } - // This is the command sequence that rotates the ST7789 driver coordinate frame - - writecommand(TFT_MADCTL); - rotation = m % 4; - switch (rotation) { - case 0: // Portrait -#ifdef CGRAM_OFFSET - if (_init_width == 135) - { - colstart = 52; - rowstart = 40; - } - else if(_init_height == 280) - { - colstart = 0; - rowstart = 20; - } - else if(_init_width == 172) - { - colstart = 34; - rowstart = 0; - } - else if(_init_width == 170) - { - colstart = 35; - rowstart = 0; - } - else - { - colstart = 0; - rowstart = 0; - } -#endif - writedata(TFT_MAD_COLOR_ORDER); - - _width = _init_width; - _height = _init_height; - break; - - case 1: // Landscape (Portrait + 90) -#ifdef CGRAM_OFFSET - if (_init_width == 135) - { - colstart = 40; - rowstart = 53; - } - else if(_init_height == 280) - { - colstart = 20; - rowstart = 0; - } - else if(_init_width == 172) - { - colstart = 0; - rowstart = 34; - } - else if(_init_width == 170) - { - colstart = 0; - rowstart = 35; - } - else - { - colstart = 0; - rowstart = 0; - } -#endif - writedata(TFT_MAD_MX | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); - - _width = _init_height; - _height = _init_width; - break; - - case 2: // Inverter portrait -#ifdef CGRAM_OFFSET - if (_init_width == 135) - { - colstart = 53; - rowstart = 40; - } - else if(_init_height == 280) - { - colstart = 0; - rowstart = 20; - } - else if(_init_width == 172) - { - colstart = 34; - rowstart = 0; - } - else if(_init_width == 170) - { - colstart = 35; - rowstart = 0; - } - else - { - colstart = 0; - rowstart = 80; - } -#endif - writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); - - _width = _init_width; - _height = _init_height; - break; - case 3: // Inverted landscape -#ifdef CGRAM_OFFSET - if (_init_width == 135) - { - colstart = 40; - rowstart = 52; - } - else if(_init_height == 280) - { - colstart = 20; - rowstart = 0; - } - else if(_init_width == 172) - { - colstart = 0; - rowstart = 34; - } - else if(_init_width == 170) - { - colstart = 0; - rowstart = 35; - } - else - { - colstart = 80; - rowstart = 0; - } -#endif - writedata(TFT_MAD_MV | TFT_MAD_MY | TFT_MAD_COLOR_ORDER); - - _width = _init_height; - _height = _init_width; - break; - } diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Defines.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Defines.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Defines.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Defines.h index ab75c485..d7009ac8 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Defines.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Defines.h @@ -1,12 +1,23 @@ // Change the width and height if required (defined in portrait mode) // or use the constructor to over-ride defaults +#ifndef TFT_WIDTH #define TFT_WIDTH 320 +#endif + +#ifndef TFT_HEIGHT #define TFT_HEIGHT 480 +#endif // Generic commands used by TFT_eSPI.cpp #define TFT_NOP 0x00 #define TFT_SWRST 0x01 +#define TFT_INVOFF 0x20 +#define TFT_INVON 0x21 + +#define TFT_DISPOFF 0x28 +#define TFT_DISPON 0x29 + #define TFT_CASET 0x2A #define TFT_PASET 0x2B #define TFT_RAMWR 0x2C @@ -31,10 +42,6 @@ #define TFT_MAD_COLOR_ORDER TFT_MAD_BGR #endif -#define TFT_INVOFF 0x20 -#define TFT_INVON 0x21 - - // ST7796 specific commands #define ST7796_NOP 0x00 #define ST7796_SWRESET 0x01 diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Init.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Init.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Init.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Init.h index a112815e..c1d84210 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Init.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Init.h @@ -1,7 +1,7 @@ // This is the command sequence that initialises the ST7796 driver // -// This setup information uses simple 8 bit SPI writecommand() and writedata() functions +// This setup information uses simple 8-bit SPI writecommand() and writedata() functions // // See ST7735_Setup.h file for an alternative format diff --git a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Rotation.h b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Rotation.h similarity index 74% rename from libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Rotation.h rename to libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Rotation.h index 4788538a..c5f6ad69 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_Drivers/ST7796_Rotation.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_Drivers/ST7796_Rotation.h @@ -9,21 +9,49 @@ writedata(TFT_MAD_MX | TFT_MAD_COLOR_ORDER); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 49; + rowstart = 0; + } +#endif break; case 1: writedata(TFT_MAD_MV | TFT_MAD_COLOR_ORDER); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 0; + rowstart = 49; + } +#endif break; case 2: writedata(TFT_MAD_MY | TFT_MAD_COLOR_ORDER); _width = _init_width; _height = _init_height; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 49; + rowstart = 0; + } +#endif break; case 3: writedata(TFT_MAD_MX | TFT_MAD_MY | TFT_MAD_MV | TFT_MAD_COLOR_ORDER); _width = _init_height; _height = _init_width; +#ifdef CGRAM_OFFSET + if (_init_width == 222) + { + colstart = 0; + rowstart = 49; + } +#endif break; // These next rotations are for bottom up BMP drawing case 4: diff --git a/libraries/TFT_eSPI-2.4.72/TFT_config.h b/libraries/TFT_eSPI-2.5.43/TFT_config.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/TFT_config.h rename to libraries/TFT_eSPI-2.5.43/TFT_config.h index 76aff1ee..a5c7090e 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_config.h +++ b/libraries/TFT_eSPI-2.5.43/TFT_config.h @@ -12,7 +12,7 @@ * @author Ricard Bitriá Ribes (https://github.com/dracir9) * Created Date: 22-01-2022 * ----- - * Last Modified: 14-04-2022 + * Last Modified: 25-02-2023 * Modified By: Ricard Bitriá Ribes * ----- * @copyright (c) 2022 Ricard Bitriá Ribes @@ -23,6 +23,14 @@ #include "sdkconfig.h" +/*************************************************************************************** +** Others +***************************************************************************************/ + +#ifdef CONFIG_DISABLE_WARNINGS + #define DISABLE_ALL_LIBRARY_WARNINGS +#endif + /*************************************************************************************** ** TFT_eSPI Configuration defines ***************************************************************************************/ @@ -78,7 +86,7 @@ #define TFT_RGB_ORDER TFT_RGB #endif -#ifdef CONFIG_TFT_RGB_ORDER +#ifdef CONFIG_TFT_BGR_ORDER #define TFT_RGB_ORDER TFT_BGR #endif @@ -137,7 +145,9 @@ #endif #if CONFIG_TFT_RST == -1 - #error "Invalid Reset pin. Check TFT_eSPI configuration" + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning "Invalid Reset pin. Check TFT_eSPI configuration" + #endif #else #define TFT_RST CONFIG_TFT_RST #endif @@ -161,6 +171,8 @@ // 8 BIT PARALLEL BUS #ifdef CONFIG_TFT_PARALLEL_8_BIT + #define TFT_PARALLEL_8_BIT + #if CONFIG_TFT_D0 == -1 #error "Invalid Data 0 pin. Check TFT_eSPI configuration" #else @@ -223,9 +235,11 @@ // SPI BUS #else - #if CONFIG_TFT_MISO == -1 - #error "Invalid MISO pin. Check TFT_eSPI configuration" - #else + #if CONFIG_TFT_HSPI_PORT + #define USE_HSPI_PORT + #endif + + #if CONFIG_TFT_MISO != -1 #define TFT_MISO CONFIG_TFT_MISO #endif diff --git a/libraries/TFT_eSPI-2.4.72/TFT_eSPI.cpp b/libraries/TFT_eSPI-2.5.43/TFT_eSPI.cpp similarity index 85% rename from libraries/TFT_eSPI-2.4.72/TFT_eSPI.cpp rename to libraries/TFT_eSPI-2.5.43/TFT_eSPI.cpp index 87356c2e..d537faeb 100644 --- a/libraries/TFT_eSPI-2.4.72/TFT_eSPI.cpp +++ b/libraries/TFT_eSPI-2.5.43/TFT_eSPI.cpp @@ -1,5 +1,5 @@ /*************************************************** - Arduino TFT graphics library targeted at 32 bit + Arduino TFT graphics library targeted at 32-bit processors such as ESP32, ESP8266 and STM32. This is a stand-alone library that contains the @@ -13,18 +13,17 @@ Last update by Bodmer 20/03/20 ****************************************************/ - #include "TFT_eSPI.h" #if defined (ESP32) #if defined(CONFIG_IDF_TARGET_ESP32S3) - #include "Processors/TFT_eSPI_ESP32_S3.c" // Tested with SPI and 8 bit parallel + #include "Processors/TFT_eSPI_ESP32_S3.c" // Tested with SPI and 8-bit parallel #elif defined(CONFIG_IDF_TARGET_ESP32C3) - #include "Processors/TFT_eSPI_ESP32_C3.c" // Tested with SPI (8 bit parallel will probably work too!) + #include "Processors/TFT_eSPI_ESP32_C3.c" // Tested with SPI (8-bit parallel will probably work too!) #else #include "Processors/TFT_eSPI_ESP32.c" #endif -#elif defined (ESP8266) +#elif defined (ARDUINO_ARCH_ESP8266) #include "Processors/TFT_eSPI_ESP8266.c" #elif defined (STM32) // (_VARIANT_ARDUINO_STM32_) stm32_def.h #include "Processors/TFT_eSPI_STM32.c" @@ -150,7 +149,6 @@ inline void TFT_eSPI::begin_tft_read(void){ SET_BUS_READ_MODE; } - /*************************************************************************************** ** Function name: end_tft_read (was called spi_end_read) ** Description: End transaction for reads and deselect TFT @@ -234,7 +232,6 @@ void TFT_eSPI::setViewport(int32_t x, int32_t y, int32_t w, int32_t h, bool vpDa //Serial.print(" _vpX=");Serial.print( _vpX);Serial.print(", _vpY=");Serial.print( _vpY); //Serial.print(", _vpW=");Serial.print(_vpW);Serial.print(", _vpH=");Serial.println(_vpH); - } /*************************************************************************************** @@ -470,7 +467,7 @@ TFT_eSPI::TFT_eSPI(int16_t w, int16_t h) lockTransaction = false; // start/endWrite lock flag to allow sketch to keep SPI bus access open _booted = true; // Default attributes - _cp437 = true; // Legacy GLCD font bug fix + _cp437 = false; // Legacy GLCD font bug fix disabled by default _utf8 = true; // UTF8 decoding enabled #if defined (FONT_FS_AVAILABLE) && defined (SMOOTH_FONT) @@ -536,25 +533,33 @@ TFT_eSPI::TFT_eSPI(int16_t w, int16_t h) void TFT_eSPI::initBus(void) { #ifdef TFT_CS - pinMode(TFT_CS, OUTPUT); - digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } #endif // Configure chip select for touchscreen controller if present #ifdef TOUCH_CS - pinMode(TOUCH_CS, OUTPUT); - digitalWrite(TOUCH_CS, HIGH); // Chip select high (inactive) + if (TOUCH_CS >= 0) { + pinMode(TOUCH_CS, OUTPUT); + digitalWrite(TOUCH_CS, HIGH); // Chip select high (inactive) + } #endif // In parallel mode and with the RP2040 processor, the TFT_WR line is handled in the PIO #if defined (TFT_WR) && !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED) - pinMode(TFT_WR, OUTPUT); - digitalWrite(TFT_WR, HIGH); // Set write strobe high (inactive) + if (TFT_WR >= 0) { + pinMode(TFT_WR, OUTPUT); + digitalWrite(TFT_WR, HIGH); // Set write strobe high (inactive) + } #endif #ifdef TFT_DC - pinMode(TFT_DC, OUTPUT); - digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + if (TFT_DC >= 0) { + pinMode(TFT_DC, OUTPUT); + digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } #endif #ifdef TFT_RST @@ -567,8 +572,10 @@ void TFT_eSPI::initBus(void) { #if defined (TFT_PARALLEL_8_BIT) // Make sure read is high before we set the bus to output - pinMode(TFT_RD, OUTPUT); - digitalWrite(TFT_RD, HIGH); + if (TFT_RD >= 0) { + pinMode(TFT_RD, OUTPUT); + digitalWrite(TFT_RD, HIGH); + } #if !defined (ARDUINO_ARCH_RP2040) && !defined (ARDUINO_ARCH_MBED)// PIO manages pins // Set TFT data bus lines to output @@ -625,7 +632,7 @@ void TFT_eSPI::init(uint8_t tc) sclkpinmask = (uint32_t) digitalPinToBitMask(TFT_SCLK); #endif - #if defined (TFT_SPI_OVERLAP) && defined (ESP8266) + #if defined (TFT_SPI_OVERLAP) && defined (ARDUINO_ARCH_ESP8266) // Overlap mode SD0=MISO, SD1=MOSI, CLK=SCLK must use D3 as CS // pins(int8_t sck, int8_t miso, int8_t mosi, int8_t ss); //spi.pins( 6, 7, 8, 0); @@ -652,17 +659,21 @@ void TFT_eSPI::init(uint8_t tc) #if defined (TFT_CS) && !defined(RP2040_PIO_INTERFACE) // Set to output once again in case MISO is used for CS - pinMode(TFT_CS, OUTPUT); - digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) -#elif defined (ESP8266) && !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_SPI) + if (TFT_CS >= 0) { + pinMode(TFT_CS, OUTPUT); + digitalWrite(TFT_CS, HIGH); // Chip select high (inactive) + } +#elif defined (ARDUINO_ARCH_ESP8266) && !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_SPI) spi.setHwCs(1); // Use hardware SS toggling #endif // Set to output once again in case MISO is used for DC #if defined (TFT_DC) && !defined(RP2040_PIO_INTERFACE) + if (TFT_DC >= 0) { pinMode(TFT_DC, OUTPUT); digitalWrite(TFT_DC, HIGH); // Data/Command high = data mode + } #endif _booted = false; @@ -673,7 +684,9 @@ void TFT_eSPI::init(uint8_t tc) #ifdef TFT_RST #if !defined(RP2040_PIO_INTERFACE) // Set to output once again in case MISO is used for TFT_RST - pinMode(TFT_RST, OUTPUT); + if (TFT_RST >= 0) { + pinMode(TFT_RST, OUTPUT); + } #endif if (TFT_RST >= 0) { writecommand(0x00); // Put SPI bus in known state for TFT with CS tied low @@ -771,13 +784,17 @@ void TFT_eSPI::init(uint8_t tc) setRotation(rotation); #if defined (TFT_BL) && defined (TFT_BACKLIGHT_ON) - pinMode(TFT_BL, OUTPUT); - digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); + } #else #if defined (TFT_BL) && defined (M5STACK) // Turn on the back-light LED - pinMode(TFT_BL, OUTPUT); - digitalWrite(TFT_BL, HIGH); + if (TFT_BL >= 0) { + pinMode(TFT_BL, OUTPUT); + digitalWrite(TFT_BL, HIGH); + } #endif #endif } @@ -867,6 +884,48 @@ void TFT_eSPI::setRotation(uint8_t m) } +/*************************************************************************************** +** Function name: getRotation +** Description: Return the rotation value (as used by setRotation()) +***************************************************************************************/ +uint8_t TFT_eSPI::getRotation(void) +{ + return rotation; +} + + +/*************************************************************************************** +** Function name: setOrigin +** Description: Set graphics origin to position x,y wrt to top left corner +***************************************************************************************/ +//Note: setRotation, setViewport and resetViewport will revert origin to top left +void TFT_eSPI::setOrigin(int32_t x, int32_t y) +{ + _xDatum = x; + _yDatum = y; +} + + +/*************************************************************************************** +** Function name: getOriginX +** Description: Set graphics origin to position x +***************************************************************************************/ +int32_t TFT_eSPI::getOriginX(void) +{ + return _xDatum; +} + + +/*************************************************************************************** +** Function name: getOriginY +** Description: Set graphics origin to position y +***************************************************************************************/ +int32_t TFT_eSPI::getOriginY(void) +{ + return _yDatum; +} + + /*************************************************************************************** ** Function name: commandList, used for FLASH based lists only (e.g. ST7735) ** Description: Get initialisation commands from FLASH and send to TFT @@ -883,7 +942,7 @@ void TFT_eSPI::commandList (const uint8_t *addr) { writecommand(pgm_read_byte(addr++)); // Read, issue command numArgs = pgm_read_byte(addr++); // Number of args to follow - ms = numArgs & TFT_INIT_DELAY; // If hibit set, delay follows args + ms = numArgs & TFT_INIT_DELAY; // If high bit set, delay follows args numArgs &= ~TFT_INIT_DELAY; // Mask out delay bit while (numArgs--) // For each argument... @@ -915,7 +974,7 @@ void TFT_eSPI::spiwrite(uint8_t c) /*************************************************************************************** ** Function name: writecommand -** Description: Send an 8 bit command to the TFT +** Description: Send an 8-bit command to the TFT ***************************************************************************************/ #ifndef RM68120_DRIVER void TFT_eSPI::writecommand(uint8_t c) @@ -929,7 +988,6 @@ void TFT_eSPI::writecommand(uint8_t c) DC_D; end_tft_write(); - } #else void TFT_eSPI::writecommand(uint16_t c) @@ -945,7 +1003,7 @@ void TFT_eSPI::writecommand(uint16_t c) end_tft_write(); } -void TFT_eSPI::writeRegister(uint16_t c, uint8_t d) +void TFT_eSPI::writeRegister8(uint16_t c, uint8_t d) { begin_tft_write(); @@ -960,11 +1018,27 @@ void TFT_eSPI::writeRegister(uint16_t c, uint8_t d) end_tft_write(); } +void TFT_eSPI::writeRegister16(uint16_t c, uint16_t d) +{ + begin_tft_write(); + + DC_C; + + tft_Write_16(c); + + DC_D; + + tft_Write_16(d); + + end_tft_write(); + +} + #endif /*************************************************************************************** ** Function name: writedata -** Description: Send a 8 bit data value to the TFT +** Description: Send a 8-bit data value to the TFT ***************************************************************************************/ void TFT_eSPI::writedata(uint8_t d) { @@ -982,7 +1056,7 @@ void TFT_eSPI::writedata(uint8_t d) /*************************************************************************************** ** Function name: readcommand8 -** Description: Read a 8 bit data value from an indexed command register +** Description: Read a 8-bit data value from an indexed command register ***************************************************************************************/ uint8_t TFT_eSPI::readcommand8(uint8_t cmd_function, uint8_t index) { @@ -991,14 +1065,14 @@ uint8_t TFT_eSPI::readcommand8(uint8_t cmd_function, uint8_t index) writecommand(cmd_function); // Sets DC and CS high - busDir(dir_mask, INPUT); + busDir(GPIO_DIR_MASK, INPUT); CS_L; // Read nth parameter (assumes caller discards 1st parameter or points index to 2nd) while(index--) reg = readByte(); - busDir(dir_mask, OUTPUT); + busDir(GPIO_DIR_MASK, OUTPUT); CS_H; @@ -1025,7 +1099,7 @@ uint8_t TFT_eSPI::readcommand8(uint8_t cmd_function, uint8_t index) /*************************************************************************************** ** Function name: readcommand16 -** Description: Read a 16 bit data value from an indexed command register +** Description: Read a 16-bit data value from an indexed command register ***************************************************************************************/ uint16_t TFT_eSPI::readcommand16(uint8_t cmd_function, uint8_t index) { @@ -1040,7 +1114,7 @@ uint16_t TFT_eSPI::readcommand16(uint8_t cmd_function, uint8_t index) /*************************************************************************************** ** Function name: readcommand32 -** Description: Read a 32 bit data value from an indexed command register +** Description: Read a 32-bit data value from an indexed command register ***************************************************************************************/ uint32_t TFT_eSPI::readcommand32(uint8_t cmd_function, uint8_t index) { @@ -1071,44 +1145,44 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0) #if defined(TFT_PARALLEL_8_BIT) || defined(RP2040_PIO_INTERFACE) - CS_L; + if (!inTransaction) { CS_L; } // CS_L can be multi-statement readAddrWindow(x0, y0, 1, 1); // Set masked pins D0- D7 to input - busDir(dir_mask, INPUT); + busDir(GPIO_DIR_MASK, INPUT); #if !defined (SSD1963_DRIVER) // Dummy read to throw away don't care value readByte(); #endif - // Fetch the 16 bit BRG pixel + // Fetch the 16-bit BRG pixel //uint16_t rgb = (readByte() << 8) | readByte(); #if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9488_DRIVER) || defined (SSD1963_DRIVER)// Read 3 bytes - // Read window pixel 24 bit RGB values and fill in LS bits + // Read window pixel 24-bit RGB values and fill in LS bits uint16_t rgb = ((readByte() & 0xF8) << 8) | ((readByte() & 0xFC) << 3) | (readByte() >> 3); - CS_H; + if (!inTransaction) { CS_H; } // CS_H can be multi-statement // Set masked pins D0- D7 to output - busDir(dir_mask, OUTPUT); + busDir(GPIO_DIR_MASK, OUTPUT); return rgb; - #else // ILI9481 or ILI9486 16 bit read + #else // ILI9481 or ILI9486 16-bit read - // Fetch the 16 bit BRG pixel + // Fetch the 16-bit BRG pixel uint16_t bgr = (readByte() << 8) | readByte(); - CS_H; + if (!inTransaction) { CS_H; } // CS_H can be multi-statement // Set masked pins D0- D7 to output - busDir(dir_mask, OUTPUT); + busDir(GPIO_DIR_MASK, OUTPUT); - #ifdef ILI9486_DRIVER + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) return bgr; #else // Swap Red and Blue (could check MADCTL setting to see if this is needed) @@ -1142,6 +1216,13 @@ uint16_t TFT_eSPI::readPixel(int32_t x0, int32_t y0) #if defined (ST7796_DRIVER) // Read the 2 bytes color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); #else // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte // as the TFT stores colours as 18 bits @@ -1202,18 +1283,18 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da data += dx + dy * w; // Set masked pins D0- D7 to input - busDir(dir_mask, INPUT); + busDir(GPIO_DIR_MASK, INPUT); #if defined (ILI9341_DRIVER) || defined(ILI9341_2_DRIVER) || defined (ILI9488_DRIVER) // Read 3 bytes // Dummy read to throw away don't care value readByte(); - // Fetch the 24 bit RGB value + // Fetch the 24-bit RGB value while (dh--) { int32_t lw = dw; uint16_t* line = data; while (lw--) { - // Assemble the RGB 16 bit colour + // Assemble the RGB 16-bit colour uint16_t rgb = ((readByte() & 0xF8) << 8) | ((readByte() & 0xFC) << 3) | (readByte() >> 3); // Swapped byte order for compatibility with pushRect() @@ -1223,7 +1304,7 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da } #elif defined (SSD1963_DRIVER) - // Fetch the 18 bit BRG pixels + // Fetch the 18-bit BRG pixels while (dh--) { int32_t lw = dw; uint16_t* line = data; @@ -1243,16 +1324,16 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da // Dummy read to throw away don't care value readByte(); - // Fetch the 16 bit BRG pixels + // Fetch the 16-bit BRG pixels while (dh--) { int32_t lw = dw; uint16_t* line = data; while (lw--) { - #ifdef ILI9486_DRIVER - // Read the RGB 16 bit colour + #if defined (ILI9486_DRIVER) || defined (ST7796_DRIVER) + // Read the RGB 16-bit colour *line++ = readByte() | (readByte() << 8); #else - // Read the BRG 16 bit colour + // Read the BRG 16-bit colour uint16_t bgr = (readByte() << 8) | readByte(); // Swap Red and Blue (could check MADCTL setting to see if this is needed) uint16_t rgb = (bgr>>11) | (bgr<<11) | (bgr & 0x7E0); @@ -1267,7 +1348,7 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da CS_H; // Set masked pins D0- D7 to output - busDir(dir_mask, OUTPUT); + busDir(GPIO_DIR_MASK, OUTPUT); #else // SPI interface @@ -1291,7 +1372,7 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da // Dummy read to throw away don't care value tft_Read_8(); - // Read window pixel 24 bit RGB values + // Read window pixel 24-bit RGB values while (dh--) { int32_t lw = dw; uint16_t* line = data; @@ -1302,6 +1383,13 @@ void TFT_eSPI::readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da #if defined (ST7796_DRIVER) // Read the 2 bytes color = ((tft_Read_8()) << 8) | (tft_Read_8()); + #elif defined (ST7735_DRIVER) + // Read the 3 RGB bytes, colour is in LS 6 bits of the top 7 bits of each byte + // as the TFT stores colours as 18 bits + uint8_t r = tft_Read_8()<<1; + uint8_t g = tft_Read_8()<<1; + uint8_t b = tft_Read_8()<<1; + color = color565(r, g, b); #else // Read the 3 RGB bytes, colour is actually only in the top 6 bits of each byte // as the TFT stores colours as 18 bits @@ -1355,7 +1443,7 @@ void TFT_eSPI::pushRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *da /*************************************************************************************** ** Function name: pushImage -** Description: plot 16 bit colour sprite or image onto TFT +** Description: plot 16-bit colour sprite or image onto TFT ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data) { @@ -1385,7 +1473,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *d /*************************************************************************************** ** Function name: pushImage -** Description: plot 16 bit sprite or image with 1 colour being transparent +** Description: plot 16-bit sprite or image with 1 colour being transparent ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transp) { @@ -1444,11 +1532,11 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *d /*************************************************************************************** ** Function name: pushImage - for FLASH (PROGMEM) stored images -** Description: plot 16 bit image +** Description: plot 16-bit image ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data) { - // Requires 32 bit aligned access, so use PROGMEM 16 bit word functions + // Requires 32-bit aligned access, so use PROGMEM 16-bit word functions PI_CLIP; begin_tft_write(); @@ -1474,11 +1562,11 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint1 /*************************************************************************************** ** Function name: pushImage - for FLASH (PROGMEM) stored images -** Description: plot 16 bit image with 1 colour being transparent +** Description: plot 16-bit image with 1 colour being transparent ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transp) { - // Requires 32 bit aligned access, so use PROGMEM 16 bit word functions + // Requires 32-bit aligned access, so use PROGMEM 16-bit word functions PI_CLIP; begin_tft_write(); @@ -1530,7 +1618,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint1 /*************************************************************************************** ** Function name: pushImage -** Description: plot 8 bit or 4 bit or 1 bit image or sprite using a line buffer +** Description: plot 8-bit or 4-bit or 1 bit image or sprite using a line buffer ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap) { @@ -1549,7 +1637,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8 { _swapBytes = false; - uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5 bit colour lookup table + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table _lastColor = -1; // Set to illegal value @@ -1663,7 +1751,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8 /*************************************************************************************** ** Function name: pushImage -** Description: plot 8 bit or 4 bit or 1 bit image or sprite using a line buffer +** Description: plot 8-bit or 4-bit or 1 bit image or sprite using a line buffer ***************************************************************************************/ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8, uint16_t *cmap) { @@ -1682,7 +1770,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da { _swapBytes = false; - uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5 bit colour lookup table + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table _lastColor = -1; // Set to illegal value @@ -1815,7 +1903,7 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da data += dx + dy * w; - uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5 bit colour lookup table + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table _lastColor = -1; // Set to illegal value @@ -1999,10 +2087,95 @@ void TFT_eSPI::pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *da end_tft_write(); } +/*************************************************************************************** +** Function name: pushMaskedImage +** Description: Render a 16-bit colour image to TFT with a 1bpp mask +***************************************************************************************/ +// Can be used with a 16bpp sprite and a 1bpp sprite for the mask +void TFT_eSPI::pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *img, uint8_t *mask) +{ + if (_vpOoB || w < 1 || h < 1) return; + + // To simplify mask handling the window clipping is done by the pushImage function + // Each mask image line assumed to be padded to an integer number of bytes & padding bits are 0 + + begin_tft_write(); + inTransaction = true; + + uint8_t *mptr = mask; + uint8_t *eptr = mask + ((w + 7) >> 3); + uint16_t *iptr = img; + uint32_t setCount = 0; + + // For each line in the image + while (h--) { + uint32_t xp = 0; + uint32_t clearCount = 0; + uint8_t mbyte= *mptr++; + uint32_t bits = 8; + // Scan through each byte of the bitmap and determine run lengths + do { + setCount = 0; + + //Get run length for clear bits to determine x offset + while ((mbyte & 0x80) == 0x00) { + // Check if remaining bits in byte are clear (reduce shifts) + if (mbyte == 0) { + clearCount += bits; // bits not always 8 here + if (mptr >= eptr) break; // end of line + mbyte = *mptr++; + bits = 8; + continue; + } + mbyte = mbyte << 1; // 0's shifted in + clearCount ++; + if (--bits) continue;; + if (mptr >= eptr) break; + mbyte = *mptr++; + bits = 8; + } + + //Get run length for set bits to determine render width + while ((mbyte & 0x80) == 0x80) { + // Check if all bits are set (reduces shifts) + if (mbyte == 0xFF) { + setCount += bits; + if (mptr >= eptr) break; + mbyte = *mptr++; + //bits = 8; // NR, bits always 8 here unless 1's shifted in + continue; + } + mbyte = mbyte << 1; //or mbyte += mbyte + 1 to shift in 1's + setCount ++; + if (--bits) continue; + if (mptr >= eptr) break; + mbyte = *mptr++; + bits = 8; + } + + // A mask boundary or mask end has been found, so render the pixel line + if (setCount) { + xp += clearCount; + clearCount = 0; + pushImage(x + xp, y, setCount, 1, iptr + xp); // pushImage handles clipping + if (mptr >= eptr) break; + xp += setCount; + } + } while (setCount || mptr < eptr); + + y++; + iptr += w; + eptr += ((w + 7) >> 3); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + /*************************************************************************************** ** Function name: setSwapBytes -** Description: Used by 16 bit pushImage() to swap byte order in colours +** Description: Used by 16-bit pushImage() to swap byte order in colours ***************************************************************************************/ void TFT_eSPI::setSwapBytes(bool swap) { @@ -2058,7 +2231,7 @@ void TFT_eSPI::readRectRGB(int32_t x0, int32_t y0, int32_t w, int32_t h, uint8_ // Dummy read to throw away don't care value tft_Read_8(); - // Read window pixel 24 bit RGB values, buffer must be set in sketch to 3 * w * h + // Read window pixel 24-bit RGB values, buffer must be set in sketch to 3 * w * h uint32_t len = w * h; while (len--) { @@ -2180,7 +2353,7 @@ void TFT_eSPI::drawCircleHelper( int32_t x0, int32_t y0, int32_t rr, uint8_t cor //begin_tft_write(); // Sprite class can use this function, avoiding begin_tft_write() inTransaction = true; - while (xe < rr--) + do { while (f < 0) { ++xe; @@ -2226,7 +2399,8 @@ void TFT_eSPI::drawCircleHelper( int32_t x0, int32_t y0, int32_t rr, uint8_t cor } } xs = xe; - } + } while (xe < rr--); + inTransaction = lockTransaction; end_tft_write(); // Does nothing if Sprite class uses this function } @@ -2511,13 +2685,13 @@ void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, in // Sort coordinates by Y order (y2 >= y1 >= y0) if (y0 > y1) { - swap_coord(y0, y1); swap_coord(x0, x1); + transpose(y0, y1); transpose(x0, x1); } if (y1 > y2) { - swap_coord(y2, y1); swap_coord(x2, x1); + transpose(y2, y1); transpose(x2, x1); } if (y0 > y1) { - swap_coord(y0, y1); swap_coord(x0, x1); + transpose(y0, y1); transpose(x0, x1); } if (y0 == y2) { // Handle awkward all-on-same-line case as its own thing @@ -2558,7 +2732,7 @@ void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, in sa += dx01; sb += dx02; - if (a > b) swap_coord(a, b); + if (a > b) transpose(a, b); drawFastHLine(a, y, b - a + 1, color); } @@ -2572,7 +2746,7 @@ void TFT_eSPI::fillTriangle ( int32_t x0, int32_t y0, int32_t x1, int32_t y1, in sa += dx12; sb += dx02; - if (a > b) swap_coord(a, b); + if (a > b) transpose(a, b); drawFastHLine(a, y, b - a + 1, color); } @@ -2693,7 +2867,7 @@ void TFT_eSPI::setCursor(int16_t x, int16_t y) ***************************************************************************************/ void TFT_eSPI::setCursor(int16_t x, int16_t y, uint8_t font) { - textfont = font; + setTextFont(font); cursor_x = x; cursor_y = y; } @@ -2838,15 +3012,6 @@ uint16_t TFT_eSPI::getTextPadding(void) return padX; } -/*************************************************************************************** -** Function name: getRotation -** Description: Return the rotation value (as used by setRotation()) -***************************************************************************************/ -uint8_t TFT_eSPI::getRotation(void) -{ - return rotation; -} - /*************************************************************************************** ** Function name: getTextDatum ** Description: Return the text datum value (as used by setTextDatum()) @@ -2975,7 +3140,7 @@ int16_t TFT_eSPI::textWidth(const char *string, uint8_t font) /*************************************************************************************** ** Function name: fontsLoaded -** Description: return an encoded 16 bit value showing the fonts loaded +** Description: return an encoded 16-bit value showing the fonts loaded ***************************************************************************************/ // Returns a value showing which fonts are loaded (bit N set = Font N loaded) uint16_t TFT_eSPI::fontsLoaded(void) @@ -2988,8 +3153,10 @@ uint16_t TFT_eSPI::fontsLoaded(void) ** Function name: fontHeight ** Description: return the height of a font (yAdvance for free fonts) ***************************************************************************************/ -int16_t TFT_eSPI::fontHeight(int16_t font) +int16_t TFT_eSPI::fontHeight(uint8_t font) { + if (font > 8) return 0; + #ifdef SMOOTH_FONT if(fontLoaded) return gFont.yAdvance; #endif @@ -3017,11 +3184,10 @@ void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32 { if (_vpOoB) return; - if (c < 32) return; #ifdef LOAD_GLCD //>>>>>>>>>>>>>>>>>> #ifdef LOAD_GFXFF - if(!gfxFont) { // 'Classic' built-in font + if(!gfxFont) { // 'Classic' built-in GLCD font #endif //>>>>>>>>>>>>>>>>>> @@ -3034,6 +3200,9 @@ void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32 ((yd + 8 * size - 1) < _vpY)) // Clip top return; + if (c > 255) return; + if (!_cp437 && c > 175) c++; + bool fillbg = (bg != color); bool clip = xd < _vpX || xd + 6 * textsize >= _vpW || yd < _vpY || yd + 8 * textsize >= _vpH; @@ -3044,7 +3213,7 @@ void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32 setWindow(xd, yd, xd+5, yd+7); - for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(font + (c * 5) + i); + for (int8_t i = 0; i < 5; i++ ) column[i] = pgm_read_byte(&font[0] + (c * 5) + i); column[5] = 0; for (int8_t j = 0; j < 8; j++) { @@ -3067,7 +3236,7 @@ void TFT_eSPI::drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32 if (i == 5) line = 0x0; else - line = pgm_read_byte(font + (c * 5) + i); + line = pgm_read_byte(&font[0] + (c * 5) + i); if (size == 1 && !fillbg) { // default size for (int8_t j = 0; j < 8; j++) { @@ -3195,7 +3364,7 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) addr_col = 0xFFFF; #if defined (ILI9225_DRIVER) - if (rotation & 0x01) { swap_coord(x0, y0); swap_coord(x1, y1); } + if (rotation & 0x01) { transpose(x0, y0); transpose(x1, y1); } SPI_BUSY_CHECK; DC_C; tft_Write_8(TFT_CASET1); DC_D; tft_Write_16(x0); @@ -3217,14 +3386,14 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) DC_D; // Temporary solution is to include the RP2040 code here #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined(RP2040_PIO_INTERFACE) - // For ILI9225 and RP2040 the slower Arduino SPI transfer calls were used, so need to swap back to 16 bit mode + // For ILI9225 and RP2040 the slower Arduino SPI transfer calls were used, so need to swap back to 16-bit mode while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif #elif defined (SSD1351_DRIVER) if (rotation & 1) { - swap_coord(x0, y0); - swap_coord(x1, y1); + transpose(x0, y0); + transpose(x1, y1); } SPI_BUSY_CHECK; DC_C; tft_Write_8(TFT_CASET); @@ -3235,7 +3404,7 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) DC_D; #else #if defined (SSD1963_DRIVER) - if ((rotation & 0x1) == 0) { swap_coord(x0, y0); swap_coord(x1, y1); } + if ((rotation & 0x1) == 0) { transpose(x0, y0); transpose(x1, y1); } #endif #ifdef CGRAM_OFFSET @@ -3248,12 +3417,12 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) // Temporary solution is to include the RP2040 optimised code here #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) #if !defined(RP2040_PIO_INTERFACE) - // Use hardware SPI port, this code does not swap from 8 to 16 bit + // Use hardware SPI port, this code does not swap from 8 to 16-bit // to avoid the spi_set_format() call overhead while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; DC_C; #if !defined (SPI_18BIT_DRIVER) - #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #else hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); @@ -3288,6 +3457,18 @@ void TFT_eSPI::setWindow(int32_t x0, int32_t y0, int32_t x1, int32_t y1) hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #endif DC_D; + #elif defined (RM68120_DRIVER) + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x0 >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x0 & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x1 >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x1 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y0 >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y0 & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y1 >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y1 & 0xFF); + + DC_C; tft_Write_16(TFT_RAMWR); + DC_D; #else // This is for the RP2040 and PIO interface (SPI or parallel) WAIT_FOR_STALL; @@ -3327,7 +3508,7 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h) addr_row = 0xFFFF; #if defined (SSD1963_DRIVER) - if ((rotation & 0x1) == 0) { swap_coord(xs, ys); swap_coord(xe, ye); } + if ((rotation & 0x1) == 0) { transpose(xs, ys); transpose(xe, ye); } #endif #ifdef CGRAM_OFFSET @@ -3339,7 +3520,7 @@ void TFT_eSPI::readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h) // Temporary solution is to include the RP2040 optimised code here #if (defined(ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined(RP2040_PIO_INTERFACE) - // Use hardware SPI port, this code does not swap from 8 to 16 bit + // Use hardware SPI port, this code does not swap from 8 to 16-bit // to avoid the spi_set_format() call overhead while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; DC_C; @@ -3421,7 +3602,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) begin_tft_write(); #if defined (ILI9225_DRIVER) - if (rotation & 0x01) { swap_coord(x, y); } + if (rotation & 0x01) { transpose(x, y); } SPI_BUSY_CHECK; // Set window to full screen to optimise sequential pixel rendering @@ -3456,13 +3637,13 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) #elif (defined (ARDUINO_ARCH_RP2040) || defined (ARDUINO_ARCH_MBED)) && !defined (SSD1351_DRIVER) #if defined (SSD1963_DRIVER) - if ((rotation & 0x1) == 0) { swap_coord(x, y); } + if ((rotation & 0x1) == 0) { transpose(x, y); } #endif #if !defined(RP2040_PIO_INTERFACE) while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; - #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers hw_write_masked(&spi_get_hw(SPI_X)->cr0, (16 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); #else hw_write_masked(&spi_get_hw(SPI_X)->cr0, (8 - 1) << SPI_SSPCR0_DSS_LSB, SPI_SSPCR0_DSS_BITS); @@ -3497,7 +3678,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) DC_C; spi_get_hw(SPI_X)->dr = (uint32_t)TFT_RAMWR; - #if defined (SPI_18BIT_DRIVER) // SPI 18 bit colour + #if defined (SPI_18BIT_DRIVER) // SPI 18-bit colour uint8_t r = (color & 0xF800)>>8; uint8_t g = (color & 0x07E0)>>3; uint8_t b = (color & 0x001F)<<3; @@ -3507,7 +3688,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) #else while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; DC_D; - #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16 bit transfers + #if defined (RPI_DISPLAY_TYPE) // RPi TFT type always needs 16-bit transfers spi_get_hw(SPI_X)->dr = (uint32_t)color; #else spi_get_hw(SPI_X)->dr = (uint32_t)color>>8; @@ -3515,6 +3696,24 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) #endif #endif while (spi_get_hw(SPI_X)->sr & SPI_SSPSR_BSY_BITS) {}; + #elif defined (RM68120_DRIVER) + if (addr_col != x) { + DC_C; tft_Write_16(TFT_CASET+0); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+1); DC_D; tft_Write_16(x & 0xFF); + DC_C; tft_Write_16(TFT_CASET+2); DC_D; tft_Write_16(x >> 8); + DC_C; tft_Write_16(TFT_CASET+3); DC_D; tft_Write_16(x & 0xFF); + addr_col = x; + } + if (addr_row != y) { + DC_C; tft_Write_16(TFT_PASET+0); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+1); DC_D; tft_Write_16(y & 0xFF); + DC_C; tft_Write_16(TFT_PASET+2); DC_D; tft_Write_16(y >> 8); + DC_C; tft_Write_16(TFT_PASET+3); DC_D; tft_Write_16(y & 0xFF); + addr_row = y; + } + DC_C; tft_Write_16(TFT_RAMWR); DC_D; + + TX_FIFO = color; #else // This is for the RP2040 and PIO interface (SPI or parallel) WAIT_FOR_STALL; @@ -3525,7 +3724,7 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) TX_FIFO = (y<<16) | y; TX_FIFO = TFT_RAMWR; //DC set high by PIO - #if defined (SPI_18BIT_DRIVER) + #if defined (SPI_18BIT_DRIVER) || (defined (SSD1963_DRIVER) && defined (TFT_PARALLEL_8_BIT)) TX_FIFO = ((color & 0xF800)<<8) | ((color & 0x07E0)<<5) | ((color & 0x001F)<<3); #else TX_FIFO = color; @@ -3536,13 +3735,13 @@ void TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color) #else #if defined (SSD1963_DRIVER) - if ((rotation & 0x1) == 0) { swap_coord(x, y); } + if ((rotation & 0x1) == 0) { transpose(x, y); } #endif SPI_BUSY_CHECK; #if defined (SSD1351_DRIVER) - if (rotation & 0x1) { swap_coord(x, y); } + if (rotation & 0x1) { transpose(x, y); } // No need to send x if it has not changed (speeds things up) if (addr_col != x) { DC_C; tft_Write_8(TFT_CASET); @@ -3646,7 +3845,7 @@ void TFT_eSPI::writeColor(uint16_t color, uint32_t len) /*************************************************************************************** ** Function name: pushColors -** Description: push an array of pixels for 16 bit raw image drawing +** Description: push an array of pixels for 16-bit raw image drawing ***************************************************************************************/ // Assumed that setAddrWindow() has previously been called // len is number of bytes, not pixels @@ -3680,7 +3879,7 @@ void TFT_eSPI::pushColors(uint16_t *data, uint32_t len, bool swap) ** Function name: drawLine ** Description: draw a line between 2 arbitrary points ***************************************************************************************/ -// Bresenham's algorithm - thx wikipedia - speed enhanced by Bodmer to use +// Bresenham's algorithm - thx Wikipedia - speed enhanced by Bodmer to use // an efficient FastH/V Line draw routine for line segments of 2 pixels or more void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t color) { @@ -3694,13 +3893,13 @@ void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t bool steep = abs(y1 - y0) > abs(x1 - x0); if (steep) { - swap_coord(x0, y0); - swap_coord(x1, y1); + transpose(x0, y0); + transpose(x1, y1); } if (x0 > x1) { - swap_coord(x0, x1); - swap_coord(y0, y1); + transpose(x0, x1); + transpose(y0, y1); } int32_t dx = x1 - x0, dy = abs(y1 - y0);; @@ -3751,19 +3950,295 @@ void TFT_eSPI::drawLine(int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t constexpr float PixelAlphaGain = 255.0; constexpr float LoAlphaTheshold = 1.0/32.0; constexpr float HiAlphaTheshold = 1.0 - LoAlphaTheshold; +constexpr float deg2rad = 3.14159265359/180.0; /*************************************************************************************** -** Function name: drawPixel (aplha blended) +** Function name: drawPixel (alpha blended) ** Description: Draw a pixel blended with the screen or bg pixel colour ***************************************************************************************/ uint16_t TFT_eSPI::drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color) { if (bg_color == 0x00FFFFFF) bg_color = readPixel(x, y); - color = alphaBlend(alpha, color, bg_color); + color = fastBlend(alpha, color, bg_color); drawPixel(x, y, color); return color; } + +/*************************************************************************************** +** Function name: drawSmoothArc +** Description: Draw a smooth arc clockwise from 6 o'clock +***************************************************************************************/ +void TFT_eSPI::drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds) +// Centre at x,y +// r = arc outer radius, ir = arc inner radius. Inclusive so arc thickness = r - ir + 1 +// Angles in range 0-360 +// Arc foreground colour anti-aliased with background colour at edges +// anti-aliased roundEnd is optional, default is anti-aliased straight end +// Note: rounded ends extend the arc angle so can overlap, user sketch to manage this. +{ + inTransaction = true; + + if (endAngle != startAngle && (startAngle != 0 || endAngle != 360)) + { + float sx = -sinf(startAngle * deg2rad); + float sy = +cosf(startAngle * deg2rad); + float ex = -sinf( endAngle * deg2rad); + float ey = +cosf( endAngle * deg2rad); + + if (roundEnds) + { // Round ends + sx = sx * (r + ir)/2.0 + x; + sy = sy * (r + ir)/2.0 + y; + drawSpot(sx, sy, (r - ir)/2.0, fg_color, bg_color); + + ex = ex * (r + ir)/2.0 + x; + ey = ey * (r + ir)/2.0 + y; + drawSpot(ex, ey, (r - ir)/2.0, fg_color, bg_color); + } + else + { // Square ends + float asx = sx * ir + x; + float asy = sy * ir + y; + float aex = sx * r + x; + float aey = sy * r + y; + drawWedgeLine(asx, asy, aex, aey, 0.3, 0.3, fg_color, bg_color); + + asx = ex * ir + x; + asy = ey * ir + y; + aex = ex * r + x; + aey = ey * r + y; + drawWedgeLine(asx, asy, aex, aey, 0.3, 0.3, fg_color, bg_color); + } + + // Draw arc + drawArc(x, y, r, ir, startAngle, endAngle, fg_color, bg_color); + + } + else // Draw full 360 + { + drawArc(x, y, r, ir, 0, 360, fg_color, bg_color); + } + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: sqrt_fraction (private function) +** Description: Smooth graphics support function for alpha derivation +***************************************************************************************/ +// Compute the fixed point square root of an integer and +// return the 8 MS bits of fractional part. +// Quicker than sqrt() for processors that do not have an FPU (e.g. RP2040) +inline uint8_t TFT_eSPI::sqrt_fraction(uint32_t num) { + if (num > (0x40000000)) return 0; + uint32_t bsh = 0x00004000; + uint32_t fpr = 0; + uint32_t osh = 0; + + // Auto adjust from U8:8 up to U15:16 + while (num>bsh) {bsh <<= 2; osh++;} + + do { + uint32_t bod = bsh + fpr; + if(num >= bod) + { + num -= bod; + fpr = bsh + bod; + } + num <<= 1; + } while(bsh >>= 1); + + return fpr>>osh; +} + +/*************************************************************************************** +** Function name: drawArc +** Description: Draw an arc clockwise from 6 o'clock position +***************************************************************************************/ +// Centre at x,y +// r = arc outer radius, ir = arc inner radius. Inclusive, so arc thickness = r-ir+1 +// Angles MUST be in range 0-360 +// Arc foreground fg_color anti-aliased with background colour along sides +// smooth is optional, default is true, smooth=false means no antialiasing +// Note: Arc ends are not anti-aliased (use drawSmoothArc instead for that) +void TFT_eSPI::drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, + uint32_t startAngle, uint32_t endAngle, + uint32_t fg_color, uint32_t bg_color, + bool smooth) +{ + if (endAngle > 360) endAngle = 360; + if (startAngle > 360) startAngle = 360; + if (_vpOoB || startAngle == endAngle) return; + if (r < ir) transpose(r, ir); // Required that r > ir + if (r <= 0 || ir < 0) return; // Invalid r, ir can be zero (circle sector) + + if (endAngle < startAngle) { + // Arc sweeps through 6 o'clock so draw in two parts + if (startAngle < 360) drawArc(x, y, r, ir, startAngle, 360, fg_color, bg_color, smooth); + if (endAngle == 0) return; + startAngle = 0; + } + inTransaction = true; + + int32_t xs = 0; // x start position for quadrant scan + uint8_t alpha = 0; // alpha value for blending pixels + + uint32_t r2 = r * r; // Outer arc radius^2 + if (smooth) r++; // Outer AA zone radius + uint32_t r1 = r * r; // Outer AA radius^2 + int16_t w = r - ir; // Width of arc (r - ir + 1) + uint32_t r3 = ir * ir; // Inner arc radius^2 + if (smooth) ir--; // Inner AA zone radius + uint32_t r4 = ir * ir; // Inner AA radius^2 + + // 1 | 2 + // ---¦--- Arc quadrant index + // 0 | 3 + // Fixed point U16.16 slope table for arc start/end in each quadrant + uint32_t startSlope[4] = {0, 0, 0xFFFFFFFF, 0}; + uint32_t endSlope[4] = {0, 0xFFFFFFFF, 0, 0}; + + // Ensure maximum U16.16 slope of arc ends is ~ 0x8000 0000 + constexpr float minDivisor = 1.0f/0x8000; + + // Fill in start slope table and empty quadrants + float fabscos = fabsf(cosf(startAngle * deg2rad)); + float fabssin = fabsf(sinf(startAngle * deg2rad)); + + // U16.16 slope of arc start + uint32_t slope = (fabscos/(fabssin + minDivisor)) * (float)(1UL<<16); + + // Update slope table, add slope for arc start + if (startAngle <= 90) { + startSlope[0] = slope; + } + else if (startAngle <= 180) { + startSlope[1] = slope; + } + else if (startAngle <= 270) { + startSlope[1] = 0xFFFFFFFF; + startSlope[2] = slope; + } + else { + startSlope[1] = 0xFFFFFFFF; + startSlope[2] = 0; + startSlope[3] = slope; + } + + // Fill in end slope table and empty quadrants + fabscos = fabsf(cosf(endAngle * deg2rad)); + fabssin = fabsf(sinf(endAngle * deg2rad)); + + // U16.16 slope of arc end + slope = (uint32_t)((fabscos/(fabssin + minDivisor)) * (float)(1UL<<16)); + + // Work out which quadrants will need to be drawn and add slope for arc end + if (endAngle <= 90) { + endSlope[0] = slope; + endSlope[1] = 0; + startSlope[2] = 0; + } + else if (endAngle <= 180) { + endSlope[1] = slope; + startSlope[2] = 0; + } + else if (endAngle <= 270) { + endSlope[2] = slope; + } + else { + endSlope[3] = slope; + } + + // Scan quadrant + for (int32_t cy = r - 1; cy > 0; cy--) + { + uint32_t len[4] = { 0, 0, 0, 0}; // Pixel run length + int32_t xst[4] = {-1, -1, -1, -1}; // Pixel run x start + uint32_t dy2 = (r - cy) * (r - cy); + + // Find and track arc zone start point + while ((r - xs) * (r - xs) + dy2 >= r1) xs++; + + for (int32_t cx = xs; cx < r; cx++) + { + // Calculate radius^2 + uint32_t hyp = (r - cx) * (r - cx) + dy2; + + // If in outer zone calculate alpha + if (hyp > r2) { + alpha = ~sqrt_fraction(hyp); // Outer AA zone + } + // If within arc fill zone, get line start and lengths for each quadrant + else if (hyp >= r3) { + // Calculate U16.16 slope + slope = ((r - cy) << 16)/(r - cx); + if (slope <= startSlope[0] && slope >= endSlope[0]) { // slope hi -> lo + xst[0] = cx; // Bottom left line end + len[0]++; + } + if (slope >= startSlope[1] && slope <= endSlope[1]) { // slope lo -> hi + xst[1] = cx; // Top left line end + len[1]++; + } + if (slope <= startSlope[2] && slope >= endSlope[2]) { // slope hi -> lo + xst[2] = cx; // Bottom right line start + len[2]++; + } + if (slope <= endSlope[3] && slope >= startSlope[3]) { // slope lo -> hi + xst[3] = cx; // Top right line start + len[3]++; + } + continue; // Next x + } + else { + if (hyp <= r4) break; // Skip inner pixels + alpha = sqrt_fraction(hyp); // Inner AA zone + } + + if (alpha < 16) continue; // Skip low alpha pixels + + // If background is read it must be done in each quadrant + uint16_t pcol = fastBlend(alpha, fg_color, bg_color); + // Check if an AA pixels need to be drawn + slope = ((r - cy)<<16)/(r - cx); + if (slope <= startSlope[0] && slope >= endSlope[0]) // BL + drawPixel(x + cx - r, y - cy + r, pcol); + if (slope >= startSlope[1] && slope <= endSlope[1]) // TL + drawPixel(x + cx - r, y + cy - r, pcol); + if (slope <= startSlope[2] && slope >= endSlope[2]) // TR + drawPixel(x - cx + r, y + cy - r, pcol); + if (slope <= endSlope[3] && slope >= startSlope[3]) // BR + drawPixel(x - cx + r, y - cy + r, pcol); + } + // Add line in inner zone + if (len[0]) drawFastHLine(x + xst[0] - len[0] + 1 - r, y - cy + r, len[0], fg_color); // BL + if (len[1]) drawFastHLine(x + xst[1] - len[1] + 1 - r, y + cy - r, len[1], fg_color); // TL + if (len[2]) drawFastHLine(x - xst[2] + r, y + cy - r, len[2], fg_color); // TR + if (len[3]) drawFastHLine(x - xst[3] + r, y - cy + r, len[3], fg_color); // BR + } + + // Fill in centre lines + if (startAngle == 0 || endAngle == 360) drawFastVLine(x, y + r - w, w, fg_color); // Bottom + if (startAngle <= 90 && endAngle >= 90) drawFastHLine(x - r + 1, y, w, fg_color); // Left + if (startAngle <= 180 && endAngle >= 180) drawFastVLine(x, y - r + 1, w, fg_color); // Top + if (startAngle <= 270 && endAngle >= 270) drawFastHLine(x + r - w, y, w, fg_color); // Right + + inTransaction = lockTransaction; + end_tft_write(); +} + +/*************************************************************************************** +** Function name: drawSmoothCircle +** Description: Draw a smooth circle +***************************************************************************************/ +// To have effective anti-aliasing the circle will be 3 pixels thick +void TFT_eSPI::drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color) +{ + drawSmoothRoundRect(x-r, y-r, r, r-1, 0, 0, fg_color, bg_color); +} + /*************************************************************************************** ** Function name: fillSmoothCircle ** Description: Draw a filled anti-aliased circle @@ -3790,11 +4265,11 @@ void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, int32_t hyp2 = (r - cx) * (r - cx) + dy2; if (hyp2 <= r1) break; if (hyp2 >= r2) continue; - float alphaf = (float)r - sqrtf(hyp2); - if (alphaf > HiAlphaTheshold) break; + + uint8_t alpha = ~sqrt_fraction(hyp2); + if (alpha > 246) break; xs = cx; - if (alphaf < LoAlphaTheshold) continue; - uint8_t alpha = alphaf * 255; + if (alpha < 9) continue; if (bg_color == 0x00FFFFFF) { drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); @@ -3817,6 +4292,109 @@ void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, } +/*************************************************************************************** +** Function name: drawSmoothRoundRect +** Description: Draw a rounded rectangle +***************************************************************************************/ +// x,y is top left corner of bounding box for a complete rounded rectangle +// r = arc outer corner radius, ir = arc inner radius. Arc thickness = r-ir+1 +// w and h are width and height of the bounding rectangle +// If w and h are < radius (e.g. 0,0) a circle will be drawn with centre at x+r,y+r +// Arc foreground fg_color anti-aliased with background colour at edges +// A subset of corners can be drawn by specifying a quadrants mask. A bit set in the +// mask means draw that quadrant (all are drawn if parameter missing): +// 0x1 | 0x2 +// ---¦--- Arc quadrant mask select bits (as in drawCircleHelper fn) +// 0x8 | 0x4 +void TFT_eSPI::drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color, uint8_t quadrants) +{ + if (_vpOoB) return; + if (r < ir) transpose(r, ir); // Required that r > ir + if (r <= 0 || ir < 0) return; // Invalid + + w -= 2*r; + h -= 2*r; + + if (w < 0) w = 0; + if (h < 0) h = 0; + + inTransaction = true; + + x += r; + y += r; + + uint16_t t = r - ir + 1; + int32_t xs = 0; + int32_t cx = 0; + + int32_t r2 = r * r; // Outer arc radius^2 + r++; + int32_t r1 = r * r; // Outer AA zone radius^2 + + int32_t r3 = ir * ir; // Inner arc radius^2 + ir--; + int32_t r4 = ir * ir; // Inner AA zone radius^2 + + uint8_t alpha = 0; + + // Scan top left quadrant x y r ir fg_color bg_color + for (int32_t cy = r - 1; cy > 0; cy--) + { + int32_t len = 0; // Pixel run length + int32_t lxst = 0; // Left side run x start + int32_t rxst = 0; // Right side run x start + int32_t dy2 = (r - cy) * (r - cy); + + // Find and track arc zone start point + while ((r - xs) * (r - xs) + dy2 >= r1) xs++; + + for (cx = xs; cx < r; cx++) + { + // Calculate radius^2 + int32_t hyp = (r - cx) * (r - cx) + dy2; + + // If in outer zone calculate alpha + if (hyp > r2) { + alpha = ~sqrt_fraction(hyp); // Outer AA zone + } + // If within arc fill zone, get line lengths for each quadrant + else if (hyp >= r3) { + rxst = cx; // Right side start + len++; // Line segment length + continue; // Next x + } + else { + if (hyp <= r4) break; // Skip inner pixels + alpha = sqrt_fraction(hyp); // Inner AA zone + } + + if (alpha < 16) continue; // Skip low alpha pixels + + // If background is read it must be done in each quadrant - TODO + uint16_t pcol = fastBlend(alpha, fg_color, bg_color); + if (quadrants & 0x8) drawPixel(x + cx - r, y - cy + r + h, pcol); // BL + if (quadrants & 0x1) drawPixel(x + cx - r, y + cy - r, pcol); // TL + if (quadrants & 0x2) drawPixel(x - cx + r + w, y + cy - r, pcol); // TR + if (quadrants & 0x4) drawPixel(x - cx + r + w, y - cy + r + h, pcol); // BR + } + // Fill arc inner zone in each quadrant + lxst = rxst - len + 1; // Calculate line segment start for left side + if (quadrants & 0x8) drawFastHLine(x + lxst - r, y - cy + r + h, len, fg_color); // BL + if (quadrants & 0x1) drawFastHLine(x + lxst - r, y + cy - r, len, fg_color); // TL + if (quadrants & 0x2) drawFastHLine(x - rxst + r + w, y + cy - r, len, fg_color); // TR + if (quadrants & 0x4) drawFastHLine(x - rxst + r + w, y - cy + r + h, len, fg_color); // BR + } + + // Draw sides + if ((quadrants & 0xC) == 0xC) fillRect(x, y + r - t + h, w + 1, t, fg_color); // Bottom + if ((quadrants & 0x9) == 0x9) fillRect(x - r + 1, y, t, h + 1, fg_color); // Left + if ((quadrants & 0x3) == 0x3) fillRect(x, y - r + 1, w + 1, t, fg_color); // Top + if ((quadrants & 0x6) == 0x6) fillRect(x + r - t + w, y, t, h + 1, fg_color); // Right + + inTransaction = lockTransaction; + end_tft_write(); +} + /*************************************************************************************** ** Function name: fillSmoothRoundRect ** Description: Draw a filled anti-aliased rounded corner rectangle @@ -3824,19 +4402,23 @@ void TFT_eSPI::fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t r, uint32_t color, uint32_t bg_color) { inTransaction = true; + int32_t xs = 0; int32_t cx = 0; // Limit radius to half width or height + if (r < 0) r = 0; if (r > w/2) r = w/2; if (r > h/2) r = h/2; y += r; h -= 2*r; fillRect(x, y, w, h, color); + h--; x += r; w -= 2*r+1; + int32_t r1 = r * r; r++; int32_t r2 = r * r; @@ -3849,11 +4431,11 @@ void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, i int32_t hyp2 = (r - cx) * (r - cx) + dy2; if (hyp2 <= r1) break; if (hyp2 >= r2) continue; - float alphaf = (float)r - sqrtf(hyp2); - if (alphaf > HiAlphaTheshold) break; + + uint8_t alpha = ~sqrt_fraction(hyp2); + if (alpha > 246) break; xs = cx; - if (alphaf < LoAlphaTheshold) continue; - uint8_t alpha = alphaf * 255; + if (alpha < 9) continue; drawPixel(x + cx - r, y + cy - r, color, alpha, bg_color); drawPixel(x - cx + r + w, y + cy - r, color, alpha, bg_color); @@ -3871,6 +4453,7 @@ void TFT_eSPI::fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, i ** Function name: drawSpot - maths intensive, so for small filled circles ** Description: Draw an anti-aliased filled circle at ax,ay with radius r ***************************************************************************************/ +// Coordinates are floating point to achieve sub-pixel positioning void TFT_eSPI::drawSpot(float ax, float ay, float r, uint32_t fg_color, uint32_t bg_color) { // Filled circle can be created by the wide line function with zero line length @@ -3887,12 +4470,13 @@ void TFT_eSPI::drawWideLine(float ax, float ay, float bx, float by, float wd, ui } /*************************************************************************************** -** Function name: drawWedgeLine +** Function name: drawWedgeLine - background colour specified or pixel read ** Description: draw an anti-aliased line with different width radiused ends ***************************************************************************************/ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, float br, uint32_t fg_color, uint32_t bg_color) { - if ( (abs(ax - bx) < 0.01f) && (abs(ay - by) < 0.01f) ) bx += 0.01f; // Avoid divide by zero + if ( (ar < 0.0) || (br < 0.0) )return; + if ( (fabsf(ax - bx) < 0.01f) && (fabsf(ay - by) < 0.01f) ) bx += 0.01f; // Avoid divide by zero // Find line bounding box int32_t x0 = (int32_t)floorf(fminf(ax-ar, bx-br)); @@ -3930,16 +4514,26 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f // Track edge to minimise calculations if (!endX) { endX = true; xs = xp; } if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(fg_color); + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif continue; } //Blend color with background and plot if (bg_color == 0x00FFFFFF) { bg = readPixel(xp, yp); swin = true; } - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #ifdef GC9A01_DRIVER + uint16_t pcol = fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + swin = swin; + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif } } @@ -3958,16 +4552,26 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f // Track line boundary if (!endX) { endX = true; xs = xp; } if (alpha > HiAlphaTheshold) { - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(fg_color); + #ifdef GC9A01_DRIVER + drawPixel(xp, yp, fg_color); + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fg_color); + #endif continue; } - //Blend color with background and plot + //Blend colour with background and plot if (bg_color == 0x00FFFFFF) { bg = readPixel(xp, yp); swin = true; } - if (swin) { setWindow(xp, yp, width()-1, yp); swin = false; } - pushColor(alphaBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #ifdef GC9A01_DRIVER + uint16_t pcol = fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg); + drawPixel(xp, yp, pcol); + swin = swin; + #else + if (swin) { setWindow(xp, yp, x1, yp); swin = false; } + pushColor(fastBlend((uint8_t)(alpha * PixelAlphaGain), fg_color, bg)); + #endif } } @@ -3975,7 +4579,7 @@ void TFT_eSPI::drawWedgeLine(float ax, float ay, float bx, float by, float ar, f end_nin_write(); } -// Calculate distance of px,py to closest part of line + /*************************************************************************************** ** Function name: lineDistance - private helper function for drawWedgeLine ** Description: returns distance of px,py to closest part of a to b wedge @@ -4111,21 +4715,19 @@ void TFT_eSPI::fillRectVGradient(int16_t x, int16_t y, int16_t w, int16_t h, uin if ((w < 1) || (h < 1)) return; - begin_tft_write(); - - setWindow(x, y, x + w - 1, y + h - 1); + begin_nin_write(); float delta = -255.0/h; float alpha = 255.0; uint32_t color = color1; while (h--) { - pushBlock(color, w); + drawFastHLine(x, y++, w, color); alpha += delta; - color = alphaBlend((uint8_t)alpha, color1, color2); + color = fastBlend((uint8_t)alpha, color1, color2); } - end_tft_write(); + end_nin_write(); } @@ -4151,7 +4753,7 @@ void TFT_eSPI::fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, uin if ((w < 1) || (h < 1)) return; - begin_tft_write(); + begin_nin_write(); float delta = -255.0/w; float alpha = 255.0; @@ -4160,16 +4762,16 @@ void TFT_eSPI::fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, uin while (w--) { drawFastVLine(x++, y, h, color); alpha += delta; - color = alphaBlend((uint8_t)alpha, color1, color2); + color = fastBlend((uint8_t)alpha, color1, color2); } - end_tft_write(); + end_nin_write(); } /*************************************************************************************** ** Function name: color565 -** Description: convert three 8 bit RGB levels to a 16 bit colour value +** Description: convert three 8-bit RGB levels to a 16-bit colour value ***************************************************************************************/ uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b) { @@ -4179,7 +4781,7 @@ uint16_t TFT_eSPI::color565(uint8_t r, uint8_t g, uint8_t b) /*************************************************************************************** ** Function name: color16to8 -** Description: convert 16 bit colour to an 8 bit 332 RGB colour value +** Description: convert 16-bit colour to an 8-bit 332 RGB colour value ***************************************************************************************/ uint8_t TFT_eSPI::color16to8(uint16_t c) { @@ -4189,11 +4791,11 @@ uint8_t TFT_eSPI::color16to8(uint16_t c) /*************************************************************************************** ** Function name: color8to16 -** Description: convert 8 bit colour to a 16 bit 565 colour value +** Description: convert 8-bit colour to a 16-bit 565 colour value ***************************************************************************************/ uint16_t TFT_eSPI::color8to16(uint8_t color) { - uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5 bit colour lookup table + uint8_t blue[] = {0, 11, 21, 31}; // blue 2 to 5-bit colour lookup table uint16_t color16 = 0; // =====Green===== ===============Red============== @@ -4206,7 +4808,7 @@ uint16_t TFT_eSPI::color8to16(uint8_t color) /*************************************************************************************** ** Function name: color16to24 -** Description: convert 16 bit colour to a 24 bit 888 colour value +** Description: convert 16-bit colour to a 24-bit 888 colour value ***************************************************************************************/ uint32_t TFT_eSPI::color16to24(uint16_t color565) { @@ -4219,7 +4821,7 @@ uint32_t TFT_eSPI::color16to24(uint16_t color565) /*************************************************************************************** ** Function name: color24to16 -** Description: convert 24 bit colour to a 16 bit 565 colour value +** Description: convert 24-bit colour to a 16-bit 565 colour value ***************************************************************************************/ uint32_t TFT_eSPI::color24to16(uint32_t color888) { @@ -4300,26 +4902,26 @@ uint16_t TFT_eSPI::decodeUTF8(uint8_t c) { if (!_utf8) return c; - // 7 bit Unicode Code Point + // 7-bit Unicode Code Point if ((c & 0x80) == 0x00) { decoderState = 0; return c; } if (decoderState == 0) { - // 11 bit Unicode Code Point + // 11-bit Unicode Code Point if ((c & 0xE0) == 0xC0) { decoderBuffer = ((c & 0x1F)<<6); decoderState = 1; return 0; } - // 16 bit Unicode Code Point + // 16-bit Unicode Code Point if ((c & 0xF0) == 0xE0) { decoderBuffer = ((c & 0x0F)<<12); decoderState = 2; return 0; } - // 21 bit Unicode Code Point not supported so fall-back to extended ASCII + // 21-bit Unicode Code Point not supported so fall-back to extended ASCII // if ((c & 0xF8) == 0xF0) return c; } else { @@ -4352,21 +4954,24 @@ uint16_t TFT_eSPI::decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining) if (!_utf8) return c; - // 7 bit Unicode + // 7-bit Unicode if ((c & 0x80) == 0x00) return c; - // 11 bit Unicode + // 11-bit Unicode if (((c & 0xE0) == 0xC0) && (remaining > 1)) return ((c & 0x1F)<<6) | (buf[(*index)++]&0x3F); - // 16 bit Unicode + // 16-bit Unicode if (((c & 0xF0) == 0xE0) && (remaining > 2)) { c = ((c & 0x0F)<<12) | ((buf[(*index)++]&0x3F)<<6); return c | ((buf[(*index)++]&0x3F)); } - // 21 bit Unicode not supported so fall-back to extended ASCII - // if ((c & 0xF8) == 0xF0) return c; + // 21-bit Unicode not supported so fall-back to extended ASCII + // if (((c & 0xF8) == 0xF0) && (remaining > 3)) { + // c = ((c & 0x07) << 18) | ((buf[(*index)++] & 0x03F) << 12); + // c |= ((buf[(*index)++] & 0x3F) << 6); + // return c | ((buf[(*index)++] & 0x3F)); return c; // fall-back to extended ASCII } @@ -4378,24 +4983,14 @@ uint16_t TFT_eSPI::decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining) *************************************************************************************x*/ uint16_t TFT_eSPI::alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc) { - // For speed use fixed point maths and rounding to permit a power of 2 division - uint16_t fgR = ((fgc >> 10) & 0x3E) + 1; - uint16_t fgG = ((fgc >> 4) & 0x7E) + 1; - uint16_t fgB = ((fgc << 1) & 0x3E) + 1; - - uint16_t bgR = ((bgc >> 10) & 0x3E) + 1; - uint16_t bgG = ((bgc >> 4) & 0x7E) + 1; - uint16_t bgB = ((bgc << 1) & 0x3E) + 1; - - // Shift right 1 to drop rounding bit and shift right 8 to divide by 256 - uint16_t r = (((fgR * alpha) + (bgR * (255 - alpha))) >> 9); - uint16_t g = (((fgG * alpha) + (bgG * (255 - alpha))) >> 9); - uint16_t b = (((fgB * alpha) + (bgB * (255 - alpha))) >> 9); - - // Combine RGB565 colours into 16 bits - //return ((r&0x18) << 11) | ((g&0x30) << 5) | ((b&0x18) << 0); // 2 bit greyscale - //return ((r&0x1E) << 11) | ((g&0x3C) << 5) | ((b&0x1E) << 0); // 4 bit greyscale - return (r << 11) | (g << 5) | (b << 0); + // Split out and blend 5-bit red and blue channels + uint32_t rxb = bgc & 0xF81F; + rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; + // Split out and blend 6-bit green channel + uint32_t xgx = bgc & 0x07E0; + xgx += ((fgc & 0x07E0) - xgx) * alpha >> 8; + // Recombine channels + return (rxb & 0xF81F) | (xgx & 0x07E0); } /*************************************************************************************** @@ -4428,22 +5023,13 @@ uint32_t TFT_eSPI::alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, uint8 if (alphaDither >255) alpha = 255; } - // For speed use fixed point maths and rounding to permit a power of 2 division - uint16_t fgR = ((fgc >> 15) & 0x1FE) + 1; - uint16_t fgG = ((fgc >> 7) & 0x1FE) + 1; - uint16_t fgB = ((fgc << 1) & 0x1FE) + 1; - - uint16_t bgR = ((bgc >> 15) & 0x1FE) + 1; - uint16_t bgG = ((bgc >> 7) & 0x1FE) + 1; - uint16_t bgB = ((bgc << 1) & 0x1FE) + 1; - - // Shift right 1 to drop rounding bit and shift right 8 to divide by 256 - uint16_t r = (((fgR * alpha) + (bgR * (255 - alpha))) >> 9); - uint16_t g = (((fgG * alpha) + (bgG * (255 - alpha))) >> 9); - uint16_t b = (((fgB * alpha) + (bgB * (255 - alpha))) >> 9); - - // Combine RGB colours into 24 bits - return (r << 16) | (g << 8) | (b << 0); + uint32_t rxx = bgc & 0xFF0000; + rxx += ((fgc & 0xFF0000) - rxx) * alpha >> 8; + uint32_t xgx = bgc & 0x00FF00; + xgx += ((fgc & 0x00FF00) - xgx) * alpha >> 8; + uint32_t xxb = bgc & 0x0000FF; + xxb += ((fgc & 0x0000FF) - xxb) * alpha >> 8; + return (rxx & 0xFF0000) | (xgx & 0x00FF00) | (xxb & 0x0000FF); } /*************************************************************************************** @@ -4451,7 +5037,7 @@ uint32_t TFT_eSPI::alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, uint8 ** Description: draw characters piped through serial stream ***************************************************************************************/ /* // Not all processors support buffered write -#ifndef ESP8266 // Avoid ESP8266 board package bug +#ifndef ARDUINO_ARCH_ESP8266 // Avoid ESP8266 board package bug size_t TFT_eSPI::write(const uint8_t *buf, size_t len) { inTransaction = true; @@ -4490,7 +5076,6 @@ size_t TFT_eSPI::write(uint8_t utf8) #endif if (uniCode == '\n') uniCode+=22; // Make it a valid space character to stop errors - else if (uniCode < 32) return 1; uint16_t cwidth = 0; uint16_t cheight = 0; @@ -4509,7 +5094,7 @@ size_t TFT_eSPI::write(uint8_t utf8) #ifdef LOAD_FONT2 if (textfont == 2) { - if (uniCode > 127) return 1; + if (uniCode < 32 || uniCode > 127) return 1; cwidth = pgm_read_byte(widtbl_f16 + uniCode-32); cheight = chr_hgt_f16; @@ -4525,7 +5110,7 @@ size_t TFT_eSPI::write(uint8_t utf8) #ifdef LOAD_RLE { if ((textfont>2) && (textfont<9)) { - if (uniCode > 127) return 1; + if (uniCode < 32 || uniCode > 127) return 1; // Uses the fontinfo struct array to avoid lots of 'if' or 'switch' statements cwidth = pgm_read_byte( (uint8_t *)pgm_read_dword( &(fontdata[textfont].widthtbl ) ) + uniCode-32 ); cheight= pgm_read_byte( &fontdata[textfont].height ); @@ -4772,7 +5357,7 @@ int16_t TFT_eSPI::drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font) uint8_t tnp = 0; // Temporary copy of np for while loop uint8_t ts = textsize - 1; // Temporary copy of textsize - // 16 bit pixel count so maximum font size is equivalent to 180x180 pixels in area + // 16-bit pixel count so maximum font size is equivalent to 180x180 pixels in area // w is total number of pixels to plot to fill character block while (pc < w) { line = pgm_read_byte((uint8_t *)flash_address); @@ -4918,6 +5503,8 @@ int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY) // With font number. Note: font number is over-ridden if a smooth font is loaded int16_t TFT_eSPI::drawString(const char *string, int32_t poX, int32_t poY, uint8_t font) { + if (font > 8) return 0; + int16_t sumX = 0; uint8_t padding = 1, baseline = 0; uint16_t cwidth = textWidth(string, font); // Find the pixel width of the string in the font @@ -5323,6 +5910,7 @@ void TFT_eSPI::setFreeFont(const GFXfont *f) void TFT_eSPI::setTextFont(uint8_t f) { textfont = (f > 0) ? f : 1; // Don't allow font 0 + textfont = (f > 8) ? 1 : f; // Don't allow font > 8 gfxFont = NULL; } @@ -5348,6 +5936,7 @@ void TFT_eSPI::setFreeFont(uint8_t font) void TFT_eSPI::setTextFont(uint8_t f) { textfont = (f > 0) ? f : 1; // Don't allow font 0 + textfont = (f > 8) ? 1 : f; // Don't allow font > 8 } #endif @@ -5356,7 +5945,7 @@ void TFT_eSPI::setTextFont(uint8_t f) ** Function name: getSPIinstance ** Description: Get the instance of the SPI class ***************************************************************************************/ -#if !defined (TFT_PARALLEL_8_BIT) && ! defined (RP2040_PIO_INTERFACE) +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) SPIClass& TFT_eSPI::getSPIinstance(void) { return spi; @@ -5419,10 +6008,12 @@ void TFT_eSPI::getSetup(setup_t &tft_settings) #ifdef SPI_READ_FREQUENCY tft_settings.tft_rd_freq = SPI_READ_FREQUENCY/100000; #endif - #ifdef TFT_SPI_PORT - tft_settings.port = TFT_SPI_PORT; - #else - tft_settings.port = 255; + #ifndef GENERIC_PROCESSOR + #ifdef TFT_SPI_PORT + tft_settings.port = TFT_SPI_PORT; + #else + tft_settings.port = 255; + #endif #endif #ifdef RP2040_PIO_SPI tft_settings.interface = 0x10; diff --git a/libraries/TFT_eSPI-2.5.43/TFT_eSPI.h b/libraries/TFT_eSPI-2.5.43/TFT_eSPI.h new file mode 100644 index 00000000..8ae23427 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/TFT_eSPI.h @@ -0,0 +1,1011 @@ +/*************************************************** + Arduino TFT graphics library targeted at ESP8266 + and ESP32 based boards. + + This is a stand-alone library that contains the + hardware driver, the graphics functions and the + proportional fonts. + + The built-in fonts 4, 6, 7 and 8 are Run Length + Encoded (RLE) to reduce the FLASH footprint. + + Last review/edit by Bodmer: 04/02/22 + ****************************************************/ + +// Stop fonts etc. being loaded multiple times +#ifndef _TFT_eSPIH_ +#define _TFT_eSPIH_ + +#define TFT_ESPI_VERSION "2.5.43" + +// Bit level feature flags +// Bit 0 set: viewport capability +#define TFT_ESPI_FEATURES 1 + +/*************************************************************************************** +** Section 1: Load required header files +***************************************************************************************/ + +//Standard support +#include +#include +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) + #include +#endif +/*************************************************************************************** +** Section 2: Load library and processor specific header files +***************************************************************************************/ +// Include header file that defines the fonts loaded, the TFT drivers +// available and the pins to be used, etc. etc. +#ifdef CONFIG_TFT_eSPI_ESPIDF + #include "TFT_config.h" +#endif + +// New ESP8266 board package uses ARDUINO_ARCH_ESP8266 +// old package defined ESP8266 +#if defined (ESP8266) + #ifndef ARDUINO_ARCH_ESP8266 + #define ARDUINO_ARCH_ESP8266 + #endif +#endif + +// The following lines allow the user setup to be included in the sketch folder, see +// "Sketch_with_tft_setup" generic example. +#if !defined __has_include + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning Compiler does not support __has_include, so sketches cannot define the setup + #endif +#else + #if __has_include() + // Include the sketch setup file + #include + #ifndef USER_SETUP_LOADED + // Prevent loading further setups + #define USER_SETUP_LOADED + #endif + #endif +#endif + +#include + +// Handle FLASH based storage e.g. PROGMEM +#if defined(ARDUINO_ARCH_RP2040) + #undef pgm_read_byte + #define pgm_read_byte(addr) (*(const unsigned char *)(addr)) + #undef pgm_read_word + #define pgm_read_word(addr) ({ \ + typeof(addr) _addr = (addr); \ + *(const unsigned short *)(_addr); \ + }) + #undef pgm_read_dword + #define pgm_read_dword(addr) ({ \ + typeof(addr) _addr = (addr); \ + *(const unsigned long *)(_addr); \ + }) +#elif defined(__AVR__) + #include +#elif defined(ARDUINO_ARCH_ESP8266) || defined(ESP32) + #include +#else + #ifndef PROGMEM + #define PROGMEM + #endif +#endif + +// Include the processor specific drivers +#if defined(CONFIG_IDF_TARGET_ESP32S3) + #include "Processors/TFT_eSPI_ESP32_S3.h" +#elif defined(CONFIG_IDF_TARGET_ESP32C3) + #include "Processors/TFT_eSPI_ESP32_C3.h" +#elif defined (ESP32) + #include "Processors/TFT_eSPI_ESP32.h" +#elif defined (ARDUINO_ARCH_ESP8266) + #include "Processors/TFT_eSPI_ESP8266.h" +#elif defined (STM32) + #include "Processors/TFT_eSPI_STM32.h" +#elif defined(ARDUINO_ARCH_RP2040) + #include "Processors/TFT_eSPI_RP2040.h" +#else + #include "Processors/TFT_eSPI_Generic.h" + #define GENERIC_PROCESSOR +#endif + +/*************************************************************************************** +** Section 3: Interface setup +***************************************************************************************/ +#ifndef TAB_COLOUR + #define TAB_COLOUR 0 +#endif + +// If the SPI frequency is not defined, set a default +#ifndef SPI_FREQUENCY + #define SPI_FREQUENCY 20000000 +#endif + +// If the SPI read frequency is not defined, set a default +#ifndef SPI_READ_FREQUENCY + #define SPI_READ_FREQUENCY 10000000 +#endif + +// Some ST7789 boards do not work with Mode 0 +#ifndef TFT_SPI_MODE + #if defined(ST7789_DRIVER) || defined(ST7789_2_DRIVER) + #define TFT_SPI_MODE SPI_MODE3 + #else + #define TFT_SPI_MODE SPI_MODE0 + #endif +#endif + +// If the XPT2046 SPI frequency is not defined, set a default +#ifndef SPI_TOUCH_FREQUENCY + #define SPI_TOUCH_FREQUENCY 2500000 +#endif + +#ifndef SPI_BUSY_CHECK + #define SPI_BUSY_CHECK +#endif + +// If half duplex SDA mode is defined then MISO pin should be -1 +#ifdef TFT_SDA_READ + #ifdef TFT_MISO + #if TFT_MISO != -1 + #undef TFT_MISO + #define TFT_MISO -1 + #warning TFT_MISO set to -1 + #endif + #endif +#endif + +/*************************************************************************************** +** Section 4: Setup fonts +***************************************************************************************/ +// Use GLCD font in error case where user requests a smooth font file +// that does not exist (this is a temporary fix to stop ESP32 reboot) +#ifdef SMOOTH_FONT + #ifndef LOAD_GLCD + #define LOAD_GLCD + #endif +#endif + +// Only load the fonts defined in User_Setup.h (to save space) +// Set flag so RLE rendering code is optionally compiled +#ifdef LOAD_GLCD + #include +#endif + +#ifdef LOAD_FONT2 + #include +#endif + +#ifdef LOAD_FONT4 + #include + #define LOAD_RLE +#endif + +#ifdef LOAD_FONT6 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_FONT7 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_FONT8 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#elif defined LOAD_FONT8N // Optional narrower version + #define LOAD_FONT8 + #include + #ifndef LOAD_RLE + #define LOAD_RLE + #endif +#endif + +#ifdef LOAD_GFXFF + // We can include all the free fonts and they will only be built into + // the sketch if they are used + #include + // Call up any user custom fonts + #include +#endif // #ifdef LOAD_GFXFF + +// Create a null default font in case some fonts not used (to prevent crash) +const uint8_t widtbl_null[1] = {0}; +PROGMEM const uint8_t chr_null[1] = {0}; +PROGMEM const uint8_t* const chrtbl_null[1] = {chr_null}; + +// This is a structure to conveniently hold information on the default fonts +// Stores pointer to font character image address table, width table and height +typedef struct { + const uint8_t *chartbl; + const uint8_t *widthtbl; + uint8_t height; + uint8_t baseline; + } fontinfo; + +// Now fill the structure +const PROGMEM fontinfo fontdata [] = { + #ifdef LOAD_GLCD + { (const uint8_t *)font, widtbl_null, 0, 0 }, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + // GLCD font (Font 1) does not have all parameters + { (const uint8_t *)chrtbl_null, widtbl_null, 8, 7 }, + + #ifdef LOAD_FONT2 + { (const uint8_t *)chrtbl_f16, widtbl_f16, chr_hgt_f16, baseline_f16}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + // Font 3 current unused + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + + #ifdef LOAD_FONT4 + { (const uint8_t *)chrtbl_f32, widtbl_f32, chr_hgt_f32, baseline_f32}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + // Font 5 current unused + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + + #ifdef LOAD_FONT6 + { (const uint8_t *)chrtbl_f64, widtbl_f64, chr_hgt_f64, baseline_f64}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + #ifdef LOAD_FONT7 + { (const uint8_t *)chrtbl_f7s, widtbl_f7s, chr_hgt_f7s, baseline_f7s}, + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 }, + #endif + + #ifdef LOAD_FONT8 + { (const uint8_t *)chrtbl_f72, widtbl_f72, chr_hgt_f72, baseline_f72} + #else + { (const uint8_t *)chrtbl_null, widtbl_null, 0, 0 } + #endif +}; + +/*************************************************************************************** +** Section 5: Font datum enumeration +***************************************************************************************/ +//These enumerate the text plotting alignment (reference datum point) +#define TL_DATUM 0 // Top left (default) +#define TC_DATUM 1 // Top centre +#define TR_DATUM 2 // Top right +#define ML_DATUM 3 // Middle left +#define CL_DATUM 3 // Centre left, same as above +#define MC_DATUM 4 // Middle centre +#define CC_DATUM 4 // Centre centre, same as above +#define MR_DATUM 5 // Middle right +#define CR_DATUM 5 // Centre right, same as above +#define BL_DATUM 6 // Bottom left +#define BC_DATUM 7 // Bottom centre +#define BR_DATUM 8 // Bottom right +#define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on) +#define C_BASELINE 10 // Centre character baseline +#define R_BASELINE 11 // Right character baseline + +/*************************************************************************************** +** Section 6: Colour enumeration +***************************************************************************************/ +// Default color definitions +#define TFT_BLACK 0x0000 /* 0, 0, 0 */ +#define TFT_NAVY 0x000F /* 0, 0, 128 */ +#define TFT_DARKGREEN 0x03E0 /* 0, 128, 0 */ +#define TFT_DARKCYAN 0x03EF /* 0, 128, 128 */ +#define TFT_MAROON 0x7800 /* 128, 0, 0 */ +#define TFT_PURPLE 0x780F /* 128, 0, 128 */ +#define TFT_OLIVE 0x7BE0 /* 128, 128, 0 */ +#define TFT_LIGHTGREY 0xD69A /* 211, 211, 211 */ +#define TFT_DARKGREY 0x7BEF /* 128, 128, 128 */ +#define TFT_BLUE 0x001F /* 0, 0, 255 */ +#define TFT_GREEN 0x07E0 /* 0, 255, 0 */ +#define TFT_CYAN 0x07FF /* 0, 255, 255 */ +#define TFT_RED 0xF800 /* 255, 0, 0 */ +#define TFT_MAGENTA 0xF81F /* 255, 0, 255 */ +#define TFT_YELLOW 0xFFE0 /* 255, 255, 0 */ +#define TFT_WHITE 0xFFFF /* 255, 255, 255 */ +#define TFT_ORANGE 0xFDA0 /* 255, 180, 0 */ +#define TFT_GREENYELLOW 0xB7E0 /* 180, 255, 0 */ +#define TFT_PINK 0xFE19 /* 255, 192, 203 */ //Lighter pink, was 0xFC9F +#define TFT_BROWN 0x9A60 /* 150, 75, 0 */ +#define TFT_GOLD 0xFEA0 /* 255, 215, 0 */ +#define TFT_SILVER 0xC618 /* 192, 192, 192 */ +#define TFT_SKYBLUE 0x867D /* 135, 206, 235 */ +#define TFT_VIOLET 0x915C /* 180, 46, 226 */ + +// Next is a special 16-bit colour value that encodes to 8 bits +// and will then decode back to the same 16-bit value. +// Convenient for 8-bit and 16-bit transparent sprites. +#define TFT_TRANSPARENT 0x0120 // This is actually a dark green + +// Default palette for 4-bit colour sprites +static const uint16_t default_4bit_palette[] PROGMEM = { + TFT_BLACK, // 0 ^ + TFT_BROWN, // 1 | + TFT_RED, // 2 | + TFT_ORANGE, // 3 | + TFT_YELLOW, // 4 Colours 0-9 follow the resistor colour code! + TFT_GREEN, // 5 | + TFT_BLUE, // 6 | + TFT_PURPLE, // 7 | + TFT_DARKGREY, // 8 | + TFT_WHITE, // 9 v + TFT_CYAN, // 10 Blue+green mix + TFT_MAGENTA, // 11 Blue+red mix + TFT_MAROON, // 12 Darker red colour + TFT_DARKGREEN,// 13 Darker green colour + TFT_NAVY, // 14 Darker blue colour + TFT_PINK // 15 +}; + +/*************************************************************************************** +** Section 7: Diagnostic support +***************************************************************************************/ +// #define TFT_eSPI_DEBUG // Switch on debug support serial messages (not used yet) +// #define TFT_eSPI_FNx_DEBUG // Switch on debug support for function "x" (not used yet) + +// This structure allows sketches to retrieve the user setup parameters at runtime +// by calling getSetup(), zero impact on code size unless used, mainly for diagnostics +typedef struct +{ +String version = TFT_ESPI_VERSION; +String setup_info; // Setup reference name available to use in a user setup +uint32_t setup_id; // ID available to use in a user setup +int32_t esp; // Processor code +uint8_t trans; // SPI transaction support +uint8_t serial; // Serial (SPI) or parallel +#ifndef GENERIC_PROCESSOR +uint8_t port; // SPI port +#endif +uint8_t overlap; // ESP8266 overlap mode +uint8_t interface; // Interface type + +uint16_t tft_driver; // Hexadecimal code +uint16_t tft_width; // Rotation 0 width and height +uint16_t tft_height; + +uint8_t r0_x_offset; // Display offsets, not all used yet +uint8_t r0_y_offset; +uint8_t r1_x_offset; +uint8_t r1_y_offset; +uint8_t r2_x_offset; +uint8_t r2_y_offset; +uint8_t r3_x_offset; +uint8_t r3_y_offset; + +int8_t pin_tft_mosi; // SPI pins +int8_t pin_tft_miso; +int8_t pin_tft_clk; +int8_t pin_tft_cs; + +int8_t pin_tft_dc; // Control pins +int8_t pin_tft_rd; +int8_t pin_tft_wr; +int8_t pin_tft_rst; + +int8_t pin_tft_d0; // Parallel port pins +int8_t pin_tft_d1; +int8_t pin_tft_d2; +int8_t pin_tft_d3; +int8_t pin_tft_d4; +int8_t pin_tft_d5; +int8_t pin_tft_d6; +int8_t pin_tft_d7; + +int8_t pin_tft_led; +int8_t pin_tft_led_on; + +int8_t pin_tch_cs; // Touch chip select pin + +int16_t tft_spi_freq;// TFT write SPI frequency +int16_t tft_rd_freq; // TFT read SPI frequency +int16_t tch_spi_freq;// Touch controller read/write SPI frequency +} setup_t; + +/*************************************************************************************** +** Section 8: Class member and support functions +***************************************************************************************/ + +// Callback prototype for smooth font pixel colour read +typedef uint16_t (*getColorCallback)(uint16_t x, uint16_t y); + +// Class functions and variables +class TFT_eSPI : public Print { friend class TFT_eSprite; // Sprite class has access to protected members + + //--------------------------------------- public ------------------------------------// + public: + + TFT_eSPI(int16_t _W = TFT_WIDTH, int16_t _H = TFT_HEIGHT); + + // init() and begin() are equivalent, begin() included for backwards compatibility + // Sketch defined tab colour option is for ST7735 displays only + void init(uint8_t tc = TAB_COLOUR), begin(uint8_t tc = TAB_COLOUR); + + // These are virtual so the TFT_eSprite class can override them with sprite specific functions + virtual void drawPixel(int32_t x, int32_t y, uint32_t color), + drawChar(int32_t x, int32_t y, uint16_t c, uint32_t color, uint32_t bg, uint8_t size), + drawLine(int32_t xs, int32_t ys, int32_t xe, int32_t ye, uint32_t color), + drawFastVLine(int32_t x, int32_t y, int32_t h, uint32_t color), + drawFastHLine(int32_t x, int32_t y, int32_t w, uint32_t color), + fillRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color); + + virtual int16_t drawChar(uint16_t uniCode, int32_t x, int32_t y, uint8_t font), + drawChar(uint16_t uniCode, int32_t x, int32_t y), + height(void), + width(void); + + // Read the colour of a pixel at x,y and return value in 565 format + virtual uint16_t readPixel(int32_t x, int32_t y); + + virtual void setWindow(int32_t xs, int32_t ys, int32_t xe, int32_t ye); // Note: start + end coordinates + + // Push (aka write pixel) colours to the set window + virtual void pushColor(uint16_t color); + + // These are non-inlined to enable override + virtual void begin_nin_write(); + virtual void end_nin_write(); + + void setRotation(uint8_t r); // Set the display image orientation to 0, 1, 2 or 3 + uint8_t getRotation(void); // Read the current rotation + + // Change the origin position from the default top left + // Note: setRotation, setViewport and resetViewport will revert origin to top left corner of screen/sprite + void setOrigin(int32_t x, int32_t y); + int32_t getOriginX(void); + int32_t getOriginY(void); + + void invertDisplay(bool i); // Tell TFT to invert all displayed colours + + + // The TFT_eSprite class inherits the following functions (not all are useful to Sprite class + void setAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); // Note: start coordinates + width and height + + // Viewport commands, see "Viewport_Demo" sketch + void setViewport(int32_t x, int32_t y, int32_t w, int32_t h, bool vpDatum = true); + bool checkViewport(int32_t x, int32_t y, int32_t w, int32_t h); + int32_t getViewportX(void); + int32_t getViewportY(void); + int32_t getViewportWidth(void); + int32_t getViewportHeight(void); + bool getViewportDatum(void); + void frameViewport(uint16_t color, int32_t w); + void resetViewport(void); + + // Clip input window to viewport bounds, return false if whole area is out of bounds + bool clipAddrWindow(int32_t* x, int32_t* y, int32_t* w, int32_t* h); + // Clip input window area to viewport bounds, return false if whole area is out of bounds + bool clipWindow(int32_t* xs, int32_t* ys, int32_t* xe, int32_t* ye); + + // Push (aka write pixel) colours to the TFT (use setAddrWindow() first) + void pushColor(uint16_t color, uint32_t len), // Deprecated, use pushBlock() + pushColors(uint16_t *data, uint32_t len, bool swap = true), // With byte swap option + pushColors(uint8_t *data, uint32_t len); // Deprecated, use pushPixels() + + // Write a solid block of a single colour + void pushBlock(uint16_t color, uint32_t len); + + // Write a set of pixels stored in memory, use setSwapBytes(true/false) function to correct endianess + void pushPixels(const void * data_in, uint32_t len); + + // Support for half duplex (bi-directional SDA) SPI bus where MOSI must be switched to input + #ifdef TFT_SDA_READ + #if defined (TFT_eSPI_ENABLE_8_BIT_READ) + uint8_t tft_Read_8(void); // Read 8-bit value from TFT command register + #endif + void begin_SDA_Read(void); // Begin a read on a half duplex (bi-directional SDA) SPI bus - sets MOSI to input + void end_SDA_Read(void); // Restore MOSI to output + #endif + + + // Graphics drawing + void fillScreen(uint32_t color), + drawRect(int32_t x, int32_t y, int32_t w, int32_t h, uint32_t color), + drawRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color), + fillRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color); + + void fillRectVGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2); + void fillRectHGradient(int16_t x, int16_t y, int16_t w, int16_t h, uint32_t color1, uint32_t color2); + + void drawCircle(int32_t x, int32_t y, int32_t r, uint32_t color), + drawCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, uint32_t color), + fillCircle(int32_t x, int32_t y, int32_t r, uint32_t color), + fillCircleHelper(int32_t x, int32_t y, int32_t r, uint8_t cornername, int32_t delta, uint32_t color), + + drawEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), + fillEllipse(int16_t x, int16_t y, int32_t rx, int32_t ry, uint16_t color), + + // Corner 1 Corner 2 Corner 3 + drawTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color), + fillTriangle(int32_t x1,int32_t y1, int32_t x2,int32_t y2, int32_t x3,int32_t y3, uint32_t color); + + + // Smooth (anti-aliased) graphics drawing + // Draw a pixel blended with the background pixel colour (bg_color) specified, return blended colour + // If the bg_color is not specified, the background pixel colour will be read from TFT or sprite + uint16_t drawPixel(int32_t x, int32_t y, uint32_t color, uint8_t alpha, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased (smooth) arc between start and end angles. Arc ends are anti-aliased. + // By default the arc is drawn with square ends unless the "roundEnds" parameter is included and set true + // Angle = 0 is at 6 o'clock position, 90 at 9 o'clock etc. The angles must be in range 0-360 or they will be clipped to these limits + // The start angle may be larger than the end angle. Arcs are always drawn clockwise from the start angle. + void drawSmoothArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool roundEnds = false); + + // As per "drawSmoothArc" except the ends of the arc are NOT anti-aliased, this facilitates dynamic arc length changes with + // arc segments and ensures clean segment joints. + // The sides of the arc are anti-aliased by default. If smoothArc is false sides will NOT be anti-aliased + void drawArc(int32_t x, int32_t y, int32_t r, int32_t ir, uint32_t startAngle, uint32_t endAngle, uint32_t fg_color, uint32_t bg_color, bool smoothArc = true); + + // Draw an anti-aliased filled circle at x, y with radius r + // Note: The thickness of line is 3 pixels to reduce the visible "braiding" effect of anti-aliasing narrow lines + // this means the inner anti-alias zone is always at r-1 and the outer zone at r+1 + void drawSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t fg_color, uint32_t bg_color); + + // Draw an anti-aliased filled circle at x, y with radius r + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void fillSmoothCircle(int32_t x, int32_t y, int32_t r, uint32_t color, uint32_t bg_color = 0x00FFFFFF); + + // Draw a rounded rectangle that has a line thickness of r-ir+1 and bounding box defined by x,y and w,h + // The outer corner radius is r, inner corner radius is ir + // The inside and outside of the border are anti-aliased + void drawSmoothRoundRect(int32_t x, int32_t y, int32_t r, int32_t ir, int32_t w, int32_t h, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF, uint8_t quadrants = 0xF); + + // Draw a filled rounded rectangle , corner radius r and bounding box defined by x,y and w,h + void fillSmoothRoundRect(int32_t x, int32_t y, int32_t w, int32_t h, int32_t radius, uint32_t color, uint32_t bg_color = 0x00FFFFFF); + + // Draw a small anti-aliased filled circle at ax,ay with radius r (uses drawWideLine) + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawSpot(float ax, float ay, float r, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased wide line from ax,ay to bx,by width wd with radiused ends (radius is wd/2) + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawWideLine(float ax, float ay, float bx, float by, float wd, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + // Draw an anti-aliased wide line from ax,ay to bx,by with different width at each end aw, bw and with radiused ends + // If bg_color is not included the background pixel colour will be read from TFT or sprite + void drawWedgeLine(float ax, float ay, float bx, float by, float aw, float bw, uint32_t fg_color, uint32_t bg_color = 0x00FFFFFF); + + + // Image rendering + // Swap the byte order for pushImage() and pushPixels() - corrects endianness + void setSwapBytes(bool swap); + bool getSwapBytes(void); + + // Draw bitmap + void drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), + drawBitmap( int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor), + drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor), + drawXBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t fgcolor, uint16_t bgcolor), + setBitmapColor(uint16_t fgcolor, uint16_t bgcolor); // Define the 2 colours for 1bpp sprites + + // Set TFT pivot point (use when rendering rotated sprites) + void setPivot(int16_t x, int16_t y); + int16_t getPivotX(void), // Get pivot x + getPivotY(void); // Get pivot y + + // The next functions can be used as a pair to copy screen blocks (or horizontal/vertical lines) to another location + // Read a block of pixels to a data buffer, buffer is 16-bit and the size must be at least w * h + void readRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + // Write a block of pixels to the screen which have been read by readRect() + void pushRect(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + + // These are used to render images or sprites stored in RAM arrays (used by Sprite class for 16bpp Sprites) + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *data, uint16_t transparent); + + // These are used to render images stored in FLASH (PROGMEM) + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data, uint16_t transparent); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint16_t *data); + + // These are used by Sprite class pushSprite() member function for 1, 4 and 8 bits per pixel (bpp) colours + // They are not intended to be used with user sketches (but could be) + // Set bpp8 true for 8bpp sprites, false otherwise. The cmap pointer must be specified for 4bpp + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, bool bpp8 = true, uint16_t *cmap = nullptr); + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data, uint8_t transparent, bool bpp8 = true, uint16_t *cmap = nullptr); + // FLASH version + void pushImage(int32_t x, int32_t y, int32_t w, int32_t h, const uint8_t *data, bool bpp8, uint16_t *cmap = nullptr); + + // Render a 16-bit colour image with a 1bpp mask + void pushMaskedImage(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t *img, uint8_t *mask); + + // This next function has been used successfully to dump the TFT screen to a PC for documentation purposes + // It reads a screen area and returns the 3 RGB 8-bit colour values of each pixel in the buffer + // Set w and h to 1 to read 1 pixel's colour. The data buffer must be at least w * h * 3 bytes + void readRectRGB(int32_t x, int32_t y, int32_t w, int32_t h, uint8_t *data); + + + // Text rendering - value returned is the pixel width of the rendered text + int16_t drawNumber(long intNumber, int32_t x, int32_t y, uint8_t font), // Draw integer using specified font number + drawNumber(long intNumber, int32_t x, int32_t y), // Draw integer using current font + + // Decimal is the number of decimal places to render + // Use with setTextDatum() to position values on TFT, and setTextPadding() to blank old displayed values + drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y, uint8_t font), // Draw float using specified font number + drawFloat(float floatNumber, uint8_t decimal, int32_t x, int32_t y), // Draw float using current font + + // Handle char arrays + // Use with setTextDatum() to position string on TFT, and setTextPadding() to blank old displayed strings + drawString(const char *string, int32_t x, int32_t y, uint8_t font), // Draw string using specified font number + drawString(const char *string, int32_t x, int32_t y), // Draw string using current font + drawString(const String& string, int32_t x, int32_t y, uint8_t font),// Draw string using specified font number + drawString(const String& string, int32_t x, int32_t y), // Draw string using current font + + drawCentreString(const char *string, int32_t x, int32_t y, uint8_t font), // Deprecated, use setTextDatum() and drawString() + drawRightString(const char *string, int32_t x, int32_t y, uint8_t font), // Deprecated, use setTextDatum() and drawString() + drawCentreString(const String& string, int32_t x, int32_t y, uint8_t font),// Deprecated, use setTextDatum() and drawString() + drawRightString(const String& string, int32_t x, int32_t y, uint8_t font); // Deprecated, use setTextDatum() and drawString() + + + // Text rendering and font handling support functions + void setCursor(int16_t x, int16_t y), // Set cursor for tft.print() + setCursor(int16_t x, int16_t y, uint8_t font); // Set cursor and font number for tft.print() + + int16_t getCursorX(void), // Read current cursor x position (moves with tft.print()) + getCursorY(void); // Read current cursor y position + + void setTextColor(uint16_t color), // Set character (glyph) color only (background not over-written) + setTextColor(uint16_t fgcolor, uint16_t bgcolor, bool bgfill = false), // Set character (glyph) foreground and background colour, optional background fill for smooth fonts + setTextSize(uint8_t size); // Set character size multiplier (this increases pixel size) + + void setTextWrap(bool wrapX, bool wrapY = false); // Turn on/off wrapping of text in TFT width and/or height + + void setTextDatum(uint8_t datum); // Set text datum position (default is top left), see Section 5 above + uint8_t getTextDatum(void); + + void setTextPadding(uint16_t x_width); // Set text padding (background blanking/over-write) width in pixels + uint16_t getTextPadding(void); // Get text padding + +#ifdef LOAD_GFXFF + void setFreeFont(const GFXfont *f = NULL), // Select the GFX Free Font + setTextFont(uint8_t font); // Set the font number to use in future +#else + void setFreeFont(uint8_t font), // Not used, historical fix to prevent an error + setTextFont(uint8_t font); // Set the font number to use in future +#endif + + int16_t textWidth(const char *string, uint8_t font), // Returns pixel width of string in specified font + textWidth(const char *string), // Returns pixel width of string in current font + textWidth(const String& string, uint8_t font), // As above for String types + textWidth(const String& string), + fontHeight(uint8_t font), // Returns pixel height of specified font + fontHeight(void); // Returns pixel height of current font + + // Used by library and Smooth font class to extract Unicode point codes from a UTF8 encoded string + uint16_t decodeUTF8(uint8_t *buf, uint16_t *index, uint16_t remaining), + decodeUTF8(uint8_t c); + + // Support function to UTF8 decode and draw characters piped through print stream + size_t write(uint8_t); + // size_t write(const uint8_t *buf, size_t len); + + // Used by Smooth font class to fetch a pixel colour for the anti-aliasing + void setCallback(getColorCallback getCol); + + uint16_t fontsLoaded(void); // Each bit in returned value represents a font type that is loaded - used for debug/error handling only + + + // Low level read/write + void spiwrite(uint8_t); // legacy support only +#ifdef RM68120_DRIVER + void writecommand(uint16_t c); // Send a 16-bit command, function resets DC/RS high ready for data + void writeRegister8(uint16_t c, uint8_t d); // Write 8-bit data data to 16-bit command register + void writeRegister16(uint16_t c, uint16_t d); // Write 16-bit data data to 16-bit command register +#else + void writecommand(uint8_t c); // Send an 8-bit command, function resets DC/RS high ready for data +#endif + void writedata(uint8_t d); // Send data with DC/RS set high + + void commandList(const uint8_t *addr); // Send a initialisation sequence to TFT stored in FLASH + + uint8_t readcommand8( uint8_t cmd_function, uint8_t index = 0); // read 8 bits from TFT + uint16_t readcommand16(uint8_t cmd_function, uint8_t index = 0); // read 16 bits from TFT + uint32_t readcommand32(uint8_t cmd_function, uint8_t index = 0); // read 32 bits from TFT + + + // Colour conversion + // Convert 8-bit red, green and blue to 16 bits + uint16_t color565(uint8_t red, uint8_t green, uint8_t blue); + + // Convert 8-bit colour to 16 bits + uint16_t color8to16(uint8_t color332); + // Convert 16-bit colour to 8 bits + uint8_t color16to8(uint16_t color565); + + // Convert 16-bit colour to/from 24-bit, R+G+B concatenated into LS 24 bits + uint32_t color16to24(uint16_t color565); + uint32_t color24to16(uint32_t color888); + + // Alpha blend 2 colours, see generic "alphaBlend_Test" example + // alpha = 0 = 100% background colour + // alpha = 255 = 100% foreground colour + uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc); + + // 16-bit colour alphaBlend with alpha dither (dither reduces colour banding) + uint16_t alphaBlend(uint8_t alpha, uint16_t fgc, uint16_t bgc, uint8_t dither); + // 24-bit colour alphaBlend with optional alpha dither + uint32_t alphaBlend24(uint8_t alpha, uint32_t fgc, uint32_t bgc, uint8_t dither = 0); + + // Direct Memory Access (DMA) support functions + // These can be used for SPI writes when using the ESP32 (original) or STM32 processors. + // DMA also works on a RP2040 processor with PIO based SPI and parallel (8 and 16-bit) interfaces + // Bear in mind DMA will only be of benefit in particular circumstances and can be tricky + // to manage by noobs. The functions have however been designed to be noob friendly and + // avoid a few DMA behaviour "gotchas". + // + // At best you will get a 2x TFT rendering performance improvement when using DMA because + // this library handles the SPI bus so efficiently during normal (non DMA) transfers. The best + // performance improvement scenario is the DMA transfer time is exactly the same as the time it + // takes for the processor to prepare the next image buffer and initiate another DMA transfer. + // + // DMA transfer to the TFT is done while the processor moves on to handle other tasks. Bear + // this in mind and watch out for "gotchas" like the image buffer going out of scope as the + // processor leaves a function or its content being changed while the DMA engine is reading it. + // + // The compiler MAY change the implied scope of a buffer which has been set aside by creating + // an array. For example a buffer defined before a "for-next" loop may get de-allocated when + // the loop ends. To avoid this use, for example, malloc() and free() to take control of when + // the buffer space is available and ensure it is not released until DMA is complete. + // + // Clearly you should not modify a buffer that is being DMA'ed to the TFT until the DMA is over. + // Use the dmaBusy() function to check this. Use tft.startWrite() before invoking DMA so the + // TFT chip select stays low. If you use tft.endWrite() before DMA is complete then the endWrite + // function will wait for the DMA to complete, so this may defeat any DMA performance benefit. + // + + bool initDMA(bool ctrl_cs = false); // Initialise the DMA engine and attach to SPI bus - typically used in setup() + // Parameter "true" enables DMA engine control of TFT chip select (ESP32 only) + // For ESP32 only, TFT reads will not work if parameter is true + void deInitDMA(void); // De-initialise the DMA engine and detach from SPI bus - typically not used + + // Push an image to the TFT using DMA, buffer is optional and grabs (double buffers) a copy of the image + // Use the buffer if the image data will get over-written or destroyed while DMA is in progress + // + // Note 1: If swapping colour bytes is defined, and the double buffer option is NOT used, then the bytes + // in the original image buffer content will be byte swapped by the function before DMA is initiated. + // + // Note 2: If part of the image will be off screen or outside of a set viewport, then the the original + // image buffer content will be altered to a correctly clipped image before DMA is initiated. + // + // The function will wait for the last DMA to complete if it is called while a previous DMA is still + // in progress, this simplifies the sketch and helps avoid "gotchas". + void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t* data, uint16_t* buffer = nullptr); + +#if defined (ESP32) // ESP32 only at the moment + // For case where pointer is a const and the image data must not be modified (clipped or byte swapped) + void pushImageDMA(int32_t x, int32_t y, int32_t w, int32_t h, uint16_t const* data); +#endif + // Push a block of pixels into a window set up using setAddrWindow() + void pushPixelsDMA(uint16_t* image, uint32_t len); + + // Check if the DMA is complete - use while(tft.dmaBusy); for a blocking wait + bool dmaBusy(void); // returns true if DMA is still in progress + void dmaWait(void); // wait until DMA is complete + + bool DMA_Enabled = false; // Flag for DMA enabled state + uint8_t spiBusyCheck = 0; // Number of ESP32 transfer buffers to check + + // Bare metal functions + void startWrite(void); // Begin SPI transaction + void writeColor(uint16_t color, uint32_t len); // Deprecated, use pushBlock() + void endWrite(void); // End SPI transaction + + // Set/get an arbitrary library configuration attribute or option + // Use to switch ON/OFF capabilities such as UTF8 decoding - each attribute has a unique ID + // id = 0: reserved - may be used in future to reset all attributes to a default state + // id = 1: Turn on (a=true) or off (a=false) GLCD cp437 font character error correction + // id = 2: Turn on (a=true) or off (a=false) UTF8 decoding + // id = 3: Enable or disable use of ESP32 PSRAM (if available) + #define CP437_SWITCH 1 + #define UTF8_SWITCH 2 + #define PSRAM_ENABLE 3 + void setAttribute(uint8_t id = 0, uint8_t a = 0); // Set attribute value + uint8_t getAttribute(uint8_t id = 0); // Get attribute value + + // Used for diagnostic sketch to see library setup adopted by compiler, see Section 7 above + void getSetup(setup_t& tft_settings); // Sketch provides the instance to populate + bool verifySetupID(uint32_t id); + + // Global variables +#if !defined (TFT_PARALLEL_8_BIT) && !defined (RP2040_PIO_INTERFACE) + static SPIClass& getSPIinstance(void); // Get SPI class handle +#endif + uint32_t textcolor, textbgcolor; // Text foreground and background colours + + uint32_t bitmap_fg, bitmap_bg; // Bitmap foreground (bit=1) and background (bit=0) colours + + uint8_t textfont, // Current selected font number + textsize, // Current font size multiplier + textdatum, // Text reference datum + rotation; // Display rotation (0-3) + + uint8_t decoderState = 0; // UTF8 decoder state - not for user access + uint16_t decoderBuffer; // Unicode code-point buffer - not for user access + + //--------------------------------------- private ------------------------------------// + private: + // Legacy begin and end prototypes - deprecated TODO: delete + void spi_begin(); + void spi_end(); + + void spi_begin_read(); + void spi_end_read(); + + // New begin and end prototypes + // begin/end a TFT write transaction + // For SPI bus the transmit clock rate is set + inline void begin_tft_write() __attribute__((always_inline)); + inline void end_tft_write() __attribute__((always_inline)); + + // begin/end a TFT read transaction + // For SPI bus: begin lowers SPI clock rate, end reinstates transmit clock rate + inline void begin_tft_read() __attribute__((always_inline)); + inline void end_tft_read() __attribute__((always_inline)); + + // Initialise the data bus GPIO and hardware interfaces + void initBus(void); + + // Temporary library development function TODO: remove need for this + void pushSwapBytePixels(const void* data_in, uint32_t len); + + // Same as setAddrWindow but exits with CGRAM in read mode + void readAddrWindow(int32_t xs, int32_t ys, int32_t w, int32_t h); + + // Byte read prototype + uint8_t readByte(void); + + // GPIO parallel bus input/output direction control + void busDir(uint32_t mask, uint8_t mode); + + // Single GPIO input/output direction control + void gpioMode(uint8_t gpio, uint8_t mode); + + // Smooth graphics helper + uint8_t sqrt_fraction(uint32_t num); + + // Helper function: calculate distance of a point from a finite length line between two points + float wedgeLineDistance(float pax, float pay, float bax, float bay, float dr); + + // Display variant settings + uint8_t tabcolor, // ST7735 screen protector "tab" colour (now invalid) + colstart = 0, rowstart = 0; // Screen display area to CGRAM area coordinate offsets + + // Port and pin masks for control signals (ESP826 only) - TODO: remove need for this + volatile uint32_t *dcport, *csport; + uint32_t cspinmask, dcpinmask, wrpinmask, sclkpinmask; + + #if defined(ESP32_PARALLEL) + // Bit masks for ESP32 parallel bus interface + uint32_t xclr_mask, xdir_mask; // Port set/clear and direction control masks + + // Lookup table for ESP32 parallel bus interface uses 1kbyte RAM, + uint32_t xset_mask[256]; // Makes Sprite rendering test 33% faster, for slower macro equivalent + // see commented out #define set_mask(C) within TFT_eSPI_ESP32.h + #endif + + //uint32_t lastColor = 0xFFFF; // Last colour - used to minimise bit shifting overhead + + getColorCallback getColor = nullptr; // Smooth font callback function pointer + + bool locked, inTransaction, lockTransaction; // SPI transaction and mutex lock flags + + //-------------------------------------- protected ----------------------------------// + protected: + + //int32_t win_xe, win_ye; // Window end coords - not needed + + int32_t _init_width, _init_height; // Display w/h as input, used by setRotation() + int32_t _width, _height; // Display w/h as modified by current rotation + int32_t addr_row, addr_col; // Window position - used to minimise window commands + + int16_t _xPivot; // TFT x pivot point coordinate for rotated Sprites + int16_t _yPivot; // TFT x pivot point coordinate for rotated Sprites + + // Viewport variables + int32_t _vpX, _vpY, _vpW, _vpH; // Note: x start, y start, x end + 1, y end + 1 + int32_t _xDatum; + int32_t _yDatum; + int32_t _xWidth; + int32_t _yHeight; + bool _vpDatum; + bool _vpOoB; + + int32_t cursor_x, cursor_y, padX; // Text cursor x,y and padding setting + int32_t bg_cursor_x; // Background fill cursor + int32_t last_cursor_x; // Previous text cursor position when fill used + + uint32_t fontsloaded; // Bit field of fonts loaded + + uint8_t glyph_ab, // Smooth font glyph delta Y (height) above baseline + glyph_bb; // Smooth font glyph delta Y (height) below baseline + + bool isDigits; // adjust bounding box for numbers to reduce visual jiggling + bool textwrapX, textwrapY; // If set, 'wrap' text at right and optionally bottom edge of display + bool _swapBytes; // Swap the byte order for TFT pushImage() + + bool _booted; // init() or begin() has already run once + + // User sketch manages these via set/getAttribute() + bool _cp437; // If set, use correct CP437 charset (default is OFF) + bool _utf8; // If set, use UTF-8 decoder in print stream 'write()' function (default ON) + bool _psram_enable; // Enable PSRAM use for library functions (TBD) and Sprites + + uint32_t _lastColor; // Buffered value of last colour used + + bool _fillbg; // Fill background flag (just for for smooth fonts at the moment) + +#if defined (SSD1963_DRIVER) + uint16_t Cswap; // Swap buffer for SSD1963 + uint8_t r6, g6, b6; // RGB buffer for SSD1963 +#endif + +#ifdef LOAD_GFXFF + GFXfont *gfxFont; +#endif + +/*************************************************************************************** +** Section 9: TFT_eSPI class conditional extensions +***************************************************************************************/ +// Load the Touch extension +#ifdef TOUCH_CS + #if defined (TFT_PARALLEL_8_BIT) || defined (RP2040_PIO_INTERFACE) + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #error >>>>------>> Touch functions not supported in 8/16-bit parallel mode or with RP2040 PIO. + #endif + #else + #include "Extensions/Touch.h" // Loaded if TOUCH_CS is defined by user + #endif +#else + #if !defined(DISABLE_ALL_LIBRARY_WARNINGS) + #warning >>>>------>> TOUCH_CS pin not defined, TFT_eSPI touch functions will not be available! + #endif +#endif + +// Load the Anti-aliased font extension +#ifdef SMOOTH_FONT + #include "Extensions/Smooth_font.h" // Loaded if SMOOTH_FONT is defined by user +#endif + +}; // End of class TFT_eSPI + +// Swap any type +template static inline void +transpose(T& a, T& b) { T t = a; a = b; b = t; } + +// Fast alphaBlend +template static inline uint16_t +fastBlend(A alpha, F fgc, B bgc) +{ + // Split out and blend 5-bit red and blue channels + uint32_t rxb = bgc & 0xF81F; + rxb += ((fgc & 0xF81F) - rxb) * (alpha >> 2) >> 6; + // Split out and blend 6-bit green channel + uint32_t xgx = bgc & 0x07E0; + xgx += ((fgc & 0x07E0) - xgx) * alpha >> 8; + // Recombine channels + return (rxb & 0xF81F) | (xgx & 0x07E0); +} + +/*************************************************************************************** +** Section 10: Additional extension classes +***************************************************************************************/ +// Load the Button Class +#include "Extensions/Button.h" + +// Load the Sprite Class +#include "Extensions/Sprite.h" + +#endif // ends #ifndef _TFT_eSPIH_ diff --git a/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/Create_font.pde b/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/Create_font.pde similarity index 93% rename from libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/Create_font.pde rename to libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/Create_font.pde index c8e55609..1a07c5cb 100644 --- a/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/Create_font.pde +++ b/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/Create_font.pde @@ -48,13 +48,13 @@ Software License Agreement (FreeBSD License) // >>>>>>>>>>>>>>>>>>>> INSTRUCTIONS <<<<<<<<<<<<<<<<<<<< // See comments below in code for specifying the font parameters (point size, -// unicode blocks to include etc). Ranges of characters (glyphs) and specific +// unicode blocks to include etc.). Ranges of characters (glyphs) and specific // individual glyphs can be included in the created "*.vlw" font file. // Created fonts are saved in the sketches "FontFiles" folder. Press Ctrl+K to // see that folder location. -// 16 bit Unicode point codes in the range 0x0000 - 0xFFFF are supported. +// 16-bit Unicode point codes in the range 0x0000 - 0xFFFF are supported. // Codes 0-31 are control codes such as "tab" and "carraige return" etc. // and 32 is a "space", these should NOT be included. @@ -134,11 +134,17 @@ String fontType = ".ttf"; // Define the font size in points for the TFT_eSPI font file -int fontSize = 20; +int fontSize = 28; // Font size to use in the Processing sketch display window that pops up (can be different to above) int displayFontSize = 28; +// Create a C header (.h file) ready to be used or copied in your sketch folder +boolean createHeaderFile = true; + +// Automaticely open the folder with created files when done +boolean openFolder = true; + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Next we specify which unicode blocks from the the Basic Multilingual Plane (BMP) are included in the final font file. // // Note: The ttf/otf font file MAY NOT contain all possible Unicode characters, refer to the fonts online documentation. // @@ -363,7 +369,7 @@ static final int[] specificUnicodes = { //////////////////////////////////////////////////////////////////////////////////////////////// -// Variable to hold the inclusive Unicode range (16 bit values only for this sketch) +// Variable to hold the inclusive Unicode range (16-bit values only for this sketch) int firstUnicode = 0; int lastUnicode = 0; @@ -392,7 +398,7 @@ void setup() { // Set the fontName from the array number or the defined fontName if (fontNumber >= 0) { - fontName = fontList[fontNumber]; +// fontName = fontList[fontNumber]; fontType = ""; } @@ -499,11 +505,13 @@ void setup() { println("Created font " + fontName + str(fontSize) + ".vlw"); + String fontFileName = "FontFiles/" + fontName + str(fontSize) + ".vlw"; + // creating file try { print("Saving to sketch FontFiles folder... "); - OutputStream output = createOutput("FontFiles/" + fontName + str(fontSize) + ".vlw"); + OutputStream output = createOutput(fontFileName); font.save(output); output.close(); @@ -513,11 +521,50 @@ void setup() { // Open up the FontFiles folder to access the saved file String path = sketchPath(); - Desktop.getDesktop().open(new File(path+"/FontFiles")); + if(openFolder){ + Desktop.getDesktop().open(new File(path+"/FontFiles")); + } System.err.println("All done! Note: Rectangles are displayed for non-existant characters."); } catch(IOException e) { println("Doh! Failed to create the file"); } + + if(!createHeaderFile) return; + // Now creating header file if the option was specified. + try{ + print("saving header file to FontFile folder..."); + + InputStream input = createInputRaw(fontFileName); + PrintWriter output = createWriter("FontFiles/" + fontName + str(fontSize) + ".h"); + + output.println("#include "); + output.println(); + output.println("const uint8_t " + fontName + str(fontSize) + "[] PROGMEM = {"); + + int i = 0; + int data = input.read(); + while(data != -1){ + output.print("0x"); + output.print(hex(data, 2)); + if(i++ < 15){ + output.print(", "); + } else { + output.println(","); + i = 0; + } + data = input.read(); + } +// font.save(output); + output.println("\n};"); + + output.close(); + input.close(); + + println("C header file created."); + + } catch(IOException e){ + println("Failed to create C header file"); + } } diff --git a/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h b/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h new file mode 100644 index 00000000..b45e6236 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/FontFiles/Final-Frontier28.h @@ -0,0 +1,1588 @@ +#include + +const uint8_t Final-Frontier28[] PROGMEM = { +0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x27, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, +0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x33, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x37, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x04, +0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x09, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x11, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, +0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x14, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x1D, +0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x12, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x13, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0C, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x62, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x66, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x08, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x05, +0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x07, +0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xFF, 0xFD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, +0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x13, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x0A, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x10, +0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x0D, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0D, +0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, +0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x17, +0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x0E, +0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x78, 0x90, 0x90, 0x90, 0x76, 0x44, 0xFF, 0xFF, 0xFF, 0x3C, 0x2E, 0xFF, 0xFF, 0xFF, 0x27, 0x21, +0xFF, 0xFF, 0xFF, 0x1C, 0x14, 0xFF, 0xFF, 0xFF, 0x11, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0xFA, +0xFF, 0xFB, 0x00, 0x00, 0xED, 0xFF, 0xF0, 0x00, 0x00, 0xE0, 0xFF, 0xE4, 0x00, 0x00, 0xD3, 0xFF, +0xD9, 0x00, 0x00, 0xC6, 0xFF, 0xCE, 0x00, 0x00, 0xB9, 0xFF, 0xC3, 0x00, 0x00, 0xAC, 0xFF, 0xB8, +0x00, 0x00, 0x9F, 0xFF, 0xAD, 0x00, 0x00, 0x33, 0x58, 0x38, 0x00, 0x00, 0x1E, 0x4D, 0x1B, 0x00, +0x43, 0xF9, 0xFF, 0xF7, 0x39, 0x86, 0xFF, 0xFF, 0xFF, 0x7A, 0x18, 0xBF, 0xF6, 0xBB, 0x13, 0xFF, +0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, +0x30, 0x30, 0x30, 0x00, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, +0xFF, 0xDD, 0x01, 0x00, 0x00, 0x49, 0xFF, 0xF0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xCE, 0xFF, 0x76, 0x00, 0x00, 0x00, 0xB3, 0xFF, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xF8, 0x15, 0x00, 0x00, 0x1E, 0xFD, 0xFF, 0x2B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xC3, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xF7, 0xFF, 0x3C, 0x00, 0x00, 0x06, +0xE9, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCF, 0x00, 0x0B, 0xF2, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x29, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0B, 0xF6, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xCC, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xE4, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0x79, 0x00, 0x00, 0x00, 0xA9, 0xFF, 0x91, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x08, +0xF3, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF8, +0xF8, 0xF8, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x0E, 0x00, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3F, 0xFF, 0xFD, 0x17, 0x00, 0x00, 0x1A, 0xFD, 0xFF, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xBD, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xD2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE4, 0xFF, 0x66, 0x00, 0x00, 0x00, 0xC7, 0xFF, 0x7C, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFB, 0x14, 0x00, 0x00, 0x1E, +0xFE, 0xFF, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xB9, 0x00, +0x00, 0x00, 0x75, 0xFF, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE1, +0xFF, 0x63, 0x00, 0x00, 0x00, 0xCC, 0xFF, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xAE, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x19, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x04, +0x00, 0x00, 0x8A, 0xFF, 0xF1, 0x4C, 0x0A, 0x00, 0x00, 0x32, 0x24, 0x00, 0x00, 0x00, 0xC0, 0xFF, +0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xE6, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, 0xFF, 0xD7, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x15, 0xEB, 0xFF, 0xFF, 0xEF, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, +0xF5, 0xFF, 0xFF, 0xFC, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, +0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x99, 0xFF, 0xFF, 0xFE, 0x38, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x02, 0xC8, 0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, +0x47, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x0C, 0xFF, 0xFF, 0xF9, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x13, 0xFF, 0xFF, 0xDB, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x5B, 0xFF, 0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x4C, +0xEC, 0xFF, 0xE4, 0x14, 0x00, 0x90, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x27, 0x00, +0x23, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC6, 0x6A, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xBC, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x74, 0xCF, 0xF6, 0xF5, 0xCD, 0x71, 0x06, 0x00, 0x00, 0x00, +0x00, 0x1E, 0xDB, 0xFF, 0xFF, 0x38, 0x00, 0x00, 0x00, 0x00, 0x12, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xCA, 0x11, 0x00, 0x00, 0x00, 0x00, 0xBE, 0xFF, 0xA6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9F, 0xFF, 0xFF, 0xB4, 0x1B, 0x1B, 0xB6, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x4B, 0xFF, 0xF7, +0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xF0, +0x00, 0x00, 0x03, 0xD5, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x1A, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xEE, 0x00, 0x00, 0x68, 0xFF, 0xE8, 0x0D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xB3, 0x1B, 0x1B, 0xB6, 0xFF, 0xFF, 0x9A, 0x00, 0x0D, 0xE8, 0xFF, +0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xCD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xC8, 0x0F, 0x00, 0x85, 0xFF, 0xD1, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, +0x75, 0xCF, 0xF7, 0xF6, 0xCD, 0x70, 0x05, 0x00, 0x1C, 0xF6, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, +0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x31, 0xFE, 0xFB, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBD, 0xFF, 0x91, 0x00, 0x01, 0x61, 0xC7, +0xF4, 0xF5, 0xC9, 0x63, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, +0xEE, 0x12, 0x04, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0xD6, 0xFF, 0x70, 0x00, 0x77, 0xFF, 0xFF, 0xCB, 0x22, 0x23, 0xCD, 0xFF, +0xFF, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xDA, 0x05, 0x00, 0xDC, 0xFF, +0xFF, 0x34, 0x00, 0x00, 0x36, 0xFF, 0xFF, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xE9, +0xFF, 0x4F, 0x00, 0x00, 0xF9, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xF9, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xBF, 0x00, 0x00, 0x00, 0xDA, 0xFF, 0xFF, 0x33, 0x00, 0x00, +0x35, 0xFF, 0xFF, 0xDA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xF6, 0xFD, 0x31, 0x00, 0x00, 0x00, +0x74, 0xFF, 0xFF, 0xC9, 0x21, 0x22, 0xCB, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, +0xFF, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x03, 0xA8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xAE, 0x04, +0x00, 0x00, 0x00, 0x00, 0x32, 0xFE, 0xFF, 0xCE, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xC7, +0xF5, 0xF6, 0xC9, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5F, 0xC2, 0xF1, 0xFF, 0xFF, 0xFF, +0xFF, 0xBF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xB5, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xFF, +0xFF, 0xD2, 0x3A, 0x07, 0x00, 0x04, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xE6, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xF3, 0xFF, 0xFF, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBC, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xD3, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xF3, 0xFF, 0xFF, +0xFB, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x18, 0x21, 0xF1, +0xFF, 0xFF, 0x96, 0x12, 0x00, 0x00, 0x00, 0x26, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB0, +0x00, 0x93, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x1E, 0x00, 0xDB, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x33, 0x1C, 0x00, 0x0E, +0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0xF7, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0xEE, 0xFF, 0xFF, 0x0E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xDE, 0x00, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, +0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0xFF, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, +0x51, 0xFF, 0xFF, 0xD6, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xEA, 0xFF, 0xFC, 0x2B, 0x00, +0x00, 0x00, 0x00, 0x00, 0xA1, 0xFF, 0xFF, 0xDD, 0x5E, 0x19, 0x04, 0x17, 0x62, 0xE6, 0xFF, 0xFF, +0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x8A, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF5, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x8E, 0xCF, 0xF0, +0xFB, 0xEB, 0xC3, 0x7C, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFC, +0xFC, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0xF5, 0x4F, 0x00, 0x00, 0x3A, 0xF9, 0xFF, 0xF3, 0x3B, +0x00, 0x00, 0x07, 0xE1, 0xFF, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xFF, 0x9A, 0x00, 0x00, +0x00, 0x0A, 0xED, 0xFF, 0xF8, 0x17, 0x00, 0x00, 0x00, 0x59, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, +0x00, 0xA1, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0xD5, 0xFF, 0xFF, 0x26, 0x00, 0x00, 0x00, +0x00, 0xF3, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xFD, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, +0x00, 0xF2, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, 0xD4, 0xFF, 0xFF, 0x2D, 0x00, 0x00, 0x00, +0x00, 0xA2, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0x00, +0x00, 0x0B, 0xF0, 0xFF, 0xFA, 0x19, 0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0x9D, 0x00, 0x00, +0x00, 0x00, 0x09, 0xE3, 0xFF, 0xFE, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFA, 0xFF, 0xF3, 0x3A, +0x00, 0x00, 0x00, 0x00, 0x65, 0xFF, 0xFF, 0xF5, 0x4F, 0x4D, 0xF4, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x39, 0xF2, 0xFF, 0xFA, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFE, 0xFF, 0xE3, 0x09, +0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF8, 0xFF, 0xEF, +0x0B, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFF, 0xFF, +0xA4, 0x00, 0x00, 0x00, 0x00, 0x27, 0xFF, 0xFF, 0xD6, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, +0xF4, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, +0xF0, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFF, 0xFF, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0xFF, +0xA0, 0x00, 0x00, 0x00, 0x00, 0xAC, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x19, 0xFA, 0xFF, 0xEE, +0x0A, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x4C, 0xFE, 0xFF, 0xE4, 0x09, +0x00, 0x00, 0x38, 0xF2, 0xFF, 0xFA, 0x3E, 0x00, 0x00, 0x4C, 0xF4, 0xFF, 0xFF, 0x6B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x2A, 0x97, 0x02, 0x41, 0xFF, 0x3F, +0x02, 0x99, 0x28, 0xB4, 0xFF, 0xA2, 0x0A, 0xF4, 0x0A, 0xA4, 0xFF, 0xB2, 0x28, 0x63, 0xA1, 0xE1, +0xFF, 0xE0, 0x9F, 0x62, 0x29, 0x00, 0x00, 0x17, 0xE8, 0xFF, 0xE3, 0x14, 0x00, 0x00, 0x8B, 0xD7, +0xF3, 0x75, 0xF5, 0x74, 0xF2, 0xD5, 0x8A, 0x75, 0xF2, 0x3D, 0x11, 0xFC, 0x10, 0x3D, 0xF3, 0x72, +0x08, 0x33, 0x00, 0x4D, 0xFF, 0x4A, 0x00, 0x34, 0x07, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0x86, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xB0, 0xB0, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x7C, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0B, 0xF1, 0xFF, 0xFF, 0x8E, 0x27, 0xFF, 0xFF, 0xAC, 0x02, 0x7E, 0xFF, 0xC4, +0x08, 0x00, 0xD5, 0xD9, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x59, +0x00, 0x80, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0x37, 0x34, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x89, 0x00, 0x5E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x78, +0xF8, 0xF8, 0x75, 0xF0, 0xFF, 0xFF, 0xEF, 0x67, 0xEA, 0xEA, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2E, 0xF6, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFB, 0xFF, 0x7B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0xFF, 0xFF, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, +0xFF, 0xCB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xFD, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x6F, 0xFF, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xC2, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, +0xFF, 0xFC, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x29, 0xFF, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xF9, 0x10, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDA, 0xFF, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, +0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0xFF, 0xF5, 0x0B, 0x00, 0x00, 0x00, +0x00, 0x00, 0x01, 0xE3, 0xFF, 0xA8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x50, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xF0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0xEA, 0xFF, 0x9F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x9F, 0xFF, 0xF9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x98, 0x98, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x87, 0xC9, 0xEC, 0xFB, 0xED, +0xCB, 0x89, 0x21, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7B, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFB, 0x7C, 0x01, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xDE, 0x5D, 0x18, 0x05, 0x19, 0x5F, 0xE0, +0xFF, 0xFF, 0x8A, 0x00, 0x39, 0xFF, 0xFF, 0xDF, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xE1, +0xFF, 0xFF, 0x39, 0xA5, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, +0xFF, 0xA4, 0xE3, 0xFF, 0xFF, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xFF, 0xFF, +0xE1, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFA, 0xFF, 0xFF, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF9, 0xE2, 0xFF, 0xFF, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xE1, 0xA4, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0xA4, 0x38, 0xFF, 0xFF, 0xDD, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x12, 0xDE, 0xFF, 0xFF, 0x39, 0x00, 0x8A, 0xFF, 0xFF, 0xDC, 0x5B, 0x17, 0x04, 0x17, +0x5B, 0xDC, 0xFF, 0xFF, 0x8C, 0x00, 0x00, 0x01, 0x7C, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFC, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x21, 0x88, 0xCA, 0xEE, 0xFB, 0xEF, 0xCC, 0x8B, +0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0x00, +0x00, 0x00, 0x5E, 0xFE, 0xFF, 0x00, 0x00, 0x4A, 0xFB, 0xFF, 0xFF, 0x00, 0x0F, 0xB9, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x01, 0x56, +0xB0, 0xE3, 0xF8, 0xE7, 0xC2, 0x6A, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x16, 0xC4, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xD2, 0x1D, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, 0x97, 0x28, 0x08, 0x2F, +0xB2, 0xFF, 0xFF, 0xCC, 0x06, 0x00, 0x00, 0x5D, 0xFF, 0x9B, 0x00, 0x00, 0x00, 0x00, 0x01, 0xB4, +0xFF, 0xFF, 0x69, 0x00, 0x00, 0x01, 0xCD, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xFF, 0xFF, +0xC8, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF1, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xF2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0xFF, 0xFF, 0xC9, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x28, 0xF4, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0D, 0xD4, 0xFF, 0xFF, 0xE7, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xB3, +0xFF, 0xFF, 0xFE, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, +0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5E, 0xFF, 0xFF, 0xFF, 0x99, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xF8, 0xFF, 0xFF, 0xBA, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1D, 0xE8, 0xFF, 0xFF, 0xD4, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0B, 0xCF, 0xFF, 0xFF, 0xE8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xAD, 0xFF, +0xFF, 0xF6, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x3D, 0x00, 0x83, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x19, 0x56, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x07, 0x69, 0xBD, 0xEB, 0xFB, 0xEA, 0xB3, 0x4A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x96, 0x01, +0x00, 0x00, 0x00, 0x33, 0xFD, 0xFF, 0x9B, 0x22, 0x0E, 0x52, 0xEA, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x98, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x54, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, +0x12, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x84, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x75, +0xFE, 0xFF, 0xF1, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x44, 0xA7, 0xFF, +0xFF, 0xF2, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0xFB, 0xFF, +0xF7, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xFF, 0xA0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xFF, 0xFF, 0xDE, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0A, 0xCD, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0C, 0x2B, 0x68, 0xD9, +0xFF, 0xFF, 0x8F, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x8C, +0x03, 0x00, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xF0, 0xD5, 0x9E, 0x38, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xFA, 0xFF, 0xE5, 0x12, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xD5, 0xFF, 0xFE, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFE, 0xFF, 0xD1, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE1, 0xFF, 0xF7, 0x2B, 0x00, 0x15, 0xDA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA2, 0xFF, 0xFF, 0x6D, 0x00, 0x0C, 0xCA, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xB7, 0x01, 0x00, 0xB9, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0xEB, 0xFF, 0xEA, 0x18, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x66, 0xFF, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x23, 0xF3, 0xFF, 0xD9, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x02, 0xC4, 0xFF, 0xFA, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x31, 0x05, +0x0F, 0xD7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x9A, 0x00, +0x00, 0x1E, 0xE3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x27, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x4B, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x08, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x4D, +0x00, 0x00, 0x00, 0x3B, 0x42, 0x00, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xBD, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xD9, 0xFF, 0xFF, 0xFF, 0xFA, 0xE7, 0xB5, 0x5E, 0x04, 0x00, 0x00, 0x00, 0x00, 0xF5, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x12, 0x4C, +0xCA, 0xFF, 0xFF, 0xD1, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCA, 0xFF, +0xFF, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xC3, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xFF, 0xFF, 0xEE, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1B, 0xFF, 0xFF, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, +0xFF, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xDF, 0xFF, 0xFF, 0x41, +0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x24, 0x6B, 0xE4, 0xFF, 0xFF, 0x96, 0x00, 0x0C, 0xE6, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x86, 0x02, 0x00, 0x89, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, +0xED, 0xC8, 0x88, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBA, 0xFF, 0xFF, +0xE5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xD5, 0xFF, 0xFF, 0x4E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0xFF, 0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFE, 0xFF, 0xEB, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xE0, 0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xA0, 0xFF, 0xFF, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xFF, 0xFF, +0xF1, 0x1C, 0x60, 0xDF, 0xA1, 0x40, 0x00, 0x00, 0x00, 0x00, 0x16, 0xEA, 0xFF, 0xFF, 0x68, 0x1F, +0xF1, 0xFF, 0xFF, 0xFF, 0xAD, 0x0D, 0x00, 0x00, 0xAA, 0xFF, 0xFF, 0xC0, 0x01, 0x45, 0x85, 0xBF, +0xFF, 0xFF, 0xFF, 0xBF, 0x04, 0x3A, 0xFF, 0xFF, 0xFA, 0x26, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xF8, +0xFF, 0xFF, 0x64, 0xA2, 0xFF, 0xFF, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, +0xC2, 0xE3, 0xFF, 0xFF, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xFF, 0xFF, 0xF0, 0xFA, +0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF8, 0xE9, 0xFF, 0xFF, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xE0, 0xAF, 0xFF, 0xFF, 0x46, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xFF, 0xFF, 0xA1, 0x43, 0xFF, 0xFF, 0xCA, 0x07, 0x00, 0x00, +0x00, 0x00, 0x0B, 0xD5, 0xFF, 0xFF, 0x35, 0x00, 0x95, 0xFF, 0xFF, 0xCB, 0x48, 0x0D, 0x09, 0x41, +0xCC, 0xFF, 0xFF, 0x8A, 0x00, 0x00, 0x02, 0x89, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, +0x88, 0x02, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x99, 0xDB, 0xF6, 0xF6, 0xDA, 0x99, 0x2E, 0x00, 0x00, +0x00, 0x00, 0x8D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x3E, 0xFD, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x4E, 0x03, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xEE, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x85, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE8, 0xFF, 0xFE, +0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x28, 0xFF, 0xFF, 0xE5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, +0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xEF, 0xFF, 0xFB, 0x1B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, 0xFF, 0xAD, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x33, 0xFF, 0xFF, 0xD9, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, +0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF5, 0xFF, 0xF6, 0x11, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xD5, 0xFF, 0xFF, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0xFF, 0xFF, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xFF, 0xFF, +0xCD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xC6, 0xF4, 0xF5, +0xC9, 0x61, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xA3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xA6, 0x02, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xFF, 0xFF, 0xC2, 0x1F, 0x1F, 0xC4, 0xFF, 0xFF, 0x6C, +0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x2E, 0xFF, 0xFF, 0xD2, 0x00, 0x00, +0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0x00, 0x00, +0xE5, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, +0xFF, 0xEA, 0x5C, 0x5C, 0xEB, 0xFF, 0xFF, 0x85, 0x00, 0x00, 0x00, 0x00, 0x21, 0xF3, 0xFF, 0xFF, +0xD8, 0xD8, 0xFF, 0xFF, 0xF6, 0x21, 0x00, 0x00, 0x00, 0x3B, 0xEE, 0xFF, 0xFF, 0xFF, 0xB7, 0xB9, +0xFF, 0xFF, 0xFF, 0xE8, 0x34, 0x00, 0x1B, 0xEA, 0xFF, 0xFF, 0xBB, 0x1F, 0x00, 0x00, 0x25, 0xC2, +0xFF, 0xFF, 0xE6, 0x18, 0x8D, 0xFF, 0xFF, 0xBB, 0x02, 0x00, 0x00, 0x00, 0x00, 0x03, 0xBF, 0xFF, +0xFF, 0x8D, 0xDA, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0xFF, 0xFF, 0xDC, +0xF8, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xF7, 0xE7, 0xFF, +0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xE6, 0xA9, 0xFF, 0xFF, 0x52, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xA6, 0x38, 0xFE, 0xFF, 0xD8, 0x0F, 0x00, +0x00, 0x00, 0x00, 0x0F, 0xD8, 0xFF, 0xFE, 0x36, 0x00, 0x81, 0xFF, 0xFF, 0xD6, 0x4D, 0x0C, 0x0B, +0x4B, 0xD5, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x73, 0xFA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFA, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x8D, 0xD3, 0xF4, 0xF5, 0xD4, 0x8D, 0x20, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x99, 0xD8, 0xF4, 0xF6, 0xDA, 0x9A, 0x2F, 0x00, 0x00, 0x00, +0x00, 0x04, 0x8E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x89, 0x02, 0x00, 0x00, 0x9A, +0xFF, 0xFF, 0xC9, 0x41, 0x09, 0x0E, 0x4C, 0xD0, 0xFF, 0xFF, 0x95, 0x00, 0x44, 0xFF, 0xFF, 0xCE, +0x08, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xCC, 0xFF, 0xFF, 0x44, 0xAE, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xB0, 0xE7, 0xFF, 0xFF, 0x0E, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xE9, 0xFA, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0B, 0xFF, 0xFF, 0xF9, 0xE9, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, +0xFF, 0xE0, 0xAD, 0xFF, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xFF, 0x9D, +0x3B, 0xFE, 0xFF, 0xFF, 0xAE, 0x2E, 0x00, 0x00, 0x00, 0x22, 0xF8, 0xFF, 0xFF, 0x35, 0x00, 0x74, +0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x69, 0x00, 0xBB, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x4B, 0xD5, +0xFF, 0xFF, 0xC1, 0x02, 0x63, 0xFF, 0xFF, 0xE7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x6D, +0x1F, 0x1A, 0xEF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, +0xFF, 0xFF, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xFF, 0xFF, 0xDE, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xEA, 0xFF, 0xFD, 0x3C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0xD4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0F, 0xE4, 0xFF, 0xFF, 0xBD, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x0D, 0x00, +0x6D, 0xFB, 0xFA, 0x6B, 0xF0, 0xFF, 0xFF, 0xEF, 0xBB, 0xFF, 0xFF, 0xB7, 0x0C, 0x6B, 0x69, 0x0A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, +0x78, 0xF8, 0xF8, 0x75, 0xF0, 0xFF, 0xFF, 0xEF, 0x67, 0xEA, 0xEA, 0x65, 0x00, 0x00, 0x11, 0x0B, +0x00, 0x00, 0x8A, 0xFE, 0xF9, 0x68, 0x14, 0xFF, 0xFF, 0xFF, 0xEF, 0x03, 0xDA, 0xFF, 0xFF, 0xB5, +0x00, 0x14, 0x70, 0x66, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xF1, 0xFF, 0xFF, 0x84, 0x27, 0xFF, +0xFF, 0xA5, 0x01, 0x7E, 0xFF, 0xC1, 0x06, 0x00, 0xD5, 0xD8, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x25, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x33, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x9E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x05, 0xCA, 0xCC, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x28, 0xDC, 0xDD, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x47, 0x97, 0xB0, 0xFF, 0xFF, 0xBC, +0xA1, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xC3, 0xB3, 0x2E, +0xAF, 0xFF, 0xFF, 0xB0, 0x31, 0xE5, 0x96, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, +0xE9, 0xA4, 0x0A, 0x0E, 0xF4, 0xFF, 0xFF, 0xF4, 0x0F, 0x06, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1D, 0xEF, 0xDD, 0x0C, 0x00, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x11, 0xFF, +0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0x6F, 0x00, 0x00, 0x63, 0xFD, 0xFF, 0xFF, 0xFE, +0x63, 0x00, 0x00, 0xD4, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0xFF, 0x24, 0x00, 0x29, 0x14, +0xB9, 0xFF, 0xFF, 0xBA, 0x14, 0x23, 0x00, 0x46, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, +0x05, 0x20, 0xDD, 0x4E, 0x3E, 0xF2, 0xF3, 0x3F, 0x4B, 0xCF, 0x05, 0x0B, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xC2, 0xE3, 0x46, 0xE5, 0xFF, 0xCF, 0x20, 0x95, 0x99, 0x1B, 0xCF, 0xFF, 0xC4, 0x09, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xEF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x1D, 0x20, 0x8C, +0xFF, 0xFF, 0xFF, 0xF2, 0xC0, 0x6B, 0x3E, 0x28, 0x0F, 0x52, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xE4, 0x44, 0x42, 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xB1, 0x3A, 0xBE, 0xFF, 0xFF, +0xFF, 0xD7, 0x6C, 0x01, 0x2B, 0x17, 0x10, 0x13, 0x18, 0x85, 0xD3, 0xD2, 0xD3, 0xD1, 0xCD, 0x7A, +0x01, 0xF1, 0xFF, 0xDC, 0xC5, 0xDD, 0xF6, 0x8B, 0x32, 0x09, 0x0A, 0x32, 0x8C, 0xD1, 0x37, 0xC2, +0xEE, 0xC0, 0x52, 0x00, 0x00, 0xEA, 0xD4, 0x8D, 0x29, 0x01, 0x78, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x76, 0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, 0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, +0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, +0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, +0x66, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, +0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, 0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, +0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, 0x81, 0xF5, 0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, +0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, 0x8B, 0x11, 0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, +0x00, 0x00, 0x01, 0x20, 0x05, 0x12, 0x00, 0x00, 0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, +0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, 0x47, 0xA3, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, +0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, 0x00, 0x08, 0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, +0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, 0x61, 0x00, 0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, +0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, 0xD3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, +0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, +0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0xF3, 0xD1, 0x84, 0x13, 0x00, +0x00, 0x29, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE7, 0x31, 0x00, 0x46, 0x07, 0x00, 0x01, 0x1C, +0x88, 0xFF, 0xFF, 0xE3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0x7A, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xFF, 0xFF, 0xC8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, +0xFF, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xFF, 0xFF, 0xFA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2E, 0xFF, 0xFF, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, +0xA9, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x6F, 0xFC, 0xFF, 0xFD, 0x38, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFA, 0xBA, 0x40, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, +0x4D, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFA, 0xFF, 0xF3, 0x2D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8A, 0xFF, 0xFF, 0xFF, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xC2, 0xF5, 0xB3, +0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xAE, 0x0A, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x73, 0xFF, 0x88, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0xF4, 0xFF, 0xFA, 0x2C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB2, 0xFF, 0xFF, 0xFF, 0xC4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0xE4, 0xFF, 0xFF, 0x8E, 0xFF, 0xFF, 0xED, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xFF, 0xFF, 0xAF, +0x00, 0xAF, 0xFF, 0xFF, 0xA1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x34, 0xFD, 0xFF, 0xF1, 0x1B, 0x00, 0x24, 0xF9, 0xFF, 0xFF, 0x41, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xCE, 0xFF, 0xFF, +0x6A, 0x00, 0x00, 0x00, 0x8D, 0xFF, 0xFF, 0xD8, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0xC6, 0x02, 0x00, 0x00, 0x00, 0x10, 0xEC, 0xFF, +0xFF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xF3, 0xFF, +0xFA, 0x2B, 0x1C, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0x24, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0x83, 0x04, 0xC5, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, +0xFF, 0xD9, 0x07, 0x1A, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0xFF, 0xFF, 0x59, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xE3, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x26, 0xF9, 0xFF, 0xE8, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, +0xFF, 0xFF, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0xFF, +0xFF, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0xFC, 0xFF, 0xE8, 0x11, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xE0, 0xFF, 0xFD, 0x37, 0x00, 0x00, 0x00, 0x03, +0xCD, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4F, 0xFF, 0xFF, 0xD0, 0x04, 0x00, 0x00, 0x71, 0xFF, 0xFF, 0xB5, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0xFF, 0xFF, 0x73, 0x00, +0x1C, 0xF3, 0xFF, 0xF4, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x22, 0xF7, 0xFF, 0xF4, 0x1D, 0xB0, 0xFF, 0xFF, 0xC8, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xD2, 0xFF, +0xFF, 0xB0, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0xF1, 0xCC, 0x85, +0x17, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xEB, 0x32, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x26, +0xA8, 0xFF, 0xFF, 0xDD, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0xEE, 0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0D, 0xF2, 0xF2, 0x55, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0E, 0xBB, 0xD3, 0x26, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x21, 0xD4, 0xA1, 0x0A, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3C, 0xEA, 0xFF, 0xE4, 0xA5, 0x36, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x5E, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x6C, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x4E, 0xB1, 0xA7, 0xAE, 0xD9, 0xFF, 0xFF, 0xFF, 0xFC, 0x32, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xF1, 0xFF, 0xFF, 0xA0, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xDD, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xFF, 0xFF, 0xF7, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF6, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xFF, 0xFF, +0xDA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0xFF, +0xFF, 0x96, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x6D, 0xF4, +0xFF, 0xF6, 0x24, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x4E, 0x00, 0x39, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF3, +0xD3, 0x8E, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x85, 0xCD, 0xEC, 0xF8, 0xFE, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x16, 0x00, 0x00, 0x00, 0x0F, 0x97, 0xFE, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x00, +0x00, 0x17, 0xD8, 0xFF, 0xFF, 0xC9, 0x64, 0x2A, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4D, 0x00, 0x00, 0x00, 0x0F, 0xD4, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x97, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFD, +0xFF, 0xE9, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0x3B, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0xFF, 0xFF, +0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xFF, 0x33, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x98, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xDC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x82, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x27, 0xF0, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xEE, 0xFF, 0xFF, 0xC4, 0x5C, 0x25, 0x0C, 0x02, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x33, 0x00, 0x00, 0x00, 0x21, 0xBC, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3A, 0x97, 0xCB, 0xE9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xF4, 0x23, 0x00, 0x34, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF5, 0xE6, +0xC1, 0x8B, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x1F, 0x53, 0xB2, 0xFF, 0xFF, 0xE7, 0x26, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0xFE, +0xFF, 0xE4, 0x14, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0x99, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE6, 0xFF, 0xFD, 0x23, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0x76, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3C, 0xFF, 0xFF, 0xC0, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xDF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xED, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x33, 0xFF, 0xFF, 0xD4, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x78, 0xFF, 0xFF, 0x9B, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD8, 0xFF, 0xFF, 0x48, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xFF, 0xFF, 0xC7, 0x01, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFD, +0xFF, 0xF5, 0x2F, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x1B, +0x4D, 0xB2, 0xFF, 0xFF, 0xF5, 0x41, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xCA, 0x2B, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xEE, 0xD2, 0xA0, 0x46, 0x01, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x85, 0xCD, 0xEC, 0xF8, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xEA, 0x16, 0x00, 0x00, 0x00, 0x0F, 0x97, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, 0x00, 0x00, 0x00, 0x17, 0xD8, 0xFF, 0xFF, +0xC9, 0x64, 0x2A, 0x0E, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x00, +0x0F, 0xD4, 0xFF, 0xFF, 0x7F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x97, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xE9, 0x0E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, +0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xC1, 0xFF, 0xFF, 0x3B, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x3C, 0x00, 0x00, 0xE9, 0xFF, 0xFF, 0x29, 0xEC, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, +0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x09, 0x00, +0x00, 0x00, 0xED, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0xFF, 0xFF, 0x79, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x44, 0xFF, 0xFF, 0xDC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0xF0, 0xFF, 0xFF, +0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x34, 0xEE, 0xFF, 0xFF, 0xC4, 0x5C, 0x25, 0x0C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1B, 0x33, 0x00, 0x00, 0x00, 0x21, 0xBC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC5, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, +0x97, 0xCB, 0xE9, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0x23, 0x00, 0x32, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x41, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x91, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x09, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x12, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, +0xFF, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x36, 0x8D, 0xD2, 0xEF, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x61, 0x00, 0x00, 0x00, 0x00, 0x13, 0xA1, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xDE, 0xFF, 0xFF, 0xC0, 0x5C, 0x24, 0x0C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x44, 0x12, 0x00, 0x00, 0x00, 0x10, 0xD7, 0xFF, 0xFF, 0x72, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0x8D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFD, +0xFF, 0xE6, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x81, 0xFF, 0xFF, 0x82, 0x00, 0x00, 0x00, 0x00, 0x10, 0xE8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x00, 0xC1, 0xFF, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x9A, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xE9, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x14, 0x27, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xED, 0xFF, 0xFF, +0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0xD3, 0xFF, 0xFF, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x98, 0xFF, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0xFF, 0xFF, 0xD9, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x79, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x29, 0xF1, 0xFF, +0xFE, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x38, 0xF1, 0xFF, 0xFF, 0xBA, 0x54, 0x20, 0x0B, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x24, 0xC2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x9C, 0xCE, 0xEB, 0xFA, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, 0x41, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xFF, 0xFF, 0x3C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x66, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x13, 0xEC, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x36, 0x08, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x41, 0xFF, 0xFF, 0xFF, +0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0xFF, 0xFF, 0xFF, 0x3C, 0x40, 0xFF, +0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x3E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, +0xFF, 0xF6, 0x00, 0x18, 0xAE, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, 0xFF, 0xD8, 0x00, +0x71, 0xFF, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00, 0x5F, 0xFF, 0xFF, 0x92, 0x00, 0x0A, 0xE3, 0xFF, +0xF6, 0x6F, 0x17, 0x13, 0x5D, 0xEE, 0xFF, 0xF3, 0x1F, 0x00, 0x00, 0x24, 0xE1, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF4, 0x49, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x7E, 0xCF, 0xF5, 0xF9, 0xDD, 0x97, +0x22, 0x00, 0x00, 0x00, 0x3E, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, +0xFF, 0xEA, 0x27, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFD, +0xFF, 0xF2, 0x33, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x23, 0xEE, +0xFF, 0xF8, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0B, 0xD2, +0xFF, 0xFC, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xA8, +0xFF, 0xFE, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x76, +0xFF, 0xFF, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x44, +0xFC, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0xA4, 0xFF, 0xF1, 0x79, 0x49, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x7F, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x54, 0x79, 0x8D, 0xC2, 0xFC, 0xFF, 0xFF, 0xD3, 0x1A, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0xB0, 0xFF, 0xFF, 0xDA, 0x13, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x91, 0xFF, 0xFF, 0xA8, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC1, 0xFF, 0xFF, 0x3A, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xFF, 0xFF, +0xA6, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, +0xFF, 0xEF, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x9C, 0xFF, 0xFF, 0x2A, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x80, 0xFF, 0xFF, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x71, 0xFF, 0xFF, 0x59, 0x3E, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFF, 0x60, 0x3E, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x08, 0x3A, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE9, 0x12, 0x38, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xEF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xF8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x3A, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, +0xFF, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x34, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xF9, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xC5, 0xFF, 0xFF, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x8B, 0xFF, 0xFF, 0xD3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFB, 0xFF, 0xFF, 0xFE, +0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF2, 0xFF, 0xFF, 0xFF, 0x19, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x51, 0xFF, 0xFF, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x7A, 0xFF, 0xFF, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xCA, +0xD5, 0xFF, 0xFC, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xE8, 0xFF, 0xA2, 0xFD, 0xFF, 0xA2, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0xFF, 0x8B, 0x56, 0xFF, 0xFF, 0x99, 0x00, 0x00, 0x00, +0x00, 0x00, 0x68, 0xFF, 0xF9, 0x1C, 0xCC, 0xFF, 0xE6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xFF, +0xFF, 0x4E, 0x01, 0xD2, 0xFF, 0xF9, 0x1B, 0x00, 0x00, 0x00, 0x03, 0xDC, 0xFF, 0x99, 0x00, 0x89, +0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFE, 0x12, 0x00, 0x52, 0xFF, 0xFF, 0x8E, +0x00, 0x00, 0x00, 0x56, 0xFF, 0xFB, 0x21, 0x00, 0x46, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, +0xAF, 0xFF, 0xD3, 0x00, 0x00, 0x01, 0xCE, 0xFF, 0xF5, 0x14, 0x00, 0x00, 0xCD, 0xFF, 0xA0, 0x00, +0x00, 0x0A, 0xF9, 0xFF, 0xB6, 0x00, 0x00, 0x00, 0x03, 0xF0, 0xFF, 0x95, 0x00, 0x00, 0x00, 0x4E, +0xFF, 0xFF, 0x84, 0x00, 0x45, 0xFF, 0xFD, 0x26, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xF4, 0x06, 0x00, +0x00, 0x3A, 0xFF, 0xFF, 0x58, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xF0, 0x0E, 0xBC, 0xFF, 0xA7, +0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x80, 0xFF, 0xFF, 0x1A, 0x00, 0x00, +0x00, 0x00, 0x4B, 0xFF, 0xFF, 0xA9, 0xFF, 0xFE, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x3B, 0xFF, 0xFF, +0x84, 0x00, 0x00, 0xC6, 0xFF, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xFF, 0xFF, +0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xF3, 0xFF, 0xC9, 0x00, 0x0F, 0xFC, 0xFF, 0x9F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB5, 0xFF, 0xFD, 0x11, 0x52, 0xFF, 0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, +0xFF, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFF, 0x53, 0x98, 0xFF, 0xFF, +0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0xFF, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x30, 0xFF, 0xFF, 0x98, 0xDD, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xDD, 0x00, +0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x8D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0xFF, 0x8A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xF5, 0xFF, 0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x3C, 0xF1, 0xFF, 0xFF, 0x81, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x33, +0xEC, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x2B, 0xE6, 0xFF, 0xFF, 0x7C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x23, 0xE0, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xD9, 0xFF, 0xFF, 0x76, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xD1, 0xFF, 0xFF, 0x74, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x11, 0xC9, 0xFF, 0xFF, 0x71, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xBF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0xB5, 0xFF, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, +0xAB, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x03, 0x9F, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x93, 0xFF, 0x00, 0x44, 0xFF, 0xFF, 0xFF, 0x3F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x01, 0x42, 0x8C, 0xC5, 0xE5, 0xF6, 0xF7, 0xE5, 0xC4, 0x8B, 0x41, 0x01, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xDB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xDA, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9D, 0xFF, 0xFF, +0xFD, 0xAB, 0x58, 0x20, 0x0A, 0x0A, 0x20, 0x58, 0xAC, 0xFE, 0xFF, 0xFF, 0x9D, 0x03, 0x00, 0x00, +0x00, 0x01, 0xA6, 0xFF, 0xFF, 0xD7, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, +0xDA, 0xFF, 0xFF, 0xA7, 0x02, 0x00, 0x00, 0x6C, 0xFF, 0xFF, 0xD2, 0x0F, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD5, 0xFF, 0xFF, 0x6E, 0x00, 0x17, 0xF3, 0xFF, 0xF9, +0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0xF9, 0xFF, +0xF4, 0x17, 0x71, 0xFF, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x71, 0xC1, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0xFF, 0xFF, 0xC2, 0xE4, 0xFF, +0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x17, 0xFF, 0xFF, 0xE4, 0xF9, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF8, 0xE5, 0xFF, 0xFF, 0x16, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xE2, +0xC2, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0xFF, 0xFF, 0xBF, 0x72, 0xFF, 0xFF, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x6C, 0x18, 0xF4, 0xFF, 0xF8, +0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0xF9, 0xFF, +0xF0, 0x13, 0x00, 0x6D, 0xFF, 0xFF, 0xD0, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xD3, 0xFF, 0xFF, 0x65, 0x00, 0x00, 0x01, 0xA2, 0xFF, 0xFF, 0xD5, 0x2B, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xD7, 0xFF, 0xFF, 0x9D, 0x01, 0x00, 0x00, 0x00, +0x01, 0x92, 0xFF, 0xFF, 0xFD, 0xA9, 0x56, 0x1F, 0x09, 0x09, 0x1F, 0x56, 0xAB, 0xFD, 0xFF, 0xFF, +0x92, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xD6, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x40, 0x8C, 0xC4, 0xE6, 0xF7, 0xF7, 0xE6, 0xC4, 0x8B, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, 0xE2, 0xA2, 0x2F, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0x67, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1D, 0x71, 0xF5, +0xFF, 0xFE, 0x40, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x6C, 0xFF, 0xFF, 0xB9, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x19, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF6, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xCE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0x3E, 0xDE, 0xFF, 0xFF, 0x68, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x02, 0xBA, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xA2, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x16, +0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xBF, 0x5A, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x42, 0x8C, 0xC5, 0xE5, 0xF6, 0xF6, 0xE4, +0xC3, 0x88, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0xDB, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD3, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x03, 0x9D, 0xFF, 0xFF, 0xFD, 0xAB, 0x58, 0x20, 0x0A, 0x0A, 0x20, 0x58, 0xAC, 0xFE, 0xFF, +0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA7, 0xFF, 0xFF, 0xD7, 0x2E, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x30, 0xDA, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0x6E, 0xFF, 0xFF, 0xD2, +0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xD5, 0xFF, 0xFF, 0x54, +0x00, 0x18, 0xF4, 0xFF, 0xF9, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x25, 0xF9, 0xFF, 0xE6, 0x0B, 0x72, 0xFF, 0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x5D, 0xC2, 0xFF, 0xFF, +0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, +0xFF, 0xFF, 0xB3, 0xE5, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xFF, 0xFF, 0xDD, 0xF9, 0xFF, 0xFF, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xF7, 0xE5, +0xFF, 0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x13, 0xFF, 0xFF, 0xEE, 0xC2, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x60, 0x70, 0x70, 0x49, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xD5, 0x72, 0xFF, 0xFF, 0x95, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFE, 0xFF, 0xFB, 0x3D, 0x00, 0x94, 0xFF, 0xFF, +0x96, 0x18, 0xF4, 0xFF, 0xF8, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, +0xFF, 0xE8, 0x40, 0xF5, 0xFF, 0xFF, 0x42, 0x00, 0x6D, 0xFF, 0xFF, 0xD0, 0x0D, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0xB7, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xBE, 0x00, 0x00, 0x01, 0xA2, +0xFF, 0xFF, 0xD5, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0xE1, 0xFF, 0xFF, 0xFF, +0xE9, 0x21, 0x00, 0x00, 0x00, 0x01, 0x92, 0xFF, 0xFF, 0xFD, 0xA9, 0x55, 0x1E, 0x09, 0x07, 0x20, +0x55, 0xAC, 0xFC, 0xFF, 0xFF, 0xFF, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xD4, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xFA, 0xFF, 0xFD, 0x58, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x8A, 0xC3, 0xE5, 0xF7, 0xFB, 0xEE, 0xD2, 0xA7, 0x68, 0x17, +0x44, 0xF5, 0xFF, 0xFB, 0x4C, 0x32, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFB, 0xDF, 0x94, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x1C, 0x8B, 0xFF, 0xFF, 0xD8, 0x03, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0xFF, +0xFF, 0x49, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x14, 0xF5, 0xFF, 0xBE, 0x1B, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x22, 0xD4, 0xF9, 0x75, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xEE, 0xD5, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x7D, 0xFD, 0xDB, 0x2C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x0F, 0xB2, 0xFF, 0xFF, +0xFF, 0xFF, 0xD4, 0x5F, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x01, +0x5D, 0x70, 0x7C, 0x9C, 0xE3, 0xFF, 0xFF, 0xFF, 0xB6, 0x10, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x5B, 0xE7, 0xFF, 0xFF, 0xC4, 0x09, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xD7, +0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x24, 0xF0, 0xFF, 0xFC, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xFB, 0xFF, 0xE1, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xC7, 0xFF, 0xFF, 0x19, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xFF, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0x49, 0x3F, 0xFF, 0xFF, +0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xD0, 0xFF, 0xFF, +0x50, 0x00, 0x00, 0x0F, 0x81, 0xCF, 0xF4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF2, 0x21, 0x00, 0x00, 0x1A, 0xDE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0xA3, 0xFF, 0xFF, 0x89, +0x17, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0x00, +0x00, 0xEC, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xFF, 0xFF, 0xFF, 0xD6, +0x6F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x63, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD9, 0x95, 0x52, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0xCA, 0x86, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x8A, 0xD5, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDF, 0x6D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x17, 0x57, 0x98, 0xD8, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xD2, +0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x5A, 0x9B, +0xE2, 0xFF, 0xFF, 0xFF, 0xFF, 0xEB, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0xC9, 0xFF, 0xFF, 0xFF, 0xD5, 0x05, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x94, 0xFF, 0xFF, +0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0xC3, 0xFF, 0xFF, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xE9, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, +0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x02, 0xFF, 0xFF, 0xFF, 0x00, 0xAD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x89, 0x3A, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xDC, 0x09, 0x4A, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x3E, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x46, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, +0xFF, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xFF, 0xFF, 0xFF, +0x40, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x09, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0xDA, 0xFF, +0xFF, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xD9, 0x00, 0x00, +0x6D, 0xFF, 0xFF, 0xF1, 0x75, 0x2F, 0x0F, 0x03, 0x03, 0x10, 0x30, 0x74, 0xF0, 0xFF, 0xFF, 0x6D, +0x00, 0x00, 0x00, 0x82, 0xFB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFB, +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x75, 0xB3, 0xD9, 0xF1, 0xFB, 0xFB, 0xF1, 0xD9, 0xB4, +0x76, 0x1C, 0x00, 0x00, 0x00, 0xB9, 0xFF, 0xFF, 0xEE, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xD1, 0xFF, 0xFF, 0xB8, 0x2E, 0xFD, 0xFF, 0xFA, 0x1C, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xE2, 0xFF, 0xFD, 0x2E, 0x00, +0x9F, 0xFF, 0xFF, 0x9A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, +0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x1B, 0xF5, 0xFF, 0xFB, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x0D, 0xEA, 0xFF, 0xF5, 0x1B, 0x00, 0x00, 0x00, 0x84, 0xFF, 0xFF, 0xA8, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0x00, +0x0D, 0xE9, 0xFF, 0xFE, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xF4, 0xFF, 0xE8, +0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x98, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD7, 0xFF, 0xFF, 0x3E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0xFB, 0xFF, 0xD6, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4E, 0xFF, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0xFF, 0xFF, 0x4D, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x38, 0xFF, +0xFF, 0xBF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0xFE, 0xFF, 0xD2, +0x02, 0x00, 0x00, 0xC1, 0xFF, 0xFE, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xA5, 0xFF, 0xFF, 0x5B, 0x00, 0x4D, 0xFF, 0xFF, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0xFF, 0xDD, 0x08, 0xD4, 0xFF, 0xF8, 0x1F, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8A, 0xFF, 0xFF, +0xBF, 0xFF, 0xFF, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x10, 0xEC, 0xFF, 0xFF, 0xFF, 0xEC, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0x6E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xDC, 0xFF, +0xDB, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x54, 0xFF, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xCA, 0xFF, 0xFF, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x7C, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xFF, +0xCA, 0x5F, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0xFC, +0x5C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0x61, 0x07, 0xEB, +0xFF, 0xDC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9E, 0xFF, 0xD9, 0x03, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCA, 0xFF, 0xEF, 0x09, 0x00, 0x88, 0xFF, 0xFF, 0x46, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFB, 0xFF, 0xFF, 0x5D, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x32, 0xFF, 0xFF, 0x8F, 0x00, 0x00, 0x1F, 0xFD, 0xFF, 0xAF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x99, 0xFF, 0xFF, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x99, 0xFF, 0xFF, 0x27, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xFC, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, +0x1D, 0xF9, 0xFF, 0x98, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0xF3, 0xFF, 0xBC, +0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xDD, +0x03, 0xC6, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x53, 0x00, 0x00, 0x00, +0x00, 0x01, 0xD8, 0xFF, 0xE6, 0x04, 0x00, 0x00, 0x00, 0x19, 0xF7, 0xFF, 0x67, 0x00, 0x4D, 0xFF, +0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0xCE, 0xFF, 0xE5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6E, +0xFF, 0xFF, 0x54, 0x00, 0x00, 0x00, 0x8F, 0xFF, 0xE7, 0x07, 0x00, 0x01, 0xD1, 0xFF, 0xDB, 0x04, +0x00, 0x00, 0x36, 0xFF, 0xFF, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xF3, 0xFF, 0xBD, +0x00, 0x00, 0x16, 0xF5, 0xFF, 0x76, 0x00, 0x00, 0x00, 0x58, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x9D, +0xFF, 0xFC, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0xFF, 0xFF, 0x27, 0x00, 0x8B, +0xFF, 0xEF, 0x0E, 0x00, 0x00, 0x00, 0x03, 0xDB, 0xFF, 0xDC, 0x04, 0x0E, 0xF5, 0xFF, 0xAE, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0xFF, 0xFF, 0x8F, 0x13, 0xF4, 0xFF, 0x84, 0x00, +0x00, 0x00, 0x00, 0x00, 0x64, 0xFF, 0xFF, 0x61, 0x6B, 0xFF, 0xFF, 0x45, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xEE, 0x8F, 0xFF, 0xF6, 0x15, 0x00, 0x00, 0x00, 0x00, +0x00, 0x06, 0xE3, 0xFF, 0xDC, 0xD3, 0xFF, 0xDA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x54, 0xFF, 0xFF, 0xFF, 0xFF, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, +0xFF, 0xFF, 0xFF, 0xFF, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, +0xE4, 0xFF, 0xFF, 0xFB, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xEB, 0xFF, 0xFF, +0xF7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, 0xFF, +0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFF, 0xA0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0xF9, 0xFE, 0x2B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xF1, 0xFF, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x16, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xC2, 0xFF, 0xFF, 0xFF, +0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0xFF, 0xFE, 0x48, 0x00, 0x00, 0x17, +0xE4, 0xFF, 0xFF, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xC3, 0xFF, 0xFF, 0x82, 0x00, +0x00, 0x00, 0x00, 0x38, 0xF9, 0xFF, 0xF8, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0xFF, 0xFF, +0xBC, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0xE6, 0x1A, 0x00, 0x00, 0x00, 0x44, +0xFD, 0xFF, 0xE5, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xFF, 0xCA, 0x08, +0x00, 0x19, 0xE9, 0xFF, 0xFB, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC9, +0xFF, 0xFF, 0xA2, 0x03, 0xC0, 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x1C, 0xEA, 0xFF, 0xFF, 0xCA, 0xFF, 0xFF, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFB, 0xFF, 0xFF, 0xFF, 0xDD, 0x10, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0xFF, 0xFF, 0xFF, 0x35, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0xFF, 0xFF, +0xFF, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, +0xFF, 0xFF, 0xD4, 0xFF, 0xFE, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x4B, 0xFE, 0xFF, 0x98, 0x14, 0xE4, 0xFF, 0xF1, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x1F, 0xED, 0xFF, 0xD8, 0x0A, 0x00, 0x3C, 0xFC, 0xFF, 0xD4, 0x0C, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xC9, 0xFF, 0xFA, 0x33, 0x00, 0x00, 0x00, 0x79, 0xFF, 0xFF, +0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0xFF, 0xFF, 0x77, 0x00, 0x00, 0x00, 0x00, +0x01, 0xB8, 0xFF, 0xFF, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xFF, 0xBF, 0x02, 0x00, +0x00, 0x00, 0x00, 0x00, 0x15, 0xE5, 0xFF, 0xFC, 0x41, 0x00, 0x00, 0x00, 0x26, 0xF2, 0xFF, 0xEE, +0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0xFF, 0xEA, 0x1D, 0x00, 0x09, 0xD2, +0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0xFF, 0xFF, 0xC9, +0x07, 0x9F, 0xFF, 0xFF, 0xFF, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, +0xFF, 0xFF, 0xFF, 0x9B, 0x41, 0xFB, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8E, 0xFF, 0xFF, 0xFF, 0x4E, 0x00, 0x6E, 0xFF, 0xFF, 0xE2, 0x16, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xCF, 0xFF, 0xFF, 0x92, 0x00, 0x00, 0x00, 0x9F, 0xFF, +0xFF, 0xC6, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0xFF, 0xFF, 0xCF, 0x07, 0x00, +0x00, 0x00, 0x07, 0xC9, 0xFF, 0xFF, 0xA5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, +0xF3, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0xE7, 0xFF, 0xFF, 0x7E, 0x00, 0x00, 0x00, 0x00, +0x20, 0xEF, 0xFF, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0xF9, 0xFF, 0xFE, +0x57, 0x00, 0x00, 0x05, 0xC8, 0xFF, 0xFF, 0xA2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x64, 0xFF, 0xFF, 0xF7, 0x36, 0x00, 0x8C, 0xFF, 0xFF, 0xDA, 0x0C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0xFF, 0xFF, 0xE7, 0x67, 0xFE, 0xFF, 0xF8, 0x31, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xC2, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xE2, 0xFF, 0xFF, 0xFF, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x33, 0xFF, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, 0xFF, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x07, 0xD6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x57, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x9D, 0x00, 0x00, 0x12, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x22, 0xF2, 0xFF, 0xFF, 0xD8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x04, 0xC8, 0xFF, 0xFF, 0xF9, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0xFF, 0xFF, 0xFF, 0x71, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFD, 0xFF, 0xFF, 0xB6, 0x01, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xE4, 0xFF, 0xFF, 0xE8, 0x16, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB0, 0xFF, 0xFF, +0xFE, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, +0xFF, 0xFF, 0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2C, 0xF7, 0xFF, 0xFF, 0xCC, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x08, 0xD3, 0xFF, 0xFF, 0xF3, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0xFF, 0xFF, 0xFF, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0xA6, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xEC, 0xFF, 0xFF, 0xDE, 0x0E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBD, 0xFF, 0xFF, +0xFB, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, +0xFF, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x36, 0xFB, 0xFF, 0xFF, 0xBE, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x01, 0x44, 0x0D, 0xDD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3F, 0xA4, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x92, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x52, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB9, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x20, 0x25, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x21, 0x25, 0x00, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB8, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x53, 0xD4, 0xFF, +0xF5, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7C, 0xFF, 0xFA, 0x12, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x23, 0xFF, 0xFF, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xBD, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x72, 0xFF, 0xFD, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1B, 0xFE, 0xFF, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xC7, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x69, 0xFF, 0xFF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x14, 0xFB, 0xFF, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xD0, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xFF, 0xFF, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, +0xF8, 0xFF, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0xFF, 0xDA, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x57, 0xFF, 0xFF, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0xF4, +0xFF, 0x8B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA6, 0xFF, 0xE2, 0x01, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x4D, 0xFF, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0xEE, 0xFF, +0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0xFF, 0xE9, 0x03, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x44, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xF7, 0xFF, 0x9E, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x98, 0x98, 0x88, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x04, 0xDA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x3B, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x3C, 0x04, 0x00, 0xFF, 0xFF, +0xFF, 0x04, 0xD9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x3F, 0x76, 0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, +0x53, 0xB0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, +0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, 0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, 0x66, 0x95, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1D, 0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, +0x1C, 0x00, 0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, +0x81, 0xF5, 0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, 0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, +0x8B, 0x11, 0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, 0x00, 0x00, 0x01, 0x20, 0x05, 0x12, +0x00, 0x00, 0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, +0x47, 0xA3, 0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, +0x00, 0x08, 0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, 0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, +0x61, 0x00, 0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, +0xD3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, 0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x2D, 0xF5, 0xFF, 0xFF, 0xFF, 0xF9, 0xD9, 0x75, 0x01, 0x00, 0x00, 0x0E, 0xDA, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x6D, 0x00, 0x00, 0x3D, 0x09, 0x00, 0x00, 0x00, 0x04, +0x57, 0xFF, 0xFF, 0xCE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x10, 0x0A, 0x05, 0xFF, 0xFF, 0xF4, +0x00, 0x00, 0x20, 0xA6, 0xF1, 0xFF, 0xFF, 0x7C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x1F, 0xEA, 0xFF, +0xFF, 0xFF, 0xFF, 0x22, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xA0, 0xFF, 0xFF, 0xF9, 0xA5, 0xA4, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE7, 0xFF, 0xFF, 0x59, 0x00, 0x02, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xFB, 0xFF, 0xFF, 0x0B, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE7, 0xFF, 0xFF, +0x1C, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x9F, 0xFF, 0xFF, 0xA9, 0x1A, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x1E, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x18, 0x93, 0xDC, 0xF9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x40, 0x3F, 0x98, 0x98, +0x98, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFF, 0x06, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x24, 0xFE, 0xF3, 0xCF, 0x7F, 0x0F, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x91, 0xFF, 0xFF, +0xFF, 0xFF, 0xE1, 0x2B, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x26, 0x02, 0x20, 0x98, 0xFF, 0xFF, +0xDD, 0x0C, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0xFF, 0xFF, 0x74, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, 0xC5, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xFF, 0xFF, 0xEF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xFF, 0xFF, 0xE7, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xB2, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0xBC, 0xFF, 0xFF, 0x55, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x04, 0x2C, 0xAB, 0xFF, 0xFF, 0xB9, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xB5, 0x0E, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE1, 0xAA, +0x4C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xA4, 0xDD, 0xF5, 0xFF, 0xFF, 0xFF, 0x83, 0x00, +0x0B, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF1, 0x11, 0x00, 0xB2, 0xFF, 0xFF, 0xCA, 0x4A, +0x10, 0x00, 0x00, 0x40, 0x00, 0x51, 0xFF, 0xFF, 0xCE, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xB1, 0xFF, 0xFF, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0xFF, 0xFF, 0x15, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xEF, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xFF, 0x4D, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0xFF, 0xFF, 0xC7, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x0C, 0xDC, 0xFF, 0xFF, 0xC0, 0x3F, 0x0A, 0x00, 0x00, 0x04, 0x45, 0x00, 0x26, 0xD9, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, 0x36, 0x00, 0x00, 0x0A, 0x6D, 0xBF, 0xEC, 0xFD, 0xFF, +0xFF, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x98, 0x98, 0x98, +0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xFF, 0xFF, 0xFF, 0x05, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x9E, 0xD9, 0xF3, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0A, 0xA5, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xB0, 0xFF, 0xFF, 0xD1, 0x50, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x51, 0xFF, 0xFF, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xB2, +0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE8, 0xFF, 0xFF, +0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xEC, 0xFF, 0xFF, 0x14, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xBA, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x59, 0xFF, 0xFF, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x01, 0xB8, 0xFF, 0xFF, 0xBE, 0x3B, 0x08, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x0D, 0xB3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x01, 0x4E, 0xB0, 0xE7, 0xFB, 0xD6, 0x03, 0x42, 0xFF, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, +0x3C, 0x9A, 0xD1, 0xEE, 0xFD, 0xFF, 0xFF, 0xFF, 0xD4, 0x01, 0x00, 0x0F, 0xAF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x61, 0x00, 0x02, 0xBE, 0xFF, 0xFF, 0xB2, 0x31, 0x06, 0x00, 0xD5, +0xFF, 0xE6, 0x06, 0x00, 0x5B, 0xFF, 0xFF, 0xC9, 0x02, 0x00, 0x00, 0x39, 0xFF, 0xFF, 0x79, 0x00, +0x00, 0xB7, 0xFF, 0xFF, 0x4E, 0x00, 0x00, 0x00, 0x9C, 0xFF, 0xF4, 0x11, 0x00, 0x00, 0xE9, 0xFF, +0xFF, 0x1E, 0x00, 0x00, 0x0B, 0xF3, 0xFF, 0x91, 0x00, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x05, 0x00, +0x00, 0x62, 0xFF, 0xFC, 0x20, 0x00, 0x00, 0x00, 0xEE, 0xFF, 0xFF, 0x16, 0x00, 0x00, 0xC5, 0xFF, +0xA9, 0x00, 0x00, 0x00, 0x00, 0xC2, 0xFF, 0xFF, 0x52, 0x00, 0x1D, 0xDB, 0xDC, 0x34, 0x00, 0x00, +0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xCD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, +0xCF, 0xFF, 0xFF, 0xC6, 0x46, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x3F, 0x00, 0x00, 0x19, 0xC7, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0x3D, 0x00, 0x00, 0x00, 0x04, 0x59, 0xB2, 0xE5, 0xF9, +0xFF, 0xFF, 0xFF, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x73, 0x8E, 0x90, 0x21, 0x00, +0x00, 0x16, 0xC6, 0xFF, 0xFF, 0xFF, 0xE6, 0x04, 0x00, 0x00, 0xA3, 0xFF, 0xFF, 0xE3, 0xBD, 0x85, +0x00, 0x00, 0x00, 0xED, 0xFF, 0xFF, 0x18, 0x00, 0x14, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x37, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x6C, 0x00, 0xBD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0x0D, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xFF, 0xFF, 0x4B, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2A, 0x8F, 0xCC, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x45, 0x00, +0x04, 0x8F, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xA0, 0xFF, +0xFF, 0xD1, 0x4F, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xD4, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xAD, 0xFF, 0xFF, 0x55, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE6, 0xFF, 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0xED, 0xFF, 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0xBF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x65, +0xFF, 0xFF, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x04, 0xC8, 0xFF, +0xFF, 0xAC, 0x33, 0x07, 0x03, 0x43, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x16, 0xC4, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x03, 0x5A, 0xB5, 0xE8, 0xFC, +0xD6, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x02, 0xFF, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0xFF, +0xFF, 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0xC1, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x2D, 0xC9, 0xFF, 0xFF, 0x6A, 0x00, 0x00, +0x00, 0x00, 0x9E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBA, 0x05, 0x00, 0x00, 0x00, 0x56, +0xFF, 0xFF, 0xFF, 0xFF, 0xF7, 0xE2, 0xB3, 0x5E, 0x02, 0x00, 0x00, 0x3E, 0x90, 0x90, 0x90, 0x3B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xA2, 0xFF, 0xFE, +0xEE, 0xBD, 0x54, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x8E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x4B, 0xED, 0xFF, 0xFF, 0x44, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x20, 0xFF, 0xFF, 0xE2, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, +0xFF, 0x46, 0x00, 0x0A, 0x31, 0x0A, 0x00, 0x19, 0xE5, 0xFF, 0xE1, 0x16, 0x45, 0xFF, 0xFF, 0xFF, +0x41, 0x02, 0x87, 0xCA, 0x83, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x47, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, +0x00, 0x0B, 0x31, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0xE5, 0xFF, 0xDF, 0x14, 0x00, 0x00, +0x00, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x02, 0x88, 0xC9, 0x83, 0x01, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0xFF, 0xFF, +0xFF, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0x03, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xFF, 0xFF, 0xEF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x4B, 0xFF, 0xFF, 0xC4, 0x00, 0x00, 0x00, 0x01, 0x2D, 0xD6, 0xFF, 0xFF, +0x67, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x02, 0x00, 0x1A, 0xF5, 0xFE, 0xEE, 0xC1, +0x64, 0x02, 0x00, 0x00, 0x3E, 0x90, 0x90, 0x90, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x65, +0xFF, 0xFF, 0xFF, 0x9F, 0x06, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x56, 0xF5, 0xFF, 0xEF, +0x56, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x02, 0x86, 0xFF, 0xFF, 0xC3, 0x1E, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x2B, 0xFF, 0xFF, 0xFF, 0xC8, 0x78, 0x13, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x2C, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEE, 0x50, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x01, 0x18, 0x68, 0xED, 0xFF, 0xFC, 0x4D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xF8, 0xFF, 0xEA, 0x10, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x90, 0xFF, 0xFF, 0x73, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x3B, 0xFF, 0xFF, 0xBE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x11, 0xFF, 0xFF, 0xEA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFF, +0xFF, 0xFC, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, +0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFF, 0xFF, 0x3E, 0x90, +0x90, 0x90, 0x3E, 0x07, 0xFF, 0xFF, 0xFF, 0x06, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x45, 0xFF, 0xFF, 0xFF, 0x44, 0x3F, 0xFF, 0xFF, +0xF3, 0xAF, 0xFF, 0xF9, 0xD8, 0x77, 0xAF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF4, 0xDB, 0xA3, 0x3D, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x83, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x08, 0x45, 0xE7, +0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x17, 0x5D, 0xEE, 0xFF, 0xFF, 0x45, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x62, 0xFF, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x61, 0xFF, 0xFF, 0xAC, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1D, 0xFF, 0xFF, 0xED, 0x00, 0x00, 0x00, +0x00, 0x19, 0xFF, 0xFF, 0xE3, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, +0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFF, 0xFF, 0xF8, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, +0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x46, 0x3F, 0xFF, +0xFF, 0xF3, 0xAF, 0xFF, 0xFE, 0xEC, 0xBA, 0x52, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x8E, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x07, 0x49, +0xEC, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x6A, 0xFF, 0xFF, +0xAC, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFF, 0xFF, 0xE3, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x06, 0xFF, 0xFF, 0xF9, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x44, 0x00, +0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x35, 0x9D, 0xDA, 0xF5, 0xF5, 0xDA, +0x9D, 0x33, 0x00, 0x00, 0x00, 0x00, 0x05, 0x96, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0x93, 0x04, 0x00, 0x00, 0xA1, 0xFF, 0xFF, 0xD1, 0x48, 0x0B, 0x0C, 0x49, 0xD3, 0xFF, 0xFF, 0x9D, +0x00, 0x4A, 0xFF, 0xFF, 0xD9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xDB, 0xFF, 0xFF, 0x47, 0xB1, +0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0xFF, 0xFF, 0xAF, 0xE8, 0xFF, 0xFF, +0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xE7, 0xFA, 0xFF, 0xFF, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0xE9, 0xFF, 0xFF, 0x17, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x18, 0xFF, 0xFF, 0xE7, 0xB2, 0xFF, 0xFF, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x5C, 0xFF, 0xFF, 0xAF, 0x4D, 0xFF, 0xFF, 0xD7, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xDB, +0xFF, 0xFF, 0x48, 0x00, 0xA7, 0xFF, 0xFF, 0xCF, 0x46, 0x0B, 0x0B, 0x48, 0xD2, 0xFF, 0xFF, 0xA0, +0x00, 0x00, 0x07, 0x9D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x97, 0x05, 0x00, 0x00, +0x00, 0x00, 0x3A, 0xA0, 0xDC, 0xF6, 0xF6, 0xDC, 0x9E, 0x36, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xF6, 0xE0, 0xA8, 0x48, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xB1, 0x0D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x05, 0x2D, 0xAE, +0xFF, 0xFF, 0xB7, 0x01, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBE, 0xFF, 0xFF, +0x54, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0xFF, 0xFF, 0xB2, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0xFF, 0xFF, 0xE7, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x05, 0xFF, 0xFF, 0xFA, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x1C, 0xFF, 0xFF, 0xED, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, +0xFF, 0xBE, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0xFF, 0xFF, 0x66, 0x00, +0xFF, 0xFF, 0xFF, 0x01, 0x29, 0x01, 0x21, 0x9E, 0xFF, 0xFF, 0xCE, 0x06, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x93, 0xFF, 0xFF, 0xFF, 0xFF, 0xD4, 0x1D, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x25, 0xFE, +0xF4, 0xCC, 0x74, 0x09, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x90, 0xCD, 0xED, 0xFD, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0x40, 0x00, 0x05, 0x92, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xA3, 0xFF, 0xFF, 0xD1, 0x50, 0x12, 0x01, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x49, 0xFF, +0xFF, 0xD4, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xAE, 0xFF, 0xFF, 0x55, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xE6, 0xFF, 0xFF, 0x15, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xFA, 0xFF, 0xFF, 0x04, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0xEC, 0xFF, 0xFF, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0xBA, 0xFF, 0xFF, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x59, 0xFF, 0xFF, 0xC8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x01, 0xB8, 0xFF, 0xFF, 0xBE, 0x3B, 0x08, 0x00, 0x38, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0D, +0xB3, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x65, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x4E, +0xB0, 0xE7, 0xFB, 0xD6, 0x03, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0xFF, 0xFF, 0x43, 0x3D, 0xFF, +0xFF, 0xFF, 0xFF, 0xFE, 0xE2, 0x76, 0x02, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x35, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x32, 0xB6, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x14, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, 0x49, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xB4, 0xE6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x44, +0x00, 0x4A, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC0, 0x00, 0x00, 0xC2, 0xFF, +0xB9, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x35, 0x00, 0x00, 0xD5, 0xFF, 0xF1, 0x66, 0x0B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x91, 0xFF, 0xFF, 0xFF, 0xF7, 0xB4, 0x68, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0xB9, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFC, 0xB0, 0x2F, 0x00, +0x00, 0x00, 0x00, 0x00, 0x2D, 0x7C, 0xC1, 0xFA, 0xFF, 0xFF, 0xFF, 0xFA, 0x61, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x0C, 0x52, 0xB0, 0xFF, 0xFF, 0xFD, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x56, 0xFF, 0xFF, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xD4, 0xFF, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, +0xFF, 0xFD, 0x3D, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xBF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, +0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xE4, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x16, 0xD2, 0xFF, 0xFF, 0xA0, 0xA0, 0x36, 0x1B, 0xD8, 0xFF, 0xFF, +0xFF, 0xFF, 0xEE, 0x0B, 0x80, 0xA4, 0xFF, 0xFF, 0xFF, 0xB1, 0x86, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x01, 0x10, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, 0xFF, 0xFF, 0x41, 0x00, 0x00, 0x48, 0xFF, 0xFF, 0xFF, +0x49, 0x00, 0x00, 0x00, 0x47, 0xFF, 0xFF, 0xFF, 0x47, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, +0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, +0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, +0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, +0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, +0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFA, 0xFF, 0xFF, 0x02, 0x00, 0x00, 0x00, 0x00, +0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xE5, 0xFF, 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, +0x00, 0x00, 0xB2, 0xFF, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x53, +0xFF, 0xFF, 0xDD, 0x3B, 0x07, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0xA4, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x01, 0x63, 0xC4, 0xF0, 0xFF, 0xFF, +0xAA, 0xF2, 0xFF, 0xFF, 0x3D, 0xD6, 0xFF, 0xFF, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0xFF, +0xFF, 0xD6, 0x58, 0xFF, 0xFF, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xFF, 0xFF, 0x56, 0x02, +0xD5, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBB, 0xFF, 0xD2, 0x01, 0x00, 0x56, 0xFF, 0xFF, +0x3F, 0x00, 0x00, 0x00, 0x34, 0xFF, 0xFF, 0x50, 0x00, 0x00, 0x01, 0xD2, 0xFF, 0xBA, 0x00, 0x00, +0x00, 0xAF, 0xFF, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x53, 0xFF, 0xFF, 0x36, 0x00, 0x2B, 0xFE, 0xFF, +0x4B, 0x00, 0x00, 0x00, 0x00, 0x01, 0xD0, 0xFF, 0xB1, 0x00, 0xA4, 0xFF, 0xC8, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x50, 0xFF, 0xFE, 0x50, 0xFC, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0xCD, 0xFF, 0xF9, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, +0xFF, 0xFF, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xFF, 0xBE, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0xFF, 0x3C, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0xFF, +0xFF, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0xFF, 0xFF, 0xD6, 0x57, 0xFF, 0xFF, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0xFF, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x3D, 0xFF, 0xFF, 0x56, 0x01, 0xD3, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, +0x00, 0xA3, 0xFF, 0xAA, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB1, 0xFF, 0xD2, 0x01, 0x00, 0x53, 0xFF, +0xFF, 0x37, 0x00, 0x00, 0x00, 0x1C, 0xFA, 0xFF, 0xFD, 0x24, 0x00, 0x00, 0x00, 0x26, 0xFE, 0xFF, +0x52, 0x00, 0x00, 0x01, 0xCF, 0xFF, 0xA9, 0x00, 0x00, 0x00, 0x8B, 0xFF, 0xFF, 0xFF, 0x99, 0x00, +0x00, 0x00, 0x99, 0xFF, 0xCE, 0x01, 0x00, 0x00, 0x00, 0x4E, 0xFF, 0xFC, 0x1F, 0x00, 0x0D, 0xF0, +0xFF, 0xA6, 0xFF, 0xF8, 0x18, 0x00, 0x15, 0xF7, 0xFF, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCB, +0xFF, 0x8E, 0x00, 0x73, 0xFF, 0xC8, 0x03, 0xD9, 0xFF, 0x88, 0x00, 0x81, 0xFF, 0xCA, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x49, 0xFF, 0xF1, 0x12, 0xE2, 0xFF, 0x47, 0x00, 0x59, 0xFF, 0xF0, 0x17, +0xEB, 0xFF, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0xFF, 0xC4, 0xFF, 0xC7, 0x00, +0x00, 0x02, 0xD3, 0xFF, 0xCF, 0xFF, 0xC6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, +0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00, 0x00, 0x52, 0xFF, 0xFF, 0xFF, 0x44, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xC1, 0xFF, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xFF, 0xC1, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0x44, 0x00, 0x00, 0x00, +0x00, 0x00, 0x4A, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, +0xDF, 0xFF, 0xFF, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0xFF, 0xFF, 0xDC, 0x15, 0x00, 0x29, +0xEF, 0xFF, 0xE6, 0x17, 0x00, 0x00, 0x00, 0x18, 0xE8, 0xFF, 0xEA, 0x24, 0x00, 0x00, 0x00, 0x42, +0xFA, 0xFF, 0xC4, 0x05, 0x00, 0x03, 0xC0, 0xFF, 0xF4, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, +0xFF, 0xFF, 0x97, 0x00, 0x8A, 0xFF, 0xFB, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, +0xFF, 0xFF, 0xA1, 0xFF, 0xFF, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, +0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0xFF, +0xFF, 0xFF, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0xED, 0xFF, 0xFF, +0xFF, 0xF9, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0xE0, 0xFF, 0xE8, 0x56, 0xF5, +0xFF, 0xEE, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0xD0, 0xFF, 0xF6, 0x37, 0x00, 0x4B, 0xFB, +0xFF, 0xDE, 0x16, 0x00, 0x00, 0x00, 0x06, 0xBD, 0xFF, 0xFE, 0x54, 0x00, 0x00, 0x00, 0x62, 0xFF, +0xFF, 0xC9, 0x0A, 0x00, 0x01, 0xA7, 0xFF, 0xFF, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0xFF, +0xFF, 0xAF, 0x02, 0x8E, 0xFF, 0xFF, 0xFF, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFF, 0xFF, +0xFF, 0x90, 0xD7, 0xFF, 0xFF, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0xD7, 0x5B, +0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0xFF, 0xFF, 0x5A, 0x02, 0xD7, 0xFF, 0xBD, +0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xFF, 0xD8, 0x02, 0x00, 0x5B, 0xFF, 0xFF, 0x3B, 0x00, 0x00, +0x00, 0x27, 0xFD, 0xFF, 0x5B, 0x00, 0x00, 0x02, 0xD7, 0xFF, 0xB9, 0x00, 0x00, 0x00, 0xA0, 0xFF, +0xD9, 0x03, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0x37, 0x00, 0x1E, 0xFA, 0xFF, 0x5D, 0x00, 0x00, +0x00, 0x00, 0x02, 0xD7, 0xFF, 0xB5, 0x00, 0x94, 0xFF, 0xDA, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, +0x5B, 0xFF, 0xFF, 0x4A, 0xF7, 0xFF, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD7, 0xFF, +0xF7, 0xFF, 0xDC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0xFF, 0xFF, 0xFF, 0x60, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xE5, 0xFF, 0xDC, 0x04, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0xFE, 0xFF, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0xAD, 0xFF, 0xDD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0xFE, +0xFF, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0xFF, 0xDE, 0x04, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0xFE, 0xFF, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0xAA, 0xFF, 0xDF, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2B, 0xFE, 0xFF, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0xFF, 0xFF, +0x5D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0xF5, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xD4, 0x05, 0x00, 0x00, 0xA7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFD, +0x38, 0x00, 0x00, 0x16, 0x31, 0x00, 0x00, 0x00, 0x00, 0x46, 0xFF, 0xFF, 0x92, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0xDF, 0xFF, 0xE2, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x8F, 0xFF, 0xFF, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0xFC, +0xFF, 0xA7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0xD1, 0xFF, 0xED, 0x16, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0xFF, 0xFF, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x26, 0xF7, 0xFF, 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, +0xC1, 0xFF, 0xF6, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0xFF, 0xFF, 0x75, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x45, 0x19, 0xF0, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xFF, 0xFF, 0xFF, 0xFF, 0x48, 0xAE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, +0xAD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0xBE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x8C, 0xA9, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x79, 0x18, 0x26, 0xDF, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x16, 0x7B, 0x00, 0x00, 0x9D, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x79, 0x13, 0x00, 0x00, 0x20, 0xE8, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, +0x84, 0x03, 0x2E, 0x2F, 0x03, 0xAF, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x4E, +0x7D, 0x44, 0x4E, 0x80, 0x5B, 0xDE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x6F, 0x2E, +0x88, 0x6F, 0x76, 0x96, 0xD4, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x7A, 0x8A, 0x88, 0x01, +0x00, 0x23, 0xCA, 0x78, 0xAF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x37, 0xE0, 0x96, 0x3D, 0x5B, +0x77, 0x8C, 0x22, 0xFA, 0x15, 0x00, 0x00, 0x00, 0x00, 0x86, 0x02, 0x84, 0xB7, 0x3E, 0x26, 0x74, +0x82, 0x00, 0xCB, 0x64, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x05, 0x88, 0xE7, 0xE7, 0x8A, 0x05, +0x00, 0x78, 0xB5, 0x00, 0x00, 0x00, 0x16, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x75, 0x27, +0x35, 0xF7, 0x08, 0x00, 0x00, 0x49, 0x42, 0x00, 0x00, 0x00, 0x11, 0xA2, 0xE7, 0x8F, 0xC4, 0x36, +0xF1, 0x41, 0x00, 0x00, 0x7C, 0x14, 0x00, 0x00, 0x34, 0xE2, 0x9A, 0x0B, 0x00, 0x0C, 0xAE, 0xC5, +0x81, 0x00, 0x00, 0x91, 0x00, 0x00, 0x52, 0xF0, 0x61, 0x00, 0x00, 0x00, 0x00, 0x22, 0xF1, 0xB5, +0x00, 0x00, 0x90, 0x00, 0x5E, 0xF0, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0xE5, 0x00, +0x00, 0x93, 0x58, 0xF0, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xDC, 0x12, 0x16, +0xBF, 0xF3, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x33, 0x30, 0xFF, +0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2C, 0x48, 0x8D, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x05, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8E, +0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x6F, 0xCE, 0x2B, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x02, 0x4F, 0xB2, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3C, 0x00, 0x00, 0xC7, 0x36, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x02, 0x92, 0x00, 0x00, 0x00, 0x44, 0xB6, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x51, 0x42, 0x11, 0x89, 0x98, 0x1B, 0xD0, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x92, 0x5B, 0x84, 0x0B, 0x0A, 0xAF, 0x7A, 0x99, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x72, 0x89, +0x04, 0x00, 0x00, 0x54, 0x1C, 0xDE, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x70, 0x17, 0x3B, +0x0B, 0x83, 0x07, 0x8B, 0x60, 0x00, 0x00, 0x00, 0x00, 0x91, 0x00, 0x56, 0xC1, 0x1D, 0x5B, 0x35, +0x00, 0x32, 0xBD, 0x00, 0x00, 0x00, 0x12, 0x7A, 0x00, 0x08, 0x4E, 0x86, 0x5F, 0x18, 0x00, 0x00, +0xD4, 0x12, 0x00, 0x00, 0x57, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x0E, 0x00, 0x81, 0x5D, +0x00, 0x00, 0x8B, 0x06, 0x00, 0x00, 0x00, 0x00, 0x3E, 0xC0, 0xEE, 0x72, 0x3C, 0xA4, 0x00, 0x00, +0x8F, 0x00, 0x00, 0x00, 0x06, 0x90, 0xC9, 0x3E, 0x18, 0xC0, 0x67, 0xD8, 0x00, 0x08, 0x8C, 0x00, +0x00, 0x15, 0xC4, 0x8C, 0x04, 0x00, 0x00, 0x11, 0xD6, 0xD9, 0x22, 0x31, 0x61, 0x00, 0x1F, 0xD8, +0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0xFF, 0x54, 0x59, 0x36, 0x1F, 0xDD, 0x5A, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0xBA, 0x83, 0x81, 0x28, 0xDB, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x34, 0xAE, 0x9A, 0xCB, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x85, 0xC2, 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x2C, 0xB8, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x09, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x8E, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x76, +0xC8, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9F, 0x04, 0x53, 0xB0, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x44, 0x15, 0x2E, 0xC5, 0x32, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x99, 0x00, 0x33, 0x4F, 0x44, 0xB2, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x52, 0x48, 0x00, 0x51, 0x6F, 0x00, 0xD1, 0x26, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x97, 0x00, 0x00, 0x6F, 0x8F, 0x00, 0x66, 0x95, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, +0x76, 0x00, 0x00, 0x8D, 0xB0, 0x00, 0x0A, 0xE0, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x76, 0x1C, 0x00, +0x2F, 0xC7, 0xDE, 0x2F, 0x00, 0x92, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x94, 0x00, 0x0D, 0x81, 0xF5, +0xFE, 0x9D, 0x1C, 0x3B, 0xB9, 0x00, 0x00, 0x00, 0x13, 0x7C, 0x00, 0x00, 0x00, 0x9B, 0x8B, 0x11, +0x00, 0x01, 0xDC, 0x10, 0x00, 0x00, 0x58, 0x3B, 0x00, 0x00, 0x01, 0x20, 0x05, 0x12, 0x00, 0x00, +0x8C, 0x5A, 0x00, 0x00, 0x8C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x13, 0x81, 0xAE, 0x39, 0x47, 0xA3, +0x00, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x5A, 0xDD, 0x7E, 0x58, 0xD9, 0x40, 0xDD, 0x00, 0x08, +0x8C, 0x00, 0x00, 0x07, 0x9D, 0xC1, 0x1C, 0x00, 0x00, 0x2A, 0xD1, 0xD2, 0x21, 0x31, 0x61, 0x00, +0x12, 0xC4, 0x98, 0x04, 0x00, 0x00, 0x00, 0x00, 0x6B, 0xFC, 0x54, 0x59, 0x35, 0x16, 0xD3, 0x81, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xCD, 0x83, 0x81, 0x23, 0xD4, 0x7E, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0xAF, 0x9A, 0xC6, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x8D, 0xC2, 0xB7, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x2F, 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x0A, 0x54, 0x72, 0x65, 0x6B, 0x20, 0x4D, 0x6F, 0x76, 0x69, 0x65, 0x00, 0x0D, 0x46, 0x69, 0x6E, +0x61, 0x6C, 0x46, 0x72, 0x6F, 0x6E, 0x74, 0x69, 0x65, 0x72, 0x01, +}; diff --git a/libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf b/libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf rename to libraries/TFT_eSPI-2.5.43/Tools/Create_Smooth_Font/Create_font/data/Final-Frontier.ttf diff --git a/libraries/TFT_eSPI-2.4.72/Tools/Screenshot_client/Screenshot_client.pde b/libraries/TFT_eSPI-2.5.43/Tools/Screenshot_client/Screenshot_client.pde similarity index 99% rename from libraries/TFT_eSPI-2.4.72/Tools/Screenshot_client/Screenshot_client.pde rename to libraries/TFT_eSPI-2.5.43/Tools/Screenshot_client/Screenshot_client.pde index 537b108c..03c9eefd 100644 --- a/libraries/TFT_eSPI-2.4.72/Tools/Screenshot_client/Screenshot_client.pde +++ b/libraries/TFT_eSPI-2.5.43/Tools/Screenshot_client/Screenshot_client.pde @@ -55,7 +55,7 @@ int max_allowed = 1000; // Maximum number of save images allowed before a resta // These are default values, this sketch obtains the actual values from the Arduino board int tft_width = 480; // default TFT width (automatic - sent by Arduino) int tft_height = 480; // default TFT height (automatic - sent by Arduino) -int color_bytes = 2; // 2 for 16 bit, 3 for three RGB bytes (automatic - sent by Arduino) +int color_bytes = 2; // 2 for 16-bit, 3 for three RGB bytes (automatic - sent by Arduino) import processing.serial.*; diff --git a/libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/README.md b/libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/README.md similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/README.md rename to libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/README.md diff --git a/libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/bmp2array4bit.py b/libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/bmp2array4bit.py similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/bmp2array4bit.py rename to libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/bmp2array4bit.py diff --git a/libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/star.bmp b/libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/star.bmp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/Tools/bmp2array4bit/star.bmp rename to libraries/TFT_eSPI-2.5.43/Tools/bmp2array4bit/star.bmp diff --git a/libraries/TFT_eSPI-2.4.72/User_Setup.h b/libraries/TFT_eSPI-2.5.43/User_Setup.h similarity index 89% rename from libraries/TFT_eSPI-2.4.72/User_Setup.h rename to libraries/TFT_eSPI-2.5.43/User_Setup.h index 49d2ac73..a0123318 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setup.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setup.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. @@ -28,15 +28,15 @@ //#define NUCLEO_64_TFT //#define NUCLEO_144_TFT -// STM32 8 bit parallel only: -// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7 +// STM32 8-bit parallel only: +// If STN32 Port A or B pins 0-7 are used for 8-bit parallel data bus bits 0-7 // then this will improve rendering performance by a factor of ~8x //#define STM_PORTA_DATA_BUS //#define STM_PORTB_DATA_BUS // Tell the library to use parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT -//#defined TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY for RP2040 processor **** +//#defined TFT_PARALLEL_16_BIT // **** 16-bit parallel ONLY for RP2040 processor **** // Display type - only define if RPi display //#define RPI_DISPLAY_TYPE // 20MHz maximum SPI @@ -84,6 +84,7 @@ // #define TFT_WIDTH 80 // #define TFT_WIDTH 128 // #define TFT_WIDTH 172 // ST7789 172 x 320 +// #define TFT_WIDTH 170 // ST7789 170 x 320 // #define TFT_WIDTH 240 // ST7789 240 x 240 and 240 x 320 // #define TFT_HEIGHT 160 // #define TFT_HEIGHT 128 @@ -104,6 +105,7 @@ // #define ST7735_GREENTAB3 // #define ST7735_GREENTAB128 // For 128 x 128 display // #define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_ROBOTLCD // For some RobotLCD Arduino shields (128x160, BGR, https://docs.arduino.cc/retired/getting-started-guides/TFT) // #define ST7735_REDTAB // #define ST7735_BLACKTAB // #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset @@ -165,10 +167,15 @@ // ###### EDIT THE PIN NUMBERS IN THE LINES FOLLOWING TO SUIT YOUR ESP8266 SETUP ###### // For NodeMCU - use pin numbers in the form PIN_Dx where Dx is the NodeMCU pin designation -#define TFT_CS PIN_D8 // Chip select control pin D8 -#define TFT_DC PIN_D3 // Data Command control pin -#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) -//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V +#define TFT_MISO PIN_D6 // Automatically assigned with ESP8266 if not defined +#define TFT_MOSI PIN_D7 // Automatically assigned with ESP8266 if not defined +#define TFT_SCLK PIN_D5 // Automatically assigned with ESP8266 if not defined + +#define TFT_CS PIN_D8 // Chip select control pin D8 +#define TFT_DC PIN_D3 // Data Command control pin +#define TFT_RST PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line) +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to NodeMCU RST or 3.3V + //#define TFT_BL PIN_D1 // LED back-light (only for ST7789 with backlight control pin) @@ -235,7 +242,7 @@ // ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### -// The library supports 8 bit parallel TFTs with the ESP32, the pin +// The library supports 8-bit parallel TFTs with the ESP32, the pin // selection below is compatible with ESP32 boards in UNO format. // Wemos D32 boards need to be modified, see diagram in Tools folder. // Only ILI9481 and ILI9341 based displays have been tested! @@ -243,7 +250,7 @@ // Parallel bus is only supported for the STM32 and ESP32 // Example below is for ESP32 Parallel interface with UNO displays -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT // The ESP32 and TFT the pins used for testing are: @@ -323,6 +330,20 @@ // For RP2040 processor and SPI displays, uncomment the following line to use the PIO interface. //#define RP2040_PIO_SPI // Leave commented out to use standard RP2040 SPI port interface +// For RP2040 processor and 8 or 16-bit parallel displays: +// The parallel interface write cycle period is derived from a division of the CPU clock +// speed so scales with the processor clock. This means that the divider ratio may need +// to be increased when overclocking. It may also need to be adjusted dependant on the +// display controller type (ILI94341, HX8357C etc.). If RP2040_PIO_CLK_DIV is not defined +// the library will set default values which may not suit your display. +// The display controller data sheet will specify the minimum write cycle period. The +// controllers often work reliably for shorter periods, however if the period is too short +// the display may not initialise or graphics will become corrupted. +// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) +//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock + // For the RP2040 processor define the SPI port channel used (default 0 if undefined) //#define TFT_SPI_PORT 1 // Set to 0 if SPI0 pins are used, or 1 if spi1 pins used diff --git a/libraries/TFT_eSPI-2.4.72/User_Setup_Select.h b/libraries/TFT_eSPI-2.5.43/User_Setup_Select.h similarity index 76% rename from libraries/TFT_eSPI-2.4.72/User_Setup_Select.h rename to libraries/TFT_eSPI-2.5.43/User_Setup_Select.h index 999a2883..6a516399 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setup_Select.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setup_Select.h @@ -1,23 +1,28 @@ // This header file contains a list of user setup files and defines which one the // compiler uses when the IDE performs a Verify/Compile or Upload. // -// Users can create configurations for different Espressif boards and TFT displays. +// Users can create configurations for different boards and TFT displays. // This makes selecting between hardware setups easy by "uncommenting" one line. // The advantage of this hardware configuration method is that the examples provided -// with the library should work with different setups immediately without any other -// changes being needed. It also improves the portability of users sketches to other -// hardware configurations and compatible libraries. +// with the library should work with immediately without any other changes being +// needed. It also improves the portability of users sketches to other hardware +// configurations and compatible libraries. // // Create a shortcut to this file on your desktop to permit quick access for editing. // Re-compile and upload after making and saving any changes to this file. -// Customised User_Setup files are stored in the "User_Setups" folder. +// Example User_Setup files are stored in the "User_Setups" folder. These can be used +// unmodified or adapted for a particular hardware configuration. #ifndef USER_SETUP_LOADED // Lets PlatformIO users define settings in // platformio.ini, see notes in "Tools" folder. -// Only ONE line below should be uncommented. Add extra lines and files as needed. +/////////////////////////////////////////////////////// +// User configuration selection lines are below // +/////////////////////////////////////////////////////// + +// Only ONE line below should be uncommented to define your setup. Add extra lines and files as needed. #include // Default setup is root library folder @@ -81,9 +86,11 @@ //#include // Setup file for LilyGo LilyPi with ILI9481 display //#include // Setup file for LilyGo LilyPi with ST7796 display -//#include // Setup file for RP2040 with SPI ILI9341 -//#include // Setup file for RP2040 with PIO SPI ILI9341 -//#include // Setup file for RP2040 with SPI ILI9341 +//#include // Setup file for RP2040 with SPI ILI9341 +//#include // Setup file for RP2040 with PIO SPI ILI9341 +//#include // Setup file for RP2040 with SPI ILI9341 + +//#include // Setup file for Seeed XIAO with GC9A01 240x240 //#include // Setup file for ESP32 S2 with SPI ILI9341 //#include // Setup file for ESP32 S3 with SPI ILI9341 @@ -93,21 +100,24 @@ //#include // Setup file for ESP32 S2 with ST7789 //#include // Setup file for ESP32 with ST7789 1.47" 172x320 -//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9488 -//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9481 -//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9341 -//#include // Setup file for Pico/RP2040 with 8 bit parallel ILI9486 -//#include // Setup file for Pico/RP2040 with 8 bit parallel ST7796 +//#include // Setup file for Pico/RP2040 with 8-bit parallel ILI9488 +//#include // Setup file for Pico/RP2040 with 8-bit parallel ILI9481 +//#include // Setup file for Pico/RP2040 with 8-bit parallel ILI9341 +//#include // Setup file for Pico/RP2040 with 8-bit parallel ILI9486 +//#include // Setup file for Pico/RP2040 with 8-bit parallel ST7796 -//#include // Setup file for RP2040 16 bit parallel display -//#include // Setup file for RP2040 16 bit parallel display -//#include // Setup file for RP2040 16 bit parallel display +//#include // Setup file for RP2040 16-bit parallel display +//#include // Setup file for RP2040 16-bit parallel display +//#include // Setup file for RP2040 16-bit parallel display +//#include // Setup file for Waveshare RP2040 board with onboard ST7735 0.96" 160x80 display //#include // Setup file for ESP8266 and ST7789 135 x 240 TFT //#include // Setup file for ESP32 and Lilygo TTV ST7789 SPI bus TFT 135x240 //#include // Setup file for Lilygo T-Display RP2040 (ST7789 on SPI bus with 135x240 TFT) +//#include // Setup file for Pico Explorer Base by Pimoroni for RP2040 (ST7789 on SPI bus with 240x240 TFT) + //#include // Setup file for ESP32 and GC9A01 240 x 240 TFT //#include // Setup file for ESP32 based WT32_SC01 from Seeed @@ -120,17 +130,31 @@ //#include // Setup file for the ESP32 TouchDown S3 based on ILI9488 480 x 320 TFT +//#include // For the LilyGo T-Display S3 based ESP32S3 with ST7789 170 x 320 TFT +//#include // For the LilyGo T-HMI S3 based ESP32S3 with ST7789 240 x 320 TFT +//#include // For the LilyGo T-Dongle S3 based ESP32 with ST7735 80 x 160 TFT +//#include // For the LilyGo T-Embed S3 based ESP32S3 with ST7789 170 x 320 TFT +//#include // For the LilyGo T-QT Pro S3 based ESP32S3 with GC9A01 128 x 128 TFT +// #include // For the LilyGo T-PICO-Pro with ST7796 222 x 480 TFT +// #include // For the LilyGo T-BEAM V1.x with ST7796 222 x 480 TFT + +//#include // For the ESP32 S3 Box Lite +//#include // For the ESP32 S3 Box + +//#include // Setup file for Bw16-based boards with ST7735 160 x 80 TFT +//#include // Setup file for Waveshare ESP32-S3-Touch-LCD-1.28 board with GC9A01 240*240 TFT + //#include // Template file for a setup -//#include // Setup file for Dustin Watts PCB with ILI9488 +//#include // Setup file for Dustin Watts PCB with ILI9488 //#include // Setup file for Dustin Watts PCB with ST7796 -//#include // Setup file for Dustin Watts Pico PCB with ST7796 -//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board -//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board -//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board -//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board -//#include // Setup file for Dustin Watts PCB with ILI9341 +//#include // Setup file for Dustin Watts Pico PCB with ST7796 +//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with GC9A01 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with ST7789 240 x 240 on 3.3V adapter board +//#include // Setup file for Dustin Watts PCB with ILI9341 //#include #endif // USER_SETUP_LOADED @@ -145,7 +169,7 @@ ///////////////////////////////////////////////////////////////////////////////////// -// Identical looking TFT displays may have a different colour ordering in the 16 bit colour +// Identical looking TFT displays may have a different colour ordering in the 16-bit colour #define TFT_BGR 0 // Colour order Blue-Green-Red #define TFT_RGB 1 // Colour order Red-Green-Blue @@ -167,7 +191,7 @@ #endif #endif -// Invoke 18 bit colour for selected displays +// Invoke 18-bit colour for selected displays #if !defined (RPI_DISPLAY_TYPE) && !defined (TFT_PARALLEL_8_BIT) && !defined (TFT_PARALLEL_16_BIT) && !defined (ESP32_PARALLEL) #if defined (ILI9481_DRIVER) || defined (ILI9486_DRIVER) || defined (ILI9488_DRIVER) #define SPI_18BIT_DRIVER diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup0_Sprite.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup0_Sprite.h new file mode 100644 index 00000000..a7692913 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup0_Sprite.h @@ -0,0 +1,47 @@ +// For sprite only functionality (untested) +#define USER_SETUP_ID 0 + +#define TFT_WIDTH 1000 +#define TFT_HEIGHT 1000 + +#define TFT_INIT_DELAY 0 + +#define TFT_NOP 0x00 +#define TFT_SWRST 0x00 + +#define TFT_CASET 0x00 +#define TFT_PASET 0x00 +#define TFT_RAMWR 0x00 + +#define TFT_RAMRD 0x00 +#define TFT_IDXRD 0x00 + +/* +#define TFT_MADCTL 0x00 +#define TFT_MAD_MY 0x00 +#define TFT_MAD_MX 0x00 +#define TFT_MAD_MV 0x00 +#define TFT_MAD_ML 0x00 +#define TFT_MAD_BGR 0x00 +#define TFT_MAD_MH 0x00 +#define TFT_MAD_RGB 0x00 +*/ +#define TFT_INVOFF 0x00 +#define TFT_INVON 0x00 + + +#define TFT_MISO -1 +#define TFT_MOSI -1 +#define TFT_SCLK -1 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup100_RP2040_ILI9488_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup100_RP2040_ILI9488_parallel.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup100_RP2040_ILI9488_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup100_RP2040_ILI9488_parallel.h index a28fa70e..dcec30ee 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup100_RP2040_ILI9488_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup100_RP2040_ILI9488_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 100 @@ -25,8 +25,6 @@ //#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 // Note: All the following pins are PIO hardware configured and driven -// The pins are hard-coded at the moment and must not be changed here -// Connections MUST use the pins below #define TFT_WR 22 // PIO requires these to be sequentially increasing - do not change diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup101_RP2040_ILI9481_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup101_RP2040_ILI9481_parallel.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup101_RP2040_ILI9481_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup101_RP2040_ILI9481_parallel.h index f80fdefd..714e5e14 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup101_RP2040_ILI9481_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup101_RP2040_ILI9481_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 101 @@ -25,8 +25,6 @@ //#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 // Note: All the following pins are PIO hardware configured and driven -// The pins are hard-coded at the moment and must not be changed here -// Connections MUST use the pins below #define TFT_WR 22 // PIO requires these to be sequentially increasing - do not change diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup102_RP2040_ILI9341_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup102_RP2040_ILI9341_parallel.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup102_RP2040_ILI9341_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup102_RP2040_ILI9341_parallel.h index 844d2376..ce133c80 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup102_RP2040_ILI9341_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup102_RP2040_ILI9341_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 102 @@ -25,8 +25,6 @@ //#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 // Note: All the following pins are PIO hardware configured and driven -// The pins are hard-coded at the moment and must not be changed here -// Connections MUST use the pins below #define TFT_WR 22 // PIO requires these to be sequentially increasing - do not change diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup103_RP2040_ILI9486_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup103_RP2040_ILI9486_parallel.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup103_RP2040_ILI9486_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup103_RP2040_ILI9486_parallel.h index ca2084cb..34bb7024 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup103_RP2040_ILI9486_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup103_RP2040_ILI9486_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 103 @@ -25,8 +25,6 @@ //#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 // Note: All the following pins are PIO hardware configured and driven -// The pins are hard-coded at the moment and must not be changed here -// Connections MUST use the pins below #define TFT_WR 22 // PIO requires these to be sequentially increasing - do not change diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup104_RP2040_ST7796_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup104_RP2040_ST7796_parallel.h similarity index 93% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup104_RP2040_ST7796_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup104_RP2040_ST7796_parallel.h index 0a69d9da..a76e4fcd 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup104_RP2040_ST7796_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup104_RP2040_ST7796_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 104 @@ -25,8 +25,6 @@ //#define TFT_RD -1 // Do not define, read pin permanently connected to 3V3 // Note: All the following pins are PIO hardware configured and driven -// The pins are hard-coded at the moment and must not be changed here -// Connections MUST use the pins below #define TFT_WR 22 // PIO requires these to be sequentially increasing - do not change diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h index e53afa66..82b506cf 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup105_RP2040_ST7796_16bit_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 105 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h similarity index 71% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h index fce71204..7273ba3d 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup106_RP2040_ILI9481_16bit_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor when used with 8 bit parallel displays +// This setup is for the RP2040 processor when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 106 @@ -8,6 +8,19 @@ //#define TFT_PARALLEL_8_BIT #define TFT_PARALLEL_16_BIT +// The parallel interface write cycle period is derived from a division of the CPU clock +// speed so scales with the processor clock. This means that the divider ratio may need +// to be increased when overclocking. I may also need to be adjusted dependant on the +// display controller type (ILI94341, HX8357C etc.). If RP2040_PIO_CLK_DIV is not defined +// the library will set default values which may not suit your display. +// The display controller data sheet will specify the minimum write cycle period. The +// controllers often work reliably for shorter periods, however if the period is too short +// the display may not initialise or graphics will become corrupted. +// PIO write cycle frequency = (CPU clock/(4 * RP2040_PIO_CLK_DIV)) +//#define RP2040_PIO_CLK_DIV 1 // 32ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 2 // 64ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 3 // 96ns write cycle at 125MHz CPU clock +//#define RP2040_PIO_CLK_DIV 4 // 96ns write cycle at 125MHz CPU clock //////////////////////////////////////////////////////////////////////////////////////////// // Display driver type diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h index 6b0d0f98..384dc1cc 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup107_RP2040_ILI9341_16bit_parallel.h @@ -1,4 +1,4 @@ -// This setup is for the RP2040 processor only when used with 8 bit parallel displays +// This setup is for the RP2040 processor only when used with 8-bit parallel displays // See SetupX_Template.h for all options available #define USER_SETUP_ID 107 diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup108_RP2040_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup108_RP2040_ST7735.h new file mode 100644 index 00000000..dc6ac31a --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup108_RP2040_ST7735.h @@ -0,0 +1,44 @@ +// This setup is for the Waveshare RP2040-LCD-0.96 board +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 108 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display driver type +//////////////////////////////////////////////////////////////////////////////////////////// +#define ST7735_DRIVER +#define ST7735_GREENTAB160x80 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Display params +//////////////////////////////////////////////////////////////////////////////////////////// +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 +#define TFT_INVERSION_ON + +//////////////////////////////////////////////////////////////////////////////////////////// +// RP2040 config and pins +//////////////////////////////////////////////////////////////////////////////////////////// +#define SPI_FREQUENCY 27000000 +#define RP2040_PIO_CLK_DIV 1 +#define TFT_SPI_PORT 1 + +#define TFT_MOSI 11 +#define TFT_SCLK 10 +#define TFT_CS 9 +#define TFT_DC 8 +#define TFT_RST 12 + +//////////////////////////////////////////////////////////////////////////////////////////// +// Fonts to be available +//////////////////////////////////////////////////////////////////////////////////////////// +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +//////////////////////////////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup10_RPi_touch_ILI9486.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup10_RPi_touch_ILI9486.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup10_RPi_touch_ILI9486.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup10_RPi_touch_ILI9486.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup11_RPi_touch_ILI9486.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup11_RPi_touch_ILI9486.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup11_RPi_touch_ILI9486.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup11_RPi_touch_ILI9486.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup12_M5Stack_Basic_Core.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup12_M5Stack_Basic_Core.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup12_M5Stack_Basic_Core.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup12_M5Stack_Basic_Core.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup135_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup135_ST7789.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup135_ST7789.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup135_ST7789.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup136_LilyGo_TTV.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup136_LilyGo_TTV.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup136_LilyGo_TTV.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup136_LilyGo_TTV.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup137_LilyGo_TDisplay_RP2040.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h new file mode 100644 index 00000000..ca3bcfd5 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup138_Pico_Explorer_Base_RP2040_ST7789.h @@ -0,0 +1,32 @@ +// Pico Explorer Base by Pimoroni (RP2040) (ST7789 on SPI bus with 240x240 TFT) +#define USER_SETUP_ID 138 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define CGRAM_OFFSET // Library will add offsets required + +// For Pico Explorer Base (PR2040) +#define TFT_CS 17 // Chip Select pin +#define TFT_DC 16 // Data Command control pin +#define TFT_RST -1 // No Reset pin +#define TFT_MOSI 19 +#define TFT_SCLK 18 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +// #define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup13_ILI9481_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup13_ILI9481_Parallel.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup13_ILI9481_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup13_ILI9481_Parallel.h index cf3e412f..f8881ea2 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup13_ILI9481_Parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup13_ILI9481_Parallel.h @@ -1,7 +1,7 @@ // See SetupX_Template.h for all options available #define USER_SETUP_ID 13 -#define ESP32_PARALLEL +#define TFT_PARALLEL_8_BIT #define ILI9481_DRIVER diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup14_ILI9341_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup14_ILI9341_Parallel.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup14_ILI9341_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup14_ILI9341_Parallel.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup15_HX8357D.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup15_HX8357D.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup15_HX8357D.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup15_HX8357D.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup16_ILI9488_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup16_ILI9488_Parallel.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup16_ILI9488_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup16_ILI9488_Parallel.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup17_ePaper.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup17_ePaper.h new file mode 100644 index 00000000..5671a151 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup17_ePaper.h @@ -0,0 +1,16 @@ +#define EPD_DRIVER // ePaper driver + +#define TFT_MISO -1 +#define TFT_MOSI -1 +#define TFT_SCLK -1 +#define TFT_RST -1 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup18_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup18_ST7789.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup18_ST7789.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup18_ST7789.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup19_RM68140_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup19_RM68140_Parallel.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup19_RM68140_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup19_RM68140_Parallel.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup1_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup1_ILI9341.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup1_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup1_ILI9341.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup200_GC9A01.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup200_GC9A01.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup200_GC9A01.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup200_GC9A01.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup201_WT32_SC01.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup201_WT32_SC01.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup201_WT32_SC01.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup201_WT32_SC01.h index 7f034978..08f59533 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup201_WT32_SC01.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup201_WT32_SC01.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup202_SSD1351_128.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup202_SSD1351_128.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup202_SSD1351_128.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup202_SSD1351_128.h index 793de6ca..8cbc4bfa 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup202_SSD1351_128.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup202_SSD1351_128.h @@ -28,7 +28,7 @@ #define TFT_DC 2 #define TFT_RST 4 #define TFT_CS 15 -#elif defined(ESP8266) +#elif defined (ARDUINO_ARCH_ESP8266) //#define TFT_MOSI PIN_D5 // Can't change //#define TFT_SCLK PIN_D7 // Can't change #define TFT_DC PIN_D3 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup203_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup203_ST7789.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup203_ST7789.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup203_ST7789.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup204_ESP32_TouchDown.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup204_ESP32_TouchDown.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup204_ESP32_TouchDown.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup204_ESP32_TouchDown.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup205_ESP32_TouchDown_S3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup205_ESP32_TouchDown_S3.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup205_ESP32_TouchDown_S3.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup205_ESP32_TouchDown_S3.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup206_LilyGo_T_Display_S3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup206_LilyGo_T_Display_S3.h new file mode 100644 index 00000000..7a58eca6 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup206_LilyGo_T_Display_S3.h @@ -0,0 +1,47 @@ +// ST7789 using 8-bit Parallel + +#define USER_SETUP_ID 206 + +#define ST7789_DRIVER +#define INIT_SEQUENCE_3 // Using this initialisation sequence improves the display image + +#define CGRAM_OFFSET +#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + +#define TFT_PARALLEL_8_BIT + +#define TFT_WIDTH 170 +#define TFT_HEIGHT 320 + +#define TFT_CS 6 +#define TFT_DC 7 +#define TFT_RST 5 + +#define TFT_WR 8 +#define TFT_RD 9 + +#define TFT_D0 39 +#define TFT_D1 40 +#define TFT_D2 41 +#define TFT_D3 42 +#define TFT_D4 45 +#define TFT_D5 46 +#define TFT_D6 47 +#define TFT_D7 48 + +#define TFT_BL 38 +#define TFT_BACKLIGHT_ON HIGH + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup207_LilyGo_T_HMI.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup207_LilyGo_T_HMI.h new file mode 100644 index 00000000..8606ef3d --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup207_LilyGo_T_HMI.h @@ -0,0 +1,48 @@ +// ST7789 240 x 240 display with no chip select line +#define USER_SETUP_ID 207 + +#define ST7789_DRIVER // Configure all registers + +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define CGRAM_OFFSET +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// #define TFT_INVERSION_ON +#define TFT_INVERSION_OFF + +#define TFT_PARALLEL_8_BIT + +// The ESP32 and TFT the pins used for testing are: +#define TFT_CS 6 // Chip select control pin (library pulls permanently low +#define TFT_DC 7 // Data Command control pin +#define TFT_RST -1 // Reset pin, toggles on startup + +#define TFT_WR 8 // Write strobe control pin +#define TFT_RD -1 // Read strobe control pin + +#define TFT_D0 48 // Must use pins in the range 0-31 or alternatively 32-48 +#define TFT_D1 47 // so a single register write sets/clears all bits. +#define TFT_D2 39 // Pins can be randomly assigned, this does not affect +#define TFT_D3 40 // TFT screen update performance. +#define TFT_D4 41 +#define TFT_D5 42 +#define TFT_D6 45 +#define TFT_D7 46 + +#define TFT_BL 38 // LED back-light + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup209_LilyGo_T_Dongle_S3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup209_LilyGo_T_Dongle_S3.h new file mode 100644 index 00000000..1a28a82e --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup209_LilyGo_T_Dongle_S3.h @@ -0,0 +1,52 @@ +// Config for LilyGo T-Dongle S3 w ESP32 and ST7735 80 x 160 display +#define USER_SETUP_ID 209 + +#define ST7735_DRIVER // Configure all registers + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +// #define ST7735_INITB +// #define ST7735_GREENTAB +// #define ST7735_GREENTAB2 +// #define ST7735_GREENTAB3 +// #define ST7735_GREENTAB128 // For 128 x 128 display +#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 offset) +// #define ST7735_REDTAB +//#define ST7735_BLACKTAB +// #define ST7735_REDTAB160x80 // For 160 x 80 display with 24 pixel offset + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +//#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF + +// Generic ESP32 setup +#define TFT_MISO -1 +#define TFT_MOSI 3 +#define TFT_SCLK 5 +#define TFT_CS 4 +#define TFT_DC 2 +#define TFT_RST 1 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 27000000 +//#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup20_ILI9488.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup20_ILI9488.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup20_ILI9488.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup20_ILI9488.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup210_LilyGo_T_Embed_S3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup210_LilyGo_T_Embed_S3.h new file mode 100644 index 00000000..d3b815a0 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup210_LilyGo_T_Embed_S3.h @@ -0,0 +1,43 @@ +// ST7789 170 x 320 display with no chip select line +#define USER_SETUP_ID 210 + +#define ST7789_DRIVER // Configure all registers + +#define TFT_WIDTH 170 +#define TFT_HEIGHT 320 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF +#define TFT_BACKLIGHT_ON 1 + +#define TFT_BL 15 // LED back-light +#define TFT_MISO -1 // Not connected +#define TFT_MOSI 11 +#define TFT_SCLK 12 +#define TFT_CS 10 +#define TFT_DC 13 +#define TFT_RST 9 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h new file mode 100644 index 00000000..3f41df05 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup211_LilyGo_T_QT_Pro_S3.h @@ -0,0 +1,45 @@ +// GC9A01 128 x 128 display with no chip select line +#define USER_SETUP_ID 211 + +#define GC9A01_DRIVER // Configure all registers + +#define TFT_WIDTH 128 +#define TFT_HEIGHT 128 + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +//#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// #define TFT_INVERSION_ON +//#define TFT_INVERSION_OFF +#define TFT_BACKLIGHT_ON 0 +#define CGRAM_OFFSET + + +#define TFT_BL 10 // LED back-light +#define TFT_MISO -1 // Not connected +#define TFT_MOSI 2 +#define TFT_SCLK 3 +#define TFT_CS 5 +#define TFT_DC 6 +#define TFT_RST 1 // Connect reset to ensure display initialises + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup212_LilyGo_T_PicoPro.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup212_LilyGo_T_PicoPro.h new file mode 100644 index 00000000..6be1f3b7 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup212_LilyGo_T_PicoPro.h @@ -0,0 +1,45 @@ +// ST7796 222 x 480 display with no chip select line +#define USER_SETUP_ID 212 + +#define ST7796_DRIVER // Configure all registers + +#define TFT_WIDTH 222 +#define TFT_HEIGHT 480 + +#define CGRAM_OFFSET // Library will add offsets required + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON + +#define TFT_MISO 4 +#define TFT_MOSI 7 +#define TFT_SCLK 6 +#define TFT_CS 8 +#define TFT_DC 9 +#define TFT_RST 16 +#define TFT_BACKLIGHT_ON 1 +#define TFT_BL 10 + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +// #define SPI_FREQUENCY 27000000 +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup213_LilyGo_T_Beam_Shield.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup213_LilyGo_T_Beam_Shield.h new file mode 100644 index 00000000..d9ebc87d --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup213_LilyGo_T_Beam_Shield.h @@ -0,0 +1,36 @@ +// ST7796 222 x 480 display with no chip select line +#define USER_SETUP_ID 213 + +#define ST7796_DRIVER // Configure all registers + +#define TFT_WIDTH 222 +#define TFT_HEIGHT 480 + +#define CGRAM_OFFSET // Library will add offsets required + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON + +#define TFT_MISO -1 +#define TFT_MOSI 14 +#define TFT_SCLK 15 +#define TFT_CS 25 +#define TFT_DC 13 +#define TFT_RST 2 +#define TFT_BL 4 +#define TFT_BACKLIGHT_ON HIGH + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT +#define SPI_FREQUENCY 40000000 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup21_ILI9488.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup21_ILI9488.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup21_ILI9488.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup21_ILI9488.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup22_TTGO_T4.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup22_TTGO_T4.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup22_TTGO_T4.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup22_TTGO_T4.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup22_TTGO_T4_v1.3.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup22_TTGO_T4_v1.3.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup22_TTGO_T4_v1.3.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup22_TTGO_T4_v1.3.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup23_TTGO_TM.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup23_TTGO_TM.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup23_TTGO_TM.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup23_TTGO_TM.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup24_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup24_ST7789.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup24_ST7789.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup24_ST7789.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup250_ESP32_S3_Box_Lite.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup250_ESP32_S3_Box_Lite.h new file mode 100644 index 00000000..8a211d1a --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup250_ESP32_S3_Box_Lite.h @@ -0,0 +1,32 @@ +// Display configuration for ST7789-based ESP32-S3-Box-Lite + +#define USER_SETUP_ID 250 +#define USER_SETUP_INFO "ESP32-S3-BOX-LITE" + +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define TFT_BL 45 +#define TFT_BACKLIGHT_ON LOW + +#define TFT_CS 5 +#define TFT_DC 4 +#define TFT_RST 48 + +#define TFT_MOSI 6 +#define TFT_SCLK 7 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup251_ESP32_S3_Box.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup251_ESP32_S3_Box.h new file mode 100644 index 00000000..5458aaf9 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup251_ESP32_S3_Box.h @@ -0,0 +1,28 @@ +// Display configuration for ILI9342-based ESP32-S3-Box + +#define USER_SETUP_ID 251 +#define USER_SETUP_INFO "ESP32-S3-BOX" + +#define M5STACK // S3-Box uses the same ILI9342 display, don't remove + +#define ILI9341_DRIVER + +#define TFT_MISO 0 +#define TFT_MOSI 6 +#define TFT_SCLK 7 +#define TFT_CS 5 // Chip select control pin +#define TFT_DC 4 // Data Command control pin +#define TFT_RST 48 // Reset pin (could connect to Arduino RESET pin) +#define TFT_BL 45 // LED back-light + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 27000000 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup25_TTGO_T_Display.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup25_TTGO_T_Display.h similarity index 96% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup25_TTGO_T_Display.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup25_TTGO_T_Display.h index e0367c5a..455c8518 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup25_TTGO_T_Display.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup25_TTGO_T_Display.h @@ -19,8 +19,6 @@ #define TFT_DC 16 #define TFT_RST 23 -#define TOUCH_CS -1 - #define TFT_BL 4 // Display backlight control pin #define TFT_BACKLIGHT_ON HIGH // HIGH or LOW are options diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup26_TTGO_T_Wristband.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup26_TTGO_T_Wristband.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup26_TTGO_T_Wristband.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup26_TTGO_T_Wristband.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup27_RPi_ST7796_ESP32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup27_RPi_ST7796_ESP32.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup27_RPi_ST7796_ESP32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup27_RPi_ST7796_ESP32.h index 8d2f54b5..ed053a41 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup27_RPi_ST7796_ESP32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup27_RPi_ST7796_ESP32.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup28_RPi_ST7796_ESP8266.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup28_RPi_ST7796_ESP8266.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup28_RPi_ST7796_ESP8266.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup28_RPi_ST7796_ESP8266.h index 4be82743..e4ba57c6 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup28_RPi_ST7796_ESP8266.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup28_RPi_ST7796_ESP8266.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup29_ILI9341_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup29_ILI9341_STM32.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup29_ILI9341_STM32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup29_ILI9341_STM32.h index bb78e8e9..61043a94 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup29_ILI9341_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup29_ILI9341_STM32.h @@ -83,7 +83,7 @@ #define SMOOTH_FONT -// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. #define SPI_FREQUENCY 27000000 // 27MHz SPI clock //#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup29b_ILI9341_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup29b_ILI9341_STM32.h new file mode 100644 index 00000000..fac38460 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup29b_ILI9341_STM32.h @@ -0,0 +1,141 @@ + +#define STM32 + +#define NUCLEO_64_TFT +//#define TFT_INVERSION_OFF + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 320 + +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR + +#define TFT_SPI_PORT 1 // SPI 1 maximum clock rate is 55MHz +#define TFT_MOSI D11 +#define TFT_MISO D12 +#define TFT_SCLK D13 + + +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + +#define SPI_FREQUENCY 55000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS + +/* + /////////////////////////////////////////////////// + // Setup for STM32 Nucleo and ILI9341 display // + /////////////////////////////////////////////////// +#define USER_SETUP_ID 29 + +// Last update by Bodmer: 28/11/19 + +// STM32 optimised functions are not yet compatible with STM32H743 processor. +// The STM32H743 does work with the slower generic processor drivers +// +// REMINDER - Nucleo-F743ZI and Nucleo-F743ZI2 have different pin port allocations +// and require appropriate selection in IDE. ^---- Note the extra 2 in part number! + + +// Define STM32 to invoke STM32 optimised driver +#define STM32 + +// Define the TFT display driver +//#define ILI9341_DRIVER +//#define ILI9481_DRIVER +#define ST7789_DRIVER +#define TFT_RGB_ORDER TFT_BGR +// MOSI and SCK do not need to be defined, connect: +// - Arduino SCK to TFT SCK +// - Arduino MOSI to TFT SDI(may be marked SDA or MOSI) +// Typical Arduino SPI port 1 pins are (SCK=D13, MISO=D12, MOSI=D11) this is port pins PA5, PA6 and PA7 on Nucleo-F767ZI +// SPI port 2 pins are (SCK=D18, MISO=A7, MOSI=D17) this is port pins PB13, PC2 and PB15 on Nucleo-F767ZI + +//* +#define TFT_SPI_PORT 1 // SPI 1 maximum clock rate is 55MHz +#define TFT_MOSI PA7 +#define TFT_MISO PA6 +#define TFT_SCLK PA5 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI D17 +#define TFT_MISO A7 +#define TFT_SCLK D18 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PC2 +#define TFT_SCLK PB13 +//*/ + +/* +#define TFT_SPI_PORT 2 // SPI 2 maximum clock rate is 27MHz +#define TFT_MOSI PB15 +#define TFT_MISO PB14 +#define TFT_SCLK PB13 +//*/ + +/* +// Can use Ardiuno pin references, arbitrary allocation, TFT_eSPI controls chip select +#define TFT_CS D5 // Chip select control pin to TFT CS +#define TFT_DC D6 // Data Command control pin to TFT DC (may be labelled RS = Register Select) +#define TFT_RST D7 // Reset pin to TFT RST (or RESET) + +// Alternatively, we can use STM32 port reference names PXnn +//#define TFT_CS PE11 // Nucleo-F767ZI equivalent of D5 +//#define TFT_DC PE9 // Nucleo-F767ZI equivalent of D6 +//#define TFT_RST PF13 // Nucleo-F767ZI equivalent of D7 + +//#define TFT_RST -1 // Set TFT_RST to -1 if the display RESET is connected to processor reset + // Use an Arduino pin for initial testing as connecting to processor reset + // may not work (pulse too short at power up?) + +// Chip select for XPT2046 touch controller +#define TOUCH_CS D4 + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +// STM32 support for smooth fonts via program memory (FLASH) arrays +#define SMOOTH_FONT + + +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. + +#define SPI_FREQUENCY 27000000 // 27MHz SPI clock +//#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! + +#define SPI_READ_FREQUENCY 15000000 // Reads need a slower SPI clock, probably ends up at 13.75MHz (CPU clock/16) + +#define SPI_TOUCH_FREQUENCY 2500000 // Must be very slow + +// This has no effect, transactions for STM32 are automatically enabled +#define SUPPORT_TRANSACTIONS +*/ \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup2_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup2_ST7735.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup2_ST7735.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup2_ST7735.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup301_BW16_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup301_BW16_ST7735.h new file mode 100644 index 00000000..75ba3fb8 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup301_BW16_ST7735.h @@ -0,0 +1,47 @@ +#include "itoa.h" +#include + + +// Setup for BW16 and ST7735 80 x 160 TFT +#define USER_SETUP_ID 301 +// See SetupX_Template.h for all options available + +#define ST7735_DRIVER + + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + + +#define ST7735_GREENTAB160x80 + +// For ST7735, ST7789 and ILI9341 ONLY, define the colour order IF the blue and red are swapped on your display +// Try ONE option at a time to find the correct colour order for your display + +// #define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +// #define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +// Pin Mappings for BW16 board +#define TFT_MISO 11 +#define TFT_MOSI 12 +#define TFT_SCLK 10 +#define TFT_CS 9 // Chip select control pin +#define TFT_DC 8 // Data Command control pin +#define TFT_RST 6 // Reset pin (could connect to RST pin) + + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + + +#define SPI_FREQUENCY 20000000 +//#define SPI_FREQUENCY 27000000 // Actually sets it to 26.67MHz = 80/3 + diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h new file mode 100644 index 00000000..5e3127f5 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup302_Waveshare_ESP32S3_GC9A01.h @@ -0,0 +1,33 @@ +// See SetupX_Template.h for all options available +#define USER_SETUP_ID 302 + +#define GC9A01_DRIVER + +#define TFT_MISO 12 +#define TFT_MOSI 11 +#define TFT_SCLK 10 +#define TFT_CS 9 // Chip select control pin +#define TFT_DC 8 // Data Command control pin +#define TFT_RST 14 // Reset pin (could connect to RST pin) +#define TFT_BL 2 +#define TFT_BACKLIGHT_ON HIGH + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + +#define SPI_FREQUENCY 40000000 + +#define SPI_READ_FREQUENCY 20000000 + +#define SPI_TOUCH_FREQUENCY 2500000 + +// #define SUPPORT_TRANSACTIONS \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup30_ILI9341_Parallel_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup30_ILI9341_Parallel_STM32.h similarity index 94% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup30_ILI9341_Parallel_STM32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup30_ILI9341_Parallel_STM32.h index e9a42214..5b1b26df 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup30_ILI9341_Parallel_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup30_ILI9341_Parallel_STM32.h @@ -14,7 +14,7 @@ #define NUCLEO_64_TFT //#define NUCLEO_144_TFT -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) #define TFT_PARALLEL_8_BIT // Define the display driver chip type @@ -31,7 +31,7 @@ #define TFT_WR A1 // Write strobe control pin #define TFT_RD A0 // Read pin -#define TFT_D0 D8 // 8 bit parallel bus to TFT +#define TFT_D0 D8 // 8-bit parallel bus to TFT #define TFT_D1 D9 #define TFT_D2 D2 #define TFT_D3 D3 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup31_ST7796_Parallel_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup31_ST7796_Parallel_STM32.h similarity index 94% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup31_ST7796_Parallel_STM32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup31_ST7796_Parallel_STM32.h index 0063e763..0e26eaa3 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup31_ST7796_Parallel_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup31_ST7796_Parallel_STM32.h @@ -13,7 +13,7 @@ #define NUCLEO_64_TFT //#define NUCLEO_144_TFT -// Tell the library to use 8 bit parallel mode(otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode(otherwise SPI is assumed) #define TFT_PARALLEL_8_BIT // Define the display driver chip type @@ -30,7 +30,7 @@ #define TFT_WR A1 // Write strobe control pin #define TFT_RD A0 // Read pin -#define TFT_D0 D8 // 8 bit parallel bus to TFT +#define TFT_D0 D8 // 8-bit parallel bus to TFT #define TFT_D1 D9 #define TFT_D2 D2 #define TFT_D3 D3 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup32_ILI9341_STM32F103.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup32_ILI9341_STM32F103.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup32_ILI9341_STM32F103.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup32_ILI9341_STM32F103.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup33_RPi_ILI9486_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup33_RPi_ILI9486_STM32.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup33_RPi_ILI9486_STM32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup33_RPi_ILI9486_STM32.h index 6def91d7..5a1a8c8b 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup33_RPi_ILI9486_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup33_RPi_ILI9486_STM32.h @@ -54,7 +54,7 @@ #define SMOOTH_FONT -// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc +// Nucleo-F767ZI has a ~216MHZ CPU clock, this is divided by 4, 8, 16 etc. #define SPI_FREQUENCY 20000000 // 27MHz SPI clock //#define SPI_FREQUENCY 55000000 // 55MHz is over-clocking ILI9341 but seems to work reliably! diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup34_ILI9481_Parallel_STM32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup34_ILI9481_Parallel_STM32.h similarity index 94% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup34_ILI9481_Parallel_STM32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup34_ILI9481_Parallel_STM32.h index 9585a4fe..467a001c 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup34_ILI9481_Parallel_STM32.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup34_ILI9481_Parallel_STM32.h @@ -12,7 +12,7 @@ #define NUCLEO_64_TFT //#define NUCLEO_144_TFT -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) #define TFT_PARALLEL_8_BIT // Define the display driver chip type @@ -29,7 +29,7 @@ #define TFT_WR A1 // Write strobe control pin #define TFT_RD A0 // Read pin -#define TFT_D0 D8 // 8 bit parallel bus to TFT +#define TFT_D0 D8 // 8-bit parallel bus to TFT #define TFT_D1 D9 #define TFT_D2 D2 #define TFT_D3 D3 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h similarity index 95% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h index eadec6ed..894948cb 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup35_ILI9341_STM32_Port_Bus.h @@ -14,7 +14,7 @@ //#define STM_PORTC_DATA_BUS // Pins below must re re-allocated to use this option //#define STM_PORTD_DATA_BUS // Pins below must re re-allocated to use this option -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) #define TFT_PARALLEL_8_BIT // Define ONE of the the TFT display drivers @@ -30,7 +30,7 @@ #define TFT_WR PB9 // Write strobe control pin #define TFT_RD PB1 // Read pin -#define TFT_D0 PA0 // 8 bit Port A parallel bus to TFT +#define TFT_D0 PA0 // 8-bit Port A parallel bus to TFT #define TFT_D1 PA1 #define TFT_D2 PA2 #define TFT_D3 PA3 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup36_RPi_touch_ST7796.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup36_RPi_touch_ST7796.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup36_RPi_touch_ST7796.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup36_RPi_touch_ST7796.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup3_ILI9163.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup3_ILI9163.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup3_ILI9163.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup3_ILI9163.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup42_ILI9341_ESP32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup42_ILI9341_ESP32.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup42_ILI9341_ESP32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup42_ILI9341_ESP32.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup43_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup43_ST7735.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup43_ST7735.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup43_ST7735.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup44_TTGO_CameraPlus.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup44_TTGO_CameraPlus.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup44_TTGO_CameraPlus.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup44_TTGO_CameraPlus.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup45_TTGO_T_Watch.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup45_TTGO_T_Watch.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup45_TTGO_T_Watch.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup45_TTGO_T_Watch.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup46_GC9A01_ESP32.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup46_GC9A01_ESP32.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup46_GC9A01_ESP32.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup46_GC9A01_ESP32.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup47_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup47_ST7735.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup47_ST7735.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup47_ST7735.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup4_S6D02A1.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup4_S6D02A1.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup4_S6D02A1.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup4_S6D02A1.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup50_SSD1963_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup50_SSD1963_Parallel.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup50_SSD1963_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup50_SSD1963_Parallel.h index 011fbd1d..d7265d7a 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup50_SSD1963_Parallel.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup50_SSD1963_Parallel.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup51_LilyPi_ILI9481.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup51_LilyPi_ILI9481.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup51_LilyPi_ILI9481.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup51_LilyPi_ILI9481.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup52_LilyPi_ST7796.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup52_LilyPi_ST7796.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup52_LilyPi_ST7796.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup52_LilyPi_ST7796.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup5_RPi_ILI9486.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup5_RPi_ILI9486.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup5_RPi_ILI9486.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup5_RPi_ILI9486.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup60_RP2040_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_ILI9341.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup60_RP2040_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_ILI9341.h index 49522e16..c795e0e4 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup60_RP2040_ILI9341.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_ILI9341.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. @@ -15,7 +15,7 @@ // // ################################################################################## -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT // Display type - only define if RPi display diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_RPI_MHS.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_RPI_MHS.h new file mode 100644 index 00000000..804541cc --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup60_RP2040_RPI_MHS.h @@ -0,0 +1,29 @@ +#define USER_SETUP_ID 162 +#define ST7796_DRIVER + +#define MHS_DISPLAY_TYPE +//#define RP2040_PIO_SPI +#define TFT_MISO 16 +#define TFT_MOSI 19 +#define TFT_SCLK 18 +#define TFT_CS 17 // Chip select control pin +#define TFT_DC 20 // Data Command control pin +#define TFT_RST 21 // Reset pin (could connect to Arduino RESET pin) +//#define TFT_BL // LED back-light + +#define TOUCH_CS 22 // Chip select pin (T_CS) of touch screen + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 125000000 +#define SPI_READ_FREQUENCY 20000000 +#define SPI_TOUCH_FREQUENCY 2500000 \ No newline at end of file diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup61_RP2040_ILI9341_PIO_SPI.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h similarity index 99% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h index 6548062d..0e8a4a9c 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup62_RP2040_Nano_Connect_ILI9341.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. @@ -15,7 +15,7 @@ // // ################################################################################## -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT // Display type - only define if RPi display diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup66_Seeed_XIAO_Round.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup66_Seeed_XIAO_Round.h new file mode 100644 index 00000000..79df77b7 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup66_Seeed_XIAO_Round.h @@ -0,0 +1,29 @@ +#define USER_SETUP_ID 66 + +#define GC9A01_DRIVER // Full configuration option, define additional parameters below for this display + +#define TFT_RGB_ORDER TFT_RGB // Colour order Blue-Green-Red +#define TFT_HEIGHT 240 // GC9A01 240 x 240 + +#define TFT_SCLK D8 +#define TFT_MISO D9 +#define TFT_MOSI D10 +#define TFT_CS D1 // Chip select control pin +#define TFT_DC D3 // Data Command control pin +#define TFT_BL D6 +#define TFT_RST -1 // Reset pin (could connect to RST pin) + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts + +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 20000000 +// #define USE_HSPI_PORT diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup6_RPi_Wr_ILI9486.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup6_RPi_Wr_ILI9486.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup6_RPi_Wr_ILI9486.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup6_RPi_Wr_ILI9486.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup70_ESP32_S2_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70_ESP32_S2_ILI9341.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup70_ESP32_S2_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup70_ESP32_S2_ILI9341.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup70b_ESP32_S3_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70b_ESP32_S3_ILI9341.h similarity index 91% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup70b_ESP32_S3_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup70b_ESP32_S3_ILI9341.h index 42810718..4576ae90 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup70b_ESP32_S3_ILI9341.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70b_ESP32_S3_ILI9341.h @@ -26,7 +26,7 @@ #define SMOOTH_FONT -// FSPI port (SPI2) used unless following defined. HSPI port (SPI3) NOT TESTED YET +// FSPI (or VSPI) port (SPI2) used unless following defined. HSPI port is (SPI3) on S3. //#define USE_HSPI_PORT //#define SPI_FREQUENCY 27000000 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup70c_ESP32_C3_ILI9341.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70c_ESP32_C3_ILI9341.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup70c_ESP32_C3_ILI9341.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup70c_ESP32_C3_ILI9341.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup70d_ILI9488_S3_Parallel.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70d_ILI9488_S3_Parallel.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup70d_ILI9488_S3_Parallel.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup70d_ILI9488_S3_Parallel.h diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70f_ESP32_S2_ST7735.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70f_ESP32_S2_ST7735.h new file mode 100644 index 00000000..f0cc51df --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70f_ESP32_S2_ST7735.h @@ -0,0 +1,44 @@ +// Setup for the ESP32 S2 with ST7735 80x160 display +// See SetupX_Template.h for all options available + +#define USER_SETUP_ID 70 + +#define ST7735_DRIVER + +#define TFT_SDA_READ // Display has a bidirectional SDA pin (no MISO) + +#define TFT_WIDTH 80 +#define TFT_HEIGHT 160 + +#define ST7735_GREENTAB160x80 +//#define ST7735_REDTAB160x80 + +//#define TFT_RGB_ORDER TFT_RGB // Colour order Red-Green-Blue +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define TFT_INVERSION_ON +// #define TFT_INVERSION_OFF + + // Typical board default pins +#define TFT_CS 10 // 10 or 34 + +#define TFT_MOSI 11 // 11 or 35 +#define TFT_SCLK 12 // 12 or 36 + +#define TFT_DC 14 +#define TFT_RST 15 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port must be used for SDA reads. Do not use #define USE_HSPI_PORT + +#define SPI_FREQUENCY 27000000 +#define SPI_READ_FREQUENCY 16000000 diff --git a/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70h_ESP32_S3_GC9A01.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70h_ESP32_S3_GC9A01.h new file mode 100644 index 00000000..847a2ee7 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup70h_ESP32_S3_GC9A01.h @@ -0,0 +1,31 @@ +// Setup for the ESP32 S3 with GC9A01 display +#define USER_SETUP_ID 70 + +#define GC9A01_DRIVER + +#define TFT_WIDTH 240 +#define TFT_HEIGHT 240 + // Typical board default pins - change to match your board +#define TFT_CS 10 //34 // 10 or 34 (FSPI CS0) +#define TFT_MOSI 11 //35 // 11 or 35 (FSPI D) +#define TFT_SCLK 12 //36 // 12 or 36 (FSPI CLK) +#define TFT_MISO 13 //37 // 13 or 37 (FSPI Q) + +// Use pins in range 0-31 +#define TFT_DC 7 +#define TFT_RST 6 + +#define LOAD_GLCD +#define LOAD_FONT2 +#define LOAD_FONT4 +#define LOAD_FONT6 +#define LOAD_FONT7 +#define LOAD_FONT8 +#define LOAD_GFXFF + +#define SMOOTH_FONT + +// FSPI port (SPI2) used unless following defined +#define USE_HSPI_PORT + +#define SPI_FREQUENCY 80000000 // Maximum for ILI9341 diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup71_ESP32_S2_ST7789.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup71_ESP32_S2_ST7789.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup71_ESP32_S2_ST7789.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup71_ESP32_S2_ST7789.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup72_ESP32_ST7789_172x320.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup72_ESP32_ST7789_172x320.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup72_ESP32_ST7789_172x320.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup72_ESP32_ST7789_172x320.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup7_ST7735_128x128.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup7_ST7735_128x128.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup7_ST7735_128x128.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup7_ST7735_128x128.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup8_ILI9163_128x128.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup8_ILI9163_128x128.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup8_ILI9163_128x128.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup8_ILI9163_128x128.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/Setup9_ST7735_Overlap.h b/libraries/TFT_eSPI-2.5.43/User_Setups/Setup9_ST7735_Overlap.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/User_Setups/Setup9_ST7735_Overlap.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/Setup9_ST7735_Overlap.h diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/SetupX_Template.h b/libraries/TFT_eSPI-2.5.43/User_Setups/SetupX_Template.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/User_Setups/SetupX_Template.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/SetupX_Template.h index 4a42c840..00bf9a5d 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/SetupX_Template.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/SetupX_Template.h @@ -1,5 +1,5 @@ // USER DEFINED SETTINGS -// Set driver type, fonts to be loaded, pins used and SPI control method etc +// Set driver type, fonts to be loaded, pins used and SPI control method etc. // // See the User_Setup_Select.h file if you wish to be able to define multiple // setups and then easily select which setup file is used by the compiler. @@ -27,15 +27,15 @@ //#define NUCLEO_64_TFT //#define NUCLEO_144_TFT -// STM32 8 bit parallel only: -// If STN32 Port A or B pins 0-7 are used for 8 bit parallel data bus bits 0-7 +// STM32 8-bit parallel only: +// If STN32 Port A or B pins 0-7 are used for 8-bit parallel data bus bits 0-7 // then this will improve rendering performance by a factor of ~8x //#define STM_PORTA_DATA_BUS //#define STM_PORTB_DATA_BUS -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT -//#define TFT_PARALLEL_16_BIT // **** 16 bit parallel ONLY with RP2040 processor **** +//#define TFT_PARALLEL_16_BIT // **** 16-bit parallel ONLY with RP2040 processor **** // Display type - only define if RPi display //#define RPI_DISPLAY_TYPE // 20MHz maximum SPI @@ -236,7 +236,7 @@ // ###### EDIT THE PINs BELOW TO SUIT YOUR ESP32 PARALLEL TFT SETUP ###### -// The library supports 8 bit parallel TFTs with the ESP32, the pin +// The library supports 8-bit parallel TFTs with the ESP32, the pin // selection below is compatible with ESP32 boards in UNO format. // Wemos D32 boards need to be modified, see diagram in Tools folder. // Only ILI9481 and ILI9341 based displays have been tested! @@ -244,7 +244,7 @@ // Parallel bus is only supported for the STM32 and ESP32 // Example below is for ESP32 Parallel interface with UNO displays -// Tell the library to use 8 bit parallel mode (otherwise SPI is assumed) +// Tell the library to use 8-bit parallel mode (otherwise SPI is assumed) //#define TFT_PARALLEL_8_BIT // The ESP32 and TFT the pins used for testing are: diff --git a/libraries/TFT_eSPI-2.4.72/User_Setups/User_Custom_Fonts.h b/libraries/TFT_eSPI-2.5.43/User_Setups/User_Custom_Fonts.h similarity index 91% rename from libraries/TFT_eSPI-2.4.72/User_Setups/User_Custom_Fonts.h rename to libraries/TFT_eSPI-2.5.43/User_Setups/User_Custom_Fonts.h index f2dc3d35..004ac54e 100644 --- a/libraries/TFT_eSPI-2.4.72/User_Setups/User_Custom_Fonts.h +++ b/libraries/TFT_eSPI-2.5.43/User_Setups/User_Custom_Fonts.h @@ -6,7 +6,7 @@ */ // Note: At the time of writing there is a last character code definition bug in the -// Squix font file format so do NOT try and print the tilda (~) symbol (ASCII 0x7E) +// Squix font file format so do NOT try and print the tilde (~) symbol (ASCII 0x7E) // Alternatively look at the end of the font header file and edit: 0x7E to read 0x7D /* e.g. vvvv (uint8_t *)Orbitron_Light_32Bitmaps,(GFXglyph *)Orbitron_Light_32Glyphs,0x20, 0x7D, 32}; @@ -16,7 +16,7 @@ // When font files are placed in the Custom folder (TFT_eSPI\Fonts\Custom) then they must // also be #included here: -// The CF_OL24 etc are a shorthand reference, but this is not essential to use the fonts +// The CF_OL24 etc. are a shorthand reference, but this is not essential to use the fonts #ifdef LOAD_GFXFF diff --git a/libraries/TFT_eSPI-2.5.43/docs/ESP-IDF/Using ESP-IDF.txt b/libraries/TFT_eSPI-2.5.43/docs/ESP-IDF/Using ESP-IDF.txt new file mode 100644 index 00000000..a23a651c --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/docs/ESP-IDF/Using ESP-IDF.txt @@ -0,0 +1,70 @@ +The TFT_eSPI library has been updated by a user (dracir9) in pull request #1770 to enable +use with the ESP-IDF. + +https://github.com/Bodmer/TFT_eSPI/pull/1770 + +The library author (Bodmer) does not use the ESP-IDF so will not be able to provide support! + +There are two ways to configure the library either: + + manually enter the setup in menuconfig + OR + delete the KConfig file, select your LCD/board in the User_Setup_Select.h file, and run "idf.py reconfigure" + +The following menuconfig instructions were posted by dracir9 as part of the pull request #1770: + +https://github.com/Bodmer/TFT_eSPI/pull/1770#issuecomment-1096478997 + +In the above link the instructions include useful hyperlinks. The bare text of the +instructions is included below. + +Steps to use: + + 1. Install ESP-IDF toolchain. The easiest way is to use VS Code and the ESP-IDF extension + which handles most of the work automatically. Make sure to install version V4.4. From + now on I'll assume that VS Code is being used. + + 2. Once ESP-IDF is installed open VS Code and press F1. Type ESP-IDF: New Project. Hit enter. + + 3. Enter your project name, directory and board (if not sure choose ESP32 chip (via ESP-PROG)). + If your board is connected choose serial port. Leave ESP-IDF component directory blank and + press Choose Template. + + 4. In the drop-down choose Extension and select Arduino-as-component. (This is not mandatory. + You can try other templates if you want). This will create a blank project with a simple + main source file in the "main" folder. + + 5. Now we have to add Arduino to your project. You can find the complete documentation here: + https://github.com/espressif/arduino-esp32 + + and here: + https://docs.espressif.com/projects/arduino-esp32/en/latest/esp-idf_component.html + + I'll list two methods that I use most of the time: + + 5.1. Press F1 and type ESP-IDF: Add Arduino ESP32 as ESP-IDF Component. This will + automatically download and install the latest code from the arduino esp-32 repository. + This is the easiest method but as it uses the latest code it may introduce compilation errors. + + 5.2. Go to the Arduino esp-32 repository release page. Choose a version and find its "Assets" + section. Download the source code file into "project directory/components". Extract the + compressed file. This will create a folder called arduino-esp32-2.x.x. Rename it to arduino. + This method is slightly more complex but ensures you choose a stable version. + + 6. Download the TFT_eSPI library into the components folder + + 7. Now open VS Code and load your project folder. Press F1 and type ESP-IDF: SDK Configuration + editor (menuconfig). Alternatively press Ctrl+E, G or press the gear button in the bottom left + corner. + + 8. This will open the project configuration menu. Navigate to the TFT_eSPI section and configure + the library (TFT driver, pins, fonts, etc.). + + 9. Press F1 and type ESP-IDF: Build your project. Alternatively press Ctrl+E, B or click the + build button in the bottom left corner. + + 10. Choose your port by typing ESP-IDF: Select port to use or with the button in the bottom left. + + 11. Upload your code with the lightning button in the bottom toolbar. + + 12. Enjoy! diff --git a/libraries/TFT_eSPI-2.4.72/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg b/libraries/TFT_eSPI-2.5.43/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg rename to libraries/TFT_eSPI-2.5.43/docs/ESP32 UNO board mod/ESP32 UNO board mod.jpg diff --git a/libraries/TFT_eSPI-2.4.72/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg b/libraries/TFT_eSPI-2.5.43/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg rename to libraries/TFT_eSPI-2.5.43/docs/ESP32 UNO board mod/ESP32 UNO board pinout.jpg diff --git a/libraries/TFT_eSPI-2.4.72/docs/PlatformIO/Configuring options.txt b/libraries/TFT_eSPI-2.5.43/docs/PlatformIO/Configuring options.txt similarity index 96% rename from libraries/TFT_eSPI-2.4.72/docs/PlatformIO/Configuring options.txt rename to libraries/TFT_eSPI-2.5.43/docs/PlatformIO/Configuring options.txt index c80259fd..26caeacd 100644 --- a/libraries/TFT_eSPI-2.4.72/docs/PlatformIO/Configuring options.txt +++ b/libraries/TFT_eSPI-2.5.43/docs/PlatformIO/Configuring options.txt @@ -29,7 +29,7 @@ build_flags = -DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG -DUSER_SETUP_LOADED=1 - ; Define the TFT driver, pins etc here: + ; Define the TFT driver, pins etc. here: -DST7789_DRIVER=1 -DTFT_WIDTH=128 -DTFT_HEIGHT=160 diff --git a/libraries/TFT_eSPI-2.5.43/docs/PlatformIO/rp2040.txt b/libraries/TFT_eSPI-2.5.43/docs/PlatformIO/rp2040.txt new file mode 100644 index 00000000..f4208bd5 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/docs/PlatformIO/rp2040.txt @@ -0,0 +1,63 @@ +;PlatformIO User notes: + +;It is possible to load settings from the calling program rather than modifying +;the library for each project by modifying the "platformio.ini" file. + +;The User_Setup_Select.h file will not load the user setting header files if +;USER_SETUP_LOADED is defined. + +;Instead of using #define, use the -D prefix, for example: + +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter, extra scripting +; Upload options: custom port, speed and extra flags +; Library options: dependencies, extra library storages +; +; Please visit documentation for the other options and examples +; http://docs.platformio.org/page/projectconf.html + +[env:pico] +platform = https://github.com/maxgerhardt/platform-raspberrypi.git +board = pico +framework = arduino +board_build.core = earlephilhower +board_build.filesystem_size = 0.5m +lib_deps = bodmer/TFT_eSPI@^2.5.21 +; change microcontroller +board_build.mcu = rp2040 + +; change MCU frequency +board_build.f_cpu = 133000000L + +build_flags = + -Os + -DUSER_SETUP_LOADED=1 + ; Define the TFT driver, pins etc. here: + -DTFT_PARALLEL_8_BIT=1 + -DRM68120_DRIVER=1 + -DRP2040_PIO_CLK_DIV=1 + -DTFT_DC=28 + -DTFT_WR=22 + -DTFT_RST=2 + + -DTFT_D0=6 + -DTFT_D1=7 + -DTFT_D2=8 + -DTFT_D3=9 + -DTFT_D4=10 + -DTFT_D5=11 + -DTFT_D6=12 + -DTFT_D7=13 + + -DTFT_BL=16 + -DTFT_BACKLIGHT_ON=HIGH + + -DLOAD_GLCD=1 + -DLOAD_FONT2=1 + -DLOAD_FONT4=1 + -DLOAD_FONT6=1 + -DLOAD_FONT7=1 + -DLOAD_FONT8=1 + -DLOAD_GFXFF=1 + -DSMOOTH_FONT=1 diff --git a/libraries/TFT_eSPI-2.4.72/docs/RPi_TFT_connections/RPi_TFT_Connections.png b/libraries/TFT_eSPI-2.5.43/docs/RPi_TFT_connections/RPi_TFT_Connections.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/docs/RPi_TFT_connections/RPi_TFT_Connections.png rename to libraries/TFT_eSPI-2.5.43/docs/RPi_TFT_connections/RPi_TFT_Connections.png diff --git a/libraries/TFT_eSPI-2.4.72/docs/RPi_TFT_connections/RPi_TFT_mod.png b/libraries/TFT_eSPI-2.5.43/docs/RPi_TFT_connections/RPi_TFT_mod.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/docs/RPi_TFT_connections/RPi_TFT_mod.png rename to libraries/TFT_eSPI-2.5.43/docs/RPi_TFT_connections/RPi_TFT_mod.png diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/Arduino_Life/Arduino_Life.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/Arduino_Life/Arduino_Life.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/Arduino_Life/Arduino_Life.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/Arduino_Life/Arduino_Life.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/Pong_v3/Pong_v3.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/Pong_v3/Pong_v3.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/Pong_v3/Pong_v3.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/Pong_v3/Pong_v3.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/RLE_Font_test/RLE_Font_test.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/RLE_Font_test/RLE_Font_test.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/RLE_Font_test/RLE_Font_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/RLE_Font_test/RLE_Font_test.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Char_times/TFT_Char_times.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Char_times/TFT_Char_times.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Char_times/TFT_Char_times.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Char_times/TFT_Char_times.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Clock/TFT_Clock.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Clock/TFT_Clock.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Clock/TFT_Clock.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Clock/TFT_Clock.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Clock_Digital/TFT_Clock_Digital.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Clock_Digital/TFT_Clock_Digital.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Clock_Digital/TFT_Clock_Digital.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Clock_Digital/TFT_Clock_Digital.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino similarity index 91% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino index 1e8b86c3..f28bab94 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Ellipse/TFT_Ellipse.ino @@ -20,7 +20,7 @@ void loop() { tft.fillScreen(TFT_BLACK); - // Draw some random filled elipses + // Draw some random filled ellipses for (int i = 0; i < 20; i++) { int rx = random(40); @@ -33,7 +33,7 @@ void loop() { delay(2000); tft.fillScreen(TFT_BLACK); - // Draw some random outline elipses + // Draw some random outline ellipses for (int i = 0; i < 20; i++) { int rx = random(40); diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino index 1f9c8eb3..0d4541ae 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Meter_5/TFT_Meter_5.ino @@ -73,7 +73,7 @@ void analogMeter() // Long scale tick length int tl = 15; - // Coodinates of tick to draw + // Coordinates of tick to draw float sx = cos((i - 90) * 0.0174532925); float sy = sin((i - 90) * 0.0174532925); uint16_t x0 = sx * (M_SIZE*100 + tl) + M_SIZE*120; diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino index 8563c0d3..f6974587 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Print_Test/TFT_Print_Test.ino @@ -1,5 +1,5 @@ /* - Test the tft.print() viz embedded tft.write() function + Test the tft.print() viz. embedded tft.write() function This sketch used font 2, 4, 7 diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino index ce2bb161..3ac49770 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_Rainbow/TFT_Rainbow.ino @@ -96,7 +96,7 @@ void loop() { // The new larger fonts do not use the .setCursor call, coords are embedded tft.setTextColor(TFT_BLACK, TFT_BLACK); // Do not plot the background colour - // Overlay the black text on top of the rainbow plot (the advantage of not drawing the backgorund colour!) + // Overlay the black text on top of the rainbow plot (the advantage of not drawing the background colour!) tft.drawCentreString("Font size 2", 80, 14, 2); // Draw text centre at position 80, 12 using font 2 //tft.drawCentreString("Font size 2",81,12,2); // Draw text centre at position 80, 12 using font 2 diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino index 7179945d..d4482d61 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/TFT_flash_jpg.ino @@ -1,7 +1,7 @@ // Sketch to display images on a 160 x 128 TFT // Renders images stored in an array in program (FLASH) -// The JPEG images are stored in header files (see jpeg1.h etc) +// The JPEG images are stored in header files (see jpeg1.h etc.) // As well as the TFT_eSPI library: // https://github.com/Bodmer/TFT_eSPI @@ -95,7 +95,7 @@ void drawArrayJpeg(const uint8_t arrayname[], uint32_t array_size, int xpos, int // fit totally on the screen are cropped to the nearest MCU size and may leave right/bottom borders. void renderJPEG(int xpos, int ypos) { - // retrieve infomration about the image + // retrieve information about the image uint16_t *pImg; uint16_t mcu_w = JpegDec.MCUWidth; uint16_t mcu_h = JpegDec.MCUHeight; @@ -193,7 +193,7 @@ void jpegInfo() { // Show the execution time (optional) //#################################################################################################### // WARNING: for UNO/AVR legacy reasons printing text to the screen with the Mega might not work for -// sketch sizes greater than ~70KBytes because 16 bit address pointers are used in some libraries. +// sketch sizes greater than ~70KBytes because 16-bit address pointers are used in some libraries. // The Due will work fine with the HX8357_Due library. diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg1.h b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg1.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg1.h rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg1.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg2.h b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg2.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg2.h rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg2.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg3.h b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg3.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg3.h rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg3.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg4.h b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg4.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_flash_jpg/jpeg4.h rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_flash_jpg/jpeg4.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_graphicstest_PDQ3/TFT_graphicstest_PDQ3.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_graphicstest_PDQ3/TFT_graphicstest_PDQ3.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_graphicstest_PDQ3/TFT_graphicstest_PDQ3.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_graphicstest_PDQ3/TFT_graphicstest_PDQ3.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_graphicstest_small/TFT_graphicstest_small.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_graphicstest_small/TFT_graphicstest_small.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/TFT_graphicstest_small/TFT_graphicstest_small.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/TFT_graphicstest_small/TFT_graphicstest_small.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/160 x 128/UTFT_demo_fast/UTFT_demo_fast.ino b/libraries/TFT_eSPI-2.5.43/examples/160 x 128/UTFT_demo_fast/UTFT_demo_fast.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/160 x 128/UTFT_demo_fast/UTFT_demo_fast.ino rename to libraries/TFT_eSPI-2.5.43/examples/160 x 128/UTFT_demo_fast/UTFT_demo_fast.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino index dbbd6d45..7bb38589 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/All_Free_Fonts_Demo/All_Free_Fonts_Demo.ino @@ -376,7 +376,7 @@ void loop() { } // There follows a crude way of flagging that this example sketch needs fonts which -// have not been enbabled in the User_Setup.h file inside the TFT_HX8357 library. +// have not been enabled in the User_Setup.h file inside the TFT_HX8357 library. // // These lines produce errors during compile time if settings in User_Setup are not correct // diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/All_Free_Fonts_Demo/Free_Fonts.h b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/All_Free_Fonts_Demo/Free_Fonts.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/All_Free_Fonts_Demo/Free_Fonts.h rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/All_Free_Fonts_Demo/Free_Fonts.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Cellular_Automata/Cellular_Automata.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Cellular_Automata/Cellular_Automata.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/Cellular_Automata/Cellular_Automata.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/Cellular_Automata/Cellular_Automata.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino index 2a4c63af..c0c3c083 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Free_Font_Demo/Free_Font_Demo.ino @@ -280,7 +280,7 @@ void drawDatumMarker(int x, int y) // There follows a crude way of flagging that this example sketch needs fonts which -// have not been enbabled in the User_Setup.h file inside the TFT_HX8357 library. +// have not been enabled in the User_Setup.h file inside the TFT_HX8357 library. // // These lines produce errors during compile time if settings in User_Setup are not correct // diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Free_Font_Demo/Free_Fonts.h b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Free_Font_Demo/Free_Fonts.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/Free_Font_Demo/Free_Fonts.h rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/Free_Font_Demo/Free_Fonts.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino index e38e6f4a..0866844c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Keypad_240x320/Keypad_240x320.ino @@ -3,8 +3,8 @@ button handling class, this sketch is based on the Arduin-o-phone example. - This example diplays a keypad where numbers can be entered and - send to the Serial Monitor window. + This example displays a keypad where numbers can be entered and + sent to the Serial Monitor window. The sketch has been tested on the ESP8266 (which supports SPIFFS) @@ -164,7 +164,7 @@ void loop(void) { // Update the number display field tft.setTextDatum(TL_DATUM); // Use top left corner as text coord datum - tft.setFreeFont(&FreeSans18pt7b); // Choose a nicefont that fits box + tft.setFreeFont(&FreeSans18pt7b); // Choose a nice font that fits box tft.setTextColor(DISP_TCOLOR); // Set the font colour // Draw the string, the value returned is the width in pixels @@ -209,7 +209,7 @@ void touch_calibrate() // check file system exists if (!SPIFFS.begin()) { - Serial.println("Formating file system"); + Serial.println("formatting file system"); SPIFFS.format(); SPIFFS.begin(); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/RLE_Font_test/RLE_Font_test.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/RLE_Font_test/RLE_Font_test.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/RLE_Font_test/RLE_Font_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/RLE_Font_test/RLE_Font_test.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino index 599d3546..51f4ea2f 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/Read_ID_bitbash/Read_ID_bitbash.ino @@ -11,7 +11,7 @@ // Change the pin settings to suit your hardware -// UNO etc +// UNO etc. //#define TFT_MOSI 11 //#define TFT_SCK 13 //#define TFT_CS 9 @@ -116,7 +116,7 @@ void setup() { uint32_t ID = 0; Serial.begin(115200); - delay(4000); // Delay to allow USB to connect to a Leonardo etc + delay(4000); // Delay to allow USB to connect to a Leonardo etc. Serial.println("TFT driver register values:"); Serial.println("==========================="); diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino similarity index 94% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino index 4ad06caf..cfeeab02 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_ArcFill/TFT_ArcFill.ino @@ -11,7 +11,7 @@ TFT_eSPI tft = TFT_eSPI(); // Invoke custom library byte inc = 0; unsigned int col = 0; -byte red = 31; // Red is the top 5 bits of a 16 bit colour value +byte red = 31; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits byte state = 0; @@ -56,7 +56,7 @@ void loop() { // rx = x axis outer radius // ry = y axis outer radius // w = width (thickness) of arc in pixels -// colour = 16 bit colour value +// colour = 16-bit colour value // Note if rx and ry are the same then an arc of a circle is drawn void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w, unsigned int colour) @@ -87,7 +87,7 @@ void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour); tft.fillTriangle(x1, y1, x2, y2, x3, y3, colour); - // Copy segment end to sgement start for next segment + // Copy segment end to segment start for next segment x0 = x2; y0 = y2; x1 = x3; @@ -96,7 +96,7 @@ void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w } // ######################################################################### -// Return the 16 bit colour with brightness 0-100% +// Return the 16-bit colour with brightness 0-100% // ######################################################################### unsigned int brightness(unsigned int colour, int brightness) { @@ -112,7 +112,7 @@ unsigned int brightness(unsigned int colour, int brightness) } // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Char_times/TFT_Char_times.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Char_times/TFT_Char_times.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Char_times/TFT_Char_times.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Char_times/TFT_Char_times.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Clock/TFT_Clock.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Clock/TFT_Clock.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Clock/TFT_Clock.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Clock/TFT_Clock.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Clock_Digital/TFT_Clock_Digital.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Clock_Digital/TFT_Clock_Digital.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Clock_Digital/TFT_Clock_Digital.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Clock_Digital/TFT_Clock_Digital.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino index 6485e755..b6051234 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Custom_Fonts/TFT_Custom_Fonts.ino @@ -19,7 +19,7 @@ ######################################################################### */ -// Note the the tilda symbol ~ does not exist in some fonts at the moment +// Note the the tilde symbol ~ does not exist in some fonts at the moment #define TEXT "abc MWy 123 |" // Text that will be printed on screen in any font #include "SPI.h" diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Ellipse/TFT_Ellipse.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Ellipse/TFT_Ellipse.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Ellipse/TFT_Ellipse.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Ellipse/TFT_Ellipse.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino index 83b8f609..9ea0d7cb 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_FillArcSpiral/TFT_FillArcSpiral.ino @@ -13,7 +13,7 @@ int segment = 0; unsigned int col = 0; int delta = -1; - byte red = 31; // Red is the top 5 bits of a 16 bit colour value + byte red = 31; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits byte state = 0; @@ -48,7 +48,7 @@ void loop() { // rx = x axis radius // yx = y axis radius // w = width (thickness) of arc in pixels -// colour = 16 bit colour value +// colour = 16-bit colour value // Note if rx and ry are the same an arc of a circle is drawn void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w, unsigned int colour) @@ -82,7 +82,7 @@ void fillArc(int x, int y, int start_angle, int seg_count, int rx, int ry, int w } // ######################################################################### -// Return a 16 bit colour with brightness 0 - 100% +// Return a 16-bit colour with brightness 0 - 100% // ######################################################################### unsigned int brightness(unsigned int colour, int brightness) { @@ -98,7 +98,7 @@ unsigned int brightness(unsigned int colour, int brightness) } // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Float_Test/TFT_Float_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Float_Test/TFT_Float_Test.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Float_Test/TFT_Float_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Float_Test/TFT_Float_Test.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino index 2a04556b..c4911922 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Mandlebrot/TFT_Mandlebrot.ino @@ -62,7 +62,7 @@ unsigned int rainbow(int value) // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = blue through to red = blue - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Matrix/TFT_Matrix.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Matrix/TFT_Matrix.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Matrix/TFT_Matrix.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Matrix/TFT_Matrix.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino index 9d624855..aa9521da 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meter_linear/TFT_Meter_linear.ino @@ -47,7 +47,7 @@ void setup(void) { void loop() { if (updateTime <= millis()) { - updateTime = millis() + 35; // Update emter every 35 milliseconds + updateTime = millis() + 35; // Update meter every 35 milliseconds // Create a Sine wave for testing d += 4; if (d >= 360) d = 0; @@ -75,7 +75,7 @@ void analogMeter() // Long scale tick length int tl = 15; - // Coodinates of tick to draw + // Coordinates of tick to draw float sx = cos((i - 90) * 0.0174532925); float sy = sin((i - 90) * 0.0174532925); uint16_t x0 = sx * (M_SIZE*100 + tl) + M_SIZE*120; @@ -175,7 +175,7 @@ void plotNeedle(int value, byte ms_delay) if (ms_delay == 0) old_analog = value; // Update immediately if delay is 0 float sdeg = map(old_analog, -10, 110, -150, -30); // Map value to angle - // Calcualte tip of needle coords + // Calculate tip of needle coords float sx = cos(sdeg * 0.0174532925); float sy = sin(sdeg * 0.0174532925); diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meters/TFT_Meters.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meters/TFT_Meters.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meters/TFT_Meters.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meters/TFT_Meters.ino index 419b1f5c..094f476e 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Meters/TFT_Meters.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Meters/TFT_Meters.ino @@ -95,7 +95,7 @@ void analogMeter() // Long scale tick length int tl = 15; - // Coodinates of tick to draw + // Coordinates of tick to draw float sx = cos((i - 90) * 0.0174532925); float sy = sin((i - 90) * 0.0174532925); uint16_t x0 = sx * (100 + tl) + 120; @@ -195,7 +195,7 @@ void plotNeedle(int value, byte ms_delay) if (ms_delay == 0) old_analog = value; // Update immediately id delay is 0 float sdeg = map(old_analog, -10, 110, -150, -30); // Map value to angle - // Calcualte tip of needle coords + // Calculate tip of needle coords float sx = cos(sdeg * 0.0174532925); float sy = sin(sdeg * 0.0174532925); diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino similarity index 93% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino index b2390494..cd4fdb2c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Pie_Chart/TFT_Pie_Chart.ino @@ -44,7 +44,7 @@ void loop() { // start_angle = 0 - 359 // sub_angle = 0 - 360 = subtended angle // r = radius -// colour = 16 bit colour value +// colour = 16-bit colour value int fillSegment(int x, int y, int start_angle, int sub_angle, int r, unsigned int colour) { @@ -63,7 +63,7 @@ int fillSegment(int x, int y, int start_angle, int sub_angle, int r, unsigned in tft.fillTriangle(x1, y1, x2, y2, x, y, colour); - // Copy segment end to sgement start for next segment + // Copy segment end to segment start for next segment x1 = x2; y1 = y2; } @@ -71,7 +71,7 @@ int fillSegment(int x, int y, int start_angle, int sub_angle, int r, unsigned in // ######################################################################### -// Return the 16 bit colour with brightness 0-100% +// Return the 16-bit colour with brightness 0-100% // ######################################################################### unsigned int brightness(unsigned int colour, int brightness) { diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Pong/TFT_Pong.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Pong/TFT_Pong.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Pong/TFT_Pong.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Pong/TFT_Pong.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino index 9caecbb1..03af064d 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Print_Test/TFT_Print_Test.ino @@ -1,5 +1,5 @@ /* - Test the tft.print() viz embedded tft.write() function + Test the tft.print() viz. embedded tft.write() function This sketch used font 2, 4, 7 diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino index 88180fd3..55cc3656 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Rainbow_one_lib/TFT_Rainbow_one_lib.ino @@ -53,7 +53,7 @@ void loop() { // The new larger fonts do not need to use the .setCursor call, coords are embedded tft.setTextColor(TFT_BLACK); // Do not plot the background colour - // Overlay the black text on top of the rainbow plot (the advantage of not drawing the backgorund colour!) + // Overlay the black text on top of the rainbow plot (the advantage of not drawing the background colour!) tft.drawCentreString("Font size 2", 120, 14, 2); // Draw text centre at position 120, 14 using font 2 tft.drawCentreString("Font size 4", 120, 30, 4); // Draw text centre at position 120, 30 using font 4 tft.drawCentreString("12.34", 120, 54, 6); // Draw text centre at position 120, 54 using font 6 @@ -98,7 +98,7 @@ void loop() { // Fill screen with a rainbow pattern void rainbow_fill() { - // The colours and state are not initialised so the start colour changes each time the funtion is called + // The colours and state are not initialised so the start colour changes each time the function is called for (int i = 319; i > 0; i--) { // Draw a vertical line 1 pixel wide in the selected colour diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino similarity index 96% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino index d622e44e..4a433d6c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Read_Reg/TFT_Read_Reg.ino @@ -56,7 +56,7 @@ void loop() { printSubset(); // Print a useful subset of the readable registers - readTest(); // Test 8, 16 and 32 bit reads and index on the ID register + readTest(); // Test 8, 16 and 32-bit reads and index on the ID register //printRange32(0x00, 0xFF); // Print a range of registers (32 bits, index = 0) @@ -70,8 +70,8 @@ void loop() { void readTest(void) { - Serial.println(); Serial.println("Test 8, 16 and 32 bit reads and the index..."); - // Test 8, 16 and 32 bit reads and index + Serial.println(); Serial.println("Test 8, 16 and 32-bit reads and the index..."); + // Test 8, 16 and 32-bit reads and index // Note at index 0 the register values are typically undefined (Bxxxxxxxx) Serial.println(tft.readcommand8(ILI9341_RDID4, 2), HEX); Serial.println(tft.readcommand16(ILI9341_RDID4, 2), HEX); diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino index 3e7f8d7d..fddf0af5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Spiro/TFT_Spiro.ino @@ -1,5 +1,5 @@ // Spiro -// Rainbow patern generator +// Rainbow pattern generator #include // Hardware-specific library #include @@ -67,7 +67,7 @@ unsigned int rainbow(int value) // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = blue through to red = blue //int value = random (128); - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino similarity index 93% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino index 1e721979..f8891f2c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Starfield/TFT_Starfield.ino @@ -59,7 +59,7 @@ void loop() int old_screen_x = ((int)sx[i] - 160) * 256 / sz[i] + 160; int old_screen_y = ((int)sy[i] - 120) * 256 / sz[i] + 120; - // This is a faster pixel drawing function for occassions where many single pixels must be drawn + // This is a faster pixel drawing function for occasions where many single pixels must be drawn tft.drawPixel(old_screen_x, old_screen_y,TFT_BLACK); sz[i] -= 2; @@ -82,7 +82,7 @@ void loop() unsigned long t1 = micros(); //static char timeMicros[8] = {}; - // Calcualte frames per second + // Calculate frames per second Serial.println(1.0/((t1 - t0)/1000000.0)); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_String_Align/TFT_String_Align.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_String_Align/TFT_String_Align.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_String_Align/TFT_String_Align.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_String_Align/TFT_String_Align.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino index 27fb4f16..bd6b69ea 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_Terminal/TFT_Terminal.ino @@ -7,7 +7,7 @@ Connect GND to target board GND Connect RX line to TX line of target board Make sure the target and terminal have the same baud rate - and serial stettings! + and serial settings! The sketch works with the ILI9341 TFT 240x320 display and the called up libraries. diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_graphicstest_PDQ/TFT_graphicstest_PDQ.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_graphicstest_PDQ/TFT_graphicstest_PDQ.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_graphicstest_PDQ/TFT_graphicstest_PDQ.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_graphicstest_PDQ/TFT_graphicstest_PDQ.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/320 x 240/UTFT_demo/UTFT_demo.ino b/libraries/TFT_eSPI-2.5.43/examples/320 x 240/UTFT_demo/UTFT_demo.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/320 x 240/UTFT_demo/UTFT_demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/320 x 240/UTFT_demo/UTFT_demo.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Cellular_Automata/Cellular_Automata.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Cellular_Automata/Cellular_Automata.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Cellular_Automata/Cellular_Automata.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Cellular_Automata/Cellular_Automata.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Demo_3D_cube/Demo_3D_cube.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Demo_3D_cube/Demo_3D_cube.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Demo_3D_cube/Demo_3D_cube.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Demo_3D_cube/Demo_3D_cube.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino index 50c09c13..569d4844 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Free_Font_Demo/Free_Font_Demo.ino @@ -249,7 +249,7 @@ void drawDatum(int x, int y) // There follows a crude way of flagging that this example sketch needs fonts which -// have not been enbabled in the User_Setup.h file inside the TFT_HX8357 library. +// have not been enabled in the User_Setup.h file inside the TFT_HX8357 library. // // These lines produce errors during compile time if settings in User_Setup are not correct // diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Free_Font_Demo/Free_Fonts.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Free_Font_Demo/Free_Fonts.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Free_Font_Demo/Free_Fonts.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Free_Font_Demo/Free_Fonts.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Graph_2/Graph_2.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Graph_2/Graph_2.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Graph_2/Graph_2.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Graph_2/Graph_2.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino index 9614d6a7..b2844aaa 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Keypad_480x320/Keypad_480x320.ino @@ -3,8 +3,8 @@ button handling class, this sketch is based on the Arduin-o-phone example. - This example diplays a keypad where numbers can be entered and - send to the Serial Monitor window. + This example displays a keypad where numbers can be entered and + sent to the Serial Monitor window. The sketch has been tested on the ESP8266 (which supports SPIFFS) @@ -167,7 +167,7 @@ void loop(void) { // Update the number display field tft.setTextDatum(TL_DATUM); // Use top left corner as text coord datum - tft.setFreeFont(&FreeSans18pt7b); // Choose a nicefont that fits box + tft.setFreeFont(&FreeSans18pt7b); // Choose a nice font that fits box tft.setTextColor(DISP_TCOLOR); // Set the font colour // Draw the string, the value returned is the width in pixels @@ -212,7 +212,7 @@ void touch_calibrate() // check file system exists if (!SPIFFS.begin()) { - Serial.println("Formating file system"); + Serial.println("formatting file system"); SPIFFS.format(); SPIFFS.begin(); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Char_times/TFT_Char_times.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Char_times/TFT_Char_times.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Char_times/TFT_Char_times.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Char_times/TFT_Char_times.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Ellipse/TFT_Ellipse.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Ellipse/TFT_Ellipse.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Ellipse/TFT_Ellipse.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Ellipse/TFT_Ellipse.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino index 11d00d21..77a82cb5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meter_4/TFT_Meter_4.ino @@ -49,7 +49,7 @@ void setup(void) { void loop() { if (updateTime <= millis()) { - updateTime = millis() + 35; // Update emter every 35 milliseconds + updateTime = millis() + 35; // Update meter every 35 milliseconds // Create a Sine wave for testing d += 4; if (d >= 360) d = 0; @@ -77,7 +77,7 @@ void analogMeter() // Long scale tick length int tl = 15; - // Coodinates of tick to draw + // Coordinates of tick to draw float sx = cos((i - 90) * 0.0174532925); float sy = sin((i - 90) * 0.0174532925); uint16_t x0 = sx * (M_SIZE*100 + tl) + M_SIZE*120; @@ -177,7 +177,7 @@ void plotNeedle(int value, byte ms_delay) if (ms_delay == 0) old_analog = value; // Update immediately if delay is 0 float sdeg = map(old_analog, -10, 110, -150, -30); // Map value to angle - // Calcualte tip of needle coords + // Calculate tip of needle coords float sx = cos(sdeg * 0.0174532925); float sy = sin(sdeg * 0.0174532925); diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meters/TFT_Meters.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meters/TFT_Meters.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meters/TFT_Meters.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meters/TFT_Meters.ino index 339fc329..007e9548 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Meters/TFT_Meters.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Meters/TFT_Meters.ino @@ -97,7 +97,7 @@ void analogMeter() // Long scale tick length int tl = 15; - // Coodinates of tick to draw + // Coordinates of tick to draw float sx = cos((i - 90) * 0.0174532925); float sy = sin((i - 90) * 0.0174532925); uint16_t x0 = sx * (100 + tl) + 120; @@ -197,7 +197,7 @@ void plotNeedle(int value, byte ms_delay) if (ms_delay == 0) old_analog = value; // Update immediately id delay is 0 float sdeg = map(old_analog, -10, 110, -150, -30); // Map value to angle - // Calcualte tip of needle coords + // Calculate tip of needle coords float sx = cos(sdeg * 0.0174532925); float sy = sin(sdeg * 0.0174532925); diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Padding_demo/TFT_Padding_demo.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Padding_demo/TFT_Padding_demo.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Padding_demo/TFT_Padding_demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Padding_demo/TFT_Padding_demo.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino index 14f75b32..f1ee3f99 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Print_Test/TFT_Print_Test.ino @@ -1,5 +1,5 @@ /* - Test the tft.print() viz the libraries embedded write() function + Test the tft.print() viz. the libraries embedded write() function This sketch used font 2, 4, 7 diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino index a2e1aa1c..e1d5f4c3 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_Rainbow480/TFT_Rainbow480.ino @@ -50,7 +50,7 @@ void loop() { // The new larger fonts do not need to use the .setCursor call, coords are embedded tft.setTextColor(TFT_BLACK); // Do not plot the background colour - // Overlay the black text on top of the rainbow plot (the advantage of not drawing the backgorund colour!) + // Overlay the black text on top of the rainbow plot (the advantage of not drawing the background colour!) tft.drawCentreString("Font size 2", 160, 14, 2); // Draw text centre at position 120, 14 using font 2 tft.drawCentreString("Font size 4", 160, 30, 4); // Draw text centre at position 120, 30 using font 4 tft.drawCentreString("12.34", 160, 54, 6); // Draw text centre at position 120, 54 using font 6 @@ -100,7 +100,7 @@ void loop() { // Fill screen with a rainbow pattern void rainbow_fill() { - // The colours and state are not initialised so the start colour changes each time the funtion is called + // The colours and state are not initialised so the start colour changes each time the function is called for (int i = 479; i > 0; i--) { // Draw a vertical line 1 pixel wide in the selected colour diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_String_Align/TFT_String_Align.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_String_Align/TFT_String_Align.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_String_Align/TFT_String_Align.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_String_Align/TFT_String_Align.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino index f8ebcb14..c00611b4 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/TFT_flash_jpg.ino @@ -1,8 +1,8 @@ // Sketch to display images on a 480 x 320 ILI9486 Raspberry Pi 3.5" TFT (Waveshare design) -// which has a 16 bit serial interface based on 74HC04, 74HC4040 and 2 x 74HC4094 logic chips +// which has a 16-bit serial interface based on 74HC04, 74HC4040 and 2 x 74HC4094 logic chips // Renders images stored in an array in program (FLASH)JPEG images are stored in header files -// (see jpeg1.h etc) +// (see jpeg1.h etc.) // The sketch does not need the SD or sdFat libraries since it does not access an SD Card. @@ -108,7 +108,7 @@ void drawArrayJpeg(const uint8_t arrayname[], uint32_t array_size, int xpos, int // fit totally on the screen are cropped to the nearest MCU size and may leave right/bottom borders. void renderJPEG(int xpos, int ypos) { - // retrieve infomration about the image + // retrieve information about the image uint16_t *pImg; uint16_t mcu_w = JpegDec.MCUWidth; uint16_t mcu_h = JpegDec.MCUHeight; @@ -222,7 +222,7 @@ void jpegInfo() { // Show the execution time (optional) //#################################################################################################### // WARNING: for UNO/AVR legacy reasons printing text to the screen with the Mega might not work for -// sketch sizes greater than ~70KBytes because 16 bit address pointers are used in some libraries. +// sketch sizes greater than ~70KBytes because 16-bit address pointers are used in some libraries. // The Due will work fine with the HX8357_Due library. diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg1.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg1.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg1.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg1.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg2.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg2.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg2.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg2.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg3.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg3.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg3.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg3.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg4.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg4.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_flash_jpg/jpeg4.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_flash_jpg/jpeg4.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_graphicstest_one_lib/TFT_graphicstest_one_lib.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_ring_meter/Alert.h b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_ring_meter/Alert.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_ring_meter/Alert.h rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_ring_meter/Alert.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino similarity index 96% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino index 923cb39e..bdd9bb37 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/TFT_ring_meter/TFT_ring_meter.ino @@ -13,9 +13,9 @@ #define GREEN2RED 4 #define RED2GREEN 5 -#define TFT_GREY 0x2104 // Dark grey 16 bit colour +#define TFT_GREY 0x2104 // Dark grey 16-bit colour -#include "alert.h" // Out of range alert icon +#include "Alert.h" // Out of range alert icon #include // Hardware-specific library #include @@ -127,8 +127,8 @@ int ringMeter(int value, int vmin, int vmax, int x, int y, int r, const char *un case 1: colour = TFT_GREEN; break; // Fixed colour case 2: colour = TFT_BLUE; break; // Fixed colour case 3: colour = rainbow(map(i, -angle, angle, 0, 127)); break; // Full spectrum blue to red - case 4: colour = rainbow(map(i, -angle, angle, 70, 127)); break; // Green to red (high temperature etc) - case 5: colour = rainbow(map(i, -angle, angle, 127, 63)); break; // Red to green (low battery etc) + case 4: colour = rainbow(map(i, -angle, angle, 70, 127)); break; // Green to red (high temperature etc.) + case 5: colour = rainbow(map(i, -angle, angle, 127, 63)); break; // Red to green (low battery etc.) default: colour = TFT_BLUE; break; // Fixed colour } tft.fillTriangle(x0, y0, x1, y1, x2, y2, colour); @@ -193,14 +193,14 @@ void drawAlert(int x, int y , int side, bool draw) } // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = blue through to 127 = red - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino similarity index 96% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino index f0b14d8a..e339a329 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/Touch_Controller_Demo/Touch_Controller_Demo.ino @@ -23,7 +23,7 @@ void setup(void) { // check file system if (!SPIFFS.begin()) { - Serial.println("formating file system"); + Serial.println("formatting file system"); SPIFFS.format(); SPIFFS.begin(); diff --git a/libraries/TFT_eSPI-2.4.72/examples/480 x 320/UTFT_Demo_480x320/UTFT_Demo_480x320.ino b/libraries/TFT_eSPI-2.5.43/examples/480 x 320/UTFT_Demo_480x320/UTFT_Demo_480x320.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/480 x 320/UTFT_Demo_480x320/UTFT_Demo_480x320.ino rename to libraries/TFT_eSPI-2.5.43/examples/480 x 320/UTFT_Demo_480x320/UTFT_Demo_480x320.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino b/libraries/TFT_eSPI-2.5.43/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino index 43d10bb5..e2a661ea 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/DMA test/Bouncy_Circles/Bouncy_Circles.ino @@ -153,7 +153,7 @@ void drawUpdate (bool sel) { } // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### uint16_t rainbow(byte value) { @@ -163,7 +163,7 @@ uint16_t rainbow(byte value) value = value % 192; - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/Flash_Jpg_DMA/Flash_Jpg_DMA.ino b/libraries/TFT_eSPI-2.5.43/examples/DMA test/Flash_Jpg_DMA/Flash_Jpg_DMA.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/Flash_Jpg_DMA/Flash_Jpg_DMA.ino rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/Flash_Jpg_DMA/Flash_Jpg_DMA.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/Flash_Jpg_DMA/panda.h b/libraries/TFT_eSPI-2.5.43/examples/DMA test/Flash_Jpg_DMA/panda.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/Flash_Jpg_DMA/panda.h rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/Flash_Jpg_DMA/panda.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino b/libraries/TFT_eSPI-2.5.43/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino index 0b9590fc..a57ed6bb 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/DMA test/SpriteRotatingCube/SpriteRotatingCube.ino @@ -2,7 +2,7 @@ // https://en.wikipedia.org/wiki/Direct_memory_access // Tested with ESP32, Nucleo 64 STM32F446RE and Nucleo 144 STM32F767ZI -// TFT's with SPI can use DMA, the sketch also works with 8 bit +// TFT's with SPI can use DMA, the sketch also works with 8-bit // parallel TFT's (tested with ILI9341 and ILI9481) // The sketch will run on processors without DMA and also parallel @@ -36,7 +36,7 @@ // Color depth has to be 16 bits if DMA is used to render image #define COLOR_DEPTH 16 -// 128x128 for a 16 bit colour Sprite (32Kbytes RAM) +// 128x128 for a 16-bit colour Sprite (32Kbytes RAM) // Maximum is 181x181 (64Kbytes) for DMA - restricted by processor design #define IWIDTH 128 #define IHEIGHT 128 diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/boing_ball/boing_ball.ino b/libraries/TFT_eSPI-2.5.43/examples/DMA test/boing_ball/boing_ball.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/boing_ball/boing_ball.ino rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/boing_ball/boing_ball.ino index 36dbb777..a6e5e707 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/DMA test/boing_ball/boing_ball.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/DMA test/boing_ball/boing_ball.ino @@ -19,7 +19,7 @@ // Blue Pill overclocked to 128MHz *no* DMA - 32MHz SPI 64 fps // Blue Pill overclocked to 128MHz with DMA - 32MHz SPI 116 fps -// ESP32 - 8 bit parallel 110 fps (no DMA) +// ESP32 - 8-bit parallel 110 fps (no DMA) // ESP32 - 40MHz SPI *no* DMA 93 fps // ESP32 - 40MHz SPI with DMA 112 fps diff --git a/libraries/TFT_eSPI-2.4.72/examples/DMA test/boing_ball/graphic.h b/libraries/TFT_eSPI-2.5.43/examples/DMA test/boing_ball/graphic.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/DMA test/boing_ball/graphic.h rename to libraries/TFT_eSPI-2.5.43/examples/DMA test/boing_ball/graphic.h diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Button_demo.ino b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Button_demo.ino new file mode 100644 index 00000000..b8643385 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Button_demo.ino @@ -0,0 +1,191 @@ +// Button widget demo, requires SPI display with touch screen + +// Requires widget library here: +// https://github.com/Bodmer/TFT_eWidget + +#include +#include "Free_Fonts.h" // Include the header file attached to this sketch + +#include // Hardware-specific library +#include // Widget library + +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library + +#define CALIBRATION_FILE "/TouchCalData1" +#define REPEAT_CAL false + +ButtonWidget btnL = ButtonWidget(&tft); +ButtonWidget btnR = ButtonWidget(&tft); + +#define BUTTON_W 100 +#define BUTTON_H 50 + +// Create an array of button instances to use in for() loops +// This is more useful where large numbers of buttons are employed +ButtonWidget* btn[] = {&btnL , &btnR};; +uint8_t buttonCount = sizeof(btn) / sizeof(btn[0]); + +void btnL_pressAction(void) +{ + if (btnL.justPressed()) { + Serial.println("Left button just pressed"); + btnL.drawSmoothButton(true); + } +} + +void btnL_releaseAction(void) +{ + static uint32_t waitTime = 1000; + if (btnL.justReleased()) { + Serial.println("Left button just released"); + btnL.drawSmoothButton(false); + btnL.setReleaseTime(millis()); + waitTime = 10000; + } + else { + if (millis() - btnL.getReleaseTime() >= waitTime) { + waitTime = 1000; + btnL.setReleaseTime(millis()); + btnL.drawSmoothButton(!btnL.getState()); + } + } +} + +void btnR_pressAction(void) +{ + if (btnR.justPressed()) { + btnR.drawSmoothButton(!btnR.getState(), 3, TFT_BLACK, btnR.getState() ? "OFF" : "ON"); + Serial.print("Button toggled: "); + if (btnR.getState()) Serial.println("ON"); + else Serial.println("OFF"); + btnR.setPressTime(millis()); + } + + // if button pressed for more than 1 sec... + if (millis() - btnR.getPressTime() >= 1000) { + Serial.println("Stop pressing my buttton......."); + } + else Serial.println("Right button is being pressed"); +} + +void btnR_releaseAction(void) +{ + // Not action +} + +void initButtons() { + uint16_t x = (tft.width() - BUTTON_W) / 2; + uint16_t y = tft.height() / 2 - BUTTON_H - 10; + btnL.initButtonUL(x, y, BUTTON_W, BUTTON_H, TFT_WHITE, TFT_RED, TFT_BLACK, "Button", 1); + btnL.setPressAction(btnL_pressAction); + btnL.setReleaseAction(btnL_releaseAction); + btnL.drawSmoothButton(false, 3, TFT_BLACK); // 3 is outline width, TFT_BLACK is the surrounding background colour for anti-aliasing + + y = tft.height() / 2 + 10; + btnR.initButtonUL(x, y, BUTTON_W, BUTTON_H, TFT_WHITE, TFT_BLACK, TFT_GREEN, "OFF", 1); + btnR.setPressAction(btnR_pressAction); + //btnR.setReleaseAction(btnR_releaseAction); + btnR.drawSmoothButton(false, 3, TFT_BLACK); // 3 is outline width, TFT_BLACK is the surrounding background colour for anti-aliasing +} + +void setup() { + Serial.begin(115200); + tft.begin(); + tft.setRotation(0); + tft.fillScreen(TFT_BLACK); + tft.setFreeFont(FF18); + + // Calibrate the touch screen and retrieve the scaling factors + touch_calibrate(); + initButtons(); +} + +void loop() { + static uint32_t scanTime = millis(); + uint16_t t_x = 9999, t_y = 9999; // To store the touch coordinates + + // Scan keys every 50ms at most + if (millis() - scanTime >= 50) { + // Pressed will be set true if there is a valid touch on the screen + bool pressed = tft.getTouch(&t_x, &t_y); + scanTime = millis(); + for (uint8_t b = 0; b < buttonCount; b++) { + if (pressed) { + if (btn[b]->contains(t_x, t_y)) { + btn[b]->press(true); + btn[b]->pressAction(); + } + } + else { + btn[b]->press(false); + btn[b]->releaseAction(); + } + } + } + +} + +void touch_calibrate() +{ + uint16_t calData[5]; + uint8_t calDataOK = 0; + + // check file system exists + if (!LittleFS.begin()) { + Serial.println("formatting file system"); + LittleFS.format(); + LittleFS.begin(); + } + + // check if calibration file exists and size is correct + if (LittleFS.exists(CALIBRATION_FILE)) { + if (REPEAT_CAL) + { + // Delete if we want to re-calibrate + LittleFS.remove(CALIBRATION_FILE); + } + else + { + File f = LittleFS.open(CALIBRATION_FILE, "r"); + if (f) { + if (f.readBytes((char *)calData, 14) == 14) + calDataOK = 1; + f.close(); + } + } + } + + if (calDataOK && !REPEAT_CAL) { + // calibration data valid + tft.setTouch(calData); + } else { + // data not valid so recalibrate + tft.fillScreen(TFT_BLACK); + tft.setCursor(20, 0); + tft.setTextFont(2); + tft.setTextSize(1); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.println("Touch corners as indicated"); + + tft.setTextFont(1); + tft.println(); + + if (REPEAT_CAL) { + tft.setTextColor(TFT_RED, TFT_BLACK); + tft.println("Set REPEAT_CAL to false to stop this running again!"); + } + + tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15); + + tft.setTextColor(TFT_GREEN, TFT_BLACK); + tft.println("Calibration complete!"); + + // store data + File f = LittleFS.open(CALIBRATION_FILE, "w"); + if (f) { + f.write((const unsigned char *)calData, 14); + f.close(); + } + } +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Free_Fonts.h b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Free_Fonts.h new file mode 100644 index 00000000..77249efe --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Buttons/Button_demo/Free_Fonts.h @@ -0,0 +1,377 @@ +// Attach this header file to your sketch to use the GFX Free Fonts. You can write +// sketches without it, but it makes referencing them easier. + +// This calls up ALL the fonts but they only get loaded if you actually +// use them in your sketch. +// +// No changes are needed to this header file unless new fonts are added to the +// library "Fonts/GFXFF" folder. +// +// To save a lot of typing long names, each font can easily be referenced in the +// sketch in three ways, either with: +// +// 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b +// an example being: +// +// tft.setFreeFont(&FreeSansBoldOblique24pt7b); +// +// 2. FF# where # is a number determined by looking at the list below +// an example being: +// +// tft.setFreeFont(FF32); +// +// 3. An abbreviation of the file name. Look at the list below to see +// the abbreviations used, for example: +// +// tft.setFreeFont(FSSBO24) +// +// Where the letters mean: +// F = Free font +// M = Mono +// SS = Sans Serif (double S to distinguish is form serif fonts) +// S = Serif +// B = Bold +// O = Oblique (letter O not zero) +// I = Italic +// # = point size, either 9, 12, 18 or 24 +// +// Setting the font to NULL will select the GLCD font: +// +// tft.setFreeFont(NULL); // Set font to GLCD + +#define LOAD_tftFF + +#ifdef LOAD_tftFF // Only include the fonts if LOAD_tftFF is defined in User_Setup.h + +// Use these when printing or drawing text in GLCD and high rendering speed fonts +#define GFXFF 1 +#define GLCD 0 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +// Use the following when calling setFont() +// +// Reserved for GLCD font // FF0 +// + +#define TT1 &TomThumb + +#define FM9 &FreeMono9pt7b +#define FM12 &FreeMono12pt7b +#define FM18 &FreeMono18pt7b +#define FM24 &FreeMono24pt7b + +#define FMB9 &FreeMonoBold9pt7b +#define FMB12 &FreeMonoBold12pt7b +#define FMB18 &FreeMonoBold18pt7b +#define FMB24 &FreeMonoBold24pt7b + +#define FMO9 &FreeMonoOblique9pt7b +#define FMO12 &FreeMonoOblique12pt7b +#define FMO18 &FreeMonoOblique18pt7b +#define FMO24 &FreeMonoOblique24pt7b + +#define FMBO9 &FreeMonoBoldOblique9pt7b +#define FMBO12 &FreeMonoBoldOblique12pt7b +#define FMBO18 &FreeMonoBoldOblique18pt7b +#define FMBO24 &FreeMonoBoldOblique24pt7b + +#define FSS9 &FreeSans9pt7b +#define FSS12 &FreeSans12pt7b +#define FSS18 &FreeSans18pt7b +#define FSS24 &FreeSans24pt7b + +#define FSSB9 &FreeSansBold9pt7b +#define FSSB12 &FreeSansBold12pt7b +#define FSSB18 &FreeSansBold18pt7b +#define FSSB24 &FreeSansBold24pt7b + +#define FSSO9 &FreeSansOblique9pt7b +#define FSSO12 &FreeSansOblique12pt7b +#define FSSO18 &FreeSansOblique18pt7b +#define FSSO24 &FreeSansOblique24pt7b + +#define FSSBO9 &FreeSansBoldOblique9pt7b +#define FSSBO12 &FreeSansBoldOblique12pt7b +#define FSSBO18 &FreeSansBoldOblique18pt7b +#define FSSBO24 &FreeSansBoldOblique24pt7b + +#define FS9 &FreeSerif9pt7b +#define FS12 &FreeSerif12pt7b +#define FS18 &FreeSerif18pt7b +#define FS24 &FreeSerif24pt7b + +#define FSI9 &FreeSerifItalic9pt7b +#define FSI12 &FreeSerifItalic12pt7b +#define FSI19 &FreeSerifItalic18pt7b +#define FSI24 &FreeSerifItalic24pt7b + +#define FSB9 &FreeSerifBold9pt7b +#define FSB12 &FreeSerifBold12pt7b +#define FSB18 &FreeSerifBold18pt7b +#define FSB24 &FreeSerifBold24pt7b + +#define FSBI9 &FreeSerifBoldItalic9pt7b +#define FSBI12 &FreeSerifBoldItalic12pt7b +#define FSBI18 &FreeSerifBoldItalic18pt7b +#define FSBI24 &FreeSerifBoldItalic24pt7b + +#define FF0 NULL //ff0 reserved for GLCD +#define FF1 &FreeMono9pt7b +#define FF2 &FreeMono12pt7b +#define FF3 &FreeMono18pt7b +#define FF4 &FreeMono24pt7b + +#define FF5 &FreeMonoBold9pt7b +#define FF6 &FreeMonoBold12pt7b +#define FF7 &FreeMonoBold18pt7b +#define FF8 &FreeMonoBold24pt7b + +#define FF9 &FreeMonoOblique9pt7b +#define FF10 &FreeMonoOblique12pt7b +#define FF11 &FreeMonoOblique18pt7b +#define FF12 &FreeMonoOblique24pt7b + +#define FF13 &FreeMonoBoldOblique9pt7b +#define FF14 &FreeMonoBoldOblique12pt7b +#define FF15 &FreeMonoBoldOblique18pt7b +#define FF16 &FreeMonoBoldOblique24pt7b + +#define FF17 &FreeSans9pt7b +#define FF18 &FreeSans12pt7b +#define FF19 &FreeSans18pt7b +#define FF20 &FreeSans24pt7b + +#define FF21 &FreeSansBold9pt7b +#define FF22 &FreeSansBold12pt7b +#define FF23 &FreeSansBold18pt7b +#define FF24 &FreeSansBold24pt7b + +#define FF25 &FreeSansOblique9pt7b +#define FF26 &FreeSansOblique12pt7b +#define FF27 &FreeSansOblique18pt7b +#define FF28 &FreeSansOblique24pt7b + +#define FF29 &FreeSansBoldOblique9pt7b +#define FF30 &FreeSansBoldOblique12pt7b +#define FF31 &FreeSansBoldOblique18pt7b +#define FF32 &FreeSansBoldOblique24pt7b + +#define FF33 &FreeSerif9pt7b +#define FF34 &FreeSerif12pt7b +#define FF35 &FreeSerif18pt7b +#define FF36 &FreeSerif24pt7b + +#define FF37 &FreeSerifItalic9pt7b +#define FF38 &FreeSerifItalic12pt7b +#define FF39 &FreeSerifItalic18pt7b +#define FF40 &FreeSerifItalic24pt7b + +#define FF41 &FreeSerifBold9pt7b +#define FF42 &FreeSerifBold12pt7b +#define FF43 &FreeSerifBold18pt7b +#define FF44 &FreeSerifBold24pt7b + +#define FF45 &FreeSerifBoldItalic9pt7b +#define FF46 &FreeSerifBoldItalic12pt7b +#define FF47 &FreeSerifBoldItalic18pt7b +#define FF48 &FreeSerifBoldItalic24pt7b + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Now we define "s"tring versions for easy printing of the font name so: +// tft.println(sFF5); +// will print +// Mono bold 9 +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define sFF0 "GLCD" +#define sTT1 "Tom Thumb" +#define sFF1 "Mono 9" +#define sFF2 "Mono 12" +#define sFF3 "Mono 18" +#define sFF4 "Mono 24" + +#define sFF5 "Mono bold 9" +#define sFF6 "Mono bold 12" +#define sFF7 "Mono bold 18" +#define sFF8 "Mono bold 24" + +#define sFF9 "Mono oblique 9" +#define sFF10 "Mono oblique 12" +#define sFF11 "Mono oblique 18" +#define sFF12 "Mono oblique 24" + +#define sFF13 "Mono bold oblique 9" +#define sFF14 "Mono bold oblique 12" +#define sFF15 "Mono bold oblique 18" +#define sFF16 "Mono bold oblique 24" // Full text line is too big for 480 pixel wide screen + +#define sFF17 "Sans 9" +#define sFF18 "Sans 12" +#define sFF19 "Sans 18" +#define sFF20 "Sans 24" + +#define sFF21 "Sans bold 9" +#define sFF22 "Sans bold 12" +#define sFF23 "Sans bold 18" +#define sFF24 "Sans bold 24" + +#define sFF25 "Sans oblique 9" +#define sFF26 "Sans oblique 12" +#define sFF27 "Sans oblique 18" +#define sFF28 "Sans oblique 24" + +#define sFF29 "Sans bold oblique 9" +#define sFF30 "Sans bold oblique 12" +#define sFF31 "Sans bold oblique 18" +#define sFF32 "Sans bold oblique 24" + +#define sFF33 "Serif 9" +#define sFF34 "Serif 12" +#define sFF35 "Serif 18" +#define sFF36 "Serif 24" + +#define sFF37 "Serif italic 9" +#define sFF38 "Serif italic 12" +#define sFF39 "Serif italic 18" +#define sFF40 "Serif italic 24" + +#define sFF41 "Serif bold 9" +#define sFF42 "Serif bold 12" +#define sFF43 "Serif bold 18" +#define sFF44 "Serif bold 24" + +#define sFF45 "Serif bold italic 9" +#define sFF46 "Serif bold italic 12" +#define sFF47 "Serif bold italic 18" +#define sFF48 "Serif bold italic 24" + +#else // LOAD_tftFF not defined so setup defaults to prevent error messages + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Free fonts are not loaded in User_Setup.h so we must define all as font 1 +// to prevent compile error messages +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define GFXFF 1 +#define GLCD 1 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +#define FF0 1 +#define FF1 1 +#define FF2 1 +#define FF3 1 +#define FF4 1 +#define FF5 1 +#define FF6 1 +#define FF7 1 +#define FF8 1 +#define FF9 1 +#define FF10 1 +#define FF11 1 +#define FF12 1 +#define FF13 1 +#define FF14 1 +#define FF15 1 +#define FF16 1 +#define FF17 1 +#define FF18 1 +#define FF19 1 +#define FF20 1 +#define FF21 1 +#define FF22 1 +#define FF23 1 +#define FF24 1 +#define FF25 1 +#define FF26 1 +#define FF27 1 +#define FF28 1 +#define FF29 1 +#define FF30 1 +#define FF31 1 +#define FF32 1 +#define FF33 1 +#define FF34 1 +#define FF35 1 +#define FF36 1 +#define FF37 1 +#define FF38 1 +#define FF39 1 +#define FF40 1 +#define FF41 1 +#define FF42 1 +#define FF43 1 +#define FF44 1 +#define FF45 1 +#define FF46 1 +#define FF47 1 +#define FF48 1 + +#define FM9 1 +#define FM12 1 +#define FM18 1 +#define FM24 1 + +#define FMB9 1 +#define FMB12 1 +#define FMB18 1 +#define FMB24 1 + +#define FMO9 1 +#define FMO12 1 +#define FMO18 1 +#define FMO24 1 + +#define FMBO9 1 +#define FMBO12 1 +#define FMBO18 1 +#define FMBO24 1 + +#define FSS9 1 +#define FSS12 1 +#define FSS18 1 +#define FSS24 1 + +#define FSSB9 1 +#define FSSB12 1 +#define FSSB18 1 +#define FSSB24 1 + +#define FSSO9 1 +#define FSSO12 1 +#define FSSO18 1 +#define FSSO24 1 + +#define FSSBO9 1 +#define FSSBO12 1 +#define FSSBO18 1 +#define FSSBO24 1 + +#define FS9 1 +#define FS12 1 +#define FS18 1 +#define FS24 1 + +#define FSI9 1 +#define FSI12 1 +#define FSI19 1 +#define FSI24 1 + +#define FSB9 1 +#define FSB12 1 +#define FSB18 1 +#define FSB24 1 + +#define FSBI9 1 +#define FSBI12 1 +#define FSBI18 1 +#define FSBI24 1 + +#endif // LOAD_tftFF diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_1/Graph_demo_1.ino b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_1/Graph_demo_1.ino new file mode 100644 index 00000000..5e9f74f2 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_1/Graph_demo_1.ino @@ -0,0 +1,80 @@ +// Demonstrate graph widget functions with a single trace instance +// One trace can be drawn at a time with one trace instance + +// Requires widget library here: +// https://github.com/Bodmer/TFT_eWidget + +#include +TFT_eSPI tft = TFT_eSPI(); + +#include // Widget library + +GraphWidget gr = GraphWidget(&tft); // Graph widget gr instance with pointer to tft +TraceWidget tr = TraceWidget(&gr); // Graph trace tr with pointer to gr + +const float gxLow = 0.0; +const float gxHigh = 100.0; +const float gyLow = -512.0; +const float gyHigh = 512.0; + +void setup() { + Serial.begin(115200); + + tft.begin(); + tft.setRotation(3); + tft.fillScreen(TFT_BLACK); + + // Graph area is 200 pixels wide, 150 pixels high, dark grey background + gr.createGraph(200, 150, tft.color565(5, 5, 5)); + + // x scale units is from 0 to 100, y scale units is -512 to 512 + gr.setGraphScale(gxLow, gxHigh, gyLow, gyHigh); + + // X grid starts at 0 with lines every 20 x-scale units + // Y grid starts at -512 with lines every 64 y-scale units + // blue grid + gr.setGraphGrid(gxLow, 20.0, gyLow, 64.0, TFT_BLUE); + + // Draw empty graph, top left corner at pixel coordinate 40,10 on TFT + gr.drawGraph(40, 10); + + // Start a trace with using red, trace points are in x and y scale units + // In this example a horizontal line is drawn + tr.startTrace(TFT_RED); + // Add a trace point at 0.0,0.0 on graph + tr.addPoint(0.0, 0.0); + // Add another point at 100.0, 0.0 this will be joined via line to the last point added + tr.addPoint(100.0, 0.0); + + // Start a new trace with using white + tr.startTrace(TFT_WHITE); +} + +void loop() { + static uint32_t plotTime = millis(); + static float gx = 0.0, gy = 0.0; + static float delta = 10.0; + + // Create a new plot point every 100ms + if (millis() - plotTime >= 100) { + plotTime = millis(); + + // Add a plot, first point in a trace will be a single pixel (if within graph area) + tr.addPoint(gx, gy); + gx += 1.0; + if (gy > 500.0) delta = -10.0; + if (gy < -500.0) delta = 10.0; + gy += delta; + + // If the end of the graph x axis is reached start a new trace at 0.0,0.0 + if (gx > gxHigh) { + gx = 0.0; + gy = 0.0; + + // Draw empty graph at 40,10 on display to clear old one + gr.drawGraph(40, 10); + // Start new trace + tr.startTrace(TFT_GREEN); + } + } +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_2/Graph_demo_2.ino b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_2/Graph_demo_2.ino new file mode 100644 index 00000000..a7eb3cdd --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Graphs/Graph_demo_2/Graph_demo_2.ino @@ -0,0 +1,105 @@ +// Demonstrate graph widget functions with two independent trace instances +// Multiple traces can be drawn at a time with multiple trace instances +// Note: Traces are automatically clipped at graph boundaries by widget library + +// Requires widget library here: +// https://github.com/Bodmer/TFT_eWidget + +#include +TFT_eSPI tft = TFT_eSPI(); + +#include // Widget library + +GraphWidget gr = GraphWidget(&tft); // Graph widget + +// Traces are drawn on tft using graph instance +TraceWidget tr1 = TraceWidget(&gr); // Graph trace 1 +TraceWidget tr2 = TraceWidget(&gr); // Graph trace 2 + +void setup() { + Serial.begin(115200); + delay(5000); + tft.begin(); + tft.setRotation(3); + tft.fillScreen(TFT_BLACK); + + // Graph area is 200 pixels wide, 150 high, dark grey background + gr.createGraph(200, 150, tft.color565(5, 5, 5)); + + // x scale units is from 0 to 100, y scale units is -50 to 50 + gr.setGraphScale(0.0, 100.0, -50.0, 50.0); + + // X grid starts at 0 with lines every 10 x-scale units + // Y grid starts at -50 with lines every 25 y-scale units + // blue grid + gr.setGraphGrid(0.0, 10.0, -50.0, 25.0, TFT_BLUE); + + // Draw empty graph, top left corner at 40,10 on TFT + gr.drawGraph(40, 10); + + // Start a trace with using red and another with green + tr1.startTrace(TFT_RED); + tr2.startTrace(TFT_GREEN); + + // Add points on graph to trace 1 using graph scale factors + tr1.addPoint(0.0, 0.0); + tr1.addPoint(100.0, 0.0); + + // Add points on graph to trace 2 using graph scale factors + // Points are off graph so the plotted line is clipped to graph area + tr2.addPoint(0.0, -100.0); + tr2.addPoint(100.0, 100.0); + + // Get x,y pixel coordinates of any scaled point on graph + // and ring that point. + tft.drawCircle(gr.getPointX(50.0), gr.getPointY(0.0), 5, TFT_MAGENTA); + + // Draw the x axis scale + tft.setTextDatum(TC_DATUM); // Top centre text datum + tft.drawNumber(0, gr.getPointX(0.0), gr.getPointY(-50.0) + 3); + tft.drawNumber(50, gr.getPointX(50.0), gr.getPointY(-50.0) + 3); + tft.drawNumber(100, gr.getPointX(100.0), gr.getPointY(-50.0) + 3); + + // Draw the y axis scale + tft.setTextDatum(MR_DATUM); // Middle right text datum + tft.drawNumber(-50, gr.getPointX(0.0), gr.getPointY(-50.0)); + tft.drawNumber(0, gr.getPointX(0.0), gr.getPointY(0.0)); + tft.drawNumber(50, gr.getPointX(0.0), gr.getPointY(50.0)); + + // Restart traces with new colours + tr1.startTrace(TFT_WHITE); + tr2.startTrace(TFT_YELLOW); +} + +void loop() { + static uint32_t plotTime = millis(); + static float gx = 0.0, gy = 0.0; + static float delta = 7.0; + + // Sample periodically + if (millis() - plotTime >= 100) { + plotTime = millis(); + + // Add a new point on each trace + tr1.addPoint(gx, gy); + tr2.addPoint(gx, gy/2.0); // half y amplitude + + // Create next plot point + gx += 1.0; + gy += delta; + if (gy > 70.0) { delta = -7.0; gy = 70.0; } + if (gy < -70.0) { delta = 7.0; gy = -70.0; } + + // If the end of the graph is reached start 2 new traces + if (gx > 100.0) { + gx = 0.0; + gy = 0.0; + + // Draw empty graph at 40,10 on display + gr.drawGraph(40, 10); + // Start new trace + tr1.startTrace(TFT_GREEN); + tr2.startTrace(TFT_YELLOW); + } + } +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Meters/Analogue_meters/Analogue_meters.ino b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Meters/Analogue_meters/Analogue_meters.ino new file mode 100644 index 00000000..c944a92f --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Meters/Analogue_meters/Analogue_meters.ino @@ -0,0 +1,87 @@ +/* + Example animated analogue meters + + Needs Font 2 (also Font 4 if using large scale label) + + Make sure all the display driver and pin connections are correct by + editing the User_Setup.h file in the TFT_eSPI library folder. + + ######################################################################### + ###### DON'T FORGET TO UPDATE THE User_Setup.h FILE IN THE LIBRARY ###### + ######################################################################### + + Requires widget library here: + https://github.com/Bodmer/TFT_eWidget +*/ + +#include // Hardware-specific library +#include // Widget library + +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library + +MeterWidget amps = MeterWidget(&tft); +MeterWidget volts = MeterWidget(&tft); +MeterWidget ohms = MeterWidget(&tft); + +#define LOOP_PERIOD 35 // Display updates every 35 ms + +void setup(void) +{ + tft.init(); + tft.setRotation(0); + Serial.begin(115200); // For debug + + + // Colour zones are set as a start and end percentage of full scale (0-100) + // If start and end of a colour zone are the same then that colour is not used + // --Red-- -Org- -Yell- -Grn- + amps.setZones(75, 100, 50, 75, 25, 50, 0, 25); // Example here red starts at 75% and ends at 100% of full scale + // Meter is 239 pixels wide and 126 pixels high + amps.analogMeter(0, 0, 2.0, "mA", "0", "0.5", "1.0", "1.5", "2.0"); // Draw analogue meter at 0, 0 + + // Colour draw order is red, orange, yellow, green. So red can be full scale with green drawn + // last on top to indicate a "safe" zone. + // -Red- -Org- -Yell- -Grn- + volts.setZones(0, 100, 25, 75, 0, 0, 40, 60); + volts.analogMeter(0, 128, 10.0, "V", "0", "2.5", "5", "7.5", "10"); // Draw analogue meter at 0, 128 + + // No coloured zones if not defined + ohms.analogMeter(0, 256, 100, "R", "0", "", "50", "", "100"); // Draw analogue meter at 0, 128 +} + + +void loop() +{ + static int d = 0; + static uint32_t updateTime = 0; + + if (millis() - updateTime >= LOOP_PERIOD) + { + updateTime = millis(); + + d += 4; if (d > 360) d = 0; + + // Create a Sine wave for testing, value is in range 0 - 100 + float value = 50.0 + 50.0 * sin((d + 0) * 0.0174532925); + + float current; + current = mapValue(value, (float)0.0, (float)100.0, (float)0.0, (float)2.0); + //Serial.print("I = "); Serial.print(current); + amps.updateNeedle(current, 0); + + float voltage; + voltage = mapValue(value, (float)0.0, (float)100.0, (float)0.0, (float)10.0); + //Serial.print(", V = "); Serial.println(voltage); + volts.updateNeedle(voltage, 0); + + float resistance; + resistance = mapValue(value, (float)0.0, (float)100.0, (float)0.0, (float)100.0); + //Serial.print(", R = "); Serial.println(resistance); + ohms.updateNeedle(resistance, 0); + } +} + +float mapValue(float ip, float ipmin, float ipmax, float tomin, float tomax) +{ + return tomin + (((tomax - tomin) * (ip - ipmin))/ (ipmax - ipmin)); +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Free_Fonts.h b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Free_Fonts.h new file mode 100644 index 00000000..77249efe --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Free_Fonts.h @@ -0,0 +1,377 @@ +// Attach this header file to your sketch to use the GFX Free Fonts. You can write +// sketches without it, but it makes referencing them easier. + +// This calls up ALL the fonts but they only get loaded if you actually +// use them in your sketch. +// +// No changes are needed to this header file unless new fonts are added to the +// library "Fonts/GFXFF" folder. +// +// To save a lot of typing long names, each font can easily be referenced in the +// sketch in three ways, either with: +// +// 1. Font file name with the & in front such as &FreeSansBoldOblique24pt7b +// an example being: +// +// tft.setFreeFont(&FreeSansBoldOblique24pt7b); +// +// 2. FF# where # is a number determined by looking at the list below +// an example being: +// +// tft.setFreeFont(FF32); +// +// 3. An abbreviation of the file name. Look at the list below to see +// the abbreviations used, for example: +// +// tft.setFreeFont(FSSBO24) +// +// Where the letters mean: +// F = Free font +// M = Mono +// SS = Sans Serif (double S to distinguish is form serif fonts) +// S = Serif +// B = Bold +// O = Oblique (letter O not zero) +// I = Italic +// # = point size, either 9, 12, 18 or 24 +// +// Setting the font to NULL will select the GLCD font: +// +// tft.setFreeFont(NULL); // Set font to GLCD + +#define LOAD_tftFF + +#ifdef LOAD_tftFF // Only include the fonts if LOAD_tftFF is defined in User_Setup.h + +// Use these when printing or drawing text in GLCD and high rendering speed fonts +#define GFXFF 1 +#define GLCD 0 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +// Use the following when calling setFont() +// +// Reserved for GLCD font // FF0 +// + +#define TT1 &TomThumb + +#define FM9 &FreeMono9pt7b +#define FM12 &FreeMono12pt7b +#define FM18 &FreeMono18pt7b +#define FM24 &FreeMono24pt7b + +#define FMB9 &FreeMonoBold9pt7b +#define FMB12 &FreeMonoBold12pt7b +#define FMB18 &FreeMonoBold18pt7b +#define FMB24 &FreeMonoBold24pt7b + +#define FMO9 &FreeMonoOblique9pt7b +#define FMO12 &FreeMonoOblique12pt7b +#define FMO18 &FreeMonoOblique18pt7b +#define FMO24 &FreeMonoOblique24pt7b + +#define FMBO9 &FreeMonoBoldOblique9pt7b +#define FMBO12 &FreeMonoBoldOblique12pt7b +#define FMBO18 &FreeMonoBoldOblique18pt7b +#define FMBO24 &FreeMonoBoldOblique24pt7b + +#define FSS9 &FreeSans9pt7b +#define FSS12 &FreeSans12pt7b +#define FSS18 &FreeSans18pt7b +#define FSS24 &FreeSans24pt7b + +#define FSSB9 &FreeSansBold9pt7b +#define FSSB12 &FreeSansBold12pt7b +#define FSSB18 &FreeSansBold18pt7b +#define FSSB24 &FreeSansBold24pt7b + +#define FSSO9 &FreeSansOblique9pt7b +#define FSSO12 &FreeSansOblique12pt7b +#define FSSO18 &FreeSansOblique18pt7b +#define FSSO24 &FreeSansOblique24pt7b + +#define FSSBO9 &FreeSansBoldOblique9pt7b +#define FSSBO12 &FreeSansBoldOblique12pt7b +#define FSSBO18 &FreeSansBoldOblique18pt7b +#define FSSBO24 &FreeSansBoldOblique24pt7b + +#define FS9 &FreeSerif9pt7b +#define FS12 &FreeSerif12pt7b +#define FS18 &FreeSerif18pt7b +#define FS24 &FreeSerif24pt7b + +#define FSI9 &FreeSerifItalic9pt7b +#define FSI12 &FreeSerifItalic12pt7b +#define FSI19 &FreeSerifItalic18pt7b +#define FSI24 &FreeSerifItalic24pt7b + +#define FSB9 &FreeSerifBold9pt7b +#define FSB12 &FreeSerifBold12pt7b +#define FSB18 &FreeSerifBold18pt7b +#define FSB24 &FreeSerifBold24pt7b + +#define FSBI9 &FreeSerifBoldItalic9pt7b +#define FSBI12 &FreeSerifBoldItalic12pt7b +#define FSBI18 &FreeSerifBoldItalic18pt7b +#define FSBI24 &FreeSerifBoldItalic24pt7b + +#define FF0 NULL //ff0 reserved for GLCD +#define FF1 &FreeMono9pt7b +#define FF2 &FreeMono12pt7b +#define FF3 &FreeMono18pt7b +#define FF4 &FreeMono24pt7b + +#define FF5 &FreeMonoBold9pt7b +#define FF6 &FreeMonoBold12pt7b +#define FF7 &FreeMonoBold18pt7b +#define FF8 &FreeMonoBold24pt7b + +#define FF9 &FreeMonoOblique9pt7b +#define FF10 &FreeMonoOblique12pt7b +#define FF11 &FreeMonoOblique18pt7b +#define FF12 &FreeMonoOblique24pt7b + +#define FF13 &FreeMonoBoldOblique9pt7b +#define FF14 &FreeMonoBoldOblique12pt7b +#define FF15 &FreeMonoBoldOblique18pt7b +#define FF16 &FreeMonoBoldOblique24pt7b + +#define FF17 &FreeSans9pt7b +#define FF18 &FreeSans12pt7b +#define FF19 &FreeSans18pt7b +#define FF20 &FreeSans24pt7b + +#define FF21 &FreeSansBold9pt7b +#define FF22 &FreeSansBold12pt7b +#define FF23 &FreeSansBold18pt7b +#define FF24 &FreeSansBold24pt7b + +#define FF25 &FreeSansOblique9pt7b +#define FF26 &FreeSansOblique12pt7b +#define FF27 &FreeSansOblique18pt7b +#define FF28 &FreeSansOblique24pt7b + +#define FF29 &FreeSansBoldOblique9pt7b +#define FF30 &FreeSansBoldOblique12pt7b +#define FF31 &FreeSansBoldOblique18pt7b +#define FF32 &FreeSansBoldOblique24pt7b + +#define FF33 &FreeSerif9pt7b +#define FF34 &FreeSerif12pt7b +#define FF35 &FreeSerif18pt7b +#define FF36 &FreeSerif24pt7b + +#define FF37 &FreeSerifItalic9pt7b +#define FF38 &FreeSerifItalic12pt7b +#define FF39 &FreeSerifItalic18pt7b +#define FF40 &FreeSerifItalic24pt7b + +#define FF41 &FreeSerifBold9pt7b +#define FF42 &FreeSerifBold12pt7b +#define FF43 &FreeSerifBold18pt7b +#define FF44 &FreeSerifBold24pt7b + +#define FF45 &FreeSerifBoldItalic9pt7b +#define FF46 &FreeSerifBoldItalic12pt7b +#define FF47 &FreeSerifBoldItalic18pt7b +#define FF48 &FreeSerifBoldItalic24pt7b + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Now we define "s"tring versions for easy printing of the font name so: +// tft.println(sFF5); +// will print +// Mono bold 9 +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define sFF0 "GLCD" +#define sTT1 "Tom Thumb" +#define sFF1 "Mono 9" +#define sFF2 "Mono 12" +#define sFF3 "Mono 18" +#define sFF4 "Mono 24" + +#define sFF5 "Mono bold 9" +#define sFF6 "Mono bold 12" +#define sFF7 "Mono bold 18" +#define sFF8 "Mono bold 24" + +#define sFF9 "Mono oblique 9" +#define sFF10 "Mono oblique 12" +#define sFF11 "Mono oblique 18" +#define sFF12 "Mono oblique 24" + +#define sFF13 "Mono bold oblique 9" +#define sFF14 "Mono bold oblique 12" +#define sFF15 "Mono bold oblique 18" +#define sFF16 "Mono bold oblique 24" // Full text line is too big for 480 pixel wide screen + +#define sFF17 "Sans 9" +#define sFF18 "Sans 12" +#define sFF19 "Sans 18" +#define sFF20 "Sans 24" + +#define sFF21 "Sans bold 9" +#define sFF22 "Sans bold 12" +#define sFF23 "Sans bold 18" +#define sFF24 "Sans bold 24" + +#define sFF25 "Sans oblique 9" +#define sFF26 "Sans oblique 12" +#define sFF27 "Sans oblique 18" +#define sFF28 "Sans oblique 24" + +#define sFF29 "Sans bold oblique 9" +#define sFF30 "Sans bold oblique 12" +#define sFF31 "Sans bold oblique 18" +#define sFF32 "Sans bold oblique 24" + +#define sFF33 "Serif 9" +#define sFF34 "Serif 12" +#define sFF35 "Serif 18" +#define sFF36 "Serif 24" + +#define sFF37 "Serif italic 9" +#define sFF38 "Serif italic 12" +#define sFF39 "Serif italic 18" +#define sFF40 "Serif italic 24" + +#define sFF41 "Serif bold 9" +#define sFF42 "Serif bold 12" +#define sFF43 "Serif bold 18" +#define sFF44 "Serif bold 24" + +#define sFF45 "Serif bold italic 9" +#define sFF46 "Serif bold italic 12" +#define sFF47 "Serif bold italic 18" +#define sFF48 "Serif bold italic 24" + +#else // LOAD_tftFF not defined so setup defaults to prevent error messages + +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> +// Free fonts are not loaded in User_Setup.h so we must define all as font 1 +// to prevent compile error messages +// >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> + +#define GFXFF 1 +#define GLCD 1 +#define FONT2 2 +#define FONT4 4 +#define FONT6 6 +#define FONT7 7 +#define FONT8 8 + +#define FF0 1 +#define FF1 1 +#define FF2 1 +#define FF3 1 +#define FF4 1 +#define FF5 1 +#define FF6 1 +#define FF7 1 +#define FF8 1 +#define FF9 1 +#define FF10 1 +#define FF11 1 +#define FF12 1 +#define FF13 1 +#define FF14 1 +#define FF15 1 +#define FF16 1 +#define FF17 1 +#define FF18 1 +#define FF19 1 +#define FF20 1 +#define FF21 1 +#define FF22 1 +#define FF23 1 +#define FF24 1 +#define FF25 1 +#define FF26 1 +#define FF27 1 +#define FF28 1 +#define FF29 1 +#define FF30 1 +#define FF31 1 +#define FF32 1 +#define FF33 1 +#define FF34 1 +#define FF35 1 +#define FF36 1 +#define FF37 1 +#define FF38 1 +#define FF39 1 +#define FF40 1 +#define FF41 1 +#define FF42 1 +#define FF43 1 +#define FF44 1 +#define FF45 1 +#define FF46 1 +#define FF47 1 +#define FF48 1 + +#define FM9 1 +#define FM12 1 +#define FM18 1 +#define FM24 1 + +#define FMB9 1 +#define FMB12 1 +#define FMB18 1 +#define FMB24 1 + +#define FMO9 1 +#define FMO12 1 +#define FMO18 1 +#define FMO24 1 + +#define FMBO9 1 +#define FMBO12 1 +#define FMBO18 1 +#define FMBO24 1 + +#define FSS9 1 +#define FSS12 1 +#define FSS18 1 +#define FSS24 1 + +#define FSSB9 1 +#define FSSB12 1 +#define FSSB18 1 +#define FSSB24 1 + +#define FSSO9 1 +#define FSSO12 1 +#define FSSO18 1 +#define FSSO24 1 + +#define FSSBO9 1 +#define FSSBO12 1 +#define FSSBO18 1 +#define FSSBO24 1 + +#define FS9 1 +#define FS12 1 +#define FS18 1 +#define FS24 1 + +#define FSI9 1 +#define FSI12 1 +#define FSI19 1 +#define FSI24 1 + +#define FSB9 1 +#define FSB12 1 +#define FSB18 1 +#define FSB24 1 + +#define FSBI9 1 +#define FSBI12 1 +#define FSBI18 1 +#define FSBI24 1 + +#endif // LOAD_tftFF diff --git a/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Slider_demo.ino b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Slider_demo.ino new file mode 100644 index 00000000..7e8e6ce0 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/GUI Widgets/Sliders/Slider_demo/Slider_demo.ino @@ -0,0 +1,201 @@ +// Slider widget demo, requires display with touch screen + +// Requires widget library here: +// https://github.com/Bodmer/TFT_eWidget + +#include "FS.h" + +#include "Free_Fonts.h" // Include the header file attached to this sketch + +#include +#include // Widget library + +TFT_eSPI tft = TFT_eSPI(); +TFT_eSprite knob = TFT_eSprite(&tft); // Sprite for the slide knob + +#define CALIBRATION_FILE "/TouchCalData1" +#define REPEAT_CAL false + +SliderWidget s1 = SliderWidget(&tft, &knob); // Slider 1 widget +SliderWidget s2 = SliderWidget(&tft, &knob); // Slider 2 widget + + +void setup() { + Serial.begin(115200); + tft.begin(); + tft.setRotation(0); + tft.fillScreen(TFT_BLACK); + tft.setFreeFont(FF18); + + // Calibrate the touch screen and retrieve the scaling factors + if (REPEAT_CAL) { + touch_calibrate(); + tft.fillScreen(TFT_BLACK); + } + + // Create a parameter set for the slider + slider_t param; + + // Slider slot parameters + param.slotWidth = 9; // Note: ends of slot will be rounded and anti-aliased + param.slotLength = 200; // Length includes rounded ends + param.slotColor = TFT_BLUE; // Slot colour + param.slotBgColor = TFT_BLACK; // Slot background colour for anti-aliasing + param.orientation = H_SLIDER; // sets it "true" for horizontal + + // Slider control knob parameters (smooth rounded rectangle) + param.knobWidth = 15; // Always along x axis + param.knobHeight = 25; // Always along y axis + param.knobRadius = 5; // Corner radius + param.knobColor = TFT_WHITE; // Anti-aliased with slot backgound colour + param.knobLineColor = TFT_RED; // Colour of marker line (set to same as knobColor for no line) + + // Slider range and movement speed + param.sliderLT = 0; // Left side for horizontal, top for vertical slider + param.sliderRB = 100; // Right side for horizontal, bottom for vertical slider + param.startPosition = 50; // Start position for control knob + param.sliderDelay = 0; // Microseconds per pixel movement delay (0 = no delay) + + // Create slider using parameters and plot at 0,0 + s1.drawSlider(0, 0, param); + + // Show bounding box (1 pixel outside slider working area) + int16_t x, y; // x and y can be negative + uint16_t w, h; // Width and height + s1.getBoundingRect(&x, &y, &w, &h); // Update x,y,w,h with bounding box + tft.drawRect(x, y, w, h, TFT_DARKGREY); // Draw rectangle outline +/* + // Alternative discrete fns to create/modify same slider - but fn sequence is important... + s1.createSlider(9, 200, TFT_BLUE, TFT_BLACK, H_SLIDER); + s1.createKnob(15, 25, 5, TFT_WHITE, TFT_RED); + s1.setSliderScale(0, 100); + s1.drawSlider(0, 0); +*/ + delay(1000); + s1.setSliderPosition(50); + delay(1000); + s1.setSliderPosition(100); + + // Update any parameters that are different for slider 2 + param.slotWidth = 4; + param.orientation = V_SLIDER; // sets it "false" for vertical + + param.knobWidth = 19; + param.knobHeight = 19; + param.knobRadius = 19/2; // Half w and h so creates a circle + + param.sliderLT = 200; // Top for vertical slider + param.sliderRB = 0; // Bottom for vertical slider + param.sliderDelay = 2000; // 2ms per pixel movement delay (movement is blocking until complete) + + s2.drawSlider(0, 50, param); + + s2.getBoundingRect(&x, &y, &w, &h); + tft.drawRect(x, y, w, h, TFT_DARKGREY); +/* + // Alternative discrete fns to create/modify same slider - but fn sequence is important... + s2.createSlider(4, 200, TFT_BLUE, TFT_BLACK, V_SLIDER); + s2.createKnob(19, 19, 9, TFT_WHITE, TFT_RED); + s2.setSliderScale(200, 0, 2000); + s2.drawSlider(0, 50); +*/ + // Move slider under software control + delay(1000); + s2.setSliderPosition(50); + delay(1000); + s2.setSliderPosition(100); + +} + +void loop() { + static uint32_t scanTime = millis(); + uint16_t t_x = 9999, t_y = 9999; // To store the touch coordinates + + // Scan for touch every 50ms + if (millis() - scanTime >= 20) { + // Pressed will be set true if there is a valid touch on the screen + if( tft.getTouch(&t_x, &t_y, 250) ) { + if (s1.checkTouch(t_x, t_y)) { + Serial.print("Slider 1 = "); Serial.println(s1.getSliderPosition()); + } + if (s2.checkTouch(t_x, t_y)) { + Serial.print("Slider 2 = "); Serial.println(s2.getSliderPosition()); + } + } + scanTime = millis(); + } + + //s1.moveTo(random(101)); + //delay(250); + //s2.moveTo(random(101)); + //delay(250); +} + + + + + +void touch_calibrate() +{ + uint16_t calData[5]; + uint8_t calDataOK = 0; + + // check file system exists + if (!LittleFS.begin()) { + Serial.println("formatting file system"); + LittleFS.format(); + LittleFS.begin(); + } + + // check if calibration file exists and size is correct + if (LittleFS.exists(CALIBRATION_FILE)) { + if (REPEAT_CAL) + { + // Delete if we want to re-calibrate + LittleFS.remove(CALIBRATION_FILE); + } + else + { + File f = LittleFS.open(CALIBRATION_FILE, "r"); + if (f) { + if (f.readBytes((char *)calData, 14) == 14) + calDataOK = 1; + f.close(); + } + } + } + + if (calDataOK && !REPEAT_CAL) { + // calibration data valid + tft.setTouch(calData); + } else { + // data not valid so recalibrate + tft.fillScreen(TFT_BLACK); + tft.setCursor(20, 0); + tft.setTextFont(2); + tft.setTextSize(1); + tft.setTextColor(TFT_WHITE, TFT_BLACK); + + tft.println("Touch corners as indicated"); + + tft.setTextFont(1); + tft.println(); + + if (REPEAT_CAL) { + tft.setTextColor(TFT_RED, TFT_BLACK); + tft.println("Set REPEAT_CAL to false to stop this running again!"); + } + + tft.calibrateTouch(calData, TFT_MAGENTA, TFT_BLACK, 15); + + tft.setTextColor(TFT_GREEN, TFT_BLACK); + tft.println("Calibration complete!"); + + // store data + File f = LittleFS.open(CALIBRATION_FILE, "w"); + if (f) { + f.write((const unsigned char *)calData, 14); + f.close(); + } + } +} diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/Animated_Eyes_1.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/Animated_Eyes_1.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/Animated_Eyes_1.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/Animated_Eyes_1.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/config.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/config.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/config.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/config.h index b99db415..d601d648 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/config.h +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/config.h @@ -64,7 +64,7 @@ // JOYSTICK_X_PIN and JOYSTICK_Y_PIN specify analog input pins for manually // controlling the eye with an analog joystick. If set to -1 or if not // defined, the eye will move on its own. -// IRIS_PIN speficies an analog input pin for a photocell to make pupils +// IRIS_PIN specifies an analog input pin for a photocell to make pupils // react to light (or potentiometer for manual control). If set to -1 or // if not defined, the pupils will change on their own. // BLINK_PIN specifies an input pin for a button (to ground) that will diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/catEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/catEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/catEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/catEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/defaultEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/defaultEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/defaultEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/defaultEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/doeEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/doeEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/doeEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/doeEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/dragonEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/dragonEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/dragonEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/dragonEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/goatEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/goatEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/goatEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/goatEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/logo.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/logo.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/logo.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/logo.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/naugaEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/naugaEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/naugaEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/naugaEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/newtEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/newtEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/newtEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/newtEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/noScleraEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/noScleraEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/noScleraEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/noScleraEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/owlEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/owlEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/owlEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/owlEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/terminatorEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/terminatorEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/data/terminatorEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/data/terminatorEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/eye_functions.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/eye_functions.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/eye_functions.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/eye_functions.ino index 96a583ef..2db27dc0 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/eye_functions.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/eye_functions.ino @@ -11,7 +11,7 @@ // boards and WILL NOT work on normal Arduino or other boards! // // SEE FILE "config.h" FOR MOST CONFIGURATION (graphics, pins, display type, -// etc). Probably won't need to edit THIS file unless you're doing some +// etc.). Probably won't need to edit THIS file unless you're doing some // extremely custom modifications. // // Adafruit invests time and resources providing this open source code, @@ -91,7 +91,7 @@ void updateEye (void) // EYE-RENDERING FUNCTION -------------------------------------------------- void drawEye( // Renders one eye. Inputs must be pre-clipped & valid. - // Use native 32 bit variables where possible as this is 10% faster! + // Use native 32-bit variables where possible as this is 10% faster! uint8_t e, // Eye array index; 0 or 1 for left/right uint32_t iScale, // Scale factor for iris uint32_t scleraX, // First pixel X offset into sclera image diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user_bat.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user_bat.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user_bat.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user_bat.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user_xmas.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user_xmas.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/user_xmas.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_1/user_xmas.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/Animated_Eyes_2.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/Animated_Eyes_2.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/Animated_Eyes_2.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/Animated_Eyes_2.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/config.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/config.h similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/config.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/config.h index e7e29e26..d519c9ff 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/config.h +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/config.h @@ -64,7 +64,7 @@ // JOYSTICK_X_PIN and JOYSTICK_Y_PIN specify analog input pins for manually // controlling the eye with an analog joystick. If set to -1 or if not // defined, the eye will move on its own. -// IRIS_PIN speficies an analog input pin for a photocell to make pupils +// IRIS_PIN specifies an analog input pin for a photocell to make pupils // react to light (or potentiometer for manual control). If set to -1 or // if not defined, the pupils will change on their own. // BLINK_PIN specifies an input pin for a button (to ground) that will diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/catEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/catEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/catEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/catEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/defaultEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/defaultEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/defaultEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/defaultEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/doeEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/doeEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/doeEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/doeEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/dragonEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/dragonEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/dragonEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/dragonEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/goatEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/goatEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/goatEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/goatEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/logo.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/logo.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/logo.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/logo.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/naugaEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/naugaEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/naugaEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/naugaEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/newtEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/newtEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/newtEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/newtEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/noScleraEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/noScleraEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/noScleraEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/noScleraEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/owlEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/owlEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/owlEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/owlEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/terminatorEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/terminatorEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/data/terminatorEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/data/terminatorEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/eye_functions.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/eye_functions.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/eye_functions.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/eye_functions.ino index 96a583ef..2db27dc0 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_1/eye_functions.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/eye_functions.ino @@ -11,7 +11,7 @@ // boards and WILL NOT work on normal Arduino or other boards! // // SEE FILE "config.h" FOR MOST CONFIGURATION (graphics, pins, display type, -// etc). Probably won't need to edit THIS file unless you're doing some +// etc.). Probably won't need to edit THIS file unless you're doing some // extremely custom modifications. // // Adafruit invests time and resources providing this open source code, @@ -91,7 +91,7 @@ void updateEye (void) // EYE-RENDERING FUNCTION -------------------------------------------------- void drawEye( // Renders one eye. Inputs must be pre-clipped & valid. - // Use native 32 bit variables where possible as this is 10% faster! + // Use native 32-bit variables where possible as this is 10% faster! uint8_t e, // Eye array index; 0 or 1 for left/right uint32_t iScale, // Scale factor for iris uint32_t scleraX, // First pixel X offset into sclera image diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user_bat.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user_bat.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user_bat.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user_bat.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user_xmas.cpp b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user_xmas.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/user_xmas.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/user_xmas.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/wiring.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/wiring.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Animated_Eyes_2/wiring.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Animated_Eyes_2/wiring.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/Baboon40.jpg b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/Baboon40.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/Baboon40.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/Baboon40.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/EagleEye.jpg b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/EagleEye.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/EagleEye.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/EagleEye.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/Mouse480.jpg b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/Mouse480.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/Mouse480.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/Mouse480.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/lena20k.jpg b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/lena20k.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/Data/lena20k.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/Data/lena20k.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino index 3c30f1d7..d64775c8 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP32_SDcard_jpeg/ESP32_SDcard_jpeg.ino @@ -36,7 +36,7 @@ void setup() { tft.begin(); - if (!SD.begin()) { + if (!SD.begin(5, tft.getSPIinstance())) { Serial.println("Card Mount Failed"); return; } @@ -249,7 +249,7 @@ void jpegInfo() { // Show the execution time (optional) //#################################################################################################### // WARNING: for UNO/AVR legacy reasons printing text to the screen with the Mega might not work for -// sketch sizes greater than ~70KBytes because 16 bit address pointers are used in some libraries. +// sketch sizes greater than ~70KBytes because 16-bit address pointers are used in some libraries. // The Due will work fine with the HX8357_Due library. diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino index c78e0bff..7cc3db2c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/ESP8266_uncannyEyes.ino @@ -120,7 +120,7 @@ void setup(void) { // EYE-RENDERING FUNCTION -------------------------------------------------- #define BUFFER_SIZE 256 // 64 to 512 seems optimum = 30 fps for default eye void drawEye( // Renders one eye. Inputs must be pre-clipped & valid. - // Use native 32 bit variables where possible as this is 10% faster! + // Use native 32-bit variables where possible as this is 10% faster! uint8_t e, // Eye array index; 0 or 1 for left/right uint32_t iScale, // Scale factor for iris uint32_t scleraX, // First pixel X offset into sclera image @@ -134,7 +134,7 @@ void drawEye( // Renders one eye. Inputs must be pre-clipped & valid. uint32_t d; uint32_t pixels = 0; - uint16_t pbuffer[BUFFER_SIZE]; // This one needs to be 16 bit + uint16_t pbuffer[BUFFER_SIZE]; // This one needs to be 16-bit // Set up raw pixel dump to entire screen. Although such writes can wrap // around automatically from end of rect back to beginning, the region is diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/defaultEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/defaultEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/defaultEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/defaultEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/dragonEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/dragonEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/dragonEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/dragonEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/goatEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/goatEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/goatEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/goatEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/noScleraEye.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/noScleraEye.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/noScleraEye.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/noScleraEye.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino index daa60ac6..9dd98f3a 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/ESP8266_uncannyEyes/screenshotToConsole.ino @@ -58,7 +58,7 @@ void screenshotToConsole() // Get first pixel to prime the Run Length Encoded // Function format is: tft.readRectRGB( x, y, width, height, buffer); - // color is a pointer to a buffer that the RGB 8 bit values are piped into + // color is a pointer to a buffer that the RGB 8-bit values are piped into // the buffer size must be >= (width * height * 3) bytes eye[e].tft.readRectRGB(0, 0, 1, 1, color); // 1 x 1 so reading 1 pixel at 0,0 diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Gradient_Fill/Gradient_Fill.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Gradient_Fill/Gradient_Fill.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Gradient_Fill/Gradient_Fill.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Gradient_Fill/Gradient_Fill.ino diff --git a/libraries/TFT_eSPI-2.5.43/examples/Generic/Julia_Set/Julia_Set.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Julia_Set/Julia_Set.ino new file mode 100644 index 00000000..01ac79ca --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Julia_Set/Julia_Set.ino @@ -0,0 +1,83 @@ +// Based on sketch here: +// https://github.com/OpenHDZ/Arduino-experimentation +// Adapted for TFT_eSPI library + +// Note: a high number of floating point calculations are needed +// for each pixel so rendering will be quite slow. +// For best performance use a Teensy 4.x (600MHz CPU clock). + +#include // Hardware-specific library + +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library + +const uint16_t MAX_ITERATION = 300; // Nombre de couleurs + +#define SCREEN_WIDTH tft.width() // +#define SCREEN_HEIGHT tft.height() // Taille de l'écran + +static float zoom = 0.5; + +/* Fonction setup */ +void setup() { +/* Initialise l'écran LCD */ + tft.begin(); + tft.setRotation(1); + tft.fillScreen(TFT_BLACK); + tft.setFreeFont(&FreeMono9pt7b); +} + +/* Fonction loop() */ +void loop() { + /* Dessine la fractale */ + draw_Julia(-0.8,+0.156,zoom); + tft.fillRect(0, 0, 150, 20, TFT_BLACK); + tft.setCursor(0,15); + tft.setTextColor(TFT_WHITE); + tft.print(" Zoom = "); + tft.println(zoom); + delay(2000); + zoom *= 1.5; + if (zoom > 100) zoom = 0.5; +} + +/* + Dessine une fractale de Julia + */ + +void draw_Julia(float c_r, float c_i, float zoom) { + + tft.setCursor(0,0); + float new_r = 0.0, new_i = 0.0, old_r = 0.0, old_i = 0.0; + + /* Pour chaque pixel en X */ + + for(int16_t x = SCREEN_WIDTH/2 - 1; x >= 0; x--) { // Rely on inverted symmetry + /* Pour chaque pixel en Y */ + for(uint16_t y = 0; y < SCREEN_HEIGHT; y++) { + old_r = 1.5 * (x - SCREEN_WIDTH / 2) / (0.5 * zoom * SCREEN_WIDTH); + old_i = (y - SCREEN_HEIGHT / 2) / (0.5 * zoom * SCREEN_HEIGHT); + uint16_t i = 0; + + while ((old_r * old_r + old_i * old_i) < 4.0 && i < MAX_ITERATION) { + new_r = old_r * old_r - old_i * old_i ; + new_i = 2.0 * old_r * old_i; + + old_r = new_r+c_r; + old_i = new_i+c_i; + + i++; + } + /* Affiche le pixel */ + if (i < 100){ + tft.drawPixel(x,y,tft.color565(255,255,map(i,0,100,255,0))); + tft.drawPixel(SCREEN_WIDTH - x - 1,SCREEN_HEIGHT - y - 1,tft.color565(255,255,map(i,0,100,255,0))); + }if(i<200){ + tft.drawPixel(x,y,tft.color565(255,map(i,100,200,255,0),0)); + tft.drawPixel(SCREEN_WIDTH - x - 1,SCREEN_HEIGHT - y - 1,tft.color565(255,map(i,100,200,255,0),0)); + }else{ + tft.drawPixel(x,y,tft.color565(map(i,200,300,255,0),0,0)); + tft.drawPixel(SCREEN_WIDTH - x - 1,SCREEN_HEIGHT - y - 1,tft.color565(map(i,200,300,255,0),0,0)); + } + } + } +} diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Local_Custom_Fonts/Local_Custom_Fonts.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Local_Custom_Fonts/Local_Custom_Fonts.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Local_Custom_Fonts/Local_Custom_Fonts.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Local_Custom_Fonts/Local_Custom_Fonts.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Local_Custom_Fonts/MyFont.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/Local_Custom_Fonts/MyFont.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Local_Custom_Fonts/MyFont.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Local_Custom_Fonts/MyFont.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/On_Off_Button/On_Off_Button.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/On_Off_Button/On_Off_Button.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/On_Off_Button/On_Off_Button.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/On_Off_Button/On_Off_Button.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Button_Label_Datum/TFT_Button_Label_Datum.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Button_Label_Datum/TFT_Button_Label_Datum.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Button_Label_Datum/TFT_Button_Label_Datum.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Button_Label_Datum/TFT_Button_Label_Datum.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Alert.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Alert.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Alert.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Alert.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Close.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Close.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Close.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Close.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Info.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Info.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/Info.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/Info.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino index cde4ecb9..14d52db9 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Flash_Bitmap/TFT_Flash_Bitmap.ino @@ -1,4 +1,4 @@ -// Icon images are stored in tabs ^ e.g. Alert.h etc above this line +// Icon images are stored in tabs ^ e.g. Alert.h etc.above this line // more than one icon can be in a header file // Arrays containing FLASH images can be created with UTFT library tool: diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino index b3905e9d..1d9de1e8 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/BMP_functions.ino @@ -46,7 +46,7 @@ void drawBmp(const char *filename, int16_t x, int16_t y) { bmpFS.read(lineBuffer, sizeof(lineBuffer)); uint8_t* bptr = lineBuffer; uint16_t* tptr = (uint16_t*)lineBuffer; - // Convert 24 to 16 bit colours + // Convert 24 to 16-bit colours for (uint16_t col = 0; col < w; col++) { b = *bptr++; diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/TFT_SPIFFS_BMP.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/TFT_SPIFFS_BMP.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/TFT_SPIFFS_BMP.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/TFT_SPIFFS_BMP.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/data/parrot.bmp b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/data/parrot.bmp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_SPIFFS_BMP/data/parrot.bmp rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_SPIFFS_BMP/data/parrot.bmp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/TFT_Screen_Capture.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/TFT_Screen_Capture.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/TFT_Screen_Capture.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/TFT_Screen_Capture.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/processing_sketch.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/processing_sketch.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/processing_sketch.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/processing_sketch.ino index 3e71f41f..d657a080 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/processing_sketch.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/processing_sketch.ino @@ -63,7 +63,7 @@ int max_allowed = 1000; // Maximum number of save images allowed before a resta // These are default values, this sketch obtains the actual values from the Arduino board int tft_width = 480; // default TFT width (automatic - sent by Arduino) int tft_height = 480; // default TFT height (automatic - sent by Arduino) -int color_bytes = 2; // 2 for 16 bit, 3 for three RGB bytes (automatic - sent by Arduino) +int color_bytes = 2; // 2 for 16-bit, 3 for three RGB bytes (automatic - sent by Arduino) import processing.serial.*; diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/screenServer.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/screenServer.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/screenServer.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/screenServer.ino index 82bbbd7d..733c4ffc 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/TFT_Screen_Capture/screenServer.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/TFT_Screen_Capture/screenServer.ino @@ -2,8 +2,8 @@ // over the serial port. Use a high baud rate, e.g. for an ESP8266: // Serial.begin(921600); -// At 921600 baud a 320 x 240 image with 16 bit colour transfers can be sent to the -// PC client in ~1.67s and 24 bit colour in ~2.5s which is close to the theoretical +// At 921600 baud a 320 x 240 image with 16-bit colour transfers can be sent to the +// PC client in ~1.67s and 24-bit colour in ~2.5s which is close to the theoretical // minimum transfer time. // This sketch has been created to work with the TFT_eSPI library here: @@ -40,7 +40,7 @@ // Number of pixels to send in a burst (minimum of 1), no benefit above 8 // NPIXELS values and render times: -// NPIXELS 1 = use readPixel() = >5s and 16 bit pixels only +// NPIXELS 1 = use readPixel() = >5s and 16-bit pixels only // NPIXELS >1 using rectRead() 2 = 1.75s, 4 = 1.68s, 8 = 1.67s #define NPIXELS 8 // Must be integer division of both TFT width and TFT height @@ -104,7 +104,7 @@ bool serialScreenServer(String filename) wait = false; // No need to wait anymore lastCmdTime = millis(); // Set last received command time - // Send screen size etc using a simple header with delimiters for client checks + // Send screen size etc.using a simple header with delimiters for client checks sendParameters(filename); } } @@ -169,7 +169,7 @@ bool serialScreenServer(String filename) } //==================================================================================== -// Send screen size etc using a simple header with delimiters for client checks +// Send screen size etc.using a simple header with delimiters for client checks //==================================================================================== void sendParameters(String filename) { @@ -183,7 +183,7 @@ void sendParameters(String filename) Serial.write('Y'); // Bits per pixel (16 or 24) if (NPIXELS > 1) Serial.write(BITS_PER_PIXEL); - else Serial.write(16); // readPixel() only provides 16 bit values + else Serial.write(16); // readPixel() only provides 16-bit values Serial.write('?'); // Filename next Serial.print(filename); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Touch_calibrate/Touch_calibrate.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Touch_calibrate/Touch_calibrate.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Touch_calibrate/Touch_calibrate.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Touch_calibrate/Touch_calibrate.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_Demo/Viewport_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_Demo/Viewport_Demo.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_Demo/Viewport_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_Demo/Viewport_Demo.ino index 83916520..07d43df6 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_Demo/Viewport_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_Demo/Viewport_Demo.ino @@ -10,7 +10,7 @@ // Viewports have a number of potential uses: // - create a "virtual" TFT screen smaller than the actual TFT screen -// - render GUI items (menus etc) in a viewport, erase GUI item by redrawing whole screen, +// - render GUI items (menus etc.) in a viewport, erase GUI item by redrawing whole screen, // this will be fast because only the viewport will be refreshed (e.g. clearing menu) // - limit screen refresh to a particular area, e.g. changing numbers, icons or graph plotting // - showing a small portion of a larger image or sprite, this allows panning and scrolling diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_Demo/Viewport_commands.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_Demo/Viewport_commands.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_Demo/Viewport_commands.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_Demo/Viewport_commands.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_graphicstest/Viewport_graphicstest.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_graphicstest/Viewport_graphicstest.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/Viewport_graphicstest/Viewport_graphicstest.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/Viewport_graphicstest/Viewport_graphicstest.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino similarity index 93% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino index f267195f..a436dcc5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Generic/alphaBlend_Test/alphaBlend_Test.ino @@ -6,7 +6,7 @@ blendedColor = tft.alphaBlend(alpha, fg_color, bg_color); - The alphaBlend() function operates on 16 bit colours only + The alphaBlend() function operates on 16-bit colours only A test is included where the colours are mapped to 8 bits after blending Information on alpha blending is here @@ -43,7 +43,7 @@ void setup(void) { // ------------------------------------------------------------------------- void loop() { - // 16 bit colours (5 bits red, 6 bits green, 5 bits blue) + // 16-bit colours (5 bits red, 6 bits green, 5 bits blue) // Blend from white to full spectrum for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground { @@ -79,18 +79,18 @@ void loop() delay(4000); //* - // Decrease to 8 bit colour (3 bits red, 3 bits green, 2 bits blue) + // Decrease to 8-bit colour (3 bits red, 3 bits green, 2 bits blue) // Blend from white to full spectrum for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground { - // Convert blended 16 bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying + // Convert blended 16-bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying for (int c = 0; c < 192; c++) tft.drawPixel(c, a/2, tft.color8to16(tft.color16to8(tft.alphaBlend(a, rainbow(c), 0xFFFF)))); } // Blend from full spectrum to black for (int a = 255; a > 2; a-=2) { - // Convert blended 16 bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying + // Convert blended 16-bit colour to 8 bits to reduce colour resolution, then map back to 16 bits for displaying for (int c = 0; c < 192; c++) tft.drawPixel(c, 128 + (255-a)/2, tft.color8to16(tft.color16to8(tft.alphaBlend(a, rainbow(c), 0)))); } @@ -108,7 +108,7 @@ void loop() //*/ /* - // 16 bit colours (5 bits red, 6 bits green, 5 bits blue) + // 16-bit colours (5 bits red, 6 bits green, 5 bits blue) for (int a = 0; a < 256; a+=2) // Alpha 0 = 100% background, alpha 255 = 100% foreground { for (int c = 0; c < 192; c++) tft.drawPixel(c, a/2, tft.alphaBlend(a, rainbow(c), TFT_CYAN)); @@ -137,7 +137,7 @@ void loop() // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { @@ -147,7 +147,7 @@ unsigned int rainbow(byte value) value = value%192; - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/drawXBitmap/drawXBitmap.ino b/libraries/TFT_eSPI-2.5.43/examples/Generic/drawXBitmap/drawXBitmap.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/drawXBitmap/drawXBitmap.ino rename to libraries/TFT_eSPI-2.5.43/examples/Generic/drawXBitmap/drawXBitmap.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Generic/drawXBitmap/xbm.h b/libraries/TFT_eSPI-2.5.43/examples/Generic/drawXBitmap/xbm.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Generic/drawXBitmap/xbm.h rename to libraries/TFT_eSPI-2.5.43/examples/Generic/drawXBitmap/xbm.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/Flash_PNG/Flash_PNG.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_PNG/Flash_PNG.ino similarity index 86% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/Flash_PNG/Flash_PNG.ino rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_PNG/Flash_PNG.ino index 6fcbadbc..91d71bf2 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/Flash_PNG/Flash_PNG.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_PNG/Flash_PNG.ino @@ -2,6 +2,10 @@ // This example renders a png file that is stored in a FLASH array // using the PNGdec library (available via library manager). +// Note: The PNGDEC required lots of RAM to work (~40kbytes) so +// this sketch is will not run on smaller memory processors (e.g. +// ESP8266, STM32F103 etc.) + // Image files can be converted to arrays using the tool here: // https://notisrac.github.io/FileToCArray/ // To use this tool: @@ -14,11 +18,11 @@ // Include the PNG decoder library #include -#include "panda.h" // Image is stored here in an 8 bit array +#include "panda.h" // Image is stored here in an 8-bit array -PNG png; // PNG decoder inatance +PNG png; // PNG decoder instance -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -50,7 +54,7 @@ void loop() { int16_t rc = png.openFLASH((uint8_t *)panda, sizeof(panda), pngDraw); if (rc == PNG_SUCCESS) { - Serial.println("Successfully png file"); + Serial.println("Successfully opened png file"); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); tft.startWrite(); uint32_t dt = millis(); @@ -72,7 +76,7 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/Flash_PNG/panda.h b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_PNG/panda.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/Flash_PNG/panda.h rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_PNG/panda.h diff --git a/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino new file mode 100644 index 00000000..366e3296 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/Flash_transparent_PNG.ino @@ -0,0 +1,90 @@ + +// This example renders a png file that is stored in a FLASH array +// using the PNGdec library (available via library manager). + +// Note: The PNGDEC required lots of RAM to work (~40kbytes) so +// this sketch is will not run on smaller memory processors (e.g. +// ESP8266, STM32F103 etc.) + +// The example png is encoded as ARGB 8 bits per pixel with indexed colour +// It was created using GIMP and has a transparent background area. + +// Image files can be converted to arrays using the tool here: +// https://notisrac.github.io/FileToCArray/ +// To use this tool: +// 1. Drag and drop PNG image file on "Browse..." button +// 2. Tick box "Treat as binary" +// 3. Click "Convert" +// 4. Click "Save as file" and move the header file to sketch folder +// (alternatively use the "Copy to clipboard" and paste into a new tab) +// 5. Open the sketch in IDE +// 6. Include the header file containing the array (SpongeBob.h in this example) + +// Include the PNG decoder library, available via the IDE library manager +#include + +// Include image array +#include "SpongeBob.h" + +PNG png; // PNG decoder instance + +#define MAX_IMAGE_WIDTH 240 // Sets rendering line buffer lengths, adjust for your images + +// Include the TFT library - see https://github.com/Bodmer/TFT_eSPI for library information +#include "SPI.h" +#include // Hardware-specific library +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library + +// Position variables must be global (PNGdec does not handle position coordinates) +int16_t xpos = 0; +int16_t ypos = 0; + +//==================================================================================== +// Setup +//==================================================================================== +void setup() +{ + Serial.begin(115200); + Serial.println("\n\n Using the PNGdec library"); + + // Initialise the TFT + tft.begin(); + tft.fillScreen(TFT_BLACK); + + Serial.println("\r\nInitialisation done."); +} + +//==================================================================================== +// Loop +//==================================================================================== +void loop() +{ + uint16_t pngw = 0, pngh = 0; // To store width and height of image + + int16_t rc = png.openFLASH((uint8_t *)bob, sizeof(bob), pngDraw); + + if (rc == PNG_SUCCESS) { + Serial.println("Successfully opened png file"); + pngw = png.getWidth(); + pngh = png.getHeight(); + Serial.printf("Image metrics: (%d x %d), %d bpp, pixel type: %d\n", pngw, pngh, png.getBpp(), png.getPixelType()); + + tft.startWrite(); + uint32_t dt = millis(); + rc = png.decode(NULL, 0); + tft.endWrite(); + Serial.print(millis() - dt); Serial.println("ms"); + tft.endWrite(); + + // png.close(); // Required for files, not needed for FLASH arrays + } + + delay(250); + + // Randomly change position + xpos = random(tft.width() - pngw); + ypos = random(tft.height() - pngh); + + // Fill screen with a random colour at random intervals + if (random(100) < 20) tft.fillScreen(random(0x10000)); +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h new file mode 100644 index 00000000..7aa29e9d --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/SpongeBob.h @@ -0,0 +1,1355 @@ +// array size is 21621 +static const unsigned char bob[] PROGMEM = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, + 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x76, 0x08, 0x06, 0x00, 0x00, 0x00, 0x03, 0x6e, 0x57, + 0xa2, 0x00, 0x00, 0x20, 0x00, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xec, 0xbd, 0x77, 0x98, 0x64, + 0x65, 0x99, 0xf7, 0xff, 0x79, 0xce, 0x39, 0x75, 0x2a, 0xc7, 0xee, 0xea, 0x9c, 0xe3, 0xf4, 0xe4, + 0xc0, 0x24, 0x60, 0x80, 0x95, 0x8c, 0x60, 0x00, 0x03, 0x20, 0x71, 0xdd, 0x55, 0x56, 0x57, 0xd6, + 0xb0, 0xbe, 0xee, 0xeb, 0xba, 0x2a, 0x86, 0x75, 0x55, 0x44, 0x74, 0x5d, 0xc5, 0x35, 0x80, 0xa0, + 0xa2, 0x20, 0x92, 0x83, 0x3a, 0x30, 0xc0, 0x00, 0x33, 0x30, 0x39, 0x31, 0xd3, 0x93, 0x3a, 0xe7, + 0xea, 0x50, 0x5d, 0xb9, 0xea, 0x9c, 0xf3, 0xfc, 0xfe, 0xa8, 0xea, 0xea, 0xee, 0x09, 0xb8, 0xeb, + 0xbe, 0x2b, 0xfa, 0xbb, 0x3c, 0x73, 0xd5, 0xd5, 0x5d, 0x53, 0xd5, 0xa7, 0xce, 0x73, 0xee, 0xe7, + 0x4e, 0xdf, 0xfb, 0x7b, 0xdf, 0x05, 0x7f, 0x39, 0xfe, 0x72, 0xfc, 0xe5, 0xf8, 0xcb, 0xf1, 0x97, + 0xe3, 0x2f, 0xc7, 0x5f, 0x8e, 0xbf, 0x1c, 0x7f, 0x39, 0xfe, 0x72, 0xfc, 0xe5, 0xf8, 0xef, 0x1d, + 0xe2, 0x7f, 0xf4, 0xd7, 0x12, 0xd1, 0x76, 0xa8, 0x62, 0xc9, 0x59, 0xbb, 0xd5, 0x4a, 0xaf, 0x36, + 0xc5, 0xa0, 0x51, 0x25, 0x9f, 0xba, 0x60, 0x60, 0x38, 0xa9, 0x67, 0x86, 0xf0, 0x9b, 0x63, 0x00, + 0x8c, 0x7b, 0xaa, 0xce, 0x7d, 0xb9, 0xa5, 0xb5, 0x75, 0x7a, 0xdc, 0x95, 0xb4, 0x05, 0xde, 0x6d, + 0x1f, 0x31, 0xc2, 0x8a, 0x0d, 0xb2, 0x6d, 0xe3, 0xdb, 0xa6, 0x33, 0xb6, 0xa7, 0x1f, 0xbd, 0x64, + 0xf4, 0xd8, 0xda, 0x07, 0xcf, 0x2a, 0x6d, 0x9a, 0x98, 0x6a, 0x54, 0x3a, 0xfa, 0x56, 0xb9, 0x8f, + 0x95, 0xac, 0x77, 0xeb, 0xe3, 0xa8, 0xfa, 0x38, 0x42, 0x80, 0x02, 0x18, 0xd9, 0x0a, 0xc6, 0x6d, + 0xbe, 0x83, 0x87, 0xeb, 0xf9, 0xdd, 0xd6, 0xf6, 0xfe, 0x8c, 0xe5, 0xcd, 0xbd, 0x06, 0x0e, 0x61, + 0x8f, 0x99, 0x67, 0x65, 0xdc, 0xc6, 0xbe, 0xd5, 0xcf, 0x2c, 0x08, 0x37, 0xf7, 0xcb, 0xea, 0xd2, + 0xd2, 0x1e, 0x24, 0xd3, 0xe4, 0x72, 0xa0, 0x08, 0xb0, 0xcc, 0x1a, 0xf6, 0xb6, 0x3a, 0x8c, 0xad, + 0x0b, 0xfb, 0xfa, 0xf0, 0x65, 0x0e, 0x17, 0xaf, 0x7b, 0xca, 0xdb, 0x2c, 0xac, 0x6c, 0x75, 0x70, + 0xd2, 0x3b, 0x74, 0xd9, 0x6b, 0x81, 0x16, 0x33, 0x64, 0xbd, 0xc3, 0x79, 0x44, 0xaf, 0x92, 0xd2, + 0x20, 0x59, 0xe2, 0xca, 0x7a, 0x45, 0xe4, 0xee, 0xe3, 0x41, 0x77, 0xf7, 0x73, 0x1b, 0x7a, 0x62, + 0x8e, 0x8c, 0xad, 0x2d, 0xed, 0x15, 0x2f, 0x61, 0x8b, 0xa7, 0x00, 0x88, 0x7b, 0x1b, 0xb4, 0xac, + 0xd9, 0x60, 0x04, 0x33, 0x7b, 0xc0, 0x4c, 0x22, 0xc8, 0x20, 0x85, 0x0b, 0xa4, 0x1d, 0xc1, 0xe4, + 0xff, 0xaf, 0x04, 0x7c, 0xd5, 0xd3, 0x95, 0x6f, 0x5d, 0xd0, 0xaf, 0x3d, 0x10, 0x8a, 0x8e, 0xb9, + 0x74, 0x1b, 0xa0, 0x7a, 0x98, 0x56, 0x8d, 0x6c, 0xc4, 0x1e, 0x48, 0x25, 0x1b, 0x7b, 0xd2, 0x18, + 0x0e, 0x51, 0x7a, 0xa8, 0xca, 0xe5, 0x35, 0x26, 0x3d, 0x41, 0xbb, 0x4a, 0x6d, 0x55, 0x10, 0x87, + 0x5d, 0x67, 0x7c, 0x72, 0x9a, 0xc8, 0xf8, 0x04, 0xd3, 0x66, 0xd6, 0xb0, 0xec, 0xd9, 0x04, 0x19, + 0xbf, 0xae, 0x65, 0x84, 0xd3, 0xa6, 0xc5, 0xf1, 0xb8, 0xbc, 0x94, 0x04, 0x7d, 0xf8, 0xfd, 0x5e, + 0x84, 0x80, 0xe8, 0x74, 0x82, 0xe1, 0xe1, 0x31, 0x92, 0x99, 0x0c, 0x19, 0xbb, 0x8b, 0xa8, 0xa8, + 0x93, 0xb1, 0xc6, 0xa9, 0x09, 0xb4, 0xac, 0x70, 0x1d, 0x2b, 0x0b, 0x79, 0xad, 0x81, 0x98, 0x6e, + 0x66, 0x75, 0x97, 0x74, 0xda, 0x43, 0x21, 0x0d, 0x87, 0xdd, 0x46, 0x30, 0xe0, 0xc5, 0x30, 0x2d, + 0xc6, 0x27, 0xe2, 0x0c, 0x27, 0x52, 0x0c, 0xdb, 0x9c, 0xe9, 0x68, 0xd3, 0x40, 0x54, 0x28, 0x16, + 0x02, 0x81, 0x2d, 0xb2, 0xd0, 0xeb, 0x1e, 0xc8, 0x38, 0x3d, 0x6a, 0x6f, 0xda, 0x6b, 0x78, 0x9c, + 0x65, 0x21, 0x17, 0x15, 0x65, 0x41, 0x02, 0x21, 0x0f, 0xb9, 0x6c, 0x8e, 0x9e, 0xbe, 0x71, 0xba, + 0xc7, 0xc6, 0x32, 0x49, 0x61, 0x33, 0xe3, 0xb2, 0xd6, 0x95, 0x6c, 0x1e, 0x9f, 0x30, 0x3d, 0x03, + 0x39, 0x10, 0xe8, 0xc3, 0x1d, 0x5e, 0xd7, 0x90, 0xe5, 0xf2, 0xa8, 0x3d, 0x51, 0x45, 0xa4, 0x4c, + 0x45, 0x2a, 0x86, 0x54, 0x14, 0xdb, 0x94, 0xc3, 0xa7, 0x0c, 0xd6, 0xca, 0x57, 0xba, 0x82, 0xe2, + 0xb6, 0xcd, 0xa5, 0xfa, 0x36, 0x1a, 0x86, 0xad, 0x3f, 0x6b, 0x01, 0x5f, 0xfc, 0xc8, 0xaa, 0x0d, + 0x67, 0x0e, 0x8c, 0xfd, 0xa6, 0x4a, 0x99, 0x70, 0x9e, 0xb3, 0x61, 0x25, 0x95, 0xe5, 0x7e, 0x6c, + 0xba, 0x46, 0x3a, 0x99, 0x65, 0x32, 0x9a, 0x64, 0x62, 0x3c, 0x81, 0x94, 0x12, 0xb7, 0xc7, 0x41, + 0x28, 0xe4, 0xc2, 0xef, 0x73, 0x61, 0xb7, 0x69, 0x08, 0x04, 0x12, 0x49, 0x32, 0x9d, 0x25, 0x12, + 0x89, 0x11, 0x89, 0xc4, 0xb1, 0xa4, 0xc4, 0xe3, 0xb1, 0x13, 0x2e, 0xf5, 0xe0, 0xf5, 0x3a, 0xd1, + 0x35, 0x0d, 0x21, 0x00, 0x09, 0x12, 0x48, 0xa6, 0xb3, 0x8c, 0x8c, 0x4e, 0x33, 0x32, 0x12, 0x25, + 0x1a, 0x4d, 0x22, 0x25, 0xe8, 0x36, 0x15, 0x9f, 0xdf, 0x89, 0xdf, 0xe7, 0x22, 0x18, 0x74, 0xe2, + 0x76, 0x3b, 0xb0, 0xdb, 0x6d, 0x28, 0x42, 0x20, 0x0a, 0xcb, 0xb2, 0xa4, 0x24, 0x95, 0xce, 0x12, + 0x19, 0x8b, 0x31, 0x30, 0x38, 0xc9, 0xe8, 0xe8, 0x14, 0xa9, 0x64, 0x16, 0x97, 0xdb, 0x4e, 0xb8, + 0xdc, 0x4f, 0x65, 0x79, 0x80, 0x70, 0xd8, 0x83, 0xd3, 0x69, 0x27, 0x67, 0x09, 0x14, 0xcb, 0x42, + 0xd7, 0x14, 0x2c, 0x60, 0x2a, 0x9a, 0xa0, 0xb7, 0x6f, 0x82, 0xd1, 0xd1, 0x69, 0xa6, 0x26, 0x63, + 0x98, 0x86, 0x09, 0x02, 0x9c, 0x2e, 0x07, 0x3e, 0xbf, 0x8b, 0x80, 0xdf, 0x4d, 0x69, 0xa9, 0x07, + 0x8f, 0x5b, 0x47, 0x00, 0xd9, 0xac, 0x49, 0x5f, 0xef, 0x24, 0x2f, 0x77, 0xf7, 0xf3, 0x5a, 0x43, + 0xfc, 0xbb, 0x7b, 0x1b, 0x92, 0x1f, 0xdb, 0x5f, 0x67, 0x66, 0xff, 0x2c, 0x05, 0x7c, 0xc1, 0x53, + 0xb5, 0xda, 0xa2, 0xd1, 0xdc, 0x83, 0xcd, 0xe3, 0xa3, 0x6f, 0x2f, 0x2f, 0x2f, 0x17, 0x6f, 0xbb, + 0x6c, 0x2d, 0x76, 0x9b, 0x0a, 0x42, 0x80, 0x94, 0x20, 0x04, 0x42, 0x14, 0x4e, 0x2d, 0x65, 0xe1, + 0x87, 0x44, 0x08, 0x81, 0x2c, 0x9a, 0xf7, 0xfc, 0x73, 0x0a, 0xef, 0x93, 0x85, 0xf7, 0xe5, 0xdf, + 0x31, 0xff, 0xb2, 0x0a, 0xa7, 0x2c, 0x5c, 0xb1, 0x28, 0xfa, 0x07, 0x13, 0xb0, 0x2c, 0x89, 0x76, + 0xc2, 0x8a, 0x84, 0x04, 0x89, 0x28, 0x5c, 0xce, 0xcc, 0xe7, 0xe4, 0xcf, 0x33, 0xf3, 0x5c, 0xa8, + 0x02, 0x69, 0x4a, 0x90, 0x92, 0xe9, 0x94, 0xc5, 0x57, 0xbe, 0x76, 0x80, 0x35, 0xab, 0x4b, 0x79, + 0xfb, 0xa5, 0x95, 0x28, 0x85, 0xdd, 0x65, 0x29, 0x02, 0x55, 0x51, 0xb0, 0x4c, 0x93, 0x99, 0x0b, + 0x17, 0x85, 0xb5, 0x49, 0x40, 0x48, 0x39, 0x6f, 0x3d, 0x08, 0xc1, 0x54, 0x2c, 0xc5, 0x33, 0xaf, + 0xec, 0x95, 0xcf, 0x94, 0x0d, 0x7d, 0xaf, 0x33, 0x64, 0xdc, 0xfa, 0xea, 0x22, 0xcc, 0x37, 0x53, + 0xc0, 0xca, 0x1f, 0xf2, 0x47, 0x21, 0x93, 0x15, 0xe5, 0xb1, 0xec, 0xa5, 0x42, 0xd5, 0x44, 0x26, + 0x6b, 0x92, 0xc9, 0x19, 0xc5, 0xdd, 0x22, 0x44, 0x5e, 0x7f, 0xa4, 0x94, 0xc5, 0x87, 0x29, 0x25, + 0x13, 0x89, 0x34, 0x7d, 0xe3, 0x51, 0xa6, 0x53, 0x99, 0xbc, 0x30, 0xe7, 0x6e, 0x00, 0xcb, 0x42, + 0x48, 0x89, 0x90, 0xf2, 0xd4, 0x7b, 0x4e, 0xe4, 0xb5, 0xd1, 0x90, 0x12, 0x69, 0x59, 0x20, 0x25, + 0x39, 0x43, 0xf2, 0xe0, 0x43, 0x7d, 0xfc, 0xfa, 0xf1, 0x21, 0x64, 0xe1, 0x5c, 0x16, 0x70, 0xe8, + 0x78, 0x9c, 0xc9, 0xb8, 0xc1, 0x8c, 0x44, 0x66, 0x37, 0x5a, 0xe1, 0xfa, 0x80, 0x74, 0xc6, 0xe0, + 0x85, 0x57, 0x22, 0x4c, 0xc5, 0x72, 0x00, 0x38, 0xec, 0x02, 0x84, 0xc2, 0x81, 0xd7, 0xa7, 0xc8, + 0x19, 0x32, 0x2f, 0x5c, 0xe0, 0xbe, 0x9f, 0xf7, 0xf0, 0xc0, 0xc3, 0x7d, 0xe4, 0x4c, 0x89, 0x22, + 0x44, 0xc1, 0x3a, 0x14, 0x36, 0xa3, 0x2c, 0x8a, 0x16, 0x6b, 0xe6, 0x77, 0x29, 0xf1, 0x7b, 0x1c, + 0xac, 0x5b, 0xd8, 0x22, 0x96, 0xed, 0x2d, 0xbb, 0xa5, 0x64, 0xa2, 0xf1, 0x43, 0x6f, 0xb6, 0x06, + 0xff, 0xb7, 0x05, 0x7c, 0xd9, 0x0b, 0x5e, 0x51, 0x93, 0x98, 0x7c, 0x8b, 0x27, 0x13, 0xb7, 0x35, + 0xb5, 0x9c, 0x85, 0xc7, 0xd7, 0xc4, 0xe0, 0xd0, 0x54, 0xfe, 0x76, 0xce, 0x59, 0xf4, 0xcc, 0x82, + 0x25, 0x30, 0x30, 0x31, 0xcd, 0xa6, 0x03, 0x47, 0x78, 0xf9, 0x70, 0x17, 0x1b, 0xf7, 0x1d, 0x66, + 0x6f, 0xdf, 0x08, 0x19, 0xc3, 0x2c, 0x68, 0xed, 0xc9, 0x7f, 0x73, 0xd2, 0x79, 0x80, 0xdd, 0x07, + 0x63, 0x7c, 0xfb, 0xbb, 0x47, 0x49, 0x65, 0x2d, 0xa4, 0x94, 0x28, 0x02, 0x5c, 0x6e, 0x8d, 0x57, + 0xb7, 0x8e, 0x91, 0xcc, 0x98, 0x48, 0x09, 0x39, 0x09, 0xbf, 0x7e, 0xb4, 0x8f, 0x5d, 0x7b, 0xa7, + 0x4e, 0xbd, 0xb2, 0xc2, 0xf5, 0x4c, 0x27, 0x2d, 0xbe, 0x79, 0xe7, 0x21, 0x9e, 0x7d, 0x71, 0x14, + 0x4b, 0x80, 0xa6, 0x29, 0x34, 0x36, 0x79, 0xd8, 0xbf, 0x7f, 0x8a, 0x44, 0xca, 0x44, 0x2a, 0x82, + 0x74, 0x4e, 0xb2, 0xf1, 0xb9, 0x21, 0x32, 0x39, 0x89, 0x2a, 0x94, 0x79, 0x97, 0x39, 0xb3, 0x51, + 0x2c, 0x29, 0x19, 0x9e, 0x8a, 0xf3, 0xd2, 0xa1, 0x6e, 0x26, 0x0a, 0x31, 0x98, 0x00, 0x42, 0x41, + 0x17, 0x25, 0x7a, 0x56, 0xa9, 0x9e, 0x9c, 0xfe, 0x60, 0x53, 0x6f, 0x20, 0xf0, 0x67, 0x25, 0xe0, + 0xf2, 0xa8, 0x66, 0x0f, 0xc6, 0x8c, 0xb7, 0xd8, 0xec, 0x3e, 0xa5, 0xa5, 0x6d, 0x11, 0xd5, 0x35, + 0x8d, 0xec, 0xde, 0xdb, 0x4d, 0x3c, 0x99, 0x39, 0x41, 0x54, 0xf9, 0x67, 0xa6, 0x84, 0xae, 0xd1, + 0x09, 0x2c, 0x29, 0xf3, 0xe6, 0x4e, 0x4a, 0x0e, 0x0f, 0x8d, 0xb0, 0xfd, 0x58, 0x3f, 0x19, 0xd3, + 0xca, 0xcb, 0x53, 0xcc, 0xd1, 0xda, 0x39, 0x66, 0x7b, 0xae, 0x89, 0xaf, 0x2c, 0x77, 0xf0, 0xca, + 0xd6, 0x51, 0xf6, 0x1c, 0x88, 0x62, 0x02, 0xc9, 0xac, 0x85, 0xd3, 0xa9, 0x71, 0xe8, 0x70, 0x94, + 0x23, 0x5d, 0x09, 0x26, 0x62, 0x06, 0x86, 0x95, 0xd7, 0x34, 0x39, 0xd7, 0x74, 0x9e, 0xb0, 0x69, + 0x04, 0x50, 0xe2, 0xb7, 0x71, 0xed, 0x35, 0x0d, 0x3c, 0xfd, 0xf4, 0x20, 0x07, 0x0e, 0xc7, 0xf9, + 0xe9, 0x2f, 0xfb, 0x78, 0xe5, 0x95, 0x18, 0xfb, 0xf6, 0x2b, 0x7c, 0xe5, 0x1b, 0x5d, 0x7c, 0xf7, + 0x87, 0x5d, 0x6c, 0x7c, 0x7e, 0x8c, 0x91, 0xd1, 0x34, 0x8b, 0x17, 0xfa, 0x50, 0x84, 0x3c, 0xcd, + 0x66, 0x11, 0xf4, 0x45, 0xa2, 0x8c, 0x44, 0xa7, 0xd9, 0xdf, 0x37, 0x42, 0xce, 0xcc, 0xc7, 0x55, + 0x76, 0x9b, 0x86, 0xd3, 0xe9, 0x20, 0x14, 0xf1, 0xb6, 0xba, 0xb2, 0xfa, 0x92, 0x37, 0x53, 0xc0, + 0xda, 0x7f, 0xf7, 0x0f, 0x22, 0xe5, 0x8e, 0xf3, 0xda, 0xfb, 0x93, 0xe7, 0x95, 0x55, 0xb6, 0xe3, + 0xf3, 0xf9, 0x71, 0xb9, 0x5d, 0x0c, 0x0d, 0xd5, 0xb3, 0x6b, 0x6f, 0x2f, 0xeb, 0x57, 0x37, 0x63, + 0x53, 0x95, 0x82, 0x59, 0xcc, 0x3b, 0x43, 0x05, 0x89, 0xae, 0xaa, 0xf3, 0x4d, 0xaf, 0x84, 0xa1, + 0xa9, 0x28, 0xc7, 0x86, 0x9d, 0x2c, 0xa8, 0x0e, 0xa3, 0xce, 0x73, 0xb2, 0x73, 0xb7, 0x47, 0xc1, + 0xe4, 0x4b, 0x28, 0x0f, 0xd9, 0xb8, 0xe6, 0xbd, 0x8d, 0xdc, 0xf5, 0xfd, 0xc3, 0xfc, 0xae, 0xb9, + 0x94, 0xce, 0x23, 0x61, 0x9c, 0xae, 0x66, 0x96, 0x2e, 0x5b, 0xcf, 0xbf, 0xff, 0xc7, 0x18, 0x91, + 0xb1, 0x5e, 0x6a, 0xaa, 0xfb, 0xe9, 0xed, 0x8d, 0xb0, 0x6a, 0x45, 0x09, 0x52, 0x8a, 0x39, 0xfe, + 0x77, 0xfe, 0x67, 0x0b, 0x21, 0xa9, 0xab, 0x73, 0x71, 0xf8, 0xa8, 0x9f, 0x5f, 0x3f, 0xba, 0x8e, + 0x75, 0xeb, 0xd6, 0xf1, 0x7f, 0x3e, 0x55, 0x87, 0xd3, 0xe9, 0xc0, 0x34, 0x4d, 0x86, 0x87, 0x47, + 0xd8, 0xb7, 0x6f, 0x2f, 0xc1, 0xd0, 0x46, 0x36, 0xbf, 0xdc, 0x4d, 0x45, 0xd8, 0x4e, 0x79, 0xa9, + 0xbd, 0xa8, 0xb9, 0xc5, 0x8d, 0x28, 0x25, 0x42, 0xc9, 0x5f, 0xe3, 0x64, 0x32, 0x49, 0x3c, 0x93, + 0x25, 0xe8, 0x72, 0x60, 0x49, 0x89, 0x65, 0x59, 0xb8, 0x9c, 0x53, 0x38, 0xed, 0x39, 0xfe, 0xac, + 0x04, 0x5c, 0x3a, 0x92, 0x5e, 0xe2, 0xc8, 0x68, 0xb6, 0x86, 0xa6, 0x36, 0x10, 0x02, 0x4d, 0xb3, + 0xb1, 0xe2, 0x8c, 0xf5, 0xec, 0x7c, 0xed, 0x65, 0x0e, 0x74, 0x0e, 0xb1, 0xa4, 0xa3, 0x1a, 0x6d, + 0x66, 0xfd, 0x85, 0x78, 0xb6, 0x3c, 0xe8, 0xa3, 0x7f, 0x62, 0x6a, 0x36, 0xc0, 0x29, 0xdc, 0xf0, + 0x63, 0x23, 0x11, 0x6a, 0x4a, 0xfd, 0xf8, 0xec, 0xfa, 0x49, 0x9e, 0xb7, 0x18, 0x4a, 0xc9, 0xbc, + 0xf3, 0x1c, 0x9b, 0xca, 0x71, 0xe4, 0x58, 0x8e, 0xd6, 0xf6, 0x0f, 0x70, 0xc9, 0xa5, 0x97, 0xf2, + 0xf7, 0x4d, 0x4d, 0xb8, 0xdd, 0x6e, 0x6c, 0x36, 0x1b, 0xb9, 0x5c, 0x8e, 0x64, 0x32, 0x41, 0x57, + 0x57, 0x37, 0xbf, 0xfd, 0xed, 0x6f, 0xf9, 0xde, 0x0f, 0x7e, 0x49, 0xd6, 0x94, 0x9c, 0xbf, 0xa1, + 0x0c, 0xa7, 0x36, 0xf7, 0x64, 0x20, 0x91, 0x6c, 0xdf, 0x33, 0xcd, 0xc3, 0x8f, 0x36, 0xf3, 0xbd, + 0xef, 0xdd, 0xc9, 0x82, 0x05, 0x0b, 0xd0, 0x34, 0x6d, 0x5e, 0xa0, 0xd7, 0xd2, 0xd2, 0xc2, 0x86, + 0x0d, 0x67, 0x73, 0xcd, 0x35, 0xd7, 0xf0, 0xfc, 0xf3, 0xcf, 0xf3, 0xcf, 0x9f, 0xff, 0x1e, 0x1f, + 0x78, 0x7f, 0x92, 0xd5, 0xcb, 0x03, 0xa8, 0x73, 0x36, 0x8b, 0x22, 0xa0, 0xc2, 0xef, 0xa5, 0x7b, + 0x6c, 0x1c, 0x29, 0x25, 0x56, 0x61, 0x57, 0x66, 0x72, 0x26, 0xc9, 0x74, 0x1a, 0x4b, 0x75, 0x49, + 0x48, 0x5b, 0x90, 0x78, 0xd3, 0x04, 0xac, 0xfe, 0x77, 0xde, 0xbc, 0xea, 0x90, 0xcf, 0xdd, 0x3c, + 0x22, 0xef, 0x6a, 0x16, 0x75, 0xa5, 0x8b, 0x96, 0xae, 0x40, 0x55, 0xf3, 0x16, 0x5e, 0x55, 0x35, + 0xca, 0xca, 0xab, 0x38, 0x78, 0xb0, 0x97, 0x64, 0x62, 0x92, 0xf2, 0x72, 0x5f, 0xfe, 0x9e, 0x16, + 0x82, 0x12, 0xa7, 0x6e, 0x63, 0x74, 0x3a, 0x4e, 0x3a, 0x97, 0xcb, 0x47, 0xa0, 0x85, 0x1b, 0x69, + 0x58, 0x16, 0x5e, 0xbb, 0x93, 0x12, 0x8f, 0x73, 0xbe, 0x70, 0x4f, 0x88, 0xc0, 0x07, 0xc7, 0xb3, + 0x7c, 0xe3, 0x9b, 0x39, 0x2e, 0xbc, 0xf8, 0x4b, 0x5c, 0x7d, 0xf5, 0xd5, 0xd4, 0xd6, 0xd6, 0xe2, + 0x70, 0x38, 0x50, 0x55, 0x15, 0x21, 0x04, 0xaa, 0xaa, 0xe2, 0x70, 0x38, 0xa9, 0xac, 0xac, 0x64, + 0xfd, 0xfa, 0xf5, 0x9c, 0x71, 0xc6, 0x05, 0x3c, 0xfd, 0x4c, 0x94, 0x6d, 0xdb, 0xb6, 0xb1, 0x70, + 0x91, 0x07, 0x87, 0x7d, 0xd6, 0x13, 0x75, 0x76, 0x27, 0xf9, 0xe5, 0x43, 0x6d, 0x7c, 0xe2, 0x1f, + 0x6f, 0xa3, 0xa1, 0xa1, 0x01, 0x45, 0x51, 0x8a, 0x9f, 0x37, 0xb3, 0xf9, 0x66, 0xae, 0xd1, 0xe1, + 0x70, 0xd0, 0xde, 0xde, 0xce, 0x92, 0xa5, 0x67, 0x73, 0xdf, 0xcf, 0x8e, 0xa0, 0x6a, 0xbd, 0xd4, + 0xd5, 0x38, 0x0b, 0x5e, 0x24, 0xaf, 0xcf, 0x6e, 0x87, 0x8e, 0x5d, 0xb3, 0x11, 0x72, 0xbb, 0xa8, + 0x0a, 0xfa, 0x50, 0x84, 0x20, 0x9b, 0x35, 0xe8, 0x3c, 0x32, 0x48, 0x04, 0xdd, 0x3a, 0x58, 0x63, + 0xfe, 0x74, 0xe4, 0xdb, 0xc9, 0x9e, 0x3f, 0x7d, 0x01, 0x47, 0x75, 0xd1, 0x3a, 0xa9, 0x5d, 0xbf, + 0xf4, 0xa8, 0xbc, 0x71, 0x65, 0xfb, 0x59, 0x4a, 0xb8, 0xac, 0x6c, 0xde, 0x4d, 0x51, 0x55, 0x95, + 0xb2, 0xf2, 0x2a, 0x5e, 0x3f, 0xd8, 0x8d, 0x66, 0x33, 0x28, 0x09, 0xba, 0x11, 0x14, 0x5e, 0x53, + 0x04, 0x0e, 0xcd, 0xc6, 0x50, 0x34, 0x76, 0x82, 0x16, 0x0b, 0x5c, 0x76, 0x1b, 0x15, 0x41, 0xef, + 0x3c, 0x0d, 0x9e, 0x9b, 0x4e, 0x4d, 0x26, 0x4c, 0xbe, 0x7e, 0x47, 0x82, 0xeb, 0x6e, 0xf8, 0x1a, + 0x6b, 0xd6, 0xac, 0x29, 0x0a, 0xe4, 0x54, 0x8f, 0xfc, 0x66, 0x53, 0x09, 0x85, 0x42, 0xac, 0x5f, + 0xbf, 0x9e, 0xa9, 0xe9, 0x4a, 0x7e, 0x76, 0xff, 0xb3, 0x2c, 0x59, 0x62, 0xc3, 0xe3, 0xd6, 0x88, + 0xa5, 0x2c, 0x7e, 0x70, 0xb7, 0xc5, 0xfb, 0xff, 0xe6, 0x0b, 0x54, 0x55, 0x55, 0xcd, 0xfb, 0xbb, + 0x93, 0x02, 0xf7, 0x39, 0x42, 0x0f, 0x06, 0x83, 0x2c, 0x5f, 0xbe, 0x9a, 0x07, 0x1f, 0xea, 0xc5, + 0xee, 0x38, 0x4e, 0x4d, 0x95, 0xa3, 0x78, 0xbd, 0xaa, 0x80, 0x12, 0xaf, 0x8b, 0x52, 0xaf, 0x0b, + 0x45, 0x14, 0x36, 0xbc, 0xa6, 0x32, 0x15, 0x4d, 0x33, 0x92, 0xee, 0x8d, 0xf7, 0x34, 0x25, 0xef, + 0xea, 0xfb, 0xa6, 0x1c, 0xf9, 0x93, 0x17, 0xf0, 0x86, 0xb7, 0x2e, 0xf6, 0x2f, 0xe9, 0xb7, 0xee, + 0x58, 0x98, 0x2b, 0xaf, 0x5b, 0xb6, 0x62, 0x75, 0x51, 0x7b, 0xe6, 0xde, 0x10, 0x55, 0xd3, 0xf0, + 0xfb, 0x4b, 0x38, 0x74, 0x60, 0x1f, 0x0d, 0x0d, 0x25, 0x68, 0xaa, 0x28, 0x6a, 0xb2, 0xc7, 0x61, + 0x43, 0x55, 0x54, 0xc6, 0xa6, 0xe3, 0x45, 0x0d, 0x06, 0x08, 0x7b, 0xbd, 0x54, 0x04, 0xbc, 0x27, + 0x09, 0x0a, 0x99, 0xcf, 0x73, 0x1f, 0x7c, 0x64, 0x84, 0xa6, 0xd6, 0xbf, 0xe7, 0x9c, 0x73, 0xce, + 0x9d, 0xa7, 0x6d, 0x6f, 0x24, 0x14, 0x00, 0x4d, 0xd3, 0x68, 0x6b, 0x6b, 0xc3, 0xeb, 0x5b, 0xc0, + 0xbd, 0xf7, 0x3d, 0xc3, 0xd2, 0xe5, 0x36, 0x76, 0xed, 0x8d, 0xe2, 0xf6, 0xdd, 0xcc, 0xfa, 0x75, + 0xeb, 0x4f, 0x7b, 0xae, 0x62, 0x3e, 0x7e, 0xc2, 0xe6, 0x71, 0xb9, 0x5c, 0x2c, 0x5a, 0xb4, 0x94, + 0x9f, 0xdd, 0xff, 0x3a, 0x75, 0xf5, 0x63, 0x94, 0x04, 0x6c, 0x45, 0xff, 0x2e, 0x4f, 0x71, 0x1d, + 0xa5, 0x61, 0x1f, 0x43, 0x47, 0xe3, 0xf6, 0xd8, 0x44, 0x65, 0x58, 0xfb, 0x54, 0xe5, 0xe3, 0x83, + 0xdf, 0x1f, 0x35, 0xfe, 0x64, 0x05, 0x7c, 0xce, 0xf3, 0xab, 0x03, 0x0b, 0x87, 0x79, 0x60, 0x61, + 0xbf, 0x75, 0xee, 0xba, 0xb3, 0xce, 0xc6, 0xe7, 0xf3, 0x9f, 0xfa, 0x46, 0x0b, 0xb0, 0xdb, 0x1d, + 0x8c, 0x8d, 0x4e, 0x50, 0x5e, 0xaa, 0xe2, 0x74, 0xd8, 0x8a, 0x81, 0x89, 0x10, 0x82, 0x12, 0xaf, + 0x9b, 0xb2, 0x80, 0x97, 0x6c, 0xd6, 0x22, 0x63, 0x18, 0xb8, 0xec, 0x76, 0x96, 0xd4, 0x95, 0x63, + 0xb7, 0xa9, 0xb3, 0x01, 0xcc, 0x9c, 0xf3, 0x0e, 0x8f, 0xe7, 0x78, 0xec, 0x89, 0x4a, 0x6e, 0xb8, + 0xe1, 0x43, 0xb8, 0x5c, 0xae, 0xd3, 0x0a, 0x57, 0x16, 0x82, 0x9a, 0x54, 0x3a, 0x4d, 0x2e, 0x9b, + 0x2d, 0x6a, 0xb2, 0xa2, 0x28, 0xd4, 0xd4, 0xd4, 0x60, 0x5a, 0x15, 0x3c, 0xf1, 0xc4, 0x33, 0x74, + 0x1e, 0x72, 0xf2, 0xf6, 0x77, 0xfc, 0x1d, 0xc1, 0x60, 0x10, 0x45, 0x51, 0x4e, 0x3a, 0x87, 0x69, + 0x9a, 0x64, 0x32, 0x19, 0x72, 0xb9, 0x7c, 0x60, 0x74, 0xa2, 0xf9, 0x76, 0xb9, 0x5c, 0xd4, 0xd5, + 0xb5, 0x72, 0xff, 0x2f, 0x9e, 0x62, 0xe5, 0x0a, 0x15, 0x5d, 0x13, 0x27, 0x4a, 0xb6, 0xa8, 0xd9, + 0xba, 0x4d, 0xc5, 0xe7, 0x73, 0x8b, 0xc9, 0x03, 0x5d, 0xad, 0x42, 0xc6, 0x77, 0x89, 0xf7, 0xd5, + 0x76, 0x0e, 0xff, 0x7c, 0xfc, 0x4f, 0x2f, 0xc8, 0xba, 0xe4, 0x79, 0x44, 0xd5, 0xc8, 0xe4, 0x47, + 0x17, 0x0d, 0xe7, 0x2e, 0x3c, 0xf3, 0xec, 0x73, 0x28, 0x2b, 0x2b, 0x3f, 0x29, 0xe2, 0x9d, 0x97, + 0x1f, 0x2a, 0x02, 0xb7, 0x37, 0x44, 0x22, 0x19, 0x23, 0xe4, 0x77, 0x9e, 0xb4, 0xf0, 0x52, 0x8f, + 0x93, 0xd2, 0x05, 0xf5, 0x64, 0x4d, 0x0b, 0x45, 0x80, 0x26, 0xc4, 0x49, 0x82, 0x9d, 0x81, 0x28, + 0x0f, 0x1f, 0x8d, 0xb3, 0x7e, 0xfd, 0x75, 0x04, 0x02, 0x81, 0x37, 0x14, 0x6e, 0x24, 0x32, 0xce, + 0xaf, 0x7f, 0xfd, 0x10, 0x8f, 0xfc, 0xf6, 0x79, 0x72, 0x96, 0xc2, 0x9a, 0x8e, 0x06, 0xde, 0xf3, + 0x9e, 0x77, 0xb3, 0x68, 0xd1, 0x22, 0x34, 0x4d, 0xe3, 0x82, 0x0b, 0x2e, 0xe0, 0xd8, 0xb1, 0xe3, + 0x8c, 0x8e, 0x1f, 0xa6, 0xb4, 0xb4, 0xf4, 0xa4, 0x73, 0xe5, 0xcf, 0x11, 0xe1, 0x67, 0x3f, 0xff, + 0x39, 0x8f, 0x3f, 0xb3, 0x11, 0x13, 0x85, 0xb3, 0x56, 0x2e, 0xe6, 0x9d, 0x57, 0xbe, 0x93, 0xa5, + 0x4b, 0x96, 0x62, 0xb3, 0xd9, 0x8a, 0x9a, 0xdc, 0xd4, 0xd4, 0x44, 0x4b, 0xeb, 0x75, 0xec, 0xdc, + 0xfd, 0x63, 0x36, 0xac, 0x0b, 0x91, 0x0f, 0x43, 0xc4, 0x49, 0xa9, 0x18, 0x40, 0x4d, 0x95, 0x9f, + 0x45, 0x55, 0xa5, 0xb6, 0xc4, 0xf1, 0xb1, 0xff, 0x8c, 0xb7, 0x8f, 0xef, 0xd8, 0x05, 0x7d, 0x7f, + 0x52, 0x1a, 0x5c, 0x35, 0xea, 0x17, 0xe1, 0xe9, 0xda, 0xb7, 0x2f, 0xe9, 0xca, 0xde, 0xb9, 0xbc, + 0x75, 0xa1, 0xd6, 0xd2, 0xd6, 0x51, 0x58, 0xe8, 0x1b, 0x20, 0x9f, 0x52, 0x90, 0x4a, 0x26, 0xc9, + 0x24, 0x47, 0x28, 0x0f, 0xfb, 0x10, 0x8a, 0x38, 0x01, 0x20, 0x28, 0xf8, 0x4a, 0x21, 0x98, 0x79, + 0x69, 0x5e, 0xea, 0x51, 0x38, 0x0c, 0x29, 0xd8, 0xf4, 0x62, 0x9c, 0x25, 0x4b, 0xaf, 0xa3, 0xa2, + 0xa2, 0xe2, 0xb4, 0xe6, 0x74, 0x7c, 0x7c, 0x9c, 0x4f, 0x7f, 0xf6, 0x73, 0x7c, 0x39, 0x5e, 0xc5, + 0xd1, 0x8b, 0x6f, 0xa1, 0x6b, 0xf9, 0xa5, 0x6c, 0x36, 0xbc, 0xfc, 0xe6, 0x9e, 0xbb, 0x09, 0xe5, + 0xa2, 0xb4, 0xb6, 0xb6, 0x60, 0xb7, 0xdb, 0xa9, 0xad, 0xad, 0xe1, 0xa5, 0x97, 0x5e, 0x62, 0xfd, + 0xfa, 0xf5, 0xb8, 0xdd, 0xee, 0xe2, 0xf9, 0xa4, 0x94, 0xc4, 0xe2, 0x71, 0xbe, 0x7a, 0xfb, 0x1d, + 0xdc, 0x36, 0x1e, 0xa2, 0xeb, 0xd2, 0x0f, 0xd3, 0x7b, 0xc6, 0xdb, 0xd8, 0x4c, 0x29, 0x4f, 0xde, + 0xf3, 0x13, 0x02, 0xc9, 0x31, 0x16, 0x2c, 0x58, 0x30, 0x4f, 0xc8, 0xe1, 0x70, 0x39, 0xbf, 0xfc, + 0xe5, 0x26, 0xd6, 0xad, 0xb5, 0x0a, 0x69, 0xe1, 0x9c, 0xfc, 0xbd, 0xf0, 0x10, 0x05, 0x90, 0xc1, + 0xee, 0x76, 0xd0, 0x77, 0xec, 0x98, 0x2b, 0x59, 0x9a, 0x09, 0x19, 0xff, 0xaa, 0x3d, 0x35, 0xfc, + 0x4d, 0xf3, 0x8f, 0x5a, 0x84, 0x78, 0x43, 0xa0, 0xa3, 0x6c, 0xda, 0xb4, 0x55, 0x4d, 0x4f, 0x5e, + 0x5b, 0x86, 0x69, 0x6f, 0x6e, 0x69, 0xa3, 0x00, 0xe9, 0xe6, 0xd5, 0x4b, 0x72, 0x32, 0x0a, 0x45, + 0x3e, 0x0d, 0x71, 0x38, 0x9d, 0x1c, 0xef, 0x1e, 0x25, 0x67, 0x99, 0x27, 0x23, 0x5c, 0x85, 0x9d, + 0x1e, 0x4d, 0xa5, 0xe9, 0x9f, 0x98, 0x26, 0x6b, 0x5a, 0xc5, 0xd3, 0xc9, 0x99, 0x97, 0x01, 0xc3, + 0x92, 0x8c, 0x8d, 0x79, 0x08, 0x87, 0xc3, 0xa7, 0xd5, 0x5c, 0xd3, 0x34, 0x79, 0xe2, 0xc9, 0x27, + 0xb9, 0xdf, 0xb9, 0x18, 0xf3, 0xcc, 0x2b, 0x90, 0x9a, 0x8e, 0x54, 0x55, 0x68, 0x5c, 0x4c, 0xcf, + 0xfb, 0x3e, 0xc3, 0xad, 0xdb, 0xc7, 0xb9, 0xf7, 0xbe, 0x9f, 0x92, 0xc9, 0x64, 0xa8, 0xa8, 0xa8, + 0x60, 0xfd, 0xfa, 0xf5, 0x6c, 0xdb, 0xb6, 0x0d, 0xcb, 0xb2, 0x8a, 0xbe, 0x56, 0x4a, 0xc9, 0xf6, + 0xed, 0xdb, 0x79, 0x60, 0x44, 0xc3, 0x3c, 0xfb, 0x6d, 0x48, 0x87, 0x0b, 0x4b, 0xd5, 0x90, 0xb5, + 0x6d, 0x0c, 0x5e, 0xff, 0x59, 0xfe, 0xef, 0x8e, 0x71, 0x36, 0x6e, 0x7c, 0x16, 0xcb, 0x9a, 0x95, + 0x4b, 0x59, 0x59, 0x98, 0xba, 0x86, 0xf3, 0x39, 0xde, 0x93, 0x06, 0xa5, 0x00, 0xd4, 0x88, 0x39, + 0x3e, 0x5c, 0x16, 0x81, 0x6b, 0x2a, 0x4a, 0xbd, 0x94, 0x95, 0x84, 0x45, 0xe9, 0x88, 0xfd, 0xda, + 0x92, 0x48, 0x68, 0xf5, 0x9f, 0x14, 0x92, 0xe5, 0x48, 0x79, 0x16, 0x95, 0x8e, 0xf0, 0xb6, 0xb2, + 0xd2, 0x6a, 0x9c, 0x2e, 0x17, 0x42, 0xcc, 0xe2, 0x74, 0x12, 0x89, 0x94, 0x60, 0x9a, 0x06, 0xd9, + 0x6c, 0x06, 0xd3, 0x34, 0x8b, 0xeb, 0x0a, 0x95, 0x94, 0x20, 0x6c, 0x95, 0x1c, 0x3e, 0x3a, 0x3a, + 0x8b, 0x2a, 0xcd, 0xdc, 0x50, 0x04, 0x39, 0xcb, 0x62, 0x67, 0x57, 0x3f, 0xaf, 0x1c, 0xee, 0x66, + 0xeb, 0xe1, 0x5e, 0x32, 0x46, 0x1e, 0x8f, 0x17, 0x72, 0x0e, 0x60, 0x0c, 0x20, 0x74, 0x6c, 0xb6, + 0xd3, 0x7b, 0x91, 0x78, 0x3c, 0xce, 0xa6, 0x2d, 0x3b, 0x49, 0x2e, 0x3e, 0x3b, 0x7f, 0xe6, 0x74, + 0x12, 0xf1, 0xca, 0xe3, 0x88, 0x03, 0x5b, 0x40, 0x28, 0xc4, 0xfe, 0xea, 0x6a, 0xee, 0xd8, 0x3d, + 0xc1, 0x96, 0x2d, 0x5b, 0x00, 0x58, 0xbf, 0x7e, 0x3d, 0x9b, 0x37, 0x6f, 0x26, 0x93, 0xc9, 0x14, + 0x85, 0x61, 0x18, 0x06, 0xdb, 0xb6, 0x6d, 0x67, 0xb0, 0x6d, 0x0d, 0x08, 0x05, 0x46, 0xfb, 0xe0, + 0x81, 0x3b, 0x11, 0x4f, 0xdf, 0x0d, 0xb9, 0x0c, 0xe3, 0xe7, 0x5c, 0xc9, 0x5d, 0x0f, 0x3f, 0xc7, + 0xd0, 0xd0, 0x10, 0x96, 0x65, 0x15, 0xb5, 0x78, 0xe1, 0xc2, 0xa5, 0x3c, 0xf9, 0xf4, 0x24, 0x0f, + 0x3d, 0x31, 0xc4, 0x0f, 0x7e, 0x72, 0x8c, 0x27, 0x7e, 0x37, 0xc2, 0x58, 0x34, 0x37, 0x0b, 0xd2, + 0x14, 0x34, 0x59, 0x55, 0x14, 0xea, 0xaa, 0xcb, 0xf0, 0x8d, 0xd8, 0xf4, 0x50, 0x4a, 0x7b, 0xd7, + 0xb2, 0xc3, 0xe5, 0xe2, 0x4f, 0x46, 0xc0, 0x6e, 0x35, 0x79, 0x4e, 0x69, 0x3c, 0x69, 0x2b, 0x2d, + 0xab, 0x44, 0x51, 0x66, 0xd1, 0xa8, 0x7c, 0x11, 0x01, 0xfa, 0xfb, 0x7b, 0xd8, 0xf8, 0xbb, 0x07, + 0x78, 0xf2, 0x89, 0x1f, 0xf2, 0xdc, 0xb3, 0x0f, 0x31, 0x38, 0xd8, 0x83, 0x94, 0x16, 0x8a, 0xaa, + 0xb2, 0xe2, 0x8c, 0xb5, 0x1c, 0x3a, 0x92, 0xe2, 0x48, 0xd7, 0x18, 0x96, 0x9c, 0x55, 0xf8, 0x19, + 0xb0, 0xde, 0x30, 0xad, 0xfc, 0xfd, 0x8c, 0xc5, 0x38, 0x3a, 0x34, 0x5e, 0xd4, 0x5c, 0xf1, 0xdf, + 0x28, 0x78, 0x25, 0x93, 0x49, 0xc6, 0x72, 0x3a, 0xd2, 0x1b, 0x00, 0x21, 0x50, 0x5e, 0x79, 0x0c, + 0x79, 0xfb, 0x2d, 0xc8, 0x2f, 0xdd, 0x84, 0xdc, 0x78, 0x3f, 0x20, 0x39, 0xb6, 0xee, 0x0a, 0x7e, + 0xfc, 0x8b, 0x87, 0x99, 0x9c, 0x9c, 0xa2, 0x34, 0x1c, 0x46, 0x51, 0x14, 0x06, 0x07, 0x06, 0x8a, + 0x1a, 0x9c, 0x4e, 0xa7, 0xe9, 0xea, 0x1f, 0x22, 0x57, 0x5a, 0x85, 0xc8, 0x66, 0x10, 0x4f, 0xdd, + 0x0d, 0xbf, 0xfc, 0x3a, 0xf2, 0x47, 0x9f, 0x45, 0xfe, 0xe6, 0x27, 0xe0, 0xf0, 0xb0, 0xbd, 0x76, + 0x0d, 0xdb, 0xb7, 0xef, 0xc8, 0xc3, 0x93, 0x52, 0x32, 0x39, 0x39, 0xc9, 0xd6, 0xad, 0x5b, 0xd8, + 0xf4, 0x7c, 0x3f, 0x07, 0xf6, 0x4f, 0x90, 0xce, 0x48, 0x1e, 0x7d, 0xbc, 0x97, 0x8f, 0xfe, 0xe3, + 0x2e, 0x06, 0x46, 0x33, 0x27, 0x5c, 0xb9, 0xc4, 0x1f, 0x70, 0xa1, 0x92, 0x44, 0x19, 0x2d, 0xbd, + 0x30, 0xa9, 0x38, 0x9d, 0x7f, 0x32, 0x02, 0x6e, 0xde, 0x17, 0x70, 0x79, 0x72, 0x6e, 0x11, 0x0a, + 0x9d, 0x6c, 0x26, 0x47, 0x86, 0x07, 0x79, 0x75, 0xeb, 0x93, 0x4c, 0x4d, 0xf5, 0x93, 0xcb, 0x25, + 0x99, 0x98, 0xe8, 0x66, 0xcb, 0x2b, 0x8f, 0x70, 0xec, 0xe8, 0x61, 0xa4, 0x04, 0x87, 0xc3, 0xc9, + 0x19, 0xeb, 0xcf, 0x63, 0xcf, 0xfe, 0x18, 0xbb, 0xf7, 0xf7, 0x61, 0x4a, 0xc9, 0xcc, 0x3f, 0x4d, + 0x51, 0xf0, 0xbb, 0x9c, 0x45, 0x7f, 0xdc, 0x33, 0x3e, 0x49, 0xb2, 0x50, 0x91, 0x9a, 0xb1, 0xd5, + 0x42, 0x80, 0x22, 0x92, 0xa4, 0x52, 0xa9, 0xd3, 0x5e, 0x9f, 0x61, 0x18, 0x24, 0x4d, 0x09, 0x8a, + 0x9a, 0x4f, 0xab, 0x06, 0x8e, 0x81, 0x25, 0x21, 0x35, 0x0d, 0x8f, 0xdc, 0x85, 0xe8, 0x3e, 0x08, + 0x81, 0x52, 0x5e, 0xd0, 0x1b, 0x38, 0x72, 0xf4, 0x08, 0x4e, 0x87, 0x83, 0x05, 0xed, 0xed, 0x74, + 0x1e, 0x3e, 0x3c, 0x0f, 0x12, 0x95, 0x92, 0xfc, 0x39, 0xd2, 0x09, 0x44, 0xdf, 0xe1, 0xfc, 0x7f, + 0x9a, 0x26, 0x6c, 0xfc, 0x25, 0xa2, 0xff, 0x08, 0x53, 0x0d, 0x1d, 0xec, 0xdc, 0x77, 0x80, 0x74, + 0x26, 0xc3, 0xfe, 0xfd, 0xfb, 0xf9, 0xc4, 0xc7, 0x3f, 0x82, 0xd7, 0x75, 0x3f, 0xf7, 0xfe, 0x68, + 0x25, 0xff, 0xf2, 0xa9, 0x45, 0xdc, 0xfa, 0x81, 0x66, 0xbe, 0xfe, 0xaf, 0x2b, 0x68, 0x69, 0xf6, + 0xf0, 0xf0, 0x63, 0x7d, 0x18, 0x72, 0x0e, 0xd4, 0x5a, 0x4c, 0xdf, 0x14, 0xc8, 0xe9, 0xd5, 0x22, + 0xa7, 0x68, 0x7f, 0x12, 0x02, 0x3e, 0xa3, 0xb3, 0x52, 0x97, 0x81, 0xe4, 0xc5, 0xa1, 0x50, 0x95, + 0xf0, 0x9d, 0x14, 0xc5, 0x4a, 0x8e, 0x1e, 0x3b, 0x8c, 0x69, 0x26, 0xe6, 0x21, 0x53, 0x96, 0x95, + 0x65, 0xef, 0xde, 0x17, 0x18, 0x19, 0x19, 0x02, 0xc0, 0xe9, 0x74, 0xb1, 0xf6, 0xec, 0xf3, 0x19, + 0x18, 0xd1, 0x39, 0x70, 0x68, 0x08, 0xab, 0x08, 0xf1, 0x09, 0x16, 0x54, 0x85, 0x71, 0xe9, 0x3a, + 0x52, 0x4a, 0xb2, 0xa6, 0x99, 0x37, 0xd3, 0x33, 0x10, 0x36, 0xf9, 0xe8, 0xba, 0xbc, 0x3c, 0xc5, + 0xe8, 0xe8, 0xe8, 0x29, 0xab, 0x4b, 0x90, 0x4f, 0xc9, 0x02, 0x9a, 0x04, 0xb3, 0x80, 0xf7, 0x0a, + 0x65, 0x36, 0x2e, 0x18, 0xed, 0x86, 0x57, 0x9f, 0x06, 0x60, 0xac, 0x61, 0x09, 0x47, 0x8e, 0x1d, + 0xc7, 0xb2, 0x2c, 0xfc, 0xc1, 0x20, 0x23, 0x23, 0x23, 0xc5, 0x6b, 0x56, 0x15, 0x05, 0x87, 0xae, + 0xa1, 0x64, 0x92, 0x48, 0xbb, 0x13, 0xab, 0xb4, 0x6a, 0xce, 0x2e, 0xee, 0x81, 0xee, 0x83, 0x98, + 0xbe, 0x52, 0x5e, 0x1f, 0x98, 0xe4, 0xd9, 0x67, 0x9f, 0xe5, 0x73, 0x9f, 0xbb, 0x95, 0xf7, 0x5d, + 0x33, 0xc4, 0xcd, 0xef, 0x6b, 0xa0, 0x3c, 0xa4, 0x17, 0x63, 0x12, 0x9f, 0x5b, 0x63, 0xc3, 0xd9, + 0x61, 0xf6, 0xed, 0x8f, 0x92, 0x48, 0x9a, 0x73, 0xc2, 0x13, 0x41, 0x22, 0x9e, 0xce, 0xe3, 0xd6, + 0xf3, 0xd1, 0xec, 0x37, 0x57, 0xc0, 0x1a, 0x46, 0x7b, 0xe5, 0x88, 0xba, 0xb8, 0xb9, 0x6d, 0x11, + 0xba, 0x6e, 0x9f, 0x17, 0xdc, 0x64, 0x32, 0x39, 0xa2, 0x53, 0xc3, 0xa7, 0x0e, 0x7c, 0x8c, 0x69, + 0x0e, 0x1d, 0xdc, 0x83, 0x61, 0x18, 0x05, 0x21, 0xd8, 0x59, 0xb9, 0xe6, 0x2c, 0x7a, 0x07, 0x4c, + 0x46, 0x23, 0xb1, 0xe2, 0xba, 0x7d, 0x4e, 0x3b, 0x67, 0xb5, 0x37, 0xd2, 0x18, 0x2e, 0xa1, 0x3a, + 0xe8, 0xc7, 0xa5, 0x6b, 0xf3, 0x62, 0x36, 0x45, 0x48, 0x9a, 0x9a, 0x6c, 0x74, 0x77, 0x77, 0x21, + 0x4f, 0xe7, 0x42, 0xdc, 0x2e, 0xaa, 0xfd, 0x36, 0x44, 0x6c, 0x12, 0x14, 0x05, 0x9a, 0x97, 0x80, + 0xa6, 0x15, 0xf2, 0x2c, 0x89, 0x3c, 0xf8, 0x2a, 0x24, 0xa6, 0xc9, 0x05, 0xca, 0xe8, 0xee, 0x1d, + 0x44, 0x4a, 0x49, 0x55, 0x45, 0x25, 0x93, 0x93, 0x93, 0x73, 0x36, 0x89, 0x9d, 0x96, 0xc6, 0x7a, + 0xf4, 0x91, 0x5e, 0xb0, 0x3b, 0xa0, 0x71, 0x31, 0xa8, 0x05, 0x25, 0x33, 0x73, 0x28, 0xd3, 0x63, + 0xa0, 0x6a, 0x3c, 0x1e, 0xb7, 0x71, 0xdb, 0xe7, 0xff, 0x9a, 0x8f, 0x7e, 0x44, 0x70, 0xfe, 0xd9, + 0x25, 0xd8, 0x54, 0x51, 0x0c, 0x3a, 0xe5, 0x9c, 0x24, 0x40, 0x55, 0x45, 0x7e, 0x9f, 0x89, 0x99, + 0x90, 0x53, 0xe2, 0xf3, 0xbb, 0x10, 0x38, 0xb1, 0xac, 0x4a, 0xa4, 0x0c, 0xbc, 0xf9, 0x02, 0x5e, + 0x7a, 0xbc, 0xc4, 0xdd, 0xde, 0x67, 0x7d, 0x7e, 0x89, 0xa7, 0x29, 0x54, 0x53, 0xd7, 0x70, 0x62, + 0x2e, 0x8f, 0x61, 0x18, 0x64, 0xb2, 0xd3, 0xa7, 0x44, 0x90, 0x24, 0x30, 0x3e, 0x7e, 0x8c, 0xe9, + 0xe8, 0x54, 0xf1, 0xfd, 0x9a, 0xa6, 0x51, 0x5e, 0xd5, 0x42, 0xe7, 0x91, 0xc1, 0xa2, 0x16, 0x0b, + 0xc0, 0xef, 0xd4, 0x39, 0xa3, 0xb9, 0x9a, 0xd5, 0xcd, 0x35, 0x38, 0x34, 0x75, 0x36, 0x4d, 0x2a, + 0xdc, 0xb8, 0xc6, 0x7a, 0x17, 0x7b, 0x76, 0x6f, 0x26, 0x95, 0x4a, 0xcd, 0x43, 0xbf, 0x66, 0x3e, + 0xd3, 0xe9, 0x74, 0xb2, 0x6e, 0xc5, 0x12, 0x5c, 0x7d, 0x87, 0xf2, 0x1a, 0xd2, 0xb2, 0x1c, 0xaa, + 0x5a, 0x67, 0x17, 0x97, 0x4a, 0xa0, 0x66, 0xd2, 0xc5, 0x80, 0x47, 0x02, 0x36, 0xdd, 0x36, 0x0f, + 0xbc, 0xd0, 0x34, 0x8d, 0x55, 0x2b, 0x57, 0x50, 0x7b, 0x6c, 0x17, 0x18, 0x26, 0xe2, 0xcc, 0xcb, + 0x50, 0x56, 0x9d, 0x5f, 0xf4, 0x13, 0x96, 0xdd, 0x05, 0x99, 0x14, 0xd5, 0x93, 0x3d, 0x7c, 0xe6, + 0xd3, 0xed, 0xac, 0x5f, 0x15, 0x3a, 0xa5, 0x0e, 0x9a, 0xa6, 0xe4, 0xf0, 0x91, 0x18, 0xc1, 0x51, + 0x49, 0xf2, 0xf9, 0x18, 0xb1, 0xce, 0x24, 0x46, 0x2a, 0xbf, 0xda, 0xa0, 0xdf, 0x89, 0x4d, 0x57, + 0x91, 0x18, 0x05, 0x5a, 0xc2, 0x9b, 0x28, 0xe0, 0x65, 0x9b, 0x17, 0x28, 0xcd, 0x7b, 0x2b, 0xbe, + 0x74, 0xc6, 0xa1, 0xd0, 0x95, 0xcb, 0x97, 0xae, 0x16, 0x79, 0xc4, 0x47, 0xcc, 0xcb, 0x72, 0x6c, + 0x36, 0x1b, 0x0e, 0x3d, 0x30, 0x8f, 0xb9, 0x31, 0x2b, 0x64, 0x81, 0x61, 0xa6, 0x98, 0x9c, 0x9a, + 0x9a, 0x2d, 0x1b, 0x02, 0x5e, 0xaf, 0x97, 0x58, 0x2c, 0x83, 0x65, 0xc9, 0xd9, 0x42, 0x84, 0x98, + 0xcd, 0x8c, 0xc5, 0xdc, 0x74, 0xaa, 0x10, 0x4d, 0x57, 0x94, 0xea, 0x94, 0x87, 0xf6, 0x72, 0x6c, + 0xef, 0x2e, 0x8c, 0x89, 0x31, 0xac, 0x54, 0x12, 0xac, 0x42, 0x5a, 0x25, 0x25, 0x8a, 0xa2, 0x70, + 0xde, 0xb9, 0xe7, 0xb0, 0xf6, 0xf8, 0x56, 0x48, 0xc6, 0x90, 0xe1, 0x5a, 0xc4, 0xbb, 0x6e, 0x05, + 0x67, 0x20, 0xcf, 0xca, 0x08, 0x94, 0x61, 0x3a, 0xdc, 0x90, 0x4b, 0x23, 0xc8, 0xa7, 0x46, 0xbd, + 0xbd, 0xbd, 0x38, 0x1c, 0x8e, 0x79, 0xb0, 0xe4, 0xe2, 0xc5, 0x4b, 0xb8, 0x30, 0x98, 0x41, 0x19, + 0x38, 0x82, 0xf4, 0x87, 0xe1, 0x96, 0x7f, 0x43, 0x5c, 0x72, 0x23, 0x62, 0xd9, 0x79, 0x28, 0x6d, + 0xcb, 0x08, 0x3f, 0x7f, 0x3f, 0x9f, 0xbd, 0xea, 0x38, 0x97, 0x5d, 0x54, 0x81, 0xa6, 0x9c, 0x50, + 0xed, 0x2a, 0x5c, 0xef, 0xc0, 0x48, 0x9a, 0x67, 0x9e, 0x19, 0xe4, 0xe2, 0x0f, 0xd4, 0x13, 0x5a, + 0xef, 0xc5, 0x8c, 0x9a, 0x0c, 0xde, 0x13, 0x61, 0x6a, 0x6b, 0x1c, 0x8f, 0xd3, 0x4e, 0x7d, 0x5d, + 0x09, 0x1e, 0xbd, 0x2f, 0xe1, 0xd4, 0x27, 0xfe, 0xa8, 0x12, 0x3e, 0x09, 0xe8, 0x58, 0x76, 0xa3, + 0xee, 0xe9, 0x88, 0xc4, 0x7f, 0xb2, 0xaa, 0xb2, 0xdd, 0x51, 0xdf, 0xd8, 0x34, 0x07, 0x7f, 0x98, + 0xdd, 0xf5, 0x8a, 0x22, 0x18, 0x1d, 0x8d, 0x10, 0x9b, 0x1e, 0x2c, 0xae, 0xf4, 0x44, 0x1c, 0xb9, + 0xa4, 0xb4, 0x91, 0x70, 0xb8, 0xac, 0xf8, 0xff, 0x86, 0x61, 0x32, 0x19, 0xe9, 0xa1, 0xb9, 0xb1, + 0x74, 0xb6, 0xe4, 0x36, 0x83, 0x62, 0x9d, 0x50, 0xa0, 0x97, 0x96, 0x24, 0xd5, 0x9f, 0x65, 0x7a, + 0x73, 0x9c, 0xc6, 0xb8, 0x89, 0xed, 0xf0, 0xd3, 0xa4, 0x76, 0x3f, 0x40, 0x74, 0xd3, 0x6f, 0xc9, + 0x4e, 0x65, 0xb0, 0x97, 0x57, 0xa3, 0x38, 0x5d, 0x05, 0x33, 0xed, 0xc6, 0x2b, 0x53, 0xbc, 0xb0, + 0x75, 0x0f, 0x89, 0xda, 0x76, 0xa8, 0x6d, 0x83, 0xba, 0x36, 0x08, 0x56, 0x20, 0x2e, 0xbb, 0x19, + 0x2a, 0xea, 0x71, 0x76, 0x6e, 0xe7, 0xe6, 0xf6, 0x20, 0x8b, 0x16, 0x2e, 0x64, 0xc7, 0x8e, 0x1d, + 0x3c, 0xf7, 0xec, 0xb3, 0x9c, 0x7d, 0xf6, 0xd9, 0x78, 0x3c, 0x1e, 0x84, 0x10, 0xe8, 0xba, 0x4e, + 0x6d, 0x4d, 0x15, 0xbb, 0xef, 0xbf, 0x97, 0x81, 0xba, 0x25, 0xc8, 0x40, 0x18, 0x71, 0xc6, 0x05, + 0xc8, 0x35, 0x17, 0xe3, 0xeb, 0xdc, 0xc9, 0xe7, 0x9a, 0x7f, 0xc6, 0xf5, 0xd7, 0xd6, 0x62, 0x57, + 0x67, 0xad, 0x8b, 0x9c, 0x53, 0x13, 0x4e, 0x66, 0x2c, 0xee, 0xbe, 0xaf, 0x0b, 0x81, 0xc2, 0x95, + 0xab, 0x2b, 0x61, 0xda, 0xc0, 0xb7, 0xd2, 0x8d, 0x6f, 0xb5, 0x9b, 0x54, 0x57, 0x9a, 0xc4, 0x9e, + 0x14, 0xfe, 0x85, 0x3e, 0xfa, 0x87, 0x0f, 0x4d, 0x4f, 0x87, 0xa7, 0xef, 0x3d, 0xf2, 0x1f, 0xb9, + 0xf8, 0x9b, 0xa6, 0xc1, 0x3e, 0xfb, 0x20, 0x1e, 0x7b, 0x54, 0x96, 0x57, 0x54, 0xcf, 0x31, 0xbf, + 0x62, 0x9e, 0x9f, 0x15, 0x42, 0xa1, 0xb6, 0xb6, 0x01, 0x21, 0x6c, 0xf3, 0x10, 0xa1, 0xfc, 0x6b, + 0x05, 0xb3, 0xac, 0x9e, 0x1c, 0x2c, 0x66, 0xb3, 0x26, 0x86, 0x69, 0xce, 0xde, 0x9c, 0xb9, 0x18, + 0x6e, 0xe1, 0x79, 0x6e, 0xda, 0x64, 0xec, 0xe1, 0x49, 0x92, 0x07, 0x53, 0xf8, 0xcf, 0xf4, 0x50, + 0xf7, 0xfe, 0x30, 0x0d, 0x1f, 0xa9, 0x26, 0x74, 0x59, 0x90, 0x8a, 0xf7, 0x5b, 0x58, 0xc9, 0x7b, + 0x18, 0xbe, 0xe7, 0x9b, 0x98, 0x89, 0x58, 0x11, 0x73, 0xbe, 0xe4, 0x92, 0x8b, 0xf9, 0x68, 0x79, + 0x1c, 0xdf, 0xb6, 0xdf, 0xe4, 0x6f, 0xfd, 0xba, 0x4b, 0xe0, 0xaf, 0x3f, 0x8f, 0x6c, 0x5d, 0x8e, + 0x88, 0x4f, 0xb1, 0xa1, 0x67, 0x0b, 0xeb, 0xd6, 0xae, 0x25, 0x93, 0xc9, 0x70, 0xb8, 0x73, 0x17, + 0xd7, 0x5e, 0x33, 0xcc, 0x0f, 0x7f, 0xf8, 0x1d, 0xa6, 0xa3, 0xd1, 0xa2, 0x16, 0x2f, 0xec, 0xe8, + 0xe0, 0x5f, 0x6e, 0xb8, 0x82, 0x8e, 0x5f, 0x7d, 0x2d, 0x1f, 0x5c, 0x65, 0xd3, 0x84, 0x5e, 0x78, + 0x80, 0xcf, 0x57, 0xdf, 0xc5, 0xfb, 0x6f, 0xa8, 0xc3, 0xa9, 0x8a, 0xa2, 0xad, 0x91, 0x33, 0xf7, + 0x44, 0x4a, 0xd2, 0x39, 0xc9, 0xcf, 0x1f, 0xec, 0xe3, 0x89, 0x27, 0xfb, 0xf9, 0x9b, 0xf7, 0x37, + 0xe1, 0x0b, 0xab, 0x28, 0x9a, 0x00, 0x2b, 0x4f, 0xfe, 0x0b, 0x6e, 0xf0, 0x61, 0xaf, 0xb6, 0xe1, + 0x3a, 0x0e, 0xcb, 0x1c, 0xa5, 0x35, 0xb5, 0xc3, 0xe9, 0xc7, 0x57, 0x75, 0xeb, 0xa5, 0x6f, 0x9e, + 0x0f, 0x9e, 0x45, 0xfd, 0x4f, 0x9d, 0x95, 0x16, 0xa0, 0xca, 0xaa, 0xea, 0x6a, 0x42, 0x25, 0xcd, + 0xf3, 0xaa, 0x2f, 0x30, 0xc3, 0xa2, 0xd0, 0xf1, 0xcf, 0xa1, 0x22, 0xe5, 0xcd, 0xba, 0x46, 0x3a, + 0xa3, 0x30, 0x19, 0x4d, 0x16, 0x80, 0x92, 0xf9, 0xc1, 0x99, 0x94, 0x92, 0xcc, 0xb8, 0x41, 0xe4, + 0xd7, 0x93, 0x78, 0x56, 0xb9, 0x09, 0x6c, 0xf0, 0xa1, 0x87, 0x34, 0x84, 0x02, 0x46, 0xd2, 0x62, + 0x6a, 0x73, 0x1c, 0x2b, 0x6d, 0x51, 0x7a, 0x49, 0x08, 0x69, 0xec, 0x20, 0xdd, 0x77, 0x3c, 0x0f, + 0x6e, 0x08, 0x81, 0xdb, 0xed, 0xe6, 0xef, 0x3f, 0xfc, 0x21, 0xbe, 0x52, 0x9f, 0x66, 0xe1, 0x23, + 0xdf, 0x82, 0x9e, 0x43, 0x90, 0x98, 0x86, 0xc1, 0x2e, 0xd6, 0x6e, 0xfc, 0x31, 0xff, 0xe7, 0xa6, + 0xab, 0xa8, 0xa9, 0xa9, 0xa1, 0xa7, 0xa7, 0x07, 0x4d, 0xdd, 0xc9, 0x5f, 0x9d, 0x13, 0x62, 0xd9, + 0x92, 0x17, 0xb9, 0xf3, 0x5b, 0xdf, 0x60, 0x6c, 0x2c, 0x52, 0xdc, 0x28, 0x17, 0x5e, 0x78, 0x01, + 0xdf, 0xfe, 0x87, 0xeb, 0xb9, 0xf0, 0xd1, 0x2f, 0x51, 0x75, 0xe7, 0xfb, 0xf9, 0xe2, 0xe2, 0x5f, + 0xf1, 0xb7, 0x37, 0xd6, 0xe3, 0xb2, 0xcd, 0x87, 0x67, 0x45, 0x9e, 0x52, 0xc9, 0x74, 0xda, 0xe2, + 0xee, 0x9f, 0xf5, 0x70, 0xe7, 0xb7, 0x0f, 0xf2, 0xc9, 0x8f, 0x2f, 0x62, 0x51, 0x9b, 0x17, 0x47, + 0xa5, 0x8e, 0xea, 0x57, 0xc9, 0x45, 0x0d, 0x8c, 0x84, 0xc5, 0xe8, 0x03, 0x13, 0xb8, 0x1a, 0x1c, + 0x58, 0xfd, 0x26, 0x8b, 0x6b, 0x6b, 0x68, 0x3f, 0xec, 0x58, 0xbe, 0xe0, 0xa8, 0xe3, 0xc6, 0xc5, + 0xc7, 0x83, 0xea, 0x9b, 0x62, 0xa2, 0xdb, 0x6f, 0xf2, 0xd9, 0x43, 0x93, 0xea, 0xc7, 0x4a, 0x0d, + 0xbf, 0xb3, 0xbc, 0xaa, 0xfa, 0xa4, 0x20, 0xaa, 0xb8, 0x33, 0x14, 0x85, 0x50, 0x30, 0xcc, 0xf0, + 0xf0, 0x08, 0x86, 0x11, 0xcb, 0xfb, 0xd2, 0xc2, 0xc6, 0xa8, 0xa8, 0x58, 0x42, 0x7b, 0xfb, 0x22, + 0x14, 0xb5, 0x50, 0x25, 0x2a, 0x14, 0xc8, 0x47, 0x46, 0xc6, 0x98, 0x8e, 0x8e, 0x51, 0x57, 0x53, + 0x82, 0x22, 0xe6, 0x9f, 0x37, 0x37, 0x6d, 0x12, 0x79, 0x68, 0x92, 0xc0, 0xf9, 0x3e, 0x62, 0x7b, + 0x92, 0x24, 0x5f, 0x4f, 0xe3, 0x5e, 0xe8, 0xc8, 0xbb, 0x04, 0x4d, 0xc1, 0xb7, 0xd2, 0x8d, 0xe6, + 0x55, 0x51, 0x6c, 0x0a, 0xd9, 0xf1, 0x1c, 0xaa, 0x67, 0x3d, 0xf6, 0x8a, 0xba, 0xa2, 0x0b, 0xd0, + 0x75, 0x9d, 0x15, 0xcb, 0x97, 0x73, 0xfe, 0xc2, 0x3a, 0x96, 0xf4, 0x6d, 0xa3, 0x61, 0xe7, 0x93, + 0x5c, 0xe5, 0x9c, 0xe0, 0x93, 0x7f, 0xfd, 0x1e, 0x56, 0xad, 0x5a, 0x45, 0x3a, 0x9d, 0xe6, 0x47, + 0x3f, 0xfc, 0x1e, 0x97, 0x5d, 0x32, 0x4c, 0x7d, 0xa5, 0x83, 0xe6, 0x46, 0x0f, 0x39, 0xa3, 0x93, + 0x1f, 0xff, 0x78, 0x27, 0x75, 0xf5, 0x2d, 0x84, 0x42, 0x21, 0x14, 0x45, 0x41, 0x51, 0x04, 0x9d, + 0x07, 0x77, 0xf0, 0x91, 0xeb, 0x46, 0x79, 0xcf, 0x3b, 0x6b, 0x70, 0x68, 0x4a, 0x5e, 0x73, 0xe7, + 0x38, 0x5d, 0x0b, 0xc9, 0xb1, 0xfe, 0x14, 0x5f, 0xfa, 0xca, 0x01, 0x1e, 0xb9, 0xbf, 0x9b, 0x2f, + 0x7e, 0x79, 0x05, 0x97, 0x5d, 0x58, 0x51, 0x28, 0x3c, 0x40, 0x6c, 0x6f, 0x02, 0x33, 0x66, 0xe2, + 0xac, 0xd3, 0x11, 0x4e, 0x05, 0xbd, 0xcc, 0x46, 0xaa, 0x2f, 0x83, 0xaf, 0xca, 0x45, 0x2a, 0x9b, + 0x53, 0x86, 0x8d, 0xd8, 0x86, 0xc9, 0x80, 0xf9, 0xe3, 0xde, 0xef, 0xe4, 0x62, 0x7f, 0xf4, 0x6a, + 0x92, 0x62, 0xb8, 0x13, 0x29, 0x2d, 0x75, 0x4f, 0xd7, 0xf1, 0x9d, 0x1f, 0xab, 0xa9, 0x6f, 0xa4, + 0xb4, 0x34, 0x7c, 0x42, 0x10, 0x35, 0xab, 0xc9, 0x81, 0x60, 0x88, 0x0d, 0x1b, 0x2e, 0x63, 0xcf, + 0x9e, 0x6d, 0x44, 0x22, 0xdd, 0x48, 0x69, 0x52, 0x12, 0x6a, 0x60, 0xe5, 0xaa, 0x75, 0x68, 0x9a, + 0x36, 0x4f, 0xff, 0x15, 0x55, 0xa5, 0xb5, 0x7d, 0x21, 0xaf, 0x6d, 0x79, 0x8a, 0xa1, 0xd1, 0x28, + 0xd5, 0x15, 0xb3, 0x1a, 0x6e, 0x99, 0x92, 0xc9, 0x17, 0xa6, 0x71, 0xaf, 0x76, 0xe1, 0xaa, 0xb3, + 0xa3, 0x28, 0x02, 0x2d, 0xa4, 0x21, 0x14, 0x41, 0x74, 0x5b, 0x82, 0xc4, 0x81, 0x14, 0x15, 0xd7, + 0x95, 0xa0, 0xa8, 0x05, 0xef, 0x67, 0xd9, 0x51, 0xbc, 0x81, 0x79, 0x06, 0x66, 0x26, 0x22, 0xee, + 0xe8, 0xe8, 0x60, 0x41, 0x47, 0x07, 0xb2, 0x00, 0x2b, 0x02, 0xe4, 0x72, 0x39, 0x1e, 0x7b, 0xf4, + 0x51, 0x4a, 0x42, 0xcf, 0xb2, 0xa4, 0xa3, 0xba, 0x90, 0x67, 0xc3, 0x05, 0x1b, 0x4a, 0x28, 0x0f, + 0xf7, 0xf1, 0x9d, 0x6f, 0xdf, 0xcc, 0xe2, 0xa5, 0x37, 0x50, 0x57, 0x57, 0xcb, 0xc6, 0xdf, 0xfd, + 0x80, 0x9b, 0x6f, 0xc8, 0xb2, 0x62, 0x51, 0x05, 0x0a, 0x32, 0xcf, 0xd3, 0x2e, 0xd6, 0x7c, 0x25, + 0xa9, 0x9c, 0xe4, 0xc5, 0x97, 0xc7, 0xf8, 0xf2, 0xbf, 0xed, 0xa7, 0x34, 0xa4, 0x73, 0xfb, 0xfb, + 0x16, 0xb2, 0xae, 0x3d, 0x88, 0x25, 0x25, 0xdb, 0x77, 0x45, 0x89, 0x46, 0x73, 0xb4, 0xb4, 0x79, + 0xa9, 0xab, 0xcc, 0x6f, 0x4e, 0x77, 0x8b, 0xa3, 0x40, 0x2c, 0x04, 0x15, 0x41, 0x73, 0x53, 0x25, + 0x95, 0x5b, 0xfb, 0x94, 0xca, 0x90, 0xbd, 0x0e, 0x18, 0xfc, 0xa3, 0x6b, 0xf0, 0xc1, 0x7b, 0xe2, + 0xb2, 0xed, 0x16, 0xed, 0x98, 0x23, 0x9d, 0xbc, 0x21, 0x3d, 0x10, 0x73, 0x54, 0x54, 0xd6, 0xa2, + 0xeb, 0x8e, 0xa2, 0x39, 0x3c, 0x31, 0x67, 0xb2, 0xdb, 0x1d, 0xd4, 0xd7, 0x35, 0xd1, 0xd0, 0xd8, + 0x41, 0x73, 0xd3, 0x62, 0x9a, 0x5b, 0x3b, 0x70, 0x38, 0x1c, 0xf3, 0x02, 0xb3, 0x99, 0xc3, 0xe9, + 0x72, 0xa3, 0xa8, 0x0e, 0x0e, 0x1d, 0xdc, 0x4f, 0x5d, 0x5d, 0x29, 0xba, 0x4d, 0x05, 0x09, 0x99, + 0x31, 0x83, 0xd8, 0xd6, 0x04, 0x25, 0x17, 0xfb, 0x51, 0x34, 0x81, 0x2d, 0xa0, 0xa1, 0xda, 0x0a, + 0x55, 0x27, 0x87, 0x82, 0xd6, 0xea, 0x64, 0x34, 0x95, 0xa3, 0xab, 0x37, 0x89, 0xdf, 0xa6, 0xb2, + 0xf5, 0x91, 0x71, 0x5e, 0x57, 0x1a, 0xa8, 0xae, 0xa9, 0xc1, 0x6e, 0xb7, 0x9f, 0x44, 0xb9, 0x99, + 0xfb, 0x7b, 0x32, 0x99, 0xe4, 0xa1, 0x87, 0x1e, 0xe2, 0xc8, 0xe1, 0x3b, 0xf9, 0xc0, 0x4d, 0xd5, + 0x78, 0x1c, 0xca, 0x9c, 0x1a, 0x35, 0x94, 0x97, 0xd9, 0x59, 0xb6, 0xdc, 0xc5, 0x4f, 0x7f, 0xfa, + 0x08, 0x5e, 0xf7, 0x6b, 0x7c, 0xf8, 0x83, 0x41, 0x9a, 0x6b, 0x9d, 0x45, 0xdf, 0x25, 0xc8, 0x17, + 0x13, 0x0c, 0x4b, 0x72, 0xb4, 0x27, 0xc9, 0x1d, 0x77, 0x76, 0x72, 0xd7, 0x0f, 0x8e, 0x70, 0xd3, + 0x0d, 0xcd, 0x7c, 0xea, 0x1f, 0x17, 0xb2, 0xf0, 0x9c, 0x20, 0xb9, 0x51, 0x03, 0x5b, 0x48, 0x23, + 0x63, 0xc0, 0xbf, 0x7f, 0xf7, 0x30, 0x0f, 0x3f, 0xd2, 0x8f, 0x4d, 0xd7, 0x68, 0x6e, 0xf6, 0x60, + 0x53, 0x04, 0x58, 0x92, 0xd8, 0xf6, 0x04, 0x9e, 0x45, 0x2e, 0x6c, 0x1e, 0x8d, 0xee, 0xce, 0x31, + 0x75, 0xc4, 0xa6, 0xf5, 0xed, 0xbe, 0x3f, 0xf9, 0xc2, 0x9b, 0x52, 0x2e, 0xb4, 0x7d, 0xce, 0x98, + 0xcc, 0xf8, 0xcc, 0x63, 0x9e, 0x91, 0xf1, 0xb7, 0x8e, 0x1d, 0x19, 0xb2, 0xb9, 0x3d, 0x01, 0xbc, + 0x3e, 0xff, 0x1c, 0x33, 0x3c, 0x1f, 0x86, 0x13, 0x05, 0xf2, 0x9d, 0xae, 0xdb, 0xe7, 0x60, 0xd6, + 0xe2, 0x14, 0xbe, 0x5b, 0x10, 0x08, 0x84, 0x98, 0x9c, 0xca, 0x32, 0x3c, 0xd4, 0x4b, 0x6d, 0x4d, + 0x09, 0x8a, 0x10, 0xc4, 0xf7, 0xa7, 0x10, 0x1e, 0x05, 0x77, 0x9b, 0xb3, 0x40, 0xf3, 0x99, 0x8d, + 0x01, 0xba, 0xc6, 0xb3, 0x7c, 0xed, 0x3b, 0x87, 0xd8, 0xfa, 0xea, 0x38, 0xcb, 0x96, 0x85, 0xa8, + 0x0c, 0xeb, 0xf8, 0x3b, 0xec, 0xbc, 0xbc, 0xfd, 0x19, 0xee, 0xbe, 0x7b, 0x33, 0x52, 0x6a, 0x84, + 0x42, 0x21, 0x34, 0x4d, 0x43, 0x55, 0xd5, 0x02, 0xa2, 0x66, 0x31, 0x3d, 0x3d, 0xcd, 0xf6, 0xed, + 0xdb, 0xf9, 0xf7, 0x7f, 0xbf, 0x9d, 0xd2, 0x92, 0xc7, 0xf9, 0xc0, 0x4d, 0x35, 0xf8, 0x5c, 0xf3, + 0x97, 0x6b, 0x4a, 0xd8, 0xd7, 0x19, 0xe3, 0x57, 0x0f, 0xf7, 0x71, 0xd3, 0x0d, 0x8d, 0x5c, 0x72, + 0x7e, 0x39, 0x6e, 0xbb, 0x3a, 0x0f, 0xbc, 0x30, 0x10, 0x74, 0x0d, 0xa4, 0xf9, 0xc1, 0xdd, 0xc7, + 0xf8, 0xca, 0xbf, 0x1d, 0xa0, 0xa5, 0xd5, 0xc7, 0x97, 0x6e, 0x5b, 0xce, 0x45, 0xe7, 0x95, 0xe1, + 0x71, 0xaa, 0x28, 0x8a, 0xc0, 0x5e, 0xa6, 0x21, 0x85, 0x60, 0xc7, 0x9e, 0x29, 0xf6, 0xee, 0x9b, + 0xe4, 0x9b, 0xdf, 0x58, 0x85, 0xc3, 0x99, 0xdf, 0x48, 0x3e, 0x8f, 0x46, 0x7a, 0xd8, 0x20, 0x75, + 0x2c, 0x83, 0x7f, 0x8d, 0x1b, 0x0b, 0xc9, 0xd1, 0xe3, 0xfd, 0x0c, 0x05, 0xc6, 0x9f, 0xdf, 0xfe, + 0x53, 0x5e, 0xf8, 0xa3, 0x9b, 0x68, 0x80, 0xed, 0xcd, 0x96, 0xdc, 0x0e, 0x0f, 0xe6, 0x5e, 0x0d, + 0xb1, 0xfc, 0x70, 0xec, 0xae, 0xf8, 0x8b, 0xbf, 0x08, 0x35, 0xb7, 0x9c, 0xc5, 0x8a, 0x33, 0xd6, + 0xa2, 0xaa, 0xda, 0x29, 0x7d, 0xf2, 0x1b, 0x51, 0x69, 0xe6, 0xbd, 0x4f, 0x51, 0x58, 0xb4, 0x74, + 0x19, 0x5b, 0x36, 0x8f, 0x73, 0xa4, 0x6b, 0x8c, 0x05, 0xcd, 0x65, 0x64, 0x86, 0x73, 0x68, 0x01, + 0x75, 0x1e, 0x58, 0x02, 0xd0, 0x3b, 0x92, 0xe6, 0x5b, 0xdf, 0x3e, 0x48, 0x22, 0x61, 0x72, 0xc1, + 0x05, 0x95, 0x74, 0xb4, 0x79, 0xd0, 0x54, 0x41, 0x79, 0xa5, 0xc2, 0x3f, 0xdc, 0xd2, 0xc4, 0xe0, + 0x68, 0x86, 0x17, 0x5e, 0xfc, 0x3a, 0xb7, 0x7d, 0xee, 0x5f, 0x98, 0x8a, 0x56, 0x63, 0x77, 0x54, + 0x20, 0xa5, 0xc0, 0x34, 0x52, 0x98, 0xc6, 0x61, 0xd6, 0xad, 0x57, 0xb9, 0xf5, 0xc3, 0x95, 0x34, + 0xd5, 0xd4, 0xe6, 0x3b, 0x27, 0x4e, 0xe0, 0x5b, 0x8f, 0x46, 0x32, 0x24, 0xe2, 0x06, 0x1f, 0xfb, + 0x48, 0x2b, 0x4e, 0x4d, 0x14, 0xab, 0x1d, 0x12, 0x48, 0x1b, 0x92, 0xa3, 0xdd, 0x29, 0xee, 0xbe, + 0xe7, 0x18, 0x9b, 0x5f, 0x1c, 0xe6, 0x92, 0x4b, 0xaa, 0xb8, 0xfb, 0x47, 0xeb, 0x69, 0x6f, 0xf6, + 0xe4, 0x69, 0xbe, 0x85, 0x6d, 0x20, 0x05, 0xe4, 0x0c, 0xc9, 0xc6, 0xcd, 0x11, 0x3e, 0xfe, 0xf1, + 0xd7, 0x38, 0xe3, 0x8c, 0x52, 0xdc, 0x0e, 0x85, 0x55, 0x0b, 0x7d, 0x58, 0x59, 0x49, 0xaa, 0x37, + 0xc3, 0xc4, 0x33, 0x51, 0xc2, 0x57, 0x86, 0x0a, 0x2e, 0xc6, 0x42, 0x5a, 0x52, 0x98, 0xa6, 0x7c, + 0xf3, 0x19, 0x1d, 0x8f, 0xae, 0x1d, 0x7f, 0x30, 0xfd, 0x7c, 0xd9, 0xe6, 0xf6, 0x4c, 0xc3, 0x13, + 0xf2, 0xf0, 0xee, 0x55, 0x81, 0x40, 0x09, 0x2d, 0x6d, 0x0b, 0xfe, 0x47, 0x70, 0xaa, 0x10, 0x02, + 0x9b, 0x4d, 0x67, 0xe5, 0x9a, 0xb3, 0xd9, 0xb1, 0xe5, 0x69, 0x2a, 0x2b, 0xfc, 0x28, 0x1e, 0x85, + 0xcc, 0x40, 0xb6, 0xd0, 0xde, 0x23, 0x11, 0x32, 0xef, 0xf3, 0x42, 0x3e, 0x1b, 0x5f, 0xfe, 0xc2, + 0x52, 0x7a, 0xfa, 0x53, 0x5c, 0x77, 0xfd, 0x66, 0x76, 0xec, 0x88, 0xf0, 0xc1, 0xbf, 0x6d, 0xa5, + 0xa9, 0xde, 0x85, 0x66, 0x49, 0xaa, 0x4b, 0x75, 0xae, 0xbd, 0xaa, 0x96, 0xab, 0xaf, 0x82, 0x64, + 0xda, 0x64, 0x7c, 0x6a, 0x0a, 0xc3, 0x04, 0xb7, 0x4b, 0x21, 0xe4, 0x6b, 0x45, 0xd7, 0x44, 0xbe, + 0x04, 0x79, 0x42, 0x4b, 0xcc, 0x4c, 0x3a, 0x57, 0x55, 0xe6, 0xa0, 0xaa, 0xcc, 0x51, 0xcc, 0x04, + 0x72, 0x08, 0xc6, 0xc6, 0x32, 0x6c, 0x79, 0x2d, 0xc2, 0xaf, 0x7e, 0xd5, 0x8b, 0x04, 0xde, 0x7a, + 0x69, 0x35, 0x1f, 0xfb, 0x48, 0x3b, 0x55, 0xe5, 0x76, 0x14, 0xe6, 0x9e, 0x2b, 0x0f, 0xc6, 0x4c, + 0xc5, 0x4d, 0x7e, 0xf6, 0xcb, 0x1e, 0xbe, 0xfa, 0xc5, 0x7d, 0x9c, 0x61, 0x98, 0x54, 0x97, 0xdb, + 0x71, 0x3b, 0x54, 0xa4, 0x84, 0x74, 0x4f, 0x9a, 0xcc, 0xb8, 0x49, 0xe5, 0xf5, 0xa5, 0xa8, 0xae, + 0x7c, 0x41, 0x24, 0x1e, 0xcb, 0x90, 0x4c, 0x25, 0x8a, 0x01, 0xd9, 0x9b, 0x4e, 0xd9, 0xf9, 0xcd, + 0x79, 0xa3, 0xc3, 0x3c, 0x52, 0x76, 0x91, 0xee, 0xd0, 0x37, 0x97, 0xf5, 0x1e, 0x59, 0xd8, 0xd0, + 0xdc, 0x8c, 0x36, 0x27, 0xff, 0xfd, 0x43, 0x85, 0xec, 0xf1, 0x78, 0xa9, 0x6d, 0x5c, 0xc9, 0xa1, + 0x43, 0x47, 0x59, 0xdc, 0x5a, 0x41, 0xf4, 0xa9, 0x69, 0xa6, 0x17, 0x24, 0xf0, 0xaf, 0x74, 0x83, + 0xc8, 0xa3, 0x5d, 0x1e, 0xa7, 0x8a, 0x40, 0xd2, 0xd6, 0xe8, 0xe1, 0xda, 0x6b, 0x9a, 0x79, 0xf2, + 0xeb, 0xaf, 0xb3, 0xed, 0x89, 0x7e, 0xce, 0x7d, 0x4f, 0x23, 0xd7, 0x5d, 0xd7, 0x40, 0x7d, 0xb5, + 0x13, 0x5d, 0xcd, 0xe7, 0x7a, 0x1e, 0xbb, 0x82, 0xa7, 0xdc, 0x3e, 0x2f, 0xbf, 0x16, 0xf2, 0x84, + 0xb2, 0xce, 0x09, 0x00, 0xc5, 0x8c, 0x06, 0x4a, 0x60, 0xf7, 0xfe, 0x18, 0x8f, 0x3d, 0x39, 0x40, + 0x3a, 0x63, 0x72, 0xc6, 0xaa, 0x52, 0xbe, 0xfa, 0xd5, 0x95, 0x54, 0x96, 0x39, 0xd0, 0x0a, 0x65, + 0xcd, 0xb9, 0xd7, 0x2e, 0xa5, 0x24, 0x63, 0x4a, 0x76, 0x1f, 0x98, 0xe6, 0x2b, 0x5f, 0xd9, 0xcf, + 0xee, 0x8d, 0xa3, 0x5c, 0xee, 0x05, 0xbf, 0x53, 0xe4, 0x81, 0xc8, 0x42, 0x86, 0xe0, 0x6a, 0x75, + 0xe2, 0x6a, 0xa1, 0xd8, 0x04, 0x07, 0x90, 0x4c, 0x65, 0x31, 0x4c, 0x43, 0x4a, 0x54, 0xf8, 0x03, + 0xfb, 0xd2, 0x2a, 0xb6, 0xb4, 0xd8, 0xad, 0xb4, 0x29, 0xd4, 0xe6, 0x54, 0x76, 0xa8, 0xee, 0x8d, + 0xdb, 0x54, 0xff, 0x4b, 0xa5, 0x2b, 0xb3, 0xfe, 0xd0, 0x64, 0x24, 0xca, 0x13, 0x13, 0xfb, 0x72, + 0x0b, 0xe3, 0xb1, 0x18, 0x81, 0x60, 0xe8, 0xb4, 0x2c, 0x8b, 0xff, 0xba, 0xb9, 0x96, 0x54, 0xd7, + 0xd6, 0xb0, 0xfb, 0xd5, 0x03, 0xe8, 0xcb, 0x6c, 0x84, 0xde, 0x15, 0x60, 0xfc, 0xfe, 0x49, 0xe2, + 0x5b, 0x12, 0x38, 0x17, 0x38, 0x40, 0x05, 0xcd, 0xa7, 0xe2, 0x5d, 0xea, 0x42, 0xb7, 0x09, 0xae, + 0x7a, 0x67, 0x2d, 0x1b, 0x1f, 0xeb, 0x61, 0x6d, 0x6f, 0x82, 0xc8, 0x0f, 0x3b, 0xb9, 0xf9, 0x07, + 0x47, 0x68, 0x3a, 0xbf, 0x92, 0x2b, 0xdf, 0x55, 0xcf, 0xaa, 0xe5, 0x41, 0x2a, 0x4a, 0x6d, 0xb3, + 0x1a, 0x3b, 0x8b, 0xbb, 0xcd, 0x14, 0xa0, 0xe7, 0xd7, 0x68, 0xe7, 0x3e, 0x2f, 0xfc, 0xba, 0xa0, + 0xdd, 0xcb, 0xb2, 0xe5, 0x8b, 0xf2, 0xcf, 0x0d, 0x13, 0x61, 0x49, 0x90, 0x79, 0xe1, 0xca, 0xbc, + 0x63, 0x07, 0x21, 0x48, 0x66, 0x2d, 0x5e, 0x3f, 0x12, 0xe3, 0x27, 0xf7, 0x1d, 0xe3, 0xfe, 0xfb, + 0x7a, 0xe8, 0x30, 0x24, 0xd7, 0x86, 0x04, 0x21, 0x45, 0x32, 0x6a, 0x0a, 0x42, 0x41, 0x17, 0x8a, + 0x32, 0x0b, 0x77, 0xcd, 0xd0, 0x79, 0x84, 0xcc, 0x37, 0xb4, 0xa5, 0xd3, 0x39, 0x0c, 0xc3, 0x25, + 0x52, 0x99, 0x80, 0x80, 0x5e, 0x2a, 0xba, 0x9c, 0xee, 0xec, 0xae, 0x92, 0x0b, 0x8c, 0xd7, 0x7d, + 0x8b, 0xf5, 0x80, 0xba, 0x4b, 0xa9, 0x9b, 0xdc, 0x34, 0xfa, 0xb6, 0xfe, 0x79, 0x35, 0xd2, 0x8a, + 0x83, 0x65, 0x81, 0xd4, 0x93, 0xaa, 0xdf, 0x0c, 0xba, 0xde, 0x1d, 0x1f, 0x88, 0xb8, 0xa6, 0xb6, + 0xd8, 0x3e, 0x6c, 0xe5, 0x54, 0xbf, 0x1e, 0x19, 0xfb, 0x51, 0xe9, 0x21, 0x3e, 0x1b, 0x59, 0xc0, + 0xf8, 0xff, 0x48, 0xc0, 0x89, 0x68, 0x0b, 0xf1, 0xa8, 0x20, 0x9d, 0x9e, 0x24, 0x12, 0x19, 0x3b, + 0xa5, 0x80, 0xa5, 0x94, 0x85, 0x0e, 0x83, 0x38, 0x1e, 0x8f, 0xef, 0x24, 0x5a, 0xed, 0x29, 0x19, + 0x23, 0x76, 0x07, 0x0e, 0x77, 0x39, 0xa9, 0x6c, 0x8e, 0xe0, 0x99, 0x5e, 0xbc, 0x8b, 0x9c, 0xa4, + 0x7b, 0xb2, 0x48, 0x53, 0xa2, 0xb8, 0x14, 0x1c, 0xb5, 0x76, 0x94, 0x42, 0x34, 0xdd, 0x58, 0xe3, + 0xe4, 0xbd, 0x37, 0xb5, 0xf2, 0xf8, 0x3f, 0xef, 0xe2, 0x6c, 0x17, 0x34, 0x09, 0x8b, 0xe1, 0xe7, + 0x07, 0xf9, 0xde, 0x53, 0xfd, 0x8c, 0x86, 0xed, 0x9c, 0x71, 0x4e, 0x39, 0xe7, 0x9c, 0x5d, 0xc6, + 0x9a, 0x55, 0x21, 0x6a, 0xaa, 0x9d, 0x38, 0xed, 0x2a, 0xaa, 0x22, 0x39, 0x55, 0x5b, 0xd1, 0x49, + 0x29, 0x1f, 0xe0, 0xd2, 0x80, 0x9c, 0x55, 0xa0, 0x95, 0x09, 0x66, 0x08, 0x63, 0x16, 0x12, 0x53, + 0x42, 0x74, 0xda, 0x60, 0xdb, 0xce, 0x49, 0x1e, 0x7c, 0xa8, 0x97, 0xa7, 0x9f, 0x1a, 0x20, 0x1c, + 0xb5, 0xb8, 0xd2, 0x07, 0x2d, 0xbe, 0xd9, 0xc0, 0x33, 0x21, 0x25, 0x8d, 0x41, 0x0d, 0x55, 0x9d, + 0x5f, 0x65, 0x9a, 0x81, 0x62, 0x05, 0xa0, 0xeb, 0x1a, 0x59, 0x6f, 0x26, 0x93, 0x0e, 0x24, 0x9f, + 0x2e, 0xdb, 0xec, 0xbb, 0x2a, 0xfd, 0x2b, 0xf3, 0xab, 0xde, 0xa7, 0xb4, 0xa6, 0xba, 0x5c, 0xa9, + 0x98, 0xd4, 0xa6, 0xac, 0x81, 0x35, 0xb9, 0x23, 0xa1, 0x27, 0x7c, 0x37, 0x2b, 0x65, 0x99, 0xbd, + 0x96, 0x21, 0xcf, 0x66, 0x54, 0xf9, 0xa4, 0xf3, 0x2e, 0x73, 0xd1, 0x9a, 0x29, 0x57, 0xd9, 0xe2, + 0x4a, 0xbb, 0xb2, 0x74, 0xe1, 0x42, 0x3c, 0x5e, 0x81, 0x85, 0x64, 0xf3, 0x76, 0xf9, 0xa1, 0xfb, + 0x8c, 0xc1, 0x55, 0xa5, 0x3b, 0xd5, 0x73, 0x23, 0x2b, 0xa3, 0x99, 0x3f, 0x58, 0xc0, 0x5b, 0xce, + 0x3b, 0x24, 0x2f, 0xde, 0x58, 0xf3, 0xdd, 0x89, 0x70, 0xea, 0x9a, 0xe3, 0x47, 0xf6, 0xd5, 0xd6, + 0xd6, 0x35, 0xcc, 0x4b, 0x4f, 0xf2, 0xfc, 0x28, 0x83, 0x9d, 0x3b, 0xb7, 0xd0, 0xdb, 0xb3, 0x93, + 0xea, 0x9a, 0xa5, 0xac, 0x3e, 0xe3, 0x6c, 0x6c, 0xba, 0xfe, 0x7b, 0x89, 0xe5, 0x6e, 0x6f, 0x80, + 0x44, 0x2c, 0x8a, 0xdf, 0x65, 0xc7, 0xe6, 0xd7, 0xb0, 0x2d, 0xd5, 0x4e, 0xf9, 0x3e, 0x15, 0xc9, + 0x65, 0x17, 0x55, 0xf2, 0xf0, 0x43, 0x3d, 0x0c, 0xef, 0x9b, 0xa0, 0x42, 0x17, 0x54, 0xe8, 0x92, + 0x4a, 0x9b, 0x42, 0x3a, 0x9b, 0xa5, 0xff, 0xc9, 0x3e, 0xee, 0xfb, 0x75, 0x1f, 0x5f, 0xd3, 0x05, + 0xee, 0x5a, 0x0f, 0xeb, 0xd6, 0x96, 0xb2, 0x7a, 0x4d, 0x88, 0xc5, 0x8b, 0x82, 0x94, 0x97, 0xd9, + 0xf1, 0x7a, 0x34, 0x74, 0x5d, 0x41, 0x11, 0x02, 0x55, 0xcc, 0xd4, 0x66, 0xe5, 0x49, 0xf1, 0x84, + 0x25, 0xf3, 0xd1, 0x75, 0x36, 0x6b, 0x31, 0x39, 0x95, 0xe3, 0xe8, 0xf1, 0x38, 0xbf, 0xf9, 0xcd, + 0x10, 0xbf, 0xf9, 0xed, 0x30, 0xfd, 0x83, 0x12, 0x65, 0x2a, 0xce, 0xe5, 0x41, 0x68, 0x0b, 0xe7, + 0x49, 0xef, 0x32, 0x0f, 0x6b, 0xe5, 0x1b, 0xdb, 0x55, 0x08, 0xf8, 0xed, 0xf3, 0x70, 0xfb, 0xb9, + 0x9b, 0x48, 0x4a, 0x89, 0xcd, 0xa6, 0x21, 0x71, 0xda, 0xf7, 0x0f, 0x65, 0x5f, 0xa8, 0xff, 0xd9, + 0x42, 0xfb, 0xbb, 0xcf, 0xb9, 0x52, 0x5c, 0xfe, 0xdd, 0xcb, 0xa9, 0xab, 0xad, 0x23, 0x1a, 0x8d, + 0x2a, 0x0f, 0xfd, 0xfa, 0xa1, 0xf6, 0xef, 0x3c, 0xfe, 0x9d, 0x17, 0x26, 0x82, 0xc3, 0xc6, 0xfa, + 0x63, 0x6e, 0xc7, 0x45, 0x67, 0x56, 0x88, 0xf3, 0x6f, 0x2e, 0xa3, 0xb9, 0xd1, 0x83, 0x6e, 0x13, + 0x08, 0x2b, 0x5f, 0x84, 0x44, 0xc2, 0xe2, 0x85, 0x21, 0x76, 0x7e, 0x2d, 0xd9, 0xb0, 0xcb, 0x21, + 0x2a, 0x21, 0xda, 0xfd, 0x07, 0x0b, 0x18, 0xa0, 0xb7, 0xd4, 0xea, 0x73, 0xe9, 0xea, 0xed, 0x9e, + 0x43, 0x5d, 0x5f, 0x3f, 0x72, 0xe8, 0xa0, 0xbe, 0x78, 0xd9, 0xf2, 0x39, 0xd8, 0xb3, 0x20, 0x16, + 0x8b, 0x33, 0x34, 0xd8, 0x09, 0x18, 0xf4, 0xf5, 0xee, 0xa4, 0x24, 0x54, 0x49, 0xfb, 0x82, 0x8e, + 0xdf, 0xe7, 0x8d, 0xd1, 0x34, 0x1b, 0x99, 0x9c, 0x39, 0x8f, 0x5a, 0x7b, 0xba, 0xa3, 0xbc, 0x54, + 0xe7, 0xc6, 0x9b, 0x9a, 0xf9, 0xde, 0x27, 0x26, 0xb9, 0x58, 0xe6, 0x49, 0x01, 0x00, 0x76, 0xa0, + 0xc5, 0x21, 0x68, 0x75, 0x40, 0x46, 0xc2, 0xd8, 0x50, 0x8c, 0xfe, 0xfb, 0x63, 0x7c, 0xe7, 0x9e, + 0x2e, 0x22, 0x1a, 0x28, 0x41, 0x1b, 0x75, 0x8d, 0x1e, 0x5a, 0xda, 0x7c, 0x78, 0x3d, 0x1a, 0x75, + 0x75, 0xf9, 0x76, 0x16, 0xa7, 0xd3, 0x86, 0xd7, 0x9b, 0x27, 0x1d, 0x4c, 0x4f, 0x67, 0x49, 0x67, + 0x0c, 0x46, 0x47, 0xd3, 0x8c, 0x8d, 0xa5, 0x39, 0x74, 0x68, 0x9a, 0xae, 0x1e, 0x41, 0xa8, 0xa4, + 0x9e, 0x15, 0xcb, 0xcf, 0xe5, 0x13, 0x9f, 0x3c, 0x1b, 0xc3, 0x30, 0xb8, 0xfd, 0x73, 0x9f, 0xa5, + 0xd2, 0x1c, 0x2c, 0xd2, 0x65, 0xe7, 0x6a, 0x6a, 0x5c, 0x0a, 0xfc, 0x7e, 0x35, 0x1f, 0x8c, 0x9d, + 0x66, 0x35, 0x7e, 0xbf, 0x13, 0x7f, 0xda, 0xc6, 0xa5, 0x87, 0xde, 0xe5, 0x78, 0xff, 0xd7, 0x3e, + 0x42, 0x5b, 0x6b, 0x5b, 0x91, 0x7f, 0xed, 0x72, 0xb9, 0xb8, 0xe5, 0x83, 0xb7, 0x50, 0xfe, 0x70, + 0x99, 0xed, 0xb1, 0xc7, 0x6e, 0xb3, 0xfd, 0xdb, 0xd7, 0x5b, 0xa8, 0x0e, 0xdb, 0x91, 0x12, 0xb2, + 0x86, 0x64, 0x6c, 0x22, 0xc7, 0xf0, 0x70, 0x9a, 0x89, 0xa9, 0x0c, 0x4b, 0x17, 0xfa, 0x28, 0x0b, + 0xdb, 0x59, 0x12, 0x2e, 0x29, 0xd9, 0xd7, 0x9b, 0x5e, 0x0d, 0xfc, 0xcf, 0x04, 0x7c, 0x70, 0xf9, + 0xa0, 0xa5, 0xf7, 0xb8, 0xbe, 0x1f, 0xb0, 0x9c, 0xef, 0xf5, 0xed, 0xdd, 0x72, 0x66, 0x79, 0x45, + 0x25, 0x65, 0x15, 0x15, 0xa4, 0xd3, 0x06, 0xa3, 0xa3, 0x71, 0x62, 0xd3, 0xa3, 0xe4, 0x72, 0x89, + 0x22, 0x20, 0xd2, 0xdf, 0x7f, 0x94, 0xd6, 0xb6, 0xf6, 0x62, 0x6e, 0xfa, 0x06, 0x11, 0x17, 0x53, + 0xd1, 0x24, 0xb2, 0x36, 0x54, 0xf4, 0x9f, 0x9c, 0x32, 0x0d, 0x03, 0x55, 0x11, 0x9c, 0xbb, 0xa1, + 0x8c, 0xc7, 0xce, 0xab, 0xa4, 0x7f, 0xd3, 0x20, 0x0d, 0xf6, 0x59, 0x3f, 0x9b, 0xdf, 0xd5, 0x02, + 0x9b, 0x90, 0x54, 0xdb, 0x04, 0x35, 0x36, 0xc9, 0x5a, 0x20, 0x27, 0x05, 0x69, 0x33, 0x47, 0xe7, + 0xbe, 0x49, 0x5e, 0x1c, 0x2e, 0xe1, 0x7d, 0xd7, 0x5d, 0xc7, 0x74, 0x5c, 0xb0, 0xef, 0x40, 0x37, + 0xa6, 0x69, 0x92, 0x4e, 0xa7, 0x89, 0x44, 0xc6, 0xd8, 0xbb, 0xf7, 0x10, 0xda, 0x78, 0x84, 0x6a, + 0x1b, 0x58, 0x42, 0x90, 0x69, 0x5a, 0xc8, 0xdd, 0x77, 0x7f, 0x8f, 0x05, 0x0b, 0xda, 0x09, 0x04, + 0x02, 0xa8, 0xaa, 0x4a, 0x77, 0x77, 0x37, 0xf7, 0x36, 0x36, 0x31, 0x75, 0x70, 0x90, 0x80, 0x9a, + 0x1f, 0x45, 0x31, 0x53, 0x82, 0x90, 0x12, 0x92, 0x42, 0xa0, 0x69, 0x73, 0x3a, 0x29, 0xe7, 0xd6, + 0xb0, 0x67, 0x2c, 0x96, 0x53, 0xa7, 0xa6, 0xa6, 0x82, 0x8b, 0x2e, 0xbb, 0x9a, 0xc6, 0xa6, 0x76, + 0xc4, 0x9c, 0x08, 0x6e, 0x06, 0x8d, 0xbb, 0xfc, 0xf2, 0x2b, 0x38, 0x78, 0xf0, 0x00, 0x3b, 0x76, + 0x6c, 0x62, 0xa2, 0xd1, 0xc3, 0x6f, 0x37, 0x0e, 0xf1, 0xf2, 0xf6, 0x71, 0x8e, 0xeb, 0xb9, 0x5c, + 0xc4, 0x19, 0x55, 0x3f, 0xb5, 0xa8, 0x43, 0x59, 0xbf, 0x2a, 0x84, 0xcd, 0xa6, 0xd0, 0x50, 0xad, + 0x69, 0xb2, 0x34, 0xf3, 0xae, 0xf2, 0x43, 0x55, 0x0f, 0x8f, 0x2c, 0x18, 0x34, 0xfe, 0x60, 0x01, + 0x03, 0xec, 0xa9, 0x4f, 0x66, 0x3a, 0x5e, 0x09, 0xbf, 0x33, 0x6a, 0x33, 0x9e, 0xd9, 0xb5, 0x6d, + 0xf3, 0x8a, 0xb4, 0xd1, 0xce, 0x7f, 0xfe, 0xe7, 0x4e, 0xa6, 0xa6, 0x6c, 0x64, 0x32, 0x71, 0x4a, + 0x4a, 0x92, 0xac, 0x5d, 0xa7, 0xd1, 0xdc, 0x24, 0x48, 0xc4, 0x27, 0xc8, 0x65, 0xb3, 0x28, 0x0e, + 0xe7, 0x69, 0x79, 0xd4, 0x52, 0x4a, 0x7c, 0x3e, 0x1f, 0x03, 0x5d, 0x89, 0x22, 0xfb, 0x52, 0x9c, + 0x3e, 0x26, 0x03, 0x20, 0x1c, 0xd2, 0xb9, 0xfa, 0xbd, 0x0d, 0xdc, 0xfe, 0xf2, 0x08, 0x15, 0x96, + 0x89, 0x43, 0x91, 0xa7, 0xa0, 0xe6, 0xc9, 0x02, 0xc8, 0x28, 0xb1, 0x09, 0xb0, 0xa9, 0x50, 0x69, + 0x13, 0xbc, 0xae, 0x28, 0x5c, 0x79, 0xe5, 0x95, 0x74, 0x74, 0x74, 0x14, 0xe8, 0xad, 0x60, 0x49, + 0x8b, 0x78, 0x3c, 0xce, 0xe7, 0x3f, 0xff, 0x79, 0x8e, 0x46, 0x35, 0x6a, 0x99, 0x00, 0x00, 0x20, + 0x00, 0x49, 0x44, 0x41, 0x54, 0xdd, 0xf3, 0x1d, 0xce, 0xf1, 0xc1, 0x84, 0x01, 0x4f, 0x99, 0x06, + 0x55, 0x55, 0x95, 0x94, 0x94, 0x94, 0x14, 0x4d, 0x6d, 0x49, 0x49, 0x09, 0x4d, 0x2d, 0x2d, 0x4c, + 0xec, 0x7b, 0x89, 0xfa, 0x82, 0x99, 0x94, 0x42, 0x16, 0x46, 0x46, 0x80, 0xe9, 0x51, 0x29, 0x0d, + 0xdb, 0x67, 0x83, 0xf4, 0xd9, 0x84, 0xaa, 0x78, 0x7d, 0x9a, 0xa6, 0x52, 0x5d, 0xe5, 0xa6, 0xaf, + 0x77, 0x2b, 0xf5, 0x0d, 0xeb, 0x50, 0x14, 0xdb, 0x49, 0x2d, 0x40, 0x0e, 0x87, 0x83, 0x4b, 0x2e, + 0xb9, 0x8c, 0xeb, 0xaf, 0xff, 0x29, 0x91, 0xa6, 0xa4, 0x34, 0x2f, 0x48, 0x77, 0xda, 0xde, 0x6f, + 0x3e, 0x8d, 0x83, 0x2f, 0xe7, 0xb6, 0x89, 0x4f, 0x0e, 0x8e, 0x26, 0x3e, 0xa9, 0x28, 0x42, 0x11, + 0x52, 0x52, 0x1d, 0x76, 0xa2, 0x76, 0xd9, 0xdc, 0x86, 0xc7, 0x14, 0xff, 0x65, 0x0d, 0x2e, 0x3f, + 0x50, 0x2a, 0x50, 0x93, 0xe5, 0xb2, 0xaf, 0xca, 0x63, 0xda, 0xdc, 0x2d, 0x42, 0x18, 0x8a, 0x4c, + 0xd8, 0xa6, 0x95, 0x50, 0xdf, 0xc0, 0xf3, 0xa1, 0xb8, 0xb0, 0x9a, 0x6a, 0x7e, 0xf4, 0xfa, 0x93, + 0xa3, 0x77, 0xf6, 0xee, 0x0c, 0x69, 0x5f, 0xff, 0xfa, 0xbd, 0x34, 0xb7, 0x34, 0x93, 0x4e, 0xa5, + 0xd9, 0xb7, 0x6f, 0x3f, 0x8f, 0x3c, 0xf2, 0x30, 0x3f, 0xfe, 0xf1, 0x26, 0xce, 0x3c, 0xcb, 0xe0, + 0x2d, 0xe7, 0x4b, 0x1c, 0x2e, 0x90, 0xd6, 0x7c, 0xc5, 0x94, 0x72, 0xc6, 0x6f, 0x49, 0xbc, 0x5e, + 0x1f, 0x91, 0xf1, 0x2c, 0x91, 0xa9, 0x24, 0x65, 0x01, 0xd7, 0x1b, 0x6a, 0x3a, 0x52, 0xa2, 0x00, + 0x67, 0x9f, 0x59, 0xca, 0xe3, 0x17, 0x55, 0xd3, 0xff, 0x58, 0x2f, 0xcd, 0x8e, 0x93, 0x37, 0x82, + 0x14, 0xb3, 0xa4, 0x81, 0xbc, 0xa8, 0xc1, 0xa3, 0x49, 0x64, 0x26, 0x43, 0x76, 0x4e, 0x6b, 0x4b, + 0xde, 0xb7, 0xab, 0x78, 0xbd, 0x5e, 0x1a, 0x1b, 0x1b, 0xd9, 0x2e, 0x35, 0x0c, 0x69, 0xe2, 0x50, + 0x25, 0xa9, 0xc8, 0x28, 0x03, 0x03, 0x03, 0x34, 0x36, 0x36, 0x16, 0x53, 0x23, 0xbb, 0xdd, 0x4e, + 0x79, 0x79, 0x19, 0xdb, 0x0d, 0x05, 0x4b, 0x5a, 0xa8, 0x85, 0x4d, 0x24, 0x05, 0x98, 0x52, 0x60, + 0x7a, 0x74, 0x02, 0x3e, 0x1d, 0x59, 0x20, 0x35, 0xcc, 0x2d, 0x8b, 0xca, 0x19, 0x9f, 0x2c, 0x25, + 0x35, 0xd5, 0x41, 0x36, 0x6e, 0xda, 0xc8, 0x74, 0xf4, 0xdd, 0x04, 0x82, 0x0d, 0xa7, 0x5c, 0x6e, + 0x59, 0x59, 0x39, 0xc1, 0xaa, 0x5a, 0x26, 0xde, 0x95, 0xb8, 0xcf, 0xb6, 0x7a, 0xf0, 0x6f, 0x47, + 0x97, 0x0f, 0x65, 0x01, 0xfc, 0x5f, 0xaa, 0xdd, 0xba, 0xad, 0x33, 0x69, 0x8d, 0x4f, 0x65, 0x95, + 0xf2, 0x12, 0x3b, 0x08, 0x0b, 0xc4, 0x20, 0x52, 0x31, 0xff, 0x6b, 0x51, 0x74, 0xc9, 0x76, 0x4d, + 0xcb, 0xf5, 0x58, 0xdf, 0x57, 0x7f, 0x12, 0xbc, 0xae, 0x36, 0x31, 0x6d, 0x0b, 0x99, 0x80, 0xb4, + 0xc8, 0x99, 0x29, 0x86, 0x9c, 0x59, 0x26, 0x6d, 0x1e, 0x9e, 0xf6, 0xfb, 0x30, 0x7a, 0x93, 0xe2, + 0x73, 0x97, 0xbf, 0x9d, 0xe5, 0x2b, 0x96, 0x33, 0x1e, 0x19, 0xa7, 0xab, 0xab, 0x8b, 0xb7, 0xbd, + 0xed, 0x0a, 0xae, 0xb8, 0xe2, 0x72, 0x3a, 0x0f, 0x1f, 0xe6, 0x17, 0xf7, 0xdf, 0xcf, 0xad, 0x1f, + 0xf9, 0x1d, 0x1f, 0xbc, 0xa5, 0x83, 0x35, 0xeb, 0x6a, 0x0b, 0x66, 0x2c, 0xbf, 0x40, 0xab, 0xe0, + 0xbb, 0x11, 0x79, 0x0a, 0x4d, 0x65, 0x6d, 0x07, 0x2f, 0xbd, 0xbc, 0x87, 0x8b, 0x2f, 0x5c, 0x86, + 0x5b, 0x57, 0x11, 0x27, 0x28, 0xae, 0x60, 0xbe, 0x36, 0xf8, 0x5c, 0x2a, 0x37, 0xde, 0xd0, 0xc4, + 0x3f, 0x6f, 0x1e, 0xa6, 0x26, 0x99, 0xc5, 0xae, 0xcc, 0xbe, 0x4f, 0x48, 0x51, 0xdc, 0x40, 0x33, + 0x44, 0x37, 0x09, 0xd8, 0x85, 0xc4, 0x9a, 0x9e, 0x62, 0x78, 0x78, 0x98, 0xa5, 0x4b, 0x97, 0xce, + 0xa3, 0x00, 0x09, 0x21, 0x68, 0x6f, 0x6f, 0x27, 0xea, 0xf0, 0x92, 0x65, 0x0a, 0x3b, 0x02, 0x6f, + 0x2a, 0x4e, 0x5f, 0x5f, 0x5f, 0x81, 0xef, 0x2d, 0x67, 0x7b, 0x87, 0x5b, 0x5b, 0x79, 0x4e, 0xe8, + 0x18, 0x32, 0x8d, 0xa2, 0x14, 0xd8, 0x29, 0x52, 0x60, 0x48, 0x89, 0x69, 0x57, 0xb0, 0xeb, 0xe2, + 0xb4, 0xbd, 0xce, 0x33, 0x47, 0xc0, 0xef, 0x24, 0x14, 0x3c, 0xcc, 0xf1, 0x63, 0x2f, 0xb3, 0x62, + 0x55, 0x2d, 0x70, 0x72, 0xc6, 0x21, 0x2d, 0x89, 0xa9, 0xe4, 0xa4, 0x65, 0x4d, 0x74, 0x8b, 0xe3, + 0xb6, 0x62, 0x17, 0xb9, 0xe3, 0x6d, 0xe9, 0xd7, 0xa7, 0x8e, 0x9a, 0xe3, 0xd1, 0xe9, 0x5c, 0x79, + 0x45, 0x89, 0x8e, 0xcf, 0xab, 0xa3, 0x5a, 0x59, 0xd2, 0x46, 0xee, 0xf7, 0x0b, 0xb8, 0xa2, 0xbb, + 0x46, 0x58, 0xc7, 0xcc, 0x8b, 0x1c, 0xf7, 0x4c, 0x5d, 0xfb, 0x95, 0xb7, 0xb5, 0xe9, 0xe7, 0x9f, + 0x5f, 0x41, 0xd0, 0x9b, 0x7f, 0x4b, 0xce, 0x90, 0x8c, 0x8d, 0x67, 0x19, 0x1b, 0x4d, 0xb1, 0x77, + 0x5f, 0x94, 0x57, 0xa4, 0xc6, 0x53, 0x4f, 0xdc, 0xc1, 0x93, 0x4f, 0x3c, 0xcc, 0xf2, 0x15, 0x6b, + 0x18, 0x1b, 0x1b, 0xa3, 0xa3, 0xa3, 0x83, 0xda, 0xda, 0x5a, 0x16, 0x2f, 0x5a, 0xc4, 0x17, 0xbe, + 0xf0, 0x05, 0x8e, 0x1f, 0xbf, 0x89, 0x1f, 0xfe, 0xf0, 0x07, 0x3c, 0xf5, 0xe4, 0x73, 0x7c, 0xf0, + 0x96, 0x33, 0xf0, 0x78, 0x61, 0xfb, 0xb6, 0x17, 0x89, 0x44, 0x8e, 0x62, 0xb3, 0xb9, 0x59, 0xba, + 0xec, 0x3c, 0x9a, 0x9a, 0x5a, 0x68, 0x6d, 0x6f, 0x27, 0x3a, 0x35, 0xc1, 0xf6, 0x1d, 0xc7, 0x38, + 0x7b, 0x5d, 0x2b, 0x2a, 0xb3, 0x2d, 0xa4, 0xe2, 0x04, 0x2d, 0xce, 0x13, 0x50, 0x25, 0xcb, 0x97, + 0x04, 0x78, 0xcb, 0x35, 0xcd, 0x1c, 0xfd, 0xde, 0x21, 0x16, 0x3b, 0xf2, 0x6a, 0x2b, 0xc5, 0x89, + 0x51, 0xb1, 0x28, 0xf2, 0xb1, 0x75, 0x21, 0xf0, 0x66, 0x12, 0x6c, 0xd9, 0xb2, 0x05, 0x87, 0xc3, + 0x89, 0xdf, 0xef, 0xc3, 0xed, 0x76, 0x17, 0x89, 0x77, 0x52, 0x4a, 0x0c, 0xbb, 0x93, 0xac, 0x39, + 0x85, 0x5b, 0x83, 0x12, 0x61, 0xf0, 0xe8, 0xa3, 0x8f, 0x32, 0x39, 0x39, 0x89, 0xa2, 0x28, 0x98, + 0xa6, 0x49, 0x7f, 0x7f, 0x3f, 0x7b, 0x76, 0xef, 0xc1, 0xca, 0x66, 0x66, 0x45, 0x57, 0xf8, 0x80, + 0xb4, 0x25, 0x08, 0xd7, 0x79, 0xf1, 0xfa, 0x6c, 0x45, 0xad, 0x15, 0xa7, 0x0c, 0x2b, 0xf3, 0xc1, + 0x61, 0x4b, 0x4b, 0x29, 0x3b, 0x77, 0x3d, 0xce, 0x82, 0x8e, 0x8b, 0x70, 0xb9, 0xc3, 0xf3, 0x70, + 0x04, 0xd3, 0x34, 0x39, 0x7a, 0xfc, 0x28, 0xc3, 0x35, 0xfd, 0x19, 0x2b, 0x3b, 0x79, 0xef, 0xe4, + 0x95, 0xf1, 0xe2, 0x6e, 0xcc, 0xfd, 0x67, 0x45, 0xef, 0x54, 0x34, 0x35, 0x1d, 0x99, 0xc8, 0x94, + 0xb7, 0x35, 0xb9, 0xd1, 0x6d, 0x62, 0x5e, 0x53, 0xfa, 0x1b, 0x0a, 0xd8, 0x8a, 0x98, 0xf6, 0xec, + 0x3e, 0xef, 0x17, 0xae, 0xae, 0xf0, 0x38, 0xae, 0xb8, 0xb4, 0x12, 0xb7, 0xae, 0x90, 0x31, 0x2d, + 0xb2, 0x46, 0x3e, 0x2d, 0xac, 0x0c, 0xeb, 0x54, 0x87, 0x6d, 0xac, 0x5c, 0xec, 0xe7, 0x86, 0x6b, + 0xeb, 0xc9, 0x98, 0x16, 0x91, 0xb1, 0x1c, 0xaf, 0xbf, 0xbe, 0x87, 0x07, 0x1e, 0x8c, 0xd0, 0xd3, + 0xd3, 0x43, 0x4d, 0x4d, 0x4d, 0xa1, 0xae, 0xaa, 0xd0, 0xd2, 0xd2, 0xc2, 0x17, 0xbf, 0xf8, 0x25, + 0x76, 0xed, 0xda, 0xc5, 0xb7, 0xbf, 0xf5, 0x2d, 0x5c, 0x9e, 0x97, 0x68, 0x6f, 0x1b, 0x45, 0x51, + 0x20, 0x97, 0x9b, 0x62, 0xe7, 0x8e, 0xa7, 0x41, 0x5e, 0x4a, 0x73, 0x4b, 0x2b, 0xcb, 0x57, 0x9e, + 0xc1, 0xd6, 0x97, 0x9e, 0x65, 0x60, 0x70, 0x92, 0xba, 0xea, 0xd0, 0x1b, 0x53, 0xde, 0x85, 0xc0, + 0xa9, 0xc3, 0xbb, 0xaf, 0xac, 0xe5, 0x1f, 0x36, 0x0e, 0x52, 0xd3, 0x1d, 0x25, 0xa0, 0x9e, 0x9c, + 0xf0, 0x8a, 0x22, 0xb6, 0x9c, 0xb7, 0x18, 0x8d, 0xba, 0xc1, 0x93, 0xb7, 0x7f, 0x99, 0x5f, 0x7e, + 0xfd, 0xab, 0x28, 0x4e, 0x27, 0x42, 0xb7, 0x93, 0x05, 0x84, 0xaa, 0x61, 0x9a, 0x06, 0x72, 0x22, + 0x82, 0x59, 0x92, 0x17, 0x5a, 0x83, 0x03, 0x0e, 0x3e, 0xf9, 0x10, 0xf7, 0x3e, 0xf1, 0x6b, 0x32, + 0xe4, 0x53, 0x2b, 0x1d, 0x89, 0x4b, 0x81, 0x0e, 0x57, 0xa1, 0x69, 0xae, 0x60, 0x29, 0x24, 0x82, + 0x8c, 0x69, 0x51, 0x53, 0xe7, 0xc6, 0x69, 0x53, 0x66, 0xa7, 0x08, 0x9d, 0x60, 0x25, 0xe6, 0xba, + 0x9a, 0xd2, 0xa0, 0x87, 0x74, 0x6a, 0x07, 0xe3, 0xe3, 0x5d, 0x38, 0x5d, 0xa5, 0x48, 0x69, 0x91, + 0x4e, 0x67, 0xe8, 0xeb, 0xeb, 0xe3, 0x91, 0x47, 0x1e, 0xe1, 0x9e, 0x97, 0xef, 0x91, 0x89, 0x0f, + 0x0c, 0x3c, 0xa6, 0xb7, 0xd8, 0x06, 0xe6, 0xae, 0x49, 0x7f, 0x8b, 0x53, 0xc9, 0x3c, 0xad, 0x44, + 0x87, 0x87, 0x33, 0x48, 0x04, 0xc9, 0x94, 0x45, 0x4e, 0x5a, 0xff, 0x35, 0x01, 0x2b, 0x21, 0x73, + 0xad, 0xbb, 0x5f, 0x59, 0x7c, 0xe9, 0x45, 0x65, 0xb8, 0xec, 0x0a, 0x47, 0xba, 0x92, 0x7c, 0xfe, + 0x8b, 0xfb, 0xd8, 0xb3, 0x6f, 0x1a, 0x9f, 0x57, 0xa7, 0xbe, 0xde, 0xc9, 0xc2, 0x85, 0x3e, 0xd6, + 0xad, 0x2b, 0xa5, 0xb6, 0xc6, 0x4d, 0x65, 0x99, 0x9d, 0xca, 0x52, 0x9d, 0xea, 0xb7, 0x94, 0x33, + 0x30, 0x94, 0x2b, 0x52, 0x65, 0xe7, 0x2e, 0xc8, 0x66, 0xb3, 0xb1, 0x66, 0xcd, 0x1a, 0xda, 0xda, + 0xfe, 0x83, 0x3b, 0xee, 0xb8, 0x9d, 0x9e, 0x9e, 0x6f, 0xd1, 0xd8, 0x68, 0x14, 0x5e, 0xcf, 0xb0, + 0x77, 0xef, 0xf3, 0x84, 0xcb, 0xca, 0xf0, 0xf9, 0x02, 0x2c, 0x5e, 0xbe, 0x96, 0xe3, 0xdd, 0x5b, + 0xa9, 0xae, 0x0c, 0xa0, 0x15, 0xda, 0x3b, 0x4f, 0x15, 0x78, 0xcd, 0x3c, 0x6f, 0x6d, 0x72, 0x73, + 0xf5, 0x8d, 0xcd, 0x3c, 0xf0, 0x99, 0x5d, 0x9c, 0xab, 0x48, 0x54, 0x31, 0x6b, 0xc8, 0x2d, 0x29, + 0xe9, 0xcf, 0xc0, 0xce, 0x38, 0xc4, 0x2c, 0x49, 0x83, 0x5d, 0x61, 0xbd, 0x57, 0xb2, 0xc6, 0x4d, + 0x01, 0x22, 0x8c, 0x81, 0x88, 0x93, 0xb5, 0x20, 0x69, 0x81, 0x54, 0x25, 0xce, 0x32, 0x81, 0x4d, + 0xc9, 0x7f, 0x6a, 0xbb, 0x13, 0x3a, 0x9c, 0xf9, 0x5d, 0x22, 0x4e, 0xe0, 0x8c, 0x99, 0x45, 0x42, + 0xec, 0x6c, 0xaf, 0x56, 0x54, 0x0a, 0xea, 0xca, 0x1d, 0x88, 0x99, 0x9a, 0xf5, 0x0c, 0x06, 0x3e, + 0x2f, 0xfd, 0x93, 0x85, 0xd4, 0x5b, 0xa0, 0xdb, 0x6d, 0xd8, 0x1d, 0x39, 0xfa, 0x7a, 0x77, 0x31, + 0x1d, 0x73, 0xb1, 0x63, 0xc7, 0x4e, 0x1e, 0x7e, 0xe4, 0x61, 0x5e, 0x9d, 0x7a, 0xd5, 0x4c, 0xac, + 0x4d, 0x45, 0xf5, 0xbf, 0x53, 0x7f, 0xa2, 0x2f, 0xb0, 0x7d, 0x7a, 0xb4, 0x29, 0x93, 0x06, 0x28, + 0x7b, 0xd5, 0x6d, 0xb7, 0x72, 0xd6, 0xda, 0x4c, 0xe6, 0xf8, 0x17, 0x6c, 0x0d, 0xb9, 0x12, 0xd3, + 0xec, 0x28, 0x40, 0x9f, 0x39, 0x84, 0x56, 0x86, 0xae, 0x67, 0x81, 0xc8, 0x1b, 0x0b, 0x58, 0xf6, + 0x4f, 0xaa, 0xad, 0x86, 0x21, 0x96, 0x2e, 0x69, 0x25, 0x97, 0x93, 0xfc, 0xfa, 0xd1, 0x5e, 0x1e, + 0x89, 0x8d, 0x4b, 0xc7, 0x17, 0x1c, 0x91, 0x21, 0x17, 0xb9, 0xc3, 0x4c, 0x5a, 0x4f, 0x1e, 0x1a, + 0xce, 0xe5, 0x6e, 0xe8, 0x6c, 0x2c, 0xb7, 0xbb, 0xa9, 0xad, 0xd5, 0x39, 0xe3, 0x0c, 0x3f, 0x8b, + 0x16, 0x85, 0x78, 0xf6, 0x59, 0x9d, 0x73, 0xce, 0xad, 0x3a, 0x25, 0xa0, 0x21, 0xa5, 0x24, 0x10, + 0x08, 0xf0, 0x8e, 0x77, 0xbc, 0x93, 0x7f, 0xfd, 0xca, 0xaf, 0xa8, 0xaf, 0xef, 0x2e, 0x06, 0x5c, + 0x86, 0x11, 0xe5, 0xe8, 0x91, 0x43, 0xac, 0x5c, 0xb5, 0x96, 0x60, 0xa8, 0x84, 0xd1, 0x41, 0x3f, + 0x99, 0x8c, 0x81, 0xea, 0xd4, 0x8b, 0x41, 0xc9, 0x29, 0xfd, 0xb1, 0x10, 0xa8, 0xc0, 0x15, 0x97, + 0x57, 0xb3, 0xe9, 0xf9, 0x11, 0x7a, 0x7e, 0x37, 0x40, 0x53, 0xa1, 0x29, 0x24, 0x2b, 0x05, 0x9b, + 0xa3, 0x92, 0xe7, 0xe3, 0x90, 0xcd, 0x47, 0x3a, 0x1c, 0xcc, 0xe4, 0x07, 0xa6, 0xad, 0xf7, 0x89, + 0x22, 0x23, 0x29, 0x6d, 0x4a, 0x5e, 0x9e, 0x86, 0xdd, 0x49, 0x30, 0xa4, 0x64, 0x81, 0x43, 0xb2, + 0xc1, 0x2f, 0x08, 0x6a, 0x05, 0x76, 0x28, 0x12, 0x61, 0xe5, 0x87, 0xc9, 0xcc, 0xb6, 0xde, 0x88, + 0xa2, 0x68, 0xc5, 0x9c, 0x98, 0x7d, 0x5a, 0x53, 0x68, 0x6d, 0xf5, 0x16, 0x40, 0x94, 0x22, 0x20, + 0xfd, 0x86, 0x50, 0x2d, 0x98, 0xfc, 0xf4, 0xe7, 0xb7, 0xf1, 0x68, 0xa7, 0x25, 0xa3, 0xeb, 0x27, + 0x27, 0x6d, 0x7f, 0xad, 0x47, 0x14, 0xdd, 0xf6, 0x8f, 0x0e, 0x77, 0xee, 0x77, 0x63, 0x1b, 0xa2, + 0xe9, 0x62, 0xee, 0xfc, 0x43, 0xbb, 0x2b, 0xbd, 0x51, 0xfb, 0x49, 0xf8, 0x55, 0xde, 0xf9, 0x96, + 0x0a, 0x9f, 0x5a, 0x16, 0xb2, 0xe3, 0x76, 0xdb, 0x40, 0xe4, 0x9b, 0x08, 0xac, 0x31, 0xd5, 0x93, + 0x1b, 0xcf, 0xf8, 0x4f, 0x25, 0xe1, 0xa2, 0x80, 0x2b, 0x1e, 0xaf, 0x57, 0xd3, 0xaf, 0x59, 0xef, + 0x3d, 0xd3, 0xe5, 0xd5, 0x4b, 0x82, 0x76, 0x26, 0x26, 0x32, 0x6c, 0xdd, 0x3e, 0x81, 0xb6, 0xc1, + 0xb5, 0x45, 0xab, 0x31, 0x2e, 0x12, 0xa5, 0xe9, 0x14, 0x96, 0x85, 0xd5, 0x5b, 0xf6, 0x09, 0xab, + 0x34, 0xf1, 0xd5, 0x8f, 0xfd, 0xed, 0xe7, 0x44, 0x5b, 0x5b, 0x2b, 0x9b, 0x37, 0xbf, 0xc4, 0xd7, + 0x6f, 0x7f, 0x90, 0x5b, 0x6f, 0xfd, 0x07, 0xea, 0xeb, 0xeb, 0x4f, 0xd9, 0x7b, 0x3b, 0x53, 0xa3, + 0x4d, 0x24, 0x92, 0x58, 0x56, 0xae, 0x58, 0x57, 0x9e, 0x09, 0x5e, 0x06, 0x07, 0x8f, 0xd2, 0xb1, + 0x70, 0x29, 0x4e, 0xa7, 0x13, 0xbb, 0x33, 0x44, 0x22, 0x9d, 0xc1, 0xe5, 0xd4, 0x67, 0x37, 0xc8, + 0x09, 0xcc, 0xcb, 0xd9, 0xa2, 0x3e, 0x94, 0xf8, 0x34, 0x3e, 0xf4, 0x77, 0x6d, 0x7c, 0x6c, 0xcf, + 0x38, 0xe1, 0xa9, 0x0c, 0x3e, 0x05, 0x5e, 0x4f, 0x48, 0x36, 0xc5, 0x24, 0xb9, 0x39, 0xba, 0x63, + 0x02, 0xfb, 0x92, 0x92, 0x65, 0x1e, 0x70, 0x2b, 0xf9, 0x8d, 0xd2, 0x97, 0x81, 0x4d, 0x73, 0x36, + 0xc1, 0xcb, 0x49, 0x88, 0xe4, 0xe0, 0xbd, 0x61, 0xf0, 0xa8, 0x33, 0x55, 0xad, 0xfc, 0xcf, 0x62, + 0x89, 0xbb, 0xb0, 0xcb, 0x84, 0x9c, 0x45, 0xb1, 0x2c, 0x09, 0x51, 0xaf, 0x46, 0x79, 0xb9, 0xb3, + 0xe0, 0x16, 0xc4, 0x3c, 0x4a, 0xed, 0xc9, 0xd9, 0x40, 0xfe, 0xbf, 0x4d, 0xcb, 0x22, 0xfe, 0xf6, + 0xf1, 0xe3, 0x18, 0xe2, 0x22, 0x67, 0x83, 0x39, 0x28, 0xec, 0xd9, 0x4c, 0xa4, 0x2d, 0x31, 0xcf, + 0xde, 0x86, 0x5f, 0x0d, 0xd9, 0xd3, 0x2f, 0xca, 0x1f, 0x2e, 0xfc, 0x1d, 0x57, 0x7d, 0xe3, 0xb6, + 0x55, 0x62, 0xcd, 0x0a, 0x3f, 0xa6, 0x21, 0x31, 0x2d, 0x89, 0x62, 0x49, 0xce, 0x3d, 0xb3, 0x84, + 0x4f, 0xf5, 0x25, 0xce, 0xf9, 0xe1, 0xb6, 0xa9, 0x7d, 0xf2, 0x2e, 0x71, 0xf6, 0xd4, 0x2d, 0xf2, + 0xd8, 0x29, 0x49, 0x77, 0xb9, 0xb2, 0xa8, 0x5b, 0x4b, 0x4f, 0xaf, 0x5c, 0xbb, 0x26, 0x88, 0x2a, + 0x24, 0x23, 0x63, 0x19, 0xba, 0x72, 0x59, 0x53, 0x6f, 0xcf, 0xdd, 0x1b, 0x59, 0x1f, 0x4d, 0x8c, + 0xb5, 0xa6, 0xac, 0xb1, 0xf6, 0x8c, 0xa5, 0x8c, 0x98, 0x3f, 0xa1, 0x4a, 0x24, 0x15, 0x45, 0x70, + 0xc1, 0x05, 0x17, 0x70, 0xd3, 0x4d, 0x37, 0xf2, 0x9d, 0xef, 0xfc, 0x07, 0x37, 0xdf, 0x7c, 0xf3, + 0x49, 0xf0, 0xe5, 0xcc, 0x23, 0x9b, 0xcd, 0xb2, 0x73, 0xc7, 0x4e, 0xbe, 0xfd, 0xed, 0x6f, 0xd0, + 0xd6, 0x36, 0xc8, 0x89, 0xd8, 0x47, 0x26, 0x33, 0x41, 0x34, 0x3a, 0x55, 0xa0, 0xe4, 0x6a, 0x58, + 0xd6, 0x7c, 0x0f, 0x6c, 0x5a, 0x92, 0xa3, 0x23, 0x13, 0x6c, 0x3b, 0xd6, 0xcf, 0x54, 0x32, 0x3d, + 0x6f, 0x80, 0x9a, 0x40, 0xb0, 0x6a, 0x59, 0x80, 0x1b, 0xff, 0xae, 0x83, 0xd7, 0x72, 0x90, 0x94, + 0x92, 0xdd, 0xf1, 0xf9, 0xc2, 0x9d, 0x39, 0xc6, 0x4c, 0x88, 0x17, 0xb2, 0x09, 0x0b, 0xd0, 0xc5, + 0xc9, 0x8c, 0x87, 0x23, 0x39, 0xd8, 0x13, 0xcf, 0x6f, 0x26, 0x59, 0x80, 0x34, 0xe5, 0x5c, 0xf7, + 0xa9, 0xcc, 0x2d, 0x54, 0xe4, 0x25, 0x9e, 0xb5, 0xc0, 0xd7, 0xe6, 0xa7, 0xba, 0xd2, 0x39, 0xbf, + 0x9a, 0x55, 0xf8, 0x19, 0x4d, 0x67, 0xd9, 0xd7, 0x37, 0xc2, 0xd1, 0xd1, 0x09, 0xb2, 0x86, 0x89, + 0x94, 0x16, 0xd9, 0xac, 0x41, 0xd4, 0x4c, 0x1b, 0xd2, 0x69, 0xff, 0x52, 0x7d, 0xab, 0xfd, 0xf8, + 0xf8, 0x12, 0x2b, 0x15, 0x69, 0xcb, 0x9d, 0xe4, 0x4c, 0x73, 0xaf, 0xe8, 0x7e, 0xf5, 0x80, 0x78, + 0xfb, 0xb5, 0x6f, 0x6f, 0x10, 0xb1, 0x58, 0x16, 0x81, 0xc0, 0x6e, 0x13, 0xb8, 0xed, 0x79, 0xae, + 0x58, 0xc8, 0x6f, 0xe3, 0xc3, 0x7f, 0xd3, 0x2c, 0xbe, 0x72, 0xde, 0xb2, 0x8a, 0xf0, 0x41, 0xf7, + 0x73, 0x25, 0x4f, 0xb8, 0x3b, 0x4e, 0xcd, 0xaa, 0x1c, 0x72, 0x97, 0x97, 0xf6, 0x3b, 0x16, 0x37, + 0x35, 0xf8, 0x40, 0x4a, 0xfa, 0xfa, 0x13, 0x44, 0x1a, 0xb2, 0x51, 0xa5, 0x42, 0x3e, 0x35, 0x4f, + 0xe5, 0xeb, 0x94, 0x29, 0xa5, 0x45, 0x3e, 0x7d, 0xef, 0xfd, 0xf7, 0xb1, 0x73, 0xe7, 0x4e, 0x1a, + 0x1a, 0x1a, 0x38, 0xff, 0xfc, 0xf3, 0x71, 0x3a, 0x9d, 0x58, 0x96, 0x85, 0x69, 0x9a, 0xe4, 0x72, + 0x39, 0x12, 0x89, 0x04, 0x9d, 0x9d, 0x9d, 0x3c, 0xf8, 0xe0, 0x03, 0xfc, 0xc3, 0x47, 0x6f, 0xe5, + 0xe3, 0x9f, 0xb8, 0x86, 0x9a, 0xda, 0xdf, 0x50, 0x5d, 0x9d, 0x9f, 0x2f, 0x39, 0x37, 0x4d, 0xb1, + 0xac, 0x2c, 0xd3, 0xd1, 0x28, 0x48, 0xc8, 0x66, 0xb2, 0x64, 0xd2, 0x99, 0xa2, 0x00, 0x67, 0xa6, + 0xc9, 0xed, 0xee, 0x1e, 0xa0, 0x27, 0x32, 0xc9, 0x6b, 0x47, 0xfb, 0x48, 0x64, 0x8d, 0xb9, 0x2d, + 0xb8, 0xd8, 0x14, 0x78, 0xcf, 0x55, 0xb5, 0x54, 0x5e, 0x54, 0xc5, 0xab, 0xf1, 0xbc, 0x20, 0x4f, + 0x75, 0xa4, 0x81, 0x84, 0x35, 0x7b, 0xe7, 0xbd, 0x9a, 0xc0, 0x7b, 0x42, 0x35, 0xc2, 0x02, 0x0e, + 0x24, 0x05, 0x69, 0x8b, 0xa2, 0xe6, 0x8a, 0x82, 0x7d, 0x96, 0x72, 0xb6, 0xfa, 0x24, 0x85, 0x2c, + 0x22, 0x59, 0xd3, 0x16, 0xb4, 0x2d, 0x0a, 0xe0, 0xf7, 0xaa, 0xf3, 0xe8, 0xa2, 0x52, 0x4a, 0xa6, + 0x52, 0x19, 0x36, 0x1f, 0x3c, 0x4e, 0xe7, 0xe0, 0x28, 0xbb, 0xbb, 0xfa, 0xd9, 0xd7, 0x93, 0xef, + 0xd1, 0xca, 0xe5, 0x0c, 0xd2, 0x58, 0xa6, 0x92, 0x93, 0x3b, 0xb6, 0x2e, 0x88, 0x9d, 0xb6, 0xfa, + 0x6f, 0x25, 0x62, 0x94, 0x98, 0x59, 0x96, 0x2c, 0x0a, 0xb0, 0xf9, 0xa5, 0x31, 0xc6, 0xa7, 0x8d, + 0x79, 0xe6, 0x5f, 0x08, 0x81, 0xa6, 0xc0, 0x5b, 0xce, 0x2d, 0xe7, 0x4a, 0x77, 0x6d, 0x5d, 0x6e, + 0xc0, 0xfc, 0x5c, 0x78, 0xa7, 0xd3, 0x76, 0x92, 0x89, 0x56, 0x7c, 0xe9, 0xab, 0x9b, 0x22, 0x5e, + 0x7b, 0x59, 0x99, 0x8e, 0x65, 0xc2, 0xd1, 0x23, 0x71, 0x52, 0x9e, 0xda, 0xb4, 0xd6, 0xa3, 0x8c, + 0xc3, 0xfe, 0x59, 0x2d, 0xf8, 0xeb, 0xc1, 0x6c, 0x68, 0x93, 0xf6, 0xc5, 0xce, 0x60, 0xf7, 0x59, + 0xef, 0xfa, 0xd0, 0x35, 0x95, 0x4b, 0x2a, 0x3b, 0x58, 0xd0, 0xd6, 0x8e, 0xaa, 0xa9, 0x45, 0xd3, + 0x33, 0x3a, 0x3a, 0x42, 0x67, 0xe7, 0x41, 0x72, 0xb9, 0x09, 0x96, 0xaf, 0x08, 0x71, 0xf1, 0x25, + 0x6d, 0x5c, 0x75, 0x65, 0x07, 0x87, 0x3a, 0x07, 0x90, 0xd2, 0x3a, 0x21, 0x6c, 0x92, 0x30, 0x27, + 0x68, 0xb1, 0x24, 0x64, 0x32, 0xe6, 0x1c, 0x7f, 0x2b, 0x18, 0x9b, 0x4e, 0x30, 0x63, 0xf9, 0xa6, + 0xd3, 0x29, 0x46, 0xa7, 0x13, 0x34, 0x86, 0xfd, 0xf3, 0xe0, 0xc0, 0xa0, 0x57, 0xe3, 0x93, 0xff, + 0x67, 0x11, 0x37, 0x77, 0x46, 0x19, 0xdf, 0x7e, 0x6a, 0xb2, 0xa2, 0x21, 0x21, 0x9a, 0xcb, 0x83, + 0xd7, 0x02, 0x81, 0x69, 0xe5, 0x2b, 0x45, 0x27, 0x1e, 0xc3, 0xa6, 0x64, 0xca, 0x10, 0x38, 0xf5, + 0xd9, 0x9e, 0xe6, 0xb9, 0x41, 0x52, 0x1e, 0x1d, 0x2d, 0x4e, 0x3d, 0x65, 0x48, 0x51, 0xb8, 0x72, + 0x45, 0x08, 0xbb, 0x4d, 0x99, 0xdd, 0x00, 0x05, 0x4a, 0xd0, 0xa1, 0x81, 0x31, 0xd2, 0xb9, 0x5c, + 0x91, 0x8a, 0x3c, 0x32, 0x1d, 0x23, 0x95, 0x33, 0x48, 0x65, 0x0d, 0xa2, 0x96, 0x6b, 0xa2, 0x47, + 0xba, 0xe2, 0x70, 0xec, 0xf4, 0x15, 0xb7, 0xf6, 0xca, 0xec, 0x44, 0x24, 0xd9, 0xf7, 0xcf, 0x9f, + 0xdd, 0xdd, 0xee, 0xf7, 0xe9, 0x8c, 0x4f, 0x66, 0x08, 0xfb, 0xb5, 0xd9, 0x52, 0x64, 0xc1, 0x8a, + 0x39, 0x34, 0xc9, 0x85, 0xe7, 0x95, 0xf3, 0xd3, 0x67, 0x46, 0xaf, 0x48, 0x07, 0x65, 0x18, 0x52, + 0x83, 0x45, 0x01, 0x87, 0x8f, 0x04, 0x45, 0xfa, 0x31, 0x87, 0xb7, 0xb5, 0x56, 0x17, 0x4e, 0x5d, + 0x25, 0x67, 0x4a, 0x86, 0x46, 0x53, 0x58, 0x72, 0xf0, 0x5e, 0x12, 0xfa, 0x49, 0xfd, 0x9b, 0x13, + 0x7f, 0x65, 0xec, 0x2d, 0xdd, 0xea, 0x3c, 0x3f, 0xb9, 0x28, 0xbe, 0xfe, 0xd5, 0xc4, 0xee, 0xf7, + 0x6d, 0xd5, 0x9e, 0x5b, 0xaa, 0x18, 0x39, 0x96, 0x6f, 0x17, 0x7e, 0xef, 0x70, 0xd0, 0xb6, 0x66, + 0xfd, 0x4a, 0x6e, 0xbc, 0x79, 0x05, 0xb5, 0xb5, 0x7e, 0xfc, 0x01, 0x07, 0x02, 0xc1, 0xc8, 0xf0, + 0x10, 0x87, 0x8f, 0x38, 0x30, 0xcd, 0x24, 0xf3, 0x07, 0x85, 0x0a, 0x84, 0x50, 0x71, 0x3a, 0x5d, + 0x45, 0x2e, 0xd6, 0x64, 0x2c, 0x79, 0x42, 0xc8, 0x5c, 0x40, 0xa5, 0xe6, 0xcc, 0xd7, 0x9a, 0xa9, + 0x07, 0x15, 0x27, 0xce, 0x21, 0x69, 0x6f, 0x72, 0xf3, 0xcf, 0x9f, 0x5e, 0xca, 0xdf, 0x7f, 0xe4, + 0x35, 0xfa, 0x07, 0x4e, 0x1e, 0x6a, 0x63, 0x01, 0xcf, 0x4e, 0x4b, 0x50, 0x04, 0x36, 0x24, 0x3b, + 0x62, 0x30, 0x21, 0x4f, 0x36, 0xe5, 0x59, 0x04, 0x49, 0x4b, 0x14, 0x21, 0x48, 0x31, 0xc3, 0xe6, + 0x91, 0xb3, 0xa6, 0x59, 0x16, 0xae, 0xc9, 0x40, 0x32, 0x51, 0xe6, 0x64, 0xe1, 0x42, 0xff, 0x49, + 0x93, 0x72, 0x93, 0xb9, 0x1c, 0x91, 0x58, 0xac, 0x58, 0x94, 0x01, 0x41, 0xce, 0xb4, 0x48, 0x19, + 0x26, 0xa9, 0x44, 0x06, 0x33, 0xe3, 0xdc, 0x5f, 0x3d, 0xa6, 0xbf, 0xe1, 0xdc, 0x8e, 0xcc, 0xa0, + 0x66, 0xf3, 0x8c, 0xa4, 0x72, 0xff, 0xf8, 0x89, 0x0e, 0x26, 0xc6, 0xb3, 0xd8, 0xb4, 0x7c, 0x07, + 0xa5, 0x54, 0xf2, 0x20, 0x16, 0x80, 0x61, 0x4a, 0x52, 0x39, 0x8b, 0xea, 0x6a, 0x37, 0x61, 0x33, + 0x27, 0x8e, 0xc7, 0xe3, 0xf3, 0x4d, 0xb4, 0x70, 0x4d, 0xdb, 0x54, 0xd7, 0xf4, 0x99, 0x55, 0xe5, + 0x76, 0xec, 0xba, 0x82, 0x61, 0x4a, 0x46, 0xc7, 0x2d, 0x54, 0xd9, 0x6c, 0x89, 0x81, 0xc6, 0x53, + 0x7e, 0x70, 0x64, 0x5d, 0xff, 0xc1, 0xa9, 0xeb, 0xc7, 0x7f, 0xac, 0xaf, 0x4c, 0x5e, 0xa8, 0x2f, + 0xb6, 0x2a, 0xeb, 0xd7, 0xdb, 0xeb, 0x3a, 0xde, 0xeb, 0x7b, 0xe9, 0xa2, 0x8b, 0x0d, 0xde, 0xfa, + 0xd6, 0x6a, 0x96, 0x2c, 0xa9, 0x20, 0x10, 0x70, 0x16, 0x67, 0x47, 0x05, 0x83, 0x41, 0x7c, 0xbe, + 0xaa, 0x53, 0x46, 0x93, 0x8a, 0xa2, 0xe3, 0x72, 0xb9, 0x90, 0x52, 0x52, 0x5a, 0x56, 0xce, 0xd0, + 0xd0, 0xe4, 0xec, 0xb0, 0x52, 0x29, 0x09, 0xba, 0x9d, 0x45, 0x82, 0x9f, 0xaa, 0x28, 0x78, 0xec, + 0xfa, 0x6c, 0x61, 0xa2, 0xa0, 0x5f, 0xa2, 0xc0, 0x20, 0xbc, 0xe4, 0x82, 0x72, 0x3e, 0xf1, 0xb1, + 0x45, 0x78, 0xdc, 0x73, 0xd9, 0x5d, 0xb3, 0xbb, 0x65, 0xd4, 0x12, 0xfc, 0x62, 0x02, 0xee, 0x9b, + 0x80, 0x03, 0x39, 0x4e, 0xd9, 0xb9, 0xa8, 0x21, 0xb1, 0x2b, 0xb2, 0x00, 0x9c, 0xcc, 0x52, 0x42, + 0xa4, 0x28, 0xc0, 0xa0, 0x05, 0x61, 0x09, 0x29, 0x18, 0xcd, 0x41, 0xc3, 0xaa, 0x52, 0xea, 0x6a, + 0x5c, 0xb3, 0x30, 0xe9, 0x1c, 0x52, 0x9f, 0x69, 0xc9, 0x79, 0xdd, 0x21, 0x36, 0x55, 0xc5, 0xad, + 0x69, 0xa8, 0x9a, 0x82, 0x4d, 0x8f, 0xa0, 0xdb, 0xfb, 0xdf, 0x10, 0xff, 0x77, 0x05, 0xe4, 0xfb, + 0xcf, 0x14, 0x65, 0x8b, 0xd6, 0xaf, 0x0b, 0x13, 0x08, 0xda, 0x09, 0x05, 0x75, 0x2c, 0x0b, 0x1e, + 0x7d, 0x7a, 0x98, 0xb1, 0xa8, 0x81, 0x14, 0x30, 0x10, 0xc9, 0xf0, 0xf4, 0xef, 0x46, 0x48, 0x24, + 0x4d, 0x92, 0xa6, 0x89, 0x32, 0x67, 0x93, 0x15, 0xb2, 0x3e, 0x53, 0xb1, 0x5c, 0xb1, 0xf2, 0xfc, + 0x58, 0x06, 0x89, 0x99, 0x93, 0x4c, 0x8e, 0x5b, 0xc8, 0xb2, 0xd4, 0x6a, 0xe3, 0xfc, 0x7d, 0xb7, + 0x86, 0x36, 0xbb, 0x2e, 0xf2, 0x3f, 0xaa, 0xf8, 0xc3, 0x5b, 0x3d, 0xde, 0xca, 0x71, 0xc7, 0xbc, + 0x2d, 0x3f, 0xba, 0x66, 0xda, 0x1a, 0x5b, 0x67, 0x18, 0xbb, 0x97, 0xa5, 0x53, 0x43, 0xe9, 0xc0, + 0x6d, 0x93, 0xf6, 0xf4, 0xd4, 0xbe, 0xdd, 0xdb, 0x0a, 0x98, 0xef, 0x6c, 0xb4, 0x6b, 0xd3, 0x1d, + 0xd4, 0xd5, 0xb7, 0x23, 0x84, 0x5a, 0xec, 0x8e, 0xc8, 0xcb, 0x4f, 0xe0, 0x74, 0x96, 0xe2, 0xf1, + 0x78, 0xf3, 0x1b, 0xa1, 0xa4, 0x14, 0xdd, 0x59, 0xc7, 0xd0, 0xf0, 0x54, 0x51, 0x1f, 0xaa, 0x4b, + 0x7c, 0x34, 0x84, 0x43, 0x68, 0x8a, 0x42, 0x6d, 0x49, 0x90, 0x52, 0xaf, 0xab, 0x68, 0x06, 0x67, + 0x58, 0x39, 0x33, 0x21, 0x97, 0x2e, 0x04, 0x37, 0x5f, 0x5f, 0xcf, 0x87, 0x6e, 0x69, 0x2d, 0x04, + 0x73, 0xf2, 0x94, 0x09, 0x8a, 0xfc, 0x3d, 0xed, 0x1e, 0x5a, 0x11, 0xa9, 0x12, 0xb3, 0xa3, 0x88, + 0xe5, 0x8c, 0x56, 0xcb, 0x82, 0x56, 0x4b, 0x5e, 0x37, 0x60, 0xc3, 0xb9, 0x65, 0x38, 0xf5, 0x13, + 0xba, 0x7f, 0x25, 0xd8, 0x15, 0x05, 0xa7, 0xcd, 0x36, 0x0b, 0x75, 0x4a, 0x49, 0x4d, 0xc8, 0x8f, + 0xc3, 0xa6, 0xe2, 0x76, 0x3b, 0x70, 0xe9, 0x56, 0x4d, 0xa2, 0x22, 0x13, 0x7e, 0x23, 0x01, 0xc7, + 0x33, 0x87, 0x15, 0x97, 0x33, 0x81, 0x5d, 0x95, 0x5c, 0x76, 0x61, 0x39, 0x41, 0xb7, 0x42, 0x34, + 0x6e, 0xf0, 0xca, 0xcb, 0x11, 0x14, 0x25, 0xbf, 0xfe, 0xf1, 0xf1, 0x2c, 0x42, 0x51, 0x38, 0x74, + 0x28, 0x46, 0x44, 0xba, 0x73, 0x42, 0x0f, 0xca, 0xf9, 0x02, 0xce, 0x09, 0xd3, 0x1c, 0x14, 0xaf, + 0xcf, 0x6c, 0x56, 0xdd, 0xae, 0xb0, 0xa0, 0x55, 0xa3, 0xf5, 0xf1, 0x89, 0x0b, 0xd7, 0xdd, 0x51, + 0x72, 0xe7, 0xda, 0xef, 0x04, 0x9e, 0x6a, 0x78, 0xcc, 0x3b, 0xcc, 0x03, 0x9e, 0xc1, 0xec, 0x4e, + 0xf5, 0xd1, 0x92, 0x97, 0xfd, 0xc1, 0x53, 0xa2, 0x26, 0x25, 0xa3, 0x2f, 0xf6, 0x35, 0xe8, 0xdf, + 0x88, 0x4c, 0x1e, 0x97, 0x3d, 0x5d, 0xc7, 0x99, 0x4b, 0x88, 0x12, 0x02, 0x1a, 0x1b, 0x9a, 0x29, + 0x09, 0xb5, 0xcc, 0x16, 0x1b, 0x04, 0x08, 0xa1, 0xd0, 0xd8, 0xb8, 0x18, 0x67, 0x61, 0xb2, 0x81, + 0xaa, 0x28, 0xb4, 0x77, 0x2c, 0xe1, 0xc0, 0xc1, 0x09, 0x12, 0xe9, 0x3c, 0xbe, 0x6a, 0x13, 0x82, + 0x55, 0x0d, 0x55, 0x5c, 0xba, 0xa2, 0x83, 0x55, 0x8d, 0x55, 0xd8, 0x94, 0x7c, 0x6a, 0x32, 0x99, + 0x48, 0x31, 0x30, 0x31, 0x4d, 0x22, 0x9b, 0x2b, 0x42, 0x57, 0x42, 0xe4, 0xb1, 0xea, 0x5b, 0x3f, + 0xdc, 0xca, 0x4d, 0xd7, 0xd7, 0xa2, 0x69, 0x27, 0xb2, 0x37, 0x24, 0xf3, 0x47, 0x97, 0xc9, 0x82, + 0x15, 0x90, 0xd8, 0x14, 0x81, 0x4b, 0x53, 0xd0, 0x55, 0x85, 0xa8, 0x05, 0x53, 0x86, 0x2c, 0xb2, + 0xa6, 0x64, 0x31, 0x56, 0x98, 0x7d, 0xde, 0x9b, 0x85, 0xcc, 0x02, 0x3f, 0x1b, 0xce, 0x2e, 0x43, + 0x91, 0x27, 0xf6, 0x5b, 0x81, 0xc3, 0xa6, 0xb2, 0xb8, 0xae, 0x02, 0xb7, 0xc3, 0x8e, 0xae, 0xa9, + 0xb4, 0x54, 0x94, 0xd1, 0x51, 0x53, 0x86, 0x22, 0x04, 0x7e, 0xaf, 0x93, 0x2a, 0x35, 0xd8, 0xe1, + 0x98, 0xf6, 0xff, 0xd3, 0xea, 0xdd, 0x65, 0xa7, 0xad, 0xa9, 0xba, 0xfd, 0xcd, 0x72, 0x77, 0xb7, + 0x4a, 0xff, 0x60, 0x1a, 0x87, 0xae, 0x90, 0xce, 0xc1, 0x03, 0x0f, 0xf5, 0xb1, 0x6a, 0x55, 0x88, + 0x80, 0x57, 0x23, 0x63, 0x48, 0x36, 0x3d, 0x3f, 0xc2, 0x74, 0xd4, 0xe4, 0xae, 0xbb, 0x0f, 0x93, + 0xab, 0x4c, 0x3f, 0x80, 0xc3, 0x18, 0x9d, 0xe7, 0xe1, 0xc2, 0x4f, 0xf8, 0x6b, 0xc5, 0xcf, 0xad, + 0x6d, 0x77, 0x5e, 0xba, 0xa8, 0xfc, 0x3d, 0x6f, 0xaf, 0x46, 0x11, 0x82, 0xb4, 0x69, 0x81, 0xa6, + 0xa0, 0x16, 0x82, 0x89, 0x78, 0xd2, 0xe2, 0x85, 0x17, 0x23, 0x7c, 0xeb, 0x07, 0x87, 0xd8, 0x75, + 0x89, 0xf9, 0x82, 0xbe, 0xc4, 0xbc, 0x38, 0x72, 0xfe, 0xd4, 0x49, 0x34, 0x91, 0x0b, 0x5f, 0x6a, + 0x2c, 0x5f, 0x34, 0x18, 0xdf, 0xda, 0x31, 0x61, 0x6f, 0xb8, 0xe0, 0xa2, 0x77, 0xe1, 0xf6, 0xb8, + 0x99, 0x3b, 0xdb, 0x23, 0x16, 0x9b, 0xe6, 0xd5, 0xad, 0xcf, 0x31, 0x39, 0x79, 0x1c, 0x29, 0xa1, + 0xb2, 0x6a, 0x29, 0xeb, 0xd7, 0x9d, 0x87, 0x66, 0xd3, 0xe6, 0x4c, 0x0b, 0x10, 0xf4, 0xf7, 0x75, + 0x93, 0x8d, 0x1d, 0x64, 0xcd, 0xca, 0x7a, 0x54, 0x65, 0x3e, 0xcc, 0x27, 0x81, 0x9e, 0xb1, 0x28, + 0xbb, 0xba, 0xfb, 0x30, 0x2c, 0x0b, 0xbb, 0xa6, 0x71, 0x46, 0x73, 0x1d, 0x95, 0x01, 0xcf, 0xec, + 0x40, 0x72, 0x24, 0x7d, 0xc3, 0x19, 0x3e, 0xf7, 0xc5, 0xbd, 0xdc, 0xf7, 0xd3, 0x3e, 0xa4, 0x25, + 0x58, 0x55, 0x5f, 0xc9, 0xca, 0xc6, 0x1a, 0x6c, 0xaa, 0xc2, 0x68, 0x2c, 0xc1, 0x91, 0xa1, 0x51, + 0x8e, 0x0d, 0x47, 0xb0, 0x69, 0x36, 0xae, 0x3e, 0x7b, 0x25, 0xab, 0x1a, 0x6a, 0xa8, 0xf2, 0x7b, + 0x18, 0x4f, 0xa4, 0x38, 0x38, 0x34, 0xca, 0xab, 0x9d, 0x5d, 0x0c, 0xf5, 0x0f, 0xb0, 0x54, 0xcb, + 0xb2, 0xc0, 0x01, 0x0e, 0x55, 0x14, 0x05, 0x1d, 0x37, 0x05, 0x0f, 0x67, 0x04, 0x9f, 0xba, 0x63, + 0x15, 0xef, 0xbd, 0xb2, 0xa6, 0x30, 0x80, 0xf5, 0x14, 0x13, 0x73, 0x65, 0xbe, 0x2b, 0xd8, 0xb4, + 0x2c, 0x74, 0x65, 0x96, 0x74, 0x6f, 0x4a, 0x38, 0x70, 0x78, 0x90, 0xfb, 0x8e, 0x1c, 0x8d, 0xee, + 0x68, 0xb4, 0x9a, 0x36, 0xad, 0x1b, 0x9f, 0x38, 0x65, 0x65, 0x6f, 0xbf, 0xbf, 0x2a, 0xbb, 0x3d, + 0xf5, 0xe2, 0xba, 0x47, 0x43, 0xcd, 0x6f, 0x7d, 0x4b, 0x15, 0x07, 0x0e, 0x4c, 0xb1, 0x7f, 0x7f, + 0x94, 0x6f, 0xdc, 0xbe, 0x0a, 0x97, 0x4b, 0xe1, 0xc9, 0x27, 0x87, 0xb8, 0xf3, 0xae, 0xc3, 0x18, + 0x0e, 0x48, 0x5e, 0x1a, 0x1a, 0x77, 0x9d, 0xcf, 0x45, 0x63, 0x57, 0x0c, 0xec, 0x2c, 0x0a, 0x38, + 0xf4, 0x1b, 0x97, 0x2d, 0xf7, 0x8a, 0xbc, 0xe3, 0x92, 0xc3, 0xa1, 0x0f, 0x7f, 0xfb, 0x2b, 0xab, + 0x44, 0x79, 0xc8, 0x36, 0xbf, 0x2b, 0x41, 0xe4, 0xd3, 0x83, 0x8c, 0x21, 0x79, 0x7a, 0xe3, 0x28, + 0xc1, 0x90, 0xce, 0xc7, 0x6e, 0xdf, 0x9b, 0x3e, 0xba, 0xc2, 0x79, 0x71, 0xfc, 0x5f, 0xfb, 0x5e, + 0x3c, 0xd5, 0x45, 0x5d, 0xbc, 0xcb, 0x77, 0xc9, 0x59, 0x3b, 0xac, 0x47, 0xce, 0xac, 0xff, 0x2b, + 0xfb, 0xa2, 0xa5, 0xcb, 0x4e, 0x18, 0xff, 0x2c, 0x31, 0x8c, 0x1c, 0x53, 0x93, 0xf9, 0xc1, 0x2b, + 0x25, 0xa5, 0x61, 0xd4, 0x13, 0x3a, 0x11, 0x67, 0x26, 0xd7, 0xed, 0x7c, 0xed, 0x45, 0xd6, 0x2c, + 0xf7, 0x12, 0x0e, 0xba, 0x8b, 0xe4, 0xb5, 0xfc, 0xc8, 0x07, 0x8b, 0xcd, 0x07, 0xbb, 0x98, 0x4c, + 0x26, 0xf3, 0x01, 0x0c, 0xe0, 0xd4, 0x75, 0xce, 0x5b, 0xd8, 0x8c, 0xdb, 0x6e, 0x9b, 0x37, 0x4d, + 0xbe, 0x7f, 0x34, 0xc3, 0x67, 0xbf, 0xb0, 0x97, 0xdd, 0xcf, 0x67, 0xf9, 0xfe, 0x2d, 0xd7, 0xb2, + 0xb8, 0xbc, 0x34, 0xff, 0x4d, 0x2e, 0x85, 0x51, 0x4e, 0x7b, 0x7b, 0x87, 0xf8, 0xf5, 0xab, 0x7b, + 0x58, 0xd3, 0xda, 0xc0, 0xbb, 0xd7, 0x2c, 0xc9, 0x0b, 0xa1, 0xe0, 0x42, 0x12, 0x59, 0x83, 0x3d, + 0x7d, 0x83, 0xdc, 0xbd, 0xe9, 0x55, 0x0e, 0xec, 0x39, 0xc0, 0x05, 0x3e, 0x93, 0x52, 0x15, 0x0c, + 0x60, 0xe3, 0x94, 0xa4, 0xfd, 0xda, 0x06, 0xbe, 0x7c, 0xdb, 0x72, 0x82, 0x9e, 0x13, 0xfa, 0x97, + 0xe6, 0x4b, 0x78, 0xde, 0x3c, 0xec, 0xb9, 0x53, 0x74, 0xa3, 0xb1, 0x34, 0xbf, 0x78, 0x6a, 0xa7, + 0xf5, 0x60, 0x43, 0xe0, 0xd3, 0xbb, 0x57, 0xf5, 0x7d, 0x6d, 0x22, 0x18, 0x3f, 0xa5, 0xe7, 0x28, + 0xed, 0x54, 0x1b, 0xb2, 0xdb, 0x6a, 0x1e, 0xb7, 0x76, 0x27, 0x6a, 0xb5, 0x0a, 0x05, 0xf3, 0xa8, + 0x61, 0xf7, 0xee, 0xcc, 0x38, 0xa8, 0xd2, 0x65, 0xf2, 0x4a, 0x46, 0x71, 0x65, 0xb6, 0x88, 0x94, + 0xb2, 0x47, 0x5d, 0xc1, 0x13, 0x91, 0xc5, 0xf1, 0xed, 0xf3, 0xdc, 0x8d, 0x95, 0x36, 0x2e, 0xa9, + 0xef, 0xd4, 0x3f, 0xf0, 0x89, 0x0f, 0x77, 0x88, 0x70, 0x89, 0x6d, 0xb6, 0xa7, 0x63, 0x6e, 0x97, + 0xa1, 0x80, 0x81, 0x91, 0x0c, 0xdb, 0x76, 0x8c, 0xd3, 0xb1, 0xd0, 0xcb, 0xd2, 0x72, 0x8f, 0x43, + 0x93, 0xe2, 0x7d, 0x65, 0x77, 0xb5, 0x9c, 0x92, 0xdd, 0xdb, 0x5f, 0xe2, 0xd8, 0xd4, 0x53, 0x59, + 0xb2, 0xa9, 0xa7, 0xa7, 0x53, 0x66, 0xb3, 0x99, 0x79, 0x1e, 0x6f, 0x86, 0x17, 0x5d, 0x1a, 0xae, + 0x20, 0x5c, 0x56, 0x81, 0x72, 0x0a, 0xc6, 0x47, 0x1e, 0xf0, 0x50, 0xa8, 0xae, 0x69, 0x66, 0x78, + 0x34, 0x5a, 0x08, 0x6c, 0x66, 0xf3, 0xbe, 0x8c, 0x69, 0x91, 0x2c, 0x8c, 0x1b, 0x9c, 0x99, 0x17, + 0x99, 0xca, 0xe6, 0x18, 0x9d, 0x4e, 0xc0, 0x09, 0x93, 0x30, 0x6a, 0xca, 0xec, 0x7c, 0xf9, 0xf3, + 0xcb, 0x78, 0xcb, 0x3b, 0x7c, 0xdc, 0xf5, 0x9b, 0x17, 0x38, 0x36, 0x32, 0x8e, 0x65, 0x59, 0xa8, + 0x52, 0x12, 0x72, 0xd8, 0x39, 0xaf, 0xbd, 0x81, 0x3b, 0xae, 0x7b, 0x1b, 0xed, 0x15, 0xa5, 0x3c, + 0xb5, 0xeb, 0x10, 0x86, 0x99, 0xff, 0xca, 0x00, 0x69, 0x49, 0x5c, 0x9a, 0xca, 0xfa, 0xc6, 0x5a, + 0xbe, 0x7d, 0xe3, 0x3b, 0xf9, 0xf8, 0x0d, 0x57, 0xf1, 0xbc, 0xf4, 0x33, 0x64, 0xc0, 0x2b, 0xd3, + 0xe0, 0x38, 0x2b, 0xcc, 0x27, 0x3f, 0xd6, 0x41, 0xe0, 0x74, 0xc2, 0x9d, 0x91, 0xf0, 0xdc, 0x1e, + 0xe8, 0x39, 0x8f, 0x7c, 0x03, 0x9f, 0xc0, 0x6e, 0x2a, 0x8a, 0x0f, 0xe5, 0x1d, 0x7a, 0x46, 0xd5, + 0x4f, 0x67, 0xa6, 0x23, 0xed, 0x66, 0xb7, 0xad, 0x5e, 0xac, 0xb0, 0xb7, 0x53, 0xa6, 0x2f, 0xa2, + 0xcc, 0xfd, 0x0e, 0xb5, 0x21, 0xfd, 0x71, 0x73, 0x49, 0xe6, 0xa3, 0xc6, 0x62, 0xdb, 0xea, 0x6c, + 0x83, 0xfd, 0xe2, 0xd4, 0xbb, 0x1c, 0x57, 0xc7, 0x6f, 0x3b, 0x51, 0xb8, 0x00, 0x9a, 0x18, 0xe5, + 0x5f, 0x6f, 0x58, 0x51, 0xa7, 0x2f, 0x5b, 0xe4, 0xcb, 0x47, 0x5f, 0xe2, 0x04, 0xd4, 0x57, 0xe6, + 0x77, 0x60, 0x57, 0x57, 0x9c, 0xd7, 0x5f, 0x9f, 0x62, 0xd7, 0x8e, 0x29, 0x8e, 0x76, 0x27, 0xc8, + 0x55, 0x06, 0x24, 0xe6, 0xa9, 0xaf, 0xe9, 0x40, 0xdd, 0x68, 0xe6, 0xdc, 0x07, 0x6b, 0x6e, 0x88, + 0x98, 0x63, 0x87, 0xa3, 0x93, 0x93, 0x81, 0x70, 0x79, 0x05, 0x27, 0xb7, 0x35, 0x89, 0xdf, 0xc7, + 0xe4, 0xc1, 0xe7, 0x0f, 0x90, 0x8c, 0xaa, 0xf3, 0x90, 0x68, 0x49, 0x7e, 0x4a, 0x9e, 0xa6, 0x08, + 0xd2, 0x73, 0x68, 0xba, 0x52, 0x48, 0x26, 0x13, 0x29, 0x1a, 0xca, 0x82, 0x85, 0x79, 0x5b, 0xb3, + 0x7d, 0x4a, 0x95, 0xa5, 0x3a, 0x9f, 0xfd, 0xe7, 0x85, 0xfc, 0xe2, 0xc1, 0x5e, 0xfe, 0xfe, 0x47, + 0xf7, 0x73, 0xdd, 0xf2, 0xf5, 0x5c, 0xbe, 0x72, 0x11, 0x01, 0x97, 0x03, 0x2c, 0x0b, 0x4d, 0x08, + 0x56, 0x37, 0x54, 0xb3, 0xa8, 0xaa, 0x6c, 0x36, 0xb7, 0x9c, 0x33, 0x5c, 0xc6, 0xa9, 0x69, 0x5c, + 0xb6, 0xac, 0x83, 0xfd, 0x7d, 0xc3, 0xdc, 0xf5, 0xcc, 0x8b, 0x9c, 0x77, 0x69, 0x19, 0x5f, 0xfc, + 0xfc, 0x32, 0x1a, 0xaa, 0x9d, 0x88, 0x37, 0x2a, 0x7b, 0xcd, 0x81, 0x2c, 0x4d, 0x29, 0xe9, 0x1f, + 0x8f, 0x02, 0x82, 0xda, 0x92, 0xc2, 0xd8, 0xe1, 0x9c, 0x81, 0x69, 0x64, 0x65, 0x45, 0xca, 0xdc, + 0x61, 0xaa, 0xf2, 0x0d, 0x87, 0x95, 0x8e, 0x6f, 0xe8, 0x9e, 0xfb, 0xfa, 0x48, 0xfe, 0x91, 0xfe, + 0xfd, 0xc4, 0x77, 0xa7, 0x30, 0x17, 0x2f, 0xec, 0x08, 0x60, 0xb3, 0x09, 0x86, 0x23, 0x59, 0x82, + 0x7e, 0x0d, 0xbb, 0x26, 0xc8, 0x1a, 0x16, 0xa6, 0x05, 0x4e, 0x3d, 0x4f, 0xd1, 0x3c, 0x7a, 0x34, + 0xce, 0x92, 0x85, 0x01, 0xfe, 0xf6, 0xe3, 0x5b, 0x98, 0xbc, 0x2e, 0xb7, 0xd7, 0xb9, 0x36, 0x76, + 0x5b, 0xe4, 0xe2, 0xf4, 0x69, 0xeb, 0x54, 0x93, 0x8b, 0x46, 0xa3, 0xf5, 0xaf, 0xa9, 0x2f, 0x4c, + 0x4c, 0x4c, 0xbc, 0x3d, 0x5c, 0x5e, 0xce, 0x7f, 0xaf, 0x1d, 0x62, 0xce, 0xc4, 0xd7, 0xb9, 0x2d, + 0xf5, 0x05, 0xa6, 0x86, 0x5d, 0x53, 0xf1, 0x3a, 0x1c, 0x24, 0xd2, 0xd9, 0x59, 0x4f, 0x82, 0x40, + 0x3b, 0x0d, 0xff, 0x4b, 0x08, 0x81, 0xcf, 0xa5, 0xf2, 0xfe, 0xeb, 0x1b, 0x39, 0xeb, 0xac, 0x72, + 0xee, 0xfa, 0xfe, 0x5e, 0x7e, 0x76, 0xd7, 0x36, 0xfe, 0xaa, 0xad, 0x9d, 0x0d, 0x1d, 0xcd, 0xb4, + 0x55, 0x86, 0x09, 0xb9, 0x5d, 0x78, 0x5c, 0x5a, 0xa1, 0xd9, 0x6c, 0x86, 0x29, 0x6a, 0xd1, 0x37, + 0x11, 0x65, 0x77, 0xcf, 0x00, 0x4f, 0xef, 0x7a, 0x9d, 0x97, 0xbb, 0x8f, 0xf0, 0xa1, 0x7f, 0x6c, + 0xe5, 0xc3, 0x1f, 0x6c, 0xa7, 0xb2, 0xd4, 0xc6, 0xac, 0x61, 0x79, 0x43, 0xb2, 0x11, 0x52, 0x4a, + 0x7a, 0xc6, 0xa2, 0xec, 0xec, 0xea, 0xc3, 0x65, 0xd7, 0x29, 0xf5, 0xb9, 0x70, 0xe9, 0x36, 0x26, + 0xa3, 0x29, 0xa6, 0x89, 0x73, 0x2c, 0xac, 0x45, 0x85, 0xb0, 0xfe, 0x57, 0x7a, 0x59, 0x34, 0x59, + 0xf0, 0x13, 0x29, 0x43, 0xf2, 0xe3, 0x7b, 0xbb, 0xf8, 0xe0, 0xdf, 0xb6, 0xa0, 0x7b, 0x04, 0xdb, + 0x76, 0x4d, 0xa0, 0x6a, 0x2a, 0x6b, 0x57, 0x06, 0x10, 0x08, 0x96, 0x2e, 0x0d, 0x52, 0xd7, 0xe0, + 0xe5, 0x81, 0xde, 0xae, 0x89, 0x58, 0x1d, 0x17, 0x45, 0x2e, 0x4e, 0xbf, 0xe1, 0x0c, 0xe4, 0x6e, + 0x87, 0xd3, 0x59, 0x1e, 0x70, 0x9d, 0x9d, 0x4a, 0x25, 0x4e, 0xbb, 0xf8, 0xd9, 0xb6, 0xd4, 0x53, + 0xdc, 0x20, 0x99, 0x9f, 0x64, 0x67, 0x19, 0xb3, 0xc9, 0xea, 0xcc, 0x1d, 0x50, 0x04, 0xd4, 0x94, + 0x04, 0x18, 0x99, 0x8e, 0x61, 0x15, 0xee, 0x8b, 0x22, 0xa0, 0xdc, 0xef, 0x41, 0x9c, 0x26, 0x01, + 0x12, 0x12, 0x54, 0x29, 0x58, 0xd8, 0xe8, 0xe6, 0x1b, 0x5f, 0x5d, 0x42, 0xe7, 0xd1, 0x38, 0x0f, + 0x3f, 0xdc, 0xcf, 0x17, 0x37, 0xed, 0x24, 0xd2, 0x2f, 0xf1, 0x69, 0x1e, 0x2a, 0x83, 0x3e, 0x5c, + 0xba, 0x0d, 0x24, 0x8c, 0xc5, 0x12, 0x44, 0x62, 0x31, 0x26, 0x32, 0x71, 0x82, 0x15, 0x82, 0x33, + 0xcf, 0x0c, 0x73, 0xef, 0xbf, 0xae, 0x65, 0xd5, 0xf2, 0x00, 0x33, 0xf3, 0xc5, 0x65, 0xca, 0x86, + 0x31, 0xe0, 0x44, 0x6b, 0x9e, 0xce, 0x7f, 0xc0, 0x09, 0x85, 0xfe, 0x99, 0xba, 0xb0, 0x25, 0x25, + 0x43, 0x53, 0xd3, 0xa7, 0x6c, 0x7c, 0xcf, 0x9a, 0xb5, 0xc4, 0x7d, 0x99, 0xd1, 0xd1, 0xd2, 0xf8, + 0xff, 0xca, 0xec, 0x0e, 0x2d, 0xa5, 0xbb, 0x72, 0xdb, 0x77, 0x4c, 0xda, 0xea, 0xeb, 0xbc, 0xfc, + 0xf6, 0xb7, 0x03, 0xbc, 0xfd, 0xed, 0x35, 0x04, 0x3d, 0x2e, 0x3c, 0x5e, 0x1b, 0x0f, 0xfe, 0xba, + 0x8f, 0x25, 0x8b, 0xfd, 0xb8, 0x75, 0x58, 0x73, 0x46, 0x80, 0xa7, 0x7e, 0x37, 0x42, 0xca, 0x5f, + 0x63, 0x68, 0x53, 0x4a, 0x1c, 0x0e, 0xbf, 0xb1, 0x0e, 0x4a, 0xb0, 0xa4, 0xd0, 0x52, 0xc9, 0xf8, + 0xc9, 0xe5, 0xb5, 0x99, 0x29, 0x73, 0xa9, 0x24, 0xba, 0xdd, 0x81, 0xaa, 0x28, 0xa7, 0x92, 0x2f, + 0x99, 0x4c, 0x66, 0x66, 0x07, 0xce, 0x33, 0x7b, 0x8a, 0x94, 0xd4, 0x86, 0x7c, 0x44, 0x93, 0x61, + 0x0e, 0x0f, 0x8d, 0x22, 0x91, 0x54, 0x07, 0x83, 0x94, 0x78, 0x9d, 0x79, 0xf5, 0x13, 0x27, 0x5c, + 0xc8, 0x8c, 0xdd, 0x35, 0x05, 0xb9, 0x2d, 0x61, 0x70, 0x48, 0x16, 0x2f, 0xb1, 0xb1, 0xe8, 0x9f, + 0x3c, 0x7c, 0xe2, 0xa3, 0xed, 0xf4, 0x0f, 0x67, 0x18, 0x1e, 0x4e, 0x31, 0xd8, 0x9f, 0xe0, 0x78, + 0x57, 0x96, 0x64, 0xca, 0xe4, 0x82, 0x36, 0x3f, 0xe5, 0x95, 0x15, 0x54, 0x54, 0x38, 0xa9, 0xaf, + 0x72, 0xe2, 0x71, 0xa9, 0x79, 0xaa, 0xac, 0x90, 0xc8, 0x69, 0x1b, 0xd9, 0x9d, 0xa5, 0xc8, 0x71, + 0x1d, 0xfb, 0xa5, 0x43, 0xc5, 0x56, 0x15, 0x4e, 0x53, 0xb7, 0x56, 0x84, 0xa0, 0xcc, 0xef, 0x61, + 0x68, 0x72, 0x8a, 0x2a, 0xbf, 0x0f, 0x47, 0xa1, 0x77, 0xda, 0xe3, 0xb6, 0x63, 0x19, 0x4e, 0x92, + 0xc9, 0xff, 0xbd, 0x46, 0x34, 0xcd, 0x5e, 0xeb, 0xff, 0xc8, 0x77, 0x1f, 0x8a, 0x7d, 0xf3, 0xb9, + 0x97, 0xb6, 0x3b, 0xb7, 0xa7, 0x62, 0xf2, 0x0b, 0x5f, 0xde, 0x2b, 0x6e, 0xfd, 0xf0, 0x02, 0xca, + 0xca, 0x5d, 0x1c, 0x3b, 0x16, 0xe7, 0x33, 0xb7, 0xed, 0x65, 0xf5, 0xea, 0x52, 0x86, 0x86, 0x92, + 0xdc, 0xdb, 0xd9, 0x1d, 0x8b, 0x9d, 0x21, 0xde, 0xa9, 0xfa, 0xcb, 0x93, 0xbf, 0xef, 0xc4, 0x8e, + 0xb4, 0x3b, 0x21, 0xb0, 0x3d, 0x39, 0x36, 0x72, 0xfc, 0xda, 0x54, 0x62, 0x0d, 0x2e, 0xb7, 0x6b, + 0x5e, 0x9e, 0xd8, 0x75, 0xfc, 0x18, 0x3b, 0x77, 0xfe, 0x8e, 0x40, 0xa0, 0x9e, 0x73, 0xcf, 0xbb, + 0x30, 0xdf, 0x30, 0x2e, 0xc4, 0x3c, 0x55, 0x95, 0x27, 0x38, 0xb8, 0xb9, 0xb7, 0x50, 0x55, 0x04, + 0x4b, 0xea, 0xca, 0x68, 0x2a, 0x0f, 0x92, 0x33, 0x2c, 0xfc, 0x2e, 0x7b, 0x81, 0xba, 0x32, 0xeb, + 0xab, 0xe7, 0xff, 0x9d, 0x00, 0x9b, 0x85, 0xbe, 0x61, 0x84, 0xdc, 0xbe, 0x52, 0x12, 0xdf, 0x6d, + 0x46, 0x29, 0xcf, 0xa2, 0x2f, 0x9b, 0xa2, 0xa5, 0x39, 0x4e, 0x5b, 0xad, 0x13, 0xb9, 0x36, 0x98, + 0xaf, 0x64, 0xc9, 0xbc, 0x50, 0x84, 0x00, 0xa1, 0x14, 0xe8, 0x40, 0x49, 0x0d, 0xa3, 0xdb, 0x43, + 0x76, 0x57, 0x00, 0xab, 0xdb, 0x81, 0x6d, 0x45, 0x0c, 0xfb, 0xe5, 0x03, 0x08, 0x9b, 0x39, 0xbf, + 0x1d, 0xe6, 0x84, 0xaf, 0x23, 0x98, 0xf9, 0x02, 0xb0, 0xe6, 0xb2, 0x10, 0x35, 0x21, 0x3f, 0x76, + 0x4d, 0x29, 0x7c, 0xf1, 0x16, 0x84, 0x82, 0x6e, 0x5a, 0xab, 0x53, 0x34, 0x44, 0xec, 0x81, 0xc1, + 0x49, 0x97, 0x18, 0x0b, 0xfe, 0xbf, 0x97, 0xb4, 0x66, 0x0c, 0x7b, 0xff, 0x93, 0xff, 0x3b, 0xd5, + 0x7d, 0xc8, 0x9e, 0xfc, 0x6b, 0xb7, 0x6e, 0x7f, 0xed, 0x99, 0xa7, 0x73, 0x57, 0x3f, 0x77, 0xc7, + 0x96, 0x25, 0x01, 0x4c, 0x22, 0xba, 0x86, 0x55, 0x6a, 0x8d, 0xde, 0x7d, 0xfc, 0xf8, 0xb8, 0xe2, + 0x0c, 0x0c, 0x6a, 0xd7, 0xf3, 0xf5, 0xa9, 0x73, 0xa3, 0xaf, 0x40, 0xf4, 0xf7, 0x9e, 0x38, 0x6b, + 0x1b, 0xb7, 0xd2, 0xa5, 0xea, 0x58, 0xba, 0xcb, 0xa4, 0xaf, 0xa7, 0x8b, 0xf6, 0x85, 0x8b, 0x8a, + 0x37, 0xdf, 0x34, 0x4d, 0x7a, 0x7a, 0x0e, 0x63, 0x59, 0x71, 0xc6, 0xc7, 0x0f, 0xd1, 0xdf, 0xdf, + 0x4e, 0x63, 0x63, 0xf3, 0x49, 0x0c, 0x4a, 0xaf, 0xc7, 0xc3, 0x48, 0x5f, 0xaa, 0x88, 0x3c, 0x89, + 0x39, 0xda, 0x9f, 0x47, 0x69, 0x04, 0x5e, 0xbb, 0x9e, 0x67, 0xbe, 0x9f, 0x10, 0xd8, 0x9c, 0x38, + 0xa2, 0x58, 0xce, 0xf1, 0x04, 0xda, 0xd2, 0x08, 0x4a, 0x63, 0x94, 0xdc, 0xcb, 0x61, 0x32, 0x4f, + 0x95, 0x41, 0xba, 0x1c, 0xe1, 0xb6, 0x10, 0xe1, 0x2c, 0xc2, 0x63, 0xa2, 0x84, 0x33, 0x98, 0x42, + 0x42, 0x56, 0xc3, 0x1a, 0xd3, 0xb1, 0xc6, 0x6d, 0xc8, 0x88, 0x06, 0x52, 0xa0, 0xd4, 0xa7, 0x71, + 0x5c, 0x3b, 0x80, 0xd6, 0x10, 0x2f, 0x46, 0xc9, 0xa7, 0xf4, 0xc0, 0x27, 0x4c, 0x82, 0x57, 0x14, + 0x81, 0xb3, 0x30, 0xf8, 0x7c, 0xe6, 0x9a, 0x74, 0x4d, 0xa5, 0xa1, 0xda, 0x27, 0x2a, 0x07, 0x87, + 0xde, 0xd1, 0xf0, 0x7a, 0xd9, 0xbf, 0x8d, 0xd1, 0x9d, 0xf9, 0x7f, 0x2e, 0xe0, 0xf1, 0x6b, 0x0f, + 0x4a, 0xe0, 0x37, 0x85, 0x07, 0xa1, 0x17, 0xe5, 0xbf, 0x1b, 0x86, 0x70, 0x8d, 0xa6, 0x33, 0xa8, + 0x41, 0x1d, 0xf7, 0x55, 0x46, 0x96, 0x32, 0xcb, 0x50, 0xf5, 0x09, 0x63, 0x40, 0xfc, 0xd7, 0xa7, + 0x78, 0xbd, 0xd2, 0x96, 0xb1, 0x42, 0x3b, 0x7d, 0x1b, 0x1b, 0xbc, 0xd6, 0xdf, 0x1d, 0x3f, 0xba, + 0x47, 0xaf, 0xad, 0xaf, 0xc7, 0xe5, 0xf6, 0xcc, 0xc3, 0x82, 0xf2, 0x6b, 0x35, 0x99, 0x9c, 0x88, + 0xcc, 0x17, 0x70, 0x41, 0x42, 0x6e, 0x8f, 0x87, 0x68, 0x0c, 0x52, 0xe9, 0x1c, 0x2e, 0x87, 0x6d, + 0x3e, 0xb5, 0xb2, 0x50, 0x3c, 0xc8, 0x64, 0x72, 0x18, 0x85, 0x39, 0x97, 0xba, 0x6e, 0xc3, 0x66, + 0x53, 0x67, 0x3b, 0xfd, 0xe5, 0x2c, 0xfa, 0x94, 0xcd, 0x19, 0x24, 0x12, 0x69, 0x62, 0xa9, 0x4c, + 0x91, 0x2c, 0x67, 0x5b, 0x39, 0x86, 0x77, 0x95, 0x07, 0x75, 0xc2, 0x87, 0xd2, 0xeb, 0xc3, 0xea, + 0x75, 0x61, 0xf6, 0x69, 0x98, 0x9d, 0x4e, 0x30, 0x05, 0x28, 0x12, 0xe1, 0xb2, 0x10, 0x7e, 0x13, + 0xed, 0xbc, 0x18, 0xda, 0x82, 0x18, 0x4a, 0x38, 0x05, 0x8a, 0x9c, 0x2d, 0x42, 0x48, 0x39, 0xbf, + 0x0f, 0x89, 0x22, 0xa1, 0x33, 0x3f, 0x13, 0xac, 0xc0, 0xba, 0x60, 0x0e, 0x6d, 0x76, 0x6e, 0x97, + 0xa3, 0xa2, 0xaa, 0x78, 0xba, 0xbd, 0x6a, 0x69, 0xd4, 0x25, 0x4e, 0xd3, 0x9c, 0xf0, 0x3f, 0x13, + 0xf0, 0x49, 0x95, 0xa2, 0x73, 0x12, 0x59, 0xa0, 0xf0, 0xa5, 0x8a, 0x31, 0xf8, 0xe8, 0x1f, 0x7e, + 0xf2, 0x21, 0xd5, 0xbb, 0xb1, 0xcb, 0xed, 0x79, 0xda, 0x39, 0x32, 0xfc, 0xb6, 0x43, 0x07, 0xf7, + 0x8b, 0xe5, 0x2b, 0xf3, 0x5f, 0xaa, 0xa1, 0x69, 0x2a, 0xe1, 0x70, 0x15, 0xa3, 0xa3, 0xaf, 0x17, + 0x18, 0x1b, 0xa7, 0x20, 0xcc, 0x21, 0xd0, 0x75, 0x3b, 0xfe, 0x50, 0x3d, 0xdb, 0x77, 0x75, 0xb3, + 0x66, 0x75, 0x73, 0xfe, 0x8b, 0x23, 0x2d, 0x49, 0x2c, 0x9e, 0xa6, 0xaf, 0x2f, 0xc2, 0xb1, 0xae, + 0x49, 0x26, 0x26, 0x0d, 0x72, 0x46, 0x02, 0xcb, 0x8a, 0xa1, 0xdb, 0x34, 0xbc, 0x1e, 0x17, 0x7e, + 0x9f, 0x87, 0x60, 0xd0, 0x83, 0xdf, 0xeb, 0x24, 0x93, 0xcd, 0x31, 0x38, 0x3c, 0xc9, 0xc8, 0xc8, + 0x24, 0xa9, 0x34, 0x68, 0x5a, 0x35, 0xbe, 0x40, 0x33, 0xaa, 0xa2, 0x91, 0x88, 0x0f, 0x91, 0x4e, + 0x1f, 0x40, 0xd7, 0x33, 0x78, 0xbd, 0x2e, 0x42, 0x2d, 0x3e, 0xc2, 0x21, 0x1f, 0x7e, 0x97, 0x0f, + 0x5d, 0xb7, 0xe5, 0x7b, 0x95, 0x75, 0x0b, 0xa9, 0xe4, 0x67, 0x53, 0x8f, 0x8d, 0x4f, 0xd3, 0xbf, + 0x27, 0x42, 0x3a, 0x9d, 0x45, 0x55, 0x04, 0x15, 0x15, 0x21, 0xea, 0x6a, 0xc3, 0xf8, 0x7c, 0x2e, + 0x34, 0x55, 0xc1, 0x30, 0x2d, 0x62, 0xb1, 0x14, 0x83, 0x83, 0x13, 0x0c, 0x0c, 0x4d, 0x90, 0x48, + 0x26, 0x51, 0x15, 0x85, 0x96, 0xa6, 0x6a, 0xda, 0xda, 0x2a, 0x71, 0x3b, 0xed, 0xf3, 0xb0, 0xea, + 0x4c, 0xce, 0x60, 0x64, 0x78, 0x82, 0xa9, 0x95, 0x63, 0xd1, 0xa3, 0x4d, 0xca, 0xff, 0x4e, 0x90, + 0xc5, 0xff, 0xe2, 0xb1, 0x63, 0xd9, 0x40, 0xba, 0x72, 0x53, 0xd3, 0xf5, 0x0e, 0x4d, 0xfe, 0x52, + 0xed, 0xda, 0x76, 0x69, 0x65, 0x65, 0x35, 0x95, 0xd5, 0xb5, 0x48, 0x09, 0x0d, 0x8d, 0x2d, 0x74, + 0x77, 0x1f, 0x20, 0x1e, 0x1f, 0xc1, 0xe7, 0x0b, 0x9c, 0x14, 0xa0, 0x49, 0x69, 0x31, 0xd0, 0xd7, + 0x4b, 0xf7, 0xb1, 0xfd, 0x4c, 0x47, 0x07, 0xe8, 0xea, 0x1e, 0xc4, 0xeb, 0xf5, 0x10, 0x8f, 0x67, + 0x30, 0xad, 0x4a, 0xda, 0x16, 0x5c, 0xcb, 0xfa, 0x0d, 0xe7, 0x62, 0x77, 0xf8, 0x48, 0xa7, 0xa6, + 0x19, 0x1d, 0x39, 0xc0, 0x40, 0xff, 0x6b, 0xf4, 0xf7, 0x3f, 0xc7, 0xc8, 0x58, 0x37, 0x92, 0x2c, + 0x42, 0x48, 0x8c, 0x1c, 0xd8, 0x6c, 0x4b, 0x58, 0xbe, 0xe2, 0x6f, 0xa8, 0xad, 0x5b, 0x47, 0x69, + 0xb8, 0x0d, 0x97, 0x2b, 0xdf, 0xad, 0x90, 0xcd, 0x26, 0x88, 0x8c, 0x1d, 0xa6, 0xaf, 0x67, 0x0b, + 0xfb, 0xf7, 0x3f, 0x46, 0xe7, 0x91, 0x17, 0x71, 0x39, 0x25, 0x9a, 0x6d, 0x16, 0x2a, 0x51, 0x2c, + 0x81, 0x33, 0x67, 0xc3, 0x9b, 0xd6, 0x19, 0x1c, 0xb2, 0xd8, 0x9d, 0x70, 0x72, 0xe1, 0xc5, 0x57, + 0xa0, 0x58, 0xc3, 0xec, 0xd9, 0x7f, 0x94, 0xed, 0x3b, 0xf7, 0xa0, 0x69, 0x0a, 0x9a, 0xa6, 0xa0, + 0x28, 0x5e, 0x6c, 0x7a, 0x29, 0xf1, 0x84, 0x8b, 0xc1, 0x41, 0x0f, 0x7d, 0xbd, 0x47, 0xe8, 0x58, + 0x60, 0x63, 0x78, 0xf4, 0x28, 0xdb, 0x77, 0x77, 0x52, 0x53, 0x5d, 0x41, 0x75, 0x55, 0x08, 0xb7, + 0xdb, 0x4e, 0x26, 0x63, 0x70, 0xec, 0xd8, 0x10, 0x9d, 0x9d, 0x53, 0x1c, 0x5e, 0x5a, 0x65, 0x9f, + 0xb6, 0xf5, 0xff, 0xaf, 0x4c, 0x29, 0xfd, 0xa3, 0x8c, 0x3e, 0xbd, 0x7c, 0x53, 0xa8, 0x66, 0x61, + 0xbf, 0x71, 0x60, 0x61, 0xae, 0xc2, 0x77, 0xde, 0xf9, 0x97, 0x63, 0x77, 0xe4, 0x0b, 0x0b, 0xb1, + 0xf8, 0x34, 0x89, 0x78, 0x8c, 0x70, 0xb8, 0xa2, 0xd8, 0x6e, 0x3a, 0xe3, 0x63, 0x0f, 0x1f, 0xda, + 0xcf, 0xbe, 0xdd, 0xdb, 0x11, 0xe1, 0x77, 0x60, 0x04, 0xcf, 0xc1, 0xea, 0x3c, 0xc4, 0x7b, 0xdf, + 0xf3, 0x4e, 0x14, 0x01, 0x6e, 0x77, 0x18, 0x97, 0xbb, 0x14, 0x21, 0xd4, 0x79, 0x66, 0xdb, 0xb2, + 0xb2, 0x24, 0x13, 0x13, 0x44, 0x22, 0x87, 0x99, 0x9a, 0x1c, 0x60, 0xd3, 0xf3, 0x07, 0xf9, 0xe5, + 0x2f, 0x7f, 0x45, 0x2c, 0x9e, 0xe2, 0x9d, 0xef, 0xbc, 0x86, 0x6b, 0xae, 0x79, 0x1f, 0x0b, 0x16, + 0x2c, 0x98, 0xd7, 0x2f, 0x25, 0x25, 0x1c, 0x3b, 0x76, 0x84, 0x4f, 0x7f, 0xfa, 0x93, 0x24, 0x93, + 0x19, 0x26, 0x87, 0x3b, 0xf9, 0x4c, 0x15, 0x2c, 0x71, 0x3b, 0x40, 0x82, 0x6a, 0x29, 0xd8, 0xd3, + 0x0a, 0x18, 0x82, 0xbb, 0xbb, 0x23, 0xfc, 0xcc, 0x5e, 0xc6, 0x19, 0xab, 0x57, 0xf2, 0xe9, 0x4f, + 0xff, 0x13, 0x65, 0xe1, 0x20, 0xe9, 0xf4, 0x24, 0x86, 0x61, 0x30, 0x3a, 0x36, 0xc2, 0x2b, 0xaf, + 0x6c, 0x65, 0xd3, 0xa6, 0x17, 0xe9, 0xec, 0xec, 0x61, 0xe1, 0xc2, 0x15, 0xbc, 0xe7, 0x3d, 0xef, + 0x65, 0xdd, 0xda, 0x55, 0xa4, 0xd3, 0x3d, 0x6c, 0x7b, 0xf5, 0xfb, 0x0c, 0x0e, 0x3e, 0x85, 0x94, + 0xd1, 0x42, 0xae, 0xed, 0x40, 0x55, 0x5a, 0x78, 0xf4, 0xa9, 0x3e, 0x76, 0xdc, 0x10, 0xdd, 0xa7, + 0x9f, 0x69, 0xae, 0x19, 0x69, 0xb2, 0xd2, 0x7f, 0x96, 0x02, 0x6e, 0x1b, 0xb2, 0x8b, 0xd5, 0xc7, + 0x9c, 0x7f, 0xb3, 0x7c, 0x77, 0xee, 0x7b, 0xab, 0x17, 0x5d, 0xa0, 0xb6, 0x2f, 0x5c, 0x72, 0x42, + 0x6f, 0xb6, 0x9c, 0xc7, 0xe5, 0xea, 0xeb, 0xee, 0x62, 0xdb, 0xae, 0x2e, 0x6c, 0x0b, 0x3f, 0x83, + 0xad, 0xf2, 0x1c, 0x8c, 0x5c, 0x86, 0xee, 0x47, 0xee, 0xe6, 0x33, 0x1f, 0xfb, 0x7b, 0xec, 0x76, + 0xfb, 0x69, 0xd1, 0xb0, 0x99, 0xc2, 0xfa, 0xcc, 0x39, 0x0d, 0xc3, 0x64, 0x68, 0x68, 0x88, 0x27, + 0x9e, 0x78, 0x9c, 0xfb, 0xef, 0xff, 0x05, 0x03, 0x03, 0x03, 0x5c, 0x76, 0xd9, 0x5b, 0xb9, 0xfa, + 0xea, 0xf7, 0xb2, 0x7c, 0xc5, 0x0a, 0x5c, 0x4e, 0x27, 0x47, 0x8f, 0x1e, 0xe5, 0x5f, 0xfe, 0xe5, + 0x5f, 0x58, 0xba, 0x74, 0x29, 0x37, 0xde, 0x74, 0x23, 0x3f, 0xf8, 0xcf, 0x1f, 0x30, 0xfa, 0x93, + 0xef, 0xf2, 0xb9, 0xb6, 0x0a, 0xdc, 0xaa, 0x5a, 0x20, 0xd6, 0xc1, 0x68, 0xc6, 0xe0, 0xe3, 0x47, + 0x27, 0xb8, 0xfe, 0xf6, 0x6f, 0x13, 0x0c, 0x06, 0xb9, 0xf7, 0xde, 0x7b, 0xf9, 0xe0, 0x07, 0x3f, + 0x48, 0x6c, 0x7a, 0x9a, 0xc7, 0x1e, 0x7f, 0x9c, 0x97, 0x5f, 0x7e, 0x99, 0x70, 0xb8, 0x8c, 0x2b, + 0xae, 0xb8, 0x9c, 0x8b, 0x2e, 0xba, 0x88, 0x86, 0x86, 0x7c, 0x8b, 0xad, 0xa2, 0xe4, 0x79, 0xd2, + 0x46, 0x2e, 0xc5, 0xd8, 0xd8, 0x41, 0x26, 0x27, 0x8e, 0x21, 0xa5, 0xc4, 0xe5, 0x29, 0xc3, 0xe9, + 0xa8, 0xe7, 0x93, 0xff, 0xf4, 0x59, 0x1e, 0xb2, 0xbf, 0xfa, 0xba, 0xfb, 0x72, 0x75, 0xf5, 0xf8, + 0x3b, 0x3a, 0x93, 0x7f, 0x56, 0x26, 0x7a, 0xe6, 0x38, 0x5c, 0x99, 0x91, 0xde, 0x2e, 0x7e, 0x5b, + 0x3d, 0xc4, 0x40, 0x6f, 0xcf, 0x91, 0xba, 0xc6, 0xe6, 0x56, 0x74, 0xbb, 0xbd, 0x00, 0x27, 0x32, + 0xbf, 0xda, 0x34, 0x1d, 0x65, 0xff, 0xeb, 0xbd, 0xd8, 0x57, 0x7e, 0x03, 0x35, 0xb4, 0x02, 0x50, + 0xd0, 0x74, 0xc1, 0xff, 0xd7, 0xde, 0x99, 0x86, 0x49, 0x55, 0x5d, 0x7b, 0xff, 0xb7, 0xcf, 0x39, + 0x35, 0x57, 0x77, 0x55, 0xf5, 0x3c, 0x41, 0x37, 0x74, 0x03, 0x32, 0x8f, 0x22, 0xa2, 0x06, 0x15, + 0x05, 0x45, 0x05, 0x51, 0x71, 0xbc, 0xc6, 0x68, 0x9c, 0xa7, 0x7b, 0x73, 0xbd, 0x37, 0x4f, 0xbc, + 0x57, 0xcd, 0x6b, 0x06, 0xcd, 0x4d, 0xa2, 0xaf, 0x57, 0xe3, 0x78, 0x45, 0x6f, 0xd0, 0x68, 0x90, + 0x38, 0x83, 0xca, 0x10, 0xc1, 0x01, 0x08, 0x20, 0xa3, 0xd0, 0x8c, 0x4d, 0x33, 0xf4, 0x3c, 0x55, + 0x55, 0xd7, 0x5c, 0x75, 0xce, 0xd9, 0xef, 0x87, 0xea, 0xae, 0x1e, 0x80, 0x57, 0xe3, 0x87, 0xd0, + 0x3e, 0x0f, 0xfb, 0x4b, 0xd7, 0xd3, 0x5d, 0xdd, 0x5d, 0xe7, 0xfc, 0xcf, 0x5a, 0x7b, 0xed, 0xb5, + 0xd6, 0xff, 0xbf, 0xda, 0x53, 0x26, 0xb1, 0x58, 0x2c, 0x23, 0x24, 0x7a, 0xa2, 0x8c, 0x55, 0x4f, + 0x90, 0x2a, 0xd0, 0x34, 0xc1, 0xa0, 0x41, 0x83, 0xb8, 0xfd, 0xf6, 0x3b, 0xb8, 0xea, 0xaa, 0x05, + 0xac, 0x5d, 0xbb, 0x96, 0x97, 0x5f, 0xfe, 0x1f, 0x16, 0x2c, 0x58, 0xc0, 0xf4, 0xe9, 0xd3, 0x39, + 0xe3, 0x8c, 0x33, 0xd8, 0xb0, 0x61, 0x03, 0x33, 0x66, 0xcc, 0xe0, 0xe6, 0x9b, 0x6f, 0xc6, 0xe5, + 0x72, 0x71, 0xf7, 0xdd, 0x77, 0xf3, 0x8b, 0xd6, 0x36, 0xfe, 0xe3, 0xc3, 0x3f, 0x33, 0xa7, 0x30, + 0x1b, 0x97, 0x2a, 0x08, 0xa4, 0x24, 0x4b, 0x9b, 0x03, 0x54, 0x5d, 0xfd, 0x23, 0x66, 0xce, 0x3c, + 0x1f, 0x8f, 0xc7, 0x8b, 0xdb, 0xed, 0xe6, 0xe1, 0x87, 0x1f, 0x26, 0x1e, 0x8f, 0x33, 0x6b, 0xd6, + 0x6c, 0x16, 0x2e, 0x5c, 0x48, 0x55, 0x55, 0x15, 0x6e, 0xb7, 0x3b, 0xe3, 0x21, 0x7a, 0x4b, 0x3a, + 0x59, 0xac, 0x4e, 0x8a, 0x4b, 0x26, 0x51, 0x5c, 0x32, 0x29, 0x13, 0x92, 0x75, 0x76, 0x86, 0x70, + 0x39, 0x5c, 0xa8, 0x41, 0xd5, 0xa2, 0x0e, 0x89, 0xd9, 0x81, 0x68, 0x61, 0x8d, 0x4b, 0x91, 0xf1, + 0xa4, 0x45, 0x4f, 0xa6, 0x50, 0x34, 0x81, 0xa2, 0xaa, 0xc9, 0x96, 0x51, 0xba, 0x1c, 0xd0, 0x00, + 0x03, 0xd8, 0xda, 0xdc, 0x47, 0x3a, 0x6d, 0xf1, 0x57, 0x42, 0x4d, 0xf5, 0x3f, 0x0f, 0x06, 0xfc, + 0x22, 0xbf, 0xb0, 0xe8, 0xd8, 0x96, 0x1a, 0xd3, 0x64, 0xf7, 0xae, 0x7d, 0xe8, 0xc3, 0x7e, 0x8e, + 0x25, 0x67, 0x42, 0x97, 0x0b, 0x96, 0x08, 0x45, 0xc3, 0x9e, 0x97, 0x4f, 0x34, 0x1a, 0xfd, 0xff, + 0x8e, 0xd8, 0x39, 0x11, 0xe0, 0x9a, 0xa6, 0x91, 0x9f, 0x9f, 0xcf, 0xdc, 0xb9, 0x73, 0x99, 0x35, + 0x6b, 0x16, 0x7b, 0xf7, 0xee, 0xe5, 0x9d, 0x77, 0xde, 0x61, 0xd5, 0xaa, 0x55, 0xdc, 0x7a, 0xeb, + 0x6d, 0xcc, 0x9d, 0x7b, 0x59, 0xc6, 0x33, 0x14, 0x14, 0x14, 0xf0, 0xf8, 0x6f, 0x1e, 0xe7, 0xa9, + 0xa2, 0x42, 0x7e, 0xff, 0xe4, 0x6f, 0x18, 0xe5, 0xb6, 0x11, 0x36, 0x24, 0xfe, 0xd1, 0x93, 0xf9, + 0xe5, 0x7d, 0xf7, 0xe1, 0xf5, 0xfa, 0x10, 0x42, 0x30, 0x75, 0xea, 0x54, 0xde, 0x7d, 0xf7, 0xdd, + 0x0c, 0xf5, 0xa5, 0x7b, 0x8b, 0xf9, 0x76, 0x83, 0xbb, 0xba, 0xa8, 0xa4, 0x2e, 0x17, 0xe5, 0xe5, + 0xe5, 0x98, 0xdb, 0x8f, 0x22, 0xfd, 0x2e, 0x35, 0xe7, 0xf9, 0x9c, 0x71, 0xfa, 0x4a, 0xf3, 0x35, + 0xdb, 0x6e, 0x65, 0x44, 0x39, 0x0e, 0x11, 0x16, 0xba, 0x6c, 0xac, 0x48, 0xfd, 0xda, 0xf7, 0xa1, + 0xf6, 0x6b, 0xff, 0x65, 0xba, 0x39, 0xa0, 0x01, 0x5e, 0x77, 0x7a, 0xbb, 0x1c, 0xfb, 0xa9, 0xad, + 0xdd, 0x30, 0x53, 0x32, 0x18, 0x0c, 0x88, 0x9e, 0xfc, 0x74, 0xba, 0x1c, 0x69, 0x1a, 0x06, 0x7b, + 0x76, 0xef, 0xa1, 0xc9, 0xb6, 0x00, 0x6b, 0xe1, 0x74, 0x44, 0x57, 0x43, 0x6b, 0xba, 0x93, 0x51, + 0xe0, 0xce, 0x2f, 0xa6, 0xa1, 0xa1, 0x81, 0xe2, 0xe2, 0xe2, 0xef, 0xfc, 0x19, 0x14, 0x45, 0xc1, + 0xe9, 0x74, 0x30, 0x61, 0xc2, 0x04, 0xc6, 0x8d, 0x1b, 0x47, 0x2a, 0x95, 0xc2, 0x62, 0xb1, 0x64, + 0x66, 0x30, 0x76, 0x7b, 0x91, 0x54, 0x2a, 0xc5, 0xc1, 0x9a, 0x1a, 0x1e, 0xa8, 0x2a, 0xe0, 0xa2, + 0x02, 0x0f, 0x6d, 0x29, 0x83, 0xfb, 0xf7, 0xef, 0x61, 0xc7, 0x8e, 0x1d, 0x0c, 0x1e, 0x3c, 0x18, + 0x55, 0xed, 0x21, 0x6c, 0xd3, 0xa7, 0xce, 0x2f, 0x8f, 0xd1, 0xb5, 0xfe, 0xa6, 0x9d, 0xb1, 0xa8, + 0xa8, 0x08, 0xcb, 0x9f, 0x06, 0x0d, 0x4b, 0xbe, 0x60, 0xdf, 0x79, 0x16, 0xcd, 0xb9, 0x57, 0xcf, + 0x1a, 0xac, 0x4e, 0xbb, 0x33, 0x8f, 0xd2, 0x22, 0x3b, 0x4d, 0x2d, 0x09, 0xfe, 0xf5, 0xa9, 0xad, + 0x8f, 0xac, 0x1b, 0x13, 0x39, 0x08, 0xc1, 0x3f, 0x0d, 0x68, 0x80, 0xd3, 0xfd, 0xcd, 0xa9, 0x74, + 0x2b, 0xa9, 0xbf, 0x03, 0xd3, 0x94, 0x28, 0x0a, 0xe8, 0xa9, 0x24, 0x35, 0xfb, 0xf6, 0x52, 0x7b, + 0xf0, 0x20, 0xb1, 0xdc, 0x1b, 0xb1, 0x8f, 0xbe, 0x1a, 0x84, 0xd6, 0x4b, 0xa6, 0x18, 0x4c, 0x29, + 0xc8, 0xca, 0x2b, 0xe2, 0x0f, 0xcf, 0x3f, 0x4d, 0x55, 0x45, 0x05, 0x12, 0x49, 0x2a, 0x99, 0xca, + 0x3c, 0x1c, 0xba, 0x9e, 0xfa, 0xd6, 0x16, 0xdd, 0x2d, 0x98, 0x66, 0x77, 0x38, 0x70, 0xbb, 0xb3, + 0x49, 0xa5, 0x52, 0x84, 0x43, 0x9d, 0x44, 0x63, 0xd1, 0xf4, 0x74, 0x71, 0x20, 0x10, 0xec, 0xa4, + 0x79, 0xe5, 0x47, 0x4c, 0x1b, 0x55, 0x88, 0x21, 0xc1, 0xa7, 0xa9, 0x5c, 0x94, 0xa5, 0xf0, 0xcc, + 0xd3, 0x4f, 0x53, 0x5b, 0x7b, 0x08, 0xab, 0xd5, 0xd2, 0xab, 0xd3, 0xf2, 0x3b, 0x06, 0x37, 0x52, + 0x62, 0x4a, 0x93, 0xf5, 0xeb, 0xd7, 0x32, 0x6f, 0x72, 0x92, 0xbb, 0xef, 0x2a, 0x2f, 0x18, 0x33, + 0xb2, 0x12, 0x87, 0x96, 0xf6, 0x02, 0x8a, 0x94, 0x94, 0x16, 0xd8, 0x18, 0xe1, 0xc9, 0x52, 0xd7, + 0xfa, 0xdb, 0xcf, 0x2d, 0x0a, 0x88, 0xc5, 0x4d, 0x5e, 0xa9, 0x0f, 0x68, 0x80, 0x65, 0x17, 0x49, + 0x2a, 0x12, 0x0e, 0x60, 0x98, 0xe9, 0xa6, 0xba, 0x0d, 0x6b, 0xd7, 0xd1, 0x14, 0x3f, 0x0d, 0xdb, + 0x98, 0x7f, 0xc7, 0x91, 0x3b, 0x09, 0xba, 0x22, 0x63, 0x89, 0xc8, 0x8c, 0xd9, 0x09, 0xfb, 0x1b, + 0x59, 0xf9, 0xca, 0xb3, 0x0c, 0xaa, 0x7f, 0x97, 0x69, 0x83, 0xdc, 0xe9, 0x9b, 0xdb, 0x5b, 0xe8, + 0x44, 0x93, 0xf4, 0x93, 0x3d, 0xe9, 0xa7, 0xe9, 0x4c, 0x9f, 0x92, 0x23, 0x00, 0x31, 0x20, 0xd6, + 0xab, 0xdc, 0x68, 0x4b, 0xff, 0xa4, 0x3d, 0x6c, 0xf0, 0xd8, 0xd2, 0x16, 0x7e, 0x56, 0x54, 0x42, + 0xb6, 0x45, 0xcd, 0xfc, 0xd6, 0xd9, 0xb9, 0x6e, 0x5e, 0xf9, 0x6a, 0x2d, 0x6d, 0x39, 0xdb, 0x38, + 0x6f, 0x8c, 0x2b, 0x9d, 0xf1, 0xe9, 0x3b, 0x85, 0x3a, 0xd3, 0x79, 0xd9, 0x9d, 0x79, 0xf7, 0x87, + 0x0d, 0xea, 0xfd, 0x29, 0x1c, 0x56, 0x95, 0x92, 0x1c, 0x15, 0x87, 0x35, 0x7d, 0xfc, 0x8a, 0x25, + 0x4c, 0x3e, 0xd8, 0x14, 0xa2, 0xd3, 0xeb, 0xe6, 0xee, 0x7b, 0x4e, 0x63, 0xda, 0x94, 0x49, 0x58, + 0x55, 0x41, 0x20, 0x6c, 0xf0, 0xd5, 0x96, 0x00, 0x36, 0x8b, 0x60, 0xea, 0x44, 0x2f, 0x56, 0x8b, + 0xc2, 0xd0, 0xc1, 0x2e, 0xc1, 0x61, 0x5b, 0x65, 0x72, 0x93, 0x45, 0x81, 0xf0, 0xc0, 0xb6, 0x60, + 0x69, 0xd8, 0x90, 0x52, 0x27, 0xe8, 0xaf, 0x23, 0x16, 0x0e, 0x71, 0xf8, 0xd0, 0x21, 0x9a, 0x02, + 0x5e, 0x9c, 0x3f, 0xf8, 0x15, 0xc2, 0x9a, 0x9b, 0x69, 0x7f, 0xed, 0x6e, 0xfe, 0x43, 0x08, 0x1a, + 0x0e, 0xec, 0x62, 0xfd, 0x1f, 0x1e, 0xe5, 0x42, 0xf5, 0x63, 0xf6, 0x9a, 0x16, 0xf2, 0x3c, 0x1a, + 0x9a, 0x2a, 0x90, 0x12, 0x62, 0xc9, 0xae, 0x99, 0xbd, 0xbd, 0xf1, 0x15, 0xc7, 0x5a, 0x8a, 0x22, + 0x04, 0x76, 0x6b, 0x7a, 0xd2, 0x5a, 0x67, 0xcc, 0xa4, 0x23, 0x64, 0x64, 0x40, 0xd0, 0x0d, 0x49, + 0x38, 0x21, 0x49, 0xa4, 0x0c, 0x4c, 0xd3, 0x64, 0xdb, 0xc1, 0x18, 0x23, 0x74, 0x3b, 0xe7, 0xe4, + 0x66, 0x67, 0x5c, 0x88, 0x90, 0x92, 0x12, 0x9b, 0x85, 0x4b, 0x0b, 0xbd, 0x7c, 0xbe, 0xbb, 0x93, + 0x92, 0x1c, 0x2b, 0x16, 0xb5, 0x6f, 0x51, 0xa3, 0xc8, 0x67, 0x61, 0x48, 0x41, 0xcf, 0xed, 0xdc, + 0x56, 0x1b, 0x67, 0xd1, 0xa7, 0x1d, 0x14, 0xf9, 0x6c, 0x1c, 0x6e, 0x4d, 0x62, 0xd3, 0x60, 0xde, + 0x54, 0x0f, 0xbe, 0x2c, 0x85, 0xf7, 0xb7, 0x44, 0x99, 0x7d, 0xc3, 0x69, 0xcc, 0x9f, 0x57, 0x8a, + 0x27, 0x4b, 0xe3, 0xd0, 0x91, 0x18, 0xcb, 0x3e, 0xa9, 0xe7, 0x83, 0x8d, 0xcd, 0xe6, 0xd6, 0x8a, + 0x00, 0x97, 0x36, 0x14, 0x28, 0xa3, 0x9f, 0x98, 0x84, 0xcb, 0xa9, 0xa1, 0x29, 0x02, 0xf3, 0xb0, + 0xb0, 0x98, 0xae, 0xef, 0x76, 0xc9, 0xf0, 0xf0, 0x39, 0x00, 0x00, 0x14, 0x24, 0x49, 0x44, 0x41, + 0x54, 0xe0, 0xf9, 0x87, 0x02, 0x7c, 0xd8, 0xed, 0x8b, 0x55, 0xaa, 0x71, 0xa9, 0x24, 0xda, 0xf8, + 0xfc, 0xd3, 0x77, 0x89, 0xc7, 0x93, 0x58, 0x47, 0x3f, 0x87, 0xb0, 0xf8, 0x7a, 0x84, 0xc9, 0x32, + 0xc4, 0x6d, 0x83, 0x7d, 0x9b, 0xbe, 0x64, 0xdf, 0xc2, 0x5f, 0x30, 0x3b, 0x67, 0x13, 0x4e, 0xab, + 0x64, 0x6f, 0xbb, 0x49, 0x2c, 0x09, 0x6e, 0x3b, 0x24, 0x92, 0x92, 0xe7, 0x3f, 0x6e, 0x63, 0xd3, + 0xbe, 0xf8, 0x37, 0xf4, 0x48, 0x82, 0xcf, 0xad, 0xf2, 0xf3, 0xeb, 0x0b, 0x29, 0xf2, 0x5a, 0xa8, + 0x3e, 0x9a, 0xe0, 0xd1, 0x37, 0x5b, 0x49, 0xa4, 0xba, 0xb8, 0xb8, 0x26, 0xc4, 0x53, 0x69, 0x05, + 0x25, 0x13, 0x49, 0xa9, 0x22, 0x78, 0x7e, 0x52, 0x39, 0x1e, 0x4d, 0xe9, 0xc3, 0x2d, 0xb2, 0x28, + 0x30, 0xab, 0xc0, 0xc3, 0x3b, 0x5b, 0x3a, 0xb8, 0x7f, 0x77, 0x0b, 0xbd, 0x39, 0x83, 0xaa, 0x02, + 0x0f, 0xcc, 0xf3, 0x30, 0xa4, 0xc0, 0x8b, 0x94, 0xb0, 0xa5, 0x26, 0xc6, 0x4b, 0xcb, 0xdb, 0xb9, + 0xe3, 0xa2, 0x5c, 0xc6, 0x0c, 0x4e, 0x0b, 0xb3, 0xd6, 0x34, 0x25, 0xf9, 0xd5, 0x92, 0x56, 0x4e, + 0x9b, 0x92, 0xcf, 0x7f, 0x3c, 0x31, 0x95, 0x91, 0x23, 0xb2, 0xa9, 0xad, 0x8d, 0xf0, 0xdf, 0xcf, + 0x1c, 0xe6, 0xbd, 0x65, 0x47, 0xd9, 0x3b, 0x42, 0xff, 0xab, 0x36, 0x36, 0xf7, 0x1e, 0xeb, 0x84, + 0xd4, 0xd8, 0x9a, 0x77, 0x42, 0x6f, 0xac, 0x5a, 0xdd, 0x6a, 0xd9, 0xba, 0x35, 0xca, 0x86, 0xaf, + 0x5a, 0x48, 0x8c, 0x90, 0x58, 0x06, 0x7a, 0x14, 0x0d, 0x10, 0xcb, 0x89, 0xbd, 0xb1, 0x77, 0x7c, + 0xea, 0xae, 0x89, 0xdb, 0xc5, 0xe4, 0x44, 0xa2, 0x03, 0xb5, 0xe4, 0xa7, 0x58, 0x07, 0x5f, 0xd8, + 0xcf, 0xbd, 0x4a, 0x40, 0x67, 0xf3, 0x8a, 0xf7, 0x88, 0x2c, 0xf9, 0x3f, 0x5c, 0x58, 0x7c, 0x04, + 0x8b, 0x9a, 0x76, 0x7f, 0x4e, 0xcd, 0x20, 0x14, 0x33, 0x70, 0xdb, 0x35, 0x54, 0x4d, 0xe0, 0xb0, + 0xa9, 0xec, 0x6e, 0x34, 0xd2, 0xca, 0x01, 0x27, 0xaa, 0x03, 0x03, 0xa5, 0x3e, 0x49, 0x34, 0x91, + 0x7e, 0x80, 0x1c, 0x56, 0x85, 0x44, 0x52, 0xd2, 0x1e, 0x95, 0x7d, 0x4d, 0xbe, 0xcb, 0x20, 0xcf, + 0xcd, 0x77, 0x73, 0xba, 0xd7, 0xdd, 0x5f, 0xfd, 0x10, 0x81, 0x60, 0xb8, 0xdb, 0xce, 0x8c, 0x82, + 0x2c, 0xaa, 0x8f, 0x04, 0x30, 0x7b, 0x7f, 0x5e, 0x53, 0x64, 0xf2, 0xce, 0xfb, 0xea, 0x93, 0x3c, + 0xb3, 0xb4, 0x9d, 0xbb, 0x2e, 0xce, 0xe1, 0xb4, 0x52, 0x1b, 0x1f, 0x6c, 0x0a, 0x73, 0xc1, 0x38, + 0x17, 0x1f, 0x6d, 0x09, 0x31, 0xf7, 0x86, 0x2a, 0xee, 0xb9, 0x73, 0x18, 0x12, 0xc1, 0xb3, 0x2f, + 0xd6, 0xf0, 0xc7, 0xff, 0xdd, 0x8f, 0x25, 0x96, 0xa2, 0x3a, 0x96, 0xc2, 0x7a, 0x23, 0xcd, 0xd6, + 0xb1, 0x0d, 0x35, 0xc4, 0x64, 0x71, 0x4d, 0x4c, 0xca, 0x83, 0x87, 0xe7, 0x72, 0xe3, 0x4d, 0x97, + 0x93, 0xe5, 0x79, 0x87, 0x0d, 0x75, 0xbf, 0x05, 0x52, 0x03, 0x1f, 0xe0, 0x75, 0xa3, 0x82, 0xb1, + 0xc4, 0x11, 0xe5, 0xd2, 0xce, 0x90, 0x67, 0x59, 0x7c, 0xa1, 0x73, 0xd2, 0xe9, 0x37, 0x9c, 0x45, + 0xa5, 0xc5, 0x9d, 0x61, 0x84, 0x20, 0x41, 0x4f, 0xc5, 0xf8, 0x7c, 0xf1, 0x42, 0x7c, 0xeb, 0x9e, + 0xe2, 0xcc, 0x92, 0x16, 0x84, 0x02, 0x75, 0x7e, 0x41, 0xa9, 0x17, 0x1c, 0x6a, 0x7a, 0x3e, 0x02, + 0x80, 0x2a, 0x24, 0x63, 0x07, 0xdb, 0xb9, 0x73, 0x76, 0x17, 0xfb, 0x0f, 0xb0, 0x68, 0x16, 0x54, + 0x15, 0xac, 0x9a, 0x82, 0x45, 0x03, 0xab, 0xaa, 0xe0, 0xb2, 0x99, 0xa8, 0x8a, 0x24, 0xcb, 0xae, + 0x20, 0x25, 0x0c, 0xce, 0xd7, 0x78, 0xf8, 0xba, 0x3c, 0x4c, 0xb3, 0xef, 0xfe, 0xa9, 0x69, 0x2a, + 0x36, 0x4d, 0xb0, 0x78, 0x8d, 0x9f, 0x0f, 0x9a, 0x02, 0x5c, 0x59, 0xec, 0xeb, 0x23, 0x87, 0x2f, + 0x25, 0xac, 0xf3, 0x87, 0x59, 0x1f, 0x0d, 0xf3, 0xb3, 0x2b, 0x7d, 0x14, 0x78, 0xb4, 0x4c, 0x42, + 0x05, 0xa0, 0x34, 0xd7, 0x42, 0x6b, 0xc0, 0xe0, 0xa5, 0xe5, 0xed, 0x5c, 0x73, 0x8e, 0x87, 0x49, + 0x55, 0x0e, 0x1a, 0x3b, 0x74, 0x1a, 0x3b, 0x52, 0x3c, 0xfd, 0x49, 0x80, 0x39, 0x37, 0x8d, 0xe4, + 0xca, 0xf9, 0x65, 0x7c, 0xbd, 0x2b, 0xc8, 0xef, 0x9e, 0xa8, 0xa6, 0x69, 0x77, 0x07, 0x3f, 0xbd, + 0x24, 0x97, 0x2c, 0x87, 0xc2, 0xbf, 0xbd, 0xda, 0x4c, 0x5d, 0xb2, 0xe8, 0x12, 0xb5, 0x28, 0x5a, + 0xc4, 0x91, 0x00, 0x6e, 0x4b, 0x0e, 0xc3, 0xc7, 0x9d, 0xc9, 0xb6, 0x46, 0x0b, 0xbb, 0x9b, 0x4c, + 0x8c, 0xcc, 0x99, 0x62, 0x80, 0x03, 0x0c, 0xb0, 0x79, 0xb0, 0xd9, 0x74, 0xf0, 0x79, 0xdf, 0xaf, + 0x63, 0x2d, 0xc1, 0x3f, 0x0f, 0xa9, 0x6f, 0xb2, 0x54, 0x4e, 0x94, 0x99, 0x88, 0x34, 0x1e, 0x0d, + 0xb0, 0xf2, 0xa5, 0x27, 0x19, 0x51, 0xf3, 0x02, 0x43, 0x0b, 0x63, 0xc4, 0x92, 0xb0, 0xa2, 0xda, + 0x24, 0x10, 0x91, 0xfc, 0xd3, 0x34, 0x8d, 0x2c, 0x3b, 0x74, 0x84, 0x0c, 0xaa, 0x8a, 0xd2, 0x8d, + 0x76, 0x67, 0x8f, 0x72, 0x72, 0xce, 0x68, 0x57, 0x1f, 0x25, 0xb9, 0x9e, 0x10, 0x56, 0xf4, 0xa8, + 0xe0, 0x64, 0xea, 0xfe, 0x02, 0xaf, 0x4b, 0xe5, 0xbc, 0xb1, 0xee, 0x3e, 0x35, 0xdb, 0xde, 0xb6, + 0x9f, 0x65, 0xcf, 0xe1, 0xb7, 0x8b, 0x9b, 0xf0, 0x59, 0x55, 0x2e, 0xc8, 0xcb, 0xce, 0x3c, 0x00, + 0x3b, 0x3a, 0x63, 0xfc, 0xd7, 0x81, 0x06, 0x16, 0x5c, 0xe2, 0xe1, 0xe2, 0xc9, 0x59, 0x5d, 0x7d, + 0x89, 0x3d, 0x52, 0x4a, 0xf1, 0xa4, 0xc9, 0xcb, 0x2b, 0xfc, 0x8c, 0x29, 0x77, 0x30, 0x73, 0x5c, + 0x16, 0x9a, 0x92, 0x7e, 0xd0, 0xd6, 0x1f, 0x88, 0xf1, 0xe8, 0x7f, 0x4d, 0x66, 0xf6, 0xec, 0x12, + 0x3e, 0x58, 0x5a, 0xc7, 0x63, 0xbf, 0xda, 0xc1, 0x50, 0xb7, 0x60, 0x48, 0xbe, 0x85, 0x61, 0xc5, + 0x16, 0x4c, 0x09, 0x05, 0x1e, 0x85, 0x06, 0x23, 0x62, 0x15, 0x46, 0x5c, 0x48, 0xa1, 0xd0, 0xac, + 0x07, 0xf8, 0x78, 0xfd, 0x7e, 0xae, 0x9e, 0x57, 0xc5, 0xa0, 0x3c, 0x27, 0x4a, 0xd3, 0x77, 0xbf, + 0xdf, 0x0a, 0x27, 0x61, 0x29, 0xe7, 0x1d, 0xda, 0x62, 0x58, 0xc2, 0x1d, 0xed, 0x4d, 0xf5, 0x48, + 0xa9, 0x83, 0x90, 0x04, 0x5a, 0xeb, 0xf8, 0xf0, 0xf1, 0x9f, 0x32, 0xe9, 0xe8, 0x53, 0x54, 0xe5, + 0xc7, 0xa8, 0xf7, 0xc3, 0xc2, 0x2f, 0x0c, 0x96, 0xee, 0x34, 0x69, 0x0a, 0xa6, 0xdb, 0x76, 0xed, + 0x56, 0x68, 0xeb, 0x4c, 0x65, 0xaa, 0x4f, 0xc7, 0xd4, 0x7c, 0xbb, 0x35, 0xb3, 0x64, 0x17, 0x7d, + 0xb5, 0xdf, 0xec, 0x89, 0xfe, 0x67, 0xd4, 0x3e, 0x0c, 0x87, 0xae, 0x24, 0xc5, 0xe8, 0xc1, 0x36, + 0xee, 0xb9, 0x3c, 0x97, 0x87, 0x0f, 0xd4, 0xb1, 0xb2, 0xb5, 0x13, 0x45, 0x40, 0x75, 0x38, 0xc1, + 0xc3, 0xfb, 0xea, 0xb8, 0xe4, 0x22, 0x37, 0xb3, 0x26, 0x66, 0xd1, 0xa7, 0xe2, 0x2c, 0xd3, 0x24, + 0xb6, 0x2f, 0xaa, 0xa3, 0x44, 0x12, 0x06, 0x57, 0x9f, 0xe5, 0xc1, 0xda, 0x65, 0x36, 0xb9, 0x59, + 0x0a, 0xd3, 0x86, 0xd9, 0xa8, 0x6b, 0x88, 0xf1, 0xbf, 0xaf, 0xd5, 0xf2, 0xfb, 0x5f, 0x6c, 0xe7, + 0x27, 0x33, 0x3d, 0xfc, 0xfb, 0xfc, 0x3c, 0x92, 0x86, 0x49, 0x20, 0x62, 0xe2, 0xb0, 0x29, 0x94, + 0xe7, 0x6b, 0xe8, 0x46, 0x07, 0x86, 0x1e, 0x15, 0x60, 0x92, 0xa3, 0xba, 0xb8, 0xf6, 0xdc, 0x2a, + 0xce, 0x3e, 0xcd, 0x4b, 0x8e, 0x8b, 0x74, 0xc2, 0x47, 0xa8, 0xdf, 0x0f, 0x0b, 0x4e, 0xb7, 0xb0, + 0x94, 0x58, 0x85, 0xdd, 0xa3, 0xb4, 0xd5, 0xd7, 0x61, 0xe8, 0x49, 0x3a, 0x9a, 0x6a, 0xf9, 0xe2, + 0x77, 0x0f, 0x32, 0xdb, 0xb9, 0x02, 0x67, 0xb6, 0xc9, 0xa6, 0x43, 0x92, 0xf7, 0xb7, 0x98, 0x34, + 0x46, 0xd2, 0xd2, 0xfb, 0xc3, 0x8b, 0x04, 0x56, 0x55, 0xa0, 0x2a, 0x70, 0x28, 0xa8, 0x63, 0x4a, + 0x89, 0x22, 0x8e, 0x65, 0xfc, 0xa7, 0x41, 0x3c, 0xfe, 0x7c, 0xe3, 0xde, 0x85, 0x8c, 0xe3, 0x25, + 0x23, 0x7a, 0x9a, 0x09, 0x04, 0x53, 0x87, 0x3b, 0x78, 0xe0, 0xfa, 0x5c, 0x1e, 0x5d, 0x5c, 0xc7, + 0x06, 0xbf, 0x8f, 0x4d, 0xc1, 0x10, 0x17, 0x5c, 0xe8, 0xe2, 0x92, 0x29, 0xd9, 0x64, 0x06, 0x87, + 0xcb, 0x1e, 0xb6, 0x43, 0x73, 0x40, 0x67, 0xf5, 0x8e, 0x30, 0x3f, 0x99, 0x97, 0x87, 0xc3, 0xd6, + 0x8b, 0x87, 0xa4, 0xc1, 0x8d, 0x33, 0x72, 0x78, 0xf2, 0x4f, 0xfb, 0xd8, 0x53, 0x9f, 0xe4, 0xe9, + 0xdb, 0x8a, 0x29, 0xcd, 0xd1, 0x68, 0x0d, 0x19, 0x84, 0xe3, 0x26, 0xba, 0x99, 0xbe, 0x8e, 0x7c, + 0x8f, 0x05, 0xe3, 0xab, 0xec, 0xce, 0xa4, 0xe2, 0x49, 0xd9, 0x27, 0x36, 0xe0, 0x90, 0x09, 0xdc, + 0x4b, 0x17, 0x13, 0x79, 0x6b, 0x21, 0xcd, 0xdb, 0x77, 0x61, 0x4e, 0x76, 0xa3, 0x29, 0x3a, 0x90, + 0x1e, 0x36, 0xe6, 0x5b, 0x5e, 0xac, 0x62, 0x91, 0xf7, 0xa7, 0xd6, 0x44, 0xcf, 0x97, 0x7a, 0x0c, + 0xcb, 0x48, 0xaf, 0x6e, 0x19, 0x63, 0xfc, 0xb4, 0x75, 0x62, 0xc7, 0xfe, 0x01, 0x01, 0xb0, 0x8c, + 0x35, 0x1f, 0xb1, 0xcd, 0x6d, 0x8e, 0xd4, 0x2d, 0xf2, 0xe5, 0x6f, 0xfb, 0xeb, 0x7b, 0x34, 0x2d, + 0x79, 0x86, 0x8b, 0x8b, 0x76, 0xa2, 0x9b, 0xf0, 0xe1, 0x36, 0xc9, 0x47, 0xd5, 0x26, 0xba, 0x09, + 0x59, 0x16, 0xb8, 0x7e, 0xaa, 0xca, 0xe4, 0x72, 0x91, 0x96, 0x2c, 0x32, 0x05, 0x1d, 0x81, 0x14, + 0xa9, 0x14, 0xd8, 0xad, 0x64, 0x5a, 0x7c, 0x7b, 0x33, 0x22, 0x14, 0x21, 0x8f, 0x49, 0x35, 0x64, + 0x24, 0x96, 0x7a, 0x75, 0x59, 0x88, 0x5e, 0x71, 0x99, 0x3c, 0x4e, 0x2a, 0x71, 0xda, 0x08, 0x27, + 0x0f, 0xfd, 0x50, 0xe5, 0xad, 0x75, 0x01, 0xae, 0x9d, 0x99, 0xcd, 0xf4, 0x51, 0x2e, 0x84, 0x22, + 0x32, 0xd2, 0x1b, 0x5d, 0x62, 0xb4, 0xe8, 0x86, 0xe4, 0x9d, 0x75, 0x41, 0x16, 0x9c, 0xed, 0x21, + 0xdf, 0xa3, 0x22, 0x65, 0xcf, 0x7c, 0x07, 0x29, 0xc1, 0xeb, 0x56, 0x78, 0xe8, 0x9a, 0x42, 0x76, + 0xd4, 0xc6, 0xd8, 0x79, 0x24, 0x81, 0xd7, 0xad, 0xb2, 0xf3, 0x50, 0x1c, 0x7f, 0xd8, 0xa4, 0x35, + 0x68, 0x90, 0xd2, 0x25, 0x09, 0xdd, 0xc4, 0x58, 0xed, 0xce, 0x8e, 0x7e, 0xe1, 0xd3, 0xac, 0x7f, + 0xac, 0x43, 0x4a, 0x89, 0x36, 0xe5, 0x4c, 0xac, 0x33, 0x66, 0x92, 0xfa, 0xdd, 0x63, 0x52, 0x1b, + 0xff, 0xe2, 0x76, 0xeb, 0x2c, 0x0c, 0x6e, 0x07, 0xf7, 0xcf, 0x84, 0x1a, 0x7d, 0xae, 0xed, 0x91, + 0xe4, 0x76, 0xcb, 0x43, 0xf2, 0x50, 0x5c, 0x01, 0x89, 0x70, 0x06, 0xb1, 0x5e, 0xe7, 0x9d, 0x9e, + 0xf3, 0x69, 0xf6, 0x15, 0x1d, 0xe7, 0x77, 0xae, 0x3d, 0xe9, 0x00, 0xab, 0x96, 0x1c, 0x61, 0x55, + 0x0a, 0x39, 0xbc, 0x6b, 0x3b, 0xe1, 0x45, 0x77, 0x71, 0x41, 0xa5, 0x49, 0x22, 0x05, 0x4b, 0xbe, + 0xd2, 0xf9, 0xb2, 0x36, 0xfd, 0x9e, 0xaa, 0x5c, 0xc1, 0x35, 0x53, 0x54, 0x2a, 0xf2, 0x7a, 0x3a, + 0x27, 0x54, 0x91, 0x96, 0xe3, 0x5d, 0xb1, 0x3d, 0x84, 0xdb, 0xae, 0x1e, 0x6b, 0xa9, 0x12, 0x92, + 0x86, 0x20, 0x9a, 0x10, 0x24, 0x75, 0x83, 0x64, 0x4a, 0xcf, 0x24, 0x57, 0xfa, 0xce, 0x2a, 0x4b, + 0x73, 0x9b, 0x22, 0x09, 0x41, 0x3c, 0x95, 0x1e, 0xd5, 0x67, 0x76, 0x0d, 0xb3, 0xee, 0x06, 0x5e, + 0x76, 0xb5, 0x04, 0x19, 0x86, 0xe4, 0xf3, 0xea, 0x30, 0x9f, 0x55, 0x87, 0xbb, 0x2b, 0xc4, 0x24, + 0x75, 0x81, 0x61, 0x9a, 0x18, 0x86, 0x49, 0x30, 0xaa, 0x73, 0xfa, 0x70, 0x17, 0xe3, 0x2a, 0x6c, + 0x7d, 0x82, 0xae, 0xde, 0x9f, 0xc9, 0xaa, 0xc1, 0xd4, 0xe1, 0x0e, 0x84, 0x10, 0xec, 0xa9, 0x4b, + 0xf0, 0xda, 0x1a, 0x3f, 0xd9, 0x8a, 0xc1, 0xd6, 0x9d, 0xad, 0xac, 0xd9, 0x6b, 0xb2, 0xdd, 0x54, + 0x71, 0x5d, 0x5a, 0xb4, 0x43, 0x0a, 0x7b, 0x27, 0x42, 0x22, 0x34, 0x1f, 0xea, 0xe8, 0xf1, 0x90, + 0x95, 0x0d, 0x56, 0x2b, 0x8a, 0x53, 0x3a, 0x14, 0xbb, 0x2e, 0x7c, 0x4b, 0x7c, 0x5a, 0x72, 0x6f, + 0xf2, 0xc5, 0xe4, 0xf6, 0xd8, 0x4d, 0x6a, 0x9d, 0x54, 0xe6, 0x2f, 0xb8, 0x12, 0xaf, 0xd7, 0xcb, + 0x9b, 0x6f, 0xbe, 0x49, 0x78, 0x59, 0x5b, 0x81, 0x65, 0xa4, 0xfa, 0x44, 0xde, 0x16, 0xed, 0xfc, + 0xb6, 0x49, 0x7a, 0xf4, 0xa4, 0x02, 0x8c, 0xa2, 0x24, 0x0c, 0x33, 0xb2, 0x4c, 0xf3, 0xc6, 0xef, + 0x2e, 0xf1, 0x22, 0x34, 0x25, 0xad, 0x74, 0xd3, 0x16, 0x4e, 0xb7, 0xbf, 0xfe, 0xa0, 0x52, 0x70, + 0xc9, 0x78, 0x0d, 0x9f, 0xa3, 0x67, 0xaf, 0x4d, 0x99, 0x82, 0x2f, 0xf6, 0x9b, 0x04, 0xe3, 0x10, + 0xef, 0x08, 0x92, 0x54, 0xfa, 0xee, 0xa5, 0x19, 0x61, 0x50, 0x29, 0x51, 0x14, 0x81, 0x53, 0x55, + 0xf0, 0x68, 0x60, 0xd3, 0xcc, 0x9e, 0xe6, 0x74, 0x93, 0x2e, 0x2a, 0x8e, 0x40, 0x88, 0xb4, 0x64, + 0xb1, 0xa2, 0xa6, 0x55, 0x63, 0x15, 0x41, 0x3f, 0xe9, 0x61, 0xc9, 0xf1, 0xf4, 0xa6, 0xbb, 0xbf, + 0xd7, 0xbd, 0xeb, 0xaf, 0x3b, 0xac, 0x72, 0xe5, 0x99, 0x9e, 0x74, 0x5b, 0xce, 0x09, 0x4e, 0x6b, + 0xaa, 0x00, 0x7f, 0x44, 0xf2, 0xe9, 0xd7, 0x21, 0xde, 0x58, 0xe3, 0x67, 0x78, 0x3e, 0x9c, 0x37, + 0x42, 0xe5, 0x6f, 0x35, 0x26, 0x07, 0x07, 0xdb, 0xc9, 0xfe, 0x61, 0xd1, 0x36, 0xeb, 0x84, 0x8e, + 0x79, 0x6d, 0xd3, 0xf7, 0x05, 0xed, 0x3f, 0x82, 0x2c, 0x6b, 0x16, 0x0e, 0x87, 0x03, 0x5d, 0xd7, + 0x09, 0x85, 0x42, 0x48, 0xc5, 0xa1, 0x48, 0x33, 0x82, 0x12, 0x91, 0xe3, 0xf4, 0xb5, 0x5c, 0x2f, + 0x0f, 0xa1, 0x5e, 0x7e, 0xd5, 0x7c, 0x9e, 0x7c, 0xf2, 0x49, 0x1a, 0x1b, 0x1b, 0x59, 0xbd, 0x7a, + 0x35, 0x07, 0x0e, 0xd4, 0x10, 0x5b, 0xce, 0x24, 0xd5, 0x6b, 0x9b, 0x09, 0xfa, 0x87, 0x27, 0x15, + 0xe0, 0xe6, 0x91, 0x8d, 0x66, 0xde, 0x6a, 0xcb, 0xea, 0xd8, 0x04, 0xe3, 0x8e, 0xf6, 0x0e, 0xa1, + 0x55, 0xe6, 0x2b, 0x38, 0xac, 0x50, 0x98, 0x2d, 0x98, 0x30, 0x58, 0xe1, 0x9c, 0x61, 0x0a, 0x76, + 0xad, 0xa7, 0x51, 0xae, 0x23, 0x0a, 0xcb, 0x77, 0x19, 0x0c, 0xcd, 0x57, 0x98, 0x31, 0x3c, 0x2d, + 0x59, 0x20, 0x45, 0x2f, 0xad, 0x57, 0x29, 0xa0, 0x57, 0xe8, 0xd5, 0xa3, 0xf4, 0x4c, 0xd7, 0x1b, + 0xe5, 0x71, 0xb2, 0xc4, 0xc7, 0x23, 0x12, 0x1d, 0x83, 0x32, 0x3d, 0x53, 0xad, 0xbb, 0x7f, 0xad, + 0x27, 0xf2, 0x8e, 0x1b, 0x2a, 0xb3, 0xa7, 0xe6, 0xe0, 0xb2, 0x2b, 0x99, 0xd6, 0xa3, 0xf4, 0x76, + 0x91, 0x1e, 0x4d, 0xa0, 0x1b, 0x70, 0xa8, 0x39, 0xc5, 0xda, 0xdd, 0x61, 0x56, 0x6c, 0x0b, 0x83, + 0x2e, 0x99, 0x33, 0x4a, 0xa1, 0xc8, 0x03, 0xcb, 0x77, 0x4a, 0xd6, 0x0c, 0xc9, 0x35, 0xec, 0xf3, + 0xf5, 0x47, 0x6c, 0xb3, 0xeb, 0x5f, 0x68, 0x29, 0x4f, 0x74, 0x14, 0x1c, 0xb1, 0x2b, 0xa9, 0x5d, + 0xb6, 0x39, 0xee, 0x50, 0x96, 0xc5, 0x6e, 0xb7, 0x13, 0x8b, 0xc7, 0x68, 0xd7, 0xda, 0x4d, 0xa5, + 0x38, 0xf6, 0x65, 0xf2, 0x3d, 0xbb, 0xa1, 0xfb, 0x93, 0xd7, 0x24, 0x77, 0x25, 0xec, 0xaa, 0xaa, + 0x50, 0x51, 0x51, 0xce, 0xae, 0x5d, 0xbb, 0x78, 0xe1, 0x85, 0x17, 0x39, 0x78, 0xb0, 0x16, 0x21, + 0xc0, 0xd8, 0x22, 0x2c, 0x89, 0xf1, 0x8e, 0xab, 0xb2, 0x9f, 0x75, 0x7c, 0xd4, 0x79, 0x4f, 0x9b, + 0x71, 0xf2, 0x2c, 0x18, 0x88, 0x6d, 0xd1, 0xbf, 0x30, 0x73, 0x48, 0x76, 0xd4, 0x29, 0x1a, 0x08, + 0x34, 0x45, 0x32, 0x7b, 0xb4, 0x4a, 0x5e, 0x56, 0x7a, 0xb4, 0x6c, 0xb7, 0xb7, 0xdb, 0xdf, 0x2c, + 0x59, 0x7b, 0x40, 0x32, 0x6b, 0xb4, 0x4a, 0x89, 0x87, 0x0c, 0x6f, 0x4a, 0xf4, 0x9f, 0x9f, 0xd0, + 0xeb, 0xd0, 0xd2, 0x07, 0x6c, 0xd1, 0x77, 0xc6, 0x42, 0xf7, 0x74, 0xb6, 0xfe, 0x96, 0xd8, 0x87, + 0xc2, 0xdf, 0x3f, 0xeb, 0x29, 0x32, 0xb2, 0x3a, 0x19, 0x32, 0x1e, 0x80, 0xc7, 0xa9, 0x50, 0x55, + 0x6c, 0xcd, 0xb0, 0x1b, 0x44, 0xd7, 0xcf, 0xe3, 0x49, 0x93, 0x2d, 0x07, 0xe3, 0xac, 0xdc, 0x16, + 0x62, 0x6b, 0x4d, 0x82, 0x0a, 0x1f, 0x5c, 0x36, 0x5a, 0x50, 0xe6, 0x53, 0x68, 0x0b, 0xc3, 0xe2, + 0xcd, 0x26, 0x7b, 0x66, 0x69, 0x2d, 0xce, 0x0b, 0xf5, 0x5b, 0xd4, 0x41, 0xd6, 0x4f, 0x5a, 0xca, + 0x3b, 0xd2, 0x2c, 0xd5, 0xb0, 0x21, 0x64, 0x38, 0x5e, 0x50, 0xee, 0xad, 0x10, 0xd9, 0x59, 0x1e, + 0x9a, 0x9b, 0x1b, 0x69, 0x8a, 0x35, 0xa3, 0x66, 0x09, 0xc1, 0x69, 0x49, 0x9b, 0xf9, 0xb9, 0x9c, + 0x21, 0xdb, 0x4d, 0x0c, 0x43, 0xf0, 0xfc, 0xf3, 0xcf, 0xf3, 0xe2, 0x8b, 0x2f, 0x02, 0x82, 0xca, + 0xca, 0x4a, 0x24, 0x70, 0xa8, 0xfd, 0x08, 0x84, 0x4c, 0x64, 0xe0, 0x24, 0xef, 0xc1, 0x00, 0x76, + 0x6b, 0xa1, 0x40, 0x31, 0x68, 0x08, 0x74, 0xa4, 0x25, 0x81, 0x14, 0x28, 0xc8, 0xee, 0x29, 0x13, + 0x18, 0x26, 0x6c, 0xac, 0x95, 0xb4, 0x86, 0x24, 0x57, 0x4c, 0x56, 0xf0, 0xd8, 0xe9, 0x91, 0x6d, + 0x90, 0xb2, 0xe7, 0x75, 0x3f, 0x48, 0x8e, 0xb1, 0xcf, 0xde, 0x2f, 0x7a, 0xe9, 0x6b, 0x48, 0x64, + 0x9f, 0xc1, 0xbf, 0x19, 0x61, 0xef, 0x5e, 0x72, 0x4d, 0x99, 0x13, 0xba, 0xcc, 0x30, 0xc0, 0xfb, + 0xb8, 0xe0, 0x44, 0x22, 0x45, 0x43, 0x73, 0x84, 0xb2, 0x62, 0x17, 0x8a, 0x92, 0xa6, 0xfb, 0xac, + 0xdd, 0x13, 0x63, 0xe9, 0xc6, 0x20, 0x8a, 0x9e, 0x62, 0x54, 0xb1, 0xe0, 0x9c, 0x73, 0x15, 0xdc, + 0xf6, 0x74, 0x00, 0xb7, 0xa7, 0xc1, 0x64, 0xc9, 0x76, 0x95, 0xb6, 0x4b, 0x4b, 0xea, 0x1d, 0x53, + 0xe2, 0xb3, 0xda, 0xaf, 0x69, 0xae, 0xee, 0x57, 0x11, 0x47, 0x08, 0xc9, 0x90, 0xf2, 0x0a, 0xac, + 0x36, 0x0b, 0x7e, 0xbf, 0x9f, 0x60, 0x45, 0x7b, 0x14, 0x45, 0xdd, 0x9c, 0xfc, 0x52, 0xaa, 0xa9, + 0x3d, 0xb2, 0x92, 0x68, 0x5a, 0x86, 0x2d, 0x95, 0xd2, 0x99, 0x3b, 0x6f, 0x1e, 0x53, 0xa7, 0x9e, + 0x89, 0xdb, 0xed, 0x22, 0x95, 0xd2, 0x79, 0xf5, 0xbd, 0x97, 0x8d, 0x83, 0x13, 0xab, 0x37, 0xda, + 0x67, 0x0a, 0x33, 0xf4, 0x9f, 0x27, 0x19, 0x60, 0xd3, 0x57, 0x80, 0x74, 0xeb, 0xc2, 0x1f, 0xf5, + 0x93, 0x32, 0x05, 0x36, 0xa5, 0xc7, 0xd2, 0x22, 0x09, 0xc1, 0xca, 0x6a, 0x83, 0x12, 0x1f, 0xcc, + 0x19, 0xa7, 0xa4, 0x5d, 0x72, 0xa6, 0xa1, 0x5d, 0x66, 0x5c, 0x20, 0xc7, 0xaf, 0x1f, 0x1d, 0x73, + 0x4e, 0xed, 0xb1, 0x3a, 0x71, 0x8c, 0x6e, 0x55, 0x4f, 0x5c, 0x24, 0x7a, 0x3f, 0x03, 0x7d, 0x9b, + 0x7b, 0x65, 0xcf, 0xdf, 0xec, 0xff, 0x5f, 0x9b, 0x9a, 0x02, 0xc4, 0x63, 0x29, 0xf2, 0xf2, 0x9c, + 0xac, 0xdb, 0x1d, 0x25, 0x1c, 0x88, 0x70, 0xe9, 0x48, 0xd2, 0xa2, 0xaa, 0xa2, 0x5b, 0xb2, 0x18, + 0x36, 0x1c, 0x34, 0xf9, 0xcb, 0x51, 0x64, 0xe2, 0x1e, 0x65, 0x95, 0xe3, 0xa2, 0xc4, 0xaf, 0x44, + 0xa9, 0xba, 0xfb, 0xd8, 0x72, 0xaa, 0x81, 0x4d, 0xe6, 0x52, 0x5a, 0x54, 0xca, 0xe7, 0x9f, 0x7d, + 0xce, 0xdb, 0x6f, 0xbf, 0xcd, 0x81, 0x8d, 0x47, 0xb3, 0xc4, 0x01, 0xf7, 0x72, 0xeb, 0x28, 0xf3, + 0x97, 0x52, 0xed, 0x48, 0xfb, 0x20, 0x45, 0xe1, 0xa2, 0x8b, 0xe7, 0x30, 0x73, 0xe6, 0x2c, 0x94, + 0xae, 0x73, 0x5b, 0x5b, 0x7b, 0x3b, 0x2d, 0x55, 0x2d, 0x86, 0x65, 0x0c, 0xd5, 0x2d, 0xc3, 0x62, + 0xf2, 0xa4, 0x5b, 0xb0, 0x71, 0xf4, 0x70, 0x9b, 0x0c, 0xa5, 0x16, 0x77, 0x98, 0xe6, 0x8f, 0xa2, + 0x09, 0xd1, 0x35, 0xba, 0x55, 0xd2, 0xd4, 0x29, 0x59, 0xbd, 0xd7, 0xe4, 0x9c, 0x4a, 0x41, 0x59, + 0x8e, 0xe8, 0xb3, 0x77, 0x8a, 0xae, 0xe4, 0x85, 0x00, 0x5a, 0x3a, 0xa1, 0x25, 0x0c, 0xa3, 0x8b, + 0x7b, 0x13, 0xc0, 0xe4, 0x31, 0x20, 0xc4, 0x52, 0xe0, 0x8f, 0x0a, 0x4a, 0xb2, 0xe5, 0x71, 0xf7, + 0x62, 0xd1, 0xab, 0xd4, 0xd7, 0x2d, 0xb0, 0x21, 0xfb, 0x47, 0xdd, 0xa2, 0xe7, 0xb5, 0xa0, 0x97, + 0xea, 0x4e, 0x97, 0xab, 0x0f, 0xf8, 0xa3, 0xf8, 0xfd, 0x11, 0x0a, 0x2c, 0x82, 0xc2, 0x7c, 0xfa, + 0x1c, 0x93, 0x92, 0x86, 0x60, 0xd5, 0x2e, 0x83, 0xa5, 0xc1, 0x3c, 0xe9, 0xb8, 0x2a, 0xfb, 0x35, + 0x6b, 0x9e, 0xff, 0xf6, 0xf6, 0x33, 0x9b, 0x8e, 0xdb, 0xe0, 0x6e, 0xc6, 0x54, 0xe2, 0xf1, 0x88, + 0xfc, 0xfd, 0x73, 0x4f, 0x50, 0xbf, 0xa7, 0x8e, 0x50, 0x28, 0x3d, 0x13, 0x92, 0xad, 0x91, 0xfc, + 0xe4, 0x48, 0xeb, 0x53, 0x66, 0x58, 0x13, 0x48, 0x9d, 0xaa, 0xaa, 0x2a, 0xce, 0x3e, 0xfb, 0x07, + 0x19, 0x70, 0xa5, 0x94, 0x7c, 0xbd, 0x6b, 0x3b, 0xb1, 0x71, 0x72, 0xab, 0xc5, 0x63, 0xdb, 0xd8, + 0x9b, 0x75, 0xa8, 0x9c, 0x2c, 0x80, 0x9d, 0x57, 0x25, 0x70, 0x5c, 0x61, 0x98, 0xb1, 0x42, 0x08, + 0x25, 0xd2, 0xc1, 0x49, 0x75, 0x03, 0x6c, 0xaa, 0x95, 0x5c, 0x32, 0x56, 0x49, 0x83, 0xdb, 0x9f, + 0xaf, 0xd4, 0xf5, 0x2d, 0x7f, 0x0c, 0x3e, 0xde, 0x69, 0x50, 0xe2, 0xe9, 0xd7, 0x22, 0x93, 0x51, + 0x49, 0xe9, 0x81, 0xb0, 0xb6, 0x95, 0x74, 0x21, 0xbf, 0xff, 0xc4, 0x36, 0xd9, 0x93, 0xac, 0xe8, + 0xd1, 0x55, 0x93, 0xfd, 0xea, 0xbb, 0x3d, 0xf4, 0x93, 0xcc, 0xf9, 0xb7, 0x3b, 0x21, 0xd2, 0x27, + 0xcb, 0x22, 0x33, 0x0f, 0x59, 0xf7, 0xd6, 0xa1, 0x08, 0x88, 0xa5, 0x04, 0xef, 0x6d, 0xd1, 0x79, + 0x5f, 0x58, 0x22, 0xb6, 0xf3, 0x6d, 0x37, 0xca, 0xb2, 0x9c, 0xdb, 0x03, 0xf7, 0xb5, 0x9d, 0x90, + 0xbd, 0x60, 0xd6, 0xda, 0xbc, 0xb1, 0xcd, 0xe2, 0xc2, 0x3d, 0x5b, 0xf6, 0x10, 0x0a, 0x45, 0xba, + 0xe0, 0x49, 0x27, 0x4e, 0x8c, 0xdd, 0x29, 0x45, 0x1e, 0x35, 0x84, 0xa6, 0x69, 0xcc, 0x98, 0x71, + 0x2e, 0x1e, 0xaf, 0x27, 0x73, 0xed, 0xf5, 0xf5, 0x75, 0x6c, 0xb0, 0x7d, 0x15, 0x52, 0xb3, 0x93, + 0x57, 0xb7, 0x8c, 0x0d, 0x46, 0x4e, 0xfa, 0x39, 0x38, 0x1d, 0xa1, 0x24, 0x20, 0x5b, 0x10, 0xd3, + 0xa0, 0x3e, 0x00, 0xb5, 0x6d, 0x26, 0x1e, 0x7b, 0x1a, 0xdc, 0xde, 0xd9, 0xa2, 0xbe, 0x99, 0x08, + 0xe8, 0x8c, 0xc3, 0x07, 0xdb, 0x0c, 0xc6, 0x95, 0x29, 0xe4, 0x38, 0x65, 0x9f, 0x6a, 0x4f, 0x6f, + 0x6e, 0xb3, 0x44, 0x92, 0x34, 0x04, 0xbb, 0x9b, 0x0c, 0x66, 0x8f, 0x52, 0xb0, 0x28, 0xbd, 0x03, + 0xae, 0x1e, 0x01, 0x97, 0x3e, 0xb0, 0xf6, 0x8a, 0xb8, 0xa5, 0x14, 0x98, 0x08, 0x0c, 0x03, 0x74, + 0xb3, 0x97, 0xc6, 0x75, 0xaf, 0xcf, 0xa4, 0x4b, 0x85, 0x84, 0x2e, 0x48, 0xa6, 0x4c, 0x4c, 0xba, + 0xf4, 0xbf, 0xba, 0x74, 0xc0, 0x12, 0x86, 0xe4, 0xaf, 0xd5, 0x92, 0xed, 0x65, 0x55, 0x09, 0x57, + 0x95, 0xbc, 0xb2, 0xf3, 0xd5, 0xfd, 0xcb, 0xe1, 0xc8, 0x09, 0x6f, 0x47, 0x61, 0x75, 0x91, 0x25, + 0xb1, 0xc1, 0xb3, 0x30, 0xf9, 0xfe, 0xc1, 0x92, 0x13, 0x8f, 0x53, 0x92, 0x8c, 0x1b, 0x37, 0x9e, + 0x31, 0x63, 0xc7, 0x65, 0x1e, 0xce, 0x48, 0x38, 0xcc, 0x8a, 0xa3, 0x9f, 0xe8, 0xd1, 0x69, 0xfe, + 0x3b, 0xb4, 0xfc, 0xac, 0xa3, 0xd0, 0xca, 0x80, 0x00, 0x58, 0x0a, 0xd5, 0x54, 0xda, 0x3d, 0x2b, + 0xc8, 0x8f, 0xfd, 0xf0, 0xfd, 0xb5, 0x71, 0x6d, 0xfe, 0x24, 0x85, 0x92, 0x1c, 0x95, 0x23, 0x7e, + 0x41, 0x4a, 0x37, 0x30, 0xe5, 0xb1, 0xf9, 0x09, 0x29, 0x61, 0xdb, 0x51, 0x89, 0xdb, 0x26, 0x18, + 0x5b, 0x2a, 0xfa, 0x64, 0x25, 0xa4, 0x90, 0x7d, 0xe4, 0x41, 0x01, 0x8e, 0xfa, 0x25, 0xbb, 0x1a, + 0x4c, 0xa2, 0xc9, 0x74, 0x92, 0x24, 0xe3, 0xbc, 0x45, 0x7a, 0x0c, 0x52, 0x2c, 0x95, 0x16, 0x35, + 0x49, 0xa4, 0xcc, 0xbe, 0xec, 0x0a, 0x09, 0x98, 0x0a, 0x09, 0x1d, 0x62, 0x09, 0x41, 0x2c, 0x69, + 0x62, 0xf6, 0xe7, 0xa6, 0xa0, 0x02, 0x56, 0x4c, 0x6c, 0xc4, 0x32, 0x4e, 0xbe, 0xfb, 0xc9, 0xb4, + 0xa0, 0xfa, 0x2c, 0x38, 0x7e, 0x1c, 0x89, 0x38, 0xc6, 0x2b, 0x37, 0xa9, 0x53, 0xcd, 0x95, 0x2c, + 0xfa, 0x86, 0x2d, 0x2b, 0x10, 0xd0, 0x8c, 0x76, 0x7d, 0x92, 0xac, 0x33, 0x4f, 0x20, 0x17, 0x20, + 0x29, 0x28, 0x28, 0xe0, 0xe2, 0x39, 0x97, 0x64, 0x24, 0xa7, 0xe2, 0xf1, 0x38, 0xab, 0xf6, 0xad, + 0x48, 0xec, 0x39, 0x7d, 0xe3, 0x9d, 0xda, 0x10, 0xe3, 0xcf, 0x4d, 0xb3, 0xdb, 0xe5, 0x80, 0x48, + 0x55, 0x02, 0x34, 0xe7, 0xeb, 0x32, 0x7f, 0x7b, 0x7b, 0xa3, 0x72, 0x9a, 0x90, 0x81, 0x0d, 0xb0, + 0x68, 0x87, 0x41, 0xc2, 0x30, 0x7b, 0x5c, 0x65, 0xff, 0xee, 0x8c, 0xa4, 0x02, 0xba, 0x64, 0x4a, + 0x19, 0x5c, 0x77, 0x86, 0x8a, 0xa6, 0x91, 0xd1, 0xca, 0x92, 0x82, 0x63, 0x4c, 0xdd, 0x30, 0x25, + 0x3b, 0x1b, 0x25, 0xfe, 0x2b, 0x7d, 0x44, 0xc7, 0x58, 0xb0, 0xaa, 0x56, 0x54, 0xc5, 0x4a, 0x20, + 0xca, 0xb1, 0x60, 0x49, 0x01, 0x42, 0xc5, 0xa2, 0xb8, 0xc9, 0x72, 0x78, 0xb0, 0xbb, 0x95, 0xb6, + 0xa6, 0xf6, 0x2f, 0x16, 0x49, 0x12, 0x26, 0xc7, 0xf0, 0x14, 0xb5, 0xae, 0x78, 0xcc, 0x49, 0x96, + 0xdd, 0x83, 0xcd, 0xe6, 0xa6, 0x23, 0x98, 0xfe, 0x9b, 0xa2, 0x6b, 0x20, 0xad, 0x2a, 0x1c, 0x38, + 0x8b, 0x6c, 0x09, 0xbd, 0xe4, 0xe0, 0xab, 0x2d, 0xe7, 0xee, 0xa9, 0xf9, 0x56, 0x31, 0x89, 0x8c, + 0x93, 0x92, 0x89, 0x13, 0x9e, 0xd1, 0x55, 0x55, 0x65, 0xea, 0x19, 0xd3, 0xc8, 0xcb, 0xcb, 0x07, + 0x24, 0x81, 0x40, 0x80, 0x4f, 0xf6, 0x7f, 0xa4, 0x6f, 0x19, 0xff, 0xf9, 0x6d, 0x66, 0x99, 0xf1, + 0x7a, 0xfb, 0xec, 0xe3, 0x17, 0xc4, 0x4f, 0x9e, 0x8b, 0x06, 0x84, 0x43, 0xac, 0x73, 0xdf, 0x2a, + 0xe7, 0xc9, 0x9b, 0xf0, 0x09, 0x20, 0xeb, 0x44, 0x9d, 0x19, 0xaa, 0x3a, 0x34, 0xf2, 0xb6, 0xe3, + 0xe7, 0x65, 0x2f, 0x44, 0xb5, 0x2b, 0x26, 0x6b, 0x78, 0x1c, 0x32, 0x13, 0xf9, 0xf6, 0xd2, 0xa0, + 0xcd, 0xb4, 0xf9, 0x48, 0x29, 0x69, 0x0b, 0x4b, 0x76, 0x58, 0xdd, 0x52, 0x9d, 0xa9, 0x3e, 0x64, + 0x1d, 0x1f, 0x7d, 0x4a, 0xd3, 0xd2, 0x7c, 0x22, 0x7b, 0x67, 0xff, 0xc8, 0xbb, 0x1b, 0x60, 0x05, + 0x55, 0x8d, 0xa2, 0xb9, 0x02, 0x68, 0x3e, 0xcd, 0x0c, 0xe5, 0xc5, 0xe3, 0xc7, 0xb3, 0xa2, 0x0c, + 0x6d, 0x8b, 0x24, 0x21, 0x02, 0x27, 0xbc, 0xb6, 0xc0, 0xdf, 0x5b, 0xf5, 0xd1, 0xec, 0x58, 0x14, + 0xbb, 0x1e, 0x17, 0x9d, 0xc7, 0xfc, 0xcf, 0x9c, 0x9c, 0x1c, 0x6e, 0xbe, 0xe5, 0xc7, 0x04, 0x03, + 0x41, 0x16, 0xff, 0xf9, 0x0d, 0x5c, 0x59, 0x6e, 0x9a, 0xa7, 0xb4, 0x76, 0xd6, 0x5d, 0x5a, 0x77, + 0x2f, 0x91, 0xa2, 0xd7, 0x43, 0x73, 0x8f, 0xc8, 0x01, 0x55, 0x4d, 0xea, 0x5e, 0x2d, 0xc3, 0xa5, + 0x0e, 0x7c, 0xfc, 0x4d, 0xef, 0xf3, 0xbd, 0x69, 0x1f, 0x66, 0xee, 0x35, 0xef, 0xcd, 0x75, 0x89, + 0x42, 0x8f, 0x43, 0xf6, 0x3d, 0x16, 0xf5, 0xc9, 0x32, 0xf5, 0xec, 0xaf, 0xfb, 0x9a, 0x21, 0x78, + 0x91, 0x92, 0xb0, 0x0d, 0x15, 0xef, 0x36, 0x8c, 0x0e, 0x45, 0x19, 0xe0, 0x4b, 0x94, 0xa9, 0x71, + 0x4b, 0x85, 0xf2, 0x8a, 0x3a, 0xce, 0xf6, 0x0b, 0xe3, 0xab, 0xb8, 0xe8, 0x7d, 0x8d, 0x76, 0x87, + 0x9d, 0x68, 0x34, 0xc6, 0xe8, 0xb1, 0x63, 0x19, 0x36, 0x7c, 0x38, 0xcf, 0xfe, 0xed, 0xd9, 0x44, + 0x74, 0x66, 0xfb, 0x75, 0x81, 0x0b, 0x82, 0x1f, 0x0d, 0xc8, 0x7a, 0xf0, 0xdf, 0x1d, 0x8f, 0x79, + 0x73, 0x6a, 0xb2, 0xce, 0x72, 0x2c, 0xda, 0x9a, 0x25, 0xcc, 0x15, 0xbb, 0x4c, 0xa2, 0xc9, 0x5e, + 0xf9, 0x2b, 0xd9, 0xbf, 0xba, 0x2b, 0x89, 0x26, 0x04, 0x9b, 0x3a, 0x04, 0x46, 0x96, 0x5c, 0x2c, + 0xcd, 0xc4, 0xfe, 0xef, 0xc3, 0x35, 0xb6, 0x94, 0x46, 0xa4, 0x3a, 0x3e, 0xf4, 0xb4, 0xfb, 0xdf, + 0x52, 0xab, 0xd4, 0x49, 0xe9, 0x0e, 0x2c, 0xa7, 0xd3, 0xc1, 0xb5, 0xd7, 0xdd, 0xc0, 0x3f, 0xff, + 0xcb, 0x03, 0xf8, 0x72, 0x7c, 0x6c, 0xf8, 0xdb, 0x7a, 0x96, 0x2d, 0xfb, 0x90, 0xce, 0xd1, 0x4d, + 0x21, 0xa3, 0x33, 0xb4, 0xe6, 0x5b, 0x15, 0x76, 0xbe, 0x0f, 0x17, 0x1f, 0xf8, 0x53, 0xa7, 0xb4, + 0xdd, 0x1c, 0x5b, 0xcd, 0x10, 0x35, 0x77, 0xd7, 0x4e, 0xe5, 0xf4, 0xba, 0xdd, 0xa6, 0xf0, 0x3a, + 0xc1, 0xeb, 0x50, 0x8e, 0xe9, 0x6e, 0x14, 0xc0, 0xee, 0x46, 0x58, 0x33, 0x4a, 0xa4, 0x2c, 0x17, + 0x1b, 0x0f, 0xb6, 0xcf, 0x88, 0x7c, 0x2f, 0x00, 0x06, 0x88, 0x3e, 0x6d, 0x26, 0xbc, 0x4f, 0x5a, + 0x57, 0x0a, 0x9f, 0xfd, 0x3c, 0x65, 0x9b, 0x5a, 0x72, 0xdd, 0xe5, 0xd7, 0x33, 0x7d, 0xfa, 0xd9, + 0x38, 0x1c, 0x0e, 0x72, 0x73, 0x72, 0x29, 0x2e, 0x29, 0xa1, 0x39, 0xd0, 0x24, 0x6b, 0x4b, 0x8e, + 0x3e, 0x26, 0x85, 0x58, 0x9d, 0xf8, 0xf0, 0x9b, 0xfb, 0xb4, 0xb4, 0x81, 0x72, 0x71, 0x45, 0x87, + 0xb3, 0xcb, 0x53, 0x2b, 0xbd, 0xb3, 0x13, 0xed, 0x81, 0x99, 0x7a, 0xad, 0x36, 0x4c, 0x78, 0xec, + 0x86, 0xfd, 0x6c, 0xe3, 0x41, 0xff, 0x65, 0xcd, 0xab, 0x00, 0xfc, 0xd7, 0xa0, 0xe7, 0xbc, 0x9f, + 0xf5, 0xaf, 0xca, 0x9d, 0xc2, 0xa8, 0xfe, 0x4b, 0xf0, 0xbe, 0x1d, 0xab, 0x74, 0x65, 0x42, 0xb1, + 0xc2, 0xe8, 0x12, 0x41, 0x79, 0xae, 0x42, 0xb6, 0x1d, 0x9c, 0xb6, 0xb4, 0x5d, 0x6f, 0x6e, 0x00, + 0x39, 0xc3, 0x57, 0xad, 0xe6, 0xc5, 0x36, 0x7e, 0x1b, 0xa9, 0xa1, 0x81, 0xb4, 0x9a, 0x07, 0xc7, + 0x9b, 0x5c, 0xf7, 0x26, 0x16, 0xe6, 0x66, 0x95, 0x4d, 0x2c, 0x2b, 0x1b, 0xac, 0x68, 0x9a, 0x46, + 0x24, 0x12, 0xe6, 0x60, 0x4d, 0x0d, 0x6b, 0xcd, 0x2f, 0xa9, 0x59, 0xb0, 0xef, 0x25, 0xbb, 0xee, + 0x79, 0xa2, 0x79, 0x41, 0xc7, 0xb7, 0xe2, 0x2b, 0x9d, 0x74, 0x80, 0xf3, 0xbf, 0xf2, 0x0a, 0x33, + 0x68, 0x5e, 0xd3, 0xf9, 0x8c, 0xf9, 0xcb, 0xc4, 0xf2, 0x8e, 0x2a, 0x63, 0x7f, 0x14, 0xe2, 0xa0, + 0x4c, 0x53, 0x74, 0xad, 0x54, 0xf6, 0x21, 0x0e, 0x8b, 0xbc, 0x90, 0x41, 0x93, 0x08, 0x0c, 0x8e, + 0x6b, 0xdc, 0xf7, 0xfb, 0xb1, 0xec, 0xde, 0x13, 0xe4, 0xbd, 0xf7, 0x8f, 0xd2, 0xb2, 0xc3, 0xc0, + 0xe6, 0x93, 0xe4, 0x58, 0x05, 0xc2, 0x6a, 0x23, 0x70, 0xae, 0xad, 0x5d, 0x2b, 0x10, 0x37, 0xb7, + 0x4d, 0xe8, 0x0c, 0xf0, 0x3d, 0x5c, 0xd6, 0x39, 0x1e, 0xa3, 0xa5, 0xcd, 0x48, 0xbd, 0xf0, 0xc6, + 0xab, 0xb6, 0xa2, 0x5c, 0x1f, 0x81, 0xec, 0xa0, 0xde, 0x79, 0x45, 0xac, 0xd1, 0x32, 0x2e, 0x76, + 0x93, 0x63, 0xb8, 0xfe, 0x45, 0x63, 0xde, 0x91, 0x6f, 0xcd, 0x70, 0x38, 0xe9, 0x00, 0x27, 0x57, + 0xdb, 0x5d, 0xda, 0x6e, 0xeb, 0x73, 0xa9, 0x57, 0x9b, 0x7c, 0x86, 0x4c, 0xf5, 0x04, 0x4f, 0xa6, + 0x55, 0xa8, 0x6e, 0xb5, 0xb0, 0xa8, 0x26, 0x22, 0x9a, 0x2a, 0xd3, 0x07, 0x1b, 0x85, 0xdc, 0x71, + 0xfa, 0x8e, 0xd8, 0x2d, 0x57, 0x9f, 0x55, 0xa4, 0xdc, 0x7a, 0xcb, 0x10, 0x0e, 0x1f, 0x8e, 0xb2, + 0xf3, 0x60, 0x98, 0xc4, 0x34, 0xf7, 0x72, 0x3d, 0x7a, 0xf4, 0x99, 0xa0, 0xd4, 0x0d, 0x25, 0xd7, + 0x89, 0xeb, 0xfa, 0xc4, 0x81, 0xd6, 0xca, 0xa6, 0x03, 0x7c, 0x4f, 0x97, 0x7f, 0x4e, 0xe0, 0xa5, + 0xfc, 0x75, 0x9e, 0x35, 0xb1, 0x0f, 0xec, 0x43, 0x0f, 0xd2, 0x89, 0x63, 0x41, 0xb0, 0x3e, 0x30, + 0xb9, 0xf5, 0xeb, 0xef, 0xe5, 0xc5, 0xe4, 0xde, 0x56, 0xe6, 0x1c, 0x7b, 0xf5, 0x19, 0x6d, 0xe5, + 0x15, 0x15, 0x5d, 0xc9, 0x62, 0x25, 0xfd, 0x35, 0x5b, 0x95, 0xae, 0x5f, 0xe6, 0xed, 0xca, 0xdb, + 0xec, 0x2b, 0x00, 0xc8, 0xaf, 0xb6, 0x5b, 0xb2, 0x5f, 0x2e, 0x5c, 0x7a, 0xce, 0x8c, 0x22, 0xb9, + 0xaf, 0x7a, 0x8e, 0x0c, 0xb5, 0xcd, 0x97, 0x3f, 0x7f, 0x68, 0xa4, 0xcc, 0xfe, 0xcf, 0xac, 0xa6, + 0x82, 0x65, 0x22, 0x97, 0x53, 0x6b, 0xe0, 0x44, 0xd1, 0x83, 0x12, 0x0e, 0x51, 0xb0, 0xc5, 0x3b, + 0xdc, 0xf7, 0x7a, 0xe1, 0x2b, 0x91, 0xec, 0xb6, 0xda, 0x9d, 0x5b, 0x36, 0xe6, 0x1e, 0x3e, 0x74, + 0x18, 0x90, 0xd8, 0x6c, 0x96, 0x74, 0x9e, 0x35, 0xa4, 0x60, 0x49, 0x65, 0x57, 0xaa, 0x8a, 0x25, + 0xa7, 0x54, 0x22, 0xe4, 0xda, 0x41, 0x17, 0x3a, 0xdf, 0x4e, 0x9d, 0x77, 0xdf, 0x5d, 0x43, 0x29, + 0x2f, 0x73, 0xb2, 0x71, 0xb3, 0x9f, 0xd7, 0xaa, 0xeb, 0x52, 0xca, 0x30, 0xe3, 0xfa, 0x96, 0x4b, + 0x64, 0xfb, 0x29, 0x28, 0x07, 0xc8, 0xca, 0xdb, 0xe3, 0x72, 0x7b, 0xff, 0xe2, 0x7a, 0xd8, 0xf9, + 0xcf, 0xb9, 0x49, 0x61, 0xb3, 0x77, 0x59, 0x6d, 0xda, 0x72, 0x67, 0xce, 0x9c, 0x29, 0xd7, 0xaf, + 0x5f, 0x2f, 0x97, 0x2e, 0x5b, 0x26, 0x2b, 0xcf, 0xae, 0x32, 0xdd, 0x4f, 0xfb, 0x16, 0xe5, 0x6c, + 0xf5, 0xb9, 0x8a, 0xf6, 0x59, 0x72, 0x7d, 0x8f, 0x79, 0x76, 0xde, 0x7f, 0x5f, 0xa5, 0x0c, 0xb6, + 0xcc, 0x97, 0x8d, 0x47, 0xe6, 0xca, 0x6b, 0x7f, 0x58, 0x26, 0x3d, 0x8b, 0xac, 0x6f, 0xe7, 0x6d, + 0x77, 0xd8, 0x4f, 0xdd, 0xd5, 0x01, 0xb2, 0x07, 0xe7, 0x6d, 0xc4, 0x99, 0x5c, 0x97, 0x78, 0x37, + 0xb2, 0x50, 0xbd, 0xc0, 0x58, 0xdb, 0xd1, 0x2f, 0x05, 0x08, 0x5e, 0xaf, 0x97, 0x11, 0x15, 0xe5, + 0xc4, 0x12, 0x21, 0x46, 0x8c, 0xf1, 0xa4, 0x22, 0x53, 0xda, 0x96, 0xc4, 0xf7, 0x64, 0xc7, 0x22, + 0x2d, 0xb6, 0xc7, 0xc6, 0xae, 0x4d, 0x8e, 0xbe, 0xf7, 0x77, 0xc3, 0xb1, 0xd9, 0x15, 0x5e, 0x7f, + 0xeb, 0x10, 0x7f, 0x1d, 0xdc, 0x5e, 0x6f, 0x19, 0x6f, 0x3c, 0xd8, 0x36, 0x3e, 0x19, 0x3f, 0x05, + 0xe3, 0x00, 0x70, 0xd1, 0xc5, 0x1b, 0x73, 0x35, 0xb9, 0x3f, 0xff, 0xf5, 0xc8, 0x1f, 0xc4, 0x05, + 0xc6, 0xda, 0x5e, 0xe7, 0x37, 0x45, 0xe0, 0xbc, 0x22, 0x2b, 0x91, 0xfd, 0x9b, 0xe2, 0x50, 0x43, + 0x6c, 0x2f, 0x6d, 0x8b, 0x9e, 0xc3, 0xd5, 0x58, 0xc7, 0x48, 0x31, 0xca, 0x22, 0xeb, 0x5d, 0xb3, + 0x85, 0x2d, 0x7a, 0x77, 0xd6, 0xfa, 0xd0, 0xdd, 0x0f, 0xde, 0x36, 0x9a, 0x21, 0x83, 0x9c, 0xec, + 0xaa, 0x0e, 0xf2, 0xca, 0xfa, 0xc3, 0x86, 0x9c, 0x6d, 0x3c, 0xa7, 0xe6, 0xaa, 0x07, 0x4e, 0x41, + 0x38, 0x40, 0x2c, 0x38, 0x11, 0x4e, 0x4c, 0x89, 0xac, 0xd2, 0x2e, 0x30, 0xb6, 0x19, 0x68, 0x9a, + 0xca, 0x75, 0xd7, 0x5d, 0x4b, 0x5b, 0x5b, 0x1b, 0x9f, 0x6c, 0x5e, 0x8e, 0x7a, 0x81, 0xbe, 0xd4, + 0x3e, 0xa7, 0xf3, 0xff, 0x76, 0x1e, 0xf2, 0xbe, 0xbb, 0xa3, 0x70, 0x7c, 0x7e, 0xb3, 0x6b, 0x1c, + 0x81, 0x9c, 0x98, 0x30, 0x0e, 0xaf, 0x3c, 0xdf, 0xa8, 0x4e, 0x5d, 0xfb, 0x93, 0x49, 0x95, 0xda, + 0xcc, 0x1f, 0xe4, 0x13, 0x0a, 0xeb, 0xbc, 0xf8, 0x6a, 0x2d, 0x07, 0x66, 0x18, 0x4b, 0xd5, 0xb0, + 0xe3, 0xb7, 0x6d, 0x65, 0x41, 0xf3, 0x14, 0x84, 0x03, 0xc4, 0x82, 0xcd, 0x70, 0xc4, 0x65, 0x84, + 0x3b, 0x6d, 0x98, 0x92, 0x29, 0x53, 0x26, 0xf3, 0xc8, 0x23, 0x8f, 0xf0, 0x4f, 0x37, 0xde, 0x88, + 0xdd, 0x6e, 0x97, 0x7a, 0x5d, 0x74, 0x83, 0xd9, 0x60, 0xdd, 0xd2, 0x38, 0x3c, 0xd0, 0xb9, 0xb1, + 0x29, 0xcc, 0xb4, 0x4a, 0x2b, 0x23, 0x73, 0x93, 0xa4, 0x9e, 0x8e, 0x8f, 0xbc, 0xd5, 0x53, 0x90, + 0x7b, 0xcb, 0x8d, 0x43, 0xd0, 0x54, 0xc1, 0x5b, 0xef, 0x1e, 0xe5, 0xed, 0xc2, 0x86, 0xcd, 0x6a, + 0xa1, 0xe5, 0x8e, 0x8e, 0x8b, 0x83, 0xfa, 0x29, 0xf8, 0x06, 0xd4, 0x1e, 0xdc, 0xd3, 0xb0, 0xe6, + 0xb0, 0xdb, 0xb1, 0x5a, 0xad, 0x04, 0xfc, 0x7e, 0xa4, 0xe9, 0xc5, 0xad, 0x0d, 0x45, 0x2d, 0xa9, + 0x41, 0x2d, 0x71, 0x2a, 0xc9, 0x8d, 0x3b, 0xf8, 0x60, 0xf1, 0x2a, 0x34, 0x6d, 0x07, 0xd7, 0x5d, + 0x9c, 0xcb, 0x03, 0xf7, 0x9f, 0x86, 0xc7, 0xa5, 0xb1, 0xe6, 0x6f, 0x1d, 0x3c, 0xf1, 0xf5, 0xa1, + 0x56, 0x73, 0x9e, 0x31, 0xdf, 0x7f, 0x51, 0x5b, 0xf3, 0x29, 0xe8, 0x06, 0x18, 0xc0, 0x8a, 0x70, + 0xa3, 0x08, 0x45, 0x40, 0x98, 0x0d, 0x1b, 0x37, 0xf1, 0xd8, 0x63, 0x8f, 0xb3, 0x65, 0xcb, 0x66, + 0xf4, 0x52, 0x33, 0x25, 0x2a, 0x2c, 0xdb, 0xd1, 0xac, 0xf1, 0x94, 0xb7, 0xf3, 0xf5, 0x7a, 0xff, + 0x92, 0x87, 0xfe, 0xe5, 0x9e, 0x89, 0x62, 0xcf, 0x9e, 0x1c, 0xee, 0xb8, 0x65, 0x28, 0xb9, 0x1e, + 0x8d, 0x03, 0x47, 0xe3, 0x3c, 0xfe, 0xd9, 0x8e, 0x64, 0xfb, 0xf5, 0xa1, 0x7b, 0xad, 0x65, 0xa2, + 0xee, 0x14, 0x6c, 0x03, 0x70, 0xe5, 0xd7, 0xd9, 0x4b, 0xb3, 0xff, 0x68, 0xf9, 0x4c, 0x8c, 0xcc, + 0x4c, 0x9b, 0x92, 0xc2, 0x6e, 0x93, 0xd9, 0x0f, 0x95, 0xae, 0xc8, 0x5b, 0xe1, 0xb3, 0x03, 0xe4, + 0x2f, 0x1f, 0x36, 0x7d, 0xfe, 0xcf, 0x46, 0x25, 0x1b, 0x6a, 0x2f, 0x93, 0x66, 0xf4, 0x2a, 0x69, + 0x86, 0xaf, 0x94, 0x87, 0xf6, 0x5f, 0x2a, 0x2f, 0xff, 0x71, 0x85, 0xee, 0x5d, 0x52, 0x78, 0x6b, + 0x51, 0xeb, 0x3f, 0x46, 0xb8, 0xed, 0xd4, 0xfa, 0x8e, 0xab, 0xe0, 0xa8, 0x28, 0xf5, 0xbe, 0xe6, + 0x7a, 0xcb, 0x79, 0x6f, 0x9e, 0x74, 0xdd, 0xe0, 0x93, 0x9e, 0x47, 0x8b, 0xbf, 0x28, 0x5c, 0x97, + 0x3f, 0x35, 0x73, 0x8c, 0xfa, 0xcc, 0x67, 0xad, 0x78, 0x21, 0xf7, 0xed, 0x25, 0x6f, 0x9d, 0x25, + 0x53, 0xe1, 0xab, 0xe4, 0xfe, 0xdd, 0x73, 0xe4, 0x0d, 0xb7, 0x0f, 0x95, 0x39, 0xef, 0x14, 0x7c, + 0x50, 0xd4, 0xac, 0x79, 0x4e, 0xdd, 0xc1, 0xbf, 0x7f, 0xfd, 0xc3, 0x2d, 0x62, 0x84, 0xac, 0x12, + 0x1d, 0xef, 0xc7, 0x9d, 0x34, 0x1a, 0x28, 0xd3, 0x12, 0xf1, 0xe6, 0x89, 0x1d, 0x7d, 0x5a, 0xcc, + 0x72, 0xd6, 0x6b, 0x43, 0x06, 0x6d, 0xb4, 0x7f, 0x32, 0x3f, 0x5c, 0x31, 0x7c, 0x7d, 0x6d, 0x80, + 0x8d, 0x17, 0xc7, 0x97, 0x5a, 0x27, 0x84, 0xaf, 0x69, 0xae, 0x8c, 0x47, 0x4f, 0xc1, 0xf5, 0x3d, + 0x00, 0xf8, 0x5b, 0x59, 0xfa, 0xce, 0xac, 0xf2, 0xf0, 0x57, 0xe2, 0x22, 0x47, 0x99, 0x52, 0xa7, + 0x4e, 0x0f, 0xac, 0x6c, 0x71, 0x66, 0xfa, 0x64, 0x4e, 0xad, 0x53, 0xeb, 0xd4, 0xea, 0xbd, 0xfe, + 0x1f, 0xce, 0xc8, 0x31, 0x59, 0x0a, 0xde, 0x14, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, + 0x44, 0xae, 0x42, 0x60, 0x82 +}; diff --git a/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/png_support.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/png_support.ino new file mode 100644 index 00000000..464e20b9 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/Flash_transparent_PNG/png_support.ino @@ -0,0 +1,19 @@ + +// PNGdec support functions + +//=========================================v========================================== +// pngDraw: Callback function to draw pixels to the display +//==================================================================================== +// This function will be called during decoding of the png file to render each image +// line to the TFT. PNGdec generates the image line and a 1bpp mask. +void pngDraw(PNGDRAW *pDraw) { + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; // Line buffer for rendering + uint8_t maskBuffer[1 + MAX_IMAGE_WIDTH / 8]; // Mask buffer + + png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); + + if (png.getAlphaMask(pDraw, maskBuffer, 255)) { + // Note: pushMaskedImage is for pushing to the TFT and will not work pushing into a sprite + tft.pushMaskedImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer, maskBuffer); + } +} diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino similarity index 92% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino index 1ffb3ca4..18040b8a 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/LittleFS_PNG.ino @@ -3,6 +3,10 @@ // ESP32, ESP8266). It renders a png file that is stored in LittleFS // using the PNGdec library (available via library manager). +// Note: The PNGDEC required lots of RAM to work (~40kbytes) so +// this sketch is will not run on smaller memory processors (e.g. +// ESP8266, STM32F103 etc.) + // The test image is in the sketch "data" folder (press Ctrl+K to see it). // You must upload the image to LittleFS using the Arduino IDE Tools Data // Upload menu option (you may need to install extra tools for that). @@ -17,7 +21,7 @@ #include PNG png; -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -67,7 +71,7 @@ void loop() tft.startWrite(); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); uint32_t dt = millis(); - if (png.getWidth() > MAX_IMAGE_WDITH) { + if (png.getWidth() > MAX_IMAGE_WIDTH) { Serial.println("Image too wide for allocated line buffer size!"); } else { @@ -93,7 +97,7 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImage(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/PNG_FS_Support.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/PNG_FS_Support.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/PNG_FS_Support.ino rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/PNG_FS_Support.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/data/EagleEye.png b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/data/EagleEye.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/data/EagleEye.png rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/data/EagleEye.png diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/data/panda.png b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/data/panda.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG/data/panda.png rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG/data/panda.png diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino similarity index 91% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino index 1ad440d9..f40cdfe7 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/LittleFS_PNG_DMA.ino @@ -3,6 +3,10 @@ // ESP32, ESP8266). It renders a png file that is stored in LittleFS // using the PNGdec library (available via library manager). +// Note: The PNGDEC required lots of RAM to work (~40kbytes) so +// this sketch is will not run on smaller memory processors (e.g. +// ESP8266, STM32F103 etc.) + // It uses DMA to send image data to the TFT while the decoding takes // place. The processor and display combination must support DMA to // run this sketch! The decode time dominates so DMA is mainly an advantage @@ -22,7 +26,7 @@ #include PNG png; -#define MAX_IMAGE_WDITH 240 // Adjust for your images +#define MAX_IMAGE_WIDTH 240 // Adjust for your images int16_t xpos = 0; int16_t ypos = 0; @@ -73,7 +77,7 @@ void loop() tft.startWrite(); Serial.printf("image specs: (%d x %d), %d bpp, pixel type: %d\n", png.getWidth(), png.getHeight(), png.getBpp(), png.getPixelType()); uint32_t dt = millis(); - if (png.getWidth() > MAX_IMAGE_WDITH) { + if (png.getWidth() > MAX_IMAGE_WIDTH) { Serial.println("Image too wide for allocated lin buffer!"); } else { @@ -99,8 +103,8 @@ void loop() // you will need to adapt this function to suit. // Callback function to draw pixels to the display void pngDraw(PNGDRAW *pDraw) { - uint16_t lineBuffer[MAX_IMAGE_WDITH]; - static uint16_t dmaBuffer[MAX_IMAGE_WDITH]; // static so buffer persists after fn exit + uint16_t lineBuffer[MAX_IMAGE_WIDTH]; + static uint16_t dmaBuffer[MAX_IMAGE_WIDTH]; // static so buffer persists after fn exit png.getLineAsRGB565(pDraw, lineBuffer, PNG_RGB565_BIG_ENDIAN, 0xffffffff); tft.pushImageDMA(xpos, ypos + pDraw->y, pDraw->iWidth, 1, lineBuffer, dmaBuffer); diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/PNG_FS_Support.ino b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/PNG_FS_Support.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/PNG_FS_Support.ino rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/PNG_FS_Support.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/data/EagleEye.png b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/data/EagleEye.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/data/EagleEye.png rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/data/EagleEye.png diff --git a/libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/data/panda.png b/libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/data/panda.png similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/PNG Images/LittleFS_PNG_DMA/data/panda.png rename to libraries/TFT_eSPI-2.5.43/examples/PNG Images/LittleFS_PNG_DMA/data/panda.png diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Font_Demo_1_Array.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Font_Demo_1_Array.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Font_Demo_1_Array.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Font_Demo_1_Array.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_1_Array/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Font_Demo_2_Array.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Font_Demo_2_Array.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Font_Demo_2_Array.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Font_Demo_2_Array.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_2_Array/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino similarity index 96% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino index a15ee443..038cfd42 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Font_Demo_3_Array.ino @@ -11,7 +11,7 @@ This sketch uses method 3, the font characters are first plotted in a Sprite, then the Sprite is pushed to the screen. This method is very flexible and the Sprite can be created, deleted, resized as needed. To render anti-aliased fonts well the Sprite - needs to be 16 bit. The fonts will render in 1 bit per pixel sprites but there + needs to be 16-bit. The fonts will render in 1 bit per pixel sprites but there will then be no anti-aliasing. Using 1 bit per pixel Sprites is however useful to use the extended Unicode range in fonts on mono displays like ePaper. @@ -50,7 +50,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show antialiased fonts + spr.setColorDepth(16); // 16-bit colour needed to show antialiased fonts } void loop() { @@ -93,7 +93,7 @@ void loop() { tft.fillScreen(TFT_BLACK); - // Beware: Sprites are a differerent "class" to TFT, so different fonts can be loaded + // Beware: Sprites are a different "class" to TFT, so different fonts can be loaded // in the tft and sprite instances, so load the font in the class instance you use! // In this example this means the spr. instance. @@ -181,7 +181,7 @@ void button(int x, int y, int num ) #define IWIDTH 40 #define IHEIGHT 25 - // Create a 16 bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) + // Create a 16-bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) spr.setColorDepth(16); spr.createSprite(IWIDTH, IHEIGHT); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansMonoSCB20.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansMonoSCB20.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansMonoSCB20.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_3_Array/NotoSansMonoSCB20.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino index 225ae962..de2eab99 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Font_Demo_4_Array.ino @@ -58,7 +58,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show anti-aliased fonts + spr.setColorDepth(16); // 16-bit colour needed to show anti-aliased fonts } void loop() { diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Font_Demo_4_Array/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Final_Frontier_28.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Final_Frontier_28.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Final_Frontier_28.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Final_Frontier_28.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino index 16c53ce1..4af307f6 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Print_Smooth_Font/Print_Smooth_Font.ino @@ -8,7 +8,7 @@ sketch in the library Tools folder. The Processing sketch can convert TrueType fonts in *.ttf or *.otf files. - The library supports 16 bit unicode characters: + The library supports 16-bit Unicode characters: https://en.wikipedia.org/wiki/Unicode_font The characters supported are in the in the Basic Multilingual Plane: diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/Smooth_font_gradient.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/Smooth_font_gradient.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/Smooth_font_gradient.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_gradient/Smooth_font_gradient.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino index ec6cb732..669e9371 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino @@ -83,7 +83,7 @@ unsigned int colour = red << 11; // Colour order is RGB 5+6+5 bits each void rainbow_fill() { - // The colours and state are not initialised so the start colour changes each time the funtion is called + // The colours and state are not initialised so the start colour changes each time the function is called for (int i = 319; i >= 0; i--) { // Draw a vertical line 1 pixel wide in the selected colour diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Final_Frontier_28.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Final_Frontier_28.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Final_Frontier_28.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Final_Frontier_28.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Latin_Hiragana_24.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Latin_Hiragana_24.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Latin_Hiragana_24.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Latin_Hiragana_24.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_Test_72.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_Test_72.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_Test_72.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_Test_72.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino index a36c3689..9b523813 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/Unicode_test.ino @@ -8,14 +8,14 @@ The library expects strings to be in UTF-8 encoded format: https://www.fileformat.info/info/unicode/utf8.htm - Creating varaibles needs to be done with care when using character arrays: + Creating variables needs to be done with care when using character arrays: char c = 'µ'; // Wrong char bad[4] = "5µA"; // Wrong char good[] = "5µA"; // Good String okay = "5µA"; // Good This is because UTF-8 characters outside the basic Latin set occupy more than - 1 byte per character! A 16 bit Unicode character occupies 3 bytes! + 1 byte per character! A 16-bit Unicode character occupies 3 bytes! */ @@ -89,7 +89,7 @@ void loop() //---------------------------------------------------------------------------- // We can have any random mix of characters in the font - String test2 = "仝倀"; // Unicodes 0x4EDD, 0x5000 + String test2 = "仝倀"; // Unicode 0x4EDD, 0x5000 tft.loadFont(Unicode_Test_72); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Latin-Hiragana-24.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Latin-Hiragana-24.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Latin-Hiragana-24.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Latin-Hiragana-24.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Unicode-Test-72.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Unicode-Test-72.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Unicode-Test-72.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/FLASH_Array/Unicode_test/data/Unicode-Test-72.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/Font_Demo_1.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/Font_Demo_1.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/Font_Demo_1.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/Font_Demo_1.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_1/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/Font_Demo_2.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/Font_Demo_2.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/Font_Demo_2.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/Font_Demo_2.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_2/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino index 312e4a73..df8ac13e 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/Font_Demo_3.ino @@ -4,7 +4,7 @@ This sketch uses method 3, the font characters are first plotted in a Sprite, then the Sprite is pushed to the screen. This method is very flexible and the Sprite can be created, deleted, resized as needed. To render anti-aliased fonts well the Sprite - needs to be 16 bit. The fonts will render in 1 bit per pixel sprites but there + needs to be 16-bit. The fonts will render in 1 bit per pixel sprites but there will then be no anti-aliasing. Using 1 bit per pixel Sprites is however useful to use the extended Unicode range in fonts on mono displays like ePaper. @@ -51,7 +51,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show antialiased fonts + spr.setColorDepth(16); // 16-bit colour needed to show antialiased fonts if (!LittleFS.begin()) { Serial.println("Flash FS initialisation failed!"); @@ -200,7 +200,7 @@ void button(int x, int y, int num ) #define IWIDTH 40 #define IHEIGHT 25 - // Create a 16 bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) + // Create a 16-bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) spr.setColorDepth(16); spr.createSprite(IWIDTH, IHEIGHT); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino index eb4ce044..edc14865 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/Font_Demo_4.ino @@ -61,7 +61,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show anti-aliased fonts + spr.setColorDepth(16); // 16-bit colour needed to show anti-aliased fonts if (!LittleFS.begin()) { Serial.println("Flash FS initialisation failed!"); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Font_Demo_4/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino index 1b4f1c29..ff3807a2 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/Print_Smooth_Font.ino @@ -12,7 +12,7 @@ sketch in the library Tools folder. The Processing sketch can convert TrueType fonts in *.ttf or *.otf files. - The library supports 16 bit Unicode characters: + The library supports 16-bit Unicode characters: https://en.wikipedia.org/wiki/Unicode_font The characters supported are in the in the Basic Multilingual Plane: diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Print_Smooth_Font/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/Smooth_font_gradient.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/Smooth_font_gradient.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/Smooth_font_gradient.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/Smooth_font_gradient.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_gradient/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/LittleFS_functions.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/LittleFS_functions.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/LittleFS_functions.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/LittleFS_functions.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino index 530ae5b2..0f236531 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/Unicode_test.ino @@ -15,7 +15,7 @@ String okay = "5µA"; // Good This is because UTF-8 characters outside the basic Latin set occupy more than - 1 byte per character! A 16 bit Unicode character occupies 3 bytes! + 1 byte per character! A 16-bit Unicode character occupies 3 bytes! */ diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Latin-Hiragana-24.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Latin-Hiragana-24.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Latin-Hiragana-24.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Latin-Hiragana-24.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Unicode-Test-72.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Unicode-Test-72.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/LittleFS/Unicode_test/data/Unicode-Test-72.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/LittleFS/Unicode_test/data/Unicode-Test-72.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino index 8013a5c7..5f3b961f 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/ESP32_Smooth_Font_SD.ino @@ -10,7 +10,7 @@ Load the font file onto the root directory of the SD Card. The font files used by this sketch can be found in the Data folder, press Ctrl+K to see it. - The library supports 16 bit Unicode characters: + The library supports 16-bit Unicode characters: https://en.wikipedia.org/wiki/Unicode_font The characters supported are in the in the Basic Multilingual Plane: diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SD_Card/ESP32_Smooth_Font_SD/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Font_Demo_1.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Font_Demo_1.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Font_Demo_1.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Font_Demo_1.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_1/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Font_Demo_2.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Font_Demo_2.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Font_Demo_2.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Font_Demo_2.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_2/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino index 6cbaca22..6d18100a 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Font_Demo_3.ino @@ -4,7 +4,7 @@ This sketch uses method 3, the font characters are first plotted in a Sprite, then the Sprite is pushed to the screen. This method is very flexible and the Sprite can be created, deleted, resized as needed. To render anti-aliased fonts well the Sprite - needs to be 16 bit. The fonts will render in 1 bit per pixel sprites but there + needs to be 16-bit. The fonts will render in 1 bit per pixel sprites but there will then be no anti-aliasing. Using 1 bit per pixel Sprites is however useful to use the extended Unicode range in fonts on mono displays like ePaper. @@ -50,7 +50,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show anti aliased fonts + spr.setColorDepth(16); // 16-bit colour needed to show anti aliased fonts if (!SPIFFS.begin()) { Serial.println("SPIFFS initialisation failed!"); @@ -200,7 +200,7 @@ void button(int x, int y, int num ) #define IWIDTH 40 #define IHEIGHT 25 - // Create a 16 bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) + // Create a 16-bit sprite 40 pixels wide, 25 high (2000 bytes of RAM needed) spr.setColorDepth(16); spr.createSprite(IWIDTH, IHEIGHT); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_3/data/NotoSansMonoSCB20.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino index 8259723f..e86fa888 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Font_Demo_4.ino @@ -61,7 +61,7 @@ void setup(void) { tft.setRotation(1); - spr.setColorDepth(16); // 16 bit colour needed to show anti-aliased fonts + spr.setColorDepth(16); // 16-bit colour needed to show anti-aliased fonts if (!SPIFFS.begin()) { Serial.println("SPIFFS initialisation failed!"); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Notes.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Notes.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Notes.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/Notes.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Font_Demo_4/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino index d142d511..007da700 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/Print_Smooth_Font.ino @@ -15,7 +15,7 @@ Note: SPIFFS does not accept an underscore _ in filenames! - The library supports 16 bit Unicode characters: + The library supports 16-bit Unicode characters: https://en.wikipedia.org/wiki/Unicode_font The characters supported are in the in the Basic Multilingual Plane: diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Print_Smooth_Font/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/Smooth_font_gradient.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/Smooth_font_gradient.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/Smooth_font_gradient.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/Smooth_font_gradient.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_gradient/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/Smooth_font_reading_TFT.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold15.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Smooth_font_reading_TFT/data/NotoSansBold36.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/SPIFFS_functions.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/SPIFFS_functions.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/SPIFFS_functions.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/SPIFFS_functions.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino index 26567d6c..5f97248a 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/Unicode_test.ino @@ -15,7 +15,7 @@ String okay = "5µA"; // Good This is because UTF-8 characters outside the basic Latin set occupy more than - 1 byte per character! A 16 bit Unicode character occupies 3 bytes! + 1 byte per character! A 16-bit Unicode character occupies 3 bytes! */ diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Final-Frontier-28.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Final-Frontier-28.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Final-Frontier-28.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Final-Frontier-28.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Latin-Hiragana-24.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Latin-Hiragana-24.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Latin-Hiragana-24.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Latin-Hiragana-24.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Unicode-Test-72.vlw b/libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Unicode-Test-72.vlw similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Unicode-Test-72.vlw rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Fonts/SPIFFS/Unicode_test/data/Unicode-Test-72.vlw diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino index 1cdd4229..9cc6a1fe 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/Anti-aliased_Clock.ino @@ -74,7 +74,7 @@ void setup() { tft.fillScreen(TFT_BLACK); // Create the clock face sprite - //face.setColorDepth(8); // 8 bit will work, but reduces effectiveness of anti-aliasing + //face.setColorDepth(8); // 8-bit will work, but reduces effectiveness of anti-aliasing face.createSprite(FACE_W, FACE_H); // Only 1 font used in the sprite, so can remain loaded @@ -129,7 +129,7 @@ static void renderFace(float t) { face.setTextDatum(MC_DATUM); // The background colour will be read during the character rendering - face.setTextColor(CLOCK_FG); + face.setTextColor(CLOCK_FG, CLOCK_BG); // Text offset adjustment constexpr uint32_t dialOffset = CLOCK_R - 10; @@ -143,7 +143,7 @@ static void renderFace(float t) { } // Add text (could be digital time...) - face.setTextColor(LABEL_FG); + face.setTextColor(LABEL_FG, CLOCK_BG); face.drawString("TFT_eSPI", CLOCK_R, CLOCK_R * 0.75); // Draw minute hand diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h index 1a85e04e..faadede8 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/NTP_Time.h @@ -4,17 +4,17 @@ // Time library: // https://github.com/PaulStoffregen/Time -#include +#include // Time zone correction library: // https://github.com/JChristensen/Timezone #include // Choose library to load -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 // ESP8266 #include -#elif defined(ARDUINO_ARCH_MBED) || defined(ARDUINO_ARCH_RP2040) +#elif (defined(ARDUINO_ARCH_MBED) || defined(ARDUINO_ARCH_RP2040)) && !defined(ARDUINO_RASPBERRY_PI_PICO_W) // RP2040 Nano Connect #include #else @@ -31,16 +31,16 @@ WiFiUDP udp; // Settings //==================================================================================== -#define TIMEZONE UK // See below for other "Zone references", UK, usMT etc +#define TIMEZONE UK // See below for other "Zone references", UK, usMT etc. #ifdef ESP32 // Temporary fix, ESP8266 fails to communicate with some servers... -// Try to use pool url instead so the server IP address is looked up from those available +// Try to use pool URL instead so the server IP address is looked up from those available // (use a pool server in your own country to improve response time and reliability) //const char* ntpServerName = "time.nist.gov"; //const char* ntpServerName = "pool.ntp.org"; const char* ntpServerName = "time.google.com"; #else -// Try to use pool url instead so the server IP address is looked up from those available +// Try to use pool URL instead so the server IP address is looked up from those available // (use a pool server in your own country to improve response time and reliability) // const char* ntpServerName = "time.nist.gov"; const char* ntpServerName = "pool.ntp.org"; diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/NotoSansBold15.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/NotoSansBold15.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Anti-aliased_Clock/NotoSansBold15.h rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Anti-aliased_Clock/NotoSansBold15.h diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino new file mode 100644 index 00000000..1ce4cfb7 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/Arc_meter_demo.ino @@ -0,0 +1,208 @@ +// This is a test sketch being developed for a new arc based meter widget +// The meter graphic is fully anti-aliased to avoid jaggy pixelated edges + +// For this demo randomly sized meters are drawn, cycled and redrawn a random size. +// The meter is ramped up and down 0-100 and 100-0, then pauses before a new +// random sized meter is drawn + +// If the radius is > 25 then the value is drawn in the middle + +// The outer ring of the meter uses the drawSmoothCircle function (which draws +// a narrow full circle smooth arc) + +// Uncomment to draw meter digits and label text +//#define DRAW_DIGITS + +// If DRAW_DIGITS is defined the OpenFontRender library must be loaded since +// the sketch uses a scaleable TrueType font for the text and numerals. +// https://github.com/Bodmer/OpenFontRender + +#define LOOP_DELAY 0 // This controls how frequently the meter is updated + // for test purposes this is set to 0 + + +#include +#include // Hardware-specific library + +#ifdef DRAW_DIGITS + #include "NotoSans_Bold.h" + #include "OpenFontRender.h" + #define TTF_FONT NotoSans_Bold +#endif + + +TFT_eSPI tft = TFT_eSPI(); // Invoke custom library with default width and height +TFT_eSprite spr = TFT_eSprite(&tft); // Declare Sprite object "spr" with pointer to "tft" object + +#ifdef DRAW_DIGITS +OpenFontRender ofr; +#endif + +#define DARKER_GREY 0x18E3 + +uint32_t runTime = 0; // time for next update + +int reading = 0; // Value to be displayed +int d = 0; // Variable used for the sine wave test waveform +bool range_error = 0; +int8_t ramp = 1; + +bool initMeter = true; + +void setup(void) { + Serial.begin(115200); + tft.begin(); + tft.setRotation(1); + tft.fillScreen(TFT_NAVY); + //tft.setViewport(0, 0, 240, 320); +} + + +void loop() { + static uint16_t maxRadius = 0; + int8_t ramp = 1; + static uint8_t radius = 0; + static int16_t xpos = tft.width() / 2; + static int16_t ypos = tft.height() / 2; + bool newMeter = false; + + if (maxRadius == 0) { + maxRadius = tft.width(); + if (tft.height() < maxRadius) maxRadius = tft.height(); + maxRadius = (0.6 * maxRadius) / 2; + radius = maxRadius; + } + + // Choose a random meter radius for test purposes and draw for one range cycle + // Clear old meter first + tft.fillCircle(xpos, ypos, radius + 1, TFT_NAVY); + radius = random(20, maxRadius); // Random radius + initMeter = true; + +#ifdef DRAW_DIGITS + // Loading a font takes a few milliseconds, so for test purposes it is done outside the test loop + if (ofr.loadFont(TTF_FONT, sizeof(TTF_FONT))) { + Serial.println("Render initialize error"); + return; + } +#endif + + initMeter = true; + reading = 0; + ramp = 1; + while (!newMeter) { + if (millis() - runTime >= LOOP_DELAY) { + runTime = millis(); + + reading += ramp; + ringMeter(xpos, ypos, radius, reading, "Watts"); // Draw analogue meter + + if (reading > 99) ramp = -1; + if (reading <= 0) ramp = 1; + + if (reading > 99) delay(1000); + if (reading <= 0) { + delay(1000); + newMeter = true; + } + } + } + +#ifdef DRAW_DIGITS + ofr.unloadFont(); // Recover space used by font metrics etc. +#endif +} + +// ######################################################################### +// Draw the meter on the screen, returns x coord of right-hand side +// ######################################################################### +// x,y is centre of meter, r the radius, val a number in range 0-100 +// units is the meter scale label +void ringMeter(int x, int y, int r, int val, const char *units) +{ + static uint16_t last_angle = 30; + + if (initMeter) { + initMeter = false; + last_angle = 30; + tft.fillCircle(x, y, r, DARKER_GREY); + tft.drawSmoothCircle(x, y, r, TFT_SILVER, DARKER_GREY); + uint16_t tmp = r - 3; + tft.drawArc(x, y, tmp, tmp - tmp / 5, last_angle, 330, TFT_BLACK, DARKER_GREY); + } + + r -= 3; + + // Range here is 0-100 so value is scaled to an angle 30-330 + int val_angle = map(val, 0, 100, 30, 330); + + + if (last_angle != val_angle) { + // Could load the required font here + //if (ofr.loadFont(TTF_FONT, sizeof(TTF_FONT))) { + // Serial.println("Render initialize error"); + // return; + //} +#ifdef DRAW_DIGITS + ofr.setDrawer(spr); // Link renderer to sprite (font will be rendered in sprite spr) + + // Add value in centre if radius is a reasonable size + if ( r >= 25 ) { + // This code gets the font dimensions in pixels to determine the required the sprite size + ofr.setFontSize((6 * r) / 4); + ofr.setFontColor(TFT_WHITE, DARKER_GREY); + + + // The OpenFontRender library only has simple print functions... + // Digit jiggle for changing values often happens with proportional fonts because + // digit glyph width varies ( 1 narrower that 4 for example). This code prints up to + // 3 digits with even spacing. + // A few experimental fudge factors are used here to position the + // digits in the sprite... + // Create a sprite to draw the digits into + uint8_t w = ofr.getTextWidth("444"); + uint8_t h = ofr.getTextHeight("4") + 4; + spr.createSprite(w, h + 2); + spr.fillSprite(DARKER_GREY); // (TFT_BLUE); // (DARKER_GREY); + char str_buf[8]; // Buffed for string + itoa (val, str_buf, 10); // Convert value to string (null terminated) + uint8_t ptr = 0; // Pointer to a digit character + uint8_t dx = 4; // x offset for cursor position + if (val < 100) dx = ofr.getTextWidth("4") / 2; // Adjust cursor x for 2 digits + if (val < 10) dx = ofr.getTextWidth("4"); // Adjust cursor x for 1 digit + while ((uint8_t)str_buf[ptr] != 0) ptr++; // Count the characters + while (ptr) { + ofr.setCursor(w - dx - w / 20, -h / 2.5); // Offset cursor position in sprite + ofr.rprintf(str_buf + ptr - 1); // Draw a character + str_buf[ptr - 1] = 0; // Replace character with a null + dx += 1 + w / 3; // Adjust cursor for next character + ptr--; // Decrement character pointer + } + spr.pushSprite(x - w / 2, y - h / 2); // Push sprite containing the val number + spr.deleteSprite(); // Recover used memory + + // Make the TFT the print destination, print the units label direct to the TFT + ofr.setDrawer(tft); + ofr.setFontColor(TFT_GOLD, DARKER_GREY); + ofr.setFontSize(r / 2.0); + ofr.setCursor(x, y + (r * 0.4)); + ofr.cprintf("Watts"); + } +#endif + + //ofr.unloadFont(); // Recover space used by font metrics etc. + + // Allocate a value to the arc thickness dependant of radius + uint8_t thickness = r / 5; + if ( r < 25 ) thickness = r / 3; + + // Update the arc, only the zone between last_angle and new val_angle is updated + if (val_angle > last_angle) { + tft.drawArc(x, y, r, r - thickness, last_angle, val_angle, TFT_SKYBLUE, TFT_BLACK); // TFT_SKYBLUE random(0x10000) + } + else { + tft.drawArc(x, y, r, r - thickness, val_angle, last_angle, TFT_BLACK, DARKER_GREY); + } + last_angle = val_angle; // Store meter arc position for next redraw + } +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/NotoSans_Bold.h b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/NotoSans_Bold.h new file mode 100644 index 00000000..b05e99e9 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Arc_meter_demo/NotoSans_Bold.h @@ -0,0 +1,732 @@ +// This font is a subset of the full font to reduce array size, ONLY these characters are present: +// !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ + +// array size is 11592 + +const unsigned char NotoSans_Bold[] PROGMEM = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x80, 0x00, 0x03, 0x00, 0x30, 0x63, 0x6d, 0x61, 0x70, + 0xe1, 0x4c, 0xf1, 0x46, 0x00, 0x00, 0x00, 0xbc, 0x00, 0x00, 0x0b, 0x6e, 0x67, 0x6c, 0x79, 0x66, + 0xab, 0x85, 0x48, 0xd5, 0x00, 0x00, 0x0c, 0x2c, 0x00, 0x00, 0x1b, 0xa0, 0x68, 0x65, 0x61, 0x64, + 0x26, 0x95, 0xb4, 0xa1, 0x00, 0x00, 0x27, 0xcc, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61, + 0x03, 0x7f, 0x04, 0x08, 0x00, 0x00, 0x28, 0x04, 0x00, 0x00, 0x00, 0x24, 0x68, 0x6d, 0x74, 0x78, + 0xd0, 0xa7, 0x10, 0x76, 0x00, 0x00, 0x28, 0x28, 0x00, 0x00, 0x01, 0x7c, 0x6c, 0x6f, 0x63, 0x61, + 0x00, 0x05, 0x33, 0xed, 0x00, 0x00, 0x29, 0xa4, 0x00, 0x00, 0x01, 0x80, 0x6d, 0x61, 0x78, 0x70, + 0x07, 0x5d, 0x11, 0x1f, 0x00, 0x00, 0x2b, 0x24, 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, + 0x1a, 0x56, 0x03, 0x30, 0x00, 0x00, 0x2b, 0x44, 0x00, 0x00, 0x01, 0x7a, 0x4f, 0x53, 0x2f, 0x32, + 0x0f, 0x8e, 0x89, 0xf7, 0x00, 0x00, 0x2c, 0xc0, 0x00, 0x00, 0x00, 0x60, 0x70, 0x6f, 0x73, 0x74, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x20, 0x00, 0x00, 0x00, 0x20, 0x70, 0x72, 0x65, 0x70, + 0x68, 0x06, 0x8c, 0x85, 0x00, 0x00, 0x2d, 0x40, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xe2, + 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x07, 0xa8, 0x00, 0x04, 0x03, 0xc6, 0x00, 0x00, 0x00, 0xbe, + 0x00, 0x80, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, + 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, + 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, + 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, + 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, + 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, + 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, + 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, + 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, + 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, + 0x00, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, + 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, + 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, + 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, + 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, + 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, + 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, + 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, + 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, + 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, + 0x00, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, + 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, + 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, + 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, + 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, + 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, + 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, + 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, + 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, + 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, + 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, + 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x04, + 0x03, 0xc6, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x80, 0x00, 0x06, 0x00, 0x3e, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, + 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, + 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, + 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, + 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, + 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, + 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, + 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, + 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, + 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, + 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, + 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, + 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, + 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, + 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, + 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, + 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, + 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, + 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, + 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, + 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, + 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, + 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, + 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, + 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, + 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, + 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, + 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, + 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, + 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, + 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, + 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, + 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, + 0x00, 0x5e, 0x00, 0x00, 0x00, 0x04, 0x03, 0xc6, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x80, 0x00, 0x06, + 0x00, 0x3e, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, + 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, + 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, + 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, + 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, + 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, + 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, + 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, + 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, + 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, + 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x21, 0x00, 0x22, 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, + 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, + 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, + 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, + 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, + 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, + 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, + 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x5f, + 0x00, 0x60, 0x00, 0x61, 0x00, 0x62, 0x00, 0x63, 0x00, 0x64, 0x00, 0x65, 0x00, 0x66, 0x00, 0x67, + 0x00, 0x68, 0x00, 0x69, 0x00, 0x6a, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x6d, 0x00, 0x6e, 0x00, 0x6f, + 0x00, 0x70, 0x00, 0x71, 0x00, 0x72, 0x00, 0x73, 0x00, 0x74, 0x00, 0x75, 0x00, 0x76, 0x00, 0x77, + 0x00, 0x78, 0x00, 0x79, 0x00, 0x7a, 0x00, 0x7b, 0x00, 0x7c, 0x00, 0x7d, 0x00, 0x7e, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, + 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0xbe, 0x00, 0x01, 0x00, 0x02, + 0x00, 0x03, 0x00, 0x04, 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a, + 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10, 0x00, 0x11, 0x00, 0x12, + 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16, 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, + 0x00, 0x1b, 0x00, 0x1c, 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22, + 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28, 0x00, 0x29, 0x00, 0x2a, + 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e, 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, + 0x00, 0x33, 0x00, 0x34, 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a, + 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40, 0x00, 0x41, 0x00, 0x42, + 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46, 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, + 0x00, 0x4b, 0x00, 0x4c, 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52, + 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58, 0x00, 0x59, 0x00, 0x5a, + 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x58, 0x08, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x58, 0x00, 0x00, 0xfd, 0xad, 0x02, 0x4e, + 0x00, 0x00, 0xfd, 0xb2, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x05, 0x00, 0x00, + 0x07, 0xf6, 0x00, 0x00, 0x00, 0x02, 0x00, 0x39, 0xff, 0xf3, 0x00, 0xe4, 0x02, 0xca, 0x00, 0x03, + 0x00, 0x0f, 0x00, 0x00, 0x37, 0x23, 0x03, 0x33, 0x03, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0xcb, 0x77, 0x19, 0xa9, 0xab, 0x32, 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, + 0x32, 0xed, 0x01, 0xdd, 0xfd, 0x7c, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, 0x00, 0x02, 0x00, + 0x41, 0x01, 0xc8, 0x01, 0x97, 0x02, 0xca, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x03, 0x23, + 0x03, 0x21, 0x03, 0x23, 0x03, 0xc9, 0x14, 0x60, 0x14, 0x01, 0x56, 0x14, 0x60, 0x14, 0x02, 0xca, + 0xfe, 0xfe, 0x01, 0x02, 0xfe, 0xfe, 0x01, 0x02, 0x00, 0x02, 0x00, 0x16, 0x00, 0x00, 0x02, 0x70, + 0x02, 0xc9, 0x00, 0x1b, 0x00, 0x1f, 0x00, 0x00, 0x01, 0x07, 0x33, 0x15, 0x23, 0x07, 0x23, 0x37, + 0x23, 0x07, 0x23, 0x37, 0x23, 0x35, 0x33, 0x37, 0x23, 0x35, 0x33, 0x37, 0x33, 0x07, 0x33, 0x37, + 0x33, 0x07, 0x33, 0x15, 0x05, 0x33, 0x37, 0x23, 0x01, 0xe8, 0x17, 0x7e, 0x91, 0x26, 0x6b, 0x26, + 0x5f, 0x25, 0x69, 0x24, 0x74, 0x87, 0x17, 0x7b, 0x8d, 0x26, 0x6b, 0x26, 0x61, 0x26, 0x69, 0x26, + 0x75, 0xfe, 0x97, 0x60, 0x17, 0x60, 0x01, 0x9c, 0x71, 0x65, 0xc6, 0xc6, 0xc6, 0xc6, 0x65, 0x71, + 0x66, 0xc7, 0xc7, 0xc7, 0xc7, 0x66, 0x71, 0x71, 0x00, 0x03, 0x00, 0x2b, 0xff, 0xc6, 0x02, 0x15, + 0x02, 0xf7, 0x00, 0x22, 0x00, 0x28, 0x00, 0x2e, 0x00, 0x00, 0x37, 0x26, 0x26, 0x27, 0x35, 0x16, + 0x16, 0x17, 0x35, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x07, 0x26, + 0x26, 0x27, 0x15, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x07, 0x15, 0x23, 0x11, 0x06, 0x15, 0x14, 0x16, + 0x17, 0x13, 0x36, 0x35, 0x34, 0x26, 0x27, 0xfd, 0x41, 0x66, 0x2a, 0x29, 0x74, 0x34, 0x4d, 0x5d, + 0x28, 0x75, 0x5d, 0x43, 0x6f, 0x5b, 0x2e, 0x28, 0x51, 0x23, 0x36, 0x62, 0x3d, 0x6a, 0x6b, 0x43, + 0x3f, 0x1e, 0x21, 0x43, 0x42, 0x21, 0x21, 0x28, 0x02, 0x15, 0x13, 0x81, 0x14, 0x21, 0x03, 0x97, + 0x1e, 0x39, 0x46, 0x31, 0x4b, 0x59, 0x08, 0x4b, 0x49, 0x04, 0x29, 0x72, 0x11, 0x12, 0x03, 0x90, + 0x14, 0x2f, 0x48, 0x3b, 0x49, 0x62, 0x0a, 0x64, 0x02, 0x6d, 0x09, 0x2a, 0x15, 0x1c, 0x0f, 0xfe, + 0xde, 0x0c, 0x2e, 0x14, 0x1d, 0x0f, 0x00, 0x05, 0x00, 0x1f, 0xff, 0xf7, 0x03, 0x66, 0x02, 0xd4, + 0x00, 0x0b, 0x00, 0x0f, 0x00, 0x17, 0x00, 0x23, 0x00, 0x2b, 0x00, 0x00, 0x13, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x05, 0x01, 0x23, 0x01, 0x05, 0x22, 0x15, 0x14, + 0x33, 0x32, 0x35, 0x34, 0x05, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, + 0x17, 0x22, 0x15, 0x14, 0x33, 0x32, 0x35, 0x34, 0xc7, 0x54, 0x57, 0x52, 0x59, 0x52, 0x56, 0x50, + 0x02, 0x53, 0xfe, 0x74, 0x75, 0x01, 0x8c, 0xfe, 0x7b, 0x2e, 0x2e, 0x2f, 0x01, 0xc4, 0x54, 0x57, + 0x52, 0x59, 0x52, 0x56, 0x50, 0x59, 0x2e, 0x2e, 0x2f, 0x02, 0xd4, 0x75, 0x6a, 0x6a, 0x77, 0x77, + 0x6a, 0x6a, 0x75, 0x0a, 0xfd, 0x36, 0x02, 0xca, 0x5c, 0x7a, 0x7b, 0x7b, 0x7a, 0xb7, 0x75, 0x6a, + 0x6a, 0x77, 0x77, 0x6a, 0x6a, 0x75, 0x66, 0x7a, 0x7b, 0x7b, 0x7a, 0x00, 0x03, 0x00, 0x28, 0xff, + 0xf6, 0x02, 0xee, 0x02, 0xd4, 0x00, 0x21, 0x00, 0x2d, 0x00, 0x37, 0x00, 0x00, 0x01, 0x32, 0x16, + 0x16, 0x15, 0x14, 0x06, 0x07, 0x17, 0x36, 0x36, 0x37, 0x33, 0x06, 0x06, 0x07, 0x17, 0x23, 0x27, + 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x17, + 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, 0x34, 0x26, 0x03, 0x06, 0x06, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x37, 0x01, 0x36, 0x3a, 0x5a, 0x34, 0x52, 0x3d, 0x8b, 0x14, 0x1e, 0x0a, + 0x9b, 0x0f, 0x3a, 0x2d, 0x93, 0xb8, 0x38, 0x2b, 0x6a, 0x3e, 0x7a, 0x89, 0x46, 0x3d, 0x27, 0x1f, + 0x35, 0x5f, 0x3c, 0x19, 0x2d, 0x19, 0x15, 0x2a, 0x2d, 0x28, 0x4a, 0x1c, 0x21, 0x40, 0x30, 0x20, + 0x38, 0x17, 0x02, 0xd4, 0x24, 0x45, 0x32, 0x45, 0x5e, 0x23, 0x87, 0x22, 0x4b, 0x26, 0x38, 0x80, + 0x38, 0x8f, 0x37, 0x1e, 0x23, 0x70, 0x5b, 0x4c, 0x5b, 0x23, 0x2d, 0x4c, 0x2b, 0x33, 0x4a, 0x28, + 0x73, 0x19, 0x23, 0x19, 0x2e, 0x18, 0x17, 0x2e, 0x1e, 0x1e, 0x1a, 0xfe, 0xd1, 0x15, 0x2f, 0x1f, + 0x2b, 0x31, 0x10, 0x0e, 0x00, 0x01, 0x00, 0x41, 0x01, 0xc8, 0x00, 0xc9, 0x02, 0xca, 0x00, 0x03, + 0x00, 0x00, 0x13, 0x03, 0x23, 0x03, 0xc9, 0x14, 0x60, 0x14, 0x02, 0xca, 0xfe, 0xfe, 0x01, 0x02, + 0x00, 0x01, 0x00, 0x28, 0xff, 0x62, 0x01, 0x35, 0x02, 0xca, 0x00, 0x0d, 0x00, 0x00, 0x13, 0x34, + 0x36, 0x37, 0x33, 0x06, 0x06, 0x15, 0x14, 0x16, 0x17, 0x23, 0x26, 0x26, 0x28, 0x47, 0x4c, 0x7a, + 0x44, 0x47, 0x47, 0x43, 0x79, 0x4c, 0x47, 0x01, 0x12, 0x7a, 0xe3, 0x5b, 0x5e, 0xe2, 0x77, 0x74, + 0xe1, 0x5c, 0x58, 0xdf, 0x00, 0x01, 0x00, 0x1e, 0xff, 0x62, 0x01, 0x2b, 0x02, 0xca, 0x00, 0x0d, + 0x00, 0x00, 0x01, 0x14, 0x06, 0x07, 0x23, 0x36, 0x36, 0x35, 0x34, 0x26, 0x27, 0x33, 0x16, 0x16, + 0x01, 0x2b, 0x47, 0x4c, 0x79, 0x44, 0x46, 0x47, 0x44, 0x7a, 0x4c, 0x47, 0x01, 0x12, 0x79, 0xdf, + 0x58, 0x5c, 0xe1, 0x74, 0x77, 0xe2, 0x5e, 0x5b, 0xe3, 0x00, 0x01, 0x00, 0x1f, 0x01, 0x24, 0x02, + 0x02, 0x02, 0xf8, 0x00, 0x0e, 0x00, 0x00, 0x01, 0x07, 0x37, 0x17, 0x07, 0x17, 0x07, 0x27, 0x07, + 0x27, 0x37, 0x27, 0x37, 0x17, 0x27, 0x01, 0x50, 0x14, 0xb6, 0x10, 0xa6, 0x6d, 0x6f, 0x4c, 0x43, + 0x73, 0x6c, 0xa5, 0x13, 0xb2, 0x14, 0x02, 0xf8, 0xb4, 0x33, 0x7b, 0x0c, 0x91, 0x3b, 0x99, 0x98, + 0x3a, 0x91, 0x0d, 0x7a, 0x33, 0xb4, 0x00, 0x01, 0x00, 0x2b, 0x00, 0x6f, 0x02, 0x10, 0x02, 0x54, + 0x00, 0x0b, 0x00, 0x00, 0x01, 0x33, 0x15, 0x23, 0x15, 0x23, 0x35, 0x23, 0x35, 0x33, 0x35, 0x33, + 0x01, 0x53, 0xbd, 0xbd, 0x6b, 0xbd, 0xbd, 0x6b, 0x01, 0x96, 0x6b, 0xbc, 0xbc, 0x6b, 0xbe, 0x00, + 0x01, 0x00, 0x1f, 0xff, 0x7f, 0x00, 0xe0, 0x00, 0x74, 0x00, 0x08, 0x00, 0x00, 0x37, 0x06, 0x06, + 0x07, 0x23, 0x36, 0x36, 0x37, 0x33, 0xe0, 0x0d, 0x30, 0x19, 0x6b, 0x0e, 0x1c, 0x07, 0x89, 0x69, + 0x35, 0x7e, 0x37, 0x3b, 0x86, 0x34, 0x00, 0x01, 0x00, 0x1e, 0x00, 0xcf, 0x01, 0x24, 0x01, 0x49, + 0x00, 0x03, 0x00, 0x00, 0x37, 0x35, 0x21, 0x15, 0x1e, 0x01, 0x06, 0xcf, 0x7a, 0x7a, 0x00, 0x01, + 0x00, 0x39, 0xff, 0xf3, 0x00, 0xe4, 0x00, 0x99, 0x00, 0x0b, 0x00, 0x00, 0x37, 0x34, 0x36, 0x33, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x39, 0x32, 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, + 0x32, 0x46, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x01, + 0x98, 0x02, 0xca, 0x00, 0x03, 0x00, 0x00, 0x01, 0x01, 0x23, 0x01, 0x01, 0x98, 0xfe, 0xf6, 0x87, + 0x01, 0x0a, 0x02, 0xca, 0xfd, 0x36, 0x02, 0xca, 0x00, 0x02, 0x00, 0x24, 0xff, 0xf6, 0x02, 0x17, + 0x02, 0xd5, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x22, 0x06, 0x02, 0x17, 0x31, 0x6d, 0x5c, 0x81, 0x78, 0x30, 0x6e, 0x5b, 0x80, 0x7a, 0xfe, 0xa3, + 0x2a, 0x39, 0x38, 0x2c, 0x2c, 0x38, 0x39, 0x2a, 0x01, 0x65, 0x73, 0xa4, 0x58, 0xc3, 0xac, 0x74, + 0xa4, 0x58, 0xc2, 0xae, 0x7a, 0x7b, 0x7a, 0x7b, 0x7a, 0x7c, 0x7c, 0x00, 0x01, 0x00, 0x3b, 0x00, + 0x00, 0x01, 0x9d, 0x02, 0xca, 0x00, 0x0c, 0x00, 0x00, 0x21, 0x23, 0x11, 0x34, 0x36, 0x37, 0x06, + 0x06, 0x07, 0x07, 0x27, 0x37, 0x33, 0x01, 0x9d, 0x97, 0x03, 0x01, 0x05, 0x21, 0x0e, 0x52, 0x49, + 0xe6, 0x7c, 0x01, 0x9d, 0x1a, 0x54, 0x20, 0x06, 0x1f, 0x0c, 0x42, 0x5b, 0xb7, 0x00, 0x01, 0x00, + 0x26, 0x00, 0x00, 0x02, 0x1b, 0x02, 0xd4, 0x00, 0x1d, 0x00, 0x00, 0x21, 0x21, 0x35, 0x37, 0x3e, + 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x16, 0x15, + 0x14, 0x06, 0x06, 0x07, 0x07, 0x15, 0x21, 0x02, 0x1b, 0xfe, 0x0d, 0xb3, 0x36, 0x42, 0x1e, 0x2f, + 0x28, 0x29, 0x4e, 0x2b, 0x52, 0x1f, 0x45, 0x5b, 0x40, 0x46, 0x65, 0x37, 0x2f, 0x59, 0x3f, 0x5c, + 0x01, 0x37, 0x69, 0xb5, 0x38, 0x4b, 0x3d, 0x23, 0x2b, 0x2a, 0x26, 0x23, 0x61, 0x1b, 0x2e, 0x1d, + 0x33, 0x57, 0x37, 0x3b, 0x62, 0x60, 0x3a, 0x56, 0x07, 0x00, 0x01, 0x00, 0x26, 0xff, 0xf6, 0x02, + 0x14, 0x02, 0xd4, 0x00, 0x2b, 0x00, 0x00, 0x01, 0x14, 0x06, 0x07, 0x15, 0x16, 0x16, 0x15, 0x14, + 0x06, 0x06, 0x23, 0x22, 0x27, 0x35, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x26, 0x23, + 0x23, 0x35, 0x33, 0x32, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, + 0x33, 0x32, 0x16, 0x01, 0xff, 0x59, 0x41, 0x56, 0x59, 0x3d, 0x7f, 0x64, 0x74, 0x5a, 0x2e, 0x65, + 0x2b, 0x51, 0x41, 0x1e, 0x4b, 0x43, 0x36, 0x37, 0x42, 0x45, 0x19, 0x2f, 0x37, 0x33, 0x4b, 0x1a, + 0x46, 0x2a, 0x71, 0x4e, 0x6e, 0x81, 0x02, 0x2a, 0x4a, 0x58, 0x10, 0x03, 0x0a, 0x54, 0x47, 0x3e, + 0x63, 0x39, 0x27, 0x80, 0x17, 0x18, 0x38, 0x33, 0x1e, 0x29, 0x15, 0x74, 0x19, 0x2b, 0x1c, 0x26, + 0x2b, 0x23, 0x11, 0x68, 0x1e, 0x28, 0x59, 0x00, 0x02, 0x00, 0x11, 0x00, 0x00, 0x02, 0x2b, 0x02, + 0xca, 0x00, 0x0a, 0x00, 0x15, 0x00, 0x00, 0x25, 0x23, 0x15, 0x23, 0x35, 0x21, 0x35, 0x01, 0x33, + 0x11, 0x33, 0x27, 0x34, 0x36, 0x36, 0x37, 0x23, 0x06, 0x06, 0x07, 0x07, 0x33, 0x02, 0x2b, 0x56, + 0x93, 0xfe, 0xcf, 0x01, 0x39, 0x8b, 0x56, 0xe9, 0x02, 0x03, 0x01, 0x04, 0x09, 0x14, 0x0e, 0x83, + 0xac, 0x94, 0x94, 0x94, 0x69, 0x01, 0xcd, 0xfe, 0x3f, 0x79, 0x17, 0x42, 0x39, 0x09, 0x14, 0x26, + 0x14, 0xc6, 0x00, 0x01, 0x00, 0x31, 0xff, 0xf6, 0x02, 0x0e, 0x02, 0xca, 0x00, 0x1e, 0x00, 0x00, + 0x01, 0x32, 0x16, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x16, 0x33, 0x32, + 0x36, 0x35, 0x34, 0x23, 0x22, 0x06, 0x07, 0x27, 0x13, 0x21, 0x15, 0x23, 0x07, 0x36, 0x36, 0x01, + 0x2c, 0x41, 0x66, 0x3b, 0x90, 0x8d, 0x38, 0x63, 0x25, 0x25, 0x68, 0x2e, 0x43, 0x47, 0x8f, 0x1c, + 0x3c, 0x14, 0x3c, 0x1b, 0x01, 0x83, 0xff, 0x0d, 0x11, 0x27, 0x01, 0xc8, 0x32, 0x60, 0x47, 0x74, + 0x85, 0x14, 0x13, 0x82, 0x13, 0x1b, 0x37, 0x3a, 0x6c, 0x0b, 0x05, 0x20, 0x01, 0x6c, 0x80, 0x8c, + 0x03, 0x07, 0x00, 0x02, 0x00, 0x23, 0xff, 0xf6, 0x02, 0x1b, 0x02, 0xd2, 0x00, 0x1e, 0x00, 0x2c, + 0x00, 0x00, 0x13, 0x34, 0x3e, 0x03, 0x33, 0x32, 0x16, 0x17, 0x15, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x06, 0x07, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x26, 0x05, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x06, 0x15, 0x14, 0x16, 0x16, 0x23, 0x12, 0x2d, + 0x51, 0x7d, 0x59, 0x15, 0x38, 0x13, 0x13, 0x2d, 0x16, 0x59, 0x61, 0x28, 0x03, 0x06, 0x14, 0x4b, + 0x3c, 0x5e, 0x6e, 0x83, 0x70, 0x49, 0x76, 0x46, 0x01, 0x02, 0x2c, 0x38, 0x30, 0x31, 0x21, 0x32, + 0x1c, 0x18, 0x31, 0x01, 0x2f, 0x3e, 0x78, 0x6b, 0x53, 0x2f, 0x03, 0x04, 0x79, 0x05, 0x05, 0x38, + 0x65, 0x42, 0x23, 0x30, 0x76, 0x6c, 0x74, 0x84, 0x43, 0x8b, 0x55, 0x3d, 0x40, 0x34, 0x3c, 0x1d, + 0x2e, 0x18, 0x21, 0x3f, 0x2a, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x02, 0x1b, 0x02, 0xca, 0x00, + 0x06, 0x00, 0x00, 0x33, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x6f, 0x01, 0x0c, 0xfe, 0xa0, 0x02, + 0x00, 0xfe, 0xf2, 0x02, 0x4b, 0x7f, 0x5f, 0xfd, 0x95, 0x00, 0x03, 0x00, 0x23, 0xff, 0xf6, 0x02, + 0x18, 0x02, 0xd3, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x35, 0x00, 0x00, 0x01, 0x32, 0x16, 0x16, 0x15, + 0x14, 0x06, 0x07, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, + 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x17, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x36, 0x36, 0x35, + 0x34, 0x26, 0x03, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x26, 0x27, 0x27, 0x06, 0x06, + 0x01, 0x1e, 0x3e, 0x67, 0x3f, 0x49, 0x37, 0x26, 0x45, 0x2b, 0x3f, 0x71, 0x4a, 0x78, 0x83, 0x50, + 0x39, 0x30, 0x43, 0x40, 0x69, 0x3b, 0x25, 0x31, 0x34, 0x23, 0x22, 0x34, 0x31, 0x94, 0x37, 0x36, + 0x38, 0x38, 0x20, 0x2f, 0x19, 0x0d, 0x2e, 0x3a, 0x02, 0xd3, 0x26, 0x4c, 0x3a, 0x40, 0x53, 0x1b, + 0x14, 0x35, 0x47, 0x30, 0x3b, 0x58, 0x30, 0x66, 0x59, 0x4a, 0x5a, 0x1c, 0x1e, 0x55, 0x40, 0x39, + 0x4c, 0x26, 0x6e, 0x26, 0x23, 0x25, 0x2e, 0x11, 0x10, 0x2d, 0x27, 0x23, 0x26, 0xfe, 0x59, 0x27, + 0x32, 0x30, 0x28, 0x1b, 0x29, 0x21, 0x0e, 0x07, 0x16, 0x3a, 0x00, 0x02, 0x00, 0x20, 0xff, 0xf6, + 0x02, 0x18, 0x02, 0xd2, 0x00, 0x1e, 0x00, 0x2c, 0x00, 0x00, 0x01, 0x14, 0x0e, 0x03, 0x23, 0x22, + 0x26, 0x27, 0x35, 0x16, 0x16, 0x33, 0x32, 0x36, 0x36, 0x37, 0x23, 0x06, 0x06, 0x23, 0x22, 0x26, + 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x25, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, + 0x36, 0x35, 0x34, 0x26, 0x26, 0x02, 0x18, 0x12, 0x2d, 0x51, 0x7d, 0x59, 0x15, 0x38, 0x13, 0x14, + 0x2c, 0x16, 0x59, 0x61, 0x28, 0x03, 0x06, 0x15, 0x45, 0x44, 0x5b, 0x6e, 0x83, 0x70, 0x49, 0x76, + 0x46, 0xfe, 0xfe, 0x2c, 0x38, 0x30, 0x31, 0x22, 0x31, 0x1c, 0x18, 0x30, 0x01, 0x99, 0x3d, 0x79, + 0x6b, 0x53, 0x2f, 0x03, 0x04, 0x79, 0x04, 0x06, 0x39, 0x64, 0x42, 0x23, 0x30, 0x76, 0x6c, 0x74, + 0x84, 0x43, 0x8b, 0x55, 0x3c, 0x41, 0x34, 0x3c, 0x1e, 0x2d, 0x18, 0x21, 0x40, 0x29, 0x00, 0x02, + 0x00, 0x39, 0xff, 0xf3, 0x00, 0xe4, 0x02, 0x2c, 0x00, 0x0b, 0x00, 0x17, 0x00, 0x00, 0x13, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x11, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x39, 0x32, 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, 0x32, 0x32, + 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, 0x32, 0x01, 0xd9, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, + 0xfe, 0x99, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, 0x00, 0x02, 0x00, 0x1f, 0xff, 0x7f, 0x00, + 0xe4, 0x02, 0x2c, 0x00, 0x0b, 0x00, 0x14, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, + 0x14, 0x06, 0x23, 0x22, 0x26, 0x13, 0x06, 0x06, 0x07, 0x23, 0x36, 0x36, 0x37, 0x33, 0x39, 0x32, + 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, 0x32, 0xa7, 0x0d, 0x30, 0x19, 0x6b, 0x0e, 0x1c, 0x07, 0x89, + 0x01, 0xd9, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, 0xfe, 0xbc, 0x35, 0x7e, 0x37, 0x3b, 0x86, + 0x34, 0x00, 0x01, 0x00, 0x2b, 0x00, 0x63, 0x02, 0x10, 0x02, 0x71, 0x00, 0x06, 0x00, 0x00, 0x25, + 0x25, 0x35, 0x25, 0x15, 0x05, 0x05, 0x02, 0x10, 0xfe, 0x1b, 0x01, 0xe5, 0xfe, 0xb2, 0x01, 0x4e, + 0x63, 0xd6, 0x46, 0xf2, 0x75, 0x9b, 0x89, 0x00, 0x02, 0x00, 0x2b, 0x00, 0xcc, 0x02, 0x10, 0x01, + 0xf4, 0x00, 0x03, 0x00, 0x07, 0x00, 0x00, 0x13, 0x35, 0x21, 0x15, 0x05, 0x35, 0x21, 0x15, 0x2b, + 0x01, 0xe5, 0xfe, 0x1b, 0x01, 0xe5, 0x01, 0x8a, 0x6a, 0x6a, 0xbe, 0x6b, 0x6b, 0x00, 0x01, 0x00, + 0x2b, 0x00, 0x63, 0x02, 0x10, 0x02, 0x71, 0x00, 0x06, 0x00, 0x00, 0x37, 0x25, 0x25, 0x35, 0x05, + 0x15, 0x05, 0x2b, 0x01, 0x4e, 0xfe, 0xb2, 0x01, 0xe5, 0xfe, 0x1b, 0xd8, 0x89, 0x9b, 0x75, 0xf2, + 0x46, 0xd6, 0x00, 0x02, 0x00, 0x03, 0xff, 0xf3, 0x01, 0xc5, 0x02, 0xd4, 0x00, 0x1d, 0x00, 0x29, + 0x00, 0x00, 0x13, 0x34, 0x36, 0x37, 0x36, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, + 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x06, 0x07, 0x0e, 0x02, 0x15, 0x15, 0x23, 0x07, + 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x87, 0x2a, 0x33, 0x2d, 0x27, + 0x2f, 0x2a, 0x2a, 0x52, 0x2b, 0x35, 0x31, 0x72, 0x44, 0x68, 0x73, 0x1a, 0x34, 0x27, 0x1d, 0x20, + 0x0b, 0x81, 0x10, 0x32, 0x24, 0x23, 0x32, 0x32, 0x23, 0x24, 0x32, 0x01, 0x11, 0x32, 0x44, 0x25, + 0x20, 0x2f, 0x20, 0x20, 0x21, 0x1a, 0x16, 0x6b, 0x1b, 0x22, 0x64, 0x4d, 0x29, 0x3c, 0x33, 0x1d, + 0x15, 0x1e, 0x1c, 0x15, 0x1d, 0xa7, 0x2e, 0x25, 0x25, 0x2e, 0x2c, 0x27, 0x27, 0x00, 0x02, 0x00, + 0x32, 0xff, 0xac, 0x03, 0x4f, 0x02, 0xca, 0x00, 0x3f, 0x00, 0x4d, 0x00, 0x00, 0x01, 0x14, 0x0e, + 0x02, 0x23, 0x22, 0x26, 0x27, 0x23, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x06, 0x14, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x36, 0x35, 0x34, 0x26, + 0x26, 0x23, 0x22, 0x06, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x06, 0x23, + 0x22, 0x26, 0x26, 0x35, 0x34, 0x3e, 0x02, 0x33, 0x32, 0x16, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x37, 0x26, 0x26, 0x23, 0x22, 0x06, 0x06, 0x03, 0x4f, 0x16, 0x2d, 0x44, 0x2e, 0x25, + 0x38, 0x0b, 0x08, 0x14, 0x43, 0x2f, 0x59, 0x61, 0x3a, 0x6a, 0x48, 0x2f, 0x65, 0x1c, 0x0a, 0x01, + 0x17, 0x0e, 0x17, 0x1e, 0x0f, 0x44, 0x75, 0x4b, 0x69, 0x8f, 0x4a, 0x91, 0x88, 0x3a, 0x7e, 0x34, + 0x30, 0x76, 0x42, 0x7c, 0xb0, 0x5d, 0x3c, 0x71, 0x9e, 0x62, 0x6b, 0xa6, 0x5f, 0xfe, 0x0c, 0x2e, + 0x26, 0x32, 0x29, 0x04, 0x06, 0x0b, 0x1c, 0x11, 0x2f, 0x39, 0x19, 0x01, 0x66, 0x2e, 0x5a, 0x4a, + 0x2b, 0x23, 0x1c, 0x19, 0x26, 0x6b, 0x57, 0x43, 0x67, 0x3b, 0x11, 0x0a, 0xcd, 0x0a, 0x15, 0x03, + 0x29, 0x1b, 0x2d, 0x4b, 0x2d, 0x54, 0x75, 0x3e, 0x57, 0x96, 0x61, 0x87, 0x90, 0x1a, 0x13, 0x5e, + 0x14, 0x18, 0x58, 0xa5, 0x74, 0x5b, 0x9c, 0x75, 0x41, 0x56, 0xa0, 0xab, 0x37, 0x30, 0x49, 0x3b, + 0x6c, 0x02, 0x03, 0x29, 0x41, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x02, 0xb2, 0x02, 0xcd, 0x00, + 0x07, 0x00, 0x12, 0x00, 0x00, 0x21, 0x27, 0x21, 0x07, 0x23, 0x13, 0x33, 0x13, 0x01, 0x2e, 0x02, + 0x27, 0x0e, 0x02, 0x07, 0x07, 0x33, 0x02, 0x0f, 0x34, 0xfe, 0xfc, 0x34, 0xa3, 0xfc, 0xb9, 0xfd, + 0xfe, 0xd1, 0x05, 0x10, 0x10, 0x05, 0x05, 0x11, 0x0f, 0x04, 0x33, 0xba, 0xaa, 0xaa, 0x02, 0xcd, + 0xfd, 0x33, 0x01, 0xcf, 0x11, 0x34, 0x36, 0x14, 0x14, 0x3b, 0x35, 0x0b, 0xa6, 0x00, 0x03, 0x00, + 0x5a, 0x00, 0x00, 0x02, 0x6b, 0x02, 0xca, 0x00, 0x10, 0x00, 0x19, 0x00, 0x22, 0x00, 0x00, 0x01, + 0x32, 0x16, 0x15, 0x14, 0x06, 0x07, 0x15, 0x1e, 0x02, 0x15, 0x14, 0x06, 0x23, 0x21, 0x11, 0x13, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x23, 0x1d, 0x02, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, + 0x01, 0x38, 0x8f, 0x92, 0x39, 0x35, 0x24, 0x3a, 0x22, 0x8c, 0x7a, 0xfe, 0xf5, 0xef, 0x42, 0x33, + 0x3c, 0x41, 0x50, 0x63, 0x44, 0x36, 0x37, 0x48, 0x02, 0xca, 0x50, 0x65, 0x3d, 0x54, 0x09, 0x05, + 0x07, 0x24, 0x44, 0x38, 0x61, 0x6e, 0x02, 0xca, 0xfe, 0xe5, 0x2a, 0x28, 0x29, 0x24, 0x9f, 0x78, + 0xba, 0x35, 0x2c, 0x28, 0x31, 0x00, 0x01, 0x00, 0x3a, 0xff, 0xf6, 0x02, 0x5a, 0x02, 0xd4, 0x00, + 0x1b, 0x00, 0x00, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, 0x06, 0x06, + 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x01, + 0x89, 0x57, 0x5c, 0x55, 0x5e, 0x2c, 0x57, 0x33, 0x2f, 0x5c, 0x39, 0x6e, 0x8f, 0x44, 0x4e, 0x95, + 0x6c, 0x35, 0x6b, 0x31, 0x31, 0x28, 0x51, 0x02, 0x56, 0x82, 0x71, 0x72, 0x7d, 0x14, 0x12, 0x7f, + 0x13, 0x12, 0x5b, 0xa5, 0x6e, 0x6c, 0xa6, 0x5e, 0x1b, 0x17, 0x7b, 0x13, 0x1c, 0x00, 0x02, 0x00, + 0x5a, 0x00, 0x00, 0x02, 0xaa, 0x02, 0xca, 0x00, 0x09, 0x00, 0x11, 0x00, 0x00, 0x01, 0x14, 0x06, + 0x23, 0x23, 0x11, 0x33, 0x32, 0x16, 0x16, 0x07, 0x34, 0x26, 0x23, 0x23, 0x11, 0x33, 0x32, 0x02, + 0xaa, 0xcd, 0xb9, 0xca, 0xe0, 0x70, 0xa5, 0x5b, 0x9d, 0x68, 0x63, 0x51, 0x41, 0xdb, 0x01, 0x6c, + 0xb5, 0xb7, 0x02, 0xca, 0x50, 0x9b, 0x77, 0x77, 0x6f, 0xfe, 0x2f, 0x00, 0x01, 0x00, 0x5a, 0x00, + 0x00, 0x01, 0xf5, 0x02, 0xca, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x21, 0x11, 0x21, 0x15, 0x21, 0x15, + 0x33, 0x15, 0x23, 0x15, 0x21, 0x01, 0xf5, 0xfe, 0x65, 0x01, 0x9b, 0xfe, 0xfc, 0xf2, 0xf2, 0x01, + 0x04, 0x02, 0xca, 0x7c, 0x9d, 0x7c, 0xb8, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x01, 0xf3, 0x02, + 0xca, 0x00, 0x09, 0x00, 0x00, 0x33, 0x23, 0x11, 0x21, 0x15, 0x21, 0x15, 0x33, 0x15, 0x23, 0xef, + 0x95, 0x01, 0x99, 0xfe, 0xfc, 0xf2, 0xf2, 0x02, 0xca, 0x7c, 0xb8, 0x7c, 0x00, 0x01, 0x00, 0x3a, + 0xff, 0xf6, 0x02, 0x84, 0x02, 0xd4, 0x00, 0x20, 0x00, 0x00, 0x01, 0x21, 0x11, 0x06, 0x06, 0x23, + 0x22, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, + 0x06, 0x15, 0x14, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x35, 0x23, 0x01, 0x69, 0x01, 0x1b, 0x38, + 0x79, 0x4d, 0xa0, 0xac, 0x57, 0xa6, 0x78, 0x39, 0x6e, 0x2d, 0x32, 0x21, 0x54, 0x2e, 0x42, 0x61, + 0x35, 0x26, 0x52, 0x42, 0x20, 0x2d, 0x13, 0x87, 0x01, 0x91, 0xfe, 0x8e, 0x13, 0x16, 0xbc, 0xb4, + 0x70, 0xa4, 0x5a, 0x18, 0x14, 0x79, 0x11, 0x16, 0x3c, 0x6d, 0x4a, 0x46, 0x6c, 0x3d, 0x06, 0x04, + 0x95, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x02, 0xa3, 0x02, 0xca, 0x00, 0x0b, 0x00, 0x00, 0x21, + 0x23, 0x11, 0x21, 0x11, 0x23, 0x11, 0x33, 0x11, 0x21, 0x11, 0x33, 0x02, 0xa3, 0x97, 0xfe, 0xe5, + 0x97, 0x97, 0x01, 0x1b, 0x97, 0x01, 0x34, 0xfe, 0xcc, 0x02, 0xca, 0xfe, 0xe8, 0x01, 0x18, 0x00, + 0x01, 0x00, 0x20, 0x00, 0x00, 0x01, 0x65, 0x02, 0xca, 0x00, 0x0b, 0x00, 0x00, 0x21, 0x21, 0x35, + 0x37, 0x11, 0x27, 0x35, 0x21, 0x15, 0x07, 0x11, 0x17, 0x01, 0x65, 0xfe, 0xbb, 0x57, 0x57, 0x01, + 0x45, 0x57, 0x57, 0x56, 0x28, 0x01, 0xce, 0x28, 0x56, 0x56, 0x28, 0xfe, 0x32, 0x28, 0x00, 0x01, + 0xff, 0xb6, 0xff, 0x2e, 0x00, 0xf1, 0x02, 0xca, 0x00, 0x11, 0x00, 0x00, 0x17, 0x22, 0x26, 0x27, + 0x35, 0x16, 0x16, 0x33, 0x32, 0x36, 0x36, 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x06, 0x0f, 0x1d, + 0x2c, 0x10, 0x10, 0x23, 0x14, 0x1a, 0x2b, 0x18, 0x97, 0x39, 0x66, 0xd2, 0x07, 0x04, 0x7e, 0x04, + 0x06, 0x14, 0x38, 0x34, 0x02, 0x9d, 0xfd, 0x64, 0x5c, 0x71, 0x33, 0x00, 0x01, 0x00, 0x5a, 0x00, + 0x00, 0x02, 0x98, 0x02, 0xca, 0x00, 0x0e, 0x00, 0x00, 0x21, 0x23, 0x03, 0x07, 0x15, 0x23, 0x11, + 0x33, 0x11, 0x36, 0x36, 0x37, 0x37, 0x33, 0x03, 0x02, 0x98, 0xac, 0xbb, 0x40, 0x97, 0x97, 0x0f, + 0x1e, 0x0f, 0xc1, 0xa8, 0xf9, 0x01, 0x2d, 0x2e, 0xff, 0x02, 0xca, 0xfe, 0xb9, 0x15, 0x2a, 0x15, + 0xf3, 0xfe, 0xc4, 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x02, 0x13, 0x02, 0xca, 0x00, 0x05, 0x00, + 0x00, 0x33, 0x11, 0x33, 0x11, 0x21, 0x15, 0x5a, 0x97, 0x01, 0x22, 0x02, 0xca, 0xfd, 0xb3, 0x7d, + 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x03, 0x55, 0x02, 0xca, 0x00, 0x17, 0x00, 0x00, 0x21, 0x03, + 0x23, 0x1e, 0x02, 0x15, 0x11, 0x23, 0x11, 0x33, 0x13, 0x33, 0x13, 0x33, 0x11, 0x23, 0x11, 0x34, + 0x36, 0x36, 0x37, 0x23, 0x03, 0x01, 0x88, 0xac, 0x04, 0x01, 0x04, 0x04, 0x87, 0xce, 0xa9, 0x03, + 0xb3, 0xce, 0x8d, 0x03, 0x03, 0x01, 0x04, 0xb8, 0x02, 0x30, 0x14, 0x50, 0x5b, 0x25, 0xfe, 0xb4, + 0x02, 0xca, 0xfd, 0xde, 0x02, 0x22, 0xfd, 0x36, 0x01, 0x52, 0x22, 0x58, 0x4f, 0x14, 0xfd, 0xd1, + 0x00, 0x01, 0x00, 0x5a, 0x00, 0x00, 0x02, 0xd3, 0x02, 0xca, 0x00, 0x11, 0x00, 0x00, 0x21, 0x23, + 0x01, 0x23, 0x16, 0x16, 0x17, 0x11, 0x23, 0x11, 0x33, 0x01, 0x33, 0x26, 0x26, 0x27, 0x11, 0x33, + 0x02, 0xd3, 0xc0, 0xfe, 0xc9, 0x04, 0x02, 0x05, 0x02, 0x87, 0xbf, 0x01, 0x36, 0x03, 0x01, 0x04, + 0x02, 0x88, 0x02, 0x1c, 0x33, 0x66, 0x33, 0xfe, 0xb0, 0x02, 0xca, 0xfd, 0xe9, 0x32, 0x62, 0x31, + 0x01, 0x52, 0x00, 0x02, 0x00, 0x3a, 0xff, 0xf6, 0x02, 0xe2, 0x02, 0xd5, 0x00, 0x0f, 0x00, 0x1b, + 0x00, 0x00, 0x01, 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0xe2, + 0x49, 0x96, 0x75, 0x74, 0x97, 0x49, 0x49, 0x97, 0x75, 0x74, 0x96, 0x49, 0xfd, 0xf7, 0x56, 0x5f, + 0x61, 0x54, 0x54, 0x60, 0x60, 0x56, 0x01, 0x66, 0x6f, 0xa5, 0x5c, 0x5c, 0xa6, 0x6f, 0x6f, 0xa4, + 0x5b, 0x5b, 0xa5, 0x6f, 0x70, 0x81, 0x81, 0x70, 0x71, 0x80, 0x80, 0x00, 0x02, 0x00, 0x5a, 0x00, + 0x00, 0x02, 0x47, 0x02, 0xca, 0x00, 0x0b, 0x00, 0x13, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x06, 0x23, 0x23, 0x15, 0x23, 0x11, 0x17, 0x23, 0x15, 0x33, 0x32, 0x36, 0x35, 0x34, 0x01, + 0x3e, 0x8a, 0x7f, 0x34, 0x79, 0x68, 0x41, 0x97, 0xdc, 0x45, 0x32, 0x40, 0x4b, 0x02, 0xca, 0x77, + 0x68, 0x3e, 0x6d, 0x42, 0xfe, 0x02, 0xca, 0x7c, 0xd4, 0x33, 0x39, 0x68, 0x00, 0x02, 0x00, 0x3a, + 0xff, 0x56, 0x02, 0xe2, 0x02, 0xd5, 0x00, 0x12, 0x00, 0x1e, 0x00, 0x00, 0x01, 0x14, 0x06, 0x07, + 0x17, 0x23, 0x27, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x33, 0x32, 0x16, 0x16, 0x05, + 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x02, 0xe2, 0x56, 0x5a, 0xac, + 0xc2, 0x83, 0x0b, 0x74, 0x97, 0x49, 0x49, 0x97, 0x75, 0x74, 0x96, 0x49, 0xfd, 0xf7, 0x56, 0x5f, + 0x61, 0x54, 0x54, 0x60, 0x60, 0x56, 0x01, 0x66, 0x78, 0xaf, 0x29, 0xc0, 0xa0, 0x5c, 0xa6, 0x6f, + 0x6f, 0xa4, 0x5b, 0x5b, 0xa5, 0x6f, 0x70, 0x81, 0x81, 0x70, 0x71, 0x80, 0x80, 0x00, 0x02, 0x00, + 0x5a, 0x00, 0x00, 0x02, 0x94, 0x02, 0xca, 0x00, 0x0e, 0x00, 0x17, 0x00, 0x00, 0x01, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x06, 0x07, 0x13, 0x23, 0x03, 0x23, 0x11, 0x23, 0x11, 0x17, 0x23, 0x15, 0x33, + 0x32, 0x36, 0x35, 0x34, 0x26, 0x01, 0x2a, 0x92, 0x8b, 0x25, 0x3d, 0x23, 0xd2, 0xa8, 0xaa, 0x51, + 0x97, 0xc5, 0x2e, 0x31, 0x4b, 0x41, 0x45, 0x02, 0xca, 0x6a, 0x6c, 0x31, 0x49, 0x33, 0x10, 0xfe, + 0xc9, 0x01, 0x12, 0xfe, 0xee, 0x02, 0xca, 0x7c, 0xc1, 0x32, 0x31, 0x33, 0x2b, 0x00, 0x01, 0x00, + 0x2e, 0xff, 0xf6, 0x01, 0xff, 0x02, 0xd4, 0x00, 0x28, 0x00, 0x00, 0x25, 0x14, 0x06, 0x23, 0x22, + 0x27, 0x35, 0x16, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x26, 0x27, 0x2e, 0x03, 0x35, 0x34, + 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, 0x16, 0x17, 0x1e, + 0x02, 0x01, 0xff, 0x89, 0x7e, 0x71, 0x59, 0x33, 0x6d, 0x36, 0x38, 0x2f, 0x25, 0x3e, 0x28, 0x19, + 0x3a, 0x35, 0x22, 0x82, 0x70, 0x38, 0x65, 0x37, 0x31, 0x31, 0x4e, 0x29, 0x2b, 0x2e, 0x44, 0x43, + 0x37, 0x4d, 0x2a, 0xc6, 0x5f, 0x71, 0x2b, 0x8d, 0x16, 0x25, 0x2b, 0x21, 0x1b, 0x26, 0x21, 0x13, + 0x0c, 0x21, 0x31, 0x46, 0x31, 0x60, 0x6b, 0x1a, 0x18, 0x76, 0x14, 0x16, 0x28, 0x20, 0x26, 0x2c, + 0x20, 0x1a, 0x38, 0x4c, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x02, 0x2f, 0x02, 0xca, 0x00, 0x07, + 0x00, 0x00, 0x21, 0x23, 0x11, 0x23, 0x35, 0x21, 0x15, 0x23, 0x01, 0x6d, 0x97, 0xc2, 0x02, 0x1b, + 0xc2, 0x02, 0x4c, 0x7e, 0x7e, 0x00, 0x01, 0x00, 0x55, 0xff, 0xf6, 0x02, 0x9f, 0x02, 0xca, 0x00, + 0x12, 0x00, 0x00, 0x25, 0x14, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x11, 0x33, 0x02, 0x9f, 0x41, 0x83, 0x64, 0x8e, 0x94, 0x97, 0x48, 0x47, + 0x4a, 0x43, 0x97, 0xfc, 0x4a, 0x77, 0x45, 0x91, 0x77, 0x01, 0xcc, 0xfe, 0x4b, 0x58, 0x48, 0x4e, + 0x53, 0x01, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x8a, 0x02, 0xca, 0x00, 0x0e, 0x00, + 0x00, 0x01, 0x03, 0x23, 0x03, 0x33, 0x13, 0x1e, 0x02, 0x17, 0x3e, 0x02, 0x37, 0x13, 0x02, 0x8a, + 0xf3, 0xa5, 0xf2, 0x99, 0x86, 0x04, 0x0f, 0x10, 0x03, 0x03, 0x0f, 0x10, 0x03, 0x87, 0x02, 0xca, + 0xfd, 0x36, 0x02, 0xca, 0xfe, 0x57, 0x0b, 0x3b, 0x41, 0x16, 0x16, 0x41, 0x3b, 0x0b, 0x01, 0xa9, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc7, 0x02, 0xca, 0x00, 0x26, 0x00, 0x00, 0x01, 0x03, + 0x23, 0x03, 0x2e, 0x03, 0x27, 0x0e, 0x03, 0x07, 0x03, 0x23, 0x03, 0x33, 0x13, 0x1e, 0x02, 0x17, + 0x3e, 0x02, 0x37, 0x13, 0x33, 0x13, 0x1e, 0x02, 0x17, 0x3e, 0x02, 0x37, 0x13, 0x03, 0xc7, 0xb6, + 0xac, 0x61, 0x03, 0x09, 0x0b, 0x08, 0x02, 0x01, 0x09, 0x0a, 0x0a, 0x03, 0x60, 0xac, 0xb6, 0x95, + 0x5b, 0x06, 0x0e, 0x0c, 0x03, 0x03, 0x0c, 0x0d, 0x05, 0x68, 0x8f, 0x68, 0x05, 0x0d, 0x0c, 0x03, + 0x03, 0x0c, 0x0f, 0x05, 0x5b, 0x02, 0xca, 0xfd, 0x36, 0x01, 0x77, 0x0b, 0x2c, 0x34, 0x2f, 0x0d, + 0x0d, 0x2f, 0x33, 0x2d, 0x0c, 0xfe, 0x8a, 0x02, 0xca, 0xfe, 0x7a, 0x17, 0x46, 0x46, 0x18, 0x19, + 0x45, 0x41, 0x12, 0x01, 0x90, 0xfe, 0x70, 0x11, 0x42, 0x46, 0x18, 0x19, 0x45, 0x46, 0x17, 0x01, + 0x86, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x9b, 0x02, 0xca, 0x00, 0x0b, 0x00, 0x00, 0x21, + 0x23, 0x03, 0x03, 0x23, 0x13, 0x03, 0x33, 0x13, 0x13, 0x33, 0x03, 0x02, 0x9b, 0xad, 0xa6, 0xa6, + 0xa2, 0xed, 0xde, 0xa7, 0x9a, 0x97, 0xa3, 0xe0, 0x01, 0x0e, 0xfe, 0xf2, 0x01, 0x70, 0x01, 0x5a, + 0xfe, 0xff, 0x01, 0x01, 0xfe, 0x9e, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x70, 0x02, 0xca, + 0x00, 0x08, 0x00, 0x00, 0x01, 0x13, 0x33, 0x03, 0x11, 0x23, 0x11, 0x03, 0x33, 0x01, 0x38, 0x95, + 0xa3, 0xed, 0x96, 0xed, 0xa4, 0x01, 0xa4, 0x01, 0x26, 0xfe, 0x4c, 0xfe, 0xea, 0x01, 0x11, 0x01, + 0xb9, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x02, 0x2b, 0x02, 0xca, 0x00, 0x09, 0x00, 0x00, 0x21, + 0x21, 0x35, 0x01, 0x21, 0x35, 0x21, 0x15, 0x01, 0x21, 0x02, 0x2b, 0xfd, 0xed, 0x01, 0x56, 0xfe, + 0xb3, 0x02, 0x01, 0xfe, 0xaa, 0x01, 0x5f, 0x62, 0x01, 0xeb, 0x7d, 0x62, 0xfe, 0x15, 0x00, 0x01, + 0x00, 0x46, 0xff, 0x62, 0x01, 0x32, 0x02, 0xca, 0x00, 0x07, 0x00, 0x00, 0x05, 0x23, 0x11, 0x33, + 0x15, 0x23, 0x11, 0x33, 0x01, 0x32, 0xec, 0xec, 0x6d, 0x6d, 0x9e, 0x03, 0x68, 0x67, 0xfd, 0x66, + 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x01, 0x97, 0x02, 0xca, 0x00, 0x03, 0x00, 0x00, 0x13, 0x01, + 0x23, 0x01, 0x8d, 0x01, 0x0a, 0x87, 0xfe, 0xf6, 0x02, 0xca, 0xfd, 0x36, 0x02, 0xca, 0x00, 0x01, + 0x00, 0x19, 0xff, 0x62, 0x01, 0x05, 0x02, 0xca, 0x00, 0x07, 0x00, 0x00, 0x17, 0x33, 0x11, 0x23, + 0x35, 0x33, 0x11, 0x23, 0x19, 0x6d, 0x6d, 0xec, 0xec, 0x37, 0x02, 0x9a, 0x67, 0xfc, 0x98, 0x00, + 0x01, 0x00, 0x17, 0x00, 0xfe, 0x02, 0x25, 0x02, 0xce, 0x00, 0x06, 0x00, 0x00, 0x37, 0x13, 0x33, + 0x13, 0x23, 0x03, 0x03, 0x17, 0xd6, 0x46, 0xf2, 0x75, 0x9d, 0x89, 0xfe, 0x01, 0xd0, 0xfe, 0x30, + 0x01, 0x3a, 0xfe, 0xc6, 0x00, 0x01, 0xff, 0xfe, 0xff, 0x62, 0x01, 0x9d, 0xff, 0xa6, 0x00, 0x03, + 0x00, 0x00, 0x05, 0x21, 0x35, 0x21, 0x01, 0x9d, 0xfe, 0x61, 0x01, 0x9f, 0x9e, 0x44, 0x00, 0x01, + 0x00, 0x28, 0x02, 0x5e, 0x01, 0x42, 0x02, 0xfe, 0x00, 0x0c, 0x00, 0x00, 0x13, 0x1e, 0x02, 0x17, + 0x15, 0x23, 0x2e, 0x03, 0x27, 0x35, 0xcf, 0x0f, 0x29, 0x2b, 0x10, 0x63, 0x13, 0x33, 0x35, 0x2e, + 0x0e, 0x02, 0xfe, 0x16, 0x37, 0x33, 0x13, 0x0d, 0x0d, 0x27, 0x2c, 0x28, 0x0e, 0x0a, 0x00, 0x02, + 0x00, 0x2a, 0xff, 0xf6, 0x02, 0x11, 0x02, 0x2d, 0x00, 0x1b, 0x00, 0x26, 0x00, 0x00, 0x01, 0x32, + 0x16, 0x15, 0x11, 0x23, 0x27, 0x23, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x37, 0x37, + 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x36, 0x36, 0x13, 0x06, 0x06, 0x15, 0x14, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x35, 0x01, 0x2e, 0x6e, 0x75, 0x68, 0x1d, 0x04, 0x23, 0x4e, 0x44, 0x49, + 0x60, 0x7a, 0x7a, 0x5f, 0x2d, 0x28, 0x28, 0x4c, 0x26, 0x31, 0x2c, 0x6b, 0x4f, 0x48, 0x38, 0x28, + 0x20, 0x30, 0x42, 0x02, 0x2d, 0x5f, 0x62, 0xfe, 0x94, 0x4a, 0x2c, 0x28, 0x55, 0x58, 0x57, 0x53, + 0x04, 0x03, 0x18, 0x2b, 0x28, 0x17, 0x11, 0x65, 0x17, 0x1a, 0xfe, 0xce, 0x02, 0x30, 0x27, 0x22, + 0x1d, 0x39, 0x34, 0x2d, 0x00, 0x02, 0x00, 0x4e, 0xff, 0xf6, 0x02, 0x4c, 0x02, 0xf8, 0x00, 0x15, + 0x00, 0x22, 0x00, 0x00, 0x13, 0x14, 0x06, 0x07, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, + 0x06, 0x23, 0x22, 0x26, 0x27, 0x23, 0x07, 0x23, 0x11, 0x33, 0x13, 0x22, 0x06, 0x07, 0x15, 0x14, + 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0xe3, 0x04, 0x02, 0x06, 0x16, 0x4a, 0x3b, 0x5c, 0x72, + 0x74, 0x5e, 0x3c, 0x45, 0x16, 0x0a, 0x19, 0x72, 0x95, 0x6b, 0x3a, 0x2f, 0x02, 0x2f, 0x3e, 0x2e, + 0x36, 0x37, 0x02, 0x47, 0x1f, 0x3c, 0x11, 0x22, 0x2f, 0x8f, 0x8b, 0x8c, 0x90, 0x2b, 0x1b, 0x3c, + 0x02, 0xf8, 0xfe, 0xbd, 0x48, 0x4a, 0x10, 0x4f, 0x55, 0x55, 0x50, 0x50, 0x51, 0x00, 0x01, 0x00, + 0x2d, 0xff, 0xf6, 0x01, 0xe3, 0x02, 0x2c, 0x00, 0x19, 0x00, 0x00, 0x05, 0x22, 0x26, 0x35, 0x34, + 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x33, 0x32, + 0x36, 0x37, 0x15, 0x06, 0x06, 0x01, 0x2c, 0x7a, 0x85, 0x44, 0x79, 0x4f, 0x38, 0x53, 0x1f, 0x2c, + 0x23, 0x3d, 0x1e, 0x74, 0x3d, 0x37, 0x2f, 0x48, 0x22, 0x22, 0x4b, 0x0a, 0x87, 0x91, 0x64, 0x7e, + 0x3c, 0x16, 0x0f, 0x73, 0x0e, 0x12, 0xa5, 0x52, 0x4e, 0x19, 0x16, 0x7f, 0x16, 0x13, 0x00, 0x02, + 0x00, 0x2d, 0xff, 0xf6, 0x02, 0x2b, 0x02, 0xf8, 0x00, 0x15, 0x00, 0x22, 0x00, 0x00, 0x17, 0x22, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x26, 0x26, 0x35, 0x35, 0x33, 0x11, 0x23, + 0x27, 0x23, 0x06, 0x06, 0x27, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14, + 0x16, 0xfb, 0x5b, 0x73, 0x74, 0x5e, 0x3b, 0x4c, 0x16, 0x05, 0x03, 0x08, 0x95, 0x72, 0x1d, 0x06, + 0x16, 0x4a, 0x07, 0x3e, 0x32, 0x01, 0x31, 0x42, 0x31, 0x38, 0x38, 0x0a, 0x8f, 0x8b, 0x8c, 0x90, + 0x2e, 0x22, 0x10, 0x3d, 0x20, 0xaf, 0xfd, 0x08, 0x47, 0x22, 0x2f, 0x77, 0x49, 0x49, 0x10, 0x50, + 0x54, 0x55, 0x50, 0x50, 0x51, 0x00, 0x02, 0x00, 0x2d, 0xff, 0xf6, 0x02, 0x24, 0x02, 0x2c, 0x00, + 0x16, 0x00, 0x1d, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x15, 0x21, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x37, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x34, 0x36, 0x36, 0x17, 0x22, 0x06, 0x07, + 0x33, 0x26, 0x26, 0x01, 0x2f, 0x71, 0x84, 0xfe, 0xa0, 0x02, 0x47, 0x3f, 0x35, 0x56, 0x2e, 0x28, + 0x59, 0x3f, 0x52, 0x7e, 0x48, 0x41, 0x74, 0x4e, 0x2b, 0x39, 0x05, 0xd1, 0x01, 0x32, 0x02, 0x2c, + 0x81, 0x77, 0x48, 0x3f, 0x48, 0x15, 0x16, 0x73, 0x14, 0x13, 0x3d, 0x7c, 0x5e, 0x60, 0x7f, 0x40, + 0x6a, 0x38, 0x3b, 0x32, 0x41, 0x00, 0x01, 0x00, 0x14, 0x00, 0x00, 0x01, 0xb0, 0x02, 0xfd, 0x00, + 0x18, 0x00, 0x00, 0x01, 0x23, 0x11, 0x23, 0x11, 0x23, 0x35, 0x37, 0x35, 0x34, 0x36, 0x36, 0x33, + 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x15, 0x15, 0x33, 0x01, 0x7c, 0x81, 0x95, + 0x52, 0x52, 0x2f, 0x57, 0x3b, 0x2c, 0x47, 0x16, 0x26, 0x11, 0x28, 0x1a, 0x1f, 0x1d, 0x81, 0x01, + 0xb2, 0xfe, 0x4e, 0x01, 0xb2, 0x48, 0x28, 0x28, 0x46, 0x4d, 0x20, 0x0e, 0x09, 0x6d, 0x05, 0x09, + 0x26, 0x1d, 0x22, 0x00, 0x02, 0x00, 0x2d, 0xff, 0x10, 0x02, 0x2b, 0x02, 0x2c, 0x00, 0x1e, 0x00, + 0x29, 0x00, 0x00, 0x13, 0x32, 0x17, 0x33, 0x37, 0x33, 0x11, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, + 0x35, 0x16, 0x33, 0x32, 0x35, 0x35, 0x34, 0x36, 0x37, 0x23, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, + 0x34, 0x36, 0x17, 0x22, 0x15, 0x14, 0x33, 0x32, 0x36, 0x35, 0x35, 0x34, 0x26, 0xff, 0x65, 0x39, + 0x04, 0x0c, 0x7e, 0x8a, 0x87, 0x3a, 0x63, 0x2f, 0x65, 0x70, 0x73, 0x03, 0x01, 0x04, 0x1c, 0x4e, + 0x31, 0x61, 0x6d, 0x70, 0x91, 0x69, 0x6b, 0x39, 0x37, 0x36, 0x02, 0x2c, 0x50, 0x46, 0xfd, 0xdd, + 0x75, 0x7a, 0x0e, 0x12, 0x77, 0x2a, 0x7c, 0x0b, 0x11, 0x24, 0x0e, 0x2b, 0x26, 0x95, 0x85, 0x86, + 0x96, 0x79, 0xa5, 0xa3, 0x41, 0x51, 0x12, 0x58, 0x4c, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x02, + 0x46, 0x02, 0xf8, 0x00, 0x16, 0x00, 0x00, 0x13, 0x14, 0x06, 0x07, 0x33, 0x36, 0x36, 0x33, 0x32, + 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x33, 0xe3, 0x05, + 0x02, 0x08, 0x1a, 0x52, 0x32, 0x59, 0x6b, 0x95, 0x58, 0x43, 0x33, 0x95, 0x95, 0x02, 0x5d, 0x28, + 0x4a, 0x0f, 0x2a, 0x26, 0x5f, 0x69, 0xfe, 0x9c, 0x01, 0x3f, 0x76, 0x5d, 0x57, 0xfe, 0xff, 0x02, + 0xf8, 0x00, 0x02, 0x00, 0x48, 0x00, 0x00, 0x00, 0xea, 0x02, 0xf8, 0x00, 0x0b, 0x00, 0x0f, 0x00, + 0x00, 0x13, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x17, 0x11, 0x23, + 0x11, 0x99, 0x21, 0x30, 0x30, 0x21, 0x22, 0x2f, 0x2f, 0x6c, 0x95, 0x02, 0xf8, 0x1f, 0x2a, 0x29, + 0x20, 0x20, 0x29, 0x2a, 0x1f, 0xd6, 0xfd, 0xde, 0x02, 0x22, 0x00, 0x02, 0xff, 0xc0, 0xff, 0x10, + 0x00, 0xea, 0x02, 0xf8, 0x00, 0x0b, 0x00, 0x1c, 0x00, 0x00, 0x13, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x03, 0x22, 0x26, 0x27, 0x35, 0x16, 0x16, 0x33, 0x32, 0x36, + 0x35, 0x11, 0x33, 0x11, 0x14, 0x06, 0x06, 0x48, 0x2f, 0x22, 0x21, 0x30, 0x30, 0x21, 0x22, 0x2f, + 0x26, 0x19, 0x37, 0x12, 0x12, 0x20, 0x14, 0x1e, 0x2a, 0x95, 0x26, 0x55, 0x02, 0xaf, 0x2a, 0x1f, + 0x1f, 0x2a, 0x29, 0x20, 0x20, 0xfc, 0x8a, 0x07, 0x05, 0x75, 0x04, 0x05, 0x22, 0x31, 0x02, 0x47, + 0xfd, 0xa3, 0x32, 0x52, 0x31, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x02, 0x6c, 0x02, 0xf8, 0x00, + 0x12, 0x00, 0x00, 0x13, 0x14, 0x06, 0x07, 0x33, 0x36, 0x36, 0x37, 0x37, 0x33, 0x07, 0x13, 0x23, + 0x27, 0x07, 0x15, 0x23, 0x11, 0x33, 0xe3, 0x05, 0x03, 0x02, 0x0f, 0x20, 0x12, 0x99, 0xa8, 0xd9, + 0xe6, 0xac, 0x9d, 0x40, 0x95, 0x95, 0x01, 0xa4, 0x1f, 0x3d, 0x1f, 0x15, 0x2b, 0x13, 0xa6, 0xed, + 0xfe, 0xcb, 0xdd, 0x33, 0xaa, 0x02, 0xf8, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x00, 0xe3, 0x02, + 0xf8, 0x00, 0x03, 0x00, 0x00, 0x33, 0x23, 0x11, 0x33, 0xe3, 0x95, 0x95, 0x02, 0xf8, 0x00, 0x01, + 0x00, 0x4e, 0x00, 0x00, 0x03, 0x8b, 0x02, 0x2c, 0x00, 0x22, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, + 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x23, 0x22, 0x06, 0x15, + 0x11, 0x23, 0x11, 0x33, 0x17, 0x33, 0x36, 0x36, 0x33, 0x32, 0x16, 0x17, 0x33, 0x36, 0x36, 0x02, + 0xcf, 0x5d, 0x5f, 0x95, 0x52, 0x3b, 0x32, 0x95, 0x52, 0x3e, 0x2f, 0x95, 0x72, 0x14, 0x08, 0x19, + 0x57, 0x2f, 0x3c, 0x54, 0x16, 0x0d, 0x19, 0x59, 0x02, 0x2c, 0x5f, 0x69, 0xfe, 0x9c, 0x01, 0x3f, + 0x76, 0x54, 0x4f, 0xfe, 0xee, 0x01, 0x3f, 0x76, 0x5d, 0x57, 0xfe, 0xff, 0x02, 0x22, 0x46, 0x2a, + 0x26, 0x27, 0x29, 0x2a, 0x26, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x02, 0x46, 0x02, 0x2c, 0x00, + 0x14, 0x00, 0x00, 0x01, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x11, 0x23, 0x11, 0x33, 0x17, 0x33, 0x36, 0x36, 0x01, 0x84, 0x58, 0x6a, 0x95, 0x2a, 0x2e, 0x44, + 0x32, 0x95, 0x72, 0x14, 0x08, 0x1a, 0x5b, 0x02, 0x2c, 0x5f, 0x69, 0xfe, 0x9c, 0x01, 0x3f, 0x3b, + 0x3b, 0x5d, 0x57, 0xfe, 0xff, 0x02, 0x22, 0x46, 0x2a, 0x26, 0x00, 0x02, 0x00, 0x2d, 0xff, 0xf6, + 0x02, 0x3e, 0x02, 0x2c, 0x00, 0x0d, 0x00, 0x19, 0x00, 0x00, 0x01, 0x14, 0x06, 0x23, 0x22, 0x26, + 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x16, 0x05, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, + 0x26, 0x23, 0x22, 0x06, 0x02, 0x3e, 0x8f, 0x7b, 0x4c, 0x77, 0x44, 0x8e, 0x7c, 0x4d, 0x76, 0x44, + 0xfe, 0x87, 0x35, 0x3c, 0x3b, 0x35, 0x35, 0x3c, 0x3b, 0x35, 0x01, 0x12, 0x88, 0x94, 0x42, 0x7f, + 0x5b, 0x88, 0x92, 0x42, 0x7d, 0x5b, 0x51, 0x53, 0x53, 0x51, 0x51, 0x51, 0x51, 0x00, 0x02, 0x00, + 0x4e, 0xff, 0x10, 0x02, 0x4c, 0x02, 0x2c, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, 0x01, 0x32, 0x16, + 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x23, 0x16, 0x15, 0x15, 0x23, 0x11, 0x33, 0x17, 0x33, + 0x36, 0x36, 0x17, 0x22, 0x06, 0x07, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x01, 0x7e, + 0x5c, 0x72, 0x76, 0x5c, 0x3b, 0x46, 0x16, 0x08, 0x08, 0x95, 0x79, 0x15, 0x07, 0x16, 0x4a, 0x0b, + 0x3a, 0x2f, 0x02, 0x2f, 0x3e, 0x33, 0x31, 0x02, 0x2c, 0x8f, 0x8b, 0x8b, 0x91, 0x2b, 0x1b, 0x2a, + 0x26, 0xdc, 0x03, 0x12, 0x47, 0x21, 0x30, 0x77, 0x48, 0x4a, 0x10, 0x4f, 0x55, 0x55, 0x50, 0xa1, + 0x00, 0x02, 0x00, 0x2d, 0xff, 0x10, 0x02, 0x2b, 0x02, 0x2c, 0x00, 0x14, 0x00, 0x20, 0x00, 0x00, + 0x05, 0x34, 0x37, 0x23, 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, 0x17, + 0x33, 0x37, 0x33, 0x11, 0x23, 0x03, 0x32, 0x36, 0x37, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, + 0x14, 0x01, 0x96, 0x06, 0x06, 0x15, 0x4a, 0x3c, 0x5c, 0x72, 0x74, 0x5d, 0x3c, 0x4b, 0x17, 0x04, + 0x0d, 0x7e, 0x95, 0x66, 0x3e, 0x31, 0x01, 0x31, 0x41, 0x35, 0x34, 0x0b, 0x2a, 0x28, 0x22, 0x2f, + 0x8f, 0x8b, 0x8c, 0x90, 0x2e, 0x22, 0x46, 0xfc, 0xee, 0x01, 0x5b, 0x49, 0x49, 0x12, 0x50, 0x54, + 0x55, 0x50, 0xa3, 0x00, 0x01, 0x00, 0x4e, 0x00, 0x00, 0x01, 0xb1, 0x02, 0x2c, 0x00, 0x13, 0x00, + 0x00, 0x01, 0x32, 0x16, 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x06, 0x06, 0x15, 0x11, 0x23, 0x11, + 0x33, 0x17, 0x33, 0x36, 0x36, 0x01, 0x7f, 0x0b, 0x1e, 0x09, 0x0b, 0x07, 0x1b, 0x0a, 0x26, 0x46, + 0x2b, 0x95, 0x71, 0x16, 0x07, 0x18, 0x54, 0x02, 0x2c, 0x02, 0x02, 0x8c, 0x02, 0x03, 0x1b, 0x3c, + 0x34, 0xfe, 0xea, 0x02, 0x22, 0x5c, 0x2a, 0x3c, 0x00, 0x01, 0x00, 0x2d, 0xff, 0xf6, 0x01, 0xcb, + 0x02, 0x2c, 0x00, 0x28, 0x00, 0x00, 0x25, 0x14, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x16, + 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x26, 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16, + 0x17, 0x07, 0x26, 0x26, 0x23, 0x22, 0x15, 0x14, 0x16, 0x16, 0x17, 0x1e, 0x02, 0x01, 0xcb, 0x75, + 0x74, 0x39, 0x52, 0x29, 0x2c, 0x66, 0x27, 0x2c, 0x25, 0x0f, 0x32, 0x35, 0x33, 0x42, 0x20, 0x76, + 0x62, 0x33, 0x5c, 0x31, 0x2d, 0x28, 0x48, 0x25, 0x42, 0x11, 0x31, 0x30, 0x2f, 0x44, 0x25, 0xa2, + 0x53, 0x59, 0x0f, 0x11, 0x7b, 0x14, 0x1a, 0x1a, 0x15, 0x0e, 0x16, 0x1c, 0x16, 0x16, 0x2b, 0x3d, + 0x2e, 0x4c, 0x4c, 0x14, 0x17, 0x6b, 0x11, 0x17, 0x24, 0x0d, 0x15, 0x18, 0x14, 0x13, 0x29, 0x3d, + 0x00, 0x01, 0x00, 0x17, 0xff, 0xf6, 0x01, 0x92, 0x02, 0x96, 0x00, 0x18, 0x00, 0x00, 0x25, 0x32, + 0x36, 0x37, 0x15, 0x06, 0x06, 0x23, 0x22, 0x26, 0x26, 0x35, 0x11, 0x23, 0x35, 0x37, 0x37, 0x33, + 0x15, 0x33, 0x15, 0x23, 0x11, 0x14, 0x16, 0x01, 0x34, 0x19, 0x2e, 0x17, 0x18, 0x47, 0x2a, 0x31, + 0x4d, 0x2d, 0x47, 0x52, 0x2b, 0x5f, 0x99, 0x99, 0x24, 0x6d, 0x0a, 0x07, 0x6f, 0x0a, 0x0f, 0x20, + 0x4f, 0x46, 0x01, 0x07, 0x3f, 0x32, 0x73, 0x74, 0x70, 0xfe, 0xf9, 0x1f, 0x1f, 0x00, 0x01, 0x00, + 0x4b, 0xff, 0xf6, 0x02, 0x43, 0x02, 0x22, 0x00, 0x14, 0x00, 0x00, 0x01, 0x11, 0x23, 0x27, 0x23, + 0x06, 0x06, 0x23, 0x22, 0x26, 0x35, 0x11, 0x33, 0x11, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x11, + 0x02, 0x43, 0x72, 0x14, 0x08, 0x1a, 0x5b, 0x33, 0x58, 0x6a, 0x95, 0x2a, 0x2e, 0x44, 0x32, 0x02, + 0x22, 0xfd, 0xde, 0x46, 0x2a, 0x26, 0x5f, 0x69, 0x01, 0x64, 0xfe, 0xc1, 0x3a, 0x3c, 0x5d, 0x57, + 0x01, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x02, 0x39, 0x02, 0x22, 0x00, 0x0c, 0x00, 0x00, + 0x33, 0x03, 0x33, 0x13, 0x16, 0x16, 0x17, 0x33, 0x36, 0x37, 0x13, 0x33, 0x03, 0xd0, 0xd0, 0x9c, + 0x69, 0x09, 0x0b, 0x01, 0x04, 0x03, 0x13, 0x69, 0x9c, 0xd0, 0x02, 0x22, 0xfe, 0xc9, 0x1c, 0x3c, + 0x18, 0x36, 0x3a, 0x01, 0x37, 0xfd, 0xde, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x03, 0x4e, 0x02, + 0x22, 0x00, 0x2a, 0x00, 0x00, 0x25, 0x2e, 0x03, 0x27, 0x23, 0x0e, 0x03, 0x07, 0x07, 0x23, 0x03, + 0x33, 0x17, 0x1e, 0x02, 0x17, 0x33, 0x3e, 0x03, 0x37, 0x13, 0x33, 0x13, 0x1e, 0x02, 0x15, 0x33, + 0x3e, 0x02, 0x37, 0x37, 0x33, 0x03, 0x23, 0x01, 0xe5, 0x04, 0x0f, 0x12, 0x10, 0x03, 0x04, 0x03, + 0x0f, 0x12, 0x10, 0x04, 0x2c, 0xa0, 0x9b, 0x94, 0x3f, 0x07, 0x0b, 0x0a, 0x02, 0x04, 0x01, 0x06, + 0x09, 0x07, 0x02, 0x43, 0xa4, 0x40, 0x04, 0x0b, 0x09, 0x04, 0x02, 0x0a, 0x0d, 0x07, 0x41, 0x92, + 0x9d, 0xa2, 0xbf, 0x11, 0x43, 0x4d, 0x41, 0x0f, 0x0f, 0x41, 0x4d, 0x44, 0x12, 0xbd, 0x02, 0x22, + 0xf2, 0x19, 0x46, 0x41, 0x13, 0x0e, 0x2f, 0x32, 0x29, 0x07, 0x01, 0x06, 0xfe, 0xfa, 0x0e, 0x3e, + 0x40, 0x13, 0x11, 0x41, 0x48, 0x19, 0xf2, 0xfd, 0xde, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x02, + 0x3d, 0x02, 0x22, 0x00, 0x0b, 0x00, 0x00, 0x13, 0x03, 0x33, 0x17, 0x37, 0x33, 0x03, 0x13, 0x23, + 0x27, 0x07, 0x23, 0xbe, 0xb0, 0xa9, 0x6a, 0x6b, 0xa9, 0xb2, 0xba, 0xa9, 0x73, 0x73, 0xa9, 0x01, + 0x17, 0x01, 0x0b, 0xae, 0xae, 0xfe, 0xf5, 0xfe, 0xe9, 0xbb, 0xbb, 0x00, 0x01, 0x00, 0x00, 0xff, + 0x10, 0x02, 0x39, 0x02, 0x22, 0x00, 0x1a, 0x00, 0x00, 0x11, 0x33, 0x13, 0x16, 0x16, 0x17, 0x33, + 0x36, 0x36, 0x37, 0x13, 0x33, 0x03, 0x06, 0x06, 0x23, 0x22, 0x26, 0x27, 0x35, 0x16, 0x16, 0x33, + 0x32, 0x36, 0x37, 0x37, 0xa3, 0x67, 0x08, 0x08, 0x02, 0x03, 0x03, 0x0b, 0x07, 0x65, 0xa0, 0xe7, + 0x1f, 0x77, 0x4e, 0x19, 0x25, 0x0e, 0x0b, 0x1f, 0x11, 0x2f, 0x37, 0x0d, 0x09, 0x02, 0x22, 0xfe, + 0xcd, 0x16, 0x2f, 0x1a, 0x1a, 0x2f, 0x16, 0x01, 0x33, 0xfd, 0x98, 0x55, 0x55, 0x05, 0x03, 0x76, + 0x02, 0x04, 0x39, 0x28, 0x1b, 0x00, 0x01, 0x00, 0x1b, 0x00, 0x00, 0x01, 0xca, 0x02, 0x22, 0x00, + 0x09, 0x00, 0x00, 0x21, 0x21, 0x35, 0x13, 0x23, 0x35, 0x21, 0x15, 0x03, 0x33, 0x01, 0xca, 0xfe, + 0x51, 0xfd, 0xee, 0x01, 0x97, 0xf6, 0xff, 0x58, 0x01, 0x58, 0x72, 0x61, 0xfe, 0xb1, 0x00, 0x01, + 0x00, 0x0f, 0xff, 0x62, 0x01, 0x62, 0x02, 0xca, 0x00, 0x1f, 0x00, 0x00, 0x05, 0x22, 0x26, 0x26, + 0x35, 0x35, 0x34, 0x26, 0x23, 0x35, 0x32, 0x36, 0x35, 0x35, 0x34, 0x36, 0x36, 0x33, 0x15, 0x06, + 0x06, 0x15, 0x15, 0x14, 0x07, 0x15, 0x16, 0x15, 0x15, 0x14, 0x16, 0x17, 0x01, 0x62, 0x55, 0x5d, + 0x24, 0x40, 0x3d, 0x3d, 0x40, 0x24, 0x5d, 0x55, 0x27, 0x2e, 0x72, 0x72, 0x2e, 0x27, 0x9e, 0x1c, + 0x3c, 0x30, 0x9a, 0x2f, 0x28, 0x75, 0x28, 0x2f, 0x9b, 0x30, 0x3c, 0x1c, 0x6e, 0x01, 0x1a, 0x2a, + 0x92, 0x5b, 0x11, 0x06, 0x11, 0x5b, 0x92, 0x2a, 0x1a, 0x01, 0x00, 0x01, 0x00, 0xde, 0xff, 0x1d, + 0x01, 0x49, 0x02, 0xf5, 0x00, 0x03, 0x00, 0x00, 0x13, 0x33, 0x11, 0x23, 0xde, 0x6b, 0x6b, 0x02, + 0xf5, 0xfc, 0x28, 0x00, 0x01, 0x00, 0x28, 0xff, 0x62, 0x01, 0x7b, 0x02, 0xca, 0x00, 0x1f, 0x00, + 0x00, 0x17, 0x36, 0x36, 0x35, 0x35, 0x34, 0x37, 0x35, 0x26, 0x35, 0x35, 0x34, 0x26, 0x27, 0x35, + 0x32, 0x16, 0x16, 0x15, 0x15, 0x14, 0x16, 0x33, 0x15, 0x22, 0x06, 0x15, 0x15, 0x14, 0x06, 0x06, + 0x23, 0x28, 0x27, 0x2e, 0x72, 0x72, 0x2e, 0x27, 0x56, 0x5c, 0x24, 0x40, 0x3d, 0x3d, 0x40, 0x24, + 0x5c, 0x56, 0x30, 0x01, 0x1a, 0x2a, 0x92, 0x5b, 0x11, 0x06, 0x11, 0x5b, 0x92, 0x2a, 0x1a, 0x01, + 0x6e, 0x1c, 0x3c, 0x30, 0x9b, 0x2f, 0x28, 0x75, 0x28, 0x2f, 0x9a, 0x30, 0x3c, 0x1c, 0x00, 0x01, + 0x00, 0x2b, 0x01, 0x0d, 0x02, 0x10, 0x01, 0xb4, 0x00, 0x17, 0x00, 0x00, 0x01, 0x26, 0x26, 0x23, + 0x22, 0x06, 0x07, 0x35, 0x36, 0x33, 0x32, 0x16, 0x17, 0x16, 0x16, 0x33, 0x32, 0x36, 0x37, 0x15, + 0x06, 0x23, 0x22, 0x26, 0x01, 0x0c, 0x25, 0x33, 0x17, 0x1c, 0x3d, 0x19, 0x32, 0x4b, 0x1d, 0x3b, + 0x2f, 0x25, 0x34, 0x16, 0x1d, 0x3c, 0x19, 0x32, 0x4b, 0x1d, 0x3b, 0x01, 0x2d, 0x10, 0x0b, 0x22, + 0x19, 0x71, 0x35, 0x0b, 0x14, 0x10, 0x0b, 0x22, 0x19, 0x71, 0x35, 0x0c, 0x00, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf3, 0x66, 0xcb, 0x35, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x03, 0x08, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xdf, 0x93, 0x35, 0xf6, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x93, 0x35, 0xf6, + 0xfd, 0x68, 0xfe, 0x76, 0x0a, 0xf0, 0x05, 0x43, 0x00, 0x01, 0x00, 0x06, 0x00, 0x02, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd6, + 0xff, 0xb6, 0xff, 0xd3, 0x03, 0xc7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x02, 0x58, 0x00, 0x00, 0x01, 0x1e, 0x00, 0x39, + 0x01, 0xd8, 0x00, 0x41, 0x02, 0x86, 0x00, 0x16, 0x02, 0x3c, 0x00, 0x2b, 0x03, 0x85, 0x00, 0x1f, + 0x02, 0xee, 0x00, 0x28, 0x01, 0x0a, 0x00, 0x41, 0x01, 0x53, 0x00, 0x28, 0x01, 0x53, 0x00, 0x1e, + 0x02, 0x21, 0x00, 0x1f, 0x02, 0x3c, 0x00, 0x2b, 0x01, 0x1d, 0x00, 0x1f, 0x01, 0x42, 0x00, 0x1e, + 0x01, 0x1d, 0x00, 0x39, 0x01, 0x9d, 0x00, 0x07, 0x02, 0x3c, 0x00, 0x24, 0x02, 0x3c, 0x00, 0x3b, + 0x02, 0x3c, 0x00, 0x26, 0x02, 0x3c, 0x00, 0x26, 0x02, 0x3c, 0x00, 0x11, 0x02, 0x3c, 0x00, 0x31, + 0x02, 0x3c, 0x00, 0x23, 0x02, 0x3c, 0x00, 0x1b, 0x02, 0x3c, 0x00, 0x23, 0x02, 0x3c, 0x00, 0x20, + 0x01, 0x1d, 0x00, 0x39, 0x01, 0x1d, 0x00, 0x1f, 0x02, 0x3c, 0x00, 0x2b, 0x02, 0x3c, 0x00, 0x2b, + 0x02, 0x3c, 0x00, 0x2b, 0x01, 0xdd, 0x00, 0x03, 0x03, 0x81, 0x00, 0x32, 0x02, 0xb2, 0x00, 0x00, + 0x02, 0xa0, 0x00, 0x5a, 0x02, 0x7d, 0x00, 0x3a, 0x02, 0xe4, 0x00, 0x5a, 0x02, 0x30, 0x00, 0x5a, + 0x02, 0x25, 0x00, 0x5a, 0x02, 0xd4, 0x00, 0x3a, 0x02, 0xfd, 0x00, 0x5a, 0x01, 0x85, 0x00, 0x20, + 0x01, 0x4b, 0xff, 0xb6, 0x02, 0x98, 0x00, 0x5a, 0x02, 0x35, 0x00, 0x5a, 0x03, 0xaf, 0x00, 0x5a, + 0x03, 0x2d, 0x00, 0x5a, 0x03, 0x1c, 0x00, 0x3a, 0x02, 0x74, 0x00, 0x5a, 0x03, 0x1c, 0x00, 0x3a, + 0x02, 0x94, 0x00, 0x5a, 0x02, 0x27, 0x00, 0x2e, 0x02, 0x43, 0x00, 0x14, 0x02, 0xf4, 0x00, 0x55, + 0x02, 0x8a, 0x00, 0x00, 0x03, 0xc7, 0x00, 0x00, 0x02, 0x9b, 0x00, 0x00, 0x02, 0x70, 0x00, 0x00, + 0x02, 0x43, 0x00, 0x18, 0x01, 0x4b, 0x00, 0x46, 0x01, 0x9d, 0x00, 0x06, 0x01, 0x4b, 0x00, 0x19, + 0x02, 0x3c, 0x00, 0x17, 0x01, 0x9b, 0xff, 0xfe, 0x01, 0x6a, 0x00, 0x28, 0x02, 0x5c, 0x00, 0x2a, + 0x02, 0x79, 0x00, 0x4e, 0x02, 0x02, 0x00, 0x2d, 0x02, 0x79, 0x00, 0x2d, 0x02, 0x4f, 0x00, 0x2d, + 0x01, 0x83, 0x00, 0x14, 0x02, 0x79, 0x00, 0x2d, 0x02, 0x91, 0x00, 0x4e, 0x01, 0x31, 0x00, 0x48, + 0x01, 0x31, 0xff, 0xc0, 0x02, 0x6c, 0x00, 0x4e, 0x01, 0x31, 0x00, 0x4e, 0x03, 0xd6, 0x00, 0x4e, + 0x02, 0x91, 0x00, 0x4e, 0x02, 0x6b, 0x00, 0x2d, 0x02, 0x79, 0x00, 0x4e, 0x02, 0x79, 0x00, 0x2d, + 0x01, 0xc6, 0x00, 0x4e, 0x01, 0xf1, 0x00, 0x2d, 0x01, 0xb2, 0x00, 0x17, 0x02, 0x91, 0x00, 0x4b, + 0x02, 0x39, 0x00, 0x00, 0x03, 0x58, 0x00, 0x0a, 0x02, 0x42, 0x00, 0x05, 0x02, 0x39, 0x00, 0x00, + 0x01, 0xe8, 0x00, 0x1b, 0x01, 0x8a, 0x00, 0x0f, 0x02, 0x27, 0x00, 0xde, 0x01, 0x8a, 0x00, 0x28, + 0x02, 0x3c, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x71, + 0x00, 0x00, 0x00, 0x9c, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x01, 0x8a, 0x00, 0x00, 0x02, 0x0f, + 0x00, 0x00, 0x02, 0xb8, 0x00, 0x00, 0x02, 0xd4, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x03, 0x3d, + 0x00, 0x00, 0x03, 0x7a, 0x00, 0x00, 0x03, 0xa3, 0x00, 0x00, 0x03, 0xca, 0x00, 0x00, 0x03, 0xe2, + 0x00, 0x00, 0x04, 0x0d, 0x00, 0x00, 0x04, 0x2c, 0x00, 0x00, 0x04, 0x7f, 0x00, 0x00, 0x04, 0xb1, + 0x00, 0x00, 0x05, 0x0d, 0x00, 0x00, 0x05, 0x8b, 0x00, 0x00, 0x05, 0xd6, 0x00, 0x00, 0x06, 0x36, + 0x00, 0x00, 0x06, 0xb9, 0x00, 0x00, 0x06, 0xdd, 0x00, 0x00, 0x07, 0x7e, 0x00, 0x00, 0x08, 0x02, + 0x00, 0x00, 0x08, 0x4d, 0x00, 0x00, 0x08, 0x95, 0x00, 0x00, 0x08, 0xbb, 0x00, 0x00, 0x08, 0xe1, + 0x00, 0x00, 0x09, 0x06, 0x00, 0x00, 0x09, 0x81, 0x00, 0x00, 0x0a, 0x59, 0x00, 0x00, 0x0a, 0xa1, + 0x00, 0x00, 0x0b, 0x09, 0x00, 0x00, 0x0b, 0x61, 0x00, 0x00, 0x0b, 0x9f, 0x00, 0x00, 0x0b, 0xcb, + 0x00, 0x00, 0x0b, 0xf0, 0x00, 0x00, 0x0c, 0x55, 0x00, 0x00, 0x0c, 0x83, 0x00, 0x00, 0x0c, 0xb2, + 0x00, 0x00, 0x0c, 0xef, 0x00, 0x00, 0x0d, 0x27, 0x00, 0x00, 0x0d, 0x44, 0x00, 0x00, 0x0d, 0x94, + 0x00, 0x00, 0x0d, 0xd6, 0x00, 0x00, 0x0e, 0x2f, 0x00, 0x00, 0x0e, 0x70, 0x00, 0x00, 0x0e, 0xd1, + 0x00, 0x00, 0x0f, 0x21, 0x00, 0x00, 0x0f, 0x98, 0x00, 0x00, 0x0f, 0xb9, 0x00, 0x00, 0x0f, 0xf7, + 0x00, 0x00, 0x10, 0x34, 0x00, 0x00, 0x10, 0xb5, 0x00, 0x00, 0x10, 0xea, 0x00, 0x00, 0x11, 0x15, + 0x00, 0x00, 0x11, 0x42, 0x00, 0x00, 0x11, 0x64, 0x00, 0x00, 0x11, 0x82, 0x00, 0x00, 0x11, 0xa3, + 0x00, 0x00, 0x11, 0xc8, 0x00, 0x00, 0x11, 0xe2, 0x00, 0x00, 0x12, 0x12, 0x00, 0x00, 0x12, 0x88, + 0x00, 0x00, 0x12, 0xf1, 0x00, 0x00, 0x13, 0x42, 0x00, 0x00, 0x13, 0xa9, 0x00, 0x00, 0x14, 0x09, + 0x00, 0x00, 0x14, 0x57, 0x00, 0x00, 0x14, 0xcd, 0x00, 0x00, 0x15, 0x15, 0x00, 0x00, 0x15, 0x4e, + 0x00, 0x00, 0x15, 0xa9, 0x00, 0x00, 0x15, 0xeb, 0x00, 0x00, 0x16, 0x02, 0x00, 0x00, 0x16, 0x69, + 0x00, 0x00, 0x16, 0xae, 0x00, 0x00, 0x17, 0x01, 0x00, 0x00, 0x17, 0x64, 0x00, 0x00, 0x17, 0xc7, + 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x18, 0x84, 0x00, 0x00, 0x18, 0xd1, 0x00, 0x00, 0x19, 0x16, + 0x00, 0x00, 0x19, 0x4b, 0x00, 0x00, 0x19, 0xcd, 0x00, 0x00, 0x19, 0xff, 0x00, 0x00, 0x1a, 0x59, + 0x00, 0x00, 0x1a, 0x82, 0x00, 0x00, 0x1a, 0xde, 0x00, 0x00, 0x1a, 0xf7, 0x00, 0x00, 0x1b, 0x52, + 0x00, 0x00, 0x1b, 0xa0, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x10, 0x00, 0x04, 0x00, 0x00, 0xff, + 0x00, 0xff, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xff, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x96, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x04, + 0x00, 0x0d, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x1e, 0x00, 0x11, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x0d, 0x00, 0x2f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x05, 0x00, 0x03, 0x00, 0x3c, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x0d, + 0x00, 0x3f, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x4c, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x08, 0x00, 0x66, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, + 0x00, 0x03, 0x00, 0x3c, 0x00, 0x6e, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x1a, + 0x00, 0xaa, 0x00, 0x03, 0x00, 0x01, 0x04, 0x09, 0x00, 0x05, 0x00, 0x06, 0x00, 0xc4, 0x00, 0x03, + 0x00, 0x01, 0x04, 0x09, 0x00, 0x06, 0x00, 0x1a, 0x00, 0xca, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x46, 0x6f, 0x6e, 0x74, 0x42, 0x6f, 0x6c, 0x64, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x46, 0x6f, 0x6e, 0x74, 0x20, 0x42, 0x6f, 0x6c, 0x64, 0x3a, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x30, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x46, 0x6f, 0x6e, 0x74, 0x31, 0x2e, 0x30, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x46, 0x6f, 0x6e, 0x74, 0x00, 0x47, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, + 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, + 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x47, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x65, + 0x00, 0x72, 0x00, 0x61, 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, + 0x00, 0x74, 0x00, 0x20, 0x00, 0x42, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x3a, 0x00, 0x56, + 0x00, 0x65, 0x00, 0x72, 0x00, 0x73, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x20, 0x00, 0x31, + 0x00, 0x2e, 0x00, 0x30, 0x00, 0x47, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x31, + 0x00, 0x2e, 0x00, 0x30, 0x00, 0x47, 0x00, 0x65, 0x00, 0x6e, 0x00, 0x65, 0x00, 0x72, 0x00, 0x61, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x64, 0x00, 0x46, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x74, 0x00, 0x00, + 0x00, 0x03, 0x02, 0x68, 0x02, 0xbc, 0x00, 0x05, 0x00, 0x08, 0x02, 0x8a, 0x02, 0x58, 0x00, 0x00, + 0x00, 0x4b, 0x02, 0x8a, 0x02, 0x58, 0x00, 0x00, 0x01, 0x5e, 0x00, 0x32, 0x01, 0x48, 0x00, 0x00, + 0x02, 0x0b, 0x08, 0x02, 0x04, 0x05, 0x04, 0x02, 0x02, 0x04, 0xe0, 0x00, 0x82, 0xff, 0x40, 0x00, + 0x20, 0x5f, 0x08, 0x00, 0x00, 0x29, 0x00, 0x10, 0x00, 0x00, 0x47, 0x4f, 0x4f, 0x47, 0x00, 0xa0, + 0x00, 0x00, 0xff, 0xfd, 0x04, 0x2d, 0xfe, 0xdb, 0x00, 0x00, 0x05, 0x43, 0x01, 0x8b, 0x00, 0x00, + 0x01, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x02, 0x22, 0x02, 0xca, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, + 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xb8, 0x01, 0xff, 0x85, 0xb0, 0x04, 0x8d, 0x00 +}; diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino new file mode 100644 index 00000000..acc5bc07 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Colour_Wheel/Colour_Wheel.ino @@ -0,0 +1,47 @@ +// Arc drawing example - draw a colour wheel + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +uint16_t colors[12]; + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + tft.init(); + tft.fillScreen(TFT_BLACK); + + // Create the outer ring colours + for (uint8_t c = 0; c < 2; c++) { + colors[c + 10] = tft.alphaBlend(128 + c * 127, TFT_RED, TFT_MAGENTA); + colors[c + 8] = tft.alphaBlend(128 + c * 127, TFT_MAGENTA, TFT_BLUE); + colors[c + 6] = tft.alphaBlend(128 + c * 127, TFT_BLUE, TFT_GREEN); + colors[c + 4] = tft.alphaBlend(128 + c * 127, TFT_GREEN, TFT_YELLOW); + colors[c + 2] = tft.alphaBlend(128 + c * 127, TFT_YELLOW, TFT_ORANGE); + colors[c + 0] = tft.alphaBlend(128 + c * 127, TFT_ORANGE, TFT_RED); + } +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() { + uint16_t rDelta = (tft.width() - 1) / 10; + uint16_t x = tft.width() / 2; + uint16_t y = tft.height() / 2; + bool smooth = true; + + // Draw rings as a series of arcs, increasingly blend colour with white towards middle + for (uint16_t i = 5; i > 0; i--) { + for (uint16_t angle = 0; angle <= 330; angle += 30) { + uint16_t radius = i * rDelta; + uint16_t wheelColor = tft.alphaBlend((i * 255.0)/5.0, colors[angle / 30], TFT_WHITE); + tft.drawArc(x, y, radius, radius - rDelta, angle, angle + 30, wheelColor, TFT_BLACK, smooth); + } + smooth = false; // Only outer ring is smooth + } + + while (1) delay(100); +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino new file mode 100644 index 00000000..ee5823e8 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Arc/Draw_Arc.ino @@ -0,0 +1,53 @@ +// Example for drawArc function. This is intended for arc based meters. +// (See arcMeter example) + +// Draws arcs without smooth ends, suitable for dynamically changing arc +// angles to avoid residual anti-alias pixels at the arc segment joints. + +// The sides of the arc can optionally be smooth or not. Smooth arcs have +// a much better appearance, especially at small sizes. + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + + tft.init(); + tft.setRotation(1); + tft.fillScreen(TFT_BLACK); +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() +{ + static uint32_t count = 0; + + uint16_t fg_color = random(0x10000); + uint16_t bg_color = TFT_BLACK; // This is the background colour used for smoothing (anti-aliasing) + + uint16_t x = random(tft.width()); // Position of centre of arc + uint16_t y = random(tft.height()); + + uint8_t radius = random(20, tft.width() / 4); // Outer arc radius + uint8_t thickness = random(1, radius / 4); // Thickness + uint8_t inner_radius = radius - thickness; // Calculate inner radius (can be 0 for circle segment) + + // 0 degrees is at 6 o'clock position + // Arcs are drawn clockwise from start_angle to end_angle + // Start angle can be greater than end angle, the arc will then be drawn through 0 degrees + uint16_t start_angle = random(361); // Start angle must be in range 0 to 360 + uint16_t end_angle = random(361); // End angle must be in range 0 to 360 + + bool smooth = random(2); // true = smooth sides, false = no smooth sides + + tft.drawArc(x, y, radius, inner_radius, start_angle, end_angle, fg_color, bg_color, smooth); + + count++; + if (count < 30) delay(500); // After 15s draw as fast as possible! +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino new file mode 100644 index 00000000..32aa156b --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Draw_Smooth_Circles/Draw_Smooth_Circles.ino @@ -0,0 +1,98 @@ +// Example for drawSmoothCircle function. Which draws anti-aliased circles +// The circle periphery has a "thickness" of ~3 pixles to minimise the +// "braiding" effect present in narrow anti-aliased lines. + +// For thicker or thinner circle outlines use the drawArc function. + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + tft.init(); + tft.fillScreen(TFT_BLACK); +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() +{ + static uint32_t radius = 2; + static uint32_t index = 0; + + uint16_t fg_color = rainbow(index); + uint16_t bg_color = TFT_BLACK; // This is the background colour used for smoothing (anti-aliasing) + + uint16_t x = tft.width() / 2; // Position of centre of arc + uint16_t y = tft.height() / 2; + + tft.drawSmoothCircle(x, y, radius, fg_color, bg_color); + + radius += 11; + index += 5; + index = index%192; + + if (radius > tft.height()/2) { + delay (1000); + radius = 2; + } +} + + +// ------------------------------------------------------------------------- +// Return a 16-bit rainbow colour +// ------------------------------------------------------------------------- +unsigned int rainbow(byte value) +{ + // If 'value' is in the range 0-159 it is converted to a spectrum colour + // from 0 = red through to 127 = blue to 159 = violet + // Extending the range to 0-191 adds a further violet to red band + + value = value%192; + + byte red = 0; // Red is the top 5 bits of a 16-bit colour value + byte green = 0; // Green is the middle 6 bits, but only top 5 bits used here + byte blue = 0; // Blue is the bottom 5 bits + + byte sector = value >> 5; + byte amplit = value & 0x1F; + + switch (sector) + { + case 0: + red = 0x1F; + green = amplit; // Green ramps up + blue = 0; + break; + case 1: + red = 0x1F - amplit; // Red ramps down + green = 0x1F; + blue = 0; + break; + case 2: + red = 0; + green = 0x1F; + blue = amplit; // Blue ramps up + break; + case 3: + red = 0; + green = 0x1F - amplit; // Green ramps down + blue = 0x1F; + break; + case 4: + red = amplit; // Red ramps up + green = 0; + blue = 0x1F; + break; + case 5: + red = 0x1F; + green = 0; + blue = 0x1F - amplit; // Blue ramps down + break; + } + return red << 11 | green << 6 | blue; +} diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Arc/Smooth_Arc.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Arc/Smooth_Arc.ino new file mode 100644 index 00000000..9858fcd8 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Arc/Smooth_Arc.ino @@ -0,0 +1,46 @@ +// Example for drawSmoothArc function. +// Draws smooth arcs with rounded or square smooth ends + +#include // Include the graphics library +TFT_eSPI tft = TFT_eSPI(); // Create object "tft" + +// ------------------------------------------------------------------------- +// Setup +// ------------------------------------------------------------------------- +void setup(void) { + Serial.begin(115200); + + tft.init(); + tft.setRotation(1); + tft.fillScreen(TFT_BLACK); +} + +// ------------------------------------------------------------------------- +// Main loop +// ------------------------------------------------------------------------- +void loop() +{ + static uint32_t count = 0; + + uint16_t fg_color = random(0x10000); + uint16_t bg_color = TFT_BLACK; // This is the background colour used for smoothing (anti-aliasing) + + uint16_t x = random(tft.width()); // Position of centre of arc + uint16_t y = random(tft.height()); + + uint8_t radius = random(20, tft.width()/4); // Outer arc radius + uint8_t thickness = random(1, radius / 4); // Thickness + uint8_t inner_radius = radius - thickness; // Calculate inner radius (can be 0 for circle segment) + + // 0 degrees is at 6 o'clock position + // Arcs are drawn clockwise from start_angle to end_angle + uint16_t start_angle = random(361); // Start angle must be in range 0 to 360 + uint16_t end_angle = random(361); // End angle must be in range 0 to 360 + + bool arc_end = random(2); // true = round ends, false = square ends (arc_end parameter can be omitted, ends will then be square) + + tft.drawSmoothArc(x, y, radius, inner_radius, start_angle, end_angle, fg_color, bg_color, arc_end); + + count++; + if (count < 30) delay(500); // After 15s draw as fast as possible! +} diff --git a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino similarity index 94% rename from libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino index b8638e91..63073f08 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Graphics_Demo/Smooth_Graphics_Demo.ino @@ -1,4 +1,4 @@ -// Sketch to demonstrate smooth (anti-aliased) graphics funtions: +// Sketch to demonstrate smooth (anti-aliased) graphics functions: // Smooth graphics result in less pixel resolution jaggedness. #include // Master copy here: https://github.com/Bodmer/TFT_eSPI @@ -35,7 +35,7 @@ void loop() { // drawSpot is for small anti-aliased circles, coordinates and radius are // floating point to allow sub-pixel positioning (large circles will // be slow to draw). Use fillSmoothCircle() for large circles. - // In this case black is the backgorund colour for the anti-aliasing + // In this case black is the background colour for the anti-aliasing float x = 10.5; float y = 10.5; float r = 8.6; @@ -43,7 +43,7 @@ void loop() { // Fill sprite with a colour spr.fillSprite(TFT_RED); - // Draw spot in sprite, the backgorund colour is ommitted so function + // Draw spot in sprite, the background colour is omitted so function // reads background colour for aliasing. (To use this method with direct write // to TFT (tft.drawSpot...) requires the capability to read data from the TFT!) spr.drawSpot(x, y, r, TFT_WHITE); @@ -144,14 +144,14 @@ void getCoord(int16_t x, int16_t y, float *xp1, float *yp1, float *xp2, float *y } // ========================================================================= -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ========================================================================= unsigned int rainbow(byte value) { // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = blue through to 127 = red - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino new file mode 100644 index 00000000..802282f3 --- /dev/null +++ b/libraries/TFT_eSPI-2.5.43/examples/Smooth Graphics/Smooth_Rounded_Rectangles/Smooth_Rounded_Rectangles.ino @@ -0,0 +1,50 @@ +// Draw random coloured smooth (anti-aliased) rounded rectangles on the TFT + +#include + +TFT_eSPI tft = TFT_eSPI(); + +void setup(void) { + tft.init(); + tft.fillScreen(TFT_BLACK); // Background is black +} + +void loop() { + tft.fillScreen(TFT_BLACK); + tft.setCursor(0, 0); + + // Draw some random smooth rounded rectangles + for (int i = 0; i < 20; i++) + { + int radius = random(60); + int w = random(2 * radius, 160); + int h = random(2 * radius, 160); + int t = random(1, radius / 3); + int x = random(tft.width() - w); + int y = random(tft.height() - h); + + // Random colour is anti-aliased (blended) with background colour (black in this case) + tft.drawSmoothRoundRect(x, y, radius, radius - t, w, h, random(0x10000), TFT_BLACK); + } + tft.print("Variable thickness"); + delay(2000); + + tft.fillScreen(TFT_BLACK); + tft.setCursor(0, 0); + + // Draw some random minimum thickness smooth rounded rectangles + for (int i = 0; i < 20; i++) + { + int radius = random(60); + int w = random(2 * radius, 160); + int h = random(2 * radius, 160); + int t = 0; + int x = random(tft.width() - w); + int y = random(tft.height() - h); + + // Random colour is anti-aliased (blended) with background colour (black in this case) + tft.drawSmoothRoundRect(x, y, radius, radius - t, w, h, random(0x10000), TFT_BLACK); + } + tft.print("Minimum thickness"); + delay(2000); +} diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/Animated_dial.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/Animated_dial.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/Animated_dial.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/Animated_dial.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/NotoSansBold36.h b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/NotoSansBold36.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/NotoSansBold36.h rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/NotoSansBold36.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/data/dial.jpg b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/data/dial.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/data/dial.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/data/dial.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/dial.h b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/dial.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Animated_dial/dial.h rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Animated_dial/dial.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino index dacf64fe..33ce9bb5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/One_bit_Sprite_Demo/One_bit_Sprite_Demo.ino @@ -12,7 +12,7 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 1 bit Sprite occupies (width * height)/8 bytes in RAM. So, + A 1-bit Sprite occupies (width * height)/8 bytes in RAM. So, for example, a 320 x 240 pixel Sprite occupies 9600 bytes. */ // A new setBitmapColor(fg_color, bg_color) function allows diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/One_bit_Yin_Yang/One_bit_Yin_Yang.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/One_bit_Yin_Yang/One_bit_Yin_Yang.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/One_bit_Yin_Yang/One_bit_Yin_Yang.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/One_bit_Yin_Yang/One_bit_Yin_Yang.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/Orrery.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/Orrery.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/Orrery.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/Orrery.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/astronomy.c b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/astronomy.c similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/astronomy.c rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/astronomy.c diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/astronomy.h b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/astronomy.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Orrery/astronomy.h rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Orrery/astronomy.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino index a6a0a6a1..83ded139 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_1/Rotated_Sprite_1.ino @@ -10,7 +10,7 @@ // screen very simple. The rotation is clockwise with increasing angle. The angle is in // degrees, an angle of 0 means no Sprite rotation. -// The pushRotated() function works with 1, 4, 8 and 16 bit per pixel (bpp) Sprites. +// The pushRotated() function works with 1, 4, 8 and 16-bit per pixel (bpp) Sprites. // The original Sprite is unchanged so can be plotted again at a different angle. @@ -20,7 +20,7 @@ // For 1 bpp Sprites the foreground and background colours are defined with the // function spr.setBitmapColor(foregroundColor, backgroundColor). -// For 4 bpp Sprites the colour map index is used instead of the 16 bit colour +// For 4 bpp Sprites the colour map index is used instead of the 16-bit colour // e.g. spr.setTextColor(5); // Green text in default colour map // See "Transparent_Sprite_Demo_4bit" example for default colour map details diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino index bb27922e..e9fccb30 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_2/Rotated_Sprite_2.ino @@ -14,7 +14,7 @@ // The rotation angle is in degrees, an angle of 0 means no Sprite rotation. -// The pushRotated() function works with 1, 8 and 16 bit per pixel (bpp) Sprites. +// The pushRotated() function works with 1, 8 and 16-bit per pixel (bpp) Sprites. // For 1 bpp Sprites the foreground and background colours are defined with the // member function setBitmapColor(foregroundColor, backgroundColor). diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino index 2b93dc9f..5341be95 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/Rotated_Sprite_3.ino @@ -80,7 +80,7 @@ void setup() // Send jpeg info to serial port fex.jpegInfo("/Eye_80x64.jpg"); - // Draw jpeg iamge in Sprite spr at 0,0 + // Draw jpeg image in Sprite spr at 0,0 fex.drawJpeg("/Eye_80x64.jpg", 0 , 0, &spr); } @@ -105,7 +105,7 @@ void loop() delay(1000); // Push copies of Sprite rotated through increasing angles 0-360 degrees - // with 45 fegree increments + // with 45 degree increments for (int16_t angle = 0; angle <= 360; angle += 45) { spr.pushRotated(angle); delay(500); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/data/EagleEye.jpg b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/data/EagleEye.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/data/EagleEye.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/data/EagleEye.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/data/Eye_80x64.jpg b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/data/Eye_80x64.jpg similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Rotated_Sprite_3/data/Eye_80x64.jpg rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Rotated_Sprite_3/data/Eye_80x64.jpg diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino index 9d6cf8e8..406f0c08 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_RLE_Font_test/Sprite_RLE_Font_test.ino @@ -9,7 +9,7 @@ ######################################################################### */ -// Specify sprite 160 x 128 pixels (needs 40Kbytes of RAM for 16 bit colour) +// Specify sprite 160 x 128 pixels (needs 40Kbytes of RAM for 16-bit colour) #define IWIDTH 160 #define IHEIGHT 128 diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_TFT_Rainbow/Sprite_TFT_Rainbow.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_TFT_Rainbow/Sprite_TFT_Rainbow.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_TFT_Rainbow/Sprite_TFT_Rainbow.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_TFT_Rainbow/Sprite_TFT_Rainbow.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw/Sprite_draw.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw/Sprite_draw.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw/Sprite_draw.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw/Sprite_draw.ino index e167d680..ce3b06b5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw/Sprite_draw.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw/Sprite_draw.ino @@ -14,12 +14,12 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 16 bit Sprite occupies (2 * width * height) bytes in RAM. + A 16-bit Sprite occupies (2 * width * height) bytes in RAM. On a ESP8266 Sprite sizes up to 126 x 160 can be accommodated, - this size requires 40kBytes of RAM for a 16 bit colour depth. + this size requires 40kBytes of RAM for a 16-bit colour depth. - When 8 bit colour depth sprites are created they occupy + When 8-bit colour depth sprites are created they occupy (width * height) bytes in RAM, so larger sprites can be created, or the RAM required is halved. diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino similarity index 96% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino index ca3ebe4b..e4b27433 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_draw_4bit/Sprite_draw_4bit.ino @@ -1,9 +1,9 @@ /* - Sketch to show how a 4 bit Sprite is created, how to draw pixels + Sketch to show how a 4-bit Sprite is created, how to draw pixels and text within the Sprite and then push the Sprite onto the display screen. - The advantage of 4 bit sprites is: + The advantage of 4-bit sprites is: 1. Small memory footprint 2. Any set of 16 colours can be specified 3. Colours can be changed without redrawing in Sprite @@ -21,7 +21,7 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 4 bit Sprite occupies (width * height)/2 bytes in RAM. + A 4-bit Sprite occupies (width * height)/2 bytes in RAM. */ @@ -64,7 +64,7 @@ void loop(void) // Fill the whole sprite with color 0 (Sprite is in memory so not visible yet) spr.fillSprite(0); - // create a color map with known colors (16 maximum for 4 bit Sprite + // create a color map with known colors (16 maximum for 4-bit Sprite uint16_t cmap[16]; diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino similarity index 91% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino index 53bd4fa2..63fa854b 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/Sprite_image_4bit.ino @@ -14,12 +14,12 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 16 bit Sprite occupies (2 * width * height) bytes in RAM. + A 16-bit Sprite occupies (2 * width * height) bytes in RAM. On a ESP8266 Sprite sizes up to 126 x 160 can be accommodated, - this size requires 40kBytes of RAM for a 16 bit color depth. + this size requires 40kBytes of RAM for a 16-bit color depth. - When 8 bit color depth sprites are created they occupy + When 8-bit color depth sprites are created they occupy (width * height) bytes in RAM, so larger sprites can be created, or the RAM required is halved. @@ -39,7 +39,7 @@ TFT_eSPI tft = TFT_eSPI(); // Declare object "tft" TFT_eSprite spr = TFT_eSprite(&tft); // Declare Sprite object "spr" with pointer to "tft" object -byte red = 31; // Red is the top 5 bits of a 16 bit colour value +byte red = 31; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits byte state = 0; @@ -99,7 +99,7 @@ void loop(void) } // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow() { diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/sample_images.h b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/sample_images.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/sample_images.h rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/sample_images.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/starImage.cpp b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/starImage.cpp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_image_4bit/starImage.cpp rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_image_4bit/starImage.cpp diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll/Sprite_scroll.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll/Sprite_scroll.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll/Sprite_scroll.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll/Sprite_scroll.ino index 1968849a..61166be5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll/Sprite_scroll.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll/Sprite_scroll.ino @@ -14,9 +14,9 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 16 bit Sprite occupies (2 * width * height) bytes in RAM. + A 16-bit Sprite occupies (2 * width * height) bytes in RAM. - An 8 bit Sprite occupies (width * height) bytes in RAM. + An 8-bit Sprite occupies (width * height) bytes in RAM. */ diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino index 2ffbc531..f0cf1f42 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_16bit/Sprite_scroll_16bit.ino @@ -126,7 +126,7 @@ void numberBox(int num, int x, int y) // Fill it with black img.fillSprite(TFT_BLACK); - // Draw a backgorund of 2 filled triangles + // Draw a background of 2 filled triangles img.fillTriangle( 0, 0, 0, 49, 40, 25, TFT_RED); img.fillTriangle( 79, 0, 79, 49, 40, 25, TFT_DARKGREEN); @@ -150,14 +150,14 @@ void numberBox(int num, int x, int y) // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = red through to 127 = blue - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino index dfdee88c..d79e4b8b 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_1bit/Sprite_scroll_1bit.ino @@ -3,7 +3,7 @@ This sketch scrolls a 1 bit per pixel (1 bpp) Sprite. - In a 1 bit Sprite any colour except TFT_BLACK turns a pixel "ON" + In a 1-bit Sprite any colour except TFT_BLACK turns a pixel "ON" TFT_BLACK turns a pixel "OFF". ON and OFF pixels can be set to any two colours before @@ -24,7 +24,7 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 1 bit Sprite occupies (width * height)/8 bytes in RAM. + A 1-bit Sprite occupies (width * height)/8 bytes in RAM. */ diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino index aa29948e..b198c859 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_4bit/Sprite_scroll_4bit.ino @@ -1,5 +1,5 @@ /* - Sketch to show scrolling of the graphics in 4 bit sprites. + Sketch to show scrolling of the graphics in 4-bit sprites. Scrolling in this way moves the pixels in a defined rectangle within the Sprite. By default the whole sprite is scrolled. The gap left by scrolling is filled with a defined colour. @@ -14,7 +14,7 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 4 bit Sprite occupies (width * height)/2 bytes in RAM. + A 4-bit Sprite occupies (width * height)/2 bytes in RAM. */ #include diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino similarity index 93% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino index a843589f..551f8755 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_8bit/Sprite_scroll_8bit.ino @@ -1,7 +1,7 @@ /* Display "flicker free" scrolling text and updating number - This sketch uses 8 bit colour sprites to save RAM. + This sketch uses 8-bit colour sprites to save RAM. Example for library: https://github.com/Bodmer/TFT_eSPI @@ -16,15 +16,15 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 16 bit colour Sprite occupies (2 * width * height) bytes. + A 16-bit colour Sprite occupies (2 * width * height) bytes. - An 8 bit colour Sprite occupies (width * height) bytes. + An 8-bit colour Sprite occupies (width * height) bytes. - On a ESP8266, 16 bit Sprite sizes up to 128 x 160 can be accommodated, + On a ESP8266, 16-bit Sprite sizes up to 128 x 160 can be accommodated, this size requires 128*160*2 bytes (40kBytes) of RAM. This sketch sets the colour depth to 8 bits so larger sprites can be - created. 8 bit colour sprites use half amount of RAM. If the colour + created. 8-bit colour sprites use half amount of RAM. If the colour depth is not specified then 16 bits is assumed. You need to make the sprite small enough to fit, with RAM spare for @@ -137,7 +137,7 @@ void numberBox(int num, int x, int y) // Fill it with black img.fillSprite(TFT_BLACK); - // Draw a backgorund of 2 filled triangles + // Draw a background of 2 filled triangles img.fillTriangle( 0, 0, 0, 49, 40, 25, TFT_RED); img.fillTriangle( 79, 0, 79, 49, 40, 25, TFT_DARKGREEN); @@ -161,14 +161,14 @@ void numberBox(int num, int x, int y) // ######################################################################### -// Return a 16 bit rainbow colour +// Return a 16-bit rainbow colour // ######################################################################### unsigned int rainbow(byte value) { // Value is expected to be in range 0-127 // The value is converted to a spectrum colour from 0 = red through to 127 = blue - byte red = 0; // Red is the top 5 bits of a 16 bit colour value + byte red = 0; // Red is the top 5 bits of a 16-bit colour value byte green = 0;// Green is the middle 6 bits byte blue = 0; // Blue is the bottom 5 bits diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino similarity index 98% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino index 76fcfc63..d97d58b5 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Sprite_scroll_wrap_1bit/Sprite_scroll_wrap_1bit.ino @@ -1,5 +1,5 @@ // This **ONLY** works for 1 bpp Sprites due to lack of bounds checking in the -// Sprite pushImage() function for 8 and 16 bit Sprites (it is on the TO DO list) +// Sprite pushImage() function for 8 and 16-bit Sprites (it is on the TO DO list) // Wrapping scroll example by Bodmer for the TFT_eSPI library diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino similarity index 93% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino index 37615acd..e492ab68 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo/Transparent_Sprite_Demo.ino @@ -12,12 +12,12 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 16 bit Sprite occupies (2 * width * height) bytes in RAM. + A 16-bit Sprite occupies (2 * width * height) bytes in RAM. On a ESP8266 Sprite sizes up to 126 x 160 can be accommodated, - this size requires 40kBytes of RAM for a 16 bit colour depth. + this size requires 40kBytes of RAM for a 16-bit colour depth. - When 8 bit colour depth sprites are created they occupy + When 8-bit colour depth sprites are created they occupy (width * height) bytes in RAM, so larger sprites can be created, or the RAM required is halved. */ @@ -76,7 +76,7 @@ void loop() { // ######################################################################### void drawStar(int x, int y, int star_color) { - // Create an 8 bit sprite 70x 80 pixels (uses 5600 bytes of RAM) + // Create an 8-bit sprite 70x 80 pixels (uses 5600 bytes of RAM) img.setColorDepth(8); img.createSprite(70, 80); @@ -113,7 +113,7 @@ void numberBox(int x, int y, float num ) #define IWIDTH 80 #define IHEIGHT 35 - // Create a 8 bit sprite 80 pixels wide, 35 high (2800 bytes of RAM needed) + // Create a 8-bit sprite 80 pixels wide, 35 high (2800 bytes of RAM needed) img.setColorDepth(8); img.createSprite(IWIDTH, IHEIGHT); diff --git a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino similarity index 91% rename from libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino rename to libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino index c116ed4b..0840648c 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Sprite/Transparent_Sprite_Demo_4bit/Transparent_Sprite_Demo_4bit.ino @@ -1,5 +1,5 @@ /* - Sketch to show creation of a 4 bit sprite with a transparent + Sketch to show creation of a 4-bit sprite with a transparent background, then plot it on the TFT. The palette setup and palette update functions are also shown in this example. @@ -13,11 +13,11 @@ any position. If there is sufficient RAM then the Sprite can be the same size as the screen and used as a frame buffer. - A 4 bit Sprite occupies (width * height)/2 bytes in RAM. + A 4-bit Sprite occupies (width * height)/2 bytes in RAM. For example the "star" 70x80 Sprite uses 2800 bytes. */ -// This is the default palette for 4 bit colour sprites +// This is the default palette for 4-bit colour sprites // which is built into the library. You can create your // own palette (use a different array name!). The palette // is captured and stored in RAM by the Sprite class so a @@ -80,25 +80,25 @@ void loop() { // spr.createPalette(default_4bit_palette, 12); // After rendering a Sprite you can change the palette to increase the range of colours - // plotted to the screen to the full 16 bit set. + // plotted to the screen to the full 16-bit set. // Change palette colour 11 to violet spr.setPaletteColor(11, TFT_VIOLET); - uint16_t color15 = spr.getPaletteColor(15); // The 16 bit colour in a palette can be read back + uint16_t color15 = spr.getPaletteColor(15); // The 16-bit colour in a palette can be read back // Draw 50 sprites containing a "transparent" colour for (int i = 0; i < 50; i++) { int x = random(tft.width() - 70); int y = random(tft.height() - 80); - int c = random(15); // Random colour 0-14 (4 bit index into color map). Leave 15 for transparent. + int c = random(15); // Random colour 0-14 (4-bit index into color map). Leave 15 for transparent. drawStar(x, y, c); } delay(2000); - // Change the palette to a 16 bit grey scale colour + // Change the palette to a 16-bit grey scale colour for (uint8_t i = 0; i < 16; i++) { // (i*16+i) produces a value in range 0-255 for the RGB colours // Red Green Blue diff --git a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Colour_Test/Colour_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Colour_Test/Colour_Test.ino similarity index 69% rename from libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Colour_Test/Colour_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Colour_Test/Colour_Test.ino index 185df6de..bdae2c5b 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Colour_Test/Colour_Test.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Colour_Test/Colour_Test.ino @@ -58,25 +58,26 @@ void setup(void) { tft.init(); tft.fillScreen(TFT_BLACK); - + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); + // Set "cursor" at top left corner of display (0,0) and select font 4 - tft.setCursor(0, 0, 4); + tft.setCursor(0, 4, 4); // Set the font colour to be white with a black background - tft.setTextColor(TFT_WHITE, TFT_BLACK); + tft.setTextColor(TFT_WHITE); // We can now plot text on screen using the "print" class - tft.println("Initialised default\n"); - tft.println("White text"); + tft.println(" Initialised default\n"); + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); @@ -87,22 +88,23 @@ void loop() { tft.invertDisplay( false ); // Where i is true or false tft.fillScreen(TFT_BLACK); - - tft.setCursor(0, 0, 4); + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); - tft.setTextColor(TFT_WHITE, TFT_BLACK); - tft.println("Invert OFF\n"); + tft.setCursor(0, 4, 4); - tft.println("White text"); + tft.setTextColor(TFT_WHITE); + tft.println(" Invert OFF\n"); + + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); @@ -111,22 +113,23 @@ void loop() { tft.invertDisplay( true ); // Where i is true or false tft.fillScreen(TFT_BLACK); - - tft.setCursor(0, 0, 4); + tft.drawRect(0, 0, tft.width(), tft.height(), TFT_GREEN); - tft.setTextColor(TFT_WHITE, TFT_BLACK); - tft.println("Invert ON\n"); + tft.setCursor(0, 4, 4); - tft.println("White text"); + tft.setTextColor(TFT_WHITE); + tft.println(" Invert ON\n"); + + tft.println(" White text"); - tft.setTextColor(TFT_RED, TFT_BLACK); - tft.println("Red text"); + tft.setTextColor(TFT_RED); + tft.println(" Red text"); - tft.setTextColor(TFT_GREEN, TFT_BLACK); - tft.println("Green text"); + tft.setTextColor(TFT_GREEN); + tft.println(" Green text"); - tft.setTextColor(TFT_BLUE, TFT_BLACK); - tft.println("Blue text"); + tft.setTextColor(TFT_BLUE); + tft.println(" Blue text"); delay(5000); } diff --git a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino similarity index 97% rename from libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino rename to libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino index 21b74ecd..8b5c9f59 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Read_User_Setup/Read_User_Setup.ino @@ -19,7 +19,7 @@ TFT_eSPI tft = TFT_eSPI(); // Invoke library -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 ADC_MODE(ADC_VCC); // Read the supply voltage #endif @@ -45,15 +45,15 @@ Serial.print("\n[code]\n"); Serial.print ("TFT_eSPI ver = "); Serial.println(user.version); printProcessorName(); -#if defined (ESP32) || defined (ESP8266) +#if defined (ESP32) || defined (ARDUINO_ARCH_ESP8266) if (user.esp < 0x32F000 || user.esp > 0x32FFFF) { Serial.print("Frequency = "); Serial.print(ESP.getCpuFreqMHz());Serial.println("MHz"); } #endif -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 Serial.print("Voltage = "); Serial.print(ESP.getVcc() / 918.0); Serial.println("V"); // 918 empirically determined #endif Serial.print("Transactions = "); Serial.println((user.trans == 1) ? "Yes" : "No"); Serial.print("Interface = "); Serial.println((user.serial == 1) ? "SPI" : "Parallel"); -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 if (user.serial == 1){ Serial.print("SPI overlap = "); Serial.println((user.overlap == 1) ? "Yes\n" : "No\n"); } #endif if (user.tft_driver != 0xE9D) // For ePaper displays the size is defined in the sketch @@ -78,7 +78,7 @@ if (user.pin_tft_mosi != -1) { Serial.print("MOSI = "); Serial.print("GPIO ") if (user.pin_tft_miso != -1) { Serial.print("MISO = "); Serial.print("GPIO "); Serial.println(getPinName(user.pin_tft_miso)); } if (user.pin_tft_clk != -1) { Serial.print("SCK = "); Serial.print("GPIO "); Serial.println(getPinName(user.pin_tft_clk)); } -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 if (user.overlap == true) { Serial.println("Overlap selected, following pins MUST be used:"); @@ -92,7 +92,7 @@ if (user.overlap == true) } #endif String pinNameRef = "GPIO "; -#ifdef ESP8266 +#ifdef ARDUINO_ARCH_ESP8266 pinNameRef = "PIN_D"; #endif @@ -184,5 +184,5 @@ int8_t getPinName(int8_t pin) if (user.esp == 0x32F) return pin; - return -1; // Invalid pin + return pin; // Invalid pin } diff --git a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/TFT_ReadWrite_Test/TFT_ReadWrite_Test.ino b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/TFT_ReadWrite_Test/TFT_ReadWrite_Test.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/TFT_ReadWrite_Test/TFT_ReadWrite_Test.ino rename to libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/TFT_ReadWrite_Test/TFT_ReadWrite_Test.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Test_Touch_Controller/Test_Touch_Controller.ino b/libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Test_Touch_Controller/Test_Touch_Controller.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/Test and diagnostics/Test_Touch_Controller/Test_Touch_Controller.ino rename to libraries/TFT_eSPI-2.5.43/examples/Test and diagnostics/Test_Touch_Controller/Test_Touch_Controller.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/EPD_Support.h b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/EPD_Support.h similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/EPD_Support.h rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/EPD_Support.h diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino similarity index 99% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino index a856d696..4c8adbba 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg.ino @@ -106,7 +106,7 @@ void loop() { frame.fillSprite(PAPER); - // Draw 8 bit grey-scale bitmap using Floyd-Steinberg dithering at x,y + // Draw 8-bit grey-scale bitmap using Floyd-Steinberg dithering at x,y // /File name x y //drawFSBmp("/TestCard.bmp", 0, 0); // 176 x 264 pixels diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino similarity index 95% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino index e52dbe07..414365d3 100644 --- a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino +++ b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/Floyd_Steinberg_BMP.ino @@ -27,14 +27,14 @@ SOFTWARE. Note: drawFSBmp() is a simplified function and does not handle all possible - BMP file header variants. It works OK with 8 bit per pixel grey-scale images + BMP file header variants. It works OK with 8-bit per pixel grey-scale images generated by MS Paint and IrfanView. */ // https://github.com/Bodmer/TFT_eSPI //==================================================================================== -// Draw an 8 bit grey-scale bitmap (*.BMP) on a Monochrome display using dithering +// Draw an 8-bit grey-scale bitmap (*.BMP) on a Monochrome display using dithering //==================================================================================== // Uses RAM for buffers (3 * width + 4) ( 532 bytes for 176 pixels) @@ -102,10 +102,10 @@ void drawFSBmp(const char *filename, int16_t x, int16_t y) { uint16_t padding = (4 - (w & 3)) & 3; // Calculate the BMP line padding - // Create an zero an 8 bit pixel line buffer + // Create an zero an 8-bit pixel line buffer uint8_t* lineBuffer = ( uint8_t*) calloc(w , sizeof(uint8_t)); - // Create a 16 bit signed line buffer for the quantisation error + // Create a 16-bit signed line buffer for the quantisation error // Diffusion spreads to x-1 and x+1 so w + 2 avoids a bounds check int16_t* qerrBuffer = ( int16_t*) calloc((w + 2)<<1, sizeof(uint8_t)); @@ -174,7 +174,7 @@ void drawFSBmp(const char *filename, int16_t x, int16_t y) { } //==================================================================================== -// Read a 16 bit value from the filing system +// Read a 16-bit value from the filing system //==================================================================================== uint16_t read16(fs::File &f) { uint16_t result; @@ -184,7 +184,7 @@ uint16_t read16(fs::File &f) { } //==================================================================================== -// Read a 32 bit value from the filing system +// Read a 32-bit value from the filing system //==================================================================================== uint32_t read32(fs::File &f) { uint32_t result; diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/SPIFFS.ino b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/SPIFFS.ino similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/SPIFFS.ino rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/SPIFFS.ino diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/data/TestCard.bmp b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/data/TestCard.bmp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/data/TestCard.bmp rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/data/TestCard.bmp diff --git a/libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/data/Tiger.bmp b/libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/data/Tiger.bmp similarity index 100% rename from libraries/TFT_eSPI-2.4.72/examples/ePaper/Floyd_Steinberg/data/Tiger.bmp rename to libraries/TFT_eSPI-2.5.43/examples/ePaper/Floyd_Steinberg/data/Tiger.bmp diff --git a/libraries/TFT_eSPI-2.4.72/keywords.txt b/libraries/TFT_eSPI-2.5.43/keywords.txt similarity index 95% rename from libraries/TFT_eSPI-2.4.72/keywords.txt rename to libraries/TFT_eSPI-2.5.43/keywords.txt index fb47c5e4..21439a9f 100644 --- a/libraries/TFT_eSPI-2.4.72/keywords.txt +++ b/libraries/TFT_eSPI-2.5.43/keywords.txt @@ -18,6 +18,9 @@ pushColor KEYWORD2 setRotation KEYWORD2 getRotation KEYWORD2 +setOrigin KEYWORD2 +getOriginX KEYWORD2 +getOriginY KEYWORD2 invertDisplay KEYWORD2 setAddrWindow KEYWORD2 @@ -44,6 +47,8 @@ end_SDA_Read KEYWORD2 fillScreen KEYWORD2 drawRect KEYWORD2 +fillRectHGradient KEYWORD2 +fillRectVGradient KEYWORD2 drawRoundRect KEYWORD2 fillRoundRect KEYWORD2 @@ -69,6 +74,7 @@ getPivotY KEYWORD2 readRect KEYWORD2 pushRect KEYWORD2 pushImage KEYWORD2 +pushMaskedImage KEYWORD2 readRectRGB KEYWORD2 drawNumber KEYWORD2 @@ -140,10 +146,12 @@ calibrateTouch KEYWORD2 setTouch KEYWORD2 # Smooth (anti-aliased) graphics functions -fillRectHGradient KEYWORD2 -fillRectVGradient KEYWORD2 +drawSmoothCircle KEYWORD2 fillSmoothCircle KEYWORD2 +drawSmoothRoundRect KEYWORD2 fillSmoothRoundRect KEYWORD2 +drawSmoothArc KEYWORD2 +drawArc KEYWORD2 drawSpot KEYWORD2 drawWideLine KEYWORD2 drawWedgeLine KEYWORD2 diff --git a/libraries/TFT_eSPI-2.4.72/library.json b/libraries/TFT_eSPI-2.5.43/library.json similarity index 77% rename from libraries/TFT_eSPI-2.4.72/library.json rename to libraries/TFT_eSPI-2.5.43/library.json index 91a9a73a..f590f3ec 100644 --- a/libraries/TFT_eSPI-2.4.72/library.json +++ b/libraries/TFT_eSPI-2.5.43/library.json @@ -1,8 +1,8 @@ { "name": "TFT_eSPI", - "version": "2.4.72", + "version": "2.5.43", "keywords": "Arduino, tft, display, ttgo, LilyPi, WT32-SC01, ePaper, display, Pico, RP2040 Nano Connect, RP2040, STM32, ESP8266, NodeMCU, ESP32, M5Stack, ILI9341, ST7735, ILI9163, S6D02A1, ILI9481, ILI9486, ILI9488, ST7789, ST7796, RM68140, SSD1351, SSD1963, ILI9225, HX8357D, GC9A01, R61581", - "description": "A TFT and ePaper SPI graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32", + "description": "A TFT and ePaper (SPI or parallel interface) graphics library with optimisation for Raspberry Pi Pico, RP2040, ESP8266, ESP32 and STM32 processors", "repository": { "type": "git", diff --git a/libraries/TFT_eSPI-2.4.72/library.properties b/libraries/TFT_eSPI-2.5.43/library.properties similarity index 66% rename from libraries/TFT_eSPI-2.4.72/library.properties rename to libraries/TFT_eSPI-2.5.43/library.properties index 558fdb01..319d4ec6 100644 --- a/libraries/TFT_eSPI-2.4.72/library.properties +++ b/libraries/TFT_eSPI-2.5.43/library.properties @@ -1,9 +1,9 @@ name=TFT_eSPI -version=2.4.72 +version=2.5.43 author=Bodmer maintainer=Bodmer sentence=TFT graphics library for Arduino processors with performance optimisation for RP2040, STM32, ESP8266 and ESP32 -paragraph=Supports TFT displays using drivers (ILI9341 etc) that operate with hardware SPI or 8 bit parallel. +paragraph=Supports TFT displays using drivers (ILI9341 etc.) that operate with hardware SPI or 8/16-bit parallel. category=Display url=https://github.com/Bodmer/TFT_eSPI architectures=* diff --git a/libraries/TFT_eSPI-2.4.72/license.txt b/libraries/TFT_eSPI-2.5.43/license.txt similarity index 97% rename from libraries/TFT_eSPI-2.4.72/license.txt rename to libraries/TFT_eSPI-2.5.43/license.txt index 87db4c9d..e0b40d2c 100644 --- a/libraries/TFT_eSPI-2.4.72/license.txt +++ b/libraries/TFT_eSPI-2.5.43/license.txt @@ -94,9 +94,9 @@ graphics. In 2018 anti-aliased fonts were added along with a Processing font conversion sketch. -In 2019 the library was adapted to be able to use it with any 32 bit Arduino -compatible processor. It will run on 8 bit and 16 bit processors but will be -slow due to extensive use of 32 bit variables. +In 2019 the library was adapted to be able to use it with any 32-bit Arduino +compatible processor. It will run on 8-bit and 16-bit processors but will be +slow due to extensive use of 32-bit variables. Many of the example sketches are original work that contain code created for my own projects. For all the original code the FreeBSD licence applies @@ -105,7 +105,7 @@ and is compatible with the GNU GPL. vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvStartvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv Software License Agreement (FreeBSD License) -Copyright (c) 2022 Bodmer (https://github.com/Bodmer) +Copyright (c) 2023 Bodmer (https://github.com/Bodmer) All rights reserved. diff --git a/libraries/arduinoWebSockets-2.3.6/.piopm b/libraries/arduinoWebSockets-2.3.6/.piopm deleted file mode 100644 index fa56e4c2..00000000 --- a/libraries/arduinoWebSockets-2.3.6/.piopm +++ /dev/null @@ -1 +0,0 @@ -{"type": "library", "name": "WebSockets", "version": "2.3.6", "spec": {"owner": "links2004", "id": 549, "name": "WebSockets", "requirements": null, "url": null}} \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.3.6/.clang-format b/libraries/arduinoWebSockets-2.5.2/.clang-format similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/.clang-format rename to libraries/arduinoWebSockets-2.5.2/.clang-format diff --git a/libraries/arduinoWebSockets-2.3.6/.github/workflows/main.yml b/libraries/arduinoWebSockets-2.5.2/.github/workflows/main.yml similarity index 59% rename from libraries/arduinoWebSockets-2.3.6/.github/workflows/main.yml rename to libraries/arduinoWebSockets-2.5.2/.github/workflows/main.yml index d9f1b961..908c62ea 100644 --- a/libraries/arduinoWebSockets-2.3.6/.github/workflows/main.yml +++ b/libraries/arduinoWebSockets-2.5.2/.github/workflows/main.yml @@ -33,21 +33,20 @@ jobs: run: | source $GITHUB_WORKSPACE/travis/common.sh cd $GITHUB_WORKSPACE - echo -en "::set-output name=matrix::" - echo -en "[" - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.6.13 esp8266com:esp8266:generic:xtal=80 - echo -en "," + echo -en "matrix=" >> $GITHUB_OUTPUT + echo -en "[" >> $GITHUB_OUTPUT - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.6.13 esp8266com:esp8266:generic:xtal=80,dbg=Serial1 - echo -en "," + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266_pico esp8266 0.35.3 esp8266:esp8266:generic:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,ResetMethod=nodemcu,CrystalFreq=26,FlashFreq=80,FlashMode=qio,eesz=4M2M,led=2,sdk=nonosdk_190703,ip=lm2f,dbg=Serial1,lvl=SSL,wipe=none,baud=115200 >> $GITHUB_OUTPUT + echo -en "," >> $GITHUB_OUTPUT - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266 esp8266 1.8.13 esp8266com:esp8266:generic:xtal=80,eesz=1M,FlashMode=qio,FlashFreq=80 - echo -en "," + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp8266_pico esp8266 0.35.3 esp8266:esp8266:generic:xtal=80,vt=flash,exception=disabled,stacksmash=disabled,ssl=all,mmu=3232,non32xfer=fast,ResetMethod=nodemcu,CrystalFreq=26,FlashFreq=80,FlashMode=qio,eesz=4M2M,led=2,sdk=nonosdk_190703,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200 >> $GITHUB_OUTPUT + echo -en "," >> $GITHUB_OUTPUT - get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp32 esp32 1.8.13 espressif:esp32:esp32:FlashFreq=80 + get_sketches_json_matrix arduino $GITHUB_WORKSPACE/examples/esp32 esp32 0.35.3 esp32:esp32:esp32:FlashFreq=80 >> $GITHUB_OUTPUT - echo -en "]" + echo -en "]" >> $GITHUB_OUTPUT + echo >> $GITHUB_OUTPUT outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} @@ -56,33 +55,35 @@ jobs: strategy: fail-fast: false matrix: - IDE_VERSION: [1.8.13, 1.6.13] + CLI_VERSION: [0.35.3] env: - IDE_VERSION: ${{ matrix.IDE_VERSION }} + CLI_VERSION: ${{ matrix.CLI_VERSION }} + ARDUINO_DIRECTORIES_DATA: /home/runner/arduino_ide steps: - uses: actions/checkout@v2 - - name: Get Date - id: get-date + - name: Get hash + id: get-hash run: | - echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + echo "hash=$(/bin/date -u "+%Y%m%d")-$(md5sum ".github/workflows/main.yml" | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT shell: bash - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: cache_all with: path: | /home/runner/arduino_ide /home/runner/Arduino - key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ matrix.IDE_VERSION }} + key: ${{ runner.os }}-${{ steps.get-hash.outputs.hash }}-${{ matrix.CLI_VERSION }}-cli - name: download IDE if: steps.cache_all.outputs.cache-hit != 'true' run: | - wget http://downloads.arduino.cc/arduino-$IDE_VERSION-linux64.tar.xz -q - tar xf arduino-$IDE_VERSION-linux64.tar.xz - mv arduino-$IDE_VERSION $HOME/arduino_ide + wget https://github.com/arduino/arduino-cli/releases/download/v${CLI_VERSION}/arduino-cli_${CLI_VERSION}_Linux_64bit.tar.gz -q + tar xf arduino-cli_${CLI_VERSION}_Linux_64bit.tar.gz + mkdir -p $ARDUINO_DIRECTORIES_DATA + mv arduino-cli $ARDUINO_DIRECTORIES_DATA/ - name: download ArduinoJson if: steps.cache_all.outputs.cache-hit != 'true' @@ -92,17 +93,12 @@ jobs: unzip 6.x.zip mv ArduinoJson-6.x $HOME/Arduino/libraries/ArduinoJson - - name: download esp8266 + - name: download cores if: steps.cache_all.outputs.cache-hit != 'true' run: | + export PATH="$ARDUINO_DIRECTORIES_DATA:$PATH" source $GITHUB_WORKSPACE/travis/common.sh - get_core esp8266 - - - name: download esp32 - if: steps.cache_all.outputs.cache-hit != 'true' && matrix.IDE_VERSION != '1.6.13' - run: | - source $GITHUB_WORKSPACE/travis/common.sh - get_core esp32 + get_core_cli build: needs: [prepare_ide, prepare_example_json] @@ -114,8 +110,9 @@ jobs: env: CPU: ${{ matrix.cpu }} BOARD: ${{ matrix.board }} - IDE_VERSION: ${{ matrix.ideversion }} + CLI_VERSION: ${{ matrix.cliversion }} SKETCH: ${{ matrix.sketch }} + ARDUINO_DIRECTORIES_DATA: /home/runner/arduino_ide # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -125,19 +122,19 @@ jobs: run: | sudo apt-get install -y libgtk2.0-0 - - name: Get Date - id: get-date + - name: Get hash + id: get-hash run: | - echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" + echo "hash=$(/bin/date -u "+%Y%m%d")-$(md5sum ".github/workflows/main.yml" | cut -d ' ' -f 1)" >> $GITHUB_OUTPUT shell: bash - - uses: actions/cache@v2 + - uses: actions/cache@v3 id: cache_all with: path: | /home/runner/arduino_ide /home/runner/Arduino - key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ matrix.ideversion }} + key: ${{ runner.os }}-${{ steps.get-hash.outputs.hash }}-${{ matrix.cliversion }}-cli - name: install python serial if: matrix.cpu == 'esp32' @@ -146,38 +143,24 @@ jobs: sudo pip install pyserial # sudo apt install python-is-python3 - - name: start DISPLAY - run: | - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_1.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :1 -ac -screen 0 1280x1024x16 - export DISPLAY=:1.0 - sleep 3 - - name: test IDE run: | - export PATH="$HOME/arduino_ide:$PATH" - which arduino + export PATH="$ARDUINO_DIRECTORIES_DATA:$PATH" + which arduino-cli - name: copy code run: | mkdir -p $HOME/Arduino/libraries/ cp -r $GITHUB_WORKSPACE $HOME/Arduino/libraries/arduinoWebSockets - - name: config IDE - run: | - export DISPLAY=:1.0 - export PATH="$HOME/arduino_ide:$PATH" - arduino --board $BOARD --save-prefs - arduino --get-pref sketchbook.path - arduino --pref update.check=false - - name: build example timeout-minutes: 20 run: | - export DISPLAY=:1.0 + set -ex export PATH="$HOME/arduino_ide:$PATH" source $GITHUB_WORKSPACE/travis/common.sh cd $GITHUB_WORKSPACE - build_sketch arduino $SKETCH + build_sketch_cli "$SKETCH" "$BOARD" done: needs: [prepare_ide, prepare_example_json, build, check_version_files] diff --git a/libraries/arduinoWebSockets-2.3.6/.gitignore b/libraries/arduinoWebSockets-2.5.2/.gitignore similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/.gitignore rename to libraries/arduinoWebSockets-2.5.2/.gitignore diff --git a/libraries/arduinoWebSockets-2.3.6/.travis.yml b/libraries/arduinoWebSockets-2.5.2/.travis.yml similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/.travis.yml rename to libraries/arduinoWebSockets-2.5.2/.travis.yml diff --git a/libraries/arduinoWebSockets-2.3.6/LICENSE b/libraries/arduinoWebSockets-2.5.2/LICENSE similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/LICENSE rename to libraries/arduinoWebSockets-2.5.2/LICENSE diff --git a/libraries/arduinoWebSockets-2.3.6/README.md b/libraries/arduinoWebSockets-2.5.2/README.md similarity index 70% rename from libraries/arduinoWebSockets-2.3.6/README.md rename to libraries/arduinoWebSockets-2.5.2/README.md index ae2497f0..f621d5de 100644 --- a/libraries/arduinoWebSockets-2.3.6/README.md +++ b/libraries/arduinoWebSockets-2.5.2/README.md @@ -1,4 +1,4 @@ -WebSocket Server and Client for Arduino [![Build Status](https://github.com/Links2004/arduinoWebSockets/workflows/CI/badge.svg?branch=master)](https://github.com/Links2004/arduinoWebSockets/actions?query=workflow%3ACI+branch%3Amaster) +WebSocket Server and Client for Arduino [![Build Status](https://github.com/Links2004/arduinoWebSockets/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/Links2004/arduinoWebSockets/actions?query=branch%3Amaster) =========================================== a WebSocket Server and Client for Arduino based on RFC6455. @@ -26,11 +26,13 @@ a WebSocket Server and Client for Arduino based on RFC6455. - ESP8266 [Arduino for ESP8266](https://github.com/esp8266/Arduino/) - ESP32 [Arduino for ESP32](https://github.com/espressif/arduino-esp32) - ESP31B + - Raspberry Pi Pico W [Arduino for Pico](https://github.com/earlephilhower/arduino-pico) - Particle with STM32 ARM Cortex M3 - ATmega328 with Ethernet Shield (ATmega branch) - ATmega328 with enc28j60 (ATmega branch) - ATmega2560 with Ethernet Shield (ATmega branch) - ATmega2560 with enc28j60 (ATmega branch) + - Arduino UNO [R4 WiFi](https://github.com/arduino/ArduinoCore-renesas) ###### Note: ###### @@ -47,6 +49,16 @@ a WebSocket Server and Client for Arduino based on RFC6455. by running the device behind an SSL proxy. See [Nginx](examples/Nginx/esp8266.ssl.reverse.proxy.conf) for a sample Nginx server configuration file to enable this. +### Root CA Cert Bundles for SSL/TLS connections ### + +Secure connections require the certificate of the server to be verified. One option is to provide a single certificate in the chain of trust. However, for flexibility and robustness, a certificate bundle is recommended. If a server changes the root CA from which it derives its certificates, this will not be a problem. With a single CA cert it will not connect. + + - For [technical details](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/esp_crt_bundle.html) + - For a [PlatformIO setup](https://github.com/Duckle29/esp32-certBundle/) + - For an [example](examples/esp32/WebSocketClientSSLBundle/) + +Including a bundle with all CA certs will use 77.2 kB but this list can be reduced to 16.5 kB for the 41 most common. This results in 90% absolute usage coverage and 99% market share coverage according to [W3Techs](https://w3techs.com/technologies/overview/ssl_certificate). The bundle is inserted into the compiled firmware. The bundle is not loaded into RAM, only its index. + ### ESP Async TCP ### This libary can run in Async TCP mode on the ESP. @@ -62,19 +74,19 @@ The mode can be activated in the ```WebSockets.h``` (see WEBSOCKETS_NETWORK_TYPE ```c++ void begin(const char *host, uint16_t port, const char * url = "/", const char * protocol = "arduino"); void begin(String host, uint16_t port, String url = "/", String protocol = "arduino"); - ``` +``` - `onEvent`: Callback to handle for websocket events - ```c++ +```c++ void onEvent(WebSocketClientEvent cbEvent); - ``` +``` - `WebSocketClientEvent`: Handler for websocket events - ```c++ +```c++ void (*WebSocketClientEvent)(WStype_t type, uint8_t * payload, size_t length) - ``` +``` Where `WStype_t type` is defined as: - ```c++ +```c++ typedef enum { WStype_ERROR, WStype_DISCONNECTED, @@ -88,13 +100,11 @@ Where `WStype_t type` is defined as: WStype_PING, WStype_PONG, } WStype_t; - ``` +``` ### Issues ### Submit issues to: https://github.com/Links2004/arduinoWebSockets/issues -[![Join the chat at https://gitter.im/Links2004/arduinoWebSockets](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/Links2004/arduinoWebSockets?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - ### License and credits ### The library is licensed under [LGPLv2.1](https://github.com/Links2004/arduinoWebSockets/blob/master/LICENSE) diff --git a/libraries/arduinoWebSockets-2.3.6/examples/Nginx/esp8266.ssl.reverse.proxy.conf b/libraries/arduinoWebSockets-2.5.2/examples/Nginx/esp8266.ssl.reverse.proxy.conf similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/Nginx/esp8266.ssl.reverse.proxy.conf rename to libraries/arduinoWebSockets-2.5.2/examples/Nginx/esp8266.ssl.reverse.proxy.conf diff --git a/libraries/arduinoWebSockets-2.5.2/examples/arduino_renesas/arduino_uno_r4_wifi/arduino_uno_r4_wifi.ino b/libraries/arduinoWebSockets-2.5.2/examples/arduino_renesas/arduino_uno_r4_wifi/arduino_uno_r4_wifi.ino new file mode 100644 index 00000000..2168a629 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/arduino_renesas/arduino_uno_r4_wifi/arduino_uno_r4_wifi.ino @@ -0,0 +1,109 @@ +#include +#include +#include + +#include "WiFiS3.h" +#include + +#define WIFI_SSID "" +#define WIFI_PASS "" + +WebSocketsClient webSocket; + +void webSocketEvent(WStype_t type, uint8_t *payload, size_t length) { + + switch (type) { + case WStype_DISCONNECTED: + Serial.println("[WSc] Disconnected!"); + break; + case WStype_CONNECTED: + Serial.println("[WSc] Connected!"); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + Serial.print("[WSc] get text:"); + Serial.println((char *)payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } +} + +void setup() { + Serial.begin(115200); + + while (!Serial) { + ; // wait for serial port to connect. Needed for native USB port only + } + + Serial.println(); + Serial.println(); + Serial.println(); + + for (uint8_t t = 4; t > 0; t--) { + Serial.println("[SETUP] BOOT WAIT ..."); + Serial.flush(); + delay(1000); + } + + // check for the WiFi module: + if (WiFi.status() == WL_NO_MODULE) { + Serial.println("Communication with WiFi module failed!"); + // don't continue + while (true) + ; + } + + String fv = WiFi.firmwareVersion(); + if (fv < WIFI_FIRMWARE_LATEST_VERSION) { + Serial.println("Please upgrade the firmware"); + } + + Serial.println("[Wifi]: Connecting"); + + int status = WL_IDLE_STATUS; + + // attempt to connect to WiFi network: + while (status != WL_CONNECTED) { + Serial.print("[Wifi]: Attempting to connect to SSID: "); + Serial.println(WIFI_SSID); + + // Connect to WPA/WPA2 network. Change this line if using open or WEP network: + status = WiFi.begin(WIFI_SSID, WIFI_PASS); + + delay(1000); + } + + Serial.println("Connected!"); + + // print your board's IP address: + IPAddress ip = WiFi.localIP(); + Serial.print("IP Address: "); + Serial.println(ip); + + // server address, port and URL + webSocket.begin("192.168.0.123", 8011); + + // event handler + webSocket.onEvent(webSocketEvent); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); +} + +void loop() { + webSocket.loop(); +} \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.3.6/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino b/libraries/arduinoWebSockets-2.5.2/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino rename to libraries/arduinoWebSockets-2.5.2/examples/avr/WebSocketClientAVR/WebSocketClientAVR.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketClient/WebSocketClient.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClient/WebSocketClient.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketClient/WebSocketClient.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClient/WebSocketClient.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSSL/WebSocketClientSSL.ino diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSSLBundle/WebSocketClientSSLBundle.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSSLBundle/WebSocketClientSSLBundle.ino new file mode 100644 index 00000000..f64cc589 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSSLBundle/WebSocketClientSSLBundle.ino @@ -0,0 +1,135 @@ +/* + * main.cpp + * + * Created on: 15.06.2024 + * + */ + +#include +#include +#include + +#include + +// Use the incbin library to embedd the cert binary +// extern const uint8_t rootca_crt_bundle_start[] asm( +// "_binary_data_cert_x509_crt_bundle_bin_start"); + +WiFiMulti wifiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial + +void setClock() { + configTime(0, 0, "pool.ntp.org", "time.nist.gov"); + + USE_SERIAL.print(F("Waiting for NTP time sync: ")); + time_t nowSecs = time(nullptr); + while(nowSecs < 8 * 3600 * 2) { + delay(500); + USE_SERIAL.print(F(".")); + yield(); + nowSecs = time(nullptr); + } + + USE_SERIAL.println(); + struct tm timeinfo; + gmtime_r(&nowSecs, &timeinfo); + USE_SERIAL.print(F("Current time: ")); + USE_SERIAL.print(asctime(&timeinfo)); +} + +void hexdump(const void * mem, uint32_t len, uint8_t cols = 16) { + const uint8_t * src = (const uint8_t *)mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } +} + +void setup() { + USE_SERIAL.begin(115200); + + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + wifiMulti.addAP("SSID", "WIFI_PASSPHRASE"); + + // WiFi.disconnect(); + while(wifiMulti.run() != WL_CONNECTED) { + delay(100); + } + + setClock(); + + // server address, port and URL. This server can be flakey. + // Expected response: Request served by 0123456789abcdef + // webSocket.beginSslWithBundle("echo.websocket.org", 443, "/", rootca_crt_bundle_start, ""); + // ESP32 3.0.4 or higher needs the size of the bundle + // webSocket.beginSslWithBundle("echo.websocket.org", 443, "/", rootca_crt_bundle_start, sizeof(rootca_crt_bundle_start), ""); +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) + webSocket.beginSslWithBundle("echo.websocket.org", 443, "/", NULL, 0, ""); +#else + webSocket.beginSslWithBundle("echo.websocket.org", 443, "/", NULL, ""); +#endif + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional enable if needed + // webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); +} + +void loop() { + webSocket.loop(); +} diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino new file mode 100644 index 00000000..af3572f9 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino @@ -0,0 +1,155 @@ +/* + * WebSocketClientSocketIOack.ino + * + * Created on: 20.07.2019 + * + */ + +#include + +#include +#include +#include + +#include + +#include +#include + +WiFiMulti WiFiMulti; +SocketIOclient socketIO; + +#define USE_SERIAL Serial + + +void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) { + switch(type) { + case sIOtype_DISCONNECT: + USE_SERIAL.printf("[IOc] Disconnected!\n"); + break; + case sIOtype_CONNECT: + USE_SERIAL.printf("[IOc] Connected to url: %s\n", payload); + + // join default namespace (no auto join in Socket.IO V3) + socketIO.send(sIOtype_CONNECT, "/"); + break; + case sIOtype_EVENT: + { + char * sptr = NULL; + int id = strtol((char *)payload, &sptr, 10); + USE_SERIAL.printf("[IOc] get event: %s id: %d\n", payload, id); + if(id) { + payload = (uint8_t *)sptr; + } + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, payload, length); + if(error) { + USE_SERIAL.print(F("deserializeJson() failed: ")); + USE_SERIAL.println(error.c_str()); + return; + } + + String eventName = doc[0]; + USE_SERIAL.printf("[IOc] event name: %s\n", eventName.c_str()); + + // Message Includes a ID for a ACK (callback) + if(id) { + // creat JSON message for Socket.IO (ack) + DynamicJsonDocument docOut(1024); + JsonArray array = docOut.to(); + + // add payload (parameters) for the ack (callback function) + JsonObject param1 = array.createNestedObject(); + param1["now"] = millis(); + + // JSON to String (serializion) + String output; + output += id; + serializeJson(docOut, output); + + // Send event + socketIO.send(sIOtype_ACK, output); + } + } + break; + case sIOtype_ACK: + USE_SERIAL.printf("[IOc] get ack: %u\n", length); + break; + case sIOtype_ERROR: + USE_SERIAL.printf("[IOc] get error: %u\n", length); + break; + case sIOtype_BINARY_EVENT: + USE_SERIAL.printf("[IOc] get binary: %u\n", length); + break; + case sIOtype_BINARY_ACK: + USE_SERIAL.printf("[IOc] get binary ack: %u\n", length); + break; + } +} + +void setup() { + //USE_SERIAL.begin(921600); + USE_SERIAL.begin(115200); + + //Serial.setDebugOutput(true); + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "passpasspass"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + String ip = WiFi.localIP().toString(); + USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); + + // server address, port and URL + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); + + // event handler + socketIO.onEvent(socketIOEvent); +} + +unsigned long messageTimestamp = 0; +void loop() { + socketIO.loop(); + + uint64_t now = millis(); + + if(now - messageTimestamp > 2000) { + messageTimestamp = now; + + // creat JSON message for Socket.IO (event) + DynamicJsonDocument doc(1024); + JsonArray array = doc.to(); + + // add evnet name + // Hint: socket.on('event_name', .... + array.add("event_name"); + + // add payload (parameters) for the event + JsonObject param1 = array.createNestedObject(); + param1["now"] = (uint32_t) now; + + // JSON to String (serializion) + String output; + serializeJson(doc, output); + + // Send event + socketIO.sendEVENT(output); + + // Print JSON for debugging + USE_SERIAL.println(output); + } +} diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketServer/WebSocketServer.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketServer/WebSocketServer.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp32/WebSocketServer/WebSocketServer.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp32/WebSocketServer/WebSocketServer.ino diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/.gitignore b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/.gitignore new file mode 100644 index 00000000..75999378 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/.gitignore @@ -0,0 +1,8 @@ +.pio +.vscode/.browse.c_cpp.db* +.vscode/c_cpp_properties.json +.vscode/launch.json +.vscode/ipch +*secret* +!*secrets.hpp.template +*x509_crt_bundle.bin \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cacrt_all.pem b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cacrt_all.pem new file mode 100644 index 00000000..f78a6101 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cacrt_all.pem @@ -0,0 +1,3581 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Mon Mar 11 15:25:27 2024 GMT +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.29. +## SHA256: 4d96bd539f4719e9ace493757afbe4a23ee8579de1c97fbebc50bba3c12e8c1e +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx +ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6 +XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk +lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB +lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy +lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt +66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn +wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh +D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy +BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie +J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud +DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU +a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT +ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv +Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3 +UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm +VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK ++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW +IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1 +WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X +f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II +4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8 +VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT +EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx +OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM +aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg +DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij +KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K +DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv +BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp +p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8 +nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX +MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM +Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz +uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT +BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj +YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0 +aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB +BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD +VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4 +ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE +AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV +qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s +hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z +POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2 +Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp +8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC +bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu +g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p +vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr +qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto= +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw +EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN +MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp +c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq +t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C +jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg +vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF +ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR +AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend +jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO +peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR +7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi +GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64 +OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov +L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm +5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr +44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf +Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m +Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp +mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk +vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf +KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br +NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj +viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT +BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X +DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3 +aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG +9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644 +N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm ++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH +6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu +MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h +qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5 +FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs +ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc +celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X +CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB +tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0 +cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P +4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F +kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L +3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx +/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa +DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP +e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu +WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ +DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub +DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +======================================== +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG +EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz +MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu +QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ +03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK +ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU ++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC +PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT +OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK +F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK +0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+ +0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB +leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID +AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+ +SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG +NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx +MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l +Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga +kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q +hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs +g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5 +aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5 +nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC +ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo +Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z +WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw== +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM +BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE +AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky +MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz +IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290 +IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ +wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa +by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6 +zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f +YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2 +oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l +EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7 +hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8 +EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5 +jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY +iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt +ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI +WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0 +JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx +K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+ +Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC +4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo +2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz +lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem +OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9 +vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg== +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCBhTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMTE5MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR6FSS0gpWsawNJN3Fz0Rn +dJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8Xpz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZ +FGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+ +5eNu/Nio5JIk2kNrYrhV/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pG +x8cgoLEfZd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z+pUX +2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7wqP/0uK3pN/u6uPQL +OvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZahSL0896+1DSJMwBGB7FY79tOi4lu3 +sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVICu9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+C +GCe01a60y1Dma/RMhnEw6abfFobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5 +WdYgGq/yapiqcrxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvlwFTPoCWOAvn9sKIN9SCYPBMt +rFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+ +nq6PK7o9mfjYcwlYRm6mnPTXJ9OV2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSg +tZx8jb8uk2IntznaFxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwW +sRqZCuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiKboHGhfKp +pC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmckejkk9u+UJueBPSZI9FoJA +zMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yLS0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHq +ZJx64SIDqZxubw5lT2yHh17zbqD5daWbQOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk52 +7RH89elWsn2/x20Kk4yl0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7I +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIIF3jCCA8agAwIBAgIQAf1tMPyjylGoG7xkDjUDLTANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UE +BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQK +ExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCAEmUXNg7D2wiz +0KxXDXbtzSfTTK1Qg2HiqiBNCS1kCdzOiZ/MPans9s/B3PHTsdZ7NygRK0faOca8Ohm0X6a9fZ2j +Y0K2dvKpOyuR+OJv0OwWIJAJPuLodMkYtJHUYmTbf6MG8YgYapAiPLz+E/CHFHv25B+O1ORRxhFn +RghRy4YUVD+8M/5+bJz/Fp0YvVGONaanZshyZ9shZrHUm3gDwFA66Mzw3LyeTP6vBZY1H1dat//O ++T23LLb2VN3I5xI6Ta5MirdcmrS3ID3KfyI0rn47aGYBROcBTkZTmzNg95S+UzeQc0PzMsNT79uq +/nROacdrjGCT3sTHDN/hMq7MkztReJVni+49Vv4M0GkPGw/zJSZrM233bkf6c0Plfg6lZrEpfDKE +Y1WJxA3Bk1QwGROs0303p+tdOmw1XNtB1xLaqUkL39iAigmTYo61Zs8liM2EuLE/pDkP2QKe6xJM +lXzzawWpXhaDzLhn4ugTncxbgtNMs+1b/97lc6wjOy0AvzVVdAlJ2ElYGn+SNuZRkg7zJn0cTRe8 +yexDJtC/QV9AqURE9JnnV4eeUB9XVKg+/XRjL7FQZQnmWEIuQxpMtPAlR1n6BB6T1CZGSlCBst6+ +eLf8ZxXhyVeEHg9j1uliutZfVS7qXMYoCAQlObgOK6nyTJccBz8NUvXt7y+CDwIDAQABo0IwQDAd +BgNVHQ4EFgQUU3m/WqorSs9UgOHYm8Cd8rIDZsswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAFzUfA3P9wF9QZllDHPFUp/L+M+ZBn8b2kMVn54CVVeW +FPFSPCeHlCjtHzoBN6J2/FNQwISbxmtOuowhT6KOVWKR82kV2LyI48SqC/3vqOlLVSoGIG1VeCkZ +7l8wXEskEVX/JJpuXior7gtNn3/3ATiUFJVDBwn7YKnuHKsSjKCaXqeYalltiz8I+8jRRa8YFWSQ +Eg9zKC7F4iRO/Fjs8PRF/iKz6y+O0tlFYQXBl2+odnKPi4w2r78NBc5xjeambx9spnFixdjQg3IM +8WcRiQycE0xyNN+81XHfqnHd4blsjDwSXWXavVcStkNr/+XeTWYRUc+ZruwXtuhxkYzeSf7dNXGi +FSeUHM9h4ya7b6NnJSFd5t0dCy5oGzuCr+yDZ4XUmFF0sbmZgIn/f3gZXHlKYC6SQK5MNyosycdi +yA5d9zZbyuAlJQG03RoHnHcAP9Dc1ew91Pq7P8yF1m9/qS3fuQL39ZeatTXaw2ewh0qpKJ4jjv9c +J2vhsE/zB+4ALtRZh8tSQZXq9EfX7mRBVXyNWQKV3WKdwrnuWih0hKWbt5DHDAff9Yk2dDLWKMGw +sAvgnEzDHNb842m1R0aBL6KCq9NjRHDEjf8tM7qtj3u1cIiuPhnPQCjY/MiQu12ZIvVS5ljFH4gx +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +SZAFIR ROOT CA2 +=============== +-----BEGIN CERTIFICATE----- +MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG +A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV +BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ +BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD +VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q +qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK +DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE +2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ +ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi +ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC +AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5 +O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67 +oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul +4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6 ++/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw== +-----END CERTIFICATE----- + +Certum Trusted Network CA 2 +=========================== +-----BEGIN CERTIFICATE----- +MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE +BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1 +bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y +ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ +TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB +IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9 +7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o +CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b +Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p +uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130 +GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ +9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB +Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye +hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM +BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI +hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW +Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA +L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo +clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM +pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb +w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo +J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm +ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX +is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7 +zAYspsbiDrW5viSP +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2015 +======================================================= +-----BEGIN CERTIFICATE----- +MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT +BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0 +aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl +YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx +MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg +QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV +BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw +MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv +bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh +iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+ +6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd +FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr +i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F +GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2 +fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu +iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc +Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI +hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+ +D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM +d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y +d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn +82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb +davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F +Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt +J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa +JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q +p/UsQu0yrbYhnr68 +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions ECC RootCA 2015 +=========================================================== +-----BEGIN CERTIFICATE----- +MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0 +aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj +aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw +MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj +IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD +VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290 +Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP +dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK +Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O +BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA +GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn +dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR +-----END CERTIFICATE----- + +ISRG Root X1 +============ +-----BEGIN CERTIFICATE----- +MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAwTzELMAkGA1UE +BhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2VhcmNoIEdyb3VwMRUwEwYDVQQD +EwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQG +EwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMT +DElTUkcgUm9vdCBYMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54r +Vygch77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+0TM8ukj1 +3Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6UA5/TR5d8mUgjU+g4rk8K +b4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sWT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCN +Aymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyHB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ +4Q7e2RCOFvu396j3x+UCB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf +1b0SHzUvKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWnOlFu +hjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTnjh8BCNAw1FtxNrQH +usEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbwqHyGO0aoSCqI3Haadr8faqU9GY/r +OPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CIrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4G +A1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY +9umbbjANBgkqhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL +ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ3BebYhtF8GaV +0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KKNFtY2PwByVS5uCbMiogziUwt +hDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJw +TdwJx4nLCgdNbOhdjsnvzqvHu7UrTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nx +e5AW0wdeRlN8NwdCjNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZA +JzVcoyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq4RgqsahD +YVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPAmRGunUHBcnWEvgJBQl9n +JEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57demyPxgcYxn/eR44/KJ4EBs+lVDR3veyJ +m+kXQ99b21/+jh5Xos1AnX5iItreGCc= +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM +================ +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIPXZONMGc2yAYdGsdUhGkHMA0GCSqGSIb3DQEBCwUAMDsxCzAJBgNVBAYT +AkVTMREwDwYDVQQKDAhGTk1ULVJDTTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTAeFw0wODEw +MjkxNTU5NTZaFw0zMDAxMDEwMDAwMDBaMDsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJD +TTEZMBcGA1UECwwQQUMgUkFJWiBGTk1ULVJDTTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBALpxgHpMhm5/yBNtwMZ9HACXjywMI7sQmkCpGreHiPibVmr75nuOi5KOpyVdWRHbNi63URcf +qQgfBBckWKo3Shjf5TnUV/3XwSyRAZHiItQDwFj8d0fsjz50Q7qsNI1NOHZnjrDIbzAzWHFctPVr +btQBULgTfmxKo0nRIBnuvMApGGWn3v7v3QqQIecaZ5JCEJhfTzC8PhxFtBDXaEAUwED653cXeuYL +j2VbPNmaUtu1vZ5Gzz3rkQUCwJaydkxNEJY7kvqcfw+Z374jNUUeAlz+taibmSXaXvMiwzn15Cou +08YfxGyqxRxqAQVKL9LFwag0Jl1mpdICIfkYtwb1TplvqKtMUejPUBjFd8g5CSxJkjKZqLsXF3mw +WsXmo8RZZUc1g16p6DULmbvkzSDGm0oGObVo/CK67lWMK07q87Hj/LaZmtVC+nFNCM+HHmpxffnT +tOmlcYF7wk5HlqX2doWjKI/pgG6BU6VtX7hI+cL5NqYuSf+4lsKMB7ObiFj86xsc3i1w4peSMKGJ +47xVqCfWS+2QrYv6YyVZLag13cqXM7zlzced0ezvXg5KkAYmY6252TUtB7p2ZSysV4999AeU14EC +ll2jB0nVetBX+RvnU0Z1qrB5QstocQjpYL05ac70r8NWQMetUqIJ5G+GR4of6ygnXYMgrwTJbFaa +i0b1AgMBAAGjgYMwgYAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE +FPd9xf3E6Jobd2Sn9R2gzL+HYJptMD4GA1UdIAQ3MDUwMwYEVR0gADArMCkGCCsGAQUFBwIBFh1o +dHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzANBgkqhkiG9w0BAQsFAAOCAgEAB5BK3/MjTvDD +nFFlm5wioooMhfNzKWtN/gHiqQxjAb8EZ6WdmF/9ARP67Jpi6Yb+tmLSbkyU+8B1RXxlDPiyN8+s +D8+Nb/kZ94/sHvJwnvDKuO+3/3Y3dlv2bojzr2IyIpMNOmqOFGYMLVN0V2Ue1bLdI4E7pWYjJ2cJ +j+F3qkPNZVEI7VFY/uY5+ctHhKQV8Xa7pO6kO8Rf77IzlhEYt8llvhjho6Tc+hj507wTmzl6NLrT +Qfv6MooqtyuGC2mDOL7Nii4LcK2NJpLuHvUBKwrZ1pebbuCoGRw6IYsMHkCtA+fdZn71uSANA+iW ++YJF1DngoABd15jmfZ5nc8OaKveri6E6FO80vFIOiZiaBECEHX5FaZNXzuvO+FB8TxxuBEOb+dY7 +Ixjp6o7RTUaN8Tvkasq6+yO3m/qZASlaWFot4/nUbQ4mrcFuNLwy+AwF+mWj2zs3gyLp1txyM/1d +8iC9djwj2ij3+RvrWWTV3F9yfiD8zYm1kGdNYno/Tq0dwzn+evQoFt9B9kiABdcPUXmsEKvU7ANm +5mqwujGSQkBqvjrTcuFqN1W8rB2Vt2lh8kORdOag0wokRqEIr9baRRmW1FMdW4R58MD3R++Lj8UG +rp1MYp3/RgT408m2ECVAdf4WqslKYIYvuu8wd+RU4riEmViAqhOLUTpPSPaLtrM= +-----END CERTIFICATE----- + +Amazon Root CA 1 +================ +-----BEGIN CERTIFICATE----- +MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAxMB4XDTE1 +MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBALJ4gHHKeNXjca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgH +FzZM9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qwIFAGbHrQ +gLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6VOujw5H5SNz/0egwLX0t +dHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L93FcXmn/6pUCyziKrlA4b9v7LWIbxcce +VOF34GfID5yHI9Y/QCB/IIDEgEw+OyQmjgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3 +DQEBCwUAA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDIU5PM +CCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUsN+gDS63pYaACbvXy +8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vvo/ufQJVtMVT8QtPHRh8jrdkPSHCa +2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2 +xJNDd2ZhwLnoQdeXeGADbkpyrqXRfboQnoZsG4q5WTP468SQvvG5 +-----END CERTIFICATE----- + +Amazon Root CA 2 +================ +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwFADA5MQswCQYD +VQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAyMB4XDTE1 +MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpv +bjEZMBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC +ggIBAK2Wny2cSkxKgXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4 +kHbZW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg1dKmSYXp +N+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K8nu+NQWpEjTj82R0Yiw9 +AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvd +fLC6HM783k81ds8P+HgfajZRRidhW+mez/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAEx +kv8LV/SasrlX6avvDXbR8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSS +btqDT6ZjmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz7Mt0 +Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6+XUyo05f7O0oYtlN +c/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI0u1ufm8/0i2BWSlmy5A5lREedCf+ +3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSw +DPBMMPQFWAJI/TPlUq9LhONmUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oA +A7CXDpO8Wqj2LIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY ++gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kSk5Nrp+gvU5LE +YFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl7uxMMne0nxrpS10gxdr9HIcW +xkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygmbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQ +gj9sAq+uEjonljYE1x2igGOpm/HlurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbW +aQbLU8uz/mtBzUF+fUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoV +Yh63n749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE76KlXIx3 +KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H9jVlpNMKVv/1F2Rs76gi +JUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT4PsJYGw= +-----END CERTIFICATE----- + +Amazon Root CA 3 +================ +-----BEGIN CERTIFICATE----- +MIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSAzMB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZB +f8ANm+gBG1bG8lKlui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjr +Zt6jQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSrttvXBp43 +rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkrBqWTrBqYaGFy+uGh0Psc +eGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteMYyRIHN8wfdVoOw== +-----END CERTIFICATE----- + +Amazon Root CA 4 +================ +-----BEGIN CERTIFICATE----- +MIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5MQswCQYDVQQG +EwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24gUm9vdCBDQSA0MB4XDTE1MDUy +NjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZ +MBcGA1UEAxMQQW1hem9uIFJvb3QgQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN +/sGKe0uoe0ZLY7Bi9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri +83BkM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV +HQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WBMAoGCCqGSM49BAMDA2gA +MGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlwCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1 +AE47xDqUEpHJWEadIRNyp4iciuRMStuW1KyLa2tJElMzrdfkviT8tQp21KW8EA== +-----END CERTIFICATE----- + +TUBITAK Kamu SM SSL Kok Sertifikasi - Surum 1 +============================================= +-----BEGIN CERTIFICATE----- +MIIEYzCCA0ugAwIBAgIBATANBgkqhkiG9w0BAQsFADCB0jELMAkGA1UEBhMCVFIxGDAWBgNVBAcT +D0dlYnplIC0gS29jYWVsaTFCMEAGA1UEChM5VHVya2l5ZSBCaWxpbXNlbCB2ZSBUZWtub2xvamlr +IEFyYXN0aXJtYSBLdXJ1bXUgLSBUVUJJVEFLMS0wKwYDVQQLEyRLYW11IFNlcnRpZmlrYXN5b24g +TWVya2V6aSAtIEthbXUgU00xNjA0BgNVBAMTLVRVQklUQUsgS2FtdSBTTSBTU0wgS29rIFNlcnRp +ZmlrYXNpIC0gU3VydW0gMTAeFw0xMzExMjUwODI1NTVaFw00MzEwMjUwODI1NTVaMIHSMQswCQYD +VQQGEwJUUjEYMBYGA1UEBxMPR2ViemUgLSBLb2NhZWxpMUIwQAYDVQQKEzlUdXJraXllIEJpbGlt +c2VsIHZlIFRla25vbG9qaWsgQXJhc3Rpcm1hIEt1cnVtdSAtIFRVQklUQUsxLTArBgNVBAsTJEth +bXUgU2VydGlmaWthc3lvbiBNZXJrZXppIC0gS2FtdSBTTTE2MDQGA1UEAxMtVFVCSVRBSyBLYW11 +IFNNIFNTTCBLb2sgU2VydGlmaWthc2kgLSBTdXJ1bSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAr3UwM6q7a9OZLBI3hNmNe5eA027n/5tQlT6QlVZC1xl8JoSNkvoBHToP4mQ4t4y8 +6Ij5iySrLqP1N+RAjhgleYN1Hzv/bKjFxlb4tO2KRKOrbEz8HdDc72i9z+SqzvBV96I01INrN3wc +wv61A+xXzry0tcXtAA9TNypN9E8Mg/uGz8v+jE69h/mniyFXnHrfA2eJLJ2XYacQuFWQfw4tJzh0 +3+f92k4S400VIgLI4OD8D62K18lUUMw7D8oWgITQUVbDjlZ/iSIzL+aFCr2lqBs23tPcLG07xxO9 +WSMs5uWk99gL7eqQQESolbuT1dCANLZGeA4fAJNG4e7p+exPFwIDAQABo0IwQDAdBgNVHQ4EFgQU +ZT/HiobGPN08VFw1+DrtUgxHV8gwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJ +KoZIhvcNAQELBQADggEBACo/4fEyjq7hmFxLXs9rHmoJ0iKpEsdeV31zVmSAhHqT5Am5EM2fKifh +AHe+SMg1qIGf5LgsyX8OsNJLN13qudULXjS99HMpw+0mFZx+CFOKWI3QSyjfwbPfIPP54+M638yc +lNhOT8NrF7f3cuitZjO1JVOr4PhMqZ398g26rrnZqsZr+ZO7rqu4lzwDGrpDxpa5RXI4s6ehlj2R +e37AIVNMh+3yC1SVUZPVIqUNivGTDj5UDrDYyU7c8jEyVupk+eq1nRZmQnLzf9OxMUP8pI4X8W0j +q5Rm+K37DwhuJi1/FwcJsoz7UMCflo3Ptv0AnVoUmr8CRPXBwp8iXqIPoeM= +-----END CERTIFICATE----- + +GDCA TrustAUTH R5 ROOT +====================== +-----BEGIN CERTIFICATE----- +MIIFiDCCA3CgAwIBAgIIfQmX/vBH6nowDQYJKoZIhvcNAQELBQAwYjELMAkGA1UEBhMCQ04xMjAw +BgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZIENPLixMVEQuMR8wHQYDVQQD +DBZHRENBIFRydXN0QVVUSCBSNSBST09UMB4XDTE0MTEyNjA1MTMxNVoXDTQwMTIzMTE1NTk1OVow +YjELMAkGA1UEBhMCQ04xMjAwBgNVBAoMKUdVQU5HIERPTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZ +IENPLixMVEQuMR8wHQYDVQQDDBZHRENBIFRydXN0QVVUSCBSNSBST09UMIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA2aMW8Mh0dHeb7zMNOwZ+Vfy1YI92hhJCfVZmPoiC7XJjDp6L3TQs +AlFRwxn9WVSEyfFrs0yw6ehGXTjGoqcuEVe6ghWinI9tsJlKCvLriXBjTnnEt1u9ol2x8kECK62p +OqPseQrsXzrj/e+APK00mxqriCZ7VqKChh/rNYmDf1+uKU49tm7srsHwJ5uu4/Ts765/94Y9cnrr +pftZTqfrlYwiOXnhLQiPzLyRuEH3FMEjqcOtmkVEs7LXLM3GKeJQEK5cy4KOFxg2fZfmiJqwTTQJ +9Cy5WmYqsBebnh52nUpmMUHfP/vFBu8btn4aRjb3ZGM74zkYI+dndRTVdVeSN72+ahsmUPI2JgaQ +xXABZG12ZuGR224HwGGALrIuL4xwp9E7PLOR5G62xDtw8mySlwnNR30YwPO7ng/Wi64HtloPzgsM +R6flPri9fcebNaBhlzpBdRfMK5Z3KpIhHtmVdiBnaM8Nvd/WHwlqmuLMc3GkL30SgLdTMEZeS1SZ +D2fJpcjyIMGC7J0R38IC+xo70e0gmu9lZJIQDSri3nDxGGeCjGHeuLzRL5z7D9Ar7Rt2ueQ5Vfj4 +oR24qoAATILnsn8JuLwwoC8N9VKejveSswoAHQBUlwbgsQfZxw9cZX08bVlX5O2ljelAU58VS6Bx +9hoh49pwBiFYFIeFd3mqgnkCAwEAAaNCMEAwHQYDVR0OBBYEFOLJQJ9NzuiaoXzPDj9lxSmIahlR +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQDRSVfg +p8xoWLoBDysZzY2wYUWsEe1jUGn4H3++Fo/9nesLqjJHdtJnJO29fDMylyrHBYZmDRd9FBUb1Ov9 +H5r2XpdptxolpAqzkT9fNqyL7FeoPueBihhXOYV0GkLH6VsTX4/5COmSdI31R9KrO9b7eGZONn35 +6ZLpBN79SWP8bfsUcZNnL0dKt7n/HipzcEYwv1ryL3ml4Y0M2fmyYzeMN2WFcGpcWwlyua1jPLHd ++PwyvzeG5LuOmCd+uh8W4XAR8gPfJWIyJyYYMoSf/wA6E7qaTfRPuBRwIrHKK5DOKcFw9C+df/KQ +HtZa37dG/OaG+svgIHZ6uqbL9XzeYqWxi+7egmaKTjowHz+Ay60nugxe19CxVsp3cbK1daFQqUBD +F8Io2c9Si1vIY9RCPqAzekYu9wogRlR+ak8x8YF+QnQ4ZXMn7sZ8uI7XpTrXmKGcjBBV09tL7ECQ +8s1uV9JiDnxXk7Gnbc2dg7sq5+W2O3FYrf3RRbxake5TFW/TRQl1brqQXR4EzzffHqhmsYzmIGrv +/EhOdJhCrylvLmrH+33RZjEizIYAfmaDDEL0vTSSwxrqT8p+ck0LcIymSLumoRT2+1hEmRSuqguT +aaApJUqlyyvdimYHFngVV3Eb7PVHhPOeMTd61X8kreS8/f3MboPoDKi3QWwH3b08hpcv0g== +-----END CERTIFICATE----- + +SSL.com Root Certification Authority RSA +======================================== +-----BEGIN CERTIFICATE----- +MIIF3TCCA8WgAwIBAgIIeyyb0xaAMpkwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxDjAM +BgNVBAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24x +MTAvBgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EwHhcNMTYw +MjEyMTczOTM5WhcNNDEwMjEyMTczOTM5WjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NM +LmNvbSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFJTQTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAPkP3aMrfcvQKv7sZ4Wm5y4bunfh4/WvpOz6Sl2RxFdHaxh3a3by/ZPkPQ/C +Fp4LZsNWlJ4Xg4XOVu/yFv0AYvUiCVToZRdOQbngT0aXqhvIuG5iXmmxX9sqAn78bMrzQdjt0Oj8 +P2FI7bADFB0QDksZ4LtO7IZl/zbzXmcCC52GVWH9ejjt/uIZALdvoVBidXQ8oPrIJZK0bnoix/ge +oeOy3ZExqysdBP+lSgQ36YWkMyv94tZVNHwZpEpox7Ko07fKoZOI68GXvIz5HdkihCR0xwQ9aqkp +k8zruFvh/l8lqjRYyMEjVJ0bmBHDOJx+PYZspQ9AhnwC9FwCTyjLrnGfDzrIM/4RJTXq/LrFYD3Z +fBjVsqnTdXgDciLKOsMf7yzlLqn6niy2UUb9rwPW6mBo6oUWNmuF6R7As93EJNyAKoFBbZQ+yODJ +gUEAnl6/f8UImKIYLEJAs/lvOCdLToD0PYFH4Ih86hzOtXVcUS4cK38acijnALXRdMbX5J+tB5O2 +UzU1/Dfkw/ZdFr4hc96SCvigY2q8lpJqPvi8ZVWb3vUNiSYE/CUapiVpy8JtynziWV+XrOvvLsi8 +1xtZPCvM8hnIk2snYxnP/Okm+Mpxm3+T/jRnhE6Z6/yzeAkzcLpmpnbtG3PrGqUNxCITIJRWCk4s +bE6x/c+cCbqiM+2HAgMBAAGjYzBhMB0GA1UdDgQWBBTdBAkHovV6fVJTEpKV7jiAJQ2mWTAPBgNV +HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFN0ECQei9Xp9UlMSkpXuOIAlDaZZMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAIBgRlCn7Jp0cHh5wYfGVcpNxJK1ok1iOMq8bs3AD/CUr +dIWQPXhq9LmLpZc7tRiRux6n+UBbkflVma8eEdBcHadm47GUBwwyOabqG7B52B2ccETjit3E+ZUf +ijhDPwGFpUenPUayvOUiaPd7nNgsPgohyC0zrL/FgZkxdMF1ccW+sfAjRfSda/wZY52jvATGGAsl +u1OJD7OAUN5F7kR/q5R4ZJjT9ijdh9hwZXT7DrkT66cPYakylszeu+1jTBi7qUD3oFRuIIhxdRjq +erQ0cuAjJ3dctpDqhiVAq+8zD8ufgr6iIPv2tS0a5sKFsXQP+8hlAqRSAUfdSSLBv9jra6x+3uxj +MxW3IwiPxg+NQVrdjsW5j+VFP3jbutIbQLH+cU0/4IGiul607BXgk90IH37hVZkLId6Tngr75qNJ +vTYw/ud3sqB1l7UtgYgXZSD32pAAn8lSzDLKNXz1PQ/YK9f1JmzJBjSWFupwWRoyeXkLtoh/D1JI +Pb9s2KJELtFOt3JY04kTlf5Eq/jXixtunLwsoFvVagCvXzfh1foQC5ichucmj87w7G6KVwuA406y +wKBjYZC6VWg3dGq2ktufoYYitmUnDuy2n0Jg5GfCtdpBC8TTi2EbvPofkSvXRAdeuims2cXp71NI +WuuA8ShYIc2wBlX7Jz9TkHCpBB5XJ7k= +-----END CERTIFICATE----- + +SSL.com Root Certification Authority ECC +======================================== +-----BEGIN CERTIFICATE----- +MIICjTCCAhSgAwIBAgIIdebfy8FoW6gwCgYIKoZIzj0EAwIwfDELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xMTAv +BgNVBAMMKFNTTC5jb20gUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYwMjEy +MTgxNDAzWhcNNDEwMjEyMTgxNDAzWjB8MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAO +BgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjExMC8GA1UEAwwoU1NMLmNv +bSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BEVuqVDEpiM2nl8ojRfLliJkP9x6jh3MCLOicSS6jkm5BBtHllirLZXI7Z4INcgn64mMU1jrYor+ +8FsPazFSY0E7ic3s7LaNGdM0B9y7xgZ/wkWV7Mt/qCPgCemB+vNH06NjMGEwHQYDVR0OBBYEFILR +hXMw5zUE044CkvvlpNHEIejNMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUgtGFczDnNQTT +jgKS++Wk0cQh6M0wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2cAMGQCMG/n61kRpGDPYbCW +e+0F+S8Tkdzt5fxQaxFGRrMcIQBiu77D5+jNB5n5DQtdcj7EqgIwH7y6C+IwJPt8bYBVCpk+gA0z +5Wajs6O7pdWLjwkspl1+4vAHCGht0nxpbl/f5Wpl +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority RSA R2 +============================================== +-----BEGIN CERTIFICATE----- +MIIF6zCCA9OgAwIBAgIIVrYpzTS8ePYwDQYJKoZIhvcNAQELBQAwgYIxCzAJBgNVBAYTAlVTMQ4w +DAYDVQQIDAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9u +MTcwNQYDVQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIy +MB4XDTE3MDUzMTE4MTQzN1oXDTQyMDUzMDE4MTQzN1owgYIxCzAJBgNVBAYTAlVTMQ4wDAYDVQQI +DAVUZXhhczEQMA4GA1UEBwwHSG91c3RvbjEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMTcwNQYD +VQQDDC5TU0wuY29tIEVWIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBIFIyMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjzZlQOHWTcDXtOlG2mvqM0fNTPl9fb69LT3w23jh +hqXZuglXaO1XPqDQCEGD5yhBJB/jchXQARr7XnAjssufOePPxU7Gkm0mxnu7s9onnQqG6YE3Bf7w +cXHswxzpY6IXFJ3vG2fThVUCAtZJycxa4bH3bzKfydQ7iEGonL3Lq9ttewkfokxykNorCPzPPFTO +Zw+oz12WGQvE43LrrdF9HSfvkusQv1vrO6/PgN3B0pYEW3p+pKk8OHakYo6gOV7qd89dAFmPZiw+ +B6KjBSYRaZfqhbcPlgtLyEDhULouisv3D5oi53+aNxPN8k0TayHRwMwi8qFG9kRpnMphNQcAb9Zh +CBHqurj26bNg5U257J8UZslXWNvNh2n4ioYSA0e/ZhN2rHd9NCSFg83XqpyQGp8hLH94t2S42Oim +9HizVcuE0jLEeK6jj2HdzghTreyI/BXkmg3mnxp3zkyPuBQVPWKchjgGAGYS5Fl2WlPAApiiECto +RHuOec4zSnaqW4EWG7WK2NAAe15itAnWhmMOpgWVSbooi4iTsjQc2KRVbrcc0N6ZVTsj9CLg+Slm +JuwgUHfbSguPvuUCYHBBXtSuUDkiFCbLsjtzdFVHB3mBOagwE0TlBIqulhMlQg+5U8Sb/M3kHN48 ++qvWBkofZ6aYMBzdLNvcGJVXZsb/XItW9XcCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV +HSMEGDAWgBT5YLvU49U09rj1BoAlp3PbRmmonjAdBgNVHQ4EFgQU+WC71OPVNPa49QaAJadz20Zp +qJ4wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBWs47LCp1Jjr+kxJG7ZhcFUZh1 +++VQLHqe8RT6q9OKPv+RKY9ji9i0qVQBDb6Thi/5Sm3HXvVX+cpVHBK+Rw82xd9qt9t1wkclf7nx +Y/hoLVUE0fKNsKTPvDxeH3jnpaAgcLAExbf3cqfeIg29MyVGjGSSJuM+LmOW2puMPfgYCdcDzH2G +guDKBAdRUNf/ktUM79qGn5nX67evaOI5JpS6aLe/g9Pqemc9YmeuJeVy6OLk7K4S9ksrPJ/psEDz +OFSz/bdoyNrGj1E8svuR3Bznm53htw1yj+KkxKl4+esUrMZDBcJlOSgYAsOCsp0FvmXtll9ldDz7 +CTUue5wT/RsPXcdtgTpWD8w74a8CLyKsRspGPKAcTNZEtF4uXBVmCeEmKf7GUmG6sXP/wwyc5Wxq +lD8UykAWlYTzWamsX0xhk23RO8yilQwipmdnRC652dKKQbNmC1r7fSOl8hqw/96bg5Qu0T/fkreR +rwU7ZcegbLHNYhLDkBvjJc40vG93drEQw/cFGsDWr3RiSBd3kmmQYRzelYB0VI8YHMPzA9C/pEN1 +hlMYegouCRw2n5H9gooiS9EOUCXdywMMF8mDAAhONU2Ki+3wApRmLER/y5UnlhetCTCstnEXbosX +9hwJ1C07mKVx01QT2WDz9UtmT/rx7iASjbSsV7FFY6GsdqnC+w== +-----END CERTIFICATE----- + +SSL.com EV Root Certification Authority ECC +=========================================== +-----BEGIN CERTIFICATE----- +MIIClDCCAhqgAwIBAgIILCmcWxbtBZUwCgYIKoZIzj0EAwIwfzELMAkGA1UEBhMCVVMxDjAMBgNV +BAgMBVRleGFzMRAwDgYDVQQHDAdIb3VzdG9uMRgwFgYDVQQKDA9TU0wgQ29ycG9yYXRpb24xNDAy +BgNVBAMMK1NTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBFQ0MwHhcNMTYw +MjEyMTgxNTIzWhcNNDEwMjEyMTgxNTIzWjB/MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMx +EDAOBgNVBAcMB0hvdXN0b24xGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjE0MDIGA1UEAwwrU1NM +LmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQzB2MBAGByqGSM49AgEGBSuB +BAAiA2IABKoSR5CYG/vvw0AHgyBO8TCCogbR8pKGYfL2IWjKAMTH6kMAVIbc/R/fALhBYlzccBYy +3h+Z1MzFB8gIH2EWB1E9fVwHU+M1OIzfzZ/ZLg1KthkuWnBaBu2+8KGwytAJKaNjMGEwHQYDVR0O +BBYEFFvKXuXe0oGqzagtZFG22XKbl+ZPMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUW8pe +5d7SgarNqC1kUbbZcpuX5k8wDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMCA2gAMGUCMQCK5kCJ +N+vp1RPZytRrJPOwPYdGWBrssd9v+1a6cGvHOMzosYxPD/fxZ3YOg9AeUY8CMD32IygmTMZgh5Mm +m7I1HrrW9zzRHM76JTymGoEVW/MSD2zuZYrJh6j5B+BimoxcSg== +-----END CERTIFICATE----- + +GlobalSign Root CA - R6 +======================= +-----BEGIN CERTIFICATE----- +MIIFgzCCA2ugAwIBAgIORea7A4Mzw4VlSOb/RVEwDQYJKoZIhvcNAQEMBQAwTDEgMB4GA1UECxMX +R2xvYmFsU2lnbiBSb290IENBIC0gUjYxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTQxMjEwMDAwMDAwWhcNMzQxMjEwMDAwMDAwWjBMMSAwHgYDVQQLExdHbG9i +YWxTaWduIFJvb3QgQ0EgLSBSNjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFs +U2lnbjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJUH6HPKZvnsFMp7PPcNCPG0RQss +grRIxutbPK6DuEGSMxSkb3/pKszGsIhrxbaJ0cay/xTOURQh7ErdG1rG1ofuTToVBu1kZguSgMpE +3nOUTvOniX9PeGMIyBJQbUJmL025eShNUhqKGoC3GYEOfsSKvGRMIRxDaNc9PIrFsmbVkJq3MQbF +vuJtMgamHvm566qjuL++gmNQ0PAYid/kD3n16qIfKtJwLnvnvJO7bVPiSHyMEAc4/2ayd2F+4OqM +PKq0pPbzlUoSB239jLKJz9CgYXfIWHSw1CM69106yqLbnQneXUQtkPGBzVeS+n68UARjNN9rkxi+ +azayOeSsJDa38O+2HBNXk7besvjihbdzorg1qkXy4J02oW9UivFyVm4uiMVRQkQVlO6jxTiWm05O +WgtH8wY2SXcwvHE35absIQh1/OZhFj931dmRl4QKbNQCTXTAFO39OfuD8l4UoQSwC+n+7o/hbguy +CLNhZglqsQY6ZZZZwPA1/cnaKI0aEYdwgQqomnUdnjqGBQCe24DWJfncBZ4nWUx2OVvq+aWh2IMP +0f/fMBH5hc8zSPXKbWQULHpYT9NLCEnFlWQaYw55PfWzjMpYrZxCRXluDocZXFSxZba/jJvcE+kN +b7gu3GduyYsRtYQUigAZcIN5kZeR1BonvzceMgfYFGM8KEyvAgMBAAGjYzBhMA4GA1UdDwEB/wQE +AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSubAWjkxPioufi1xzWx/B/yGdToDAfBgNV +HSMEGDAWgBSubAWjkxPioufi1xzWx/B/yGdToDANBgkqhkiG9w0BAQwFAAOCAgEAgyXt6NH9lVLN +nsAEoJFp5lzQhN7craJP6Ed41mWYqVuoPId8AorRbrcWc+ZfwFSY1XS+wc3iEZGtIxg93eFyRJa0 +lV7Ae46ZeBZDE1ZXs6KzO7V33EByrKPrmzU+sQghoefEQzd5Mr6155wsTLxDKZmOMNOsIeDjHfrY +BzN2VAAiKrlNIC5waNrlU/yDXNOd8v9EDERm8tLjvUYAGm0CuiVdjaExUd1URhxN25mW7xocBFym +Fe944Hn+Xds+qkxV/ZoVqW/hpvvfcDDpw+5CRu3CkwWJ+n1jez/QcYF8AOiYrg54NMMl+68KnyBr +3TsTjxKM4kEaSHpzoHdpx7Zcf4LIHv5YGygrqGytXm3ABdJ7t+uA/iU3/gKbaKxCXcPu9czc8FB1 +0jZpnOZ7BN9uBmm23goJSFmH63sUYHpkqmlD75HHTOwY3WzvUy2MmeFe8nI+z1TIvWfspA9MRf/T +uTAjB0yPEL+GltmZWrSZVxykzLsViVO6LAUP5MSeGbEYNNVMnbrt9x+vJJUEeKgDu+6B5dpffItK +oZB0JaezPkvILFa9x8jvOOJckvB595yEunQtYQEgfn7R8k8HWV+LLUNS60YMlOH1Zkd5d9VUWx+t +JDfLRVpOoERIyNiwmcUVhAn21klJwGW45hpxbqCo8YLoRT5s1gLXCmeDBVrJpBA= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GC CA +=============================== +-----BEGIN CERTIFICATE----- +MIICaTCCAe+gAwIBAgIQISpWDK7aDKtARb8roi066jAKBggqhkjOPQQDAzBtMQswCQYDVQQGEwJD +SDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEo +MCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQyBDQTAeFw0xNzA1MDkwOTQ4MzRa +Fw00MjA1MDkwOTU4MzNaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYDVQQL +ExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEdsb2Jh +bCBSb290IEdDIENBMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAETOlQwMYPchi82PG6s4nieUqjFqdr +VCTbUf/q9Akkwwsin8tqJ4KBDdLArzHkdIJuyiXZjHWd8dvQmqJLIX4Wp2OQ0jnUsYd4XxiWD1Ab +NTcPasbc2RNNpI6QN+a9WzGRo1QwUjAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUSIcUrOPDnpBgOtfKie7TrYy0UGYwEAYJKwYBBAGCNxUBBAMCAQAwCgYIKoZIzj0E +AwMDaAAwZQIwJsdpW9zV57LnyAyMjMPdeYwbY9XJUpROTYJKcx6ygISpJcBMWm1JKWB4E+J+SOtk +AjEA2zQgMgj/mkkCtojeFK9dbJlxjRo/i9fgojaGHAeCOnZT/cKi7e97sIBPWA9LUzm9 +-----END CERTIFICATE----- + +UCA Global G2 Root +================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIQXd+x2lqj7V2+WmUgZQOQ7zANBgkqhkiG9w0BAQsFADA9MQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxGzAZBgNVBAMMElVDQSBHbG9iYWwgRzIgUm9vdDAeFw0x +NjAzMTEwMDAwMDBaFw00MDEyMzEwMDAwMDBaMD0xCzAJBgNVBAYTAkNOMREwDwYDVQQKDAhVbmlU +cnVzdDEbMBkGA1UEAwwSVUNBIEdsb2JhbCBHMiBSb290MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxeYrb3zvJgUno4Ek2m/LAfmZmqkywiKHYUGRO8vDaBsGxUypK8FnFyIdK+35KYmT +oni9kmugow2ifsqTs6bRjDXVdfkX9s9FxeV67HeToI8jrg4aA3++1NDtLnurRiNb/yzmVHqUwCoV +8MmNsHo7JOHXaOIxPAYzRrZUEaalLyJUKlgNAQLx+hVRZ2zA+te2G3/RVogvGjqNO7uCEeBHANBS +h6v7hn4PJGtAnTRnvI3HLYZveT6OqTwXS3+wmeOwcWDcC/Vkw85DvG1xudLeJ1uK6NjGruFZfc8o +LTW4lVYa8bJYS7cSN8h8s+1LgOGN+jIjtm+3SJUIsUROhYw6AlQgL9+/V087OpAh18EmNVQg7Mc/ +R+zvWr9LesGtOxdQXGLYD0tK3Cv6brxzks3sx1DoQZbXqX5t2Okdj4q1uViSukqSKwxW/YDrCPBe +KW4bHAyvj5OJrdu9o54hyokZ7N+1wxrrFv54NkzWbtA+FxyQF2smuvt6L78RHBgOLXMDj6DlNaBa +4kx1HXHhOThTeEDMg5PXCp6dW4+K5OXgSORIskfNTip1KnvyIvbJvgmRlld6iIis7nCs+dwp4wwc +OxJORNanTrAmyPPZGpeRaOrvjUYG0lZFWJo8DA+DuAUlwznPO6Q0ibd5Ei9Hxeepl2n8pndntd97 +8XplFeRhVmUCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0O +BBYEFIHEjMz15DD/pQwIX4wVZyF0Ad/fMA0GCSqGSIb3DQEBCwUAA4ICAQATZSL1jiutROTL/7lo +5sOASD0Ee/ojL3rtNtqyzm325p7lX1iPyzcyochltq44PTUbPrw7tgTQvPlJ9Zv3hcU2tsu8+Mg5 +1eRfB70VVJd0ysrtT7q6ZHafgbiERUlMjW+i67HM0cOU2kTC5uLqGOiiHycFutfl1qnN3e92mI0A +Ds0b+gO3joBYDic/UvuUospeZcnWhNq5NXHzJsBPd+aBJ9J3O5oUb3n09tDh05S60FdRvScFDcH9 +yBIw7m+NESsIndTUv4BFFJqIRNow6rSn4+7vW4LVPtateJLbXDzz2K36uGt/xDYotgIVilQsnLAX +c47QN6MUPJiVAAwpBVueSUmxX8fjy88nZY41F7dXyDDZQVu5FLbowg+UMaeUmMxq67XhJ/UQqAHo +jhJi6IjMtX9Gl8CbEGY4GjZGXyJoPd/JxhMnq1MGrKI8hgZlb7F+sSlEmqO6SWkoaY/X5V+tBIZk +bxqgDMUIYs6Ao9Dz7GjevjPHF1t/gMRMTLGmhIrDO7gJzRSBuhjjVFc2/tsvfEehOjPI+Vg7RE+x +ygKJBJYoaMVLuCaJu9YzL1DV/pqJuhgyklTGW+Cd+V7lDSKb9triyCGyYiGqhkCyLmTTX8jjfhFn +RR8F/uOi77Oos/N9j/gMHyIfLXC0uAE0djAA5SN4p1bXUB+K+wb1whnw0A== +-----END CERTIFICATE----- + +UCA Extended Validation Root +============================ +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgIQT9Irj/VkyDOeTzRYZiNwYDANBgkqhkiG9w0BAQsFADBHMQswCQYDVQQG +EwJDTjERMA8GA1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9u +IFJvb3QwHhcNMTUwMzEzMDAwMDAwWhcNMzgxMjMxMDAwMDAwWjBHMQswCQYDVQQGEwJDTjERMA8G +A1UECgwIVW5pVHJ1c3QxJTAjBgNVBAMMHFVDQSBFeHRlbmRlZCBWYWxpZGF0aW9uIFJvb3QwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCpCQcoEwKwmeBkqh5DFnpzsZGgdT6o+uM4AHrs +iWogD4vFsJszA1qGxliG1cGFu0/GnEBNyr7uaZa4rYEwmnySBesFK5pI0Lh2PpbIILvSsPGP2KxF +Rv+qZ2C0d35qHzwaUnoEPQc8hQ2E0B92CvdqFN9y4zR8V05WAT558aopO2z6+I9tTcg1367r3CTu +eUWnhbYFiN6IXSV8l2RnCdm/WhUFhvMJHuxYMjMR83dksHYf5BA1FxvyDrFspCqjc/wJHx4yGVMR +59mzLC52LqGj3n5qiAno8geK+LLNEOfic0CTuwjRP+H8C5SzJe98ptfRr5//lpr1kXuYC3fUfugH +0mK1lTnj8/FtDw5lhIpjVMWAtuCeS31HJqcBCF3RiJ7XwzJE+oJKCmhUfzhTA8ykADNkUVkLo4KR +el7sFsLzKuZi2irbWWIQJUoqgQtHB0MGcIfS+pMRKXpITeuUx3BNr2fVUbGAIAEBtHoIppB/TuDv +B0GHr2qlXov7z1CymlSvw4m6WC31MJixNnI5fkkE/SmnTHnkBVfblLkWU41Gsx2VYVdWf6/wFlth +WG82UBEL2KwrlRYaDh8IzTY0ZRBiZtWAXxQgXy0MoHgKaNYs1+lvK9JKBZP8nm9rZ/+I8U6laUpS +NwXqxhaN0sSZ0YIrO7o1dfdRUVjzyAfd5LQDfwIDAQABo0IwQDAdBgNVHQ4EFgQU2XQ65DA9DfcS +3H5aBZ8eNJr34RQwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAYYwDQYJKoZIhvcNAQEL +BQADggIBADaNl8xCFWQpN5smLNb7rhVpLGsaGvdftvkHTFnq88nIua7Mui563MD1sC3AO6+fcAUR +ap8lTwEpcOPlDOHqWnzcSbvBHiqB9RZLcpHIojG5qtr8nR/zXUACE/xOHAbKsxSQVBcZEhrxH9cM +aVr2cXj0lH2RC47skFSOvG+hTKv8dGT9cZr4QQehzZHkPJrgmzI5c6sq1WnIeJEmMX3ixzDx/BR4 +dxIOE/TdFpS/S2d7cFOFyrC78zhNLJA5wA3CXWvp4uXViI3WLL+rG761KIcSF3Ru/H38j9CHJrAb ++7lsq+KePRXBOy5nAliRn+/4Qh8st2j1da3Ptfb/EX3C8CSlrdP6oDyp+l3cpaDvRKS+1ujl5BOW +F3sGPjLtx7dCvHaj2GU4Kzg1USEODm8uNBNA4StnDG1KQTAYI1oyVZnJF+A83vbsea0rWBmirSwi +GpWOvpaQXUJXxPkUAzUrHC1RVwinOt4/5Mi0A3PCwSaAuwtCH60NryZy2sy+s6ODWA2CxR9GUeOc +GMyNm43sSet1UNWMKFnKdDTajAshqx7qG+XH/RU+wBeq+yNuJkbL+vmxcmtpzyKEC2IPrNkZAJSi +djzULZrtBJ4tBmIQN1IchXIbJ+XMxjHsN+xjWZsLHXbMfjKaiJUINlK73nZfdklJrX+9ZSCyycEr +dhh2n1ax +-----END CERTIFICATE----- + +Certigna Root CA +================ +-----BEGIN CERTIFICATE----- +MIIGWzCCBEOgAwIBAgIRAMrpG4nxVQMNo+ZBbcTjpuEwDQYJKoZIhvcNAQELBQAwWjELMAkGA1UE +BhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczEcMBoGA1UECwwTMDAwMiA0ODE0NjMwODEwMDAzNjEZ +MBcGA1UEAwwQQ2VydGlnbmEgUm9vdCBDQTAeFw0xMzEwMDEwODMyMjdaFw0zMzEwMDEwODMyMjda +MFoxCzAJBgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxHDAaBgNVBAsMEzAwMDIgNDgxNDYz +MDgxMDAwMzYxGTAXBgNVBAMMEENlcnRpZ25hIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQDNGDllGlmx6mQWDoyUJJV8g9PFOSbcDO8WV43X2KyjQn+Cyu3NW9sOty3tRQgX +stmzy9YXUnIo245Onoq2C/mehJpNdt4iKVzSs9IGPjA5qXSjklYcoW9MCiBtnyN6tMbaLOQdLNyz +KNAT8kxOAkmhVECe5uUFoC2EyP+YbNDrihqECB63aCPuI9Vwzm1RaRDuoXrC0SIxwoKF0vJVdlB8 +JXrJhFwLrN1CTivngqIkicuQstDuI7pmTLtipPlTWmR7fJj6o0ieD5Wupxj0auwuA0Wv8HT4Ks16 +XdG+RCYyKfHx9WzMfgIhC59vpD++nVPiz32pLHxYGpfhPTc3GGYo0kDFUYqMwy3OU4gkWGQwFsWq +4NYKpkDfePb1BHxpE4S80dGnBs8B92jAqFe7OmGtBIyT46388NtEbVncSVmurJqZNjBBe3YzIoej +wpKGbvlw7q6Hh5UbxHq9MfPU0uWZ/75I7HX1eBYdpnDBfzwboZL7z8g81sWTCo/1VTp2lc5ZmIoJ +lXcymoO6LAQ6l73UL77XbJuiyn1tJslV1c/DeVIICZkHJC1kJWumIWmbat10TWuXekG9qxf5kBdI +jzb5LdXF2+6qhUVB+s06RbFo5jZMm5BX7CO5hwjCxAnxl4YqKE3idMDaxIzb3+KhF1nOJFl0Mdp/ +/TBt2dzhauH8XwIDAQABo4IBGjCCARYwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw +HQYDVR0OBBYEFBiHVuBud+4kNTxOc5of1uHieX4rMB8GA1UdIwQYMBaAFBiHVuBud+4kNTxOc5of +1uHieX4rMEQGA1UdIAQ9MDswOQYEVR0gADAxMC8GCCsGAQUFBwIBFiNodHRwczovL3d3d3cuY2Vy +dGlnbmEuZnIvYXV0b3JpdGVzLzBtBgNVHR8EZjBkMC+gLaArhilodHRwOi8vY3JsLmNlcnRpZ25h +LmZyL2NlcnRpZ25hcm9vdGNhLmNybDAxoC+gLYYraHR0cDovL2NybC5kaGlteW90aXMuY29tL2Nl +cnRpZ25hcm9vdGNhLmNybDANBgkqhkiG9w0BAQsFAAOCAgEAlLieT/DjlQgi581oQfccVdV8AOIt +OoldaDgvUSILSo3L6btdPrtcPbEo/uRTVRPPoZAbAh1fZkYJMyjhDSSXcNMQH+pkV5a7XdrnxIxP +TGRGHVyH41neQtGbqH6mid2PHMkwgu07nM3A6RngatgCdTer9zQoKJHyBApPNeNgJgH60BGM+RFq +7q89w1DTj18zeTyGqHNFkIwgtnJzFyO+B2XleJINugHA64wcZr+shncBlA2c5uk5jR+mUYyZDDl3 +4bSb+hxnV29qao6pK0xXeXpXIs/NX2NGjVxZOob4Mkdio2cNGJHc+6Zr9UhhcyNZjgKnvETq9Emd +8VRY+WCv2hikLyhF3HqgiIZd8zvn/yk1gPxkQ5Tm4xxvvq0OKmOZK8l+hfZx6AYDlf7ej0gcWtSS +6Cvu5zHbugRqh5jnxV/vfaci9wHYTfmJ0A6aBVmknpjZbyvKcL5kwlWj9Omvw5Ip3IgWJJk8jSaY +tlu3zM63Nwf9JtmYhST/WSMDmu2dnajkXjjO11INb9I/bbEFa0nOipFGc/T2L/Coc3cOZayhjWZS +aX5LaAzHHjcng6WMxwLkFM1JAbBzs/3GkDpv0mztO+7skb6iQ12LAEpmJURw3kAP+HwV96LOPNde +E4yBFxgX0b3xdxA61GU5wSesVywlVP+i2k+KYTlerj1KjL0= +-----END CERTIFICATE----- + +emSign Root CA - G1 +=================== +-----BEGIN CERTIFICATE----- +MIIDlDCCAnygAwIBAgIKMfXkYgxsWO3W2DANBgkqhkiG9w0BAQsFADBnMQswCQYDVQQGEwJJTjET +MBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRl +ZDEcMBoGA1UEAxMTZW1TaWduIFJvb3QgQ0EgLSBHMTAeFw0xODAyMTgxODMwMDBaFw00MzAyMTgx +ODMwMDBaMGcxCzAJBgNVBAYTAklOMRMwEQYDVQQLEwplbVNpZ24gUEtJMSUwIwYDVQQKExxlTXVk +aHJhIFRlY2hub2xvZ2llcyBMaW1pdGVkMRwwGgYDVQQDExNlbVNpZ24gUm9vdCBDQSAtIEcxMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAk0u76WaK7p1b1TST0Bsew+eeuGQzf2N4aLTN +LnF115sgxk0pvLZoYIr3IZpWNVrzdr3YzZr/k1ZLpVkGoZM0Kd0WNHVO8oG0x5ZOrRkVUkr+PHB1 +cM2vK6sVmjM8qrOLqs1D/fXqcP/tzxE7lM5OMhbTI0Aqd7OvPAEsbO2ZLIvZTmmYsvePQbAyeGHW +DV/D+qJAkh1cF+ZwPjXnorfCYuKrpDhMtTk1b+oDafo6VGiFbdbyL0NVHpENDtjVaqSW0RM8LHhQ +6DqS0hdW5TUaQBw+jSztOd9C4INBdN+jzcKGYEho42kLVACL5HZpIQ15TjQIXhTCzLG3rdd8cIrH +hQIDAQABo0IwQDAdBgNVHQ4EFgQU++8Nhp6w492pufEhF38+/PB3KxowDgYDVR0PAQH/BAQDAgEG +MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAFn/8oz1h31xPaOfG1vR2vjTnGs2 +vZupYeveFix0PZ7mddrXuqe8QhfnPZHr5X3dPpzxz5KsbEjMwiI/aTvFthUvozXGaCocV685743Q +NcMYDHsAVhzNixl03r4PEuDQqqE/AjSxcM6dGNYIAwlG7mDgfrbESQRRfXBgvKqy/3lyeqYdPV8q ++Mri/Tm3R7nrft8EI6/6nAYH6ftjk4BAtcZsCjEozgyfz7MjNYBBjWzEN3uBL4ChQEKF6dk4jeih +U80Bv2noWgbyRQuQ+q7hv53yrlc8pa6yVvSLZUDp/TGBLPQ5Cdjua6e0ph0VpZj3AYHYhX3zUVxx +iN66zB+Afko= +-----END CERTIFICATE----- + +emSign ECC Root CA - G3 +======================= +-----BEGIN CERTIFICATE----- +MIICTjCCAdOgAwIBAgIKPPYHqWhwDtqLhDAKBggqhkjOPQQDAzBrMQswCQYDVQQGEwJJTjETMBEG +A1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEg +MB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0gRzMwHhcNMTgwMjE4MTgzMDAwWhcNNDMwMjE4 +MTgzMDAwWjBrMQswCQYDVQQGEwJJTjETMBEGA1UECxMKZW1TaWduIFBLSTElMCMGA1UEChMcZU11 +ZGhyYSBUZWNobm9sb2dpZXMgTGltaXRlZDEgMB4GA1UEAxMXZW1TaWduIEVDQyBSb290IENBIC0g +RzMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQjpQy4LRL1KPOxst3iAhKAnjlfSU2fySU0WXTsuwYc +58Byr+iuL+FBVIcUqEqy6HyC5ltqtdyzdc6LBtCGI79G1Y4PPwT01xySfvalY8L1X44uT6EYGQIr +MgqCZH0Wk9GjQjBAMB0GA1UdDgQWBBR8XQKEE9TMipuBzhccLikenEhjQjAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNpADBmAjEAvvNhzwIQHWSVB7gYboiFBS+D +CBeQyh+KTOgNG3qxrdWBCUfvO6wIBHxcmbHtRwfSAjEAnbpV/KlK6O3t5nYBQnvI+GDZjVGLVTv7 +jHvrZQnD+JbNR6iC8hZVdyR+EhCVBCyj +-----END CERTIFICATE----- + +emSign Root CA - C1 +=================== +-----BEGIN CERTIFICATE----- +MIIDczCCAlugAwIBAgILAK7PALrEzzL4Q7IwDQYJKoZIhvcNAQELBQAwVjELMAkGA1UEBhMCVVMx +EzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQDExNlbVNp +Z24gUm9vdCBDQSAtIEMxMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowVjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMRwwGgYDVQQD +ExNlbVNpZ24gUm9vdCBDQSAtIEMxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz+up +ufGZBczYKCFK83M0UYRWEPWgTywS4/oTmifQz/l5GnRfHXk5/Fv4cI7gklL35CX5VIPZHdPIWoU/ +Xse2B+4+wM6ar6xWQio5JXDWv7V7Nq2s9nPczdcdioOl+yuQFTdrHCZH3DspVpNqs8FqOp099cGX +OFgFixwR4+S0uF2FHYP+eF8LRWgYSKVGczQ7/g/IdrvHGPMF0Ybzhe3nudkyrVWIzqa2kbBPrH4V +I5b2P/AgNBbeCsbEBEV5f6f9vtKppa+cxSMq9zwhbL2vj07FOrLzNBL834AaSaTUqZX3noleooms +lMuoaJuvimUnzYnu3Yy1aylwQ6BpC+S5DwIDAQABo0IwQDAdBgNVHQ4EFgQU/qHgcB4qAzlSWkK+ +XJGFehiqTbUwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQAD +ggEBAMJKVvoVIXsoounlHfv4LcQ5lkFMOycsxGwYFYDGrK9HWS8mC+M2sO87/kOXSTKZEhVb3xEp +/6tT+LvBeA+snFOvV71ojD1pM/CjoCNjO2RnIkSt1XHLVip4kqNPEjE2NuLe/gDEo2APJ62gsIq1 +NnpSob0n9CAnYuhNlCQT5AoE6TyrLshDCUrGYQTlSTR+08TI9Q/Aqum6VF7zYytPT1DU/rl7mYw9 +wC68AivTxEDkigcxHpvOJpkT+xHqmiIMERnHXhuBUDDIlhJu58tBf5E7oke3VIAb3ADMmpDqw8NQ +BmIMMMAVSKeoWXzhriKi4gp6D/piq1JM4fHfyr6DDUI= +-----END CERTIFICATE----- + +emSign ECC Root CA - C3 +======================= +-----BEGIN CERTIFICATE----- +MIICKzCCAbGgAwIBAgIKe3G2gla4EnycqDAKBggqhkjOPQQDAzBaMQswCQYDVQQGEwJVUzETMBEG +A1UECxMKZW1TaWduIFBLSTEUMBIGA1UEChMLZU11ZGhyYSBJbmMxIDAeBgNVBAMTF2VtU2lnbiBF +Q0MgUm9vdCBDQSAtIEMzMB4XDTE4MDIxODE4MzAwMFoXDTQzMDIxODE4MzAwMFowWjELMAkGA1UE +BhMCVVMxEzARBgNVBAsTCmVtU2lnbiBQS0kxFDASBgNVBAoTC2VNdWRocmEgSW5jMSAwHgYDVQQD +ExdlbVNpZ24gRUNDIFJvb3QgQ0EgLSBDMzB2MBAGByqGSM49AgEGBSuBBAAiA2IABP2lYa57JhAd +6bciMK4G9IGzsUJxlTm801Ljr6/58pc1kjZGDoeVjbk5Wum739D+yAdBPLtVb4OjavtisIGJAnB9 +SMVK4+kiVCJNk7tCDK93nCOmfddhEc5lx/h//vXyqaNCMEAwHQYDVR0OBBYEFPtaSNCAIEDyqOkA +B2kZd6fmw/TPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gA +MGUCMQC02C8Cif22TGK6Q04ThHK1rt0c3ta13FaPWEBaLd4gTCKDypOofu4SQMfWh0/434UCMBwU +ZOR8loMRnLDRWmFLpg9J0wD8ofzkpf9/rdcw0Md3f76BB1UwUCAU9Vc4CqgxUQ== +-----END CERTIFICATE----- + +Hongkong Post Root CA 3 +======================= +-----BEGIN CERTIFICATE----- +MIIFzzCCA7egAwIBAgIUCBZfikyl7ADJk0DfxMauI7gcWqQwDQYJKoZIhvcNAQELBQAwbzELMAkG +A1UEBhMCSEsxEjAQBgNVBAgTCUhvbmcgS29uZzESMBAGA1UEBxMJSG9uZyBLb25nMRYwFAYDVQQK +Ew1Ib25na29uZyBQb3N0MSAwHgYDVQQDExdIb25na29uZyBQb3N0IFJvb3QgQ0EgMzAeFw0xNzA2 +MDMwMjI5NDZaFw00MjA2MDMwMjI5NDZaMG8xCzAJBgNVBAYTAkhLMRIwEAYDVQQIEwlIb25nIEtv +bmcxEjAQBgNVBAcTCUhvbmcgS29uZzEWMBQGA1UEChMNSG9uZ2tvbmcgUG9zdDEgMB4GA1UEAxMX +SG9uZ2tvbmcgUG9zdCBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz +iNfqzg8gTr7m1gNt7ln8wlffKWihgw4+aMdoWJwcYEuJQwy51BWy7sFOdem1p+/l6TWZ5Mwc50tf +jTMwIDNT2aa71T4Tjukfh0mtUC1Qyhi+AViiE3CWu4mIVoBc+L0sPOFMV4i707mV78vH9toxdCim +5lSJ9UExyuUmGs2C4HDaOym71QP1mbpV9WTRYA6ziUm4ii8F0oRFKHyPaFASePwLtVPLwpgchKOe +sL4jpNrcyCse2m5FHomY2vkALgbpDDtw1VAliJnLzXNg99X/NWfFobxeq81KuEXryGgeDQ0URhLj +0mRiikKYvLTGCAj4/ahMZJx2Ab0vqWwzD9g/KLg8aQFChn5pwckGyuV6RmXpwtZQQS4/t+TtbNe/ +JgERohYpSms0BpDsE9K2+2p20jzt8NYt3eEV7KObLyzJPivkaTv/ciWxNoZbx39ri1UbSsUgYT2u +y1DhCDq+sI9jQVMwCFk8mB13umOResoQUGC/8Ne8lYePl8X+l2oBlKN8W4UdKjk60FSh0Tlxnf0h ++bV78OLgAo9uliQlLKAeLKjEiafv7ZkGL7YKTE/bosw3Gq9HhS2KX8Q0NEwA/RiTZxPRN+ZItIsG +xVd7GYYKecsAyVKvQv83j+GjHno9UKtjBucVtT+2RTeUN7F+8kjDf8V1/peNRY8apxpyKBpADwID +AQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQXnc0e +i9Y5K3DTXNSguB+wAPzFYTAdBgNVHQ4EFgQUF53NHovWOStw01zUoLgfsAD8xWEwDQYJKoZIhvcN +AQELBQADggIBAFbVe27mIgHSQpsY1Q7XZiNc4/6gx5LS6ZStS6LG7BJ8dNVI0lkUmcDrudHr9Egw +W62nV3OZqdPlt9EuWSRY3GguLmLYauRwCy0gUCCkMpXRAJi70/33MvJJrsZ64Ee+bs7Lo3I6LWld +y8joRTnU+kLBEUx3XZL7av9YROXrgZ6voJmtvqkBZss4HTzfQx/0TW60uhdG/H39h4F5ag0zD/ov ++BS5gLNdTaqX4fnkGMX41TiMJjz98iji7lpJiCzfeT2OnpA8vUFKOt1b9pq0zj8lMH8yfaIDlNDc +eqFS3m6TjRgm/VWsvY+b0s+v54Ysyx8Jb6NvqYTUc79NoXQbTiNg8swOqn+knEwlqLJmOzj/2ZQw +9nKEvmhVEA/GcywWaZMH/rFF7buiVWqw2rVKAiUnhde3t4ZEFolsgCs+l6mc1X5VTMbeRRAc6uk7 +nwNT7u56AQIWeNTowr5GdogTPyK7SBIdUgC0An4hGh6cJfTzPV4e0hz5sy229zdcxsshTrD3mUcY +hcErulWuBurQB7Lcq9CClnXO0lD+mefPL5/ndtFhKvshuzHQqp9HpLIiyhY6UFfEW0NnxWViA0kB +60PZ2Pierc+xYw5F9KBaLJstxabArahH9CdMOA0uG0k7UvToiIMrVCjU8jVStDKDYmlkDJGcn5fq +dBb9HxEGmpv0 +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G4 +========================================= +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIRANm1Q3+vqTkPAAAAAFVlrVgwDQYJKoZIhvcNAQELBQAwgb4xCzAJBgNV +BAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3Qu +bmV0L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1 +dGhvcml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eSAtIEc0MB4XDTE1MDUyNzExMTExNloXDTM3MTIyNzExNDExNlowgb4xCzAJBgNVBAYT +AlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0 +L2xlZ2FsLXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxNSBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxMjAwBgNVBAMTKUVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhv +cml0eSAtIEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAsewsQu7i0TD/pZJH4i3D +umSXbcr3DbVZwbPLqGgZ2K+EbTBwXX7zLtJTmeH+H17ZSK9dE43b/2MzTdMAArzE+NEGCJR5WIoV +3imz/f3ET+iq4qA7ec2/a0My3dl0ELn39GjUu9CH1apLiipvKgS1sqbHoHrmSKvS0VnM1n4j5pds +8ELl3FFLFUHtSUrJ3hCX1nbB76W1NhSXNdh4IjVS70O92yfbYVaCNNzLiGAMC1rlLAHGVK/XqsEQ +e9IFWrhAnoanw5CGAlZSCXqc0ieCU0plUmr1POeo8pyvi73TDtTUXm6Hnmo9RR3RXRv06QqsYJn7 +ibT/mCzPfB3pAqoEmh643IhuJbNsZvc8kPNXwbMv9W3y+8qh+CmdRouzavbmZwe+LGcKKh9asj5X +xNMhIWNlUpEbsZmOeX7m640A2Vqq6nPopIICR5b+W45UYaPrL0swsIsjdXJ8ITzI9vF01Bx7owVV +7rtNOzK+mndmnqxpkCIHH2E6lr7lmk/MBTwoWdPBDFSoWWG9yHJM6Nyfh3+9nEg2XpWjDrk4JFX8 +dWbrAuMINClKxuMrLzOg2qOGpRKX/YAr2hRC45K9PvJdXmd0LhyIRyk0X+IyqJwlN4y6mACXi0mW +Hv0liqzc2thddG5msP9E36EYxr5ILzeUePiVSj9/E15dWf10hkNjc0kCAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJ84xFYjwznooHFs6FRM5Og6sb9n +MA0GCSqGSIb3DQEBCwUAA4ICAQAS5UKme4sPDORGpbZgQIeMJX6tuGguW8ZAdjwD+MlZ9POrYs4Q +jbRaZIxowLByQzTSGwv2LFPSypBLhmb8qoMi9IsabyZIrHZ3CL/FmFz0Jomee8O5ZDIBf9PD3Vht +7LGrhFV0d4QEJ1JrhkzO3bll/9bGXp+aEJlLdWr+aumXIOTkdnrG0CSqkM0gkLpHZPt/B7NTeLUK +YvJzQ85BK4FqLoUWlFPUa19yIqtRLULVAJyZv967lDtX/Zr1hstWO1uIAeV8KEsD+UmDfLJ/fOPt +jqF/YFOOVZ1QNBIPt5d7bIdKROf1beyAN/BYGW5KaHbwH5Lk6rWS02FREAutp9lfx1/cH6NcjKF+ +m7ee01ZvZl4HliDtC3T7Zk6LERXpgUl+b7DUUH8i119lAg2m9IUe2K4GS0qn0jFmwvjO5QimpAKW +RGhXxNUzzxkvFMSUHHuk2fCfDrGA4tGeEWSpiBE6doLlYsKA2KSD7ZPvfC+QsDJMlhVoSFLUmQjA +JOgc47OlIQ6SwJAfzyBfyjs4x7dtOvPmRLgOMWuIjnDrnBdSqEGULoe256YSxXXfW8AKbnuk5F6G ++TaU33fD6Q3AOfF5u0aOq0NZJ7cguyPpVkAh7DE9ZapD8j3fcEThuk0mEDuYn/PIjhs4ViFqUZPT +kcpG2om3PVODLAgfi49T3f+sHw== +-----END CERTIFICATE----- + +Microsoft ECC Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIICWTCCAd+gAwIBAgIQZvI9r4fei7FK6gxXMQHC7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQgRUND +IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjMwNjQ1WhcNNDIwNzE4 +MjMxNjA0WjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYw +NAYDVQQDEy1NaWNyb3NvZnQgRUNDIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAATUvD0CQnVBEyPNgASGAlEvaqiBYgtlzPbKnR5vSmZRogPZnZH6 +thaxjG7efM3beaYvzrvOcS/lpaso7GMEZpn4+vKTEAXhgShC48Zo9OYbhGBKia/teQ87zvH2RPUB +eMCjVDBSMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIy5lycFIM ++Oa+sgRXKSrPQhDtNTAQBgkrBgEEAYI3FQEEAwIBADAKBggqhkjOPQQDAwNoADBlAjBY8k3qDPlf +Xu5gKcs68tvWMoQZP3zVL8KxzJOuULsJMsbG7X7JNpQS5GiFBqIb0C8CMQCZ6Ra0DvpWSNSkMBaR +eNtUjGUBiudQZsIxtzm6uBoiB078a1QWIP8rtedMDE2mT3M= +-----END CERTIFICATE----- + +Microsoft RSA Root Certificate Authority 2017 +============================================= +-----BEGIN CERTIFICATE----- +MIIFqDCCA5CgAwIBAgIQHtOXCV/YtLNHcB6qvn9FszANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQG +EwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTYwNAYDVQQDEy1NaWNyb3NvZnQg +UlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcwHhcNMTkxMjE4MjI1MTIyWhcNNDIw +NzE4MjMwMDIzWjBlMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u +MTYwNAYDVQQDEy1NaWNyb3NvZnQgUlNBIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTcw +ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKW76UM4wplZEWCpW9R2LBifOZNt9GkMml +7Xhqb0eRaPgnZ1AzHaGm++DlQ6OEAlcBXZxIQIJTELy/xztokLaCLeX0ZdDMbRnMlfl7rEqUrQ7e +S0MdhweSE5CAg2Q1OQT85elss7YfUJQ4ZVBcF0a5toW1HLUX6NZFndiyJrDKxHBKrmCk3bPZ7Pw7 +1VdyvD/IybLeS2v4I2wDwAW9lcfNcztmgGTjGqwu+UcF8ga2m3P1eDNbx6H7JyqhtJqRjJHTOoI+ +dkC0zVJhUXAoP8XFWvLJjEm7FFtNyP9nTUwSlq31/niol4fX/V4ggNyhSyL71Imtus5Hl0dVe49F +yGcohJUcaDDv70ngNXtk55iwlNpNhTs+VcQor1fznhPbRiefHqJeRIOkpcrVE7NLP8TjwuaGYaRS +MLl6IE9vDzhTyzMMEyuP1pq9KsgtsRx9S1HKR9FIJ3Jdh+vVReZIZZ2vUpC6W6IYZVcSn2i51BVr +lMRpIpj0M+Dt+VGOQVDJNE92kKz8OMHY4Xu54+OU4UZpyw4KUGsTuqwPN1q3ErWQgR5WrlcihtnJ +0tHXUeOrO8ZV/R4O03QK0dqq6mm4lyiPSMQH+FJDOvTKVTUssKZqwJz58oHhEmrARdlns87/I6KJ +ClTUFLkqqNfs+avNJVgyeY+QW5g5xAgGwax/Dj0ApQIDAQABo1QwUjAOBgNVHQ8BAf8EBAMCAYYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUCctZf4aycI8awznjwNnpv7tNsiMwEAYJKwYBBAGC +NxUBBAMCAQAwDQYJKoZIhvcNAQEMBQADggIBAKyvPl3CEZaJjqPnktaXFbgToqZCLgLNFgVZJ8og +6Lq46BrsTaiXVq5lQ7GPAJtSzVXNUzltYkyLDVt8LkS/gxCP81OCgMNPOsduET/m4xaRhPtthH80 +dK2Jp86519efhGSSvpWhrQlTM93uCupKUY5vVau6tZRGrox/2KJQJWVggEbbMwSubLWYdFQl3JPk ++ONVFT24bcMKpBLBaYVu32TxU5nhSnUgnZUP5NbcA/FZGOhHibJXWpS2qdgXKxdJ5XbLwVaZOjex +/2kskZGT4d9Mozd2TaGf+G0eHdP67Pv0RR0Tbc/3WeUiJ3IrhvNXuzDtJE3cfVa7o7P4NHmJweDy +AmH3pvwPuxwXC65B2Xy9J6P9LjrRk5Sxcx0ki69bIImtt2dmefU6xqaWM/5TkshGsRGRxpl/j8nW +ZjEgQRCHLQzWwa80mMpkg/sTV9HB8Dx6jKXB/ZUhoHHBk2dxEuqPiAppGWSZI1b7rCoucL5mxAyE +7+WL85MB+GqQk2dLsmijtWKP6T+MejteD+eMuMZ87zf9dOLITzNy4ZQ5bb0Sr74MTnB8G2+NszKT +c0QWbej09+CVgI+WXTik9KveCjCHk9hNAHFiRSdLOkKEW39lt2c0Ui2cFmuqqNh7o0JMcccMyj6D +5KbvtwEwXlGjefVwaaZBRA+GsCyRxj3qrg+E +-----END CERTIFICATE----- + +e-Szigno Root CA 2017 +===================== +-----BEGIN CERTIFICATE----- +MIICQDCCAeWgAwIBAgIMAVRI7yH9l1kN9QQKMAoGCCqGSM49BAMCMHExCzAJBgNVBAYTAkhVMREw +DwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UECgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUt +MjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3ppZ25vIFJvb3QgQ0EgMjAxNzAeFw0xNzA4MjIxMjA3MDZa +Fw00MjA4MjIxMjA3MDZaMHExCzAJBgNVBAYTAkhVMREwDwYDVQQHDAhCdWRhcGVzdDEWMBQGA1UE +CgwNTWljcm9zZWMgTHRkLjEXMBUGA1UEYQwOVkFUSFUtMjM1ODQ0OTcxHjAcBgNVBAMMFWUtU3pp +Z25vIFJvb3QgQ0EgMjAxNzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABJbcPYrYsHtvxie+RJCx +s1YVe45DJH0ahFnuY2iyxl6H0BVIHqiQrb1TotreOpCmYF9oMrWGQd+HWyx7xf58etqjYzBhMA8G +A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSHERUI0arBeAyxr87GyZDv +vzAEwDAfBgNVHSMEGDAWgBSHERUI0arBeAyxr87GyZDvvzAEwDAKBggqhkjOPQQDAgNJADBGAiEA +tVfd14pVCzbhhkT61NlojbjcI4qKDdQvfepz7L9NbKgCIQDLpbQS+ue16M9+k/zzNY9vTlp8tLxO +svxyqltZ+efcMQ== +-----END CERTIFICATE----- + +certSIGN Root CA G2 +=================== +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIJEQA0tk7GNi02MA0GCSqGSIb3DQEBCwUAMEExCzAJBgNVBAYTAlJPMRQw +EgYDVQQKEwtDRVJUU0lHTiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjAeFw0xNzAy +MDYwOTI3MzVaFw00MjAyMDYwOTI3MzVaMEExCzAJBgNVBAYTAlJPMRQwEgYDVQQKEwtDRVJUU0lH +TiBTQTEcMBoGA1UECxMTY2VydFNJR04gUk9PVCBDQSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAMDFdRmRfUR0dIf+DjuW3NgBFszuY5HnC2/OOwppGnzC46+CjobXXo9X69MhWf05 +N0IwvlDqtg+piNguLWkh59E3GE59kdUWX2tbAMI5Qw02hVK5U2UPHULlj88F0+7cDBrZuIt4Imfk +abBoxTzkbFpG583H+u/E7Eu9aqSs/cwoUe+StCmrqzWaTOTECMYmzPhpn+Sc8CnTXPnGFiWeI8Mg +wT0PPzhAsP6CRDiqWhqKa2NYOLQV07YRaXseVO6MGiKscpc/I1mbySKEwQdPzH/iV8oScLumZfNp +dWO9lfsbl83kqK/20U6o2YpxJM02PbyWxPFsqa7lzw1uKA2wDrXKUXt4FMMgL3/7FFXhEZn91Qqh +ngLjYl/rNUssuHLoPj1PrCy7Lobio3aP5ZMqz6WryFyNSwb/EkaseMsUBzXgqd+L6a8VTxaJW732 +jcZZroiFDsGJ6x9nxUWO/203Nit4ZoORUSs9/1F3dmKh7Gc+PoGD4FapUB8fepmrY7+EF3fxDTvf +95xhszWYijqy7DwaNz9+j5LP2RIUZNoQAhVB/0/E6xyjyfqZ90bp4RjZsbgyLcsUDFDYg2WD7rlc +z8sFWkz6GZdr1l0T08JcVLwyc6B49fFtHsufpaafItzRUZ6CeWRgKRM+o/1Pcmqr4tTluCRVLERL +iohEnMqE0yo7AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1Ud +DgQWBBSCIS1mxteg4BXrzkwJd8RgnlRuAzANBgkqhkiG9w0BAQsFAAOCAgEAYN4auOfyYILVAzOB +ywaK8SJJ6ejqkX/GM15oGQOGO0MBzwdw5AgeZYWR5hEit/UCI46uuR59H35s5r0l1ZUa8gWmr4UC +b6741jH/JclKyMeKqdmfS0mbEVeZkkMR3rYzpMzXjWR91M08KCy0mpbqTfXERMQlqiCA2ClV9+BB +/AYm/7k29UMUA2Z44RGx2iBfRgB4ACGlHgAoYXhvqAEBj500mv/0OJD7uNGzcgbJceaBxXntC6Z5 +8hMLnPddDnskk7RI24Zf3lCGeOdA5jGokHZwYa+cNywRtYK3qq4kNFtyDGkNzVmf9nGvnAvRCjj5 +BiKDUyUM/FHE5r7iOZULJK2v0ZXkltd0ZGtxTgI8qoXzIKNDOXZbbFD+mpwUHmUUihW9o4JFWklW +atKcsWMy5WHgUyIOpwpJ6st+H6jiYoD2EEVSmAYY3qXNL3+q1Ok+CHLsIwMCPKaq2LxndD0UF/tU +Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M +NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N +0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc= +-----END CERTIFICATE----- + +Trustwave Global Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIF2jCCA8KgAwIBAgIMBfcOhtpJ80Y1LrqyMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0xNzA4MjMxOTM0MTJaFw00MjA4MjMxOTM0MTJaMIGIMQswCQYDVQQGEwJV +UzERMA8GA1UECAwISWxsaW5vaXMxEDAOBgNVBAcMB0NoaWNhZ28xITAfBgNVBAoMGFRydXN0d2F2 +ZSBIb2xkaW5ncywgSW5jLjExMC8GA1UEAwwoVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALldUShLPDeS0YLOvR29 +zd24q88KPuFd5dyqCblXAj7mY2Hf8g+CY66j96xz0XznswuvCAAJWX/NKSqIk4cXGIDtiLK0thAf +LdZfVaITXdHG6wZWiYj+rDKd/VzDBcdu7oaJuogDnXIhhpCujwOl3J+IKMujkkkP7NAP4m1ET4Bq +stTnoApTAbqOl5F2brz81Ws25kCI1nsvXwXoLG0R8+eyvpJETNKXpP7ScoFDB5zpET71ixpZfR9o +WN0EACyW80OzfpgZdNmcc9kYvkHHNHnZ9GLCQ7mzJ7Aiy/k9UscwR7PJPrhq4ufogXBeQotPJqX+ +OsIgbrv4Fo7NDKm0G2x2EOFYeUY+VM6AqFcJNykbmROPDMjWLBz7BegIlT1lRtzuzWniTY+HKE40 +Cz7PFNm73bZQmq131BnW2hqIyE4bJ3XYsgjxroMwuREOzYfwhI0Vcnyh78zyiGG69Gm7DIwLdVcE +uE4qFC49DxweMqZiNu5m4iK4BUBjECLzMx10coos9TkpoNPnG4CELcU9402x/RpvumUHO1jsQkUm ++9jaJXLE9gCxInm943xZYkqcBW89zubWR2OZxiRvchLIrH+QtAuRcOi35hYQcRfO3gZPSEF9NUqj +ifLJS3tBEW1ntwiYTOURGa5CgNz7kAXU+FDKvuStx8KU1xad5hePrzb7AgMBAAGjQjBAMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFJngGWcNYtt2s9o9uFvo/ULSMQ6HMA4GA1UdDwEB/wQEAwIB +BjANBgkqhkiG9w0BAQsFAAOCAgEAmHNw4rDT7TnsTGDZqRKGFx6W0OhUKDtkLSGm+J1WE2pIPU/H +PinbbViDVD2HfSMF1OQc3Og4ZYbFdada2zUFvXfeuyk3QAUHw5RSn8pk3fEbK9xGChACMf1KaA0H +ZJDmHvUqoai7PF35owgLEQzxPy0QlG/+4jSHg9bP5Rs1bdID4bANqKCqRieCNqcVtgimQlRXtpla +4gt5kNdXElE1GYhBaCXUNxeEFfsBctyV3lImIJgm4nb1J2/6ADtKYdkNy1GTKv0WBpanI5ojSP5R +vbbEsLFUzt5sQa0WZ37b/TjNuThOssFgy50X31ieemKyJo90lZvkWx3SD92YHJtZuSPTMaCm/zjd +zyBP6VhWOmfD0faZmZ26NraAL4hHT4a/RDqA5Dccprrql5gR0IRiR2Qequ5AvzSxnI9O4fKSTx+O +856X3vOmeWqJcU9LJxdI/uz0UA9PSX3MReO9ekDFQdxhVicGaeVyQYHTtgGJoC86cnn+OjC/QezH +Yj6RS8fZMXZC+fc8Y+wmjHMMfRod6qh8h6jCJ3zhM0EPz8/8AKAigJ5Kp28AsEFFtyLKaEjFQqKu +3R3y4G5OBVixwJAWKqQ9EEC+j2Jjg6mcgn0tAumDMHzLJ8n9HmYAsC7TIS+OMxZsmO0QqAfWzJPP +29FpHOTKyeC2nOnOcXHebD8WpHk= +-----END CERTIFICATE----- + +Trustwave Global ECC P256 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1 +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7 +-----END CERTIFICATE----- + +Trustwave Global ECC P384 Certification Authority +================================================= +-----BEGIN CERTIFICATE----- +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4 +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw== +-----END CERTIFICATE----- + +NAVER Global Root Certification Authority +========================================= +-----BEGIN CERTIFICATE----- +MIIFojCCA4qgAwIBAgIUAZQwHqIL3fXFMyqxQ0Rx+NZQTQ0wDQYJKoZIhvcNAQEMBQAwaTELMAkG +A1UEBhMCS1IxJjAkBgNVBAoMHU5BVkVSIEJVU0lORVNTIFBMQVRGT1JNIENvcnAuMTIwMAYDVQQD +DClOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MTgwODU4 +NDJaFw0zNzA4MTgyMzU5NTlaMGkxCzAJBgNVBAYTAktSMSYwJAYDVQQKDB1OQVZFUiBCVVNJTkVT +UyBQTEFURk9STSBDb3JwLjEyMDAGA1UEAwwpTkFWRVIgR2xvYmFsIFJvb3QgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC21PGTXLVAiQqrDZBb +UGOukJR0F0Vy1ntlWilLp1agS7gvQnXp2XskWjFlqxcX0TM62RHcQDaH38dq6SZeWYp34+hInDEW ++j6RscrJo+KfziFTowI2MMtSAuXaMl3Dxeb57hHHi8lEHoSTGEq0n+USZGnQJoViAbbJAh2+g1G7 +XNr4rRVqmfeSVPc0W+m/6imBEtRTkZazkVrd/pBzKPswRrXKCAfHcXLJZtM0l/aM9BhK4dA9WkW2 +aacp+yPOiNgSnABIqKYPszuSjXEOdMWLyEz59JuOuDxp7W87UC9Y7cSw0BwbagzivESq2M0UXZR4 +Yb8ObtoqvC8MC3GmsxY/nOb5zJ9TNeIDoKAYv7vxvvTWjIcNQvcGufFt7QSUqP620wbGQGHfnZ3z +VHbOUzoBppJB7ASjjw2i1QnK1sua8e9DXcCrpUHPXFNwcMmIpi3Ua2FzUCaGYQ5fG8Ir4ozVu53B +A0K6lNpfqbDKzE0K70dpAy8i+/Eozr9dUGWokG2zdLAIx6yo0es+nPxdGoMuK8u180SdOqcXYZai +cdNwlhVNt0xz7hlcxVs+Qf6sdWA7G2POAN3aCJBitOUt7kinaxeZVL6HSuOpXgRM6xBtVNbv8ejy +YhbLgGvtPe31HzClrkvJE+2KAQHJuFFYwGY6sWZLxNUxAmLpdIQM201GLQIDAQABo0IwQDAdBgNV +HQ4EFgQU0p+I36HNLL3s9TsBAZMzJ7LrYEswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMB +Af8wDQYJKoZIhvcNAQEMBQADggIBADLKgLOdPVQG3dLSLvCkASELZ0jKbY7gyKoNqo0hV4/GPnrK +21HUUrPUloSlWGB/5QuOH/XcChWB5Tu2tyIvCZwTFrFsDDUIbatjcu3cvuzHV+YwIHHW1xDBE1UB +jCpD5EHxzzp6U5LOogMFDTjfArsQLtk70pt6wKGm+LUx5vR1yblTmXVHIloUFcd4G7ad6Qz4G3bx +hYTeodoS76TiEJd6eN4MUZeoIUCLhr0N8F5OSza7OyAfikJW4Qsav3vQIkMsRIz75Sq0bBwcupTg +E34h5prCy8VCZLQelHsIJchxzIdFV4XTnyliIoNRlwAYl3dqmJLJfGBs32x9SuRwTMKeuB330DTH +D8z7p/8Dvq1wkNoL3chtl1+afwkyQf3NosxabUzyqkn+Zvjp2DXrDige7kgvOtB5CTh8piKCk5XQ +A76+AqAF3SAi428diDRgxuYKuQl1C/AH6GmWNcf7I4GOODm4RStDeKLRLBT/DShycpWbXgnbiUSY +qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG +I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg +kpzNNIaRkPpkUZ3+/uul9XXeifdy +-----END CERTIFICATE----- + +AC RAIZ FNMT-RCM SERVIDORES SEGUROS +=================================== +-----BEGIN CERTIFICATE----- +MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF +UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy +NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4 +MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt +UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB +QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA +BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2 +LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG +SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD +zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c= +-----END CERTIFICATE----- + +GlobalSign Root R46 +=================== +-----BEGIN CERTIFICATE----- +MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv +b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX +BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi +MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es +CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/ +r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje +2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt +bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj +K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4 +12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on +ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls +eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9 +vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM +BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg +JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy +gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92 +CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm +OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq +JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye +qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz +nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7 +DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3 +QEUxeCp6 +-----END CERTIFICATE----- + +GlobalSign Root E46 +=================== +-----BEGIN CERTIFICATE----- +MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT +AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg +RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV +BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq +hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB +jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj +QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL +gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk +vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+ +CAezNIm8BZ/3Hobui3A= +-----END CERTIFICATE----- + +GLOBALTRUST 2020 +================ +-----BEGIN CERTIFICATE----- +MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx +IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT +VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh +BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy +MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi +D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO +VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM +CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm +fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA +A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR +JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG +DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU +clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ +mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud +IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA +VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw +4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9 +iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS +8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2 +HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS +vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918 +oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF +YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl +gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg== +-----END CERTIFICATE----- + +ANF Secure Server Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4 +NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv +bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg +Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw +MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw +EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz +BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv +T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv +B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse +zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM +VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j +7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z +JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe +8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO +Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj +o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ +UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx +j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt +dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM +5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb +5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54 +EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H +hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy +g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3 +r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw= +-----END CERTIFICATE----- + +Certum EC-384 CA +================ +-----BEGIN CERTIFICATE----- +MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ +TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy +dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2 +MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh +dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx +GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq +vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn +iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo +ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0 +QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k= +-----END CERTIFICATE----- + +Certum Trusted Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG +EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew +HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY +QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p +fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52 +HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2 +fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt +g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4 +NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk +fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ +P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY +njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK +HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1 +vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL +LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s +ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K +h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8 +CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA +4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo +WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj +6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT +OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck +bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb +-----END CERTIFICATE----- + +TunTrust Root CA +================ +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG +A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj +dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw +NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD +ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz +2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b +bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7 +NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd +gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW +VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f +Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ +juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas +DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS +VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI +04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0 +90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl +0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd +Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY +YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp +adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x +xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP +jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM +MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z +ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r +AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o= +-----END CERTIFICATE----- + +HARICA TLS RSA Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG +EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u +cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz +OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl +bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB +IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN +JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu +a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y +Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K +5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv +dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR +0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH +GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm +haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ +CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G +A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE +AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU +EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq +QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD +QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR +j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5 +vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0 +qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6 +Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/ +PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn +kf3/W9b3raYvAwtt41dU63ZTGI0RmLo= +-----END CERTIFICATE----- + +HARICA TLS ECC Root CA 2021 +=========================== +-----BEGIN CERTIFICATE----- +MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH +UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD +QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX +DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj +IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv +b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l +AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b +ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW +0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi +rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw +CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIG3Dp0v+ubHEwDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0xNDA5MjMxNTIyMDdaFw0zNjA1MDUxNTIyMDdaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMB0GA1Ud +DgQWBBRlzeurNR4APn7VdMActHNHDhpkLzASBgNVHRMBAf8ECDAGAQH/AgEBMIGmBgNVHSAEgZ4w +gZswgZgGBFUdIAAwgY8wLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuZmlybWFwcm9mZXNpb25hbC5j +b20vY3BzMFwGCCsGAQUFBwICMFAeTgBQAGEAcwBlAG8AIABkAGUAIABsAGEAIABCAG8AbgBhAG4A +bwB2AGEAIAA0ADcAIABCAGEAcgBjAGUAbABvAG4AYQAgADAAOAAwADEANzAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggIBAHSHKAIrdx9miWTtj3QuRhy7qPj4Cx2Dtjqn6EWKB7fgPiDL +4QjbEwj4KKE1soCzC1HA01aajTNFSa9J8OA9B3pFE1r/yJfY0xgsfZb43aJlQ3CTkBW6kN/oGbDb +LIpgD7dvlAceHabJhfa9NPhAeGIQcDq+fUs5gakQ1JZBu/hfHAsdCPKxsIl68veg4MSPi3i1O1il +I45PVf42O+AMt8oqMEEgtIDNrvx2ZnOorm7hfNoD6JQg5iKj0B+QXSBTFCZX2lSX3xZEEAEeiGaP +cjiT3SC3NL7X8e5jjkd5KAb881lFJWAiMxujX6i6KtoaPc1A6ozuBRWV1aUsIC+nmCjuRfzxuIgA +LI9C2lHVnOUTaHFFQ4ueCyE8S1wF3BqfmI7avSKecs2tCsvMo2ebKHTEm9caPARYpoKdrcd7b/+A +lun4jWq9GJAd/0kakFI3ky88Al2CdgtR5xbHV/g4+afNmyJU72OwFW1TZQNKXkqgsqeOSQBZONXH +9IBk9W6VULgRfhVwOEqwf9DEMnDAGf/JOC0ULGb0QkTmVXYbgBVX/8Cnp6o5qtjTcNAuuuuUavpf +NIbnYrX9ivAwhZTJryQCL2/W3Wf+47BVTwSYT6RBVuKT0Gro1vP7ZeDOdcQxWQzugsgMYDNKGbqE +ZycPvEJdvSRUDewdcAZfpLz6IHxV +-----END CERTIFICATE----- + +vTrus ECC Root CA +================= +-----BEGIN CERTIFICATE----- +MIICDzCCAZWgAwIBAgIUbmq8WapTvpg5Z6LSa6Q75m0c1towCgYIKoZIzj0EAwMwRzELMAkGA1UE +BhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBS +b290IENBMB4XDTE4MDczMTA3MjY0NFoXDTQzMDczMTA3MjY0NFowRzELMAkGA1UEBhMCQ04xHDAa +BgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xGjAYBgNVBAMTEXZUcnVzIEVDQyBSb290IENBMHYw +EAYHKoZIzj0CAQYFK4EEACIDYgAEZVBKrox5lkqqHAjDo6LN/llWQXf9JpRCux3NCNtzslt188+c +ToL0v/hhJoVs1oVbcnDS/dtitN9Ti72xRFhiQgnH+n9bEOf+QP3A2MMrMudwpremIFUde4BdS49n +TPEQo0IwQDAdBgNVHQ4EFgQUmDnNvtiyjPeyq+GtJK97fKHbH88wDwYDVR0TAQH/BAUwAwEB/zAO +BgNVHQ8BAf8EBAMCAQYwCgYIKoZIzj0EAwMDaAAwZQIwV53dVvHH4+m4SVBrm2nDb+zDfSXkV5UT +QJtS0zvzQBm8JsctBp61ezaf9SXUY2sAAjEA6dPGnlaaKsyh2j/IZivTWJwghfqrkYpwcBE4YGQL +YgmRWAD5Tfs0aNoJrSEGGJTO +-----END CERTIFICATE----- + +vTrus Root CA +============= +-----BEGIN CERTIFICATE----- +MIIFVjCCAz6gAwIBAgIUQ+NxE9izWRRdt86M/TX9b7wFjUUwDQYJKoZIhvcNAQELBQAwQzELMAkG +A1UEBhMCQ04xHDAaBgNVBAoTE2lUcnVzQ2hpbmEgQ28uLEx0ZC4xFjAUBgNVBAMTDXZUcnVzIFJv +b3QgQ0EwHhcNMTgwNzMxMDcyNDA1WhcNNDMwNzMxMDcyNDA1WjBDMQswCQYDVQQGEwJDTjEcMBoG +A1UEChMTaVRydXNDaGluYSBDby4sTHRkLjEWMBQGA1UEAxMNdlRydXMgUm9vdCBDQTCCAiIwDQYJ +KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL1VfGHTuB0EYgWgrmy3cLRB6ksDXhA/kFocizuwZots +SKYcIrrVQJLuM7IjWcmOvFjai57QGfIvWcaMY1q6n6MLsLOaXLoRuBLpDLvPbmyAhykUAyyNJJrI +ZIO1aqwTLDPxn9wsYTwaP3BVm60AUn/PBLn+NvqcwBauYv6WTEN+VRS+GrPSbcKvdmaVayqwlHeF +XgQPYh1jdfdr58tbmnDsPmcF8P4HCIDPKNsFxhQnL4Z98Cfe/+Z+M0jnCx5Y0ScrUw5XSmXX+6KA +YPxMvDVTAWqXcoKv8R1w6Jz1717CbMdHflqUhSZNO7rrTOiwCcJlwp2dCZtOtZcFrPUGoPc2BX70 +kLJrxLT5ZOrpGgrIDajtJ8nU57O5q4IikCc9Kuh8kO+8T/3iCiSn3mUkpF3qwHYw03dQ+A0Em5Q2 +AXPKBlim0zvc+gRGE1WKyURHuFE5Gi7oNOJ5y1lKCn+8pu8fA2dqWSslYpPZUxlmPCdiKYZNpGvu +/9ROutW04o5IWgAZCfEF2c6Rsffr6TlP9m8EQ5pV9T4FFL2/s1m02I4zhKOQUqqzApVg+QxMaPnu +1RcN+HFXtSXkKe5lXa/R7jwXC1pDxaWG6iSe4gUH3DRCEpHWOXSuTEGC2/KmSNGzm/MzqvOmwMVO +9fSddmPmAsYiS8GVP1BkLFTltvA8Kc9XAgMBAAGjQjBAMB0GA1UdDgQWBBRUYnBj8XWEQ1iO0RYg +scasGrz2iTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC +AgEAKbqSSaet8PFww+SX8J+pJdVrnjT+5hpk9jprUrIQeBqfTNqK2uwcN1LgQkv7bHbKJAs5EhWd +nxEt/Hlk3ODg9d3gV8mlsnZwUKT+twpw1aA08XXXTUm6EdGz2OyC/+sOxL9kLX1jbhd47F18iMjr +jld22VkE+rxSH0Ws8HqA7Oxvdq6R2xCOBNyS36D25q5J08FsEhvMKar5CKXiNxTKsbhm7xqC5PD4 +8acWabfbqWE8n/Uxy+QARsIvdLGx14HuqCaVvIivTDUHKgLKeBRtRytAVunLKmChZwOgzoy8sHJn +xDHO2zTlJQNgJXtxmOTAGytfdELSS8VZCAeHvsXDf+eW2eHcKJfWjwXj9ZtOyh1QRwVTsMo554Wg +icEFOwE30z9J4nfrI8iIZjs9OXYhRvHsXyO466JmdXTBQPfYaJqT4i2pLr0cox7IdMakLXogqzu4 +sEb9b91fUlV1YvCXoHzXOP0l382gmxDPi7g4Xl7FtKYCNqEeXxzP4padKar9mK5S4fNBUvupLnKW +nyfjqnN9+BojZns7q2WwMgFLFT49ok8MKzWixtlnEjUwzXYuFrOZnk1PTi07NEPhmg4NpGaXutIc +SkwsKouLgU9xGqndXHt7CMUADTdA43x7VF8vhV929vensBxXVsFy6K2ir40zSbofitzmdHxghm+H +l3s= +-----END CERTIFICATE----- + +ISRG Root X2 +============ +-----BEGIN CERTIFICATE----- +MIICGzCCAaGgAwIBAgIQQdKd0XLq7qeAwSxs6S+HUjAKBggqhkjOPQQDAzBPMQswCQYDVQQGEwJV +UzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElT +UkcgUm9vdCBYMjAeFw0yMDA5MDQwMDAwMDBaFw00MDA5MTcxNjAwMDBaME8xCzAJBgNVBAYTAlVT +MSkwJwYDVQQKEyBJbnRlcm5ldCBTZWN1cml0eSBSZXNlYXJjaCBHcm91cDEVMBMGA1UEAxMMSVNS +RyBSb290IFgyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEzZvVn4CDCuwJSvMWSj5cz3es3mcFDR0H +ttwW+1qLFNvicWDEukWVEYmO6gbf9yoWHKS5xcUy4APgHoIYOIvXRdgKam7mAHf7AlF9ItgKbppb +d9/w+kHsOdx1ymgHDB/qo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV +HQ4EFgQUfEKWrt5LSDv6kviejM9ti6lyN5UwCgYIKoZIzj0EAwMDaAAwZQIwe3lORlCEwkSHRhtF +cP9Ymd70/aTSVaYgLXTWNLxBo1BfASdWtL4ndQavEi51mI38AjEAi/V3bNTIZargCyzuFJ0nN6T5 +U6VR5CmD1/iQMVtCnwr1/q4AaOeMSQ+2b1tbFfLn +-----END CERTIFICATE----- + +HiPKI Root CA - G1 +================== +-----BEGIN CERTIFICATE----- +MIIFajCCA1KgAwIBAgIQLd2szmKXlKFD6LDNdmpeYDANBgkqhkiG9w0BAQsFADBPMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xGzAZBgNVBAMMEkhpUEtJ +IFJvb3QgQ0EgLSBHMTAeFw0xOTAyMjIwOTQ2MDRaFw0zNzEyMzExNTU5NTlaME8xCzAJBgNVBAYT +AlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEbMBkGA1UEAwwSSGlQS0kg +Um9vdCBDQSAtIEcxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA9B5/UnMyDHPkvRN0 +o9QwqNCuS9i233VHZvR85zkEHmpwINJaR3JnVfSl6J3VHiGh8Ge6zCFovkRTv4354twvVcg3Px+k +wJyz5HdcoEb+d/oaoDjq7Zpy3iu9lFc6uux55199QmQ5eiY29yTw1S+6lZgRZq2XNdZ1AYDgr/SE +YYwNHl98h5ZeQa/rh+r4XfEuiAU+TCK72h8q3VJGZDnzQs7ZngyzsHeXZJzA9KMuH5UHsBffMNsA +GJZMoYFL3QRtU6M9/Aes1MU3guvklQgZKILSQjqj2FPseYlgSGDIcpJQ3AOPgz+yQlda22rpEZfd +hSi8MEyr48KxRURHH+CKFgeW0iEPU8DtqX7UTuybCeyvQqww1r/REEXgphaypcXTT3OUM3ECoWqj +1jOXTyFjHluP2cFeRXF3D4FdXyGarYPM+l7WjSNfGz1BryB1ZlpK9p/7qxj3ccC2HTHsOyDry+K4 +9a6SsvfhhEvyovKTmiKe0xRvNlS9H15ZFblzqMF8b3ti6RZsR1pl8w4Rm0bZ/W3c1pzAtH2lsN0/ +Vm+h+fbkEkj9Bn8SV7apI09bA8PgcSojt/ewsTu8mL3WmKgMa/aOEmem8rJY5AIJEzypuxC00jBF +8ez3ABHfZfjcK0NVvxaXxA/VLGGEqnKG/uY6fsI/fe78LxQ+5oXdUG+3Se0CAwEAAaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ncX+l6o/vY9cdVouslGDDjYr7AwDgYDVR0PAQH/BAQD +AgGGMA0GCSqGSIb3DQEBCwUAA4ICAQBQUfB13HAE4/+qddRxosuej6ip0691x1TPOhwEmSKsxBHi +7zNKpiMdDg1H2DfHb680f0+BazVP6XKlMeJ45/dOlBhbQH3PayFUhuaVevvGyuqcSE5XCV0vrPSl +tJczWNWseanMX/mF+lLFjfiRFOs6DRfQUsJ748JzjkZ4Bjgs6FzaZsT0pPBWGTMpWmWSBUdGSquE +wx4noR8RkpkndZMPvDY7l1ePJlsMu5wP1G4wB9TcXzZoZjmDlicmisjEOf6aIW/Vcobpf2Lll07Q +JNBAsNB1CI69aO4I1258EHBGG3zgiLKecoaZAeO/n0kZtCW+VmWuF2PlHt/o/0elv+EmBYTksMCv +5wiZqAxeJoBF1PhoL5aPruJKHJwWDBNvOIf2u8g0X5IDUXlwpt/L9ZlNec1OvFefQ05rLisY+Gpz +jLrFNe85akEez3GoorKGB1s6yeHvP2UEgEcyRHCVTjFnanRbEEV16rCf0OY1/k6fi8wrkkVbbiVg +hUbN0aqwdmaTd5a+g744tiROJgvM7XpWGuDpWsZkrUx6AEhEL7lAuxM+vhV4nYWBSipX3tUZQ9rb +yltHhoMLP7YNdnhzeSJesYAfz77RP1YQmCuVh6EfnWQUYDksswBVLuT1sw5XxJFBAJw/6KXf6vb/ +yPCtbVKoF6ubYfwSUTXkJf2vqmqGOQ== +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgwMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9i +YWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkds +b2JhbFNpZ24wWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkW +ymOxuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNVHQ8BAf8E +BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/+wpu+74zyTyjhNUwCgYI +KoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147bmF0774BxL4YSFlhgjICICadVGNA3jdg +UM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm +-----END CERTIFICATE----- + +GTS Root R1 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaM +f/vo27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7wCl7raKb0 +xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjwTcLCeoiKu7rPWRnWr4+w +B7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0PfyblqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXW +nOunVmSPlk9orj2XwoSPwLxAwAtcvfaHszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk +9+aCEI3oncKKiPo4Zor8Y/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zq +kUspzBmkMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92wO1A +K/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70paDPvOmbsB4om3xPX +V2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrNVjzRlwW5y0vtOUucxD/SVRNuJLDW +cfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQAD +ggIBAJ+qQibbC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe +QkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuyh6f88/qBVRRi +ClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM47HLwEXWdyzRSjeZ2axfG34ar +J45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8JZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYci +NuaCp+0KueIHoI17eko8cdLiA6EfMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5me +LMFrUKTX5hgUvYU/Z6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJF +fbdT6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ0E6yove+ +7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm2tIMPNuzjsmhDYAPexZ3 +FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bbbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3 +gm3c +-----END CERTIFICATE----- + +GTS Root R2 +=========== +-----BEGIN CERTIFICATE----- +MIIFVzCCAz+gAwIBAgINAgPlrsWNBCUaqxElqjANBgkqhkiG9w0BAQwFADBHMQswCQYDVQQGEwJV +UzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3Qg +UjIwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UE +ChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjIwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDO3v2m++zsFDQ8BwZabFn3GTXd98GdVarTzTukk3Lv +CvptnfbwhYBboUhSnznFt+4orO/LdmgUud+tAWyZH8QiHZ/+cnfgLFuv5AS/T3KgGjSY6Dlo7JUl +e3ah5mm5hRm9iYz+re026nO8/4Piy33B0s5Ks40FnotJk9/BW9BuXvAuMC6C/Pq8tBcKSOWIm8Wb +a96wyrQD8Nr0kLhlZPdcTK3ofmZemde4wj7I0BOdre7kRXuJVfeKH2JShBKzwkCX44ofR5GmdFrS ++LFjKBC4swm4VndAoiaYecb+3yXuPuWgf9RhD1FLPD+M2uFwdNjCaKH5wQzpoeJ/u1U8dgbuak7M +kogwTZq9TwtImoS1mKPV+3PBV2HdKFZ1E66HjucMUQkQdYhMvI35ezzUIkgfKtzra7tEscszcTJG +r61K8YzodDqs5xoic4DSMPclQsciOzsSrZYuxsN2B6ogtzVJV+mSSeh2FnIxZyuWfoqjx5RWIr9q +S34BIbIjMt/kmkRtWVtd9QCgHJvGeJeNkP+byKq0rxFROV7Z+2et1VsRnTKaG73VululycslaVNV +J1zgyjbLiGH7HrfQy+4W+9OmTN6SpdTi3/UGVN4unUu0kzCqgc7dGtxRcw1PcOnlthYhGXmy5okL +dWTK1au8CcEYof/UVKGFPP0UJAOyh9OktwIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0T +AQH/BAUwAwEB/zAdBgNVHQ4EFgQUu//KjiOfT5nK2+JopqUVJxce2Q4wDQYJKoZIhvcNAQEMBQAD +ggIBAB/Kzt3HvqGf2SdMC9wXmBFqiN495nFWcrKeGk6c1SuYJF2ba3uwM4IJvd8lRuqYnrYb/oM8 +0mJhwQTtzuDFycgTE1XnqGOtjHsB/ncw4c5omwX4Eu55MaBBRTUoCnGkJE+M3DyCB19m3H0Q/gxh +swWV7uGugQ+o+MePTagjAiZrHYNSVc61LwDKgEDg4XSsYPWHgJ2uNmSRXbBoGOqKYcl3qJfEycel +/FVL8/B/uWU9J2jQzGv6U53hkRrJXRqWbTKH7QMgyALOWr7Z6v2yTcQvG99fevX4i8buMTolUVVn +jWQye+mew4K6Ki3pHrTgSAai/GevHyICc/sgCq+dVEuhzf9gR7A/Xe8bVr2XIZYtCtFenTgCR2y5 +9PYjJbigapordwj6xLEokCZYCDzifqrXPW+6MYgKBesntaFJ7qBFVHvmJ2WZICGoo7z7GJa7Um8M +7YNRTOlZ4iBgxcJlkoKM8xAfDoqXvneCbT+PHV28SSe9zE8P4c52hgQjxcCMElv924SgJPFI/2R8 +0L5cFtHvma3AH/vLrrw4IgYmZNralw4/KBVEqE8AyvCazM90arQ+POuV7LXTWtiBmelDGDfrs7vR +WGJB82bSj6p4lVQgw1oudCvV0b4YacCs1aTPObpRhANl6WLAYv7YTVWW4tAR+kg0Eeye7QUd5MjW +HYbL +-----END CERTIFICATE----- + +GTS Root R3 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPluILrIPglJ209ZjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjMwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAAQfTzOHMymKoYTey8chWEGJ6ladK0uFxh1MJ7x/JlFyb+Kf1qPKzEUURout +736GjOyxfi//qXGdGIRFBEFVbivqJn+7kAHjSxm65FSWRQmx1WyRRK2EE46ajA2ADDL24CejQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTB8Sa6oC2uhYHP0/Eq +Er24Cmf9vDAKBggqhkjOPQQDAwNpADBmAjEA9uEglRR7VKOQFhG/hMjqb2sXnh5GmCCbn9MN2azT +L818+FsuVbu/3ZL3pAzcMeGiAjEA/JdmZuVDFhOD3cffL74UOO0BzrEXGhF16b0DjyZ+hOXJYKaV +11RZt+cRLInUue4X +-----END CERTIFICATE----- + +GTS Root R4 +=========== +-----BEGIN CERTIFICATE----- +MIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYDVQQGEwJVUzEi +MCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQw +HhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZ +R29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjO +PQIBBgUrgQQAIgNiAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzu +hXyiQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvRHYqjQjBA +MA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSATNbrdP9JNqPV2Py1 +PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/C +r8deVl5c1RxYIigL9zC2L7F8AjEA8GE8p/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh +4rsUecrNIdSUtUlD +-----END CERTIFICATE----- + +Telia Root CA v2 +================ +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIPAWdfJ9b+euPkrL4JWwWeMA0GCSqGSIb3DQEBCwUAMEQxCzAJBgNVBAYT +AkZJMRowGAYDVQQKDBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2 +MjAeFw0xODExMjkxMTU1NTRaFw00MzExMjkxMTU1NTRaMEQxCzAJBgNVBAYTAkZJMRowGAYDVQQK +DBFUZWxpYSBGaW5sYW5kIE95ajEZMBcGA1UEAwwQVGVsaWEgUm9vdCBDQSB2MjCCAiIwDQYJKoZI +hvcNAQEBBQADggIPADCCAgoCggIBALLQPwe84nvQa5n44ndp586dpAO8gm2h/oFlH0wnrI4AuhZ7 +6zBqAMCzdGh+sq/H1WKzej9Qyow2RCRj0jbpDIX2Q3bVTKFgcmfiKDOlyzG4OiIjNLh9vVYiQJ3q +9HsDrWj8soFPmNB06o3lfc1jw6P23pLCWBnglrvFxKk9pXSW/q/5iaq9lRdU2HhE8Qx3FZLgmEKn +pNaqIJLNwaCzlrI6hEKNfdWV5Nbb6WLEWLN5xYzTNTODn3WhUidhOPFZPY5Q4L15POdslv5e2QJl +tI5c0BE0312/UqeBAMN/mUWZFdUXyApT7GPzmX3MaRKGwhfwAZ6/hLzRUssbkmbOpFPlob/E2wnW +5olWK8jjfN7j/4nlNW4o6GwLI1GpJQXrSPjdscr6bAhR77cYbETKJuFzxokGgeWKrLDiKca5JLNr +RBH0pUPCTEPlcDaMtjNXepUugqD0XBCzYYP2AgWGLnwtbNwDRm41k9V6lS/eINhbfpSQBGq6WT0E +BXWdN6IOLj3rwaRSg/7Qa9RmjtzG6RJOHSpXqhC8fF6CfaamyfItufUXJ63RDolUK5X6wK0dmBR4 +M0KGCqlztft0DbcbMBnEWg4cJ7faGND/isgFuvGqHKI3t+ZIpEYslOqodmJHixBTB0hXbOKSTbau +BcvcwUpej6w9GU7C7WB1K9vBykLVAgMBAAGjYzBhMB8GA1UdIwQYMBaAFHKs5DN5qkWH9v2sHZ7W +xy+G2CQ5MB0GA1UdDgQWBBRyrOQzeapFh/b9rB2e1scvhtgkOTAOBgNVHQ8BAf8EBAMCAQYwDwYD +VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAoDtZpwmUPjaE0n4vOaWWl/oRrfxn83EJ +8rKJhGdEr7nv7ZbsnGTbMjBvZ5qsfl+yqwE2foH65IRe0qw24GtixX1LDoJt0nZi0f6X+J8wfBj5 +tFJ3gh1229MdqfDBmgC9bXXYfef6xzijnHDoRnkDry5023X4blMMA8iZGok1GTzTyVR8qPAs5m4H +eW9q4ebqkYJpCh3DflminmtGFZhb069GHWLIzoBSSRE/yQQSwxN8PzuKlts8oB4KtItUsiRnDe+C +y748fdHif64W1lZYudogsYMVoe+KTTJvQS8TUoKU1xrBeKJR3Stwbbca+few4GeXVtt8YVMJAygC +QMez2P2ccGrGKMOF6eLtGpOg3kuYooQ+BXcBlj37tCAPnHICehIv1aO6UXivKitEZU61/Qrowc15 +h2Er3oBXRb9n8ZuRXqWk7FlIEA04x7D6w0RtBPV4UBySllva9bguulvP5fBqnUsvWHMtTy3EHD70 +sz+rFQ47GUGKpMFXEmZxTPpT41frYpUJnlTd0cI8Vzy9OK2YZLe4A5pTVmBds9hCG1xLEooc6+t9 +xnppxyd/pPiL8uSUZodL6ZQHCRJ5irLrdATczvREWeAWysUsWNc8e89ihmpQfTU2Zqf7N+cox9jQ +raVplI/owd8k+BsHMYeB2F326CjYSlKArBPuUBQemMc= +-----END CERTIFICATE----- + +D-TRUST BR Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQfMmPK4TX3+oPyWWa00tNljAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEJSIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTA5NDUwMFoXDTM1MDIxMTA5NDQ1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABMbLxyjR+4T1mu9CFCDhQ2tuda38KwOE1HaTJddZO0Flax7mNCq7 +dPYSzuht56vkPE4/RAiLzRZxy7+SmfSk1zxQVFKQhYN4lGdnoxwJGT11NIXe7WB9xwy0QVK5buXu +QqOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHOREKv/VbNafAkl1bK6CKBrqx9t +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2JyX3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwQlIlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAlJAtE/rhY/hhY+ithXhUkZy4kzg+GkHaQBZTQgjKL47xPoFWwKrY7RjEsK70Pvom +AjEA8yjixtsrmfu3Ubgko6SUeho/5jbiA1czijDLgsfWFBHVdWNbFJWcHwHP2NVypw87 +-----END CERTIFICATE----- + +D-TRUST EV Root CA 1 2020 +========================= +-----BEGIN CERTIFICATE----- +MIIC2zCCAmCgAwIBAgIQXwJB13qHfEwDo6yWjfv/0DAKBggqhkjOPQQDAzBIMQswCQYDVQQGEwJE +RTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlELVRSVVNUIEVWIFJvb3QgQ0EgMSAy +MDIwMB4XDTIwMDIxMTEwMDAwMFoXDTM1MDIxMTA5NTk1OVowSDELMAkGA1UEBhMCREUxFTATBgNV +BAoTDEQtVHJ1c3QgR21iSDEiMCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDEgMjAyMDB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABPEL3YZDIBnfl4XoIkqbz52Yv7QFJsnL46bSj8WeeHsxiamJrSc8 +ZRCC/N/DnU7wMyPE0jL1HLDfMxddxfCxivnvubcUyilKwg+pf3VlSSowZ/Rk99Yad9rDwpdhQntJ +raOCAQ0wggEJMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFH8QARY3OqQo5FD4pPfsazK2/umL +MA4GA1UdDwEB/wQEAwIBBjCBxgYDVR0fBIG+MIG7MD6gPKA6hjhodHRwOi8vY3JsLmQtdHJ1c3Qu +bmV0L2NybC9kLXRydXN0X2V2X3Jvb3RfY2FfMV8yMDIwLmNybDB5oHegdYZzbGRhcDovL2RpcmVj +dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwRVYlMjBSb290JTIwQ0ElMjAxJTIwMjAyMCxP +PUQtVHJ1c3QlMjBHbWJILEM9REU/Y2VydGlmaWNhdGVyZXZvY2F0aW9ubGlzdDAKBggqhkjOPQQD +AwNpADBmAjEAyjzGKnXCXnViOTYAYFqLwZOZzNnbQTs7h5kXO9XMT8oi96CAy/m0sRtW9XLS/BnR +AjEAkfcwkz8QRitxpNA7RJvAKQIFskF3UfN5Wp6OFKBOQtJbgfM0agPnIjhQW+0ZT0MW +-----END CERTIFICATE----- + +DigiCert TLS ECC P384 Root G5 +============================= +-----BEGIN CERTIFICATE----- +MIICGTCCAZ+gAwIBAgIQCeCTZaz32ci5PhwLBCou8zAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJjAkBgNVBAMTHURpZ2lDZXJ0IFRMUyBFQ0MgUDM4 +NCBSb290IEc1MB4XDTIxMDExNTAwMDAwMFoXDTQ2MDExNDIzNTk1OVowTjELMAkGA1UEBhMCVVMx +FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMSYwJAYDVQQDEx1EaWdpQ2VydCBUTFMgRUNDIFAzODQg +Um9vdCBHNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABMFEoc8Rl1Ca3iOCNQfN0MsYndLxf3c1Tzvd +lHJS7cI7+Oz6e2tYIOyZrsn8aLN1udsJ7MgT9U7GCh1mMEy7H0cKPGEQQil8pQgO4CLp0zVozptj +n4S1mU1YoI71VOeVyaNCMEAwHQYDVR0OBBYEFMFRRVBZqz7nLFr6ICISB4CIfBFqMA4GA1UdDwEB +/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMDA2gAMGUCMQCJao1H5+z8blUD2Wds +Jk6Dxv3J+ysTvLd6jLRl0mlpYxNjOyZQLgGheQaRnUi/wr4CMEfDFXuxoJGZSZOoPHzoRgaLLPIx +AJSdYsiJvRmEFOml+wG4DXZDjC5Ty3zfDBeWUA== +-----END CERTIFICATE----- + +DigiCert TLS RSA4096 Root G5 +============================ +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCPm0eKj6ftpqMzeJ3nzPijANBgkqhkiG9w0BAQwFADBNMQswCQYDVQQG +EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0 +MDk2IFJvb3QgRzUwHhcNMjEwMTE1MDAwMDAwWhcNNDYwMTE0MjM1OTU5WjBNMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xJTAjBgNVBAMTHERpZ2lDZXJ0IFRMUyBSU0E0MDk2 +IFJvb3QgRzUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCz0PTJeRGd/fxmgefM1eS8 +7IE+ajWOLrfn3q/5B03PMJ3qCQuZvWxX2hhKuHisOjmopkisLnLlvevxGs3npAOpPxG02C+JFvuU +AT27L/gTBaF4HI4o4EXgg/RZG5Wzrn4DReW+wkL+7vI8toUTmDKdFqgpwgscONyfMXdcvyej/Ces +tyu9dJsXLfKB2l2w4SMXPohKEiPQ6s+d3gMXsUJKoBZMpG2T6T867jp8nVid9E6P/DsjyG244gXa +zOvswzH016cpVIDPRFtMbzCe88zdH5RDnU1/cHAN1DrRN/BsnZvAFJNY781BOHW8EwOVfH/jXOnV +DdXifBBiqmvwPXbzP6PosMH976pXTayGpxi0KcEsDr9kvimM2AItzVwv8n/vFfQMFawKsPHTDU9q +TXeXAaDxZre3zu/O7Oyldcqs4+Fj97ihBMi8ez9dLRYiVu1ISf6nL3kwJZu6ay0/nTvEF+cdLvvy +z6b84xQslpghjLSR6Rlgg/IwKwZzUNWYOwbpx4oMYIwo+FKbbuH2TbsGJJvXKyY//SovcfXWJL5/ +MZ4PbeiPT02jP/816t9JXkGPhvnxd3lLG7SjXi/7RgLQZhNeXoVPzthwiHvOAbWWl9fNff2C+MIk +wcoBOU+NosEUQB+cZtUMCUbW8tDRSHZWOkPLtgoRObqME2wGtZ7P6wIDAQABo0IwQDAdBgNVHQ4E +FgQUUTMc7TZArxfTJc1paPKvTiM+s0EwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8w +DQYJKoZIhvcNAQEMBQADggIBAGCmr1tfV9qJ20tQqcQjNSH/0GEwhJG3PxDPJY7Jv0Y02cEhJhxw +GXIeo8mH/qlDZJY6yFMECrZBu8RHANmfGBg7sg7zNOok992vIGCukihfNudd5N7HPNtQOa27PShN +lnx2xlv0wdsUpasZYgcYQF+Xkdycx6u1UQ3maVNVzDl92sURVXLFO4uJ+DQtpBflF+aZfTCIITfN +MBc9uPK8qHWgQ9w+iUuQrm0D4ByjoJYJu32jtyoQREtGBzRj7TG5BO6jm5qu5jF49OokYTurWGT/ +u4cnYiWB39yhL/btp/96j1EuMPikAdKFOV8BmZZvWltwGUb+hmA+rYAQCd05JS9Yf7vSdPD3Rh9G +OUrYU9DzLjtxpdRv/PNn5AeP3SYZ4Y1b+qOTEZvpyDrDVWiakuFSdjjo4bq9+0/V77PnSIMx8IIh +47a+p6tv75/fTM8BuGJqIz3nCU2AG3swpMPdB380vqQmsvZB6Akd4yCYqjdP//fx4ilwMUc/dNAU +FvohigLVigmUdy7yWSiLfFCSCmZ4OIN1xLVaqBHG5cGdZlXPU8Sv13WFqUITVuwhd4GTWgzqltlJ +yqEI8pc7bZsEGCREjnwB8twl2F6GmrE52/WRMmrRpnCKovfepEWFJqgejF0pW8hL2JpqA15w8oVP +bEtoL8pU9ozaMv7Da4M/OMZ+ +-----END CERTIFICATE----- + +Certainly Root R1 +================= +-----BEGIN CERTIFICATE----- +MIIFRzCCAy+gAwIBAgIRAI4P+UuQcWhlM1T01EQ5t+AwDQYJKoZIhvcNAQELBQAwPTELMAkGA1UE +BhMCVVMxEjAQBgNVBAoTCUNlcnRhaW5seTEaMBgGA1UEAxMRQ2VydGFpbmx5IFJvb3QgUjEwHhcN +MjEwNDAxMDAwMDAwWhcNNDYwNDAxMDAwMDAwWjA9MQswCQYDVQQGEwJVUzESMBAGA1UEChMJQ2Vy +dGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBSMTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBANA21B/q3avk0bbm+yLA3RMNansiExyXPGhjZjKcA7WNpIGD2ngwEc/csiu+kr+O +5MQTvqRoTNoCaBZ0vrLdBORrKt03H2As2/X3oXyVtwxwhi7xOu9S98zTm/mLvg7fMbedaFySpvXl +8wo0tf97ouSHocavFwDvA5HtqRxOcT3Si2yJ9HiG5mpJoM610rCrm/b01C7jcvk2xusVtyWMOvwl +DbMicyF0yEqWYZL1LwsYpfSt4u5BvQF5+paMjRcCMLT5r3gajLQ2EBAHBXDQ9DGQilHFhiZ5shGI +XsXwClTNSaa/ApzSRKft43jvRl5tcdF5cBxGX1HpyTfcX35pe0HfNEXgO4T0oYoKNp43zGJS4YkN +KPl6I7ENPT2a/Z2B7yyQwHtETrtJ4A5KVpK8y7XdeReJkd5hiXSSqOMyhb5OhaRLWcsrxXiOcVTQ +AjeZjOVJ6uBUcqQRBi8LjMFbvrWhsFNunLhgkR9Za/kt9JQKl7XsxXYDVBtlUrpMklZRNaBA2Cnb +rlJ2Oy0wQJuK0EJWtLeIAaSHO1OWzaMWj/Nmqhexx2DgwUMFDO6bW2BvBlyHWyf5QBGenDPBt+U1 +VwV/J84XIIwc/PH72jEpSe31C4SnT8H2TsIonPru4K8H+zMReiFPCyEQtkA6qyI6BJyLm4SGcprS +p6XEtHWRqSsjAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1Ud +DgQWBBTgqj8ljZ9EXME66C6ud0yEPmcM9DANBgkqhkiG9w0BAQsFAAOCAgEAuVevuBLaV4OPaAsz +HQNTVfSVcOQrPbA56/qJYv331hgELyE03fFo8NWWWt7CgKPBjcZq91l3rhVkz1t5BXdm6ozTaw3d +8VkswTOlMIAVRQdFGjEitpIAq5lNOo93r6kiyi9jyhXWx8bwPWz8HA2YEGGeEaIi1wrykXprOQ4v +MMM2SZ/g6Q8CRFA3lFV96p/2O7qUpUzpvD5RtOjKkjZUbVwlKNrdrRT90+7iIgXr0PK3aBLXWopB +GsaSpVo7Y0VPv+E6dyIvXL9G+VoDhRNCX8reU9ditaY1BMJH/5n9hN9czulegChB8n3nHpDYT3Y+ +gjwN/KUD+nsa2UUeYNrEjvn8K8l7lcUq/6qJ34IxD3L/DCfXCh5WAFAeDJDBlrXYFIW7pw0WwfgH +JBu6haEaBQmAupVjyTrsJZ9/nbqkRxWbRHDxakvWOF5D8xh+UG7pWijmZeZ3Gzr9Hb4DJqPb1OG7 +fpYnKx3upPvaJVQTA945xsMfTZDsjxtK0hzthZU4UHlG1sGQUDGpXJpuHfUzVounmdLyyCwzk5Iw +x06MZTMQZBf9JBeW0Y3COmor6xOLRPIh80oat3df1+2IpHLlOR+Vnb5nwXARPbv0+Em34yaXOp/S +X3z7wJl8OSngex2/DaeP0ik0biQVy96QXr8axGbqwua6OV+KmalBWQewLK8= +-----END CERTIFICATE----- + +Certainly Root E1 +================= +-----BEGIN CERTIFICATE----- +MIIB9zCCAX2gAwIBAgIQBiUzsUcDMydc+Y2aub/M+DAKBggqhkjOPQQDAzA9MQswCQYDVQQGEwJV +UzESMBAGA1UEChMJQ2VydGFpbmx5MRowGAYDVQQDExFDZXJ0YWlubHkgUm9vdCBFMTAeFw0yMTA0 +MDEwMDAwMDBaFw00NjA0MDEwMDAwMDBaMD0xCzAJBgNVBAYTAlVTMRIwEAYDVQQKEwlDZXJ0YWlu +bHkxGjAYBgNVBAMTEUNlcnRhaW5seSBSb290IEUxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAE3m/4 +fxzf7flHh4axpMCK+IKXgOqPyEpeKn2IaKcBYhSRJHpcnqMXfYqGITQYUBsQ3tA3SybHGWCA6TS9 +YBk2QNYphwk8kXr2vBMj3VlOBF7PyAIcGFPBMdjaIOlEjeR2o0IwQDAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU8ygYy2R17ikq6+2uI1g4hevIIgcwCgYIKoZIzj0E +AwMDaAAwZQIxALGOWiDDshliTd6wT99u0nCK8Z9+aozmut6Dacpps6kFtZaSF4fC0urQe87YQVt8 +rgIwRt7qy12a7DLCZRawTDBcMPPaTnOGBtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR +-----END CERTIFICATE----- + +Security Communication RootCA3 +============================== +-----BEGIN CERTIFICATE----- +MIIFfzCCA2egAwIBAgIJAOF8N0D9G/5nMA0GCSqGSIb3DQEBDAUAMF0xCzAJBgNVBAYTAkpQMSUw +IwYDVQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMScwJQYDVQQDEx5TZWN1cml0eSBD +b21tdW5pY2F0aW9uIFJvb3RDQTMwHhcNMTYwNjE2MDYxNzE2WhcNMzgwMTE4MDYxNzE2WjBdMQsw +CQYDVQQGEwJKUDElMCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UE +AxMeU2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA48lySfcw3gl8qUCBWNO0Ot26YQ+TUG5pPDXC7ltzkBtnTCHsXzW7OT4rCmDvu20r +hvtxosis5FaU+cmvsXLUIKx00rgVrVH+hXShuRD+BYD5UpOzQD11EKzAlrenfna84xtSGc4RHwsE +NPXY9Wk8d/Nk9A2qhd7gCVAEF5aEt8iKvE1y/By7z/MGTfmfZPd+pmaGNXHIEYBMwXFAWB6+oHP2 +/D5Q4eAvJj1+XCO1eXDe+uDRpdYMQXF79+qMHIjH7Iv10S9VlkZ8WjtYO/u62C21Jdp6Ts9EriGm +npjKIG58u4iFW/vAEGK78vknR+/RiTlDxN/e4UG/VHMgly1s2vPUB6PmudhvrvyMGS7TZ2crldtY +XLVqAvO4g160a75BflcJdURQVc1aEWEhCmHCqYj9E7wtiS/NYeCVvsq1e+F7NGcLH7YMx3weGVPK +p7FKFSBWFHA9K4IsD50VHUeAR/94mQ4xr28+j+2GaR57GIgUssL8gjMunEst+3A7caoreyYn8xrC +3PsXuKHqy6C0rtOUfnrQq8PsOC0RLoi/1D+tEjtCrI8Cbn3M0V9hvqG8OmpI6iZVIhZdXw3/JzOf +GAN0iltSIEdrRU0id4xVJ/CvHozJgyJUt5rQT9nO/NkuHJYosQLTA70lUhw0Zk8jq/R3gpYd0Vcw +CBEF/VfR2ccCAwEAAaNCMEAwHQYDVR0OBBYEFGQUfPxYchamCik0FW8qy7z8r6irMA4GA1UdDwEB +/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQDcAiMI4u8hOscNtybS +YpOnpSNyByCCYN8Y11StaSWSntkUz5m5UoHPrmyKO1o5yGwBQ8IibQLwYs1OY0PAFNr0Y/Dq9HHu +Tofjcan0yVflLl8cebsjqodEV+m9NU1Bu0soo5iyG9kLFwfl9+qd9XbXv8S2gVj/yP9kaWJ5rW4O +H3/uHWnlt3Jxs/6lATWUVCvAUm2PVcTJ0rjLyjQIUYWg9by0F1jqClx6vWPGOi//lkkZhOpn2ASx +YfQAW0q3nHE3GYV5v4GwxxMOdnE+OoAGrgYWp421wsTL/0ClXI2lyTrtcoHKXJg80jQDdwj98ClZ +XSEIx2C/pHF7uNkegr4Jr2VvKKu/S7XuPghHJ6APbw+LP6yVGPO5DtxnVW5inkYO0QR4ynKudtml ++LLfiAlhi+8kTtFZP1rUPcmTPCtk9YENFpb3ksP+MW/oKjJ0DvRMmEoYDjBU1cXrvMUVnuiZIesn +KwkK2/HmcBhWuwzkvvnoEKQTkrgc4NtnHVMDpCKn3F2SEDzq//wbEBrD2NCcnWXL0CsnMQMeNuE9 +dnUM/0Umud1RvCPHX9jYhxBAEg09ODfnRDwYwFMJZI//1ZqmfHAuc1Uh6N//g7kdPjIe1qZ9LPFm +6Vwdp6POXiUyK+OVrCoHzrQoeIY8LaadTdJ0MN1kURXbg4NR16/9M51NZg== +-----END CERTIFICATE----- + +Security Communication ECC RootCA1 +================================== +-----BEGIN CERTIFICATE----- +MIICODCCAb6gAwIBAgIJANZdm7N4gS7rMAoGCCqGSM49BAMDMGExCzAJBgNVBAYTAkpQMSUwIwYD +VQQKExxTRUNPTSBUcnVzdCBTeXN0ZW1zIENPLixMVEQuMSswKQYDVQQDEyJTZWN1cml0eSBDb21t +dW5pY2F0aW9uIEVDQyBSb290Q0ExMB4XDTE2MDYxNjA1MTUyOFoXDTM4MDExODA1MTUyOFowYTEL +MAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKzApBgNV +BAMTIlNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAASkpW9gAwPDvTH00xecK4R1rOX9PVdu12O/5gSJko6BnOPpR27KkBLIE+CnnfdldB9sELLo +5OnvbYUymUSxXv3MdhDYW72ixvnWQuRXdtyQwjWpS4g8EkdtXP9JTxpKULGjQjBAMB0GA1UdDgQW +BBSGHOf+LaVKiwj+KBH6vqNm+GBZLzAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAK +BggqhkjOPQQDAwNoADBlAjAVXUI9/Lbu9zuxNuie9sRGKEkz0FhDKmMpzE2xtHqiuQ04pV1IKv3L +snNdo4gIxwwCMQDAqy0Obe0YottT6SXbVQjgUMzfRGEWgqtJsLKB7HOHeLRMsmIbEvoWTSVLY70e +N9k= +-----END CERTIFICATE----- + +BJCA Global Root CA1 +==================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIQVW9l47TZkGobCdFsPsBsIDANBgkqhkiG9w0BAQsFADBUMQswCQYDVQQG +EwJDTjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJK +Q0EgR2xvYmFsIFJvb3QgQ0ExMB4XDTE5MTIxOTAzMTYxN1oXDTQ0MTIxMjAzMTYxN1owVDELMAkG +A1UEBhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQD +DBRCSkNBIEdsb2JhbCBSb290IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAPFm +CL3ZxRVhy4QEQaVpN3cdwbB7+sN3SJATcmTRuHyQNZ0YeYjjlwE8R4HyDqKYDZ4/N+AZspDyRhyS +sTphzvq3Rp4Dhtczbu33RYx2N95ulpH3134rhxfVizXuhJFyV9xgw8O558dnJCNPYwpj9mZ9S1Wn +P3hkSWkSl+BMDdMJoDIwOvqfwPKcxRIqLhy1BDPapDgRat7GGPZHOiJBhyL8xIkoVNiMpTAK+BcW +yqw3/XmnkRd4OJmtWO2y3syJfQOcs4ll5+M7sSKGjwZteAf9kRJ/sGsciQ35uMt0WwfCyPQ10WRj +eulumijWML3mG90Vr4TqnMfK9Q7q8l0ph49pczm+LiRvRSGsxdRpJQaDrXpIhRMsDQa4bHlW/KNn +MoH1V6XKV0Jp6VwkYe/iMBhORJhVb3rCk9gZtt58R4oRTklH2yiUAguUSiz5EtBP6DF+bHq/pj+b +OT0CFqMYs2esWz8sgytnOYFcuX6U1WTdno9uruh8W7TXakdI136z1C2OVnZOz2nxbkRs1CTqjSSh +GL+9V/6pmTW12xB3uD1IutbB5/EjPtffhZ0nPNRAvQoMvfXnjSXWgXSHRtQpdaJCbPdzied9v3pK +H9MiyRVVz99vfFXQpIsHETdfg6YmV6YBW37+WGgHqel62bno/1Afq8K0wM7o6v0PvY1NuLxxAgMB +AAGjQjBAMB0GA1UdDgQWBBTF7+3M2I0hxkjk49cULqcWk+WYATAPBgNVHRMBAf8EBTADAQH/MA4G +A1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAUoKsITQfI/Ki2Pm4rzc2IInRNwPWaZ+4 +YRC6ojGYWUfo0Q0lHhVBDOAqVdVXUsv45Mdpox1NcQJeXyFFYEhcCY5JEMEE3KliawLwQ8hOnThJ +dMkycFRtwUf8jrQ2ntScvd0g1lPJGKm1Vrl2i5VnZu69mP6u775u+2D2/VnGKhs/I0qUJDAnyIm8 +60Qkmss9vk/Ves6OF8tiwdneHg56/0OGNFK8YT88X7vZdrRTvJez/opMEi4r89fO4aL/3Xtw+zuh +TaRjAv04l5U/BXCga99igUOLtFkNSoxUnMW7gZ/NfaXvCyUeOiDbHPwfmGcCCtRzRBPbUYQaVQNW +4AB+dAb/OMRyHdOoP2gxXdMJxy6MW2Pg6Nwe0uxhHvLe5e/2mXZgLR6UcnHGCyoyx5JO1UbXHfmp +GQrI+pXObSOYqgs4rZpWDW+N8TEAiMEXnM0ZNjX+VVOg4DwzX5Ze4jLp3zO7Bkqp2IRzznfSxqxx +4VyjHQy7Ct9f4qNx2No3WqB4K/TUfet27fJhcKVlmtOJNBir+3I+17Q9eVzYH6Eze9mCUAyTF6ps +3MKCuwJXNq+YJyo5UOGwifUll35HaBC07HPKs5fRJNz2YqAo07WjuGS3iGJCz51TzZm+ZGiPTx4S +SPfSKcOYKMryMguTjClPPGAyzQWWYezyr/6zcCwupvI= +-----END CERTIFICATE----- + +BJCA Global Root CA2 +==================== +-----BEGIN CERTIFICATE----- +MIICJTCCAaugAwIBAgIQLBcIfWQqwP6FGFkGz7RK6zAKBggqhkjOPQQDAzBUMQswCQYDVQQGEwJD +TjEmMCQGA1UECgwdQkVJSklORyBDRVJUSUZJQ0FURSBBVVRIT1JJVFkxHTAbBgNVBAMMFEJKQ0Eg +R2xvYmFsIFJvb3QgQ0EyMB4XDTE5MTIxOTAzMTgyMVoXDTQ0MTIxMjAzMTgyMVowVDELMAkGA1UE +BhMCQ04xJjAkBgNVBAoMHUJFSUpJTkcgQ0VSVElGSUNBVEUgQVVUSE9SSVRZMR0wGwYDVQQDDBRC +SkNBIEdsb2JhbCBSb290IENBMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABJ3LgJGNU2e1uVCxA/jl +SR9BIgmwUVJY1is0j8USRhTFiy8shP8sbqjV8QnjAyEUxEM9fMEsxEtqSs3ph+B99iK++kpRuDCK +/eHeGBIK9ke35xe/J4rUQUyWPGCWwf0VHKNCMEAwHQYDVR0OBBYEFNJKsVF/BvDRgh9Obl+rg/xI +1LCRMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8 +W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8g +UXOQwKhbYdDFUDn9hf7B43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root E46 +============================================= +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQswCQYDVQQGEwJH +QjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBTZXJ2 +ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5 +WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0 +aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUr +gQQAIgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccCWvkEN/U0 +NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+6xnOQ6OjQjBAMB0GA1Ud +DgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAKBggqhkjOPQQDAwNnADBkAjAn7qRaqCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RH +lAFWovgzJQxC36oCMB3q4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21U +SAGKcw== +-----END CERTIFICATE----- + +Sectigo Public Server Authentication Root R46 +============================================= +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBfMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1 +OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3 +DQEBAQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDaef0rty2k +1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnzSDBh+oF8HqcIStw+Kxwf +GExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xfiOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMP +FF1bFOdLvt30yNoDN9HWOaEhUTCDsG3XME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vu +ZDCQOc2TZYEhMbUjUDM3IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5Qaz +Yw6A3OASVYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgESJ/A +wSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu+Zd4KKTIRJLpfSYF +plhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt8uaZFURww3y8nDnAtOFr94MlI1fZ +EoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+LHaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW +6aWWrL3DkJiy4Pmi1KZHQ3xtzwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWI +IUkwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQYKlJfp/imTYp +E0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52gDY9hAaLMyZlbcp+nv4fjFg4 +exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZAFv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M +0ejf5lG5Nkc/kLnHvALcWxxPDkjBJYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI +84HxZmduTILA7rpXDhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9m +pFuiTdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5dHn5Hrwd +Vw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65LvKRRFHQV80MNNVIIb/b +E/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmm +J1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAYQqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +SSL.com TLS RSA Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQG +EwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBSU0Eg +Um9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloXDTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMC +VVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJv +b3QgQ0EgMjAyMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u +9nTPL3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OYt6/wNr/y +7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0insS657Lb85/bRi3pZ7Qcac +oOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3PnxEX4MN8/HdIGkWCVDi1FW24IBydm5M +R7d1VVm0U3TZlMZBrViKMWYPHqIbKUBOL9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDG +D6C1vBdOSHtRwvzpXGk3R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEW +TO6Af77wdr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS+YCk +8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYSd66UNHsef8JmAOSq +g+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoGAtUjHBPW6dvbxrB6y3snm/vg1UYk +7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2fgTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1Ud +EwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsu +N+7jhHonLs0ZNbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsMQtfhWsSWTVTN +j8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvfR4iyrT7gJ4eLSYwfqUdYe5by +iB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJDPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjU +o3KUQyxi4U5cMj29TH0ZR6LDSeeWP4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqo +ENjwuSfr98t67wVylrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7Egkaib +MOlqbLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2wAgDHbICi +vRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3qr5nsLFR+jM4uElZI7xc7 +P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sjiMho6/4UIyYOf8kpIEFR3N+2ivEC+5BB0 +9+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +SSL.com TLS ECC Root CA 2022 +============================ +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQswCQYDVQQGEwJV +UzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxTU0wuY29tIFRMUyBFQ0MgUm9v +dCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMx +GDAWBgNVBAoMD1NTTCBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3Qg +Q0EgMjAyMjB2MBAGByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWy +JGYmacCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFNSeR7T5v1 +5wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBSJjy+j6CugFFR7 +81a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NWuCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGG +MAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w +7deedWo1dlJF4AIxAMeNb0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5 +Zn6g6g== +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA ECC TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4wLAYDVQQDDCVB +dG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQswCQYD +VQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3Mg +VHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYT +AkRFMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6K +DP/XtXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4AjJn8ZQS +b+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2KCXWfeBmmnoJsmo7jjPX +NtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMDaAAwZQIwW5kp85wxtolrbNa9d+F851F+ +uDrNozZffPc8dz7kUK2o59JZDCaOMDtuCCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGY +a3cpetskz2VAv9LcjBHo9H1/IISpQuQo +-----END CERTIFICATE----- + +Atos TrustedRoot Root CA RSA TLS 2021 +===================================== +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBMMS4wLAYDVQQD +DCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIxMQ0wCwYDVQQKDARBdG9zMQsw +CQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0 +b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNV +BAYTAkRFMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BB +l01Z4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYvYe+W/CBG +vevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZkmGbzSoXfduP9LVq6hdK +ZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDsGY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt +0xU6kGpn8bRrZtkh68rZYnxGEFzedUlnnkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVK +PNe0OwANwI8f4UDErmwh3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMY +sluMWuPD0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzygeBY +Br3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8ANSbhqRAvNncTFd+ +rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezBc6eUWsuSZIKmAMFwoW4sKeFYV+xa +fJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lIpw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUdEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0G +CSqGSIb3DQEBDAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPso0UvFJ/1TCpl +Q3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJqM7F78PRreBrAwA0JrRUITWX +AdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuywxfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9G +slA9hGCZcbUztVdF5kJHdWoOsAgMrr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2Vkt +afcxBPTy+av5EzH4AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9q +TFsR0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuYo7Ey7Nmj +1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5dDTedk+SKlOxJTnbPP/l +PqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcEoji2jbDwN/zIIX8/syQbPYtuzE2wFg2W +HYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- + +TrustAsia Global Root CA G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIFpTCCA42gAwIBAgIUZPYOZXdhaqs7tOqFhLuxibhxkw8wDQYJKoZIhvcNAQEMBQAwWjELMAkG +A1UEBhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMM +G1RydXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHMzAeFw0yMTA1MjAwMjEwMTlaFw00NjA1MTkwMjEw +MTlaMFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMu +MSQwIgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzMwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQDAMYJhkuSUGwoqZdC+BqmHO1ES6nBBruL7dOoKjbmzTNyPtxNST1QY4Sxz +lZHFZjtqz6xjbYdT8PfxObegQ2OwxANdV6nnRM7EoYNl9lA+sX4WuDqKAtCWHwDNBSHvBm3dIZwZ +Q0WhxeiAysKtQGIXBsaqvPPW5vxQfmZCHzyLpnl5hkA1nyDvP+uLRx+PjsXUjrYsyUQE49RDdT/V +P68czH5GX6zfZBCK70bwkPAPLfSIC7Epqq+FqklYqL9joDiR5rPmd2jE+SoZhLsO4fWvieylL1Ag +dB4SQXMeJNnKziyhWTXAyB1GJ2Faj/lN03J5Zh6fFZAhLf3ti1ZwA0pJPn9pMRJpxx5cynoTi+jm +9WAPzJMshH/x/Gr8m0ed262IPfN2dTPXS6TIi/n1Q1hPy8gDVI+lhXgEGvNz8teHHUGf59gXzhqc +D0r83ERoVGjiQTz+LISGNzzNPy+i2+f3VANfWdP3kXjHi3dqFuVJhZBFcnAvkV34PmVACxmZySYg +WmjBNb9Pp1Hx2BErW+Canig7CjoKH8GB5S7wprlppYiU5msTf9FkPz2ccEblooV7WIQn3MSAPmea +mseaMQ4w7OYXQJXZRe0Blqq/DPNL0WP3E1jAuPP6Z92bfW1K/zJMtSU7/xxnD4UiWQWRkUF3gdCF +TIcQcf+eQxuulXUtgQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEDk5PIj +7zjKsK5Xf/IhMBY027ySMB0GA1UdDgQWBBRA5OTyI+84yrCuV3/yITAWNNu8kjAOBgNVHQ8BAf8E +BAMCAQYwDQYJKoZIhvcNAQEMBQADggIBACY7UeFNOPMyGLS0XuFlXsSUT9SnYaP4wM8zAQLpw6o1 +D/GUE3d3NZ4tVlFEbuHGLige/9rsR82XRBf34EzC4Xx8MnpmyFq2XFNFV1pF1AWZLy4jVe5jaN/T +G3inEpQGAHUNcoTpLrxaatXeL1nHo+zSh2bbt1S1JKv0Q3jbSwTEb93mPmY+KfJLaHEih6D4sTNj +duMNhXJEIlU/HHzp/LgV6FL6qj6jITk1dImmasI5+njPtqzn59ZW/yOSLlALqbUHM/Q4X6RJpstl +cHboCoWASzY9M/eVVHUl2qzEc4Jl6VL1XP04lQJqaTDFHApXB64ipCz5xUG3uOyfT0gA+QEEVcys ++TIxxHWVBqB/0Y0n3bOppHKH/lmLmnp0Ft0WpWIp6zqW3IunaFnT63eROfjXy9mPX1onAX1daBli +2MjN9LdyR75bl87yraKZk62Uy5P2EgmVtqvXO9A/EcswFi55gORngS1d7XB4tmBZrOFdRWOPyN9y +aFvqHbgB8X7754qz41SgOAngPN5C8sLtLpvzHzW2NtjjgKGLzZlkD8Kqq7HK9W+eQ42EVJmzbsAS +ZthwEPEGNTNDqJwuuhQxzhB/HIbjj9LV+Hfsm6vxL2PZQl/gZ4FkkfGXL/xuJvYz+NO1+MRiqzFR +JQJ6+N1rZdVtTTDIZbpoFGWsJwt0ivKH +-----END CERTIFICATE----- + +TrustAsia Global Root CA G4 +=========================== +-----BEGIN CERTIFICATE----- +MIICVTCCAdygAwIBAgIUTyNkuI6XY57GU4HBdk7LKnQV1tcwCgYIKoZIzj0EAwMwWjELMAkGA1UE +BhMCQ04xJTAjBgNVBAoMHFRydXN0QXNpYSBUZWNobm9sb2dpZXMsIEluYy4xJDAiBgNVBAMMG1Ry +dXN0QXNpYSBHbG9iYWwgUm9vdCBDQSBHNDAeFw0yMTA1MjAwMjEwMjJaFw00NjA1MTkwMjEwMjJa +MFoxCzAJBgNVBAYTAkNOMSUwIwYDVQQKDBxUcnVzdEFzaWEgVGVjaG5vbG9naWVzLCBJbmMuMSQw +IgYDVQQDDBtUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi +AATxs8045CVD5d4ZCbuBeaIVXxVjAd7Cq92zphtnS4CDr5nLrBfbK5bKfFJV4hrhPVbwLxYI+hW8 +m7tH5j/uqOFMjPXTNvk4XatwmkcN4oFBButJ+bAp3TPsUKV/eSm4IJijYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHwYDVR0jBBgwFoAUpbtKl86zK3+kMd6Xg1mDpm9xy94wHQYDVR0OBBYEFKW7SpfOsyt/ +pDHel4NZg6ZvccveMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjBe8usGzEkxn0AA +bbd+NvBNEU/zy4k6LHiRUKNbwMp1JvK/kF0LgoxgKJ/GcJpo5PECMFxYDlZ2z1jD1xCMuo6u47xk +dUfFVZDj/bpV6wfEU6s3qe4hsiFbYI89MvHVI5TWWA== +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIICHTCCAaOgAwIBAgIUQ3CCd89NXTTxyq4yLzf39H91oJ4wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMTAeFw0yMTA0MjgxNzM1NDNaFw00NjA0MjgxNzM1NDJaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAARLNumuV16ocNfQj3Rid8NeeqrltqLx +eP0CflfdkXmcbLlSiFS8LwS+uM32ENEp7LXQoMPwiXAZu1FlxUOcw5tjnSCDPgYLpkJEhRGnSjot +6dZoL0hOUysHP029uax3OVejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBSOB2LAUN3GGQYARnQE9/OufXVNMDAKBggqhkjOPQQDAwNoADBlAjEAnDPfQeMjqEI2 +Jpc1XHvr20v4qotzVRVcrHgpD7oh2MSg2NED3W3ROT3Ek2DS43KyAjB8xX6I01D1HiXo+k515liW +pDVfG2XqYZpwI7UNo5uSUm9poIyNStDuiw7LR47QjRE= +-----END CERTIFICATE----- + +CommScope Public Trust ECC Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIICHDCCAaOgAwIBAgIUKP2ZYEFHpgE6yhR7H+/5aAiDXX0wCgYIKoZIzj0EAwMwTjELMAkGA1UE +BhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBUcnVz +dCBFQ0MgUm9vdC0wMjAeFw0yMTA0MjgxNzQ0NTRaFw00NjA0MjgxNzQ0NTNaME4xCzAJBgNVBAYT +AlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1c3Qg +RUNDIFJvb3QtMDIwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAR4MIHoYx7l63FRD/cHB8o5mXxO1Q/M +MDALj2aTPs+9xYa9+bG3tD60B8jzljHz7aRP+KNOjSkVWLjVb3/ubCK1sK9IRQq9qEmUv4RDsNuE +SgMjGWdqb8FuvAY5N9GIIvejQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBTmGHX/72DehKT1RsfeSlXjMjZ59TAKBggqhkjOPQQDAwNnADBkAjAmc0l6tqvmSfR9 +Uj/UQQSugEODZXW5hYA4O9Zv5JOGq4/nich/m35rChJVYaoR4HkCMHfoMXGsPHED1oQmHhS48zs7 +3u1Z/GtMMH9ZzkXpc2AVmkzw5l4lIhVtwodZ0LKOag== +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-01 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUPgNJgXUWdDGOTKvVxZAplsU5EN0wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMTAeFw0yMTA0MjgxNjQ1NTRaFw00NjA0MjgxNjQ1NTNaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwSGWjDR1C45Ft +nYSkYZYSwu3D2iM0GXb26v1VWvZVAVMP8syMl0+5UMuzAURWlv2bKOx7dAvnQmtVzslhsuitQDy6 +uUEKBU8bJoWPQ7VAtYXR1HHcg0Hz9kXHgKKEUJdGzqAMxGBWBB0HW0alDrJLpA6lfO741GIDuZNq +ihS4cPgugkY4Iw50x2tBt9Apo52AsH53k2NC+zSDO3OjWiE260f6GBfZumbCk6SP/F2krfxQapWs +vCQz0b2If4b19bJzKo98rwjyGpg/qYFlP8GMicWWMJoKz/TUyDTtnS+8jTiGU+6Xn6myY5QXjQ/c +Zip8UlF1y5mO6D1cv547KI2DAg+pn3LiLCuz3GaXAEDQpFSOm117RTYm1nJD68/A6g3czhLmfTif +BSeolz7pUcZsBSjBAg/pGG3svZwG1KdJ9FQFa2ww8esD1eo9anbCyxooSU1/ZOD6K9pzg4H/kQO9 +lLvkuI6cMmPNn7togbGEW682v3fuHX/3SZtS7NJ3Wn2RnU3COS3kuoL4b/JOHg9O5j9ZpSPcPYeo +KFgo0fEbNttPxP/hjFtyjMcmAyejOQoBqsCyMWCDIqFPEgkBEa801M/XrmLTBQe0MXXgDW1XT2mH ++VepuhX2yFJtocucH+X8eKg1mp9BFM6ltM6UCBwJrVbl2rZJmkrqYxhTnCwuwwIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUN12mmnQywsL5x6YVEFm4 +5P3luG0wDQYJKoZIhvcNAQELBQADggIBAK+nz97/4L1CjU3lIpbfaOp9TSp90K09FlxD533Ahuh6 +NWPxzIHIxgvoLlI1pKZJkGNRrDSsBTtXAOnTYtPZKdVUvhwQkZyybf5Z/Xn36lbQnmhUQo8mUuJM +3y+Xpi/SB5io82BdS5pYV4jvguX6r2yBS5KPQJqTRlnLX3gWsWc+QgvfKNmwrZggvkN80V4aCRck +jXtdlemrwWCrWxhkgPut4AZ9HcpZuPN4KWfGVh2vtrV0KnahP/t1MJ+UXjulYPPLXAziDslg+Mkf +Foom3ecnf+slpoq9uC02EJqxWE2aaE9gVOX2RhOOiKy8IUISrcZKiX2bwdgt6ZYD9KJ0DLwAHb/W +NyVntHKLr4W96ioDj8z7PEQkguIBpQtZtjSNMgsSDesnwv1B10A8ckYpwIzqug/xBpMu95yo9GA+ +o/E4Xo4TwbM6l4c/ksp4qRyv0LAbJh6+cOx69TOY6lz/KwsETkPdY34Op054A5U+1C0wlREQKC6/ +oAI+/15Z0wUOlV9TRe9rh9VIzRamloPh37MG88EU26fsHItdkJANclHnYfkUyq+Dj7+vsQpZXdxc +1+SWrVtgHdqul7I52Qb1dgAT+GhMIbA1xNxVssnBQVocicCMb3SgazNNtQEo/a2tiRc7ppqEvOuM +6sRxJKi6KfkIsidWNTJf6jn7MZrVGczw +-----END CERTIFICATE----- + +CommScope Public Trust RSA Root-02 +================================== +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIUVBa/O345lXGN0aoApYYNK496BU4wDQYJKoZIhvcNAQELBQAwTjELMAkG +A1UEBhMCVVMxEjAQBgNVBAoMCUNvbW1TY29wZTErMCkGA1UEAwwiQ29tbVNjb3BlIFB1YmxpYyBU +cnVzdCBSU0EgUm9vdC0wMjAeFw0yMTA0MjgxNzE2NDNaFw00NjA0MjgxNzE2NDJaME4xCzAJBgNV +BAYTAlVTMRIwEAYDVQQKDAlDb21tU2NvcGUxKzApBgNVBAMMIkNvbW1TY29wZSBQdWJsaWMgVHJ1 +c3QgUlNBIFJvb3QtMDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDh+g77aAASyE3V +rCLENQE7xVTlWXZjpX/rwcRqmL0yjReA61260WI9JSMZNRTpf4mnG2I81lDnNJUDMrG0kyI9p+Kx +7eZ7Ti6Hmw0zdQreqjXnfuU2mKKuJZ6VszKWpCtYHu8//mI0SFHRtI1CrWDaSWqVcN3SAOLMV2MC +e5bdSZdbkk6V0/nLKR8YSvgBKtJjCW4k6YnS5cciTNxzhkcAqg2Ijq6FfUrpuzNPDlJwnZXjfG2W +Wy09X6GDRl224yW4fKcZgBzqZUPckXk2LHR88mcGyYnJ27/aaL8j7dxrrSiDeS/sOKUNNwFnJ5rp +M9kzXzehxfCrPfp4sOcsn/Y+n2Dg70jpkEUeBVF4GiwSLFworA2iI540jwXmojPOEXcT1A6kHkIf +hs1w/tkuFT0du7jyU1fbzMZ0KZwYszZ1OC4PVKH4kh+Jlk+71O6d6Ts2QrUKOyrUZHk2EOH5kQMr +eyBUzQ0ZGshBMjTRsJnhkB4BQDa1t/qp5Xd1pCKBXbCL5CcSD1SIxtuFdOa3wNemKfrb3vOTlycE +VS8KbzfFPROvCgCpLIscgSjX74Yxqa7ybrjKaixUR9gqiC6vwQcQeKwRoi9C8DfF8rhW3Q5iLc4t +Vn5V8qdE9isy9COoR+jUKgF4z2rDN6ieZdIs5fq6M8EGRPbmz6UNp2YINIos8wIDAQABo0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUR9DnsSL/nSz12Vdgs7Gx +cJXvYXowDQYJKoZIhvcNAQELBQADggIBAIZpsU0v6Z9PIpNojuQhmaPORVMbc0RTAIFhzTHjCLqB +KCh6krm2qMhDnscTJk3C2OVVnJJdUNjCK9v+5qiXz1I6JMNlZFxHMaNlNRPDk7n3+VGXu6TwYofF +1gbTl4MgqX67tiHCpQ2EAOHyJxCDut0DgdXdaMNmEMjRdrSzbymeAPnCKfWxkxlSaRosTKCL4BWa +MS/TiJVZbuXEs1DIFAhKm4sTg7GkcrI7djNB3NyqpgdvHSQSn8h2vS/ZjvQs7rfSOBAkNlEv41xd +gSGn2rtO/+YHqP65DSdsu3BaVXoT6fEqSWnHX4dXTEN5bTpl6TBcQe7rd6VzEojov32u5cSoHw2O +HG1QAk8mGEPej1WFsQs3BWDJVTkSBKEqz3EWnzZRSb9wO55nnPt7eck5HHisd5FUmrh1CoFSl+Nm +YWvtPjgelmFV4ZFUjO2MJB+ByRCac5krFk5yAD9UG/iNuovnFNa2RU9g7Jauwy8CTl2dlklyALKr +dVwPaFsdZcJfMw8eD/A7hvWwTruc9+olBdytoptLFwG+Qt81IR2tq670v64fG9PiO/yzcnMcmyiQ +iRM9HcEARwmWmjgb3bHPDcK0RPOWlc4yOo80nOAXx17Org3bhzjlP1v9mxnhMUF6cKojawHhRUzN +lM47ni3niAIi9G7oyOzWPPO5std3eqx7 +-----END CERTIFICATE----- + +Telekom Security TLS ECC Root 2020 +================================== +-----BEGIN CERTIFICATE----- +MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQswCQYDVQQGEwJE +RTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJUZWxl +a29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIwMB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIz +NTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkg +R21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqG +SM49AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/OtdKPD/M1 +2kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDPf8iAC8GXs7s1J8nCG6NC +MEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6fMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P +AQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZ +Mo7k+5Dck2TOrbRBR2Diz6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdU +ga/sf+Rn27iQ7t0l +-----END CERTIFICATE----- + +Telekom Security TLS RSA Root 2023 +================================== +-----BEGIN CERTIFICATE----- +MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQG +EwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBHbWJIMSswKQYDVQQDDCJU +ZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAyMDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMy +NzIzNTk1OVowYzELMAkGA1UEBhMCREUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJp +dHkgR21iSDErMCkGA1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9cUD/h3VC +KSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHVcp6R+SPWcHu79ZvB7JPP +GeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMAU6DksquDOFczJZSfvkgdmOGjup5czQRx +UX11eKvzWarE4GC+j4NSuHUaQTXtvPM6Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWo +l8hHD/BeEIvnHRz+sTugBTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9 +FIS3R/qy8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73Jco4v +zLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg8qKrBC7m8kwOFjQg +rIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8rFEz0ciD0cmfHdRHNCk+y7AO+oML +KFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7S +WWO/gLCMk3PLNaaZlSJhZQNg+y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNV +HQ4EFgQUtqeXgj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2 +p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQpGv7qHBFfLp+ +sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm9S3ul0A8Yute1hTWjOKWi0Fp +kzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErwM807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy +/SKE8YXJN3nptT+/XOR0so8RYgDdGGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4 +mZqTuXNnQkYRIer+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtz +aL1txKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+w6jv/naa +oqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aKL4x35bcF7DvB7L6Gs4a8 +wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+ljX273CXE2whJdV/LItM3z7gLfEdxquVeE +HVlNjM7IDiPCtyaaEBRx/pOyiriA8A4QntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0 +o82bNSQ3+pCTE4FCxpgmdTdmQRCsu/WU48IxK63nI1bMNSWSs1A= +-----END CERTIFICATE----- diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cmn_crt_authorities.csv b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cmn_crt_authorities.csv new file mode 100644 index 00000000..249ecf42 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/cmn_crt_authorities.csv @@ -0,0 +1,39 @@ +Owner,Common Name or Certificate Name +Amazon Trust Services,Amazon Root CA 1 +Amazon Trust Services,Amazon Root CA 2 +Amazon Trust Services,Amazon Root CA 3 +Amazon Trust Services,Amazon Root CA 4 +Amazon Trust Services,Starfield Services Root Certificate Authority - G2 +DigiCert,Baltimore CyberTrust Root +DigiCert,Cybertrust Global Root +DigiCert,DigiCert Assured ID Root CA +DigiCert,DigiCert Assured ID Root G2 +DigiCert,DigiCert Assured ID Root G3 +DigiCert,DigiCert Global Root CA +DigiCert,DigiCert Global Root G2 +DigiCert,DigiCert Global Root G3 +DigiCert,DigiCert High Assurance EV Root CA +DigiCert,DigiCert Trusted Root G4 +GlobalSign,GlobalSign ECC Root CA - R5 +GlobalSign,GlobalSign Root CA - R3 +GlobalSign,GlobalSign Root CA - R6 +GlobalSign,GlobalSign Root CA +GoDaddy,Go Daddy Class 2 CA +GoDaddy,Go Daddy Root Certificate Authority - G2 +GoDaddy,Starfield Class 2 CA +GoDaddy,Starfield Root Certificate Authority - G2 +Google Trust Services LLC (GTS),GlobalSign ECC Root CA - R4 +Google Trust Services LLC (GTS),GlobalSign Root CA - R2 +Google Trust Services LLC (GTS),GTS Root R1 +Google Trust Services LLC (GTS),GTS Root R2 +Google Trust Services LLC (GTS),GTS Root R3 +Google Trust Services LLC (GTS),GTS Root R4 +"IdenTrust Services, LLC",DST Root CA X3 +"IdenTrust Services, LLC",IdenTrust Commercial Root CA 1 +"IdenTrust Services, LLC",IdenTrust Public Sector Root CA 1 +Sectigo,Comodo AAA Services root +Sectigo,COMODO Certification Authority +Sectigo,COMODO ECC Certification Authority +Sectigo,COMODO RSA Certification Authority +Sectigo,USERTrust ECC Certification Authority +Sectigo,USERTrust RSA Certification Authority diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/gen_crt_bundle.py b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/gen_crt_bundle.py new file mode 100644 index 00000000..87e29e61 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/gen_crt_bundle.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python +# +# ESP32 x509 certificate bundle generation utility +# +# Converts PEM and DER certificates to a custom bundle format which stores just the +# subject name and public key to reduce space +# +# The bundle will have the format: number of certificates; crt 1 subject name length; crt 1 public key length; +# crt 1 subject name; crt 1 public key; crt 2... +# +# Copyright 2018-2019 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. + +from __future__ import with_statement + +import argparse +import csv +import os +import re +import struct +import sys +from io import open + +try: + from cryptography import x509 + from cryptography.hazmat.backends import default_backend + from cryptography.hazmat.primitives import serialization +except ImportError: + print('The cryptography package is not installed.' + 'Please refer to the Get Started section of the ESP-IDF Programming Guide for ' + 'setting up the required packages.') + raise + +ca_bundle_bin_file = 'x509_crt_bundle' + +quiet = False + + +def status(msg): + """ Print status message to stderr """ + if not quiet: + critical(msg) + + +def critical(msg): + """ Print critical message to stderr """ + sys.stderr.write('gen_crt_bundle.py: ') + sys.stderr.write(msg) + sys.stderr.write('\n') + + +class CertificateBundle: + def __init__(self): + self.certificates = [] + self.compressed_crts = [] + + if os.path.isfile(ca_bundle_bin_file): + os.remove(ca_bundle_bin_file) + + def add_from_path(self, crts_path): + + found = False + for file_path in os.listdir(crts_path): + found |= self.add_from_file(os.path.join(crts_path, file_path)) + + if found is False: + raise InputError('No valid x509 certificates found in %s' % crts_path) + + def add_from_file(self, file_path): + try: + if file_path.endswith('.pem'): + status('Parsing certificates from %s' % file_path) + with open(file_path, 'r', encoding='utf-8') as f: + crt_str = f.read() + self.add_from_pem(crt_str) + return True + + elif file_path.endswith('.der'): + status('Parsing certificates from %s' % file_path) + with open(file_path, 'rb') as f: + crt_str = f.read() + self.add_from_der(crt_str) + return True + + except ValueError: + critical('Invalid certificate in %s' % file_path) + raise InputError('Invalid certificate') + + return False + + def add_from_pem(self, crt_str): + """ A single PEM file may have multiple certificates """ + + crt = '' + count = 0 + start = False + + for strg in crt_str.splitlines(True): + if strg == '-----BEGIN CERTIFICATE-----\n' and start is False: + crt = '' + start = True + elif strg == '-----END CERTIFICATE-----\n' and start is True: + crt += strg + '\n' + start = False + self.certificates.append(x509.load_pem_x509_certificate(crt.encode(), default_backend())) + count += 1 + if start is True: + crt += strg + + if(count == 0): + raise InputError('No certificate found') + + status('Successfully added %d certificates' % count) + + def add_from_der(self, crt_str): + self.certificates.append(x509.load_der_x509_certificate(crt_str, default_backend())) + status('Successfully added 1 certificate') + + def create_bundle(self): + # Sort certificates in order to do binary search when looking up certificates + self.certificates = sorted(self.certificates, key=lambda cert: cert.subject.public_bytes(default_backend())) + + bundle = struct.pack('>H', len(self.certificates)) + + for crt in self.certificates: + """ Read the public key as DER format """ + pub_key = crt.public_key() + pub_key_der = pub_key.public_bytes(serialization.Encoding.DER, serialization.PublicFormat.SubjectPublicKeyInfo) + + """ Read the subject name as DER format """ + sub_name_der = crt.subject.public_bytes(default_backend()) + + name_len = len(sub_name_der) + key_len = len(pub_key_der) + len_data = struct.pack('>HH', name_len, key_len) + + bundle += len_data + bundle += sub_name_der + bundle += pub_key_der + + return bundle + + def add_with_filter(self, crts_path, filter_path): + + filter_set = set() + with open(filter_path, 'r', encoding='utf-8') as f: + csv_reader = csv.reader(f, delimiter=',') + + # Skip header + next(csv_reader) + for row in csv_reader: + filter_set.add(row[1]) + + status('Parsing certificates from %s' % crts_path) + crt_str = [] + with open(crts_path, 'r', encoding='utf-8') as f: + crt_str = f.read() + + # Split all certs into a list of (name, certificate string) tuples + pem_crts = re.findall(r'(^.+?)\n(=+\n[\s\S]+?END CERTIFICATE-----\n)', crt_str, re.MULTILINE) + + filtered_crts = '' + for name, crt in pem_crts: + if name in filter_set: + filtered_crts += crt + + self.add_from_pem(filtered_crts) + + +class InputError(RuntimeError): + def __init__(self, e): + super(InputError, self).__init__(e) + + +def main(): + global quiet + + parser = argparse.ArgumentParser(description='ESP-IDF x509 certificate bundle utility') + + parser.add_argument('--quiet', '-q', help="Don't print non-critical status messages to stderr", action='store_true') + parser.add_argument('--input', '-i', nargs='+', required=True, + help='Paths to the custom certificate folders or files to parse, parses all .pem or .der files') + parser.add_argument('--filter', '-f', help='Path to CSV-file where the second columns contains the name of the certificates \ + that should be included from cacrt_all.pem') + + args = parser.parse_args() + + quiet = args.quiet + + bundle = CertificateBundle() + + for path in args.input: + if os.path.isfile(path): + if os.path.basename(path) == 'cacrt_all.pem' and args.filter: + bundle.add_with_filter(path, args.filter) + else: + bundle.add_from_file(path) + elif os.path.isdir(path): + bundle.add_from_path(path) + else: + raise InputError('Invalid --input=%s, is neither file nor folder' % args.input) + + status('Successfully added %d certificates in total' % len(bundle.certificates)) + + crt_bundle = bundle.create_bundle() + + with open(ca_bundle_bin_file, 'wb') as f: + f.write(crt_bundle) + + +if __name__ == '__main__': + try: + main() + except InputError as e: + print(e) + sys.exit(2) diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/lib/README b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/lib/README new file mode 100644 index 00000000..6debab1e --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/platformio.ini b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/platformio.ini new file mode 100644 index 00000000..c4e94e4b --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/platformio.ini @@ -0,0 +1,25 @@ +; 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 + +[env:esp32dev] +platform = espressif32 +board = esp32dev +framework = arduino +monitor_speed = 115200 +upload_speed = 921600 +build_flags = + -DCORE_DEBUG_LEVEL=5 +lib_deps = ../../../src + +extra_scripts = + pre:run_gen_script.py + +board_build.embed_txtfiles = + data/cert/x509_crt_bundle.bin diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/readme.md b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/readme.md new file mode 100644 index 00000000..ad9c19b2 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/readme.md @@ -0,0 +1,12 @@ +This is a PlatformIO project that uses a modified WiFiClientSecure library (in `lib`) to +implement proper SSL support using root certificates as discussed +[here](https://github.com/espressif/arduino-esp32/issues/3646#issuecomment-648292677) + +It is based on the work by [meltdonw03](https://github.com/meltdown03) in that thread, and the +[BasicHttpsClient example](https://github.com/espressif/arduino-esp32/blob/1.0.4/libraries/HTTPClient/examples/BasicHttpsClient/BasicHttpsClient.ino) from the arduino-esp32 project. + +Just copy `include/secrets.hpp.template` to `include/secrets.hpp` and fill in your WiFi details. +Then it should be pretty much ready to go. The local WiFiClientSecure library should take priority. +Debug is set to verbose, so you'll see a lot of noise, but there should also be this readme on success :) + +To get a current CA cert bundle download it from [curl's website](https://curl.se/docs/caextract.html). \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/run_gen_script.py b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/run_gen_script.py new file mode 100644 index 00000000..88505dbd --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/run_gen_script.py @@ -0,0 +1,6 @@ +Import("env") + +env.Execute("$PYTHONEXE -m pip install cryptography") +env.Execute("$PYTHONEXE gen_crt_bundle.py --input cacrt_all.pem") +env.Execute("mkdir -p data/cert") +env.Execute("mv -f x509_crt_bundle data/cert/x509_crt_bundle.bin") diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/src/main.cpp b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/src/main.cpp new file mode 100644 index 00000000..17656144 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp32_pio/WebSocketClientSSLBundle/src/main.cpp @@ -0,0 +1,127 @@ +/* + * main.cpp + * + * Created on: 15.06.2024 + * + */ + +#include +#include +#include + +#include + +extern const uint8_t rootca_crt_bundle_start[] asm( + "_binary_data_cert_x509_crt_bundle_bin_start"); + +WiFiMulti wifiMulti; +WebSocketsClient webSocket; + +#define USE_SERIAL Serial + +void setClock() { + configTime(0, 0, "pool.ntp.org", "time.nist.gov"); + + USE_SERIAL.print(F("Waiting for NTP time sync: ")); + time_t nowSecs = time(nullptr); + while(nowSecs < 8 * 3600 * 2) { + delay(500); + USE_SERIAL.print(F(".")); + yield(); + nowSecs = time(nullptr); + } + + USE_SERIAL.println(); + struct tm timeinfo; + gmtime_r(&nowSecs, &timeinfo); + USE_SERIAL.print(F("Current time: ")); + USE_SERIAL.print(asctime(&timeinfo)); +} + +void hexdump(const void * mem, uint32_t len, uint8_t cols = 16) { + const uint8_t * src = (const uint8_t *)mem; + USE_SERIAL.printf("\n[HEXDUMP] Address: 0x%08X len: 0x%X (%d)", (ptrdiff_t)src, len, len); + for(uint32_t i = 0; i < len; i++) { + if(i % cols == 0) { + USE_SERIAL.printf("\n[0x%08X] 0x%08X: ", (ptrdiff_t)src, i); + } + USE_SERIAL.printf("%02X ", *src); + src++; + } + USE_SERIAL.printf("\n"); +} + +void webSocketEvent(WStype_t type, uint8_t * payload, size_t length) { + switch(type) { + case WStype_DISCONNECTED: + USE_SERIAL.printf("[WSc] Disconnected!\n"); + break; + case WStype_CONNECTED: + USE_SERIAL.printf("[WSc] Connected to url: %s\n", payload); + + // send message to server when Connected + webSocket.sendTXT("Connected"); + break; + case WStype_TEXT: + USE_SERIAL.printf("[WSc] get text: %s\n", payload); + + // send message to server + // webSocket.sendTXT("message here"); + break; + case WStype_BIN: + USE_SERIAL.printf("[WSc] get binary length: %u\n", length); + hexdump(payload, length); + + // send data to server + // webSocket.sendBIN(payload, length); + break; + case WStype_ERROR: + case WStype_FRAGMENT_TEXT_START: + case WStype_FRAGMENT_BIN_START: + case WStype_FRAGMENT: + case WStype_FRAGMENT_FIN: + break; + } +} + +void setup() { + USE_SERIAL.begin(115200); + + USE_SERIAL.setDebugOutput(true); + + USE_SERIAL.println(); + USE_SERIAL.println(); + USE_SERIAL.println(); + + for(uint8_t t = 4; t > 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + wifiMulti.addAP("SSID", "WIFI_PASSPHRASE"); + + // WiFi.disconnect(); + while(wifiMulti.run() != WL_CONNECTED) { + delay(100); + } + + setClock(); + + // server address, port and URL. This server can be flakey. + // Expected response: Request served by 0123456789abcdef + webSocket.beginSslWithBundle("echo.websocket.org", 443, "/", rootca_crt_bundle_start, ""); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional enable if needed + // webSocket.setAuthorization("user", "Password"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); +} + +void loop() { + webSocket.loop(); +} diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClient/WebSocketClient.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClient/WebSocketClient.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClient/WebSocketClient.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClient/WebSocketClient.ino diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/README.md b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/README.md new file mode 100644 index 00000000..496eef25 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/README.md @@ -0,0 +1,27 @@ +## Minimal example of WebsocketClientOTA and Python server + +Take this as small example, how achieve OTA update on ESP8266 and ESP32. + +Python server was wrote from train so take it only as bare example. +It's working, but it's not mean to run in production. + + +### Usage: + +Start server: +```bash +cd python_ota_server +python3 -m venv .venv +source .venv/bin/activate +pip3 install -r requirements.txt +python3 main.py +``` + +Flash ESP with example sketch and start it. + +Change version inside example sketch to higher and compile it and save it to bin file. + +Rename it to `mydevice-1.0.1-esp8266.bin` and place it inside new folder firmware (server create it). + +When the ESP connect to server, it check if version flashed is equal to fw in firmware folder. If higher FW version is present, +start the flash process. \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino new file mode 100644 index 00000000..3a988a58 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/WebSocketClientOTA.ino @@ -0,0 +1,264 @@ +/* + * WebSocketClientOTA.ino + * + * Created on: 25.10.2021 + * + */ + +#include +#include + +#if defined(ESP8266) + #include + #include + #include + #include + #include + + ESP8266WiFiMulti WiFiMulti; +#elif defined(ESP32) + #include + #include + #include "ESPmDNS.h" + #include + + WiFiMulti WiFiMulti; +#else + #error Unsupported device +#endif + +#include +#include + + +WebSocketsClient webSocket; + +#define USE_SERIAL Serial + +// Variables: +// Settable: +const char *version = "1.0.0"; +const char *name = "mydevice"; + +// Others: +#ifdef ESP8266 + const char *chip = "esp8266"; +#endif +#ifdef ESP32 + const char *chip = "esp32"; +#endif + +uint32_t maxSketchSpace = 0; +int SketchSize = 0; +bool ws_conn = false; + + +void greetings_(){ + StaticJsonDocument<200> doc; + doc["type"] = "greetings"; + doc["mac"] = WiFi.macAddress().c_str(); + doc["ip"] = WiFi.localIP().toString().c_str(); + doc["version"] = version; + doc["name"] = name; + doc["chip"] = chip; + + char data[200]; + serializeJson(doc, data); + webSocket.sendTXT(data); +} + +void register_(){ + StaticJsonDocument<200> doc; + doc["type"] = "register"; + doc["mac"] = WiFi.macAddress().c_str(); + + char data[200]; + serializeJson(doc, data); + webSocket.sendTXT(data); + ws_conn = true; +} + +typedef void (*CALLBACK_FUNCTION)(JsonDocument &msg); + +typedef struct { + char type[50]; + CALLBACK_FUNCTION func; +} RESPONSES_STRUCT; + +void OTA_RESPONSES(JsonDocument &msg){ + USE_SERIAL.print(F("[WSc] OTA mode: ")); + String val = msg["value"]; + if(val == "go") { + USE_SERIAL.print(F("go\n")); + SketchSize = int(msg["size"]); + maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; + USE_SERIAL.printf("[WSc] Max sketch size: %u\n", maxSketchSpace); + USE_SERIAL.printf("[WSc] Sketch size: %d\n", SketchSize); + USE_SERIAL.setDebugOutput(true); + if (!Update.begin(maxSketchSpace)) { //start with max available size + Update.printError(Serial); + ESP.restart(); + } + } else if (val == "ok") { + USE_SERIAL.print(F("OK\n")); + register_(); + } else { + USE_SERIAL.print(F("unknown value : ")); + USE_SERIAL.print(val); + USE_SERIAL.print(F("\n")); + } +} + +void STA_RESPONSES(JsonDocument &msg){ + // Do something with message +} + +// Count of responses handled by RESPONSES_STRUCT +// increase increase if another response handler is added +const int nrOfResponses = 2; + +RESPONSES_STRUCT responses[nrOfResponses] = { + {"ota", OTA_RESPONSES}, + {"state", STA_RESPONSES}, +}; + +void text(uint8_t * payload, size_t length){ + // Convert message to something usable + char msgch[length]; + for (unsigned int i = 0; i < length; i++) + { + USE_SERIAL.print((char)payload[i]); + msgch[i] = ((char)payload[i]); + } + msgch[length] = '\0'; + + // Parse Json + StaticJsonDocument<200> doc_in; + DeserializationError error = deserializeJson(doc_in, msgch); + + if (error) { + USE_SERIAL.print(F("deserializeJson() failed: ")); + USE_SERIAL.println(error.c_str()); + return; + } + + // Handle each TYPE of message + int b = 0; + + String t = doc_in["type"]; + for( b=0 ; b 0; t--) { + USE_SERIAL.printf("[SETUP] BOOT WAIT %d...\n", t); + USE_SERIAL.flush(); + delay(1000); + } + + WiFiMulti.addAP("SSID", "PASS"); + + //WiFi.disconnect(); + while(WiFiMulti.run() != WL_CONNECTED) { + delay(100); + } + + // server address, port and URL + webSocket.begin("10.0.1.5", 8081, "/"); + + // event handler + webSocket.onEvent(webSocketEvent); + + // use HTTP Basic Authorization this is optional remove if not needed + // webSocket.setAuthorization("USER", "PASS"); + + // try ever 5000 again if connection has failed + webSocket.setReconnectInterval(5000); + + // start heartbeat (optional) + // ping server every 15000 ms + // expect pong from server within 3000 ms + // consider connection disconnected if pong is not received 2 times + webSocket.enableHeartbeat(15000, 3000, 2); + +} + +void loop() { + webSocket.loop(); +} diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/main.py b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/main.py new file mode 100644 index 00000000..92acc95c --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/main.py @@ -0,0 +1,235 @@ +"""Minimal example of Python websocket server +handling OTA updates for ESP32 amd ESP8266 + +Check and upload of firmware works. +Register and state function are jus for example. +""" +# pylint: disable=W0703,E1101 +import asyncio +import copy +import json +import logging +import subprocess +import threading +import time +from os import listdir +from os.path import join as join_pth +from pathlib import Path + +import websockets +from packaging import version + +# Logger settings +logging.basicConfig(filename="ws_server.log") +Logger = logging.getLogger('WS-OTA') +Logger.addHandler(logging.StreamHandler()) +Logger.setLevel(logging.INFO) + +# Path to directory with FW +fw_path = join_pth(Path().absolute(), "firmware") + + +def create_path(path: str) -> None: + """Check if path exist or create it""" + Path(path).mkdir(parents=True, exist_ok=True) + + +def shell(command): + """Handle execution of shell commands""" + with subprocess.Popen(command, shell=True, + stdout=subprocess.PIPE, + universal_newlines=True + ) as process: + for stdout_line in iter(process.stdout.readline, ""): + Logger.debug(stdout_line) + process.stdout.close() + return_code = process.wait() + Logger.debug("Shell returned: %s", return_code) + + return process.returncode + return None + + +async def binary_send(websocket, fw_file): + """Read firmware file, divide it to chunks and send them""" + with open(fw_file, "rb") as binaryfile: + + while True: + chunk = binaryfile.read(4096) + if not chunk: + break + try: + await websocket.send(chunk) + except Exception as exception: + Logger.exception(exception) + return False + asyncio.sleep(0.2) + + +def version_checker(name, vdev, vapp): + """Parse and compare FW version""" + + if version.parse(vdev) < version.parse(vapp): + Logger.info("Client(%s) version %s is smaller than %s: Go for update", name, vdev, vapp) + return True + Logger.info("Client(%s) version %s is greater or equal to %s: Not updating", name, vdev, vapp) + return False + + +class WsOtaHandler (threading.Thread): + """Thread handling ota update + + Running ota directly from message would kill WS + as message bus would timeout. + """ + def __init__(self, name, message, websocket): + threading.Thread.__init__(self, daemon=True) + self.name = name + self.msg = message + self.websocket = websocket + + def run(self, ): + try: + asyncio.run(self.start_()) + except Exception as exception: + Logger.exception(exception) + finally: + pass + + async def start_(self): + """Start _ota se asyncio future""" + msg_task = asyncio.ensure_future( + self._ota()) + + done, pending = await asyncio.wait( + [msg_task], + return_when=asyncio.FIRST_COMPLETED, + ) + Logger.info("WS Ota Handler done: %s", done) + for task in pending: + task.cancel() + + async def _ota(self): + """Check for new fw and update or pass""" + device_name = self.msg['name'] + device_chip = self.msg['chip'] + device_version = self.msg['version'] + fw_version = '' + fw_name = '' + fw_device = '' + + for filename in listdir(fw_path): + fw_info = filename.split("-") + fw_device = fw_info[0] + if fw_device == device_name: + fw_version = fw_info[1] + fw_name = filename + break + + if not fw_version: + Logger.info("Client(%s): No fw found!", device_name) + msg = '{"type": "ota", "value":"ok"}' + await self.websocket.send(msg) + return + + if not version_checker(device_name, device_version, fw_version): + return + + fw_file = join_pth(fw_path, fw_name) + if device_chip == 'esp8266' and not fw_file.endswith('.gz'): + # We can compress fw to make it smaller for upload + fw_cpress = fw_file + fw_file = fw_cpress + ".gz" + cpress = f"gzip -9 {fw_cpress}" + cstate = shell(cpress) + if cstate: + Logger.error("Cannot compress firmware: %s", fw_name) + return + + # Get size of fw + size = Path(fw_file).stat().st_size + + # Request ota mode + msg = '{"type": "ota", "value":"go", "size":' + str(size) + '}' + await self.websocket.send(msg) + + # send file by chunks trough websocket + await binary_send(self.websocket, fw_file) + + +async def _register(websocket, message): + mac = message.get('mac') + name = message.get('name') + Logger.info("Client(%s) mac: %s", name, mac) + # Some code + + response = {'type': 'registry', 'state': 'ok'} + await websocket.send(json.dumps(response)) + + +async def _state(websocket, message): + mac = message.get('mac') + name = message.get('name') + Logger.info("Client(%s) mac: %s", name, mac) + # Some code + + response = {'type': 'state', 'state': 'ok'} + await websocket.send(json.dumps(response)) + + +async def _unhandled(websocket, msg): + Logger.info("Unhandled message from device: %s", str(msg)) + response = {'type': 'response', 'state': 'nok'} + await websocket.send(json.dumps(response)) + + +async def _greetings(websocket, message): + WsOtaHandler('thread_ota', copy.deepcopy(message), websocket).start() + + +async def message_received(websocket, message) -> None: + """Handle incoming messages + + Check if message contain json and run waned function + """ + switcher = {"greetings": _greetings, + "register": _register, + "state": _state + } + + if message[0:1] == "{": + try: + msg_json = json.loads(message) + except Exception as exception: + Logger.error(exception) + return + + type_ = msg_json.get('type') + name = msg_json.get('name') + func = switcher.get(type_, _unhandled) + Logger.debug("Client(%s)said: %s", name, type_) + + try: + await func(websocket, msg_json) + except Exception as exception: + Logger.error(exception) + + +# pylint: disable=W0613 +async def ws_server(websocket, path) -> None: + """Run in cycle and wait for new messages""" + async for message in websocket: + await message_received(websocket, message) + + +async def main(): + """Server starter + + Normal user can bind only port numbers greater than 1024 + """ + async with websockets.serve(ws_server, "10.0.1.5", 8081): + await asyncio.Future() # run forever + + +create_path(fw_path) +asyncio.run(main()) diff --git a/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/requirements.txt b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/requirements.txt new file mode 100644 index 00000000..4fc2553f --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientOTA/python_ota_server/requirements.txt @@ -0,0 +1,2 @@ +packaging +websockets \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSSL/WebSocketClientSSL.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSSL/WebSocketClientSSL.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSSL/WebSocketClientSSL.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSSLWithCA/WebSocketClientSSLWithCA.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIO/WebSocketClientSocketIO.ino similarity index 97% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIO/WebSocketClientSocketIO.ino index b0568f41..5ceacea4 100644 --- a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIO/WebSocketClientSocketIO.ino +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIO/WebSocketClientSocketIO.ino @@ -88,7 +88,7 @@ void setup() { USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); // server address, port and URL - socketIO.begin("10.11.100.100", 8880); + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); // event handler socketIO.onEvent(socketIOEvent); @@ -106,7 +106,7 @@ void loop() { // creat JSON message for Socket.IO (event) DynamicJsonDocument doc(1024); JsonArray array = doc.to(); - + // add evnet name // Hint: socket.on('event_name', .... array.add("event_name"); @@ -119,7 +119,7 @@ void loop() { String output; serializeJson(doc, output); - // Send event + // Send event socketIO.sendEVENT(output); // Print JSON for debugging diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino similarity index 96% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino index ab9ff684..3e4f87e1 100644 --- a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino +++ b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientSocketIOack/WebSocketClientSocketIOack.ino @@ -49,7 +49,7 @@ void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) USE_SERIAL.println(error.c_str()); return; } - + String eventName = doc[0]; USE_SERIAL.printf("[IOc] event name: %s\n", eventName.c_str()); @@ -58,7 +58,7 @@ void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) // creat JSON message for Socket.IO (ack) DynamicJsonDocument docOut(1024); JsonArray array = docOut.to(); - + // add payload (parameters) for the ack (callback function) JsonObject param1 = array.createNestedObject(); param1["now"] = millis(); @@ -68,7 +68,7 @@ void socketIOEvent(socketIOmessageType_t type, uint8_t * payload, size_t length) output += id; serializeJson(docOut, output); - // Send event + // Send event socketIO.send(sIOtype_ACK, output); } } @@ -125,7 +125,7 @@ void setup() { USE_SERIAL.printf("[SETUP] WiFi Connected %s\n", ip.c_str()); // server address, port and URL - socketIO.begin("10.11.100.100", 8880); + socketIO.begin("10.11.100.100", 8880, "/socket.io/?EIO=4"); // event handler socketIO.onEvent(socketIOEvent); @@ -143,7 +143,7 @@ void loop() { // creat JSON message for Socket.IO (event) DynamicJsonDocument doc(1024); JsonArray array = doc.to(); - + // add evnet name // Hint: socket.on('event_name', .... array.add("event_name"); @@ -156,7 +156,7 @@ void loop() { String output; serializeJson(doc, output); - // Send event + // Send event socketIO.sendEVENT(output); // Print JSON for debugging diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientStomp/WebSocketClientStomp.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientStomp/WebSocketClientStomp.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientStomp/WebSocketClientStomp.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketClientStompOverSockJs/WebSocketClientStompOverSockJs.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServer/WebSocketServer.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServer/WebSocketServer.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServer/WebSocketServer.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServer/WebSocketServer.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerAllFunctionsDemo/WebSocketServerAllFunctionsDemo.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerFragmentation/WebSocketServerFragmentation.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerFragmentation/WebSocketServerFragmentation.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerFragmentation/WebSocketServerFragmentation.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/WebSocketServerHooked.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/WebSocketServerHooked.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/WebSocketServerHooked.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/emu b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/emu similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/emu rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/emu diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/ws-testclient.py b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/ws-testclient.py similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHooked/ws-testclient.py rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHooked/ws-testclient.py diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServerHttpHeaderValidation/WebSocketServerHttpHeaderValidation.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino b/libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/esp8266/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino rename to libraries/arduinoWebSockets-2.5.2/examples/esp8266_pico/WebSocketServer_LEDcontrol/WebSocketServer_LEDcontrol.ino diff --git a/libraries/arduinoWebSockets-2.3.6/examples/particle/ParticleWebSocketClient/application.cpp b/libraries/arduinoWebSockets-2.5.2/examples/particle/ParticleWebSocketClient/application.cpp similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/examples/particle/ParticleWebSocketClient/application.cpp rename to libraries/arduinoWebSockets-2.5.2/examples/particle/ParticleWebSocketClient/application.cpp diff --git a/libraries/arduinoWebSockets-2.3.6/library.json b/libraries/arduinoWebSockets-2.5.2/library.json similarity index 84% rename from libraries/arduinoWebSockets-2.3.6/library.json rename to libraries/arduinoWebSockets-2.5.2/library.json index 2f7aec6a..6869b8c0 100644 --- a/libraries/arduinoWebSockets-2.3.6/library.json +++ b/libraries/arduinoWebSockets-2.5.2/library.json @@ -16,10 +16,10 @@ "keywords": "wifi, http, web, server, client, websocket", "license": "LGPL-2.1", "name": "WebSockets", - "platforms": "atmelavr, espressif8266, espressif32", + "platforms": "atmelavr, espressif8266, espressif32, raspberrypi, renesas_uno", "repository": { "type": "git", "url": "https://github.com/Links2004/arduinoWebSockets.git" }, - "version": "2.3.6" + "version": "2.5.2" } \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.3.6/library.properties b/libraries/arduinoWebSockets-2.5.2/library.properties similarity index 94% rename from libraries/arduinoWebSockets-2.3.6/library.properties rename to libraries/arduinoWebSockets-2.5.2/library.properties index b9899d0c..ceb4a3f4 100644 --- a/libraries/arduinoWebSockets-2.3.6/library.properties +++ b/libraries/arduinoWebSockets-2.5.2/library.properties @@ -1,5 +1,5 @@ name=WebSockets -version=2.3.6 +version=2.5.2 author=Markus Sattler maintainer=Markus Sattler sentence=WebSockets for Arduino (Server + Client) diff --git a/libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.cpp b/libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.cpp similarity index 85% rename from libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.cpp rename to libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.cpp index a06efa28..1533316f 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.cpp +++ b/libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.cpp @@ -15,39 +15,39 @@ SocketIOclient::SocketIOclient() { SocketIOclient::~SocketIOclient() { } -void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol) { +void SocketIOclient::begin(const char * host, uint16_t port, const char * url, const char * protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIO(host, port, url, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } -void SocketIOclient::begin(String host, uint16_t port, String url, String protocol) { +void SocketIOclient::begin(String host, uint16_t port, String url, String protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIO(host, port, url, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } #if defined(HAS_SSL) -void SocketIOclient::beginSSL(const char * host, uint16_t port, const char * url, const char * protocol) { +void SocketIOclient::beginSSL(const char * host, uint16_t port, const char * url, const char * protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } -void SocketIOclient::beginSSL(String host, uint16_t port, String url, String protocol) { +void SocketIOclient::beginSSL(String host, uint16_t port, String url, String protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIOSSL(host, port, url, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } #if defined(SSL_BARESSL) -void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol) { +void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, const char * CA_cert, const char * protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } -void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol) { +void SocketIOclient::beginSSLWithCA(const char * host, uint16_t port, const char * url, BearSSL::X509List * CA_cert, const char * protocol, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { WebSocketsClient::beginSocketIOSSLWithCA(host, port, url, CA_cert, protocol); - WebSocketsClient::enableHeartbeat(60 * 1000, 90 * 1000, 5); + WebSocketsClient::enableHeartbeat(pingInterval, pongTimeout, disconnectTimeoutCount); initClient(); } @@ -85,6 +85,18 @@ bool SocketIOclient::isConnected(void) { return WebSocketsClient::isConnected(); } +void SocketIOclient::setExtraHeaders(const char * extraHeaders) { + return WebSocketsClient::setExtraHeaders(extraHeaders); +} + +void SocketIOclient::setReconnectInterval(unsigned long time) { + return WebSocketsClient::setReconnectInterval(time); +} + +void SocketIOclient::disconnect(void) { + WebSocketsClient::disconnect(); +} + /** * send text data to client * @param num uint8_t client id diff --git a/libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.h b/libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.h similarity index 79% rename from libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.h rename to libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.h index 6deb168b..e33a6fd6 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/SocketIOclient.h +++ b/libraries/arduinoWebSockets-2.5.2/src/SocketIOclient.h @@ -9,6 +9,7 @@ #define SOCKETIOCLIENT_H_ #include "WebSockets.h" +#include "WebSocketsClient.h" #define EIO_HEARTBEAT_INTERVAL 20000 @@ -46,15 +47,15 @@ class SocketIOclient : protected WebSocketsClient { SocketIOclient(void); virtual ~SocketIOclient(void); - void begin(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); - void begin(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + void begin(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); + void begin(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); #ifdef HAS_SSL - void beginSSL(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); - void beginSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino"); + void beginSSL(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); + void beginSSL(String host, uint16_t port, String url = "/socket.io/?EIO=3", String protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); #ifndef SSL_AXTLS - void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * CA_cert = NULL, const char * protocol = "arduino"); - void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", BearSSL::X509List * CA_cert = NULL, const char * protocol = "arduino"); + void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * CA_cert = NULL, const char * protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); + void beginSSLWithCA(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", BearSSL::X509List * CA_cert = NULL, const char * protocol = "arduino", uint32_t pingInterval = 60 * 1000, uint32_t pongTimeout = 90 * 1000, uint8_t disconnectTimeoutCount = 5); void setSSLClientCertKey(const char * clientCert = NULL, const char * clientPrivateKey = NULL); void setSSLClientCertKey(BearSSL::X509List * clientCert = NULL, BearSSL::PrivateKey * clientPrivateKey = NULL); #endif @@ -62,6 +63,7 @@ class SocketIOclient : protected WebSocketsClient { bool isConnected(void); void onEvent(SocketIOclientEvent cbEvent); + void disconnect(void); bool sendEVENT(uint8_t * payload, size_t length = 0, bool headerToPayload = false); bool sendEVENT(const uint8_t * payload, size_t length = 0); @@ -75,6 +77,9 @@ class SocketIOclient : protected WebSocketsClient { bool send(socketIOmessageType_t type, const char * payload, size_t length = 0); bool send(socketIOmessageType_t type, String & payload); + void setExtraHeaders(const char * extraHeaders = NULL); + void setReconnectInterval(unsigned long time); + void loop(void); void configureEIOping(bool disableHeartbeat = false); diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSockets.cpp b/libraries/arduinoWebSockets-2.5.2/src/WebSockets.cpp similarity index 86% rename from libraries/arduinoWebSockets-2.3.6/src/WebSockets.cpp rename to libraries/arduinoWebSockets-2.5.2/src/WebSockets.cpp index 132e0576..d4f11cbc 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSockets.cpp +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSockets.cpp @@ -42,7 +42,11 @@ extern "C" { #include #if ESP_IDF_VERSION_MAJOR >= 4 -#include +#if(ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(1, 0, 6)) +#include "sha/sha_parallel_engine.h" +#else +#include +#endif #else #include #endif @@ -62,8 +66,7 @@ extern "C" { * @param reason ptr to the disconnect reason message * @param reasonLen length of the disconnect reason message */ -void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) -{ +void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * reason, size_t reasonLen) { DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] clientDisconnect code: %u\n", client->num, code); if(client->status == WSC_CONNECTED && code) { if(reason) { @@ -87,8 +90,7 @@ void WebSockets::clientDisconnect(WSclient_t * client, uint16_t code, char * rea * @param maskkey uint8_t[4] key used for payload * @param fin bool can be used to send data in more then one frame (set fin on the last frame) */ -uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) -{ +uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t length, bool mask, uint8_t maskKey[4], bool fin) { uint8_t headerSize; // calculate header Size if(length < 126) { @@ -172,8 +174,7 @@ uint8_t WebSockets::createHeader(uint8_t * headerPtr, WSopcode_t opcode, size_t * @param fin bool can be used to send data in more then one frame (set fin on the last frame) * @return true if ok */ -bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool fin) -{ +bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t length, bool fin) { uint8_t maskKey[4] = { 0x00, 0x00, 0x00, 0x00 }; uint8_t buffer[WEBSOCKETS_MAX_HEADER_SIZE] = { 0 }; @@ -196,8 +197,7 @@ bool WebSockets::sendFrameHeader(WSclient_t * client, WSopcode_t opcode, size_t * @param headerToPayload bool set true if the payload has reserved 14 Byte at the beginning to dynamically add the Header (payload neet to be in RAM!) * @return true if ok */ -bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin, bool headerToPayload) -{ +bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * payload, size_t length, bool fin, bool headerToPayload) { if(client->tcp && !client->tcp->connected()) { DEBUG_WEBSOCKETS("[WS][%d][sendFrame] not Connected!?\n", client->num); return false; @@ -324,8 +324,7 @@ bool WebSockets::sendFrame(WSclient_t * client, WSopcode_t opcode, uint8_t * pay * callen when HTTP header is done * @param client WSclient_t * ptr to the client struct */ -void WebSockets::headerDone(WSclient_t * client) -{ +void WebSockets::headerDone(WSclient_t * client) { client->status = WSC_CONNECTED; client->cWsRXsize = 0; DEBUG_WEBSOCKETS("[WS][%d][headerDone] Header Handling Done.\n", client->num); @@ -339,8 +338,7 @@ void WebSockets::headerDone(WSclient_t * client) * handle the WebSocket stream * @param client WSclient_t * ptr to the client struct */ -void WebSockets::handleWebsocket(WSclient_t * client) -{ +void WebSockets::handleWebsocket(WSclient_t * client) { if(client->cWsRXsize == 0) { handleWebsocketCb(client); } @@ -351,8 +349,7 @@ void WebSockets::handleWebsocket(WSclient_t * client) * @param client * @param size */ -bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) -{ +bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) { if(!client->tcp || !client->tcp->connected()) { return false; } @@ -379,12 +376,11 @@ bool WebSockets::handleWebsocketWaitFor(WSclient_t * client, size_t size) server->clientDisconnect(client, 1002); } }, - this, size, std::placeholders::_1, std::placeholders::_2)); + this, size, std::placeholders::_1, std::placeholders::_2)); return false; } -void WebSockets::handleWebsocketCb(WSclient_t * client) -{ +void WebSockets::handleWebsocketCb(WSclient_t * client) { if(!client->tcp || !client->tcp->connected()) { return; } @@ -469,15 +465,14 @@ void WebSockets::handleWebsocketCb(WSclient_t * client) } } -void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) -{ +void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * payload) { WSMessageHeader_t * header = &client->cWsHeaderDecode; if(ok) { if(header->payloadLen > 0) { payload[header->payloadLen] = 0x00; if(header->mask) { - //decode XOR + // decode XOR for(size_t i = 0; i < header->payloadLen; i++) { payload[i] = (payload[i] ^ header->maskKey[i % 4]); } @@ -485,44 +480,43 @@ void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t } switch(header->opCode) { - case WSop_text: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); - // no break here! - case WSop_binary: - case WSop_continuation: - messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); - break; - case WSop_ping: - // send pong back - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ping received (%s)\n", client->num, payload ? (const char *)payload : ""); - sendFrame(client, WSop_pong, payload, header->payloadLen); - messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); - break; - case WSop_pong: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload ? (const char *)payload : ""); - client->pongReceived = true; - messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); - break; - case WSop_close: { + case WSop_text: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] text: %s\n", client->num, payload); + // fallthrough + case WSop_binary: + case WSop_continuation: + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_ping: + // send pong back + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] ping received (%s)\n", client->num, payload ? (const char *)payload : ""); + sendFrame(client, WSop_pong, payload, header->payloadLen); + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_pong: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get pong (%s)\n", client->num, payload ? (const char *)payload : ""); + client->pongReceived = true; + messageReceived(client, header->opCode, payload, header->payloadLen, header->fin); + break; + case WSop_close: { #ifndef NODEBUG_WEBSOCKETS - uint16_t reasonCode = 1000; - if(header->payloadLen >= 2) { - reasonCode = payload[0] << 8 | payload[1]; - } + uint16_t reasonCode = 1000; + if(header->payloadLen >= 2) { + reasonCode = payload[0] << 8 | payload[1]; + } #endif - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d\n", client->num, reasonCode); - if(header->payloadLen > 2) { - DEBUG_WEBSOCKETS(" (%s)\n", (payload + 2)); - } else { - DEBUG_WEBSOCKETS("\n"); - } - clientDisconnect(client, 1000); - } - break; - default: - DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] got unknown opcode: %d\n", client->num, header->opCode); - clientDisconnect(client, 1002); - break; + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] get ask for close. Code: %d\n", client->num, reasonCode); + if(header->payloadLen > 2) { + DEBUG_WEBSOCKETS(" (%s)\n", (payload + 2)); + } else { + DEBUG_WEBSOCKETS("\n"); + } + clientDisconnect(client, 1000); + } break; + default: + DEBUG_WEBSOCKETS("[WS][%d][handleWebsocket] got unknown opcode: %d\n", client->num, header->opCode); + clientDisconnect(client, 1002); + break; } if(payload) { @@ -532,7 +526,7 @@ void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t // reset input client->cWsRXsize = 0; #if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) - //register callback for next message + // register callback for next message handleWebsocketWaitFor(client, 2); #endif @@ -548,8 +542,7 @@ void WebSockets::handleWebsocketPayloadCb(WSclient_t * client, bool ok, uint8_t * @param clientKey String * @return String Accept Key */ -String WebSockets::acceptKey(String & clientKey) -{ +String WebSockets::acceptKey(String & clientKey) { uint8_t sha1HashBin[20] = { 0 }; #ifdef ESP8266 sha1(clientKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", &sha1HashBin[0]); @@ -576,9 +569,9 @@ String WebSockets::acceptKey(String & clientKey) * @param length size_t * @return base64 encoded String */ -String WebSockets::base64_encode(uint8_t * data, size_t length) -{ +String WebSockets::base64_encode(uint8_t * data, size_t length) { size_t size = ((length * 1.6f) + 1); + size = std::max(size, (size_t)5); // minimum buffer size char * buffer = (char *)malloc(size); if(buffer) { base64_encodestate _state; @@ -600,8 +593,7 @@ String WebSockets::base64_encode(uint8_t * data, size_t length) * @param n size_t byte count * @return true if ok */ -bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) -{ +bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWaitCb cb) { #if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) if(!client->tcp || !client->tcp->connected()) { return false; @@ -612,7 +604,7 @@ bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWait cb(client, ok); } }, - client, std::placeholders::_1, cb)); + client, std::placeholders::_1, cb)); #else unsigned long t = millis(); @@ -653,9 +645,9 @@ bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWait t = millis(); out += len; n -= len; - //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + // DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); } else { - //DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); + // DEBUG_WEBSOCKETS("Receive %d left %d!\n", len, n); } if(n > 0) { WEBSOCKETS_YIELD(); @@ -676,14 +668,11 @@ bool WebSockets::readCb(WSclient_t * client, uint8_t * out, size_t n, WSreadWait * @param n size_t byte count * @return bytes send */ -size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) -{ - if(out == NULL) { +size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) { + if(out == NULL) return 0; - } - if(client == NULL) { + if(client == NULL) return 0; - } unsigned long t = millis(); size_t len = 0; size_t total = 0; @@ -710,7 +699,7 @@ size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) out += len; n -= len; total += len; - //DEBUG_WEBSOCKETS("write %d left %d!\n", len, n); + // DEBUG_WEBSOCKETS("write %d left %d!\n", len, n); } else { DEBUG_WEBSOCKETS("WS write %d failed left %d!\n", len, n); } @@ -722,14 +711,11 @@ size_t WebSockets::write(WSclient_t * client, uint8_t * out, size_t n) return total; } -size_t WebSockets::write(WSclient_t * client, const char * out) -{ - if(client == NULL) { +size_t WebSockets::write(WSclient_t * client, const char * out) { + if(client == NULL) return 0; - } - if(out == NULL) { + if(out == NULL) return 0; - } return write(client, (uint8_t *)out, strlen(out)); } @@ -740,11 +726,9 @@ size_t WebSockets::write(WSclient_t * client, const char * out) * @param pongTimeout uint32_t millis after which pong should timout if not received * @param disconnectTimeoutCount uint8_t how many timeouts before disconnect, 0=> do not disconnect */ -void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) -{ - if(client == NULL) { +void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount) { + if(client == NULL) return; - } client->pingInterval = pingInterval; client->pongTimeout = pongTimeout; client->disconnectTimeoutCount = disconnectTimeoutCount; @@ -755,8 +739,7 @@ void WebSockets::enableHeartbeat(WSclient_t * client, uint32_t pingInterval, uin * handle ping/pong heartbeat timeout process * @param client WSclient_t * */ -void WebSockets::handleHBTimeout(WSclient_t * client) -{ +void WebSockets::handleHBTimeout(WSclient_t * client) { if(client->pingInterval) { // if heartbeat is enabled uint32_t pi = millis() - client->lastPing; @@ -767,7 +750,7 @@ void WebSockets::handleHBTimeout(WSclient_t * client) client->pongTimeoutCount++; client->lastPing = millis() - client->pingInterval - 500; // force ping on the next run - DEBUG_WEBSOCKETS("[HBtimeout] pong TIMEOUT! lp=%d millis=%d pi=%d count=%d\n", client->lastPing, millis(), pi, client->pongTimeoutCount); + DEBUG_WEBSOCKETS("[HBtimeout] pong TIMEOUT! lp=%d millis=%lu pi=%d count=%d\n", client->lastPing, millis(), pi, client->pongTimeoutCount); if(client->disconnectTimeoutCount && client->pongTimeoutCount >= client->disconnectTimeoutCount) { DEBUG_WEBSOCKETS("[HBtimeout] count=%d, DISCONNECTING\n", client->pongTimeoutCount); diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSockets.h b/libraries/arduinoWebSockets-2.5.2/src/WebSockets.h similarity index 88% rename from libraries/arduinoWebSockets-2.3.6/src/WebSockets.h rename to libraries/arduinoWebSockets-2.5.2/src/WebSockets.h index db16b0a7..20a6ab5b 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSockets.h +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSockets.h @@ -50,7 +50,7 @@ DEBUG_ESP_PORT.flush(); \ } #else -//#define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) +// #define DEBUG_WEBSOCKETS(...) os_printf( __VA_ARGS__ ) #endif #endif @@ -67,7 +67,7 @@ #define WEBSOCKETS_USE_BIG_MEM #define GET_FREE_HEAP ESP.getFreeHeap() // moves all Header strings to Flash (~300 Byte) -//#define WEBSOCKETS_SAVE_RAM +// #define WEBSOCKETS_SAVE_RAM #if defined(ESP8266) #define WEBSOCKETS_YIELD() delay(0) @@ -84,9 +84,24 @@ #define GET_FREE_HEAP System.freeMemory() #define WEBSOCKETS_YIELD() #define WEBSOCKETS_YIELD_MORE() + +#elif defined(ARDUINO_ARCH_RP2040) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_USE_BIG_MEM +#define GET_FREE_HEAP rp2040.getFreeHeap() +#define WEBSOCKETS_YIELD() yield() +#define WEBSOCKETS_YIELD_MORE() delay(1) + +#elif defined(ARDUINO_UNOWIFIR4) + +#define WEBSOCKETS_MAX_DATA_SIZE (15 * 1024) +#define WEBSOCKETS_YIELD() yield() +#define WEBSOCKETS_YIELD_MORE() delay(1) + #else -//atmega328p has only 2KB ram! +// atmega328p has only 2KB ram! #define WEBSOCKETS_MAX_DATA_SIZE (1024) // moves all Header strings to Flash #define WEBSOCKETS_SAVE_RAM @@ -94,7 +109,9 @@ #define WEBSOCKETS_YIELD_MORE() #endif +#ifndef WEBSOCKETS_TCP_TIMEOUT #define WEBSOCKETS_TCP_TIMEOUT (5000) +#endif #define NETWORK_ESP8266_ASYNC (0) #define NETWORK_ESP8266 (1) @@ -102,6 +119,8 @@ #define NETWORK_ENC28J60 (3) #define NETWORK_ESP32 (4) #define NETWORK_ESP32_ETH (5) +#define NETWORK_RP2040 (6) +#define NETWORK_UNOWIFIR4 (7) // max size of the WS Message Header #define WEBSOCKETS_MAX_HEADER_SIZE (14) @@ -110,12 +129,19 @@ // select Network type based #if defined(ESP8266) || defined(ESP31B) #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266 -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP8266_ASYNC +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 #elif defined(ESP32) #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32 -//#define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH +// #define WEBSOCKETS_NETWORK_TYPE NETWORK_ESP32_ETH + +#elif defined(ARDUINO_ARCH_RP2040) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_RP2040 + +#elif defined(ARDUINO_UNOWIFIR4) +#define WEBSOCKETS_NETWORK_TYPE NETWORK_UNOWIFIR4 + #else #define WEBSOCKETS_NETWORK_TYPE NETWORK_W5100 @@ -199,6 +225,22 @@ #define WEBSOCKETS_NETWORK_CLASS WiFiClient #define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) + +#include +#include +#define SSL_BARESSL +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SSL_CLASS WiFiClientSecure +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + +#elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_UNOWIFIR4) + +#include + +#define WEBSOCKETS_NETWORK_CLASS WiFiClient +#define WEBSOCKETS_NETWORK_SERVER_CLASS WiFiServer + #else #error "no network type selected!" #endif diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSockets4WebServer.h b/libraries/arduinoWebSockets-2.5.2/src/WebSockets4WebServer.h similarity index 82% rename from libraries/arduinoWebSockets-2.3.6/src/WebSockets4WebServer.h rename to libraries/arduinoWebSockets-2.5.2/src/WebSockets4WebServer.h index a542f1ea..b9bfb99a 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSockets4WebServer.h +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSockets4WebServer.h @@ -28,23 +28,29 @@ #include #include -#if WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266 && WEBSERVER_HAS_HOOK +#if((WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040)) && WEBSERVER_HAS_HOOK class WebSockets4WebServer : public WebSocketsServerCore { +#if defined(ESP8266) + using WebServerClass = ESP8266WebServer; +#else + using WebServerClass = WebServer; +#endif + public: WebSockets4WebServer(const String & origin = "", const String & protocol = "arduino") : WebSocketsServerCore(origin, protocol) { begin(); } - ESP8266WebServer::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) { + WebServerClass::HookFunction hookForWebserver(const String & wsRootDir, WebSocketServerEvent event) { onEvent(event); - return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, ESP8266WebServer::ContentTypeFunction contentType) { + return [&, wsRootDir](const String & method, const String & url, WiFiClient * tcpClient, WebServerClass::ContentTypeFunction contentType) { (void)contentType; if(!(method == "GET" && url.indexOf(wsRootDir) == 0)) { - return ESP8266WebServer::CLIENT_REQUEST_CAN_CONTINUE; + return WebServerClass::CLIENT_REQUEST_CAN_CONTINUE; } // allocate a WiFiClient copy (like in WebSocketsServer::handleNewClients()) @@ -63,7 +69,7 @@ class WebSockets4WebServer : public WebSocketsServerCore { } // tell webserver to not close but forget about this client - return ESP8266WebServer::CLIENT_IS_GIVEN; + return WebServerClass::CLIENT_IS_GIVEN; }; } }; diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.cpp b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.cpp similarity index 93% rename from libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.cpp rename to libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.cpp index a2a4782a..dcabf610 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.cpp +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.cpp @@ -48,6 +48,12 @@ void WebSocketsClient::begin(const char * host, uint16_t port, const char * url, #if defined(HAS_SSL) _fingerprint = SSL_FINGERPRINT_NULL; _CA_cert = NULL; +#ifdef ESP32 + _CA_bundle = NULL; +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) + _CA_bundle_size = 0; +#endif +#endif #endif _client.num = 0; @@ -76,6 +82,8 @@ void WebSocketsClient::begin(const char * host, uint16_t port, const char * url, #ifdef ESP8266 randomSeed(RANDOM_REG32); +#elif defined(ARDUINO_ARCH_RP2040) + randomSeed(rp2040.hwrand32()); #else // todo find better seed randomSeed(millis()); @@ -105,6 +113,7 @@ void WebSocketsClient::beginSSL(const char * host, uint16_t port, const char * u _client.isSSL = true; _fingerprint = fingerprint; _CA_cert = NULL; + _CA_bundle = NULL; } void WebSocketsClient::beginSSL(String host, uint16_t port, String url, String fingerprint, String protocol) { @@ -116,7 +125,28 @@ void WebSocketsClient::beginSslWithCA(const char * host, uint16_t port, const ch _client.isSSL = true; _fingerprint = SSL_FINGERPRINT_NULL; _CA_cert = CA_cert; + _CA_bundle = NULL; } + +#if defined(ESP32) && ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) +void WebSocketsClient::beginSslWithBundle(const char * host, uint16_t port, const char * url, const uint8_t * CA_bundle, size_t CA_bundle_size, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = NULL; + _CA_bundle = CA_bundle; + _CA_bundle_size = CA_bundle_size; +} +#else +void WebSocketsClient::beginSslWithBundle(const char * host, uint16_t port, const char * url, const uint8_t * CA_bundle, const char * protocol) { + begin(host, port, url, protocol); + _client.isSSL = true; + _fingerprint = SSL_FINGERPRINT_NULL; + _CA_cert = NULL; + _CA_bundle = CA_bundle; +} +#endif + #else void WebSocketsClient::beginSSL(const char * host, uint16_t port, const char * url, const uint8_t * fingerprint, const char * protocol) { begin(host, port, url, protocol); @@ -224,12 +254,19 @@ void WebSocketsClient::loop(void) { _client.ssl->setCACert(_CA_cert); #elif defined(ESP8266) && defined(SSL_AXTLS) _client.ssl->setCACert((const uint8_t *)_CA_cert, strlen(_CA_cert) + 1); -#elif defined(ESP8266) && defined(SSL_BARESSL) +#elif(defined(ESP8266) || defined(ARDUINO_ARCH_RP2040)) && defined(SSL_BARESSL) _client.ssl->setTrustAnchors(_CA_cert); #else #error setCACert not implemented #endif #if defined(ESP32) + } else if(_CA_bundle) { + DEBUG_WEBSOCKETS("[WS-Client] setting CA bundle"); +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) + _client.ssl->setCACertBundle(_CA_bundle, _CA_bundle_size); +#else + _client.ssl->setCACertBundle(_CA_bundle); +#endif } else if(!SSL_FINGERPRINT_IS_SET) { _client.ssl->setInsecure(); #elif defined(SSL_BARESSL) @@ -426,9 +463,9 @@ bool WebSocketsClient::isConnected(void) { return (_client.status == WSC_CONNECTED); } -//################################################################################# -//################################################################################# -//################################################################################# +// ################################################################################# +// ################################################################################# +// ################################################################################# /** * @@ -473,7 +510,7 @@ void WebSocketsClient::messageReceived(WSclient_t * client, WSopcode_t opcode, u void WebSocketsClient::clientDisconnect(WSclient_t * client) { bool event = false; -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -733,7 +770,7 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { client->cExtensions = headerValue; } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Sec-WebSocket-Version"))) { client->cVersion = headerValue.toInt(); - } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie"))) { + } else if(headerName.equalsIgnoreCase(WEBSOCKETS_STRING("Set-Cookie")) && headerValue.indexOf(" io=") > -1) { if(headerValue.indexOf(';') > -1) { client->cSessionId = headerValue.substring(headerValue.indexOf('=') + 1, headerValue.indexOf(";")); } else { @@ -784,9 +821,11 @@ void WebSocketsClient::handleHeader(WSclient_t * client, String * headerLine) { if(client->isSocketIO) { break; } + // falls through case 403: ///< Forbidden - // todo handle login - default: ///< Server dont unterstand requrst + // todo handle login + // falls through + default: ///< Server dont unterstand requrst ok = false; DEBUG_WEBSOCKETS("[WS-Client][handleHeader] serverCode is not 101 (%d)\n", client->cCode); clientDisconnect(client); @@ -862,7 +901,7 @@ void WebSocketsClient::connectedCb() { _client.tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) _client.tcp->setNoDelay(true); #endif diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.h b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.h similarity index 89% rename from libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.h rename to libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.h index 64213767..362f4af7 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsClient.h +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsClient.h @@ -53,6 +53,13 @@ class WebSocketsClient : protected WebSockets { void setSSLClientCertKey(const char * clientCert = NULL, const char * clientPrivateKey = NULL); #endif void beginSslWithCA(const char * host, uint16_t port, const char * url = "/", const char * CA_cert = NULL, const char * protocol = "arduino"); +#ifdef ESP32 +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) + void beginSslWithBundle(const char * host, uint16_t port, const char * url = "/", const uint8_t * CA_bundle = NULL, size_t CA_bundle_size = 0, const char * protocol = "arduino"); +#else + void beginSslWithBundle(const char * host, uint16_t port, const char * url = "/", const uint8_t * CA_bundle = NULL, const char * protocol = "arduino"); +#endif +#endif #endif void beginSocketIO(const char * host, uint16_t port, const char * url = "/socket.io/?EIO=3", const char * protocol = "arduino"); @@ -112,6 +119,12 @@ class WebSocketsClient : protected WebSockets { #ifdef SSL_AXTLS String _fingerprint; const char * _CA_cert; + const uint8_t * _CA_bundle; +#if defined(ESP32) +#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4) + size_t _CA_bundle_size; +#endif +#endif #define SSL_FINGERPRINT_IS_SET (_fingerprint.length()) #define SSL_FINGERPRINT_NULL "" #else @@ -154,11 +167,11 @@ class WebSocketsClient : protected WebSockets { #endif /** - * called for sending a Event to the app - * @param type WStype_t - * @param payload uint8_t * - * @param length size_t - */ + * called for sending a Event to the app + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ virtual void runCbEvent(WStype_t type, uint8_t * payload, size_t length) { if(_cbEvent) { _cbEvent(type, payload, length); diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.cpp b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.cpp similarity index 95% rename from libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.cpp rename to libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.cpp index 3fd25c51..c582f714 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.cpp +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.cpp @@ -65,6 +65,7 @@ WebSocketsServerCore::~WebSocketsServerCore() { } WebSocketsServer::~WebSocketsServer() { + delete _server; } /** @@ -84,7 +85,10 @@ void WebSocketsServerCore::begin(void) { randomSeed(RANDOM_REG32); #elif defined(ESP32) #define DR_REG_RNG_BASE 0x3ff75144 - randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); + randomSeed(millis()); + //randomSeed(READ_PERI_REG(DR_REG_RNG_BASE)); +#elif defined(ARDUINO_ARCH_RP2040) + randomSeed(rp2040.hwrand32()); #else // TODO find better seed randomSeed(millis()); @@ -394,7 +398,7 @@ bool WebSocketsServerCore::clientIsConnected(uint8_t num) { return clientIsConnected(client); } -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) /** * get an IP for a client * @param num uint8_t client id @@ -426,8 +430,16 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) { client = &_clients[i]; - // state is not connected or tcp connection is lost - if(!clientIsConnected(client)) { + // look for match to existing socket before creating a new one + if(clientIsConnected(client)) { +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_W5100) + // Check to see if it is the same socket - if so, return it + if(client->tcp->getSocketNumber() == TCPclient->getSocketNumber()) { + return client; + } +#endif + } else { + // state is not connected or tcp connection is lost client->tcp = TCPclient; #if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) @@ -439,7 +451,7 @@ WSclient_t * WebSocketsServerCore::newClient(WEBSOCKETS_NETWORK_CLASS * TCPclien client->tcp->setTimeout(WEBSOCKETS_TCP_TIMEOUT); #endif client->status = WSC_HEADER; -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = client->tcp->remoteIP(); #endif @@ -516,9 +528,12 @@ void WebSocketsServerCore::messageReceived(WSclient_t * client, WSopcode_t opcod * @param client WSclient_t * ptr to the client struct contaning the native client "->tcp" */ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { + if(!client) { + return; + } if(client->tcp) { if(client->tcp->connected()) { -#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP8266_ASYNC) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_ESP32) && (WEBSOCKETS_NETWORK_TYPE != NETWORK_RP2040) client->tcp->flush(); #endif client->tcp->stop(); @@ -537,7 +552,7 @@ void WebSocketsServerCore::dropNativeClient(WSclient_t * client) { * @param client WSclient_t * ptr to the client struct */ void WebSocketsServerCore::clientDisconnect(WSclient_t * client) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) if(client->isSSL && client->ssl) { if(client->ssl->connected()) { client->ssl->flush(); @@ -611,7 +626,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc if(!client) { // no free space to handle client -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) #ifndef NODEBUG_WEBSOCKETS IPAddress ip = tcpClient->remoteIP(); #endif @@ -619,7 +634,12 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc #else DEBUG_WEBSOCKETS("[WS-Server] no free space new client\n"); #endif + // no client! => create dummy! + WSclient_t dummy = WSclient_t(); + client = &dummy; + client->tcp = tcpClient; dropNativeClient(client); + return nullptr; } WEBSOCKETS_YIELD(); @@ -631,7 +651,7 @@ WSclient_t * WebSocketsServerCore::handleNewClient(WEBSOCKETS_NETWORK_CLASS * tc * Handle incoming Connection Request */ void WebSocketsServer::handleNewClients(void) { -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) while(_server->hasClient()) { #endif @@ -644,7 +664,7 @@ void WebSocketsServer::handleNewClients(void) { handleNewClient(tcpClient); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) } #endif } @@ -915,7 +935,7 @@ void WebSocketsServer::begin(void) { void WebSocketsServer::close(void) { WebSocketsServerCore::close(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) _server->close(); #elif(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) _server->end(); diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.h b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.h similarity index 83% rename from libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.h rename to libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.h index e0fa7599..a47f5592 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsServer.h +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsServer.h @@ -90,7 +90,7 @@ class WebSocketsServerCore : protected WebSockets { void enableHeartbeat(uint32_t pingInterval, uint32_t pongTimeout, uint8_t disconnectTimeoutCount); void disableHeartbeat(); -#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) +#if(WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP8266_ASYNC) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_ESP32) || (WEBSOCKETS_NETWORK_TYPE == NETWORK_RP2040) IPAddress remoteIP(uint8_t num); #endif @@ -132,10 +132,10 @@ class WebSocketsServerCore : protected WebSockets { void handleHBPing(WSclient_t * client); // send ping in specified intervals /** - * called if a non Websocket connection is coming in. - * Note: can be override - * @param client WSclient_t * ptr to the client struct - */ + * called if a non Websocket connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ virtual void handleNonWebsocketConnection(WSclient_t * client) { DEBUG_WEBSOCKETS("[WS-Server][%d][handleHeader] no Websocket connection close.\n", client->num); client->tcp->write( @@ -151,10 +151,10 @@ class WebSocketsServerCore : protected WebSockets { } /** - * called if a non Authorization connection is coming in. - * Note: can be override - * @param client WSclient_t * ptr to the client struct - */ + * called if a non Authorization connection is coming in. + * Note: can be override + * @param client WSclient_t * ptr to the client struct + */ virtual void handleAuthorizationFailed(WSclient_t * client) { client->tcp->write( "HTTP/1.1 401 Unauthorized\r\n" @@ -170,12 +170,12 @@ class WebSocketsServerCore : protected WebSockets { } /** - * called for sending a Event to the app - * @param num uint8_t - * @param type WStype_t - * @param payload uint8_t * - * @param length size_t - */ + * called for sending a Event to the app + * @param num uint8_t + * @param type WStype_t + * @param payload uint8_t * + * @param length size_t + */ virtual void runCbEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { if(_cbEvent) { _cbEvent(num, type, payload, length); @@ -183,19 +183,19 @@ class WebSocketsServerCore : protected WebSockets { } /* - * Called at client socket connect handshake negotiation time for each http header that is not - * a websocket specific http header (not Connection, Upgrade, Sec-WebSocket-*) - * If the custom httpHeaderValidationFunc returns false for any headerName / headerValue passed, the - * socket negotiation is considered invalid and the upgrade to websockets request is denied / rejected - * This mechanism can be used to enable custom authentication schemes e.g. test the value - * of a session cookie to determine if a user is logged on / authenticated - */ + * Called at client socket connect handshake negotiation time for each http header that is not + * a websocket specific http header (not Connection, Upgrade, Sec-WebSocket-*) + * If the custom httpHeaderValidationFunc returns false for any headerName / headerValue passed, the + * socket negotiation is considered invalid and the upgrade to websockets request is denied / rejected + * This mechanism can be used to enable custom authentication schemes e.g. test the value + * of a session cookie to determine if a user is logged on / authenticated + */ virtual bool execHttpHeaderValidation(String headerName, String headerValue) { if(_httpHeaderValidationFunc) { - //return the value of the custom http header validation function + // return the value of the custom http header validation function return _httpHeaderValidationFunc(headerName, headerValue); } - //no custom http header validation so just assume all is good + // no custom http header validation so just assume all is good return true; } @@ -205,14 +205,14 @@ class WebSocketsServerCore : protected WebSockets { /** * drop native tcp connection (client->tcp) - */ + */ void dropNativeClient(WSclient_t * client); private: /* - * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection - * @param headerName String ///< the name of the header being checked - */ + * returns an indicator whether the given named header exists in the configured _mandatoryHttpHeaders collection + * @param headerName String ///< the name of the header being checked + */ bool hasMandatoryHeader(String headerName); }; diff --git a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsVersion.h b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsVersion.h similarity index 86% rename from libraries/arduinoWebSockets-2.3.6/src/WebSocketsVersion.h rename to libraries/arduinoWebSockets-2.5.2/src/WebSocketsVersion.h index e0ab39c6..76baceff 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/WebSocketsVersion.h +++ b/libraries/arduinoWebSockets-2.5.2/src/WebSocketsVersion.h @@ -1,6 +1,6 @@ /** * @file WebSocketsVersion.h - * @date 08.03.2021 + * @date 29.07.2024 * @author Markus Sattler * * Copyright (c) 2015 Markus Sattler. All rights reserved. @@ -25,12 +25,12 @@ #ifndef WEBSOCKETSVERSION_H_ #define WEBSOCKETSVERSION_H_ -#define WEBSOCKETS_VERSION "2.3.6" +#define WEBSOCKETS_VERSION "2.5.2" #define WEBSOCKETS_VERSION_MAJOR 2 -#define WEBSOCKETS_VERSION_MINOR 3 -#define WEBSOCKETS_VERSION_PATCH 6 +#define WEBSOCKETS_VERSION_MINOR 5 +#define WEBSOCKETS_VERSION_PATCH 2 -#define WEBSOCKETS_VERSION_INT 2003006 +#define WEBSOCKETS_VERSION_INT 2005002 #endif /* WEBSOCKETSVERSION_H_ */ diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/AUTHORS b/libraries/arduinoWebSockets-2.5.2/src/libb64/AUTHORS similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/AUTHORS rename to libraries/arduinoWebSockets-2.5.2/src/libb64/AUTHORS diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/LICENSE b/libraries/arduinoWebSockets-2.5.2/src/libb64/LICENSE similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/LICENSE rename to libraries/arduinoWebSockets-2.5.2/src/libb64/LICENSE diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/cdecode.c b/libraries/arduinoWebSockets-2.5.2/src/libb64/cdecode.c similarity index 98% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/cdecode.c rename to libraries/arduinoWebSockets-2.5.2/src/libb64/cdecode.c index e135da24..615068ac 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/libb64/cdecode.c +++ b/libraries/arduinoWebSockets-2.5.2/src/libb64/cdecode.c @@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif -#if defined(ESP32) +#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) #define CORE_HAS_LIBB64 #endif diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/cdecode_inc.h b/libraries/arduinoWebSockets-2.5.2/src/libb64/cdecode_inc.h similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/cdecode_inc.h rename to libraries/arduinoWebSockets-2.5.2/src/libb64/cdecode_inc.h diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/cencode.c b/libraries/arduinoWebSockets-2.5.2/src/libb64/cencode.c similarity index 98% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/cencode.c rename to libraries/arduinoWebSockets-2.5.2/src/libb64/cencode.c index afe1463c..cdc0f67b 100644 --- a/libraries/arduinoWebSockets-2.3.6/src/libb64/cencode.c +++ b/libraries/arduinoWebSockets-2.5.2/src/libb64/cencode.c @@ -9,7 +9,7 @@ For details, see http://sourceforge.net/projects/libb64 #include #endif -#if defined(ESP32) +#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) #define CORE_HAS_LIBB64 #endif diff --git a/libraries/arduinoWebSockets-2.3.6/src/libb64/cencode_inc.h b/libraries/arduinoWebSockets-2.5.2/src/libb64/cencode_inc.h similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libb64/cencode_inc.h rename to libraries/arduinoWebSockets-2.5.2/src/libb64/cencode_inc.h diff --git a/libraries/arduinoWebSockets-2.3.6/src/libsha1/libsha1.c b/libraries/arduinoWebSockets-2.5.2/src/libsha1/libsha1.c similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libsha1/libsha1.c rename to libraries/arduinoWebSockets-2.5.2/src/libsha1/libsha1.c diff --git a/libraries/arduinoWebSockets-2.3.6/src/libsha1/libsha1.h b/libraries/arduinoWebSockets-2.5.2/src/libsha1/libsha1.h similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/src/libsha1/libsha1.h rename to libraries/arduinoWebSockets-2.5.2/src/libsha1/libsha1.h diff --git a/libraries/arduinoWebSockets-2.5.2/tests/webSocket.html b/libraries/arduinoWebSockets-2.5.2/tests/webSocket.html new file mode 100644 index 00000000..66a27089 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/tests/webSocket.html @@ -0,0 +1,49 @@ + + + + + + + +LED Control:
    +
    +R:
    +G:
    +B:
    + + \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/index.js b/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/index.js new file mode 100644 index 00000000..389e1930 --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/index.js @@ -0,0 +1,57 @@ +#!/usr/bin/env node +var WebSocketServer = require('websocket').server; +var http = require('http'); + +var server = http.createServer(function(request, response) { + console.log((new Date()) + ' Received request for ' + request.url); + response.writeHead(404); + response.end(); +}); +server.listen(8011, function() { + console.log((new Date()) + ' Server is listening on port 8011'); +}); + +wsServer = new WebSocketServer({ + httpServer: server, + // You should not use autoAcceptConnections for production + // applications, as it defeats all standard cross-origin protection + // facilities built into the protocol and the browser. You should + // *always* verify the connection's origin and decide whether or not + // to accept it. + autoAcceptConnections: false +}); + +function originIsAllowed(origin) { + // put logic here to detect whether the specified origin is allowed. + return true; +} + +wsServer.on('request', function(request) { + + if (!originIsAllowed(request.origin)) { + // Make sure we only accept requests from an allowed origin + request.reject(); + console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.'); + return; + } + + var connection = request.accept('arduino', request.origin); + console.log((new Date()) + ' Connection accepted.'); + + connection.on('message', function(message) { + if (message.type === 'utf8') { + console.log('Received Message: ' + message.utf8Data); + // connection.sendUTF(message.utf8Data); + } + else if (message.type === 'binary') { + console.log('Received Binary Message of ' + message.binaryData.length + ' bytes'); + //connection.sendBytes(message.binaryData); + } + }); + + connection.on('close', function(reasonCode, description) { + console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.'); + }); + + connection.sendUTF("Hallo Client!"); +}); diff --git a/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/package.json b/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/package.json new file mode 100644 index 00000000..9538323e --- /dev/null +++ b/libraries/arduinoWebSockets-2.5.2/tests/webSocketServer/package.json @@ -0,0 +1,27 @@ +{ + "name": "webSocketServer", + "version": "1.0.0", + "description": "WebSocketServer for testing", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/Links2004/arduinoWebSockets" + }, + "keywords": [ + "esp8266", + "websocket", + "arduino" + ], + "author": "Markus Sattler", + "license": "LGPLv2", + "bugs": { + "url": "https://github.com/Links2004/arduinoWebSockets/issues" + }, + "homepage": "https://github.com/Links2004/arduinoWebSockets", + "dependencies": { + "websocket": "^1.0.18" + } +} diff --git a/libraries/arduinoWebSockets-2.3.6/travis/common.sh b/libraries/arduinoWebSockets-2.5.2/travis/common.sh similarity index 71% rename from libraries/arduinoWebSockets-2.3.6/travis/common.sh rename to libraries/arduinoWebSockets-2.5.2/travis/common.sh index 234b1f68..3c270d2a 100644 --- a/libraries/arduinoWebSockets-2.3.6/travis/common.sh +++ b/libraries/arduinoWebSockets-2.5.2/travis/common.sh @@ -1,4 +1,5 @@ #!/bin/bash +set -e function build_sketches() { @@ -27,11 +28,28 @@ function build_sketches() done } +function build_sketch_cli() +{ + local sketch=$1 + local board=$2 + arduino-cli --log --log-level info compile -b "$board" "$sketch" + result=$? + if [ $result -ne 0 ]; then + echo "Build failed ($sketch) build verbose..." + arduino-cli --log --log-level debug compile -b "$board" "$sketch" + result=$? + fi + if [ $result -ne 0 ]; then + echo "Build failed ($1) $sketch" + return $result + fi +} + function build_sketch() -{ +{ local arduino=$1 local sketch=$2 - $arduino --verify $sketch; + $arduino --verify --verbose $sketch; local result=$? if [ $result -ne 0 ]; then echo "Build failed ($sketch) build verbose..." @@ -60,7 +78,7 @@ function get_sketches_json() if [[ $sketch != ${sketches[-1]} ]] ; then echo -en "," fi - + done echo -en "]" } @@ -70,7 +88,7 @@ function get_sketches_json_matrix() local arduino=$1 local srcpath=$2 local platform=$3 - local ideversion=$4 + local cliversion=$4 local board=$5 local sketches=($(find $srcpath -name *.ino)) for sketch in "${sketches[@]}" ; do @@ -79,24 +97,34 @@ function get_sketches_json_matrix() if [[ -f "$sketchdir/.$platform.skip" ]]; then continue fi - echo -en "{\"name\":\"$sketchname\",\"board\":\"$board\",\"ideversion\":\"$ideversion\",\"cpu\":\"$platform\",\"sketch\":\"$sketch\"}" + echo -en "{\"name\":\"$sketchname\",\"board\":\"$board\",\"cliversion\":\"$cliversion\",\"cpu\":\"$platform\",\"sketch\":\"$sketch\"}" if [[ $sketch != ${sketches[-1]} ]] ; then echo -en "," fi done } +function get_core_cli() { + export ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS="https://arduino.esp8266.com/stable/package_esp8266com_index.json https://espressif.github.io/arduino-esp32/package_esp32_index.json https://github.com/earlephilhower/arduino-pico/releases/download/3.9.2/package_rp2040_index.json" + arduino-cli core update-index + arduino-cli core install esp8266:esp8266 + arduino-cli core install esp32:esp32 + arduino-cli core install rp2040:rp2040 +} + function get_core() { echo Setup core for $1 - cd $HOME/arduino_ide/hardware + mkdir -p $HOME/arduino_ide/packages/hardware + cd $HOME/arduino_ide/packages/hardware if [ "$1" = "esp8266" ] ; then mkdir esp8266com cd esp8266com git clone --depth 1 https://github.com/esp8266/Arduino.git esp8266 cd esp8266/ + git submodule update --init rm -rf .git cd tools python get.py @@ -127,5 +155,5 @@ function clone_library() { function hash_library_names() { cd $HOME/Arduino/libraries - ls | sha1sum -z | cut -c1-5 + ls | sha1sum -z | cut -c1-5 } \ No newline at end of file diff --git a/libraries/arduinoWebSockets-2.3.6/travis/version.py b/libraries/arduinoWebSockets-2.5.2/travis/version.py similarity index 100% rename from libraries/arduinoWebSockets-2.3.6/travis/version.py rename to libraries/arduinoWebSockets-2.5.2/travis/version.py diff --git a/platformio.ini b/platformio.ini index 03b35db4..2898b066 100644 --- a/platformio.ini +++ b/platformio.ini @@ -17,7 +17,7 @@ data_dir = esp3d/data default_envs = esp32dev [env:esp32dev] -platform = espressif32@6.2.0 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32dev framework = arduino monitor_speed = 115200 @@ -36,9 +36,11 @@ build_flags = -DCORE_DEBUG_LEVEL=0 board_build.partitions = min_spiffs.csv upload_speed = 460800 extra_scripts = pre:platformIO/extra_script.py +lib_ignore = + TFT_eSPI [env:esp32cam] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32dev framework = arduino monitor_speed = 115200 @@ -59,10 +61,12 @@ build_flags = -DCORE_DEBUG_LEVEL=0 board_build.partitions = min_spiffs.csv upload_speed = 460800 extra_scripts = pre:platformIO/extra_script.py +lib_ignore = + TFT_eSPI ;TTGO_T_Display with ST7789 [env:esp32-TTGO_T_Display] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32dev framework = arduino monitor_speed = 115200 @@ -109,7 +113,7 @@ extra_scripts = pre:platformIO/extra_script.py ;TTGO_T_Display with ST7789 [env:esp32-ST7789] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32dev framework = arduino monitor_speed = 115200 @@ -155,7 +159,7 @@ upload_speed = 460800 extra_scripts = pre:platformIO/extra_script.py [env:esp32-s2] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32-s2-saola-1 framework = arduino monitor_speed = 115200 @@ -173,13 +177,14 @@ board_build.flash_mode = qio ; None build_flags = -DCORE_DEBUG_LEVEL=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DCONFIG_IDF_TARGET_ESP32S2=1 board_build.partitions = min_spiffs.csv +extra_scripts = pre:platformIO/extra_script.py upload_speed = 460800 lib_ignore = TFT_eSPI ;https://github.com/Bodmer/TFT_eSPI/issues/1246 [env:esp32-s3] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32-s3-devkitc-1 framework = arduino monitor_speed = 115200 @@ -188,19 +193,21 @@ monitor_filters = send_on_enter, colorize, esp32_exception_decoder board_build.f_cpu = 240000000L board_build.mcu = esp32s3 board_build.variant = esp32s3 +board_build.arduino.memory_type = qio_opi ; set frequency to 80MHz board_build.f_flash = 80000000L board_build.flash_mode = qio +extra_scripts = pre:platformIO/extra_script.py ;uncomment and modify if board is not 4MB ;board_upload.flash_size = 16MB ;board_build.partitions = default_16MB.csv ; None -build_flags = -DCORE_DEBUG_LEVEL=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DCONFIG_IDF_TARGET_ESP32S3=1 +build_flags = -DCORE_DEBUG_LEVEL=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DCONFIG_IDF_TARGET_ESP32S3=1 -DARDUINO_RUNNING_CORE=1 -DARDUINO_EVENT_RUNNING_CORE=1 -DBOARD_HAS_PSRAM board_build.partitions = min_spiffs.csv upload_speed = 460800 [env:esp32-c3] -platform = espressif32@6.0.1 +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip board = esp32-c3-devkitm-1 board_build.mcu = esp32c3 board_build.variant = esp32c3 @@ -215,8 +222,31 @@ build_flags = -DCORE_DEBUG_LEVEL=0 -DCONFIG_IDF_TARGET_ESP32C3=1 ;on 4MB flash use ;board_build.partitions = min_spiffs.csv ;uncomment and modify if board is not 4MB -board_upload.flash_size = 2MB -board_build.partitions = minimal.csv +;board_upload.flash_size = 2MB +board_build.partitions = min_spiffs.csv +upload_speed = 460800 +extra_scripts = pre:platformIO/extra_script.py +lib_ignore = + TFT_eSPI + +[env:esp32-c6] +platform = https://github.com/pioarduino/platform-espressif32/releases/download/51.03.04/platform-espressif32.zip +board = esp32-c6-devkitc-1 +board_build.mcu = esp32c6 +board_build.variant = esp32c6 +framework = arduino +board_build.f_cpu = 160000000L +board_build.f_flash = 80000000L +board_build.flash_mode = qio +monitor_speed = 115200 +monitor_echo = yes +monitor_filters = send_on_enter, colorize, esp32_exception_decoder +build_flags = -DCORE_DEBUG_LEVEL=0 -DCONFIG_IDF_TARGET_ESP32C6=1 +;on 4MB flash use +;board_build.partitions = min_spiffs.csv +;uncomment and modify if board is not 4MB +;board_upload.flash_size = 8MB +board_build.partitions = min_spiffs.csv upload_speed = 460800 extra_scripts = pre:platformIO/extra_script.py lib_ignore = @@ -245,7 +275,8 @@ build_flags = upload_speed = 115200 extra_scripts = pre:platformIO/extra_script.py lib_ignore = - ESP32SSDP + ESP32SSDP + TFT_eSPI [env:esp01s_160mhz] platform = espressif8266@4.1.0 @@ -271,6 +302,7 @@ upload_speed = 115200 extra_scripts = pre:platformIO/extra_script.py lib_ignore = ESP32SSDP + TFT_eSPI [env:esp8285] platform = espressif8266@4.1.0 @@ -296,3 +328,4 @@ upload_speed = 115200 extra_scripts = pre:platformIO/extra_script.py lib_ignore = ESP32SSDP + TFT_eSPI