Support for Technic Small Hub and Technic Small Angular Motor

This commit is contained in:
Nathan Kellenicki 2021-09-14 18:21:31 -07:00
parent 10a0a9457a
commit e3259f4ba7
9 changed files with 95 additions and 3 deletions

View File

@ -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
}

View File

@ -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);
}
}

View File

@ -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,

View File

@ -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
);
}

View File

@ -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
};

View File

@ -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";

View File

@ -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";

View File

@ -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;

View File

@ -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)) {