diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78ce7f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,77 @@ +###OSX### + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +###Windows### + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + + +###Node### + +# Logs +logs +*.log + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# Commenting this out is preferred by some people, see +# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- +node_modules + +# Users Environment Variables +.lock-wscript \ No newline at end of file diff --git a/lib/artnet_server.js b/lib/artnet_server.js index 785d9ec..154adf8 100644 --- a/lib/artnet_server.js +++ b/lib/artnet_server.js @@ -1,28 +1,62 @@ var util = require('util'); var events = require('events'); var dgram = require('dgram'); +var jspack = require('jspack').jspack; + +// jspack table for message format: (https://github.com/pgriess/node-jspack) +// +// Format | C Type | JavaScript Type | Size (octets) | Notes +// ------------------------------------------------------------------- +// A | char[] | Array | Length | (1) +// x | pad byte | N/A | 1 | +// c | char | string (length 1) | 1 | (2) +// b | signed char | number | 1 | (3) +// B | unsigned char | number | 1 | (3) +// h | signed short | number | 2 | (3) +// H | unsigned short | number | 2 | (3) +// i | signed long | number | 4 | (3) +// I | unsigned long | number | 4 | (3) +// l | signed long | number | 4 | (3) +// L | unsigned long | number | 4 | (3) +// s | char[] | string | Length | (2) +// f | float | number | 4 | (4) +// d | double | number | 8 | (5) + +// Packet Format of ArtNet Packet According to https://en.wikipedia.org/wiki/Art-Net +var msgFormatHeader = '!7sBHHBBHH' +// // Payload is between 2 and 512, so this is the maximal payload (can be trimmed later if necessary) +var msgFormatMaxPayload = 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB' // ArtNet server class exports.listen = function(port, cb) { this.port = port; events.EventEmitter.call(this); - // Set up the socket var sock = dgram.createSocket("udp4", function (msg, peer) { - - var sequence = msg.readUInt8(12,true); - var physical = msg.readUInt8(13,true); - var universe = msg.readUInt8(14,true); - var offset = msg.readUInt8(16,true); - var length = msg.readUInt8(17,true); - - var rawData = []; - - for( i = 18; i < 18 + length; i++ ){ - rawData.push( msg.readUInt8(i) ); - } - - var retData = {sequence: sequence, physical: physical, universe: universe, length: length, data: rawData}; + // Unpack the message + + // Protocol Data + var unpacked = jspack.Unpack(msgFormatHeader, msg, 0); + var signature = unpacked[0]; // Signature should be 'Art-Net' + var zero = unpacked[1]; // It's just a zero per the format definition ;-) + var opcode = unpacked[2]; // Opcode is defined to be 0x5000 + var protocolVersion = unpacked[3]; // Protocol Version should be 14 + + // TODO: Check for valid Header? + + // ArtNet Data + var sequence = unpacked[4]; + var physical = unpacked[5]; + var universe = unpacked[6]; + var length = unpacked[7]; + + // Unpack the payload + // Payload is of variable length between 2 and 512, so the package format maybe has to be shorthened + var payloadFormat = msgFormatMaxPayload.substring(0, length); + + var channelData = jspack.Unpack(payloadFormat, msg, 18); + // Build the associative array to return + var retData = {sequence: sequence, physical: physical, universe: universe, length: length, data: channelData}; // And call the callback passing the deseralized data cb(retData, peer); diff --git a/package.json b/package.json index 6e63294..9b80734 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,10 @@ { "name": "xandy", "email": "xandy@hackerspace-bamberg.de" + }, + { + "name": "Markus Chmelar", + "email": "markus.chmelar@innovaptor.com" } ], "main": "./main.js", @@ -24,6 +28,7 @@ "client" ], "dependencies" : { + "jspack": "0.0.4" }, "engines": { "node": ">=0.6"