|
|
- define(['events'], function(EventEmitter) {
- EventEmitter = EventEmitter.EventEmitter
-
- function Stopwatch(countDownMS, options) {
-
- STATUS = {
- STOPPED: 0,
- RUNNING: 1,
- COMPLETE: 2,
- }
-
- this.stoptime = 0
- this.refTime = 0
-
- this.tickTimer = 0
-
- this.almostDoneFired = false
- this.doneFired = false
-
- this.countDownMS = countDownMS || false
- this.ms = this.countDownMS || 0
- this._elapsedMS = 0
- this.state = STATUS.STOPPED
-
-
-
- if(!options) {options = {}}
- this.refreshRateMS = options.refreshRateMS || 50
- this.almostDoneMS = options.almostDoneMS || 10000
-
-
-
- this.reset(countDownMS)
-
- return this
- }
-
-
-
-
- Stopwatch.prototype = {
-
- start: function() {
- if (this.tickTimer) {
- clearInterval(this.tickTimer)
- }
- this.state = STATUS.RUNNING
-
- this.refTime = new Date().getTime()
- this.refTime -= this._elapsedMS
- var self = this
- this.tickTimer = setInterval(function(){self._updateTime()}, this.refreshRateMS)
- this._updateTime(this)
- },
-
- stop: function() {
- if(this.tickTimer) {
- clearInterval(this.tickTimer)
- }
- if(this.state === STATUS.RUNNING) {
- this.state = STATUS.STOPPED
- this._updateTime(this)
- this.emit('stop')
- this.emit('forcestop')
- }
- },
-
- reset: function(countDownMS) {
- this.stop()
- this.state = STATUS.STOPPED
- this.doneFired = false
- this.almostDoneFired = false
- this._elapsedMS = 0
- this.refTime = new Date().getTime()
-
- if(countDownMS) {
- this.countDownMS = countDownMS
- }
- this.ms = this.countDownMS || 0
-
- this.emit('time',{ms: this.ms})
- },
-
- startstop: function() {
- if(this.state === STATUS.STOPPED) {
- this.start()
- return true
- } else {
- this.stop()
- return false
- }
- },
-
- _updateTime: function() {
- var self = this
- if(self.countDownMS > 0) {
- self._timerCountdown(self)
- } else {
- self._stopwatchCountup(self)
- }
- },
-
- _timerCountdown: function() {
- var self = this
- var currentTime = new Date().getTime()
-
- self._elapsedMS = currentTime - self.refTime
-
-
- var remainingSeconds = self.countDownMS - self._elapsedMS
- if(remainingSeconds < 0) {
- remainingSeconds = 0
- }
-
- self.ms = remainingSeconds
- self.emit('time', {ms: self.ms})
-
- if(remainingSeconds <= 0) {
- self.stop()
- if(!self.doneFired) {
- self.doneFired = true
- self.state = STATUS.COMPLETE
- self.emit('done')
- }
- } else if (remainingSeconds < self.almostDoneMS) {
- if(!self.almostDoneFired) {
- self.almostDoneFired = true
- self.emit('almostdone')
- }
- }
-
- },
-
- _stopwatchCountup: function() {
- var self = this
- var currentTime = new Date().getTime()
-
- self._elapsedMS = currentTime - self.refTime
- self.ms = self._elapsedMS
- self.emit('time', {ms: self.ms})
- },
-
- onDone: function(cb) {
- this.on('done', cb)
- return this
- },
-
- onAlmostDone: function(cb) {
- this.on('almostDone', cb)
- return this
- },
-
- onTime: function(cb) {
- this.on('time', cb)
- return this
- },
-
- onStop: function(cb) {
- this.on('stop', cb)
- return this
- },
-
-
- }
- Object.assign(Stopwatch.prototype, EventEmitter.prototype)
- return Stopwatch
- })
-
|