menu "CSI Node Configuration"

    config CSI_NODE_ID
        int "Node ID (0-255)"
        default 1
        range 0 255
        help
            Unique identifier for this ESP32 CSI node.

    config CSI_TARGET_IP
        string "Aggregator IP address"
        default "192.168.1.100"
        help
            IP address of the UDP aggregator host.

    config CSI_TARGET_PORT
        int "Aggregator UDP port"
        default 5005
        range 1024 65535
        help
            UDP port the aggregator listens on.

    config CSI_WIFI_SSID
        string "WiFi SSID"
        default "wifi-densepose"
        help
            SSID of the WiFi network to connect to.

    config CSI_WIFI_PASSWORD
        string "WiFi Password"
        default ""
        help
            Password for the WiFi network. Leave empty for open networks.

    config CSI_WIFI_CHANNEL
        int "WiFi Channel (1-13)"
        default 6
        range 1 13
        help
            WiFi channel to listen on for CSI data.

endmenu

menu "Edge Intelligence (ADR-039)"

    config EDGE_TIER
        int "Edge processing tier (0=raw, 1=basic, 2=full)"
        default 2
        range 0 2
        help
            0 = Raw passthrough (no on-device DSP).
            1 = Basic presence/motion detection.
            2 = Full pipeline (vitals, compression, multi-person).

    config EDGE_VITAL_INTERVAL_MS
        int "Vitals packet send interval (ms)"
        default 1000
        range 100 10000
        help
            How often to send vitals packets over UDP.

    config EDGE_TOP_K
        int "Top-K subcarriers to track"
        default 8
        range 1 32
        help
            Number of highest-variance subcarriers to use for DSP.

    config EDGE_FALL_THRESH
        int "Fall detection threshold (x1000)"
        default 15000
        range 100 50000
        help
            Phase acceleration threshold for fall detection.
            Value is divided by 1000 to get rad/s². Default 15000 = 15.0 rad/s².
            Raise to reduce false positives in high-traffic environments.
            Normal walking produces accelerations of 2-5 rad/s².
            Stored as integer; divided by 1000 at runtime.

    config EDGE_POWER_DUTY
        int "Power duty cycle percentage"
        default 100
        range 10 100
        help
            Active duty cycle for battery-powered nodes.
            100 = always on. 50 = active half the time.

endmenu

menu "Adaptive Controller (ADR-081)"

    config ADAPTIVE_FAST_LOOP_MS
        int "Fast loop period (ms)"
        default 200
        range 50 2000
        help
            Period of the fast control loop. The fast loop reads radio
            health and edge-derived motion/presence/anomaly scores and
            updates the active capture profile. Default 200 ms matches
            the ADR-081 spec.

    config ADAPTIVE_MEDIUM_LOOP_MS
        int "Medium loop period (ms)"
        default 1000
        range 200 30000
        help
            Period of the medium control loop. The medium loop is where
            channel selection and role transitions happen (when
            enable_channel_switch / enable_role_change are on).

    config ADAPTIVE_SLOW_LOOP_MS
        int "Slow loop period (ms)"
        default 30000
        range 1000 300000
        help
            Period of the slow control loop. The slow loop publishes
            HEALTH messages and may request CALIBRATION_START on
            sustained drift.

    config ADAPTIVE_AGGRESSIVE
        bool "Aggressive adaptation"
        default n
        help
            When enabled, the controller reacts to motion / anomaly
            sooner and uses a tighter cadence in SENSE_ACTIVE. Default
            off matches today's conservative behavior.

    config ADAPTIVE_ENABLE_CHANNEL_SWITCH
        bool "Allow controller to change WiFi channel"
        default n
        help
            When disabled, the controller never calls set_channel() —
            channel hopping (ADR-029) and channel override (ADR-060)
            remain in charge. Enable only after Phase 3 follow-up
            work has wired the channel-plan mesh message.

    config ADAPTIVE_ENABLE_ROLE_CHANGE
        bool "Allow controller to change mesh role"
        default n
        help
            When disabled, the controller never advertises a different
            role to the swarm bridge. Enable after the mesh-plane
            ROLE_ASSIGN protocol is in place.

    config ADAPTIVE_MOTION_THRESH_PERMIL
        int "Motion threshold (per-mille)"
        default 200
        range 1 1000
        help
            Motion score above which the controller transitions to
            SENSE_ACTIVE and selects RV_PROFILE_FAST_MOTION. Expressed
            in per-mille (200 = 0.20).

    config ADAPTIVE_ANOMALY_THRESH_PERMIL
        int "Anomaly threshold (per-mille)"
        default 600
        range 1 1000
        help
            Anomaly score above which the controller transitions to
            ALERT. Per-mille (600 = 0.60).

    config ADAPTIVE_MIN_PKT_YIELD
        int "Minimum packet yield before DEGRADED (pps)"
        default 5
        range 0 100
        help
            CSI callback rate (per second) below which the controller
            falls back to DEGRADED mode and pins the radio to
            RV_PROFILE_PASSIVE_LOW_RATE. 0 disables the degraded gate.

