Skip to content
Snippets Groups Projects
opc.js 1.78 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * Simple Open Pixel Control client for Node.js
     *
     * 2013 Micah Elizabeth Scott
     * This file is released into the public domain.
     */
    
    var net = require('net');
    
    var OPC = function(host, port)
    {
        this.host = host;
        this.port = port;
        this.pixelBuffer = null;
    };
    
    OPC.prototype._reconnect = function()
    {
        var _this = this;
    
        this.socket = new net.Socket()
        this.connected = false;
    
        this.socket.onclose = function() {
            console.log("Connection closed");
            _this.socket = null;
            _this.connected = false;
        }
    
        this.socket.connect(this.port, this.host, function() {
            console.log("Connected to " + _this.socket.remoteAddress);
            _this.connected = true;
            _this.socket.setNoDelay();
        });
    }
    
    OPC.prototype.writePixels = function()
    {
        if (!this.socket) {
            this._reconnect();
        }
        if (!this.connected) {
            return;
        }
        this.socket.write(this.pixelBuffer);
    }
    
    OPC.prototype.setPixelCount = function(num)
    {
        var length = 4 + num*3;
        if (this.pixelBuffer == null || this.pixelBuffer.length != length) {
            this.pixelBuffer = new Buffer(length);
        }
    
        // Initialize OPC header
        this.pixelBuffer.writeUInt8(0, 0);           // Channel
        this.pixelBuffer.writeUInt8(0, 1);           // Command
        this.pixelBuffer.writeUInt16BE(num * 3, 2);  // Length
    }
    
    OPC.prototype.setPixel = function(num, r, g, b)
    {
        var offset = 4 + num*3;
        if (this.pixelBuffer == null || offset + 3 > this.pixelBuffer.length) {
            this.setPixelCount(num + 1);
        }
    
        this.pixelBuffer.writeUInt8(Math.max(0, Math.min(255, r | 0)), offset);
        this.pixelBuffer.writeUInt8(Math.max(0, Math.min(255, g | 0)), offset + 1);
        this.pixelBuffer.writeUInt8(Math.max(0, Math.min(255, b | 0)), offset + 2);
    }
    
    module.exports = OPC;