First pass at Mario events
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
51edf0b933
commit
46b643e58f
@ -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,
|
||||
|
74
src/devices/marioevents.ts
Normal file
74
src/devices/marioevents.ts
Normal 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,
|
||||
};
|
@ -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,
|
||||
|
@ -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>
|
Loading…
x
Reference in New Issue
Block a user