First pass at Mario events
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Nathan Kellenicki 2020-12-23 20:33:54 -08:00
parent 51edf0b933
commit 46b643e58f
4 changed files with 77 additions and 73 deletions

View File

@ -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_EVENTS = 70,
MARIO_ACCELEROMETER = 71,
MARIO_BARCODE_SENSOR = 73,
MARIO_PANTS_SENSOR = 74,

View File

@ -0,0 +1,74 @@
import { Device } from "./device";
import { IDeviceInterface } from "../interfaces";
import * as Consts from "../consts";
/**
* @class MarioEvents
* @extends Device
*/
export class MarioEvents extends Device {
private _events: number[] = [];
private _coins: { [enemy: number]: number } = {};
private _started: boolean = false;
constructor (hub: IDeviceInterface, portId: number) {
super(hub, portId, ModeMap, Consts.DeviceType.MARIO_EVENTS);
}
public receive (message: Buffer) {
const mode = this._mode;
switch (mode) {
case Mode.EVENT:
const type = message[5];
const value = message[6];
if (type === 0x13) {
const event = value;
if (event === 0xb8 && !this._started) {
this._started = true;
this._events = [];
this._coins = {};
}
this._events.push(value);
if (this._started) {
this.notify("event", Object.assign(
{ event },
(event === 0xb7) ? { history: this._events, coins: this._coins } : {}
));
}
if (event === 0xb7) {
this._started = false;
}
} else if (type === 0x20) {
if (!this._started) {
break;
}
const enemy = message[4];
let coins = value;
if (coins === 0) {
break;
}
if (this._coins[enemy]) {
coins -= this._coins[enemy];
this._coins[enemy] += coins;
} else {
this._coins[enemy] = coins;
}
this.notify("event", { enemy, coins });
}
break;
}
}
}
export enum Mode {
EVENT = 0x02,
}
export const ModeMap: {[event: string]: number} = {
"event": Mode.EVENT,
};

View File

@ -13,6 +13,7 @@ import { DuploTrainBaseSpeedometer } from "../devices/duplotrainbasespeedometer"
import { HubLED } from "../devices/hubled";
import { Light } from "../devices/light";
import { MarioEvents } from "../devices/marioevents";
import { MarioAccelerometer } from "../devices/marioaccelerometer";
import { MarioBarcodeSensor } from "../devices/mariobarcodesensor";
import { MarioPantsSensor } from "../devices/mariopantssensor";
@ -420,6 +421,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_EVENTS]: MarioEvents,
[Consts.DeviceType.MARIO_ACCELEROMETER]: MarioAccelerometer,
[Consts.DeviceType.MARIO_BARCODE_SENSOR]: MarioBarcodeSensor,
[Consts.DeviceType.MARIO_PANTS_SENSOR]: MarioPantsSensor,

View File

@ -1,73 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>node-poweredup Web Bluetooth Test</title>
<script>
const scan = async function () {
const WEDO2_SMART_HUB = "00001523-1212-efde-1523-785feabcd123";
const LPF2_HUB = "00001623-1212-efde-1623-785feabcd123";
const LPF2_ALL = "00001624-1212-efde-1623-785feabcd123"
const device = await navigator.bluetooth.requestDevice({
filters: [
{
services: [
WEDO2_SMART_HUB
]
},
{
services: [
LPF2_HUB
]
}
]
});
const server = await device.gatt.connect();
console.log(server);
let connectComplete = false;
let hubType = 0;
let isLPF2Hub = false;
let service;
try {
service = await server.getPrimaryService(WEDO2_SMART_HUB);
hubType = 1;
} catch (error) {}
try {
service = await server.getPrimaryService(LPF2_HUB);
isLPF2Hub = true;
} catch (error) {}
const characteristics = await service.getCharacteristics();
const charMap = {};
for (const characteristic of characteristics) {
charMap[characteristic.uuid] = characteristic;
}
charMap[LPF2_ALL].addEventListener("characteristicvaluechanged", (event) => {
console.log(event.target.value.buffer);
});
charMap[LPF2_ALL].startNotifications();
if (isLPF2Hub) {
const hubTypeCmd = new Uint8Array([0x05, 0x00, 0x01, 0x0b, 0x05]);
charMap[LPF2_ALL].writeValue(hubTypeCmd);
}
}
</script>
</head>
<body>
<div>
<button onclick="scan()">Scan</button>
</div>
</body>
</html>