Skip to content

Various improvements - #614

Merged
KenVanHoeylandt merged 22 commits into
mainfrom
develop
Aug 13, 2026
Merged

Various improvements#614
KenVanHoeylandt merged 22 commits into
mainfrom
develop

Conversation

@KenVanHoeylandt

@KenVanHoeylandt KenVanHoeylandt commented Aug 12, 2026

Copy link
Copy Markdown
Contributor
  • Auto-select widgets in Launcher and apps with toolbars on devices without touch.
  • Improved USB HID input reliability, cleanup
  • Updated PSRAM settings to improve boot stability on supported devices.
  • Prevented duplicate Wi-Fi event subscriptions during screen rebuilds.
  • Updated docs
  • Fixes in WifiManage and WifiConnect
  • Reduced main task stack size
  • Moved USB HID stack size to PSRAM when available
  • app_manager_find_manifest() now returns a copy instead of a pointer

@coderabbitai

coderabbitai Bot commented Aug 12, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Added 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)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 17.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title "Various improvements" is generic and does not identify the pull request's main changes. Replace the title with a concise summary of the primary changes, such as app manifest API updates, PSRAM configuration, and window lifecycle improvements.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Restore the Meshtastic Firmware attribution.

The gps-meshtastic-module remains in the firmware build and contains code ported from Meshtastic Firmware under GPL-3.0-or-later. Add its source URL and license to THIRD-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 win

Scope 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, where build_window_widget() handles a null content and an optional create_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 win

Limit the ESP_PLATFORM guard rule to shared sources.

State that the guard applies to cross-platform code. Platforms/PlatformEsp32 is 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/PlatformEsp32 is compiled only for ESP_PLATFORM targets 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

📥 Commits

Reviewing files that changed from the base of the PR and between cc8be3f and dc107db.

⛔ Files ignored due to path filters (1)
  • .claude/rules.zip is 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.md
  • Buildscripts/sdkconfig/default.properties
  • CLAUDE.md
  • Devices/cl32/device.properties
  • Devices/lilygo-tdeck-plus/device.properties
  • Devices/lilygo-tdeck/device.properties
  • Devices/waveshare-esp32-s3-geek/device.properties
  • Devices/waveshare-s3-touch-lcd-128/device.properties
  • Documentation/README.md
  • Documentation/ideas.md
  • Documentation/license-tactility.md
  • Documentation/license-tactilitykernel.md
  • Modules/app-module/include/app/manager.h
  • Modules/app-module/include/app/manifest.h
  • Modules/app-module/source/manager.cpp
  • Modules/lvgl-module/private/lvgl/devices/indev_private.h
  • Modules/lvgl-module/private/lvgl/devices/keyboard_private.h
  • Modules/lvgl-module/source/devices/indev.cpp
  • Modules/lvgl-module/source/widgets/toolbar.cpp
  • THIRD-PARTY-NOTICES.md
  • Tactility/Source/Tactility.cpp
  • Tactility/Source/app/appdetails/AppDetails.cpp
  • Tactility/Source/app/apphub/AppHubApp.cpp
  • Tactility/Source/app/apphubdetails/AppHubDetailsApp.cpp
  • Tactility/Source/app/boot/Boot.cpp
  • Tactility/Source/app/chat/README.md
  • Tactility/Source/app/launcher/Launcher.cpp
  • Tactility/Source/lvgl/UsbHidInput.cpp
  • Tactility/Source/service/development/DevelopmentService.cpp
  • Tactility/Source/service/displayidle/README.md
  • Tactility/Source/service/webserver/README.md
  • Tactility/Source/service/webserver/WebServerService.cpp
  • device.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

Comment thread .claude/rules/building.md Outdated
Comment thread .claude/rules/CLAUDE.md
Comment thread Tactility/Source/app/appdetails/AppDetails.cpp Outdated
Comment thread Tactility/Source/lvgl/UsbHidInput.cpp

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Restore the Meshtastic Firmware attribution.

The gps-meshtastic-module remains in the firmware build and contains code ported from Meshtastic Firmware under GPL-3.0-or-later. Add its source URL and license to THIRD-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 win

Scope 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, where build_window_widget() handles a null content and an optional create_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 win

Limit the ESP_PLATFORM guard rule to shared sources.

State that the guard applies to cross-platform code. Platforms/PlatformEsp32 is 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/PlatformEsp32 is compiled only for ESP_PLATFORM targets 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

