hybridgroup/cylon-i2c

View on GitHub
lib/hmc6352.js

Summary

Maintainability
A
30 mins
Test Coverage
/*
 * HMC6352 Digital Compass driver
 * http://cylonjs.com
 *
 * Copyright (c) 2013-2015 The Hybrid Group
 * Licensed under the Apache 2.0 license.
*/

"use strict";

var Cylon = require("cylon");

var I2CDriver = require("./i2c-driver");

/**
 * A HMC6352 Driver
 *
 * @constructor hmc6352
 */
var Hmc6352 = module.exports = function Hmc6352() {
  Hmc6352.__super__.constructor.apply(this, arguments);

  // to accomodate the 7-bit device addressing
  this.address = this.address || 0x42 >> 1;

  this.commands = {
    heading: this.heading
  };
};

Cylon.Utils.subclass(Hmc6352, I2CDriver);

/**
 * Starts the driver
 *
 * @param {Function} callback triggered when the driver is started
 * @return {void}
 */
Hmc6352.prototype.start = function(callback) {
  this.connection.i2cWrite(this.address, this.commandBytes("A"));
  callback();
};

/**
 * Returns the heading data for the compass.
 *
 * @param {Function} callback function to be invoked with data
 * @return {void}
 * @publish
 */
Hmc6352.prototype.heading = function(callback) {
  this.connection.i2cRead(
    this.address,
    this.commandBytes("A"),
    2,
    function(err, data) {
      if (typeof callback === "function") {
        callback(err, this.parseHeading(data));
      }
    }.bind(this)
  );
};

/**
 * commandBytes
 *
 * @param {String} s string to coerce to Buffer
 * @return {Buffer} buffer containing command string
 */
Hmc6352.prototype.commandBytes = function(s) {
  return new Buffer(s, "ascii");
};

/**
 * parseHeading
 *
 * @param {Number} val value to parse
 * @return {number} represents the current heading
 */
Hmc6352.prototype.parseHeading = function(val) {
  return (val[1] + val[0] * 256) / 10.0;
};