Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ permissions:
jobs:
changelog:
name: changelog
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/shared-code.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ permissions:
jobs:
blocks:
name: blocks
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 5
steps:
- uses: actions/checkout@v7
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/simulator.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ env:

jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
timeout-minutes: 15 # a build and check take about 4 minutes; a stuck browser must not hold the queue for hours
# a newer push to the same branch replaces the check of the older one; each branch has its own queue
concurrency:
Expand Down Expand Up @@ -101,7 +101,7 @@ jobs:
deploy:
if: github.event_name != 'pull_request'
needs: build
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
permissions:
pages: write # to publish
id-token: write # Pages checks that the publication comes from this workflow
Expand Down
16 changes: 14 additions & 2 deletions .github/workflows/teensy-firmware.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,13 @@ permissions:
env:
ARDUINO_BOARD_MANAGER_ADDITIONAL_URLS: https://www.pjrc.com/teensy/package_teensy_index.json
TEENSYDUINO: '1.58'
ARDUINO_CLI: '1.6.0' # the Arduino CLI release the build installs (the newest on 12 Nov 2026)
# Tools menu as in the README: Teensy 4.1, USB type Serial, CPU 450 MHz, Optimize "Faster"
FQBN: teensy:avr:teensy41:usb=serial,speed=450,opt=o2std,keys=en-us # 450 MHz since 4 Nov 2026: cooler, the loop has time to spare

jobs:
build:
runs-on: ubuntu-latest
runs-on: ubuntu-26.04
defaults:
run:
shell: bash # -eo pipefail: a failed compile is not hidden by tee
Expand All @@ -58,7 +59,18 @@ jobs:
echo "sha=${sha::7}" >> "$GITHUB_OUTPUT"
echo "Firmware folder: $dir"

- uses: arduino/setup-arduino-cli@v2 # built for Node 20 (no Node 24 release yet); the runner runs it on Node 24 and says so in a warning, which is harmless
- name: Install the Arduino CLI ${{ env.ARDUINO_CLI }}
run: |
# straight from Arduino's GitHub release, checked against its checksum file; the setup-arduino-cli action
# did this before, but it is built for Node 20 (no Node 24 release) and the runner warned on every build
base="https://github.com/arduino/arduino-cli/releases/download/v$ARDUINO_CLI"
file="arduino-cli_${ARDUINO_CLI}_Linux_64bit.tar.gz"
cd "$RUNNER_TEMP"
curl -fsSL -O "$base/$file"
curl -fsSL "$base/$ARDUINO_CLI-checksums.txt" | grep " $file\$" | sha256sum -c -
mkdir -p "$HOME/.local/bin"
tar xzf "$file" -C "$HOME/.local/bin" arduino-cli
echo "$HOME/.local/bin" >> "$GITHUB_PATH"