📥 Commits

Reviewing files that changed from the base of the PR and between cc8be3f and dc107db.

⛔ Files ignored due to path filters (1)
  • .claude/rules.zip is 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.md
  • Buildscripts/sdkconfig/default.properties
  • CLAUDE.md
  • Devices/cl32/device.properties
  • Devices/lilygo-tdeck-plus/device.properties
  • Devices/lilygo-tdeck/device.properties
  • Devices/waveshare-esp32-s3-geek/device.properties
  • Devices/waveshare-s3-touch-lcd-128/device.properties
  • Documentation/README.md
  • Documentation/ideas.md
  • Documentation/license-tactility.md
  • Documentation/license-tactilitykernel.md
  • Modules/app-module/include/app/manager.h
  • Modules/app-module/include/app/manifest.h
  • Modules/app-module/source/manager.cpp
  • Modules/lvgl-module/private/lvgl/devices/indev_private.h
  • Modules/lvgl-module/private/lvgl/devices/keyboard_private.h
  • Modules/lvgl-module/source/devices/indev.cpp
  • Modules/lvgl-module/source/widgets/toolbar.cpp
  • THIRD-PARTY-NOTICES.md
  • Tactility/Source/Tactility.cpp
  • Tactility/Source/app/appdetails/AppDetails.cpp
  • Tactility/Source/app/apphub/AppHubApp.cpp
  • Tactility/Source/app/apphubdetails/AppHubDetailsApp.cpp
  • Tactility/Source/app/boot/Boot.cpp
  • Tactility/Source/app/chat/README.md
  • Tactility/Source/app/launcher/Launcher.cpp
  • Tactility/Source/lvgl/UsbHidInput.cpp
  • Tactility/Source/service/development/DevelopmentService.cpp
  • Tactility/Source/service/displayidle/README.md
  • Tactility/Source/service/webserver/README.md
  • Tactility/Source/service/webserver/WebServerService.cpp
  • device.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 -300

Repository: 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*' \) -print

Repository: 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 with encrypt = false, and ChatApp::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}")
PY

Repository: 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/chat

Repository: 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}")
PY

Repository: 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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between dc107db and c4835c2.

📒 Files selected for processing (6)
  • .claude/rules/building.md
  • .claude/rules/coding-style.md
  • .claude/rules/key-conventions.md
  • THIRD-PARTY-NOTICES.md
  • Tactility/Source/app/appdetails/AppDetails.cpp
  • Tactility/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

Comment thread Tactility/Source/lvgl/UsbHidInput.cpp

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between c4835c2 and 178e85a.

📒 Files selected for processing (8)
  • Modules/lvgl-window-manager-module/include/lvgl_window_manager/window_manager.h
  • Modules/lvgl-window-manager-module/source/window_manager.cpp
  • Tactility/Private/Tactility/app/wifimanage/View.h
  • Tactility/Source/app/wifiapsettings/WifiApSettings.cpp
  • Tactility/Source/app/wificonnect/WifiConnect.cpp
  • Tactility/Source/app/wifimanage/View.cpp
  • Tactility/Source/app/wifimanage/WifiManage.cpp
  • Tactility/Source/lvgl/UsbHidInput.cpp
🚧 Files skipped from review as they are similar to previous changes (1)
  • Tactility/Source/lvgl/UsbHidInput.cpp

Comment thread Modules/lvgl-window-manager-module/source/window_manager.cpp
Comment thread Tactility/Source/app/wificonnect/WifiConnect.cpp Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 win

Restore connection state after the window resurfaces.

The subscription remains active while the window has no live widgets. A Wi-Fi result can set ctx->connecting or ctx->connectionError during that interval. When the window resurfaces, createWidgets() rebuilds the widgets but does not apply those persisted flags. The UI can show an enabled connect_button during 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

📥 Commits

Reviewing files that changed from the base of the PR and between 178e85a and ef98f6e.

📒 Files selected for processing (2)
  • Modules/lvgl-window-manager-module/source/window_manager.cpp
  • Tactility/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

@KenVanHoeylandt
KenVanHoeylandt merged commit d6b1d15 into main Aug 13, 2026
106 of 121 checks passed
@KenVanHoeylandt
KenVanHoeylandt deleted the develop branch August 13, 2026 18:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant