Native C++
Write firmware-level logic in the language you already know. No proprietary scripting layer, no lock-in.
Developer
A native C++ SDK gives you direct control of recording, triggers, storage, and on-device processing — across the QL and Bar Series.
Write firmware-level logic in the language you already know. No proprietary scripting layer, no lock-in.
Attach callbacks to triggers, the side switch, schedules, and storage events. The card reacts the moment things happen.
Compile, connect over USB Type-C, and flash. Charging and programming share the one reversible port.
Quick start
Pull the OX toolchain and headers, then add them to your build.
Describe how the card should record — modes, triggers, and storage — in C++.
Connect the card and push your build. It runs the moment it boots.
// OX Recorder — stream the mic to an SD file
#include <Arduino.h>
#include "OXAudioManager.h"
#include "OXFileManager.h"
#include "OXLog.h"
using namespace OXRecorder;
OXAudioManager audio;
OXFileManager fm;
OXFileStream recFile;
// Called by poll() with each chunk of captured PCM.
void onAudio(const int16_t *pcm, size_t n, void *ctx) {
if (recFile.isOpen())
recFile.write(reinterpret_cast<const uint8_t *>(pcm), n * sizeof(int16_t));
}
void setup() {
OXLog::begin(115200);
fm.beginExternal(); // mount SD card
fm.mkdir(Storage::External, "/rec");
recFile = fm.openWrite(Storage::External, "/rec/take01.pcm");
audio.onAudio(onAudio);
if (!audio.begin()) // default pins/format
OXLog::error("mic start failed");
}
void loop() {
audio.poll(); // pump capture -> onAudio()
}
Illustrative API. Full headers ship with the SDK.
API reference
Nine focused C++ managers in the OXRecorder namespace cover the whole device — audio capture, storage, security, status, input, config, wireless transport, and the networking API. Each has a full reference and a “how it works” deep-dive.
INMP441 microphone capture — start, stop, and pause recording, and receive continuous 16-bit PCM via callback or read().
Unified read/write access to internal flash (LittleFS, quota-bounded) and the external SD card (SdFat/exFAT), with streaming writes.
Instance-based AES-256-CBC encrypt/decrypt for strings and binary data, with a per-instance key and IV for local vs. server use.
WS2812 status LED — a distinct color and animation per application state (pairing, Wi-Fi, recording, faults).
GPIO switch monitoring — debounced on/off state and configurable long-press detection with per-pin callbacks.
Central config store plus the hardware reset feature — a long press on GPIO10 triggers a reset callback.
The transport layer — the Wi-Fi and Bluetooth (NimBLE) chips, their connection state, raw data exchange, and per-radio byte statistics, behind injectable transports.
The protocol layer on top of OXWirelessManager — inbound REST routing and Bluetooth command dispatch, plus an outbound REST client with chunked streaming uploads.
Centralized, level-based logging — wraps the serial transport so all firmware output flows through one extensible API.
Hardware
An ESP32-C3 drives an INMP441 mic (I2S), a microSD card (SPI), a WS2812 status LED, and a reset button — powered by a 3.7 V LiPo through a TP4056. Each peripheral maps to the manager that owns it.
| Peripheral | Interface · ESP32-C3 pins | Managed by |
|---|---|---|
| INMP441 mic | I2S · GPIO1 / GPIO2 / GPIO21 |
OXAudioManager |
| microSD card | SPI · GPIO0 / GPIO4 / GPIO5 / GPIO6 |
OXFileManager |
| WS2812 LED | GPIO8 (via 330 Ω) |
OXLEDManager |
| Reset button | GPIO10 → GND (hold 5 s) |
OXConfigManager |
Signal pins are firmware defaults and can be overridden in each manager's begin(). Power: Battery → TP4056 (5 V) → ESP32-C3; microSD and WS2812 on 5 V, the INMP441 on the ESP32's 3V3 output.
The same C++ codebase runs on the thin OX QL card and the elongated OX Bar. Build once, deploy to whichever form factor fits your install.
Request the toolchain, headers, and developer documentation for your team.