hybridgroup/cylon-digispark

View on GitHub
lib/digispark.js

Summary

Maintainability
A
35 mins
Test Coverage
/*
 * cylon-digispark adaptor
 * http://cylonjs.com
 *
 * Copyright (c) 2014 The Hybrid Group
 * Licensed under the Apache 2.0 license.
*/


"use strict";

var Cylon = require("cylon");

var digispark = require("../build/Release/digispark.node");

var Digispark = module.exports = function Digispark(opts) {
  Digispark.__super__.constructor.apply(this, arguments);
  opts = opts || {};

  this.digispark = null;
  this.interval = (opts.interval) ? opts.interval.seconds() : (0.05).seconds();

  this.commands = ["digitalWrite", "digitalRead", "servoWrite", "pwmWrite"];
};

Cylon.Utils.subclass(Digispark, Cylon.Adaptor);

/**
 * Connects to the Digispark
 *
 * @param {Function} callback to be triggered when connected
 * @return {void}
 */
Digispark.prototype.connect = function(callback) {
  var err, errMsg;
  this.digispark = new digispark.Digispark();

  if (this.digispark.digisparkSearch() === 0) {
    errMsg = "Connection error! Try creating udev rules or run with sudo.";
    err = new Error(errMsg);
  } else {
    this.proxyMethods(this.commands, this.digispark, this);
  }

  callback(err);
};

/**
 * Disconnects from the Digispark
 *
 * @param {Function} callback to be triggered when disconnected
 * @return {void}
 */
Digispark.prototype.disconnect = function(callback) {
  callback();
};

/**
 * Writes a value to a digital pin
 *
 * @param {Number} pin the pin to write to
 * @param {Number} value the value to write to the pin
 * @return {void}
 * @publish
 */
Digispark.prototype.digitalWrite = function(pin, value) {
  this.digispark.pinMode(pin, 0);
  this.digispark.digitalWrite(pin, value);
};

/**
 * Reads a value from a digital pin
 *
 * @param {Number} pin the pin to read from
 * @param {Function} callback triggered when the value has been read from the
 * pin
 * @return {void}
 * @publish
 */
Digispark.prototype.digitalRead = function(pin, callback) {
  this.digispark.pinMode(pin, 1);

  every(this.interval, function() {
    this.digispark.digitalRead(pin, function(err, data) {
      this.respond("digitalRead", callback, err, data, pin);
    }.bind(this));
  }.bind(this));
};

/**
 * Writes to a pin
 *
 * @param {String} type - Analog, pwm, digital
 * @param {Number} pin - pin number
 * @param {Number} value - to be passed
 * @param {Number} scale - the range of the value 1, 180, 1024
 * @param {Function} callback - to be triggered on completion
 * @return {void}
 * @private
 */
Digispark.prototype._write = function(type, pin, value, scale, callback) {
  var scaledVal = (value).toScale(0, scale);

  if (type === "digital") {
    this.digispark.pinMode(pin, 0);
    this.digispark.digitalWrite(pin, value);
  } else if (type === "pwm") {
    this.digispark.pwmWrite(pin, scaledVal);
  } else {
    this.digispark.servoWrite(scaledVal);
  }

  this.respond(type + "Write", callback, null, value, pin);
};

/**
 * Writes a servo value to a pin
 *
 * @param {Number} pin the pin to write to
 * @param {Number} value the value to write to the pin
 * @param {Function} callback - to be triggered on completion
 * @return {void}
 * @publish
 */
Digispark.prototype.servoWrite = function(pin, value, callback) {
  this._write("servo", pin, value, 180, callback);
};

/**
 * Writes a PWM value to a pin
 *
 * @param {Number} pin the pin to write to
 * @param {Number} value the value to write to the pin
 * @param {Function} callback - to be triggered on completion
 * @return {void}
 * @publish
 */
Digispark.prototype.pwmWrite = function(pin, value, callback) {
  this._write("pwm", pin, value, 255, callback);
};

/**
 * Writes a value to a digital pin
 *
 * @param {Number} pin - pin number
 * @param {Number} value - to be passed
 * @param {Function} callback - to be triggered on completion
 * @return {void}
 * @publish
 */
Digispark.prototype.digitalWrite = function(pin, value, callback) {
  this._write("digital", pin, value, null, callback);
};