; =============================================================================
; AR-Autopilot v1 -- firmware build configuration
; =============================================================================
;
; Target hardware: AR-NMEA-IO v1.0 (ESP32-DOWD-V3, dual-core 240 MHz)
; Build system:    PlatformIO 6.1+
; Framework:       arduino (on ESP32 -- includes FreeRTOS, full Espressif stack)
;
; This file is the single source of truth for the firmware build. Versions of
; the platform, framework packages, and library dependencies are pinned for
; reproducibility.
;
; Tasks (from the project root):
;
;   .venv/Scripts/pio.exe run                 # compile (default env: esp32-dev)
;   .venv/Scripts/pio.exe run -e esp32-debug  # compile with extra debug flags
;   .venv/Scripts/pio.exe run -e native       # build host-side Unity tests
;   .venv/Scripts/pio.exe test -e native      # run host-side Unity tests
;   .venv/Scripts/pio.exe check               # static analysis (cppcheck)
;   .venv/Scripts/pio.exe run -t upload       # flash (needs the board plugged in)
;
; =============================================================================

[platformio]
src_dir = src
include_dir = include
test_dir = test
default_envs = esp32-dev

; -----------------------------------------------------------------------------
; Common settings shared by every ESP32 env
; -----------------------------------------------------------------------------
[env]
platform = espressif32@^6.7.0
framework = arduino
monitor_speed = 115200
monitor_filters = esp32_exception_decoder, time
build_flags =
    -std=gnu++17
    -DCORE_DEBUG_LEVEL=3                ; ARDUHAL_LOG_LEVEL_INFO
    -DAR_FW_VERSION=\"0.1.0-sprint1\"
    -DAR_FW_BUILD_TIMESTAMP=__TIMESTAMP__
    -Wall
    -Wextra
    -Wno-unused-parameter
    -Wno-missing-field-initializers
build_unflags =
    -std=gnu++11

; Library dependencies pinned for reproducibility.
; These are the Sprint 1 dependencies; later sprints may add more.
lib_deps =
    ttlappalainen/NMEA2000-library@^4.22.0
    ttlappalainen/NMEA2000_esp32@^1.0.3
    https://github.com/eModbus/eModbus.git#v1.7.4.stable

; Files we never want to compile / lint:
;   - Documentation
;   - Test fixtures (handled by env:native)
lib_ignore =
    test

; -----------------------------------------------------------------------------
; Production build for the AR-NMEA-IO board
; -----------------------------------------------------------------------------
[env:esp32-dev]
board = esp32dev
board_build.partitions = default.csv
build_type = release
build_flags =
    ${env.build_flags}
    -Os
    -DAR_BUILD_VARIANT=\"release\"

; -----------------------------------------------------------------------------
; Debug build (-O0, extra logging)
; -----------------------------------------------------------------------------
[env:esp32-debug]
board = esp32dev
build_type = debug
build_flags =
    ${env.build_flags}
    -O0
    -ggdb
    -DAR_BUILD_VARIANT=\"debug\"
    -DCORE_DEBUG_LEVEL=5                ; ARDUHAL_LOG_LEVEL_VERBOSE

; -----------------------------------------------------------------------------
; Host-side Unity tests (run on the developer machine, no ESP32 needed)
; -----------------------------------------------------------------------------
; Used for pure-logic tests: ring buffers, median filters, the Modbus
; register map, the PID math, etc. Anything that talks to real hardware
; lives in env:esp32-dev tests and runs only on the board.
;
; NOTE: this env does NOT inherit [env] (which targets ESP32 + Arduino).
[env:native]
platform = native
framework =
test_framework = unity
test_build_src = no
build_flags =
    -std=gnu++17
    -DAR_HOST_TEST=1
    -DUNITY_INCLUDE_DOUBLE
    -Wall
    -Wextra
build_unflags =
lib_deps =
lib_ignore =
monitor_filters =

; -----------------------------------------------------------------------------
; Static analysis
; -----------------------------------------------------------------------------
[env:check]
platform = espressif32@^6.7.0
framework = arduino
board = esp32dev
check_tool = cppcheck
check_flags =
    cppcheck: --enable=warning,style,performance,portability --inline-suppr
check_skip_packages = yes
check_severity = medium, high
