clebert/r-pi-gpio

View on GitHub
lib/gpio.js

Summary

Maintainability
A
0 mins
Test Coverage
'use strict';

var assert = require('expressive-assertion');
var exec   = require('child_process').exec;
var gpio   = require('../build/Release/gpio.node');
var ts     = require('typesystem');

var initCalled  = false;
var initialized = false;

var init = function (callback) {
    if (initCalled) {
        throw new Error('`gpio.init()` already called');
    }

    initCalled = true;

    exec('cat /proc/cpuinfo | grep Hardware', function (error, stdout) {
        if (error) {
            return callback(error);
        }

        if (typeof stdout !== 'string') {
            return callback(new Error('unable to detect hardware'));
        }

        var hardware = stdout.split(':')[1].trim();

        if (hardware === 'BCM2708') {
            gpio.init(1);
        } else if (hardware === 'BCM2709') {
            gpio.init(2);
        } else {
            return callback(new Error('unknown hardware: "' + hardware + '"'));
        }

        initialized = true;

        callback(null);
    });
};

var assertIsPin = function (value) {
    assert(function () {
        return ts.isInteger(value) && value >= 0 && value <= 53;
    });
};

var createInput = function (pin, testMode) {
    if (!initialized && !testMode) {
        throw new Error('please call `gpio.init()` first');
    }

    assertIsPin(pin);

    gpio.configureAsInput(pin);

    return function () {
        return !!gpio.getLevel(pin);
    };
};

var createOutput = function (pin, testMode) {
    if (!initialized && !testMode) {
        throw new Error('please call `gpio.init()` first');
    }

    assertIsPin(pin);

    gpio.configureAsOutput(pin);

    return function (level) {
        gpio.setLevel(pin, !!level);
    };
};

exports.init         = init;
exports.createInput  = createInput;
exports.createOutput = createOutput;