- name: Install Teensyduino ${{ env.TEENSYDUINO }}
run: |
Expand Down
4 changes: 2 additions & 2 deletions Firmware/simulator/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ One row per day, in short; the details are in the sections of this file (the lin

| Date | What changed |
|---|---|
| 12 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.4): tractor buttons, Renato's Maxxum 135 and Farmall 115C; an implement on the drawbar takes the chosen tractor's pin ([the page](#set-up-agopenweb-from-your-measures)). |
| 12 Nov 2026 | **Set up AgOpenWeb from your measures** (version 1.4): tractor buttons, Renato's Maxxum 135 and Farmall 115C; an implement on the drawbar takes the chosen tractor's pin ([the page](#set-up-agopenweb-from-your-measures)). [Action](#how-it-is-built) on `ubuntu-26.04`. |
| 11 Nov 2026 | `build.py` leaves the pages' own build date (`PAGE_BUILT`) empty, so the pages' new "is this the running firmware's page" check stays off here. The pretend Keya reports its current in amps, the kickout sensor. |
| 10 Nov 2026 | Teensy page: the pretend UM982 reports its temperature (59 °C, from `HWSTATUSA`) and the module's name on the network reads `AiO-3F2A`, as the firmware now does. |
| 9 Nov 2026 | **Set up AgOpenWeb from your measures** 1.3: front corner, drawbar at the tyre, turns by headland, reasons ([the page](#set-up-agopenweb-from-your-measures)). Seed drill: 19 sections offline; short start page. [Action](#how-it-is-built) on Node 24. Check: pages in a web card's frame ([How it is built](#how-it-is-built)). |
Expand All @@ -45,7 +45,7 @@ One row per day, in short; the details are in the sections of this file (the lin

## How it is built

`build.py` cuts the pages out of the newest `Firmware/vX.Y_AiO_WEB` folder, `Seeder/Seeder_ESP32` and `Sprayer/Sprayer_ESP32` exactly as the firmware serves them and puts the simulator scripts in their `<head>` (a module page also gets its implement, `window.SIM_IMPL`). The scripts answer the page's `/api/...` requests (and the firmware upload) instead of the module, so the page's own JavaScript is not changed: what you see is the page as it is in the firmware. The GitHub Action `.github/workflows/simulator.yml` runs on every change under `Firmware/`, `Seeder/Seeder_ESP32/` or `Sprayer/Sprayer_ESP32/`, opens every tab in a browser as a check (`smoke-test.js`), and publishes the result on GitHub Pages when the change reaches `main`. A pull request only builds and checks: the simulator shows the merged firmware. Since 9 Nov 2026 it uses the versions of GitHub's own actions that run on Node 24 (`checkout@v7`, `setup-node@v7`, `upload-artifact@v7`, `upload-pages-artifact@v5`, `deploy-pages@v5`): the runners now run every action on Node 24 and warn about one built for Node 20.
`build.py` cuts the pages out of the newest `Firmware/vX.Y_AiO_WEB` folder, `Seeder/Seeder_ESP32` and `Sprayer/Sprayer_ESP32` exactly as the firmware serves them and puts the simulator scripts in their `<head>` (a module page also gets its implement, `window.SIM_IMPL`). The scripts answer the page's `/api/...` requests (and the firmware upload) instead of the module, so the page's own JavaScript is not changed: what you see is the page as it is in the firmware. The GitHub Action `.github/workflows/simulator.yml` runs on every change under `Firmware/`, `Seeder/Seeder_ESP32/` or `Sprayer/Sprayer_ESP32/`, opens every tab in a browser as a check (`smoke-test.js`), and publishes the result on GitHub Pages when the change reaches `main`. A pull request only builds and checks: the simulator shows the merged firmware. Since 9 Nov 2026 it uses the versions of GitHub's own actions that run on Node 24 (`checkout@v7`, `setup-node@v7`, `upload-artifact@v7`, `upload-pages-artifact@v5`, `deploy-pages@v5`): the runners now run every action on Node 24 and warn about one built for Node 20. Since 12 Nov 2026 every job of the repository's Actions names its runner, `ubuntu-26.04`, instead of `ubuntu-latest`, which GitHub moved to Ubuntu 26.04 that autumn with a notice on every run.

`build.py` also writes `firmware.json` at the top of the site: the Teensy `.hex` and the two XIAO `.bin` files of the newest version folder, each with the date and time it was compiled, read from the file itself (the `__DATE__ __TIME__` text every program carries). The Teensy page and the XIAO page fetch it from `https://renatorgr.github.io/Boards/firmware.json` for **Install from GitHub**, so a new build of the same version shows as new once its file is on `main` and the site is published again. The pretend Teensy and XIAO run those same builds. It also has the sprayer module's `Sprayer/Sprayer_ESP32/Sprayer_ESP32.ino.bin` (`"sprayer"`): its version, board and build date, read from the text its `/api/status` answer starts with, for the sprayer page's **Firmware** tab; the pretend sprayer module runs that build. The same for the seed drill module's `Seeder/Seeder_ESP32/Seeder_ESP32.ino.bin` (`"seeder"`), once that file is on `main`.

Expand Down