update
This commit is contained in:
650
software design/features/F-HW_Hardware_Abstraction.md
Normal file
650
software design/features/F-HW_Hardware_Abstraction.md
Normal file
@@ -0,0 +1,650 @@
|
||||
# Feature Specification: Hardware Abstraction
|
||||
# Feature ID: F-HW (F-HW-001 to F-HW-002)
|
||||
|
||||
**Document Type:** Feature Specification
|
||||
**Version:** 1.0
|
||||
**Date:** 2025-01-19
|
||||
**Feature Category:** Hardware Abstraction
|
||||
|
||||
## 1. Feature Overview
|
||||
|
||||
### 1.1 Feature Purpose
|
||||
|
||||
The Hardware Abstraction feature provides a clean separation between application logic and hardware interfaces for the ASF Sensor Hub. This feature ensures hardware independence, maintainability, and testability by abstracting all hardware access through well-defined interfaces and preventing direct hardware access from the application layer.
|
||||
|
||||
### 1.2 Feature Scope
|
||||
|
||||
**In Scope:**
|
||||
- Sensor Abstraction Layer (SAL) for uniform sensor access
|
||||
- Hardware interface abstraction for I2C, SPI, UART, ADC, GPIO
|
||||
- Storage interface abstraction for SD Card and NVM
|
||||
- Display and user interface abstraction
|
||||
- GPIO discipline enforcement and resource conflict detection
|
||||
|
||||
**Out of Scope:**
|
||||
- Hardware driver implementation details (delegated to ESP-IDF)
|
||||
- Hardware-specific performance optimizations
|
||||
- Physical hardware design and pin assignments
|
||||
- Low-level hardware debugging interfaces
|
||||
|
||||
## 2. Sub-Features
|
||||
|
||||
### 2.1 F-HW-001: Sensor Abstraction Layer (SAL)
|
||||
|
||||
**Description:** Comprehensive sensor abstraction layer providing uniform access to all sensor types while maintaining hardware independence and enabling runtime sensor management.
|
||||
|
||||
**Sensor Abstraction Interface:**
|
||||
```c
|
||||
typedef struct {
|
||||
uint8_t sensor_id; // Unique sensor identifier
|
||||
sensor_type_t type; // Sensor type enumeration
|
||||
char name[32]; // Human-readable sensor name
|
||||
char unit[8]; // Measurement unit (°C, %, ppm, etc.)
|
||||
float min_value; // Minimum valid measurement
|
||||
float max_value; // Maximum valid measurement
|
||||
float accuracy; // Sensor accuracy specification
|
||||
uint32_t warmup_time_ms; // Required warmup time
|
||||
uint32_t sampling_interval_ms; // Minimum sampling interval
|
||||
sensor_interface_t interface; // Hardware interface type
|
||||
} sensor_metadata_t;
|
||||
|
||||
typedef enum {
|
||||
SENSOR_TYPE_TEMPERATURE = 0, // Temperature sensors
|
||||
SENSOR_TYPE_HUMIDITY = 1, // Humidity sensors
|
||||
SENSOR_TYPE_CO2 = 2, // Carbon dioxide sensors
|
||||
SENSOR_TYPE_AMMONIA = 3, // Ammonia sensors
|
||||
SENSOR_TYPE_VOC = 4, // Volatile organic compounds
|
||||
SENSOR_TYPE_LIGHT = 5, // Light intensity sensors
|
||||
SENSOR_TYPE_PARTICULATE = 6 // Particulate matter sensors
|
||||
} sensor_type_t;
|
||||
|
||||
typedef enum {
|
||||
SENSOR_INTERFACE_I2C = 0, // I2C interface
|
||||
SENSOR_INTERFACE_SPI = 1, // SPI interface
|
||||
SENSOR_INTERFACE_UART = 2, // UART interface
|
||||
SENSOR_INTERFACE_ADC = 3, // Analog ADC interface
|
||||
SENSOR_INTERFACE_GPIO = 4 // Digital GPIO interface
|
||||
} sensor_interface_t;
|
||||
```
|
||||
|
||||
**Sensor State Management:**
|
||||
```c
|
||||
typedef enum {
|
||||
SENSOR_STATE_UNKNOWN = 0, // Initial state, not detected
|
||||
SENSOR_STATE_DETECTED = 1, // Presence confirmed
|
||||
SENSOR_STATE_INITIALIZED = 2, // Driver loaded and configured
|
||||
SENSOR_STATE_WARMUP = 3, // Warming up, not stable
|
||||
SENSOR_STATE_STABLE = 4, // Operational and stable
|
||||
SENSOR_STATE_ENABLED = 5, // Active data acquisition
|
||||
SENSOR_STATE_DISABLED = 6, // Present but not acquiring
|
||||
SENSOR_STATE_DEGRADED = 7, // Operational but degraded
|
||||
SENSOR_STATE_FAULTY = 8, // Detected failure condition
|
||||
SENSOR_STATE_REMOVED = 9 // Previously present, now absent
|
||||
} sensor_state_t;
|
||||
|
||||
typedef struct {
|
||||
sensor_state_t current_state; // Current sensor state
|
||||
sensor_state_t previous_state; // Previous sensor state
|
||||
uint64_t state_change_time; // Last state change timestamp
|
||||
uint32_t state_change_count; // Total state changes
|
||||
uint32_t fault_count; // Number of faults detected
|
||||
uint32_t recovery_count; // Number of successful recoveries
|
||||
float last_valid_reading; // Last known good reading
|
||||
uint64_t last_reading_time; // Timestamp of last reading
|
||||
} sensor_state_info_t;
|
||||
```
|
||||
|
||||
**Sensor State Machine:**
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
[*] --> UNKNOWN
|
||||
UNKNOWN --> DETECTED : Presence detected
|
||||
DETECTED --> INITIALIZED : Driver loaded
|
||||
INITIALIZED --> WARMUP : Acquisition started
|
||||
WARMUP --> STABLE : Warmup complete
|
||||
STABLE --> ENABLED : Enable command
|
||||
ENABLED --> DISABLED : Disable command
|
||||
DISABLED --> ENABLED : Enable command
|
||||
ENABLED --> DEGRADED : Performance degradation
|
||||
DEGRADED --> ENABLED : Performance restored
|
||||
ENABLED --> FAULTY : Failure detected
|
||||
DEGRADED --> FAULTY : Failure detected
|
||||
FAULTY --> ENABLED : Recovery successful
|
||||
FAULTY --> REMOVED : Hardware removed
|
||||
ENABLED --> REMOVED : Hardware removed
|
||||
DISABLED --> REMOVED : Hardware removed
|
||||
DEGRADED --> REMOVED : Hardware removed
|
||||
REMOVED --> DETECTED : Hardware restored
|
||||
```
|
||||
|
||||
**Uniform Sensor API:**
|
||||
```c
|
||||
// Sensor lifecycle management
|
||||
bool sal_initializeSensor(uint8_t sensor_id);
|
||||
bool sal_enableSensor(uint8_t sensor_id);
|
||||
bool sal_disableSensor(uint8_t sensor_id);
|
||||
bool sal_resetSensor(uint8_t sensor_id);
|
||||
|
||||
// Sensor data operations
|
||||
bool sal_readSensor(uint8_t sensor_id, float* value);
|
||||
bool sal_calibrateSensor(uint8_t sensor_id, const calibration_data_t* cal_data);
|
||||
bool sal_validateReading(uint8_t sensor_id, float value);
|
||||
bool sal_performHealthCheck(uint8_t sensor_id);
|
||||
|
||||
// Sensor information and status
|
||||
bool sal_getSensorMetadata(uint8_t sensor_id, sensor_metadata_t* metadata);
|
||||
sensor_state_t sal_getSensorState(uint8_t sensor_id);
|
||||
bool sal_getSensorStateInfo(uint8_t sensor_id, sensor_state_info_t* info);
|
||||
bool sal_isSensorPresent(uint8_t sensor_id);
|
||||
bool sal_isSensorHealthy(uint8_t sensor_id);
|
||||
```
|
||||
|
||||
**Sensor Driver Interface:**
|
||||
```c
|
||||
typedef struct {
|
||||
// Driver identification
|
||||
char driver_name[32]; // Driver name
|
||||
char driver_version[16]; // Driver version
|
||||
sensor_type_t supported_type; // Supported sensor type
|
||||
|
||||
// Driver operations
|
||||
bool (*initialize)(uint8_t sensor_id);
|
||||
bool (*read_raw)(uint8_t sensor_id, uint32_t* raw_value);
|
||||
bool (*convert_value)(uint32_t raw_value, float* converted_value);
|
||||
bool (*calibrate)(uint8_t sensor_id, const calibration_data_t* cal_data);
|
||||
bool (*health_check)(uint8_t sensor_id);
|
||||
bool (*reset)(uint8_t sensor_id);
|
||||
|
||||
// Driver configuration
|
||||
sensor_metadata_t metadata; // Sensor metadata
|
||||
void* driver_config; // Driver-specific configuration
|
||||
} sensor_driver_interface_t;
|
||||
```
|
||||
|
||||
### 2.2 F-HW-002: Hardware Interface Abstraction
|
||||
|
||||
**Description:** Comprehensive abstraction of all hardware interfaces to prevent direct hardware access from the application layer and ensure consistent interface usage across the system.
|
||||
|
||||
**GPIO Discipline and Management:**
|
||||
```c
|
||||
typedef struct {
|
||||
uint8_t gpio_number; // Physical GPIO pin number
|
||||
gpio_function_t function; // Assigned function
|
||||
gpio_direction_t direction; // Input/Output direction
|
||||
gpio_pull_t pull_config; // Pull-up/Pull-down configuration
|
||||
bool is_strapping_pin; // Strapping pin flag
|
||||
bool is_reserved; // Reserved for system use
|
||||
char assigned_component[32]; // Component using this GPIO
|
||||
} gpio_pin_config_t;
|
||||
|
||||
typedef enum {
|
||||
GPIO_FUNC_UNUSED = 0, // Pin not used
|
||||
GPIO_FUNC_I2C_SDA = 1, // I2C data line
|
||||
GPIO_FUNC_I2C_SCL = 2, // I2C clock line
|
||||
GPIO_FUNC_SPI_MOSI = 3, // SPI master out, slave in
|
||||
GPIO_FUNC_SPI_MISO = 4, // SPI master in, slave out
|
||||
GPIO_FUNC_SPI_CLK = 5, // SPI clock
|
||||
GPIO_FUNC_SPI_CS = 6, // SPI chip select
|
||||
GPIO_FUNC_UART_TX = 7, // UART transmit
|
||||
GPIO_FUNC_UART_RX = 8, // UART receive
|
||||
GPIO_FUNC_ADC_INPUT = 9, // ADC analog input
|
||||
GPIO_FUNC_DIGITAL_INPUT = 10, // Digital input
|
||||
GPIO_FUNC_DIGITAL_OUTPUT = 11, // Digital output
|
||||
GPIO_FUNC_PWM_OUTPUT = 12 // PWM output
|
||||
} gpio_function_t;
|
||||
|
||||
// Strapping pins that must be avoided for general-purpose I/O
|
||||
#define GPIO_STRAPPING_PINS {0, 3, 45, 46}
|
||||
```
|
||||
|
||||
**I2C Interface Abstraction:**
|
||||
```c
|
||||
typedef struct {
|
||||
uint8_t i2c_port; // I2C port number (0 or 1)
|
||||
uint8_t sda_pin; // SDA pin assignment
|
||||
uint8_t scl_pin; // SCL pin assignment
|
||||
uint32_t frequency_hz; // I2C frequency (100kHz, 400kHz)
|
||||
bool pullup_enabled; // Internal pull-up enable
|
||||
uint32_t timeout_ms; // Transaction timeout
|
||||
} i2c_config_t;
|
||||
|
||||
// I2C abstraction API
|
||||
bool hw_i2c_initialize(uint8_t port, const i2c_config_t* config);
|
||||
bool hw_i2c_write(uint8_t port, uint8_t device_addr, const uint8_t* data, size_t len);
|
||||
bool hw_i2c_read(uint8_t port, uint8_t device_addr, uint8_t* data, size_t len);
|
||||
bool hw_i2c_write_read(uint8_t port, uint8_t device_addr,
|
||||
const uint8_t* write_data, size_t write_len,
|
||||
uint8_t* read_data, size_t read_len);
|
||||
bool hw_i2c_scan_devices(uint8_t port, uint8_t* found_devices, size_t* count);
|
||||
```
|
||||
|
||||
**SPI Interface Abstraction:**
|
||||
```c
|
||||
typedef struct {
|
||||
uint8_t spi_host; // SPI host (SPI2_HOST, SPI3_HOST)
|
||||
uint8_t mosi_pin; // MOSI pin assignment
|
||||
uint8_t miso_pin; // MISO pin assignment
|
||||
uint8_t sclk_pin; // Clock pin assignment
|
||||
uint8_t cs_pin; // Chip select pin
|
||||
uint32_t frequency_hz; // SPI frequency
|
||||
uint8_t mode; // SPI mode (0-3)
|
||||
uint8_t bit_order; // MSB/LSB first
|
||||
} spi_config_t;
|
||||
|
||||
// SPI abstraction API
|
||||
bool hw_spi_initialize(uint8_t host, const spi_config_t* config);
|
||||
bool hw_spi_transmit(uint8_t host, const uint8_t* tx_data, size_t len);
|
||||
bool hw_spi_receive(uint8_t host, uint8_t* rx_data, size_t len);
|
||||
bool hw_spi_transmit_receive(uint8_t host, const uint8_t* tx_data,
|
||||
uint8_t* rx_data, size_t len);
|
||||
```
|
||||
|
||||
**ADC Interface Abstraction:**
|
||||
```c
|
||||
typedef struct {
|
||||
adc_unit_t adc_unit; // ADC1 or ADC2 (ADC1 only when Wi-Fi active)
|
||||
adc_channel_t channel; // ADC channel
|
||||
adc_atten_t attenuation; // Input attenuation
|
||||
adc_bitwidth_t resolution; // ADC resolution
|
||||
uint32_t sample_count; // Samples for averaging
|
||||
} adc_config_t;
|
||||
|
||||
// ADC abstraction API
|
||||
bool hw_adc_initialize(const adc_config_t* config);
|
||||
bool hw_adc_read_raw(adc_unit_t unit, adc_channel_t channel, uint32_t* raw_value);
|
||||
bool hw_adc_read_voltage(adc_unit_t unit, adc_channel_t channel, float* voltage);
|
||||
bool hw_adc_calibrate(adc_unit_t unit, adc_channel_t channel);
|
||||
```
|
||||
|
||||
**Storage Interface Abstraction:**
|
||||
```c
|
||||
// SD Card abstraction
|
||||
typedef struct {
|
||||
uint8_t mosi_pin; // SD card MOSI pin
|
||||
uint8_t miso_pin; // SD card MISO pin
|
||||
uint8_t clk_pin; // SD card clock pin
|
||||
uint8_t cs_pin; // SD card chip select pin
|
||||
uint32_t frequency_hz; // SD card SPI frequency
|
||||
bool format_if_mount_failed; // Auto-format on mount failure
|
||||
} sd_card_config_t;
|
||||
|
||||
bool hw_sd_initialize(const sd_card_config_t* config);
|
||||
bool hw_sd_mount(const char* mount_point);
|
||||
bool hw_sd_unmount(void);
|
||||
bool hw_sd_get_info(sd_card_info_t* info);
|
||||
|
||||
// NVM (NVS) abstraction
|
||||
bool hw_nvs_initialize(void);
|
||||
bool hw_nvs_write_blob(const char* namespace, const char* key,
|
||||
const void* data, size_t size);
|
||||
bool hw_nvs_read_blob(const char* namespace, const char* key,
|
||||
void* data, size_t* size);
|
||||
bool hw_nvs_erase_key(const char* namespace, const char* key);
|
||||
bool hw_nvs_get_stats(nvs_stats_t* stats);
|
||||
```
|
||||
|
||||
**GPIO Map Management:**
|
||||
```c
|
||||
typedef struct {
|
||||
gpio_pin_config_t pins[GPIO_NUM_MAX]; // All GPIO pin configurations
|
||||
uint32_t used_pin_count; // Number of used pins
|
||||
uint32_t conflict_count; // Number of detected conflicts
|
||||
bool map_validated; // GPIO map validation status
|
||||
} gpio_map_t;
|
||||
|
||||
// GPIO map management API
|
||||
bool hw_gpio_initialize_map(void);
|
||||
bool hw_gpio_reserve_pin(uint8_t gpio_num, gpio_function_t function,
|
||||
const char* component_name);
|
||||
bool hw_gpio_release_pin(uint8_t gpio_num);
|
||||
bool hw_gpio_validate_map(void);
|
||||
bool hw_gpio_detect_conflicts(gpio_conflict_t* conflicts, size_t* count);
|
||||
bool hw_gpio_get_map(gpio_map_t* map);
|
||||
```
|
||||
|
||||
**Hardware Resource Conflict Detection:**
|
||||
```c
|
||||
typedef enum {
|
||||
HW_CONFLICT_GPIO_DUPLICATE = 0, // Same GPIO used by multiple components
|
||||
HW_CONFLICT_I2C_ADDRESS = 1, // I2C address conflict
|
||||
HW_CONFLICT_SPI_CS = 2, // SPI chip select conflict
|
||||
HW_CONFLICT_ADC_WIFI = 3, // ADC2 used with Wi-Fi active
|
||||
HW_CONFLICT_STRAPPING_PIN = 4, // Strapping pin used for I/O
|
||||
HW_CONFLICT_POWER_DOMAIN = 5 // Power domain conflict
|
||||
} hw_conflict_type_t;
|
||||
|
||||
typedef struct {
|
||||
hw_conflict_type_t type; // Conflict type
|
||||
uint8_t resource_id; // Conflicting resource ID
|
||||
char component1[32]; // First component involved
|
||||
char component2[32]; // Second component involved
|
||||
char description[128]; // Human-readable description
|
||||
} hw_conflict_t;
|
||||
```
|
||||
|
||||
## 3. Requirements Coverage
|
||||
|
||||
### 3.1 System Requirements (SR-XXX)
|
||||
|
||||
| Feature | System Requirements | Description |
|
||||
|---------|-------------------|-------------|
|
||||
| **F-HW-001** | SR-HW-001, SR-HW-002, SR-HW-003, SR-HW-004 | Sensor abstraction layer and state management |
|
||||
| **F-HW-002** | SR-HW-005, SR-HW-006, SR-HW-007, SR-HW-008 | Hardware interface abstraction and GPIO discipline |
|
||||
|
||||
### 3.2 Software Requirements (SWR-XXX)
|
||||
|
||||
| Feature | Software Requirements | Implementation Details |
|
||||
|---------|---------------------|----------------------|
|
||||
| **F-HW-001** | SWR-HW-001, SWR-HW-002, SWR-HW-003 | SAL interface, sensor drivers, state machine |
|
||||
| **F-HW-002** | SWR-HW-004, SWR-HW-005, SWR-HW-006 | Interface abstraction, GPIO management, conflict detection |
|
||||
|
||||
## 4. Component Implementation Mapping
|
||||
|
||||
### 4.1 Primary Components
|
||||
|
||||
| Component | Responsibility | Location |
|
||||
|-----------|---------------|----------|
|
||||
| **Sensor Abstraction Layer** | Uniform sensor interface, state management | `drivers/sensor_abstraction/` |
|
||||
| **Hardware Interface Manager** | Interface abstraction, resource management | `drivers/hw_interface_mgr/` |
|
||||
| **GPIO Manager** | GPIO discipline, conflict detection | `drivers/gpio_manager/` |
|
||||
| **Sensor Drivers** | Hardware-specific sensor implementations | `drivers/sensors/` |
|
||||
|
||||
### 4.2 Supporting Components
|
||||
|
||||
| Component | Support Role | Interface |
|
||||
|-----------|-------------|-----------|
|
||||
| **ESP-IDF Wrappers** | Low-level hardware access | `ESP_IDF_FW_wrappers/` |
|
||||
| **Diagnostics** | Hardware fault reporting | `application_layer/diag_task/` |
|
||||
| **Machine Constant Manager** | Hardware configuration management | `application_layer/business_stack/machine_constant_manager/` |
|
||||
|
||||
### 4.3 Component Interaction Diagram
|
||||
|
||||
```mermaid
|
||||
graph TB
|
||||
subgraph "Hardware Abstraction Feature"
|
||||
SAL[Sensor Abstraction Layer]
|
||||
HW_MGR[Hardware Interface Manager]
|
||||
GPIO_MGR[GPIO Manager]
|
||||
SENSOR_DRV[Sensor Drivers]
|
||||
end
|
||||
|
||||
subgraph "Application Layer"
|
||||
SENSOR_MGR[Sensor Manager]
|
||||
PERSIST[Persistence]
|
||||
DIAG[Diagnostics]
|
||||
end
|
||||
|
||||
subgraph "ESP-IDF Wrappers"
|
||||
I2C_WRAP[I2C Wrapper]
|
||||
SPI_WRAP[SPI Wrapper]
|
||||
UART_WRAP[UART Wrapper]
|
||||
ADC_WRAP[ADC Wrapper]
|
||||
GPIO_WRAP[GPIO Wrapper]
|
||||
end
|
||||
|
||||
subgraph "Physical Hardware"
|
||||
SENSORS[Physical Sensors]
|
||||
SD_CARD[SD Card]
|
||||
OLED[OLED Display]
|
||||
BUTTONS[Buttons]
|
||||
end
|
||||
|
||||
SENSOR_MGR --> SAL
|
||||
SAL --> SENSOR_DRV
|
||||
SENSOR_DRV --> HW_MGR
|
||||
|
||||
HW_MGR --> I2C_WRAP
|
||||
HW_MGR --> SPI_WRAP
|
||||
HW_MGR --> UART_WRAP
|
||||
HW_MGR --> ADC_WRAP
|
||||
|
||||
GPIO_MGR --> GPIO_WRAP
|
||||
|
||||
I2C_WRAP --> SENSORS
|
||||
SPI_WRAP --> SD_CARD
|
||||
UART_WRAP --> SENSORS
|
||||
ADC_WRAP --> SENSORS
|
||||
GPIO_WRAP --> BUTTONS
|
||||
GPIO_WRAP --> OLED
|
||||
|
||||
SAL -.->|Hardware Events| DIAG
|
||||
HW_MGR -.->|Resource Conflicts| DIAG
|
||||
```
|
||||
|
||||
### 4.4 Sensor Abstraction Flow
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant APP as Application
|
||||
participant SAL as Sensor Abstraction Layer
|
||||
participant DRV as Sensor Driver
|
||||
participant HW as Hardware Interface
|
||||
participant SENSOR as Physical Sensor
|
||||
|
||||
Note over APP,SENSOR: Sensor Access Through Abstraction
|
||||
|
||||
APP->>SAL: sal_readSensor(sensor_id)
|
||||
SAL->>SAL: validateSensorState(sensor_id)
|
||||
|
||||
alt Sensor State Valid
|
||||
SAL->>DRV: driver_read_raw(sensor_id)
|
||||
DRV->>HW: hw_i2c_read(port, addr, data)
|
||||
HW->>SENSOR: I2C transaction
|
||||
SENSOR-->>HW: sensor_data
|
||||
HW-->>DRV: raw_value
|
||||
DRV->>DRV: convert_value(raw_value)
|
||||
DRV-->>SAL: converted_value
|
||||
SAL->>SAL: validateReading(converted_value)
|
||||
SAL-->>APP: sensor_reading
|
||||
else Sensor State Invalid
|
||||
SAL->>SAL: attemptSensorRecovery(sensor_id)
|
||||
SAL-->>APP: error_sensor_not_ready
|
||||
end
|
||||
```
|
||||
|
||||
## 5. Feature Behavior
|
||||
|
||||
### 5.1 Normal Operation Flow
|
||||
|
||||
1. **System Initialization:**
|
||||
- Initialize GPIO map and validate pin assignments
|
||||
- Detect hardware resource conflicts and report violations
|
||||
- Initialize hardware interface abstractions (I2C, SPI, UART, ADC)
|
||||
- Scan for connected sensors and initialize sensor drivers
|
||||
- Establish sensor abstraction layer and state management
|
||||
|
||||
2. **Sensor Management:**
|
||||
- Maintain sensor state machine for all detected sensors
|
||||
- Provide uniform access interface regardless of hardware interface
|
||||
- Handle sensor failures and recovery attempts
|
||||
- Monitor sensor health and performance metrics
|
||||
|
||||
3. **Hardware Interface Management:**
|
||||
- Enforce GPIO discipline and prevent strapping pin usage
|
||||
- Manage shared resources and prevent conflicts
|
||||
- Provide consistent interface abstraction across all hardware types
|
||||
- Monitor interface health and detect hardware failures
|
||||
|
||||
4. **Resource Conflict Prevention:**
|
||||
- Validate GPIO assignments during initialization
|
||||
- Detect and report hardware resource conflicts
|
||||
- Enforce ADC1/ADC2 separation when Wi-Fi is active
|
||||
- Maintain canonical GPIO map as single source of truth
|
||||
|
||||
### 5.2 Error Handling
|
||||
|
||||
| Error Condition | Detection Method | Response Action |
|
||||
|----------------|------------------|-----------------|
|
||||
| **GPIO Conflict** | Pin assignment validation | Report conflict, prevent initialization |
|
||||
| **Sensor Communication Failure** | Interface timeout/error | Mark sensor as faulty, attempt recovery |
|
||||
| **Hardware Interface Failure** | Transaction failure | Report hardware fault, disable interface |
|
||||
| **Strapping Pin Usage** | GPIO map validation | Prevent usage, report configuration error |
|
||||
| **ADC2/Wi-Fi Conflict** | Resource validation | Force ADC1 usage, report conflict |
|
||||
| **I2C Address Conflict** | Device scanning | Report conflict, disable conflicting devices |
|
||||
|
||||
### 5.3 State-Dependent Behavior
|
||||
|
||||
| System State | Feature Behavior |
|
||||
|-------------|------------------|
|
||||
| **INIT** | Initialize hardware abstractions, detect sensors |
|
||||
| **RUNNING** | Full hardware abstraction, continuous sensor monitoring |
|
||||
| **WARNING** | Enhanced hardware monitoring, sensor health checks |
|
||||
| **FAULT** | Critical hardware functions only, preserve sensor states |
|
||||
| **OTA_UPDATE** | Maintain hardware state, suspend sensor operations |
|
||||
| **TEARDOWN** | Graceful hardware shutdown, preserve configurations |
|
||||
| **SERVICE** | Limited hardware access for diagnostics |
|
||||
| **SD_DEGRADED** | Continue sensor operations, report storage degradation |
|
||||
|
||||
## 6. Feature Constraints
|
||||
|
||||
### 6.1 Timing Constraints
|
||||
|
||||
- **Sensor State Transitions:** Maximum 100ms for state changes
|
||||
- **Hardware Interface Operations:** Bounded timeouts for all transactions
|
||||
- **GPIO Conflict Detection:** Complete during system initialization
|
||||
- **Sensor Recovery Attempts:** Maximum 3 attempts with exponential backoff
|
||||
|
||||
### 6.2 Resource Constraints
|
||||
|
||||
- **GPIO Usage:** Enforce strapping pin restrictions and conflict prevention
|
||||
- **I2C Pull-ups:** Physical pull-ups required (2.2kΩ - 4.7kΩ for 3.3V)
|
||||
- **ADC Constraints:** ADC1 only when Wi-Fi active, ADC2 when Wi-Fi inactive
|
||||
- **Memory Usage:** Maximum 32KB for abstraction layer buffers and state
|
||||
|
||||
### 6.3 Hardware Constraints
|
||||
|
||||
- **ESP32-S3 Limitations:** Respect hardware capabilities and restrictions
|
||||
- **Interface Speeds:** I2C up to 400kHz, SPI up to 80MHz
|
||||
- **Voltage Levels:** 3.3V logic levels for all interfaces
|
||||
- **Current Limitations:** Respect GPIO current drive capabilities
|
||||
|
||||
## 7. Interface Specifications
|
||||
|
||||
### 7.1 Sensor Abstraction Layer API
|
||||
|
||||
```c
|
||||
// SAL initialization and management
|
||||
bool sal_initialize(void);
|
||||
bool sal_detectSensors(void);
|
||||
bool sal_getSensorCount(uint8_t* count);
|
||||
bool sal_getSensorList(uint8_t* sensor_ids, size_t* count);
|
||||
|
||||
// Sensor operations
|
||||
bool sal_readSensor(uint8_t sensor_id, float* value);
|
||||
bool sal_readMultipleSensors(uint8_t* sensor_ids, size_t count,
|
||||
sensor_reading_t* readings);
|
||||
bool sal_calibrateSensor(uint8_t sensor_id, const calibration_data_t* cal_data);
|
||||
bool sal_resetSensor(uint8_t sensor_id);
|
||||
|
||||
// Sensor state and health
|
||||
sensor_state_t sal_getSensorState(uint8_t sensor_id);
|
||||
bool sal_getSensorHealth(uint8_t sensor_id, sensor_health_t* health);
|
||||
bool sal_performSensorDiagnostics(uint8_t sensor_id, sensor_diagnostics_t* diag);
|
||||
```
|
||||
|
||||
### 7.2 Hardware Interface Manager API
|
||||
|
||||
```c
|
||||
// Interface initialization
|
||||
bool hwMgr_initialize(void);
|
||||
bool hwMgr_initializeI2C(uint8_t port, const i2c_config_t* config);
|
||||
bool hwMgr_initializeSPI(uint8_t host, const spi_config_t* config);
|
||||
bool hwMgr_initializeUART(uint8_t port, const uart_config_t* config);
|
||||
bool hwMgr_initializeADC(const adc_config_t* config);
|
||||
|
||||
// Resource management
|
||||
bool hwMgr_reserveResource(hw_resource_type_t type, uint8_t resource_id,
|
||||
const char* component_name);
|
||||
bool hwMgr_releaseResource(hw_resource_type_t type, uint8_t resource_id);
|
||||
bool hwMgr_validateResources(void);
|
||||
bool hwMgr_getResourceConflicts(hw_conflict_t* conflicts, size_t* count);
|
||||
```
|
||||
|
||||
### 7.3 GPIO Manager API
|
||||
|
||||
```c
|
||||
// GPIO management
|
||||
bool gpioMgr_initialize(void);
|
||||
bool gpioMgr_reservePin(uint8_t gpio_num, gpio_function_t function,
|
||||
const char* component_name);
|
||||
bool gpioMgr_releasePin(uint8_t gpio_num);
|
||||
bool gpioMgr_configurePin(uint8_t gpio_num, const gpio_config_t* config);
|
||||
|
||||
// GPIO validation and conflict detection
|
||||
bool gpioMgr_validateGPIOMap(void);
|
||||
bool gpioMgr_isStrappingPin(uint8_t gpio_num);
|
||||
bool gpioMgr_detectConflicts(gpio_conflict_t* conflicts, size_t* count);
|
||||
bool gpioMgr_getGPIOMap(gpio_map_t* map);
|
||||
```
|
||||
|
||||
## 8. Testing and Validation
|
||||
|
||||
### 8.1 Unit Testing
|
||||
|
||||
- **Sensor Abstraction:** All sensor types and state transitions
|
||||
- **Interface Abstraction:** I2C, SPI, UART, ADC operations
|
||||
- **GPIO Management:** Pin assignment and conflict detection
|
||||
- **Resource Management:** Resource allocation and validation
|
||||
|
||||
### 8.2 Integration Testing
|
||||
|
||||
- **Cross-Interface Testing:** Multiple interfaces operating simultaneously
|
||||
- **Sensor Integration:** All sensor types through abstraction layer
|
||||
- **Resource Conflict Testing:** Deliberate conflict scenarios
|
||||
- **State Coordination:** Hardware abstraction with system states
|
||||
|
||||
### 8.3 System Testing
|
||||
|
||||
- **Hardware Compatibility:** All supported sensor hardware configurations
|
||||
- **Performance Testing:** Interface throughput and timing constraints
|
||||
- **Fault Injection:** Hardware failure simulation and recovery
|
||||
- **Long-Duration Testing:** Extended operation with hardware monitoring
|
||||
|
||||
### 8.4 Acceptance Criteria
|
||||
|
||||
- All sensor types accessible through uniform SAL interface
|
||||
- Hardware interfaces properly abstracted from application layer
|
||||
- GPIO conflicts detected and prevented during initialization
|
||||
- No direct hardware access from application components
|
||||
- Sensor state management operates correctly under all conditions
|
||||
- Hardware resource conflicts properly detected and reported
|
||||
- Complete hardware abstraction maintains system performance
|
||||
|
||||
## 9. Dependencies
|
||||
|
||||
### 9.1 Internal Dependencies
|
||||
|
||||
- **Sensor Manager:** Primary consumer of sensor abstraction layer
|
||||
- **Diagnostics:** Hardware fault reporting and event logging
|
||||
- **Machine Constant Manager:** Hardware configuration management
|
||||
- **State Manager:** Hardware behavior coordination across system states
|
||||
|
||||
### 9.2 External Dependencies
|
||||
|
||||
- **ESP-IDF Framework:** Low-level hardware drivers and HAL
|
||||
- **Hardware Components:** Physical sensors, interfaces, and peripherals
|
||||
- **FreeRTOS:** Task coordination and resource management
|
||||
- **Hardware Design:** GPIO assignments and interface configurations
|
||||
|
||||
## 10. Future Enhancements
|
||||
|
||||
### 10.1 Planned Improvements
|
||||
|
||||
- **Dynamic Sensor Discovery:** Runtime sensor detection and configuration
|
||||
- **Advanced Sensor Fusion:** Multi-sensor data correlation and validation
|
||||
- **Hardware Health Monitoring:** Predictive hardware failure detection
|
||||
- **Plug-and-Play Support:** Hot-swappable sensor support
|
||||
|
||||
### 10.2 Scalability Considerations
|
||||
|
||||
- **Additional Sensor Types:** Framework supports easy sensor type extension
|
||||
- **Multiple Interface Support:** Support for additional hardware interfaces
|
||||
- **Advanced GPIO Management:** Dynamic GPIO allocation and optimization
|
||||
- **Hardware Virtualization:** Virtual hardware interfaces for testing
|
||||
|
||||
---
|
||||
|
||||
**Document Status:** Final for Implementation Phase
|
||||
**Component Dependencies:** Verified against architecture
|
||||
**Requirements Traceability:** Complete (SR-HW, SWR-HW)
|
||||
**Next Review:** After component implementation
|
||||
Reference in New Issue
Block a user