diff --git a/examples/bbb_servo.coffee b/examples/bbb_servo.coffee new file mode 100644 index 0000000..65df378 --- /dev/null +++ b/examples/bbb_servo.coffee @@ -0,0 +1,35 @@ +Cylon = require '..' + +Cylon.robot + connection: { name: 'beaglebone', adaptor: 'beaglebone' } + device: { name: 'servo', driver: 'servo', pin: 'P9_14' } + + work: (my) -> + + # Be carefull with your servo angles or you might DAMAGE the servo! + # Cylon uses a 50hz/s (20ms period) frequency and a Duty Cycle + # of 0.5ms to 2.5ms to control the servo angle movement. + # + # This means: + # 1. 0.5ms == 0 degrees + # 2. 1.5ms == 90 degrees + # 3. 2.5ms == 180 degrees + # (It is usually safe to start with a 90 degree angle, 1.5ms duty + # cycle in most servos) + # + # Please review your servo datasheet to make sure of correct + # angle range and the Freq/MS Duty cycle it requires. + # If more servo support is needed leave us a comment, raise an + # issue or help us add more support. + angle = 30 + increment = 40 + + every 1.seconds(), -> + angle += increment + my.servo.angle angle + + Logger.info "Current Angle: #{my.servo.currentAngle()}" + + increment = -increment if (angle is 30) or (angle is 150) + +.start() diff --git a/examples/beaglebone/bbb_led_brightness.coffee b/examples/beaglebone/bbb_led_brightness.coffee index 7ebbe0b..1378b5a 100644 --- a/examples/beaglebone/bbb_led_brightness.coffee +++ b/examples/beaglebone/bbb_led_brightness.coffee @@ -2,11 +2,8 @@ Cylon = require('..') # Initialize the robot Cylon.robot - connection: - name: 'beaglebone', adaptor: 'beaglebone' - - device: - name: 'led', driver: 'led', pin: 11 + connection: { name: 'beaglebone', adaptor: 'beaglebone' } + device: { name: 'led', driver: 'led', pin: 'P9_14' } work: (my) -> # we do our thing here diff --git a/test/dist/specs/adaptor.spec.js b/test/dist/specs/adaptor.spec.js index 38853cf..07c4c29 100644 --- a/test/dist/specs/adaptor.spec.js +++ b/test/dist/specs/adaptor.spec.js @@ -1,13 +1,51 @@ (function() { 'use strict'; + var EventEmitter; + source("adaptor"); + EventEmitter = require('events').EventEmitter; + describe("Adaptor", function() { - var adaptor; + var adaptor, conn; + conn = new EventEmitter; adaptor = new Cylon.Adaptor({ - name: 'adapt' + name: 'TestAdaptor', + connection: conn + }); + it("provides a 'connect' method that accepts a callback", function() { + var spy; + expect(adaptor.connect).to.be.a('function'); + spy = sinon.spy(); + adaptor.connect(function() { + return spy(); + }); + return spy.should.have.been.called; + }); + it("tells the connection to emit the 'connect' event when connected", function() { + var spy; + spy = sinon.spy(); + adaptor.connection.on('connect', function() { + return spy(); + }); + adaptor.connect(function() {}); + return spy.should.have.been.called; + }); + it("provides a 'disconnect' method", function() { + return expect(adaptor.disconnect).to.be.a('function'); + }); + it("provides a default empty array of commands", function() { + return expect(adaptor.commands()).to.be.eql([]); + }); + it("saves the provided name in the @name variable", function() { + return expect(adaptor.name).to.be.eql("TestAdaptor"); + }); + it("saves the provided connection in the @connection variable", function() { + return expect(adaptor.connection).to.be.eql(conn); + }); + return it("contains a reference to itself in the @self variable", function() { + return expect(adaptor.self).to.be.eql(adaptor); }); - return it('needs tests'); }); }).call(this); diff --git a/test/dist/specs/driver.spec.js b/test/dist/specs/driver.spec.js index d09b368..f89ed82 100644 --- a/test/dist/specs/driver.spec.js +++ b/test/dist/specs/driver.spec.js @@ -1,17 +1,55 @@ (function() { 'use strict'; + var EventEmitter; + source("driver"); + EventEmitter = require('events').EventEmitter; + describe("Driver", function() { - var driver; + var device, driver; + device = new EventEmitter; + device.connection = 'connect'; driver = new Cylon.Driver({ - name: 'max', - device: { - connection: 'connect', - pin: 13 - } + name: 'TestDriver', + device: device + }); + it("provides a 'start' method that accepts a callback", function() { + var spy; + expect(driver.start).to.be.a('function'); + spy = sinon.spy(); + driver.start(function() { + return spy(); + }); + return spy.should.have.been.called; + }); + it("tells the device to emit the 'start' event when started", function() { + var spy; + spy = sinon.spy(); + driver.device.on('start', function() { + return spy(); + }); + driver.start(function() {}); + return spy.should.have.been.called; + }); + it("provides a 'stop' method", function() { + return expect(driver.stop).to.be.a('function'); + }); + it("provides a default empty array of commands", function() { + return expect(driver.commands()).to.be.eql([]); + }); + it("saves the provided name in the @name variable", function() { + return expect(driver.name).to.be.eql("TestDriver"); + }); + it("saves the provided device in the @device variable", function() { + return expect(driver.device).to.be.eql(device); + }); + it("saves the provided device connection in the @device variable", function() { + return expect(driver.connection).to.be.eql('connect'); + }); + return it("contains a reference to itself in the @self variable", function() { + return expect(driver.self).to.be.eql(driver); }); - return it('needs tests'); }); }).call(this); diff --git a/test/src/specs/adaptor.spec.coffee b/test/src/specs/adaptor.spec.coffee index 1760ade..3649575 100644 --- a/test/src/specs/adaptor.spec.coffee +++ b/test/src/specs/adaptor.spec.coffee @@ -1,8 +1,37 @@ -'use strict'; +'use strict' source "adaptor" +EventEmitter = require('events').EventEmitter describe "Adaptor", -> - adaptor = new Cylon.Adaptor(name: 'adapt') + conn = new EventEmitter + adaptor = new Cylon.Adaptor + name: 'TestAdaptor' + connection: conn - it 'needs tests' + it "provides a 'connect' method that accepts a callback", -> + expect(adaptor.connect).to.be.a 'function' + spy = sinon.spy() + adaptor.connect(-> spy()) + spy.should.have.been.called + + it "tells the connection to emit the 'connect' event when connected", -> + spy = sinon.spy() + adaptor.connection.on 'connect', -> spy() + adaptor.connect(->) + spy.should.have.been.called + + it "provides a 'disconnect' method", -> + expect(adaptor.disconnect).to.be.a 'function' + + it "provides a default empty array of commands", -> + expect(adaptor.commands()).to.be.eql [] + + it "saves the provided name in the @name variable", -> + expect(adaptor.name).to.be.eql "TestAdaptor" + + it "saves the provided connection in the @connection variable", -> + expect(adaptor.connection).to.be.eql conn + + it "contains a reference to itself in the @self variable", -> + expect(adaptor.self).to.be.eql adaptor diff --git a/test/src/specs/driver.spec.coffee b/test/src/specs/driver.spec.coffee index 1850cd7..027e9e2 100644 --- a/test/src/specs/driver.spec.coffee +++ b/test/src/specs/driver.spec.coffee @@ -1,8 +1,41 @@ 'use strict'; source "driver" +EventEmitter = require('events').EventEmitter describe "Driver", -> - driver = new Cylon.Driver(name: 'max', device: {connection: 'connect', pin: 13}) + device = new EventEmitter + device.connection = 'connect' + driver = new Cylon.Driver + name: 'TestDriver' + device: device - it 'needs tests' + it "provides a 'start' method that accepts a callback", -> + expect(driver.start).to.be.a 'function' + spy = sinon.spy() + driver.start(-> spy()) + spy.should.have.been.called + + it "tells the device to emit the 'start' event when started", -> + spy = sinon.spy() + driver.device.on 'start', -> spy() + driver.start(->) + spy.should.have.been.called + + it "provides a 'stop' method", -> + expect(driver.stop).to.be.a 'function' + + it "provides a default empty array of commands", -> + expect(driver.commands()).to.be.eql [] + + it "saves the provided name in the @name variable", -> + expect(driver.name).to.be.eql "TestDriver" + + it "saves the provided device in the @device variable", -> + expect(driver.device).to.be.eql device + + it "saves the provided device connection in the @device variable", -> + expect(driver.connection).to.be.eql 'connect' + + it "contains a reference to itself in the @self variable", -> + expect(driver.self).to.be.eql driver