refactor(Format code): Improve readability and structure

This commit is contained in:
2026-02-18 17:57:54 -08:00
parent c81e23f7cd
commit e4609c6978
11 changed files with 120 additions and 136 deletions

View File

@@ -1,4 +1,5 @@
#include "DisplayDriverTFT.h"
#include <KlubhausCore.h>
extern DisplayManager display;
@@ -35,7 +36,8 @@ void DisplayDriverTFT::setBacklight(bool on) { digitalWrite(PIN_LCD_BL, on ? HIG
// ── Rendering ───────────────────────────────────────────────
void DisplayDriverTFT::render(const ScreenState& st) {
if(st.screen != _lastScreen || (st.screen == ScreenID::BOOT && st.bootStage != _lastBootStage)) {
if(st.screen != _lastScreen
|| (st.screen == ScreenID::BOOT && st.bootStage != _lastBootStage)) {
_needsRedraw = true;
_lastScreen = st.screen;
_lastBootStage = st.bootStage;
@@ -202,9 +204,7 @@ TouchEvent DisplayDriverTFT::readTouch() {
return evt;
}
uint16_t DisplayDriverTFT::getRawTouchZ() {
return _tft.getTouchRawZ();
}
uint16_t DisplayDriverTFT::getRawTouchZ() { return _tft.getTouchRawZ(); }
void DisplayDriverTFT::transformTouch(int* x, int* y) {
// Resistive touch panel is rotated 90° vs display - swap coordinates

View File

@@ -25,7 +25,8 @@ void DisplayDriverTFT::setBacklight(bool on) { digitalWrite(PIN_LCD_BL, on ? HIG
// ── Rendering ───────────────────────────────────────────────
void DisplayDriverTFT::render(const ScreenState& st) {
if(st.screen != _lastScreen || (st.screen == ScreenID::BOOT && st.bootStage != _lastBootStage)) {
if(st.screen != _lastScreen
|| (st.screen == ScreenID::BOOT && st.bootStage != _lastBootStage)) {
_needsRedraw = true;
_lastScreen = st.screen;
_lastBootStage = st.bootStage;

View File

@@ -151,7 +151,8 @@ void DisplayDriverGFX::render(const ScreenState& state) {
return;
// Check if we need full redraw
if(state.screen != _lastScreen || (state.screen == ScreenID::BOOT && state.bootStage != _lastBootStage)) {
if(state.screen != _lastScreen
|| (state.screen == ScreenID::BOOT && state.bootStage != _lastBootStage)) {
_needsRedraw = true;
_lastScreen = state.screen;
_lastBootStage = state.bootStage;

View File

@@ -18,6 +18,9 @@ public:
int width() override;
int height() override;
// Dashboard tile mapping
int dashboardTouch(int x, int y);
// ── Internal ──
static DisplayDriverGFX& instance();

View File

@@ -1,4 +1,4 @@
FQBN="esp32:esp32:waveshare_esp32_s3_touch_lcd_43:PSRAM=enabled,FlashSize=16M,USBMode=hwcdc,PartitionScheme=app3M_fat9M_16MB"
PORT="/dev/ttyACM0"
LIBS="--libraries ./vendor/esp32-s3-lcd-43/LovyanGFX"
LIBS="--libraries ~/Arduino/libraries/LovyanGFX"
OPTS="-DDEBUG_MODE -DBOARD_HAS_PSRAM -DLGFX_USE_V1"

View File

@@ -2,6 +2,7 @@
#include "IDisplayDriver.h"
#include "ScreenState.h"
#include <cmath>
/// Layout helper for dashboard tiles - computes positions based on constraints
@@ -10,15 +11,8 @@ public:
/// Calculate tile layouts for the given display dimensions
/// Returns array of TileLayout (must have capacity for DASHBOARD_TILE_COUNT)
/// Returns the number of columns and rows used
static int calculateLayouts(
int displayW,
int displayH,
int headerH,
int margin,
TileLayout* outLayouts,
int* outCols,
int* outRows
) {
static int calculateLayouts(int displayW, int displayH, int headerH, int margin,
TileLayout* outLayouts, int* outCols, int* outRows) {
int contentH = displayH - headerH;
int tileCount = DASHBOARD_TILE_COUNT;
@@ -42,8 +36,10 @@ public:
findNextPosition(outLayouts, i, cols, rows, &col, &row);
// Ensure tile fits within grid
if(col + tileCols > cols) tileCols = cols - col;
if(row + tileRows > rows) tileRows = rows - row;
if(col + tileCols > cols)
tileCols = cols - col;
if(row + tileRows > rows)
tileRows = rows - row;
// Calculate pixel position
int x = col * cellW + margin;
@@ -61,14 +57,17 @@ public:
private:
/// Calculate optimal grid dimensions based on display and tile constraints
static void calculateGrid(int tileCount, int displayW, int contentH, int* outCols, int* outRows) {
static void calculateGrid(
int tileCount, int displayW, int contentH, int* outCols, int* outRows) {
// Calculate aspect ratio to determine preferred layout
float aspectRatio = (float)displayW / contentH;
// Start with simple square-ish grid
int cols = (int)std::sqrt(tileCount * aspectRatio);
if(cols < 1) cols = 1;
if(cols > tileCount) cols = tileCount;
if(cols < 1)
cols = 1;
if(cols > tileCount)
cols = tileCount;
int rows = (tileCount + cols - 1) / cols;
@@ -88,15 +87,16 @@ private:
}
/// Find next available grid position
static void findNextPosition(const TileLayout* layouts, int count, int gridCols, int gridRows, int* outCol, int* outRow) {
static void findNextPosition(const TileLayout* layouts, int count, int gridCols, int gridRows,
int* outCol, int* outRow) {
// Simple: find first empty cell
// Could be enhanced to pack tightly based on tile sizes
for(int r = 0; r < gridRows; r++) {
for(int c = 0; c < gridCols; c++) {
bool occupied = false;
for(int i = 0; i < count; i++) {
if(layouts[i].col <= c && c < layouts[i].col + layouts[i].cols &&
layouts[i].row <= r && r < layouts[i].row + layouts[i].rows) {
if(layouts[i].col <= c && c < layouts[i].col + layouts[i].cols
&& layouts[i].row <= r && r < layouts[i].row + layouts[i].rows) {
occupied = true;
break;
}
@@ -130,7 +130,8 @@ public:
}
void render(const ScreenState& st) {
if(!_drv) return;
if(!_drv)
return;
_drv->render(st);
}
@@ -146,13 +147,15 @@ public:
/// Show touch feedback - highlights the tile at given coordinates
/// Returns true if a valid tile is being touched
bool showTouchFeedback(int x, int y) {
if(!_drv || _gridCols <= 0) return false;
if(!_drv || _gridCols <= 0)
return false;
// Transform touch coordinates
_drv->transformTouch(&x, &y);
int headerH = 30;
if(y < headerH) return false;
if(y < headerH)
return false;
// Calculate which cell
int cellW = _drv->width() / _gridCols;
@@ -167,8 +170,8 @@ public:
// Find which tile is at this position
for(int i = 0; i < _tileCount; i++) {
const TileLayout& lay = _layouts[i];
if(lay.col <= col && col < lay.col + lay.cols &&
lay.row <= row && lay.row + lay.rows > row) {
if(lay.col <= col && col < lay.col + lay.cols && lay.row <= row
&& lay.row + lay.rows > row) {
// Found the tile - draw highlight via driver
_drv->updateHint(lay.x, lay.y, true); // active=true means show feedback
return true;
@@ -185,7 +188,8 @@ public:
/// Check if current position is still in same tile as touch-down
bool isSameTile(int downX, int downY, int currentX, int currentY) const {
if(!_drv || _gridCols <= 0 || downX < 0) return false;
if(!_drv || _gridCols <= 0 || downX < 0)
return false;
int dx = downX, dy = downY;
int cx = currentX, cy = currentY;
@@ -210,7 +214,8 @@ public:
/// Handle dashboard touch - returns action for tapped tile, or NONE
TileAction handleDashboardTouch(int x, int y) const {
if(!_drv || _gridCols <= 0) return TileAction::NONE;
if(!_drv || _gridCols <= 0)
return TileAction::NONE;
// Transform touch coordinates (handles rotated touch panels)
_drv->transformTouch(&x, &y);
@@ -220,7 +225,8 @@ public:
int headerH = 30;
// Check if in header area
if(y < headerH) return TileAction::NONE;
if(y < headerH)
return TileAction::NONE;
// Calculate which tile was touched using grid
int cellW = dispW / _gridCols;
@@ -237,8 +243,8 @@ public:
// Find which tile occupies this cell
for(int i = 0; i < _tileCount; i++) {
const TileLayout& layout = _layouts[i];
if(layout.col <= col && col < layout.col + layout.cols &&
layout.row <= row && row < layout.row + layout.rows) {
if(layout.col <= col && col < layout.col + layout.cols && layout.row <= row
&& row < layout.row + layout.rows) {
return DASHBOARD_TILES[i].action;
}
}
@@ -249,17 +255,11 @@ public:
/// Calculate and store layouts for dashboard tiles
/// Called by drivers who want to use the layout helper
int calculateDashboardLayouts(int headerH = 30, int margin = 8) {
if(!_drv) return 0;
if(!_drv)
return 0;
_tileCount = TileLayoutHelper::calculateLayouts(
_drv->width(),
_drv->height(),
headerH,
margin,
_layouts,
&_gridCols,
&_gridRows
);
_drv->width(), _drv->height(), headerH, margin, _layouts, &_gridCols, &_gridRows);
return _tileCount;
}

View File

@@ -133,8 +133,8 @@ void DoorbellLogic::update() {
default:
// Inactivity timeout: turn off screen after no activity
if(_state.screen != ScreenID::OFF && now - _lastActivityMs > INACTIVITY_TIMEOUT_MS) {
Serial.printf("[%lu] [STATE] Inactivity timeout (%lu ms) → OFF\n",
millis(), now - _lastActivityMs);
Serial.printf("[%lu] [STATE] Inactivity timeout (%lu ms) → OFF\n", millis(),
now - _lastActivityMs);
_state.screen = ScreenID::OFF;
_display->setBacklight(false);
_state.backlightOn = false;

View File

@@ -28,27 +28,7 @@ arduino-cli compile --fqbn "$FQBN" --libraries ./libraries $LIBS --build-propert
[tasks.upload]
description = "Upload (uses BOARD env var)"
depends = ["compile"]
run = """
# Kill any processes using the serial port first
source ./boards/$BOARD/board-config.sh
PORT="${PORT:-$PORT}"
fuser -k "$PORT" 2>/dev/null || true
for pid in $(pgrep -f "monitor-agent.py" 2>/dev/null || true); do
kill "$pid" 2>/dev/null || true
done
rm -f "/tmp/doorbell-${BOARD}.lock" 2>/dev/null || true
sleep 1
source ./scripts/lockfile.sh
FORCE=1 TASK_NAME=upload acquire_lock || exit 1
arduino-cli upload --fqbn "$FQBN" --port "$PORT" ./boards/$BOARD
# Restart monitor in background
python3 ./scripts/monitor-agent.py "$BOARD" &
echo "[OK] Monitor restarted in background"
"""
run = "source ./boards/$BOARD/board-config.sh && arduino-cli upload --fqbn $FQBN --port $PORT ./boards/$BOARD"
[tasks.monitor-raw]
run = """
@@ -80,15 +60,15 @@ set +e
# Kill any processes using the serial port
source ./boards/$BOARD/board-config.sh
PORT="${PORT:-$PORT}"
fuser -k "$PORT" 2>/dev/null
fuser -k "$PORT" 2>/dev/null || true
# Kill monitor-agent processes for this board
for pid in $(pgrep -f "monitor-agent.py"); do
kill "$pid" 2>/dev/null
for pid in $(pgrep -f "monitor-agent.py" 2>/dev/null || true); do
kill "$pid" 2>/dev/null || true
done
# Also clean up lockfile
rm -f "/tmp/doorbell-${BOARD}.lock" 2>/dev/null
rm -f "/tmp/doorbell-${BOARD}.lock" 2>/dev/null || true
sleep 1
echo "[OK] Killed processes for $BOARD"
@@ -224,4 +204,4 @@ echo "[OK] Generated .crush.json with FQBN: $FQBN"
"""
[env]
BOARD = "esp32-32e-4"
BOARD = "esp32-s3-lcd-43"

Submodule vendor/esp32-s3-lcd-43/LovyanGFX deleted from 42998359d8