Skip to content

Instantly share code, notes, and snippets.

@juniorz
Created April 14, 2015 03:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juniorz/b98cd4eb0545bcc2ec81 to your computer and use it in GitHub Desktop.
Save juniorz/b98cd4eb0545bcc2ec81 to your computer and use it in GitHub Desktop.
speedometer
var tick = 1
var maxTick = 65535
var resolution = 4
var inc = function() {
tick = (tick + 1) & maxTick // increments cycling from 1 to 65535
}
// every 1/4 of second
var timer = setInterval(inc, (1000 / resolution) | 0)
if (timer.unref) timer.unref()
var speed = function(seconds) {
var size = resolution * (seconds || 5) // 4 * 5 = 20
var buffer = [0]
var pointer = 1
var last = (tick-1) & maxTick // 0 (previous tick when the speedometer started). the number of 1000 / resolution milliseconds since the clock started to tick
return function(delta) {
var dist = (tick - last) & maxTick // how many ticks since the speedometer started
if (dist > size) dist = size // to a maximum of size
last = tick // last tick
while (dist--) { // for every tick
if (pointer === size) pointer = 0
buffer[pointer] = buffer[pointer === 0 ? size-1 : pointer-1]
pointer++
}
if (delta) buffer[pointer-1] += delta
var top = buffer[pointer-1]
var btm = buffer.length < size ? 0 : buffer[pointer === size ? 0 : pointer]
return buffer.length < resolution ? top : (top - btm) * resolution / buffer.length
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment