{ description = "ESP32 Tang Server Development Environment"; inputs = { flake-utils.url = "github:numtide/flake-utils"; nixpkgs-esp-dev = { url = "github:mirrexagon/nixpkgs-esp-dev"; }; nixpkgs.follows = "nixpkgs-esp-dev/nixpkgs"; }; outputs = { self, nixpkgs, flake-utils, nixpkgs-esp-dev, }: flake-utils.lib.eachDefaultSystem ( system: let pkgs = import nixpkgs { inherit system; config = { permittedInsecurePackages = [ "python3.13-ecdsa-0.19.1" ]; }; overlays = [ nixpkgs-esp-dev.overlays.default ]; }; in { devShells.default = pkgs.mkShell { name = "esp32-tang-dev"; buildInputs = with pkgs; [ python3Packages.pandas # ESP-IDF with full toolchain esp-idf-full jose clevis # Development tools gnumake cmake ninja ccache # Serial communication tools picocom screen minicom # Development utilities curl wget unzip file which jq # Text processing tools gawk gnused gnugrep # Optional development tools clang-tools bear ] ++ lib.optionals stdenv.isLinux [ # Linux-specific packages for USB device access udev libusb1 ]; shellHook = '' echo "🚀 ESP32 Tang Server Development Environment" echo "=============================================" echo echo "ESP-IDF: $(idf.py --version 2>/dev/null || echo 'Ready')" echo "Python: $(python3 --version)" echo "CMake: $(cmake --version | head -1)" echo echo "Available commands:" echo " 📦 idf.py build - Build the project" echo " 📡 idf.py flash - Flash to device" echo " 💻 idf.py monitor - Serial monitor" echo " 🔧 idf.py flash monitor - Flash and monitor" echo " ⚙️ idf.py menuconfig - Configuration menu" echo " 🎯 idf.py set-target - Set target (esp32)" echo echo "Or use the Makefile shortcuts:" echo " make setup-target - Set ESP32 target" echo " make build - Build project" echo " make flash-monitor - Flash and monitor" echo " make menuconfig - Configuration" echo echo "Quick start:" echo " 1. Set target: make setup-target" echo " 2. Configure: make menuconfig" echo " 3. Build: make build" echo " 4. Flash & Monitor: make flash-monitor PORT=/dev/ttyUSB0" echo # Set up development environment export IDF_TOOLS_PATH="$HOME/.espressif" export CCACHE_DIR="$HOME/.ccache" # Create necessary directories mkdir -p "$IDF_TOOLS_PATH" mkdir -p "$CCACHE_DIR" # Check for serial devices if ls /dev/ttyUSB* >/dev/null 2>&1; then echo "📡 Found USB serial devices:" ls -la /dev/ttyUSB* 2>/dev/null elif ls /dev/ttyACM* >/dev/null 2>&1; then echo "📡 Found ACM serial devices:" ls -la /dev/ttyACM* 2>/dev/null else echo "📡 No serial devices found. Connect your ESP32 board." fi # Check serial permissions if ! groups | grep -q dialout 2>/dev/null && ! groups | grep -q uucp 2>/dev/null; then echo echo "⚠️ Note: You may need to add your user to the 'dialout' group" echo " to access serial devices:" echo " sudo usermod -a -G dialout $USER" echo " Then log out and log back in." fi echo echo "Ready for ESP32 development with Arduino support! 🎯" echo ''; # allow /dev/ access extraDevPaths = [ "/dev/ttyUSB*" "/dev/ttyACM*" ]; # Environment variables IDF_TOOLS_PATH = "$HOME/.espressif"; CCACHE_DIR = "$HOME/.ccache"; # Prevent Python from creating __pycache__ directories PYTHONDONTWRITEBYTECODE = "1"; # Enable colored output FORCE_COLOR = "1"; # Set locale to avoid issues LANG = "C.UTF-8"; LC_ALL = "C.UTF-8"; }; devShells.minimal = pkgs.mkShell { name = "esp32-tang-minimal"; buildInputs = with pkgs; [ esp-idf-full picocom ]; shellHook = '' echo "⚡ ESP32 Tang Server (Minimal Environment)" echo "========================================" echo "Ready for ESP32 development!" echo export IDF_TOOLS_PATH="$HOME/.espressif" export CCACHE_DIR="$HOME/.ccache" mkdir -p "$CCACHE_DIR" ''; extraDevPaths = [ "/dev/ttyUSB*" "/dev/ttyACM*" ]; }; } ); }