endmenu

menu "AMOLED Display (ADR-045)"

    config DISPLAY_ENABLE
        bool "Enable AMOLED display support"
        default y
        help
            Enable RM67162 QSPI AMOLED display and LVGL UI.
            Auto-detects at boot; gracefully skips if no display hardware.
            Requires SPIRAM for frame buffers.

    config DISPLAY_FPS_LIMIT
        int "Display refresh rate limit (FPS)"
        default 30
        range 10 60
        depends on DISPLAY_ENABLE
        help
            Maximum display refresh rate. Lower values save CPU.

    config DISPLAY_BRIGHTNESS
        int "Default backlight brightness (%)"
        default 80
        range 0 100
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_CS
        int "QSPI CS GPIO"
        default 6
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_CLK
        int "QSPI CLK GPIO"
        default 47
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_D0
        int "QSPI D0 GPIO"
        default 18
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_D1
        int "QSPI D1 GPIO"
        default 7
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_D2
        int "QSPI D2 GPIO"
        default 48
        depends on DISPLAY_ENABLE

    config DISPLAY_QSPI_D3
        int "QSPI D3 GPIO"
        default 5
        depends on DISPLAY_ENABLE

    config DISPLAY_TOUCH_SDA
        int "Touch I2C SDA GPIO"
        default 3
        depends on DISPLAY_ENABLE

    config DISPLAY_TOUCH_SCL
        int "Touch I2C SCL GPIO"
        default 2
        depends on DISPLAY_ENABLE

    config DISPLAY_TOUCH_INT
        int "Touch INT GPIO"
        default 21
        depends on DISPLAY_ENABLE

    config DISPLAY_TOUCH_RST
        int "Touch RST GPIO"
        default 17
        depends on DISPLAY_ENABLE

    config DISPLAY_BL_PIN
        int "Backlight PWM GPIO"
        default 38
        depends on DISPLAY_ENABLE

endmenu

menu "WASM Programmable Sensing (ADR-040)"

    config WASM_ENABLE
        bool "Enable WASM Tier 3 runtime"
        default y
        help
            Enable the WASM3 interpreter for hot-loadable sensing modules.
            Requires WASM3 source in components/wasm3/wasm3-src/.
            Adds ~120 KB flash and ~20 KB SRAM.

    config WASM_MAX_MODULES
        int "Maximum concurrent WASM modules"
        default 4
        range 1 8
        help
            Number of WASM module slots.  Each slot can hold one
            loaded .wasm binary (stored in PSRAM, max 128 KB each).

    config WASM_VERIFY_SIGNATURE
        bool "Require Ed25519 signature verification for WASM uploads"
        default y
        help
            When enabled, uploaded .wasm binaries must include a valid
            Ed25519 signature.  Uses the same signing key as OTA firmware.
            Disable with provision.py --no-wasm-verify for lab/dev use.

    config WASM_TIMER_INTERVAL_MS
        int "WASM on_timer() interval (ms)"
        default 1000
        range 100 60000
        help
            How often to call on_timer() on running WASM modules.
            Default 1000 ms = 1 Hz.

endmenu

