Various improvements - #614
Conversation
📝 WalkthroughWalkthroughAdded repository, architecture, build, application, and service documentation. Changed app manifest lookup to use error codes and output structures. Added device-controlled ESP32-S3 PSRAM XIP settings. Added LVGL input detection and focus handling. Updated LVGL window destruction and Wi-Fi subscription lifecycle. Updated USB HID task allocation, startup, and cleanup. Reduced the ESP main task stack size. 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
THIRD-PARTY-NOTICES.md (1)
11-11: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winRestore the Meshtastic Firmware attribution.
The
gps-meshtastic-moduleremains in the firmware build and contains code ported from Meshtastic Firmware under GPL-3.0-or-later. Add its source URL and license toTHIRD-PARTY-NOTICES.md. The remaining Flipper references are only idea links.
🧹 Nitpick comments (2)
.claude/rules/coding-style.md (1)
12-13: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winScope the null-check rule to non-null API contracts.
The blanket instruction conflicts with
Modules/lvgl-window-manager-module/source/window_manager.cpp:90-109, wherebuild_window_widget()handles a nullcontentand an optionalcreate_widgets. Keep the no-check rule only for parameters with an explicit non-null precondition.Proposed wording
-Don't do null checks for function parameters: the caller is responsible for passing valid data. -Pointers are expected to be non-null unless documented otherwise. +Do not add redundant null checks for parameters with an explicit non-null precondition. +Validate parameters that the API documents as nullable..claude/rules/key-conventions.md (1)
3-3: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winLimit the
ESP_PLATFORMguard rule to shared sources.State that the guard applies to cross-platform code.
Platforms/PlatformEsp32is already compiled only for ESP targets, so ESP-IDF includes in that directory should not be wrapped in redundant guards.Proposed wording
-`#ifdef ESP_PLATFORM` guards ESP32-specific code; the simulator uses POSIX equivalents. +Shared cross-platform code uses `#ifdef ESP_PLATFORM` for ESP32-specific paths. +Code in `Platforms/PlatformEsp32/` is already ESP-only and does not need guards around ESP-IDF includes.Based on learnings:
Platforms/PlatformEsp32is compiled only forESP_PLATFORMtargets and should not use guards around ESP-IDF includes.Source: Learnings
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: aa89ab16-f407-4ce2-af9c-e88d03e1dfb8
⛔ Files ignored due to path filters (1)
.claude/rules.zipis excluded by!**/*.zip
📒 Files selected for processing (45)
.claude/rules/CLAUDE.md.claude/rules/app-framework.md.claude/rules/architecture-device-model.md.claude/rules/architecture-layers.md.claude/rules/build-system.md.claude/rules/building.md.claude/rules/coding-style.md.claude/rules/hardware-abstraction-layer.md.claude/rules/key-conventions.md.claude/rules/lvgl.md.claude/rules/platform-abstraction.md.claude/rules/project-overview.md.claude/rules/service-framework.mdBuildscripts/sdkconfig/default.propertiesCLAUDE.mdDevices/cl32/device.propertiesDevices/lilygo-tdeck-plus/device.propertiesDevices/lilygo-tdeck/device.propertiesDevices/waveshare-esp32-s3-geek/device.propertiesDevices/waveshare-s3-touch-lcd-128/device.propertiesDocumentation/README.mdDocumentation/ideas.mdDocumentation/license-tactility.mdDocumentation/license-tactilitykernel.mdModules/app-module/include/app/manager.hModules/app-module/include/app/manifest.hModules/app-module/source/manager.cppModules/lvgl-module/private/lvgl/devices/indev_private.hModules/lvgl-module/private/lvgl/devices/keyboard_private.hModules/lvgl-module/source/devices/indev.cppModules/lvgl-module/source/widgets/toolbar.cppTHIRD-PARTY-NOTICES.mdTactility/Source/Tactility.cppTactility/Source/app/appdetails/AppDetails.cppTactility/Source/app/apphub/AppHubApp.cppTactility/Source/app/apphubdetails/AppHubDetailsApp.cppTactility/Source/app/boot/Boot.cppTactility/Source/app/chat/README.mdTactility/Source/app/launcher/Launcher.cppTactility/Source/lvgl/UsbHidInput.cppTactility/Source/service/development/DevelopmentService.cppTactility/Source/service/displayidle/README.mdTactility/Source/service/webserver/README.mdTactility/Source/service/webserver/WebServerService.cppdevice.py
💤 Files with no reviewable changes (5)
- Documentation/README.md
- CLAUDE.md
- Documentation/license-tactility.md
- Documentation/license-tactilitykernel.md
- Modules/lvgl-module/private/lvgl/devices/keyboard_private.h
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 7
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
THIRD-PARTY-NOTICES.md (1)
11-11: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winRestore the Meshtastic Firmware attribution.
The
gps-meshtastic-moduleremains in the firmware build and contains code ported from Meshtastic Firmware under GPL-3.0-or-later. Add its source URL and license toTHIRD-PARTY-NOTICES.md. The remaining Flipper references are only idea links.
🧹 Nitpick comments (2)
.claude/rules/coding-style.md (1)
12-13: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick winScope the null-check rule to non-null API contracts.
The blanket instruction conflicts with
Modules/lvgl-window-manager-module/source/window_manager.cpp:90-109, wherebuild_window_widget()handles a nullcontentand an optionalcreate_widgets. Keep the no-check rule only for parameters with an explicit non-null precondition.Proposed wording
-Don't do null checks for function parameters: the caller is responsible for passing valid data. -Pointers are expected to be non-null unless documented otherwise. +Do not add redundant null checks for parameters with an explicit non-null precondition. +Validate parameters that the API documents as nullable..claude/rules/key-conventions.md (1)
3-3: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winLimit the
ESP_PLATFORMguard rule to shared sources.State that the guard applies to cross-platform code.
Platforms/PlatformEsp32is already compiled only for ESP targets, so ESP-IDF includes in that directory should not be wrapped in redundant guards.Proposed wording
-`#ifdef ESP_PLATFORM` guards ESP32-specific code; the simulator uses POSIX equivalents. +Shared cross-platform code uses `#ifdef ESP_PLATFORM` for ESP32-specific paths. +Code in `Platforms/PlatformEsp32/` is already ESP-only and does not need guards around ESP-IDF includes.Based on learnings:
Platforms/PlatformEsp32is compiled only forESP_PLATFORMtargets and should not use guards around ESP-IDF includes.Source: Learnings
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: aa89ab16-f407-4ce2-af9c-e88d03e1dfb8
⛔ Files ignored due to path filters (1)
.claude/rules.zipis excluded by!**/*.zip
📒 Files selected for processing (45)
.claude/rules/CLAUDE.md.claude/rules/app-framework.md.claude/rules/architecture-device-model.md.claude/rules/architecture-layers.md.claude/rules/build-system.md.claude/rules/building.md.claude/rules/coding-style.md.claude/rules/hardware-abstraction-layer.md.claude/rules/key-conventions.md.claude/rules/lvgl.md.claude/rules/platform-abstraction.md.claude/rules/project-overview.md.claude/rules/service-framework.mdBuildscripts/sdkconfig/default.propertiesCLAUDE.mdDevices/cl32/device.propertiesDevices/lilygo-tdeck-plus/device.propertiesDevices/lilygo-tdeck/device.propertiesDevices/waveshare-esp32-s3-geek/device.propertiesDevices/waveshare-s3-touch-lcd-128/device.propertiesDocumentation/README.mdDocumentation/ideas.mdDocumentation/license-tactility.mdDocumentation/license-tactilitykernel.mdModules/app-module/include/app/manager.hModules/app-module/include/app/manifest.hModules/app-module/source/manager.cppModules/lvgl-module/private/lvgl/devices/indev_private.hModules/lvgl-module/private/lvgl/devices/keyboard_private.hModules/lvgl-module/source/devices/indev.cppModules/lvgl-module/source/widgets/toolbar.cppTHIRD-PARTY-NOTICES.mdTactility/Source/Tactility.cppTactility/Source/app/appdetails/AppDetails.cppTactility/Source/app/apphub/AppHubApp.cppTactility/Source/app/apphubdetails/AppHubDetailsApp.cppTactility/Source/app/boot/Boot.cppTactility/Source/app/chat/README.mdTactility/Source/app/launcher/Launcher.cppTactility/Source/lvgl/UsbHidInput.cppTactility/Source/service/development/DevelopmentService.cppTactility/Source/service/displayidle/README.mdTactility/Source/service/webserver/README.mdTactility/Source/service/webserver/WebServerService.cppdevice.py
💤 Files with no reviewable changes (5)
- Documentation/README.md
- CLAUDE.md
- Documentation/license-tactility.md
- Documentation/license-tactilitykernel.md
- Modules/lvgl-module/private/lvgl/devices/keyboard_private.h
🛑 Comments failed to post (3)
Tactility/Source/app/chat/README.md (2)
3-12: 🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- candidate files ---' git ls-files | rg '(^|/)(README\.md|.*[Ee][Ss][Pp]-?[Nn][Oo][Ww].*|.*chat.*)$' | head -200 printf '%s\n' '--- ESP-NOW references ---' rg -n -i 'esp.?now|encrypt|broadcast|multicast|271|peer|key|channel' Tactility/Source/app/chat Tactility 2>/dev/null | head -300 printf '%s\n' '--- project version/config references ---' rg -n 'ESP_IDF|esp-idf|IDF_VERSION|idf_version|CONFIG_IDF_TARGET|Tactility.*ESP|ESP-NOW' . --glob '!build/**' --glob '!dist/**' --glob '!node_modules/**' | head -300Repository: TactilityProject/Tactility
Length of output: 50382
🏁 Script executed:
#!/bin/bash set -eu printf '%s\n' '--- chat README ---' sed -n '1,205p' Tactility/Source/app/chat/README.md printf '%s\n' '--- ESP-NOW public API ---' cat -n Tactility/Include/Tactility/service/espnow/EspNow.h printf '%s\n' '--- native backend ---' cat -n Tactility/Source/service/espnow/EspNowBackendNative.cpp printf '%s\n' '--- service implementation ---' cat -n Tactility/Source/service/espnow/EspNowService.cpp printf '%s\n' '--- chat send/configuration ---' sed -n '1,175p' Tactility/Source/app/chat/ChatApp.cpp printf '%s\n' '--- protocol sizing ---' cat -n Tactility/Source/app/chat/ChatProtocol.cpp cat -n Tactility/Private/Tactility/app/chat/ChatProtocol.h printf '%s\n' '--- build/version declarations ---' sed -n '1,110p' CMakeLists.txt find . -maxdepth 3 -type f \( -name 'idf-version.txt' -o -name 'dependencies.lock' -o -name 'sdkconfig*' \) -printRepository: TactilityProject/Tactility
Length of output: 46577
🏁 Script executed:
#!/bin/bash set -eu python3 - <<'PY' from pathlib import Path import re service = Path("Tactility/Source/service/espnow/EspNowService.cpp").read_text() chat = Path("Tactility/Source/app/chat/ChatApp.cpp").read_text() readme = Path("Tactility/Source/app/chat/README.md").read_text() broadcast_peer = re.search( r"esp_now_peer_info_t broadcast_peer;(?P<body>.*?service::espnow::addPeer\(broadcast_peer\);", service, re.S, ) send_call = re.search( r"service::espnow::send\(BROADCAST_ADDRESS,\s*wireMsg\.data\(\),\s*wireMsg\.size\(\)\)", chat, ) assert broadcast_peer, "broadcast peer setup not found" body = broadcast_peer.group("body") assert "memcpy(broadcast_peer.peer_addr, BROADCAST_MAC" in body assert "broadcast_peer.encrypt" not in body assert "memset(&broadcast_peer, 0, sizeof(esp_now_peer_info_t))" in body assert send_call, "chat broadcast send path not found" assert "built-in encryption" in readme assert "private group communication" in readme print("broadcast peer is zero-initialized and no encryption flag is enabled") print("chat sends wireMsg to BROADCAST_ADDRESS") print("README claims ESP-NOW built-in encryption and private group communication") PY printf '%s\n' '--- exact relevant lines ---' nl -ba Tactility/Source/service/espnow/EspNowService.cpp | sed -n '63,82p' nl -ba Tactility/Source/app/chat/ChatApp.cpp | sed -n '28,42p;84,101p' nl -ba Tactility/Source/app/chat/README.md | sed -n '1,12p;180,192p'Repository: TactilityProject/Tactility
Length of output: 987
🏁 Script executed:
#!/bin/bash set -eu python3 - <<'PY' from pathlib import Path service = Path("Tactility/Source/service/espnow/EspNowService.cpp").read_text() chat = Path("Tactility/Source/app/chat/ChatApp.cpp").read_text() readme = Path("Tactility/Source/app/chat/README.md").read_text() start = service.index("esp_now_peer_info_t broadcast_peer;") end = service.index("service::espnow::addPeer(broadcast_peer);", start) body = service[start:end] assert "memset(&broadcast_peer, 0, sizeof(esp_now_peer_info_t));" in body assert "memcpy(broadcast_peer.peer_addr, BROADCAST_MAC" in body assert "broadcast_peer.encrypt" not in body assert "service::espnow::send(BROADCAST_ADDRESS" in chat assert "built-in encryption" in readme assert "private group communication" in readme print("broadcast peer is zero-initialized and no encryption flag is enabled") print("chat sends wireMsg to BROADCAST_ADDRESS") print("README claims ESP-NOW built-in encryption and private group communication") PY nl -ba Tactility/Source/service/espnow/EspNowService.cpp | sed -n '75,80p' nl -ba Tactility/Source/app/chat/ChatApp.cpp | sed -n '34,41p;94,97p' nl -ba Tactility/Source/app/chat/README.md | sed -n '1,12p;183,190p'Repository: TactilityProject/Tactility
Length of output: 458
Do not claim confidentiality for broadcast traffic.
EspNowService::enableFromDispatcher()registers the broadcast peer withencrypt = false, andChatApp::sendMessage()sends every message to that peer. The configured key sets the ESP-NOW PMK, but it does not encrypt this broadcast path.If application-layer encryption is not added, state that broadcast traffic is not confidential and remove the private-communication claim from the README.
107-117: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash printf '%s\n' '--- README context ---' sed -n '85,130p' Tactility/Source/app/chat/README.md printf '%s\n' '--- ESP-NOW references ---' rg -n -i --glob '!build/**' --glob '!dist/**' 'esp_now|ESP-NOW|TextMessage|Payload|Header size|Total packet' . printf '%s\n' '--- version/config references ---' rg -n -i --glob '!build/**' --glob '!dist/**' 'ESP.?IDF|IDF_VERSION|esp-idf|250 bytes|255 bytes|ESP_NOW_MAX_DATA_LEN' .Repository: TactilityProject/Tactility
Length of output: 50385
🏁 Script executed:
#!/bin/bash set -o pipefail printf '%s\n' '--- candidate files ---' git ls-files | rg -i '(^|/)(README|.*chat.*|.*esp.*now.*|.*message.*|.*packet.*|.*network.*)' printf '%s\n' '--- README size section ---' sed -n '85,130p' Tactility/Source/app/chat/README.md printf '%s\n' '--- relevant symbols and APIs ---' rg -n -i --glob '!build/**' --glob '!dist/**' 'esp_now|ESP-NOW|TextMessage|Payload|Header size|Total packet|nickname|channel' . printf '%s\n' '--- ESP-IDF/version references ---' rg -n -i --glob '!build/**' --glob '!dist/**' 'ESP.?IDF|IDF_VERSION|esp-idf|ESP_NOW_MAX_DATA_LEN|250 bytes|255 bytes' .Repository: TactilityProject/Tactility
Length of output: 50383
🏁 Script executed:
#!/bin/bash python3 - <<'PY' from pathlib import Path p = Path("Tactility/Source/app/chat/README.md") text = p.read_text() for i, line in enumerate(text.splitlines(), 1): if 90 <= i <= 125: print(f"{i}: {line}") PYRepository: TactilityProject/Tactility
Length of output: 1668
🏁 Script executed:
#!/bin/bash printf '%s\n' '--- ChatProtocol.h ---' cat -n Tactility/Private/Tactility/app/chat/ChatProtocol.h | sed -n '25,110p' printf '%s\n' '--- ChatProtocol.cpp ---' cat -n Tactility/Source/app/chat/ChatProtocol.cpp | sed -n '1,185p' printf '%s\n' '--- ESP-NOW public API ---' cat -n Tactility/Include/Tactility/service/espnow/EspNow.h | sed -n '1,85p' printf '%s\n' '--- Chat UI/message path ---' cat -n Tactility/Source/app/chat/ChatApp.cpp | sed -n '70,110p' rg -n -C 4 '200|max.*length|maxMessage|getMaxMessage|textarea_set_max_length|serializeTextMessage' Tactility/Source/app/chat Tactility/Private/Tactility/app/chatRepository: TactilityProject/Tactility
Length of output: 24576
🏁 Script executed:
#!/bin/bash python3 - <<'PY' HEADER = 16 v1_data = 250 v1_payload = v1_data - HEADER max_name = 23 max_target = 23 overhead = max_name + 1 + max_target + 1 print(f"v1_max_payload={v1_payload}") print(f"v1_max_total={v1_data}") print(f"max_field_overhead={overhead}") print(f"max_wire_message_v1={v1_payload - overhead}") print(f"total_with_200_ui_chars={HEADER + overhead + 200}") print(f"max_ui_chars_for_v1={v1_payload - overhead}") print(f"protocol_uint8_max_total={HEADER + 255}") PYRepository: TactilityProject/Tactility
Length of output: 327
Document version-dependent ESP-NOW packet limits.
ESP-NOW v1 limits the packet to 250 bytes and the chat payload to 234 bytes. With maximum nickname and target lengths, the message limit is 186 bytes. Update the table and UI validation to use
getMaxMessageLength(...); a 200-character message currently fails serialization on v1 devices.Tactility/Source/service/webserver/README.md (1)
431-451: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash set -e printf '%s\n' '--- README security section and URL examples ---' rg -n -C 4 'http://|https://|Basic Authentication|HTTP Auth|Web Server|TLS|HTTPS' Tactility/Source/service/webserver/README.md printf '%s\n' '--- Webserver files ---' git ls-files '*webserver*' '*WebServer*' | sed -n '1,160p' printf '%s\n' '--- Authentication and TLS references ---' rg -n -S -i 'basic auth|authorization|tls|https|ssl|mbedtls|bearer|username|password' Tactility/Source/service Tactility/Source | sed -n '1,240p'Repository: TactilityProject/Tactility
Length of output: 34272
🏁 Script executed:
#!/bin/bash set -e printf '%s\n' '--- HTTP server implementation ---' cat -n Tactility/Source/network/HttpServer.cpp printf '%s\n' '--- HTTP server interface ---' cat -n Tactility/Include/Tactility/network/HttpServer.h 2>/dev/null || true printf '%s\n' '--- WebServer construction, authentication, and endpoint guards ---' sed -n '1,220p' Tactility/Source/service/webserver/WebServerService.cpp sed -n '240,540p' Tactility/Source/service/webserver/WebServerService.cpp printf '%s\n' '--- Network server API declarations and build references ---' rg -n -S 'httpd_ssl|HTTPD_SSL|https|CONFIG_.*HTTPS|esp_https|httpd_start|HttpServer' Tactility components CMakeLists.txt platformio.ini 2>/dev/null | sed -n '1,240p'Repository: TactilityProject/Tactility
Length of output: 24454
Document HTTPS requirements for HTTP Basic Authentication.
The WebServer uses plaintext HTTP and provides no TLS support. HTTP Basic Authentication does not protect credentials on this endpoint. State that HTTPS is required before exposing the WebServer to untrusted networks; otherwise, restrict it to a trusted, isolated network.
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: be7a5e56-e662-470f-831a-66d5b7d82955
📒 Files selected for processing (6)
.claude/rules/building.md.claude/rules/coding-style.md.claude/rules/key-conventions.mdTHIRD-PARTY-NOTICES.mdTactility/Source/app/appdetails/AppDetails.cppTactility/Source/lvgl/UsbHidInput.cpp
🚧 Files skipped from review as they are similar to previous changes (3)
- .claude/rules/building.md
- .claude/rules/key-conventions.md
- .claude/rules/coding-style.md
There was a problem hiding this comment.
Actionable comments posted: 2
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 5c12ac51-931e-4203-89b1-69b67adc6db6
📒 Files selected for processing (8)
Modules/lvgl-window-manager-module/include/lvgl_window_manager/window_manager.hModules/lvgl-window-manager-module/source/window_manager.cppTactility/Private/Tactility/app/wifimanage/View.hTactility/Source/app/wifiapsettings/WifiApSettings.cppTactility/Source/app/wificonnect/WifiConnect.cppTactility/Source/app/wifimanage/View.cppTactility/Source/app/wifimanage/WifiManage.cppTactility/Source/lvgl/UsbHidInput.cpp
🚧 Files skipped from review as they are similar to previous changes (1)
- Tactility/Source/lvgl/UsbHidInput.cpp
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Tactility/Source/app/wificonnect/WifiConnect.cpp (1)
320-327: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winRestore connection state after the window resurfaces.
The subscription remains active while the window has no live widgets. A Wi-Fi result can set
ctx->connectingorctx->connectionErrorduring that interval. When the window resurfaces,createWidgets()rebuilds the widgets but does not apply those persisted flags. The UI can show an enabledconnect_buttonduring an active connection, or hide"Connection failed"after a background failure.Make
updateView()render both states. Call it after all widgets are initialized. Add a regression test for bury → event → resurface.Proposed state restoration
void updateView(Context* ctx) { if (ctx->connect_button == nullptr) { return; } - if (ctx->connectionError) { + if (ctx->connecting) { + setLoading(ctx, true); + } else if (ctx->connectionError) { setLoading(ctx, false); resetErrors(ctx); lv_label_set_text(ctx->connection_error, "Connection failed"); lv_obj_remove_flag(ctx->connection_error, LV_OBJ_FLAG_HIDDEN); } } // End of createWidgets(), after initial parameters are applied +updateView(ctx);Source: MCP tools
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: c85657c6-8d9e-4dd9-a015-e37ba2012770
📒 Files selected for processing (2)
Modules/lvgl-window-manager-module/source/window_manager.cppTactility/Source/app/wificonnect/WifiConnect.cpp
🚧 Files skipped from review as they are similar to previous changes (1)
- Modules/lvgl-window-manager-module/source/window_manager.cpp
Uh oh!
There was an error while loading. Please reload this page.