buttplugio / buttplug

Rust Implementation of the Buttplug Sex Toy Control Protocol

Home Page:https://buttplug.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Lovense Solace Depth Support

aphrodisihack opened this issue · comments

The Lovense Solace supports both depth level and oscillation speed. However, right now, only the oscillation speed is exposed.

From what I gather, this is not an issue with the Solace itself or the ability to reverse engineer its commands, but rather that the depth and oscillation aren't tied together: Naive Buttplug clients may assume that both are scalar values, and scale both up and down with the same value (i.e. depth = oscillation = x). This would result in slow shallow strokes going up towards long fast strokes, which doesn't really expose the functionality of this device. As such, only the oscillation speed is exposed for now.

A proper™ solution here would probably require a new Buttplug protocol command -- however, doing that for a single device seems unreasonable. If this is a future API trend for new intimate hardware devices, it may be relevant, but for now, this is mostly a ticket to describe the current situation.

If you want to fully support the Lovense Solace's capabilities as a modder/developer, it's better to directly access Lovense's API for full control over the device for now.

Bypass for the devoted hackers

Config tweakPlease don't recommend other users to change their config to this, as support questions will likely arrive to qdot/Buttplug maintainers. Use this for yourself only, and expect weird behaviour with already existing tools/mods.
        {
          "identifier": [
            "H"
          ],
          "name": "Lovense Solace",
          "messages": {
            "ScalarCmd": [
              {
                "StepRange": [
                  0,
                  20
                ],
                "ActuatorType": "Oscillate",
                "FeatureDescriptor": "Stroker Oscillation Speed"
              },
              {
                "StepRange": [
                  0,
                  20
                ],
                "ActuatorType": "Vibrate",
                "FeatureDescriptor": "Depth"
              }
            ]
          }
        }

I'm just going to drop the conversion from just after the release on this topic here:
https://discord.com/channels/353303527587708932/353303527587708934/1174399935790207187
https://discord.com/channels/353303527587708932/377916908764266499/1174405425316253796

BlackSphereFollower — 15/11/2023 17:26
Oh, and funny thing about this is they provide a bag, but it doesn't fit the toy and the desk clamp
Image
But it might be time to talk about oscillating devices with range support (this, the Hismith Servo and any Linear emulation)

qdot — 15/11/2023 17:39
Yeah I mean it’ll also be valid for oscillation on position devices.

BlackSphereFollower — 15/11/2023 17:47
That's what I was getting at "Linear emulation". I think we need a range for min position and a range for max. That way the solace can be [[0,0][0,20]] Vs the servo at [[0,100],[0,100]]
But I'm probably in the wrong channel for this

qdot — 15/11/2023 17:47
Yeah we can move over to ⁠🍑🔌buttplug-development

qdot — 15/11/2023 17:47
@blackspherefollower So why a [2][2] array?

BlackSphereFollower — 15/11/2023 17:48
The Solace as a fixed min range of 0
But normally, you can move the min and the max
So on the oscillation control range gui control, where you have the 2 movable points, for devices like the solace, the first point would not be movable.
I doubt we'll see more complexity than only one end is variable, but this pattern is used elsewhere already and doesn't require exceptions for the cases we know about

BlackSphereFollower — 15/11/2023 17:56
I'm also just bouncing ideas

qdot — 15/11/2023 17:57
I mean, for positional, we could definitely see movable min/max
I'm just wondering why it's 2 points. Are you expecting vectors in 2-space some how?

BlackSphereFollower — 15/11/2023 18:12
Min/max for the min position and min/max for the max position
I'm not ready to deal with 2/3/6DoF devices
For the solace, you can't change the min, but the max can be 0-20

qdot — 15/11/2023 18:14
How would min/max for each position work?
Like, I'm not sure I understand why that's a range

BlackSphereFollower — 15/11/2023 18:14
I'm not sure all devices are going to map steps and oscillation range
The Solace has speed, which happens to have a max of 20
But that's not the same as saying a device that has 3 speeds can only have 3 depths

qdot — 15/11/2023 18:16
So why wouldn't we have a combination of speed range (which we already have) and [min, max] for position?
'cause I still have no idea what the numbers in your format mean.

BlackSphereFollower — 15/11/2023 18:18
I think I might need to draw this... At the very least I'm going to get laggy whilst I cook.

qdot — 15/11/2023 18:19
I'm gonna be out for the next while anyways, no rush.

BlackSphereFollower — 16/11/2023 15:10
Ok, so I realised I was talking about the device config but hadn't specified that: the actual command would only need to specify the min/max, but we need to know what are valid values for each.
Take an imaginary oscillating device with range:

      name: Ranged Oscillator
      messages:
        ScalarCmd: # Probably not a scalar?
          - StepRange: [ 0, 20 ] # 20 speeds
            ActuatorType: Oscillate
            Range: [[0,0],[0,3]] # The min position can't be changed: 0 to 0. The max position can be changed, but the range is independent of the speed, so 0 to 3

BlackSphereFollower — 16/11/2023 15:17
The command to set the speed + range might look something like:

[
  {
    "ScalarCmd": {
      "Id": 1,
      "DeviceIndex": 0,
      "Scalars": [
        {
          "Index": 0,
          "Scalar": 0.5, # half speed
          "ActuatorType": "Oscillate",
          "Range": [0,3] # full range
        },
      ]
    }
  }
]

I'm playing fast and loose here to try and illustrate how I think this could work
image

qdot — 16/11/2023 17:21
Ah, ok, I see now.
Though right now there's basically 2 options:
One side has full range
Both sides have full range
But I guess this'll give us flexibility if that ever changes, and it's not really something anyone but server implementers will have to worry about.
Though flexible end range on the solace is gonna require a new command :c

BlackSphereFollower — 16/11/2023 17:23
Yep, but it'll mean I can add hismith servo support at the same time
I'd considered a range + some bit flag for mix/max/both being moveable, but it didn't feel like it fit the existing patterns

qdot — 16/11/2023 17:26
Nah, 2d range makes sense in this case.

BlackSphereFollower — 16/11/2023 17:28
I'm going to bet that noones going to breaking down the door for this

qdot — 16/11/2023 17:29
Eh, I can see people bitching about lack of solace pattern capabilities soon
But we'll see.
Like, the fact we can't at least set the end range right now sucks. But that's the case for... everything, so.
I'm getting the release w/ the Solace stuff prepared now. Mine should show up in about 2 hours, I'll test with it then probably do release this evening.