A new start
This commit is contained in:
101
packages/buttplug/src/core/Exceptions.ts
Normal file
101
packages/buttplug/src/core/Exceptions.ts
Normal file
@@ -0,0 +1,101 @@
|
||||
/*!
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import * as Messages from "./Messages";
|
||||
import { ButtplugLogger } from "./Logging";
|
||||
|
||||
export class ButtplugError extends Error {
|
||||
public get ErrorClass(): Messages.ErrorClass {
|
||||
return this.errorClass;
|
||||
}
|
||||
|
||||
public get InnerError(): Error | undefined {
|
||||
return this.innerError;
|
||||
}
|
||||
|
||||
public get Id(): number | undefined {
|
||||
return this.messageId;
|
||||
}
|
||||
|
||||
public get ErrorMessage(): Messages.ButtplugMessage {
|
||||
return new Messages.Error(this.message, this.ErrorClass, this.Id);
|
||||
}
|
||||
|
||||
public static LogAndError<T extends ButtplugError>(
|
||||
constructor: new (str: string, num: number) => T,
|
||||
logger: ButtplugLogger,
|
||||
message: string,
|
||||
id: number = Messages.SYSTEM_MESSAGE_ID,
|
||||
): T {
|
||||
logger.Error(message);
|
||||
return new constructor(message, id);
|
||||
}
|
||||
|
||||
public static FromError(error: Messages.Error) {
|
||||
switch (error.ErrorCode) {
|
||||
case Messages.ErrorClass.ERROR_DEVICE:
|
||||
return new ButtplugDeviceError(error.ErrorMessage, error.Id);
|
||||
case Messages.ErrorClass.ERROR_INIT:
|
||||
return new ButtplugInitError(error.ErrorMessage, error.Id);
|
||||
case Messages.ErrorClass.ERROR_UNKNOWN:
|
||||
return new ButtplugUnknownError(error.ErrorMessage, error.Id);
|
||||
case Messages.ErrorClass.ERROR_PING:
|
||||
return new ButtplugPingError(error.ErrorMessage, error.Id);
|
||||
case Messages.ErrorClass.ERROR_MSG:
|
||||
return new ButtplugMessageError(error.ErrorMessage, error.Id);
|
||||
default:
|
||||
throw new Error(`Message type ${error.ErrorCode} not handled`);
|
||||
}
|
||||
}
|
||||
|
||||
public errorClass: Messages.ErrorClass = Messages.ErrorClass.ERROR_UNKNOWN;
|
||||
public innerError: Error | undefined;
|
||||
public messageId: number | undefined;
|
||||
|
||||
protected constructor(
|
||||
message: string,
|
||||
errorClass: Messages.ErrorClass,
|
||||
id: number = Messages.SYSTEM_MESSAGE_ID,
|
||||
inner?: Error,
|
||||
) {
|
||||
super(message);
|
||||
this.errorClass = errorClass;
|
||||
this.innerError = inner;
|
||||
this.messageId = id;
|
||||
}
|
||||
}
|
||||
|
||||
export class ButtplugInitError extends ButtplugError {
|
||||
public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) {
|
||||
super(message, Messages.ErrorClass.ERROR_INIT, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ButtplugDeviceError extends ButtplugError {
|
||||
public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) {
|
||||
super(message, Messages.ErrorClass.ERROR_DEVICE, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ButtplugMessageError extends ButtplugError {
|
||||
public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) {
|
||||
super(message, Messages.ErrorClass.ERROR_MSG, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ButtplugPingError extends ButtplugError {
|
||||
public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) {
|
||||
super(message, Messages.ErrorClass.ERROR_PING, id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ButtplugUnknownError extends ButtplugError {
|
||||
public constructor(message: string, id: number = Messages.SYSTEM_MESSAGE_ID) {
|
||||
super(message, Messages.ErrorClass.ERROR_UNKNOWN, id);
|
||||
}
|
||||
}
|
||||
195
packages/buttplug/src/core/Logging.ts
Normal file
195
packages/buttplug/src/core/Logging.ts
Normal file
@@ -0,0 +1,195 @@
|
||||
/*!
|
||||
* 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.
|
||||
*/
|
||||
|
||||
import { EventEmitter } from "eventemitter3";
|
||||
|
||||
export enum ButtplugLogLevel {
|
||||
Off,
|
||||
Error,
|
||||
Warn,
|
||||
Info,
|
||||
Debug,
|
||||
Trace,
|
||||
}
|
||||
|
||||
/**
|
||||
* Representation of log messages for the internal logging utility.
|
||||
*/
|
||||
export class LogMessage {
|
||||
/** Timestamp for the log message */
|
||||
private timestamp: string;
|
||||
|
||||
/** Log Message */
|
||||
private logMessage: string;
|
||||
|
||||
/** Log Level */
|
||||
private logLevel: ButtplugLogLevel;
|
||||
|
||||
/**
|
||||
* @param logMessage Log message.
|
||||
* @param logLevel: Log severity level.
|
||||
*/
|
||||
public constructor(logMessage: string, logLevel: ButtplugLogLevel) {
|
||||
const a = new Date();
|
||||
const hour = a.getHours();
|
||||
const min = a.getMinutes();
|
||||
const sec = a.getSeconds();
|
||||
this.timestamp = `${hour}:${min}:${sec}`;
|
||||
this.logMessage = logMessage;
|
||||
this.logLevel = logLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the log message.
|
||||
*/
|
||||
public get Message() {
|
||||
return this.logMessage;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the log message level.
|
||||
*/
|
||||
public get LogLevel() {
|
||||
return this.logLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the log message timestamp.
|
||||
*/
|
||||
public get Timestamp() {
|
||||
return this.timestamp;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a formatted string with timestamp, level, and message.
|
||||
*/
|
||||
public get FormattedMessage() {
|
||||
return `${ButtplugLogLevel[this.logLevel]} : ${this.timestamp} : ${this.logMessage}`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Simple, global logging utility for the Buttplug client and server. Keeps an
|
||||
* internal static reference to an instance of itself (singleton pattern,
|
||||
* basically), and allows message logging throughout the module.
|
||||
*/
|
||||
export class ButtplugLogger extends EventEmitter {
|
||||
/** Singleton instance for the logger */
|
||||
protected static sLogger: ButtplugLogger | undefined = undefined;
|
||||
/** Sets maximum log level to log to console */
|
||||
protected maximumConsoleLogLevel: ButtplugLogLevel = ButtplugLogLevel.Off;
|
||||
/** Sets maximum log level for all log messages */
|
||||
protected maximumEventLogLevel: ButtplugLogLevel = ButtplugLogLevel.Off;
|
||||
|
||||
/**
|
||||
* Returns the stored static instance of the logger, creating one if it
|
||||
* doesn't currently exist.
|
||||
*/
|
||||
public static get Logger(): ButtplugLogger {
|
||||
if (ButtplugLogger.sLogger === undefined) {
|
||||
ButtplugLogger.sLogger = new ButtplugLogger();
|
||||
}
|
||||
return this.sLogger!;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor. Can only be called internally since we regulate ButtplugLogger
|
||||
* ownership.
|
||||
*/
|
||||
protected constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the maximum log level to output to console.
|
||||
*/
|
||||
public get MaximumConsoleLogLevel() {
|
||||
return this.maximumConsoleLogLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the maximum log level to output to console.
|
||||
*/
|
||||
public set MaximumConsoleLogLevel(buttplugLogLevel: ButtplugLogLevel) {
|
||||
this.maximumConsoleLogLevel = buttplugLogLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the global maximum log level
|
||||
*/
|
||||
public get MaximumEventLogLevel() {
|
||||
return this.maximumEventLogLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the global maximum log level
|
||||
*/
|
||||
public set MaximumEventLogLevel(logLevel: ButtplugLogLevel) {
|
||||
this.maximumEventLogLevel = logLevel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Log new message at Error level.
|
||||
*/
|
||||
public Error(msg: string) {
|
||||
this.AddLogMessage(msg, ButtplugLogLevel.Error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log new message at Warn level.
|
||||
*/
|
||||
public Warn(msg: string) {
|
||||
this.AddLogMessage(msg, ButtplugLogLevel.Warn);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log new message at Info level.
|
||||
*/
|
||||
public Info(msg: string) {
|
||||
this.AddLogMessage(msg, ButtplugLogLevel.Info);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log new message at Debug level.
|
||||
*/
|
||||
public Debug(msg: string) {
|
||||
this.AddLogMessage(msg, ButtplugLogLevel.Debug);
|
||||
}
|
||||
|
||||
/**
|
||||
* Log new message at Trace level.
|
||||
*/
|
||||
public Trace(msg: string) {
|
||||
this.AddLogMessage(msg, ButtplugLogLevel.Trace);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks to see if message should be logged, and if so, adds message to the
|
||||
* log buffer. May also print message and emit event.
|
||||
*/
|
||||
protected AddLogMessage(msg: string, level: ButtplugLogLevel) {
|
||||
// If nothing wants the log message we have, ignore it.
|
||||
if (
|
||||
level > this.maximumEventLogLevel &&
|
||||
level > this.maximumConsoleLogLevel
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const logMsg = new LogMessage(msg, level);
|
||||
// Clients and console logging may have different needs. For instance, it
|
||||
// could be that the client requests trace level, while all we want in the
|
||||
// console is info level. This makes sure the client can't also spam the
|
||||
// console.
|
||||
if (level <= this.maximumConsoleLogLevel) {
|
||||
console.log(logMsg.FormattedMessage);
|
||||
}
|
||||
if (level <= this.maximumEventLogLevel) {
|
||||
this.emit("log", logMsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
48
packages/buttplug/src/core/MessageUtils.ts
Normal file
48
packages/buttplug/src/core/MessageUtils.ts
Normal file
@@ -0,0 +1,48 @@
|
||||
/*!
|
||||
* 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.
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
import { plainToInstance } from "class-transformer";
|
||||
import * as Messages from "./Messages";
|
||||
|
||||
function getMessageClass(
|
||||
type: string,
|
||||
): (new (...args: unknown[]) => Messages.ButtplugMessage) | null {
|
||||
for (const value of Object.values(Messages)) {
|
||||
if (typeof value === "function" && "Name" in value && value.Name === type) {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
export function getMessageClassFromMessage(
|
||||
msg: Messages.ButtplugMessage,
|
||||
): (new (...args: unknown[]) => Messages.ButtplugMessage) | null {
|
||||
// Making the bold assumption all message classes have the Name static. Should define a
|
||||
// requirement for this in the abstract class.
|
||||
return getMessageClass(Object.getPrototypeOf(msg).constructor.Name);
|
||||
}
|
||||
|
||||
export function fromJSON(str): Messages.ButtplugMessage[] {
|
||||
const msgarray: object[] = JSON.parse(str);
|
||||
const msgs: Messages.ButtplugMessage[] = [];
|
||||
for (const x of Array.from(msgarray)) {
|
||||
const type = Object.getOwnPropertyNames(x)[0];
|
||||
const cls = getMessageClass(type);
|
||||
if (cls) {
|
||||
const msg = plainToInstance<Messages.ButtplugMessage, unknown>(
|
||||
cls,
|
||||
x[type],
|
||||
);
|
||||
msg.update();
|
||||
msgs.push(msg);
|
||||
}
|
||||
}
|
||||
return msgs;
|
||||
}
|
||||
491
packages/buttplug/src/core/Messages.ts
Normal file
491
packages/buttplug/src/core/Messages.ts
Normal file
@@ -0,0 +1,491 @@
|
||||
/*!
|
||||
* 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 { instanceToPlain, Type } from "class-transformer";
|
||||
import "reflect-metadata";
|
||||
|
||||
export const SYSTEM_MESSAGE_ID = 0;
|
||||
export const DEFAULT_MESSAGE_ID = 1;
|
||||
export const MAX_ID = 4294967295;
|
||||
export const MESSAGE_SPEC_VERSION = 3;
|
||||
|
||||
export class MessageAttributes {
|
||||
public ScalarCmd?: Array<GenericDeviceMessageAttributes>;
|
||||
public RotateCmd?: Array<GenericDeviceMessageAttributes>;
|
||||
public LinearCmd?: Array<GenericDeviceMessageAttributes>;
|
||||
public RawReadCmd?: RawDeviceMessageAttributes;
|
||||
public RawWriteCmd?: RawDeviceMessageAttributes;
|
||||
public RawSubscribeCmd?: RawDeviceMessageAttributes;
|
||||
public SensorReadCmd?: Array<SensorDeviceMessageAttributes>;
|
||||
public SensorSubscribeCmd?: Array<SensorDeviceMessageAttributes>;
|
||||
public StopDeviceCmd: {};
|
||||
|
||||
constructor(data: Partial<MessageAttributes>) {
|
||||
Object.assign(this, data);
|
||||
}
|
||||
|
||||
public update() {
|
||||
this.ScalarCmd?.forEach((x, i) => (x.Index = i));
|
||||
this.RotateCmd?.forEach((x, i) => (x.Index = i));
|
||||
this.LinearCmd?.forEach((x, i) => (x.Index = i));
|
||||
this.SensorReadCmd?.forEach((x, i) => (x.Index = i));
|
||||
this.SensorSubscribeCmd?.forEach((x, i) => (x.Index = i));
|
||||
}
|
||||
}
|
||||
|
||||
export enum ActuatorType {
|
||||
Unknown = "Unknown",
|
||||
Vibrate = "Vibrate",
|
||||
Rotate = "Rotate",
|
||||
Oscillate = "Oscillate",
|
||||
Constrict = "Constrict",
|
||||
Inflate = "Inflate",
|
||||
Position = "Position",
|
||||
}
|
||||
|
||||
export enum SensorType {
|
||||
Unknown = "Unknown",
|
||||
Battery = "Battery",
|
||||
RSSI = "RSSI",
|
||||
Button = "Button",
|
||||
Pressure = "Pressure",
|
||||
// Temperature,
|
||||
// Accelerometer,
|
||||
// Gyro,
|
||||
}
|
||||
|
||||
export class GenericDeviceMessageAttributes {
|
||||
public FeatureDescriptor: string;
|
||||
public ActuatorType: ActuatorType;
|
||||
public StepCount: number;
|
||||
public Index = 0;
|
||||
constructor(data: Partial<GenericDeviceMessageAttributes>) {
|
||||
Object.assign(this, data);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawDeviceMessageAttributes {
|
||||
constructor(public Endpoints: Array<string>) {}
|
||||
}
|
||||
|
||||
export class SensorDeviceMessageAttributes {
|
||||
public FeatureDescriptor: string;
|
||||
public SensorType: SensorType;
|
||||
public StepRange: Array<number>;
|
||||
public Index = 0;
|
||||
constructor(data: Partial<GenericDeviceMessageAttributes>) {
|
||||
Object.assign(this, data);
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class ButtplugMessage {
|
||||
constructor(public Id: number) {}
|
||||
|
||||
// tslint:disable-next-line:ban-types
|
||||
public get Type(): Function {
|
||||
return this.constructor;
|
||||
}
|
||||
|
||||
public toJSON(): string {
|
||||
return JSON.stringify(this.toProtocolFormat());
|
||||
}
|
||||
|
||||
public toProtocolFormat(): object {
|
||||
const jsonObj = {};
|
||||
jsonObj[(this.constructor as unknown as { Name: string }).Name] =
|
||||
instanceToPlain(this);
|
||||
return jsonObj;
|
||||
}
|
||||
|
||||
public update() {}
|
||||
}
|
||||
|
||||
export abstract class ButtplugDeviceMessage extends ButtplugMessage {
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Id: number,
|
||||
) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export abstract class ButtplugSystemMessage extends ButtplugMessage {
|
||||
constructor(public Id: number = SYSTEM_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class Ok extends ButtplugSystemMessage {
|
||||
static Name = "Ok";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class Ping extends ButtplugMessage {
|
||||
static Name = "Ping";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export enum ErrorClass {
|
||||
ERROR_UNKNOWN,
|
||||
ERROR_INIT,
|
||||
ERROR_PING,
|
||||
ERROR_MSG,
|
||||
ERROR_DEVICE,
|
||||
}
|
||||
|
||||
export class Error extends ButtplugMessage {
|
||||
static Name = "Error";
|
||||
|
||||
constructor(
|
||||
public ErrorMessage: string,
|
||||
public ErrorCode: ErrorClass = ErrorClass.ERROR_UNKNOWN,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(Id);
|
||||
}
|
||||
|
||||
get Schemversion() {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
export class DeviceInfo {
|
||||
public DeviceIndex: number;
|
||||
public DeviceName: string;
|
||||
@Type(() => MessageAttributes)
|
||||
public DeviceMessages: MessageAttributes;
|
||||
public DeviceDisplayName?: string;
|
||||
public DeviceMessageTimingGap?: number;
|
||||
|
||||
constructor(data: Partial<DeviceInfo>) {
|
||||
Object.assign(this, data);
|
||||
}
|
||||
}
|
||||
|
||||
export class DeviceList extends ButtplugMessage {
|
||||
static Name = "DeviceList";
|
||||
|
||||
@Type(() => DeviceInfo)
|
||||
public Devices: DeviceInfo[];
|
||||
public Id: number;
|
||||
|
||||
constructor(devices: DeviceInfo[], id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(id);
|
||||
this.Devices = devices;
|
||||
this.Id = id;
|
||||
}
|
||||
|
||||
public update() {
|
||||
for (const device of this.Devices) {
|
||||
device.DeviceMessages.update();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export class DeviceAdded extends ButtplugSystemMessage {
|
||||
static Name = "DeviceAdded";
|
||||
|
||||
public DeviceIndex: number;
|
||||
public DeviceName: string;
|
||||
@Type(() => MessageAttributes)
|
||||
public DeviceMessages: MessageAttributes;
|
||||
public DeviceDisplayName?: string;
|
||||
public DeviceMessageTimingGap?: number;
|
||||
|
||||
constructor(data: Partial<DeviceAdded>) {
|
||||
super();
|
||||
Object.assign(this, data);
|
||||
}
|
||||
|
||||
public update() {
|
||||
this.DeviceMessages.update();
|
||||
}
|
||||
}
|
||||
|
||||
export class DeviceRemoved extends ButtplugSystemMessage {
|
||||
static Name = "DeviceRemoved";
|
||||
|
||||
constructor(public DeviceIndex: number) {
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
export class RequestDeviceList extends ButtplugMessage {
|
||||
static Name = "RequestDeviceList";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class StartScanning extends ButtplugMessage {
|
||||
static Name = "StartScanning";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class StopScanning extends ButtplugMessage {
|
||||
static Name = "StopScanning";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ScanningFinished extends ButtplugSystemMessage {
|
||||
static Name = "ScanningFinished";
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
export class RequestServerInfo extends ButtplugMessage {
|
||||
static Name = "RequestServerInfo";
|
||||
|
||||
constructor(
|
||||
public ClientName: string,
|
||||
public MessageVersion: number = 0,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class ServerInfo extends ButtplugSystemMessage {
|
||||
static Name = "ServerInfo";
|
||||
|
||||
constructor(
|
||||
public MessageVersion: number,
|
||||
public MaxPingTime: number,
|
||||
public ServerName: string,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
export class StopDeviceCmd extends ButtplugDeviceMessage {
|
||||
static Name = "StopDeviceCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number = -1,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class StopAllDevices extends ButtplugMessage {
|
||||
static Name = "StopAllDevices";
|
||||
|
||||
constructor(public Id: number = DEFAULT_MESSAGE_ID) {
|
||||
super(Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class GenericMessageSubcommand {
|
||||
protected constructor(public Index: number) {}
|
||||
}
|
||||
|
||||
export class ScalarSubcommand extends GenericMessageSubcommand {
|
||||
constructor(
|
||||
Index: number,
|
||||
public Scalar: number,
|
||||
public ActuatorType: ActuatorType,
|
||||
) {
|
||||
super(Index);
|
||||
}
|
||||
}
|
||||
|
||||
export class ScalarCmd extends ButtplugDeviceMessage {
|
||||
static Name = "ScalarCmd";
|
||||
|
||||
constructor(
|
||||
public Scalars: ScalarSubcommand[],
|
||||
public DeviceIndex: number = -1,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RotateSubcommand extends GenericMessageSubcommand {
|
||||
constructor(
|
||||
Index: number,
|
||||
public Speed: number,
|
||||
public Clockwise: boolean,
|
||||
) {
|
||||
super(Index);
|
||||
}
|
||||
}
|
||||
|
||||
export class RotateCmd extends ButtplugDeviceMessage {
|
||||
static Name = "RotateCmd";
|
||||
|
||||
public static Create(
|
||||
deviceIndex: number,
|
||||
commands: [number, boolean][],
|
||||
): RotateCmd {
|
||||
const cmdList: RotateSubcommand[] = new Array<RotateSubcommand>();
|
||||
|
||||
let i = 0;
|
||||
for (const [speed, clockwise] of commands) {
|
||||
cmdList.push(new RotateSubcommand(i, speed, clockwise));
|
||||
++i;
|
||||
}
|
||||
|
||||
return new RotateCmd(cmdList, deviceIndex);
|
||||
}
|
||||
constructor(
|
||||
public Rotations: RotateSubcommand[],
|
||||
public DeviceIndex: number = -1,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class VectorSubcommand extends GenericMessageSubcommand {
|
||||
constructor(
|
||||
Index: number,
|
||||
public Position: number,
|
||||
public Duration: number,
|
||||
) {
|
||||
super(Index);
|
||||
}
|
||||
}
|
||||
|
||||
export class LinearCmd extends ButtplugDeviceMessage {
|
||||
static Name = "LinearCmd";
|
||||
|
||||
public static Create(
|
||||
deviceIndex: number,
|
||||
commands: [number, number][],
|
||||
): LinearCmd {
|
||||
const cmdList: VectorSubcommand[] = new Array<VectorSubcommand>();
|
||||
|
||||
let i = 0;
|
||||
for (const cmd of commands) {
|
||||
cmdList.push(new VectorSubcommand(i, cmd[0], cmd[1]));
|
||||
++i;
|
||||
}
|
||||
|
||||
return new LinearCmd(cmdList, deviceIndex);
|
||||
}
|
||||
constructor(
|
||||
public Vectors: VectorSubcommand[],
|
||||
public DeviceIndex: number = -1,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class SensorReadCmd extends ButtplugDeviceMessage {
|
||||
static Name = "SensorReadCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public SensorIndex: number,
|
||||
public SensorType: SensorType,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class SensorReading extends ButtplugDeviceMessage {
|
||||
static Name = "SensorReading";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public SensorIndex: number,
|
||||
public SensorType: SensorType,
|
||||
public Data: number[],
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawReadCmd extends ButtplugDeviceMessage {
|
||||
static Name = "RawReadCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Endpoint: string,
|
||||
public ExpectedLength: number,
|
||||
public Timeout: number,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawWriteCmd extends ButtplugDeviceMessage {
|
||||
static Name = "RawWriteCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Endpoint: string,
|
||||
public Data: Uint8Array,
|
||||
public WriteWithResponse: boolean,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawSubscribeCmd extends ButtplugDeviceMessage {
|
||||
static Name = "RawSubscribeCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Endpoint: string,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawUnsubscribeCmd extends ButtplugDeviceMessage {
|
||||
static Name = "RawUnsubscribeCmd";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Endpoint: string,
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
|
||||
export class RawReading extends ButtplugDeviceMessage {
|
||||
static Name = "RawReading";
|
||||
|
||||
constructor(
|
||||
public DeviceIndex: number,
|
||||
public Endpoint: string,
|
||||
public Data: number[],
|
||||
public Id: number = DEFAULT_MESSAGE_ID,
|
||||
) {
|
||||
super(DeviceIndex, Id);
|
||||
}
|
||||
}
|
||||
4
packages/buttplug/src/core/index.d.ts
vendored
Normal file
4
packages/buttplug/src/core/index.d.ts
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
declare module "*.json" {
|
||||
const content: string;
|
||||
export default content;
|
||||
}
|
||||
Reference in New Issue
Block a user