+ "use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+ result["default"] = mod;
+ return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const bledevice_1 = require("./bledevice");
+const boostmovehub_1 = require("./boostmovehub");
+const duplotrainbase_1 = require("./duplotrainbase");
+const puphub_1 = require("./puphub");
+const pupremote_1 = require("./pupremote");
+const wedo2smarthub_1 = require("./wedo2smarthub");
+const utils_1 = require("./utils");
+const Consts = __importStar(require("./consts"));
+const events_1 = require("events");
+const Debug = require("debug");
+const debug = Debug("poweredup");
+const noble = require("noble-mac");
+let ready = false;
+let wantScan = false;
+let discoveryEventAttached = false;
+const startScanning = () => {
+ if (utils_1.isBrowserContext) {
+ noble.startScanning([Consts.BLEService.WEDO2_SMART_HUB, Consts.BLEService.LPF2_HUB]);
+ }
+ else {
+ noble.startScanning();
+ }
+};
+noble.on("stateChange", (state) => {
+ ready = (state === "poweredOn");
+ if (ready) {
+ if (wantScan) {
+ debug("Scanning started");
+ startScanning();
+ }
+ }
+ else {
+ noble.stopScanning();
+ }
+});
+/**
+ * @class PoweredUP
+ * @extends EventEmitter
+ */
+class PoweredUP extends events_1.EventEmitter {
+ constructor() {
+ super();
+ this.autoSubscribe = true;
+ this._connectedHubs = {};
+ this._discoveryEventHandler = this._discoveryEventHandler.bind(this);
+ }
+ /**
+ * Begin scanning for Powered UP Hub devices.
+ * @method PoweredUP#scan
+ */
+ scan() {
+ wantScan = true;
+ if (!discoveryEventAttached) {
+ noble.on("discover", this._discoveryEventHandler);
+ discoveryEventAttached = true;
+ }
+ if (ready) {
+ debug("Scanning started");
+ startScanning();
+ }
+ }
+ /**
+ * Stop scanning for Powered UP Hub devices.
+ * @method PoweredUP#stop
+ */
+ stop() {
+ wantScan = false;
+ if (discoveryEventAttached) {
+ noble.removeListener("discover", this._discoveryEventHandler);
+ discoveryEventAttached = false;
+ }
+ noble.stopScanning();
+ }
+ /**
+ * Retrieve a list of Powered UP Hubs.
+ * @method PoweredUP#getConnectedHubs
+ * @returns {Hub[]}
+ */
+ getConnectedHubs() {
+ return Object.keys(this._connectedHubs).map((uuid) => this._connectedHubs[uuid]);
+ }
+ /**
+ * Retrieve a Powered UP Hub by UUID.
+ * @method PoweredUP#getConnectedHubByUUID
+ * @param {string} uuid
+ * @returns {Hub | null}
+ */
+ getConnectedHubByUUID(uuid) {
+ return this._connectedHubs[uuid];
+ }
+ /**
+ * Retrieve a list of Powered UP Hub by name.
+ * @method PoweredUP#getConnectedHubsByName
+ * @param {string} name
+ * @returns {Hub[]}
+ */
+ getConnectedHubsByName(name) {
+ return Object.keys(this._connectedHubs).map((uuid) => this._connectedHubs[uuid]).filter((hub) => hub.name === name);
+ }
+ async _discoveryEventHandler(peripheral) {
+ const device = new bledevice_1.BLEDevice(peripheral);
+ let hub;
+ if (await wedo2smarthub_1.WeDo2SmartHub.IsWeDo2SmartHub(peripheral)) {
+ hub = new wedo2smarthub_1.WeDo2SmartHub(device, this.autoSubscribe);
+ }
+ else if (await boostmovehub_1.BoostMoveHub.IsBoostMoveHub(peripheral)) {
+ hub = new boostmovehub_1.BoostMoveHub(device, this.autoSubscribe);
+ }
+ else if (await puphub_1.PUPHub.IsPUPHub(peripheral)) {
+ hub = new puphub_1.PUPHub(device, this.autoSubscribe);
+ }
+ else if (await pupremote_1.PUPRemote.IsPUPRemote(peripheral)) {
+ hub = new pupremote_1.PUPRemote(device, this.autoSubscribe);
+ }
+ else if (await duplotrainbase_1.DuploTrainBase.IsDuploTrainBase(peripheral)) {
+ hub = new duplotrainbase_1.DuploTrainBase(device, this.autoSubscribe);
+ }
+ else {
+ return;
+ }
+ peripheral.removeAllListeners();
+ // noble.stopScanning();
+ // if (!isBrowserContext) {
+ // startScanning();
+ // }
+ 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];
+ if (wantScan) {
+ startScanning();
+ }
+ });
+ debug(`Hub ${hub.uuid} discovered`);
+ /**
+ * Emits when a Powered UP Hub device is found.
+ * @event PoweredUP#discover
+ * @param {WeDo2SmartHub | BoostMoveHub | PUPHub | PUPRemote | DuploTrainBase} hub
+ */
+ this.emit("discover", hub);
+ });
+ }
+}
+exports.PoweredUP = PoweredUP;
+//# sourceMappingURL=poweredup-node.js.map
+
+