JSON-Based Configuration Manager Design¶
This document specifies the design for JSON-Schema-Driven Configuration System, covering architecture, data flow, schema design, and implementation approach.
Document Version: 2.0 Last Updated: 2025-11-12
Architecture Overview¶
Description: The configuration system uses a single JSON schema as source of truth with build-time code generation and runtime NVS storage. Architecture Layers: ┌──────────────────────────────────────────────┐
│ Application Layer │
│ (main.c, components) │
│ Uses: config_get_int32("led_count") │
├──────────────────────────────────────────────┤
│ Configuration API Layer (NVS wrapper) │
│ (config_manager.c, config_manager.h) │
│ Direct key-based access, no JSON parsing │
├──────────────────────────────────────────────┤
│ NVS Storage Layer │
│ Direct key→value mapping (no complexity) │
├──────────────────────────────────────────────┤
│ Metadata (Build-Time) │
│ config_schema.json (source of truth) │
└──────────────────────────────────────────────┘
Browser UI Layer (Separate): ┌──────────────────────────────────────────────┐
│ Browser Client (JavaScript) │
│ Fetches: /config_schema.json │
│ Generates: Form UI dynamically │
│ Validates: Client-side (min/max/pattern) │
└──────────────────────────────────────────────┘
Key Design Principle: C code does NOT parse JSON at runtime. JSON is embedded as static file for browser only. Layer Responsibilities:
|
Description: Configuration schema defined once in JSON, used for multiple purposes without duplication. Single Source of Truth Model: config_schema.json (ONLY definition)
│
├──→ C Code (config_factory_generated.c)
│ Generates: config_write_factory_defaults() function
│ Purpose: Initialize NVS with defaults at build-time
│ When: Build-time Python script (no runtime parsing)
│
├──→ Browser (fetched at runtime)
│ Fetches: GET /config_schema.json
│ Purpose: Generate form, validate inputs
│ When: User loads settings page
│
└──→ Documentation/Reference
Developers read schema to understand config fields
Benefits:
|
Data Structure Design¶
Description: JSON schema defines all configuration fields with metadata for type-safety and UI generation. Schema File Location: main/components/config_manager/config_schema.json Schema Structure: {
"schema_version": "1.0",
"config_namespace": "esp32_app",
"groups": [
{
"id": "wifi",
"label": "📶 WiFi Settings",
"description": "Network configuration",
"order": 1
}
],
"fields": [
{
"key": "wifi_ssid",
"type": "string",
"label": "WiFi SSID",
"default": "",
"required": true,
"maxLength": 32,
"pattern": "^[^\\x00]{1,32}$",
"group": "wifi",
"order": 1
}
]
}
Schema Elements:
Field Properties:
Type Mapping to C API: // Browser forms generated based on type
"string" → <input type="text">
"password" → <input type="password">
"integer" → <input type="number">
"boolean" → <input type="checkbox">
"hidden" → <input type="hidden">
// C code uses matching getters
"string" / "password" → config_get_string(key, buf, len)
"integer" → config_get_int32(key, &value) or config_get_int16(key, &value)
"boolean" → config_get_bool(key, &value)
"hidden" → config_get_string(key, buf, len) (internal config)
Design Rationale:
|
Description: Factory reset uses the bulk JSON configuration system for consistent data processing and validation. JSON-Based Factory Reset Architecture: config_schema.json
│
└──→ tools/generate_config_factory.py (Python 3)
│
└──→ config_factory_generated.c (auto-generated, compiled)
const char* config_factory_defaults_json =
"["
" {\"key\":\"wifi_ssid\",\"type\":\"string\",\"value\":\"\"},"
" {\"key\":\"wifi_pass\",\"type\":\"string\",\"value\":\"\"},"
" {\"key\":\"ap_ssid\",\"type\":\"string\",\"value\":\"ESP32-Setup\"},"
" {\"key\":\"led_count\",\"type\":\"integer\",\"value\":50}"
"]";
esp_err_t config_write_factory_defaults(void) {
return config_set_all_from_json(config_factory_defaults_json);
}
Generator Script (Simplified): #!/usr/bin/env python3
import json
import sys
def generate_factory_json(schema_file, output_file):
with open(schema_file) as f:
schema = json.load(f)
# Build factory defaults JSON array with {key, type, value} structure
defaults_array = []
for field in schema['fields']:
defaults_array.append({
'key': field['key'],
'type': field['type'],
'value': field['default']
})
factory_json = json.dumps(defaults_array, separators=(',', ':'))
with open(output_file, 'w') as f:
f.write('// Auto-generated - DO NOT EDIT\n')
f.write('#include "config_manager.h"\n\n')
f.write(f'const char* config_factory_defaults_json = "{factory_json}";\n\n')
f.write('esp_err_t config_write_factory_defaults(void) {\n')
f.write(' return config_set_all_from_json(config_factory_defaults_json);\n')
f.write('}\n')
if __name__ == '__main__':
generate_factory_json(sys.argv[1], sys.argv[2])
CMake Integration: (unchanged) # Generate factory defaults from schema
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/config_factory_generated.c
COMMAND python3 ${CMAKE_CURRENT_SOURCE_DIR}/tools/generate_config_factory.py
${CMAKE_CURRENT_SOURCE_DIR}/config_schema.json
${CMAKE_CURRENT_BINARY_DIR}/config_factory_generated.c
DEPENDS config_schema.json tools/generate_config_factory.py
COMMENT "Generating factory config defaults from schema"
)
idf_component_register(
SRCS "config_manager.c"
"${CMAKE_CURRENT_BINARY_DIR}/config_factory_generated.c"
INCLUDE_DIRS "include"
EMBED_FILES "config_schema.json"
)
Key Design Properties:
|
Description: Configuration parameters stored in NVS using schema keys directly. Storage Strategy: // NVS namespace: "config"
// NVS keys: schema "key" fields (≤15 chars required)
config_schema.json:
{
"key": "wifi_ssid",
"default": "ESP32-AP"
}
Stored in NVS as:
nvs_set_str(handle, "wifi_ssid", "ESP32-AP");
Retrieved with:
char ssid[33];
nvs_get_str(handle, "wifi_ssid", ssid, sizeof(ssid));
Key Properties:
Example NVS Content: Namespace: config
├─ "wifi_ssid" → "ESP32-AP" (string)
├─ "wifi_password" → "" (string)
├─ "led_count" → 60 (integer)
└─ "ap_channel" → 1 (integer)
Design Rationale:
|
NVS Access Layer (Config Manager)¶
Description: Thin NVS wrapper providing type-safe getters and setters for configuration values. Core API: // ====== Lifecycle ======
esp_err_t config_init(void);
esp_err_t config_factory_reset(void);
// ====== Type-Safe Getters (read from NVS) ======
esp_err_t config_get_string(const char* key, char* buf, size_t len);
esp_err_t config_get_int32(const char* key, int32_t* value);
esp_err_t config_get_int16(const char* key, int16_t* value);
esp_err_t config_get_bool(const char* key, bool* value);
// ====== Type-Safe Setters (write to NVS) ======
esp_err_t config_set_string(const char* key, const char* value);
esp_err_t config_set_int32(const char* key, int32_t value);
esp_err_t config_set_int16(const char* key, int16_t value);
esp_err_t config_set_bool(const char* key, bool value);
// ====== Generated Function ======
void config_write_factory_defaults(void); // Auto-generated from schema
Implementation Characteristics:
Typical Usage: // Read configuration
char ssid[33];
config_get_string("wifi_ssid", ssid, sizeof(ssid));
int32_t led_count;
config_get_int32("led_count", &led_count);
// Write configuration
config_set_string("wifi_ssid", "MyNetwork");
config_set_int32("led_count", 120);
Error Handling: int32_t value;
esp_err_t err = config_get_int32("led_count", &value);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Failed to read led_count: %s", esp_err_to_name(err));
value = 60; // Use default
}
Design Rationale:
|
Web Interface Design¶
Description: Browser fetches config_schema.json and generates settings form dynamically. Form Generation Flow: Browser loads /settings.html
│
└──→ JavaScript: fetch('/config_schema.json')
│
└──→ Parse schema, create groups
│
└──→ For each field:
├─ Create input element (type-specific)
├─ Apply validation attributes (min/max/pattern)
├─ Set label, description
└─ Add to corresponding group div
Browser-Side Validation: function generateFormFromSchema(schema) {
for (const group of schema.groups) {
const groupDiv = createGroupDiv(group);
for (const field of schema.fields) {
if (field.group === group.id) {
// Create input based on field type
const input = createInputElement(field);
// Apply validation attributes
if (field.type === 'integer') {
input.min = field.min;
input.max = field.max;
input.step = field.step || 1;
}
if (field.type === 'string' || field.type === 'password') {
input.minLength = field.minLength;
input.maxLength = field.maxLength;
input.pattern = field.pattern;
}
// Add to form
groupDiv.appendChild(createFormGroup(field, input));
}
}
document.getElementById('settings').appendChild(groupDiv);
}
}
Validation Rules:
Design Rationale:
|
Description: Configuration manager provides bulk JSON operations for efficient configuration management. These functions process all configuration fields in atomic operations. Design Principle: Bulk JSON API is the primary interface for multi-field configuration operations. Individual field access remains available for specific use cases. Function 1: Schema Access /**
* @brief Get embedded JSON schema for dynamic UI generation
* @param[out] schema_json Pointer to embedded schema string (no free() needed)
* @return ESP_OK on success, ESP_ERR_NOT_FOUND if schema not embedded
*/
esp_err_t config_get_schema_json(char **schema_json);
Function 2: Bulk Configuration Read /**
* @brief Read all configuration values as structured JSON array
* @param[out] config_json Allocated JSON string (caller must free())
* @return ESP_OK on success, ESP_ERR_NO_MEM on allocation failure
*/
esp_err_t config_get_all_as_json(char **config_json);
Implementation Strategy:
- Read JSON schema to enumerate all defined fields
- For each field, call appropriate Function 3: Bulk Configuration Write /**
* @brief Update configuration from structured JSON array
* @param[in] config_json JSON array with {key, type, value} objects
* @return ESP_OK on success, ESP_ERR_INVALID_ARG on validation failure
*/
esp_err_t config_set_all_from_json(const char *config_json);
Implementation Strategy:
- Parse input JSON array to extract {key, type, value} objects
- For each object, validate Error Handling:
- Unknown JSON Format Example: [
{
"key": "wifi_ssid",
"type": "string",
"value": "MyNetwork"
},
{
"key": "wifi_pass",
"type": "string",
"value": "password123"
},
{
"key": "ap_ssid",
"type": "string",
"value": "MyDevice-AP"
},
{
"key": "led_count",
"type": "integer",
"value": 50
},
{
"key": "led_bright",
"type": "integer",
"value": 128
},
{
"key": "device_name",
"type": "string",
"value": "MyDevice"
}
]
Design Properties: - No hardcoded fields in any client component - Schema-driven completeness (all fields included automatically) - Future-proof (new schema fields work without client changes) - Atomic updates (all changes committed together) - Type safety (schema validates types before NVS storage) Primary Use Cases:
- Web server HTTP endpoints: Use bulk APIs for GET/POST operations
- Factory reset: Load default values with |
Best Practices & Development Guide¶
Description: Simple process for adding new configuration fields to schema. Step-by-Step Guide: 1. Define in config_schema.json: {
"key": "my_setting",
"type": "integer",
"label": "My Custom Setting",
"description": "This is what my setting does",
"default": 100,
"min": 1,
"max": 1000,
"step": 10,
"group": "application",
"order": 1
}
2. Use in Application Code: #include "config_manager.h"
int32_t my_setting;
esp_err_t err = config_get_int32("my_setting", &my_setting);
if (err != ESP_OK) {
ESP_LOGW(TAG, "Failed to read my_setting: %s", esp_err_to_name(err));
my_setting = 100; // Fallback to default
}
// Use my_setting...
3. Web UI Auto-Updates:
Key Naming Rules:
|
Description: Achieving type safety through API design and optional validation rather than mandatory code generation. Type Safety Mechanisms:
// Compiler enforces types at call site
int32_t count;
config_get_int32("led_count", &count); // ✅ Correct: matches schema type
char* str;
config_get_int32("wifi_ssid", (int32_t*)str); // ❌ Logical error (caught by developer testing)
{"key": "led_count", "type": "integer"} → Use config_get_int32()
{"key": "wifi_ssid", "type": "string"} → Use config_get_string()
# Pre-build validation (not required)
python3 tools/validate_config_schema.py
# Finds type mismatches in code:
# ERROR: src/main.c:42 - config_get_int32("wifi_ssid"):
# schema says type="string", not integer
When Type Mismatches Happen:
For Templates, This is Acceptable:
When Additional Safety is Needed:
Design Philosophy:
|
Traceability¶
ID |
Title |
Status |
|---|---|---|
Certificate Handler |
implemented |
|
Config Manager |
implemented |
|
Display Logic |
implemented |
|
Distance Sensor |
implemented |
|
LED Controller |
implemented |
|
Network Tunnel |
implemented |
|
Startup Tests |
implemented |
|
Web Server |
implemented |
|
WiFi Manager |
implemented |
|
cert_handler_get_ca_cert |
implemented |
|
cert_handler_get_info |
implemented |
|
cert_handler_get_server_cert |
implemented |
|
cert_handler_get_server_key |
implemented |
|
cert_handler_init |
implemented |
|
config_commit |
implemented |
|
config_factory_reset |
implemented |
|
config_get_all_as_json |
implemented |
|
config_get_bool |
implemented |
|
config_get_int16 |
implemented |
|
config_get_int32 |
implemented |
|
config_get_schema_json |
implemented |
|
config_get_string |
implemented |
|
config_init |
implemented |
|
config_set_all_from_json |
implemented |
|
config_set_bool |
implemented |
|
config_set_bool_no_commit |
implemented |
|
config_set_int16 |
implemented |
|
config_set_int16_no_commit |
implemented |
|
config_set_int32 |
implemented |
|
config_set_string |
implemented |
|
config_set_string_no_commit |
implemented |
|
config_write_factory_defaults |
implemented |
|
display_logic_start |
implemented |
|
distance_sensor_get_latest |
implemented |
|
distance_sensor_get_queue_overflows |
implemented |
|
distance_sensor_has_new_measurement |
implemented |
|
distance_sensor_init |
implemented |
|
distance_sensor_is_running |
implemented |
|
distance_sensor_monitor |
implemented |
|
distance_sensor_start |
implemented |
|
distance_sensor_stop |
implemented |
|
led_clear_all |
implemented |
|
led_clear_pixel |
implemented |
|
led_color_brightness |
implemented |
|
led_color_rgb |
implemented |
|
led_controller_deinit |
implemented |
|
led_controller_init |
implemented |
|
led_get_all_colors |
implemented |
|
led_get_count |
implemented |
|
led_get_pixel |
implemented |
|
led_is_initialized |
implemented |
|
led_set_pixel |
implemented |
|
led_show |
implemented |
|
netif_uart_tunnel_deinit |
implemented |
|
netif_uart_tunnel_get_handle |
implemented |
|
netif_uart_tunnel_init |
implemented |
|
led_running_test_multiple_cycles |
implemented |
|
led_running_test_rainbow |
implemented |
|
led_running_test_single_cycle |
implemented |
|
web_server_get_port |
implemented |
|
web_server_init |
implemented |
|
web_server_is_running |
implemented |
|
web_server_start |
implemented |
|
static_file_handler |
implemented |
|
web_server_stop |
implemented |
|
wifi_manager_clear_credentials |
implemented |
|
wifi_manager_get_ip_address |
implemented |
|
wifi_manager_get_status |
implemented |
|
wifi_manager_init |
implemented |
|
wifi_manager_monitor |
implemented |
|
wifi_manager_set_credentials |
implemented |
|
wifi_manager_start |
implemented |
|
wifi_manager_stop |
implemented |
|
wifi_manager_switch_to_ap |
implemented |
|
distance_sensor_error_t |
implemented |
|
distance_measurement_t |
implemented |
|
distance_raw_measurement_t |
implemented |
|
led_color_t |
implemented |
|
netif_uart_tunnel_config_t |
implemented |
|
web_server_config_t |
implemented |
|
wifi_credentials_t |
implemented |
|
wifi_manager_mode_t |
implemented |
|
wifi_status_t |
implemented |
|
JSON Schema as Configuration Source of Truth |
implemented |
|
Web Interface Integration Support |
approved |
|
NVS Error Graceful Handling |
implemented |
|
Configuration Initialization on Boot |
implemented |
|
Simple Process to Add Configuration Fields |
implemented |
|
Type Safety via Optional Static Validation |
implemented |
|
Configuration Schema Versioning and Migration |
open |
|
Parameter Grouping for UI Organization |
implemented |
|
Parameter Type System |
implemented |
|
Build-Time Factory Defaults Generation |
implemented |
|
No Runtime JSON Parsing in C Code |
implemented |
|
Key-Based NVS Storage |
implemented |
|
Type-Safe Configuration API |
implemented |
|
Persistent Configuration Storage |
implemented |
|
Factory Reset Capability |
implemented |
|
Supporting Documentation Traceability |
implemented |
|
Supported Development Environments |
implemented |
|
Debugging Guide Content |
implemented |
|
Web Flasher Guide Content |
implemented |
|
Switching Dev Modes Guide Content |
implemented |
|
QEMU Emulator Guide Content |
implemented |
|
Known Limitations Documentation |
implemented |
|
Hardware Specifications Content |
implemented |
|
Overview Index Content |
implemented |
|
Quick Start Content |
implemented |
|
README Content Scope |
implemented |
|
Hardware Platform |
approved |
|
Configuration Integration |
approved |
|
Core Visualization Concept |
approved |
|
Below Minimum Distance Warning |
approved |
|
Out of Range Display |
approved |
|
WS2812 LED Strip Support |
approved |
|
Individual Pixel Control |
approved |
|
Configurable LED Count |
approved |
|
Accurate Color Display |
approved |
|
LED State Read API |
approved |
|
QEMU UART Network Bridge |
approved |
|
Packet Encapsulation |
approved |
|
Host-Side Bridge Script |
approved |
|
DHCP Client Support |
approved |
|
Conditional Compilation |
approved |
|
Emulation Setup Documentation |
approved |
|
Tunnel Throughput |
approved |
|
Packet Loss Handling |
approved |
|
Component Initialization |
approved |
|
Timing and Performance |
approved |
|
Accuracy and Calibration |
approved |
|
Timeout Error Handling |
approved |
|
Range Validation |
approved |
|
Queue Overflow Management |
approved |
|
Trigger Pulse Generation |
approved |
|
Real-Time Timestamp Capture |
approved |
|
Measurement Processing |
approved |
|
Blocking API Access |
approved |
|
Task Lifecycle Management |
approved |
|
Health Monitoring |
approved |
|
Real-Time ISR Constraints |
approved |
|
Memory Resource Limits |
approved |
|
LED Controller Initialization |
approved |
|
Visual Boot Sequence |
approved |
|
Timing Performance |
approved |
|
Garage Parking Assistance System |
approved |
|
Component-based Architecture |
approved |
|
Non-volatile Configuration Storage |
approved |
|
ESP32 Hardware Platform |
approved |
|
WiFi Connectivity |
approved |
|
Memory Management |
approved |
|
Error Handling and Recovery |
approved |
|
HTTPS Support |
open |
|
Emulator Support |
approved |
|
Emulator Network Connectivity |
approved |
|
System Time and NTP Support |
open |
|
Web-based Configuration |
approved |
|
Real-time Status Display |
approved |
|
Configuration Interface |
approved |
|
WiFi Setup Interface |
approved |
|
Web Interface Navigation |
approved |
|
HTTP Server Concurrency |
approved |
|
Configuration REST API |
approved |
|
LED State API Endpoint |
approved |
|
Web UI Responsiveness |
approved |
|
Mobile-First Design |
approved |
|
Schema-Driven Configuration Form |
approved |
|
ESP-IDF CMake Integration |
approved |
|
Certificate Handler Component Design |
draft |
|
GitHub Codespaces Integration |
approved |
|
Component Communication Pattern |
approved |
|
Configuration Manager Component Design |
approved |
|
Configuration Data Flow |
approved |
|
Error Recovery and Reset Strategy |
approved |
|
Flash Memory Configuration |
approved |
|
HTTP Server Architecture Details |
approved |
|
ESP32 Distance Sensor Layered Architecture |
approved |
|
Logging and Diagnostics Strategy |
approved |
|
Memory Management Strategy |
approved |
|
Network Tunnel Component Design |
approved |
|
System Performance Requirements |
approved |
|
QEMU Hardware Abstraction |
approved |
|
QEMU Component Selection |
approved |
|
FreeRTOS Task Organization |
approved |
|
Web Server Component Design |
approved |
|
WiFi Manager Design Details |
approved |
|
Type-Safe Configuration API |
approved |
|
JSON Schema-Driven Architecture |
draft |
|
Bulk JSON Configuration API |
approved |
|
Factory Reset via Bulk JSON Update |
approved |
|
Adding New Configuration Fields |
approved |
|
Configuration Schema Structure |
approved |
|
JSON Schema as Single Source of Truth |
approved |
|
NVS Storage Format |
approved |
|
Type Safety Without Code Generation |
approved |
|
JSON Schema for UI Generation |
approved |
|
Configuration Webpage Architecture |
implemented |
|
Device Reset Countdown Interface |
implemented |
|
Error Handling and User Feedback |
implemented |
|
Configuration Data Flow |
implemented |
|
Dynamic Form Generation from Schema |
implemented |
|
Complete Page Initialization Flow |
implemented |
|
JSON Array to Form Field Mapping |
implemented |
|
UI State Management |
implemented |
|
Supported Development Environments — Options |
implemented |
|
Supported Development Environments — Setup Steps |
implemented |
|
Debugging Guide — Debugging Features |
implemented |
|
Debugging Guide — Quick Start in QEMU |
implemented |
|
Web Flasher Guide — Overview and Browser Requirements |
implemented |
|
Web Flasher Guide — Flash Procedure |
implemented |
|
Dev Modes Guide — What Changes Between Modes |
implemented |
|
Dev Modes Guide — How to Switch |
implemented |
|
QEMU Guide — Starting QEMU |
implemented |
|
QEMU Guide — Stopping QEMU |
implemented |
|
QEMU Guide — Accessing the Web Interface |
implemented |
|
Known Limitations File Structure and Process |
implemented |
|
Hardware Components Listing |
implemented |
|
Hardware Pin Assignment Table |
implemented |
|
Overview Index — Navigation Section |
implemented |
|
Overview Index — Project Description |
implemented |
|
Overview Index — Audience Section |
implemented |
|
Quick Start — Hardware Path |
implemented |
|
Quick Start — QEMU Path |
implemented |
|
README Introduction and Project Link |
implemented |
|
README Metadata Section |
implemented |
|
Distance-to-Visual Mapping Algorithm |
approved |
|
Embedded Arithmetic Architecture |
approved |
|
Public Display API |
approved |
|
Task-Based Architecture |
approved |
|
Configuration Integration |
approved |
|
WS2812 Hardware Integration |
approved |
|
Pixel-Level Control API |
approved |
|
Batch Operations API |
approved |
|
LED State Read API |
approved |
|
RMT Peripheral Hardware Abstraction |
approved |
|
RAM Buffer Architecture |
approved |
|
Color Representation and Conversion |
approved |
|
Error Handling and Validation |
approved |
|
Dynamic Memory Management |
approved |
|
LED Controller Simulator |
approved |
|
WS2812 Timing Specification |
approved |
|
UART Tunnel Component Architecture |
implemented |
|
Host-Side Serial-TUN Bridge Script |
implemented |
|
Conditional Compilation — QEMU-Only Build Guard |
implemented |
|
IP Configuration and DHCP Client Integration |
implemented |
|
Emulation Setup Documentation |
implemented |
|
Performance Characteristics and Known Limitations |
implemented |
|
UART Wire Protocol — Length-Prefix Framing |
implemented |
|
Distance Calculation Algorithm |
approved |
|
EMA Smoothing Filter Design |
approved |
|
Public API Design |
approved |
|
Dual-Queue Real-Time Architecture |
approved |
|
GPIO Interface Design |
approved |
|
Error Handling Design |
approved |
|
Interrupt Service Routine Design |
approved |
|
Distance Sensor Simulator Design |
approved |
|
Sensor Task Design |
approved |
|
LED Controller Dependency Design |
approved |
|
Sequential LED Pattern Algorithm |
approved |
|
Startup Integration and Cleanup |
approved |
|
Component Architecture |
approved |
|
Web Server Architecture |
approved |
|
Captive Portal Design |
approved |
|
HTTP Server Configuration |
approved |
|
Extension Guide for Web Pages |
approved |
|
Config Manager Integration Pattern |
approved |
|
WiFi Manager Integration Pattern |
approved |
|
Mobile-First Responsive Design |
approved |
|
Configuration API Endpoints |
approved |
|
System Health API Endpoint |
approved |
|
LED State API Endpoint |
approved |
|
WiFi Management REST API Endpoints |
approved |
|
URI Routing Table |
approved |
|
CORS Configuration |
approved |
|
Static File Embedding Strategy |
approved |
|
Web Server Testing Strategy |
approved |
|
Modular Firmware Extensibility |
implemented |
|
Traceable Supporting Documentation |
implemented |
|
Visual Distance Feedback for Parking |
approved |
|
Appliance Reliability - Just Works on Power |
approved |
|
Device Setup via Web Interface |
approved |

SPEC_CFG_JSON_SOURCE_1¶