Skip to content

atk: complete VXE R1 SE+ controls - #53

Closed
logm1lo wants to merge 6 commits into
OpenMouse-Project:mainfrom
logm1lo:feat/vxe-r1-se-plus-wired
Closed

atk: complete VXE R1 SE+ controls#53
logm1lo wants to merge 6 commits into
OpenMouse-Project:mainfrom
logm1lo:feat/vxe-r1-se-plus-wired

Conversation

@logm1lo

@logm1lologm1lo commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • add the verified PAW3395SE codec and CID/MID 2,32 identity for VXE R1 SE+
  • support wired 0x3554:0xf58f and receiver 0x3554:0xf58e transports without overlapping other drivers
  • expose all stored DPI stages, R1 settings, four configuration banks, lossless button inspection, and receiver telemetry
  • add hardware-verified bank switching with mandatory readback
  • add receiver pairing for the exact R1 SE+ identity and keep cancellation, factory reset, macros, button writes, and firmware flashing unavailable
  • validate command status, frame checksums, RMW source records, and fail closed outside the verified transport
  • document EEPROM record boundaries, recovery behavior, firmware package geometry, and pairing semantics

Hardware verification

Verified on VXE R1 SE+ firmware 3.15, CID/MID 2,32, with VXE Mouse 1K Dongle firmware 1.10:

  • all four wired banks switched successfully with readback; bank 1 was restored
  • profiles 0-2 remained byte-exact after pairing; profile 3 retained the vendor-supported zero-count cleared macro state
  • pairing command 0x05 with payload [0x02, 0x20] completed through the physical left + wheel + right gesture
  • success requires pairing status 2, zero seconds remaining, and online telemetry; status 2 while offline is rejected
  • stable RF identifier and valid battery telemetry were observed after pairing

Validation

  • npm run check: TypeScript build, 858 tests, and package dry-run passed
  • git diff --check passed
  • app production build and 118 tests passed against this protocol revision

SakethKanchiand others added 3 commits September 4, 2026 15:21
The ATK driver applied the A9's PAW3950Ultra DPI encoding to every device
behind vendor id 0x373b. ATK HUB Web 3.2.21 branches that decoder per
sensor: PAW3950/PAW3950DM/PAW3395/PAW3395Ultra pack a plain 10-bit count
of 50-DPI steps instead. A PAW3395 stage read with the A9 encoding is a
fifth of the real value.
A receiver's product id cannot say which sensor a mouse has: 0x373b:0x1085
is a generic "Wireless mouse 1k dongle" reused across models, and the R1
alone ships with PAW3311, PAW3395, PAW3395SE, PAW3395Ultra, PAW3950Ultra
and CORE26K. So identify the mouse the way the vendor's own HUB does, with
GetMouseCIDMID (command 0x10), and look the pair up in a catalog that
carries the sensor.
- add per-sensor profiles and the step-50 codec to src/atk
- add src/drivers/atk/products.ts, keyed "<cid>,<mid>"
- pick the DPI encoding, ceiling and DPI ladder from the sensor, for reads
and writes alike; an unidentified mouse keeps the A9 behaviour, matching
the HUB's own fallback
- report VXE as its own brand via deviceBrand(), as Lamzu/CRDRAKO already do
- claim VXE's wired transport (0x3554:0xf58f, "Compx VXE R1"), which speaks
the same 0xff02/report-0x08 channel. Product-id gated: 0x3554 is shared
with the VGN Dragonfly F2, so the id also joins the Pulsar fallback's
CLAIMED_VGN_PRODUCT_IDS
- decode the rest of GetBatteryLevel: the reply carries a charge flag and a
cell voltage next to the percentage, so report batteryState and
batteryVoltageMv instead of a hardcoded "Unknown"
- treat an unprogrammed angle register as unsupported. It reads 0xff and
fails the (value, 0x55-value) pair, but decoded as -1 degrees
- retry identification instead of caching a timeout, so a mouse that was
asleep is not left misnamed and mis-decoded for the session
Sensors whose DPI mapping is a lookup table (PAW3395SE, PAW3315, PAW3311,
PAW3320) are deliberately not implemented; those tables are not captured
here and a guessed step would misreport DPI silently.
Verified on a VXE R1 (CID/MID 2,12, PAW3395, firmware Mouse 3.13) over both
transports: DPI now reads 1600 rather than 320, ceiling 30000 rather than
42000, and the mouse names itself "VXE R1". Battery was captured across a
charge cycle: flag 0 with a steady voltage on battery, flag 1 with the
voltage climbing on the cable. Writes were not exercised.
See docs/atk-testing.md.
Co-authored-by: sakethkanchi <sakethkanchi3@gmail.com>
@logm1lologm1lo changed the title atk: add wired VXE R1 SE+ supportatk: complete VXE R1 SE+ controlsSep 5, 2026
@logm1lo

Copy link
Copy Markdown
ContributorAuthor

I noticed this was closed without feedback. I have since merged current main (including the MCHOSE, K-snake, and WLMouse changes), resolved the shared MouseStatus conflict while preserving all drivers, and pushed the repaired branch at c463776. The full protocol gate passes: build/package validation and 989 tests. Would you prefer that #53 be reopened, that I open a fresh PR from the repaired branch, or that these additions be folded into #44?

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@logm1lo@SakethKanchi