From 76adadba57c4d63cdb4327b73db467d30c5512d6 Mon Sep 17 00:00:00 2001 From: Juho Teperi Date: Tue, 23 Oct 2012 10:10:03 +0300 Subject: [PATCH] Use serialport data from TI Launchpad instead of keystrokes. --- README.md | 14 ++++----- bicyclesim.sublime-project | 5 +--- client/bicyclesim-meteor.html | 2 +- client/main.sim.js | 53 +++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index eb7b1ab..12e695e 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,9 @@ a speed sensor. ## Speed sensor -Most basic speed sensor would be "Keyboard" that sends a keypress whenever -the wheel has turned one revolution. -This kind of sensor can be built from a old keyboard by soldering a reed switch -to right conductors at keyboard circuit board. Some instructions here: -http://www.instructables.com/id/Hacking-a-USB-Keyboard/. +Most basic speed sensor would be "Keyboard" that sends a keypress whenever the wheel has turned one revolution. +~~This kind of sensor can be built from a old keyboard by soldering a reed switch to right conductors at keyboard circuit board. Some instructions here: http://www.instructables.com/id/Hacking-a-USB-Keyboard/.~~ +Doesn't work. The reed switch wont be closed long enough for the keyboard controller or computer to register wheel revolutions. -It is also possible to built equivalent device from Arduino Uno: -http://mitchtech.net/arduino-usb-hid-keyboard/. -Or more easily with the new Arduino Due: -http://www.i-programmer.info/news/91-hardware/4965-new-powerful-arduino-due-.html. +It should be possible to build working device from Arduino Uno (http://mitchtech.net/arduino-usb-hid-keyboard/) or Arduino Due (http://www.i-programmer.info/news/91-hardware/4965-new-powerful-arduino-due-.html). +Device should read the reed switch status every 1ms and send keypress maybe every 500ms (send 'a' if there was one wheel revolution since last keypress, send 'b' if two etc). diff --git a/bicyclesim.sublime-project b/bicyclesim.sublime-project index d2dd325..497e382 100644 --- a/bicyclesim.sublime-project +++ b/bicyclesim.sublime-project @@ -11,10 +11,7 @@ ".cache", ".meteor" ], - "path": "/home/juho/Source/bicyclesim" - }, - { - "path": "/home/juho/Source/bicyclesim-bundle" + "path": "." } ] } diff --git a/client/bicyclesim-meteor.html b/client/bicyclesim-meteor.html index bc76884..73ecedf 100644 --- a/client/bicyclesim-meteor.html +++ b/client/bicyclesim-meteor.html @@ -98,7 +98,7 @@
Asetukset - + diff --git a/client/main.sim.js b/client/main.sim.js index 6441696..b818bea 100644 --- a/client/main.sim.js +++ b/client/main.sim.js @@ -41,14 +41,14 @@ $(document).bind('keydown.space', function () { } }); -function speedo() { - speed_buffer.push(revs * c()); - revs = 0; +// function speedo() { +// speed_buffer.push(revs * c()); +// revs = 0; - Session.set('speed', speed_buffer.sum() / 5); -} +// Session.set('speed', speed_buffer.sum() / 5); +// } -setInterval(speedo, 500); +// setInterval(speedo, 500); // 5sec, 2 values / sec. var speed_buffer = createRingBuffer(5 * 2); @@ -72,8 +72,49 @@ Template.sim.helpers({ } }); +// 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')});