tangled
alpha
login
or
join now
buttplug.io
/
buttplug
20
fork
atom
Buttplug sex toy control library
20
fork
atom
overview
issues
pulls
pipelines
chore: Convert all config file - to _
qdot.tngl.sh
6 months ago
24e25b10
d63e7023
+1104
-625
12 changed files
expand all
collapse all
unified
split
crates
buttplug_core
schema
buttplug-schema.json
buttplug_server_device_config
device-config-v4
buttplug-device-config-schema-v4.json
protocols
vorze-sa.yml
version.yaml
src
device_config_file
device.rs
user.rs
tests
test_configs
user_tcode_protocol.json
buttplug_tests
tests
test_device_config.rs
util
device_test
device_test_case
config
lovense_ridge_user_config.json
lovense_ridge_user_config_invalid_range.json
tcode_linear_and_vibrate_user_config.json
test_lovense_ridge_user_config.yaml
+1034
-505
crates/buttplug_core/schema/buttplug-schema.json
···
34
"ClientIdMessage": {
35
"description": "Message types that are expected to have an Id and nothing else.",
36
"properties": {
37
-
"Id": { "$ref": "#/components/ClientId" }
0
0
38
},
39
"additionalProperties": false,
40
"minProperties": 1,
···
46
"ServerIdMessage": {
47
"description": "Message types that are expected to have an Id and nothing else, from the server side, which may be either a reply or an event (id 0).",
48
"properties": {
49
-
"Id": { "$ref": "#/components/ServerId" }
0
0
50
},
51
"additionalProperties": false,
52
"minProperties": 1,
···
58
"SystemIdMessage": {
59
"description": "Message sent by the server that is not in direct reply to a message send from the client, and always uses system Id.",
60
"properties": {
61
-
"Id": { "$ref": "#/components/SystemId" }
0
0
62
},
63
"additionalProperties": false,
64
"required": [
···
67
},
68
"SystemIdDeviceIndexMessage": {
69
"properties": {
70
-
"Id": { "$ref": "#/components/SystemId" },
71
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" }
0
0
0
0
72
},
73
"additionalProperties": false,
74
"required": [
75
"Id",
76
"DeviceIndex"
77
]
78
-
},
79
"ClientIdDeviceIndexMessage": {
80
"properties": {
81
-
"Id": { "$ref": "#/components/ClientId" },
82
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" }
0
0
0
0
83
},
84
"additionalProperties": false,
85
"required": [
···
109
"FeatureDescriptor": {
110
"type": "string"
111
},
112
-
"StepCount": { "$ref": "#/components/StepCountV3" },
0
0
113
"ActuatorType": {
114
"description": "Denotes type of actuator (Vibrator, Linear, Oscillator, etc...)",
115
"type": "string"
···
122
"description": "Attributes for device messages.",
123
"type": "object",
124
"properties": {
125
-
"FeatureCount": { "$ref": "#/components/FeatureCount" },
126
-
"StepCount": { "$ref": "#/components/StepCountV2" }
0
0
0
0
127
},
128
"additionalProperties": false,
129
"minProperties": 0
···
132
"description": "Attributes for device messages.",
133
"type": "object",
134
"properties": {
135
-
"FeatureCount": { "$ref": "#/components/FeatureCount" }
0
0
136
},
137
"additionalProperties": false,
138
"minProperties": 0
···
190
"description": "A list of the messages a device will accept on this server implementation.",
191
"type": "object",
192
"properties": {
193
-
"StopDeviceCmd": { "$ref": "#/components/NullMessageAttributes" },
0
0
194
"ScalarCmd": {
195
"type": "array",
196
"items": {
197
-
"$ref": "#/components/GenericMessageAttributesV3" },
198
-
"minItems": 1
0
199
},
200
"LinearCmd": {
201
"type": "array",
···
225
"minItems": 1
226
}
227
},
228
-
"RawReadCmd": { "$ref": "#/components/RawMessageAttributes" },
229
-
"RawWriteCmd": { "$ref": "#/components/RawMessageAttributes" },
230
-
"RawSubscribeCmd": { "$ref": "#/components/RawMessageAttributes" }
0
0
0
0
0
0
231
},
232
"additionalProperties": false
233
},
···
235
"description": "A list of the messages a device will accept on this server implementation.",
236
"type": "object",
237
"properties": {
238
-
"StopDeviceCmd": { "$ref": "#/components/NullMessageAttributes" },
239
-
"VibrateCmd": { "$ref": "#/components/GenericMessageAttributesV2" },
240
-
"LinearCmd": { "$ref": "#/components/GenericMessageAttributesV2" },
241
-
"RotateCmd": { "$ref": "#/components/GenericMessageAttributesV2" },
242
-
"BatteryLevelCmd": { "$ref": "#/components/NullMessageAttributes" },
243
-
"RSSILevelCmd": { "$ref": "#/components/NullMessageAttributes" },
244
-
"RawReadCmd": { "$ref": "#/components/RawMessageAttributes" },
245
-
"RawWriteCmd": { "$ref": "#/components/RawMessageAttributes" },
246
-
"RawSubscribeCmd": { "$ref": "#/components/RawMessageAttributes" },
247
-
"RawUnsubscribeCmd": { "$ref": "#/components/RawMessageAttributes" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
248
},
249
"additionalProperties": false
250
},
···
252
"description": "A list of the messages a device will accept on this server implementation.",
253
"type": "object",
254
"properties": {
255
-
"StopDeviceCmd": { "$ref": "#/components/NullMessageAttributes" },
256
-
"VibrateCmd": { "$ref": "#/components/GenericMessageAttributesV1" },
257
-
"LinearCmd": { "$ref": "#/components/GenericMessageAttributesV1" },
258
-
"RotateCmd": { "$ref": "#/components/GenericMessageAttributesV1" },
259
-
"LovenseCmd": { "$ref": "#/components/NullMessageAttributes" },
260
-
"VorzeA10CycloneCmd": { "$ref": "#/components/NullMessageAttributes" },
261
-
"KiirooCmd": { "$ref": "#/components/NullMessageAttributes" },
262
-
"SingleMotorVibrateCmd": { "$ref": "#/components/NullMessageAttributes" },
263
-
"FleshlightLaunchFW12Cmd": { "$ref": "#/components/NullMessageAttributes" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
264
},
265
"additionalProperties": false
266
},
···
269
"type": "array",
270
"items": {
271
"type": "string",
272
-
"enum": ["FleshlightLaunchFW12Cmd", "SingleMotorVibrateCmd", "KiirooCmd", "LovenseCmd", "VorzeA10CycloneCmd"]
0
0
0
0
0
0
273
},
274
"additionalProperties": false
275
-
},
276
"FeatureCount": {
277
"description": "Number of features on device.",
278
"type": "integer",
···
302
"FeatureIndex": {
303
"type": "integer"
304
},
305
-
"FeatureType": {
306
-
"type": "string"
307
-
},
308
"Output": {
309
-
"type": "array",
310
-
"items": {
311
-
"type": "object",
312
-
"patternProperties": {
313
-
"^(Vibrate|Rotate|Oscillate|Constrict|Spray|Position|Heater|Led)$": {
314
-
"type": "object",
315
-
"properties": {
316
-
"Value": {
317
-
"$ref": "#/components/RangeInclusive"
318
-
}
0
0
0
0
0
0
0
0
319
},
320
-
"required": [
321
-
"Value"
322
-
]
323
},
324
-
"PositionWithDuration": {
325
-
"type": "object",
326
-
"properties": {
327
-
"Position": {
328
-
"$ref": "#/components/RangeInclusive"
329
-
},
330
-
"Duration": {
331
-
"$ref": "#/components/RangeInclusive"
332
-
}
333
-
},
334
-
"required": [
335
-
"Position",
336
-
"Duration"
337
-
]
338
-
}
339
-
},
340
-
"minProperties": 1,
341
-
"maxProperties": 1
342
}
343
},
344
"Input": {
···
362
]
363
}
364
}
365
-
},
366
-
"Raw": {
367
-
"type": "object",
368
-
"properties": {
369
-
"Endpoints": {
370
-
"type": "array",
371
-
"items": {
372
-
"type": "string"
373
-
}
374
-
}
375
-
},
376
-
"required": [
377
-
"Endpoints"
378
-
]
379
}
380
},
381
"required": [
382
"FeatureDescription",
383
-
"FeatureIndex",
384
-
"FeatureType"
385
]
386
}
387
},
···
391
"type": "object",
392
"description": "Sends a generic value set command to a device.",
393
"properties": {
394
-
"Id": { "$ref": "#/components/ClientId" },
395
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
396
-
"FeatureIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
0
0
397
"Command": {
398
"type": "object",
399
"patternProperties": {
···
457
"type": "object",
458
"description": "Sends a request to read a sensor value.",
459
"properties": {
460
-
"Id": { "$ref": "#/components/ClientId" },
461
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
462
-
"FeatureIndex": { "type": "integer" },
463
-
"InputType": { "type": "string" },
464
-
"InputCommand": { "type": "string" }
0
0
0
0
0
0
0
0
0
0
465
},
466
"additionalProperties": false,
467
"required": [
···
476
"type": "object",
477
"description": "Returns from either a sensor read request or a subscribed sensor event.",
478
"properties": {
479
-
"Id": { "$ref": "#/components/ServerId" },
480
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
481
-
"FeatureIndex": { "type": "integer" },
0
0
0
0
0
0
482
"Data": {
483
"type": "object",
484
"patternProperties": {
···
497
"Data"
498
]
499
},
500
-
"RawCmd": {
501
-
"type": "object",
502
-
"description": "Sends a request to raw endpoints.",
503
-
"properties": {
504
-
"Id": { "$ref": "#/components/ClientId" },
505
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
506
-
"Endpoint": { "type": "string" },
507
-
"RawCommand": {
508
-
"type": "object",
509
-
"properties": {
510
-
"Read": {
511
-
"type": "object"
512
-
},
513
-
"Write": {
514
-
"type": "object"
515
-
},
516
-
"Subscribe": {
517
-
"type": "object"
518
-
},
519
-
"Unsubscribe": {
520
-
"type": "object"
521
-
}
522
-
}
523
-
}
524
-
},
525
-
"additionalProperties": false,
526
-
"required": [
527
-
"Id",
528
-
"DeviceIndex",
529
-
"Endpoint",
530
-
"RawCommand"
531
-
]
532
-
},
533
"DeviceList": {
534
"type": "object",
535
"description": "List of all available devices known to the system.",
536
"properties": {
537
-
"Id": { "$ref": "#/components/ServerId" },
0
0
538
"Devices": {
539
"description": "Array of device ids and names.",
540
"type": "object",
···
542
"^[0-9]*": {
543
"type": "object",
544
"properties": {
545
-
"DeviceName": { "$ref": "#/components/DeviceName" },
546
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
547
-
"DeviceDisplayName": { "type": "string" },
548
-
"DeviceMessageTimingGap": { "type": "integer" },
0
0
0
0
0
0
0
0
549
"DeviceFeatures": {
550
"type": "object",
551
"patternProperties": {
552
"^[0-9]*": {
553
-
"$ref": "#/components/DeviceFeatureV4"
554
}
555
}
556
}
···
576
"type": "object",
577
"description": "Request server version, and relay client name.",
578
"properties": {
579
-
"Id": { "$ref": "#/components/ClientId" },
0
0
580
"ClientName": {
581
"description": "Name of the client software.",
582
"type": "string"
···
604
"type": "object",
605
"description": "Server version information, with API version in Major.Minor format.",
606
"properties": {
607
-
"Id": { "$ref": "#/components/ClientId" },
0
0
608
"ServerName": {
609
"description": "Name of the server. Can be 0-length.",
610
"type": "string"
···
626
}
627
}
628
}
629
-
},
630
"SpecV3Messages": {
631
"DeviceList": {
632
"type": "object",
633
"description": "List of all available devices known to the system.",
634
"properties": {
635
-
"Id": { "$ref": "#/components/ClientId" },
0
0
636
"Devices": {
637
"description": "Array of device ids and names.",
638
"type": "array",
639
"items": {
640
"type": "object",
641
"properties": {
642
-
"DeviceName": { "$ref": "#/components/DeviceName" },
643
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
644
-
"DeviceDisplayName": { "type": "string" },
645
-
"DeviceMessageTimingGap": { "type": "integer" },
646
-
"DeviceMessages": { "$ref": "#/components/DeviceMessagesV3" }
0
0
0
0
0
0
0
0
0
0
647
},
648
"additionalProperties": false,
649
"required": [
···
664
"type": "object",
665
"description": "Notifies client that a device of a certain type has been added to the server.",
666
"properties": {
667
-
"Id": { "$ref": "#/components/SystemId" },
668
-
"DeviceName": { "$ref": "#/components/DeviceName" },
669
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
670
-
"DeviceDisplayName": { "type": "string" },
671
-
"DeviceMessageTimingGap": { "type": "integer" },
672
-
"DeviceMessages": { "$ref": "#/components/DeviceMessagesV3" }
0
0
0
0
0
0
0
0
0
0
0
0
673
},
674
"additionalProperties": false,
675
"required": [
···
683
"type": "object",
684
"description": "Sends a generic scalar command to a device.",
685
"properties": {
686
-
"Id": { "$ref": "#/components/ClientId" },
687
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
688
"Scalars": {
689
"description": "Device actution scalar (floating point, range can vary) keyed on acutator index, stepping will be device specific.",
690
"type": "array",
···
726
"type": "object",
727
"description": "Sends a request to read a sensor value.",
728
"properties": {
729
-
"Id": { "$ref": "#/components/ClientId" },
730
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
731
-
"SensorIndex": { "type": "integer" },
732
-
"SensorType": { "type": "string" }
0
0
0
0
0
0
0
0
733
},
734
"additionalProperties": false,
735
"required": [
···
743
"type": "object",
744
"description": "Returns from either a sensor read request or a subscribed sensor event.",
745
"properties": {
746
-
"Id": { "$ref": "#/components/ServerId" },
747
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
748
-
"SensorIndex": { "type": "integer" },
749
-
"SensorType": { "type": "string" },
0
0
0
0
0
0
0
0
750
"Data": {
751
"type": "array",
752
"items": {
···
769
"type": "object",
770
"description": "Sends a request to subscribe for updates to a sensor value.",
771
"properties": {
772
-
"Id": { "$ref": "#/components/ClientId" },
773
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
774
-
"SensorIndex": { "type": "integer" },
775
-
"SensorType": { "type": "string" }
0
0
0
0
0
0
0
0
776
},
777
"additionalProperties": false,
778
"required": [
···
786
"type": "object",
787
"description": "Sends a request to subscribe for updates to a sensor value.",
788
"properties": {
789
-
"Id": { "$ref": "#/components/ClientId" },
790
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
791
-
"SensorIndex": { "type": "integer" },
792
-
"SensorType": { "type": "string" }
0
0
0
0
0
0
0
0
793
},
794
"additionalProperties": false,
795
"required": [
···
805
"type": "object",
806
"description": "List of all available devices known to the system.",
807
"properties": {
808
-
"Id": { "$ref": "#/components/ClientId" },
0
0
809
"Devices": {
810
"description": "Array of device ids and names.",
811
"type": "array",
812
"items": {
813
"type": "object",
814
"properties": {
815
-
"DeviceName": { "$ref": "#/components/DeviceName" },
816
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
817
-
"DeviceMessages": { "$ref": "#/components/DeviceMessagesV2" }
0
0
0
0
0
0
818
},
819
"additionalProperties": false,
820
"required": [
···
835
"type": "object",
836
"description": "Notifies client that a device of a certain type has been added to the server.",
837
"properties": {
838
-
"Id": { "$ref": "#/components/SystemId" },
839
-
"DeviceName": { "$ref": "#/components/DeviceName" },
840
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
841
-
"DeviceMessages": { "$ref": "#/components/DeviceMessagesV2" }
0
0
0
0
0
0
0
0
842
},
843
"additionalProperties": false,
844
"required": [
···
852
"type": "object",
853
"description": "Requests that a BatteryLevel be retreived.",
854
"properties": {
855
-
"Id": { "$ref": "#/components/ClientId" },
856
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" }
0
0
0
0
857
},
858
"additionalProperties": false,
859
"required": [
···
865
"type": "object",
866
"description": "Returns a BatteryLevel read from a device.",
867
"properties": {
868
-
"Id": { "$ref": "#/components/ClientId" },
869
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
870
"BatteryLevel": {
871
"description": "Battery Level",
872
"type": "number",
···
885
"type": "object",
886
"description": "Requests that a RSSI level be retreived.",
887
"properties": {
888
-
"Id": { "$ref": "#/components/ClientId" },
889
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" }
0
0
0
0
890
},
891
"additionalProperties": false,
892
"required": [
···
898
"type": "object",
899
"description": "Returns a BatteryLevel read from a device.",
900
"properties": {
901
-
"Id": { "$ref": "#/components/ClientId" },
902
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
903
"RSSILevel": {
904
"description": "RSSI Level",
905
"type": "number",
···
914
"RSSILevel"
915
]
916
},
917
-
"RawWriteCmd": {
918
-
"type": "object",
919
-
"description": "Sends a raw byte array to a device. Should only be used for testing/development.",
920
-
"properties": {
921
-
"Id": { "$ref": "#/components/ClientId" },
922
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
923
-
"Endpoint": {
924
-
"type": "string",
925
-
"description": "Endpoint (from device config file) to send command to."
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
926
},
927
-
"Data": {
928
-
"description": "Raw byte string to send to device.",
929
-
"type": "array",
930
-
"minItems": 1,
931
-
"items": {
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
932
"type": "integer",
933
-
"minimum": 0,
934
-
"maximum": 255
0
0
0
0
935
}
936
},
937
-
"WriteWithResponse": {
938
-
"type": "boolean",
939
-
"description": "If true, BLE writes will use WriteWithResponse. Value ignored for all other types."
940
-
}
0
0
0
0
941
},
942
-
"additionalProperties": false,
943
-
"required": [
944
-
"Id",
945
-
"Endpoint",
946
-
"DeviceIndex",
947
-
"Data",
948
-
"WriteWithResponse"
949
-
]
950
-
},
951
-
"RawReadCmd": {
952
-
"type": "object",
953
-
"description": "Request a raw byte array from a device. Should only be used for testing/development.",
954
-
"properties": {
955
-
"Id": { "$ref": "#/components/ClientId" },
956
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
957
-
"Endpoint": {
958
-
"type": "string",
959
-
"description": "Endpoint (from device config file) from which the data was retrieved."
960
-
},
961
-
"Length": {
962
-
"type": "integer",
963
-
"description": "Amount of data to read from device, 0 to exhaust whatever is in immediate buffer",
964
-
"minimum": 0
965
},
966
-
"WaitForData": {
967
-
"type": "boolean",
968
-
"description": "If true, then wait until Length amount of data is available."
969
-
}
0
0
970
},
971
-
"additionalProperties": false,
972
-
"required": [
973
-
"Id",
974
-
"Endpoint",
975
-
"DeviceIndex",
976
-
"Length",
977
-
"WaitForData"
978
-
]
979
-
},
980
-
"RawSubscribeCmd": {
981
-
"type": "object",
982
-
"description": "Subscribe to an endpoint on a device to receive raw info back.",
983
-
"properties": {
984
-
"Id": { "$ref": "#/components/ClientId" },
985
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
986
-
"Endpoint": {
987
-
"type": "string",
988
-
"description": "Endpoint (from device config file) from which the data was retrieved."
989
-
}
0
0
990
},
991
-
"additionalProperties": false,
992
-
"required": [
993
-
"Id",
994
-
"Endpoint",
995
-
"DeviceIndex"
996
-
]
997
-
},
998
-
"RawUnsubscribeCmd": {
999
-
"type": "object",
1000
-
"description": "Unsubscribe to an endpoint on a device.",
1001
-
"properties": {
1002
-
"Id": { "$ref": "#/components/ClientId" },
1003
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1004
-
"Endpoint": {
1005
-
"type": "string",
1006
-
"description": "Endpoint (from device config file) from which the data was retrieved."
1007
-
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1008
},
1009
-
"additionalProperties": false,
1010
-
"required": [
1011
-
"Id",
1012
-
"Endpoint",
1013
-
"DeviceIndex"
1014
-
]
1015
-
},
1016
-
"RawReading": {
1017
-
"type": "object",
1018
-
"description": "Raw byte array received from a device. Should only be used for testing/development.",
1019
-
"properties": {
1020
-
"Id": { "$ref": "#/components/ServerId" },
1021
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1022
-
"Endpoint": {
1023
-
"type": "string",
1024
-
"description": "Endpoint (from device config file) from which the data was retrieved."
1025
-
},
1026
-
"Data": {
1027
-
"description": "Raw byte string received from device.",
1028
-
"type": "array",
1029
-
"minItems": 1,
1030
-
"items": {
1031
"type": "integer",
1032
-
"minimum": 0,
1033
-
"maximum": 255
1034
}
1035
-
}
1036
-
},
1037
-
"additionalProperties": false,
1038
-
"required": [
1039
-
"Id",
1040
-
"Endpoint",
1041
-
"DeviceIndex",
1042
-
"Data"
1043
-
]
1044
-
},
1045
-
"ServerInfo": {
1046
-
"type": "object",
1047
-
"description": "Server version information, in Major.Minor.Build format.",
1048
-
"properties": {
1049
-
"Id": { "$ref": "#/components/ClientId" },
1050
-
"ServerName": {
1051
-
"description": "Name of the server. Can be 0-length.",
1052
-
"type": "string"
1053
},
1054
-
"MessageVersion": {
1055
-
"description": "Message template version of the server software.",
1056
-
"type": "integer",
1057
-
"minimum": 0
1058
-
},
1059
-
"MaxPingTime": {
1060
-
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
1061
-
"type": "integer",
1062
-
"minimum": 0
1063
-
}
1064
-
},
1065
-
"additionalProperties": false,
1066
-
"required": [
1067
-
"Id",
1068
-
"MessageVersion",
1069
-
"MaxPingTime",
1070
-
"ServerName"
1071
-
]
1072
-
}
1073
},
1074
"SpecV1Messages": {
1075
"DeviceList": {
1076
"type": "object",
1077
"description": "List of all available devices known to the system.",
1078
"properties": {
1079
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1080
"Devices": {
1081
"description": "Array of device ids and names.",
1082
"type": "array",
1083
"items": {
1084
"type": "object",
1085
"properties": {
1086
-
"DeviceName": { "$ref": "#/components/DeviceName" },
1087
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1088
-
"DeviceMessages": {"$ref": "#/components/DeviceMessagesV1" }
0
0
0
0
0
0
1089
},
1090
"additionalProperties": false,
1091
"required": [
···
1106
"type": "object",
1107
"description": "Notifies client that a device of a certain type has been added to the server.",
1108
"properties": {
1109
-
"Id": { "$ref": "#/components/SystemId" },
1110
-
"DeviceName": { "$ref": "#/components/DeviceName" },
1111
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1112
-
"DeviceMessages": {"$ref": "#/components/DeviceMessagesV1" }
0
0
0
0
0
0
0
0
1113
},
1114
"additionalProperties": false,
1115
"required": [
···
1123
"type": "object",
1124
"description": "Sends a vibrate command to a device that supports vibration.",
1125
"properties": {
1126
-
"Id": { "$ref": "#/components/ClientId" },
1127
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1128
"Speeds": {
1129
"description": "Device vibration speeds (floating point, 0 < x < 1) keyed on vibrator number, stepping will be device specific.",
1130
"type": "array",
···
1163
"type": "object",
1164
"description": "Sends a rotate command to a device that supports rotation.",
1165
"properties": {
1166
-
"Id": { "$ref": "#/components/ClientId" },
1167
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1168
"Rotations": {
1169
"description": "Device rotation speeds (floating point, 0 < x < 1) keyed on rotator number, stepping will be device specific.",
1170
"type": "array",
···
1208
"type": "object",
1209
"description": "Sends a linear movement command to a device that supports linear movements.",
1210
"properties": {
1211
-
"Id": { "$ref": "#/components/ClientId" },
1212
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1213
"Vectors": {
1214
"description": "Device linear movement times (milliseconds) and positions (floating point, 0 < x < 1) keyed on linear actuator number, stepping will be device specific.",
1215
"type": "array",
···
1253
"type": "object",
1254
"description": "Server version information, in Major.Minor.Build format.",
1255
"properties": {
1256
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1257
"ServerName": {
1258
"description": "Name of the server. Can be 0-length.",
1259
"type": "string"
···
1299
"type": "object",
1300
"description": "Request server version, and relay client name.",
1301
"properties": {
1302
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1303
"ClientName": {
1304
"description": "Name of the client software.",
1305
"type": "string"
···
1316
"ClientName",
1317
"MessageVersion"
1318
]
1319
-
}
1320
},
1321
"SpecV0Messages": {
1322
"DeviceList": {
1323
"type": "object",
1324
"description": "List of all available devices known to the system.",
1325
"properties": {
1326
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1327
"Devices": {
1328
"description": "Array of device ids and names.",
1329
"type": "array",
1330
"items": {
1331
"type": "object",
1332
"properties": {
1333
-
"DeviceName": { "$ref": "#/components/DeviceName" },
1334
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1335
-
"DeviceMessages": {"$ref": "#/components/DeviceMessagesV0" }
0
0
0
0
0
0
1336
},
1337
"additionalProperties": false,
1338
"required": [
···
1353
"type": "object",
1354
"description": "Notifies client that a device of a certain type has been added to the server.",
1355
"properties": {
1356
-
"Id": { "$ref": "#/components/SystemId" },
1357
-
"DeviceName": { "$ref": "#/components/DeviceName" },
1358
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
1359
-
"DeviceMessages": {"$ref": "#/components/DeviceMessagesV0" }
0
0
0
0
0
0
0
0
1360
},
1361
"additionalProperties": false,
1362
"required": [
···
1370
"type": "object",
1371
"description": "Stops the all actions currently being taken by a device.",
1372
"properties": {
1373
-
"Id": { "$ref": "#/components/ClientId" },
1374
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" }
0
0
0
0
1375
},
1376
"additionalProperties": false,
1377
"required": [
···
1382
"StopAllDevices": {
1383
"type": "object",
1384
"description": "Stops all actions currently being taken by all connected devices.",
1385
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1386
},
1387
"VorzeA10CycloneCmd": {
1388
"type": "object",
1389
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
1390
"properties": {
1391
-
"Id": { "$ref": "#/components/ClientId" },
1392
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1393
"Speed": {
1394
"description": "Rotation speed command for the Cyclone.",
1395
"type": "integer",
···
1413
"type": "object",
1414
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
1415
"properties": {
1416
-
"Id": { "$ref": "#/components/ClientId" },
1417
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1418
"Command": {
1419
"description": "Command to send to Kiiroo device.",
1420
"type": "string"
···
1431
"type": "object",
1432
"description": "Sends speed and position command to the Fleshlight Launch Device denoted by the device index.",
1433
"properties": {
1434
-
"Id": { "$ref": "#/components/ClientId" },
1435
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1436
"Speed": {
1437
"description": "Speed at which to move to designated position.",
1438
"type": "integer",
···
1458
"type": "object",
1459
"description": "Sends a command string to a Lovense device. Command string will be verified by sender.",
1460
"properties": {
1461
-
"Id": { "$ref": "#/components/ClientId" },
1462
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1463
"Command": {
1464
"description": "Command to send to Lovense device.",
1465
"type": "string"
···
1476
"type": "object",
1477
"description": "Sends a vibrate command to a device that supports vibration.",
1478
"properties": {
1479
-
"Id": { "$ref": "#/components/ClientId" },
1480
-
"DeviceIndex": { "$ref": "#/components/DeviceIndex" },
0
0
0
0
1481
"Speed": {
1482
"description": "Device vibration speed (floating point, 0 < x < 1), stepping will be device specific.",
1483
"type": "number",
···
1496
"type": "object",
1497
"description": "Server version information, in Major.Minor.Build format.",
1498
"properties": {
1499
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1500
"ServerName": {
1501
"description": "Name of the server. Can be 0-length.",
1502
"type": "string"
···
1542
"type": "object",
1543
"description": "Request server version, and relay client name.",
1544
"properties": {
1545
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1546
"ClientName": {
1547
"description": "Name of the client software.",
1548
"type": "string"
···
1558
"type": "object",
1559
"description": "Request for server to stream log messages of a certain level to client.",
1560
"properties": {
1561
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1562
"LogLevel": {
1563
"description": "Maximum level of log message to receive.",
1564
-
"enum": [ "Off", "Fatal", "Error", "Warn", "Info", "Debug", "Trace" ]
0
0
0
0
0
0
0
0
1565
}
1566
},
1567
"additionalProperties": false,
···
1574
"type": "object",
1575
"description": "Log message from the server.",
1576
"properties": {
1577
-
"Id": { "$ref": "#/components/SystemId" },
0
0
1578
"LogLevel": {
1579
"description": "Log level of message.",
1580
-
"enum": [ "Off", "Fatal", "Error", "Warn", "Info", "Debug", "Trace" ]
0
0
0
0
0
0
0
0
1581
},
1582
"LogMessage": {
1583
"description": "Log message from server.",
···
1594
"DeviceRemoved": {
1595
"type": "object",
1596
"description": "Notifies client that a device of a certain type has been removed from the server.",
1597
-
"anyOf": [ { "$ref": "#/components/SystemIdDeviceIndexMessage" } ]
0
0
0
0
1598
},
1599
"RequestDeviceList": {
1600
"type": "object",
1601
"description": "Request for the server to send a list of devices to the client.",
1602
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1603
},
1604
"StartScanning": {
1605
"type": "object",
1606
"description": "Request for the server to start scanning for new devices.",
1607
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1608
},
1609
"StopScanning": {
1610
"type": "object",
1611
"description": "Request for the server to stop scanning for new devices.",
1612
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1613
},
1614
"ScanningFinished": {
1615
"type": "object",
1616
"description": "Server notification to client that scanning has ended.",
1617
-
"anyOf": [ { "$ref": "#/components/SystemIdMessage" } ]
0
0
0
0
1618
},
1619
"Ok": {
1620
"type": "object",
1621
"description": "Signifies successful processing of the message indicated by the id.",
1622
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1623
},
1624
"Ping": {
1625
"type": "object",
1626
"description": "Connection keep-alive message.",
1627
-
"anyOf": [ { "$ref": "#/components/ClientIdMessage" } ]
0
0
0
0
1628
},
1629
"Error": {
1630
"type": "object",
1631
"description": "Signifies the server encountered an error while processing the message indicated by the id.",
1632
"properties": {
1633
-
"Id": { "$ref": "#/components/ServerId" },
0
0
1634
"ErrorMessage": {
1635
"type": "string"
1636
},
···
1651
"type": "object",
1652
"description": "Used for connection/application testing. Causes server to echo back the string sent. Sending string of 'Error' will result in a server error. ",
1653
"properties": {
1654
-
"Id": { "$ref": "#/components/ClientId" },
0
0
1655
"TestString": {
1656
"description": "String to be echo'd back from server. Setting this to 'Error' will cause an error to be thrown.",
1657
"type": "string"
···
1672
"type": "object",
1673
"description": "All messages valid in Buttplug Spec v4",
1674
"properties": {
1675
-
"DeviceList": { "$ref": "#/messages/SpecV4Messages/DeviceList" },
1676
-
"Error": { "$ref": "#/messages/SpecV0Messages/Error" },
1677
-
"Ok": { "$ref": "#/messages/SpecV0Messages/Ok" },
1678
-
"Ping": { "$ref": "#/messages/SpecV0Messages/Ping" },
1679
-
"RawCmd": { "$ref": "#/messages/SpecV4Messages/RawCmd" },
1680
-
"RawReading": { "$ref": "#/messages/SpecV2Messages/RawReading" },
1681
-
"RequestDeviceList": { "$ref": "#/messages/SpecV0Messages/RequestDeviceList" },
1682
-
"RequestServerInfo": { "$ref": "#/messages/SpecV4Messages/RequestServerInfo" },
1683
-
"ScanningFinished": { "$ref": "#/messages/SpecV0Messages/ScanningFinished" },
1684
-
"InputCmd": { "$ref": "#/messages/SpecV4Messages/InputCmd" },
1685
-
"InputReading": { "$ref": "#/messages/SpecV4Messages/InputReading" },
1686
-
"ServerInfo": { "$ref": "#/messages/SpecV4Messages/ServerInfo" },
1687
-
"StartScanning": { "$ref": "#/messages/SpecV0Messages/StartScanning" },
1688
-
"StopAllDevices": { "$ref": "#/messages/SpecV0Messages/StopAllDevices" },
1689
-
"StopDeviceCmd": { "$ref": "#/messages/SpecV0Messages/StopDeviceCmd" },
1690
-
"StopScanning": { "$ref": "#/messages/SpecV0Messages/StopScanning" },
1691
-
"OutputCmd": { "$ref": "#/messages/SpecV4Messages/OutputCmd" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1692
},
1693
"additionalProperties": false,
1694
"minProperties": 1,
1695
"maxProperties": 1
1696
},
1697
"minItems": 1
1698
-
},
1699
"MessageSpecV3": {
1700
"type": "array",
1701
"items": {
1702
"type": "object",
1703
"description": "All messages valid in Buttplug Spec v3",
1704
"properties": {
1705
-
"DeviceList": { "$ref": "#/messages/SpecV3Messages/DeviceList" },
1706
-
"DeviceAdded": { "$ref": "#/messages/SpecV3Messages/DeviceAdded" },
1707
-
"DeviceRemoved": { "$ref": "#/messages/SpecV0Messages/DeviceRemoved" },
1708
-
"Error": { "$ref": "#/messages/SpecV0Messages/Error" },
1709
-
"ScalarCmd": { "$ref": "#/messages/SpecV3Messages/ScalarCmd" },
1710
-
"LinearCmd": { "$ref": "#/messages/SpecV1Messages/LinearCmd" },
1711
-
"Ok": { "$ref": "#/messages/SpecV0Messages/Ok" },
1712
-
"Ping": { "$ref": "#/messages/SpecV0Messages/Ping" },
1713
-
"RawReadCmd": { "$ref": "#/messages/SpecV2Messages/RawReadCmd" },
1714
-
"RawReading": { "$ref": "#/messages/SpecV2Messages/RawReading" },
1715
-
"RawWriteCmd": { "$ref": "#/messages/SpecV2Messages/RawWriteCmd" },
1716
-
"RawSubscribeCmd": { "$ref": "#/messages/SpecV2Messages/RawSubscribeCmd" },
1717
-
"RawUnsubscribeCmd": { "$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd" },
1718
-
"RequestDeviceList": { "$ref": "#/messages/SpecV0Messages/RequestDeviceList" },
1719
-
"RequestServerInfo": { "$ref": "#/messages/SpecV1Messages/RequestServerInfo" },
1720
-
"RotateCmd": { "$ref": "#/messages/SpecV1Messages/RotateCmd" },
1721
-
"ScanningFinished": { "$ref": "#/messages/SpecV0Messages/ScanningFinished" },
1722
-
"SensorReadCmd": { "$ref": "#/messages/SpecV3Messages/SensorReadCmd" },
1723
-
"SensorReading": { "$ref": "#/messages/SpecV3Messages/SensorReading" },
1724
-
"SensorSubscribeCmd": { "$ref": "#/messages/SpecV3Messages/SensorSubscribeCmd" },
1725
-
"SensorUnsubscribeCmd": { "$ref": "#/messages/SpecV3Messages/SensorUnsubscribeCmd" },
1726
-
"ServerInfo": { "$ref": "#/messages/SpecV2Messages/ServerInfo" },
1727
-
"StartScanning": { "$ref": "#/messages/SpecV0Messages/StartScanning" },
1728
-
"StopAllDevices": { "$ref": "#/messages/SpecV0Messages/StopAllDevices" },
1729
-
"StopDeviceCmd": { "$ref": "#/messages/SpecV0Messages/StopDeviceCmd" },
1730
-
"StopScanning": { "$ref": "#/messages/SpecV0Messages/StopScanning" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1731
},
1732
"additionalProperties": false,
1733
"minProperties": 1,
···
1741
"type": "object",
1742
"description": "All messages valid in Buttplug Spec v2.",
1743
"properties": {
1744
-
"BatteryLevelCmd": { "$ref": "#/messages/SpecV2Messages/BatteryLevelCmd" },
1745
-
"BatteryLevelReading": { "$ref": "#/messages/SpecV2Messages/BatteryLevelReading" },
1746
-
"DeviceList": { "$ref": "#/messages/SpecV2Messages/DeviceList" },
1747
-
"DeviceAdded": { "$ref": "#/messages/SpecV2Messages/DeviceAdded" },
1748
-
"DeviceRemoved": { "$ref": "#/messages/SpecV0Messages/DeviceRemoved" },
1749
-
"Error": { "$ref": "#/messages/SpecV0Messages/Error" },
1750
-
"LinearCmd": { "$ref": "#/messages/SpecV1Messages/LinearCmd" },
1751
-
"Ok": { "$ref": "#/messages/SpecV0Messages/Ok" },
1752
-
"Ping": { "$ref": "#/messages/SpecV0Messages/Ping" },
1753
-
"RawReadCmd": { "$ref": "#/messages/SpecV2Messages/RawReadCmd" },
1754
-
"RawReading": { "$ref": "#/messages/SpecV2Messages/RawReading" },
1755
-
"RawWriteCmd": { "$ref": "#/messages/SpecV2Messages/RawWriteCmd" },
1756
-
"RawSubscribeCmd": { "$ref": "#/messages/SpecV2Messages/RawSubscribeCmd" },
1757
-
"RawUnsubscribeCmd": { "$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd" },
1758
-
"RequestDeviceList": { "$ref": "#/messages/SpecV0Messages/RequestDeviceList" },
1759
-
"RequestLog": { "$ref": "#/messages/SpecV0Messages/RequestLog" },
1760
-
"RequestServerInfo": { "$ref": "#/messages/SpecV1Messages/RequestServerInfo" },
1761
-
"RotateCmd": { "$ref": "#/messages/SpecV1Messages/RotateCmd" },
1762
-
"RSSILevelCmd": { "$ref": "#/messages/SpecV2Messages/RSSILevelCmd" },
1763
-
"RSSILevelReading": { "$ref": "#/messages/SpecV2Messages/RSSILevelReading" },
1764
-
"ScanningFinished": { "$ref": "#/messages/SpecV0Messages/ScanningFinished" },
1765
-
"ServerInfo": { "$ref": "#/messages/SpecV2Messages/ServerInfo" },
1766
-
"StartScanning": { "$ref": "#/messages/SpecV0Messages/StartScanning" },
1767
-
"StopAllDevices": { "$ref": "#/messages/SpecV0Messages/StopAllDevices" },
1768
-
"StopDeviceCmd": { "$ref": "#/messages/SpecV0Messages/StopDeviceCmd" },
1769
-
"StopScanning": { "$ref": "#/messages/SpecV0Messages/StopScanning" },
1770
-
"VibrateCmd": { "$ref": "#/messages/SpecV1Messages/VibrateCmd" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1771
},
1772
"additionalProperties": false,
1773
"minProperties": 1,
···
1781
"type": "object",
1782
"description": "One or more messages validated by the Buttplug Message schema list.",
1783
"properties": {
1784
-
"DeviceList": { "$ref": "#/messages/SpecV1Messages/DeviceList" },
1785
-
"DeviceAdded": { "$ref": "#/messages/SpecV1Messages/DeviceAdded" },
1786
-
"DeviceRemoved": { "$ref": "#/messages/SpecV0Messages/DeviceRemoved" },
1787
-
"Error": { "$ref": "#/messages/SpecV0Messages/Error" },
1788
-
"FleshlightLaunchFW12Cmd": { "$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd" },
1789
-
"KiirooCmd": { "$ref": "#/messages/SpecV0Messages/KiirooCmd" },
1790
-
"LinearCmd": { "$ref": "#/messages/SpecV1Messages/LinearCmd" },
1791
-
"Log": { "$ref": "#/messages/SpecV0Messages/Log" },
1792
-
"Ok": { "$ref": "#/messages/SpecV0Messages/Ok" },
1793
-
"Ping": { "$ref": "#/messages/SpecV0Messages/Ping" },
1794
-
"RequestDeviceList": { "$ref": "#/messages/SpecV0Messages/RequestDeviceList" },
1795
-
"RequestLog": { "$ref": "#/messages/SpecV0Messages/RequestLog" },
1796
-
"RequestServerInfo": { "$ref": "#/messages/SpecV1Messages/RequestServerInfo" },
1797
-
"RotateCmd": { "$ref": "#/messages/SpecV1Messages/RotateCmd" },
1798
-
"ServerInfo": { "$ref": "#/messages/SpecV1Messages/ServerInfo" },
1799
-
"StartScanning": { "$ref": "#/messages/SpecV0Messages/StartScanning" },
1800
-
"StopAllDevices": { "$ref": "#/messages/SpecV0Messages/StopAllDevices" },
1801
-
"StopDeviceCmd": { "$ref": "#/messages/SpecV0Messages/StopDeviceCmd" },
1802
-
"StopScanning": { "$ref": "#/messages/SpecV0Messages/StopScanning" },
1803
-
"Test": { "$ref": "#/messages/SpecV0Messages/Test" },
1804
-
"VibrateCmd": { "$ref": "#/messages/SpecV1Messages/VibrateCmd" },
1805
-
"VorzeA10CycloneCmd": { "$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1806
},
1807
"additionalProperties": false,
1808
"minProperties": 1,
···
1816
"type": "object",
1817
"description": "One or more messages validated by the Buttplug Message schema list.",
1818
"properties": {
1819
-
"DeviceList": { "$ref": "#/messages/SpecV0Messages/DeviceList" },
1820
-
"DeviceAdded": { "$ref": "#/messages/SpecV0Messages/DeviceAdded" },
1821
-
"DeviceRemoved": { "$ref": "#/messages/SpecV0Messages/DeviceRemoved" },
1822
-
"Error": { "$ref": "#/messages/SpecV0Messages/Error" },
1823
-
"Log": { "$ref": "#/messages/SpecV0Messages/Log" },
1824
-
"Ok": { "$ref": "#/messages/SpecV0Messages/Ok" },
1825
-
"Ping": { "$ref": "#/messages/SpecV0Messages/Ping" },
1826
-
"RequestDeviceList": { "$ref": "#/messages/SpecV0Messages/RequestDeviceList" },
1827
-
"RequestLog": { "$ref": "#/messages/SpecV0Messages/RequestLog" },
1828
-
"RequestServerInfo": { "$ref": "#/messages/SpecV0Messages/RequestServerInfo" },
1829
-
"ServerInfo": { "$ref": "#/messages/SpecV0Messages/ServerInfo" },
1830
-
"StartScanning": { "$ref": "#/messages/SpecV0Messages/StartScanning" },
1831
-
"StopAllDevices": { "$ref": "#/messages/SpecV0Messages/StopAllDevices" },
1832
-
"StopDeviceCmd": { "$ref": "#/messages/SpecV0Messages/StopDeviceCmd" },
1833
-
"StopScanning": { "$ref": "#/messages/SpecV0Messages/StopScanning" },
1834
-
"Test": { "$ref": "#/messages/SpecV0Messages/Test" },
1835
-
"FleshlightLaunchFW12Cmd": { "$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd" },
1836
-
"KiirooCmd": { "$ref": "#/messages/SpecV0Messages/KiirooCmd" },
1837
-
"SingleMotorVibrateCmd": { "$ref": "#/messages/SpecV0Messages/SingleMotorVibrateCmd" },
1838
-
"VorzeA10CycloneCmd": { "$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd" }
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1839
},
1840
"additionalProperties": false,
1841
"minProperties": 1,
···
1844
"minItems": 1
1845
}
1846
},
1847
-
"anyOf": [
1848
-
{ "$ref": "#/specs/MessageSpecV4" },
1849
-
{ "$ref": "#/specs/MessageSpecV3" },
1850
-
{ "$ref": "#/specs/MessageSpecV2" },
1851
-
{ "$ref": "#/specs/MessageSpecV1" },
1852
-
{ "$ref": "#/specs/MessageSpecV0" }
0
0
0
0
0
0
0
0
0
0
1853
]
1854
-
}
···
34
"ClientIdMessage": {
35
"description": "Message types that are expected to have an Id and nothing else.",
36
"properties": {
37
+
"Id": {
38
+
"$ref": "#/components/ClientId"
39
+
}
40
},
41
"additionalProperties": false,
42
"minProperties": 1,
···
48
"ServerIdMessage": {
49
"description": "Message types that are expected to have an Id and nothing else, from the server side, which may be either a reply or an event (id 0).",
50
"properties": {
51
+
"Id": {
52
+
"$ref": "#/components/ServerId"
53
+
}
54
},
55
"additionalProperties": false,
56
"minProperties": 1,
···
62
"SystemIdMessage": {
63
"description": "Message sent by the server that is not in direct reply to a message send from the client, and always uses system Id.",
64
"properties": {
65
+
"Id": {
66
+
"$ref": "#/components/SystemId"
67
+
}
68
},
69
"additionalProperties": false,
70
"required": [
···
73
},
74
"SystemIdDeviceIndexMessage": {
75
"properties": {
76
+
"Id": {
77
+
"$ref": "#/components/SystemId"
78
+
},
79
+
"DeviceIndex": {
80
+
"$ref": "#/components/DeviceIndex"
81
+
}
82
},
83
"additionalProperties": false,
84
"required": [
85
"Id",
86
"DeviceIndex"
87
]
88
+
},
89
"ClientIdDeviceIndexMessage": {
90
"properties": {
91
+
"Id": {
92
+
"$ref": "#/components/ClientId"
93
+
},
94
+
"DeviceIndex": {
95
+
"$ref": "#/components/DeviceIndex"
96
+
}
97
},
98
"additionalProperties": false,
99
"required": [
···
123
"FeatureDescriptor": {
124
"type": "string"
125
},
126
+
"StepCount": {
127
+
"$ref": "#/components/StepCountV3"
128
+
},
129
"ActuatorType": {
130
"description": "Denotes type of actuator (Vibrator, Linear, Oscillator, etc...)",
131
"type": "string"
···
138
"description": "Attributes for device messages.",
139
"type": "object",
140
"properties": {
141
+
"FeatureCount": {
142
+
"$ref": "#/components/FeatureCount"
143
+
},
144
+
"StepCount": {
145
+
"$ref": "#/components/StepCountV2"
146
+
}
147
},
148
"additionalProperties": false,
149
"minProperties": 0
···
152
"description": "Attributes for device messages.",
153
"type": "object",
154
"properties": {
155
+
"FeatureCount": {
156
+
"$ref": "#/components/FeatureCount"
157
+
}
158
},
159
"additionalProperties": false,
160
"minProperties": 0
···
212
"description": "A list of the messages a device will accept on this server implementation.",
213
"type": "object",
214
"properties": {
215
+
"StopDeviceCmd": {
216
+
"$ref": "#/components/NullMessageAttributes"
217
+
},
218
"ScalarCmd": {
219
"type": "array",
220
"items": {
221
+
"$ref": "#/components/GenericMessageAttributesV3"
222
+
},
223
+
"minItems": 1
224
},
225
"LinearCmd": {
226
"type": "array",
···
250
"minItems": 1
251
}
252
},
253
+
"RawReadCmd": {
254
+
"$ref": "#/components/RawMessageAttributes"
255
+
},
256
+
"RawWriteCmd": {
257
+
"$ref": "#/components/RawMessageAttributes"
258
+
},
259
+
"RawSubscribeCmd": {
260
+
"$ref": "#/components/RawMessageAttributes"
261
+
}
262
},
263
"additionalProperties": false
264
},
···
266
"description": "A list of the messages a device will accept on this server implementation.",
267
"type": "object",
268
"properties": {
269
+
"StopDeviceCmd": {
270
+
"$ref": "#/components/NullMessageAttributes"
271
+
},
272
+
"VibrateCmd": {
273
+
"$ref": "#/components/GenericMessageAttributesV2"
274
+
},
275
+
"LinearCmd": {
276
+
"$ref": "#/components/GenericMessageAttributesV2"
277
+
},
278
+
"RotateCmd": {
279
+
"$ref": "#/components/GenericMessageAttributesV2"
280
+
},
281
+
"BatteryLevelCmd": {
282
+
"$ref": "#/components/NullMessageAttributes"
283
+
},
284
+
"RSSILevelCmd": {
285
+
"$ref": "#/components/NullMessageAttributes"
286
+
},
287
+
"RawReadCmd": {
288
+
"$ref": "#/components/RawMessageAttributes"
289
+
},
290
+
"RawWriteCmd": {
291
+
"$ref": "#/components/RawMessageAttributes"
292
+
},
293
+
"RawSubscribeCmd": {
294
+
"$ref": "#/components/RawMessageAttributes"
295
+
},
296
+
"RawUnsubscribeCmd": {
297
+
"$ref": "#/components/RawMessageAttributes"
298
+
}
299
},
300
"additionalProperties": false
301
},
···
303
"description": "A list of the messages a device will accept on this server implementation.",
304
"type": "object",
305
"properties": {
306
+
"StopDeviceCmd": {
307
+
"$ref": "#/components/NullMessageAttributes"
308
+
},
309
+
"VibrateCmd": {
310
+
"$ref": "#/components/GenericMessageAttributesV1"
311
+
},
312
+
"LinearCmd": {
313
+
"$ref": "#/components/GenericMessageAttributesV1"
314
+
},
315
+
"RotateCmd": {
316
+
"$ref": "#/components/GenericMessageAttributesV1"
317
+
},
318
+
"LovenseCmd": {
319
+
"$ref": "#/components/NullMessageAttributes"
320
+
},
321
+
"VorzeA10CycloneCmd": {
322
+
"$ref": "#/components/NullMessageAttributes"
323
+
},
324
+
"KiirooCmd": {
325
+
"$ref": "#/components/NullMessageAttributes"
326
+
},
327
+
"SingleMotorVibrateCmd": {
328
+
"$ref": "#/components/NullMessageAttributes"
329
+
},
330
+
"FleshlightLaunchFW12Cmd": {
331
+
"$ref": "#/components/NullMessageAttributes"
332
+
}
333
},
334
"additionalProperties": false
335
},
···
338
"type": "array",
339
"items": {
340
"type": "string",
341
+
"enum": [
342
+
"FleshlightLaunchFW12Cmd",
343
+
"SingleMotorVibrateCmd",
344
+
"KiirooCmd",
345
+
"LovenseCmd",
346
+
"VorzeA10CycloneCmd"
347
+
]
348
},
349
"additionalProperties": false
350
+
},
351
"FeatureCount": {
352
"description": "Number of features on device.",
353
"type": "integer",
···
377
"FeatureIndex": {
378
"type": "integer"
379
},
0
0
0
380
"Output": {
381
+
"type": "object",
382
+
"patternProperties": {
383
+
"^(Vibrate|Rotate|Oscillate|Constrict|Spray|Position|Heater|Led)$": {
384
+
"type": "object",
385
+
"properties": {
386
+
"Value": {
387
+
"$ref": "#/components/RangeInclusive"
388
+
}
389
+
},
390
+
"required": [
391
+
"Value"
392
+
]
393
+
},
394
+
"PositionWithDuration": {
395
+
"type": "object",
396
+
"properties": {
397
+
"Position": {
398
+
"$ref": "#/components/RangeInclusive"
399
},
400
+
"Duration": {
401
+
"$ref": "#/components/RangeInclusive"
402
+
}
403
},
404
+
"required": [
405
+
"Position",
406
+
"Duration"
407
+
]
408
+
}
0
0
0
0
0
0
0
0
0
0
0
0
0
409
}
410
},
411
"Input": {
···
429
]
430
}
431
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
432
}
433
},
434
"required": [
435
"FeatureDescription",
436
+
"FeatureIndex"
0
437
]
438
}
439
},
···
443
"type": "object",
444
"description": "Sends a generic value set command to a device.",
445
"properties": {
446
+
"Id": {
447
+
"$ref": "#/components/ClientId"
448
+
},
449
+
"DeviceIndex": {
450
+
"$ref": "#/components/DeviceIndex"
451
+
},
452
+
"FeatureIndex": {
453
+
"$ref": "#/components/DeviceIndex"
454
+
},
455
"Command": {
456
"type": "object",
457
"patternProperties": {
···
515
"type": "object",
516
"description": "Sends a request to read a sensor value.",
517
"properties": {
518
+
"Id": {
519
+
"$ref": "#/components/ClientId"
520
+
},
521
+
"DeviceIndex": {
522
+
"$ref": "#/components/DeviceIndex"
523
+
},
524
+
"FeatureIndex": {
525
+
"type": "integer"
526
+
},
527
+
"InputType": {
528
+
"type": "string"
529
+
},
530
+
"InputCommand": {
531
+
"type": "string"
532
+
}
533
},
534
"additionalProperties": false,
535
"required": [
···
544
"type": "object",
545
"description": "Returns from either a sensor read request or a subscribed sensor event.",
546
"properties": {
547
+
"Id": {
548
+
"$ref": "#/components/ServerId"
549
+
},
550
+
"DeviceIndex": {
551
+
"$ref": "#/components/DeviceIndex"
552
+
},
553
+
"FeatureIndex": {
554
+
"type": "integer"
555
+
},
556
"Data": {
557
"type": "object",
558
"patternProperties": {
···
571
"Data"
572
]
573
},
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
574
"DeviceList": {
575
"type": "object",
576
"description": "List of all available devices known to the system.",
577
"properties": {
578
+
"Id": {
579
+
"$ref": "#/components/ServerId"
580
+
},
581
"Devices": {
582
"description": "Array of device ids and names.",
583
"type": "object",
···
585
"^[0-9]*": {
586
"type": "object",
587
"properties": {
588
+
"DeviceName": {
589
+
"$ref": "#/components/DeviceName"
590
+
},
591
+
"DeviceIndex": {
592
+
"$ref": "#/components/DeviceIndex"
593
+
},
594
+
"DeviceDisplayName": {
595
+
"type": "string"
596
+
},
597
+
"DeviceMessageTimingGap": {
598
+
"type": "integer"
599
+
},
600
"DeviceFeatures": {
601
"type": "object",
602
"patternProperties": {
603
"^[0-9]*": {
604
+
"$ref": "#/components/DeviceFeatureV4"
605
}
606
}
607
}
···
627
"type": "object",
628
"description": "Request server version, and relay client name.",
629
"properties": {
630
+
"Id": {
631
+
"$ref": "#/components/ClientId"
632
+
},
633
"ClientName": {
634
"description": "Name of the client software.",
635
"type": "string"
···
657
"type": "object",
658
"description": "Server version information, with API version in Major.Minor format.",
659
"properties": {
660
+
"Id": {
661
+
"$ref": "#/components/ClientId"
662
+
},
663
"ServerName": {
664
"description": "Name of the server. Can be 0-length.",
665
"type": "string"
···
681
}
682
}
683
}
684
+
},
685
"SpecV3Messages": {
686
"DeviceList": {
687
"type": "object",
688
"description": "List of all available devices known to the system.",
689
"properties": {
690
+
"Id": {
691
+
"$ref": "#/components/ClientId"
692
+
},
693
"Devices": {
694
"description": "Array of device ids and names.",
695
"type": "array",
696
"items": {
697
"type": "object",
698
"properties": {
699
+
"DeviceName": {
700
+
"$ref": "#/components/DeviceName"
701
+
},
702
+
"DeviceIndex": {
703
+
"$ref": "#/components/DeviceIndex"
704
+
},
705
+
"DeviceDisplayName": {
706
+
"type": "string"
707
+
},
708
+
"DeviceMessageTimingGap": {
709
+
"type": "integer"
710
+
},
711
+
"DeviceMessages": {
712
+
"$ref": "#/components/DeviceMessagesV3"
713
+
}
714
},
715
"additionalProperties": false,
716
"required": [
···
731
"type": "object",
732
"description": "Notifies client that a device of a certain type has been added to the server.",
733
"properties": {
734
+
"Id": {
735
+
"$ref": "#/components/SystemId"
736
+
},
737
+
"DeviceName": {
738
+
"$ref": "#/components/DeviceName"
739
+
},
740
+
"DeviceIndex": {
741
+
"$ref": "#/components/DeviceIndex"
742
+
},
743
+
"DeviceDisplayName": {
744
+
"type": "string"
745
+
},
746
+
"DeviceMessageTimingGap": {
747
+
"type": "integer"
748
+
},
749
+
"DeviceMessages": {
750
+
"$ref": "#/components/DeviceMessagesV3"
751
+
}
752
},
753
"additionalProperties": false,
754
"required": [
···
762
"type": "object",
763
"description": "Sends a generic scalar command to a device.",
764
"properties": {
765
+
"Id": {
766
+
"$ref": "#/components/ClientId"
767
+
},
768
+
"DeviceIndex": {
769
+
"$ref": "#/components/DeviceIndex"
770
+
},
771
"Scalars": {
772
"description": "Device actution scalar (floating point, range can vary) keyed on acutator index, stepping will be device specific.",
773
"type": "array",
···
809
"type": "object",
810
"description": "Sends a request to read a sensor value.",
811
"properties": {
812
+
"Id": {
813
+
"$ref": "#/components/ClientId"
814
+
},
815
+
"DeviceIndex": {
816
+
"$ref": "#/components/DeviceIndex"
817
+
},
818
+
"SensorIndex": {
819
+
"type": "integer"
820
+
},
821
+
"SensorType": {
822
+
"type": "string"
823
+
}
824
},
825
"additionalProperties": false,
826
"required": [
···
834
"type": "object",
835
"description": "Returns from either a sensor read request or a subscribed sensor event.",
836
"properties": {
837
+
"Id": {
838
+
"$ref": "#/components/ServerId"
839
+
},
840
+
"DeviceIndex": {
841
+
"$ref": "#/components/DeviceIndex"
842
+
},
843
+
"SensorIndex": {
844
+
"type": "integer"
845
+
},
846
+
"SensorType": {
847
+
"type": "string"
848
+
},
849
"Data": {
850
"type": "array",
851
"items": {
···
868
"type": "object",
869
"description": "Sends a request to subscribe for updates to a sensor value.",
870
"properties": {
871
+
"Id": {
872
+
"$ref": "#/components/ClientId"
873
+
},
874
+
"DeviceIndex": {
875
+
"$ref": "#/components/DeviceIndex"
876
+
},
877
+
"SensorIndex": {
878
+
"type": "integer"
879
+
},
880
+
"SensorType": {
881
+
"type": "string"
882
+
}
883
},
884
"additionalProperties": false,
885
"required": [
···
893
"type": "object",
894
"description": "Sends a request to subscribe for updates to a sensor value.",
895
"properties": {
896
+
"Id": {
897
+
"$ref": "#/components/ClientId"
898
+
},
899
+
"DeviceIndex": {
900
+
"$ref": "#/components/DeviceIndex"
901
+
},
902
+
"SensorIndex": {
903
+
"type": "integer"
904
+
},
905
+
"SensorType": {
906
+
"type": "string"
907
+
}
908
},
909
"additionalProperties": false,
910
"required": [
···
920
"type": "object",
921
"description": "List of all available devices known to the system.",
922
"properties": {
923
+
"Id": {
924
+
"$ref": "#/components/ClientId"
925
+
},
926
"Devices": {
927
"description": "Array of device ids and names.",
928
"type": "array",
929
"items": {
930
"type": "object",
931
"properties": {
932
+
"DeviceName": {
933
+
"$ref": "#/components/DeviceName"
934
+
},
935
+
"DeviceIndex": {
936
+
"$ref": "#/components/DeviceIndex"
937
+
},
938
+
"DeviceMessages": {
939
+
"$ref": "#/components/DeviceMessagesV2"
940
+
}
941
},
942
"additionalProperties": false,
943
"required": [
···
958
"type": "object",
959
"description": "Notifies client that a device of a certain type has been added to the server.",
960
"properties": {
961
+
"Id": {
962
+
"$ref": "#/components/SystemId"
963
+
},
964
+
"DeviceName": {
965
+
"$ref": "#/components/DeviceName"
966
+
},
967
+
"DeviceIndex": {
968
+
"$ref": "#/components/DeviceIndex"
969
+
},
970
+
"DeviceMessages": {
971
+
"$ref": "#/components/DeviceMessagesV2"
972
+
}
973
},
974
"additionalProperties": false,
975
"required": [
···
983
"type": "object",
984
"description": "Requests that a BatteryLevel be retreived.",
985
"properties": {
986
+
"Id": {
987
+
"$ref": "#/components/ClientId"
988
+
},
989
+
"DeviceIndex": {
990
+
"$ref": "#/components/DeviceIndex"
991
+
}
992
},
993
"additionalProperties": false,
994
"required": [
···
1000
"type": "object",
1001
"description": "Returns a BatteryLevel read from a device.",
1002
"properties": {
1003
+
"Id": {
1004
+
"$ref": "#/components/ClientId"
1005
+
},
1006
+
"DeviceIndex": {
1007
+
"$ref": "#/components/DeviceIndex"
1008
+
},
1009
"BatteryLevel": {
1010
"description": "Battery Level",
1011
"type": "number",
···
1024
"type": "object",
1025
"description": "Requests that a RSSI level be retreived.",
1026
"properties": {
1027
+
"Id": {
1028
+
"$ref": "#/components/ClientId"
1029
+
},
1030
+
"DeviceIndex": {
1031
+
"$ref": "#/components/DeviceIndex"
1032
+
}
1033
},
1034
"additionalProperties": false,
1035
"required": [
···
1041
"type": "object",
1042
"description": "Returns a BatteryLevel read from a device.",
1043
"properties": {
1044
+
"Id": {
1045
+
"$ref": "#/components/ClientId"
1046
+
},
1047
+
"DeviceIndex": {
1048
+
"$ref": "#/components/DeviceIndex"
1049
+
},
1050
"RSSILevel": {
1051
"description": "RSSI Level",
1052
"type": "number",
···
1061
"RSSILevel"
1062
]
1063
},
1064
+
"RawWriteCmd": {
1065
+
"type": "object",
1066
+
"description": "Sends a raw byte array to a device. Should only be used for testing/development.",
1067
+
"properties": {
1068
+
"Id": {
1069
+
"$ref": "#/components/ClientId"
1070
+
},
1071
+
"DeviceIndex": {
1072
+
"$ref": "#/components/DeviceIndex"
1073
+
},
1074
+
"Endpoint": {
1075
+
"type": "string",
1076
+
"description": "Endpoint (from device config file) to send command to."
1077
+
},
1078
+
"Data": {
1079
+
"description": "Raw byte string to send to device.",
1080
+
"type": "array",
1081
+
"minItems": 1,
1082
+
"items": {
1083
+
"type": "integer",
1084
+
"minimum": 0,
1085
+
"maximum": 255
1086
+
}
1087
+
},
1088
+
"WriteWithResponse": {
1089
+
"type": "boolean",
1090
+
"description": "If true, BLE writes will use WriteWithResponse. Value ignored for all other types."
1091
+
}
1092
},
1093
+
"additionalProperties": false,
1094
+
"required": [
1095
+
"Id",
1096
+
"Endpoint",
1097
+
"DeviceIndex",
1098
+
"Data",
1099
+
"WriteWithResponse"
1100
+
]
1101
+
},
1102
+
"RawReadCmd": {
1103
+
"type": "object",
1104
+
"description": "Request a raw byte array from a device. Should only be used for testing/development.",
1105
+
"properties": {
1106
+
"Id": {
1107
+
"$ref": "#/components/ClientId"
1108
+
},
1109
+
"DeviceIndex": {
1110
+
"$ref": "#/components/DeviceIndex"
1111
+
},
1112
+
"Endpoint": {
1113
+
"type": "string",
1114
+
"description": "Endpoint (from device config file) from which the data was retrieved."
1115
+
},
1116
+
"Length": {
1117
"type": "integer",
1118
+
"description": "Amount of data to read from device, 0 to exhaust whatever is in immediate buffer",
1119
+
"minimum": 0
1120
+
},
1121
+
"WaitForData": {
1122
+
"type": "boolean",
1123
+
"description": "If true, then wait until Length amount of data is available."
1124
}
1125
},
1126
+
"additionalProperties": false,
1127
+
"required": [
1128
+
"Id",
1129
+
"Endpoint",
1130
+
"DeviceIndex",
1131
+
"Length",
1132
+
"WaitForData"
1133
+
]
1134
},
1135
+
"RawSubscribeCmd": {
1136
+
"type": "object",
1137
+
"description": "Subscribe to an endpoint on a device to receive raw info back.",
1138
+
"properties": {
1139
+
"Id": {
1140
+
"$ref": "#/components/ClientId"
1141
+
},
1142
+
"DeviceIndex": {
1143
+
"$ref": "#/components/DeviceIndex"
1144
+
},
1145
+
"Endpoint": {
1146
+
"type": "string",
1147
+
"description": "Endpoint (from device config file) from which the data was retrieved."
1148
+
}
0
0
0
0
0
0
0
0
0
1149
},
1150
+
"additionalProperties": false,
1151
+
"required": [
1152
+
"Id",
1153
+
"Endpoint",
1154
+
"DeviceIndex"
1155
+
]
1156
},
1157
+
"RawUnsubscribeCmd": {
1158
+
"type": "object",
1159
+
"description": "Unsubscribe to an endpoint on a device.",
1160
+
"properties": {
1161
+
"Id": {
1162
+
"$ref": "#/components/ClientId"
1163
+
},
1164
+
"DeviceIndex": {
1165
+
"$ref": "#/components/DeviceIndex"
1166
+
},
1167
+
"Endpoint": {
1168
+
"type": "string",
1169
+
"description": "Endpoint (from device config file) from which the data was retrieved."
1170
+
}
1171
+
},
1172
+
"additionalProperties": false,
1173
+
"required": [
1174
+
"Id",
1175
+
"Endpoint",
1176
+
"DeviceIndex"
1177
+
]
1178
},
1179
+
"RawReading": {
1180
+
"type": "object",
1181
+
"description": "Raw byte array received from a device. Should only be used for testing/development.",
1182
+
"properties": {
1183
+
"Id": {
1184
+
"$ref": "#/components/ServerId"
1185
+
},
1186
+
"DeviceIndex": {
1187
+
"$ref": "#/components/DeviceIndex"
1188
+
},
1189
+
"Endpoint": {
1190
+
"type": "string",
1191
+
"description": "Endpoint (from device config file) from which the data was retrieved."
1192
+
},
1193
+
"Data": {
1194
+
"description": "Raw byte string received from device.",
1195
+
"type": "array",
1196
+
"minItems": 1,
1197
+
"items": {
1198
+
"type": "integer",
1199
+
"minimum": 0,
1200
+
"maximum": 255
1201
+
}
1202
+
}
1203
+
},
1204
+
"additionalProperties": false,
1205
+
"required": [
1206
+
"Id",
1207
+
"Endpoint",
1208
+
"DeviceIndex",
1209
+
"Data"
1210
+
]
1211
},
1212
+
"ServerInfo": {
1213
+
"type": "object",
1214
+
"description": "Server version information, in Major.Minor.Build format.",
1215
+
"properties": {
1216
+
"Id": {
1217
+
"$ref": "#/components/ClientId"
1218
+
},
1219
+
"ServerName": {
1220
+
"description": "Name of the server. Can be 0-length.",
1221
+
"type": "string"
1222
+
},
1223
+
"MessageVersion": {
1224
+
"description": "Message template version of the server software.",
1225
+
"type": "integer",
1226
+
"minimum": 0
1227
+
},
1228
+
"MaxPingTime": {
1229
+
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
0
0
0
0
1230
"type": "integer",
1231
+
"minimum": 0
0
1232
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1233
},
1234
+
"additionalProperties": false,
1235
+
"required": [
1236
+
"Id",
1237
+
"MessageVersion",
1238
+
"MaxPingTime",
1239
+
"ServerName"
1240
+
]
1241
+
}
0
0
0
0
0
0
0
0
0
0
0
1242
},
1243
"SpecV1Messages": {
1244
"DeviceList": {
1245
"type": "object",
1246
"description": "List of all available devices known to the system.",
1247
"properties": {
1248
+
"Id": {
1249
+
"$ref": "#/components/ClientId"
1250
+
},
1251
"Devices": {
1252
"description": "Array of device ids and names.",
1253
"type": "array",
1254
"items": {
1255
"type": "object",
1256
"properties": {
1257
+
"DeviceName": {
1258
+
"$ref": "#/components/DeviceName"
1259
+
},
1260
+
"DeviceIndex": {
1261
+
"$ref": "#/components/DeviceIndex"
1262
+
},
1263
+
"DeviceMessages": {
1264
+
"$ref": "#/components/DeviceMessagesV1"
1265
+
}
1266
},
1267
"additionalProperties": false,
1268
"required": [
···
1283
"type": "object",
1284
"description": "Notifies client that a device of a certain type has been added to the server.",
1285
"properties": {
1286
+
"Id": {
1287
+
"$ref": "#/components/SystemId"
1288
+
},
1289
+
"DeviceName": {
1290
+
"$ref": "#/components/DeviceName"
1291
+
},
1292
+
"DeviceIndex": {
1293
+
"$ref": "#/components/DeviceIndex"
1294
+
},
1295
+
"DeviceMessages": {
1296
+
"$ref": "#/components/DeviceMessagesV1"
1297
+
}
1298
},
1299
"additionalProperties": false,
1300
"required": [
···
1308
"type": "object",
1309
"description": "Sends a vibrate command to a device that supports vibration.",
1310
"properties": {
1311
+
"Id": {
1312
+
"$ref": "#/components/ClientId"
1313
+
},
1314
+
"DeviceIndex": {
1315
+
"$ref": "#/components/DeviceIndex"
1316
+
},
1317
"Speeds": {
1318
"description": "Device vibration speeds (floating point, 0 < x < 1) keyed on vibrator number, stepping will be device specific.",
1319
"type": "array",
···
1352
"type": "object",
1353
"description": "Sends a rotate command to a device that supports rotation.",
1354
"properties": {
1355
+
"Id": {
1356
+
"$ref": "#/components/ClientId"
1357
+
},
1358
+
"DeviceIndex": {
1359
+
"$ref": "#/components/DeviceIndex"
1360
+
},
1361
"Rotations": {
1362
"description": "Device rotation speeds (floating point, 0 < x < 1) keyed on rotator number, stepping will be device specific.",
1363
"type": "array",
···
1401
"type": "object",
1402
"description": "Sends a linear movement command to a device that supports linear movements.",
1403
"properties": {
1404
+
"Id": {
1405
+
"$ref": "#/components/ClientId"
1406
+
},
1407
+
"DeviceIndex": {
1408
+
"$ref": "#/components/DeviceIndex"
1409
+
},
1410
"Vectors": {
1411
"description": "Device linear movement times (milliseconds) and positions (floating point, 0 < x < 1) keyed on linear actuator number, stepping will be device specific.",
1412
"type": "array",
···
1450
"type": "object",
1451
"description": "Server version information, in Major.Minor.Build format.",
1452
"properties": {
1453
+
"Id": {
1454
+
"$ref": "#/components/ClientId"
1455
+
},
1456
"ServerName": {
1457
"description": "Name of the server. Can be 0-length.",
1458
"type": "string"
···
1498
"type": "object",
1499
"description": "Request server version, and relay client name.",
1500
"properties": {
1501
+
"Id": {
1502
+
"$ref": "#/components/ClientId"
1503
+
},
1504
"ClientName": {
1505
"description": "Name of the client software.",
1506
"type": "string"
···
1517
"ClientName",
1518
"MessageVersion"
1519
]
1520
+
}
1521
},
1522
"SpecV0Messages": {
1523
"DeviceList": {
1524
"type": "object",
1525
"description": "List of all available devices known to the system.",
1526
"properties": {
1527
+
"Id": {
1528
+
"$ref": "#/components/ClientId"
1529
+
},
1530
"Devices": {
1531
"description": "Array of device ids and names.",
1532
"type": "array",
1533
"items": {
1534
"type": "object",
1535
"properties": {
1536
+
"DeviceName": {
1537
+
"$ref": "#/components/DeviceName"
1538
+
},
1539
+
"DeviceIndex": {
1540
+
"$ref": "#/components/DeviceIndex"
1541
+
},
1542
+
"DeviceMessages": {
1543
+
"$ref": "#/components/DeviceMessagesV0"
1544
+
}
1545
},
1546
"additionalProperties": false,
1547
"required": [
···
1562
"type": "object",
1563
"description": "Notifies client that a device of a certain type has been added to the server.",
1564
"properties": {
1565
+
"Id": {
1566
+
"$ref": "#/components/SystemId"
1567
+
},
1568
+
"DeviceName": {
1569
+
"$ref": "#/components/DeviceName"
1570
+
},
1571
+
"DeviceIndex": {
1572
+
"$ref": "#/components/DeviceIndex"
1573
+
},
1574
+
"DeviceMessages": {
1575
+
"$ref": "#/components/DeviceMessagesV0"
1576
+
}
1577
},
1578
"additionalProperties": false,
1579
"required": [
···
1587
"type": "object",
1588
"description": "Stops the all actions currently being taken by a device.",
1589
"properties": {
1590
+
"Id": {
1591
+
"$ref": "#/components/ClientId"
1592
+
},
1593
+
"DeviceIndex": {
1594
+
"$ref": "#/components/DeviceIndex"
1595
+
}
1596
},
1597
"additionalProperties": false,
1598
"required": [
···
1603
"StopAllDevices": {
1604
"type": "object",
1605
"description": "Stops all actions currently being taken by all connected devices.",
1606
+
"anyOf": [
1607
+
{
1608
+
"$ref": "#/components/ClientIdMessage"
1609
+
}
1610
+
]
1611
},
1612
"VorzeA10CycloneCmd": {
1613
"type": "object",
1614
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
1615
"properties": {
1616
+
"Id": {
1617
+
"$ref": "#/components/ClientId"
1618
+
},
1619
+
"DeviceIndex": {
1620
+
"$ref": "#/components/DeviceIndex"
1621
+
},
1622
"Speed": {
1623
"description": "Rotation speed command for the Cyclone.",
1624
"type": "integer",
···
1642
"type": "object",
1643
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
1644
"properties": {
1645
+
"Id": {
1646
+
"$ref": "#/components/ClientId"
1647
+
},
1648
+
"DeviceIndex": {
1649
+
"$ref": "#/components/DeviceIndex"
1650
+
},
1651
"Command": {
1652
"description": "Command to send to Kiiroo device.",
1653
"type": "string"
···
1664
"type": "object",
1665
"description": "Sends speed and position command to the Fleshlight Launch Device denoted by the device index.",
1666
"properties": {
1667
+
"Id": {
1668
+
"$ref": "#/components/ClientId"
1669
+
},
1670
+
"DeviceIndex": {
1671
+
"$ref": "#/components/DeviceIndex"
1672
+
},
1673
"Speed": {
1674
"description": "Speed at which to move to designated position.",
1675
"type": "integer",
···
1695
"type": "object",
1696
"description": "Sends a command string to a Lovense device. Command string will be verified by sender.",
1697
"properties": {
1698
+
"Id": {
1699
+
"$ref": "#/components/ClientId"
1700
+
},
1701
+
"DeviceIndex": {
1702
+
"$ref": "#/components/DeviceIndex"
1703
+
},
1704
"Command": {
1705
"description": "Command to send to Lovense device.",
1706
"type": "string"
···
1717
"type": "object",
1718
"description": "Sends a vibrate command to a device that supports vibration.",
1719
"properties": {
1720
+
"Id": {
1721
+
"$ref": "#/components/ClientId"
1722
+
},
1723
+
"DeviceIndex": {
1724
+
"$ref": "#/components/DeviceIndex"
1725
+
},
1726
"Speed": {
1727
"description": "Device vibration speed (floating point, 0 < x < 1), stepping will be device specific.",
1728
"type": "number",
···
1741
"type": "object",
1742
"description": "Server version information, in Major.Minor.Build format.",
1743
"properties": {
1744
+
"Id": {
1745
+
"$ref": "#/components/ClientId"
1746
+
},
1747
"ServerName": {
1748
"description": "Name of the server. Can be 0-length.",
1749
"type": "string"
···
1789
"type": "object",
1790
"description": "Request server version, and relay client name.",
1791
"properties": {
1792
+
"Id": {
1793
+
"$ref": "#/components/ClientId"
1794
+
},
1795
"ClientName": {
1796
"description": "Name of the client software.",
1797
"type": "string"
···
1807
"type": "object",
1808
"description": "Request for server to stream log messages of a certain level to client.",
1809
"properties": {
1810
+
"Id": {
1811
+
"$ref": "#/components/ClientId"
1812
+
},
1813
"LogLevel": {
1814
"description": "Maximum level of log message to receive.",
1815
+
"enum": [
1816
+
"Off",
1817
+
"Fatal",
1818
+
"Error",
1819
+
"Warn",
1820
+
"Info",
1821
+
"Debug",
1822
+
"Trace"
1823
+
]
1824
}
1825
},
1826
"additionalProperties": false,
···
1833
"type": "object",
1834
"description": "Log message from the server.",
1835
"properties": {
1836
+
"Id": {
1837
+
"$ref": "#/components/SystemId"
1838
+
},
1839
"LogLevel": {
1840
"description": "Log level of message.",
1841
+
"enum": [
1842
+
"Off",
1843
+
"Fatal",
1844
+
"Error",
1845
+
"Warn",
1846
+
"Info",
1847
+
"Debug",
1848
+
"Trace"
1849
+
]
1850
},
1851
"LogMessage": {
1852
"description": "Log message from server.",
···
1863
"DeviceRemoved": {
1864
"type": "object",
1865
"description": "Notifies client that a device of a certain type has been removed from the server.",
1866
+
"anyOf": [
1867
+
{
1868
+
"$ref": "#/components/SystemIdDeviceIndexMessage"
1869
+
}
1870
+
]
1871
},
1872
"RequestDeviceList": {
1873
"type": "object",
1874
"description": "Request for the server to send a list of devices to the client.",
1875
+
"anyOf": [
1876
+
{
1877
+
"$ref": "#/components/ClientIdMessage"
1878
+
}
1879
+
]
1880
},
1881
"StartScanning": {
1882
"type": "object",
1883
"description": "Request for the server to start scanning for new devices.",
1884
+
"anyOf": [
1885
+
{
1886
+
"$ref": "#/components/ClientIdMessage"
1887
+
}
1888
+
]
1889
},
1890
"StopScanning": {
1891
"type": "object",
1892
"description": "Request for the server to stop scanning for new devices.",
1893
+
"anyOf": [
1894
+
{
1895
+
"$ref": "#/components/ClientIdMessage"
1896
+
}
1897
+
]
1898
},
1899
"ScanningFinished": {
1900
"type": "object",
1901
"description": "Server notification to client that scanning has ended.",
1902
+
"anyOf": [
1903
+
{
1904
+
"$ref": "#/components/SystemIdMessage"
1905
+
}
1906
+
]
1907
},
1908
"Ok": {
1909
"type": "object",
1910
"description": "Signifies successful processing of the message indicated by the id.",
1911
+
"anyOf": [
1912
+
{
1913
+
"$ref": "#/components/ClientIdMessage"
1914
+
}
1915
+
]
1916
},
1917
"Ping": {
1918
"type": "object",
1919
"description": "Connection keep-alive message.",
1920
+
"anyOf": [
1921
+
{
1922
+
"$ref": "#/components/ClientIdMessage"
1923
+
}
1924
+
]
1925
},
1926
"Error": {
1927
"type": "object",
1928
"description": "Signifies the server encountered an error while processing the message indicated by the id.",
1929
"properties": {
1930
+
"Id": {
1931
+
"$ref": "#/components/ServerId"
1932
+
},
1933
"ErrorMessage": {
1934
"type": "string"
1935
},
···
1950
"type": "object",
1951
"description": "Used for connection/application testing. Causes server to echo back the string sent. Sending string of 'Error' will result in a server error. ",
1952
"properties": {
1953
+
"Id": {
1954
+
"$ref": "#/components/ClientId"
1955
+
},
1956
"TestString": {
1957
"description": "String to be echo'd back from server. Setting this to 'Error' will cause an error to be thrown.",
1958
"type": "string"
···
1973
"type": "object",
1974
"description": "All messages valid in Buttplug Spec v4",
1975
"properties": {
1976
+
"DeviceList": {
1977
+
"$ref": "#/messages/SpecV4Messages/DeviceList"
1978
+
},
1979
+
"Error": {
1980
+
"$ref": "#/messages/SpecV0Messages/Error"
1981
+
},
1982
+
"Ok": {
1983
+
"$ref": "#/messages/SpecV0Messages/Ok"
1984
+
},
1985
+
"Ping": {
1986
+
"$ref": "#/messages/SpecV0Messages/Ping"
1987
+
},
1988
+
"RequestDeviceList": {
1989
+
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
1990
+
},
1991
+
"RequestServerInfo": {
1992
+
"$ref": "#/messages/SpecV4Messages/RequestServerInfo"
1993
+
},
1994
+
"ScanningFinished": {
1995
+
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
1996
+
},
1997
+
"InputCmd": {
1998
+
"$ref": "#/messages/SpecV4Messages/InputCmd"
1999
+
},
2000
+
"InputReading": {
2001
+
"$ref": "#/messages/SpecV4Messages/InputReading"
2002
+
},
2003
+
"ServerInfo": {
2004
+
"$ref": "#/messages/SpecV4Messages/ServerInfo"
2005
+
},
2006
+
"StartScanning": {
2007
+
"$ref": "#/messages/SpecV0Messages/StartScanning"
2008
+
},
2009
+
"StopAllDevices": {
2010
+
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
2011
+
},
2012
+
"StopDeviceCmd": {
2013
+
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
2014
+
},
2015
+
"StopScanning": {
2016
+
"$ref": "#/messages/SpecV0Messages/StopScanning"
2017
+
},
2018
+
"OutputCmd": {
2019
+
"$ref": "#/messages/SpecV4Messages/OutputCmd"
2020
+
}
2021
},
2022
"additionalProperties": false,
2023
"minProperties": 1,
2024
"maxProperties": 1
2025
},
2026
"minItems": 1
2027
+
},
2028
"MessageSpecV3": {
2029
"type": "array",
2030
"items": {
2031
"type": "object",
2032
"description": "All messages valid in Buttplug Spec v3",
2033
"properties": {
2034
+
"DeviceList": {
2035
+
"$ref": "#/messages/SpecV3Messages/DeviceList"
2036
+
},
2037
+
"DeviceAdded": {
2038
+
"$ref": "#/messages/SpecV3Messages/DeviceAdded"
2039
+
},
2040
+
"DeviceRemoved": {
2041
+
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
2042
+
},
2043
+
"Error": {
2044
+
"$ref": "#/messages/SpecV0Messages/Error"
2045
+
},
2046
+
"ScalarCmd": {
2047
+
"$ref": "#/messages/SpecV3Messages/ScalarCmd"
2048
+
},
2049
+
"LinearCmd": {
2050
+
"$ref": "#/messages/SpecV1Messages/LinearCmd"
2051
+
},
2052
+
"Ok": {
2053
+
"$ref": "#/messages/SpecV0Messages/Ok"
2054
+
},
2055
+
"Ping": {
2056
+
"$ref": "#/messages/SpecV0Messages/Ping"
2057
+
},
2058
+
"RawReadCmd": {
2059
+
"$ref": "#/messages/SpecV2Messages/RawReadCmd"
2060
+
},
2061
+
"RawReading": {
2062
+
"$ref": "#/messages/SpecV2Messages/RawReading"
2063
+
},
2064
+
"RawWriteCmd": {
2065
+
"$ref": "#/messages/SpecV2Messages/RawWriteCmd"
2066
+
},
2067
+
"RawSubscribeCmd": {
2068
+
"$ref": "#/messages/SpecV2Messages/RawSubscribeCmd"
2069
+
},
2070
+
"RawUnsubscribeCmd": {
2071
+
"$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd"
2072
+
},
2073
+
"RequestDeviceList": {
2074
+
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
2075
+
},
2076
+
"RequestServerInfo": {
2077
+
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
2078
+
},
2079
+
"RotateCmd": {
2080
+
"$ref": "#/messages/SpecV1Messages/RotateCmd"
2081
+
},
2082
+
"ScanningFinished": {
2083
+
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
2084
+
},
2085
+
"SensorReadCmd": {
2086
+
"$ref": "#/messages/SpecV3Messages/SensorReadCmd"
2087
+
},
2088
+
"SensorReading": {
2089
+
"$ref": "#/messages/SpecV3Messages/SensorReading"
2090
+
},
2091
+
"SensorSubscribeCmd": {
2092
+
"$ref": "#/messages/SpecV3Messages/SensorSubscribeCmd"
2093
+
},
2094
+
"SensorUnsubscribeCmd": {
2095
+
"$ref": "#/messages/SpecV3Messages/SensorUnsubscribeCmd"
2096
+
},
2097
+
"ServerInfo": {
2098
+
"$ref": "#/messages/SpecV2Messages/ServerInfo"
2099
+
},
2100
+
"StartScanning": {
2101
+
"$ref": "#/messages/SpecV0Messages/StartScanning"
2102
+
},
2103
+
"StopAllDevices": {
2104
+
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
2105
+
},
2106
+
"StopDeviceCmd": {
2107
+
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
2108
+
},
2109
+
"StopScanning": {
2110
+
"$ref": "#/messages/SpecV0Messages/StopScanning"
2111
+
}
2112
},
2113
"additionalProperties": false,
2114
"minProperties": 1,
···
2122
"type": "object",
2123
"description": "All messages valid in Buttplug Spec v2.",
2124
"properties": {
2125
+
"BatteryLevelCmd": {
2126
+
"$ref": "#/messages/SpecV2Messages/BatteryLevelCmd"
2127
+
},
2128
+
"BatteryLevelReading": {
2129
+
"$ref": "#/messages/SpecV2Messages/BatteryLevelReading"
2130
+
},
2131
+
"DeviceList": {
2132
+
"$ref": "#/messages/SpecV2Messages/DeviceList"
2133
+
},
2134
+
"DeviceAdded": {
2135
+
"$ref": "#/messages/SpecV2Messages/DeviceAdded"
2136
+
},
2137
+
"DeviceRemoved": {
2138
+
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
2139
+
},
2140
+
"Error": {
2141
+
"$ref": "#/messages/SpecV0Messages/Error"
2142
+
},
2143
+
"LinearCmd": {
2144
+
"$ref": "#/messages/SpecV1Messages/LinearCmd"
2145
+
},
2146
+
"Ok": {
2147
+
"$ref": "#/messages/SpecV0Messages/Ok"
2148
+
},
2149
+
"Ping": {
2150
+
"$ref": "#/messages/SpecV0Messages/Ping"
2151
+
},
2152
+
"RawReadCmd": {
2153
+
"$ref": "#/messages/SpecV2Messages/RawReadCmd"
2154
+
},
2155
+
"RawReading": {
2156
+
"$ref": "#/messages/SpecV2Messages/RawReading"
2157
+
},
2158
+
"RawWriteCmd": {
2159
+
"$ref": "#/messages/SpecV2Messages/RawWriteCmd"
2160
+
},
2161
+
"RawSubscribeCmd": {
2162
+
"$ref": "#/messages/SpecV2Messages/RawSubscribeCmd"
2163
+
},
2164
+
"RawUnsubscribeCmd": {
2165
+
"$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd"
2166
+
},
2167
+
"RequestDeviceList": {
2168
+
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
2169
+
},
2170
+
"RequestLog": {
2171
+
"$ref": "#/messages/SpecV0Messages/RequestLog"
2172
+
},
2173
+
"RequestServerInfo": {
2174
+
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
2175
+
},
2176
+
"RotateCmd": {
2177
+
"$ref": "#/messages/SpecV1Messages/RotateCmd"
2178
+
},
2179
+
"RSSILevelCmd": {
2180
+
"$ref": "#/messages/SpecV2Messages/RSSILevelCmd"
2181
+
},
2182
+
"RSSILevelReading": {
2183
+
"$ref": "#/messages/SpecV2Messages/RSSILevelReading"
2184
+
},
2185
+
"ScanningFinished": {
2186
+
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
2187
+
},
2188
+
"ServerInfo": {
2189
+
"$ref": "#/messages/SpecV2Messages/ServerInfo"
2190
+
},
2191
+
"StartScanning": {
2192
+
"$ref": "#/messages/SpecV0Messages/StartScanning"
2193
+
},
2194
+
"StopAllDevices": {
2195
+
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
2196
+
},
2197
+
"StopDeviceCmd": {
2198
+
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
2199
+
},
2200
+
"StopScanning": {
2201
+
"$ref": "#/messages/SpecV0Messages/StopScanning"
2202
+
},
2203
+
"VibrateCmd": {
2204
+
"$ref": "#/messages/SpecV1Messages/VibrateCmd"
2205
+
}
2206
},
2207
"additionalProperties": false,
2208
"minProperties": 1,
···
2216
"type": "object",
2217
"description": "One or more messages validated by the Buttplug Message schema list.",
2218
"properties": {
2219
+
"DeviceList": {
2220
+
"$ref": "#/messages/SpecV1Messages/DeviceList"
2221
+
},
2222
+
"DeviceAdded": {
2223
+
"$ref": "#/messages/SpecV1Messages/DeviceAdded"
2224
+
},
2225
+
"DeviceRemoved": {
2226
+
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
2227
+
},
2228
+
"Error": {
2229
+
"$ref": "#/messages/SpecV0Messages/Error"
2230
+
},
2231
+
"FleshlightLaunchFW12Cmd": {
2232
+
"$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd"
2233
+
},
2234
+
"KiirooCmd": {
2235
+
"$ref": "#/messages/SpecV0Messages/KiirooCmd"
2236
+
},
2237
+
"LinearCmd": {
2238
+
"$ref": "#/messages/SpecV1Messages/LinearCmd"
2239
+
},
2240
+
"Log": {
2241
+
"$ref": "#/messages/SpecV0Messages/Log"
2242
+
},
2243
+
"Ok": {
2244
+
"$ref": "#/messages/SpecV0Messages/Ok"
2245
+
},
2246
+
"Ping": {
2247
+
"$ref": "#/messages/SpecV0Messages/Ping"
2248
+
},
2249
+
"RequestDeviceList": {
2250
+
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
2251
+
},
2252
+
"RequestLog": {
2253
+
"$ref": "#/messages/SpecV0Messages/RequestLog"
2254
+
},
2255
+
"RequestServerInfo": {
2256
+
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
2257
+
},
2258
+
"RotateCmd": {
2259
+
"$ref": "#/messages/SpecV1Messages/RotateCmd"
2260
+
},
2261
+
"ServerInfo": {
2262
+
"$ref": "#/messages/SpecV1Messages/ServerInfo"
2263
+
},
2264
+
"StartScanning": {
2265
+
"$ref": "#/messages/SpecV0Messages/StartScanning"
2266
+
},
2267
+
"StopAllDevices": {
2268
+
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
2269
+
},
2270
+
"StopDeviceCmd": {
2271
+
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
2272
+
},
2273
+
"StopScanning": {
2274
+
"$ref": "#/messages/SpecV0Messages/StopScanning"
2275
+
},
2276
+
"Test": {
2277
+
"$ref": "#/messages/SpecV0Messages/Test"
2278
+
},
2279
+
"VibrateCmd": {
2280
+
"$ref": "#/messages/SpecV1Messages/VibrateCmd"
2281
+
},
2282
+
"VorzeA10CycloneCmd": {
2283
+
"$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd"
2284
+
}
2285
},
2286
"additionalProperties": false,
2287
"minProperties": 1,
···
2295
"type": "object",
2296
"description": "One or more messages validated by the Buttplug Message schema list.",
2297
"properties": {
2298
+
"DeviceList": {
2299
+
"$ref": "#/messages/SpecV0Messages/DeviceList"
2300
+
},
2301
+
"DeviceAdded": {
2302
+
"$ref": "#/messages/SpecV0Messages/DeviceAdded"
2303
+
},
2304
+
"DeviceRemoved": {
2305
+
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
2306
+
},
2307
+
"Error": {
2308
+
"$ref": "#/messages/SpecV0Messages/Error"
2309
+
},
2310
+
"Log": {
2311
+
"$ref": "#/messages/SpecV0Messages/Log"
2312
+
},
2313
+
"Ok": {
2314
+
"$ref": "#/messages/SpecV0Messages/Ok"
2315
+
},
2316
+
"Ping": {
2317
+
"$ref": "#/messages/SpecV0Messages/Ping"
2318
+
},
2319
+
"RequestDeviceList": {
2320
+
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
2321
+
},
2322
+
"RequestLog": {
2323
+
"$ref": "#/messages/SpecV0Messages/RequestLog"
2324
+
},
2325
+
"RequestServerInfo": {
2326
+
"$ref": "#/messages/SpecV0Messages/RequestServerInfo"
2327
+
},
2328
+
"ServerInfo": {
2329
+
"$ref": "#/messages/SpecV0Messages/ServerInfo"
2330
+
},
2331
+
"StartScanning": {
2332
+
"$ref": "#/messages/SpecV0Messages/StartScanning"
2333
+
},
2334
+
"StopAllDevices": {
2335
+
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
2336
+
},
2337
+
"StopDeviceCmd": {
2338
+
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
2339
+
},
2340
+
"StopScanning": {
2341
+
"$ref": "#/messages/SpecV0Messages/StopScanning"
2342
+
},
2343
+
"Test": {
2344
+
"$ref": "#/messages/SpecV0Messages/Test"
2345
+
},
2346
+
"FleshlightLaunchFW12Cmd": {
2347
+
"$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd"
2348
+
},
2349
+
"KiirooCmd": {
2350
+
"$ref": "#/messages/SpecV0Messages/KiirooCmd"
2351
+
},
2352
+
"SingleMotorVibrateCmd": {
2353
+
"$ref": "#/messages/SpecV0Messages/SingleMotorVibrateCmd"
2354
+
},
2355
+
"VorzeA10CycloneCmd": {
2356
+
"$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd"
2357
+
}
2358
},
2359
"additionalProperties": false,
2360
"minProperties": 1,
···
2363
"minItems": 1
2364
}
2365
},
2366
+
"anyOf": [
2367
+
{
2368
+
"$ref": "#/specs/MessageSpecV4"
2369
+
},
2370
+
{
2371
+
"$ref": "#/specs/MessageSpecV3"
2372
+
},
2373
+
{
2374
+
"$ref": "#/specs/MessageSpecV2"
2375
+
},
2376
+
{
2377
+
"$ref": "#/specs/MessageSpecV1"
2378
+
},
2379
+
{
2380
+
"$ref": "#/specs/MessageSpecV0"
2381
+
}
2382
]
2383
+
}
+11
-43
crates/buttplug_server_device_config/device-config-v4/buttplug-device-config-schema-v4.json
···
270
"id": {
271
"$ref": "#/components/uuid"
272
},
273
-
"base-id": {
274
"$ref": "#/components/uuid"
275
-
},
276
-
"feature-type": {
277
-
"type": "string"
278
},
279
"output": {
280
"type": "object",
···
322
}
323
}
324
}
325
-
},
326
-
"input": {
327
-
"type": "object",
328
-
"patternProperties": {
329
-
"^(battery|rssi|pressure)$": {
330
-
"type": "object",
331
-
"properties": {
332
-
"value-range": {
333
-
"type": "array",
334
-
"items": {
335
-
"$ref": "#/components/value-range"
336
-
},
337
-
"minItems": 1
338
-
},
339
-
"input-commands": {
340
-
"type": "array",
341
-
"items": {
342
-
"type": "string",
343
-
"pattern": "^(Read|Subscribe)$"
344
-
}
345
-
}
346
-
},
347
-
"required": [
348
-
"value-range",
349
-
"input-commands"
350
-
],
351
-
"additionalProperties": false
352
-
}
353
-
}
354
}
355
},
356
"required": [
357
-
"base-id",
358
"id"
359
],
360
"additionalProperties": false
···
369
"deny": {
370
"type": "boolean"
371
},
372
-
"display-name": {
373
"type": "string"
374
},
375
"index": {
···
392
"id": {
393
"$ref": "#/components/uuid"
394
},
395
-
"protocol-variant": {
396
"type": "string"
397
},
398
"features": {
···
423
"id": {
424
"$ref": "#/components/uuid"
425
},
426
-
"protocol-variant": {
427
"type": "string"
428
},
429
"features": {
···
503
},
504
"additionalProperties": false
505
},
506
-
"user-configs": {
507
"type": "object",
508
"properties": {
509
"protocols": {
···
582
"id": {
583
"$ref": "#/components/uuid"
584
},
585
-
"base-id": {
586
"$ref": "#/components/uuid"
587
},
588
"features": {
589
"$ref": "#/components/user-config-features"
590
},
591
-
"user-config": {
592
"$ref": "#/components/user-config-customization"
593
},
594
-
"message-gap-ms": {
595
"type": "integer",
596
"min": 0
597
}
598
},
599
"required": [
600
"id",
601
-
"base-id",
602
"features",
603
-
"user-config"
604
],
605
"additionalProperties": false
606
}
···
270
"id": {
271
"$ref": "#/components/uuid"
272
},
273
+
"base_id": {
274
"$ref": "#/components/uuid"
0
0
0
275
},
276
"output": {
277
"type": "object",
···
319
}
320
}
321
}
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
322
}
323
},
324
"required": [
325
+
"base_id",
326
"id"
327
],
328
"additionalProperties": false
···
337
"deny": {
338
"type": "boolean"
339
},
340
+
"display_name": {
341
"type": "string"
342
},
343
"index": {
···
360
"id": {
361
"$ref": "#/components/uuid"
362
},
363
+
"protocol_variant": {
364
"type": "string"
365
},
366
"features": {
···
391
"id": {
392
"$ref": "#/components/uuid"
393
},
394
+
"protocol_variant": {
395
"type": "string"
396
},
397
"features": {
···
471
},
472
"additionalProperties": false
473
},
474
+
"user_configs": {
475
"type": "object",
476
"properties": {
477
"protocols": {
···
550
"id": {
551
"$ref": "#/components/uuid"
552
},
553
+
"base_id": {
554
"$ref": "#/components/uuid"
555
},
556
"features": {
557
"$ref": "#/components/user-config-features"
558
},
559
+
"user_config": {
560
"$ref": "#/components/user-config-customization"
561
},
562
+
"message_gap_ms": {
563
"type": "integer",
564
"min": 0
565
}
566
},
567
"required": [
568
"id",
569
+
"base_id",
570
"features",
571
+
"user_config"
572
],
573
"additionalProperties": false
574
}
+6
-6
crates/buttplug_server_device_config/device-config-v4/protocols/vorze-sa.yml
···
5
configurations:
6
- identifier:
7
- Bach smart
8
-
protocol-variant: vorze-sa-vibrator
9
name: Vorze Bach
10
features:
11
- id: 447dbcfa-c295-4880-afba-93e24499a78d
···
18
- identifier:
19
- ROCKET
20
name: Adult Festa Rocket
21
-
protocol-variant: vorze-sa-vibrator
22
features:
23
- id: 557d3c89-2e15-4b4a-8480-07f4826a8384
24
output:
···
30
- identifier:
31
- CycSA
32
name: Vorze A10 Cyclone SA
33
-
protocol-variant: vorze-sa-single-rotator
34
features:
35
- id: 8e249d53-8d80-4f42-bc40-e6edb7779e92
36
output:
···
42
- identifier:
43
- UFOSA
44
name: Vorze UFO SA
45
-
protocol-variant: vorze-sa-single-rotator
46
features:
47
- id: 2d8d1443-c394-4df4-b9bb-1659d8323b45
48
output:
···
54
- identifier:
55
- UFO-TW
56
name: Vorze UFO TW
57
-
protocol-variant: vorze-sa-dual-rotator
58
features:
59
- id: a1632ce4-314f-481d-9ae2-2a11a0c4caa4
60
output:
···
71
id: 32e92986-3ae4-45f3-9aec-05d6028f1cb7
72
- identifier:
73
- VorzePiston
74
-
protocol-variant: vorze-sa-piston
75
name: Vorze Piston
76
features:
77
- id: 7c8d7a1d-9e2f-4a92-83f3-42a0840b90bd
···
5
configurations:
6
- identifier:
7
- Bach smart
8
+
protocol_variant: vorze-sa-vibrator
9
name: Vorze Bach
10
features:
11
- id: 447dbcfa-c295-4880-afba-93e24499a78d
···
18
- identifier:
19
- ROCKET
20
name: Adult Festa Rocket
21
+
protocol_variant: vorze-sa-vibrator
22
features:
23
- id: 557d3c89-2e15-4b4a-8480-07f4826a8384
24
output:
···
30
- identifier:
31
- CycSA
32
name: Vorze A10 Cyclone SA
33
+
protocol_variant: vorze-sa-single-rotator
34
features:
35
- id: 8e249d53-8d80-4f42-bc40-e6edb7779e92
36
output:
···
42
- identifier:
43
- UFOSA
44
name: Vorze UFO SA
45
+
protocol_variant: vorze-sa-single-rotator
46
features:
47
- id: 2d8d1443-c394-4df4-b9bb-1659d8323b45
48
output:
···
54
- identifier:
55
- UFO-TW
56
name: Vorze UFO TW
57
+
protocol_variant: vorze-sa-dual-rotator
58
features:
59
- id: a1632ce4-314f-481d-9ae2-2a11a0c4caa4
60
output:
···
71
id: 32e92986-3ae4-45f3-9aec-05d6028f1cb7
72
- identifier:
73
- VorzePiston
74
+
protocol_variant: vorze-sa-piston
75
name: Vorze Piston
76
features:
77
- id: 7c8d7a1d-9e2f-4a92-83f3-42a0840b90bd
+1
-1
crates/buttplug_server_device_config/device-config-v4/version.yaml
···
1
version:
2
major: 4
3
-
minor: 64
···
1
version:
2
major: 4
3
+
minor: 65
-4
crates/buttplug_server_device_config/src/device_config_file/device.rs
···
57
#[derive(Serialize, Deserialize, Debug, Getters, CopyGetters, Default, Clone, MutGetters)]
58
pub struct ConfigUserDeviceCustomization {
59
#[serde(
60
-
rename = "display-name",
61
default,
62
skip_serializing_if = "Option::is_none"
63
)]
···
73
index: u32,
74
#[getset(get_copy = "pub")]
75
#[serde(
76
-
rename = "message-gap-ms",
77
default,
78
skip_serializing_if = "Option::is_none"
79
)]
···
85
#[getset(get_copy = "pub")]
86
id: Uuid,
87
#[getset(get_copy = "pub")]
88
-
#[serde(rename = "base-id")]
89
base_id: Uuid,
90
#[getset(get = "pub")]
91
/// Message attributes for this device instance.
92
#[getset(get = "pub", get_mut = "pub")]
93
features: Vec<ConfigUserDeviceFeature>,
94
#[getset(get = "pub", get_mut = "pub")]
95
-
#[serde(rename = "user-config")]
96
/// Per-user configurations specific to this device instance.
97
user_config: ConfigUserDeviceCustomization,
98
}
···
57
#[derive(Serialize, Deserialize, Debug, Getters, CopyGetters, Default, Clone, MutGetters)]
58
pub struct ConfigUserDeviceCustomization {
59
#[serde(
0
60
default,
61
skip_serializing_if = "Option::is_none"
62
)]
···
72
index: u32,
73
#[getset(get_copy = "pub")]
74
#[serde(
0
75
default,
76
skip_serializing_if = "Option::is_none"
77
)]
···
83
#[getset(get_copy = "pub")]
84
id: Uuid,
85
#[getset(get_copy = "pub")]
0
86
base_id: Uuid,
87
#[getset(get = "pub")]
88
/// Message attributes for this device instance.
89
#[getset(get = "pub", get_mut = "pub")]
90
features: Vec<ConfigUserDeviceFeature>,
91
#[getset(get = "pub", get_mut = "pub")]
0
92
/// Per-user configurations specific to this device instance.
93
user_config: ConfigUserDeviceCustomization,
94
}
+1
-1
crates/buttplug_server_device_config/src/device_config_file/user.rs
···
26
#[getset(get = "pub", get_mut = "pub", set = "pub")]
27
pub struct UserConfigFile {
28
version: ConfigVersion,
29
-
#[serde(rename = "user-configs", default)]
30
user_configs: Option<UserConfigDefinition>,
31
}
32
···
26
#[getset(get = "pub", get_mut = "pub", set = "pub")]
27
pub struct UserConfigFile {
28
version: ConfigVersion,
29
+
#[serde(default)]
30
user_configs: Option<UserConfigDefinition>,
31
}
32
+1
-1
crates/buttplug_server_device_config/tests/test_configs/user_tcode_protocol.json
···
3
"major": 4,
4
"minor": 1
5
},
6
-
"user-configs": {
7
"protocols": {
8
"tcode-v03": {
9
"communication": [
···
3
"major": 4,
4
"minor": 1
5
},
6
+
"user_configs": {
7
"protocols": {
8
"tcode-v03": {
9
"communication": [
+9
-13
crates/buttplug_tests/tests/test_device_config.rs
···
80
"major": 4,
81
"minor": 999
82
},
83
-
"user-configs": {}
84
}
85
"#;
86
···
131
major: 3,
132
minor: 0
133
},
134
-
"user-configs": {
135
"devices": [
136
{
137
"identifier": {
···
143
"name": "Lovense Test Device",
144
"features": [
145
{
146
-
"feature-type": "Vibrate",
147
"description": "Test Speed",
148
"actuator": {
149
-
"step-range": [
150
0,
151
20
152
],
153
-
"step-limit: [
154
10,
155
15
156
],
···
160
}
161
},
162
{
163
-
"feature-type": "Battery",
164
"description": "Battery Level",
165
"sensor": {
166
"value-range": [
···
175
}
176
}
177
],
178
-
"user-config": {
179
"allow": false,
180
"deny": false,
181
"index": 0,
182
-
"display-name": "Lovense Name Test"
183
}
184
}
185
}
···
203
major: 3,
204
minor: 0
205
},
206
-
"user-configs": {
207
"devices": [
208
{
209
"identifier": {
···
215
"name": "Lovense Test Device",
216
"features": [
217
{
218
-
"feature-type": "Vibrate",
219
"description": "Test Speed",
220
"actuator": {
221
"step-range": [
···
227
}
228
},
229
{
230
-
"feature-type": "Battery",
231
"description": "Battery Level",
232
"sensor": {
233
"value-range": [
···
242
}
243
}
244
],
245
-
"user-config": {
246
"allow": false,
247
"deny": false,
248
"index": 0,
249
-
"display-name": "Lovense Name Test"
250
}
251
}
252
}
···
80
"major": 4,
81
"minor": 999
82
},
83
+
"user_configs": {}
84
}
85
"#;
86
···
131
major: 3,
132
minor: 0
133
},
134
+
"user_configs": {
135
"devices": [
136
{
137
"identifier": {
···
143
"name": "Lovense Test Device",
144
"features": [
145
{
0
146
"description": "Test Speed",
147
"actuator": {
148
+
"step_range": [
149
0,
150
20
151
],
152
+
"step_limit: [
153
10,
154
15
155
],
···
159
}
160
},
161
{
0
162
"description": "Battery Level",
163
"sensor": {
164
"value-range": [
···
173
}
174
}
175
],
176
+
"user_config": {
177
"allow": false,
178
"deny": false,
179
"index": 0,
180
+
"display_name": "Lovense Name Test"
181
}
182
}
183
}
···
201
major: 3,
202
minor: 0
203
},
204
+
"user_configs": {
205
"devices": [
206
{
207
"identifier": {
···
213
"name": "Lovense Test Device",
214
"features": [
215
{
0
216
"description": "Test Speed",
217
"actuator": {
218
"step-range": [
···
224
}
225
},
226
{
0
227
"description": "Battery Level",
228
"sensor": {
229
"value-range": [
···
238
}
239
}
240
],
241
+
"user_config": {
242
"allow": false,
243
"deny": false,
244
"index": 0,
245
+
"display_name": "Lovense Name Test"
246
}
247
}
248
}
+15
-10
crates/buttplug_tests/tests/util/device_test/device_test_case/config/lovense_ridge_user_config.json
···
3
"major": 4,
4
"minor": 999
5
},
6
-
"user-configs": {
7
"devices": [
8
{
9
"identifier": {
···
14
"config": {
15
"name": "Lovense Sex Machine",
16
"id": "c8633234-07a4-4ad9-961d-a4d777b32be8",
17
-
"base-id": "9b52eca4-0e49-426e-a543-2ef735cd803a",
18
"features": [
19
{
20
"description": "Fucking Machine Oscillation Speed",
0
0
21
"output": {
22
-
"Oscillate": {
23
-
"step-limit": [
24
0,
25
-
10
26
]
27
}
28
-
},
29
-
"base-id": "0ab80cc0-7a82-4cb6-ba4f-0f18ddb2911f",
30
-
"id": "56d94863-b321-428b-8b68-bac0197556e2"
0
0
0
31
}
32
],
33
-
"user-config": {
0
34
"allow": false,
35
"deny": false,
36
"index": 0,
37
-
"display-name": "Lovense Name Test"
38
}
39
}
40
}
···
3
"major": 4,
4
"minor": 999
5
},
6
+
"user_configs": {
7
"devices": [
8
{
9
"identifier": {
···
14
"config": {
15
"name": "Lovense Sex Machine",
16
"id": "c8633234-07a4-4ad9-961d-a4d777b32be8",
0
17
"features": [
18
{
19
"description": "Fucking Machine Oscillation Speed",
20
+
"base_id": "f9506652-c4ac-43b1-b184-cd8016b64623",
21
+
"id": "f9506652-c4ac-43b1-b184-cd8016b64623",
22
"output": {
23
+
"oscillate": {
24
+
"value": [
25
0,
26
+
20
27
]
28
}
29
+
}
30
+
},
31
+
{
32
+
"description": "battery Level",
33
+
"base_id": "7c382c60-0ee2-4315-b8cf-cfd3ab4c9ccd",
34
+
"id": "77d6498b-3707-4ca6-b37d-e0d6f868d302"
35
}
36
],
37
+
"base_id": "8667f7b6-7baa-4e46-9d76-947fb707f0f3",
38
+
"user_config": {
39
"allow": false,
40
"deny": false,
41
"index": 0,
42
+
"display_name": "Lovense Name Test"
43
}
44
}
45
}
+11
-11
crates/buttplug_tests/tests/util/device_test/device_test_case/config/lovense_ridge_user_config_invalid_range.json
···
3
"major": 4,
4
"minor": 999
5
},
6
-
"user-configs": {
7
"devices": [
8
{
9
"identifier": {
···
14
"config": {
15
"name": "Lovense Ridge",
16
"id": "c8633234-07a4-4ad9-961d-a4d777b32be8",
17
-
"base-id": "c8633234-07a4-4ad9-961d-a4d777b32be7",
18
"features": [
19
{
20
"feature-type": "Oscillate",
21
"description": "Fucking Machine Oscillation Speed",
22
"output": {
23
-
"Oscillate": {
24
-
"step-range": [
25
0,
26
30
27
],
28
-
"step-limit": [
29
0,
30
30
31
]
32
}
33
},
34
-
"base-id": "56d94863-b321-428b-8b68-bac0197556e1",
35
"id": "56d94863-b321-428b-8b68-bac0197556e2"
36
},
37
{
38
"feature-type": "Battery",
39
"description": "Battery Level",
40
"input": {
41
-
"Battery": {
42
-
"value-range": [
43
[
44
0,
45
100
46
]
47
],
48
-
"input-commands": [
49
"Read"
50
]
51
}
52
},
53
-
"base-id": "b9899daa-7755-4ebb-88b4-13122d12745e",
54
"id": "b9899daa-7755-4ebb-88b4-13122d12745f"
55
}
56
],
57
-
"user-config": {
58
"allow": false,
59
"deny": false,
60
"index": 0
···
3
"major": 4,
4
"minor": 999
5
},
6
+
"user_configs": {
7
"devices": [
8
{
9
"identifier": {
···
14
"config": {
15
"name": "Lovense Ridge",
16
"id": "c8633234-07a4-4ad9-961d-a4d777b32be8",
17
+
"base_id": "c8633234-07a4-4ad9-961d-a4d777b32be7",
18
"features": [
19
{
20
"feature-type": "Oscillate",
21
"description": "Fucking Machine Oscillation Speed",
22
"output": {
23
+
"oscillate": {
24
+
"step_range": [
25
0,
26
30
27
],
28
+
"step_limit": [
29
0,
30
30
31
]
32
}
33
},
34
+
"base_id": "56d94863-b321-428b-8b68-bac0197556e1",
35
"id": "56d94863-b321-428b-8b68-bac0197556e2"
36
},
37
{
38
"feature-type": "Battery",
39
"description": "Battery Level",
40
"input": {
41
+
"battery": {
42
+
"value_range": [
43
[
44
0,
45
100
46
]
47
],
48
+
"input_commands": [
49
"Read"
50
]
51
}
52
},
53
+
"base_id": "b9899daa-7755-4ebb-88b4-13122d12745e",
54
"id": "b9899daa-7755-4ebb-88b4-13122d12745f"
55
}
56
],
57
+
"user_config": {
58
"allow": false,
59
"deny": false,
60
"index": 0
+13
-28
crates/buttplug_tests/tests/util/device_test/device_test_case/config/tcode_linear_and_vibrate_user_config.json
···
3
"major": 4,
4
"minor": 999
5
},
6
-
"user-configs": {
7
"protocols": {
8
"tcode-v03": {
9
"communication": [
···
30
"features": [
31
{
32
"description": "",
33
-
"feature-type": "PositionWithDuration",
34
"output": {
35
-
"PositionWithDuration": {
36
-
"step-range": [
37
0,
38
100
0
0
0
0
39
]
40
}
41
},
···
43
},
44
{
45
"description": "",
46
-
"feature-type": "Vibrate",
47
"output": {
48
-
"Vibrate": {
49
-
"step-range": [
50
0,
51
99
52
]
···
68
},
69
"config": {
70
"id": "6d3f0643-1933-4df6-85ff-5675bf1a3dd4",
71
-
"base-id": "e4384a37-fd37-4b9e-8464-a510dd8410a7",
72
"features": [
73
{
74
-
"output": {
75
-
"PositionWithDuration": {
76
-
"step-limit": [
77
-
0,
78
-
100
79
-
]
80
-
}
81
-
},
82
-
"base-id": "c5e6384e-399b-4c2b-9791-eb48abaf3bf7",
83
"id": "a9e532ff-f72f-4c2f-9ae6-02a6ddcb2d74"
84
},
85
{
86
"description": "",
87
-
"feature-type": "Vibrate",
88
-
"output": {
89
-
"Vibrate": {
90
-
"step-limit": [
91
-
0,
92
-
99
93
-
]
94
-
}
95
-
},
96
-
"base-id": "e4384a37-fd37-4b9e-8464-a510dd8410a7",
97
"id": "10deb5c9-9d44-4dab-abf3-500b7df51e9f"
98
}
99
],
100
-
"user-config": {
101
"allow": false,
102
"deny": false,
103
"index": 0
···
3
"major": 4,
4
"minor": 999
5
},
6
+
"user_configs": {
7
"protocols": {
8
"tcode-v03": {
9
"communication": [
···
30
"features": [
31
{
32
"description": "",
0
33
"output": {
34
+
"position_with_duration": {
35
+
"position": [
36
0,
37
100
38
+
],
39
+
"duration": [
40
+
0,
41
+
100000
42
]
43
}
44
},
···
46
},
47
{
48
"description": "",
0
49
"output": {
50
+
"vibrate": {
51
+
"value": [
52
0,
53
99
54
]
···
70
},
71
"config": {
72
"id": "6d3f0643-1933-4df6-85ff-5675bf1a3dd4",
73
+
"base_id": "e4384a37-fd37-4b9e-8464-a510dd8410a7",
74
"features": [
75
{
76
+
"base_id": "c5e6384e-399b-4c2b-9791-eb48abaf3bf7",
0
0
0
0
0
0
0
0
77
"id": "a9e532ff-f72f-4c2f-9ae6-02a6ddcb2d74"
78
},
79
{
80
"description": "",
81
+
"base_id": "e4384a37-fd37-4b9e-8464-a510dd8410a7",
0
0
0
0
0
0
0
0
0
82
"id": "10deb5c9-9d44-4dab-abf3-500b7df51e9f"
83
}
84
],
85
+
"user_config": {
86
"allow": false,
87
"deny": false,
88
"index": 0
+2
-2
crates/buttplug_tests/tests/util/device_test/device_test_case/test_lovense_ridge_user_config.yaml
···
36
commands:
37
- !Write
38
endpoint: tx
39
-
# "Vibrate:5;"
40
-
data: [86, 105, 98, 114, 97, 116, 101, 58, 53, 59]
41
write_with_response: false
42
- !Messages
43
device_index: 0
···
36
commands:
37
- !Write
38
endpoint: tx
39
+
# "Vibrate:10;"
40
+
data: [86, 105, 98, 114, 97, 116, 101, 58, 49, 48, 59]
41
write_with_response: false
42
- !Messages
43
device_index: 0