/*! * Buttplug JS Source Code File - Visit https://buttplug.io for more info about * the project. Licensed under the BSD 3-Clause license. See LICENSE file in the * project root for full license information. * * @copyright Copyright (c) Nonpolynomial Labs LLC. All rights reserved. */ // tslint:disable:max-classes-per-file 'use strict'; import { ButtplugMessageError } from './Exceptions'; export const SYSTEM_MESSAGE_ID = 0; export const DEFAULT_MESSAGE_ID = 1; export const MAX_ID = 4294967295; export const MESSAGE_SPEC_VERSION_MAJOR = 4; export const MESSAGE_SPEC_VERSION_MINOR = 0; // Base message interfaces export interface ButtplugMessage { Ok?: Ok; Ping?: Ping; Error?: Error; RequestServerInfo?: RequestServerInfo; ServerInfo?: ServerInfo; RequestDeviceList?: RequestDeviceList; StartScanning?: StartScanning; StopScanning?: StopScanning; ScanningFinished?: ScanningFinished; StopCmd?: StopCmd; InputCmd?: InputCmd; InputReading?: InputReading; OutputCmd?: OutputCmd; DeviceList?: DeviceList; } export function msgId(msg: ButtplugMessage): number { for (let [_, entry] of Object.entries(msg)) { if (entry != undefined) { return entry.Id; } } throw new ButtplugMessageError(`Message ${msg} does not have an ID.`); } export function setMsgId(msg: ButtplugMessage, id: number) { for (let [_, entry] of Object.entries(msg)) { if (entry != undefined) { entry.Id = id; return; } } throw new ButtplugMessageError(`Message ${msg} does not have an ID.`); } export interface Ok { Id: number | undefined; } export interface Ping { Id: number | undefined; } export enum ErrorClass { ERROR_UNKNOWN, ERROR_INIT, ERROR_PING, ERROR_MSG, ERROR_DEVICE, } export interface Error { ErrorMessage: string; ErrorCode: ErrorClass; Id: number | undefined; } export interface RequestDeviceList { Id: number | undefined; } export interface StartScanning { Id: number | undefined; } export interface StopScanning { Id: number | undefined; } export interface StopAllDevices { Id: number | undefined; } export interface ScanningFinished { Id: number | undefined; } export interface RequestServerInfo { ClientName: string; ProtocolVersionMajor: number; ProtocolVersionMinor: number; Id: number | undefined; } export interface ServerInfo { MaxPingTime: number; ServerName: string; ProtocolVersionMajor: number; ProtocolVersionMinor: number; Id: number | undefined; } export interface DeviceFeature { FeatureDescriptor: string; Output: { [key: string]: DeviceFeatureOutput }; Input: { [key: string]: DeviceFeatureInput }; FeatureIndex: number; } export interface DeviceInfo { DeviceIndex: number; DeviceName: string; DeviceFeatures: { [key: number]: DeviceFeature }; DeviceDisplayName?: string; DeviceMessageTimingGap?: number; } export interface DeviceList { Devices: { [key: number]: DeviceInfo }; Id: number | undefined; } export enum OutputType { Unknown = 'Unknown', Vibrate = 'Vibrate', Rotate = 'Rotate', Oscillate = 'Oscillate', Constrict = 'Constrict', Inflate = 'Inflate', Position = 'Position', HwPositionWithDuration = 'HwPositionWithDuration', Temperature = 'Temperature', Spray = 'Spray', Led = 'Led', } export enum InputType { Unknown = 'Unknown', Battery = 'Battery', RSSI = 'RSSI', Button = 'Button', Pressure = 'Pressure', // Temperature, // Accelerometer, // Gyro, } export enum InputCommandType { Read = 'Read', Subscribe = 'Subscribe', Unsubscribe = 'Unsubscribe', } export interface DeviceFeatureInput { Value: number[]; Command: InputCommandType[]; } export interface DeviceFeatureOutput { Value: number; Duration?: number; } export interface OutputCmd { DeviceIndex: number; FeatureIndex: number; Command: { [key: string]: DeviceFeatureOutput }; Id: number | undefined; } // Device Input Commands export interface InputCmd { DeviceIndex: number; FeatureIndex: number; Type: InputType; Command: InputCommandType; Id: number | undefined; } export interface InputValue { Value: number; } export interface InputReading { DeviceIndex: number; FeatureIndex: number; Reading: { [key: string]: InputValue }; Id: number | undefined; } export interface StopCmd { Id: number | undefined; DeviceIndex: number | undefined; FeatureIndex: number | undefined; Inputs: boolean | undefined; Outputs: boolean | undefined; }