UNPKG

serialport-v5

Version:

fork with electron support of Node.js package to access serial ports. Linux, OSX and Windows. Welcome your robotic JavaScript overlords. Better yet, program them!

108 lines (97 loc) 3.23 kB
'use strict' var util = require('util') var TrackerBase = require('./tracker-base.js') var Tracker = require('./tracker.js') var TrackerStream = require('./tracker-stream.js') var TrackerGroup = module.exports = function (name) { TrackerBase.call(this, name) this.parentGroup = null this.trackers = [] this.completion = {} this.weight = {} this.totalWeight = 0 this.finished = false this.bubbleChange = bubbleChange(this) } util.inherits(TrackerGroup, TrackerBase) function bubbleChange (trackerGroup) { return function (name, completed, tracker) { trackerGroup.completion[tracker.id] = completed if (trackerGroup.finished) return trackerGroup.emit('change', name || trackerGroup.name, trackerGroup.completed(), trackerGroup) } } TrackerGroup.prototype.nameInTree = function () { var names = [] var from = this while (from) { names.unshift(from.name) from = from.parentGroup } return names.join('/') } TrackerGroup.prototype.addUnit = function (unit, weight) { if (unit.addUnit) { var toTest = this while (toTest) { if (unit === toTest) { throw new Error( 'Attempted to add tracker group ' + unit.name + ' to tree that already includes it ' + this.nameInTree(this)) } toTest = toTest.parentGroup } unit.parentGroup = this } this.weight[unit.id] = weight || 1 this.totalWeight += this.weight[unit.id] this.trackers.push(unit) this.completion[unit.id] = unit.completed() unit.on('change', this.bubbleChange) if (!this.finished) this.emit('change', unit.name, this.completion[unit.id], unit) return unit } TrackerGroup.prototype.completed = function () { if (this.trackers.length === 0) return 0 var valPerWeight = 1 / this.totalWeight var completed = 0 for (var ii = 0; ii < this.trackers.length; ii++) { var trackerId = this.trackers[ii].id completed += valPerWeight * this.weight[trackerId] * this.completion[trackerId] } return completed } TrackerGroup.prototype.newGroup = function (name, weight) { return this.addUnit(new TrackerGroup(name), weight) } TrackerGroup.prototype.newItem = function (name, todo, weight) { return this.addUnit(new Tracker(name, todo), weight) } TrackerGroup.prototype.newStream = function (name, todo, weight) { return this.addUnit(new TrackerStream(name, todo), weight) } TrackerGroup.prototype.finish = function () { this.finished = true if (!this.trackers.length) this.addUnit(new Tracker(), 1, true) for (var ii = 0; ii < this.trackers.length; ii++) { var tracker = this.trackers[ii] tracker.finish() tracker.removeListener('change', this.bubbleChange) } this.emit('change', this.name, 1, this) } var buffer = ' ' TrackerGroup.prototype.debug = function (depth) { depth = depth || 0 var indent = depth ? buffer.substr(0, depth) : '' var output = indent + (this.name || 'top') + ': ' + this.completed() + '\n' this.trackers.forEach(function (tracker) { if (tracker instanceof TrackerGroup) { output += tracker.debug(depth + 1) } else { output += indent + ' ' + tracker.name + ': ' + tracker.completed() + '\n' } }) return output }