menu "ESP32-C6 capabilities (ADR-110)"
    depends on IDF_TARGET_ESP32C6

    config C6_TWT_ENABLE
        bool "Enable TWT (Target Wake Time) negotiation"
        default y
        # SOC_WIFI_HE_SUPPORT is auto-set on chips with HE (Wi-Fi 6) PHY (C6/C5)
        depends on SOC_WIFI_HE_SUPPORT
        help
            After WiFi STA connect, request an individual TWT agreement
            with the AP for deterministic CSI cadence. Falls back
            gracefully if the AP doesn't support 11ax TWT.

    config C6_TWT_WAKE_INTERVAL_US
        int "TWT wake interval (microseconds)"
        default 10000
        range 1024 1048576
        depends on C6_TWT_ENABLE
        help
            Period between TWT wake events. 10000 µs = 100 Hz CSI cadence.

    config C6_TWT_MIN_WAKE_DURA_US
        int "TWT minimum wake duration (microseconds)"
        default 512
        range 256 16384
        depends on C6_TWT_ENABLE
        help
            Minimum awake duration per TWT wake. 512 µs is enough to
            capture one CSI frame.

    config C6_TIMESYNC_ENABLE
        bool "Enable 802.15.4 mesh time-sync"
        default y
        depends on IEEE802154_ENABLED
        help
            Cross-node clock alignment over the 802.15.4 radio. Frees
            WiFi airtime from coordination traffic — relevant to
            ADR-029/030 multistatic sensing.

    config C6_TIMESYNC_CHANNEL
        int "802.15.4 time-sync channel (11-26)"
        default 15
        range 11 26
        depends on C6_TIMESYNC_ENABLE

    config C6_LP_CORE_ENABLE
        bool "Enable LP-core wake-on-motion hibernation"
        default n
        depends on ULP_COPROC_TYPE_LP_CORE
        help
            Arm the LP RISC-V coprocessor as an always-on motion gate
            in deep sleep. Targets ~5 µA hibernation for battery
            seed nodes. Requires a motion sensor on a wake-capable GPIO.

    config C6_LP_WAKE_GPIO
        int "LP-core wake GPIO"
        default 4
        range 0 23
        depends on C6_LP_CORE_ENABLE

    config C6_LP_WAKE_ACTIVE_HIGH
        bool "Wake on rising edge"
        default y
        depends on C6_LP_CORE_ENABLE

    config C6_LP_POLL_PERIOD_US
        int "LP-core poll period (microseconds)"
        default 10000
        range 1000 1000000
        depends on C6_LP_CORE_ENABLE
        help
            How often the LP-core program reads the wake GPIO.
            10000 µs = 100 Hz. Lower values give faster response
            but increase the average LP-core duty cycle (and
            current). 10 ms is a good balance for PIR sensors.

    config C6_LP_DEBOUNCE_SAMPLES
        int "LP-core debounce sample count"
        default 3
        range 1 32
        depends on C6_LP_CORE_ENABLE
        help
            How many consecutive matching GPIO reads are required
            before the LP-core wakes the HP core. 3 = ~30 ms at the
            default 10 ms poll period.

    config C6_SOFTAP_HE_ENABLE
        bool "Run as Wi-Fi 6 soft-AP with TWT Responder (two-board bench)"
        default n
        depends on SOC_WIFI_HE_SUPPORT
        help
            When set, the C6 starts in AP+STA mode and advertises a
            soft-AP that announces HE (Wi-Fi 6) capability with
            TWT Responder=1. Lets a second C6 station-mode board
            negotiate a real iTWT agreement against a known-cooperative
            AP, unblocking ADR-110 §B1/B2 measurement without
            buying an 11ax router. SSID/PSK configured via NVS
            (keys `softap_ssid` / `softap_psk`) or the defaults below.

    config C6_SOFTAP_HE_SSID
        string "Soft-AP SSID (when C6_SOFTAP_HE_ENABLE)"
        default "ruview-c6-twt"
        depends on C6_SOFTAP_HE_ENABLE

    config C6_SOFTAP_HE_PSK
        string "Soft-AP WPA2 password (>= 8 chars)"
        default "ruviewtwt"
        depends on C6_SOFTAP_HE_ENABLE

    config C6_SOFTAP_HE_CHANNEL
        int "Soft-AP channel (1-13)"
        default 6
        range 1 13
        depends on C6_SOFTAP_HE_ENABLE

    config C6_SYNC_EVERY_N_FRAMES
        int "Sync-packet emission cadence (CSI frames per sync)"
        default 20
        range 1 1000
        help
            How many CSI callbacks fire before csi_collector emits one
            ADR-110 §A0.11 sync packet (magic 0xC511A110) carrying the
            mesh-aligned epoch + sequence high-water for the host
            aggregator to pair against incoming CSI frames.

            Default 20 = ~2 s between sync packets at the bench's
            observed 10 fps CSI rate. Raise for less wire overhead;
            lower for tighter multistatic alignment windows.

endmenu

menu "ADR-018 frame extensions (ADR-110)"

    config CSI_FRAME_HE_TAGGING
        bool "Tag ADR-018 frames with HE PPDU metadata"
        default y
        help
            When the WiFi driver reports an 802.11ax HE-SU/HE-MU/HE-TB
            PPDU, write the PPDU type + bandwidth into ADR-018 frame
            bytes 18-19 (previously reserved). Readers that don't know
            about this extension see the bytes as zero — fully
            backwards compatible.

endmenu

menu "Mock CSI (QEMU Testing)"
    config CSI_MOCK_ENABLED
        bool "Enable mock CSI generator (for QEMU testing)"
        default n
        help
            Replace real WiFi CSI with synthetic frame generator.
            Use with QEMU emulation for automated testing.

    config CSI_MOCK_SKIP_WIFI_CONNECT
        bool "Skip WiFi STA connection"
        depends on CSI_MOCK_ENABLED
        default y
        help
            Skip WiFi initialization when using mock CSI.

    config CSI_MOCK_SCENARIO
        int "Mock scenario (0-9, 255=all)"
        depends on CSI_MOCK_ENABLED
        default 255
        range 0 255
        help
            0=empty, 1=static, 2=walking, 3=fall, 4=multi-person,
            5=channel-sweep, 6=mac-filter, 7=ring-overflow,
            8=boundary-rssi, 9=zero-length, 255=run all.

    config CSI_MOCK_SCENARIO_DURATION_MS
        int "Scenario duration (ms)"
        depends on CSI_MOCK_ENABLED
        default 5000
        range 1000 60000

    config CSI_MOCK_LOG_FRAMES
        bool "Log every mock frame (verbose)"
        depends on CSI_MOCK_ENABLED
        default n
endmenu
