Duplo motors and sensors

This commit is contained in:
Nathan Kellenicki 2019-12-19 12:07:05 -08:00
parent 705fbd341a
commit bc644c85b2
11 changed files with 182 additions and 29 deletions

View File

@ -67,17 +67,17 @@ export enum DeviceType {
MOVE_HUB_TILT_SENSOR = 40, MOVE_HUB_TILT_SENSOR = 40,
DUPLO_TRAIN_BASE_MOTOR = 41, DUPLO_TRAIN_BASE_MOTOR = 41,
DUPLO_TRAIN_BASE_SPEAKER = 42, DUPLO_TRAIN_BASE_SPEAKER = 42,
DUPLO_TRAIN_BASE_COLOR = 43, DUPLO_TRAIN_BASE_COLOR_SENSOR = 43,
DUPLO_TRAIN_BASE_SPEEDOMETER = 44, DUPLO_TRAIN_BASE_SPEEDOMETER = 44,
TECHNIC_LARGE_LINEAR_MOTOR = 46, TECHNIC_LARGE_LINEAR_MOTOR = 46,
TECHNIC_XLARGE_LINEAR_MOTOR = 47, TECHNIC_XLARGE_LINEAR_MOTOR = 47,
CONTROL_PLUS_GEST = 54, TECHNIC_MEDIUM_HUB_GEST_SENSOR = 54,
PUP_REMOTE_BUTTON = 55, REMOTE_CONTROL_BUTTON = 55,
RSSI = 56, REMOTE_CONTROL_RSSI = 56,
TECHNIC_MEDIUM_HUB_ACCELEROMETER = 57, TECHNIC_MEDIUM_HUB_ACCELEROMETER = 57,
TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58, TECHNIC_MEDIUM_HUB_GYRO_SENSOR = 58,
TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59, TECHNIC_MEDIUM_HUB_TILT_SENSOR = 59,
TEMPERATURE = 60, TECHNIC_MEDIUM_HUB_TEMPERATURE_SENSOR = 60,
} }

View File

@ -0,0 +1,45 @@
import { Device } from "./device";
import { IDeviceInterface } from "../interfaces";
import * as Consts from "../consts";
export class DuploTrainBaseColorSensor extends Device {
constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, DuploTrainBaseColorSensor.ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR);
}
public receive (message: Buffer) {
const mode = this._mode;
switch (mode) {
case DuploTrainBaseColorSensor.Mode.COLOR:
if (message[4] <= 10) {
const color = message[4];
/**
* Emits when a color sensor is activated.
* @event DuploTrainBaseColorSensor#color
* @param {Color} color
*/
this.emit("color", color);
}
break;
}
}
}
export namespace DuploTrainBaseColorSensor {
export enum Mode {
COLOR = 0x00
}
export const ModeMap: {[event: string]: number} = {
"color": DuploTrainBaseColorSensor.Mode.COLOR
}
}

View File

@ -0,0 +1,13 @@
import { BasicMotor } from "./basicmotor";
import { IDeviceInterface } from "../interfaces";
import * as Consts from "../consts";
export class DuploTrainBaseMotor extends BasicMotor {
constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR);
}
}

View File

@ -0,0 +1,38 @@
import { Device } from "./device";
import { IDeviceInterface } from "../interfaces";
import * as Consts from "../consts";
export class DuploTrainBaseSpeaker extends Device {
constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, {}, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER);
}
/**
* Play a built-in train sound.
* @method DuploTrainBaseSpeaker#playSound
* @param {DuploTrainBaseSound} sound
* @returns {Promise} Resolved upon successful issuance of command.
*/
public playSound (sound: Consts.DuploTrainBaseSound) {
return new Promise((resolve, reject) => {
this.subscribe(DuploTrainBaseSpeaker.Mode.SOUND);
this.writeDirect(0x01, Buffer.from([sound]));
return resolve();
});
}
}
export namespace DuploTrainBaseSpeaker {
export enum Mode {
SOUND = 0x01
}
}

View File

