Commit Graph
30 Commits
Author SHA1 Message Date
MarcelineVPQandClaude Opus 4.7 5da1be498e feat(diag): trigger-flow counters + scroll-only Diagnostics screen
Issue #3 (Few things — Triggers and Screen) reports that adaptive
trigger tension is missing through the dongle. The send_trigger_effect
preset cycle on the OLED Trigger Test screen works fine, so the BT
forwarding path is sound — meaning the loss is either at the host
(driver / Steam Input / game not emitting trigger output) or in our
forwarding of the host's 0x02 output report. Adds counters so we can
tell which.

Counters in main.cpp's tud_hid_set_report_cb 0x02 handler:
  - host_out02_total       — every 0x02 OUT report seen
  - host_out02_trig_allow  — those where the host set
                             AllowRight/LeftTriggerFFB
                             (valid_flag0 bits 2 & 3)
  - host_out02_to_bt       — 0x02 reports forwarded as BT 0x31

Diagnosis matrix:
  total grows, trig_allow flat → host driver never sets the trigger
                                 Allow bits = host-side issue
  trig_allow grows, to_bt lags → we're dropping (audio path stealing
                                 the BT pipe while speaker is active)
  all three grow proportionally → forwarding works; controller is
                                  receiving but not actuating
                                  = Sony / DS5 firmware limit

Same flash gets a scroll-only Diagnostics screen — the old layout
was already at the 6-row ceiling and three new counters push it over.
Rows are now a single switch-formatted list (10 rows), 5 visible at
a time, D-pad up/down scrolls. Caret glyphs at the right edge mark
"more above/below". Read-only screen so no cursor (unlike Settings).

Order is by triage relevance: Uptime, BT state, host02, trig/tx,
BT31 in/s fit on the default view; audio + parked-mic counters are
below the fold.

flush_fb split earlier (flush_fb_raw + flush_fb) is unaffected.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-19 19:08:49 -06:00
MarcelineVPQandClaude Opus 4.7 72f163ca50 wip(mic): BT-side mic capture infrastructure + host-side diag
In-progress work on DualSense microphone capture over BT. Mic-add tap
itself is disabled (was decoding standard input bytes as Opus and
producing INT16_MIN garbage on the USB IN endpoint) but everything
around it is wired and ready to re-enable once we identify the actual
mic transport.

Firmware:
- src/audio.cpp: Opus decoder on core0, mic_fifo queue, audio_loop
  mic-in path with decode + mono->stereo + tud_audio_write. Decoder
  init in audio_init() (creates 48kHz mono OpusDecoder).
- src/audio.h: exports mic_add_queue() + per-frame diagnostic
  accessors (audio_mic_frames, last_decoded, last_want, last_wrote,
  last_toc).
- src/main.cpp on_bt_data(): BT-side instrumentation — counts every
  INTERRUPT input report, tracks min/max length, OR mask of byte[2],
  most recent non-0x31 report ID, hex prefix of last 0x31/other/any
  frame, full content of the longest 0x31 frame seen. Mic-tap call
  itself stubbed behind `if (false)` pending the real detector.
- src/state_mgr.cpp: state_init_data byte 6 (VolumeMic) 0xFF→0x40
  (was out of range), byte 9 (MuteControl) 0x0F→0x00 (clear all
  PowerSave bits — AudioPowerSave was muting DSP).
- src/cmd.cpp: two new vendor feature reports — 0xFD returns 32-byte
  diagnostic state (counters + prefixes), 0xFE returns the longest
  0x31 frame in full (up to 80 bytes). Both queryable via
  /dev/hidraw on Linux from the host script.
- src/oled.cpp: Diagnostics screen shows TOC + decode result + USB
  wrote/want bytes for live BT-side visibility.

Host-side:
- scripts/mic_diag.sh: subcommands `status`, `capture [secs]`,
  `watch`, `bt-trace`. The bt-trace subcommand reads the 0xFD
  feature report via hidraw ioctl, decodes counters + recent
  prefixes, computes per-second rates. Drastically cuts iteration
  time — no OLED relay or per-test flash cycle needed.

Findings to date:
- Upstream/mic's mic-flag bit ((data[2] >> 1) & 1) does NOT match
  this DS5 firmware; bit 1 of byte[2] is NEVER set. Bit 0 is the
  standard input report type indicator, not a mic tag — confirmed
  by stick-bytes appearing as our supposed "Opus prefix".
- DS5 sends both report ID 0x01 and 0x31 over BT; the longest frame
  is a standard 79-byte 0x31 input report with sticks/IMU/touchpad
  but no audio bytes appended.
- Conclusion in progress: the DS5 firmware on this controller is
  not currently streaming mic over BT at all, even with
  AllowAudioControl=1, VolumeMic=0x40, AudioPowerSave=0,
  MicMute=0. Next investigation step: compare against a USB-mode
  DS5 to see what a real mic stream looks like at the UAC1 layer.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 17:35:08 -06:00
