Cherry-picks ONLY the two separable good features from the withdrawn
v0.6.11 (commit 71cead4) — the `controller_wakes_display` (CtrlWake /
OLED-sleep-while-playing) toggle and `screen_brightness` persistence —
onto the verified-working native-trigger build.
The v0.6.11 regressions are intentionally NOT carried over:
- 71cead4's state_mgr.cpp trigger-FFB allow-bit mirror (#11 suspect)
- all of 84393c0's audio resampler retiming + config audio-defaults
+ chunked-SPI flush (#12 suspect)
Touches only src/config.{h,cpp} and src/oled.cpp, so the trigger and
audio code paths compile byte-identical to the tested firmware and
cannot regress. Two new Config_body fields append at the struct tail
(erased flash -> clamped to defaults by config_valid, clean upgrade).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
77 lines
3.5 KiB
C++
77 lines
3.5 KiB
C++
//
|
|
// Created by awalol on 2026/5/4.
|
|
//
|
|
|
|
#ifndef DS5_BRIDGE_CONFIG_H
|
|
#define DS5_BRIDGE_CONFIG_H
|
|
|
|
#include <cstdint>
|
|
|
|
struct __attribute__((packed)) Config_body {
|
|
uint8_t config_version; // Config Version
|
|
float haptics_gain; // [1.0,2.0]
|
|
float speaker_volume; // [-100,0]
|
|
uint8_t inactive_time; // [5,60] min
|
|
uint8_t disable_inactive_disconnect; // bool: 0 disable,1 enable
|
|
uint8_t disable_pico_led; // bool
|
|
uint8_t polling_rate_mode; // 0: 250Hz, 1: 500Hz, 2: real-time
|
|
uint8_t audio_buffer_length; // [16,128]
|
|
uint8_t controller_mode; // 0: DS5, 1: DSE, 2: Auto
|
|
uint8_t current_slot; // [0..3] active multi-pairing slot (OLED Edition Phase G)
|
|
// Audio Auto Haptics — derive haptic feedback from speaker audio for games that
|
|
// send no per-frame native haptic data. DSP borrowed from loteran/DS5Dongle 5d6bc2f.
|
|
uint8_t auto_haptics_enable; // 0=Off, 1=Fallback (default), 2=Mix, 3=Replace
|
|
uint8_t auto_haptics_gain; // [0,200] percent, default 100
|
|
uint8_t auto_haptics_lowpass; // 0=80Hz, 1=160Hz (default), 2=250Hz, 3=400Hz
|
|
// Lightbar (OLED Edition Phase H): persisted so the chosen mode/colors
|
|
// survive reboot and stick across all screens. lightbar_mode indexes the
|
|
// OLED Lightbar screen's mode list — 0=LIVE, 1..4=FAV0..3, 5=BREATHING,
|
|
// 6=RAINBOW, 7=FADE, 8=HOST (passthrough, the safe default that lets the
|
|
// host/game own the LED). Keep this numbering in sync with kNumLbModes /
|
|
// kLbModeHost in src/oled.cpp. Erased flash (0xFF) → HOST + white favorites.
|
|
uint8_t lightbar_mode;
|
|
uint8_t lb_fav_r[4];
|
|
uint8_t lb_fav_g[4];
|
|
uint8_t lb_fav_b[4];
|
|
// OLED idle power-ladder thresholds, in minutes. 0 = that tier disabled.
|
|
// Defaults preserve the original hardcoded ladder (2 min dim, 15 min off).
|
|
// Range [0,250] (0xFF erased flash → default via config_valid clamp). The
|
|
// idle timer is 64-bit µs so the full range is representable. Issue #5.
|
|
uint8_t screen_dim_timeout;
|
|
uint8_t screen_off_timeout;
|
|
// DualSense mic over Bluetooth (Phase I). 0 = off, 1 = on (default). When on,
|
|
// the dongle asserts the DS5 mic-enable bit so the controller streams its mic
|
|
// over BT and the dongle decodes it to the USB capture endpoint. Costs extra
|
|
// DS5 battery (keeps its audio subsystem awake), hence the toggle.
|
|
uint8_t bt_mic_enable;
|
|
// OLED brightness, as an index into kBrightLevels[] (src/oled.cpp). Persisted
|
|
// so the KEY1-long-press brightness choice survives a power cycle. Erased
|
|
// flash (0xFF) → clamped to 0 (full brightness) by config_valid. Issue #9.
|
|
uint8_t screen_brightness;
|
|
// When 0, controller input no longer keeps the OLED awake — only the OLED's
|
|
// own KEY0/KEY1 do — so the dim/off timers actually count down during
|
|
// gameplay and the panel can sleep while the controller is in use. Default 1
|
|
// preserves the original "any controller activity wakes the screen"
|
|
// behavior. Issues #8 (dim timeout never fired during play) and #9.
|
|
uint8_t controller_wakes_display;
|
|
};
|
|
|
|
struct __attribute__((packed)) Config {
|
|
uint32_t magic;
|
|
uint16_t version;
|
|
uint32_t crc32; // Config_body crc32, only calc and verify when save
|
|
uint16_t size; // Config_body size
|
|
Config_body body;
|
|
};
|
|
|
|
void config_default();
|
|
void config_load();
|
|
bool config_save();
|
|
const Config_body& get_config();
|
|
void set_config(const uint8_t *new_config, const uint16_t len);
|
|
void config_valid();
|
|
void set_config(const Config_body &new_config);
|
|
extern bool is_dse;
|
|
|
|
#endif //DS5_BRIDGE_CONFIG_H
|