Change GPIOViewer from v1.6.3 to v1.7.0

This commit is contained in:
Theo Arends 2025-10-25 17:50:36 +02:00
parent 459b06ce6c
commit cdecb6da3a
4 changed files with 148 additions and 57 deletions

View File

@ -17,6 +17,7 @@ All notable changes to this project will be documented in this file.
- Refactored library UDisplay (#24007)
- LVGL library from v9.3.0 to v9.4.0 (#24028)
- Increased filesystem file name size from 48 to 50 characters
- GPIOViewer from v1.6.3 to v1.7.0
### Fixed
- TLS fix ECDSA and add `SetOption165 1` to enable ECDSA in addition to RSA (#24000)

View File

@ -124,6 +124,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm
### Changed
- LVGL library from v9.3.0 to v9.4.0 [#24028](https://github.com/arendst/Tasmota/issues/24028)
- GPIOViewer from v1.6.3 to v1.7.0
- Refactored library UDisplay [#24007](https://github.com/arendst/Tasmota/issues/24007)
- Increased filesystem file name size from 48 to 50 characters

View File

@ -720,6 +720,44 @@ float CpuTemperature(void) {
// #include "esp_chip_info.h"
String GetDeviceFeatures(void) {
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
String chip_features = "[";
bool first_feature = true;
auto appendFeature = [&](const char *name) {
if (!first_feature) {
chip_features += ",";
}
first_feature = false;
chip_features += "\"";
chip_features += name;
chip_features += "\"";
};
if (chip_info.features & CHIP_FEATURE_WIFI_BGN) {
appendFeature("WIFI_BGN");
}
if (chip_info.features & CHIP_FEATURE_BLE) {
appendFeature("BLE");
}
if (chip_info.features & CHIP_FEATURE_BT) {
appendFeature("BT");
}
if (chip_info.features & CHIP_FEATURE_EMB_FLASH) {
appendFeature("EMB_FLASH");
}
if (chip_info.features & CHIP_FEATURE_IEEE802154) {
appendFeature("IEEE802154");
}
if (chip_info.features & CHIP_FEATURE_EMB_PSRAM) {
appendFeature("EMB_PSRAM");
}
chip_features += "]";
return chip_features;
}
String GetDeviceHardware(void) {
// https://www.espressif.com/en/products/socs

View File

@ -29,6 +29,11 @@
* GvUrl - Show current url
* GvUrl 1 - Select default url (GV_BASE_URL)
* GvUrl https://thelastoutpostworkshop.github.io/microcontroller_devkit/gpio_viewer_1_5/
*
* Note 20251025
* - GVRelease 1.7.0
* - Add APP partition info
* - Add more Information
*
* Note 20250503
* - GVRelease 1.6.3 (No code change)
@ -92,7 +97,7 @@
#define GV_KEEP_ALIVE 1000 // milliseconds - If no activity after this do a heap size event anyway
const char *GVRelease = "1.6.3";
const char *GVRelease = "1.7.0";
/*********************************************************************************************/
@ -339,43 +344,90 @@ void GVHandleSampling(void) {
void GVHandleEspInfo(void) {
#ifdef GV_USE_ESPINFO
String jsonResponse = "{\"chip_model\":\"" + GetDeviceHardware();
jsonResponse += "\",\"cores_count\":\"" + String(ESP_getChipCores());
jsonResponse += "\",\"chip_revision\":\"" + String(ESP_getChipRevision());
jsonResponse += "\",\"cpu_frequency\":\"" + String(ESP.getCpuFreqMHz());
jsonResponse += "\",\"cycle_count\":" + String(ESP.getCycleCount());
jsonResponse += ",\"mac\":\"" + ESP_getEfuseMac();
String jsonResponse = "{";
auto appendField = [&](const char *key, const String &value, bool quoted) {
if (jsonResponse.length() > 1) {
jsonResponse += ",";
}
jsonResponse += "\"";
jsonResponse += key;
jsonResponse += "\":";
if (quoted) {
jsonResponse += "\"";
}
jsonResponse += value;
if (quoted) {
jsonResponse += "\"";
}
};
appendField("chip_model", GetDeviceHardware(), true);
appendField("cores_count", String(ESP_getChipCores()), true);
appendField("chip_revision", String(ESP_getChipRevision()), true);
appendField("cpu_frequency", String(ESP.getCpuFreqMHz()), true);
appendField("cycle_count", String(ESP.getCycleCount()), false);
appendField("mac", ESP_getEfuseMac(), true);
appendField("flash_mode", D_TASMOTA_FLASHMODE, true);
#ifndef CONFIG_IDF_TARGET_ESP32P4
const FlashMode_t flashMode = ESP.getFlashChipMode(); // enum
jsonResponse += "\",\"flash_mode\":" + String(flashMode);
#endif // CONFIG_IDF_TARGET_ESP32P4
#ifdef ESP8266
jsonResponse += ",\"flash_chip_size\":" + String(ESP.getFlashChipRealSize());
#else // ESP32
jsonResponse += ",\"flash_chip_size\":" + String(ESP.getFlashChipSize());
#ifdef ESP32
appendField("flash_chip_size", String(ESP.getFlashChipSize()), false);
#else // ESP8266
appendField("flash_chip_size", String(ESP.getFlashChipRealSize()), false);
#endif
appendField("flash_chip_speed", String(ESP.getFlashChipSpeed()), false);
appendField("heap_size", String(ESP_getHeapSize()), false);
appendField("heap_max_alloc", String(ESP_getMaxAllocHeap()), false);
appendField("psram_size", String(ESP_getPsramSize()), false);
appendField("free_psram", String(ESP_getFreePsram()), false);
appendField("psram_max_alloc", String(ESP_getMaxAllocPsram()), false);
appendField("free_heap", String(ESP_getFreeHeap()), false);
#ifdef ESP32
size_t heapFree8bit = heap_caps_get_free_size(MALLOC_CAP_8BIT);
appendField("heap_free_8bit", String(heapFree8bit), false);
size_t heapFree32bit = heap_caps_get_free_size(MALLOC_CAP_32BIT);
appendField("heap_free_32bit", String(heapFree32bit), false);
size_t heapLargestBlock = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT);
appendField("heap_largest_free_block", String(heapLargestBlock), false);
#endif // ESP32
jsonResponse += ",\"flash_chip_speed\":" + String(ESP.getFlashChipSpeed());
jsonResponse += ",\"heap_size\":" + String(ESP_getHeapSize());
jsonResponse += ",\"heap_max_alloc\":" + String(ESP_getMaxAllocHeap());
jsonResponse += ",\"psram_size\":" + String(ESP_getPsramSize());
jsonResponse += ",\"free_psram\":" + String(ESP_getFreePsram());
jsonResponse += ",\"psram_max_alloc\":" + String(ESP_getMaxAllocPsram());
jsonResponse += ",\"free_heap\":" + String(ESP_getFreeHeap());
jsonResponse += ",\"up_time\":\"" + String(millis());
jsonResponse += "\",\"sketch_size\":" + String(ESP_getSketchSize());
#ifdef ESP8266
String arduinoCoreVersion = "2.7.7";
#else // ESP32
String arduinoCoreVersion = "3.0.4";
appendField("up_time", String(UpTime() * 1000), true);
#ifdef ESP32
uint64_t uptimeUs = static_cast<uint64_t>(esp_timer_get_time());
appendField("uptime_us", String(static_cast<unsigned long long>(uptimeUs)), false);
#endif // ESP32
#if defined(ESP_ARDUINO_VERSION_MAJOR) && defined(ESP_ARDUINO_VERSION_MINOR) && defined(ESP_ARDUINO_VERSION_PATCH)
arduinoCoreVersion = String(ESP_ARDUINO_VERSION_MAJOR) + "." + String(ESP_ARDUINO_VERSION_MINOR) + "." + String(ESP_ARDUINO_VERSION_PATCH);
#endif // ESP_ARDUINO_VERSION_
jsonResponse += ",\"arduino_core_version\":\"" + arduinoCoreVersion;
jsonResponse += "\",\"free_sketch\":" + String(ESP_getFreeSketchSpace());
appendField("sketch_size", String(ESP_getSketchSize()), false);
appendField("free_sketch", String(ESP_getFreeSketchSpace()), false);
String arduinoCoreVersion = ARDUINO_CORE_RELEASE;
arduinoCoreVersion.replace("_", ".");
appendField("arduino_core_version", arduinoCoreVersion, true);
#ifdef ESP32
appendField("sdk_version", String(ESP.getSdkVersion()), true);
appendField("idf_version", String(esp_get_idf_version()), true);
#endif // ESP32
String sketchMD5 = ESP.getSketchMD5(); // This takes some time
if (sketchMD5.length() > 0) {
appendField("sketch_md5", sketchMD5, true);
}
#ifdef ESP32
appendField("chip_features", GetDeviceFeatures(), false);
#endif // ESP32
appendField("reset_reason_code", String(ResetReason()), false);
appendField("reset_reason", String(GetResetReason()), true);
#if defined(CONFIG_IDF_TARGET_ESP32) || (defined(SOC_TEMP_SENSOR_SUPPORTED) && SOC_TEMP_SENSOR_SUPPORTED)
float temperatureC = temperatureRead();
if (!isnan(temperatureC)) {
appendField("temperature_c", String(temperatureC, 2), false);
}
#endif
jsonResponse += "}";
#else // No GV_USE_ESPINFO
String jsonResponse = "{\"chip_model\":\"" + GetDeviceHardware() + "\"}";
@ -390,35 +442,34 @@ void GVHandlePartition(void) {
#ifdef ESP32
bool firstEntry = true; // Used to format the JSON array correctly
esp_partition_iterator_t iter = esp_partition_find(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, NULL);
// esp_partition_iterator_t iter = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL);
auto appendPartitions = [&](esp_partition_type_t type) {
esp_partition_iterator_t iter = esp_partition_find(type, ESP_PARTITION_SUBTYPE_ANY, NULL);
// Loop through partitions
while (iter != NULL) {
const esp_partition_t *partition = esp_partition_get(iter);
while (iter != NULL) {
const esp_partition_t *partition = esp_partition_get(iter);
// Add comma before the next entry if it's not the first
if (!firstEntry)
{
jsonResponse += ",";
if (!firstEntry) {
jsonResponse += ",";
}
firstEntry = false;
// Append partition information in JSON format
jsonResponse += "{";
jsonResponse += "\"label\":\"" + String(partition->label) + "\",";
jsonResponse += "\"type\":" + String(partition->type) + ",";
jsonResponse += "\"subtype\":" + String(partition->subtype) + ",";
jsonResponse += "\"address\":\"0x" + String(partition->address, HEX) + "\",";
jsonResponse += "\"size\":" + String(partition->size);
jsonResponse += "}";
iter = esp_partition_next(iter); // Move to next partition
}
firstEntry = false;
// Append partition information in JSON format
jsonResponse += "{";
jsonResponse += "\"label\":\"" + String(partition->label) + "\",";
jsonResponse += "\"type\":" + String(partition->type) + ",";
jsonResponse += "\"subtype\":" + String(partition->subtype) + ",";
jsonResponse += "\"address\":\"0x" + String(partition->address, HEX) + "\",";
jsonResponse += "\"size\":" + String(partition->size);
jsonResponse += "}";
esp_partition_iterator_release(iter); // Clean up iterator
};
// Move to next partition
iter = esp_partition_next(iter);
}
// Clean up the iterator
esp_partition_iterator_release(iter);
appendPartitions(ESP_PARTITION_TYPE_DATA);
appendPartitions(ESP_PARTITION_TYPE_APP);
#endif // ESP32
jsonResponse += "]"; // End of JSON array