From 041956c13760397b2f684dda68f1c31497b4a7b8 Mon Sep 17 00:00:00 2001 From: "Ricardo (XenGi) Band" Date: Sat, 30 May 2026 19:26:30 +0200 Subject: [PATCH] improve flake --- flake.nix | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 91 insertions(+), 4 deletions(-) diff --git a/flake.nix b/flake.nix index 49db5f6..69bbba9 100644 --- a/flake.nix +++ b/flake.nix @@ -29,14 +29,101 @@ "python3.13-ecdsa-0.19.1" ]; }; + autoSerialPort = pkgs.writeShellScriptBin "esp-port" '' + set -euo pipefail + + # Try common ESP USB serial patterns + # TODO: reduce to Waveshare ESP32-S3 detection + PORT=$( + for p in /dev/serial/by-id/*; do + case "$p" in + *CP210*|*ch340*|*USB*|*ESP*) echo "$p"; break ;; + esac + done + ) + + if [ -z "$PORT" ]; then + echo "No ESP serial device found in /dev/serial/by-id" + echo "Fallback: listing /dev/ttyUSB* /dev/ttyACM*" + ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null || true + exit 1 + fi + + echo "$PORT" + ''; + esp-idf = pkgs.esp-idf-full.override { + rev = "v6.0.1"; + sha256 = "sha256-4KJa686qc+u7XkF/GS2o53l1SpwP2EmdqAn/qmlL1yU="; + }; in { + apps = { + menuconfig = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-menuconfig" '' + ${esp-idf}/tools/idf.py menuconfig + ''}/bin/idf-menuconfig"; + }; + build = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-build" '' + ${esp-idf}/tools/idf.py build + ''}/bin/idf-build"; + }; + flash = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-flash" '' + set -euo pipefail + + PORT=$(${autoSerialPort}/bin/esp-port) + echo "Flashing on: $PORT" + + ${esp-idf}/tools/idf.py -p "$PORT" flash + ''}/bin/idf-flash"; + }; + monitor = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-monitor" '' + set -euo pipefail + + PORT=$(${autoSerialPort}/bin/esp-port) + echo "Monitoring: $PORT" + + ${esp-idf}/tools/idf.py -p "$PORT" monitor + ''}/bin/idf-monitor"; + }; + clean = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-clean" '' + ${esp-idf}/tools/idf.py clean + ''}/bin/idf-clean"; + }; + full = { + type = "app"; + program = "${pkgs.writeShellScriptBin "idf-full" '' + set -euo pipefail + + PORT=$(${autoSerialPort}/bin/esp-port) + + echo "Building..." + ${esp-idf}/tools/idf.py build + echo "Flashing on $PORT..." + ${esp-idf}/tools/idf.py -p "$PORT" flash + echo "Starting monitor..." + ${esp-idf}/tools/idf.py -p "$PORT" monitor + ''}/bin/idf-full"; + }; + }; devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ - (esp-idf-full.override { - rev = "v6.0.1"; - sha256 = "sha256-4KJa686qc+u7XkF/GS2o53l1SpwP2EmdqAn/qmlL1yU="; - }) + esp-idf + git + minicom + usbutils + gawk + coreutils + cmake + ninja ]; }; }