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.
88 lines
2.4 KiB
C++
88 lines
2.4 KiB
C++
#ifndef __UART_INPUT_HPP__
|
|
#define __UART_INPUT_HPP__
|
|
|
|
#include <Arduino.h>
|
|
#include "../utils/MedianFilter.h"
|
|
#include "../hardware/memlnaut/Pins.hpp"
|
|
#include <SerialPIO.h>
|
|
#include <functional>
|
|
|
|
#include <vector>
|
|
|
|
class UARTInput
|
|
{
|
|
|
|
public:
|
|
// Maximum allowed channels (avoid unbounded resizes)
|
|
static constexpr size_t kMaxChannels = 8;
|
|
|
|
// Change to trigger debugging of single channel
|
|
static constexpr size_t kObservedChan = 9999;
|
|
|
|
using uart_in_callback_t = std::function<void(size_t, float)>;
|
|
/**
|
|
* @brief Construct a new UARTInput object for communication
|
|
* with the MEML Sensor Board.
|
|
*
|
|
* @param sensor_indexes Vector of indexes to read (maximum 8, numbers 0-7).
|
|
* @param sensor_rx RX pin the Sensor Board is connected to (default: Pins::SENSOR_RX).
|
|
* @param sensor_tx TX pin the Sensor Board is connected to (default: Pins::SENSOR_TX).
|
|
*/
|
|
UARTInput(const std::vector<size_t> &sensor_indexes,
|
|
size_t sensor_rx = Pins::SENSOR_RX,
|
|
size_t sensor_tx = Pins::SENSOR_TX,
|
|
size_t baud_rate = 115200);
|
|
/**
|
|
* @brief Poll input. Put in a regular loop.
|
|
*/
|
|
void Poll();
|
|
/**
|
|
* @brief Set the callback to be called when sensor data changes.
|
|
*
|
|
* @param callback Callback that accepts a vector of sensor readings.
|
|
*/
|
|
inline void SetCallback(uart_in_callback_t callback)
|
|
{
|
|
callback_ = callback;
|
|
}
|
|
/**
|
|
* @brief Change the sensor indexes to listen to.
|
|
*
|
|
* @param indexes Vector of indexes to read (maximum 8, numbers 0-7).
|
|
*/
|
|
void ListenToSensorIndexes(const std::vector<size_t> &indexes);
|
|
|
|
protected:
|
|
static const size_t kSlipBufferSize_ = 128;
|
|
std::vector<size_t> sensor_indexes_;
|
|
size_t sensor_rx_;
|
|
size_t sensor_tx_;
|
|
uint8_t slipBuffer[kSlipBufferSize_];
|
|
std::vector<MedianFilter<float>> filters_;
|
|
std::vector<float> value_states_;
|
|
uart_in_callback_t callback_ = nullptr;
|
|
bool refresh_uart_;
|
|
size_t baud_rate_;
|
|
|
|
struct spiMessage
|
|
{
|
|
uint8_t msg;
|
|
float value;
|
|
};
|
|
enum SPISTATES
|
|
{
|
|
WAITFOREND,
|
|
ENDORBYTES,
|
|
READBYTES
|
|
};
|
|
SPISTATES spiState;
|
|
int spiIdx;
|
|
|
|
// void Parse_(spiMessage msg);
|
|
void ParseBuf_(float* buf, size_t len = kMaxChannels);
|
|
|
|
private:
|
|
//SerialPIO pioSerial_;
|
|
};
|
|
|
|
#endif // __UART_INPUT_HPP__
|