From 5094c8269f10f8539509cc44b86ad95b58c8ccf5 Mon Sep 17 00:00:00 2001 From: Nathan Kellenicki Date: Wed, 23 Dec 2020 10:15:57 -0800 Subject: [PATCH] Mario accelerometer support --- examples/mario.js | 10 ++++--- src/consts.ts | 1 + src/devices/marioaccelerometer.ts | 46 +++++++++++++++++++++++++++++++ src/hubs/basehub.ts | 2 ++ 4 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 src/devices/marioaccelerometer.ts diff --git a/examples/mario.js b/examples/mario.js index 12337d1..4be7e40 100644 --- a/examples/mario.js +++ b/examples/mario.js @@ -18,13 +18,15 @@ poweredUP.on("discover", async (hub) => { // Wait to discover hubs await mario.connect(); // Connect to Mario console.log(`Connected to Mario!`); - const pants = await mario.waitForDeviceByType(PoweredUP.Consts.DeviceType.MARIO_PANTS_SENSOR); - pants.on("pants", ({ pants }) => { + mario.on("accel", (_, { x, y, z }) => { + console.log("Accelerometer", x, y, z); + }); + + mario.on("pants", (_, { pants }) => { console.log("Pants detected", pants); }); - const barcodeSensor = await mario.waitForDeviceByType(PoweredUP.Consts.DeviceType.MARIO_BARCODE_SENSOR); - barcodeSensor.on("barcode", ({ barcode, color }) => { + mario.on("barcode", (_, { barcode, color }) => { if (color) { console.log("Color detected", color); } else if (barcode) { diff --git a/src/consts.ts b/src/consts.ts index 7d8c025..31c67f8 100644 --- a/src/consts.ts +++ b/src/consts.ts @@ -85,6 +85,7 @@ export enum DeviceType { TECHNIC_COLOR_SENSOR = 61, // Spike Prime TECHNIC_DISTANCE_SENSOR = 62, // Spike Prime TECHNIC_FORCE_SENSOR = 63, // Spike Prime + MARIO_ACCELEROMETER = 71, MARIO_BARCODE_SENSOR = 73, MARIO_PANTS_SENSOR = 74, TECHNIC_MEDIUM_ANGULAR_MOTOR_GREY = 75, // Technic Control+ diff --git a/src/devices/marioaccelerometer.ts b/src/devices/marioaccelerometer.ts new file mode 100644 index 0000000..bf2c90d --- /dev/null +++ b/src/devices/marioaccelerometer.ts @@ -0,0 +1,46 @@ +import { Device } from "./device"; + +import { IDeviceInterface } from "../interfaces"; + +import * as Consts from "../consts"; + +/** + * @class MarioAccelerometer + * @extends Device + */ +export class MarioAccelerometer extends Device { + + constructor (hub: IDeviceInterface, portId: number) { + super(hub, portId, ModeMap, Consts.DeviceType.MARIO_ACCELEROMETER); + } + + public receive (message: Buffer) { + const mode = this._mode; + + switch (mode) { + case Mode.ACCEL: + /** + * Emits when accelerometer detects movement. Measured in mG. + * @event MarioAccelerometer#accel + * @type {object} + * @param {number} x + * @param {number} y + * @param {number} z + */ + const x = message[4]; + const y = message[5]; + const z = message[6]; + this.notify("accel", { x, y, z }); + break; + } + } + +} + +export enum Mode { + ACCEL = 0x00 +} + +export const ModeMap: {[event: string]: number} = { + "accel": Mode.ACCEL +}; diff --git a/src/hubs/basehub.ts b/src/hubs/basehub.ts index 418e99a..c53d881 100644 --- a/src/hubs/basehub.ts +++ b/src/hubs/basehub.ts @@ -13,6 +13,7 @@ import { DuploTrainBaseSpeedometer } from "../devices/duplotrainbasespeedometer" import { HubLED } from "../devices/hubled"; import { Light } from "../devices/light"; +import { MarioAccelerometer } from "../devices/marioaccelerometer"; import { MarioBarcodeSensor } from "../devices/mariobarcodesensor"; import { MarioPantsSensor } from "../devices/mariopantssensor"; import { MediumLinearMotor } from "../devices/mediumlinearmotor"; @@ -419,6 +420,7 @@ export class BaseHub extends EventEmitter { [Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR]: DuploTrainBaseMotor, [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER]: DuploTrainBaseSpeaker, [Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER]: DuploTrainBaseSpeedometer, + [Consts.DeviceType.MARIO_ACCELEROMETER]: MarioAccelerometer, [Consts.DeviceType.MARIO_BARCODE_SENSOR]: MarioBarcodeSensor, [Consts.DeviceType.MARIO_PANTS_SENSOR]: MarioPantsSensor, };