Files
Bicyclesim/client/main.sim.js

143 lines
3.3 KiB
JavaScript

window.point = null;
window.traveled = 0;
var createRingBuffer = function (length){
var pointer = 0, buffer = [], sum = 0;
return {
push: function (item) {
if (buffer[pointer] > 0) {
sum -= buffer[pointer];
if (sum <= 0) sum = 0;
}
buffer[pointer] = item;
sum += item;
pointer = (length + pointer + 1) % length;
},
sum: function () {
return sum;
}
};
};
var revs = 0;
$(document).bind('keydown.space', function () {
revs += 1;
var dist = localStorage['multiplier'] * c();
Session.set('distance', Session.get('distance') + dist);
window.traveled += dist;
if (window.traveled >= window.point.distance) {
var next = Points.findOne({_id: window.point.next});
// Go to next point, if one exists
if (next) {
window.traveled -= next.distance;
maps.travel(next._id, {route: true});
window.point = next;
}
}
});
// function speedo() {
// speed_buffer.push(revs * c());
// revs = 0;
// Session.set('speed', speed_buffer.sum() / 5);
// }
// setInterval(speedo, 500);
// 5sec, 2 values / sec.
var speed_buffer = createRingBuffer(5 * 2);
var speed_sum = 0;
var speed_avg = 0;
Template.sim.speed = function () {
return Session.get('speed');
};
Template.sim.distance = function () {
return Session.get('distance');
};
Template.sim.helpers({
kmh: function (ms) {
return (ms * 60 * 60 / 1000).toFixed(1);
},
km: function (m) {
return (m / 1000).toFixed(2);
}
});
// This version is connected to a bicycle using a TI Launchpad which sends data to
// computer using a serialport. Nodejs service reads that data using node-serialport
// and then sends it through websocket.
var sock = new SockJS("http://localhost:9999/speed");
function init_sim() {
sock.onopen = function() {
debug('open');
};
sock.onmessage = function(e) {
if (Session.equals('page', 'sim') && window.point) {
debug('message', e.data);
var dist = parseInt(e.data, 10) * c();
speed_buffer.push(dist);
Session.set('speed', speed_buffer.sum() / 5);
Session.set('distance', Session.get('distance') + localStorage.multiplier * dist);
window.traveled += localStorage.multiplier * dist;
if (window.traveled >= window.point.distance) {
var next = Points.findOne({_id: window.point.next});
// Stay on current point if no next point exists
if (next) {
window.traveled -= next.distance;
maps.travel(next._id, {route: true});
window.point = next;
}
}
}
};
sock.onclose = function() {
debug('close');
};
Meteor.autosubscribe(function () {
if (Session.equals('page', 'sim')) {
var route = Routes.findOne({_id: Session.get('route')});
if (route) {
Session.set('distance', 0);
Session.set('speed', 0);
window.traveled = 0;
maps.lines.traveled.clear();
maps.lines.route.clear();
// Siirytään reitin alkuun
window.point = Points.findOne({_id: route.first});
maps.travel(route.first, {route: true});
// Show full route on map
var p = window.point;
while (p !== undefined) {
maps.lines.route.add(p.latlng);
p = Points.findOne({_id: p.next});
}
}
}
});
}