293 lines
17 KiB
HTML
293 lines
17 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<title>JSDoc: Source: poweredup-browser.js</title>
|
|
|
|
<script src="scripts/prettify/prettify.js"> </script>
|
|
<script src="scripts/prettify/lang-css.js"> </script>
|
|
<!--[if lt IE 9]>
|
|
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
|
|
<![endif]-->
|
|
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
|
|
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<div id="main">
|
|
|
|
<h1 class="page-title">Source: poweredup-browser.js</h1>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<section>
|
|
<article>
|
|
<pre class="prettyprint source linenums"><code>"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.PoweredUP = void 0;
|
|
const webbleabstraction_1 = require("./webbleabstraction");
|
|
const duplotrainbase_1 = require("./hubs/duplotrainbase");
|
|
const hub_1 = require("./hubs/hub");
|
|
const mario_1 = require("./hubs/mario");
|
|
const movehub_1 = require("./hubs/movehub");
|
|
const remotecontrol_1 = require("./hubs/remotecontrol");
|
|
const technicmediumhub_1 = require("./hubs/technicmediumhub");
|
|
const wedo2smarthub_1 = require("./hubs/wedo2smarthub");
|
|
const Consts = __importStar(require("./consts"));
|
|
const events_1 = require("events");
|
|
const Debug = require("debug");
|
|
const technicsmallhub_1 = require("./hubs/technicsmallhub");
|
|
const debug = Debug("poweredup");
|
|
/**
|
|
* @class PoweredUP
|
|
* @extends EventEmitter
|
|
*/
|
|
class PoweredUP extends events_1.EventEmitter {
|
|
constructor() {
|
|
super();
|
|
this._connectedHubs = {};
|
|
this._discoveryEventHandler = this._discoveryEventHandler.bind(this);
|
|
}
|
|
/**
|
|
* Begin scanning for Powered UP Hub devices.
|
|
* @method PoweredUP#scan
|
|
*/
|
|
async scan() {
|
|
try {
|
|
const device = await navigator.bluetooth.requestDevice({
|
|
filters: [
|
|
{
|
|
services: [
|
|
Consts.BLEService.WEDO2_SMART_HUB
|
|
]
|
|
},
|
|
{
|
|
services: [
|
|
Consts.BLEService.LPF2_HUB
|
|
]
|
|
}
|
|
],
|
|
optionalServices: [
|
|
Consts.BLEService.WEDO2_SMART_HUB_2,
|
|
"battery_service",
|
|
"device_information"
|
|
]
|
|
});
|
|
// @ts-ignore
|
|
const server = await device.gatt.connect();
|
|
this._discoveryEventHandler.call(this, server);
|
|
return true;
|
|
}
|
|
catch (err) {
|
|
return false;
|
|
}
|
|
}
|
|
/**
|
|
* Retrieve a list of Powered UP Hubs.
|
|
* @method PoweredUP#getHubs
|
|
* @returns {BaseHub[]}
|
|
*/
|
|
getHubs() {
|
|
return Object.values(this._connectedHubs);
|
|
}
|
|
/**
|
|
* Retrieve a Powered UP Hub by UUID.
|
|
* @method PoweredUP#getHubByUUID
|
|
* @param {string} uuid
|
|
* @returns {BaseHub | null}
|
|
*/
|
|
getHubByUUID(uuid) {
|
|
return this._connectedHubs[uuid];
|
|
}
|
|
/**
|
|
* Retrieve a Powered UP Hub by primary MAC address.
|
|
* @method PoweredUP#getHubByPrimaryMACAddress
|
|
* @param {string} address
|
|
* @returns {BaseHub}
|
|
*/
|
|
getHubByPrimaryMACAddress(address) {
|
|
return Object.values(this._connectedHubs).filter((hub) => hub.primaryMACAddress === address)[0];
|
|
}
|
|
/**
|
|
* Retrieve a list of Powered UP Hub by name.
|
|
* @method PoweredUP#getHubsByName
|
|
* @param {string} name
|
|
* @returns {BaseHub[]}
|
|
*/
|
|
getHubsByName(name) {
|
|
return Object.values(this._connectedHubs).filter((hub) => hub.name === name);
|
|
}
|
|
/**
|
|
* Retrieve a list of Powered UP Hub by type.
|
|
* @method PoweredUP#getHubsByType
|
|
* @param {string} name
|
|
* @returns {BaseHub[]}
|
|
*/
|
|
getHubsByType(hubType) {
|
|
return Object.values(this._connectedHubs).filter((hub) => hub.type === hubType);
|
|
}
|
|
_determineLPF2HubType(device) {
|
|
return new Promise(async (resolve) => {
|
|
let buf = Buffer.alloc(0);
|
|
await device.subscribeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, (data) => {
|
|
buf = Buffer.concat([buf, data]);
|
|
while (buf[0] <= buf.length) {
|
|
const len = buf[0];
|
|
const message = buf.slice(0, len);
|
|
buf = buf.slice(len);
|
|
if (message[2] === 0x01 && message[3] === 0x0b) {
|
|
switch (message[5]) {
|
|
case Consts.BLEManufacturerData.REMOTE_CONTROL_ID:
|
|
resolve(Consts.HubType.REMOTE_CONTROL);
|
|
break;
|
|
case Consts.BLEManufacturerData.MOVE_HUB_ID:
|
|
resolve(Consts.HubType.MOVE_HUB);
|
|
break;
|
|
case Consts.BLEManufacturerData.HUB_ID:
|
|
resolve(Consts.HubType.HUB);
|
|
break;
|
|
case Consts.BLEManufacturerData.DUPLO_TRAIN_BASE_ID:
|
|
resolve(Consts.HubType.DUPLO_TRAIN_BASE);
|
|
break;
|
|
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;
|
|
case Consts.BLEManufacturerData.MARIO_ID:
|
|
resolve(Consts.HubType.MARIO);
|
|
break;
|
|
}
|
|
debug("Hub type determined");
|
|
}
|
|
else {
|
|
debug("Stashed in mailbox (LPF2_ALL)", message);
|
|
device.addToCharacteristicMailbox(Consts.BLECharacteristic.LPF2_ALL, message);
|
|
}
|
|
}
|
|
});
|
|
device.writeToCharacteristic(Consts.BLECharacteristic.LPF2_ALL, Buffer.from([0x05, 0x00, 0x01, 0x0b, 0x05]));
|
|
});
|
|
}
|
|
async _discoveryEventHandler(server) {
|
|
const device = new webbleabstraction_1.WebBLEDevice(server);
|
|
let hub;
|
|
let hubType = Consts.HubType.UNKNOWN;
|
|
let isLPF2Hub = false;
|
|
try {
|
|
await device.discoverCharacteristicsForService(Consts.BLEService.WEDO2_SMART_HUB);
|
|
hubType = Consts.HubType.WEDO2_SMART_HUB;
|
|
// tslint:disable-next-line
|
|
}
|
|
catch (error) { }
|
|
try {
|
|
if (hubType !== Consts.HubType.WEDO2_SMART_HUB) {
|
|
await device.discoverCharacteristicsForService(Consts.BLEService.LPF2_HUB);
|
|
isLPF2Hub = true;
|
|
}
|
|
// tslint:disable-next-line
|
|
}
|
|
catch (error) { }
|
|
if (isLPF2Hub) {
|
|
hubType = await this._determineLPF2HubType(device);
|
|
}
|
|
switch (hubType) {
|
|
case Consts.HubType.WEDO2_SMART_HUB:
|
|
hub = new wedo2smarthub_1.WeDo2SmartHub(device);
|
|
break;
|
|
case Consts.HubType.MOVE_HUB:
|
|
hub = new movehub_1.MoveHub(device);
|
|
break;
|
|
case Consts.HubType.HUB:
|
|
hub = new hub_1.Hub(device);
|
|
break;
|
|
case Consts.HubType.REMOTE_CONTROL:
|
|
hub = new remotecontrol_1.RemoteControl(device);
|
|
break;
|
|
case Consts.HubType.DUPLO_TRAIN_BASE:
|
|
hub = new duplotrainbase_1.DuploTrainBase(device);
|
|
break;
|
|
case Consts.HubType.TECHNIC_SMALL_HUB:
|
|
hub = new technicsmallhub_1.TechnicSmallHub(device);
|
|
break;
|
|
case Consts.HubType.TECHNIC_MEDIUM_HUB:
|
|
hub = new technicmediumhub_1.TechnicMediumHub(device);
|
|
break;
|
|
case Consts.HubType.MARIO:
|
|
hub = new mario_1.Mario(device);
|
|
break;
|
|
default:
|
|
return;
|
|
}
|
|
device.on("discoverComplete", () => {
|
|
hub.on("connect", () => {
|
|
debug(`Hub ${hub.uuid} connected`);
|
|
this._connectedHubs[hub.uuid] = hub;
|
|
});
|
|
hub.on("disconnect", () => {
|
|
debug(`Hub ${hub.uuid} disconnected`);
|
|
delete this._connectedHubs[hub.uuid];
|
|
});
|
|
debug(`Hub ${hub.uuid} discovered`);
|
|
/**
|
|
* Emits when a Powered UP Hub device is found.
|
|
* @event PoweredUP#discover
|
|
* @param {WeDo2SmartHub | MoveHub | TechnicMediumHub | RemoteControl | DuploTrainBase} hub
|
|
*/
|
|
this.emit("discover", hub);
|
|
});
|
|
}
|
|
}
|
|
exports.PoweredUP = PoweredUP;
|
|
//# sourceMappingURL=poweredup-browser.js.map</code></pre>
|
|
</article>
|
|
</section>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<nav>
|
|
<h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="AbsoluteMotor.html">AbsoluteMotor</a></li><li><a href="BaseHub.html">BaseHub</a></li><li><a href="BasicMotor.html">BasicMotor</a></li><li><a href="ColorDistanceSensor.html">ColorDistanceSensor</a></li><li><a href="CurrentSensor.html">CurrentSensor</a></li><li><a href="Device.html">Device</a></li><li><a href="DuploTrainBase.html">DuploTrainBase</a></li><li><a href="DuploTrainBaseColorSensor.html">DuploTrainBaseColorSensor</a></li><li><a href="DuploTrainBaseMotor.html">DuploTrainBaseMotor</a></li><li><a href="DuploTrainBaseSpeaker.html">DuploTrainBaseSpeaker</a></li><li><a href="DuploTraniBaseSpeedometer.html">DuploTraniBaseSpeedometer</a></li><li><a href="Hub.html">Hub</a></li><li><a href="HubLED.html">HubLED</a></li><li><a href="LPF2Hub.html">LPF2Hub</a></li><li><a href="Light.html">Light</a></li><li><a href="Mario.html">Mario</a></li><li><a href="MarioAccelerometer.html">MarioAccelerometer</a></li><li><a href="MarioBarcodeSensor.html">MarioBarcodeSensor</a></li><li><a href="MarioPantsSensor.html">MarioPantsSensor</a></li><li><a href="MediumLinearMotor.html">MediumLinearMotor</a></li><li><a href="MotionSensor.html">MotionSensor</a></li><li><a href="MoveHub.html">MoveHub</a></li><li><a href="MoveHubMediumLinearMotor.html">MoveHubMediumLinearMotor</a></li><li><a href="MoveHubTiltSensor.html">MoveHubTiltSensor</a></li><li><a href="PiezoBuzzer.html">PiezoBuzzer</a></li><li><a href="PoweredUP.html">PoweredUP</a></li><li><a href="RemoteControl.html">RemoteControl</a></li><li><a href="RemoteControlButton.html">RemoteControlButton</a></li><li><a href="SimpleMediumLinearMotor.html">SimpleMediumLinearMotor</a></li><li><a href="TachoMotor.html">TachoMotor</a></li><li><a href="Technic3x3ColorLightMatrix.html">Technic3x3ColorLightMatrix</a></li><li><a href="TechnicColorSensor.html">TechnicColorSensor</a></li><li><a href="TechnicDistanceSensor.html">TechnicDistanceSensor</a></li><li><a href="TechnicForceSensor.html">TechnicForceSensor</a></li><li><a href="TechnicLargeAngularMotor.html">TechnicLargeAngularMotor</a></li><li><a href="TechnicLargeLinearMotor.html">TechnicLargeLinearMotor</a></li><li><a href="TechnicMediumAngularMotor.html">TechnicMediumAngularMotor</a></li><li><a href="TechnicMediumHub.html">TechnicMediumHub</a></li><li><a href="TechnicMediumHubAccelerometerSensor.html">TechnicMediumHubAccelerometerSensor</a></li><li><a href="TechnicMediumHubGyroSensor.html">TechnicMediumHubGyroSensor</a></li><li><a href="TechnicMediumHubTiltSensor.html">TechnicMediumHubTiltSensor</a></li><li><a href="TechnicSmallAngularMotor.html">TechnicSmallAngularMotor</a></li><li><a href="TechnicXLargeLinearMotor.html">TechnicXLargeLinearMotor</a></li><li><a href="TiltSensor.html">TiltSensor</a></li><li><a href="TrainMotor.html">TrainMotor</a></li><li><a href="VoltageSensor.html">VoltageSensor</a></li><li><a href="WeDo2SmartHub.html">WeDo2SmartHub</a></li></ul><h3>Events</h3><ul><li><a href="AbsoluteMotor.html#event:absolute">absolute</a></li><li><a href="AbsoluteMotor.html#event:rotate">rotate</a></li><li><a href="ColorDistanceSensor.html#event:ambient">ambient</a></li><li><a href="ColorDistanceSensor.html#event:color">color</a></li><li><a href="ColorDistanceSensor.html#event:colorAndDistance">colorAndDistance</a></li><li><a href="ColorDistanceSensor.html#event:distance">distance</a></li><li><a href="ColorDistanceSensor.html#event:distanceCount">distanceCount</a></li><li><a href="ColorDistanceSensor.html#event:reflect">reflect</a></li><li><a href="ColorDistanceSensor.html#event:rgbIntensity">rgbIntensity</a></li><li><a href="CurrentSensor.html#event:current">current</a></li><li><a href="DuploTrainBase.html#event:button">button</a></li><li><a href="DuploTrainBaseColorSensor.html#event:color">color</a></li><li><a href="DuploTrainBaseColorSensor.html#event:intensity">intensity</a></li><li><a href="DuploTrainBaseColorSensor.html#event:reflect">reflect</a></li><li><a href="DuploTrainBaseColorSensor.html#event:rgb">rgb</a></li><li><a href="DuploTrainBaseSpeedometer.html#event:speed">speed</a></li><li><a href="Hub.html#event:attach">attach</a></li><li><a href="Hub.html#event:button">button</a></li><li><a href="Hub.html#event:detach">detach</a></li><li><a href="Hub.html#event:disconnect">disconnect</a></li><li><a href="LPF2Hub.html#event:button">button</a></li><li><a href="Mario.html#event:button">button</a></li><li><a href="MarioAccelerometer.html#event:accel">accel</a></li><li><a href="MarioAccelerometer.html#event:gest">gest</a></li><li><a href="MarioBarcodeSensor.html#event:barcode">barcode</a></li><li><a href="MarioBarcodeSensor.html#event:rgb">rgb</a></li><li><a href="MarioPantsSensor.html#event:pants">pants</a></li><li><a href="MediumLinearMotor.html#event:rotate">rotate</a></li><li><a href="MotionSensor.html#event:distance">distance</a></li><li><a href="MoveHub.html#event:button">button</a></li><li><a href="MoveHubMediumLinearMotor.html#event:rotate">rotate</a></li><li><a href="MoveHubTiltSensor.html#event:tilt">tilt</a></li><li><a href="PoweredUP.html#event:discover">discover</a></li><li><a href="RemoteControl.html#event:button">button</a></li><li><a href="RemoteControlButton.html#event:remoteButton">remoteButton</a></li><li><a href="TachoMotor.html#event:rotate">rotate</a></li><li><a href="TechnicColorSensor.html#event:ambient">ambient</a></li><li><a href="TechnicColorSensor.html#event:color">color</a></li><li><a href="TechnicColorSensor.html#event:reflect">reflect</a></li><li><a href="TechnicDistanceSensor.html#event:distance">distance</a></li><li><a href="TechnicDistanceSensor.html#event:fastDistance">fastDistance</a></li><li><a href="TechnicForceSensor.html#event:force">force</a></li><li><a href="TechnicForceSensor.html#event:tapped">tapped</a></li><li><a href="TechnicForceSensor.html#event:touch">touch</a></li><li><a href="TechnicLargeAngularMotor.html#event:absolute">absolute</a></li><li><a href="TechnicLargeAngularMotor.html#event:rotate">rotate</a></li><li><a href="TechnicLargeLinearMotor.html#event:absolute">absolute</a></li><li><a href="TechnicLargeLinearMotor.html#event:rotate">rotate</a></li><li><a href="TechnicMediumAngularMotor.html#event:absolute">absolute</a></li><li><a href="TechnicMediumAngularMotor.html#event:rotate">rotate</a></li><li><a href="TechnicMediumHub.html#event:button">button</a></li><li><a href="TechnicMediumHubAccelerometerSensor.html#event:accel">accel</a></li><li><a href="TechnicMediumHubGyroSensor.html#event:gyro">gyro</a></li><li><a href="TechnicMediumHubTiltSensor.html#event:impactCount">impactCount</a></li><li><a href="TechnicMediumHubTiltSensor.html#event:tilt">tilt</a></li><li><a href="TechnicSmallAngularMotor.html#event:absolute">absolute</a></li><li><a href="TechnicSmallAngularMotor.html#event:rotate">rotate</a></li><li><a href="TechnicXLargeLinearMotor.html#event:absolute">absolute</a></li><li><a href="TechnicXLargeLinearMotor.html#event:rotate">rotate</a></li><li><a href="TiltSensor.html#event:tilt">tilt</a></li><li><a href="VoltageSensor.html#event:voltage">voltage</a></li><li><a href="WeDo2SmartHub.html#event:button">button</a></li></ul><h3><a href="global.html">Global</a></h3>
|
|
</nav>
|
|
|
|
<br class="clear">
|
|
|
|
<footer>
|
|
Documentation generated by <a href="https://github.com/jsdoc/jsdoc">JSDoc 4.0.2</a> on Thu Apr 25 2024 17:10:11 GMT-0700 (Pacific Daylight Time)
|
|
</footer>
|
|
|
|
<script> prettyPrint(); </script>
|
|
<script src="scripts/linenumber.js"> </script>
|
|
</body>
|
|
</html>
|