Arquitectura de hardware, APIs de firmware, pipeline CAN, bridges nativos y despliegue OTA
El hardware W4RP sigue una arquitectura modular y apilable. El sistema separa computación (PCB Core) de capacidad (PCB Expansión), permitiendo a fabricantes crear dispositivos especializados reutilizando el mismo stack de comunicación.
Un Módulo Edge es un "sándwich" de dos PCBs. El PCB Core contiene el microcontrolador, transceptor CAN y regulador. El PCB Expansión define la capacidad del módulo.
Los Módulos Core coordinan configuraciones multi-Edge. Tienen controladores TWAI duales: uno para el bus CAN del vehículo, otro para una red privada de Edges. Sin slot de expansión—solo orquestación.
An Edge Module is a "sandwich" of two PCBs connected via header pins. The Core PCB provides computing power, CAN interface, and BLE connectivity. The Expansion PCB defines the module's physical capabilities.
En modo Standalone, un Edge se conecta directamente al bus CAN del vehículo y comunica con el teléfono via BLE.
En modo Esclavo, un Módulo Core lee el CAN del vehículo y transmite a múltiples Edges en red privada.
| Expansion Type | Function | Typical Use |
|---|---|---|
| Relay | High-current ON/OFF | Lights, pumps, solenoids |
| MOSFET | PWM switching | Fans, LEDs, servos |
| Sensor | Analog/Digital input | Temperature, pressure, O2 |
| PWM Bank | Multi-channel output | RGB strips, motors |
W4RPBLE es una librería Arduino/ESP-IDF que abstrae CAN, BLE y el Motor de Reglas en una API simple. Maneja restricciones de tiempo, gestión de buffers y matching O(1) de señales.
#include <W4RPBLE.h>
W4RPBLE w4rp;
void setup() {
w4rp.setBleName("Module Name");
w4rp.setModuleHardware("Module HW ID");
w4rp.setModuleFirmware("Module FW Version");
w4rp.setPins(21, 20, 8); // RX, TX, LED
w4rp.begin();
[ Capability Registration ]
w4rp.registerCapability("capability_name", [](const ParamMap ¶ms) {
[ Capability logic ]
});
}
void loop() {
w4rp.loop();
}| Method | Description | Required |
|---|---|---|
| setBleName(name) | Advertised BLE name | Yes |
| setModuleHardware(hw) | Hardware identifier | Yes |
| setModuleFirmware(ver) | Firmware version | Yes |
| setModuleSerial(sn) | Unique serial number | Yes |
| setPins(rx, tx, led) | GPIO configuration | Yes |
| begin() | Initialize all systems | Yes |
Las tramas CAN crudas no tienen significado sin contexto. El pipeline DBC las transforma en señales semánticas como Engine_RPM y Vehicle_Speed que los usuarios pueden entender y usar en automatización.
| AI Provider | Use Case |
|---|---|
| GROQ | Fast signal interpretation |
| OpenAI | Complex flow generation |
| Anthropic | Nuanced descriptions |
| Default provider | |
| Custom | BYOK in Settings |
JavaScript es single-threaded con pausas de garbage collection—inadecuado para streams BLE en tiempo real. El Bridge Nativo descarga operaciones críticas a Swift (iOS) y Kotlin (Android).
CoreBluetooth via W4RPBLEManager.swift
BluetoothGatt via W4RPBLEManager.kt
Web Bluetooth API
| Command | Description |
|---|---|
| GET:PROFILE | Request module info (name, serial, firmware) |
| SET:RULES:RAM:<json> | Load rules to volatile memory |
| SET:RULES:NVS:<crc>:<json> | Persist rules to flash with CRC |
| DEBUG:START | Begin streaming raw signals |
| DEBUG:STOP | Stop signal streaming |
| OTA:BEGIN:<size>:<crc> | Initiate firmware update |
| OTA:DATA:<chunk> | Send 512-byte chunk |
| OTA:END | Complete update, reboot |
La capa de software provee la interfaz de usuario y backend cloud. Los usuarios construyen flujos de automatización visualmente, y la app los serializa a rulesets JSON que el firmware entiende.
| Layer | Technology |
|---|---|
| UI Framework | React Native (Expo), Next.js |
| Language | TypeScript (strict mode) |
| State | Zustand (global), TanStack Query (async) |
| Flow Editor | @xyflow/react |
| Backend | Supabase (Postgres, Auth, Edge Functions) |
| Payments | Stripe, MercadoPago |
{
"nodes": [
{ "id": "n1", "type": "condition", "signal": "engine_rpm", "op": ">", "value": 4000 },
{ "id": "n2", "type": "action", "capability": "exhaust_flap", "params": { "amount": 100 } }
],
"flows": [
{ "id": "f1", "from": "n1", "to": "n2", "debounce": 500 }
],
"meta": { "name": "Sport Mode", "persist": true }
}W4RP implementa un sistema de propiedad de módulos que previene acceso no autorizado mientras permite compartir controlado entre usuarios.
| State | Description |
|---|---|
| free | Unclaimed. First user to connect can claim. |
| owned_by_me | I am the primary owner. Full control. |
| shared_access | I have shared access from another user. |
| locked | Owned by someone else. Cannot interact. |
| Action | Owner | Shared |
|---|---|---|
| Read module info | ✓ | ✓ |
| Send commands | ✓ | ✓ |
| Update rules | ✓ | ✓ |
| Flash firmware | ✓ | ✗ |
| Factory reset | ✓ | ✗ |
| Generate share codes | ✓ | ✗ |
BLE transfiere a ~4KB/s. Un firmware de 1.5MB toma 6+ minutos. Nuestro sistema OTA usa actualizaciones delta (Janpatch) para reducir esto a segundos.
| Partition | Address | Size | Purpose |
|---|---|---|---|
| nvs | 0x9000 | 16KB | Rules storage |
| otadata | 0xd000 | 8KB | Boot flags |
| app0 | 0x10000 | 1MB | Slot A (active) |
| app1 | 0x110000 | 1MB | Slot B (update) |
Self-hosted firmware file + Self-hosted update platform
Self-hosted firmware file + W4RP Platform
W4RP hosted firmware file + W4RP Platform