@ -0,0 +1,43 @@
import { Device } from "./device";
import { IDeviceInterface } from "../interfaces";
import * as Consts from "../consts";
export class DuploTrainBaseSpeedometer extends Device {
constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, DuploTrainBaseSpeedometer.ModeMap, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER);
}
public receive (message: Buffer) {
const mode = this._mode;
switch (mode) {
case DuploTrainBaseSpeedometer.Mode.SPEED:
const speed = message.readInt16LE(4);
/**
* Emits on a speed change.
* @event DuploTrainBaseSpeedometer#speed
* @param {number} speed
*/
this.emit("speed", speed);
break;
}
}
}
export namespace DuploTrainBaseSpeedometer {
export enum Mode {
SPEED = 0x00
}
export const ModeMap: {[event: string]: number} = {
"speed": DuploTrainBaseSpeedometer.Mode.SPEED
}
}

View File

@ -20,12 +20,10 @@ export class HubLED extends Device {
*/ */
public setColor (color: number | boolean) { public setColor (color: number | boolean) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (this.mode !== HubLED.Mode.COLOR) {
this.subscribe(HubLED.Mode.COLOR);
}
if (typeof color === "boolean") { if (typeof color === "boolean") {
color = 0; color = 0;
} }
this.subscribe(HubLED.Mode.COLOR);
this.writeDirect(0x00, Buffer.from([color])); this.writeDirect(0x00, Buffer.from([color]));
return resolve(); return resolve();
}); });
@ -42,9 +40,7 @@ export class HubLED extends Device {
*/ */
public setRGB (red: number, green: number, blue: number) { public setRGB (red: number, green: number, blue: number) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (this.mode !== HubLED.Mode.RGB) { this.subscribe(HubLED.Mode.RGB);
this.subscribe(HubLED.Mode.RGB);
}
this.writeDirect(0x00, Buffer.from([red, green, blue])); this.writeDirect(0x00, Buffer.from([red, green, blue]));
return resolve(); return resolve();
}); });

View File

