stpihkal icon indicating copy to clipboard operation
stpihkal copied to clipboard

Lovense: add more information and make formatting consistent

Open teledildonics69 opened this issue 3 years ago • 10 comments

teledildonics69 avatar Sep 27 '21 20:09 teledildonics69

I intend to do more research and work on these docs. However, last time I told myself that I got distracted and never submitted my changes, so here's a start, with hopefully more to follow.

teledildonics69 avatar Sep 27 '21 20:09 teledildonics69

Irritatingly, Lovense appears to have renamed "Quake" to "Dolce" as of today (for trademark reasons): https://www.xbiz.com/news/261947/lovense-renames-new-dual-motor-stimulator-quake-to-dolce. But as all of the products that people currently have say "Quake" on them, I think it's okay to leave this as-is for now. It can be addressed in a follow-up PR.

teledildonics69 avatar Sep 28 '21 17:09 teledildonics69

Unvetted observations:

  • Firmware updates work by running the DFU; command (in-band), which then enables this separate Bluetooth service with DFU operations: https://developer.nordicsemi.com/nRF5_SDK/nRF51_SDK_v4.x.x/doc/html/group__dfu__ble__service__spec.html
    • After running DFU on a Domi, it shuts the service and opens a new one advertising itself as DfuDomi
  • The Gsensor and BeginMove commands seems to have been replaced with BM ([B]egin[M]ove).
  • The StopMove command appears to have been replaced with EM ([E]nd[M]ove).
  • The AW ([A]larm[W]rite) command can be used to set alarms (delayed activations of the toy). Up to ten alarms can be stored. The first argument is the alarm ID (0-9). The second is the vibration strenght of the alarm (0-20). The third is how many seconds away the alarm is. The fourth is how many seconds the alarm should run for.
  • The AG ([A]larm[G]et) command a list of digits corresponding the IDs of pending alarms, or null if none are pending.
  • The AC ([A]larm[C]ancel) and AD ([A]larm[D]elete) commands both delete the alarm with the specified index from the device.
  • AIW writes some kind of value that AI returns. It must contain at least one colon. My best guess is that it's used for some kind-of alarm metadata (ordering?) that isn't relevant to the on-device behaviour but is useful to maintain across apps, but I could be way off.
  • Remove:N deletes a pattern saved on the device, by index, returns what looks like it might be the number of bytes of preset storage now available on the device.
  • Pl commands can be used to set patterns in the same format as GetPatten returns them, except with Pl instead of P. Patterns can consist of up to 100 segments each of 10 half-second levels from 0 to 9. If all 100 segments are used, 100 is indicated with a j instead of 100 to save characters.
  • The "s" in the battery prefix when there is high power draw might be for "skip", because the result value seems to be a lot less accurate in these cases.

edit: I see that some of this was already discussed in https://github.com/buttplugio/stpihkal/issues/70#issuecomment-894040491

teledildonics69 avatar Sep 29 '21 20:09 teledildonics69

The fully-detailed g-sensor data appears to be gone (or at least, I can't figure out where it is), replaced with a stream of simple values from 0 to 4 indicating amount of motion, formatted as M:S0 to M:S4 for Max, and the same but with ,O1 appended for non-0 values from Nora. (These after after BM is sent, until EM is sent.)

teledildonics69 avatar Oct 07 '21 00:10 teledildonics69

The fully-detailed g-sensor data appears to be gone (or at least, I can't figure out where it is), replaced with a stream of simple values from 0 to 4 indicating amount of motion, formatted as M:S0 to M:S4. (These after after BM is sent, until EM is sent.)

Yeah from what I heard, this happened quite a while ago? Not exactly sure when, might be nice to at least bound it by firmware versions, but we'd have to find the switch point. Worse comes to worse, can just ask Lovense heh.

qdot avatar Oct 07 '21 00:10 qdot

Aha! It looks like BT:On and BT:Off give us the raw accelerometer data on Nora (prefixed with BT: instead of G:), but on Max it seems to just return one bit of motion information, BT0 or BT1.

There appears to be some Max-specific command for integration with the game https://www.mirrorlife.com/. Mirr:1 and Mirr:0 are valid commands. I'm not sure exactly what we do, but the game seems to use the toy's buttons as controls for the game itself, so... let's see...

while enabled, the buttons on the Max send MirLife:1 and MirLife:2 instead of controlling the toy.

teledildonics69 avatar Oct 07 '21 04:10 teledildonics69

So just checking: Should I hold off on bringing this branch PR in until you finish doing research? :)

qdot avatar Oct 07 '21 06:10 qdot

@qdot Doesn't really matter, but I suggest going ahead and merging at your convenience.

I think it would be nice to have the formatting/consistency merged so that the next PR's substance changes are easier to see on their own.

I'm just shoving notes in this thread so they're findable by others.

teledildonics69 avatar Oct 07 '21 11:10 teledildonics69

...hah, there are official docs for the web API whose command names give us more bluetooth command names: https://www.lovense.com/sextoys/developer/doc

AVibrate:1:2 will vibrate at level 1 for duration 2 seconds There are similar device-specific ARotate, AAirLevel, AVibRotate, AVibAir, AVibrate1, AVibrate2

teledildonics69 avatar Oct 08 '21 05:10 teledildonics69

The Flash command flashes the light on the toy three times. This occurs even if the light has been disabled with Light:off.

Here are some example sessions testing commands for compatibility across devices: https://gist.github.com/teledildonics-dev/03a861302270c8eaaa1a2a76c95a4ffd

teledildonics69 avatar Oct 08 '21 05:10 teledildonics69