mirror of
https://github.com/Ekokumppanit/Bicyclesim.git
synced 2026-01-26 03:04:09 +00:00
142 lines
3.1 KiB
JavaScript
142 lines
3.1 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);
|
|
}
|
|
});
|
|
|
|
var sock = new SockJS("http://localhost:9999/speed");
|
|
|
|
function init_sim() {
|
|
|
|
|
|
sock.onopen = function() {
|
|
console.log('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') + 3 * dist);
|
|
window.traveled += 3 * 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});
|
|
zoom = 1;
|
|
zoom_target = 1;
|
|
window.point = next;
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
sock.onclose = function() {
|
|
console.log('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});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
}
|