diff --git a/src/consts.ts b/src/consts.ts index c61a680..638cfe3 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -18,6 +18,7 @@ export enum HubType { DUPLO_TRAIN_BASE = 5, TECHNIC_MEDIUM_HUB = 6, MARIO = 7, + TECHNIC_SMALL_HUB = 8, } @@ -85,6 +86,8 @@ export enum DeviceType { TECHNIC_COLOR_SENSOR = 61, // Spike Prime TECHNIC_DISTANCE_SENSOR = 62, // Spike Prime TECHNIC_FORCE_SENSOR = 63, // Spike Prime + TECHNIC_3X3_COLOR_LIGHT_MATRIX = 64, // Spike Essential + TECHNIC_SMALL_ANGULAR_MOTOR = 65, // Spike Essential MARIO_ACCELEROMETER = 71, MARIO_BARCODE_SENSOR = 73, MARIO_PANTS_SENSOR = 74, @@ -184,7 +187,8 @@ export enum BLEManufacturerData { HUB_ID = 65, REMOTE_CONTROL_ID = 66, MARIO_ID = 67, - TECHNIC_MEDIUM_HUB = 128 + TECHNIC_MEDIUM_HUB_ID = 128, + TECHNIC_SMALL_HUB_ID = 131 } diff --git a/src/devices/technicsmallangularmotor.ts b/src/devices/technicsmallangularmotor.ts new file mode 100644 index 0000000..356cfe1 --- /dev/null +++ b/src/devices/technicsmallangularmotor.ts @@ -0,0 +1,17 @@ +import { AbsoluteMotor } from "./absolutemotor"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +/** + * @class TechnicSmallAngularMotor + * @extends AbsoluteMotor + */ +export class TechnicSmallAngularMotor extends AbsoluteMotor { + + constructor (hub: IDeviceInterface, portId: number, modeMap: {[event: string]: number} = {}, type: Consts.DeviceType = Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR) { + super(hub, portId, {}, type); + } + +} diff --git a/src/hubs/basehub.ts b/src/hubs/basehub.ts index 38e21b8..02de745 100644 --- a/src/hubs/basehub.ts +++ b/src/hubs/basehub.ts @@ -28,6 +28,7 @@ import { TechnicDistanceSensor } from "../devices/technicdistancesensor"; import { TechnicForceSensor } from "../devices/technicforcesensor"; import { TechnicLargeAngularMotor } from "../devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "../devices/techniclargelinearmotor"; +import { TechnicSmallAngularMotor } from "../devices/technicsmallangularmotor"; import { TechnicMediumAngularMotor } from "../devices/technicmediumangularmotor"; import { TechnicMediumHubAccelerometerSensor } from "../devices/technicmediumhubaccelerometersensor"; import { TechnicMediumHubGyroSensor } from "../devices/technicmediumhubgyrosensor"; @@ -407,6 +408,7 @@ export class BaseHub extends EventEmitter { [Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR]: TechnicMediumHubGyroSensor, [Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER]: TechnicMediumHubAccelerometerSensor, [Consts.DeviceType.MEDIUM_LINEAR_MOTOR]: MediumLinearMotor, + [Consts.DeviceType.TECHNIC_SMALL_ANGULAR_MOTOR]: TechnicSmallAngularMotor, [Consts.DeviceType.TECHNIC_MEDIUM_ANGULAR_MOTOR]: TechnicMediumAngularMotor, [Consts.DeviceType.TECHNIC_LARGE_ANGULAR_MOTOR]: TechnicLargeAngularMotor, [Consts.DeviceType.TECHNIC_LARGE_LINEAR_MOTOR]: TechnicLargeLinearMotor, diff --git a/src/hubs/technicmediumhub.ts b/src/hubs/technicmediumhub.ts index 8727d27..6a8f6ef 100644 --- a/src/hubs/technicmediumhub.ts +++ b/src/hubs/technicmediumhub.ts @@ -26,7 +26,7 @@ export class TechnicMediumHub extends LPF2Hub { peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, "")) >= 0 && peripheral.advertisement.manufacturerData && peripheral.advertisement.manufacturerData.length > 3 && - peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB + peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID ); } diff --git a/src/hubs/technicsmallhub.ts b/src/hubs/technicsmallhub.ts new file mode 100644 index 0000000..b90fdf3 --- /dev/null +++ b/src/hubs/technicsmallhub.ts @@ -0,0 +1,57 @@ +import { Peripheral } from "@abandonware/noble"; +import compareVersion from "compare-versions"; + +import { IBLEAbstraction } from "../interfaces"; + +import { LPF2Hub } from "./lpf2hub"; + +import * as Consts from "../consts"; + +import Debug = require("debug"); +const debug = Debug("hub"); + + +/** + * The TechnicSmallHub is emitted if the discovered device is a Technic Small Hub. + * @class Hub + * @extends LPF2Hub + * @extends BaseHub + */ +export class TechnicSmallHub extends LPF2Hub { + + + public static IsTechnicSmallHub (peripheral: Peripheral) { + return ( + peripheral.advertisement && + peripheral.advertisement.serviceUuids && + peripheral.advertisement.serviceUuids.indexOf(Consts.BLEService.LPF2_HUB.replace(/-/g, "")) >= 0 && + peripheral.advertisement.manufacturerData && + peripheral.advertisement.manufacturerData.length > 3 && + peripheral.advertisement.manufacturerData[3] === Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID + ); + } + + protected _currentPort = 0x3b; + + constructor (device: IBLEAbstraction) { + super(device, PortMap, Consts.HubType.TECHNIC_SMALL_HUB); + debug("Discovered Spike Essential Hub"); + } + + + public async connect () { + debug("Connecting to Spike Essential Hub"); + await super.connect(); + debug("Connect completed"); + } + + +} + +export const PortMap: {[portName: string]: number} = { + "A": 0, + "B": 1, + "HUB_LED": 49, + "CURRENT_SENSOR": 59, + "VOLTAGE_SENSOR": 60 +}; diff --git a/src/index-browser.ts b/src/index-browser.ts index 516bc5a..b4a2858 100644 --- a/src/index-browser.ts +++ b/src/index-browser.ts @@ -32,6 +32,7 @@ import { TechnicDistanceSensor } from "./devices/technicdistancesensor"; import { TechnicForceSensor } from "./devices/technicforcesensor"; import { TechnicLargeAngularMotor } from "./devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; +import { TechnicSmallAngularMotor } from "./devices/technicsmallangularmotor"; import { TechnicMediumAngularMotor } from "./devices/technicmediumangularmotor"; import { TechnicMediumHubAccelerometerSensor } from "./devices/technicmediumhubaccelerometersensor"; import { TechnicMediumHubGyroSensor } from "./devices/technicmediumhubgyrosensor"; diff --git a/src/index-node.ts b/src/index-node.ts index f776512..64f1460 100644 --- a/src/index-node.ts +++ b/src/index-node.ts @@ -32,6 +32,7 @@ import { TechnicDistanceSensor } from "./devices/technicdistancesensor"; import { TechnicForceSensor } from "./devices/technicforcesensor"; import { TechnicLargeAngularMotor } from "./devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; +import { TechnicSmallAngularMotor } from "./devices/technicsmallangularmotor"; import { TechnicMediumAngularMotor } from "./devices/technicmediumangularmotor"; import { TechnicMediumHubAccelerometerSensor } from "./devices/technicmediumhubaccelerometersensor"; import { TechnicMediumHubGyroSensor } from "./devices/technicmediumhubgyrosensor"; diff --git a/src/poweredup-browser.ts b/src/poweredup-browser.ts index 486d919..bd19561 100644 --- a/src/poweredup-browser.ts +++ b/src/poweredup-browser.ts @@ -15,6 +15,7 @@ import { EventEmitter } from "events"; import Debug = require("debug"); import { IBLEAbstraction } from "./interfaces"; +import { TechnicSmallHub } from "./hubs/technicsmallhub"; const debug = Debug("poweredup"); @@ -151,7 +152,10 @@ export class PoweredUP extends EventEmitter { case Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID: resolve(Consts.HubType.DUPLO_TRAIN_BASE); break; - case Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB: + case Consts.BLEManufacturerData.TECHNIC_SMALL_HUB_ID: + resolve(Consts.HubType.TECHNIC_SMALL_HUB); + break; + case Consts.BLEManufacturerData.TECHNIC_MEDIUM_HUB_ID: resolve(Consts.HubType.TECHNIC_MEDIUM_HUB); break; } @@ -208,6 +212,9 @@ export class PoweredUP extends EventEmitter { case Consts.HubType.DUPLO_TRAIN_BASE: hub = new DuploTrainBase(device); break; + case Consts.HubType.TECHNIC_SMALL_HUB: + hub = new TechnicSmallHub(device); + break; case Consts.HubType.TECHNIC_MEDIUM_HUB: hub = new TechnicMediumHub(device); break; diff --git a/src/poweredup-node.ts b/src/poweredup-node.ts index f1f8870..987b462 100644 --- a/src/poweredup-node.ts +++ b/src/poweredup-node.ts @@ -18,6 +18,7 @@ import { EventEmitter } from "events"; import Debug = require("debug"); const debug = Debug("poweredup"); import noble = require("@abandonware/noble"); +import { TechnicSmallHub } from "./hubs/technicsmallhub"; let ready = false; let wantScan = false; @@ -168,6 +169,8 @@ export class PoweredUP extends EventEmitter { hub = new RemoteControl(device); } else if (DuploTrainBase.IsDuploTrainBase(peripheral)) { hub = new DuploTrainBase(device); + } else if (TechnicSmallHub.IsTechnicSmallHub(peripheral)) { + hub = new TechnicSmallHub(device); } else if (TechnicMediumHub.IsTechnicMediumHub(peripheral)) { hub = new TechnicMediumHub(device); } else if (Mario.IsMario(peripheral)) {