memlnaut-nisps/firmware/MEMLNaut-NISPS/lib/memllib/src/hardware/memlnaut/display/RLStatsView.hpp

78 lines
2.3 KiB
C++
Raw Normal View History

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
#ifndef __RLSTATSVIEW_VIEW_HPP__
#define __RLSTATSVIEW_VIEW_HPP__
#include "View.hpp"
#include "UIElements.hpp"
#include "GraphView.hpp"
class RLStatsView : public ViewBase {
public:
static constexpr size_t NPOINTS = 50;
RLStatsView(String name)
: ViewBase(name)
{
}
void OnSetup() override {
// rect bounds = { area.x + 10 + (i * 60), area.y + 10 + (j*60), 50, 50 };
graphActorGNorm = std::make_shared<GraphView<NPOINTS>>("Loss", TFT_BLUE);
// graphCriticLoss = std::make_shared<GraphView<NPOINTS>>("Critic Loss", TFT_RED);
AddSubView(graphActorGNorm, { area.x + 10, area.y + 10, 300, 90 });
// AddSubView(graphCriticLoss, { area.x + 10, area.y + 10+100, 300, 90 });
}
void OnDisplay() override {
};
void OnDraw() override {
// TFT_eSprite textSprite(scr);
// textSprite.createSprite(120, 20);
// textSprite.setTextFont(2);
// auto drawText = [&textSprite, this](size_t x, size_t y, const String& item, const int colour) {
// scr->fillRect(area.x + x,area.y+y,120,20,TFT_BLACK);
// textSprite.fillSprite(TFT_BLACK);
// textSprite.setTextColor(colour, TFT_BLACK);
// textSprite.drawString(item.c_str(), 0, 0);
// textSprite.pushSprite(area.x + x,area.y + y);
// };
// constexpr int32_t lineheight = 20;
// drawText(10, 1 * lineheight, "Actor gnorm:", itemColour);
// drawText(150, 1 * lineheight, String(actorGradNorm).c_str(), valueColour);
// drawText(10, 2 * lineheight, "Critic Loss:", itemColour);
// drawText(150, 2 * lineheight, String(criticLoss).c_str(), valueColour);
}
void setLoss(float v) {
// actorGradNorm = v;
graphActorGNorm->addDataPoint(v);
redraw();
}
void setCriticLoss(float loss) {
// criticLoss = loss;
graphCriticLoss->addDataPoint(loss);
redraw();
}
private:
const int itemColour = TFT_WHITE;
const int valueColour = TFT_YELLOW;
float actorGradNorm = 0.f;
float criticLoss = 0.f;
// #define GRAPHSIZE 100
// std::array<float, GRAPHSIZE> histGnorm, histCriticLoss;
// size_t indexGnorm=0, indexCriticLoss=0;
std::shared_ptr<GraphView<NPOINTS>> graphActorGNorm, graphCriticLoss;
};
#endif