Per CONTRIBUTING in CLAUDE.md, filing this issue before submitting a PR.
Device
Yiciyuan FJB-01 (役次元): white gen-2 BLE-controlled stroker built on a JieLi SoC.
- Adv name:
YCY-FJB-01
- MAC pattern:
0C:A5:E2:* (JieLi OUI)
- Adv service UUID:
0xFF40
- Mfr data magic:
JLAISDK (JieLi AI SDK)
- Product listing: sold on the official 役次元 site / Taobao under "FJB-01"
This is the cup, not the DG-LAB powerbox clone — addressing the question left open in #688. Stroke is an oscillating linear actuator (back-and-forth motion driven by 0..=0x14 level on a single byte), plus two separate vibration motors.
Why now
PR #688 attempted to add support for this vendor in 2024 and was closed in April 2026 for inactivity — CLA was signed but the reviewer's questions (oscillate vs vibrate? product link? full test coverage?) were never answered. I've reverse-engineered the protocol independently and have a working implementation ready that addresses each of those points.
Protocol (verified against firmware reporting 02 07 07)
GATT layout:
| Service |
Char |
UUID |
Properties |
| 0xFF40 |
cmd in |
0000ff41-0000-1000-8000-00805f9b34fb |
write, write-without-response |
| 0xFF40 |
status out |
0000ff42-0000-1000-8000-00805f9b34fb |
read, notify |
Control packet (always 16 bytes):
[0] 0x35 vendor magic
[1] 0x12 "set motor levels" sub-command
[2] stroke 0..=0x14 — linear oscillation
[3] vibe 0..=0x14 — vibration motor
[4] axis_c 0..=0x14 — third haptic motor (driven by app patterns)
[5..15] 0x00 reserved
Battery push arrives unprompted on the notify char as 35 13 01 <pct>, mixed with 10 Hz uptime ticks (35 14 ..) we filter out by prefix.
Buttplug v4 mapping
| Index |
Description |
OutputType |
Range |
| 0 |
stroke |
Oscillate |
0..=100 |
| 1 |
vibe |
Vibrate |
0..=100 |
| 2 |
axis_c |
Vibrate |
0..=100 |
| 3 |
battery |
Input::Battery (Read + Subscribe) |
0..=100 |
Same shape as Galaku G317 / TFF1 (oscillate + 2×vibrate + battery), so the data model is already proven in tree.
Implementation status
Done and locally verified — branch SanJerry007/buttplug:add-yiciyuan-fjb-01:
Happy to open the PR if this is welcome. ~470 lines, 7 files (+2 build artifacts: regenerated config JSON + minor version bump). No regressions, no changes to unrelated files.
Future incremental work (separately, if desired)
- Reverse-direction stroke (firmware accepts signed -20..+20 on byte 2; out of scope for this PR — Buttplug's
Oscillate is unsigned)
- Additional model identifiers as they appear (currently only FJB-01 is verified; the YAML structure makes adding more straightforward)
Per CONTRIBUTING in CLAUDE.md, filing this issue before submitting a PR.
Device
Yiciyuan FJB-01 (役次元): white gen-2 BLE-controlled stroker built on a JieLi SoC.
YCY-FJB-010C:A5:E2:*(JieLi OUI)0xFF40JLAISDK(JieLi AI SDK)This is the cup, not the DG-LAB powerbox clone — addressing the question left open in #688. Stroke is an oscillating linear actuator (back-and-forth motion driven by
0..=0x14level on a single byte), plus two separate vibration motors.Why now
PR #688 attempted to add support for this vendor in 2024 and was closed in April 2026 for inactivity — CLA was signed but the reviewer's questions (oscillate vs vibrate? product link? full test coverage?) were never answered. I've reverse-engineered the protocol independently and have a working implementation ready that addresses each of those points.
Protocol (verified against firmware reporting
02 07 07)GATT layout:
0000ff41-0000-1000-8000-00805f9b34fb0000ff42-0000-1000-8000-00805f9b34fbControl packet (always 16 bytes):
Battery push arrives unprompted on the notify char as
35 13 01 <pct>, mixed with 10 Hz uptime ticks (35 14 ..) we filter out by prefix.Buttplug v4 mapping
Same shape as Galaku G317 / TFF1 (oscillate + 2×vibrate + battery), so the data model is already proven in tree.
Implementation status
Done and locally verified — branch
SanJerry007/buttplug:add-yiciyuan-fjb-01:device-config-v4/protocols/yiciyuan.ymlprotocol_impl/yiciyuan.rs(atomic per-axis state, single 16-byte frame per call, prefix-filtered battery read)device_test_case/test_yiciyuan_protocol.yaml(Scalar/Stop gated on v3+ since v0–v2 single-axis Vibrate semantics don't map cleanly to a multi-actuator device)test_device_protocolsslots (v0–v4 × embedded/json)cargo test -p buttplug_tests --test test_device_protocols→ 818/818 passcargo build→ clean (no new warnings)Happy to open the PR if this is welcome. ~470 lines, 7 files (+2 build artifacts: regenerated config JSON + minor version bump). No regressions, no changes to unrelated files.
Future incremental work (separately, if desired)
Oscillateis unsigned)