Skip to main content
This section covers the RADR firmware, including architecture, development setup, and how to modify or contribute to the codebase.

Firmware Overview

RADR runs on an ESP32-S3 microcontroller with custom firmware written in C++ using the Arduino framework and PlatformIO.
ComponentTechnology
MCUESP32-S3 with PSRAM
FrameworkArduino for ESP32
Build SystemPlatformIO
LanguageC++
Display LibraryTFT_eSPI
BLE StackNimBLE

Firmware Version

ComponentVersion
Major Version1
Minor Version0
Patch Version24
Full Version1.0.24
Check for firmware updates regularly to access new features and device support.

Source Code

The complete firmware source is available on GitHub:

RADR Firmware

Browse the source code and documentation.

Architecture Overview

Main Components

ComponentPurpose
State MachineManages screen states and navigation flow
Device ManagerHandles Bluetooth device discovery and connection
Display DriverRenders UI using TFT_eSPI with canvas buffering
Input HandlerProcesses encoder, button, and bumper inputs
Feedback SystemControls LEDs, buzzer, and vibration
Device RegistryMaps Bluetooth UUIDs to device types

Key Services

├── BluetoothService    # BLE scanning and connection
├── DisplayService      # Screen rendering
├── InputService        # Encoder and button handling
├── FeedbackService     # LED, buzzer, vibration
├── DeviceService       # Connected device control
├── WiFiService         # WiFi and OTA updates
└── StorageService      # LittleFS configuration

Development Environment

Prerequisites

Getting Started

1

Clone the repository

git clone https://github.com/researchanddesire/radr-wireless-remote.git
cd radr-wireless-remote/Software
2

Open in VS Code

Open the Software folder in VS Code. PlatformIO will automatically detect the project configuration.
3

Build the firmware

Click the PlatformIO Build button or run:
pio run
4

Flash to device

Connect RADR via USB-C and click Upload, or run:
pio run --target upload

Key Features

Canvas-Based Rendering

RADR uses double-buffered canvas rendering for smooth display updates:
  • Full-screen sprites prevent flickering
  • Partial updates for performance-critical areas
  • Consistent 60fps UI refresh rate

State Machine Architecture

The UI uses a hierarchical state machine:
  • Clear transitions between screens
  • Isolated state logic for each screen
  • Event-driven input handling

Device Registry

RADR supports multiple device types through a two-tier registry:
RegistryDescription
Built-inHardcoded R+D device support (OSSM)
DynamicJSON-based Buttplug.io device definitions
The dynamic registry (registry.json) can be updated via firmware updates to add new device support without code changes.

Configuration Files

FilePurpose
platformio.iniBuild configuration and dependencies
src/config.hHardware pin definitions and constants
data/registry.jsonButtplug.io device UUID mappings

Technical Reference

Contributing

We welcome contributions to the RADR firmware. Before contributing:
  1. Read the contribution guidelines
  2. Join the Kinky Makers Discord to discuss changes
  3. Submit pull requests against the main branch

Code Style

  • Follow existing code formatting
  • Use descriptive variable and function names
  • Document public functions and complex logic
  • Test changes on actual hardware before submitting

License

RADR firmware is released under the CERN Open Hardware Licence Version 2 - Strongly Reciprocal (CERN-OHL-S v2). See the licence documentation for details.