omi-firmware-patterns
SKILL.md
Omi Firmware Patterns Skill
This skill provides guidance for working with Omi firmware, including BLE services, audio codecs, and device communication.
When to Use
Use this skill when:
- Working on firmware code in
omi/oromiGlass/ - Implementing BLE services
- Working with audio codecs (Opus, PCM, Mu-law)
- Debugging device communication issues
Key Patterns
BLE Services
Audio Streaming Service
UUID: 19B10000-E8F2-537E-4F6C-D104768A1214
Characteristics:
- Audio Data:
19B10001-E8F2-537E-4F6C-D104768A1214 - Codec Type:
19B10002-E8F2-537E-4F6C-D104768A1214
Standard Services
- Battery Service:
0x180F(standard) - Device Information Service:
0x180A(standard)
Audio Packet Format
Header (3 bytes):
- Bytes 0-1: Packet number (little-endian, 0-65535)
- Byte 2: Index (position within packet)
Payload:
- 160 audio samples per packet
- Format depends on codec type
Fragmentation: If packet exceeds BLE MTU - 3 bytes, split across multiple notifications
Codec Types
0: PCM 16-bit, 16 kHz, mono1: PCM 16-bit, 8 kHz, mono10: Mu-law, 16 kHz, 8-bit mono11: Mu-law, 8 kHz, 8-bit mono20: Opus, 16 kHz, 16-bit mono (default since v1.0.3)
Zephyr RTOS (Omi Device)
BLE Service Definition
BT_GATT_SERVICE_DEFINE(audio_svc,
BT_GATT_PRIMARY_SERVICE(BT_UUID_AUDIO_SERVICE),
BT_GATT_CHARACTERISTIC(BT_UUID_AUDIO_DATA,
BT_GATT_CHRC_READ | BT_GATT_CHRC_NOTIFY,
BT_GATT_PERM_READ,
read_audio_data, NULL, NULL),
);
Audio Packet Sending
void send_audio_packet(audio_packet_t *packet) {
uint8_t buffer[3 + sizeof(packet->audio_data)];
// Header
buffer[0] = packet->packet_number & 0xFF;
buffer[1] = (packet->packet_number >> 8) & 0xFF;
buffer[2] = packet->index;
// Audio data
memcpy(&buffer[3], packet->audio_data, sizeof(packet->audio_data));
// Send via BLE notification
bt_gatt_notify(conn, &audio_char, buffer, sizeof(buffer));
}
ESP32-S3 (Omi Glass)
Arduino Framework
BLEService *pService = pServer->createService(SERVICE_UUID);
BLECharacteristic *pChar = pService->createCharacteristic(
AUDIO_DATA_UUID,
BLECharacteristic::PROPERTY_READ | BLECharacteristic::PROPERTY_NOTIFY
);
Common Tasks
Adding a New BLE Characteristic
- Define UUID
- Add to service definition
- Implement read/write/notify callbacks
- Handle data format correctly
Implementing Audio Codec
- Initialize codec encoder
- Encode audio samples
- Format as packet with header
- Send via BLE notification
Debugging BLE Issues
- Check service/characteristic UUIDs
- Verify packet format (header + payload)
- Check MTU size and fragmentation
- Verify codec type negotiation
Related Documentation
The docs/ folder is the single source of truth for all user-facing documentation, deployed at docs.omi.me.
- BLE Protocol:
docs/doc/developer/Protocol.mdx- View online - Firmware Compilation:
docs/doc/developer/firmware/Compile_firmware.mdx- View online - Hardware Docs:
docs/doc/hardware/- View online - Firmware Architecture:
.cursor/rules/firmware-architecture.mdc
Related Cursor Resources
Rules
.cursor/rules/firmware-architecture.mdc- Firmware system architecture.cursor/rules/firmware-ble-service.mdc- BLE service implementation.cursor/rules/firmware-audio-codecs.mdc- Audio codec implementation.cursor/rules/flutter-ble-protocol.mdc- Flutter BLE integration
Subagents
.cursor/agents/firmware-engineer/- Uses this skill for firmware development.cursor/agents/flutter-developer/- Uses this skill for BLE integration
Commands
/flutter-setup- Uses this skill for firmware setup
Weekly Installs
11
Repository
basedhardware/omiGitHub Stars
7.8K
First Seen
Jan 29, 2026
Security Audits
Installed on
opencode11
claude-code11
cursor11
mcpjam10
openhands10
zencoder10