FoxNode aims at simplifying access to your hardware resources from within NodeJS. The library innermost part is acme.gpio, a thin wrapper around the Linux kernel GPIO sys interface. A C helper program for dispatching user space interrupts to NodeJS is also included: your code can react immediately to state changes, without wasting CPU cycles in querying the hardware.
The higher level acme.daisy interface builds on these facilities to offer a simple programmatic access to Daisy devices. For now, only Daisy5 and Daisy11 are implemented, but support for more peripherals is planned.
First step, create a new GPIO pin object:
var acme = require('acme'), pin = new acme.gpio.GPIO(name,direction,value);
where
Direction and value can be read and changed after initialization with the following methods:
pin.direction() # get pin.direction(direction) # set pin.value() # get pin.value(value) # set
Upon creation, the pin initializes the underlying hardware in order to react to state changes via interrupts. NodeJS is informed of such changes using a 'data' event, that can be used like this:
pin.on('data',function(data){ console.log( 'Pin: '+data.name +', '+ 'Value: '+data.value+', '+ 'Count: '+data.count ); });
There is also a read-only property pin.count representing the number of value changes since pin instantiation.
It is possible to stop the event generation with
pin.pause();
and to restart it afterwards with
pin.resume();
In order to instantiate a new Daisy5, the code is
var acme = require('acme'), daisy5 = new acme.daisy.Daisy5(port);
where port is one of 'D2' or 'D5'.
Daisy5 is configured as 8 input pins, readable as
daisy5.P1 daisy5.P2 ... daisy5.P8
and also as
daisy5.state(btn)
where btn is one of 'P1' ... 'P8'.
Whenever one of the buttons changes state, the object will emit a 'data' event:
daisy5.on('data',function(data){ console.log( 'Port: '+data.port+', '+ 'Button: '+data.button+', '+ 'Value: '+data.value+', '+ 'Count: '+data.count ); });
In order to instantiate a new Daisy11, the code is
var acme = require('acme'), daisy11 = new acme.daisy.Daisy11(port);
where port is one of 'D2' or 'D5'.
Daisy11 is configured as 8 output pins, readable and writable as
daisy11.L1 daisy11.L2 ... daisy11.L8
and also as
daisy11.state(led) daisy11.state(led,value)
where led is one of 'L1' ... 'L8'.
Whenever one of the leds changes state, the object will emit a 'data' event:
daisy11.on('data',function(data){ console.log( 'Port: '+data.port+', '+ 'Led: '+data.led+', '+ 'Value: '+data.value+', '+ 'Count: '+data.count ); });