From 35fe330c77ab7f2ca31b211e19278613a04aaa15 Mon Sep 17 00:00:00 2001 From: semu Date: Mon, 5 Mar 2012 23:10:17 +0100 Subject: [PATCH] Current nice working version --- README.md | 1 + app-old.js | 96 --------------- app.js | 96 --------------- examples.snippet | 76 ++++-------- examples/http_analogled.js | 21 ---- examples/http_ledonoff.js | 26 ---- examples/test.blinkLED.js | 18 +++ examples/test.readAnalogIn.js | 15 +++ examples/test.walkLED.js | 90 ++++++++++++++ public/images/glyphicons-halflings-white.png | Bin 0 -> 4352 bytes public/scripts/app.main.js | 7 ++ public/scripts/app.walkLED.js | 112 ++++++++++++++++++ public/scripts/example-1.js | 6 +- public/scripts/example-2.js | 10 +- public/scripts/example-3.js | 6 +- public/scripts/{events.js => examples.js} | 5 + public/scripts/init.js | 23 ---- public/scripts/libs/AnalogInput.js | 70 ++++++++--- public/scripts/libs/Board.js | 111 ++++++++++++----- public/scripts/libs/Button.js | 12 +- public/scripts/libs/DigitalInput.js | 12 +- public/scripts/libs/LED.js | 12 +- public/scripts/libs/Logger.HTML.js | 62 ++++++++++ public/scripts/libs/Logger.js | 29 +++++ public/scripts/libs/Noduino.Serial.js | 72 ++++------- public/scripts/libs/Noduino.Socket.js | 68 +++++------ public/scripts/libs/Noduino.js | 34 +++++- public/scripts/libs/Speaker.js | 2 +- public/scripts/main.js | 6 - public/scripts/{ => vendor}/domready.js | 0 public/scripts/vendor/dropdown.js | 92 ++++++++++++++ public/scripts/{ => vendor}/prettify.js | 0 public/scripts/{ => vendor}/require-jquery.js | 0 public/styles/init.css | 5 + public/styles/init.less | 30 ++++- public/wiring/walkLED.fzz | Bin 0 -> 9808 bytes public/wiring/walkLED.png | Bin 0 -> 135048 bytes srv.app.js | 17 ++- srv.socket.js | 62 ++++++++-- srv.web.js | 12 ++ test.blinkLED.js | 17 --- test.check.js | 76 ------------ test.walkLED.js | 74 ------------ views/example-walkLED.jade | 80 +++++++++++++ views/home.jade | 48 +++++++- views/includes/snippet.jade | 2 - views/layout.jade | 14 ++- 47 files changed, 967 insertions(+), 660 deletions(-) create mode 100644 README.md delete mode 100644 app-old.js delete mode 100644 app.js delete mode 100644 examples/http_analogled.js delete mode 100644 examples/http_ledonoff.js create mode 100644 examples/test.blinkLED.js create mode 100644 examples/test.readAnalogIn.js create mode 100644 examples/test.walkLED.js create mode 100644 public/images/glyphicons-halflings-white.png create mode 100755 public/scripts/app.main.js create mode 100755 public/scripts/app.walkLED.js rename public/scripts/{events.js => examples.js} (95%) delete mode 100755 public/scripts/init.js create mode 100644 public/scripts/libs/Logger.HTML.js create mode 100644 public/scripts/libs/Logger.js delete mode 100755 public/scripts/main.js rename public/scripts/{ => vendor}/domready.js (100%) create mode 100644 public/scripts/vendor/dropdown.js rename public/scripts/{ => vendor}/prettify.js (100%) rename public/scripts/{ => vendor}/require-jquery.js (100%) create mode 100644 public/wiring/walkLED.fzz create mode 100644 public/wiring/walkLED.png delete mode 100644 test.blinkLED.js delete mode 100644 test.check.js delete mode 100644 test.walkLED.js create mode 100755 views/example-walkLED.jade delete mode 100755 views/includes/snippet.jade diff --git a/README.md b/README.md new file mode 100644 index 0000000..01f3f00 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +Welcome \ No newline at end of file diff --git a/app-old.js b/app-old.js deleted file mode 100644 index 073aba9..0000000 --- a/app-old.js +++ /dev/null @@ -1,96 +0,0 @@ -var kickstart = require('kickstart').withConfig({'name': 'localhost', 'port': 8080, 'path': __dirname}); -var Noduino = new require('./libs/Noduino')({'debug': true}); -var Socket = function(options) { this.io = null; this.sockets = {}; this.arduinos = []; this.checkSocket(); }; -Socket.prototype.checkSocket = function() { if (this.io == null) { this.io = require('socket.io'); } }; -Socket.prototype.bootstrap = function() { - var that = this; - this.io.sockets.on('connection', function(socket) { - that.sockets[socket.id] = socket; - - /** - * Handle incoming requests for connect to an arduino board - */ - that.sockets[socket.id].on('board.connect', function(data) { - if (!data) { - var data = {}; } - if (!data.id) { - data.id = 0; } - - if (that.arduinos[data.id]) { - return socket.emit('response', {'msg': 'board.connect', 'response': 'ready' }); } - Noduino.connect({'type': 'serial'}, function(err, board) { - that.arduinos[data.id] = board; - socket.emit('response', {'msg': 'board.connect', 'response': (!err ? 'ready' : 'failed') }); - }); - }); - }); -}; -Socket.prototype.listen = function(port) { this.io = this.io.listen(port); this.bootstrap(); }; - -var NoduinoServer = new Socket(); -NoduinoServer.listen(8090); - -var srv = kickstart.srv(); - -srv.all('/', function(req, res) { - var examples = { - 'basics': [ '> ls /dev | grep usb', - 'crw-rw-rw- 1 root wheel 18, 17 24 Feb 22:54 cu.usbmodem1d11', - 'crw-rw-rw- 1 root wheel 18, 16 24 Feb 22:00 tty.usbmodem1d11'].join('\n'), - 'node': [ '> npm install', - '> node app.js', - 'Listening on http://localhost:8080'].join('\n'), - 'toggleLED': ["var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " board.withLED({pin: 13}, function(err, LED) {", - " if (err) { return console.log(err); }", - "", - " LED.blink(250);", - " });", - "});"].join('\n'), - 'connect': [ "var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " ", - " console.log('Connected to board');", - "});"].join('\n'), - 'listenButton': [ "var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " ", - " board.withButton({pin: 9}, function(err, Button)) {", - " Button.on(cnst.HIGH, function(mode) {", - " console.log('pushed!');", - " });", - " Button.on(cnst.LOW, function(mode) {", - " console.log('released!');", - " });", - " })", - "});"].join('\n'), - 'analogRead': [ 'noduino.connect(function(err, board) {', - ' if (err) { return console.log(\'failed to connect!\'); }', - ' console.log(\'connected\');', - '});'].join('\n'), - 'digitalRead': [ 'noduino.connect(function(err, board) {', - ' board.registerPin({pin: 9}, function(err, pin) {', - ' pin.digitalRead(function(err, value) {', - ' console.log(\'received value: \' + value);', - ' });', - ' })', - '});'].join('\n'), - 'digitalWrite': [ 'noduino.connect(function(err, board) {', - ' board.registerPin({pin: 9}, function(err, pin) {', - ' pin.digitalWrite(const.HIGH, function(err, value) {', - ' console.log(\'set pin to value: \' + value);', - ' });', - ' })', - '});'].join('\n') - - - } - res.render('home', {title: 'noduino', 'examples': examples}); -}); - -var router = kickstart.listen(); -console.log("Listening on http://%s:%d", kickstart.conf().name, router.address().port); \ No newline at end of file diff --git a/app.js b/app.js deleted file mode 100644 index 073aba9..0000000 --- a/app.js +++ /dev/null @@ -1,96 +0,0 @@ -var kickstart = require('kickstart').withConfig({'name': 'localhost', 'port': 8080, 'path': __dirname}); -var Noduino = new require('./libs/Noduino')({'debug': true}); -var Socket = function(options) { this.io = null; this.sockets = {}; this.arduinos = []; this.checkSocket(); }; -Socket.prototype.checkSocket = function() { if (this.io == null) { this.io = require('socket.io'); } }; -Socket.prototype.bootstrap = function() { - var that = this; - this.io.sockets.on('connection', function(socket) { - that.sockets[socket.id] = socket; - - /** - * Handle incoming requests for connect to an arduino board - */ - that.sockets[socket.id].on('board.connect', function(data) { - if (!data) { - var data = {}; } - if (!data.id) { - data.id = 0; } - - if (that.arduinos[data.id]) { - return socket.emit('response', {'msg': 'board.connect', 'response': 'ready' }); } - Noduino.connect({'type': 'serial'}, function(err, board) { - that.arduinos[data.id] = board; - socket.emit('response', {'msg': 'board.connect', 'response': (!err ? 'ready' : 'failed') }); - }); - }); - }); -}; -Socket.prototype.listen = function(port) { this.io = this.io.listen(port); this.bootstrap(); }; - -var NoduinoServer = new Socket(); -NoduinoServer.listen(8090); - -var srv = kickstart.srv(); - -srv.all('/', function(req, res) { - var examples = { - 'basics': [ '> ls /dev | grep usb', - 'crw-rw-rw- 1 root wheel 18, 17 24 Feb 22:54 cu.usbmodem1d11', - 'crw-rw-rw- 1 root wheel 18, 16 24 Feb 22:00 tty.usbmodem1d11'].join('\n'), - 'node': [ '> npm install', - '> node app.js', - 'Listening on http://localhost:8080'].join('\n'), - 'toggleLED': ["var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " board.withLED({pin: 13}, function(err, LED) {", - " if (err) { return console.log(err); }", - "", - " LED.blink(250);", - " });", - "});"].join('\n'), - 'connect': [ "var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " ", - " console.log('Connected to board');", - "});"].join('\n'), - 'listenButton': [ "var Noduino = new require('./libs/Noduino')({'debug': true});", - "Noduino.connect({'type': 'socket'}, function(err, board) {", - " if (err) { return console.log(err); }", - " ", - " board.withButton({pin: 9}, function(err, Button)) {", - " Button.on(cnst.HIGH, function(mode) {", - " console.log('pushed!');", - " });", - " Button.on(cnst.LOW, function(mode) {", - " console.log('released!');", - " });", - " })", - "});"].join('\n'), - 'analogRead': [ 'noduino.connect(function(err, board) {', - ' if (err) { return console.log(\'failed to connect!\'); }', - ' console.log(\'connected\');', - '});'].join('\n'), - 'digitalRead': [ 'noduino.connect(function(err, board) {', - ' board.registerPin({pin: 9}, function(err, pin) {', - ' pin.digitalRead(function(err, value) {', - ' console.log(\'received value: \' + value);', - ' });', - ' })', - '});'].join('\n'), - 'digitalWrite': [ 'noduino.connect(function(err, board) {', - ' board.registerPin({pin: 9}, function(err, pin) {', - ' pin.digitalWrite(const.HIGH, function(err, value) {', - ' console.log(\'set pin to value: \' + value);', - ' });', - ' })', - '});'].join('\n') - - - } - res.render('home', {title: 'noduino', 'examples': examples}); -}); - -var router = kickstart.listen(); -console.log("Listening on http://%s:%d", kickstart.conf().name, router.address().port); \ No newline at end of file diff --git a/examples.snippet b/examples.snippet index ca2c3f7..dbf6a3e 100644 --- a/examples.snippet +++ b/examples.snippet @@ -8,68 +8,40 @@ crw-rw-rw- 1 root wheel 18, 16 24 Feb 22:00 tty.usbmodem1d11 > node app.js Listening on http://localhost:8080 -###toggleLED -require(['libs/Noduino', 'libs/Noduino.Socket'], function(NoduinoObj, Connector) { - var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, Connector); - Noduino.connect(function(err, board) { - if (err) { return console.log(err); } - board.withLED({pin: 13}, function(err, LED) { - if (err) { return console.log(err); } - - LED.blink(250); - LED.on('change', function() } - console.log('LED changed to ' + (data.mode == Noduino.HIGH ? '[on]' : '[off]')); - }); - }); - }) -}); ###connect -require(['libs/Noduino', 'libs/Noduino.Socket'], function(NoduinoObj, Connector) { - var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, Connector); - Noduino.connect(function(err, board) { - if (err) { return console.log(err); } +var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, Connector); +Noduino.connect(function(err, board) { + if (err) { return console.log(err); } - console.log('Connected to board'); - }); + console.log('Connected to board'); }); -###listenButton -var Noduino = new require('./libs/Noduino')({'debug': true}); -Noduino.connect({'type': 'socket'}, function(err, board) { +###toggleLED +var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, Connector); +Noduino.connect(function(err, board) { if (err) { return console.log(err); } - board.withButton({pin: 9}, function(err, Button)) { - Button.on(cnst.HIGH, function(mode) { - console.log('pushed!'); - }); - - Button.on(cnst.LOW, function(mode) { - console.log('released!'); + board.withLED({pin: 13}, function(err, LED) { + if (err) { return console.log(err); } + + LED.blink(250); + LED.on('on', function() } + console.log('LED is on!'); }); - }) + }); }); - -###analogRead -noduino.connect(function(err, board) { - if (err) { return console.log('failed to connect!'); } - console.log('connected'); -}); +###listenButton +var Noduino = new NoduinoObj({debug: true, host: 'http://localhost:8090'}, Connector); +Noduino.connect(function(err, board) { + if (err) { return console.log(err); } + board.withButton({pin: 13}, function(err, Button) { + if (err) { return console.log(err); } -###digitalRead -noduino.connect(function(err, board) { - board.registerPin({pin: 9}, function(err, pin) { - pin.digitalRead(function(err, value) { - console.log('received value: ' + value); + Button.on('push', function() } + console.log('Button pushed'); }); + + Button.push(); }); }); - -###digitalWrite -noduino.connect(function(err, board) { - board.registerPin({pin: 9}, function(err, pin) { - pin.digitalWrite(const.HIGH, function(err, value) { - console.log('set pin to value: ' + value); - }); - }) -}); \ No newline at end of file diff --git a/examples/http_analogled.js b/examples/http_analogled.js deleted file mode 100644 index ba77a61..0000000 --- a/examples/http_analogled.js +++ /dev/null @@ -1,21 +0,0 @@ -var arduino = require('./duino/'); - -var board = new arduino.Board({debug: true}); -var aled = new arduino.Led({board: board, pin: 9}); - -board.on('ready', function(){ - var app = require('express').createServer(); - - app.get('/', function(req, res){ - res.send(''); - }); - - app.get('/fade/:level', function(req, res){ - aled.brightLevel(req.param('level')); - res.send('set to: ' + req.param('level')); - }); - - app.listen(8080); - - console.log('Listening on http://127.0.0.1:8080'); -}); diff --git a/examples/http_ledonoff.js b/examples/http_ledonoff.js deleted file mode 100644 index a579ae9..0000000 --- a/examples/http_ledonoff.js +++ /dev/null @@ -1,26 +0,0 @@ -var arduino = require('../duino/'); - -var board = new arduino.Board({debug: true}); -var led = new arduino.Led({board: board}); - -board.on('ready', function(){ - var app = require('express').createServer(); - - app.get('/', function(req, res){ - res.send('ON OFF'); - }); - - app.get('/on', function(req, res){ - led.on(); - res.redirect('/'); - }); - - app.get('/off', function(req, res){ - led.off(); - res.redirect('/'); - }); - - app.listen(8080); - - console.log('Listening on http://127.0.0.1:8080'); -}); \ No newline at end of file diff --git a/examples/test.blinkLED.js b/examples/test.blinkLED.js new file mode 100644 index 0000000..1a09068 --- /dev/null +++ b/examples/test.blinkLED.js @@ -0,0 +1,18 @@ +var requirejs = require('requirejs'); +requirejs.config({nodeRequire: require}); + +requirejs(['../public/scripts/libs/Noduino', '../public/scripts/libs/Noduino.Serial', '../public/scripts/libs/Logger'], function (NoduinoObj, NoduinoConnector, Logger) { + var Noduino = new NoduinoObj({'debug': false}, NoduinoConnector, Logger); + Noduino.connect(function(err, board) { + if (err) { return console.log(err); } + + board.withLED({pin: 12}, function(err, LED) { + if (err) { return console.log(err); } + + LED.blink(250); + LED.on('on', function(e) { + console.log('LED is on!'); + }); + }); + }); +}); \ No newline at end of file diff --git a/examples/test.readAnalogIn.js b/examples/test.readAnalogIn.js new file mode 100644 index 0000000..2aa2b93 --- /dev/null +++ b/examples/test.readAnalogIn.js @@ -0,0 +1,15 @@ +var requirejs = require('requirejs'); +requirejs.config({nodeRequire: require}); + +requirejs(['../public/scripts/libs/Noduino', '../public/scripts/libs/Noduino.Serial', '../public/scripts/libs/Logger'], function (NoduinoObj, NoduinoConnector, Logger) { + var Noduino = new NoduinoObj({'debug': false}, NoduinoConnector, Logger); + Noduino.connect(function(err, board) { + if (err) { return console.log(err); } + + board.withAnalogInput({pin: 'A0'}, function(err, AnalogInput) { + AnalogInput.on('change', function(a) { + console.log('read value: ' + a.value); + }); + }); + }); +}); \ No newline at end of file diff --git a/examples/test.walkLED.js b/examples/test.walkLED.js new file mode 100644 index 0000000..f19ff85 --- /dev/null +++ b/examples/test.walkLED.js @@ -0,0 +1,90 @@ +var requirejs = require('requirejs'); +requirejs.config({nodeRequire: require}); + +var maxLEDs = 6; +var current = 1; +var direction = -1; +var curInterval = 100; +var currentStepper = null; +var LEDlist = []; +var sorting = [12, 11, 10, 9, 8, 7]; + +/** + * Set LED up and running. If all LEDs are connected start the blinking sequence + * @param object led + */ +function readyLED(led) { + LEDlist[sorting.indexOf(led.pin)] = led; + if (LEDlist.length == maxLEDs) { + startSequence(-1, curInterval); } +} + +/** + * Add Button and watch for push event + * @param object Button + */ +function addButton(Button) { + Button.on('push', function(e) { + var newDirection = direction; + + switch (Button.pin) { + case '04': newDirection = -1; break; + case '02': newDirection = 1; break; + } + + if (newDirection != direction) { + startSequence(newDirection, curInterval); + } + }); +} + +/** + * Iterate through LEDs + * This code is noduino-free, no need to modify this + */ +function stepper() { + var next = current + direction; + if (next == maxLEDs + 1) { + next = 1; } + if (next == 0) { + next = maxLEDs; } + current = next; + for (var i = 1; i <= maxLEDs; i++) { + LEDlist[i-1].setOff(); } + LEDlist[(current-1)].setOn(); +} + +/** + * Start blinking sequence if all LEDs are up and running + */ +function startSequence(step, interval) { + if (LEDlist.length != maxLEDs) { + return; }; + + clearInterval(currentStepper); + direction = step || 1; + currentStepper = setInterval(function() { + return stepper(); + }, interval); +} + +requirejs(['../public/scripts/libs/Noduino', '../public/scripts/libs/Noduino.Serial', '../public/scripts/libs/Logger'], function (NoduinoObj, NoduinoConnector, Logger) { + var Noduino = new NoduinoObj({'debug': true}, NoduinoConnector, Logger); + Noduino.connect(function(err, board) { + if (err) { return console.log(err); } + + board.withLED({pin: 12}, function(err, LED) { readyLED(LED); }); + board.withLED({pin: 11}, function(err, LED) { readyLED(LED); }); + board.withLED({pin: 10}, function(err, LED) { readyLED(LED); }); + board.withLED({pin: 9}, function(err, LED) { readyLED(LED); }); + board.withLED({pin: 8}, function(err, LED) { readyLED(LED); }); + board.withLED({pin: 7}, function(err, LED) { readyLED(LED); }); + board.withButton({pin: 2}, function(err, Button) { addButton(Button); }); + board.withButton({pin: 4}, function(err, Button) { addButton(Button); }); + board.withAnalogInput({pin: 'A0'}, function(err, AnalogInput) { + AnalogInput.on('change', function(a) { + curInterval = a.value; startSequence(direction, curInterval); + }); + }); + }); +}); \ No newline at end of file diff --git a/public/images/glyphicons-halflings-white.png b/public/images/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..a20760bfde58d1c92cee95116059fba03c68d689 GIT binary patch literal 4352 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 + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ + define(function() { + /** + * Create AnalogInput + * @param object options set options like pin + * @param object Connector switch between Serial or Socket mode + */ function AnalogInput(options, Connector) { if (false === (this instanceof AnalogInput)) { return new AnalogInput(options); } - this.c = Connector; - this.pin = options.pin; - this.events = {}; - this.value = null; + this.c = Connector; + this.pin = options.pin; + this.events = {}; + this.value = null; + this.tolerance = 3; this.watch(); } - AnalogInput.prototype.watch = function() { - this.c.watchAnalogIn(this); - } - + /** + * Run binded events for given event + * @param string event + */ + AnalogInput.prototype.emit = function(event) { + if (!this.events[event]) { + return; } + for (var i = 0; i < this.events[event].length; i++) { + this.events[event][i](this); + } + }; + + /** + * Bind event to AnalogInput + * @param string event name of event + * @param function callback + */ AnalogInput.prototype.on = function(event, callback) { if (!this.events[event]) { this.events[event] = []; } this.events[event].push(callback); }; + /** + * Update value of AnlogInput + * @param integer value + * @param function callback + */ AnalogInput.prototype.set = function(value, callback) { var tmp = this.value - value; - if (tmp > -2 && tmp < 2) { + if (tmp > (-1 * this.tolerance) && tmp < this.tolerance) { return; } + if (this.value != value) { - this.value = value; + this.value = value; this.emit('change'); } }; - - AnalogInput.prototype.emit = function(event, callback) { - if (!this.events[event]) { - return; } - for (var i = 0; i < this.events[event].length; i++) { - this.events[event][i](this); - } - }; + + /** + * Watch AnalogInput for new incoming data + */ + AnalogInput.prototype.watch = function() { + this.c.watchAnalogIn(this); + } return AnalogInput; }); \ No newline at end of file diff --git a/public/scripts/libs/Board.js b/public/scripts/libs/Board.js index e47e965..52d0c7b 100644 --- a/public/scripts/libs/Board.js +++ b/public/scripts/libs/Board.js @@ -1,14 +1,20 @@ -var cnst = { - 'LED': 0x31, - 'DIGITAL_OUT': 0x31, - 'BOTTON': 0x32, - 'ANALOG_IN': 0x33, - 'HIGH': 'on', - 'LOW': 'off', -}; +/** + * Board.js – Arduino Board Controller + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ -define(['./LED', './Button', './AnalogInput', './DigitalOutput', './Speaker'], function(LEDObj, ButtonObj, AnalogInputObj, DigitalOutObj, SpeakerObj) { +define(['./LED.js', './Button.js', './AnalogInput.js', './DigitalOutput.js', './Speaker.js'], function(LEDObj, ButtonObj, AnalogInputObj, DigitalOutObj, SpeakerObj) { + /** + * Create Board + * @param object options set options like pin + * @param object Connector switch between Serial or Socket mode + */ function Board(options, Connector) { if (false === (this instanceof Board)) { return new Board(options); } @@ -18,40 +24,87 @@ define(['./LED', './Button', './AnalogInput', './DigitalOutput', './Speaker'], this.pinMapping = {}; }; - Board.prototype.pinType = function(pin) { - return this.pinMapping[pin]; - } - - Board.prototype.pinAvailable = function(pin) { - return (this.pinMapping[pin]); - }; - + /** + * Write to digital output on pin + * @param integer pin pin number + * @param string mod pin mode + * @param function callback + */ Board.prototype.digitalWrite = function(pin, mode, next) { this.c.digitalWrite(pin, mode, function(err) { if (err) { return next(err); } }); }; - - Board.prototype.withLED = function(options, next) { - return this.with(this.c.TYPE_LED, options, next); - }; - Board.prototype.withButton = function(options, next) { - return this.with(this.c.TYPE_BUTTON, options, next); + /** + * Check if pin is already in use + * @param integer pin pin number + * @return boolean + */ + Board.prototype.pinAvailable = function(pin) { + return (this.pinMapping[pin] ? true : false); }; + + /** + * Get type of pin on board + * @param integer pin pin number + * @return mixed + */ + Board.prototype.pinType = function(pin) { + return this.pinMapping[pin]; + } + /** + * Create AnalogInput object on board + * @param object options + * @param function callback + */ Board.prototype.withAnalogInput = function(options, next) { - return this.with(this.c.TYPE_ANALOGIN, options, next); + this.with(this.c.TYPE_ANALOGIN, options, next); } - Board.prototype.withSpeaker = function(options, next) { - return this.with(this.c.TYPE_SPEAKER, options, next); + /** + * Create Button object on board + * @param object options + * @param function callback + */ + Board.prototype.withButton = function(options, next) { + this.with(this.c.TYPE_BUTTON, options, next); }; + /** + * Create DigitalOutput object on board + * @param object options + * @param function callback + */ Board.prototype.withDigitalOutput = function(options, next) { - return this.with(this.c.TYPE_DIGITALOUT, options, next); + this.with(this.c.TYPE_DIGITALOUT, options, next); + }; + + /** + * Create LED object on board + * @param object options + * @param function callback + */ + Board.prototype.withLED = function(options, next) { + this.with(this.c.TYPE_LED, options, next); + }; + + /** + * Create Speaker object on board + * @param object options + * @param function callback + */ + Board.prototype.withSpeaker = function(options, next) { + this.with(this.c.TYPE_SPEAKER, options, next); }; + /** + * Handle object creation + * @param string what object type + * @param object options + * @param function callback + */ Board.prototype.with = function(what, options, next) { if (this.pinAvailable(options.pin)) { return next(new Error('PIN already in use')); } @@ -69,9 +122,7 @@ define(['./LED', './Button', './AnalogInput', './DigitalOutput', './Speaker'], case this.c.TYPE_BUTTON: this.c.withButton(options.pin, function(err, pin) { if (err) { return next(err); } - var c = new ButtonObj({"pin": pin, "type": what}, that.c); - console.log(c); - next(null, c); + next(null, new ButtonObj({"pin": pin, "type": what}, that.c)); }); break; case this.c.TYPE_ANALOGIN: diff --git a/public/scripts/libs/Button.js b/public/scripts/libs/Button.js index 23e7e9f..f65a7a0 100644 --- a/public/scripts/libs/Button.js +++ b/public/scripts/libs/Button.js @@ -1,3 +1,13 @@ -define(['./DigitalInput'], function(Button) { +/** + * Button.js – Button Controller + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ + +define(['./DigitalInput.js'], function(Button) { return Button; }); \ No newline at end of file diff --git a/public/scripts/libs/DigitalInput.js b/public/scripts/libs/DigitalInput.js index fda408c..7064942 100644 --- a/public/scripts/libs/DigitalInput.js +++ b/public/scripts/libs/DigitalInput.js @@ -1,3 +1,13 @@ +/** + * DigitalInput.js – Basic DigitalInput Controller0 + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ + define(function() { function DigitalInput(options, Connector) { @@ -5,7 +15,7 @@ define(function() { return new DigitalInput(options); } this.c = Connector; - this.pin = options.pin; + this.pin = this.c.normalizePin(options.pin); this.pushed = false; this.events = {}; diff --git a/public/scripts/libs/LED.js b/public/scripts/libs/LED.js index 37826df..f2b837b 100644 --- a/public/scripts/libs/LED.js +++ b/public/scripts/libs/LED.js @@ -1,17 +1,21 @@ -define(['./DigitalOutput'], function(LED) { +define(['./DigitalOutput.js'], function(LED) { LED.prototype.toggle = function(callback) { if (this.mode == this.c.LOW) { return this.setOn(callback); } this.setOff(callback); }; + + LED.prototype.stopBlinking = function() { + if (this.interval) { + clearInterval(this.interval); } + } LED.prototype.blink = function(interval) { if (interval*1 < 25) { interval = 50; } - if (this.interval) { - clearInterval(this.interval); } - + this.stopBlinking(); + var that = this; this.interval = setInterval(function(){ that.toggle(); diff --git a/public/scripts/libs/Logger.HTML.js b/public/scripts/libs/Logger.HTML.js new file mode 100644 index 0000000..40a92d2 --- /dev/null +++ b/public/scripts/libs/Logger.HTML.js @@ -0,0 +1,62 @@ +define(function() { + + function HTMLLogger(options) { + if (false === (this instanceof HTMLLogger)) { + return new HTMLLogger(options); } + + this.container = 'connection-log'; + this.counter = 0; + }; + + HTMLLogger.prototype.setOption = function(key, value) { + this[key] = value; + }; + + HTMLLogger.prototype.setContainer = function(selector) { + this.container = selector; + }; + + HTMLLogger.prototype.msg = function(level, msg) { + if (!msg) { + msg = level; + level = 'info'; + } + + this.addMessage(level, msg); + }; + + HTMLLogger.prototype.colorizeLogLevel = function(level) { + var levelclass = ''; + switch (level) { + case 'info': + break; + case 'gui': + levelclass = 'label-important'; + break; + case 'success': + levelclass = 'label-success'; + break; + case 'socket-write': + levelclass = 'label-info'; + break; + case 'socket-read': + levelclass = 'label-warning'; + break; + } + + return '' + level + ''; + }; + + HTMLLogger.prototype.addMessage = function(level, msg) { + $("#connection-log").append($('
$ > ' + Date.now() + ' – ' + this.colorizeLogLevel(level) + ' ' + msg + '
')); + // var objDiv = document.getElementById("connection-log"); + // objDiv.scrollTop = objDiv.scrollHeight; + + this.counter++; + if (this.counter > 18) { + $("#connection-log .item:nth-child(1)").remove(); + } + }; + + return HTMLLogger; +}); \ No newline at end of file diff --git a/public/scripts/libs/Logger.js b/public/scripts/libs/Logger.js new file mode 100644 index 0000000..8858d52 --- /dev/null +++ b/public/scripts/libs/Logger.js @@ -0,0 +1,29 @@ +define(function() { + + function ConsoleLogger(options) { + if (false === (this instanceof ConsoleLogger)) { + return new ConsoleLogger(options); } + if (!options) { + var options = {}; } + + this.delegate = null; + this.debug = options.debug || false; + }; + + ConsoleLogger.prototype.msg = function(level, msg) { + if (!msg) { + msg = level; + level = 'info'; + } + + this.addMessage(level, msg); + }; + + ConsoleLogger.prototype.addMessage = function(level, msg) { + if (!this.debug) { + return; } + console.log(arguments); + }; + + return ConsoleLogger; +}); \ No newline at end of file diff --git a/public/scripts/libs/Noduino.Serial.js b/public/scripts/libs/Noduino.Serial.js index 1c0410e..7a7be72 100644 --- a/public/scripts/libs/Noduino.Serial.js +++ b/public/scripts/libs/Noduino.Serial.js @@ -7,6 +7,15 @@ define(function(require, exports, module) { this.options = options; this.boards = []; this.board = null; + this.logger = null; + }; + + SerialNoduino.prototype.setLogger = function(Logger) { + this.logger = Logger; + }; + + SerialNoduino.prototype.log = function(level, msg) { + this.logger.msg(level, msg); }; SerialNoduino.prototype.connection = 'serial'; @@ -35,7 +44,7 @@ define(function(require, exports, module) { new Board({'debug': this.options.debug || false}, function(err, board) { if (err) { return next(new Error('Unable to connect')); } - // Disabled multi board support now + // Disabled multi board support now, but keep in mind… that.boards = [board]; that.board = 0; @@ -60,11 +69,10 @@ define(function(require, exports, module) { } SerialNoduino.prototype.digitalWrite = function(pin, mode, next) { - console.log('set ' + pin + ': ' + mode); this.current().digitalWrite(pin, mode, next); }; - SerialNoduino.prototype.watchAnalogIn = function(AnalogInput) { + SerialNoduino.prototype.watchAnalogIn = function(AnalogInput, callback) { var that = this; setInterval(function () { that.current().analogRead(AnalogInput.pin); @@ -72,14 +80,13 @@ define(function(require, exports, module) { this.current().on('data', function(m) { m = m.split('::'); - var eventPin = m[0]*1; - if (m[0].indexOf('A') > -1) { - eventPin = m[0]; } - - var event = {pin: eventPin, 'state': m[1]*1}; + var event = {pin: that.normalizePin(m[0]), 'state': m[1]*1}; + + if (callback) { + return callback(event); } + if (event.pin == AnalogInput.pin) { - AnalogInput.set(event.state); - } + AnalogInput.set(event.state); } }); } @@ -91,20 +98,13 @@ define(function(require, exports, module) { return ("00" + pin).substr(-2); }; - - SerialNoduino.prototype.log = function (level, message) { - console.log(message); - } - - SerialNoduino.prototype.digitalRead = function(pin) { - console.log(pin); pin = this.normalizePin(pin); this.log('info', 'digitalRead from pin ' + pin); this.write('02' + pin + this.normalizeVal(0)); }; - SerialNoduino.prototype.watchDigitalIn = function(DigitalIn) { + SerialNoduino.prototype.watchDigitalIn = function(DigitalIn, callback) { var that = this; setInterval(function () { @@ -113,8 +113,11 @@ define(function(require, exports, module) { this.current().on('data', function(m) { m = m.split('::'); - var event = {pin: m[0]*1, 'state': m[1]*1}; - + var event = {pin: that.normalizePin(m[0]), 'state': m[1]*1}; + + if (callback) { + return callback(event); } + if (event.pin == DigitalIn.pin) { if (event.state == 0 && DigitalIn.isOn()) { DigitalIn.setOff(); @@ -124,32 +127,7 @@ define(function(require, exports, module) { } } }); - } - - - - /* SerialNoduino.prototype.watchDigitalIn = function(Button) { - var that = this; - - setInterval(function () { - that.digitalRead(Button.pin); - }, 50); - - this.current().on('data', function(m) { - m = m.split('::'); - var event = {pin: m[0]*1, 'state': m[1]*1}; - - if (event.pin == Button.pin) { - if (event.state == 0 && Button.pushed) { - Button.release(); - } - if (event.state == 1 && !Button.pushed) { - Button.push(); - } - } - }); - } */ + }; return SerialNoduino; -}); - +}); \ No newline at end of file diff --git a/public/scripts/libs/Noduino.Socket.js b/public/scripts/libs/Noduino.Socket.js index 712d15f..37ecf13 100644 --- a/public/scripts/libs/Noduino.Socket.js +++ b/public/scripts/libs/Noduino.Socket.js @@ -15,13 +15,21 @@ define(function(require, exports, module) { this.options = options; this.boards = []; this.board = null; - + this.logger = null; this.io = null; this.sockets = []; this.callbacks= {}; this.checkSocket(); }; + SocketNoduino.prototype.setLogger = function(Logger) { + this.logger = Logger; + }; + + SocketNoduino.prototype.log = function(level, msg) { + return this.logger.msg(level, msg); + }; + SocketNoduino.prototype.connection = 'serial'; SocketNoduino.prototype.HIGH = '255'; SocketNoduino.prototype.LOW = '000'; @@ -42,7 +50,6 @@ define(function(require, exports, module) { SocketNoduino.prototype.checkSocket = function() { /** This is Client code: This works in your web browser */ if (!this.io) { - console.log('connect to: ' + this.options.host); this.io = io.connect(this.options.host); this.boards[0] = Board; } @@ -82,19 +89,20 @@ define(function(require, exports, module) { this.callbacks['board.connect'] = []; } this.callbacks['board.connect'].push(next); - - this.io.emit('board.connect'); + this.log('sending command through socket'); + this.pushSocket('board.connect'); return; } + SocketNoduino.prototype.pushSocket = function(type, data) { + this.log('socket-write', type + ': ' + JSON.stringify(data)); + this.io.emit(type, data); + } + SocketNoduino.prototype.write = function(cmd, callback) { this.log('info', 'writing: ' + cmd); - this.io.emit('serial', {'type': 'write', 'write': cmd, 'id': this.io.socket.sessionid}); - }; - - SocketNoduino.prototype.sendCommand = function(cmd, callback) { - // this.io.emit('serial', {'send': cmd}); + this.pushSocket('serial', {'type': 'write', 'write': cmd, 'id': this.io.socket.sessionid}); }; SocketNoduino.prototype.pinMode = function(pin, val) { @@ -113,17 +121,12 @@ define(function(require, exports, module) { return ("00" + pin).substr(-2); }; - SocketNoduino.prototype.log = function (level, message) { - console.log(message); - } - SocketNoduino.prototype.withLED = function(pin, next) { this.pinMode(pin, this.MODE_OUT); next(null, pin); }; SocketNoduino.prototype.withButton = function(pin, next) { - console.log('in NoduinoSocket.withButton'); this.pinMode(pin, this.MODE_IN); next(null, pin); }; @@ -144,39 +147,36 @@ define(function(require, exports, module) { }; SocketNoduino.prototype.watchAnalogIn = function(AnalogInput) { - return; - - var that = this; - setInterval(function () { - that.current().analogRead(AnalogInput.pin); - }, 50); - - this.current().on('data', function(m) { - m = m.split('::'); - var eventPin = m[0]*1; - if (m[0].indexOf('A') > -1) { - eventPin = m[0]; } - var event = {pin: eventPin, 'state': m[1]*1}; - if (event.pin == AnalogInput.pin) { - AnalogInput.set(event.state); + this.analogRead(AnalogInput.pin); + this.io.on('response', function(data) { + if (data.type == 'analogRead' && data.pin == AnalogInput.pin) { + that.log('socket-read', JSON.stringify(data)); + var event = {pin: data.pin, value: data.value*1}; + if (event.pin == AnalogInput.pin) { + AnalogInput.set(event.value); + } } }); } - SocketNoduino.prototype.digitalRead = function (DigitalIn) { - pin = this.normalizePin(DigitalIn.pin); - this.io.emit('serial', {'type': 'digitalRead', 'pin': pin}); + SocketNoduino.prototype.analogRead = function (pin) { + this.pushSocket('serial', {'type': 'analogRead', 'pin': this.normalizePin(pin)}); } + SocketNoduino.prototype.digitalRead = function (pin) { + this.pushSocket('serial', {'type': 'digitalRead', 'pin': this.normalizePin(pin)}); + } SocketNoduino.prototype.watchDigitalIn = function(DigitalIn) { var that = this; + this.digitalRead(DigitalIn.pin); this.io.on('response', function(data) { - if (data.type == 'digitalRead') { - console.log(data); + if (data.type == 'digitalRead' && data.pin == DigitalIn.pin) { + that.log('socket-read', JSON.stringify(data)); + if (data.value == 1) { DigitalIn.setOn(); } else { diff --git a/public/scripts/libs/Noduino.js b/public/scripts/libs/Noduino.js index 4a573f4..ee0b24c 100644 --- a/public/scripts/libs/Noduino.js +++ b/public/scripts/libs/Noduino.js @@ -1,18 +1,37 @@ -define(['./Board'], function (objBoard, ConnectorSerial, ConnectorSocket) { - +define(['./Board.js'], function (objBoard) { /** * Create Noduini object for handling general access * @param object options */ - function Noduino(options, Connector) { + function Noduino(options, Connector, Logger) { if (false === (this instanceof Noduino)) { return new Noduino(options); } - this.c = new Connector(options); + this.c = new Connector(options) + this.logger = new Logger(options); this.options = options; this.options.type = this.c.connection; + this.connected = false; + + this.setLoggerOptions(); + this.setLogger(); + }; + + Noduino.prototype.setLoggerOptions = function() { + if (!this.options.logger) { + return; } + for (var n in this.options.logger) { + this.logger.setOption(n, this.options.logger[n]); } + }; + + Noduino.prototype.setLogger = function() { + this.c.setLogger(this.logger); }; + Noduino.prototype.log = function(level, msg) { + this.c.log(level, msg); + } + Noduino.prototype.write = function(data) { this.c.write(data); } @@ -20,17 +39,24 @@ define(['./Board'], function (objBoard, ConnectorSerial, ConnectorSocket) { Noduino.prototype.digitalRead = function(pin) { this.c.digitalRead(pin); } + + Noduino.prototype.watchAnalogIn = function(pin, callback) { + this.c.watchAnalogIn(pin, callback); + } Noduino.prototype.watchDigitalIn = function(pin, callback) { this.c.watchDigitalIn(pin, callback); } Noduino.prototype.connect = function(options, callback) { + this.log('connecting to noduino'); + if (!callback) { callback = options; options = {}; } var that = this; this.c.connect(options, function(err, board) { if (err) { return callback(err); } + that.connected = true; callback(null, new objBoard(options, that.c)); }); } diff --git a/public/scripts/libs/Speaker.js b/public/scripts/libs/Speaker.js index 781410f..7532d8b 100644 --- a/public/scripts/libs/Speaker.js +++ b/public/scripts/libs/Speaker.js @@ -1,4 +1,4 @@ -define(['./DigitalOutput'], function (Speaker) { +define(['./DigitalOutput.js'], function (Speaker) { Speaker.prototype.isMuted = function() { return !this.active; diff --git a/public/scripts/main.js b/public/scripts/main.js deleted file mode 100755 index 03d22e9..0000000 --- a/public/scripts/main.js +++ /dev/null @@ -1,6 +0,0 @@ -require(["jquery", "prettify", "events"], function($, p, events) { - $(document).ready(function(e) { - prettyPrint(); - events.bind(); - }); -}); \ No newline at end of file diff --git a/public/scripts/domready.js b/public/scripts/vendor/domready.js similarity index 100% rename from public/scripts/domready.js rename to public/scripts/vendor/domready.js diff --git a/public/scripts/vendor/dropdown.js b/public/scripts/vendor/dropdown.js new file mode 100644 index 0000000..f1f6c33 --- /dev/null +++ b/public/scripts/vendor/dropdown.js @@ -0,0 +1,92 @@ +/* ============================================================ + * bootstrap-dropdown.js v2.0.1 + * http://twitter.github.com/bootstrap/javascript.html#dropdowns + * ============================================================ + * Copyright 2012 Twitter, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============================================================ */ + + +!function( $ ){ + + "use strict" + + /* DROPDOWN CLASS DEFINITION + * ========================= */ + + var toggle = '[data-toggle="dropdown"]' + , Dropdown = function ( element ) { + var $el = $(element).on('click.dropdown.data-api', this.toggle) + $('html').on('click.dropdown.data-api', function () { + $el.parent().removeClass('open') + }) + } + + Dropdown.prototype = { + + constructor: Dropdown + + , toggle: function ( e ) { + var $this = $(this) + , selector = $this.attr('data-target') + , $parent + , isActive + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7 + } + + $parent = $(selector) + $parent.length || ($parent = $this.parent()) + + isActive = $parent.hasClass('open') + + clearMenus() + !isActive && $parent.toggleClass('open') + + return false + } + + } + + function clearMenus() { + $(toggle).parent().removeClass('open') + } + + + /* DROPDOWN PLUGIN DEFINITION + * ========================== */ + + $.fn.dropdown = function ( option ) { + return this.each(function () { + var $this = $(this) + , data = $this.data('dropdown') + if (!data) $this.data('dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + $.fn.dropdown.Constructor = Dropdown + + + /* APPLY TO STANDARD DROPDOWN ELEMENTS + * =================================== */ + + $(function () { + $('html').on('click.dropdown.data-api', clearMenus) + $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle) + }) + +}( window.jQuery ); \ No newline at end of file diff --git a/public/scripts/prettify.js b/public/scripts/vendor/prettify.js similarity index 100% rename from public/scripts/prettify.js rename to public/scripts/vendor/prettify.js diff --git a/public/scripts/require-jquery.js b/public/scripts/vendor/require-jquery.js similarity index 100% rename from public/scripts/require-jquery.js rename to public/scripts/vendor/require-jquery.js diff --git a/public/styles/init.css b/public/styles/init.css index cd7416d..f353c00 100644 --- a/public/styles/init.css +++ b/public/styles/init.css @@ -93,3 +93,8 @@ form.well{padding:14px;} .response.error{color:red;} label.label{display:inline;} #e2-secondStep select{margin-right:4px;} +.exampleLinks{margin-top:8px;} +.range{margin-bottom:0px;position:relative;top:-9px;margin-left:12px;width:373px;} +.interval{margin-bottom:0px;position:relative;top:-9px;margin-left:12px;width:60px;} +.collectedTags{margin-top:14px;} +#connection-log{height:358px;overflow:hidden;padding-top:4px;overflow-x:hidden;margin-bottom:16px;} diff --git a/public/styles/init.less b/public/styles/init.less index 64f07cf..3892d53 100755 --- a/public/styles/init.less +++ b/public/styles/init.less @@ -814,4 +814,32 @@ label.label { display: inline; } #e2-secondStep select { margin-right: 4px; -} \ No newline at end of file +} +.exampleLinks { + margin-top: 8px; +} +.range { + margin-bottom: 0px; + position: relative; + top: -9px; + margin-left: 12px; + width: 373px; +} +.interval { + margin-bottom: 0px; + position: relative; + top: -9px; + margin-left: 12px; + width: 60px; +} +.collectedTags { + margin-top: 14px; +} + +#connection-log { + height: 358px; + overflow: hidden; + padding-top: 4px; + overflow-x: hidden; + margin-bottom: 16px; +} diff --git a/public/wiring/walkLED.fzz b/public/wiring/walkLED.fzz new file mode 100644 index 0000000000000000000000000000000000000000..c3a75ce969827ccd29ca4ecad241cb72d82b9b05 GIT binary patch literal 9808 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

