memlnaut-nisps/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/TextView.cpp
monkey-w1n5t0n 68d4cc4017 build(firmware): migrate to PlatformIO and vendor memllib (plan §5)
One cut, no dual path. Closes ALIGNMENT defect 3 ("Arduino-CLI build
machinery is actively hostile") and vision bullet 4.

platformio.ini carries 16 [env:], one per variant, each passing
-DMEMLNAUT_MODE_TYPE; selftest passes -DNISPS_SELFTEST=1 instead. The env list
IS the registry now — the .ino comment-registry and the NISPS_ST_* token-paste
table are deleted rather than migrated. L12 noted that table was already
silently missing the currently-shipped SLPWorkshop variant, which is the whole
argument against having a second list.

Also deleted: the Python/sed machinery that rewrote the COMMITTED .ino on every
build, the sketch symlink forest, the global TFT_eSPI User_Setup.h mutation
(now -D flags — TFT_eSPI's own documented PlatformIO recipe), the UF2
boot-mount detection stack (upload_protocol=picotool talks to the bootloader
directly), and build-firmware-arch.sh entirely. Scripts 683 -> 435 lines.

memllib is vendored at lib/memllib/ from upstream e291192; no submodules
remain. VENDORED.md records provenance and the re-sync procedure.

S9: a firmware-build CI job compiles three representative envs against a cached
toolchain and reports per-variant flash/RAM. Firmware is in an automated gate
for the FIRST time. The old ci.yml comment justified excluding it as "low
verification value" — an assessment that did not survive contact, since the
SelfTest variant sat broken for an unknown period calling a DisplayDriver
method that did not exist at the pinned memllib commit, and nothing noticed
because nothing built it.

Verified: all 16 envs build from an empty cache, each within ~520 bytes of the
arduino-cli binary it replaces, flash and RAM. Measured as .text+.rodata /
.data+.bss+vector+uninitialized — NOT PlatformIO's console line, which
double-counts .data on this board. This does not prove the hardware boots; no
flash+smoke test was possible and that stays an operator chokepoint.

  slpworkshop 248232/145028   pafsynth 256880/149716   selftest 216228/17960
  (all 16 in the CI log format; none exceeds 2% of a 16 MB flash)

Two traps recorded so nobody rediscovers them: vendoring memllib's subdirs
without a src/ wrapper makes PlatformIO's library builder silently compile
NOTHING while still linking; and project build_flags land BEFORE the
framework's own -std=gnu++17 -Os, so build_unflags is required.

CORRECTION carried in this commit: the firmware sizes in c19d846's message and
the first version of the memllib recon doc were wrong — SLPWorkshop 145348,
PAFSynth 145300, SelfTest 141840. They came from building variants in sequence
through a SHARED incremental arduino-cli build directory, which reused stale
objects and under-reported by ~75 KB. Clean-cache rebuilds of the identical
commit give 216736/18492 for SelfTest. The real cost of the memllib upstream
bump is +216 bytes flash, not +316. Never measure firmware size through a
reused build dir.

HISTORY NOTE: this commit and the docs commit before it were rebuilt (force-push,
2026-07-21) so that each contains only what its message describes. The first
versions had the firmware deletions stranded in the docs commit by a shared-index
race between concurrent agents; content is byte-identical to the originals.

Gates: run-all-tests.sh ALL GREEN (nisps/ untouched by this change beyond
include paths); 16/16 pio envs build.
2026-07-21 20:17:58 +02:00

79 lines
2.2 KiB
C++

#include "TextView.hpp"
TextView::TextView(String name, const char* content, uint16_t color)
: ViewBase(name)
, button("Press Me", 0x041f, false)
, toggle("Toggle Me", 0x041f, true)
, val("Value", 0, 100, 1)
, fl("Float", 0.1f, 5.0f, 0.01f)
, content_(content)
, color_(color)
{}
void TextView::OnSetup() {
// button.SetGrid(grid_, 0, 3);
// button.Setup(tft_);
// button.SetCallback([this](bool state) { OnButtonPressed_(state); });
// toggle.SetGrid(grid_, 3, 3);
// toggle.Setup(tft_);
// toggle.SetCallback([this](bool state) { OnTogglePressed_(state); });
// val.SetGrid(grid_, 2, 1);
// val.Setup(tft_);
// val.SetCallback([this](size_t value) {
// Serial.print("Value changed: ");
// Serial.println(value);
// });
// fl.SetGrid(grid_, 1, 1);
// fl.Setup(tft_);
// fl.SetCallback([this](float value) {
// Serial.print("Float changed: ");
// Serial.println(value);
// });
}
void TextView::OnDraw() {
scr->setTextColor(color_);
// Draw the content at the third row, first column of the grid
size_t gridX = 0;
size_t gridY = 4; // Third row
scr->drawString(content_, gridX * grid_.widthStep, gridY * grid_.heightStep, 2);
needRedraw_ = false;
// // Draw the button
// button.Draw();
// // Draw the toggle button
// toggle.Draw();
// // Draw the value element
// val.Draw();
// // Draw the float element
// fl.Draw();
}
void TextView::OnTouchDown(size_t x, size_t y) {
// Serial.print("TextView HandleTouch at: ");
// Serial.print(x);
// Serial.print(", ");
// Serial.println(y);
// Pass touch coordinates to the button for interaction
button.Interact(x, y);
toggle.Interact(x, y);
val.Interact(x, y);
fl.Interact(x, y);
}
void TextView::OnTouchUp(size_t x, size_t y) {
// Serial.println("TextView HandleRelease");
// Handle release events for the button
//button_.Interact(0, 0); // Pass dummy coordinates since release doesn't need them
button.Release();
toggle.Release();
val.Release();
fl.Release();
}
void TextView::OnButtonPressed_(bool state) {
Serial.print("Button pressed: ");
Serial.println(state ? "TRUE" : "FALSE");
}