@iotile/iotile-device
Version:
A typescript library for interfacing with IOTile BLE devices
73 lines • 3.16 kB
JavaScript
;
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