@ -7,7 +7,7 @@ import * as Consts from "../consts";
export class RemoteControlButton extends Device { export class RemoteControlButton extends Device {
constructor (hub: IDeviceInterface, portId: number) { constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, RemoteControlButton.ModeMap, Consts.DeviceType.PUP_REMOTE_BUTTON); super(hub, portId, RemoteControlButton.ModeMap, Consts.DeviceType.REMOTE_CONTROL_BUTTON);
} }
public receive (message: Buffer) { public receive (message: Buffer) {

View File

@ -5,6 +5,12 @@ import { IBLEAbstraction } from "../interfaces";
import { ColorDistanceSensor } from "../devices/colordistancesensor"; import { ColorDistanceSensor } from "../devices/colordistancesensor";
import { CurrentSensor } from "../devices/currentsensor"; import { CurrentSensor } from "../devices/currentsensor";
import { Device } from "../devices/device"; import { Device } from "../devices/device";
import { DuploTrainBaseColorSensor } from "../devices/duplotrainbasecolorsensor";
import { DuploTrainBaseMotor } from "../devices/duplotrainbasemotor";
import { DuploTrainBaseSpeaker } from "../devices/duplotrainbasespeaker";
import { DuploTrainBaseSpeedometer } from "../devices/duplotrainbasespeedometer";
import { HubLED } from "../devices/hubled"; import { HubLED } from "../devices/hubled";
import { Light } from "../devices/light"; import { Light } from "../devices/light";
import { MediumLinearMotor } from "../devices/mediumlinearmotor"; import { MediumLinearMotor } from "../devices/mediumlinearmotor";
@ -352,12 +358,24 @@ export class BaseHub extends EventEmitter {
case Consts.DeviceType.CURRENT_SENSOR: case Consts.DeviceType.CURRENT_SENSOR:
device = new CurrentSensor(this, portId); device = new CurrentSensor(this, portId);
break; break;
case Consts.DeviceType.PUP_REMOTE_BUTTON: case Consts.DeviceType.REMOTE_CONTROL_BUTTON:
device = new RemoteControlButton(this, portId); device = new RemoteControlButton(this, portId);
break; break;
case Consts.DeviceType.HUB_LED: case Consts.DeviceType.HUB_LED:
device = new HubLED(this, portId); device = new HubLED(this, portId);
break; break;
case Consts.DeviceType.DUPLO_TRAIN_BASE_COLOR_SENSOR:
device = new DuploTrainBaseColorSensor(this, portId);
break;
case Consts.DeviceType.DUPLO_TRAIN_BASE_MOTOR:
device = new DuploTrainBaseMotor(this, portId);
break;
case Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER:
device = new DuploTrainBaseSpeaker(this, portId);
break;
case Consts.DeviceType.DUPLO_TRAIN_BASE_SPEEDOMETER:
device = new DuploTrainBaseSpeedometer(this, portId);
break;
default: default:
device = new Device(this, portId, undefined, deviceType); device = new Device(this, portId, undefined, deviceType);
break; break;

View File

@ -40,28 +40,12 @@ export class DuploTrainBase extends LPF2Hub {
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
debug("Connecting to Duplo Train Base"); debug("Connecting to Duplo Train Base");
await super.connect(); await super.connect();
// this.subscribe(0x01, Consts.DeviceType.DUPLO_TRAIN_BASE_SPEAKER, 0x01);
debug("Connect completed"); debug("Connect completed");
return resolve(); return resolve();
}); });
} }
/**
* Play a built-in train sound.
* @method DuploTrainBase#playSound
* @param {DuploTrainBaseSound} sound
* @returns {Promise} Resolved upon successful issuance of command.
*/
public playSound (sound: number) {
return new Promise((resolve, reject) => {
const data = Buffer.from([0x81, 0x01, 0x11, 0x51, 0x01, sound]);
this.send(data, Consts.BLECharacteristic.LPF2_ALL);
return resolve();
});
}
} }
export namespace DuploTrainBase { export namespace DuploTrainBase {

View File

@ -13,6 +13,10 @@ import { WeDo2SmartHub } from "./hubs/wedo2smarthub";
import { ColorDistanceSensor } from "./devices/colordistancesensor"; import { ColorDistanceSensor } from "./devices/colordistancesensor";
import { CurrentSensor } from "./devices/currentsensor"; import { CurrentSensor } from "./devices/currentsensor";
import { Device } from "./devices/device"; import { Device } from "./devices/device";
import { DuploTrainBaseColorSensor } from "./devices/duplotrainbasecolorsensor";
import { DuploTrainBaseMotor } from "./devices/duplotrainbasemotor";
import { DuploTrainBaseSpeaker } from "./devices/duplotrainbasespeaker";
import { DuploTrainBaseSpeedometer } from "./devices/duplotrainbasespeedometer";
import { HubLED } from "./devices/hubled"; import { HubLED } from "./devices/hubled";
import { Light } from "./devices/light"; import { Light } from "./devices/light";
import { MediumLinearMotor } from "./devices/mediumlinearmotor"; import { MediumLinearMotor } from "./devices/mediumlinearmotor";
@ -44,6 +48,10 @@ window.PoweredUP = {
Consts, Consts,
ColorDistanceSensor, ColorDistanceSensor,
Device, Device,
DuploTrainBaseColorSensor,
DuploTrainBaseMotor,
DuploTrainBaseSpeaker,
DuploTrainBaseSpeedometer,
HubLED, HubLED,
Light, Light,
MediumLinearMotor, MediumLinearMotor,

View File

@ -13,6 +13,10 @@ import { WeDo2SmartHub } from "./hubs/wedo2smarthub";
import { ColorDistanceSensor } from "./devices/colordistancesensor"; import { ColorDistanceSensor } from "./devices/colordistancesensor";
import { CurrentSensor } from "./devices/currentsensor"; import { CurrentSensor } from "./devices/currentsensor";
import { Device } from "./devices/device"; import { Device } from "./devices/device";
import { DuploTrainBaseColorSensor } from "./devices/duplotrainbasecolorsensor";
import { DuploTrainBaseMotor } from "./devices/duplotrainbasemotor";
import { DuploTrainBaseSpeaker } from "./devices/duplotrainbasespeaker";
import { DuploTrainBaseSpeedometer } from "./devices/duplotrainbasespeedometer";
import { HubLED } from "./devices/hubled"; import { HubLED } from "./devices/hubled";
import { Light } from "./devices/light"; import { Light } from "./devices/light";
import { MediumLinearMotor } from "./devices/mediumlinearmotor"; import { MediumLinearMotor } from "./devices/mediumlinearmotor";
@ -44,6 +48,10 @@ export {
Consts, Consts,
ColorDistanceSensor, ColorDistanceSensor,
Device, Device,
DuploTrainBaseColorSensor,
DuploTrainBaseMotor,
DuploTrainBaseSpeaker,
DuploTrainBaseSpeedometer,
HubLED, HubLED,
Light, Light,
MediumLinearMotor, MediumLinearMotor,