From ef315676b0318cac59b2b8b081f7d4d3c0a409f9 Mon Sep 17 00:00:00 2001 From: Nathan Kellenicki Date: Tue, 14 Jan 2020 16:40:48 -0800 Subject: [PATCH] Added support for Technic Color Sensor and Technic Distance Sensor (Spike Prime) --- src/consts.ts | 2 + src/devices/techniccolorsensor.ts | 66 ++++++++++++++++++++++++++++ src/devices/technicdistancesensor.ts | 64 +++++++++++++++++++++++++++ src/hubs/basehub.ts | 4 ++ src/index-browser.ts | 4 ++ src/index-node.ts | 4 ++ 6 files changed, 144 insertions(+) create mode 100644 src/devices/techniccolorsensor.ts create mode 100644 src/devices/technicdistancesensor.ts diff --git a/src/consts.ts b/src/consts.ts index 1ea749c..77ed110 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -80,6 +80,8 @@ export enum DeviceType { TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58, TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59, TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR = 60, + TECHNIC_COLOR_SENSOR = 61, + TECHNIC_DISTANCE_SENSOR = 62 } diff --git a/src/devices/techniccolorsensor.ts b/src/devices/techniccolorsensor.ts new file mode 100644 index 0000000..e9c71e9 --- /dev/null +++ b/src/devices/techniccolorsensor.ts @@ -0,0 +1,66 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +export class TechnicColorSensor extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_COLOR_SENSOR); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case Mode.COLOR: + if (message[4] <= 10) { + const color = message[4]; + + /** + * Emits when a color sensor is activated. + * @event TechnicColorSensor#color + * @param {Color} color + */ + this.notify("color", { color }); + } + break; + + case Mode.REFLECTIVITY: + const reflect = message[4]; + + /** + * Emits when the light reflectivity changes. + * @event TechnicColorSensor#reflect Percentage, from 0 to 100. + * @param {Color} reflect + */ + this.notify("reflect", { reflect }); + break; + + case Mode.AMBIENT_LIGHT: + const ambient = message[4]; + + /** + * Emits when the ambient light changes. + * @event TechnicColorSensor#ambient Percentage, from 0 to 100. + * @param {Color} ambient + */ + this.notify("ambient", { ambient }); + break; + } + } + +} + +export enum Mode { + COLOR = 0x00, + REFLECTIVITY = 0x01, + AMBIENT_LIGHT = 0x02 +} + +export const ModeMap: {[event: string]: number} = { + "color": Mode.COLOR, + "reflect": Mode.REFLECTIVITY, + "ambient": Mode.AMBIENT_LIGHT +}; diff --git a/src/devices/technicdistancesensor.ts b/src/devices/technicdistancesensor.ts new file mode 100644 index 0000000..1a8087f --- /dev/null +++ b/src/devices/technicdistancesensor.ts @@ -0,0 +1,64 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +export class TechnicDistanceSensor extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, ModeMap, Consts.DeviceType.TECHNIC_DISTANCE_SENSOR); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case Mode.DISTANCE: + const distance = message.readUInt16LE(4); + + /** + * Emits when the detected distance changes (Slow sampling covers 40mm to 2500mm). + * @event TechnicDistanceSensor#distance Distance, from 40 to 2500mm + * @param {Color} distance + */ + this.notify("distance", { distance }); + break; + + case Mode.FAST_DISTANCE: + const fastDistance = message.readUInt16LE(4); + + /** + * Emits when the detected distance changes (Fast sampling covers 50mm to 320mm). + * @event TechnicDistanceSensor#fastDistance Distance, from 50 to 320mm + * @param {Color} fastDistance + */ + this.notify("fastDistance", { fastDistance }); + break; + } + } + + /** + * Set the brightness (or turn on/off) the lights around the eyes. + * @method TechnicDistanceSensor#setBrightness + * @param {number} topLeft Top left quadrant (above left eye). 0-100 brightness. + * @param {number} bottomLeft Bottom left quadrant (below left eye). 0-100 brightness. + * @param {number} topRight Top right quadrant (above right eye). 0-100 brightness. + * @param {number} bottomRight Bottom right quadrant (below right eye). 0-100 brightness. + * @returns {Promise} Resolved upon successful completion of command. + */ + public setBrightness (topLeft: number, bottomLeft: number, topRight: number, bottomRight: number) { + this.writeDirect(0x05, Buffer.from([topLeft, topRight, bottomLeft, bottomRight])); + } + +} + +export enum Mode { + DISTANCE = 0x00, + FAST_DISTANCE = 0x01 +} + +export const ModeMap: {[event: string]: number} = { + "distance": Mode.DISTANCE, + "fastDistance": Mode.FAST_DISTANCE +}; diff --git a/src/hubs/basehub.ts b/src/hubs/basehub.ts index c7c9dd2..2e4be1a 100644 --- a/src/hubs/basehub.ts +++ b/src/hubs/basehub.ts @@ -20,6 +20,8 @@ import { MoveHubTiltSensor } from "../devices/movehubtiltsensor"; import { PiezoBuzzer } from "../devices/piezobuzzer"; import { RemoteControlButton } from "../devices/remotecontrolbutton"; import { SimpleMediumLinearMotor } from "../devices/simplemediumlinearmotor"; +import { TechnicColorSensor } from "../devices/techniccolorsensor"; +import { TechnicDistanceSensor } from "../devices/technicdistancesensor"; import { TechnicLargeAngularMotor } from "../devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "../devices/techniclargelinearmotor"; import { TechnicMediumAngularMotor } from "../devices/technicmediumangularmotor"; @@ -346,6 +348,8 @@ export class BaseHub extends EventEmitter { [Consts.DeviceType.TILT_SENSOR]: TiltSensor, [Consts.DeviceType.MOVE_HUB_TILT_SENSOR]: MoveHubTiltSensor, [Consts.DeviceType.PIEZO_BUZZER]: PiezoBuzzer, + [Consts.DeviceType.TECHNIC_COLOR_SENSOR]: TechnicColorSensor, + [Consts.DeviceType.TECHNIC_DISTANCE_SENSOR]: TechnicDistanceSensor, [Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR]: TechnicMediumHubTiltSensor, [Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR]: TechnicMediumHubGyroSensor, [Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER]: TechnicMediumHubAccelerometerSensor, diff --git a/src/index-browser.ts b/src/index-browser.ts index 6b9e86b..143d425 100644 --- a/src/index-browser.ts +++ b/src/index-browser.ts @@ -26,6 +26,8 @@ import { MoveHubTiltSensor } from "./devices/movehubtiltsensor"; import { PiezoBuzzer } from "./devices/piezobuzzer"; import { RemoteControlButton } from "./devices/remotecontrolbutton"; import { SimpleMediumLinearMotor } from "./devices/simplemediumlinearmotor"; +import { TechnicColorSensor } from "./devices/techniccolorsensor"; +import { TechnicDistanceSensor } from "./devices/technicdistancesensor"; import { TechnicLargeAngularMotor } from "./devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; import { TechnicMediumAngularMotor } from "./devices/technicmediumangularmotor"; @@ -65,6 +67,8 @@ window.PoweredUP = { PiezoBuzzer, RemoteControlButton, SimpleMediumLinearMotor, + TechnicColorSensor, + TechnicDistanceSensor, TechnicMediumHubAccelerometerSensor, TechnicMediumHubGyroSensor, TechnicMediumHubTiltSensor, diff --git a/src/index-node.ts b/src/index-node.ts index 591735e..ab282bd 100644 --- a/src/index-node.ts +++ b/src/index-node.ts @@ -26,6 +26,8 @@ import { MoveHubTiltSensor } from "./devices/movehubtiltsensor"; import { PiezoBuzzer } from "./devices/piezobuzzer"; import { RemoteControlButton } from "./devices/remotecontrolbutton"; import { SimpleMediumLinearMotor } from "./devices/simplemediumlinearmotor"; +import { TechnicColorSensor } from "./devices/techniccolorsensor"; +import { TechnicDistanceSensor } from "./devices/technicdistancesensor"; import { TechnicLargeAngularMotor } from "./devices/techniclargeangularmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; import { TechnicMediumAngularMotor } from "./devices/technicmediumangularmotor"; @@ -65,6 +67,8 @@ export { PiezoBuzzer, RemoteControlButton, SimpleMediumLinearMotor, + TechnicColorSensor, + TechnicDistanceSensor, TechnicMediumHubAccelerometerSensor, TechnicMediumHubGyroSensor, TechnicMediumHubTiltSensor,