5
Architecture Layers
30 FPS
Render Rate
4 MB
Full Runtime
~18 ms
Frame Budget
// Why It Exists

Modular by Contract, Not by Convention

Most embedded firmware grows into a monolith. Peripheral access is scattered, boot order is tribal knowledge, and swapping one driver breaks three others.

o-OS enforces a single Hardware Abstraction Layer that every module must cross. Ownership tokens prevent conflicts at compile time. The EventBus wires modules together without coupling them. The result is firmware you can read, test, and extend without fear.

  • One HAL contract — swap any peripheral without touching application logic
  • Static EventBus with ownership tokens: no heap allocation at runtime
  • Arduino-first workflow — flash and iterate with the tools you already know
APP LAYER User Applications Custom apps · 12 AppRegistry slots · SD scan MODULE 4 o-Device Display · Audio · Radio · Storage ST7789 · ES8311 WiFi · BLE · LoRa ownership token enforced MODULE 3 o-Sense IMU · GPS · Sensor HAL BMI270 IMU GPS · Expansion MODULE 2 o-Control Input · Navigation · AppRegistry TCA8418 Kbd 12 app slots MODULE 1 · KERNEL o-Core Kernel · EventBus · Tick · Boot EventBus · 8 subs ~18 ms tick HAL CONTRACT HARDWARE ESP32-S3 · ST7789 · TCA8418 · BMI270 · ES8311
// Four Modules

One Contract, Four Responsibilities

o-Core

The kernel layer: system tick (~18 ms), static EventBus (8 subscribers/type), ownership token allocation, and the boot sequence that brings every other module to life.

o-Control

Input and navigation: TCA8418 keyboard dispatch, application routing, and AppRegistry management — 12 fixed slots plus dynamic SD scan.

o-Sense

Sensor integration: BMI270 IMU driver, GPS and expansion-bus peripherals — all accessed through the uniform HAL sensor contract.

o-Device

Device drivers: ST7789 display at 30 FPS (240×135), ES8311 audio over I2S, WiFi/BLE/LoRa radio, and microSD — all ownership-token-gated.

How o-OS Works

  1. Flash

    Flash the TEST partition to your Cardputer ADV via Arduino IDE. The launcher boots immediately — no manual configuration required.

  2. Boot

    o-Core initialises the HAL contract, allocates ownership tokens to all modules, and brings up the EventBus before any user code runs.

  3. Navigate

    o-Control reads TCA8418 keyboard input and routes each event to the focused application via the AppRegistry — no polling, no blocking.

  4. Connect

    o-Sense and o-Device negotiate peripheral ownership tokens. Display, IMU, radio, and audio modules come online in a deterministic, conflict-free sequence.

  5. Build

    Add a new app to an AppRegistry slot, deploy to the ota_0 partition, and swap without reflashing the TEST launcher — iteration stays fast.

// Under the Hood

Six Engines. One Architecture.

EventBus

Static publish-subscribe bus — 8 subscribers per type, zero heap allocation at runtime. Modules communicate by contract, never by direct reference.

HAL Ownership Tokens

Exclusive peripheral ownership enforced at compile time. No runtime races, no double-init bugs — the build fails before the firmware ships.

ScreenConsole UI

240×135 ST7789 canvas with layered drawing primitives and 30 FPS refresh. A deterministic ~18 ms frame budget keeps every update smooth.

Radio-First Navigation

WiFi, BLE, and expansion-bus radio managed through a unified device interface. Switching connectivity mode is a single ownership-token swap.

Persistent Boot

Dual-partition scheme: TEST launcher and ota_0 user app. Deploy a new build and swap partitions without reflashing the launcher — iteration cost stays near zero.

Single Board Profile

One boardProfile.h configures all pin mappings, peripherals, and capabilities for the Cardputer ADV. Change the target board by changing one file.

// Technical Specification

What Is Inside

Hardware Target
DeviceM5Stack Cardputer ADV
SoCESP32-S3
DisplayST7789, 240×135 px
KeyboardTCA8418
IMUBMI270
Storage4 MB internal flash + microSD (SPI)
AudioES8311 / I2S
RadioWiFi + BLE on-chip; LoRa/NRF/GPS via expansion
Runtime
LanguageC++ (Arduino framework)
PartitionsTEST (launcher) + ota_0 (user app)
Frame rate30 FPS (~18 ms/frame)
EventBus8 subscribers/type (static)
AppRegistry12 fixed slots + SD scan
Build toolVS Code + Arduino IDE
// Where We Are

Roadmap

  1. v1.0

    Foundation Release

    Core kernel, EventBus (8 subs/type), HAL ownership tokens, ScreenConsole (30 FPS), AppRegistry (12 slots), and dual-partition boot.

  2. v1.01

    Sensor & Audio

    BMI270 IMU integration, ES8311 audio output pipeline, GPS and expansion-bus interface for o-Sense.

  3. v1.1+ 📋

    OTA & Power

    OTA update flow, power management API, and a community module registry for sharing AppRegistry apps.

Build on o-OS

Build on o-OS

Fork the repo, flash your Cardputer ADV, and start building layered embedded applications today.