Layer 3: Templates as pure data, weather template, .anvilignore refresh system
Templates are now composed declaratively via template.toml -- no Rust code changes needed to add new templates. The weather station is the first composed template, demonstrating the full pattern. Template engine: - Composed templates declare base, required libraries, and per-board pins - Overlay mechanism replaces base files (app, sketch, tests) cleanly - Generic orchestration: extract base, apply overlay, install libs, assign pins - Template name tracked in .anvil.toml for refresh awareness Weather template (--template weather): - WeatherApp with 2-second polling, C/F conversion, serial output - TMP36 driver: TempSensor interface, Tmp36 impl, Tmp36Mock, Tmp36Sim - Managed example tests in test_weather.cpp (unit + system) - Minimal student starters in test_unit.cpp and test_system.cpp - Per-board pin defaults (A0 for uno, A0 for mega, A0 for nano) .anvilignore system: - Glob pattern matching (*, ?) with comments and backslash normalization - Default patterns protect student tests, app code, sketch, config - anvil refresh --force respects .anvilignore - anvil refresh --force --file <path> overrides ignore for one file - anvil refresh --ignore/--unignore manages patterns from CLI - Missing managed files always recreated even without --force - .anvilignore itself is in NEVER_REFRESH (cannot be overwritten) Refresh rewrite: - Discovers all template-produced files dynamically (no hardcoded list) - Extracts fresh template + libraries into temp dir for byte comparison - Config template field drives which files are managed - Separated missing-file creation from changed-file updates 428 tests passing on Windows MSVC, 0 warnings.
This commit is contained in:
35
templates/weather/__name__/__name__.ino.tmpl
Normal file
35
templates/weather/__name__/__name__.ino.tmpl
Normal file
@@ -0,0 +1,35 @@
|
||||
/*
|
||||
* {{PROJECT_NAME}}.ino -- TMP36 weather station
|
||||
*
|
||||
* Reads temperature from a TMP36 sensor every 2 seconds
|
||||
* and prints to Serial:
|
||||
*
|
||||
* Temperature: 23.5 C (74.3 F)
|
||||
*
|
||||
* All logic lives in lib/app/{{PROJECT_NAME}}_app.h which depends
|
||||
* on the HAL and TempSensor interfaces, making it fully testable
|
||||
* on the host without hardware.
|
||||
*
|
||||
* Wiring (TMP36, flat side facing you):
|
||||
* Pin 1 (left) -> 5V
|
||||
* Pin 2 (middle) -> A0 (analog input)
|
||||
* Pin 3 (right) -> GND
|
||||
*
|
||||
* Serial: 115200 baud
|
||||
*/
|
||||
|
||||
#include <hal_arduino.h>
|
||||
#include <{{PROJECT_NAME}}_app.h>
|
||||
#include <tmp36_analog.h>
|
||||
|
||||
static ArduinoHal hw;
|
||||
static Tmp36Analog sensor(&hw, A0);
|
||||
static WeatherApp app(&hw, &sensor);
|
||||
|
||||
void setup() {
|
||||
app.begin();
|
||||
}
|
||||
|
||||
void loop() {
|
||||
app.update();
|
||||
}
|
||||
Reference in New Issue
Block a user