From dc5f4f8aa65a85e4f1643bf24468003d968232f3 Mon Sep 17 00:00:00 2001 From: Patrick Mulligan Date: Fri, 20 Mar 2026 18:11:00 -0400 Subject: [PATCH] feat(deploy): add batm3 ISO build target Add batm3 to flake.nix NixOS configs, live.nix (CDC ACM kernel modules, MEI udev rules), and build-iso.sh. Default fiat: USD. Co-Authored-By: Claude Opus 4.6 --- deploy/nixos/build-iso.sh | 6 ++++-- deploy/nixos/live.nix | 11 +++++++++++ flake.nix | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/deploy/nixos/build-iso.sh b/deploy/nixos/build-iso.sh index 4849dd9..6202414 100755 --- a/deploy/nixos/build-iso.sh +++ b/deploy/nixos/build-iso.sh @@ -9,6 +9,7 @@ # bash build-iso.sh douro # Bay Trail, kernel 5.15, GTQ # bash build-iso.sh tejo # UP4000, kernel 6.6, GTQ # bash build-iso.sh sintra # UPBoard, kernel 6.6, EUR +# bash build-iso.sh batm3 # General Bytes BATM3, EBDS validator, USD set -euo pipefail MODEL="${1:-}" @@ -17,13 +18,14 @@ if [ -z "$MODEL" ]; then echo " douro - Bay Trail Atom, kernel 5.15, eDP panel, GTQ" echo " tejo - UP4000/UPBoard, kernel 6.6, GTQ" echo " sintra - UPBoard, kernel 6.6, EUR" + echo " batm3 - General Bytes BATM3, EBDS validator, USD" exit 1 fi case "$MODEL" in - douro|tejo|sintra) ;; + douro|tejo|sintra|batm3) ;; *) - echo "ERROR: Unknown model '$MODEL'. Use 'douro', 'tejo', or 'sintra'." + echo "ERROR: Unknown model '$MODEL'. Use 'douro', 'tejo', 'sintra', or 'batm3'." exit 1 ;; esac diff --git a/deploy/nixos/live.nix b/deploy/nixos/live.nix index 82e5b99..1f7de50 100644 --- a/deploy/nixos/live.nix +++ b/deploy/nixos/live.nix @@ -18,6 +18,7 @@ let douro = "GTQ"; tejo = "GTQ"; sintra = "EUR"; + batm3 = "USD"; }.${machineModel} or "USD"; # .env template — runtime secrets are provisioned later via provision-atm.sh. @@ -86,6 +87,11 @@ in "usbserial" # USB-to-serial adapters (ttyUSB0/1 for validator/printer) "ftdi_sio" # FTDI USB serial (common in ATM peripherals) "cp210x" # CP210x USB serial (alternative adapter) + ] ++ lib.optionals (machineModel == "batm3") [ + "cdc_acm" # USB CDC ACM for MEI BNR Advance validator + "usbserial" # USB-to-serial for F56 dispenser adapter + "ftdi_sio" # FTDI USB serial (common RS232 adapter) + "cp210x" # CP210x USB serial (alternative adapter) ]; kernelParams = [ @@ -207,6 +213,11 @@ in KERNEL=="ttyS[0-9]*", MODE="0666" KERNEL=="ttyUSB[0-9]*", MODE="0666" KERNEL=="ttyACM[0-9]*", MODE="0666" + '' + lib.optionalString (machineModel == "batm3") '' + + # ── BATM3 MEI BNR Advance USB CDC ACM ────────────────────────────── + # Stable symlink for the bill validator (vendor 0x0bed = MEI) + SUBSYSTEM=="tty", ATTRS{idVendor}=="0bed", SYMLINK+="ttyValidator" '' + lib.optionalString (machineModel == "tejo") '' # ── Tejo serial port symlinks ────────────────────────────────────── diff --git a/flake.nix b/flake.nix index 9d4d22d..4843994 100644 --- a/flake.nix +++ b/flake.nix @@ -57,6 +57,7 @@ douro = "GTQ"; tejo = "GTQ"; sintra = "EUR"; + batm3 = "USD"; }; lib = nixpkgs.lib; @@ -213,6 +214,7 @@ douro = mkLiveConfig "douro"; tejo = mkLiveConfig "tejo"; sintra = mkLiveConfig "sintra"; + batm3 = mkLiveConfig "batm3"; # Backwards compat lamassu-live-douro = mkLiveConfig "douro"; @@ -237,11 +239,13 @@ atm-app-douro = mkAtmApp { model = "douro"; fiatCode = "GTQ"; }; atm-app-tejo = mkAtmApp { model = "tejo"; fiatCode = "GTQ"; }; atm-app-sintra = mkAtmApp { model = "sintra"; fiatCode = "EUR"; }; + atm-app-batm3 = mkAtmApp { model = "batm3"; fiatCode = "USD"; }; # ISO images iso-douro = self.nixosConfigurations.douro.config.system.build.isoImage; iso-tejo = self.nixosConfigurations.tejo.config.system.build.isoImage; iso-sintra = self.nixosConfigurations.sintra.config.system.build.isoImage; + iso-batm3 = self.nixosConfigurations.batm3.config.system.build.isoImage; # Raw disk images (dd-able to mSATA/eMMC, proper GPT + ESP) disk-image-douro = import (nixpkgs + "/nixos/lib/make-disk-image.nix") {