MarcelineVPQandClaude Opus 4.7 41c89ebcfd rebase: Phase C — main.cpp wires OLED + PS+Mute reboot combo
Three additions on top of upstream's v0.6.0-hotfix main.cpp:

- #include "oled.h" + oled_init() after audio_init/state_init,
  oled_loop() in the main while(1).
- PS + Mute hold-2-seconds combo at the top of interrupt_loop()
  for headless soft-reboot via watchdog_reboot(0,0,0). Bit pattern
  (interrupt_in_data[9] & 0x05) is rare in normal gameplay so the
  long hold prevents accidental triggers.

Upstream's state_init() call sits right between audio_init() and our
new oled_init() — preserved as-is. The state_mgr → 0x31 output report
flow in tud_hid_set_report_cb is upstream's rumble path; not touched.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-17 07:55:20 -06:00
awalol 7bbe37ba1c refactor: unified controller state by state_mgr 2026-05-15 20:07:12 +08:00
Antti Pohjola 9cf52a0665 bugfix: Pico W build. 2026-05-13 14:04:56 +03:00
Thierry Perrautandawalol 63c62081eb feat: low-battery LED indicator (ENABLE_BATT_LED, default ON)
Blink the Pico onboard LED at 1 Hz when the connected DualSense
reports PowerPercent <= 1 (i.e. <= 10%) and PowerState == Discharging.
Source data is byte 52 of the BT 0x31 input report, already copied
into interrupt_in_data; no new BT parsing required.

The new module owns the LED only while it is actively blinking; it
detects controller disconnection via stale-report timeout and steps
out, so bt.cpp's existing connect/disconnect LED handling stays in
charge in all other states. Honors disable_pico_led.

Gated by -DENABLE_BATT_LED=ON (default). With the option off, the
source file is not compiled and behavior is identical to upstream.
CI gains a compile-only check for the OFF flavor.

(cherry picked from commit 2f8ea73c9fb695e24e7cc3329db7cb925e82e1c9)
2026-05-13 18:09:31 +08:00
awalol 3a31bd75af refactor: add SetStateData and audio send priority 2026-05-13 16:19:08 +08:00
awalol 43776c068d fix: SetStateData update 2026-05-09 21:16:24 +08:00
awalol ec2b1dbc12 clarify SetStateData func 2026-05-09 14:29:35 +08:00
awalol c45ceea535 optimize high frequency 0x02 SetStateData 2026-05-09 14:21:21 +08:00
awalol f8f86a29ef fix: ENABLE_SERIAL conditional compilation 2026-05-08 17:37:53 +08:00
awalol ef0a261654 disable watchdog in debug firmware 2026-05-08 14:10:52 +08:00
awalol be01dc439e add usb serial for debug firmware
Code by gpt5.5-xhigh
2026-05-08 13:54:07 +08:00
awalol 7358a81d11 fix: DSE Profile Save. Thanks @fuhuasxflwb 2026-05-05 21:14:29 +08:00
awalol 0d32db4d9f cmd: poll rate switch 2026-05-05 13:00:28 +08:00
awalol fb8624b61b feat: config manager 2026-05-05 01:17:15 +08:00
awalolandGitHub a390eddcba Merge branch 'master' into fix-polling-rate 2026-04-30 14:56:15 +08:00
awalol d1d54eaa41 add watchdog 2026-04-30 14:25:31 +08:00
Felix 7414b303a0 refactor: optimize USB polling rate and fix report race condition
- Increased HID polling rate from 250Hz (4ms) to 1000Hz (1ms) in
  the configuration descriptor to match wired DualSense performance.
- Fixed a potential race condition between Bluetooth data callbacks
  and the USB task using pico/critical_section.
- Implemented a 'dirty flag' mechanism to prevent sending redundant
  duplicate reports, ensuring the dongle only transmits to the host
  when fresh Bluetooth data is received.
- Added a fallback retry logic in interrupt_loop to ensure data
  integrity if a USB report fails to queue.
2026-04-29 20:48:49 +02:00
awalol 6c992af459 feat: support test command 2026-04-28 13:15:20 +08:00
awalol 372e44a85d optimize overclocking. Thanks JunHoo(@1220951120) 2026-04-27 17:41:53 +08:00
awalol f497472127 increase the voltage 2026-04-26 23:06:43 +08:00
awalol c5805dcc8c feat: headset auto switch 2026-04-26 15:14:26 +08:00
awalol 17627eebe4 feat: usb device auto disconnect 2026-04-26 14:33:06 +08:00
awalol 2fb3c2f90b speaker work 2026-04-26 11:34:34 +08:00
awalol 845656aedd feat:adjust gain in speaker volume. add led and auto-disconnect toggle in mute. 2026-03-22 00:33:30 +08:00
awalol 8c8af7b97c set buffer length 2026-03-21 11:01:52 +08:00
awalol 5251ae1f5b fix gyro 2026-03-15 13:35:45 +08:00
awalol 0fd9c2bdd3 fix reconnect 2026-03-10 16:14:05 +08:00
awalol 9a929530d9 First Commit 2026-03-05 16:21:25 +08:00