# Hardware Abstraction Features

**Feature Group ID:** FG-HW  
**Version:** 1.0  
**Date:** 2025-01-19  
**Scope:** Sensor Hub (Sub-Hub only)  
**Target Platform:** ESP32-S3–based Sensor Hub, ESP-IDF v5.4

## 1 Feature Overview

The **Hardware Abstraction Features** provide a clean separation between application logic and hardware interfaces. These features ensure hardware independence, maintainability, and testability of the system.

**Architecture Principle:** Application layer SHALL NOT access hardware directly (CFC-ARCH-01).

## 2 Scope and Assumptions

**In Scope**

*   Sensor Abstraction Layer (SAL)
*   Hardware interface abstraction (I2C, SPI, UART, ADC, GPIO)
*   Storage interface abstraction (SD Card, NVM)
*   Display interface abstraction (OLED I2C)

**Out of Scope**

*   Hardware driver implementation details (ESP-IDF drivers)
*   Hardware-specific optimizations (deferred to implementation)

## 3 Sub-Feature Breakdown

### 3.1 F-HW-01: Sensor Abstraction Layer (SAL)

#### Description

The system provides a Sensor Abstraction Layer (SAL) to ensure hardware independence and maintainability.

**Interface Functions:**
- `sensor_read()`: Retrieve the latest value
- `sensor_calibrate()`: Perform sensor-specific calibration
- `sensor_validate()`: Check if the reading is within physical bounds
- `sensor_health_check()`: Verify the operational status of the hardware
- `sensor_getMetadata()`: Get sensor capabilities (range, accuracy, etc.)
- `sensor_reset()`: Recovery from fault states

**Sensor State Management:**
- **INIT:** Sensor initialization
- **WARMUP:** Sensor warming up (not yet stable)
- **STABLE:** Sensor operational and stable
- **DEGRADED:** Sensor operational but degraded
- **FAILED:** Sensor failed, not operational

#### Responsibilities

*   Abstract sensor hardware interfaces
*   Provide uniform sensor API
*   Manage sensor state
*   Handle sensor-specific calibration
*   Validate sensor readings

#### Constraints

*   All sensor access must go through SAL
*   Application layer must not access sensor hardware directly
*   Sensor state must be tracked and reported

### 3.2 F-HW-02: Hardware Interface Abstraction

#### Description

The system abstracts all hardware interfaces through driver layers.

**Abstraction Layers:**
- **I2C Interface:** Abstracted via ESP-IDF I2C driver wrapper
- **SPI Interface:** Abstracted via ESP-IDF SPI driver wrapper
- **UART Interface:** Abstracted via ESP-IDF UART driver wrapper
- **ADC Interface:** Abstracted via ESP-IDF ADC driver wrapper
- **GPIO Interface:** Abstracted via ESP-IDF GPIO driver wrapper
- **Storage Interfaces:** SD Card (SDMMC), NVM (NVS)
- **Display Interface:** OLED I2C

**GPIO Discipline:**
- **No Strapping Pins:** Avoid using strapping pins (GPIO 0, 3, 45, 46) for general-purpose I/O
- **I2C Pull-up Audit:** Ensure all shared I2C buses have appropriate physical pull-up resistors (2.2kΩ - 4.7kΩ for 3.3V)
- **No ADC2 with Wi-Fi:** ADC2 unit cannot be used when Wi-Fi is active. All analog sensors must be connected to ADC1 pins
- **Canonical GPIO Map:** Single authoritative GPIO map document must be maintained

#### Responsibilities

*   Abstract hardware interfaces
*   Provide uniform API for hardware access
*   Enforce GPIO discipline
*   Manage hardware resource conflicts

#### Constraints

*   Application layer must not access hardware directly
*   GPIO usage must follow canonical GPIO map
*   Hardware conflicts must be detected and reported

## 4 System Requirements (Formal SHALL Statements)

### Sensor Abstraction Layer Requirements

*   **SR-HW-001**: The system shall provide a Sensor Abstraction Layer (SAL) for all sensor access.
*   **SR-HW-002**: The system shall prevent application layer from directly accessing sensor hardware.
*   **SR-HW-003**: The system shall track sensor state (INIT, WARMUP, STABLE, DEGRADED, FAILED).
*   **SR-HW-004**: The system shall provide sensor validation and health check functions.

### Hardware Interface Abstraction Requirements

*   **SR-HW-005**: The system shall abstract all hardware interfaces (I2C, SPI, UART, ADC, GPIO) through driver layers.
*   **SR-HW-006**: The system shall enforce GPIO discipline (no strapping pins, proper pull-ups, ADC1/ADC2 separation).
*   **SR-HW-007**: The system shall maintain a canonical GPIO map document.
*   **SR-HW-008**: The system shall detect and report hardware resource conflicts.

## 5 Traceability Matrix (Feature → System Requirements)

| Feature ID | Related System Requirements |
|------------|----------------------------|
| F-HW-01 | SR-HW-001, SR-HW-002, SR-HW-003, SR-HW-004 |
| F-HW-02 | SR-HW-005, SR-HW-006, SR-HW-007, SR-HW-008 |

## 6 Design & Implementation Notes (Non-Normative)

*   **SAL Implementation:** Each sensor type implements SAL interface
*   **Driver Wrappers:** ESP-IDF drivers wrapped in application-specific abstraction layer
*   **GPIO Map:** Must be maintained as single source of truth
*   **Hardware Conflicts:** Runtime detection and reporting via diagnostics

## 7 Dependencies

*   **ESP-IDF Drivers:** I2C, SPI, UART, ADC, GPIO, SDMMC, NVS
*   **System Management Features:** Hardware initialization and teardown
*   **Diagnostics Features:** Hardware fault reporting

## 8 GPIO Map Guidelines

**Strapping Pins (DO NOT USE):**
- GPIO 0: Boot mode selection
- GPIO 3: JTAG
- GPIO 45: Strapping pin
- GPIO 46: Strapping pin

**ADC Constraints:**
- **ADC1:** Available when Wi-Fi is active
- **ADC2:** NOT available when Wi-Fi is active (use ADC1 for all analog sensors)

**I2C Pull-up Requirements:**
- **Physical Pull-ups:** 2.2kΩ - 4.7kΩ for 3.3V
- **Software Pull-ups:** Not recommended for production (use physical pull-ups)