P#+E=2b$T;+oH0t^8g$#5Y6m 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 z

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 L(NL;*Y!3S$FxSBy literal 0 HcmV?d00001 diff --git a/srv.app.js b/srv.app.js index fa09519..038160d 100644 --- a/srv.app.js +++ b/srv.app.js @@ -1,3 +1,12 @@ +/** + * srv.app.js – Handling HTTP:80 Requests + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ define(['kickstart', 'module', 'path', 'fs'], function (kickstart, module, path, fs) { var kickstart = kickstart.withConfig({'name': 'localhost', 'port': 8080, 'path': './'}); var srv = kickstart.srv(); @@ -13,8 +22,12 @@ define(['kickstart', 'module', 'path', 'fs'], function (kickstart, module, path, } srv.all('/', function(req, res) { - res.render('home', {title: 'noduino', 'examples': examples}); + res.render('home', {jsApp: 'main', active: 'home', title: 'noduino', 'examples': examples}); }); - + + srv.all('/examples/walkLED.html', function(req, res) { + res.render('example-walkLED', {jsApp: 'walkLED', active: 'examples', title: 'noduino', 'examples': examples}); + }); + return {'kickstart': kickstart, 'srv': srv}; }); \ No newline at end of file diff --git a/srv.socket.js b/srv.socket.js index aaf1872..d745266 100644 --- a/srv.socket.js +++ b/srv.socket.js @@ -1,50 +1,86 @@ -define(['socket.io', 'public/scripts/libs/Noduino', 'public/scripts/libs/Noduino.Serial'], function(io, Noduino, Connector) { +/** + * srv.web.js – Handling Socket.IO Requests + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ +define(['socket.io', 'public/scripts/libs/Noduino', 'public/scripts/libs/Noduino.Serial', 'public/scripts/libs/Logger'], function(io, Noduino, Connector, Logger) { + /** + * Define SocketHandler + * @param object socket Socket.IO + */ var SocketHandler = function(socket) { this.sockets = {}; this.arduinos = {}; this.handler = socket.listen(8090); + this.pinCache = {}; this.bindings(); }; + /** + * Get selected Arduino + */ SocketHandler.prototype.current = function() { return this.arduinos[0]; }; + /** + * Connect Bindings + */ SocketHandler.prototype.bindings = function() { var io = this.handler, that = this; io.sockets.on('connection', function(socket) { that.sockets[socket.id] = socket; + /** + * Incoming Serial Request + */ that.sockets[socket.id].on('serial', function(data) { switch (data.type) { case 'write': that.current().write(data.write); break; + case 'analogRead': + var curPin = data.pin; + that.current().watchAnalogIn({'pin': data.pin}, function(m) { + if (!m.pin || m.pin == null || m.pin == NaN) { + return; } + + if (m.state != that.pinCache[m.pin] && curPin == m.pin) { + socket.emit('response', {'type': 'analogRead', 'pin': m.pin, 'value': m.state}); + that.pinCache[m.pin] = m.state; + } + }); + break; case 'digitalRead': - var currentValue = null; - that.current().watchDigitalIn(data.pin*1, function(m) { - if (currentValue == null || currentValue != m.state) { - socket.emit('response', {'type': 'digitalRead', 'pin': m.ping, 'value': m.state}); - currentValue = m.state; + var curPin = data.pin; + that.current().watchDigitalIn({'pin': data.pin}, function(m) { + if (!m.pin || m.pin == null || m.pin == NaN) { + return; } + + if (m.state != that.pinCache[m.pin] && curPin == m.pin) { + socket.emit('response', {'type': 'digitalRead', 'pin': m.pin, 'value': m.state}); + that.pinCache[m.pin] = m.state; } }); break; } - console.log(data); }); - that.sockets[socket.id].on('command.send', function(data) { - console.log(data); - }); - + /** + * Connect to Arduino + */ that.sockets[socket.id].on('board.connect', function(data) { if (that.current() && that.current().connected == true) { return socket.emit('response', {'msg': 'board.connect', 'response': 'ready'}); } - that.arduinos[0] = new Noduino({'debug': true}, Connector); + that.arduinos[0] = new Noduino({'debug': true}, Connector, Logger); that.current().connect(function(err, board) { that.current().connected = false; if (err) { return socket.emit('response', {'msg': 'board.connect', 'response': 'failed'}); } @@ -56,5 +92,5 @@ define(['socket.io', 'public/scripts/libs/Noduino', 'public/scripts/libs/Noduino }); }; - return new SocketHandler(io, Noduino, Connector); + return new SocketHandler(io, Noduino, Connector, Logger); }); \ No newline at end of file diff --git a/srv.web.js b/srv.web.js index c827793..61d5d5e 100644 --- a/srv.web.js +++ b/srv.web.js @@ -1,6 +1,18 @@ +/** + * srv.web.js – Load HTTP Handler and Socket Bridge + * This file is part of noduino (c) 2012 Sebastian Müller + * + * @package noduino + * @author Sebastian Müller + * @license MIT License – http://www.opensource.org/licenses/mit-license.php + * @url https://github.com/semu/noduino + */ var requirejs = require('requirejs'); requirejs.config({nodeRequire: require}); +/** + * Load Socket.IO and HTTP Server + */ requirejs(['./srv.app', './srv.socket'],function(app, io) { var kickstart = app.kickstart; var router = kickstart.listen(); diff --git a/test.blinkLED.js b/test.blinkLED.js deleted file mode 100644 index 1fe51cf..0000000 --- a/test.blinkLED.js +++ /dev/null @@ -1,17 +0,0 @@ -var requirejs = require('requirejs'); -requirejs.config({nodeRequire: require}); - -requirejs(['public/scripts/libs/Noduino', 'public/scripts/libs/Noduino.Serial'], function (NoduinoObj, NoduinoConnector) { - - var Noduino = new NoduinoObj({'debug': true}, NoduinoConnector); - Noduino.connect(function(err, board) { - if (err) { return console.log(err); } - - board.withLED({pin: 13}, function(err, LED) { - if (err) { return console.log(err); } - - LED.blink(250); - }); - }); - -}); \ No newline at end of file diff --git a/test.check.js b/test.check.js deleted file mode 100644 index 87b5ff7..0000000 --- a/test.check.js +++ /dev/null @@ -1,76 +0,0 @@ -var requirejs = require('requirejs'); -requirejs.config({nodeRequire: require}); - -requirejs(['libs/Noduino', 'libs/Noduino.Serial'], function (NoduinoObj, NoduinoConnector) { - var maxLEDs = 6; - var current = 1; - var direction = -1; - var curInterval = 100; - var currentStepper = null; - var LEDlist = []; - var sorting = [13, 12, 11, 10, 9, 8]; - - function readyLED(led) { - LEDlist[sorting.indexOf(led.pin)] = led; - if (LEDlist.length == maxLEDs) { - startSequence(-1, curInterval); } - } - - function addButton(Button, dir) { - Button.on('push', function(e) { - var newDirection = direction; - - switch (Button.pin) { - case 6: newDirection = -1; break; - case 3: newDirection = 1; break; - } - - if (newDirection != direction) { - startSequence(newDirection, curInterval); - } - }); - } - - function stepper() { - var next = current + direction; - if (next == maxLEDs + 1) { - next = 1; } - if (next == 0) { - next = maxLEDs; } - current = next; - for (var i = 1; i <= maxLEDs; i++) { - LEDlist[i-1].setOff(); } - LEDlist[(current-1)].setOn(); - } - - function startSequence(step, interval) { - if (LEDlist.length != maxLEDs) { - return; }; - - clearInterval(currentStepper); - direction = step || 1; - currentStepper = setInterval(function() { - return stepper(); - }, interval); - } - - var Noduino = new NoduinoObj({'debug': true}, NoduinoConnector); - Noduino.connect(function(err, board) { - if (err) { return console.log(err); } - - - board.withLED({pin: 13}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 12}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 11}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 10}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 9}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 8}, function(err, LED) { readyLED(LED); }); - board.withButton({pin: 3}, function(err, Button) { addButton(Button); }); - board.withButton({pin: 6}, function(err, Button) { addButton(Button); }); - board.withAnalogInput({pin: 'A0'}, function(err, AnalogInput) { - AnalogInput.on('change', function(a) { - curInterval = a.value; startSequence(direction, curInterval); - }); - }); - }); -}); \ No newline at end of file diff --git a/test.walkLED.js b/test.walkLED.js deleted file mode 100644 index 6cfc588..0000000 --- a/test.walkLED.js +++ /dev/null @@ -1,74 +0,0 @@ -var requirejs = require('requirejs'); -requirejs.config({nodeRequire: require}); - -requirejs(['public/scripts/libs/Noduino', 'public/scripts/libs/Noduino.Serial'], function (NoduinoObj, NoduinoConnector) { - var maxLEDs = 5; - var current = 1; - var direction = -1; - var curInterval = 100; - var currentStepper = null; - var LEDlist = []; - var sorting = [13, 11, 10, 9, 8]; - - function readyLED(led) { - LEDlist[sorting.indexOf(led.pin)] = led; - if (LEDlist.length == maxLEDs) { - startSequence(-1, curInterval); } - } - - function addButton(Button, dir) { - Button.on('push', function(e) { - var newDirection = direction; - - switch (Button.pin) { - case 6: newDirection = -1; break; - case 3: newDirection = 1; break; - } - - if (newDirection != direction) { - startSequence(newDirection, curInterval); - } - }); - } - - function stepper() { - var next = current + direction; - if (next == maxLEDs + 1) { - next = 1; } - if (next == 0) { - next = maxLEDs; } - current = next; - for (var i = 1; i <= maxLEDs; i++) { - LEDlist[i-1].setOff(); } - LEDlist[(current-1)].setOn(); - } - - function startSequence(step, interval) { - if (LEDlist.length != maxLEDs) { - return; }; - - clearInterval(currentStepper); - direction = step || 1; - currentStepper = setInterval(function() { - return stepper(); - }, interval); - } - - var Noduino = new NoduinoObj({'debug': true}, NoduinoConnector); - Noduino.connect(function(err, board) { - if (err) { return console.log(err); } - - board.withLED({pin: 13}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 11}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 10}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 9}, function(err, LED) { readyLED(LED); }); - board.withLED({pin: 8}, function(err, LED) { readyLED(LED); }); - board.withButton({pin: 3}, function(err, Button) { addButton(Button); }); - board.withButton({pin: 6}, function(err, Button) { addButton(Button); }); - board.withAnalogInput({pin: 'A0'}, function(err, AnalogInput) { - AnalogInput.on('change', function(a) { - curInterval = a.value; startSequence(direction, curInterval); - }); - }); - }); -}); \ No newline at end of file diff --git a/views/example-walkLED.jade b/views/example-walkLED.jade new file mode 100755 index 0000000..d3e0678 --- /dev/null +++ b/views/example-walkLED.jade @@ -0,0 +1,80 @@ +header#overview + .page-header + h1 Adjustable LED Walker + small Control walking direction and adjust speed + .row + .span12 + .hero-unit + img(src="/wiring/walkLED.png") + p Use the example wiring from above and this interface for getting startet with noduino. Read values from an analog input device like a potentiometer and watch for pressed buttons, all basic functions are shown within this example. The needed + code .fzz + | file for making changes with the awesome + a(href="http://fritzing.org") Fritzing Application + | is included as well. If you want to share your own wirings or found a bug please create a + a(href="http://github.com/semu/noduino") Pull Request on GitHub + | ! + + .page-header + h1 HTML5 WebSocket Interface + small Using Socket.IO and Node.js + .row.interface#controls + .span12 + .btn-toolbar(style="margin-bottom: 9px") + .btn-group + a.btn(href="#")#connect + i.icon-refresh + | Connect to Arduino + | + .btn-group + .btn.btn-dir#btn-04 «« + | + .btn-group#leds + a.btn.disabled#led-1 #1 + a.btn.disabled#led-2 #2 + a.btn.disabled#led-3 #3 + a.btn.disabled#led-4 #4 + a.btn.disabled#led-5 #5 + a.btn.disabled#led-6 #6 + | + .btn-group + .btn.btn-dir#btn-02 »» + .btn-group + input.range#interval-slide(type="range", min="0", max="1024", step="1", value="320") + input.interval#interval-value(type="input", value="320ms",disabled="disabled") + .row.info#connection-status + .span12 + .alert.alert-info Please connect to your Arduino using the button. + .alert.hide.alert-error Unable to connect to Arduino! + .alert.hide.alert-success Connection to Arduino established! + .row.debug + .span12 + pre#connection-log + .item $ > Not connected to noduino! + .row + .span12 + p This interface is defined in + code views/example-walkLED.jade + | , all needed JavaScript is stored in + code public/scrupts/app.walkLED.js + | using + a(href="#") RequireJS + | for loading dependencies. Please see RequireJS's manual for loading your scripts. Logging is done with the customized + code Logger.HTML.js + | in + code scripts/libs/ + | . + + .page-header + h1 Just Node.js + small Acces Arduino components without HTML5 interface + .row + .span12 + p The wiring above can be used to test the included HTML web interface and the Node.js access as well. Connect your Arduino to you computer and start catching events happening on your Arduino with JavaScript. For sure you can easily fire events on your Arduino too! + pre + | $ > git clone git://github.com/semu/noduino.git noduino + | $ > cd noduino/ + | $ > npm install + | $ > cd examples/ + | $ > node test.walkLED.js + p After starting test.walkLED.js you are able to push the buttons in your wiring and see the LEDs blinking as you commanded. Use the analog input for changing walking speed. Binding events work as you might know from using Mootools, use AnalogInput.on(), LED.on() and Button.on() to bind custom functions to events like on, off, change, push or release. Not all functions are documented or even demonstrated with an example application, for getting used to noduino make sure to have a look at test.blinkLED.js and test.readAnalogIn.js. + \ No newline at end of file diff --git a/views/home.jade b/views/home.jade index dac01e4..6820c5f 100755 --- a/views/home.jade +++ b/views/home.jade @@ -83,12 +83,20 @@ section#homeContent p select.span2#e2-pinValue option(value=13) PIN: 13 + option(value=12) PIN: 12 + option(value=11) PIN: 11 + option(value=10) PIN: 10 + option(value=09) PIN: 09 input.span3#e2-interval(type="text",placeholder="Interval in Miliseconds") | a.btn(href="#", style="margin-top: 1px;")#e2-buttonStart i.icon-retweet | Start blinking LED | + a.btn(href="#", style="margin-top: 1px;")#e2-buttonStop + i.icon-off + | Stop + | label.label#e2-status(style="position: relative; top: -2px;") LED off .alert.hide.alert-info Please connect to your Arduino using the button. .alert.hide.alert-error Connect to Arduino first! @@ -113,4 +121,42 @@ section#homeContent | Connect to Arduino .alert.alert-info Please connect to your Arduino using the button. .alert.hide.alert-error Unable to connect to Arduino! - .alert.hide.alert-success Connected! Button is \ No newline at end of file + .alert.hide.alert-success Connected! Button is + .page-header + h1 Getting started with noduino + small AnalogInput, DigitalInputs and some nice LEDs + .row + .span12 + .hero-unit + img(src="/wiring/walkLED.png") + p Use the example wiring from above and the provided example in + code examples/walkLED.js + | for getting started using noduino. Read values from an analog input device like a potentiometer and watch for pressed buttons, all basic functions are shown in the example files. The needed + code .fzz + | file for making changes with the awesome + a(href="http://fritzing.org") Fritzing Application + | is included as well! If you create other wirings or find bugs in the provided ones please greate a + a(href="http://github.com/semu/noduino") Pull Request on GitHub + | ! + .row + .span12 + p.exampleLinks + a.btn.btn-success(href="/examples/walkLED.html") + i.icon-gift.icon-white + | View Example + .page-header + h1 About noduino + small Thank You Open Source! + .row + .span12 + p The + a(href="#") noduino + | project was founded by + a(href="#") Sebastian Müller + | for fun and as a proof of concept for Node.js controlling external components over a dynamic web interface using HTML5 WebSockets. Thanks to the awesome + a(href="#") Arduino + | project and the German + a(href="#") Fritzing Project + | it's easy to get started with basic prototyping. The already existing + a(href="#") duino + | project helped developing the first steps and is now an imported part of noduino's core components. Thanks to the Open Source community, you made this possible! Keep the good work up… diff --git a/views/includes/snippet.jade b/views/includes/snippet.jade deleted file mode 100755 index d6fbd24..0000000 --- a/views/includes/snippet.jade +++ /dev/null @@ -1,2 +0,0 @@ -p I'm a - span Snippet \ No newline at end of file diff --git a/views/layout.jade b/views/layout.jade index 4ce9172..600176e 100755 --- a/views/layout.jade +++ b/views/layout.jade @@ -5,7 +5,7 @@ html(lang="en") link(rel="stylesheet", href="/styles/bootstrap/init.css") link(rel="stylesheet", href="/styles/prettify.css") link(rel="stylesheet", href="/styles/init.css") - script(data-main="scripts/main", type="text/javascript", src="/scripts/require-jquery.js") + script(data-main="/scripts/app." + jsApp, type="text/javascript", src="/scripts/vendor/require-jquery.js") script(type="text/javascript", src="http://localhost:8090/socket.io/socket.io.js") // script(type="text/javascript", src="/scripts/init.js") // script(type="text/javascript", src="/scripts/prettify.js") @@ -15,8 +15,14 @@ html(lang="en") .container div.nav-collapse ul.nav - li.active - a(href="#") Home + li(class=(active == 'home' ? 'active' : '')) + a(href="/") Home + li.dropdown(class=(active == 'examples' ? 'active' : '')) + a.dropdown-toggle(href="#",data-toggle="dropdown") Example Wiring + b.caret + ul.dropdown-menu + li + a(href="/examples/walkLED.html") Adjustable LED Walker li a(href="https://github.com/semu/noduino") View on GitHub » div.nav-collapse.pull-right @@ -47,4 +53,4 @@ html(lang="en") a(href="#") twitter bootstrap framework | . Icons from a(href="#") Glyphicons Free - | . 2012 Baby! \ No newline at end of file + | . \ No newline at end of file