Buttplug sex toy control library

chore: Convert all config file - to _

+1104 -625
+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" } 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" } 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" } 62 }, 63 "additionalProperties": false, 64 "required": [ ··· 67 }, 68 "SystemIdDeviceIndexMessage": { 69 "properties": { 70 - "Id": { "$ref": "#/components/SystemId" }, 71 - "DeviceIndex": { "$ref": "#/components/DeviceIndex" } 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" } 83 }, 84 "additionalProperties": false, 85 "required": [ ··· 109 "FeatureDescriptor": { 110 "type": "string" 111 }, 112 - "StepCount": { "$ref": "#/components/StepCountV3" }, 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" } 127 }, 128 "additionalProperties": false, 129 "minProperties": 0 ··· 132 "description": "Attributes for device messages.", 133 "type": "object", 134 "properties": { 135 - "FeatureCount": { "$ref": "#/components/FeatureCount" } 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" }, 194 "ScalarCmd": { 195 "type": "array", 196 "items": { 197 - "$ref": "#/components/GenericMessageAttributesV3" }, 198 - "minItems": 1 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" } 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" } 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" } 264 }, 265 "additionalProperties": false 266 }, ··· 269 "type": "array", 270 "items": { 271 "type": "string", 272 - "enum": ["FleshlightLaunchFW12Cmd", "SingleMotorVibrateCmd", "KiirooCmd", "LovenseCmd", "VorzeA10CycloneCmd"] 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 - } 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" }, 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" } 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" }, 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" }, 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" }, 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" }, 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" }, 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" }, 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" } 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" } 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" }, 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" } 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" }, 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" } 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" } 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" }, 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" } 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" } 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" } 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" }, 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" } 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" }, 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." 926 }, 927 - "Data": { 928 - "description": "Raw byte string to send to device.", 929 - "type": "array", 930 - "minItems": 1, 931 - "items": { 932 "type": "integer", 933 - "minimum": 0, 934 - "maximum": 255 935 } 936 }, 937 - "WriteWithResponse": { 938 - "type": "boolean", 939 - "description": "If true, BLE writes will use WriteWithResponse. Value ignored for all other types." 940 - } 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 - } 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 - } 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 - } 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" }, 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" } 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" } 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" }, 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" }, 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" }, 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" }, 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" }, 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" }, 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" } 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" } 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" } 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" } ] 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" }, 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" }, 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" }, 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" }, 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" }, 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" }, 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" }, 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" }, 1562 "LogLevel": { 1563 "description": "Maximum level of log message to receive.", 1564 - "enum": [ "Off", "Fatal", "Error", "Warn", "Info", "Debug", "Trace" ] 1565 } 1566 }, 1567 "additionalProperties": false, ··· 1574 "type": "object", 1575 "description": "Log message from the server.", 1576 "properties": { 1577 - "Id": { "$ref": "#/components/SystemId" }, 1578 "LogLevel": { 1579 "description": "Log level of message.", 1580 - "enum": [ "Off", "Fatal", "Error", "Warn", "Info", "Debug", "Trace" ] 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" } ] 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" } ] 1603 }, 1604 "StartScanning": { 1605 "type": "object", 1606 "description": "Request for the server to start scanning for new devices.", 1607 - "anyOf": [ { "$ref": "#/components/ClientIdMessage" } ] 1608 }, 1609 "StopScanning": { 1610 "type": "object", 1611 "description": "Request for the server to stop scanning for new devices.", 1612 - "anyOf": [ { "$ref": "#/components/ClientIdMessage" } ] 1613 }, 1614 "ScanningFinished": { 1615 "type": "object", 1616 "description": "Server notification to client that scanning has ended.", 1617 - "anyOf": [ { "$ref": "#/components/SystemIdMessage" } ] 1618 }, 1619 "Ok": { 1620 "type": "object", 1621 "description": "Signifies successful processing of the message indicated by the id.", 1622 - "anyOf": [ { "$ref": "#/components/ClientIdMessage" } ] 1623 }, 1624 "Ping": { 1625 "type": "object", 1626 "description": "Connection keep-alive message.", 1627 - "anyOf": [ { "$ref": "#/components/ClientIdMessage" } ] 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" }, 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" }, 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" } 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" } 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" } 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" } 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" } 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" } 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 }, 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 + } 409 } 410 }, 411 "Input": { ··· 429 ] 430 } 431 } 432 } 433 }, 434 "required": [ 435 "FeatureDescription", 436 + "FeatureIndex" 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 }, 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 + } 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.", 1230 "type": "integer", 1231 + "minimum": 0 1232 } 1233 }, 1234 + "additionalProperties": false, 1235 + "required": [ 1236 + "Id", 1237 + "MessageVersion", 1238 + "MaxPingTime", 1239 + "ServerName" 1240 + ] 1241 + } 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" 275 }, 276 "output": { 277 "type": "object", ··· 319 } 320 } 321 } 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( 60 default, 61 skip_serializing_if = "Option::is_none" 62 )] ··· 72 index: u32, 73 #[getset(get_copy = "pub")] 74 #[serde( 75 default, 76 skip_serializing_if = "Option::is_none" 77 )] ··· 83 #[getset(get_copy = "pub")] 84 id: Uuid, 85 #[getset(get_copy = "pub")] 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")] 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 { 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 { 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 { 216 "description": "Test Speed", 217 "actuator": { 218 "step-range": [ ··· 224 } 225 }, 226 { 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", 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" 31 } 32 ], 33 - "user-config": { 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", 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 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": "", 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": "", 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", 77 "id": "a9e532ff-f72f-4c2f-9ae6-02a6ddcb2d74" 78 }, 79 { 80 "description": "", 81 + "base_id": "e4384a37-fd37-4b9e-8464-a510dd8410a7", 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