From 6e77d697fce1e308f774284959007085dba13e9d Mon Sep 17 00:00:00 2001 From: Nathan Kellenicki Date: Wed, 18 Dec 2019 16:51:32 -0800 Subject: [PATCH] Control+ (Technic Medium Hub) sensors --- src/consts.ts | 6 +-- src/devices/movehubtiltsensor.ts | 4 +- .../technicmediumhubaccelerometersensor.ts | 46 +++++++++++++++++++ src/devices/technicmediumhubgyrosensor.ts | 45 ++++++++++++++++++ src/devices/technicmediumhubtiltsensor.ts | 45 ++++++++++++++++++ src/hubs/hub.ts | 12 +++++ src/index-browser.ts | 6 +++ src/index-node.ts | 6 +++ 8 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 src/devices/technicmediumhubaccelerometersensor.ts create mode 100644 src/devices/technicmediumhubgyrosensor.ts create mode 100644 src/devices/technicmediumhubtiltsensor.ts diff --git a/src/consts.ts b/src/consts.ts index 8af9de7..015a6d1 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -74,9 +74,9 @@ export enum DeviceType { CONTROL_PLUS_GEST = 54, PUP_REMOTE_BUTTON = 55, RSSI = 56, - CONTROL_PLUS_ACCELEROMETER = 57, - CONTROL_PLUS_GYRO = 58, - CONTROL_PLUS_TILT = 59, + TECHNIC_MEDIUM_HUB_ACCELEROMETER = 57, + TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58, + TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59, TEMPERATURE = 60, } diff --git a/src/devices/movehubtiltsensor.ts b/src/devices/movehubtiltsensor.ts index 7e65fe1..70192e5 100644 --- a/src/devices/movehubtiltsensor.ts +++ b/src/devices/movehubtiltsensor.ts @@ -21,9 +21,9 @@ export class MoveHubTiltSensor extends Device { * @param {number} x * @param {number} y */ - const tiltX = -(message.readInt8(4)); + const tiltX = message.readInt8(4); const tiltY = message.readInt8(5); - this.emit("tilt", tiltX, tiltY); + this.emit("tilt", -tiltX, tiltY); break; } } diff --git a/src/devices/technicmediumhubaccelerometersensor.ts b/src/devices/technicmediumhubaccelerometersensor.ts new file mode 100644 index 0000000..51b0a03 --- /dev/null +++ b/src/devices/technicmediumhubaccelerometersensor.ts @@ -0,0 +1,46 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +export class TechnicMediumHubAccelerometerSensor extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, TechnicMediumHubAccelerometerSensor.ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case TechnicMediumHubAccelerometerSensor.Mode.ACCEL: + /** + * Emits when accelerometer detects movement. Measured in mG. + * @event LPF2Hub#accel + * @param {string} port + * @param {number} x + * @param {number} y + * @param {number} z + */ + const accelX = Math.round(message.readInt16LE(4) / 4.096); + const accelY = Math.round(message.readInt16LE(6) / 4.096); + const accelZ = Math.round(message.readInt16LE(8) / 4.096); + this.emit("accel", accelX, accelY, accelZ); + break; + } + } + +} + +export namespace TechnicMediumHubAccelerometerSensor { + + export enum Mode { + ACCEL = 0x00 + } + + export const ModeMap: {[event: string]: number} = { + "accel": TechnicMediumHubAccelerometerSensor.Mode.ACCEL + } + +} \ No newline at end of file diff --git a/src/devices/technicmediumhubgyrosensor.ts b/src/devices/technicmediumhubgyrosensor.ts new file mode 100644 index 0000000..3151e42 --- /dev/null +++ b/src/devices/technicmediumhubgyrosensor.ts @@ -0,0 +1,45 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +export class TechnicMediumHubGyroSensor extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, TechnicMediumHubGyroSensor.ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case TechnicMediumHubGyroSensor.Mode.GYRO: + /** + * Emits when gyroscope detects movement. Measured in DPS - degrees per second. + * @event TechnicMediumHubGyroSensor#gyro + * @param {number} x + * @param {number} y + * @param {number} z + */ + const gyroX = Math.round(message.readInt16LE(4) * 7 / 400); + const gyroY = Math.round(message.readInt16LE(6) * 7 / 400); + const gyroZ = Math.round(message.readInt16LE(8) * 7 / 400); + this.emit("gyro", gyroX, gyroY, -gyroZ); + break; + } + } + +} + +export namespace TechnicMediumHubGyroSensor { + + export enum Mode { + GYRO = 0x00 + } + + export const ModeMap: {[event: string]: number} = { + "gyro": TechnicMediumHubGyroSensor.Mode.GYRO + } + +} \ No newline at end of file diff --git a/src/devices/technicmediumhubtiltsensor.ts b/src/devices/technicmediumhubtiltsensor.ts new file mode 100644 index 0000000..f5cc657 --- /dev/null +++ b/src/devices/technicmediumhubtiltsensor.ts @@ -0,0 +1,45 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +export class TechnicMediumHubTiltSensor extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, TechnicMediumHubTiltSensor.ModeMap, Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case TechnicMediumHubTiltSensor.Mode.TILT: + /** + * Emits when a tilt sensor is activated. + * @event TechnicMediumHubTiltSensor#tilt + * @param {number} x + * @param {number} y + * @param {number} z + */ + const tiltZ = message.readInt16LE(4); + const tiltY = message.readInt16LE(6); + const tiltX = message.readInt16LE(8); + this.emit("tilt", tiltX, tiltY, -tiltZ); + break; + } + } + +} + +export namespace TechnicMediumHubTiltSensor { + + export enum Mode { + TILT = 0x00 + } + + export const ModeMap: {[event: string]: number} = { + "tilt": TechnicMediumHubTiltSensor.Mode.TILT + } + +} \ No newline at end of file diff --git a/src/hubs/hub.ts b/src/hubs/hub.ts index 832f42f..3596ed2 100644 --- a/src/hubs/hub.ts +++ b/src/hubs/hub.ts @@ -14,6 +14,9 @@ import { MoveHubTiltSensor } from "../devices/movehubtiltsensor"; import { PUPRemoteButton } from "../devices/pupremotebutton"; import { SimpleMediumLinearMotor } from "../devices/simplemediumlinearmotor"; import { TechnicLargeLinearMotor } from "../devices/techniclargelinearmotor"; +import { TechnicMediumHubAccelerometerSensor } from "../devices/technicmediumhubaccelerometersensor"; +import { TechnicMediumHubGyroSensor } from "../devices/technicmediumhubgyrosensor"; +import { TechnicMediumHubTiltSensor } from "../devices/technicmediumhubtiltsensor"; import { TechnicXLargeLinearMotor } from "../devices/technicxlargelinearmotor"; import { TiltSensor } from "../devices/tiltsensor"; import { TrainMotor } from "../devices/trainmotor"; @@ -322,6 +325,15 @@ export class Hub extends EventEmitter { case Consts.DeviceType.MOVE_HUB_TILT_SENSOR: device = new MoveHubTiltSensor(this, portId); break; + case Consts.DeviceType.TECHNIC_MEDIUM_HUB_TILT_SENSOR: + device = new TechnicMediumHubTiltSensor(this, portId); + break; + case Consts.DeviceType.TECHNIC_MEDIUM_HUB_GYRO_SENSOR: + device = new TechnicMediumHubGyroSensor(this, portId); + break; + case Consts.DeviceType.TECHNIC_MEDIUM_HUB_ACCELEROMETER: + device = new TechnicMediumHubAccelerometerSensor(this, portId); + break; case Consts.DeviceType.MEDIUM_LINEAR_MOTOR: device = new MediumLinearMotor(this, portId); break; diff --git a/src/index-browser.ts b/src/index-browser.ts index 78cd6b6..707e687 100644 --- a/src/index-browser.ts +++ b/src/index-browser.ts @@ -22,6 +22,9 @@ import { MoveHubTiltSensor } from "./devices/movehubtiltsensor"; import { PUPRemoteButton } from "./devices/pupremotebutton"; import { SimpleMediumLinearMotor } from "./devices/simplemediumlinearmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; +import { TechnicMediumHubAccelerometerSensor } from "./devices/technicmediumhubaccelerometersensor"; +import { TechnicMediumHubGyroSensor } from "./devices/technicmediumhubgyrosensor"; +import { TechnicMediumHubTiltSensor } from "./devices/technicmediumhubtiltsensor"; import { TechnicXLargeLinearMotor } from "./devices/technicxlargelinearmotor"; import { TiltSensor } from "./devices/tiltsensor"; import { TrainMotor } from "./devices/trainmotor"; @@ -50,6 +53,9 @@ window.PoweredUP = { MoveHubTiltSensor, PUPRemoteButton, SimpleMediumLinearMotor, + TechnicMediumHubAccelerometerSensor, + TechnicMediumHubGyroSensor, + TechnicMediumHubTiltSensor, TechnicLargeLinearMotor, TechnicXLargeLinearMotor, TiltSensor, diff --git a/src/index-node.ts b/src/index-node.ts index 0147263..a01c76e 100644 --- a/src/index-node.ts +++ b/src/index-node.ts @@ -22,6 +22,9 @@ import { MoveHubTiltSensor } from "./devices/movehubtiltsensor"; import { PUPRemoteButton } from "./devices/pupremotebutton"; import { SimpleMediumLinearMotor } from "./devices/simplemediumlinearmotor"; import { TechnicLargeLinearMotor } from "./devices/techniclargelinearmotor"; +import { TechnicMediumHubAccelerometerSensor } from "./devices/technicmediumhubaccelerometersensor"; +import { TechnicMediumHubGyroSensor } from "./devices/technicmediumhubgyrosensor"; +import { TechnicMediumHubTiltSensor } from "./devices/technicmediumhubtiltsensor"; import { TechnicXLargeLinearMotor } from "./devices/technicxlargelinearmotor"; import { TiltSensor } from "./devices/tiltsensor"; import { TrainMotor } from "./devices/trainmotor"; @@ -50,6 +53,9 @@ export { MoveHubTiltSensor, PUPRemoteButton, SimpleMediumLinearMotor, + TechnicMediumHubAccelerometerSensor, + TechnicMediumHubGyroSensor, + TechnicMediumHubTiltSensor, TechnicLargeLinearMotor, TechnicXLargeLinearMotor, TiltSensor,