UNPKG

@iotile/iotile-device

Version:

A typescript library for interfacing with IOTile BLE devices

73 lines 3.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const Errors = require("../common/error-space"); const IOTileTypes = require("../common/iotile-types"); const iotile_device_1 = require("./iotile-device"); const iotile_common_1 = require("@iotile/iotile-common"); class IOTileScriptInterface { async open(device, channel) { this.channel = channel; this.device = device; } async send(script, notifier) { if (this.channel && this.device) { notifier.setTotal(Math.ceil(script.byteLength / 20) + 1); notifier.startOne("Preparing for firmware update", 1); let bridge = this.device.remoteBridge(); let status = await bridge.queryStatus(); if (status.state == iotile_device_1.RemoteBridgeState.ReceivedCompleteScript) { await iotile_common_1.delay(2000); let status = await bridge.queryStatus(); } if (status.state == iotile_device_1.RemoteBridgeState.ValidatedScript || status.state == iotile_device_1.RemoteBridgeState.ExecutingScript) throw new Errors.ScriptSentAtInvalidTime("Script sent while remote bridge was processing another script"); if (status.state == iotile_device_1.RemoteBridgeState.ReceivedCompleteScript) { notifier.updateDescription("Clearing previous script"); await bridge.resetScript(); } await bridge.beginScript(); notifier.finishOne(); let speedCalculator = new SpeedCalculator(script.byteLength); for (let i = 0; i < script.byteLength; i += 20) { let slice = script.slice(i, i + 20); speedCalculator.update(i); notifier.startOne(`${speedCalculator.estimateRemaining()} remaining`, 1); await this.channel.write(IOTileTypes.IOTileCharacteristic.HighspeedData, slice); notifier.finishOne(); } await bridge.endScript(); } } async close() { } } exports.IOTileScriptInterface = IOTileScriptInterface; class SpeedCalculator { constructor(totalSize) { this.totalSize = totalSize; this.start = new Date().getTime(); this.updateCount = 0; this.finished = 0; this.invSpeed = 0; } update(finished) { if (finished === 0) return; let now = new Date().getTime(); this.invSpeed = (now - this.start) / finished; this.updateCount += 1; this.finished = finished; } estimateRemaining() { if (this.updateCount < SpeedCalculator.SETTLING_UPDATES) return "Estimating time"; let remaining = this.invSpeed * (this.totalSize - this.finished) / 1000.0; let remMinutes = Math.floor(remaining / 60.0); let remSeconds = remaining - (remMinutes * 60.0); let minString = remMinutes.toFixed(0); let secString = remSeconds.toFixed(0); return `${minString} min ${secString} sec`; } } SpeedCalculator.SETTLING_UPDATES = 100; //# sourceMappingURL=iotile-iface-script.js.map