diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2f61bdb..734947a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -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 diff --git a/.github/workflows/shared-code.yml b/.github/workflows/shared-code.yml index ce37baa..b04d0f3 100644 --- a/.github/workflows/shared-code.yml +++ b/.github/workflows/shared-code.yml @@ -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 diff --git a/.github/workflows/simulator.yml b/.github/workflows/simulator.yml index b74ef9e..e051533 100644 --- a/.github/workflows/simulator.yml +++ b/.github/workflows/simulator.yml @@ -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: @@ -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 diff --git a/.github/workflows/teensy-firmware.yml b/.github/workflows/teensy-firmware.yml index cdf062b..1a2d002 100644 --- a/.github/workflows/teensy-firmware.yml +++ b/.github/workflows/teensy-firmware.yml @@ -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 @@ -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: | diff --git a/Firmware/simulator/README.md b/Firmware/simulator/README.md index f2b5242..a739942 100644 --- a/Firmware/simulator/README.md +++ b/Firmware/simulator/README.md @@ -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)). | @@ -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 `` (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 `` (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`.