Build-system, config, usb, and CI wiring on top of upstream's
v0.6.0-hotfix tree. Build will still fail until Phase C+D land bt.h
accessors that oled.cpp references; that's expected mid-rebase.
CMakeLists.txt: add src/oled.cpp + src/slots.cpp to add_executable,
link hardware_spi, restore OUTPUT_NAME ds5-bridge-oled.
src/config.h: append the 4 OLED Edition Config_body fields
(current_slot + auto_haptics_enable/gain/lowpass). Preserves
upstream's field order for the first 8 fields.
src/config.cpp:
- speaker_volume validity default -100 dB → 0 dB (footgun fix)
- 4 new validity guards for the appended fields with sensible
defaults (Fallback / 100 % / 160 Hz / slot 0)
- config_default() impl (was declared in upstream's config.h since
v0.5.4 but never defined; the OLED Edition's "Reset to defaults"
Settings item calls it)
src/usb.cpp: drop the UAC1 SET_CUR Volume → flash-config sync that
let PipeWire/Pulse silently override the user's saved Spk Vol on
every device reconnect. Borrowed from loteran/DS5Dongle commit
03fa1e4.
src/usb_descriptors.cpp: restore iSerialNumber = STRID_SERIAL.
Upstream's commit e79c762 zeroed it to work around SpecialK (#32),
but that broke Windows device identity (#100) — users lost
per-device volume / app preferences when moving USB ports. The
OLED Edition prioritizes Windows device-identity stability for
the broader user base over SpecialK compat for a narrower one.
.github/workflows/{build,release}.yml: artifact filenames use
ds5-bridge-oled.uf2 (and -debug / -picow variants) per the
OUTPUT_NAME rebrand.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
110 lines
4.4 KiB
C++
110 lines
4.4 KiB
C++
// 5x7 ASCII font, ASCII 0x20-0x7E. 5 column bytes per glyph, LSB = top row.
|
|
// Source: public-domain font from the Adafruit / SSD1306 ecosystem.
|
|
#ifndef DS5_BRIDGE_OLED_FONT_H
|
|
#define DS5_BRIDGE_OLED_FONT_H
|
|
|
|
#include <cstdint>
|
|
|
|
static constexpr int kFontW = 5;
|
|
static constexpr int kFontH = 7;
|
|
|
|
static const uint8_t kFont5x7[95][5] = {
|
|
{0x00, 0x00, 0x00, 0x00, 0x00}, // ' '
|
|
{0x00, 0x00, 0x5F, 0x00, 0x00}, // '!'
|
|
{0x00, 0x03, 0x00, 0x03, 0x00}, // '"'
|
|
{0x14, 0x3E, 0x14, 0x3E, 0x14}, // '#'
|
|
{0x24, 0x2A, 0x7F, 0x2A, 0x12}, // '$'
|
|
{0x43, 0x33, 0x08, 0x66, 0x61}, // '%'
|
|
{0x36, 0x49, 0x55, 0x22, 0x50}, // '&'
|
|
{0x00, 0x05, 0x03, 0x00, 0x00}, // '''
|
|
{0x00, 0x1C, 0x22, 0x41, 0x00}, // '('
|
|
{0x00, 0x41, 0x22, 0x1C, 0x00}, // ')'
|
|
{0x14, 0x08, 0x3E, 0x08, 0x14}, // '*'
|
|
{0x08, 0x08, 0x3E, 0x08, 0x08}, // '+'
|
|
{0x00, 0x50, 0x30, 0x00, 0x00}, // ','
|
|
{0x08, 0x08, 0x08, 0x08, 0x08}, // '-'
|
|
{0x00, 0x60, 0x60, 0x00, 0x00}, // '.'
|
|
{0x20, 0x10, 0x08, 0x04, 0x02}, // '/'
|
|
{0x3E, 0x51, 0x49, 0x45, 0x3E}, // '0'
|
|
{0x00, 0x04, 0x02, 0x7F, 0x00}, // '1'
|
|
{0x42, 0x61, 0x51, 0x49, 0x46}, // '2'
|
|
{0x22, 0x41, 0x49, 0x49, 0x36}, // '3'
|
|
{0x18, 0x14, 0x12, 0x7F, 0x10}, // '4'
|
|
{0x27, 0x45, 0x45, 0x45, 0x39}, // '5'
|
|
{0x3E, 0x49, 0x49, 0x49, 0x32}, // '6'
|
|
{0x01, 0x01, 0x71, 0x09, 0x07}, // '7'
|
|
{0x36, 0x49, 0x49, 0x49, 0x36}, // '8'
|
|
{0x26, 0x49, 0x49, 0x49, 0x3E}, // '9'
|
|
{0x00, 0x36, 0x36, 0x00, 0x00}, // ':'
|
|
{0x00, 0x56, 0x36, 0x00, 0x00}, // ';'
|
|
{0x08, 0x14, 0x22, 0x41, 0x00}, // '<'
|
|
{0x14, 0x14, 0x14, 0x14, 0x14}, // '='
|
|
{0x00, 0x41, 0x22, 0x14, 0x08}, // '>'
|
|
{0x02, 0x01, 0x51, 0x09, 0x06}, // '?'
|
|
{0x3E, 0x41, 0x59, 0x55, 0x5E}, // '@'
|
|
{0x7E, 0x09, 0x09, 0x09, 0x7E}, // 'A'
|
|
{0x7F, 0x49, 0x49, 0x49, 0x36}, // 'B'
|
|
{0x3E, 0x41, 0x41, 0x41, 0x22}, // 'C'
|
|
{0x7F, 0x41, 0x41, 0x41, 0x3E}, // 'D'
|
|
{0x7F, 0x49, 0x49, 0x49, 0x41}, // 'E'
|
|
{0x7F, 0x09, 0x09, 0x09, 0x01}, // 'F'
|
|
{0x3E, 0x41, 0x41, 0x49, 0x3A}, // 'G'
|
|
{0x7F, 0x08, 0x08, 0x08, 0x7F}, // 'H'
|
|
{0x00, 0x41, 0x7F, 0x41, 0x00}, // 'I'
|
|
{0x30, 0x40, 0x40, 0x40, 0x3F}, // 'J'
|
|
{0x7F, 0x08, 0x14, 0x22, 0x41}, // 'K'
|
|
{0x7F, 0x40, 0x40, 0x40, 0x40}, // 'L'
|
|
{0x7F, 0x02, 0x0C, 0x02, 0x7F}, // 'M'
|
|
{0x7F, 0x02, 0x04, 0x08, 0x7F}, // 'N'
|
|
{0x3E, 0x41, 0x41, 0x41, 0x3E}, // 'O'
|
|
{0x7F, 0x09, 0x09, 0x09, 0x06}, // 'P'
|
|
{0x1E, 0x21, 0x21, 0x21, 0x5E}, // 'Q'
|
|
{0x7F, 0x09, 0x09, 0x09, 0x76}, // 'R'
|
|
{0x26, 0x49, 0x49, 0x49, 0x32}, // 'S'
|
|
{0x01, 0x01, 0x7F, 0x01, 0x01}, // 'T'
|
|
{0x3F, 0x40, 0x40, 0x40, 0x3F}, // 'U'
|
|
{0x1F, 0x20, 0x40, 0x20, 0x1F}, // 'V'
|
|
{0x7F, 0x20, 0x10, 0x20, 0x7F}, // 'W'
|
|
{0x41, 0x22, 0x1C, 0x22, 0x41}, // 'X'
|
|
{0x07, 0x08, 0x70, 0x08, 0x07}, // 'Y'
|
|
{0x61, 0x51, 0x49, 0x45, 0x43}, // 'Z'
|
|
{0x00, 0x7F, 0x41, 0x00, 0x00}, // '['
|
|
{0x02, 0x04, 0x08, 0x10, 0x20}, // '\\'
|
|
{0x00, 0x00, 0x41, 0x7F, 0x00}, // ']'
|
|
{0x04, 0x02, 0x01, 0x02, 0x04}, // '^'
|
|
{0x40, 0x40, 0x40, 0x40, 0x40}, // '_'
|
|
{0x00, 0x01, 0x02, 0x04, 0x00}, // '`'
|
|
{0x20, 0x54, 0x54, 0x54, 0x78}, // 'a'
|
|
{0x7F, 0x44, 0x44, 0x44, 0x38}, // 'b'
|
|
{0x38, 0x44, 0x44, 0x44, 0x44}, // 'c'
|
|
{0x38, 0x44, 0x44, 0x44, 0x7F}, // 'd'
|
|
{0x38, 0x54, 0x54, 0x54, 0x18}, // 'e'
|
|
{0x04, 0x04, 0x7E, 0x05, 0x05}, // 'f'
|
|
{0x08, 0x54, 0x54, 0x54, 0x3C}, // 'g'
|
|
{0x7F, 0x08, 0x04, 0x04, 0x78}, // 'h'
|
|
{0x00, 0x44, 0x7D, 0x40, 0x00}, // 'i'
|
|
{0x20, 0x40, 0x44, 0x3D, 0x00}, // 'j'
|
|
{0x7F, 0x10, 0x28, 0x44, 0x00}, // 'k'
|
|
{0x00, 0x41, 0x7F, 0x40, 0x00}, // 'l'
|
|
{0x7C, 0x04, 0x78, 0x04, 0x78}, // 'm'
|
|
{0x7C, 0x08, 0x04, 0x04, 0x78}, // 'n'
|
|
{0x38, 0x44, 0x44, 0x44, 0x38}, // 'o'
|
|
{0x7C, 0x14, 0x14, 0x14, 0x08}, // 'p'
|
|
{0x08, 0x14, 0x14, 0x14, 0x7C}, // 'q'
|
|
{0x00, 0x7C, 0x08, 0x04, 0x04}, // 'r'
|
|
{0x48, 0x54, 0x54, 0x54, 0x20}, // 's'
|
|
{0x04, 0x04, 0x3F, 0x44, 0x44}, // 't'
|
|
{0x3C, 0x40, 0x40, 0x20, 0x7C}, // 'u'
|
|
{0x1C, 0x20, 0x40, 0x20, 0x1C}, // 'v'
|
|
{0x3C, 0x40, 0x30, 0x40, 0x3C}, // 'w'
|
|
{0x44, 0x28, 0x10, 0x28, 0x44}, // 'x'
|
|
{0x0C, 0x50, 0x50, 0x50, 0x3C}, // 'y'
|
|
{0x44, 0x64, 0x54, 0x4C, 0x44}, // 'z'
|
|
{0x00, 0x08, 0x36, 0x41, 0x41}, // '{'
|
|
{0x00, 0x00, 0x7F, 0x00, 0x00}, // '|'
|
|
{0x41, 0x41, 0x36, 0x08, 0x00}, // '}'
|
|
{0x02, 0x01, 0x02, 0x04, 0x02}, // '~'
|
|
};
|
|
|
|
#endif // DS5_BRIDGE_OLED_FONT_H
|